Search in sources :

Example 6 with Change

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

the class AbstractPlaceDelegate method moveAirOntoNewCarriers.

// TODO Here's the spot for special air placement rules
protected String moveAirOntoNewCarriers(final Territory at, final Territory producer, final Collection<Unit> units, final PlayerID player, final CompositeChange placeChange) {
    if (!at.isWater()) {
        return null;
    }
    if (!canMoveExistingFightersToNewCarriers() || AirThatCantLandUtil.isLhtrCarrierProduction(getData())) {
        return null;
    }
    if (units.stream().noneMatch(Matches.unitIsCarrier())) {
        return null;
    }
    // do we have any spare carrier capacity
    int capacity = AirMovementValidator.carrierCapacity(units, at);
    // subtract fighters that have already been produced with this carrier
    // this turn.
    capacity -= AirMovementValidator.carrierCost(units);
    if (capacity <= 0) {
        return null;
    }
    if (!Matches.territoryIsLand().test(producer)) {
        return null;
    }
    if (!producer.getUnits().anyMatch(Matches.unitCanProduceUnits())) {
        return null;
    }
    final Predicate<Unit> ownedFighters = Matches.unitCanLandOnCarrier().and(Matches.unitIsOwnedBy(player));
    if (!producer.getUnits().anyMatch(ownedFighters)) {
        return null;
    }
    if (wasConquered(producer)) {
        return null;
    }
    if (getAlreadyProduced(producer).stream().anyMatch(Matches.unitCanProduceUnits())) {
        return null;
    }
    final List<Unit> fighters = producer.getUnits().getMatches(ownedFighters);
    final Collection<Unit> movedFighters = getRemotePlayer().getNumberOfFightersToMoveToNewCarrier(fighters, producer);
    if (movedFighters == null || movedFighters.isEmpty()) {
        return null;
    }
    final Change change = ChangeFactory.moveUnits(producer, at, movedFighters);
    placeChange.add(change);
    return MyFormatter.unitsToTextNoOwner(movedFighters) + " moved from " + producer.getName() + " to " + at.getName();
}
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 7 with Change

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

the class AbstractPlaceDelegate method performPlaceFrom.

/**
 * @param producer
 *        territory that produces the new units.
 * @param placeableUnits
 *        the new units
 * @param at
 *        territory where the new units get placed
 */
protected void performPlaceFrom(final Territory producer, final Collection<Unit> placeableUnits, final Territory at, final PlayerID player) {
    final CompositeChange change = new CompositeChange();
    // make sure we can place consuming units
    final boolean didIt = canWeConsumeUnits(placeableUnits, at, true, change);
    if (!didIt) {
        throw new IllegalStateException("Something wrong with consuming/upgrading units");
    }
    final Collection<Unit> factoryAndInfrastructure = CollectionUtils.getMatches(placeableUnits, Matches.unitIsInfrastructure());
    if (!factoryAndInfrastructure.isEmpty()) {
        change.add(OriginalOwnerTracker.addOriginalOwnerChange(factoryAndInfrastructure, player));
    }
    // can we move planes to land there
    final String movedAirTranscriptTextForHistory = moveAirOntoNewCarriers(at, producer, placeableUnits, player, change);
    final Change remove = ChangeFactory.removeUnits(player, placeableUnits);
    final Change place = ChangeFactory.addUnits(at, placeableUnits);
    change.add(remove);
    change.add(place);
    final UndoablePlacement currentPlacement = new UndoablePlacement(change, producer, at, placeableUnits);
    placements.add(currentPlacement);
    updateUndoablePlacementIndexes();
    final String transcriptText = MyFormatter.unitsToTextNoOwner(placeableUnits) + " placed in " + at.getName();
    bridge.getHistoryWriter().startEvent(transcriptText, currentPlacement.getDescriptionObject());
    if (movedAirTranscriptTextForHistory != null) {
        bridge.getHistoryWriter().addChildToEvent(movedAirTranscriptTextForHistory);
    }
    bridge.addChange(change);
    updateProducedMap(producer, placeableUnits);
}
Also used : CompositeChange(games.strategy.engine.data.CompositeChange) Change(games.strategy.engine.data.Change) CompositeChange(games.strategy.engine.data.CompositeChange) TripleAUnit(games.strategy.triplea.TripleAUnit) Unit(games.strategy.engine.data.Unit)

Example 8 with Change

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

the class AirBattle method remove.

private void remove(final Collection<Unit> killed, final IDelegateBridge bridge, final Territory battleSite) {
    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(AirBattle.this);
    removeFromDependents(killed, bridge, dependentBattles, false);
}
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 9 with Change

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

the class AirThatCantLandUtil method removeAirThatCantLand.

private void removeAirThatCantLand(final PlayerID player, final Territory territory, final Collection<Unit> airUnits) {
    final Collection<Unit> toRemove = new ArrayList<>(airUnits.size());
    // if we cant land on land then none can
    if (!territory.isWater()) {
        toRemove.addAll(airUnits);
    } else {
        // on water we may just no have enough carriers
        // find the carrier capacity
        final Collection<Unit> carriers = territory.getUnits().getMatches(Matches.alliedUnit(player, bridge.getData()));
        int capacity = AirMovementValidator.carrierCapacity(carriers, territory);
        for (final Unit unit : airUnits) {
            final UnitAttachment ua = UnitAttachment.get(unit.getType());
            final int cost = ua.getCarrierCost();
            if (cost == -1 || cost > capacity) {
                toRemove.add(unit);
            } else {
                capacity -= cost;
            }
        }
    }
    final Change remove = ChangeFactory.removeUnits(territory, toRemove);
    final String transcriptText = MyFormatter.unitsToTextNoOwner(toRemove) + " could not land in " + territory.getName() + " and " + (toRemove.size() > 1 ? "were" : "was") + " removed";
    bridge.getHistoryWriter().startEvent(transcriptText);
    bridge.addChange(remove);
}
Also used : UnitAttachment(games.strategy.triplea.attachments.UnitAttachment) ArrayList(java.util.ArrayList) Change(games.strategy.engine.data.Change) Unit(games.strategy.engine.data.Unit)

Example 10 with Change

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

the class MoveDelegate method resetAndGiveBonusMovement.

private void resetAndGiveBonusMovement() {
    boolean addedHistoryEvent = false;
    final Change changeReset = resetBonusMovement();
    if (!changeReset.isEmpty()) {
        bridge.getHistoryWriter().startEvent("Resetting and Giving Bonus Movement to Units");
        bridge.addChange(changeReset);
        addedHistoryEvent = true;
    }
    Change changeBonus = null;
    if (Properties.getUnitsMayGiveBonusMovement(getData())) {
        changeBonus = giveBonusMovement(bridge, player);
    }
    if (changeBonus != null && !changeBonus.isEmpty()) {
        if (!addedHistoryEvent) {
            bridge.getHistoryWriter().startEvent("Resetting and Giving Bonus Movement to Units");
        }
        bridge.addChange(changeBonus);
    }
}
Also used : 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