From 3fdac76ed01c2aed10f5446cbee175cff50b355b Mon Sep 17 00:00:00 2001 From: Bug Hunter Date: Sat, 9 Jan 2021 10:14:49 +0000 Subject: [PATCH] Fix AbilityMana triggering too early on spent mana --- .../main/java/forge/game/mana/ManaPool.java | 41 ----------------- .../forge/game/spellability/SpellAbility.java | 44 +++++++++++++++++++ .../main/java/forge/game/zone/MagicStack.java | 4 +- 3 files changed, 47 insertions(+), 42 deletions(-) diff --git a/forge-game/src/main/java/forge/game/mana/ManaPool.java b/forge-game/src/main/java/forge/game/mana/ManaPool.java index 31a52e30bb5..3d91659245e 100644 --- a/forge-game/src/main/java/forge/game/mana/ManaPool.java +++ b/forge-game/src/main/java/forge/game/mana/ManaPool.java @@ -20,14 +20,11 @@ package forge.game.mana; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Lists; import com.google.common.collect.Multimap; -import forge.GameCommand; import forge.card.MagicColor; import forge.card.mana.ManaAtom; import forge.card.mana.ManaCostShard; import forge.game.GlobalRuleChange; -import forge.game.card.Card; import forge.game.event.EventValueChangeType; -import forge.game.event.GameEventCardStatsChanged; import forge.game.event.GameEventManaPool; import forge.game.event.GameEventZone; import forge.game.phase.PhaseType; @@ -222,44 +219,6 @@ public class ManaPool extends ManaConversionMatrix implements Iterable { manaCost.payMana(mana, this); removeMana(mana); - if (test) { - // If just testing, should I be running special mana bonuses? - return true; - } - - if (mana.addsNoCounterMagic(sa) && sa.getHostCard() != null) { - sa.getHostCard().setCanCounter(false); - } - if (sa.isSpell() && sa.getHostCard() != null) { - final Card host = sa.getHostCard(); - if (mana.addsKeywords(sa) && mana.addsKeywordsType() - && host.getType().hasStringType(mana.getManaAbility().getAddsKeywordsType())) { - final long timestamp = host.getGame().getNextTimestamp(); - final List kws = Arrays.asList(mana.getAddedKeywords().split(" & ")); - host.addChangedCardKeywords(kws, null, false, false, timestamp); - if (mana.addsKeywordsUntil()) { - final GameCommand untilEOT = new GameCommand() { - private static final long serialVersionUID = -8285169579025607693L; - - @Override - public void run() { - host.removeChangedCardKeywords(timestamp); - host.getGame().fireEvent(new GameEventCardStatsChanged(host)); - } - }; - String until = mana.getManaAbility().getAddsKeywordsUntil(); - if ("UntilEOT".equals(until)) { - host.getGame().getEndOfTurn().addUntil(untilEOT); - } - } - } - if (mana.addsCounters(sa)) { - mana.getManaAbility().createETBCounters(host, this.owner); - } - if (mana.triggersWhenSpent()) { - mana.getManaAbility().addTriggersWhenSpent(sa, host); - } - } return true; } 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 c52e8e31ac4..344345b9dd5 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java @@ -22,6 +22,7 @@ import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.common.collect.Maps; +import forge.GameCommand; import forge.card.CardStateName; import forge.card.ColorSet; import forge.card.mana.ManaCost; @@ -40,6 +41,7 @@ import forge.game.card.CardZoneTable; import forge.game.cost.Cost; import forge.game.cost.CostPart; import forge.game.cost.CostRemoveCounter; +import forge.game.event.GameEventCardStatsChanged; import forge.game.keyword.Keyword; import forge.game.mana.Mana; import forge.game.player.Player; @@ -464,6 +466,48 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit public final void clearManaPaid() { payingMana.clear(); } + + public final void applyPayingManaEffects() { + Card host = getHostCard(); + + for (Mana mana : getPayingMana()) { + if (mana.triggersWhenSpent()) { + mana.getManaAbility().addTriggersWhenSpent(this, host); + } + + if (mana.addsCounters(this)) { + mana.getManaAbility().createETBCounters(host, getActivatingPlayer()); + } + + if (mana.addsNoCounterMagic(this) && host != null) { + host.setCanCounter(false); + } + + if (isSpell() && host != null) { + if (mana.addsKeywords(this) && mana.addsKeywordsType() + && host.getType().hasStringType(mana.getManaAbility().getAddsKeywordsType())) { + final long timestamp = host.getGame().getNextTimestamp(); + final List kws = Arrays.asList(mana.getAddedKeywords().split(" & ")); + host.addChangedCardKeywords(kws, null, false, false, timestamp); + if (mana.addsKeywordsUntil()) { + final GameCommand untilEOT = new GameCommand() { + private static final long serialVersionUID = -8285169579025607693L; + + @Override + public void run() { + host.removeChangedCardKeywords(timestamp); + host.getGame().fireEvent(new GameEventCardStatsChanged(host)); + } + }; + String until = mana.getManaAbility().getAddsKeywordsUntil(); + if ("UntilEOT".equals(until)) { + host.getGame().getEndOfTurn().addUntil(untilEOT); + } + } + } + } + } + } public ColorSet getPayingColors() { byte colors = 0; diff --git a/forge-game/src/main/java/forge/game/zone/MagicStack.java b/forge-game/src/main/java/forge/game/zone/MagicStack.java index 6163a38b313..a9014730d30 100644 --- a/forge-game/src/main/java/forge/game/zone/MagicStack.java +++ b/forge-game/src/main/java/forge/game/zone/MagicStack.java @@ -298,7 +298,9 @@ public class MagicStack /* extends MyObservable */ implements Iterable