package net.sf.colossus.ai.objectives;
import java.util.logging.Logger;
import net.sf.colossus.client.Client;
import net.sf.colossus.game.Battle;
import net.sf.colossus.game.BattleCritter;
import net.sf.colossus.game.Creature;
import net.sf.colossus.game.Legion;
import net.sf.colossus.util.ValueRecorder;
/** The tactical objective of killing a certain number of a specific
* CreatureType.
*
* The evaluation function currently return the highest amount of point
* gang-banging any one of the creaturetype in the opposing legion, multiplied
* by the priority. Rangestriker count for half. This is capped to 0 if the
* objective is already attained.
*
* The objective is attained whenever the number of creature are missing
* in the opposing legion.
*
* @author Romain Dolbeau
*/
class DestroyCreatureTacticalObjective extends AbstractTacticalObjective
{
private static final Logger LOGGER = Logger
.getLogger(DestroyCreatureTacticalObjective.class.getName());
private final Creature critter;
private final Legion killlegion;
private final Client client;
private final int count;
private final int number;
DestroyCreatureTacticalObjective(float priority, Client client,
Legion killlegion, Creature critter, int number)
{
super(priority);
this.number = number;
this.critter = critter;
this.killlegion = killlegion;
this.client = client;
count = killlegion.numCreature(critter.getType());
if (count < number)
{
LOGGER.warning("Trying to kill + number + " + critter.getName()
+ " but there is only " + count + " in "
+ killlegion.getMarkerId());
}
}
public boolean objectiveAttained()
{
if (killlegion.numCreature(critter.getType()) + number <= count)
{
return true;
}
return false;
}
public ValueRecorder situationContributeToTheObjective()
{
ValueRecorder value = new ValueRecorder(getDescription());
if (objectiveAttained())
{
return value;
}
for (BattleCritter dCritter : client.getInactiveBattleUnits())
{
if (dCritter.getType().equals(critter.getType()))
{
ValueRecorder lvalue = new ValueRecorder(getDescription());
for (BattleCritter aCritter : client.getActiveBattleUnits())
{
int range = Battle.getRange(dCritter.getCurrentHex(),
aCritter.getCurrentHex(), false);
if (range == 2)
{
lvalue.add(aCritter.getPointValue(), "Attacker"
+ aCritter.getType().getName() + "CanStrike"
+ critter.getType().getName());
}
else if (aCritter.isRangestriker()
&& (range <= aCritter.getSkill())
&& (aCritter.useMagicMissile() || (!dCritter.isLord())))
{
lvalue.add(aCritter.getPointValue() / 2, "Attacker"
+ aCritter.getType().getName() + "CanRangeStrike"
+ critter.getType().getName());
}
}
if (lvalue.getValue() > value.getValue())
{
value = lvalue;
}
}
}
return value;
}
public String getDescription()
{
return "Destroying " + number + " " + critter.getName() + " ("
+ getPriority() + ")";
}
}