mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-18 03:38:01 +00:00
TriggerHandler: changed OncePerEffect trigger for better checking
This commit is contained in:
@@ -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) {
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user