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 preserving all of a specific CreatureType.
*
* The evaluation function currently return the negative of the highest amount
* of point gang-banging any one of the creaturetype in our legion, multiplied
* by the priority. Rangestriker count for half. This doesn't take a number
* into account, so if you try to preserve 2 out of 3 Lions, this will
* try to protect ALL Lions. This is capped to 0 after the objective has
* failed.
*
* The objective is attained as long as enough creature are alive.
*
*
* @author Romain Dolbeau
*/
class PreserveCreatureTacticalObjective extends AbstractTacticalObjective
{
private static final Logger LOGGER = Logger
.getLogger(PreserveCreatureTacticalObjective.class.getName());
private final Creature critter;
private final Legion liveLegion;
private final Client client;
private final int count;
PreserveCreatureTacticalObjective(float priority, Client client,
Legion liveLegion, Creature critter)
{
super(priority);
this.critter = critter;
this.liveLegion = liveLegion;
this.client = client;
count = liveLegion.numCreature(critter.getType());
if (count <= 0)
{
LOGGER.warning("Trying to preserve all " + critter.getName()
+ " but there isn't any in " + liveLegion.getMarkerId());
}
}
public boolean objectiveAttained()
{
if (liveLegion.numCreature(critter.getType()) >= count)
{
return true;
}
return false;
}
public ValueRecorder situationContributeToTheObjective()
{
ValueRecorder value = new ValueRecorder(getDescription());
if (!objectiveAttained())
{
return value;
}
for (BattleCritter dCritter : client.getActiveBattleUnits())
{
if (dCritter.getType().equals(critter.getType()))
{
ValueRecorder lvalue = new ValueRecorder(getDescription());
for (BattleCritter aCritter : client.getInactiveBattleUnits())
{
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(), "Attacker"
+ aCritter.getType().getName() + "CanStrike"
+ critter.getType().getName());
}
}
if (lvalue.getValue() < value.getValue())
{
value = lvalue;
}
}
}
return value;
}
public String getDescription()
{
return "Preserving all " + critter.getName() + " (" + getPriority()
+ ")";
}
}