From 34e3bd2dc1f1cef659ae253226d434ad8a4ee730 Mon Sep 17 00:00:00 2001 From: TRT <> Date: Mon, 30 May 2022 10:35:40 +0200 Subject: [PATCH] Non-mana abilities incorrectly triggering/replaced --- .../game/spellability/AbilityManaPart.java | 30 ++++++++++--------- .../game/trigger/TriggerTapsForMana.java | 9 +++--- forge-gui/res/cardsfolder/p/pillar_of_war.txt | 2 +- .../res/cardsfolder/p/piston_fist_cyclops.txt | 2 +- 4 files changed, 23 insertions(+), 20 deletions(-) diff --git a/forge-game/src/main/java/forge/game/spellability/AbilityManaPart.java b/forge-game/src/main/java/forge/game/spellability/AbilityManaPart.java index 4a618be3e2c..c767b4e36c9 100644 --- a/forge-game/src/main/java/forge/game/spellability/AbilityManaPart.java +++ b/forge-game/src/main/java/forge/game/spellability/AbilityManaPart.java @@ -126,20 +126,22 @@ public class AbilityManaPart implements java.io.Serializable { SpellAbility root = sa == null ? null : sa.getRootAbility(); - final Map repParams = AbilityKey.mapFromAffected(source); - repParams.put(AbilityKey.Mana, afterReplace); - repParams.put(AbilityKey.Player, player); - repParams.put(AbilityKey.AbilityMana, root); - repParams.put(AbilityKey.Activator, root == null ? null : root.getActivatingPlayer()); + if (root != null && root.isManaAbility()) { + final Map repParams = AbilityKey.mapFromAffected(source); + repParams.put(AbilityKey.Mana, afterReplace); + repParams.put(AbilityKey.Player, player); + repParams.put(AbilityKey.AbilityMana, root); + repParams.put(AbilityKey.Activator, root.getActivatingPlayer()); - switch (player.getGame().getReplacementHandler().run(ReplacementType.ProduceMana, repParams)) { - case NotReplaced: - break; - case Updated: - afterReplace = (String) repParams.get(AbilityKey.Mana); - break; - default: - return; + switch (player.getGame().getReplacementHandler().run(ReplacementType.ProduceMana, repParams)) { + case NotReplaced: + break; + case Updated: + afterReplace = (String) repParams.get(AbilityKey.Mana); + break; + default: + return; + } } //clear lastProduced @@ -172,7 +174,7 @@ public class AbilityManaPart implements java.io.Serializable { runParams.put(AbilityKey.Activator, root == null ? null : root.getActivatingPlayer()); player.getGame().getTriggerHandler().runTrigger(TriggerType.TapsForMana, runParams, false); - if (source.isLand() && sa.getPayCosts() != null && sa.getPayCosts().hasTapCost()) { + if (source.isLand() && root.isManaAbility() && root.getPayCosts() != null && root.getPayCosts().hasTapCost()) { player.setTappedLandForManaThisTurn(true); } } // end produceMana(String) diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerTapsForMana.java b/forge-game/src/main/java/forge/game/trigger/TriggerTapsForMana.java index 94f3165ad72..ae3673c726e 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerTapsForMana.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerTapsForMana.java @@ -56,11 +56,12 @@ public class TriggerTapsForMana extends Trigger { /** {@inheritDoc} * @param runParams*/ @Override - public final boolean performTest(final Map runParams) { - //Check for tapping + public final boolean performTest(final Map runParams) { + SpellAbility manaAbility = (SpellAbility) runParams.get(AbilityKey.AbilityMana); + + // Caged Sun special case if (!hasParam("NoTapCheck")) { - final SpellAbility manaAbility = (SpellAbility) runParams.get(AbilityKey.AbilityMana); - if (manaAbility == null || !manaAbility.getRootAbility().getPayCosts().hasTapCost()) { + if (manaAbility == null || !manaAbility.isManaAbility() || !manaAbility.getPayCosts().hasTapCost()) { return false; } } diff --git a/forge-gui/res/cardsfolder/p/pillar_of_war.txt b/forge-gui/res/cardsfolder/p/pillar_of_war.txt index b4a21f8ce93..cf2a180c09c 100644 --- a/forge-gui/res/cardsfolder/p/pillar_of_war.txt +++ b/forge-gui/res/cardsfolder/p/pillar_of_war.txt @@ -3,7 +3,7 @@ ManaCost:3 Types:Artifact Creature Golem PT:3/3 K:Defender -S:Mode$ CanAttackDefender | Affected$ Card.Self+enchanted | Description$ As long as CARDNAME is enchanted, it can attack as though it didn't have defender. +S:Mode$ CanAttackDefender | ValidCard$ Card.Self+enchanted | Description$ As long as CARDNAME is enchanted, it can attack as though it didn't have defender. SVar:EnchantMe:Once DeckHints:Type$Enchantment Oracle:Defender\nAs long as Pillar of War is enchanted, it can attack as though it didn't have defender. diff --git a/forge-gui/res/cardsfolder/p/piston_fist_cyclops.txt b/forge-gui/res/cardsfolder/p/piston_fist_cyclops.txt index 3dafd1bb81a..25f2a682d01 100644 --- a/forge-gui/res/cardsfolder/p/piston_fist_cyclops.txt +++ b/forge-gui/res/cardsfolder/p/piston_fist_cyclops.txt @@ -3,7 +3,7 @@ ManaCost:1 U/R U/R Types:Creature Cyclops PT:4/3 K:Defender -S:Mode$ CanAttackDefender | Affected$ Card.Self | CheckSVar$ X | Description$ As long as you've cast an instant or sorcery spell this turn, CARDNAME can attack as though it didn't have defender. +S:Mode$ CanAttackDefender | ValidCard$ Card.Self | CheckSVar$ X | Description$ As long as you've cast an instant or sorcery spell this turn, CARDNAME can attack as though it didn't have defender. SVar:X:Count$ThisTurnCast_Instant.YouOwn,Sorcery.YouOwn SVar:BuffedBy:Instant,Sorcery DeckHints:Type$Instant|Sorcery