package games.strategy.triplea.oddsCalculator.ta;
import java.util.List;
import games.strategy.engine.data.GameData;
import games.strategy.engine.data.GameDataComponent;
import games.strategy.engine.data.Unit;
import games.strategy.triplea.delegate.IBattle;
import games.strategy.triplea.delegate.IBattle.WhoWon;
import games.strategy.triplea.delegate.Matches;
import games.strategy.util.Match;
public class BattleResults extends GameDataComponent {
private static final long serialVersionUID = 1381361441940258702L;
private final int m_battleRoundsFought;
final List<Unit> m_remainingAttackingUnits;
final List<Unit> m_remainingDefendingUnits;
private WhoWon m_whoWon;
// FYI: do not save the battle in BattleResults. It is both too much memory overhead, and also causes problems with
// BattleResults being
// saved into BattleRecords
/**
* This battle must have been fought. If fight() was not run on this battle, then the WhoWon will not have been set
* yet, which will give
* an error with this constructor.
*/
public BattleResults(final IBattle battle, final GameData data) {
super(data);
m_battleRoundsFought = battle.getBattleRound();
m_remainingAttackingUnits = battle.getRemainingAttackingUnits();
m_remainingDefendingUnits = battle.getRemainingDefendingUnits();
m_whoWon = battle.getWhoWon();
if (m_whoWon == WhoWon.NOTFINISHED) {
throw new IllegalStateException("Battle not finished yet: " + battle);
}
}
/**
* This battle may or may not have been fought already. Use this for pre-setting the WhoWon flag.
*/
public BattleResults(final IBattle battle, final WhoWon scriptedWhoWon, final GameData data) {
super(data);
m_battleRoundsFought = battle.getBattleRound();
m_remainingAttackingUnits = battle.getRemainingAttackingUnits();
m_remainingDefendingUnits = battle.getRemainingDefendingUnits();
m_whoWon = scriptedWhoWon;
}
public void setWhoWon(final WhoWon whoWon) {
m_whoWon = whoWon;
}
public List<Unit> getRemainingAttackingUnits() {
return m_remainingAttackingUnits;
}
public List<Unit> getRemainingDefendingUnits() {
return m_remainingDefendingUnits;
}
public List<Unit> getRemainingAttackingCombatUnits() {
return Match.getMatches(m_remainingAttackingUnits, Matches.UnitIsNotInfrastructure);
}
public List<Unit> getRemainingDefendingCombatUnits() {
return Match.getMatches(m_remainingDefendingUnits, Matches.UnitIsNotInfrastructure);
}
public int getAttackingCombatUnitsLeft() {
return Match.countMatches(m_remainingAttackingUnits, Matches.UnitIsNotInfrastructure);
}
public int getDefendingCombatUnitsLeft() {
return Match.countMatches(m_remainingDefendingUnits, Matches.UnitIsNotInfrastructure);
}
public int getBattleRoundsFought() {
return m_battleRoundsFought;
}
// These could easily screw up an AI into thinking it has won when it really hasn't. Must make sure we only count
// combat units that can
// die.
public boolean attackerWon() {
return !draw() && m_whoWon == WhoWon.ATTACKER;
}
public boolean defenderWon() {
// if noone is left, it is considered a draw, even if m_whoWon says defender.
return !draw() && m_whoWon == WhoWon.DEFENDER;
}
public boolean draw() {
return (m_whoWon != WhoWon.ATTACKER && m_whoWon != WhoWon.DEFENDER)
|| (getAttackingCombatUnitsLeft() == 0 && getDefendingCombatUnitsLeft() == 0);
}
}