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.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<ZoneType> zonesToOpen;
private final Map<Player, Object> playersWithValidTargets;
private final Set<Card> oncePerEffectTriggers = new HashSet<>();
private final Set<Trigger> 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) {

View File

@@ -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);
}
}

View File

@@ -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;

View File

@@ -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) {