public class SimpleAI extends AbstractAI
Modifier and Type | Class and Description |
---|---|
protected class |
SimpleAI.PowerSkill |
private static class |
SimpleAI.TerrainBonuses
Stores the skill and power bonuses for a single terrain.
|
protected class |
SimpleAI.TriggerTimeIsUp |
AbstractAI.AbstractAIOracle, AbstractAI.CreatureValueConstants, AbstractAI.MoveInfo
Modifier and Type | Field and Description |
---|---|
private static int |
DRAW |
private static java.util.logging.Logger |
LOGGER |
private static int |
LOSE |
private static int |
LOSE_BUT_INFLICT_HEAVY_LOSSES |
private int |
MAX_LEGION_MOVES |
protected static int |
MIN_ITERATIONS |
private java.util.List<java.lang.String> |
remainingMarkers |
private int |
splitsAcked |
private int |
splitsDone |
private static java.util.Map<java.lang.String,SimpleAI.TerrainBonuses> |
TERRAIN_BONUSES
Maps the terrain names to their matching bonuses.
|
(package private) boolean |
timeIsUp |
protected int |
timeLimit |
private static int |
WIN_WITH_HEAVY_LOSSES |
private static int |
WIN_WITH_MINIMAL_LOSSES |
bec, client, cvc, hintSectionUsed, random, variant
Modifier and Type | Method and Description |
---|---|
CreatureType |
acquireAngel(Legion legion,
java.util.List<CreatureType> angels)
choose whether to acquire an angel or archangel
|
java.util.List<CritterMove> |
battleMove()
Return a list of critter moves, in best move order.
|
private SimpleAI.PowerSkill |
calcBonus(CreatureType creature,
java.lang.String terrain,
boolean defender) |
private java.util.List<CreatureType> |
chooseCreaturesToSplitOut(Legion legion)
Decide how to split this legion, and return a list of
Creatures to remove.
|
(package private) CreatureType |
chooseRecruit(LegionClientSide legion,
MasterHex hex,
boolean considerReservations) |
private java.util.List<CreatureType> |
CMUsplit(boolean favorTitan,
CreatureType splitCreature,
CreatureType nonsplitCreature,
MasterHex hex)
Keep the gargoyles together.
|
boolean |
concede(Legion legion,
Legion enemy)
choose whether legion should concede to enemy
|
(package private) java.util.List<CreatureType> |
doInitialGameSplit(MasterHex hex)
Return a list of exactly four creatures (including one lord) to
split out.
|
private boolean |
doMove(Legion legion,
MasterHex hex) |
private int |
estimateBattleResults(Legion attacker,
boolean attackerSplitsBeforeBattle,
Legion defender,
MasterHex hex) |
private int |
estimateBattleResults(Legion attacker,
boolean attackerSplitsBeforeBattle,
Legion defender,
MasterHex hex,
CreatureType recruit) |
private int |
estimateBattleResults(Legion attacker,
Legion defender,
MasterHex hex) |
private void |
evaluateCritterMove_Attacker(BattleCritter critter,
ValueRecorder value,
MasterBoardTerrain terrain,
BattleHex hex,
LegionClientSide legion,
int turn)
this compute for non-titan attacking critter
|
protected void |
evaluateCritterMove_Defender(BattleCritter critter,
ValueRecorder value,
MasterBoardTerrain terrain,
BattleHex hex,
LegionClientSide legion,
int turn)
this compute for non-titan defending critter
|
protected void |
evaluateCritterMove_Rangestrike(BattleCritter critter,
java.util.Map<BattleHex,java.lang.Integer> strikeMap,
ValueRecorder value,
MasterBoardTerrain terrain,
BattleHex hex,
int power,
int skill,
LegionClientSide legion,
int turn,
java.util.Set<BattleHex> targetHexes) |
protected void |
evaluateCritterMove_Strike(BattleCritter critter,
java.util.Map<BattleHex,java.lang.Integer> strikeMap,
ValueRecorder value,
MasterBoardTerrain terrain,
BattleHex hex,
int power,
int skill,
LegionClientSide legion,
int turn,
java.util.Set<BattleHex> targetHexes) |
private void |
evaluateCritterMove_Terrain(BattleCritter critter,
ValueRecorder value,
MasterBoardTerrain terrain,
BattleHex hex,
int power,
int skill)
This compute the influence of terrain
|
protected void |
evaluateCritterMove_Titan(BattleCritter critter,
ValueRecorder value,
MasterBoardTerrain terrain,
BattleHex hex,
Legion legion,
int turn)
this compute the special case of the Titan critter
|
private int |
evaluateCritterMove(BattleCritter critter,
java.util.Map<BattleHex,java.lang.Integer> strikeMap,
ValueRecorder value)
strikeMap is optional
|
private int |
evaluateEngagement(MasterHex hex) |
protected int |
evaluateLegionBattleMove(LegionMove lm) |
protected int |
evaluateLegionBattleMoveAsAWhole(LegionMove lm,
java.util.Map<BattleHex,java.lang.Integer> strikeMap,
ValueRecorder value) |
private int |
evaluateMove(LegionClientSide legion,
MasterHex hex,
boolean moved,
java.util.Map<MasterHex,java.util.List<Legion>>[] enemyAttackMap,
ValueRecorder value)
cheap, inaccurate evaluation function.
|
private java.util.Collection<LegionMove> |
findBattleMoves() |
private java.util.List<CritterMove> |
findBattleMovesOneCritter(BattleCritter critter) |
private BattleCritter |
findBestAttacker(BattleCritter target) |
protected LegionMove |
findBestLegionMove(java.util.Collection<LegionMove> legionMoves)
Evaluate all legion moves in the list, and return the best one.
|
private BattleCritter |
findBestTarget() |
(package private) java.util.Collection<LegionMove> |
findLegionMoves(java.util.List<java.util.List<CritterMove>> allCritterMoves)
allCritterMoves is a List of sorted MoveLists.
|
private java.util.List<CritterMove> |
findMoveOrder(LegionMove lm) |
(package private) java.util.List<CreatureType> |
findWeakestTwoCritters(LegionClientSide legion)
Find the two weakest creatures in a legion according to
|
boolean |
flee(Legion legion,
Legion enemy)
choose whether legion should flee from enemy
|
private CreatureType |
getBestCreature(java.util.List<CreatureType> creatures)
Return the most important Creature in the list of Creatures.
|
private static int |
getCombatValue(BattleCritter battleUnit,
MasterBoardTerrain terrain) |
private int |
getCombatValue(CreatureType creature,
MasterBoardTerrain terrain)
XXX Inaccurate for titans.
|
private int |
getCombatValue(Legion legion,
MasterBoardTerrain terrain) |
protected int |
getCreatureMoveLimit()
Find the maximum number of moves per creature to test, such that
numMobileCreaturesInLegion ^ N <= LEGION_MOVE_LIMIT, but we must
have at least as many moves as mobile creatures to ensure that
every creature has somewhere to go.
|
protected SimpleAI.PowerSkill |
getNativeValue(CreatureType creature,
MasterBoardTerrain terrain,
boolean defender) |
private int |
getTitanCombatValue(int power) |
void |
handleCarries(int carryDamage,
java.util.Set<java.lang.String> carryTargets)
Apply carries first to the biggest creature that could be killed
with them, then to the biggest creature.
|
private boolean |
handleForcedSingleMove(Player player,
java.util.Map<Legion,java.util.List<AbstractAI.MoveInfo>> moveMap) |
private boolean |
handleForcedSplitMoves(Player player,
java.util.Map<Legion,java.util.List<AbstractAI.MoveInfo>> moveMap)
Return true if we moved something.
|
(package private) boolean |
handleMulligans(Player player)
Take a mulligan if roll is 2 or 5 in first turn, and can still take
a mulligan.
|
private boolean |
handleVoluntaryMoves(PlayerClientSide player,
java.util.Map<Legion,java.util.List<AbstractAI.MoveInfo>> moveMap,
java.util.Map<MasterHex,java.util.List<Legion>>[] enemyAttackMap)
Return true if we moved something.
|
boolean |
masterMove()
Do a masterboard move (or consider taking mulligan, if feasible).
|
private java.util.List<CreatureType> |
MITsplit(boolean favorTitan,
CreatureType splitCreature,
CreatureType nonsplitCreature,
MasterHex hex)
Split the gargoyles.
|
void |
muster()
make recruits for current player
|
PlayerColor |
pickColor(java.util.List<PlayerColor> colors,
java.util.List<PlayerColor> favoriteColors)
pick a color of legion markers
|
MasterHex |
pickEngagement()
pick an engagement to resolve
|
EntrySide |
pickEntrySide(MasterHex hex,
Legion legion,
java.util.Set<EntrySide> entrySides)
pick an entry side
|
java.lang.String |
pickMarker(java.util.Set<java.lang.String> markerIds,
java.lang.String preferredShortColor)
pick a legion marker
|
java.lang.String |
pickStrikePenalty(java.util.List<java.lang.String> choices)
Pick one of the list of String strike penalty options.
|
private java.util.List<java.lang.String> |
prepareMarkers(java.util.Set<java.lang.String> markerIds,
java.lang.String preferredShortColor) |
(package private) double |
RATIO_DRAW() |
(package private) double |
RATIO_LOSE_HEAVY_LOSS() |
(package private) double |
RATIO_WIN_HEAVY_LOSS() |
(package private) double |
RATIO_WIN_MINIMAL_LOSS() |
void |
reinforce(Legion legion)
pick one reinforcement for legion
|
void |
retryFailedBattleMoves(java.util.List<CritterMove> bestMoveOrder)
Try another move for creatures whose moves failed.
|
(package private) java.util.Timer |
setupTimer() |
boolean |
split()
make splits for current player.
|
boolean |
splitCallback(Legion parent,
Legion child)
Unused in this AI; just return true to indicate done.
|
private void |
splitOneLegion(Player player,
Legion legion) |
boolean |
strike(Legion legion)
Simple one-ply group strike algorithm.
|
SummonInfo |
summonAngel(Legion summoner,
java.util.List<Legion> donors)
Return a SummonInfo object, containing the summoner, donor and unittype.
|
private int |
testMoveOrder(java.util.List<CritterMove> order,
java.util.List<CritterMove> newOrder)
Try each of the moves in order.
|
buildEnemyAttackMap, cleanupBattle, couldRecruitUp, countCreatureAccrossAllLegionFromPlayer, findStrikeMap, generateDamageMap, generateLegionMoves, getAcqStepValue, getBattleStrike, getBattleUnit, getCaretaker, getHintedRecruitmentValue, getHintedRecruitmentValueNonTitan, getHintedRecruitmentValueNonTitan, getInitialSplitHint, getKillValue, getKillValue, getNumberOfWaysToTerrain, getVariantRecruitHint, hasOpponentNativeCreature, initBattle, isHumanLegion, makeLegionMove, rangeToClosestOpponent, setVariant
private static final java.util.logging.Logger LOGGER
private static final java.util.Map<java.lang.String,SimpleAI.TerrainBonuses> TERRAIN_BONUSES
HazardTerrain.isNativeBonusTerrain()
and
HazardTerrain.isNonNativePenaltyTerrain()
.
This is a Mapprotected int timeLimit
boolean timeIsUp
private int splitsDone
private int splitsAcked
private java.util.List<java.lang.String> remainingMarkers
private static final int WIN_WITH_MINIMAL_LOSSES
private static final int WIN_WITH_HEAVY_LOSSES
private static final int DRAW
private static final int LOSE_BUT_INFLICT_HEAVY_LOSSES
private static final int LOSE
private final int MAX_LEGION_MOVES
protected static final int MIN_ITERATIONS
public SimpleAI(Client client)
public PlayerColor pickColor(java.util.List<PlayerColor> colors, java.util.List<PlayerColor> favoriteColors)
AI
private java.util.List<java.lang.String> prepareMarkers(java.util.Set<java.lang.String> markerIds, java.lang.String preferredShortColor)
public java.lang.String pickMarker(java.util.Set<java.lang.String> markerIds, java.lang.String preferredShortColor)
AI
public void muster()
AI
public void reinforce(Legion legion)
AI
CreatureType chooseRecruit(LegionClientSide legion, MasterHex hex, boolean considerReservations)
public boolean split()
AI
public boolean splitCallback(Legion parent, Legion child)
private java.util.List<CreatureType> chooseCreaturesToSplitOut(Legion legion)
java.util.List<CreatureType> findWeakestTwoCritters(LegionClientSide legion)
legion
- java.util.List<CreatureType> doInitialGameSplit(MasterHex hex)
private java.util.List<CreatureType> CMUsplit(boolean favorTitan, CreatureType splitCreature, CreatureType nonsplitCreature, MasterHex hex)
private java.util.List<CreatureType> MITsplit(boolean favorTitan, CreatureType splitCreature, CreatureType nonsplitCreature, MasterHex hex)
public boolean masterMove()
boolean handleMulligans(Player player)
private boolean handleVoluntaryMoves(PlayerClientSide player, java.util.Map<Legion,java.util.List<AbstractAI.MoveInfo>> moveMap, java.util.Map<MasterHex,java.util.List<Legion>>[] enemyAttackMap)
private boolean handleForcedSplitMoves(Player player, java.util.Map<Legion,java.util.List<AbstractAI.MoveInfo>> moveMap)
private boolean handleForcedSingleMove(Player player, java.util.Map<Legion,java.util.List<AbstractAI.MoveInfo>> moveMap)
private int evaluateMove(LegionClientSide legion, MasterHex hex, boolean moved, java.util.Map<MasterHex,java.util.List<Legion>>[] enemyAttackMap, ValueRecorder value)
double RATIO_WIN_MINIMAL_LOSS()
double RATIO_WIN_HEAVY_LOSS()
double RATIO_DRAW()
double RATIO_LOSE_HEAVY_LOSS()
private int estimateBattleResults(Legion attacker, Legion defender, MasterHex hex)
private int estimateBattleResults(Legion attacker, boolean attackerSplitsBeforeBattle, Legion defender, MasterHex hex)
private int estimateBattleResults(Legion attacker, boolean attackerSplitsBeforeBattle, Legion defender, MasterHex hex, CreatureType recruit)
public EntrySide pickEntrySide(MasterHex hex, Legion legion, java.util.Set<EntrySide> entrySides)
AI
public MasterHex pickEngagement()
AI
private int evaluateEngagement(MasterHex hex)
public boolean flee(Legion legion, Legion enemy)
AI
public boolean concede(Legion legion, Legion enemy)
AI
public CreatureType acquireAngel(Legion legion, java.util.List<CreatureType> angels)
AI
private CreatureType getBestCreature(java.util.List<CreatureType> creatures)
public SummonInfo summonAngel(Legion summoner, java.util.List<Legion> donors)
private BattleCritter findBestTarget()
private BattleCritter findBestAttacker(BattleCritter target)
public void handleCarries(int carryDamage, java.util.Set<java.lang.String> carryTargets)
public java.lang.String pickStrikePenalty(java.util.List<java.lang.String> choices)
public boolean strike(Legion legion)
private static int getCombatValue(BattleCritter battleUnit, MasterBoardTerrain terrain)
private int getCombatValue(CreatureType creature, MasterBoardTerrain terrain)
private int getTitanCombatValue(int power)
private int getCombatValue(Legion legion, MasterBoardTerrain terrain)
private SimpleAI.PowerSkill calcBonus(CreatureType creature, java.lang.String terrain, boolean defender)
protected SimpleAI.PowerSkill getNativeValue(CreatureType creature, MasterBoardTerrain terrain, boolean defender)
public java.util.List<CritterMove> battleMove()
public void retryFailedBattleMoves(java.util.List<CritterMove> bestMoveOrder)
private java.util.List<CritterMove> findMoveOrder(LegionMove lm)
private int testMoveOrder(java.util.List<CritterMove> order, java.util.List<CritterMove> newOrder)
protected int getCreatureMoveLimit()
private java.util.Collection<LegionMove> findBattleMoves()
private java.util.List<CritterMove> findBattleMovesOneCritter(BattleCritter critter)
java.util.Timer setupTimer()
protected LegionMove findBestLegionMove(java.util.Collection<LegionMove> legionMoves)
java.util.Collection<LegionMove> findLegionMoves(java.util.List<java.util.List<CritterMove>> allCritterMoves)
protected int evaluateLegionBattleMoveAsAWhole(LegionMove lm, java.util.Map<BattleHex,java.lang.Integer> strikeMap, ValueRecorder value)
protected void evaluateCritterMove_Titan(BattleCritter critter, ValueRecorder value, MasterBoardTerrain terrain, BattleHex hex, Legion legion, int turn)
private void evaluateCritterMove_Terrain(BattleCritter critter, ValueRecorder value, MasterBoardTerrain terrain, BattleHex hex, int power, int skill)
private void evaluateCritterMove_Attacker(BattleCritter critter, ValueRecorder value, MasterBoardTerrain terrain, BattleHex hex, LegionClientSide legion, int turn)
protected void evaluateCritterMove_Defender(BattleCritter critter, ValueRecorder value, MasterBoardTerrain terrain, BattleHex hex, LegionClientSide legion, int turn)
protected void evaluateCritterMove_Rangestrike(BattleCritter critter, java.util.Map<BattleHex,java.lang.Integer> strikeMap, ValueRecorder value, MasterBoardTerrain terrain, BattleHex hex, int power, int skill, LegionClientSide legion, int turn, java.util.Set<BattleHex> targetHexes)
protected void evaluateCritterMove_Strike(BattleCritter critter, java.util.Map<BattleHex,java.lang.Integer> strikeMap, ValueRecorder value, MasterBoardTerrain terrain, BattleHex hex, int power, int skill, LegionClientSide legion, int turn, java.util.Set<BattleHex> targetHexes)
private int evaluateCritterMove(BattleCritter critter, java.util.Map<BattleHex,java.lang.Integer> strikeMap, ValueRecorder value)
protected int evaluateLegionBattleMove(LegionMove lm)