package games.strategy.engine.data; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import games.strategy.triplea.delegate.dataObjects.BattleRecords; /** * A holder for BattleRecords. */ public class BattleRecordsList extends GameDataComponent { private static final long serialVersionUID = 7515693859612849475L; private final Map<Integer, BattleRecords> battleRecords = new HashMap<>(); public BattleRecordsList(final GameData data) { super(data); } public static void addRecords(final Map<Integer, BattleRecords> recordList, final int currentRound, final BattleRecords other) { final BattleRecords current = recordList.get(currentRound); if (current == null) { recordList.put(currentRound, other); return; } current.addRecord(other); recordList.put(currentRound, current); } public static void removeRecords(final Map<Integer, BattleRecords> recordList, final int round, final BattleRecords other) { final BattleRecords current = recordList.get(round); if (current == null) { throw new IllegalStateException("Trying to remove records for round that does not exist"); } else { current.removeRecord(other); } } public BattleRecords getCurrentRound() { return battleRecords.get(getData().getSequence().getRound()); } public BattleRecords getCurrentRoundCopy() { final BattleRecords current = battleRecords.get(getData().getSequence().getRound()); if (current == null) { return new BattleRecords(); } else { return new BattleRecords(current); } } public Map<Integer, BattleRecords> getBattleRecordsMap() { return battleRecords; } public Map<Integer, BattleRecords> getBattleRecordsMapCopy() { return copyList(battleRecords); } private static Map<Integer, BattleRecords> copyList(final Map<Integer, BattleRecords> records) { final Map<Integer, BattleRecords> copy = new HashMap<>(); for (final Entry<Integer, BattleRecords> entry : records.entrySet()) { copy.put(Integer.valueOf(entry.getKey()), new BattleRecords(entry.getValue())); } return copy; } @Override public String toString() { final StringBuilder sb = new StringBuilder("BattleRecordsList:"); for (final Entry<Integer, BattleRecords> entry : battleRecords.entrySet()) { sb.append("\n"); sb.append(entry.getKey().toString()); sb.append(" -> "); sb.append(entry.getValue().toString()); sb.append(""); } return sb.toString(); } // Interpretation stuff below public static int getTUVdamageCausedByPlayer(final PlayerID attacker, final BattleRecordsList brl, final int beginningRound, final int endRound, final boolean currentRoundOnly, final boolean includeNullPlayer) { int damageCausedByAttacker = 0; final Collection<BattleRecords> brs = new ArrayList<>(); if (currentRoundOnly) { if (brl != null) { final BattleRecords current = brl.getCurrentRoundCopy(); if (current != null) { brs.add(current); } } } else { if (brl != null) { final Map<Integer, BattleRecords> currentList = brl.getBattleRecordsMapCopy(); if (currentList != null) { for (int i = beginningRound; i <= endRound; i++) { final BattleRecords currentRecords = currentList.get(i); if (currentRecords != null) { brs.add(currentRecords); } } } } } for (final BattleRecords br : brs) { damageCausedByAttacker += BattleRecords .getLostTUVforBattleRecords(BattleRecords.getRecordsForPlayerID(attacker, br), false, includeNullPlayer); } return damageCausedByAttacker; } /** * Determines if there were any battles that match the specified criteria. * * @param attacker * if null then any player * @param defender * if null then any player */ public static boolean getWereThereBattlesInTerritoriesMatching(final PlayerID attacker, final PlayerID defender, final String battleType, final Collection<Territory> anyOfTheseTerritories, final BattleRecordsList brl, final int beginningRound, final int endRound, final boolean currentRoundOnly) { final Collection<BattleRecords> brs = new ArrayList<>(); if (currentRoundOnly) { if (brl != null && brl.getCurrentRoundCopy() != null) { brs.add(brl.getCurrentRoundCopy()); } } else { final Map<Integer, BattleRecords> currentList = brl.getBattleRecordsMapCopy(); for (int i = beginningRound; i > endRound; i++) { final BattleRecords currentRecords = currentList.get(i); if (currentRecords != null) { brs.add(currentRecords); } } } // null for attacker means any attacker for (final BattleRecords br : brs) { if (BattleRecords.getWereThereBattlesInTerritoriesMatching( (attacker == null ? BattleRecords.getAllRecords(br) : BattleRecords.getRecordsForPlayerID(attacker, br)), attacker, defender, battleType, anyOfTheseTerritories)) { return true; } } return false; } }