Search in sources :

Example 36 with Change

use of games.strategy.engine.data.Change in project triplea by triplea-game.

the class MustFightBattle method damagedChangeInto.

private void damagedChangeInto(final List<Unit> units, final IDelegateBridge bridge) {
    final List<Unit> damagedUnits = CollectionUtils.getMatches(units, Matches.unitWhenHitPointsDamagedChangesInto().and(Matches.unitHasTakenSomeDamage()));
    final CompositeChange changes = new CompositeChange();
    final List<Unit> unitsToRemove = new ArrayList<>();
    final List<Unit> unitsToAdd = new ArrayList<>();
    for (final Unit unit : damagedUnits) {
        final Map<Integer, Tuple<Boolean, UnitType>> map = UnitAttachment.get(unit.getType()).getWhenHitPointsDamagedChangesInto();
        if (map.containsKey(unit.getHits())) {
            final boolean translateAttributes = map.get(unit.getHits()).getFirst();
            final UnitType unitType = map.get(unit.getHits()).getSecond();
            final List<Unit> toAdd = unitType.create(1, unit.getOwner());
            if (translateAttributes) {
                final Change translate = TripleAUnit.translateAttributesToOtherUnits(unit, toAdd, m_battleSite);
                changes.add(translate);
            }
            unitsToRemove.add(unit);
            unitsToAdd.addAll(toAdd);
        }
    }
    if (!unitsToRemove.isEmpty()) {
        bridge.addChange(changes);
        remove(unitsToRemove, bridge, m_battleSite, null);
        final String transcriptText = MyFormatter.unitsToText(unitsToAdd) + " added in " + m_battleSite.getName();
        bridge.getHistoryWriter().addChildToEvent(transcriptText, new ArrayList<>(unitsToAdd));
        bridge.addChange(ChangeFactory.addUnits(m_battleSite, unitsToAdd));
        bridge.addChange(ChangeFactory.markNoMovementChange(unitsToAdd));
        units.addAll(unitsToAdd);
        getDisplay(bridge).changedUnitsNotification(m_battleID, unitsToRemove.get(0).getOwner(), unitsToRemove, unitsToAdd, null);
    }
}
Also used : UnitType(games.strategy.engine.data.UnitType) ArrayList(java.util.ArrayList) CompositeChange(games.strategy.engine.data.CompositeChange) Change(games.strategy.engine.data.Change) TripleAUnit(games.strategy.triplea.TripleAUnit) Unit(games.strategy.engine.data.Unit) CompositeChange(games.strategy.engine.data.CompositeChange) Tuple(games.strategy.util.Tuple)

Example 37 with Change

use of games.strategy.engine.data.Change in project triplea by triplea-game.

the class MustFightBattle method remove.

private void remove(final Collection<Unit> killed, final IDelegateBridge bridge, final Territory battleSite, final Boolean defenderDying) {
    if (killed.size() == 0) {
        return;
    }
    final Collection<Unit> dependent = getDependentUnits(killed);
    killed.addAll(dependent);
    final Change killedChange = ChangeFactory.removeUnits(battleSite, killed);
    m_killed.addAll(killed);
    final String transcriptText = MyFormatter.unitsToText(killed) + " lost in " + battleSite.getName();
    bridge.getHistoryWriter().addChildToEvent(transcriptText, new ArrayList<>(killed));
    bridge.addChange(killedChange);
    final Collection<IBattle> dependentBattles = m_battleTracker.getBlocked(this);
    // If there are NO dependent battles, check for unloads in allied territories
    if (dependentBattles.isEmpty()) {
        removeFromNonCombatLandings(killed, bridge);
    // otherwise remove them and the units involved
    } else {
        removeFromDependents(killed, bridge, dependentBattles);
    }
    // and remove them from the battle display
    if (defenderDying == null || defenderDying) {
        m_defendingUnits.removeAll(killed);
    }
    if (defenderDying == null || !defenderDying) {
        m_attackingUnits.removeAll(killed);
    }
}
Also used : CompositeChange(games.strategy.engine.data.CompositeChange) Change(games.strategy.engine.data.Change) TripleAUnit(games.strategy.triplea.TripleAUnit) Unit(games.strategy.engine.data.Unit)

Example 38 with Change

use of games.strategy.engine.data.Change in project triplea by triplea-game.

the class MustFightBattle method checkUndefendedTransports.

/**
 * Check for unescorted transports and kill them immediately.
 */
private void checkUndefendedTransports(final IDelegateBridge bridge, final PlayerID player) {
    // if we are the attacker, we can retreat instead of dying
    if (player.equals(m_attacker) && (!getAttackerRetreatTerritories().isEmpty() || m_attackingUnits.stream().anyMatch(Matches.unitIsAir()))) {
        return;
    }
    // Get all allied transports in the territory
    final Predicate<Unit> matchAllied = Matches.unitIsTransport().and(Matches.unitIsNotCombatTransport()).and(Matches.isUnitAllied(player, m_data)).and(Matches.unitIsSea());
    final List<Unit> alliedTransports = CollectionUtils.getMatches(m_battleSite.getUnits().getUnits(), matchAllied);
    // If no transports, just return
    if (alliedTransports.isEmpty()) {
        return;
    }
    // Get all ALLIED, sea & air units in the territory (that are NOT submerged)
    final Predicate<Unit> alliedUnitsMatch = Matches.isUnitAllied(player, m_data).and(Matches.unitIsNotLand()).and(Matches.unitIsSubmerged().negate());
    final Collection<Unit> alliedUnits = CollectionUtils.getMatches(m_battleSite.getUnits().getUnits(), alliedUnitsMatch);
    // If transports are unescorted, check opposing forces to see if the Trns die automatically
    if (alliedTransports.size() == alliedUnits.size()) {
        // Get all the ENEMY sea and air units (that can attack) in the territory
        final Predicate<Unit> enemyUnitsMatch = Matches.unitIsNotLand().and(Matches.unitIsSubmerged().negate()).and(Matches.unitCanAttack(player));
        final Collection<Unit> enemyUnits = CollectionUtils.getMatches(m_battleSite.getUnits().getUnits(), enemyUnitsMatch);
        // If there are attackers set their movement to 0 and kill the transports
        if (enemyUnits.size() > 0) {
            final Change change = ChangeFactory.markNoMovementChange(CollectionUtils.getMatches(enemyUnits, Matches.unitIsSea()));
            bridge.addChange(change);
            final boolean defender = player.equals(m_defender);
            remove(alliedTransports, bridge, m_battleSite, defender);
        }
    }
}
Also used : CompositeChange(games.strategy.engine.data.CompositeChange) Change(games.strategy.engine.data.Change) TripleAUnit(games.strategy.triplea.TripleAUnit) Unit(games.strategy.engine.data.Unit)

Example 39 with Change

use of games.strategy.engine.data.Change in project triplea by triplea-game.

the class NoPUPurchaseDelegate method start.

@Override
public void start() {
    super.start();
    isPacific = isPacificTheater();
    final PlayerID player = bridge.getPlayerId();
    final Collection<Territory> territories = getData().getMap().getTerritoriesOwnedBy(player);
    final Collection<Unit> units = getProductionUnits(territories, player);
    final Change productionChange = ChangeFactory.addUnits(player, units);
    final String transcriptText = player.getName() + " builds " + units.size() + " units.";
    bridge.getHistoryWriter().startEvent(transcriptText);
    if (productionChange != null) {
        bridge.addChange(productionChange);
    }
}
Also used : PlayerID(games.strategy.engine.data.PlayerID) Territory(games.strategy.engine.data.Territory) Change(games.strategy.engine.data.Change) Unit(games.strategy.engine.data.Unit)

Example 40 with Change

use of games.strategy.engine.data.Change in project triplea by triplea-game.

the class PoliticsDelegate method chargeForAction.

/**
 * Subtract money from the players wallet
 *
 * @param paa
 *        the politicalactionattachment this the money is charged for.
 */
private void chargeForAction(final PoliticalActionAttachment paa) {
    final Resource pus = getData().getResourceList().getResource(Constants.PUS);
    final int cost = paa.getCostPu();
    if (cost > 0) {
        // don't notify user of spending money anymore
        // notifyMoney(paa, true);
        final String transcriptText = bridge.getPlayerId().getName() + " spend " + cost + " PU on Political Action: " + MyFormatter.attachmentNameToText(paa.getName());
        bridge.getHistoryWriter().startEvent(transcriptText);
        final Change charge = ChangeFactory.changeResourcesChange(bridge.getPlayerId(), pus, -cost);
        bridge.addChange(charge);
    } else {
        final String transcriptText = bridge.getPlayerId().getName() + " takes Political Action: " + MyFormatter.attachmentNameToText(paa.getName());
        // we must start an event anyway
        bridge.getHistoryWriter().startEvent(transcriptText);
    }
}
Also used : Resource(games.strategy.engine.data.Resource) CompositeChange(games.strategy.engine.data.CompositeChange) Change(games.strategy.engine.data.Change)

Aggregations

Change (games.strategy.engine.data.Change)70 CompositeChange (games.strategy.engine.data.CompositeChange)44 Unit (games.strategy.engine.data.Unit)40 TripleAUnit (games.strategy.triplea.TripleAUnit)29 PlayerID (games.strategy.engine.data.PlayerID)25 Territory (games.strategy.engine.data.Territory)23 ArrayList (java.util.ArrayList)20 GameData (games.strategy.engine.data.GameData)19 UnitType (games.strategy.engine.data.UnitType)16 Resource (games.strategy.engine.data.Resource)12 Test (org.junit.jupiter.api.Test)11 ITestDelegateBridge (games.strategy.engine.data.ITestDelegateBridge)9 Route (games.strategy.engine.data.Route)9 HashSet (java.util.HashSet)8 UnitAttachment (games.strategy.triplea.attachments.UnitAttachment)6 Collection (java.util.Collection)6 IntegerMap (games.strategy.util.IntegerMap)5 Tuple (games.strategy.util.Tuple)4 ProductionFrontier (games.strategy.engine.data.ProductionFrontier)3 ITripleAPlayer (games.strategy.triplea.player.ITripleAPlayer)3