From c1c421fff0ea64987e90c5e00965ce1528050fa3 Mon Sep 17 00:00:00 2001 From: Hanmac Date: Sat, 19 Jan 2019 18:11:55 +0100 Subject: [PATCH] DamageMap: add clear after being triggered --- .../game/ability/effects/DamageAllEffect.java | 3 +++ .../ability/effects/DamageDealEffect.java | 20 ++++++++++++------- .../ability/effects/DamageEachEffect.java | 3 +++ .../ability/effects/DamageResolveEffect.java | 2 ++ .../game/ability/effects/FightEffect.java | 3 +++ .../java/forge/game/card/CardDamageMap.java | 7 +++++++ .../main/java/forge/game/combat/Combat.java | 1 + .../main/java/forge/game/cost/CostDamage.java | 2 ++ .../forge/game/spellability/SpellAbility.java | 8 ++++++++ 9 files changed, 42 insertions(+), 7 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/DamageAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DamageAllEffect.java index 6fb66618055..bc7abee91dc 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DamageAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DamageAllEffect.java @@ -121,6 +121,9 @@ public class DamageAllEffect extends DamageBaseEffect { if (!usedDamageMap) { preventMap.triggerPreventDamage(false); damageMap.triggerDamageDoneOnce(false, sa); + + preventMap.clear(); + damageMap.clear(); } replaceDying(sa); diff --git a/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java index 9f3e2df9ef7..8c8f906de43 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java @@ -30,7 +30,7 @@ public class DamageDealEffect extends DamageBaseEffect { final int dmg = AbilityUtils.calculateAmount(sa.getHostCard(), damage, sa); List tgts = getTargets(sa); - if (tgts.isEmpty()) + if (tgts.isEmpty()) return ""; final List definedSources = AbilityUtils.getDefinedCards(sa.getHostCard(), sa.getParam("DamageSource"), sa); @@ -131,15 +131,15 @@ public class DamageDealEffect extends DamageBaseEffect { sa.setPreventMap(preventMap); usedDamageMap = true; } - + final List definedSources = AbilityUtils.getDefinedCards(hostCard, sa.getParam("DamageSource"), sa); if (definedSources == null || definedSources.isEmpty()) { return; } - + for (Card source : definedSources) { final Card sourceLKI = hostCard.getGame().getChangeZoneLKIInfo(source); - + if (divideOnResolution) { // Dividing Damage up to multiple targets using combat damage box // Currently only used for Master of the Wild Hunt @@ -147,7 +147,7 @@ public class DamageDealEffect extends DamageBaseEffect { if (players.isEmpty()) { return; } - + CardCollection assigneeCards = new CardCollection(); // Do we have a way of doing this in a better fashion? for (GameObject obj : tgts) { @@ -155,7 +155,7 @@ public class DamageDealEffect extends DamageBaseEffect { assigneeCards.add((Card)obj); } } - + Player assigningPlayer = players.get(0); Map map = assigningPlayer.getController().assignCombatDamage(sourceLKI, assigneeCards, dmg, null, true); for (Entry dt : map.entrySet()) { @@ -166,6 +166,9 @@ public class DamageDealEffect extends DamageBaseEffect { preventMap.triggerPreventDamage(false); // non combat damage cause lifegain there damageMap.triggerDamageDoneOnce(false, sa); + + preventMap.clear(); + damageMap.clear(); } replaceDying(sa); return; @@ -201,7 +204,7 @@ public class DamageDealEffect extends DamageBaseEffect { } } } - + if (remember) { source.addRemembered(damageMap.row(sourceLKI).keySet()); } @@ -210,6 +213,9 @@ public class DamageDealEffect extends DamageBaseEffect { preventMap.triggerPreventDamage(false); // non combat damage cause lifegain there damageMap.triggerDamageDoneOnce(false, sa); + + preventMap.clear(); + damageMap.clear(); } replaceDying(sa); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/DamageEachEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DamageEachEffect.java index 86d78c41490..a485b4d4114 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DamageEachEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DamageEachEffect.java @@ -132,6 +132,9 @@ public class DamageEachEffect extends DamageBaseEffect { if (!usedDamageMap) { preventMap.triggerPreventDamage(false); damageMap.triggerDamageDoneOnce(false, sa); + + preventMap.clear(); + damageMap.clear(); } replaceDying(sa); diff --git a/forge-game/src/main/java/forge/game/ability/effects/DamageResolveEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DamageResolveEffect.java index bdf2f08d670..6ed532889a6 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DamageResolveEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DamageResolveEffect.java @@ -21,10 +21,12 @@ public class DamageResolveEffect extends SpellAbilityEffect { if (preventMap != null) { preventMap.triggerPreventDamage(false); + preventMap.clear(); } // non combat damage cause lifegain there if (damageMap != null) { damageMap.triggerDamageDoneOnce(false, sa); + damageMap.clear(); } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/FightEffect.java b/forge-game/src/main/java/forge/game/ability/effects/FightEffect.java index 998cbf27220..900492e35bb 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/FightEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/FightEffect.java @@ -153,6 +153,9 @@ public class FightEffect extends DamageBaseEffect { if (!usedDamageMap) { preventMap.triggerPreventDamage(false); damageMap.triggerDamageDoneOnce(false, sa); + + preventMap.clear(); + damageMap.clear(); } replaceDying(sa); diff --git a/forge-game/src/main/java/forge/game/card/CardDamageMap.java b/forge-game/src/main/java/forge/game/card/CardDamageMap.java index 13dc81b57f0..1c60aa83edd 100644 --- a/forge-game/src/main/java/forge/game/card/CardDamageMap.java +++ b/forge-game/src/main/java/forge/game/card/CardDamageMap.java @@ -19,6 +19,13 @@ import forge.game.trigger.TriggerType; public class CardDamageMap extends ForwardingTable { private Table dataMap = HashBasedTable.create(); + public CardDamageMap(Table damageMap) { + this.putAll(damageMap); + } + + public CardDamageMap() { + } + public void triggerPreventDamage(boolean isCombat) { for (Map.Entry> e : this.columnMap().entrySet()) { int sum = 0; diff --git a/forge-game/src/main/java/forge/game/combat/Combat.java b/forge-game/src/main/java/forge/game/combat/Combat.java index ccfa0a948f9..830251c9986 100644 --- a/forge-game/src/main/java/forge/game/combat/Combat.java +++ b/forge-game/src/main/java/forge/game/combat/Combat.java @@ -816,6 +816,7 @@ public class Combat { } preventMap.triggerPreventDamage(true); + preventMap.clear(); // This was deeper before, but that resulted in the stack entry acting like before. // Run the trigger to deal combat damage once diff --git a/forge-game/src/main/java/forge/game/cost/CostDamage.java b/forge-game/src/main/java/forge/game/cost/CostDamage.java index 5149a31aff2..eac5e94d289 100644 --- a/forge-game/src/main/java/forge/game/cost/CostDamage.java +++ b/forge-game/src/main/java/forge/game/cost/CostDamage.java @@ -74,6 +74,8 @@ public class CostDamage extends CostPart { preventMap.triggerPreventDamage(false); damageMap.triggerDamageDoneOnce(false, sa); + preventMap.clear(); + damageMap.clear(); return decision.c > 0; } diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java index 818aa487a9a..b9599a50b9c 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java @@ -875,6 +875,14 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit clone.manaPart = new AbilityManaPart(host, mapParams); } + // need to copy the damage tables + if (damageMap != null) { + clone.damageMap = new CardDamageMap(damageMap); + } + if (preventMap != null) { + clone.preventMap = new CardDamageMap(preventMap); + } + // clear maps for copy, the values will be added later clone.additionalAbilities = Maps.newHashMap(); clone.additionalAbilityLists = Maps.newHashMap();