From 612349fa23a096124b5aa1261064ceae7df884ff Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Fri, 27 Jan 2023 07:08:12 +0100 Subject: [PATCH] Game: add CountersRemovedThisTurn --- forge-game/src/main/java/forge/game/Game.java | 20 +++++++++++++++++++ .../java/forge/game/ability/AbilityUtils.java | 7 +++++++ .../ability/effects/RestartGameEffect.java | 1 + .../src/main/java/forge/game/card/Card.java | 4 +++- 4 files changed, 31 insertions(+), 1 deletion(-) diff --git a/forge-game/src/main/java/forge/game/Game.java b/forge-game/src/main/java/forge/game/Game.java index aa22a6087f6..4c4700752b4 100644 --- a/forge-game/src/main/java/forge/game/Game.java +++ b/forge-game/src/main/java/forge/game/Game.java @@ -124,6 +124,7 @@ public class Game { private CardZoneTable untilHostLeavesPlayTriggerList = new CardZoneTable(); private Table>> countersAddedThisTurn = HashBasedTable.create(); + private Multimap> countersRemovedThisTurn = ArrayListMultimap.create(); private FCollection globalDamageHistory = new FCollection<>(); private IdentityHashMap, Pair> damageThisTurnLKI = new IdentityHashMap<>(); @@ -1102,6 +1103,7 @@ public class Game { public void onCleanupPhase() { clearCounterAddedThisTurn(); + clearCounterRemovedThisTurn(); clearGlobalDamageHistory(); // some cards need this info updated even after a player lost, so don't skip them for (Player player : getRegisteredPlayers()) { @@ -1142,6 +1144,24 @@ public class Game { countersAddedThisTurn.clear(); } + public void addCounterRemovedThisTurn(CounterType cType, Card card, Integer value) { + countersRemovedThisTurn.put(cType, Pair.of(CardUtil.getLKICopy(card), value)); + } + + public int getCounterRemovedThisTurn(CounterType cType, String validCard, Card source, Player sourceController, CardTraitBase ctb) { + int result = 0; + for (Pair p : countersRemovedThisTurn.get(cType)) { + if (p.getKey().isValid(validCard.split(","), sourceController, source, ctb)) { + result += p.getValue(); + } + } + return result; + } + + public void clearCounterRemovedThisTurn() { + countersRemovedThisTurn.clear(); + } + /** * Gets the damage instances done this turn. * @param isCombat if true only combat damage matters, pass null for both diff --git a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java index 9df276d0a21..f3199e1f683 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -958,6 +958,7 @@ public class AbilityUtils { * a {@link forge.game.spellability.SpellAbility} object. * @return a {@link java.util.ArrayList} object. */ + @SuppressWarnings("unchecked") public static PlayerCollection getDefinedPlayers(final Card card, final String def, final CardTraitBase sa) { final PlayerCollection players = new PlayerCollection(); String changedDef = (def == null) ? "You" : applyAbilityTextChangeEffects(def, sa); // default to Self @@ -2745,6 +2746,12 @@ public class AbilityUtils { return doXMath(game.getCounterAddedThisTurn(cType, parts[2], parts[3], c, player, ctb), expr, c, ctb); } + if (sq[0].startsWith("CountersRemovedThisTurn")) { + final String[] parts = l[0].split(" "); + CounterType cType = CounterType.getType(parts[1]); + + return doXMath(game.getCounterRemovedThisTurn(cType, parts[2], c, player, ctb), expr, c, ctb); + } // count valid cards in any specified zone/s if (sq[0].startsWith("Valid")) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/RestartGameEffect.java b/forge-game/src/main/java/forge/game/ability/effects/RestartGameEffect.java index 97375d26c58..f5882d668cf 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/RestartGameEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/RestartGameEffect.java @@ -54,6 +54,7 @@ public class RestartGameEffect extends SpellAbilityEffect { game.getStack().reset(); game.clearCounterAddedThisTurn(); + game.clearCounterRemovedThisTurn(); game.setMonarch(null); game.setHasInitiative(null); game.setDayTime(null); diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 27731326e3c..da04b667e22 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -1427,7 +1427,7 @@ public class Card extends GameEntity implements Comparable, IHasSVars { public final boolean hasDoubleStrike() { return hasKeyword(Keyword.DOUBLE_STRIKE); } - + public final boolean hasDoubleTeam() { return hasKeyword(Keyword.DOUBLE_TEAM); } @@ -1589,6 +1589,8 @@ public class Card extends GameEntity implements Comparable, IHasSVars { // Play the Subtract Counter sound getGame().fireEvent(new GameEventCardCounters(this, counterName, oldValue, newValue)); + getGame().addCounterRemovedThisTurn(counterName, this, delta); + // Run triggers int curCounters = oldValue; final Map runParams = AbilityKey.mapFromCard(this);