use of games.strategy.engine.data.Change in project triplea by triplea-game.
the class EndTurnDelegate method addUnitCreatedResources.
private String addUnitCreatedResources(final IDelegateBridge bridge) {
// Find total unit generated resources for all owned units
final GameData data = getData();
final PlayerID player = data.getSequence().getStep().getPlayerId();
final IntegerMap<Resource> resourceTotalsMap = findUnitCreatedResources(player, data);
// Add resource changes and create end turn report string
final StringBuilder endTurnReport = new StringBuilder();
final CompositeChange change = new CompositeChange();
for (final Resource resource : resourceTotalsMap.keySet()) {
int toAdd = resourceTotalsMap.getInt(resource);
if (toAdd == 0) {
continue;
}
int total = player.getResources().getQuantity(resource) + toAdd;
if (total < 0) {
toAdd -= total;
total = 0;
}
final String transcriptText = "Units generate " + toAdd + " " + resource.getName() + "; " + player.getName() + " end with " + total + " " + resource.getName();
bridge.getHistoryWriter().startEvent(transcriptText);
endTurnReport.append(transcriptText).append("<br />");
final Change resources = ChangeFactory.changeResourcesChange(player, resource, toAdd);
change.add(resources);
}
if (!change.isEmpty()) {
bridge.addChange(change);
}
return endTurnReport.toString();
}
use of games.strategy.engine.data.Change in project triplea by triplea-game.
the class EndTurnDelegate method determineNationalObjectives.
/**
* Determine if National Objectives have been met, and then do them.
*/
private String determineNationalObjectives(final IDelegateBridge bridge) {
final GameData data = getData();
final PlayerID player = data.getSequence().getStep().getPlayerId();
// Find and test all the conditions for triggers and national objectives
final Set<TriggerAttachment> triggers = new HashSet<>();
final List<RulesAttachment> objectives = new ArrayList<>();
final HashMap<ICondition, Boolean> testedConditions = testNationalObjectivesAndTriggers(player, data, bridge, triggers, objectives);
// Execute triggers
final StringBuilder endTurnReport = new StringBuilder();
final boolean useTriggers = Properties.getTriggers(data);
if (useTriggers && !triggers.isEmpty()) {
final Set<TriggerAttachment> toFireTestedAndSatisfied = new HashSet<>(CollectionUtils.getMatches(triggers, AbstractTriggerAttachment.isSatisfiedMatch(testedConditions)));
endTurnReport.append(TriggerAttachment.triggerResourceChange(toFireTestedAndSatisfied, bridge, null, null, true, true, true, true)).append("<br />");
}
// Execute national objectives
for (final RulesAttachment rule : objectives) {
int uses = rule.getUses();
if (uses == 0 || !rule.isSatisfied(testedConditions)) {
continue;
}
int toAdd = rule.getObjectiveValue();
toAdd *= Properties.getPuMultiplier(data);
toAdd *= rule.getEachMultiple();
int total = player.getResources().getQuantity(Constants.PUS) + toAdd;
if (total < 0) {
toAdd -= total;
total = 0;
}
final Change change = ChangeFactory.changeResourcesChange(player, data.getResourceList().getResource(Constants.PUS), toAdd);
bridge.addChange(change);
if (uses > 0) {
uses--;
final Change use = ChangeFactory.attachmentPropertyChange(rule, Integer.toString(uses), "uses");
bridge.addChange(use);
}
final String puMessage = MyFormatter.attachmentNameToText(rule.getName()) + ": " + player.getName() + " met a national objective for an additional " + toAdd + MyFormatter.pluralize(" PU", toAdd) + "; end with " + total + MyFormatter.pluralize(" PU", total);
bridge.getHistoryWriter().startEvent(puMessage);
endTurnReport.append(puMessage).append("<br />");
}
return endTurnReport.toString();
}
use of games.strategy.engine.data.Change in project triplea by triplea-game.
the class IndustrialTechnologyAdvance method perform.
@Override
public void perform(final PlayerID id, final IDelegateBridge bridge) {
final ProductionFrontier current = id.getProductionFrontier();
// they already have it
if (current.getName().endsWith("IndustrialTechnology")) {
return;
}
final String industrialTechName = current.getName() + "IndustrialTechnology";
final ProductionFrontier advancedTech = bridge.getData().getProductionFrontierList().getProductionFrontier(industrialTechName);
// it doesnt exist, dont crash
if (advancedTech == null) {
Logger.getLogger(TechAdvance.class.getName()).log(Level.WARNING, "No tech named:" + industrialTechName + " not adding tech");
return;
}
final Change prodChange = ChangeFactory.changeProductionFrontier(id, advancedTech);
bridge.addChange(prodChange);
}
use of games.strategy.engine.data.Change in project triplea by triplea-game.
the class InitializationDelegate method resetUnitState.
/**
* The initTransportedLandUnits has some side effects, and we need to reset unit state to get rid of them.
*/
private void resetUnitState() {
final Change change = MoveDelegate.getResetUnitStateChange(getData());
if (!change.isEmpty()) {
bridge.getHistoryWriter().startEvent("Cleaning up unit state.");
bridge.addChange(change);
}
}
use of games.strategy.engine.data.Change in project triplea by triplea-game.
the class BattleTracker method addBattle.
void addBattle(final Route route, final Collection<Unit> units, final boolean bombing, final PlayerID id, final IDelegateBridge bridge, final UndoableMove changeTracker, final Collection<Unit> unitsNotUnloadedTilEndOfRoute, final HashMap<Unit, HashSet<Unit>> targets, final boolean airBattleCompleted) {
final GameData data = bridge.getData();
if (bombing) {
// (the air battle will create a bombing battle when done, if needed)
if (!airBattleCompleted && Properties.getRaidsMayBePreceededByAirBattles(data) && AirBattle.territoryCouldPossiblyHaveAirBattleDefenders(route.getEnd(), id, data, bombing)) {
addAirBattle(route, units, id, data, true);
} else {
addBombingBattle(route, units, id, data, targets);
}
// say they were in combat
markWasInCombat(units, bridge, changeTracker);
} else {
// create both an air battle and a normal battle
if (!airBattleCompleted && Properties.getBattlesMayBePreceededByAirBattles(data) && AirBattle.territoryCouldPossiblyHaveAirBattleDefenders(route.getEnd(), id, data, bombing)) {
addAirBattle(route, CollectionUtils.getMatches(units, AirBattle.attackingGroundSeaBattleEscorts()), id, data, false);
}
final Change change = addMustFightBattleChange(route, units, id, data);
bridge.addChange(change);
if (changeTracker != null) {
changeTracker.addChange(change);
}
if (units.stream().anyMatch(Matches.unitIsLand()) || units.stream().anyMatch(Matches.unitIsSea())) {
addEmptyBattle(route, units, id, bridge, changeTracker, unitsNotUnloadedTilEndOfRoute);
}
}
}
Aggregations