package games.strategy.triplea.delegate;
import java.util.ArrayList;
import java.util.Collection;
import games.strategy.engine.data.Change;
import games.strategy.engine.data.PlayerID;
import games.strategy.engine.data.Territory;
import games.strategy.engine.data.Unit;
import games.strategy.engine.data.UnitType;
import games.strategy.engine.data.changefactory.ChangeFactory;
import games.strategy.triplea.Constants;
import games.strategy.triplea.MapSupport;
import games.strategy.triplea.attachments.RulesAttachment;
import games.strategy.triplea.attachments.TerritoryAttachment;
import games.strategy.util.IntegerMap;
/**
* At the end of the turn collect units, not income.
*/
@MapSupport
public class NoPUPurchaseDelegate extends PurchaseDelegate {
private boolean isPacific;
@Override
public boolean delegateCurrentlyRequiresUserInput() {
return false;
}
@Override
public void start() {
super.start();
isPacific = isPacificTheater();
final PlayerID player = m_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.";
m_bridge.getHistoryWriter().startEvent(transcriptText);
if (productionChange != null) {
m_bridge.addChange(productionChange);
}
}
private Collection<Unit> getProductionUnits(final Collection<Territory> territories, final PlayerID player) {
final Collection<Unit> productionUnits = new ArrayList<>();
if (!(isProductionPerXTerritoriesRestricted() || isProductionPerValuedTerritoryRestricted())) {
return productionUnits;
}
IntegerMap<UnitType> productionPerXTerritories = new IntegerMap<>();
final RulesAttachment ra = (RulesAttachment) player.getAttachment(Constants.RULES_ATTACHMENT_NAME);
// if they have no rules attachments, but are calling NoPU purchase, and have the game property
// isProductionPerValuedTerritoryRestricted, then they want 1 infantry for each territory with PU value > 0
if (isProductionPerValuedTerritoryRestricted()
&& (ra == null || ra.getProductionPerXTerritories() == null || ra.getProductionPerXTerritories().size() == 0)) {
productionPerXTerritories.put(getData().getUnitTypeList().getUnitType(Constants.UNIT_TYPE_INFANTRY), 1);
} else if (isProductionPerXTerritoriesRestricted()) {
productionPerXTerritories = ra.getProductionPerXTerritories();
} else {
return productionUnits;
}
final Collection<UnitType> unitTypes = new ArrayList<>(productionPerXTerritories.keySet());
for (final UnitType ut : unitTypes) {
int unitCount = 0;
int terrCount = 0;
final int prodPerXTerrs = productionPerXTerritories.getInt(ut);
if (isPacific) {
unitCount += getBurmaRoad(player);
}
for (final Territory current : territories) {
if (!isProductionPerValuedTerritoryRestricted()) {
terrCount++;
} else {
if (TerritoryAttachment.getProduction(current) > 0) {
terrCount++;
}
}
}
unitCount += terrCount / prodPerXTerrs;
productionUnits.addAll(getData().getUnitTypeList().getUnitType(ut.getName()).create(unitCount, player));
}
return productionUnits;
}
private int getBurmaRoad(final PlayerID player) {
// only for pacific - should equal 4 for extra inf
int burmaRoadCount = 0;
for (final Territory current : getData().getMap().getTerritories()) {
final String terrName = current.getName();
if ((terrName.equals("Burma") || terrName.equals("India") || terrName.equals("Yunnan")
|| terrName.equals("Szechwan")) && getData().getRelationshipTracker().isAllied(current.getOwner(), player)) {
++burmaRoadCount;
}
}
if (burmaRoadCount == 4) {
return 1;
}
return 0;
}
private boolean isPacificTheater() {
return games.strategy.triplea.Properties.getPacificTheater(getData());
}
private boolean isProductionPerValuedTerritoryRestricted() {
return games.strategy.triplea.Properties.getProductionPerValuedTerritoryRestricted(getData());
}
private boolean isProductionPerXTerritoriesRestricted() {
return games.strategy.triplea.Properties.getProductionPerXTerritoriesRestricted(getData());
}
}