diff --git a/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java b/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java index 342d2f7da83..da91b969bef 100644 --- a/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java +++ b/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java @@ -60,15 +60,6 @@ public abstract class SpellAbilityEffect { return sa.getDescription(); } - protected static final void resolveSubAbility(final SpellAbility sa) { - // if mana production has any type of SubAbility, undoable=false - final AbilitySub abSub = sa.getSubAbility(); - if (abSub != null) { - sa.setUndoable(false); - AbilityUtils.resolve(abSub); - } - } - /** * Returns this effect description with needed prelude and epilogue. * @param params diff --git a/forge-game/src/main/java/forge/game/ability/effects/ManaReflectedEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ManaReflectedEffect.java index 1616c2432cd..65a0a617f5e 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ManaReflectedEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ManaReflectedEffect.java @@ -23,7 +23,7 @@ public class ManaReflectedEffect extends SpellAbilityEffect { public void resolve(SpellAbility sa) { // Spells are not undoable AbilityManaPart ma = sa.getManaPart(); - sa.setUndoable(sa.isAbility() && sa.isUndoable()); + sa.setUndoable(sa.isAbility() && sa.isUndoable() && sa.getSubAbility() == null); final Collection colors = CardUtil.getReflectableManaColors(sa); @@ -31,8 +31,6 @@ public class ManaReflectedEffect extends SpellAbilityEffect { final String generated = generatedReflectedMana(sa, colors, player); ma.produceMana(generated, player, sa); } - - resolveSubAbility(sa); } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java index 38ed3ea080f..4e1bed39fab 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java @@ -517,6 +517,12 @@ public class TriggerHandler { abMana.setUndoable(false); } } + if (regtrig instanceof TriggerSpellAbilityCastOrCopy) { + final SpellAbility abMana = (SpellAbility) runParams.get(AbilityKey.CastSA); + if (null != abMana && null != abMana.getManaPart()) { + abMana.setUndoable(false); + } + } SpellAbility sa = null; Card host = regtrig.getHostCard(); diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCastOrCopy.java b/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCastOrCopy.java index b394dd89d6a..f3888601b19 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCastOrCopy.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCastOrCopy.java @@ -90,14 +90,23 @@ public class TriggerSpellAbilityCastOrCopy extends Trigger { } if (hasParam("ValidActivatingPlayer")) { - if (si == null || !matchesValid(si.getSpellAbility(true).getActivatingPlayer(), getParam("ValidActivatingPlayer").split(","))) { + Player activator; + if (spellAbility.isManaAbility()) { + activator = (Player) runParams.get(AbilityKey.Activator); + } else if (si == null) { + return false; + } else { + activator = si.getSpellAbility(true).getActivatingPlayer(); + } + + if (!matchesValidParam("ValidActivatingPlayer", activator)) { return false; } if (hasParam("ActivatorThisTurnCast")) { final String compare = getParam("ActivatorThisTurnCast"); final String valid = getParamOrDefault("ValidCard", "Card"); List thisTurnCast = CardUtil.getThisTurnCast(valid, getHostCard(), this); - thisTurnCast = CardLists.filterControlledBy(thisTurnCast, si.getSpellAbility(true).getActivatingPlayer()); + thisTurnCast = CardLists.filterControlledBy(thisTurnCast, activator); int left = thisTurnCast.size(); int right = Integer.parseInt(compare.substring(2)); if (!Expressions.compare(left, compare, right)) { @@ -121,7 +130,6 @@ public class TriggerSpellAbilityCastOrCopy extends Trigger { boolean validTgtFound = false; while (sa != null && !validTgtFound) { for (final Card tgt : sa.getTargets().getTargetCards()) { - if (matchesValid(tgt, getParam("TargetsValid").split(","))) { validTgtFound = true; if (this.hasParam("RememberValidCards")) { 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 b398ff20f49..48efbd76acd 100644 --- a/forge-game/src/main/java/forge/game/zone/MagicStack.java +++ b/forge-game/src/main/java/forge/game/zone/MagicStack.java @@ -231,6 +231,18 @@ public class MagicStack /* extends MyObservable */ implements Iterable runParams = AbilityKey.mapFromPlayer(sp.getHostCard().getController()); + runParams.put(AbilityKey.Cost, sp.getPayCosts()); + runParams.put(AbilityKey.Activator, sp.getActivatingPlayer()); + runParams.put(AbilityKey.CastSA, sp); + game.getTriggerHandler().runTrigger(TriggerType.SpellAbilityCast, runParams, true); + if (sp.isActivatedAbility()) { + game.getTriggerHandler().runTrigger(TriggerType.AbilityCast, runParams, true); + } + + // reset in case a trigger stopped it on a previous activation + sp.setUndoable(true); + AbilityUtils.resolve(sp); game.getGameLog().add(GameLogEntryType.MANA, source + " - " + sp.getDescription()); sp.resetOnceResolved(); @@ -292,9 +304,8 @@ public class MagicStack /* extends MyObservable */ implements Iterable runParams = AbilityKey.newMap(); + Map runParams = AbilityKey.mapFromPlayer(sp.getHostCard().getController()); runParams.put(AbilityKey.Cost, sp.getPayCosts()); - runParams.put(AbilityKey.Player, sp.getHostCard().getController()); runParams.put(AbilityKey.Activator, sp.getActivatingPlayer()); runParams.put(AbilityKey.CastSA, si.getSpellAbility(true)); runParams.put(AbilityKey.CastSACMC, si.getSpellAbility(true).getHostCard().getCMC()); @@ -304,9 +315,9 @@ public class MagicStack /* extends MyObservable */ implements Iterable | ValidTgts$ Player | TgtPrompt$ Select target player | NumDmg$ 3 | ValidCards$ Creature.tapped | Planeswalker$ True | ValidDescription$ each tapped creature target player controls. | SpellDescription$ CARDNAME deals 3 damage to each tapped creature target player controls A:AB$ Effect | Cost$ SubCounter<8/LOYALTY> | Planeswalker$ True | Ultimate$ True | ValidTgts$ Player | EffectOwner$ Targeted | Name$ Emblem - Rowan Kenrith | Image$ emblem_rowan_kenrith | Triggers$ CopyAbility | Duration$ Permanent | AILogic$ Always | SpellDescription$ Target player gets an emblem with "Whenever you activate an ability that isn't a mana ability, copy it. You may choose new targets for the copy." -SVar:CopyAbility:Mode$ AbilityCast | ValidActivatingPlayer$ You | TriggerZones$ Command | Execute$ TrigCopy | TriggerDescription$ Whenever you activate an ability that isn't a mana ability, copy it. You may choose new targets for the copy. +SVar:CopyAbility:Mode$ AbilityCast | ValidActivatingPlayer$ You | ValidSA$ SpellAbility.nonManaAbility | TriggerZones$ Command | Execute$ TrigCopy | TriggerDescription$ Whenever you activate an ability that isn't a mana ability, copy it. You may choose new targets for the copy. SVar:TrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | MayChooseTarget$ True DeckHints:Name$Will Kenrith Oracle:[+2]: During target player's next turn, each creature that player controls attacks if able.\n[-2]: Rowan Kenrith deals 3 damage to each tapped creature target player controls.\n[-8]: Target player gets an emblem with "Whenever you activate an ability that isn't a mana ability, copy it. You may choose new targets for the copy."\nPartner with Will Kenrith\nRowan Kenrith can be your commander. diff --git a/forge-gui/res/cardsfolder/r/runic_armasaur.txt b/forge-gui/res/cardsfolder/r/runic_armasaur.txt index 9d799916d92..d685168bdc0 100644 --- a/forge-gui/res/cardsfolder/r/runic_armasaur.txt +++ b/forge-gui/res/cardsfolder/r/runic_armasaur.txt @@ -2,6 +2,6 @@ Name:Runic Armasaur ManaCost:1 G G Types:Creature Dinosaur PT:2/5 -T:Mode$ AbilityCast | ValidActivatingPlayer$ Opponent | ValidCard$ Creature.inZoneBattlefield,Land.inZoneBattlefield | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigDraw | TriggerDescription$ Whenever an opponent activates an ability of a creature or land that isn't a mana ability, you may draw a card. +T:Mode$ AbilityCast | ValidActivatingPlayer$ Opponent | ValidCard$ Creature.inZoneBattlefield,Land.inZoneBattlefield | ValidSA$ SpellAbility.nonManaAbility | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigDraw | TriggerDescription$ Whenever an opponent activates an ability of a creature or land that isn't a mana ability, you may draw a card. SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 Oracle:Whenever an opponent activates an ability of a creature or land that isn't a mana ability, you may draw a card.