diff --git a/.gitattributes b/.gitattributes index 0663a45dfc7..4aac3a07bfc 100644 --- a/.gitattributes +++ b/.gitattributes @@ -11678,6 +11678,7 @@ forge-gui/res/cardsfolder/p/pyrokinesis.txt svneol=native#text/plain forge-gui/res/cardsfolder/p/pyromancer_ascension.txt -text svneol=unset#text/plain forge-gui/res/cardsfolder/p/pyromancers_assault.txt -text forge-gui/res/cardsfolder/p/pyromancers_gauntlet.txt -text +forge-gui/res/cardsfolder/p/pyromancers_goggles.txt -text forge-gui/res/cardsfolder/p/pyromancers_swath.txt svneol=native#text/plain forge-gui/res/cardsfolder/p/pyromancy.txt svneol=native#text/plain forge-gui/res/cardsfolder/p/pyromania.txt svneol=native#text/plain diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java index 7149ca59304..ab2d750c43e 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java @@ -229,7 +229,7 @@ public class ComputerUtilMana { // get a mana of this type from floating, bail if none available final Mana mana = getMana(ai, part, sa, cost.getSourceRestriction(), (byte) -1); if (mana != null) { - if (ai.getManaPool().tryPayCostWithMana(sa, cost, mana)) { + if (ai.getManaPool().tryPayCostWithMana(sa, cost, mana, false)) { manaSpentToPay.add(0, mana); } } @@ -502,7 +502,7 @@ public class ComputerUtilMana { // get a mana of this type from floating, bail if none available final Mana mana = getMana(ai, part, sa, cost.getSourceRestriction(), hasConverge ? cost.getColorsPaid() : -1); if (mana != null) { - if (ai.getManaPool().tryPayCostWithMana(sa, cost, mana)) { + if (ai.getManaPool().tryPayCostWithMana(sa, cost, mana, test)) { manaSpentToPay.add(0, mana); } } diff --git a/forge-game/src/main/java/forge/game/mana/Mana.java b/forge-game/src/main/java/forge/game/mana/Mana.java index a92a0c163a9..c11c69df993 100644 --- a/forge-game/src/main/java/forge/game/mana/Mana.java +++ b/forge-game/src/main/java/forge/game/mana/Mana.java @@ -113,6 +113,10 @@ public class Mana { return this.manaAbility.getKeywords(); } + public final boolean triggersWhenSpent() { + return this.manaAbility != null && manaAbility.getTriggersWhenSpent(); + } + public final byte getColor() { return this.color; } 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 64bc49b5a60..b6ead035b9f 100644 --- a/forge-game/src/main/java/forge/game/mana/ManaPool.java +++ b/forge-game/src/main/java/forge/game/mana/ManaPool.java @@ -194,7 +194,7 @@ public class ManaPool implements Iterable { paidAbs.add(saPayment); // assumes some part on the mana produced by the ability will get used for (final Mana mana : abManaPart.getLastManaProduced()) { - if (tryPayCostWithMana(saPaidFor, manaCost, mana)) { + if (tryPayCostWithMana(saPaidFor, manaCost, mana, false)) { saPaidFor.getPayingMana().add(0, mana); } } @@ -218,19 +218,25 @@ public class ManaPool implements Iterable { break; } - if (manaFound != null && tryPayCostWithMana(saPaidFor, manaCost, manaFound)) { + if (manaFound != null && tryPayCostWithMana(saPaidFor, manaCost, manaFound, false)) { saPaidFor.getPayingMana().add(0, manaFound); return true; } return false; } - public boolean tryPayCostWithMana(final SpellAbility sa, ManaCostBeingPaid manaCost, final Mana mana) { + public boolean tryPayCostWithMana(final SpellAbility sa, ManaCostBeingPaid manaCost, final Mana mana, boolean test) { if (!manaCost.isNeeded(mana, this)) { return false; } 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); } @@ -267,6 +273,9 @@ public class ManaPool implements Iterable { if (mana.addsCounters(sa)) { mana.getManaAbility().createETBCounters(sa.getHostCard()); } + if (mana.triggersWhenSpent()) { + mana.getManaAbility().addTriggersWhenSpent(sa, sa.getHostCard()); + } } return true; } 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 69bd5cf8bfa..a53429413c6 100644 --- a/forge-game/src/main/java/forge/game/spellability/AbilityManaPart.java +++ b/forge-game/src/main/java/forge/game/spellability/AbilityManaPart.java @@ -25,6 +25,8 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import forge.card.mana.ManaAtom; +import forge.game.trigger.Trigger; +import forge.game.trigger.TriggerHandler; import org.apache.commons.lang3.StringUtils; import forge.card.ColorSet; @@ -59,6 +61,7 @@ public class AbilityManaPart implements java.io.Serializable { private final String addsKeyowrdsType; private final String addsKeywordsUntil; private final String addsCounters; + private final String triggersWhenSpent; private final boolean persistentMana; private String manaReplaceType; @@ -88,6 +91,7 @@ public class AbilityManaPart implements java.io.Serializable { this.addsKeyowrdsType = params.get("AddsKeywordsType"); this.addsKeywordsUntil = params.get("AddsKeywordsUntil"); this.addsCounters = params.get("AddsCounters"); + this.triggersWhenSpent = params.get("TriggersWhenSpent"); this.persistentMana = (null == params.get("PersistentMana")) ? false : "True".equalsIgnoreCase(params.get("PersistentMana")); this.manaReplaceType = params.containsKey("ManaReplaceType") ? params.get("ManaReplaceType") : ""; @@ -268,6 +272,19 @@ public class AbilityManaPart implements java.io.Serializable { } } + public boolean getTriggersWhenSpent() { + return this.triggersWhenSpent != null; + } + + public void addTriggersWhenSpent(SpellAbility saBeingPaid, Card card) { + if (this.triggersWhenSpent == null) + return; + + TriggerHandler handler = card.getGame().getTriggerHandler(); + Trigger trig = TriggerHandler.parseTrigger(sourceCard.getSVar(this.triggersWhenSpent), sourceCard, false); + handler.registerOneTrigger(trig); + } + /** *

* getManaRestrictions. 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 d8cd8f0d018..20bfcc34dc2 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java @@ -241,6 +241,14 @@ public class TriggerHandler { } } + public final boolean registerOneTrigger(final Trigger t) { + if (isTriggerActive(t)) { + activeTriggers.add(t); + return true; + } + return false; + } + public final void runTrigger(final TriggerType mode, final Map runParams, boolean holdTrigger) { if (suppressedModes.contains(mode)) { return; diff --git a/forge-gui/res/cardsfolder/p/pyromancers_goggles.txt b/forge-gui/res/cardsfolder/p/pyromancers_goggles.txt new file mode 100644 index 00000000000..339bb7f083a --- /dev/null +++ b/forge-gui/res/cardsfolder/p/pyromancers_goggles.txt @@ -0,0 +1,8 @@ +Name:Pyromancer's Goggles +ManaCost:5 +Types:Legendary Artifact +A:AB$ Mana | Cost$ T | Produced$ R | TriggersWhenSpent$ TrigCopy | SpellDescription$ Add {R} to your mana pool. When that mana is spent to cast a red instant or sorcery spell, copy that spell and you may choose new targets for the copy. +SVar:TrigCopy:Mode$ SpellCast | ValidCard$ Instant.Red,Sorcery.Red | ValidActivatingPlayer$ You | OneOff$ True | Execute$ TrigCopyMain | TriggerDescription$ When that mana is spent to cast a red instant or sorcery spell, copy that spell and you may choose new targets for the copy. +SVar:TrigCopyMain:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | SubAbility$ DBCleanup +SVar:Picture:http://www.wizards.com/global/images/magic/general/pyromancers_goggles.jpg +Oracle:{T}: Add {R} to your mana pool. When that mana is spent to cast a red instant or sorcery spell, copy that spell and you may choose new targets for the copy. \ No newline at end of file