Search in sources :

Example 46 with Change

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();
}
Also used : PlayerID(games.strategy.engine.data.PlayerID) GameData(games.strategy.engine.data.GameData) Resource(games.strategy.engine.data.Resource) CompositeChange(games.strategy.engine.data.CompositeChange) Change(games.strategy.engine.data.Change) CompositeChange(games.strategy.engine.data.CompositeChange)

Example 47 with Change

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();
}
Also used : TriggerAttachment(games.strategy.triplea.attachments.TriggerAttachment) AbstractTriggerAttachment(games.strategy.triplea.attachments.AbstractTriggerAttachment) PlayerID(games.strategy.engine.data.PlayerID) GameData(games.strategy.engine.data.GameData) ArrayList(java.util.ArrayList) CompositeChange(games.strategy.engine.data.CompositeChange) Change(games.strategy.engine.data.Change) RulesAttachment(games.strategy.triplea.attachments.RulesAttachment) ICondition(games.strategy.triplea.attachments.ICondition) HashSet(java.util.HashSet)

Example 48 with Change

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);
}
Also used : Change(games.strategy.engine.data.Change) ProductionFrontier(games.strategy.engine.data.ProductionFrontier)

Example 49 with Change

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);
    }
}
Also used : CompositeChange(games.strategy.engine.data.CompositeChange) Change(games.strategy.engine.data.Change)

Example 50 with 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);
        }
    }
}
Also used : GameData(games.strategy.engine.data.GameData) CompositeChange(games.strategy.engine.data.CompositeChange) Change(games.strategy.engine.data.Change)

Aggregations

Change (games.strategy.engine.data.Change)70 CompositeChange (games.strategy.engine.data.CompositeChange)44 Unit (games.strategy.engine.data.Unit)40 TripleAUnit (games.strategy.triplea.TripleAUnit)29 PlayerID (games.strategy.engine.data.PlayerID)25 Territory (games.strategy.engine.data.Territory)23 ArrayList (java.util.ArrayList)20 GameData (games.strategy.engine.data.GameData)19 UnitType (games.strategy.engine.data.UnitType)16 Resource (games.strategy.engine.data.Resource)12 Test (org.junit.jupiter.api.Test)11 ITestDelegateBridge (games.strategy.engine.data.ITestDelegateBridge)9 Route (games.strategy.engine.data.Route)9 HashSet (java.util.HashSet)8 UnitAttachment (games.strategy.triplea.attachments.UnitAttachment)6 Collection (java.util.Collection)6 IntegerMap (games.strategy.util.IntegerMap)5 Tuple (games.strategy.util.Tuple)4 ProductionFrontier (games.strategy.engine.data.ProductionFrontier)3 ITripleAPlayer (games.strategy.triplea.player.ITripleAPlayer)3