package games.strategy.engine.data; import java.util.Properties; import games.strategy.engine.delegate.IDelegate; /** * A single step in a game. * * <p> * Typically turn based strategy games are composed of a set of distinct phases (in chess this would be two, white move, * black move). * </p> */ public class GameStep extends GameDataComponent { private static final long serialVersionUID = -7944468945162840931L; private final String m_name; private final String m_displayName; private final PlayerID m_player; private final String m_delegate; private int m_hashCode = -1; private int m_runCount = 0; private int m_maxRunCount = -1; private final Properties m_properties; public static final String PROPERTY_skipPosting = "skipPosting"; public static final String PROPERTY_turnSummaryPlayers = "turnSummaryPlayers"; public static final String PROPERTY_airborneMove = "airborneMove"; public static final String PROPERTY_combatMove = "combatMove"; public static final String PROPERTY_nonCombatMove = "nonCombatMove"; public static final String PROPERTY_fireRockets = "fireRockets"; public static final String PROPERTY_repairUnits = "repairUnits"; public static final String PROPERTY_giveBonusMovement = "giveBonusMovement"; public static final String PROPERTY_removeAirThatCanNotLand = "removeAirThatCanNotLand"; public static final String PROPERTY_resetUnitStateAtStart = "resetUnitStateAtStart"; public static final String PROPERTY_resetUnitStateAtEnd = "resetUnitStateAtEnd"; public static final String PROPERTY_bid = "bid"; public static final String PROPERTY_combinedTurns = "combinedTurns"; public static final String PROPERTY_repairPlayers = "repairPlayers"; /** * Creates new GameStep. * * @param name * name of the game step * @param displayName * name that gets displayed * @param player * player who executes the game step * @param delegate * delegate for the game step * @param data * game data * @param stepProperties * properties of the game step */ public GameStep(final String name, final String displayName, final PlayerID player, final IDelegate delegate, final GameData data, final Properties stepProperties) { super(data); m_name = name; m_displayName = displayName; m_player = player; m_delegate = delegate.getName(); m_properties = stepProperties; } public String getName() { return m_name; } public PlayerID getPlayerID() { return m_player; } public IDelegate getDelegate() { return getData().getDelegateList().getDelegate(m_delegate); } @Override public boolean equals(final Object o) { if (o == null || !(o instanceof GameStep)) { return false; } final GameStep other = (GameStep) o; return other.m_name.equals(this.m_name) && other.m_delegate.equals(this.m_delegate) && other.m_player.equals(this.m_player); } public boolean hasReachedMaxRunCount() { if (m_maxRunCount == -1) { return false; } return m_maxRunCount <= m_runCount; } public int getRunCount() { return m_runCount; } public void incrementRunCount() { m_runCount++; } public void setMaxRunCount(final int count) { m_maxRunCount = count; } public int getMaxRunCount() { return m_maxRunCount; } @Override public int hashCode() { if (m_hashCode == -1) { final String s = m_name + m_delegate + m_player; m_hashCode = s.hashCode(); } return m_hashCode; } public String getDisplayName() { if (m_displayName == null) { return getDelegate().getDisplayName(); } return m_displayName; } /** * Returns the properties of the game step. * Allowed Properties so far:<br> * EndTurn delegates -> skipPosting = true/false<br> * EndTurn delegates -> turnSummaryPlayers = colon separated list of players for this turn summary<br> * Move delegates -> airborneMove = true/false<br> * Move delegates -> combatMove = true/false<br> * Move delegates -> nonCombatMove = true/false<br> * Move delegates -> fireRocketsAfter = true/false<br> * Move & EndTurn delegates -> repairUnits = true/false<br> * Move delegates -> giveBonusMovement = true/false<br> * Move & Place delegates -> removeAirThatCanNotLand = true/false<br> * Move delegates -> resetUnitStateAtStart = true/false<br> * Move delegates -> resetUnitStateAtEnd = true/false<br> * Purchase & Place delegates -> bid = true/false<br> * Purchase delegates -> repairPlayers = colon separated list of players which you can repair for<br> * Move delegates -> combinedTurns = colon separated list of players which have intermeshed phases<br> */ public Properties getProperties() { return m_properties; } @Override public String toString() { return "GameStep:" + m_name + " delegate:" + m_delegate + " player:" + m_player + " displayName:" + m_displayName; } }