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