From 08d305ebfa59a6bd54af5d4a60f5c6d050502c40 Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 3 Oct 2017 05:31:14 +0000 Subject: [PATCH] - RemAIDeck update: next iteration. --- .../main/java/forge/ai/ComputerUtilCost.java | 12 ++++------ .../src/main/java/forge/ai/SpecialCardAi.java | 23 +++++++++++++++++++ .../java/forge/ai/ability/ChangeZoneAi.java | 4 ++++ .../forge/ai/ability/CopyPermanentAi.java | 16 ++++++------- forge-gui/res/cardsfolder/m/macabre_waltz.txt | 1 - forge-gui/res/cardsfolder/m/mage_il_vec.txt | 2 +- .../res/cardsfolder/m/magister_of_worth.txt | 2 +- .../res/cardsfolder/m/malignant_growth.txt | 2 +- forge-gui/res/cardsfolder/m/mana_crypt.txt | 2 +- forge-gui/res/cardsfolder/m/mana_echoes.txt | 4 ++-- forge-gui/res/cardsfolder/m/mana_flare.txt | 1 - forge-gui/res/cardsfolder/m/mana_vault.txt | 3 ++- .../res/cardsfolder/m/mangara_of_corondor.txt | 3 +-- forge-gui/res/cardsfolder/m/marsh_gas.txt | 1 - .../cardsfolder/m/maulfist_revolutionary.txt | 2 +- .../cardsfolder/m/meandering_towershell.txt | 1 - forge-gui/res/cardsfolder/m/meteor_storm.txt | 2 +- forge-gui/res/cardsfolder/m/mimic_vat.txt | 8 +++---- forge-gui/res/cardsfolder/m/mind_twist.txt | 1 - forge-gui/res/cardsfolder/m/mindswipe.txt | 1 - forge-gui/res/cardsfolder/m/misery_charm.txt | 3 +-- forge-gui/res/cardsfolder/m/molder.txt | 3 +-- forge-gui/res/cardsfolder/m/musician.txt | 4 +++- .../cardsfolder/m/myojin_of_infinite_rage.txt | 1 - 24 files changed, 60 insertions(+), 42 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java index 2e46dfa08cc..233ccd3481a 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java @@ -1,14 +1,8 @@ package forge.ai; -import java.util.List; -import java.util.Set; - -import org.apache.commons.lang3.StringUtils; - import com.google.common.base.Predicate; import com.google.common.collect.Lists; import com.google.common.collect.Sets; - import forge.ai.ability.AnimateAi; import forge.card.ColorSet; import forge.game.GameActionUtil; @@ -27,6 +21,10 @@ import forge.game.zone.ZoneType; import forge.util.MyRandom; import forge.util.TextUtil; import forge.util.collect.FCollectionView; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Set; public class ComputerUtilCost { @@ -535,7 +533,7 @@ public class ComputerUtilCost { if (payer.getLife() > 3 && payer.canPayLife(2)) { final int landsize = payer.getLandsInPlay().size() + 1; for (Card c : payer.getCardsIn(ZoneType.Hand)) { - // if the new land size would equal the CMC of a card in AIs hand, consider playing it untapped, + // if the new land size would equal the CMC of a card in AIs hand, consider playing it untapped, // otherwise don't bother running other checks if (landsize != c.getCMC()) { continue; diff --git a/forge-ai/src/main/java/forge/ai/SpecialCardAi.java b/forge-ai/src/main/java/forge/ai/SpecialCardAi.java index 8365da21490..59b74c24685 100644 --- a/forge-ai/src/main/java/forge/ai/SpecialCardAi.java +++ b/forge-ai/src/main/java/forge/ai/SpecialCardAi.java @@ -742,6 +742,29 @@ public class SpecialCardAi { } } + // Mimic Vat + public static class MimicVat { + public static boolean considerExile(final Player ai, final SpellAbility sa) { + final Card source = sa.getHostCard(); + final Card exiledWith = source.getImprintedCards().isEmpty() ? null : source.getImprintedCards().getFirst(); + final List defined = AbilityUtils.getDefinedCards(sa.getHostCard(), sa.getParam("Defined"), sa); + final Card tgt = defined.isEmpty() ? null : defined.get(0); + + return exiledWith == null || (tgt != null && ComputerUtilCard.evaluateCreature(tgt) > ComputerUtilCard.evaluateCreature(exiledWith)); + } + + public static boolean considerCopy(final Player ai, final SpellAbility sa) { + final Card source = sa.getHostCard(); + final Card exiledWith = source.getImprintedCards().isEmpty() ? null : source.getImprintedCards().getFirst(); + + if (exiledWith == null) { + return false; + } + + return ComputerUtilCard.doesSpecifiedCreatureAttackAI(ai, exiledWith); + } + } + // Momir Vig, Simic Visionary Avatar public static class MomirVigAvatar { public static boolean consider(final Player ai, final SpellAbility sa) { diff --git a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java index a3e557d0571..55e576c7358 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java @@ -756,6 +756,10 @@ public class ChangeZoneAi extends SpellAbilityAi { * @return a boolean. */ private static boolean knownOriginPlayDrawbackAI(final Player aiPlayer, final SpellAbility sa) { + if ("MimicVat".equals(sa.getParam("AILogic"))) { + return SpecialCardAi.MimicVat.considerExile(aiPlayer, sa); + } + if (!sa.usesTargeting()) { return true; } diff --git a/forge-ai/src/main/java/forge/ai/ability/CopyPermanentAi.java b/forge-ai/src/main/java/forge/ai/ability/CopyPermanentAi.java index adac0968695..e1da8c495f3 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CopyPermanentAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CopyPermanentAi.java @@ -1,27 +1,23 @@ package forge.ai.ability; -import java.util.List; - import com.google.common.base.Predicate; import com.google.common.base.Predicates; import com.google.common.collect.Iterables; - import forge.ai.ComputerUtil; import forge.ai.ComputerUtilCard; +import forge.ai.SpecialCardAi; import forge.ai.SpellAbilityAi; import forge.game.ability.AbilityUtils; -import forge.game.card.Card; -import forge.game.card.CardCollection; -import forge.game.card.CardLists; -import forge.game.card.CardPredicates; +import forge.game.card.*; import forge.game.card.CardPredicates.Presets; -import forge.game.card.CardUtil; import forge.game.phase.PhaseType; import forge.game.player.Player; import forge.game.player.PlayerActionConfirmMode; import forge.game.player.PlayerCollection; import forge.game.spellability.SpellAbility; +import java.util.List; + public class CopyPermanentAi extends SpellAbilityAi { @Override protected boolean canPlayAI(Player aiPlayer, SpellAbility sa) { @@ -32,6 +28,10 @@ public class CopyPermanentAi extends SpellAbilityAi { return false; } + if ("MimicVat".equals(sa.getParam("AILogic"))) { + return SpecialCardAi.MimicVat.considerCopy(aiPlayer, sa); + } + if (sa.hasParam("AtEOT") && !aiPlayer.getGame().getPhaseHandler().is(PhaseType.MAIN1)) { return false; } diff --git a/forge-gui/res/cardsfolder/m/macabre_waltz.txt b/forge-gui/res/cardsfolder/m/macabre_waltz.txt index 0bd777ada90..fefd49531b9 100644 --- a/forge-gui/res/cardsfolder/m/macabre_waltz.txt +++ b/forge-gui/res/cardsfolder/m/macabre_waltz.txt @@ -3,7 +3,6 @@ ManaCost:1 B Types:Sorcery A:SP$ ChangeZone | Cost$ 1 B | Origin$ Graveyard | Destination$ Hand | TargetMin$ 0 | TargetMax$ 2 | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | SpellDescription$ Return up to two target creature cards from your graveyard to your hand, then discard a card. | SubAbility$ DBDiscard SVar:DBDiscard:DB$Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose -SVar:RemAIDeck:True DeckHints:Ability$Graveyard & Ability$Discard DeckHas:Ability$Discard SVar:Picture:http://www.wizards.com/global/images/magic/general/macabre_waltz.jpg diff --git a/forge-gui/res/cardsfolder/m/mage_il_vec.txt b/forge-gui/res/cardsfolder/m/mage_il_vec.txt index 3877fc44b11..29e81369c31 100644 --- a/forge-gui/res/cardsfolder/m/mage_il_vec.txt +++ b/forge-gui/res/cardsfolder/m/mage_il_vec.txt @@ -3,6 +3,6 @@ ManaCost:2 R Types:Creature Human Wizard PT:2/2 A:AB$ DealDamage | Cost$ T Discard<1/Random> | ValidTgts$ Creature,Player | TgtPrompt$ Select target creature or player | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -SVar:RemAIDeck:True +SVar:RemRandomDeck:True SVar:Picture:http://www.wizards.com/global/images/magic/general/mage_il_vec.jpg Oracle:{T}, Discard a card at random: Mage il-Vec deals 1 damage to target creature or player. diff --git a/forge-gui/res/cardsfolder/m/magister_of_worth.txt b/forge-gui/res/cardsfolder/m/magister_of_worth.txt index 01a300e2782..3702ed6eb88 100644 --- a/forge-gui/res/cardsfolder/m/magister_of_worth.txt +++ b/forge-gui/res/cardsfolder/m/magister_of_worth.txt @@ -7,6 +7,6 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S SVar:TrigVote:DB$ Vote | Defined$ Player | VoteGrace$ MagisterofWorthZombify | VoteCondemnation$ MagisterofWorthDestroy | Tied$ MagisterofWorthDestroy | VoteType$ Grace,Condemnation | AILogic$ GraceOrCondemnation SVar:MagisterofWorthZombify:DB$ ChangeZoneAll | ChangeType$ Creature | Origin$ Graveyard | Destination$ Battlefield SVar:MagisterofWorthDestroy:DB$ DestroyAll | ValidCards$ Creature.Other -SVar:RemAIDeck:True +SVar:RemRandomDeck:True SVar:Picture:http://www.wizards.com/global/images/magic/general/magister_of_worth.jpg Oracle:Flying\nWill of the council — When Magister of Worth enters the battlefield, starting with you, each player votes for grace or condemnation. If grace gets more votes, each player returns each creature card from his or her graveyard to the battlefield. If condemnation gets more votes or the vote is tied, destroy all creatures other than Magister of Worth. diff --git a/forge-gui/res/cardsfolder/m/malignant_growth.txt b/forge-gui/res/cardsfolder/m/malignant_growth.txt index f30bb34c576..7f3d44973b7 100644 --- a/forge-gui/res/cardsfolder/m/malignant_growth.txt +++ b/forge-gui/res/cardsfolder/m/malignant_growth.txt @@ -8,6 +8,6 @@ SVar:TrigPutCounter:AB$ PutCounter | Cost$ 0 | Defined$ Self | CounterType$ GROW SVar:TrigDraw:AB$ Draw | Cost$ 0 | Defined$ TriggeredPlayer | NumCards$ X | References$ X | SubAbility$ DBDamage SVar:DBDamage:DB$ DealDamage | Defined$ TriggeredPlayer | NumDmg$ X | References$ X SVar:X:Count$CardCounters.GROWTH -SVar:RemAIDeck:True +SVar:RemRandomDeck:True SVar:Picture:http://www.wizards.com/global/images/magic/general/malignant_growth.jpg Oracle:Cumulative upkeep {1} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.)\nAt the beginning of your upkeep, put a growth counter on Malignant Growth.\nAt the beginning of each opponent's draw step, that player draws an additional card for each growth counter on Malignant Growth, then Malignant Growth deals damage to the player equal to the number of cards he or she drew this way. diff --git a/forge-gui/res/cardsfolder/m/mana_crypt.txt b/forge-gui/res/cardsfolder/m/mana_crypt.txt index b7cd1da97ff..ed027511837 100644 --- a/forge-gui/res/cardsfolder/m/mana_crypt.txt +++ b/forge-gui/res/cardsfolder/m/mana_crypt.txt @@ -5,6 +5,6 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | E SVar:TrigFlip:AB$ FlipACoin | Cost$ 0 | Defined$ You | LoseSubAbility$ DBDamage SVar:DBDamage:DB$ DealDamage | Defined$ You | NumDmg$ 3 A:AB$ Mana | Cost$ T | Produced$ C | Amount$ 2 | SpellDescription$ Add {C}{C} to your mana pool. -SVar:RemAIDeck:True +SVar:RemRandomDeck:True SVar:Picture:http://www.wizards.com/global/images/magic/general/mana_crypt.jpg Oracle:At the beginning of your upkeep, flip a coin. If you lose the flip, Mana Crypt deals 3 damage to you.\n{T}: Add {C}{C} to your mana pool. diff --git a/forge-gui/res/cardsfolder/m/mana_echoes.txt b/forge-gui/res/cardsfolder/m/mana_echoes.txt index ae55f33aace..2d231f30796 100644 --- a/forge-gui/res/cardsfolder/m/mana_echoes.txt +++ b/forge-gui/res/cardsfolder/m/mana_echoes.txt @@ -2,10 +2,10 @@ Name:Mana Echoes ManaCost:2 R R Types:Enchantment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature | TriggerZones$ Battlefield | TriggerController$ You | OptionalDecider$ You | Execute$ TrigPump | TriggerDescription$ Whenever a creature enters the battlefield, you may add an amount of {C} to your mana pool equal to the number of creatures you control that share a creature type with it. -SVar:TrigPump:AB$ Pump | Cost$ 0 | Defined$ TriggeredCard | RememberObjects$ TriggeredCard | SubAbility$ DBMana +SVar:TrigPump:DB$ Pump | Defined$ TriggeredCard | RememberObjects$ TriggeredCard | AILogic$ MimicVat | SubAbility$ DBMana SVar:DBMana:DB$ Mana | Produced$ C | Defined$ You | Amount$ X | References$ X | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$Valid Creature.sharesCreatureTypeWith Remembered+YouCtrl -SVar:RemAIDeck:True +SVar:RemRandomDeck:True SVar:Picture:http://www.wizards.com/global/images/magic/general/mana_echoes.jpg Oracle:Whenever a creature enters the battlefield, you may add an amount of {C} to your mana pool equal to the number of creatures you control that share a creature type with it. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/m/mana_flare.txt b/forge-gui/res/cardsfolder/m/mana_flare.txt index f1dfe9836fa..8a804027c9b 100644 --- a/forge-gui/res/cardsfolder/m/mana_flare.txt +++ b/forge-gui/res/cardsfolder/m/mana_flare.txt @@ -3,6 +3,5 @@ ManaCost:2 R Types:Enchantment T:Mode$ TapsForMana | ValidCard$ Land | Execute$ TrigMana | TriggerZones$ Battlefield | Static$ True | TriggerDescription$ Whenever a player taps a land for mana, that player adds one mana to his or her mana pool of any type that land produced. SVar:TrigMana:AB$ ManaReflected | Cost$ 0 | ColorOrType$ Type | Valid$ Defined.Triggered | ReflectProperty$ Produced | Defined$ TriggeredPlayer -SVar:RemAIDeck:True SVar:Picture:http://www.wizards.com/global/images/magic/general/mana_flare.jpg Oracle:Whenever a player taps a land for mana, that player adds one mana to his or her mana pool of any type that land produced. diff --git a/forge-gui/res/cardsfolder/m/mana_vault.txt b/forge-gui/res/cardsfolder/m/mana_vault.txt index 376910be8a3..5901a961d72 100644 --- a/forge-gui/res/cardsfolder/m/mana_vault.txt +++ b/forge-gui/res/cardsfolder/m/mana_vault.txt @@ -7,6 +7,7 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | O T:Mode$ Phase | Phase$ Draw | ValidPlayer$ You | IsPresent$ Card.Self+tapped | Execute$ TrigDamage | TriggerDescription$ At the beginning of your draw step, if CARDNAME is tapped, it deals 1 damage to you. SVar:TrigUntap:AB$Untap | Cost$ 4 | Defined$ Self SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Defined$ You | NumDmg$ 1 -SVar:RemAIDeck:True +#TODO: The AI will untap this with Voltaic Key and will correctly untap it when it has enough available mana. Might improve the logic for when the AI actually taps it for mana, perhaps. +SVar:RemRandomDeck:True SVar:Picture:http://www.wizards.com/global/images/magic/general/mana_vault.jpg Oracle:Mana Vault doesn't untap during your untap step.\nAt the beginning of your upkeep, you may pay {4}. If you do, untap Mana Vault.\nAt the beginning of your draw step, if Mana Vault is tapped, it deals 1 damage to you.\n{T}: Add {C}{C}{C} to your mana pool. diff --git a/forge-gui/res/cardsfolder/m/mangara_of_corondor.txt b/forge-gui/res/cardsfolder/m/mangara_of_corondor.txt index 3be597cad33..2dbde67df49 100644 --- a/forge-gui/res/cardsfolder/m/mangara_of_corondor.txt +++ b/forge-gui/res/cardsfolder/m/mangara_of_corondor.txt @@ -3,7 +3,6 @@ ManaCost:1 W W Types:Legendary Creature Human Wizard PT:1/1 A:AB$ ChangeZone | Cost$ T | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Permanent | SubAbility$ DBChange | SpellDescription$ Exile CARDNAME and target permanent. -SVar:DBChange:DB$ChangeZone | Cost$ 0 | Origin$ Battlefield | Destination$ Exile -SVar:RemAIDeck:True +SVar:DBChange:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile SVar:Picture:http://www.wizards.com/global/images/magic/general/mangara_of_corondor.jpg Oracle:{T}: Exile Mangara of Corondor and target permanent. diff --git a/forge-gui/res/cardsfolder/m/marsh_gas.txt b/forge-gui/res/cardsfolder/m/marsh_gas.txt index 6b57f8345f7..87777fcc8cb 100644 --- a/forge-gui/res/cardsfolder/m/marsh_gas.txt +++ b/forge-gui/res/cardsfolder/m/marsh_gas.txt @@ -2,6 +2,5 @@ Name:Marsh Gas ManaCost:B Types:Instant A:SP$ PumpAll | Cost$ B | ValidCards$ Creature | IsCurse$ True | NumAtt$ -2 | SpellDescription$ All creatures get -2/-0 until end of turn. -SVar:RemAIDeck:True SVar:Picture:http://www.wizards.com/global/images/magic/general/marsh_gas.jpg Oracle:All creatures get -2/-0 until end of turn. diff --git a/forge-gui/res/cardsfolder/m/maulfist_revolutionary.txt b/forge-gui/res/cardsfolder/m/maulfist_revolutionary.txt index 2331651c0ca..eb4654afbcf 100644 --- a/forge-gui/res/cardsfolder/m/maulfist_revolutionary.txt +++ b/forge-gui/res/cardsfolder/m/maulfist_revolutionary.txt @@ -6,6 +6,6 @@ K:Trample T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigIncrementCounters | TriggerDescription$ When CARDNAME enters the battlefield or dies, for each kind of counter on target permanent or player, give that permanent or player another counter of that kind. T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigIncrementCounters | TriggerController$ TriggeredCardController | Secondary$ True | TriggerDescription$ When CARDNAME enters the battlefield or dies, for each kind of counter on target permanent or player, give that permanent or player another counter of that kind. SVar:TrigIncrementCounters:DB$ PutCounter | ValidTgts$ Permanent,Player | CounterType$ ExistingCounter | EachExistingCounter$ True | CounterNum$ 1 -SVar:RemAIDeck:True +DeckHints:Ability$Counters SVar:Picture:http://www.wizards.com/global/images/magic/general/maulfist_revolutionary.jpg Oracle:Trample\nWhen Maulfist Revolutionary enters the battlefield or dies, for each kind of counter on target permanent or player, give that permanent or player another counter of that kind. diff --git a/forge-gui/res/cardsfolder/m/meandering_towershell.txt b/forge-gui/res/cardsfolder/m/meandering_towershell.txt index a6b4e74a8b2..5cf76a6b924 100644 --- a/forge-gui/res/cardsfolder/m/meandering_towershell.txt +++ b/forge-gui/res/cardsfolder/m/meandering_towershell.txt @@ -7,6 +7,5 @@ T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigExile | TriggerZones$ Batt SVar:TrigExile:AB$ ChangeZone | Cost$ 0 | Defined$ Self | Origin$ Battlefield | Destination$ Exile | SubAbility$ DelTrig SVar:DelTrig:DB$ DelayedTrigger | DelayedTriggerDefinedPlayer$ You | Mode$ Phase | Phase$ Declare Attackers | Execute$ TrigReturn | TriggerDescription$ Return CARDNAME to the battlefield tapped and attacking. SVar:TrigReturn:DB$ ChangeZone | Defined$ Self | Origin$ Exile | Destination$ Battlefield | Attacking$ True | Tapped$ True | GainControl$ True -SVar:RemAIDeck:True SVar:Picture:http://www.wizards.com/global/images/magic/general/meandering_towershell.jpg Oracle:Islandwalk (This creature can't be blocked as long as defending player controls an Island.)\nWhenever Meandering Towershell attacks, exile it. Return it to the battlefield under your control tapped and attacking at the beginning of the declare attackers step on your next turn. diff --git a/forge-gui/res/cardsfolder/m/meteor_storm.txt b/forge-gui/res/cardsfolder/m/meteor_storm.txt index 52de3e325ed..d093026d497 100644 --- a/forge-gui/res/cardsfolder/m/meteor_storm.txt +++ b/forge-gui/res/cardsfolder/m/meteor_storm.txt @@ -2,6 +2,6 @@ Name:Meteor Storm ManaCost:R G Types:Enchantment A:AB$ DealDamage | Cost$ 2 R G Discard<2/Random> | ValidTgts$ Creature,Player | TgtPrompt$ Select target creature or player | NumDmg$ 4 | SpellDescription$ CARDNAME deals 4 damage to target creature or player. -SVar:RemAIDeck:True +SVar:RemRandomDeck:True SVar:Picture:http://www.wizards.com/global/images/magic/general/meteor_storm.jpg Oracle:{2}{R}{G}, Discard two cards at random: Meteor Storm deals 4 damage to target creature or player. diff --git a/forge-gui/res/cardsfolder/m/mimic_vat.txt b/forge-gui/res/cardsfolder/m/mimic_vat.txt index 618c1bc168b..035310c073a 100644 --- a/forge-gui/res/cardsfolder/m/mimic_vat.txt +++ b/forge-gui/res/cardsfolder/m/mimic_vat.txt @@ -2,16 +2,16 @@ Name:Mimic Vat ManaCost:3 Types:Artifact T:Mode$ ChangesZone | ValidCard$ Creature.nonToken | Origin$ Battlefield | Destination$ Graveyard | OptionalDecider$ You | Execute$ TrigReturn | TriggerZones$ Battlefield | TriggerDescription$ Imprint — Whenever a nontoken creature dies, you may exile that card. If you do, return each other card exiled with CARDNAME to its owner's graveyard. -SVar:TrigReturn:AB$ ChangeZone | Cost$ 0 | Origin$ Exile | Destination$ Graveyard | Defined$ Imprinted | ChangeNum$ 1 | SubAbility$ DBCleanup +SVar:TrigReturn:DB$ ChangeZone | Origin$ Exile | Destination$ Graveyard | Defined$ Imprinted | ChangeNum$ 1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearImprinted$ True | SubAbility$ DBExile -SVar:DBExile:DB$ ChangeZone | Cost$ 0 | Imprint$ True | Origin$ Graveyard | Destination$ Exile | Defined$ TriggeredCard | ChangeNum$ 1 -A:AB$ CopyPermanent | Cost$ 3 T | Defined$ Imprinted.ExiledWithSource | AddSVars$ SneakAttackEOT | PumpKeywords$ Haste | AtEOT$ Exile | SpellDescription$ Create a token that's a copy of a card exiled with CARDNAME. It gains haste. Exile it at the beginning of the next end step. +SVar:DBExile:DB$ ChangeZone | Imprint$ True | Origin$ Graveyard | Destination$ Exile | Defined$ TriggeredCard | ChangeNum$ 1 | AILogic$ MimicVat +A:AB$ CopyPermanent | Cost$ 3 T | Defined$ Imprinted.ExiledWithSource | AddSVars$ SneakAttackEOT | PumpKeywords$ Haste | AtEOT$ Exile | AILogic$ MimicVat | SpellDescription$ Create a token that's a copy of a card exiled with CARDNAME. It gains haste. Exile it at the beginning of the next end step. T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCard$ Card.IsImprinted+ExiledWithSource | Execute$ DBForget SVar:DBForget:DB$ Pump | ForgetImprinted$ TriggeredCard T:Mode$ ChangesZone | Origin$ Battlefield | ValidCard$ Card.Self | Destination$ Any | Execute$ DBCleanImprinted | Static$ True SVar:DBCleanImprinted:DB$ Cleanup | ClearImprinted$ True SVar:NonStackingEffect:True -SVar:RemAIDeck:True +SVar:RemRandomDeck:True SVar:SneakAttackEOT:SVar:EndOfTurnLeavePlay:True SVar:Picture:http://www.wizards.com/global/images/magic/general/mimic_vat.jpg Oracle:Imprint — Whenever a nontoken creature dies, you may exile that card. If you do, return each other card exiled with Mimic Vat to its owner's graveyard.\n{3}, {T}: Create a token that's a copy of a card exiled with Mimic Vat. It gains haste. Exile it at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/m/mind_twist.txt b/forge-gui/res/cardsfolder/m/mind_twist.txt index f278f623c18..3ae55afba8a 100644 --- a/forge-gui/res/cardsfolder/m/mind_twist.txt +++ b/forge-gui/res/cardsfolder/m/mind_twist.txt @@ -3,6 +3,5 @@ ManaCost:X B Types:Sorcery A:SP$ Discard | Cost$ X B | ValidTgts$ Player | NumCards$ X | References$ X | Mode$ Random | SpellDescription$ Target player discards X cards at random. SVar:X:Count$xPaid -SVar:RemAIDeck:True SVar:Picture:http://www.wizards.com/global/images/magic/general/mind_twist.jpg Oracle:Target player discards X cards at random. diff --git a/forge-gui/res/cardsfolder/m/mindswipe.txt b/forge-gui/res/cardsfolder/m/mindswipe.txt index 8a7ba1127e3..3784d1ec7db 100644 --- a/forge-gui/res/cardsfolder/m/mindswipe.txt +++ b/forge-gui/res/cardsfolder/m/mindswipe.txt @@ -4,6 +4,5 @@ Types:Instant A:SP$ Counter | Cost$ X U R | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | UnlessCost$ X | SubAbility$ DBBurn | References$ X | SpellDescription$ Counter target spell unless its controller pays {X}. Mindswipe deals {X} damage to that spell's controller. SVar:DBBurn:DB$DealDamage | Cost$ 0 | NumDmg$ X | References$ X | Defined$ TargetedController SVar:X:Count$xPaid -SVar:RemAIDeck:True SVar:Picture:http://www.wizards.com/global/images/magic/general/mindswipe.jpg Oracle:Counter target spell unless its controller pays {X}. Mindswipe deals X damage to that spell's controller. diff --git a/forge-gui/res/cardsfolder/m/misery_charm.txt b/forge-gui/res/cardsfolder/m/misery_charm.txt index 9b01c9b105a..32093532fcb 100644 --- a/forge-gui/res/cardsfolder/m/misery_charm.txt +++ b/forge-gui/res/cardsfolder/m/misery_charm.txt @@ -5,7 +5,6 @@ A:SP$ Charm | Cost$ B | Choices$ DBDestroy,DBChangeZone,DBLoseLife | CharmNum$ 1 SVar:DBDestroy:DB$ Destroy | ValidTgts$ Creature.Cleric | TgtPrompt$ Select target cleric. | SpellDescription$ Destroy target Cleric. SVar:DBChangeZone:DB$ ChangeZone | ValidTgts$ Creature.Cleric | Origin$ Graveyard | Destination$ Hand | SpellDescription$ Return target Cleric card from your graveyard to your hand. SVar:DBLoseLife:DB$ LoseLife | ValidTgts$ Player | TgtPrompt$ Select a player to lose 2 life | LifeAmount$ 2 | SpellDescription$ Target player loses 2 life. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +DeckNeeds:Type$Cleric SVar:Picture:http://www.wizards.com/global/images/magic/general/misery_charm.jpg Oracle:Choose one —\n• Destroy target Cleric.\n• Return target Cleric card from your graveyard to your hand.\n• Target player loses 2 life. diff --git a/forge-gui/res/cardsfolder/m/molder.txt b/forge-gui/res/cardsfolder/m/molder.txt index f12baeb7428..b5e7431433c 100644 --- a/forge-gui/res/cardsfolder/m/molder.txt +++ b/forge-gui/res/cardsfolder/m/molder.txt @@ -1,9 +1,8 @@ Name:Molder ManaCost:X G Types:Instant -A:SP$ Destroy | Cost$ X G | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment | NoRegen$ True | SubAbility$ DBGainLife | SpellDescription$ Destroy target artifact or enchantment with converted mana cost X. It can't be regenerated. You gain X life. +A:SP$ Destroy | Cost$ X G | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment | NoRegen$ True | References$ X | SubAbility$ DBGainLife | SpellDescription$ Destroy target artifact or enchantment with converted mana cost X. It can't be regenerated. You gain X life. SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ X | References$ X SVar:X:Targeted$CardManaCost -SVar:RemAIDeck:True SVar:Picture:http://www.wizards.com/global/images/magic/general/molder.jpg Oracle:Destroy target artifact or enchantment with converted mana cost X. It can't be regenerated. You gain X life. diff --git a/forge-gui/res/cardsfolder/m/musician.txt b/forge-gui/res/cardsfolder/m/musician.txt index 9d1a035c68c..262d77ab2f0 100644 --- a/forge-gui/res/cardsfolder/m/musician.txt +++ b/forge-gui/res/cardsfolder/m/musician.txt @@ -9,6 +9,8 @@ SVar:PayThePiper:DB$ Animate | Defined$ Targeted | Permanent$ True | Keywords$ A SVar:TrigMusicianPay:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ MusiciansSpite | Secondary$ True | TriggerDescription$ At the beginning of your upkeep, destroy this creature unless you pay 1 for each music counter on it. SVar:MusiciansSpite:AB$ Destroy | Cost$ 0 | Defined$ Self | UnlessCost$ MusicX | UnlessPayer$ You | References$ MusicX SVar:MusicX:Count$CardCounters.MUSIC -SVar:RemAIDeck:True +SVar:NeedsToPlayVar:Z GE5 +SVar:Z:Count$Valid Land.YouCtrl+inZoneBattlefield +SVar:RemRandomDeck:True SVar:Picture:http://www.wizards.com/global/images/magic/general/musician.jpg Oracle:Cumulative upkeep {1} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.)\n{T}: Put a music counter on target creature. If it doesn't have "At the beginning of your upkeep, destroy this creature unless you pay {1} for each music counter on it," it gains that ability. diff --git a/forge-gui/res/cardsfolder/m/myojin_of_infinite_rage.txt b/forge-gui/res/cardsfolder/m/myojin_of_infinite_rage.txt index 4f283d73113..ebc1faf3fe8 100644 --- a/forge-gui/res/cardsfolder/m/myojin_of_infinite_rage.txt +++ b/forge-gui/res/cardsfolder/m/myojin_of_infinite_rage.txt @@ -6,6 +6,5 @@ T:Mode$ ChangesZone | ValidCard$ Card.wasCastFromHand+Self | Destination$ Battle SVar:ETBCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ DIVINITY | CounterNum$ 1 S:Mode$ Continuous | Affected$ Card.Self+counters_GE1_DIVINITY | AddKeyword$ Indestructible | Description$ CARDNAME has indestructible as long as it has a divinity counter on it. A:AB$DestroyAll | Cost$ SubCounter<1/DIVINITY> | ValidCards$ Land | SpellDescription$ Destroy all lands. -SVar:RemAIDeck:True SVar:Picture:http://www.wizards.com/global/images/magic/general/myojin_of_infinite_rage.jpg Oracle:Myojin of Infinite Rage enters the battlefield with a divinity counter on it if you cast it from your hand.\nMyojin of Infinite Rage has indestructible as long as it has a divinity counter on it.\nRemove a divinity counter from Myojin of Infinite Rage: Destroy all lands.