package games.strategy.triplea.delegate.dataObjects; import java.io.Serializable; import games.strategy.engine.data.PlayerID; import games.strategy.engine.data.SerializationProxySupport; import games.strategy.engine.data.Territory; import games.strategy.triplea.delegate.IBattle.BattleType; import games.strategy.triplea.oddsCalculator.ta.BattleResults; /** * The Purpose of this class is to record various information about combat, * in order to use it for conditions and other things later. */ public class BattleRecord implements Serializable { public enum BattleResultDescription { /** conquered without a fight. */ BLITZED, /** fought, won, and took over territory if land or convoy. */ CONQUERED, /** fought, won, did not take over territory (could be water, or could be air attackers). */ WON_WITHOUT_CONQUERING, /** * fought, enemy either submerged or the battle is over with our objectives successful even * though enemies are left. */ WON_WITH_ENEMY_LEFT, /** have units left in the territory beside enemy defenders (like both sides have transports left). */ STALEMATE, /** either lost the battle, or retreated. */ LOST, /** Successfully bombed something. */ BOMBED, /** Won an Air Battle with units surviving. */ AIR_BATTLE_WON, /** Lost an Air Battle with enemy units surviving. */ AIR_BATTLE_LOST, /** Neither side has air units left. */ AIR_BATTLE_STALEMATE, /** * No battle was fought, possibly because the territory you were about to bomb was conquered before the * bombing could begin, * etc. */ NO_BATTLE } private static final long serialVersionUID = 3642216371483289106L; private Territory battleSite; private PlayerID attacker; private PlayerID defender; private int attackerLostTUV = 0; private int defenderLostTUV = 0; private BattleResultDescription battleResultDescription; private final BattleType battleType; private BattleResults battleResults; @SerializationProxySupport private BattleRecord(final Territory battleSite, final PlayerID attacker, final PlayerID defender, final int attackerLostTUV, final int defenderLostTUV, final BattleResultDescription battleResultDescription, final BattleType battleType, final BattleResults battleResults) { this.battleSite = battleSite; this.attacker = attacker; this.defender = defender; this.attackerLostTUV = attackerLostTUV; this.defenderLostTUV = defenderLostTUV; this.battleResultDescription = battleResultDescription; this.battleType = battleType; this.battleResults = battleResults; } @SerializationProxySupport public Object writeReplace(final Object write) { return new SerializationProxy(this); } private static class SerializationProxy implements Serializable { private static final long serialVersionUID = 355188139820567143L; private final Territory battleSite; private final PlayerID attacker; private final PlayerID defender; private final int attackerLostTUV; private final int defenderLostTUV; private final BattleResultDescription battleResultDescription; private final BattleType battleType; private final BattleResults battleResults; public SerializationProxy(final BattleRecord battleRecord) { battleSite = battleRecord.battleSite; attacker = battleRecord.attacker; defender = battleRecord.defender; attackerLostTUV = battleRecord.attackerLostTUV; defenderLostTUV = battleRecord.defenderLostTUV; battleResultDescription = battleRecord.battleResultDescription; battleType = battleRecord.battleType; battleResults = battleRecord.battleResults; } protected Object readResolve() { return new BattleRecord(battleSite, attacker, defender, attackerLostTUV, defenderLostTUV, battleResultDescription, battleType, battleResults); } } /** * Convenience copy constructor. */ protected BattleRecord(final BattleRecord record) { battleSite = record.battleSite; attacker = record.attacker; defender = record.defender; attackerLostTUV = record.attackerLostTUV; defenderLostTUV = record.defenderLostTUV; battleResultDescription = record.battleResultDescription; battleType = record.battleType; battleResults = record.battleResults; } protected BattleRecord(final Territory battleSite, final PlayerID attacker, final BattleType battleType) { this.battleSite = battleSite; this.attacker = attacker; this.battleType = battleType; } protected void setResult(final PlayerID defender, final int attackerLostTUV, final int defenderLostTUV, final BattleResultDescription battleResultDescription, final BattleResults battleResults) { this.defender = defender; this.attackerLostTUV = attackerLostTUV; this.defenderLostTUV = defenderLostTUV; this.battleResultDescription = battleResultDescription; this.battleResults = battleResults; } protected Territory getBattleSite() { return battleSite; } protected void setBattleSite(final Territory battleSite) { this.battleSite = battleSite; } protected PlayerID getAttacker() { return attacker; } protected void setAttacker(final PlayerID attacker) { this.attacker = attacker; } protected PlayerID getDefender() { return defender; } protected void setDefenders(final PlayerID defender) { this.defender = defender; } protected int getAttackerLostTUV() { return attackerLostTUV; } protected int getDefenderLostTUV() { return defenderLostTUV; } protected BattleType getBattleType() { return battleType; } @Override public int hashCode() { return battleSite.hashCode(); } @Override public boolean equals(final Object o) { if (o == null || !(o instanceof BattleRecord)) { return false; } final BattleRecord other = (BattleRecord) o; return other.battleSite.equals(this.battleSite) && other.battleType.equals(this.battleType) && other.attacker.equals(this.attacker); } @Override public String toString() { return battleType + " battle in " + battleSite; } }