From 84771d5b47fbde47e46f8e90c02691ee9bca0c08 Mon Sep 17 00:00:00 2001 From: Hanmac Date: Wed, 19 Oct 2016 10:36:17 +0000 Subject: [PATCH] TriggerHandler: changed OncePerEffect trigger for better checking --- .../SpellAbilityStackInstance.java | 11 +++++++--- .../game/trigger/TriggerChangesZone.java | 2 +- .../forge/game/trigger/TriggerDamageDone.java | 2 +- .../forge/game/trigger/TriggerHandler.java | 20 ++++++++++++++----- 4 files changed, 25 insertions(+), 10 deletions(-) diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbilityStackInstance.java b/forge-game/src/main/java/forge/game/spellability/SpellAbilityStackInstance.java index c877f2034bf..24f4e7f7eaf 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbilityStackInstance.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbilityStackInstance.java @@ -24,6 +24,7 @@ import forge.game.card.CardCollection; import forge.game.card.CardView; import forge.game.card.IHasCardView; import forge.game.player.Player; +import forge.game.trigger.Trigger; import forge.game.trigger.TriggerType; import forge.game.trigger.WrappedAbility; import forge.game.zone.ZoneType; @@ -92,7 +93,7 @@ public class SpellAbilityStackInstance implements IIdentifiable, IHasCardView { private final List zonesToOpen; private final Map playersWithValidTargets; - private final Set oncePerEffectTriggers = new HashSet<>(); + private final Set oncePerEffectTriggers = new HashSet<>(); private final StackItemView view; @@ -272,8 +273,12 @@ public class SpellAbilityStackInstance implements IIdentifiable, IHasCardView { return playersWithValidTargets; } - public final boolean attemptOncePerEffectTrigger(Card hostCard) { - return oncePerEffectTriggers.add(hostCard); + public final boolean hasOncePerEffectTrigger(Trigger trigger) { + return oncePerEffectTriggers.contains(trigger); + } + + public final boolean addOncePerEffectTrigger(Trigger trigger) { + return oncePerEffectTriggers.add(trigger); } public void updateTarget(TargetChoices target) { diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerChangesZone.java b/forge-game/src/main/java/forge/game/trigger/TriggerChangesZone.java index 14a915f4b1d..32be2f8d16c 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerChangesZone.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerChangesZone.java @@ -163,7 +163,7 @@ public class TriggerChangesZone extends Trigger { SpellAbilityStackInstance si = (SpellAbilityStackInstance) runParams2.get("SpellAbilityStackInstance"); // si == null means the stack is empty - return si == null || si.attemptOncePerEffectTrigger(this.getHostCard()); + return si == null || !si.hasOncePerEffectTrigger(this); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDamageDone.java b/forge-game/src/main/java/forge/game/trigger/TriggerDamageDone.java index 85edb65395d..2300bcd0fa1 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDamageDone.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDamageDone.java @@ -109,7 +109,7 @@ public class TriggerDamageDone extends Trigger { SpellAbilityStackInstance si = (SpellAbilityStackInstance) runParams2.get("SpellAbilityStackInstance"); // si == null means the stack is empty - return si == null || si.attemptOncePerEffectTrigger(this.getHostCard()); + return si == null || !si.hasOncePerEffectTrigger(this); } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java index e7f867fef9b..bb41c377d53 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java @@ -31,6 +31,7 @@ import forge.game.player.Player; import forge.game.spellability.Ability; import forge.game.spellability.AbilitySub; import forge.game.spellability.SpellAbility; +import forge.game.spellability.SpellAbilityStackInstance; import forge.game.spellability.TargetRestrictions; import forge.game.zone.Zone; import forge.game.zone.ZoneType; @@ -328,9 +329,10 @@ public class TriggerHandler { for (final Trigger t : Lists.newArrayList(activeTriggers)) { if (t.isStatic() && canRunTrigger(t, mode, runParams)) { int x = 1; + int p = t.getHostCard().getController().getAmountOfKeyword("Panharmonicon"); - if (handlePanharmonicon(t, runParams)) { - x += t.getHostCard().getController().getAmountOfKeyword("Panharmonicon"); + if (p > 0 && handlePanharmonicon(t, runParams)) { + x += p; } for (int i = 0; i < x; ++i) { @@ -396,10 +398,18 @@ public class TriggerHandler { } } - int x = 1; + if (t.getMapParams().containsKey("OncePerEffect")) { + SpellAbilityStackInstance si = (SpellAbilityStackInstance) runParams.get("SpellAbilityStackInstance"); + if (si != null) { + si.addOncePerEffectTrigger(t); + } + } - if (handlePanharmonicon(t, runParams)) { - x += t.getHostCard().getController().getAmountOfKeyword("Panharmonicon"); + int x = 1; + int p = t.getHostCard().getController().getAmountOfKeyword("Panharmonicon"); + + if (p > 0 && handlePanharmonicon(t, runParams)) { + x += p; } for (int i = 0; i < x; ++i) {