package games.strategy.triplea.delegate; import java.util.ArrayList; import java.util.Collection; import games.strategy.engine.data.GameData; import games.strategy.engine.data.PlayerID; import games.strategy.engine.data.Territory; import games.strategy.engine.data.Unit; import games.strategy.util.CompositeMatch; import games.strategy.util.CompositeMatchAnd; import games.strategy.util.InverseMatch; /** * Utility for detecting and removing units that can't land at the end of a phase. */ public class UnitsThatCantFightUtil { private final GameData m_data; public UnitsThatCantFightUtil(final GameData data) { m_data = data; } // TODO Used to notify of kamikazi attacks public Collection<Territory> getTerritoriesWhereUnitsCantFight(final PlayerID player) { final CompositeMatch<Unit> enemyAttackUnits = new CompositeMatchAnd<>(); enemyAttackUnits.add(Matches.enemyUnit(player, m_data)); enemyAttackUnits.add(Matches.unitCanAttack(player)); final Collection<Territory> cantFight = new ArrayList<>(); for (final Territory current : m_data.getMap()) { // get all owned non-combat units final CompositeMatch<Unit> ownedUnitsMatch = new CompositeMatchAnd<>(); ownedUnitsMatch.add(new InverseMatch<>(Matches.UnitIsInfrastructure)); if (current.isWater()) { ownedUnitsMatch.add(Matches.UnitIsLand.invert()); } ownedUnitsMatch.add(Matches.unitIsOwnedBy(player)); // All owned units final int countAllOwnedUnits = current.getUnits().countMatches(ownedUnitsMatch); // only noncombat units ownedUnitsMatch.add(new InverseMatch<>(Matches.unitCanAttack(player))); final Collection<Unit> nonCombatUnits = current.getUnits().getMatches(ownedUnitsMatch); if (nonCombatUnits.isEmpty() || nonCombatUnits.size() != countAllOwnedUnits) { continue; } if (current.getUnits().someMatch(enemyAttackUnits)) { cantFight.add(current); } } return cantFight; } }