use of games.strategy.engine.data.Change in project triplea by triplea-game.
the class TriggerAttachment method triggerAvailableTechChange.
public static void triggerAvailableTechChange(final Set<TriggerAttachment> satisfiedTriggers, final IDelegateBridge bridge, final String beforeOrAfter, final String stepName, final boolean useUses, final boolean testUses, final boolean testChance, final boolean testWhen) {
Collection<TriggerAttachment> trigs = CollectionUtils.getMatches(satisfiedTriggers, techAvailableMatch());
if (testWhen) {
trigs = CollectionUtils.getMatches(trigs, whenOrDefaultMatch(beforeOrAfter, stepName));
}
if (testUses) {
trigs = CollectionUtils.getMatches(trigs, availableUses);
}
for (final TriggerAttachment t : trigs) {
if (testChance && !t.testChance(bridge)) {
continue;
}
if (useUses) {
t.use(bridge);
}
for (final PlayerID player : t.getPlayers()) {
for (final String cat : t.getAvailableTech().keySet()) {
final TechnologyFrontier tf = player.getTechnologyFrontierList().getTechnologyFrontier(cat);
if (tf == null) {
throw new IllegalStateException("Triggers: tech category doesn't exist:" + cat + " for player:" + player);
}
for (final TechAdvance ta : t.getAvailableTech().get(cat).keySet()) {
if (t.getAvailableTech().get(cat).get(ta)) {
bridge.getHistoryWriter().startEvent(MyFormatter.attachmentNameToText(t.getName()) + ": " + player.getName() + " gains access to " + ta);
final Change change = ChangeFactory.addAvailableTech(tf, ta, player);
bridge.addChange(change);
} else {
bridge.getHistoryWriter().startEvent(MyFormatter.attachmentNameToText(t.getName()) + ": " + player.getName() + " loses access to " + ta);
final Change change = ChangeFactory.removeAvailableTech(tf, ta, player);
bridge.addChange(change);
}
}
}
}
}
}
use of games.strategy.engine.data.Change in project triplea by triplea-game.
the class TriggerAttachment method triggerPurchase.
public static void triggerPurchase(final Set<TriggerAttachment> satisfiedTriggers, final IDelegateBridge bridge, final String beforeOrAfter, final String stepName, final boolean useUses, final boolean testUses, final boolean testChance, final boolean testWhen) {
Collection<TriggerAttachment> trigs = CollectionUtils.getMatches(satisfiedTriggers, purchaseMatch());
if (testWhen) {
trigs = CollectionUtils.getMatches(trigs, whenOrDefaultMatch(beforeOrAfter, stepName));
}
if (testUses) {
trigs = CollectionUtils.getMatches(trigs, availableUses);
}
for (final TriggerAttachment t : trigs) {
if (testChance && !t.testChance(bridge)) {
continue;
}
if (useUses) {
t.use(bridge);
}
final int eachMultiple = getEachMultiple(t);
for (final PlayerID player : t.getPlayers()) {
for (int i = 0; i < eachMultiple; ++i) {
final List<Unit> units = new ArrayList<>();
for (final UnitType u : t.getPurchase().keySet()) {
units.addAll(u.create(t.getPurchase().getInt(u), player));
}
if (!units.isEmpty()) {
final String transcriptText = MyFormatter.attachmentNameToText(t.getName()) + ": " + MyFormatter.unitsToTextNoOwner(units) + " gained by " + player;
bridge.getHistoryWriter().startEvent(transcriptText, units);
final Change place = ChangeFactory.addUnits(player, units);
bridge.addChange(place);
}
}
}
}
}
use of games.strategy.engine.data.Change in project triplea by triplea-game.
the class TriggerAttachment method placeUnits.
private static void placeUnits(final TriggerAttachment t, final Territory terr, final IntegerMap<UnitType> utMap, final PlayerID player, final IDelegateBridge bridge) {
// createUnits
final List<Unit> units = new ArrayList<>();
for (final UnitType u : utMap.keySet()) {
units.addAll(u.create(utMap.getInt(u), player));
}
final CompositeChange change = new CompositeChange();
// mark no movement
for (final Unit unit : units) {
change.add(ChangeFactory.markNoMovementChange(unit));
}
// place units
final Collection<Unit> factoryAndInfrastructure = CollectionUtils.getMatches(units, Matches.unitIsInfrastructure());
change.add(OriginalOwnerTracker.addOriginalOwnerChange(factoryAndInfrastructure, player));
final String transcriptText = MyFormatter.attachmentNameToText(t.getName()) + ": " + player.getName() + " has " + MyFormatter.unitsToTextNoOwner(units) + " placed in " + terr.getName();
bridge.getHistoryWriter().startEvent(transcriptText, units);
final Change place = ChangeFactory.addUnits(terr, units);
change.add(place);
bridge.addChange(change);
}
use of games.strategy.engine.data.Change in project triplea by triplea-game.
the class TriggerAttachment method triggerProductionFrontierEditChange.
public static void triggerProductionFrontierEditChange(final Set<TriggerAttachment> satisfiedTriggers, final IDelegateBridge bridge, final String beforeOrAfter, final String stepName, final boolean useUses, final boolean testUses, final boolean testChance, final boolean testWhen) {
final GameData data = bridge.getData();
Collection<TriggerAttachment> trigs = CollectionUtils.getMatches(satisfiedTriggers, prodFrontierEditMatch());
if (testWhen) {
trigs = CollectionUtils.getMatches(trigs, whenOrDefaultMatch(beforeOrAfter, stepName));
}
if (testUses) {
trigs = CollectionUtils.getMatches(trigs, availableUses);
}
final CompositeChange change = new CompositeChange();
for (final TriggerAttachment triggerAttachment : trigs) {
if (testChance && !triggerAttachment.testChance(bridge)) {
continue;
}
if (useUses) {
triggerAttachment.use(bridge);
}
triggerAttachment.getProductionRule().stream().map(s -> s.split(":")).forEach(array -> {
final ProductionFrontier front = data.getProductionFrontierList().getProductionFrontier(array[0]);
final String rule = array[1];
final String ruleName = rule.replaceFirst("^-", "");
final ProductionRule productionRule = data.getProductionRuleList().getProductionRule(ruleName);
final boolean ruleAdded = !rule.startsWith("-");
if (ruleAdded) {
if (!front.getRules().contains(productionRule)) {
change.add(ChangeFactory.addProductionRule(productionRule, front));
bridge.getHistoryWriter().startEvent(MyFormatter.attachmentNameToText(triggerAttachment.getName()) + ": " + productionRule.getName() + " added to " + front.getName());
}
} else {
if (front.getRules().contains(productionRule)) {
change.add(ChangeFactory.removeProductionRule(productionRule, front));
bridge.getHistoryWriter().startEvent(MyFormatter.attachmentNameToText(triggerAttachment.getName()) + ": " + productionRule.getName() + " removed from " + front.getName());
}
}
});
}
if (!change.isEmpty()) {
// TODO: we should sort the frontier list if we make changes to it...
bridge.addChange(change);
}
}
use of games.strategy.engine.data.Change in project triplea by triplea-game.
the class ProSimulateTurnUtils method checkIfCapturedTerritoryIsAlliedCapital.
private static boolean checkIfCapturedTerritoryIsAlliedCapital(final Territory t, final GameData data, final PlayerID player, final IDelegateBridge delegateBridge) {
final PlayerID terrOrigOwner = OriginalOwnerTracker.getOriginalOwner(t);
final RelationshipTracker relationshipTracker = data.getRelationshipTracker();
final TerritoryAttachment ta = TerritoryAttachment.get(t);
if (ta != null && ta.getCapital() != null && terrOrigOwner != null && TerritoryAttachment.getAllCapitals(terrOrigOwner, data).contains(t) && relationshipTracker.isAllied(terrOrigOwner, player)) {
// Give capital and any allied territories back to original owner
final Collection<Territory> originallyOwned = OriginalOwnerTracker.getOriginallyOwned(data, terrOrigOwner);
final List<Territory> friendlyTerritories = CollectionUtils.getMatches(originallyOwned, Matches.isTerritoryAllied(terrOrigOwner, data));
friendlyTerritories.add(t);
for (final Territory item : friendlyTerritories) {
if (item.getOwner() == terrOrigOwner) {
continue;
}
final Change takeOverFriendlyTerritories = ChangeFactory.changeOwner(item, terrOrigOwner);
delegateBridge.addChange(takeOverFriendlyTerritories);
final Collection<Unit> units = CollectionUtils.getMatches(item.getUnits().getUnits(), Matches.unitIsInfrastructure());
if (!units.isEmpty()) {
final Change takeOverNonComUnits = ChangeFactory.changeOwner(units, terrOrigOwner, t);
delegateBridge.addChange(takeOverNonComUnits);
}
}
return true;
}
return false;
}
Aggregations