package Default;
import java.util.ArrayList;
import java.util.List;
import net.sf.colossus.ai.AbstractHintProvider;
import net.sf.colossus.util.DevRandom;
import net.sf.colossus.variant.CreatureType;
import net.sf.colossus.variant.IHintOracle;
import net.sf.colossus.variant.IOracleLegion;
import net.sf.colossus.variant.MasterBoardTerrain;
import net.sf.colossus.variant.MasterHex;
import net.sf.colossus.variant.Variant;
public class DefaultHint extends AbstractHintProvider
{
private final CreatureType behemoth;
private final CreatureType centaur;
private final CreatureType cyclops;
private final CreatureType gargoyle;
private final CreatureType griffon;
private final CreatureType guardian;
private final CreatureType lion;
private final CreatureType minotaur;
private final CreatureType ogre;
private final CreatureType serpent;
private final CreatureType titan;
private final CreatureType troll;
private final CreatureType warbear;
private final CreatureType warlock;
private final CreatureType wyvern;
public DefaultHint(Variant variant)
{
super(variant);
this.behemoth = getCreatureType("Behemoth");
this.centaur = getCreatureType("Centaur");
this.cyclops = getCreatureType("Cyclops");
this.gargoyle = getCreatureType("Gargoyle");
this.griffon = getCreatureType("Griffon");
this.guardian = getCreatureType("Guardian");
this.lion = getCreatureType("Lion");
this.minotaur = getCreatureType("Minotaur");
this.ogre = getCreatureType("Ogre");
this.serpent = getCreatureType("Serpent");
this.titan = getCreatureType("Titan");
this.troll = getCreatureType("Troll");
this.warbear = getCreatureType("Warbear");
this.warlock = getCreatureType("Warlock");
this.wyvern = getCreatureType("Wyvern");
}
private final DevRandom rnd = new DevRandom();
public CreatureType getRecruitHint(MasterBoardTerrain terrain,
IOracleLegion legion, List<CreatureType> recruits,
IHintOracle oracle,
List<AIStyle> aiStyles)
{
String terrainId = terrain.getId();
if (terrainId.equals("Brush") || terrainId.equals("Jungle"))
{
int numCyclops = legion.numCreature(cyclops);
if (numCyclops > 0 && numCyclops < 3
&& !legion.contains(behemoth)
&& !legion.contains(serpent)
&& oracle.creatureAvailable(behemoth) >= 2
&& oracle.creatureAvailable(cyclops) >= 1)
{
return cyclops;
}
}
else if (terrainId.equals("Plains"))
{
if (recruits.contains(lion) && !legion.contains(griffon)
&& legion.numCreature(lion) == 2
&& oracle.canReach("Desert")
&& oracle.creatureAvailable(griffon) >= 2)
{
return lion;
}
if (aiStyles.contains(AIStyle.Defensive))
{
if (recruits.contains(centaur)
&& legion.numCreature(centaur) == 2
&& !legion.contains(warbear) && legion.getHeight() < 6
&& oracle.biggestAttackerHeight() == 0
&& oracle.canReach("Woods")
&& !oracle.hexLabel().equals("1")
&& !oracle.hexLabel().equals("15")
&& !oracle.hexLabel().equals("29"))
{
return centaur;
}
}
else if (aiStyles.contains(AIStyle.Offensive))
{
if (recruits.contains(centaur)
&& legion.numCreature(centaur) == 2
&& !legion.contains(warbear) && legion.getHeight() <= 2
&& oracle.biggestAttackerHeight() == 0
&& oracle.canReach("Woods"))
{
return centaur;
}
}
}
else if (terrainId.equals("Marsh"))
{
if (recruits.contains(troll) && !legion.contains(wyvern)
&& legion.numCreature(troll) == 2
&& oracle.canReach("Swamp")
&& oracle.creatureAvailable(wyvern) >= 2)
{
return troll;
}
if (aiStyles.contains(AIStyle.Defensive))
{
if (recruits.contains(ogre) && legion.numCreature(ogre) == 2
&& !legion.contains(minotaur) && legion.getHeight() < 6
&& oracle.biggestAttackerHeight() == 0
&& oracle.canReach("Hills")
&& !oracle.hexLabel().equals("8")
&& !oracle.hexLabel().equals("22")
&& !oracle.hexLabel().equals("36"))
{
return ogre;
}
}
else if (aiStyles.contains(AIStyle.Offensive))
{
if (recruits.contains(ogre) && legion.numCreature(ogre) == 2
&& !legion.contains(minotaur) && legion.getHeight() <= 2
&& oracle.biggestAttackerHeight() == 0
&& oracle.canReach("Hills"))
{
return ogre;
}
}
}
else if (terrainId.equals("Tower"))
{
if (recruits.contains(warlock))
{
return warlock;
}
if (recruits.contains(guardian))
{
return guardian;
}
if (recruits.contains(ogre) && legion.numCreature(ogre) == 2)
{
return ogre;
}
if (recruits.contains(centaur) && legion.numCreature(centaur) == 2)
{
return centaur;
}
if (recruits.contains(gargoyle)
&& legion.numCreature(gargoyle) == 1
&& oracle.creatureAvailable(cyclops) >= 3)
{
return gargoyle;
}
if (recruits.contains(ogre) && legion.numCreature(ogre) == 1
&& oracle.creatureAvailable(troll) >= 2)
{
return ogre;
}
if (recruits.contains(centaur) && legion.numCreature(centaur) == 1
&& oracle.creatureAvailable(lion) >= 2)
{
return centaur;
}
if (recruits.contains(gargoyle)
&& legion.numCreature(gargoyle) == 0
&& oracle.creatureAvailable(cyclops) >= 6)
{
return gargoyle;
}
if (recruits.contains(ogre) && legion.numCreature(ogre) == 0
&& oracle.creatureAvailable(troll) >= 6)
{
return ogre;
}
if (recruits.contains(centaur) && legion.numCreature(centaur) == 0
&& oracle.creatureAvailable(lion) >= 6)
{
return centaur;
}
}
return recruits.get(recruits.size() - 1);
}
public List<CreatureType> getInitialSplitHint(MasterHex hex,
List<AIStyle> aiStyles)
{
List<CreatureType> li = new ArrayList<CreatureType>();
if (hex.getLabel().equals("100"))
{
if (rnd.nextFloat() < 0.5)
{
li.add(titan);
li.add(gargoyle);
li.add(centaur);
li.add(centaur);
}
else
{
li.add(titan);
li.add(gargoyle);
li.add(gargoyle);
li.add(ogre);
}
}
else if (hex.getLabel().equals("200"))
{
li.add(titan);
li.add(gargoyle);
li.add(gargoyle);
li.add(ogre);
}
else if (hex.getLabel().equals("300"))
{
if (rnd.nextFloat() < 0.5)
{
li.add(titan);
li.add(gargoyle);
li.add(gargoyle);
li.add(ogre);
}
else
{
li.add(titan);
li.add(centaur);
li.add(centaur);
li.add(ogre);
}
}
else if (hex.getLabel().equals("400"))
{
if (rnd.nextFloat() < 0.5)
{
li.add(titan);
li.add(gargoyle);
li.add(ogre);
li.add(ogre);
}
else
{
li.add(titan);
li.add(gargoyle);
li.add(gargoyle);
li.add(centaur);
}
}
else if (hex.getLabel().equals("500"))
{
li.add(titan);
li.add(gargoyle);
li.add(gargoyle);
li.add(centaur);
}
else if (hex.getLabel().equals("600"))
{
if (rnd.nextFloat() < 0.5)
{
li.add(titan);
li.add(gargoyle);
li.add(gargoyle);
li.add(centaur);
}
else
{
li.add(titan);
li.add(ogre);
li.add(ogre);
li.add(centaur);
}
}
else
{
throw new RuntimeException("Bad hex: " + hex);
}
return li;
}
}