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();
}
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);
}
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);
}
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);
}
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);
}
}
Aggregations