TriggerHandler: changed OncePerEffect trigger for better checking

This commit is contained in:
Hanmac
2016-10-19 10:36:17 +00:00
parent 6ba369d1db
commit 84771d5b47
4 changed files with 25 additions and 10 deletions

View File

@@ -24,6 +24,7 @@ import forge.game.card.CardCollection;
import forge.game.card.CardView; import forge.game.card.CardView;
import forge.game.card.IHasCardView; import forge.game.card.IHasCardView;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.trigger.Trigger;
import forge.game.trigger.TriggerType; import forge.game.trigger.TriggerType;
import forge.game.trigger.WrappedAbility; import forge.game.trigger.WrappedAbility;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
@@ -92,7 +93,7 @@ public class SpellAbilityStackInstance implements IIdentifiable, IHasCardView {
private final List<ZoneType> zonesToOpen; private final List<ZoneType> zonesToOpen;
private final Map<Player, Object> playersWithValidTargets; private final Map<Player, Object> playersWithValidTargets;
private final Set<Card> oncePerEffectTriggers = new HashSet<>(); private final Set<Trigger> oncePerEffectTriggers = new HashSet<>();
private final StackItemView view; private final StackItemView view;
@@ -272,8 +273,12 @@ public class SpellAbilityStackInstance implements IIdentifiable, IHasCardView {
return playersWithValidTargets; return playersWithValidTargets;
} }
public final boolean attemptOncePerEffectTrigger(Card hostCard) { public final boolean hasOncePerEffectTrigger(Trigger trigger) {
return oncePerEffectTriggers.add(hostCard); return oncePerEffectTriggers.contains(trigger);
}
public final boolean addOncePerEffectTrigger(Trigger trigger) {
return oncePerEffectTriggers.add(trigger);
} }
public void updateTarget(TargetChoices target) { public void updateTarget(TargetChoices target) {

View File

@@ -163,7 +163,7 @@ public class TriggerChangesZone extends Trigger {
SpellAbilityStackInstance si = (SpellAbilityStackInstance) runParams2.get("SpellAbilityStackInstance"); SpellAbilityStackInstance si = (SpellAbilityStackInstance) runParams2.get("SpellAbilityStackInstance");
// si == null means the stack is empty // si == null means the stack is empty
return si == null || si.attemptOncePerEffectTrigger(this.getHostCard()); return si == null || !si.hasOncePerEffectTrigger(this);
} }
} }

View File

@@ -109,7 +109,7 @@ public class TriggerDamageDone extends Trigger {
SpellAbilityStackInstance si = (SpellAbilityStackInstance) runParams2.get("SpellAbilityStackInstance"); SpellAbilityStackInstance si = (SpellAbilityStackInstance) runParams2.get("SpellAbilityStackInstance");
// si == null means the stack is empty // si == null means the stack is empty
return si == null || si.attemptOncePerEffectTrigger(this.getHostCard()); return si == null || !si.hasOncePerEffectTrigger(this);
} }
return true; return true;

View File

@@ -31,6 +31,7 @@ import forge.game.player.Player;
import forge.game.spellability.Ability; import forge.game.spellability.Ability;
import forge.game.spellability.AbilitySub; import forge.game.spellability.AbilitySub;
import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbility;
import forge.game.spellability.SpellAbilityStackInstance;
import forge.game.spellability.TargetRestrictions; import forge.game.spellability.TargetRestrictions;
import forge.game.zone.Zone; import forge.game.zone.Zone;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
@@ -328,9 +329,10 @@ public class TriggerHandler {
for (final Trigger t : Lists.newArrayList(activeTriggers)) { for (final Trigger t : Lists.newArrayList(activeTriggers)) {
if (t.isStatic() && canRunTrigger(t, mode, runParams)) { if (t.isStatic() && canRunTrigger(t, mode, runParams)) {
int x = 1; int x = 1;
int p = t.getHostCard().getController().getAmountOfKeyword("Panharmonicon");
if (handlePanharmonicon(t, runParams)) { if (p > 0 && handlePanharmonicon(t, runParams)) {
x += t.getHostCard().getController().getAmountOfKeyword("Panharmonicon"); x += p;
} }
for (int i = 0; i < x; ++i) { 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)) { int x = 1;
x += t.getHostCard().getController().getAmountOfKeyword("Panharmonicon"); int p = t.getHostCard().getController().getAmountOfKeyword("Panharmonicon");
if (p > 0 && handlePanharmonicon(t, runParams)) {
x += p;
} }
for (int i = 0; i < x; ++i) { for (int i = 0; i < x; ++i) {