use of games.strategy.engine.data.Unit in project triplea by triplea-game.
the class EndTurnDelegate method createUnits.
private String createUnits(final IDelegateBridge bridge) {
final StringBuilder endTurnReport = new StringBuilder();
final GameData data = getData();
final PlayerID player = data.getSequence().getStep().getPlayerId();
final Predicate<Unit> myCreatorsMatch = Matches.unitIsOwnedBy(player).and(Matches.unitCreatesUnits());
final CompositeChange change = new CompositeChange();
for (final Territory t : data.getMap().getTerritories()) {
final Collection<Unit> myCreators = CollectionUtils.getMatches(t.getUnits().getUnits(), myCreatorsMatch);
if (myCreators != null && !myCreators.isEmpty()) {
final Collection<Unit> toAdd = new ArrayList<>();
final Collection<Unit> toAddSea = new ArrayList<>();
final Collection<Unit> toAddLand = new ArrayList<>();
for (final Unit u : myCreators) {
final UnitAttachment ua = UnitAttachment.get(u.getType());
final IntegerMap<UnitType> createsUnitsMap = ua.getCreatesUnitsList();
final Collection<UnitType> willBeCreated = createsUnitsMap.keySet();
for (final UnitType ut : willBeCreated) {
if (UnitAttachment.get(ut).getIsSea() && Matches.territoryIsLand().test(t)) {
toAddSea.addAll(ut.create(createsUnitsMap.getInt(ut), player));
} else if (!UnitAttachment.get(ut).getIsSea() && !UnitAttachment.get(ut).getIsAir() && Matches.territoryIsWater().test(t)) {
toAddLand.addAll(ut.create(createsUnitsMap.getInt(ut), player));
} else {
toAdd.addAll(ut.create(createsUnitsMap.getInt(ut), player));
}
}
}
if (!toAdd.isEmpty()) {
final String transcriptText = player.getName() + " creates " + MyFormatter.unitsToTextNoOwner(toAdd) + " in " + t.getName();
bridge.getHistoryWriter().startEvent(transcriptText, toAdd);
endTurnReport.append(transcriptText).append("<br />");
final Change place = ChangeFactory.addUnits(t, toAdd);
change.add(place);
}
if (!toAddSea.isEmpty()) {
final Predicate<Territory> myTerrs = Matches.territoryIsWater();
final Collection<Territory> waterNeighbors = data.getMap().getNeighbors(t, myTerrs);
if (waterNeighbors != null && !waterNeighbors.isEmpty()) {
final Territory tw = getRandomTerritory(waterNeighbors, bridge);
final String transcriptText = player.getName() + " creates " + MyFormatter.unitsToTextNoOwner(toAddSea) + " in " + tw.getName();
bridge.getHistoryWriter().startEvent(transcriptText, toAddSea);
endTurnReport.append(transcriptText).append("<br />");
final Change place = ChangeFactory.addUnits(tw, toAddSea);
change.add(place);
}
}
if (!toAddLand.isEmpty()) {
final Predicate<Territory> myTerrs = Matches.isTerritoryOwnedBy(player).and(Matches.territoryIsLand());
final Collection<Territory> landNeighbors = data.getMap().getNeighbors(t, myTerrs);
if (landNeighbors != null && !landNeighbors.isEmpty()) {
final Territory tl = getRandomTerritory(landNeighbors, bridge);
final String transcriptText = player.getName() + " creates " + MyFormatter.unitsToTextNoOwner(toAddLand) + " in " + tl.getName();
bridge.getHistoryWriter().startEvent(transcriptText, toAddLand);
endTurnReport.append(transcriptText).append("<br />");
final Change place = ChangeFactory.addUnits(tl, toAddLand);
change.add(place);
}
}
}
}
if (!change.isEmpty()) {
bridge.addChange(change);
}
return endTurnReport.toString();
}
use of games.strategy.engine.data.Unit in project triplea by triplea-game.
the class EndTurnDelegate method findUnitCreatedResources.
/**
* Find all of the resources that will be created by units on the map.
*/
public static IntegerMap<Resource> findUnitCreatedResources(final PlayerID player, final GameData data) {
final IntegerMap<Resource> resourceTotalsMap = new IntegerMap<>();
final Predicate<Unit> myCreatorsMatch = Matches.unitIsOwnedBy(player).and(Matches.unitCreatesResources());
for (final Territory t : data.getMap().getTerritories()) {
final Collection<Unit> myCreators = CollectionUtils.getMatches(t.getUnits().getUnits(), myCreatorsMatch);
for (final Unit unit : myCreators) {
final IntegerMap<Resource> generatedResourcesMap = UnitAttachment.get(unit.getType()).getCreatesResourcesList();
resourceTotalsMap.add(generatedResourcesMap);
}
}
final Resource pus = new Resource(Constants.PUS, data);
if (resourceTotalsMap.containsKey(pus)) {
resourceTotalsMap.put(pus, resourceTotalsMap.getInt(pus) * Properties.getPuMultiplier(data));
}
return resourceTotalsMap;
}
use of games.strategy.engine.data.Unit in project triplea by triplea-game.
the class FinishedBattle method unitsLostInPrecedingBattle.
@Override
public void unitsLostInPrecedingBattle(final IBattle battle, final Collection<Unit> units, final IDelegateBridge bridge, final boolean withdrawn) {
final Collection<Unit> lost = getDependentUnits(units);
lost.addAll(CollectionUtils.intersection(units, m_attackingUnits));
if (lost.size() != 0) {
m_attackingUnits.removeAll(lost);
/*
* TODO: these units are no longer in this territory, most probably. Plus they may have already been removed by
* another "real" battle
* class.
* final String transcriptText = MyFormatter.unitsToText(lost) + " lost in " + m_battleSite.getName();
* bridge.getHistoryWriter().startEvent(transcriptText);
* final Change change = ChangeFactory.removeUnits(m_battleSite, lost);
* bridge.addChange(change);
*/
if (m_attackingUnits.isEmpty()) {
final IntegerMap<UnitType> costs = TuvUtils.getCostsForTuv(m_attacker, m_data);
final int tuvLostAttacker = (withdrawn ? 0 : TuvUtils.getTuv(lost, m_attacker, costs, m_data));
m_attackerLostTUV += tuvLostAttacker;
// scripted?
m_whoWon = WhoWon.DEFENDER;
if (!m_headless) {
m_battleTracker.getBattleRecords().addResultToBattle(m_attacker, m_battleID, m_defender, m_attackerLostTUV, m_defenderLostTUV, BattleRecord.BattleResultDescription.LOST, new BattleResults(this, m_data));
}
m_battleTracker.removeBattle(this);
}
}
}
use of games.strategy.engine.data.Unit in project triplea by triplea-game.
the class FinishedBattle method removeAttack.
@Override
public void removeAttack(final Route route, final Collection<Unit> units) {
m_attackingUnits.removeAll(units);
// the route could be null, in the case of a unit in a territory where a sub is submerged.
if (route == null) {
return;
}
final Territory attackingFrom = route.getTerritoryBeforeEnd();
Collection<Unit> attackingFromMapUnits = m_attackingFromMap.get(attackingFrom);
// handle possible null pointer
if (attackingFromMapUnits == null) {
attackingFromMapUnits = new ArrayList<>();
}
attackingFromMapUnits.removeAll(units);
if (attackingFromMapUnits.isEmpty()) {
m_attackingFrom.remove(attackingFrom);
}
// deal with amphibious assaults
if (attackingFrom.isWater()) {
if (route.getEnd() != null && !route.getEnd().isWater() && units.stream().anyMatch(Matches.unitIsLand())) {
m_amphibiousLandAttackers.removeAll(CollectionUtils.getMatches(units, Matches.unitIsLand()));
}
// that territory is no longer an amphibious assault
if (attackingFromMapUnits.stream().noneMatch(Matches.unitIsLand())) {
m_amphibiousAttackFrom.remove(attackingFrom);
// do we have any amphibious attacks left?
m_isAmphibious = !m_amphibiousAttackFrom.isEmpty();
}
}
for (final Collection<Unit> dependent : m_dependentUnits.values()) {
dependent.removeAll(units);
}
}
use of games.strategy.engine.data.Unit in project triplea by triplea-game.
the class FinishedBattle method addAttackChange.
@Override
public Change addAttackChange(final Route route, final Collection<Unit> units, final HashMap<Unit, HashSet<Unit>> targets) {
final Map<Unit, Collection<Unit>> addedTransporting = TransportTracker.transporting(units);
for (final Unit unit : addedTransporting.keySet()) {
if (m_dependentUnits.get(unit) != null) {
m_dependentUnits.get(unit).addAll(addedTransporting.get(unit));
} else {
m_dependentUnits.put(unit, addedTransporting.get(unit));
}
}
final Territory attackingFrom = route.getTerritoryBeforeEnd();
m_attackingFrom.add(attackingFrom);
m_attackingUnits.addAll(units);
m_attackingFromMap.putIfAbsent(attackingFrom, new ArrayList<>());
final Collection<Unit> attackingFromMapUnits = m_attackingFromMap.get(attackingFrom);
attackingFromMapUnits.addAll(units);
// are we amphibious
if (route.getStart().isWater() && route.getEnd() != null && !route.getEnd().isWater() && units.stream().anyMatch(Matches.unitIsLand())) {
m_amphibiousAttackFrom.add(route.getTerritoryBeforeEnd());
m_amphibiousLandAttackers.addAll(CollectionUtils.getMatches(units, Matches.unitIsLand()));
m_isAmphibious = true;
}
return ChangeFactory.EMPTY_CHANGE;
}
Aggregations