package games.strategy.triplea.delegate; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.Set; import games.strategy.engine.data.Territory; import games.strategy.engine.data.TerritoryEffect; import games.strategy.engine.data.Unit; import games.strategy.engine.data.UnitType; import games.strategy.triplea.attachments.TerritoryAttachment; import games.strategy.triplea.attachments.TerritoryEffectAttachment; /** * Placeholder for all calculations to do with TerritoryEffects. */ public class TerritoryEffectHelper { public static Collection<TerritoryEffect> getEffects(final Territory location) { final TerritoryAttachment ta = TerritoryAttachment.get(location); if (ta != null) { return TerritoryAttachment.get(location).getTerritoryEffect(); } else { return new ArrayList<>(); } } public static int getTerritoryCombatBonus(final UnitType type, final Collection<TerritoryEffect> effects, final boolean defending) { if (type == null || effects == null || effects.isEmpty()) { return 0; } int combatBonus = 0; for (final TerritoryEffect effect : effects) { combatBonus += TerritoryEffectAttachment.get(effect).getCombatEffect(type, defending); } return combatBonus; } private static boolean unitTypeLoosesBlitz(final UnitType type, final Territory location) { if (location == null || type == null) { throw new IllegalStateException("Location and UnitType cannot be null"); } for (final TerritoryEffect effect : getEffects(location)) { if (TerritoryEffectAttachment.get(effect).getNoBlitz().contains(type)) { return true; } } return false; } public static boolean unitKeepsBlitz(final Unit unit, final Territory location) { return unitTypeKeepsBlitz(unit.getType(), location); } private static boolean unitTypeKeepsBlitz(final UnitType type, final Territory location) { return !unitTypeLoosesBlitz(type, location); } public static Set<UnitType> getUnitTypesThatLostBlitz(final Collection<Territory> steps) { final Set<UnitType> rVal = new HashSet<>(); for (final Territory location : steps) { for (final TerritoryEffect effect : getEffects(location)) { rVal.addAll(TerritoryEffectAttachment.get(effect).getNoBlitz()); } } return rVal; } public static Set<UnitType> getUnitTypesForUnitsNotAllowedIntoTerritory(final Territory location) { final Set<UnitType> rVal = new HashSet<>(); for (final TerritoryEffect effect : getEffects(location)) { rVal.addAll(TerritoryEffectAttachment.get(effect).getUnitsNotAllowed()); } return rVal; } public static Set<UnitType> getUnitTypesForUnitsNotAllowedIntoTerritory(final Collection<Territory> steps) { final Set<UnitType> rVal = new HashSet<>(); for (final Territory location : steps) { rVal.addAll(getUnitTypesForUnitsNotAllowedIntoTerritory(location)); } return rVal; } }