diff --git a/.gitattributes b/.gitattributes index eb306ed34e4..4c42d406a38 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1403,6 +1403,7 @@ res/cardsfolder/c/celestial_purge.txt svneol=native#text/plain res/cardsfolder/c/celestial_sword.txt svneol=native#text/plain res/cardsfolder/c/cellar_door.txt -text res/cardsfolder/c/cemetery_gate.txt svneol=native#text/plain +res/cardsfolder/c/cemetery_puca.txt -text res/cardsfolder/c/cemetery_reaper.txt svneol=native#text/plain res/cardsfolder/c/cenns_enlistment.txt svneol=native#text/plain res/cardsfolder/c/cenns_heir.txt svneol=native#text/plain @@ -2302,6 +2303,7 @@ res/cardsfolder/d/diminish.txt svneol=native#text/plain res/cardsfolder/d/diminishing_returns.txt svneol=native#text/plain res/cardsfolder/d/dimir_aqueduct.txt svneol=native#text/plain res/cardsfolder/d/dimir_cutpurse.txt svneol=native#text/plain +res/cardsfolder/d/dimir_doppelganger.txt -text res/cardsfolder/d/dimir_guildmage.txt svneol=native#text/plain res/cardsfolder/d/dimir_house_guard.txt svneol=native#text/plain res/cardsfolder/d/dimir_infiltrator.txt svneol=native#text/plain @@ -7774,6 +7776,7 @@ res/cardsfolder/s/sages_of_the_anima.txt -text res/cardsfolder/s/sai_of_the_shinobi.txt -text res/cardsfolder/s/sailmonger.txt svneol=native#text/plain res/cardsfolder/s/sakashima_the_impostor.txt -text +res/cardsfolder/s/sakashimas_student.txt -text res/cardsfolder/s/sakura_tribe_elder.txt svneol=native#text/plain res/cardsfolder/s/sakura_tribe_scout.txt svneol=native#text/plain res/cardsfolder/s/salt_flats.txt svneol=native#text/plain @@ -8160,6 +8163,7 @@ res/cardsfolder/s/shape_stealer.txt -text svneol=unset#text/plain res/cardsfolder/s/shaper_guildmage.txt svneol=native#text/plain res/cardsfolder/s/shaper_parasite.txt -text res/cardsfolder/s/shapeshifter.txt svneol=native#text/plain +res/cardsfolder/s/shapeshifters_marrow.txt -text res/cardsfolder/s/shard_convergence.txt svneol=native#text/plain res/cardsfolder/s/shard_phoenix.txt svneol=native#text/plain res/cardsfolder/s/shard_volley.txt svneol=native#text/plain @@ -9992,6 +9996,7 @@ res/cardsfolder/u/unspeakable_symbol.txt svneol=native#text/plain res/cardsfolder/u/unstable_frontier.txt -text res/cardsfolder/u/unstable_hulk.txt svneol=native#text/plain res/cardsfolder/u/unstable_mutation.txt svneol=native#text/plain +res/cardsfolder/u/unstable_shapeshifter.txt -text res/cardsfolder/u/unstoppable_ash.txt svneol=native#text/plain res/cardsfolder/u/unsummon.txt svneol=native#text/plain res/cardsfolder/u/untaidake_the_cloud_keeper.txt -text @@ -10171,6 +10176,7 @@ res/cardsfolder/v/vertigo.txt svneol=native#text/plain res/cardsfolder/v/vertigo_spawn.txt svneol=native#text/plain res/cardsfolder/v/vesper_ghoul.txt svneol=native#text/plain res/cardsfolder/v/vessel_of_endless_rest.txt -text +res/cardsfolder/v/vesuva.txt -text res/cardsfolder/v/vesuvan_doppelganger.txt svneol=native#text/plain res/cardsfolder/v/veteran_armorer.txt svneol=native#text/plain res/cardsfolder/v/veteran_armorsmith.txt svneol=native#text/plain @@ -11734,6 +11740,7 @@ src/main/java/forge/card/abilityfactory/AbilityFactoryCharm.java svneol=native#t src/main/java/forge/card/abilityfactory/AbilityFactoryChoose.java svneol=native#text/plain src/main/java/forge/card/abilityfactory/AbilityFactoryClash.java svneol=native#text/plain src/main/java/forge/card/abilityfactory/AbilityFactoryCleanup.java svneol=native#text/plain +src/main/java/forge/card/abilityfactory/AbilityFactoryClone.java -text src/main/java/forge/card/abilityfactory/AbilityFactoryCombat.java svneol=native#text/plain src/main/java/forge/card/abilityfactory/AbilityFactoryCopy.java svneol=native#text/plain src/main/java/forge/card/abilityfactory/AbilityFactoryCounterMagic.java svneol=native#text/plain diff --git a/.gitignore b/.gitignore index 8b2ac9b2910..9caf2cf9409 100644 --- a/.gitignore +++ b/.gitignore @@ -358,6 +358,7 @@ res/pics/WWK res/pics/ZEN res/pics/booster res/pics/icons +res/pics/tokens res/pics_product/*.jpg res/preferences res/preferences/forge.preferences diff --git a/res/cardTemplateScript.py b/res/cardTemplateScript.py index cb4e4f69935..686a25657d7 100755 --- a/res/cardTemplateScript.py +++ b/res/cardTemplateScript.py @@ -216,8 +216,6 @@ while line: # store Card object in hash table mtgDataCards[cardName] = card -print 'WARNING: Card template contains bogus SetInfo for testing only!!!' -print ' Please remove the SetInfo before committing to repository\n' inputName = raw_input("Enter Card Name: ") inputName = inputName.rstrip() while inputName != 'quit' : @@ -257,7 +255,6 @@ while inputName != 'quit' : setInfo.append(setInfoStr) print 'SVar:Rarity:'+rarity print 'SVar:Picture:http://www.wizards.com/global/images/magic/general/'+cleanName+'.jpg' - for edition in setInfo : print edition print 'End\n' else : print inputName+' not found\n' diff --git a/res/cardsfolder/a/afflicted_deserter_werewolf_ransacker.txt b/res/cardsfolder/a/afflicted_deserter_werewolf_ransacker.txt index bca7752f9ae..b7fb20a3638 100644 --- a/res/cardsfolder/a/afflicted_deserter_werewolf_ransacker.txt +++ b/res/cardsfolder/a/afflicted_deserter_werewolf_ransacker.txt @@ -5,13 +5,11 @@ Text:no text PT:3/2 T:Mode$Phase | Phase$ Upkeep | WerewolfTransformCondition$ True | TriggerZones$ Battlefield | Execute$ TrigTransform | TriggerDescription$ At the beginning of each upkeep, if no spells were cast last turn, transform CARDNAME. SVar:Picture:http://www.wizards.com/global/images/magic/general/afflicted_deserter.jpg +SVar:TrigTransform:AB$SetState | Cost$ 0 | Defined$ Self | Mode$ Transform AlternateMode:DoubleFaced SetInfo:DKA|Uncommon|http://magiccards.info/scans/en/dka/81a.jpg Oracle:At the beginning of each upkeep, if no spells were cast last turn, transform Afflicted Deserter. -#Shared -SVar:TrigTransform:AB$SetState | Cost$ 0 | Defined$ Self | Mode$ Transform - ALTERNATE Name:Werewolf Ransacker @@ -26,7 +24,8 @@ SVar:DBDamage:DB$DealDamage | Cost$ 0 | Defined$ TargetedController | NumDmg$ 3 SVar:DBCleanup:DB$Cleanup | ClearRemembered$ True SVar:IsDestroyed:Count$ThisTurnEntered_Graveyard_from_Battlefield_Artifact.IsRemembered T:Mode$Phase | Phase$ Upkeep | WerewolfUntransformCondition$ True | TriggerZones$ Battlefield | Execute$ TrigTransform | TriggerDescription$ At the beginning of each upkeep, if a player cast two or more spells last turn, transform CARDNAME. -SVar:Picture1:http://www.wizards.com/global/images/magic/general/werewolf_ransacker.jpg +SVar:TrigTransform:AB$SetState | Cost$ 0 | Defined$ Self | Mode$ Transform +SVar:Picture:http://www.wizards.com/global/images/magic/general/werewolf_ransacker.jpg SetInfo:DKA|Uncommon|http://magiccards.info/scans/en/dka/81b.jpg Oracle:Whenever this creature transforms into Werewolf Ransacker, you may destroy target artifact. If that artifact is put into a graveyard this way, Werewolf Ransacker deals 3 damage to that artifact's controller.\nAt the beginning of each upkeep, if a player cast two or more spells last turn, transform Werewolf Ransacker. End \ No newline at end of file diff --git a/res/cardsfolder/a/akki_lavarunner_tok_tok_volcano_born.txt b/res/cardsfolder/a/akki_lavarunner_tok_tok_volcano_born.txt index 91ad38fe079..2e0932b55a9 100644 --- a/res/cardsfolder/a/akki_lavarunner_tok_tok_volcano_born.txt +++ b/res/cardsfolder/a/akki_lavarunner_tok_tok_volcano_born.txt @@ -23,9 +23,9 @@ K:Protection from red R:Event$ DamageDone | ValidSource$ Card.Red | ValidTarget$ Player | ReplaceWith$ DmgPlus1 | IsCombat$ False | Description$ If a red source would deal damage to a player, it deals that much damage plus 1 to that player instead. R:Event$ DamageDone | ValidSource$ Card.Red | ValidTarget$ Player | ReplaceWith$ DmgPlus1Combat | IsCombat$ True | Secondary$ True | Description$ If a red source would deal damage to a player, it deals that much damage plus 1 to that player instead. SVar:DmgPlus1:AB$DealDamage | Cost$ 0 | Defined$ ReplacedTarget | DamageSource$ ReplacedSource | NumDmg$ X | References$ X -SVar:DmgPlus1:AB$DealDamage | Cost$ 0 | CombatDamage$ True | Defined$ ReplacedTarget | DamageSource$ ReplacedSource | NumDmg$ X | References$ X +SVar:DmgPlus1Combat:AB$DealDamage | Cost$ 0 | CombatDamage$ True | Defined$ ReplacedTarget | DamageSource$ ReplacedSource | NumDmg$ X | References$ X SVar:X:ReplaceCount$DamageAmount/Plus.1 -SVar:Picture1:http://www.wizards.com/global/images/magic/general/tok_tok_volcano_born.jpg +SVar:Picture:http://www.wizards.com/global/images/magic/general/tok_tok_volcano_born.jpg SetInfo:CHK|Rare|http://magiccards.info/scans/en/chk/313.jpg Oracle:Protection from red\nIf a red source would deal damage to a player, it deals that much damage plus 1 to that player instead. End \ No newline at end of file diff --git a/res/cardsfolder/b/bloodline_keeper_lord_of_lineage.txt b/res/cardsfolder/b/bloodline_keeper_lord_of_lineage.txt index 605c5ffdf2c..4ab4350341e 100644 --- a/res/cardsfolder/b/bloodline_keeper_lord_of_lineage.txt +++ b/res/cardsfolder/b/bloodline_keeper_lord_of_lineage.txt @@ -23,7 +23,7 @@ PT:5/5 K:Flying S:Mode$ Continuous | Affected$ Creature.Vampire+Other+YouCtrl | AddPower$ 2 | AddToughness$ 2 | Description$ Other Vampire creatures you control get +2/+2. A:AB$Token | Cost$ T | TokenAmount$ 1 | TokenOwner$ You | TokenName$ Vampire | TokenColors$ Black | TokenImage$ B 2 2 Vampire | TokenTypes$ Creature,Vampire | TokenPower$ 2 | TokenToughness$ 2 | TokenKeywords$ Flying | SpellDescription$ Put a 2/2 black Vampire creature token with flying onto the battlefield. -SVar:Picture1:http://www.wizards.com/global/images/magic/general/lord_of_lineage.jpg +SVar:Picture:http://www.wizards.com/global/images/magic/general/lord_of_lineage.jpg SetInfo:ISD|Rare|http://magiccards.info/scans/en/isd/90b.jpg Oracle:Other Vampire creatures you control get +2/+2.\n{T}: Put a 2/2 black Vampire creature token with flying onto the battlefield. diff --git a/res/cardsfolder/b/body_double.txt b/res/cardsfolder/b/body_double.txt index a652733d0f8..3007909b337 100644 --- a/res/cardsfolder/b/body_double.txt +++ b/res/cardsfolder/b/body_double.txt @@ -1,8 +1,11 @@ Name:Body Double ManaCost:4 U Types:Creature Shapeshifter -Text:You may have CARDNAME enter the battlefield as a copy of any creature card in a graveyard. +Text:no text PT:0/0 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ ChooseCreature | Static$ True | TriggerDescription$ You may have CARDNAME enter the battlefield as a copy of any creature card in a graveyard. +SVar:ChooseCreature:AB$ ChooseCard | Cost$ 0 | Defined$ You | Amount$ 1 | Choices$ Creature.Other | ChoiceZone$ Graveyard | SubAbility$ DBCopy | RememberChosen$ True +SVar:DBCopy:DB$ Clone | Defined$ Remembered SVar:RemAIDeck:True SVar:Rarity:Rare SVar:Picture:http://www.wizards.com/global/images/magic/general/body_double.jpg diff --git a/res/cardsfolder/b/budoka_gardener_dokai_weaver_of_life.txt b/res/cardsfolder/b/budoka_gardener_dokai_weaver_of_life.txt index 0ed6e859fe6..8d7d88ca209 100644 --- a/res/cardsfolder/b/budoka_gardener_dokai_weaver_of_life.txt +++ b/res/cardsfolder/b/budoka_gardener_dokai_weaver_of_life.txt @@ -5,14 +5,13 @@ Text:no text PT:2/1 A:AB$ChangeZone | Cost$ T | Origin$ Hand | Destination$ Battlefield | ChangeType$ Land | ChangeNum$ 1 | OptionalDecider$ You | SubAbility$ DBFlip | SpellDescription$ You may put a land card from your hand onto the battlefield. If you control ten or more lands, flip CARDNAME. SVar:DBFlip:DB$SetState | Defined$ Self | ConditionCheckSVar$ X | ConditionSVarCompare$ GE10 | Mode$ Flip +SVar:X:Count$Valid Land.YouCtrl AlternateMode:Flip SVar:Picture:http://www.wizards.com/global/images/magic/general/budoka_gardener.jpg + SetInfo:CHK|Rare|http://magiccards.info/scans/en/chk/202.jpg Oracle:{T}: You may put a land card from your hand onto the battlefield. If you control ten or more lands, flip Budoka Gardener. -# Shared -SVar:X:Count$Valid Land.YouCtrl - ALTERNATE Name:Dokai, Weaver of Life @@ -22,7 +21,8 @@ Types:Legendary Creature Human Monk Text:no text PT:3/3 A:AB$Token | Cost$ 4 G G T | TokenAmount$ 1 | TokenName$ Elemental | TokenColors$ Green | TokenTypes$ Creature,Elemental | TokenPower$ X | TokenToughness$ X | TokenOwner$ You | SpellDescription$ Put an X/X green Elemental creature token onto the battlefield, where X is the number of lands you control. -SVar:Picture1:http://www.wizards.com/global/images/magic/general/dokai_weaver_of_life.jpg +SVar:X:Count$Valid Land.YouCtrl +SVar:Picture:http://www.wizards.com/global/images/magic/general/dokai_weaver_of_life.jpg SetInfo:CHK|Rare|http://magiccards.info/scans/en/chk/315.jpg Oracle:{4}{G}{G}, {T}: Put an X/X green Elemental creature token onto the battlefield, where X is the number of lands you control. End \ No newline at end of file diff --git a/res/cardsfolder/b/budoka_pupil_ichiga_who_topples_oaks.txt b/res/cardsfolder/b/budoka_pupil_ichiga_who_topples_oaks.txt index 15f507bd7a4..d698f0ddec4 100644 --- a/res/cardsfolder/b/budoka_pupil_ichiga_who_topples_oaks.txt +++ b/res/cardsfolder/b/budoka_pupil_ichiga_who_topples_oaks.txt @@ -22,7 +22,7 @@ Text:no text PT:4/3 K:Trample A:AB$ Pump | Cost$ SubCounter<1/KI> | Tgt$ TgtC | NumAtt$ 2 | NumDef$ 2 | SpellDescription$ Target creature gets +2/+2 until end of turn. -SVar:Picture1:http://www.marc-fowler-design.com/cardforge/flippedcards/BOK/ichiga_who_topples_oaks.jpg +SVar:Picture:http://www.marc-fowler-design.com/cardforge/flippedcards/BOK/ichiga_who_topples_oaks.jpg # This link may be a temporary solution and could change in the near future. Oracle:Trample\nRemove a ki counter from Ichiga, Who Topples Oaks: Target creature gets +2/+2 until end of turn. SetInfo:BOK|Uncommon|http://magiccards.info/scans/en/bok/170.jpg diff --git a/res/cardsfolder/b/bushi_tenderfoot_kenzo_the_hardhearted.txt b/res/cardsfolder/b/bushi_tenderfoot_kenzo_the_hardhearted.txt index 2fe00e24f5d..41dfbe9045d 100644 --- a/res/cardsfolder/b/bushi_tenderfoot_kenzo_the_hardhearted.txt +++ b/res/cardsfolder/b/bushi_tenderfoot_kenzo_the_hardhearted.txt @@ -20,7 +20,7 @@ Text:no text PT:3/4 K:Double Strike K:Bushido 2 -SVar:Picture1:http://www.wizards.com/global/images/magic/general/kenzo_the_hardhearted.jpg +SVar:Picture:http://www.wizards.com/global/images/magic/general/kenzo_the_hardhearted.jpg SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/307.jpg Oracle:Double strike; bushido 2 (When this blocks or becomes blocked, it gets +2/+2 until end of turn.) diff --git a/res/cardsfolder/c/callow_jushi_jaraku_the_interloper.txt b/res/cardsfolder/c/callow_jushi_jaraku_the_interloper.txt index 67f1eca8cca..08b3893581d 100644 --- a/res/cardsfolder/c/callow_jushi_jaraku_the_interloper.txt +++ b/res/cardsfolder/c/callow_jushi_jaraku_the_interloper.txt @@ -21,7 +21,7 @@ Types:Legendary Creature Spirit Text:no text PT:3/4 A:AB$ Counter | Cost$ SubCounter<1/KI> | TargetType$ Spell | ValidTgts$ Card | TgtPrompt$ Select target spell. | Destination$ Graveyard | UnlessCost$ 2 | UnlessPayer$ TargetedController | SpellDescription$ Counter target spell unless its controller pays 2. -SVar:Picture1:http://www.marc-fowler-design.com/cardforge/flippedcards/BOK/jaraku_the_interloper.jpg +SVar:Picture:http://www.marc-fowler-design.com/cardforge/flippedcards/BOK/jaraku_the_interloper.jpg # This link may be a temporary solution and could change in the near future. SetInfo:BOK|Uncommon|http://magiccards.info/scans/en/bok/167.jpg Oracle:Remove a ki counter from Jaraku the Interloper: Counter target spell unless its controller pays {2}. diff --git a/res/cardsfolder/c/calming_licid.txt b/res/cardsfolder/c/calming_licid.txt index 14a5ad81fe3..77543beaeb2 100644 --- a/res/cardsfolder/c/calming_licid.txt +++ b/res/cardsfolder/c/calming_licid.txt @@ -7,8 +7,6 @@ A:AB$ SetState | Cost$ W T | Defined$ Self | NewState$ Alternate | SubAbility$ D SVar:DBAttach:DB$ Attach | Cost$ 0 | ValidTgts$ Creature | AILogic$ Curse #If the value of AlternateMode isn't Flip or DoubleFaced, it will be the name of the state defined below, so you can switch to it with SetState+NewState$.The name of the first state defined is always "Original". AlternateMode:Alternate - -#Shared SVar:RemAIDeck:True SVar:Rarity:Uncommon SVar:Picture:http://www.wizards.com/global/images/magic/general/calming_licid.jpg @@ -26,5 +24,9 @@ K:Enchant creature A:SP$ Attach | Cost$ 0 | ValidTgts$ Creature | AILogic$ Curse S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddHiddenKeyword$ HIDDEN CARDNAME can't attack. | Description$ Enchanted creature can't attack. A:AB$ SetState | Cost$ W | Defined$ Self | NewState$ Original | SpellDescription$ End this effect. - +SVar:RemAIDeck:True +SVar:Rarity:Uncommon +SVar:Picture:http://www.wizards.com/global/images/magic/general/calming_licid.jpg +SetInfo:STH|Uncommon|http://magiccards.info/scans/en/sh/102.jpg +Oracle:{W}, {T}: Calming Licid loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {W} to end this effect.\nEnchanted creature can't attack. End \ No newline at end of file diff --git a/res/cardsfolder/c/cemetery_puca.txt b/res/cardsfolder/c/cemetery_puca.txt new file mode 100644 index 00000000000..48a951c7abc --- /dev/null +++ b/res/cardsfolder/c/cemetery_puca.txt @@ -0,0 +1,15 @@ +Name:Cemetery Puca +ManaCost:1 UB UB +Types:Creature Shapeshifter +Text:no text +PT:1/2 +# Make Svars for granting abilities and triggers on clones distinct to avoid SVars getting overwritten when cloning a clone +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature | TriggerZones$ Battlefield | Execute$ CemeteryPucaCopy | TriggerDescription$ Whenever a creature dies, you may pay 1. If you do, CARDNAME becomes a copy of that creature and gains this ability. +SVar:CemeteryPucaCopy:AB$ Clone | Cost$ 1 | Defined$ TriggeredCardLKICopy | AddTriggers$ CemeteryPucaDiesTrig | AddSVars$ CemeteryPucaCopy,CemeteryPucaDiesTrig +SVar:CemeteryPucaDiesTrig:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature | TriggerZones$ Battlefield | Execute$ CemeteryPucaCopy | TriggerDescription$ Whenever a creature dies, you may pay 1. If you do, CARDNAME becomes a copy of that creature and gains this ability. +SVar:RemAIDeck:True +SVar:Rarity:Rare +SVar:Picture:http://www.wizards.com/global/images/magic/general/cemetery_puca.jpg +Oracle:Whenever a creature dies, you may pay {1}. If you do, Cemetery Puca becomes a copy of that creature and gains this ability. +SetInfo:SHM|Rare|http://magiccards.info/scans/en/shm/158.jpg +End \ No newline at end of file diff --git a/res/cardsfolder/c/chalice_of_life_chalice_of_death.txt b/res/cardsfolder/c/chalice_of_life_chalice_of_death.txt index 7ade0515ad2..8c8ec251b49 100644 --- a/res/cardsfolder/c/chalice_of_life_chalice_of_death.txt +++ b/res/cardsfolder/c/chalice_of_life_chalice_of_death.txt @@ -18,7 +18,7 @@ ManaCost:no cost Types:Artifact Text:no text A:AB$ LoseLife | Cost$ T | ValidTgts$ Player | TgtPrompt$Target a player to lose 5 life | LifeAmount$ 5 | SpellDescription$ Target player loses 5 life. -SVar:Picture1:http://www.wizards.com/global/images/magic/general/chalice_of_death.jpg +SVar:Picture:http://www.wizards.com/global/images/magic/general/chalice_of_death.jpg SetInfo:DKA|Uncommon|http://magiccards.info/scans/en/dka/146b.jpg Oracle:{T}: Target player loses 5 life. End \ No newline at end of file diff --git a/res/cardsfolder/c/chosen_of_markov_markovs_servant.txt b/res/cardsfolder/c/chosen_of_markov_markovs_servant.txt index 88c0a1bb302..49fa0abf9eb 100644 --- a/res/cardsfolder/c/chosen_of_markov_markovs_servant.txt +++ b/res/cardsfolder/c/chosen_of_markov_markovs_servant.txt @@ -17,7 +17,7 @@ Colors:black Types:Creature Vampire Text:no text PT:4/4 -SVar:Picture1:http://www.wizards.com/global/images/magic/general/markovs_servant.jpg +SVar:Picture:http://www.wizards.com/global/images/magic/general/markovs_servant.jpg SetInfo:DKA|Common|http://magiccards.info/scans/en/dka/55b.jpg Oracle: End \ No newline at end of file diff --git a/res/cardsfolder/c/civilized_scholar_homicidal_brute.txt b/res/cardsfolder/c/civilized_scholar_homicidal_brute.txt index 159c83f21f4..007eaac9938 100644 --- a/res/cardsfolder/c/civilized_scholar_homicidal_brute.txt +++ b/res/cardsfolder/c/civilized_scholar_homicidal_brute.txt @@ -25,7 +25,7 @@ PT:5/1 T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigTap | IsPresent$ Card.notAttackedThisTurn+Self | TriggerDescription$ At the beginning of your end step, if CARDNAME didn't attack this turn, tap CARDNAME, then transform it. SVar:TrigTap:AB$ Tap | Cost$ 0 | Defined$ Self | SubAbility$ DBTransform2 SVar:DBTransform2:DB$ SetState | Cost$ 0 | Defined$ Self | Mode$ Transform -SVar:Picture1:http://www.wizards.com/global/images/magic/general/homicidal_brute.jpg +SVar:Picture:http://www.wizards.com/global/images/magic/general/homicidal_brute.jpg SetInfo:ISD|Uncommon|http://magiccards.info/scans/en/isd/47b.jpg Oracle:At the beginning of your end step, if Homicidal Brute didn't attack this turn, tap Homicidal Brute, then transform it. End diff --git a/res/cardsfolder/c/cloistered_youth_unholy_fiend.txt b/res/cardsfolder/c/cloistered_youth_unholy_fiend.txt index aaa8675463b..c36f6cf3b00 100644 --- a/res/cardsfolder/c/cloistered_youth_unholy_fiend.txt +++ b/res/cardsfolder/c/cloistered_youth_unholy_fiend.txt @@ -20,7 +20,7 @@ Text:no text PT:3/3 T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ At the beginning of your end step, you lose 1 life. SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | Defined$ You | LifeAmount$ 1 -SVar:Picture1:http://www.wizards.com/global/images/magic/general/unholy_fiend.jpg +SVar:Picture:http://www.wizards.com/global/images/magic/general/unholy_fiend.jpg SetInfo:ISD|Uncommon|http://magiccards.info/scans/en/isd/8b.jpg Oracle:Creature - Horror\n3/3\nAt the beginning of your end step, you lose 1 life. diff --git a/res/cardsfolder/c/clone.txt b/res/cardsfolder/c/clone.txt index ddec1554523..6f6a0f57873 100644 --- a/res/cardsfolder/c/clone.txt +++ b/res/cardsfolder/c/clone.txt @@ -1,10 +1,11 @@ Name:Clone ManaCost:3 U Types:Creature Shapeshifter -Text:You may have CARDNAME enter the battlefield as a copy of any creature on the battlefield. +Text:no text PT:0/0 -SVar:NeedsToPlayVar:Y GE1 -SVar:Y:Count$Valid Creature +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ ChooseCreature | Static$ True | TriggerDescription$ You may have CARDNAME enter the battlefield as a copy of any creature on the battlefield. +SVar:ChooseCreature:AB$ ChooseCard | Cost$ 0 | Defined$ You | Amount$ 1 | Choices$ Creature.Other | SubAbility$ DBCopy | RememberChosen$ True +SVar:DBCopy:DB$ Clone | Defined$ Remembered SVar:Rarity:Rare SVar:Picture:http://www.wizards.com/global/images/magic/general/clone.jpg SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/52.jpg diff --git a/res/cardsfolder/c/convulsing_licid.txt b/res/cardsfolder/c/convulsing_licid.txt index 065b72ff97d..53be325386d 100644 --- a/res/cardsfolder/c/convulsing_licid.txt +++ b/res/cardsfolder/c/convulsing_licid.txt @@ -7,8 +7,6 @@ A:AB$ SetState | Cost$ R T | Defined$ Self | NewState$ Alternate | SubAbility$ D SVar:DBAttach:DB$ Attach | Cost$ 0 | ValidTgts$ Creature | AILogic$ Curse #If the value of AlternateMode isn't Flip or DoubleFaced, it will be the name of the state defined below, so you can switch to it with SetState+NewState$.The name of the first state defined is always "Original". AlternateMode:Alternate - -#Shared SVar:RemAIDeck:True SVar:Rarity:Uncommon SVar:Picture:http://www.wizards.com/global/images/magic/general/convulsing_licid.jpg @@ -26,5 +24,9 @@ K:Enchant creature A:SP$ Attach | Cost$ 0 | ValidTgts$ Creature | AILogic$ Curse S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddHiddenKeyword$ HIDDEN CARDNAME can't block. | Description$ Enchanted creature can't block. A:AB$ SetState | Cost$ R | Defined$ Self | NewState$ Original | SpellDescription$ End this effect. - +SVar:RemAIDeck:True +SVar:Rarity:Uncommon +SVar:Picture:http://www.wizards.com/global/images/magic/general/convulsing_licid.jpg +SetInfo:STH|Uncommon|http://magiccards.info/scans/en/sh/77.jpg +Oracle:{R}, {T}: Convulsing Licid loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {R} to end this effect.\nEnchanted creature can't attack. End \ No newline at end of file diff --git a/res/cardsfolder/c/copy_artifact.txt b/res/cardsfolder/c/copy_artifact.txt index 8b17e823bae..5319d4d1fd1 100644 --- a/res/cardsfolder/c/copy_artifact.txt +++ b/res/cardsfolder/c/copy_artifact.txt @@ -1,7 +1,10 @@ Name:Copy Artifact ManaCost:1 U Types:Enchantment -Text:You may have CARDNAME enter the battlefield as a copy of any artifact on the battlefield, except it's an enchantment in addition to its other types. +Text:no text +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ ChooseArtifact | Static$ True | TriggerDescription$ You may have CARDNAME enter the battlefield as a copy of any artifact on the battlefield, except it's an enchantment in addition to its other types. +SVar:ChooseArtifact:AB$ ChooseCard | Cost$ 0 | Defined$ You | Amount$ 1 | Choices$ Artifact.Other | SubAbility$ DBCopy | RememberChosen$ True +SVar:DBCopy:DB$ Clone | Defined$ Remembered | AddTypes$ Enchantment SVar:Rarity:Rare SVar:Picture:http://www.wizards.com/global/images/magic/general/copy_artifact.jpg SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/54.jpg diff --git a/res/cardsfolder/c/corrupting_licid.txt b/res/cardsfolder/c/corrupting_licid.txt index d049d363fe9..2d7041e9c8f 100644 --- a/res/cardsfolder/c/corrupting_licid.txt +++ b/res/cardsfolder/c/corrupting_licid.txt @@ -7,8 +7,6 @@ A:AB$ SetState | Cost$ B T | Defined$ Self | NewState$ Alternate | SubAbility$ D SVar:DBAttach:DB$ Attach | Cost$ 0 | ValidTgts$ Creature | AILogic$ Pump #If the value of AlternateMode isn't Flip or DoubleFaced, it will be the name of the state defined below, so you can switch to it with SetState+NewState$.The name of the first state defined is always "Original". AlternateMode:Alternate - -#Shared SVar:RemAIDeck:True SVar:Rarity:Uncommon SVar:Picture:http://www.wizards.com/global/images/magic/general/corrupting_licid.jpg @@ -26,5 +24,9 @@ K:Enchant creature A:SP$ Attach | Cost$ 0 | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddKeyword$ Fear | Description$ Enchanted creature has fear. (It can't be blocked except by artifact creatures and/or black creatures.) A:AB$ SetState | Cost$ B | Defined$ Self | NewState$ Original | SpellDescription$ End this effect. - +SVar:RemAIDeck:True +SVar:Rarity:Uncommon +SVar:Picture:http://www.wizards.com/global/images/magic/general/corrupting_licid.jpg +SetInfo:STH|Uncommon|http://magiccards.info/scans/en/sh/4.jpg +Oracle:{B}, {T}: Corrupting Licid loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {B} to end this effect.\nEnchanted creature has fear. (It can't be blocked except by artifact creatures and/or black creatures.) End \ No newline at end of file diff --git a/res/cardsfolder/c/cryptoplasm.txt b/res/cardsfolder/c/cryptoplasm.txt index 7f7531de5d6..9cb4bb2df41 100644 --- a/res/cardsfolder/c/cryptoplasm.txt +++ b/res/cardsfolder/c/cryptoplasm.txt @@ -3,7 +3,10 @@ ManaCost:1 U U Types:Creature Shapeshifter Text:no text PT:2/2 -K:At the beginning of your upkeep, you may have this creature become a copy of another target creature. If you do, this creature gains this ability. +# Make Svars for granting abilities and triggers on clones distinct to avoid SVars getting overwritten when cloning a clone +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ CryptoplasmCopy | TriggerDescription$ At the beginning of your upkeep, you may have CARDNAME become a copy of another target creature. If you do, CARDNAME gains this ability. +SVar:CryptoplasmCopy:AB$ Clone | Cost$ 0 | ValidTgts$ Creature.Other | TgtPrompt$ Select another target creature to copy. | Optional$ True | AddTriggers$ CryptoplasmUpkeepTrig | AddSVars$ CryptoplasmCopy,CryptoplasmUpkeepTrig +SVar:CryptoplasmUpkeepTrig:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ CryptoplasmCopy | TriggerDescription$ At the beginning of your upkeep, you may have CARDNAME become a copy of another target creature. If you do, CARDNAME gains this ability. SVar:RemAIDeck:True SVar:Picture:http://www.wizards.com/global/images/magic/general/cryptoplasm.jpg SetInfo:MBS|Rare|http://magiccards.info/scans/en/mbs/23.jpg diff --git a/res/cardsfolder/c/cunning_bandit_azamuki_treachery_incarnate.txt b/res/cardsfolder/c/cunning_bandit_azamuki_treachery_incarnate.txt index fb69a8fbb93..5e6302b6fa7 100644 --- a/res/cardsfolder/c/cunning_bandit_azamuki_treachery_incarnate.txt +++ b/res/cardsfolder/c/cunning_bandit_azamuki_treachery_incarnate.txt @@ -21,7 +21,7 @@ Types:Legendary Creature Spirit Text:no text PT:5/2 A:AB$ GainControl | Cost$ SubCounter<1/KI> | Tgt$ TgtC | SpellDescription$ Gain control of target creature until end of turn. -SVar:Picture1:www.marc-fowler-design.com/cardforge/flippedcards/BOK/azamuki_treachery_incarnate.jpg +SVar:Picture:www.marc-fowler-design.com/cardforge/flippedcards/BOK/azamuki_treachery_incarnate.jpg # This link may be a temporary solution and could change in the near future. SetInfo:BOK|Uncommon|http://magiccards.info/scans/en/bok/169.jpg Oracle:Remove a ki counter from Azamuki, Treachery Incarnate: Gain control of target creature until end of turn. diff --git a/res/cardsfolder/d/daybreak_ranger_nightfall_predator.txt b/res/cardsfolder/d/daybreak_ranger_nightfall_predator.txt index fb5328cd650..9d28f4cd2f6 100644 --- a/res/cardsfolder/d/daybreak_ranger_nightfall_predator.txt +++ b/res/cardsfolder/d/daybreak_ranger_nightfall_predator.txt @@ -5,14 +5,12 @@ Text:no text PT:2/2 A:AB$DealDamage | Cost$ T | ValidTgts$ Creature.withFlying | TgtPrompt$ Select target creature with flying. | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target creature with flying. T:Mode$Phase | Phase$ Upkeep | WerewolfTransformCondition$ True | TriggerZones$ Battlefield | Execute$ TrigTransform | TriggerDescription$ At the beginning of each upkeep, if no spells were cast last turn, transform CARDNAME. +SVar:TrigTransform:AB$SetState | Cost$ 0 | Defined$ Self | Mode$ Transform AlternateMode:DoubleFaced SVar:Picture:http://www.wizards.com/global/images/magic/general/daybreak_ranger.jpg SetInfo:ISD|Rare|http://magiccards.info/scans/en/isd/176a.jpg Oracle:{T}: Daybreak Ranger deals 2 damage to target creature with flying.\nAt the beginning of each upkeep, if no spells were cast last turn, transform Daybreak Ranger. -#Shared -SVar:TrigTransform:AB$SetState | Cost$ 0 | Defined$ Self | Mode$ Transform - ALTERNATE Name:Nightfall Predator @@ -23,7 +21,8 @@ Text:no text PT:4/4 A:AB$ Fight | Cost$ R T | Defined$ Self | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ CARDNAME fights target creature. (Each deals damage equal to its power to the other.) T:Mode$Phase | Phase$ Upkeep | WerewolfUntransformCondition$ True | TriggerZones$ Battlefield | Execute$ TrigTransform | TriggerDescription$ At the beginning of each upkeep, if a player cast two or more spells last turn, transform CARDNAME. -SVar:Picture1:http://www.wizards.com/global/images/magic/general/nightfall_predator.jpg +SVar:TrigTransform:AB$SetState | Cost$ 0 | Defined$ Self | Mode$ Transform +SVar:Picture:http://www.wizards.com/global/images/magic/general/nightfall_predator.jpg SetInfo:ISD|Rare|http://magiccards.info/scans/en/isd/176b.jpg Oracle:{R}, {T}: Nightfall Predator fights target creature. (Each deals damage equal to its power to the other.)\nAt the beginning of each upkeep, if a player cast two or more spells last turn, transform Nightfall Predator. End \ No newline at end of file diff --git a/res/cardsfolder/d/delver_of_secrets_insectile_aberration.txt b/res/cardsfolder/d/delver_of_secrets_insectile_aberration.txt index 3883ee6e253..491ec033373 100644 --- a/res/cardsfolder/d/delver_of_secrets_insectile_aberration.txt +++ b/res/cardsfolder/d/delver_of_secrets_insectile_aberration.txt @@ -21,7 +21,7 @@ Types:Creature Human Insect Text:no text PT:3/2 K:Flying -SVar:Picture1:http://www.wizards.com/global/images/magic/general/insectile_aberration.jpg +SVar:Picture:http://www.wizards.com/global/images/magic/general/insectile_aberration.jpg Oracle:Flying SetInfo:ISD|Common|http://magiccards.info/scans/en/isd/51b.jpg End \ No newline at end of file diff --git a/res/cardsfolder/d/dimir_doppelganger.txt b/res/cardsfolder/d/dimir_doppelganger.txt new file mode 100644 index 00000000000..130250f88cc --- /dev/null +++ b/res/cardsfolder/d/dimir_doppelganger.txt @@ -0,0 +1,15 @@ +Name:Dimir Doppelganger +ManaCost:1 U B +Types:Creature Shapeshifter +Text:no text +PT:0/2 +# Make Svars for granting abilities and triggers on clones distinct to avoid SVars getting overwritten when cloning a clone +A:AB$ ChangeZone | Cost$ 1 U B | Origin$ Graveyard | Destination$ Exile | ValidTgts$ Creature | RememberTargets$ True | ForgetOtherTargets$ True | SubAbility$ DDCopy | SpellDescription$ Exile target creature card from a graveyard. CARDNAME becomes a copy of that card and gains this ability. +SVar:DDCopy:DB$ Clone | Cost$ 0 | Defined$ Remembered | AddAbilities$ DDAbility | AddSVars$ DDAbility,DDCopy +SVar:DDAbility:AB$ ChangeZone | Cost$ 1 U B | Origin$ Graveyard | Destination$ Exile | ValidTgts$ Creature | RememberTargets$ True | ForgetOtherTargets$ True | SubAbility$ DDCopy | SpellDescription$ Exile target creature card from a graveyard. CARDNAME becomes a copy of that card and gains this ability. +SVar:RemAIDeck:True +SVar:Rarity:Rare +SVar:Picture:http://www.wizards.com/global/images/magic/general/dimir_doppelganger.jpg +Oracle:{1}{U}{B}: Exile target creature card from a graveyard. Dimir Doppelganger becomes a copy of that card and gains this ability. +SetInfo:RAV|Rare|http://magiccards.info/scans/en/rav/202.jpg +End \ No newline at end of file diff --git a/res/cardsfolder/d/dominating_licid.txt b/res/cardsfolder/d/dominating_licid.txt index c18be3366c0..3a6837d748c 100644 --- a/res/cardsfolder/d/dominating_licid.txt +++ b/res/cardsfolder/d/dominating_licid.txt @@ -7,8 +7,6 @@ A:AB$ SetState | Cost$ 1 U U T | Defined$ Self | NewState$ Alternate | SubAbilit SVar:DBAttach:DB$ Attach | Cost$ 0 | ValidTgts$ Creature | AILogic$ GainControl #If the value of AlternateMode isn't Flip or DoubleFaced, it will be the name of the state defined below, so you can switch to it with SetState+NewState$.The name of the first state defined is always "Original". AlternateMode:Alternate - -#Shared SVar:RemAIDeck:True SVar:Rarity:Rare SVar:Picture:http://www.wizards.com/global/images/magic/general/dominating_licid.jpg @@ -25,5 +23,9 @@ Text:You control enchanted creature. K:Enchant creature A:SP$ Attach | Cost$ 0 | ValidTgts$ Creature | AILogic$ GainControl A:AB$ SetState | Cost$ U | Defined$ Self | NewState$ Original | SpellDescription$ End this effect. - +SVar:RemAIDeck:True +SVar:Rarity:Rare +SVar:Picture:http://www.wizards.com/global/images/magic/general/dominating_licid.jpg +SetInfo:EXO|Rare|http://magiccards.info/scans/en/ex/30.jpg +Oracle:{1}{U}{U}, {T}: Dominating Licid loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay to end this effect.\nYou control enchanted creature. End \ No newline at end of file diff --git a/res/cardsfolder/e/elbrus_the_binding_blade_withengar_unbound.txt b/res/cardsfolder/e/elbrus_the_binding_blade_withengar_unbound.txt index f259ff91158..a701f71f107 100644 --- a/res/cardsfolder/e/elbrus_the_binding_blade_withengar_unbound.txt +++ b/res/cardsfolder/e/elbrus_the_binding_blade_withengar_unbound.txt @@ -22,7 +22,7 @@ K:Flying K:Trample K:Intimidate # Whenever a player loses the game, put thirteen +1/+1 counters on Withengar Unbound. (not implemented) -SVar:Picture1:http://www.wizards.com/global/images/magic/general/withengar_unbound.jpg +SVar:Picture:http://www.wizards.com/global/images/magic/general/withengar_unbound.jpg SetInfo:DKA|Mythic|http://magiccards.info/scans/en/dka/147b.jpg Oracle:Flying, intimidate, trample\nWhenever a player loses the game, put thirteen +1/+1 counters on Withengar Unbound. End \ No newline at end of file diff --git a/res/cardsfolder/e/enraging_licid.txt b/res/cardsfolder/e/enraging_licid.txt index 1218a7dfd36..7cc685e2d23 100644 --- a/res/cardsfolder/e/enraging_licid.txt +++ b/res/cardsfolder/e/enraging_licid.txt @@ -7,8 +7,6 @@ A:AB$ SetState | Cost$ R T | Defined$ Self | NewState$ Alternate | SubAbility$ D SVar:DBAttach:DB$ Attach | Cost$ 0 | ValidTgts$ Creature | AILogic$ Pump #If the value of AlternateMode isn't Flip or DoubleFaced, it will be the name of the state defined below, so you can switch to it with SetState+NewState$.The name of the first state defined is always "Original". AlternateMode:Alternate - -#Shared SVar:RemAIDeck:True SVar:Rarity:Uncommon SVar:Picture:http://www.wizards.com/global/images/magic/general/enraging_licid.jpg @@ -26,5 +24,9 @@ K:Enchant creature A:SP$ Attach | Cost$ 0 | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddKeyword$ Haste | Description$ Enchanted creature has haste. A:AB$ SetState | Cost$ R | Defined$ Self | NewState$ Original | SpellDescription$ End this effect. - +SVar:RemAIDeck:True +SVar:Rarity:Uncommon +SVar:Picture:http://www.wizards.com/global/images/magic/general/enraging_licid.jpg +SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/171.jpg +Oracle:{R}, {T}: Enraging Licid loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {R} to end this effect.\nEnchanted creature has haste. End \ No newline at end of file diff --git a/res/cardsfolder/e/erayo_soratami_ascendant_erayos_essence.txt b/res/cardsfolder/e/erayo_soratami_ascendant_erayos_essence.txt index 9109e023cc0..7e3ae40d795 100644 --- a/res/cardsfolder/e/erayo_soratami_ascendant_erayos_essence.txt +++ b/res/cardsfolder/e/erayo_soratami_ascendant_erayos_essence.txt @@ -22,7 +22,7 @@ Text:no text T:Mode$ SpellCast | ValidActivatingPlayer$ Opponent | CheckSVar$ NumOppCast | SVarCompare$ EQ1 | Execute$ TrigCounter | TriggerZones$ Battlefield | TriggerDescription$ Whenever an opponent casts a spell for the first time in a turn, counter that spell. SVar:TrigCounter:AB$Counter | Cost$ 0 | Defined$ TriggeredSpellAbility | Destination$ Graveyard SVar:NumOppCast:Count$ThisTurnCast_Card.YouDontCtrl -SVar:Picture1:http://www.marc-fowler-design.com/cardforge/flippedcards/SOK/erayos_essence.jpg +SVar:Picture:http://www.marc-fowler-design.com/cardforge/flippedcards/SOK/erayos_essence.jpg # This link may be a temporary solution and could change in the near future. SetInfo:SOK|Rare|http://magiccards.info/scans/en/sok/167.jpg Oracle:Whenever an opponent casts a spell for the first time in a turn, counter that spell. diff --git a/res/cardsfolder/e/evil_twin.txt b/res/cardsfolder/e/evil_twin.txt index 4a1d6e43490..2957a91017c 100644 --- a/res/cardsfolder/e/evil_twin.txt +++ b/res/cardsfolder/e/evil_twin.txt @@ -1,8 +1,13 @@ Name:Evil Twin ManaCost:2 U B Types:Creature Shapeshifter -Text:You may have CARDNAME enter the battlefield as a copy of any creature on the battlefield except it gains "U B, T: Destroy target creature with the same name as this creature." +Text:no text PT:0/0 +# Make Svars for granting abilities and triggers on clones distinct to avoid SVars getting overwritten when cloning a clone +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ ChooseCreature | Static$ True | TriggerDescription$ You may have CARDNAME enter the battlefield as a copy of any creature on the battlefield except it gains "U B, T: Destroy target creature with the same name as this creature." +SVar:ChooseCreature:AB$ ChooseCard | Cost$ 0 | Defined$ You | Amount$ 1 | Choices$ Creature.Other | SubAbility$ DBCopy | RememberChosen$ True +SVar:DBCopy:DB$ Clone | Defined$ Remembered | AddAbilities$ EvilTwin +SVar:EvilTwin:AB$Destroy | Cost$ U B T | ValidTgts$ Creature.sameName | TgtPrompt$ Select target creature with the same name. | SpellDescription$ Destroy target creature with the same name as this creature. SVar:Rarity:Rare SVar:Picture:http://www.wizards.com/global/images/magic/general/evil_twin.jpg SetInfo:ISD|Rare|http://magiccards.info/scans/en/isd/212.jpg diff --git a/res/cardsfolder/f/faithful_squire_kaiso_memory_of_loyalty.txt b/res/cardsfolder/f/faithful_squire_kaiso_memory_of_loyalty.txt index 0dffc73fc2b..1902353e5b0 100644 --- a/res/cardsfolder/f/faithful_squire_kaiso_memory_of_loyalty.txt +++ b/res/cardsfolder/f/faithful_squire_kaiso_memory_of_loyalty.txt @@ -21,7 +21,7 @@ Types:Legendary Creature Spirit Text:no text PT:3/4 A:AB$ Pump | Cost$ SubCounter<1/KI> | KW$ HIDDEN Prevent all damage that would be dealt to CARDNAME. | Tgt$ TgtC | SpellDescription$ Prevent all damage that would be dealt to target creature this turn. -SVar:Picture1:http://www.marc-fowler-design.com/cardforge/flippedcards/BOK/kaiso_memory_of_loyalty.jpg +SVar:Picture:http://www.marc-fowler-design.com/cardforge/flippedcards/BOK/kaiso_memory_of_loyalty.jpg # This link may be a temporary solution and could change in the near future. SetInfo:BOK|Uncommon|http://magiccards.info/scans/en/bok/166.jpg Oracle:Remove a ki counter from Kaiso, Memory of Loyalty: Prevent all damage that would be dealt to target creature this turn. diff --git a/res/cardsfolder/g/garruk_relentless_garruk_the_veil_cursed.txt b/res/cardsfolder/g/garruk_relentless_garruk_the_veil_cursed.txt index 28fd2205c40..377ea477da5 100644 --- a/res/cardsfolder/g/garruk_relentless_garruk_the_veil_cursed.txt +++ b/res/cardsfolder/g/garruk_relentless_garruk_the_veil_cursed.txt @@ -27,7 +27,7 @@ A:AB$ Sacrifice | Cost$ SubCounter<1/LOYALTY> | Defined$ You | SacValid$ Creatur A:AB$ PumpAll | Cost$ SubCounter<3/LOYALTY> | ValidCards$ Creature.YouCtrl | KW$ Trample | NumAtt$ X | NumDef$ X | Planeswalker$ True | Ultimate$ True | References$ X | SpellDescription$ Creatures you control gain trample and get +X/+X until end of turn, where X is the number of creature cards in your graveyard. SVar:X:Count$TypeInYourYard.Creature SVar:DBSearch:DB$ ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Creature | ChangeNum$ 1 -SVar:Picture1:http://www.wizards.com/global/images/magic/general/garruk_the_veil_cursed.jpg +SVar:Picture:http://www.wizards.com/global/images/magic/general/garruk_the_veil_cursed.jpg SetInfo:ISD|Mythic|http://magiccards.info/scans/en/isd/181b.jpg Oracle:[+1] Put a 1/1 black Wolf creature token with deathtouch onto the battlefield.\n[-1] Sacrifice a creature. If you do, search your library for a creature card, reveal it, put it into your hand, then shuffle your library.\n[-3] Creatures you control gain trample and get +X/+X until end of turn, where X is the number of creature cards in your graveyard. End \ No newline at end of file diff --git a/res/cardsfolder/g/gatstaf_shepherd_gatstaf_howler.txt b/res/cardsfolder/g/gatstaf_shepherd_gatstaf_howler.txt index 11a2995afe8..fa6fe631155 100644 --- a/res/cardsfolder/g/gatstaf_shepherd_gatstaf_howler.txt +++ b/res/cardsfolder/g/gatstaf_shepherd_gatstaf_howler.txt @@ -4,14 +4,12 @@ Types:Creature Human Werewolf Text:no text PT:2/2 T:Mode$Phase | Phase$ Upkeep | WerewolfTransformCondition$ True | TriggerZones$ Battlefield | Execute$ TrigTransform | TriggerDescription$ At the beginning of each upkeep, if no spells were cast last turn, transform CARDNAME. +SVar:TrigTransform:AB$SetState | Cost$ 0 | Defined$ Self | Mode$ Transform SVar:Picture:http://www.wizards.com/global/images/magic/general/gatstaf_shepherd.jpg AlternateMode:DoubleFaced SetInfo:ISD|Uncommon|http://magiccards.info/scans/en/isd/182a.jpg Oracle:At the beginning of each upkeep, if no spells were cast last turn, transform Gatstaf Shepherd. -#Shared -SVar:TrigTransform:AB$SetState | Cost$ 0 | Defined$ Self | Mode$ Transform - ALTERNATE Name:Gatstaf Howler @@ -22,7 +20,8 @@ Text:no text PT:3/3 K:Intimidate T:Mode$Phase | Phase$ Upkeep | WerewolfUntransformCondition$ True | TriggerZones$ Battlefield | Execute$ TrigTransform | TriggerDescription$ At the beginning of each upkeep, if a player cast two or more spells last turn, transform CARDNAME. -SVar:Picture1:http://www.wizards.com/global/images/magic/general/gatstaf_howler.jpg +SVar:TrigTransform:AB$SetState | Cost$ 0 | Defined$ Self | Mode$ Transform +SVar:Picture:http://www.wizards.com/global/images/magic/general/gatstaf_howler.jpg SetInfo:ISD|Uncommon|http://magiccards.info/scans/en/isd/182b.jpg Oracle:Intimidate (This creature can't be blocked except by artifact creatures and/or creatures that share a color with it.)\nAt the beginning of each upkeep, if a player cast two or more spells last turn, transform Gatstaf Howler. End \ No newline at end of file diff --git a/res/cardsfolder/g/gliding_licid.txt b/res/cardsfolder/g/gliding_licid.txt index c4a727936cf..a2d996f2544 100644 --- a/res/cardsfolder/g/gliding_licid.txt +++ b/res/cardsfolder/g/gliding_licid.txt @@ -7,8 +7,6 @@ A:AB$ SetState | Cost$ U T | Defined$ Self | NewState$ Alternate | SubAbility$ D SVar:DBAttach:DB$ Attach | Cost$ 0 | ValidTgts$ Creature | AILogic$ Pump #If the value of AlternateMode isn't Flip or DoubleFaced, it will be the name of the state defined below, so you can switch to it with SetState+NewState$.The name of the first state defined is always "Original". AlternateMode:Alternate - -#Shared SVar:RemAIDeck:True SVar:Rarity:Uncommon SVar:Picture:http://www.wizards.com/global/images/magic/general/gliding_licid.jpg @@ -26,5 +24,9 @@ K:Enchant creature A:SP$ Attach | Cost$ 0 | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddKeyword$ Flying | Description$ Enchanted creature has flying. A:AB$ SetState | Cost$ U | Defined$ Self | NewState$ Original | SpellDescription$ End this effect. - +SVar:RemAIDeck:True +SVar:Rarity:Uncommon +SVar:Picture:http://www.wizards.com/global/images/magic/general/gliding_licid.jpg +SetInfo:STH|Uncommon|http://magiccards.info/scans/en/sh/31.jpg +Oracle:{U}, {T}: Glidinging Licid loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {U} to end this effect.\nEnchanted creature has flying. End \ No newline at end of file diff --git a/res/cardsfolder/g/grizzled_outcasts_krallenhorde_wantons.txt b/res/cardsfolder/g/grizzled_outcasts_krallenhorde_wantons.txt index 8f273c75cb9..4614735f4dd 100644 --- a/res/cardsfolder/g/grizzled_outcasts_krallenhorde_wantons.txt +++ b/res/cardsfolder/g/grizzled_outcasts_krallenhorde_wantons.txt @@ -4,15 +4,13 @@ Types:Creature Human Werewolf Text:no text PT:4/4 T:Mode$Phase | Phase$ Upkeep | WerewolfTransformCondition$ True | TriggerZones$ Battlefield | Execute$ TrigTransform | TriggerDescription$ At the beginning of each upkeep, if no spells were cast last turn, transform CARDNAME. +SVar:TrigTransform:AB$SetState | Cost$ 0 | Defined$ Self | Mode$ Transform SVar:Rarity:Common AlternateMode:DoubleFaced SVar:Picture:http://www.wizards.com/global/images/magic/general/grizzled_outcasts.jpg SetInfo:ISD|Common|http://magiccards.info/scans/en/isd/185a.jpg Oracle:At the beginning of each upkeep, if no spells were cast last turn, transform Grizzled Outcasts. -#Shared -SVar:TrigTransform:AB$SetState | Cost$ 0 | Defined$ Self | Mode$ Transform - ALTERNATE Name:Krallenhorde Wantons @@ -22,8 +20,9 @@ Types:Creature Werewolf Text:no text PT:7/7 T:Mode$Phase | Phase$ Upkeep | WerewolfUntransformCondition$ True | TriggerZones$ Battlefield | Execute$ TrigTransform | TriggerDescription$ At the beginning of each upkeep, if a player cast two or more spells last turn, transform CARDNAME. +SVar:TrigTransform:AB$SetState | Cost$ 0 | Defined$ Self | Mode$ Transform SVar:Rarity:Common -SVar:Picture1:http://www.wizards.com/global/images/magic/general/krallenhorde_wantons.jpg +SVar:Picture:http://www.wizards.com/global/images/magic/general/krallenhorde_wantons.jpg SetInfo:ISD|Common|http://magiccards.info/scans/en/isd/185b.jpg Oracle:At the beginning of each upkeep, if a player cast two or more spells last turn, transform Krallenhorde Wantons. End \ No newline at end of file diff --git a/res/cardsfolder/h/hanweir_watchkeep_bane_of_hanweir.txt b/res/cardsfolder/h/hanweir_watchkeep_bane_of_hanweir.txt index 15dc5cbabc7..500bd3efb33 100644 --- a/res/cardsfolder/h/hanweir_watchkeep_bane_of_hanweir.txt +++ b/res/cardsfolder/h/hanweir_watchkeep_bane_of_hanweir.txt @@ -5,14 +5,12 @@ Text:no text PT:1/5 K:Defender T:Mode$Phase | Phase$ Upkeep | WerewolfTransformCondition$ True | TriggerZones$ Battlefield | Execute$ TrigTransform | TriggerDescription$ At the beginning of each upkeep, if no spells were cast last turn, transform CARDNAME. +SVar:TrigTransform:AB$SetState | Cost$ 0 | Defined$ Self | Mode$ Transform AlternateMode:DoubleFaced SVar:Picture:http://www.wizards.com/global/images/magic/general/hanweir_watchkeep.jpg SetInfo:ISD|Uncommon|http://magiccards.info/scans/en/isd/145a.jpg Oracle:Defender\nAt the beginning of each upkeep, if no spells were cast last turn, transform Hanweir Watchkeep. -#Shared -SVar:TrigTransform:AB$SetState | Cost$ 0 | Defined$ Self | Mode$ Transform - ALTERNATE Name:Bane of Hanweir @@ -23,7 +21,8 @@ Text:no text PT:5/5 K:CARDNAME attacks each turn if able. T:Mode$Phase | Phase$ Upkeep | WerewolfUntransformCondition$ True | TriggerZones$ Battlefield | Execute$ TrigTransform | TriggerDescription$ At the beginning of each upkeep, if a player cast two or more spells last turn, transform CARDNAME. -SVar:Picture1:http://www.wizards.com/global/images/magic/general/bane_of_hanweir.jpg +SVar:TrigTransform:AB$SetState | Cost$ 0 | Defined$ Self | Mode$ Transform +SVar:Picture:http://www.wizards.com/global/images/magic/general/bane_of_hanweir.jpg SetInfo:ISD|Uncommon|http://magiccards.info/scans/en/isd/145b.jpg Oracle:Bane of Hanweir attacks each turn if able.\nAt the beginning of each upkeep, if a player cast two or more spells last turn, transform Bane of Hanweir. End \ No newline at end of file diff --git a/res/cardsfolder/h/hinterland_hermit_hinterland_scourge.txt b/res/cardsfolder/h/hinterland_hermit_hinterland_scourge.txt index 70b91036811..72b015dda22 100644 --- a/res/cardsfolder/h/hinterland_hermit_hinterland_scourge.txt +++ b/res/cardsfolder/h/hinterland_hermit_hinterland_scourge.txt @@ -4,14 +4,12 @@ Types:Creature Human Werewolf Text:no text PT:2/1 T:Mode$Phase | Phase$ Upkeep | WerewolfTransformCondition$ True | TriggerZones$ Battlefield | Execute$ TrigTransform | TriggerDescription$ At the beginning of each upkeep, if no spells were cast last turn, transform CARDNAME. +SVar:TrigTransform:AB$SetState | Cost$ 0 | Defined$ Self | Mode$ Transform SVar:Picture:http://www.wizards.com/global/images/magic/general/hinterland_hermit.jpg AlternateMode:DoubleFaced SetInfo:DKA|Common|http://magiccards.info/scans/en/dka/94a.jpg Oracle:At the beginning of each upkeep, if no spells were cast last turn, transform Hinterland Hermit. -#Shared -SVar:TrigTransform:AB$SetState | Cost$ 0 | Defined$ Self | Mode$ Transform - ALTERNATE Name:Hinterland Scourge @@ -22,7 +20,8 @@ Text:no text PT:3/2 K:CARDNAME must be blocked if able. T:Mode$Phase | Phase$ Upkeep | WerewolfUntransformCondition$ True | TriggerZones$ Battlefield | Execute$ TrigTransform | TriggerDescription$ At the beginning of each upkeep, if a player cast two or more spells last turn, transform CARDNAME. -SVar:Picture1:http://www.wizards.com/global/images/magic/general/hinterland_scourge.jpg +SVar:TrigTransform:AB$SetState | Cost$ 0 | Defined$ Self | Mode$ Transform +SVar:Picture:http://www.wizards.com/global/images/magic/general/hinterland_scourge.jpg SetInfo:DKA|Common|http://magiccards.info/scans/en/dka/94b.jpg Oracle:Hinterland Scourge must be blocked if able.\nAt the beginning of each upkeep, if a player cast two or more spells last turn, transform Hinterland Scourge. End \ No newline at end of file diff --git a/res/cardsfolder/h/hired_muscle_scarmaker.txt b/res/cardsfolder/h/hired_muscle_scarmaker.txt index c3524e0ff5e..6d34874d18d 100644 --- a/res/cardsfolder/h/hired_muscle_scarmaker.txt +++ b/res/cardsfolder/h/hired_muscle_scarmaker.txt @@ -21,7 +21,7 @@ Types:Legendary Creature Spirit Text:no text PT:4/4 A:AB$ Pump | Cost$ SubCounter<1/KI> | KW$ Fear | Tgt$ TgtC | SpellDescription$ Target creature gains fear until end of turn. (It can't be blocked except by artifact creatures and/or black creatures.) -SVar:Picture1:http://www.marc-fowler-design.com/cardforge/flippedcards/BOK/scarmaker.jpg +SVar:Picture:http://www.marc-fowler-design.com/cardforge/flippedcards/BOK/scarmaker.jpg # This link may be a temporary solution and could change in the near future. SetInfo:BOK|Uncommon|http://magiccards.info/scans/en/bok/168.jpg Oracle:Remove a ki counter from Scarmaker: Target creature gains fear until end of turn. (It can't be blocked except by artifact creatures and/or black creatures.) diff --git a/res/cardsfolder/h/homura_human_ascendant_homuras_essence.txt b/res/cardsfolder/h/homura_human_ascendant_homuras_essence.txt index 09fc79187ba..42a5853ba17 100644 --- a/res/cardsfolder/h/homura_human_ascendant_homuras_essence.txt +++ b/res/cardsfolder/h/homura_human_ascendant_homuras_essence.txt @@ -21,7 +21,7 @@ Types:Legendary Enchantment Text:no text S:Mode$ Continuous | Affected$ Creature.YouCtrl | AddPower$ 2 | AddToughness$ 2 | AddKeyword$ Flying | AddAbility$ ABPump | Description$ Creatures you control get +2/+2 and have flying and "R: This creature gets +1/+0 until end of turn." SVar:ABPump:AB$Pump | Cost$ R | Defined$ Self | NumAtt$ 1 | SpellDescription$ This creature gets +1/+0 until end of turn. -SVar:Picture1:http://www.marc-fowler-design.com/cardforge/flippedcards/SOK/homuras_essence.jpg +SVar:Picture:http://www.marc-fowler-design.com/cardforge/flippedcards/SOK/homuras_essence.jpg # This link may be a temporary solution and could change in the near future. SetInfo:SOK|Rare|http://magiccards.info/scans/en/sok/169.jpg Oracle:Creatures you control get +2/+2 and have flying and "{R}: This creature gets +1/+0 until end of turn." diff --git a/res/cardsfolder/h/huntmaster_of_the_fells_ravager_of_the_fells.txt b/res/cardsfolder/h/huntmaster_of_the_fells_ravager_of_the_fells.txt index 63891f12bd4..0dccb86a37d 100644 --- a/res/cardsfolder/h/huntmaster_of_the_fells_ravager_of_the_fells.txt +++ b/res/cardsfolder/h/huntmaster_of_the_fells_ravager_of_the_fells.txt @@ -8,14 +8,12 @@ T:Mode$ Transformed | ValidCard$ Card.Self | Execute$ TokenAndLife | Secondary$ SVar:TokenAndLife:AB$ Token | Cost$ 0 | TokenOwner$ You | TokenName$ Wolf | TokenColors$ Green | TokenTypes$ Creature,Wolf | TokenPower$ 2 | TokenToughness$ 2 | TokenAmount$ 1 | SubAbility$ Life SVar:Life:DB$ GainLife | Defined$ You | LifeAmount$ 2 T:Mode$Phase | Phase$ Upkeep | WerewolfTransformCondition$ True | TriggerZones$ Battlefield | Execute$ TrigTransform | TriggerDescription$ At the beginning of each upkeep, if no spells were cast last turn, transform CARDNAME. +SVar:TrigTransform:AB$SetState | Cost$ 0 | Defined$ Self | Mode$ Transform AlternateMode:DoubleFaced SVar:Picture:http://www.wizards.com/global/images/magic/general/huntmaster_of_the_fells.jpg SetInfo:DKA|Mythic|http://magiccards.info/scans/en/dka/140a.jpg Oracle:Whenever this creature enters the battlefield or transforms into Huntmaster of the Fells, put a 2/2 green Wolf creature token onto the battlefield and you gain 2 life.\nAt the beginning of each upkeep, if no spells were cast last turn, transform Huntmaster of the Fells. -#Shared -SVar:TrigTransform:AB$SetState | Cost$ 0 | Defined$ Self | Mode$ Transform - ALTERNATE Name:Ravager of the Fells @@ -29,7 +27,8 @@ T:Mode$ Transformed | ValidCard$ Card.Self | Execute$ DamageAndMoreDamage | Trig SVar:DamageAndMoreDamage:AB$ DealDamage | Cost$ 0 | ValidTgts$ Opponent | NumDmg$ 2 | SubAbility$ MoreDamage SVar:MoreDamage:DB$ DealDamage | ValidTgts$ Creature.YouDontCtrl | NumDmg$ 2 | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select target creature opponent controls T:Mode$Phase | Phase$ Upkeep | WerewolfUntransformCondition$ True | TriggerZones$ Battlefield | Execute$ TrigTransform | TriggerDescription$ At the beginning of each upkeep, if a player cast two or more spells last turn, transform CARDNAME. -SVar:Picture1:http://www.wizards.com/global/images/magic/general/ravager_of_the_fells.jpg +SVar:TrigTransform:AB$SetState | Cost$ 0 | Defined$ Self | Mode$ Transform +SVar:Picture:http://www.wizards.com/global/images/magic/general/ravager_of_the_fells.jpg SetInfo:DKA|Mythic|http://magiccards.info/scans/en/dka/140b.jpg Oracle:Trample\nWhenever this creature transforms into Ravager of the Fells, it deals 2 damage to target opponent and 2 damage to up to one target creature that player controls.\nAt the beginning of each upkeep, if a player cast two or more spells last turn, transform Ravager of the Fells. End \ No newline at end of file diff --git a/res/cardsfolder/i/initiate_of_blood_goka_the_unjust.txt b/res/cardsfolder/i/initiate_of_blood_goka_the_unjust.txt index 8ced335922b..70b788e1b41 100644 --- a/res/cardsfolder/i/initiate_of_blood_goka_the_unjust.txt +++ b/res/cardsfolder/i/initiate_of_blood_goka_the_unjust.txt @@ -22,7 +22,7 @@ Types:Legendary Creature Ogre Shaman Text:no text PT:4/4 A:AB$DealDamage | Cost$ T | ValidTgts$ Creature.wasDealtDamageThisTurn | TgtPrompt$ Select target creature that was dealt damage this turn. | NumDmg$ 4 | SpellDescription$ CARDNAME deals 4 damage to target creature that was dealt damage this turn. -SVar:Picture1:http://www.wizards.com/global/images/magic/general/goka_the_unjust.jpg +SVar:Picture:http://www.wizards.com/global/images/magic/general/goka_the_unjust.jpg SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/314.jpg Oracle:{T}: Goka the Unjust deals 4 damage to target creature that was dealt damage this turn. diff --git a/res/cardsfolder/i/instigator_gang_wildblood_pack.txt b/res/cardsfolder/i/instigator_gang_wildblood_pack.txt index 3486eb49d7e..7ad51a6713b 100644 --- a/res/cardsfolder/i/instigator_gang_wildblood_pack.txt +++ b/res/cardsfolder/i/instigator_gang_wildblood_pack.txt @@ -5,14 +5,12 @@ Text:no text PT:2/3 S:Mode$ Continuous | Affected$ Creature.attacking+YouCtrl | AddPower$ 1 | Description$ Attacking creatures you control get +1/+0. T:Mode$Phase | Phase$ Upkeep | WerewolfTransformCondition$ True | TriggerZones$ Battlefield | Execute$ TrigTransform | TriggerDescription$ At the beginning of each upkeep, if no spells were cast last turn, transform CARDNAME. +SVar:TrigTransform:AB$SetState | Cost$ 0 | Defined$ Self | Mode$ Transform SVar:Picture:http://www.wizards.com/global/images/magic/general/instigator_gang.jpg AlternateMode:DoubleFaced SetInfo:ISD|Rare|http://magiccards.info/scans/en/isd/149a.jpg Oracle:Attacking creatures you control get +1/+0.\nAt the beginning of each upkeep, if no spells were cast last turn, transform Instigator Gang. -#Shared -SVar:TrigTransform:AB$SetState | Cost$ 0 | Defined$ Self | Mode$ Transform - ALTERNATE Name:Wildblood Pack @@ -24,7 +22,8 @@ PT:5/5 K:Trample S:Mode$ Continuous | Affected$ Creature.attacking+YouCtrl | AddPower$ 3 | Description$ Attacking creatures you control get +3/+0. T:Mode$Phase | Phase$ Upkeep | WerewolfUntransformCondition$ True | TriggerZones$ Battlefield | Execute$ TrigTransform | TriggerDescription$ At the beginning of each upkeep, if a player cast two or more spells last turn, transform CARDNAME. -SVar:Picture1:http://www.wizards.com/global/images/magic/general/wildblood_pack.jpg +SVar:TrigTransform:AB$SetState | Cost$ 0 | Defined$ Self | Mode$ Transform +SVar:Picture:http://www.wizards.com/global/images/magic/general/wildblood_pack.jpg SetInfo:ISD|Rare|http://magiccards.info/scans/en/isd/149b.jpg Oracle:Attacking creatures you control get +3/+0.\nAt the beginning of each upkeep, if a player cast two or more spells last turn, transform Wildblood Pack. End \ No newline at end of file diff --git a/res/cardsfolder/j/jushi_apprentice_tomoya_the_revealer.txt b/res/cardsfolder/j/jushi_apprentice_tomoya_the_revealer.txt index 06b61156ee6..0a606388f8d 100644 --- a/res/cardsfolder/j/jushi_apprentice_tomoya_the_revealer.txt +++ b/res/cardsfolder/j/jushi_apprentice_tomoya_the_revealer.txt @@ -21,7 +21,7 @@ Text:no text PT:2/3 A:AB$Draw | Cost$ 3 U U T | ValidTgts$ Player | NumCards$ X | References$ X | SpellDescription$ Target player draws X cards, where X is the number of cards in your hand. SVar:X:Count$InYourHand -SVar:Picture1:http://www.wizards.com/global/images/magic/general/tomoya_the_revealer.jpg +SVar:Picture:http://www.wizards.com/global/images/magic/general/tomoya_the_revealer.jpg SetInfo:CHK|Rare|http://magiccards.info/scans/en/chk/309.jpg Oracle:{3}{U}{U}, {T}: Target player draws X cards, where X is the number of cards in your hand. End \ No newline at end of file diff --git a/res/cardsfolder/j/jwari_shapeshifter.txt b/res/cardsfolder/j/jwari_shapeshifter.txt index 260cbc93e2d..badfdbeec90 100644 --- a/res/cardsfolder/j/jwari_shapeshifter.txt +++ b/res/cardsfolder/j/jwari_shapeshifter.txt @@ -1,8 +1,11 @@ Name:Jwari Shapeshifter ManaCost:1 U Types:Creature Shapeshifter Ally -Text:You may have CARDNAME enter the battlefield as a copy of any Ally creature on the battlefield. +Text:no text PT:0/0 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ ChooseCreature | Static$ True | TriggerDescription$ You may have CARDNAME enter the battlefield as a copy of any Ally creature on the battlefield. +SVar:ChooseCreature:AB$ ChooseCard | Cost$ 0 | Defined$ You | Amount$ 1 | Choices$ Creature.Ally+Other | SubAbility$ DBCopy | RememberChosen$ True +SVar:DBCopy:DB$ Clone | Defined$ Remembered SVar:RemRandomDeck:True SVar:Rarity:Rare SVar:Picture:http://www.wizards.com/global/images/magic/general/jwari_shapeshifter.jpg diff --git a/res/cardsfolder/k/kruin_outlaw_terror_of_kruin_pass.txt b/res/cardsfolder/k/kruin_outlaw_terror_of_kruin_pass.txt index e94a4b9a98d..afc0804f5fa 100644 --- a/res/cardsfolder/k/kruin_outlaw_terror_of_kruin_pass.txt +++ b/res/cardsfolder/k/kruin_outlaw_terror_of_kruin_pass.txt @@ -5,14 +5,12 @@ Text:no text PT:2/2 K:First Strike T:Mode$Phase | Phase$ Upkeep | WerewolfTransformCondition$ True | TriggerZones$ Battlefield | Execute$ TrigTransform | TriggerDescription$ At the beginning of each upkeep, if no spells were cast last turn, transform CARDNAME. +SVar:TrigTransform:AB$SetState | Cost$ 0 | Defined$ Self | Mode$ Transform SVar:Picture:http://www.wizards.com/global/images/magic/general/kruin_outlaw.jpg AlternateMode:DoubleFaced SetInfo:ISD|Rare|http://magiccards.info/scans/en/isd/152a.jpg Oracle:First Strike\nAt the beginning of each upkeep, if no spells were cast last turn, transform Kruin Outlaw. -#Shared -SVar:TrigTransform:AB$SetState | Cost$ 0 | Defined$ Self | Mode$ Transform - ALTERNATE Name:Terror of Kruin Pass @@ -24,7 +22,8 @@ PT:3/3 K:Double Strike S:Mode$ Continuous | Affected$ Werewolf.YouCtrl | AddHiddenKeyword$ HIDDEN CARDNAME can't be blocked except by two or more creatures. | Description$ Each Werewolf you control can't be blocked except by two or more creatures. T:Mode$Phase | Phase$ Upkeep | WerewolfUntransformCondition$ True | TriggerZones$ Battlefield | Execute$ TrigTransform | TriggerDescription$ At the beginning of each upkeep, if a player cast two or more spells last turn, transform CARDNAME. -SVar:Picture1:http://www.wizards.com/global/images/magic/general/terror_of_kruin_pass.jpg +SVar:TrigTransform:AB$SetState | Cost$ 0 | Defined$ Self | Mode$ Transform +SVar:Picture:http://www.wizards.com/global/images/magic/general/terror_of_kruin_pass.jpg SetInfo:ISD|Rare|http://magiccards.info/scans/en/isd/152b.jpg Oracle:Double Strike\nEach Werewolf you control can't be blocked except by two or more creatures.\nAt the beginning of each upkeep, if a player cast two or more spells last turn, transform Terror of Kruin Pass. End \ No newline at end of file diff --git a/res/cardsfolder/k/kuon_ogre_ascendant_kuons_essence.txt b/res/cardsfolder/k/kuon_ogre_ascendant_kuons_essence.txt index 12901448e37..8b2a0a37126 100644 --- a/res/cardsfolder/k/kuon_ogre_ascendant_kuons_essence.txt +++ b/res/cardsfolder/k/kuon_ogre_ascendant_kuons_essence.txt @@ -22,7 +22,7 @@ Text:no text T:Mode$ Phase | Phase$ Upkeep | TriggerZones$ Battlefield | Execute$ TrigSac | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of each player's upkeep, that player sacrifices a creature. SVar:TrigSac:AB$Sacrifice | Cost$ 0 | Defined$ TriggeredPlayer | SacValid$ Creature SVar:Rarity:Rare -SVar:Picture1:http://www.marc-fowler-design.com/cardforge/flippedcards/SOK/kuons_essence.jpg +SVar:Picture:http://www.marc-fowler-design.com/cardforge/flippedcards/SOK/kuons_essence.jpg # This link may be a temporary solution and could change in the near future. SetInfo:SOK|Rare|http://magiccards.info/scans/en/sok/168.jpg Oracle:At the beginning of each player's upkeep, that player sacrifices a creature. diff --git a/res/cardsfolder/l/lambholt_elder_silverpelt_werewolf.txt b/res/cardsfolder/l/lambholt_elder_silverpelt_werewolf.txt index 945335c6b54..beeabba0966 100644 --- a/res/cardsfolder/l/lambholt_elder_silverpelt_werewolf.txt +++ b/res/cardsfolder/l/lambholt_elder_silverpelt_werewolf.txt @@ -4,14 +4,12 @@ Types:Creature Human Werewolf Text:no text PT:1/2 T:Mode$Phase | Phase$ Upkeep | WerewolfTransformCondition$ True | TriggerZones$ Battlefield | Execute$ TrigTransform | TriggerDescription$ At the beginning of each upkeep, if no spells were cast last turn, transform CARDNAME. +SVar:TrigTransform:AB$SetState | Cost$ 0 | Defined$ Self | Mode$ Transform AlternateMode:DoubleFaced SVar:Picture:http://www.wizards.com/global/images/magic/general/lambholt_elder.jpg SetInfo:DKA|Uncommon|http://magiccards.info/scans/en/dka/122a.jpg Oracle:At the beginning of each upkeep, if no spells were cast last turn, transform Lambholt Elder. -#Shared -SVar:TrigTransform:AB$SetState | Cost$ 0 | Defined$ Self | Mode$ Transform - ALTERNATE Name:Silverpelt Werewolf @@ -23,7 +21,8 @@ PT:4/5 T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigDraw | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, draw a card. SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 T:Mode$Phase | Phase$ Upkeep | WerewolfUntransformCondition$ True | TriggerZones$ Battlefield | Execute$ TrigTransform | TriggerDescription$ At the beginning of each upkeep, if a player cast two or more spells last turn, transform CARDNAME. -SVar:Picture1:http://www.wizards.com/global/images/magic/general/silverpelt_werewolf.jpg +SVar:TrigTransform:AB$SetState | Cost$ 0 | Defined$ Self | Mode$ Transform +SVar:Picture:http://www.wizards.com/global/images/magic/general/silverpelt_werewolf.jpg SetInfo:DKA|Uncommon|http://magiccards.info/scans/en/dka/122b.jpg Oracle:Whenever Silverpelt Werewolf deals combat damage to a player, draw a card.\nAt the beginning of each upkeep, if a player cast two or more spells last turn, transform Silverpelt Werewolf. End \ No newline at end of file diff --git a/res/cardsfolder/l/leeching_licid.txt b/res/cardsfolder/l/leeching_licid.txt index 84885e4ea4e..0e4d3235815 100644 --- a/res/cardsfolder/l/leeching_licid.txt +++ b/res/cardsfolder/l/leeching_licid.txt @@ -7,8 +7,6 @@ A:AB$ SetState | Cost$ B T | Defined$ Self | NewState$ Alternate | SubAbility$ D SVar:DBAttach:DB$ Attach | Cost$ 0 | ValidTgts$ Creature | AILogic$ Curse #If the value of AlternateMode isn't Flip or DoubleFaced, it will be the name of the state defined below, so you can switch to it with SetState+NewState$.The name of the first state defined is always "Original". AlternateMode:Alternate - -#Shared SVar:RemAIDeck:True SVar:Rarity:Uncommon SVar:Picture:http://www.wizards.com/global/images/magic/general/leeching_licid.jpg @@ -27,5 +25,9 @@ A:SP$ Attach | Cost$ 0 | ValidTgts$ Creature | AILogic$ Curse T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ EnchantedController | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ At the beginning of the upkeep of enchanted creature's controller, CARDNAME deals 1 damage to that player. SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Defined$ EnchantedController | NumDmg$ 1 A:AB$ SetState | Cost$ B | Defined$ Self | NewState$ Original | SpellDescription$ End this effect. - +SVar:RemAIDeck:True +SVar:Rarity:Uncommon +SVar:Picture:http://www.wizards.com/global/images/magic/general/leeching_licid.jpg +SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/35.jpg +Oracle:{B}, {T}: Leeching Licid loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {B} to end this effect.\nAt the beginning of the upkeep of enchanted creature's controller, Leeching Licid deals 1 damage to that player. End \ No newline at end of file diff --git a/res/cardsfolder/l/loyal_cathar_unhallowed_cathar.txt b/res/cardsfolder/l/loyal_cathar_unhallowed_cathar.txt index 14f9704f212..da1c19aa05b 100644 --- a/res/cardsfolder/l/loyal_cathar_unhallowed_cathar.txt +++ b/res/cardsfolder/l/loyal_cathar_unhallowed_cathar.txt @@ -22,7 +22,7 @@ Types:Creature Zombie Soldier Text:no text PT:2/1 K:CARDNAME can't block. -SVar:Picture1:http://www.wizards.com/global/images/magic/general/unhallowed_cathar.jpg +SVar:Picture:http://www.wizards.com/global/images/magic/general/unhallowed_cathar.jpg SetInfo:DKA|Common|http://magiccards.info/scans/en/dka/13b.jpg Oracle:Unhallowed Cathar can't block. End \ No newline at end of file diff --git a/res/cardsfolder/m/mayor_of_avabruck_howlpack_alpha.txt b/res/cardsfolder/m/mayor_of_avabruck_howlpack_alpha.txt index f61fb1c2cc8..96bfe5efd36 100644 --- a/res/cardsfolder/m/mayor_of_avabruck_howlpack_alpha.txt +++ b/res/cardsfolder/m/mayor_of_avabruck_howlpack_alpha.txt @@ -5,14 +5,12 @@ Text:no text PT:1/1 S:Mode$ Continuous | Affected$ Creature.Human+Other+YouCtrl | AddPower$ 1 | AddToughness$ 1 | Description$ Other Human creatures you control get +1/+1. T:Mode$Phase | Phase$ Upkeep | WerewolfTransformCondition$ True | TriggerZones$ Battlefield | Execute$ TrigTransform | TriggerDescription$ At the beginning of each upkeep, if no spells were cast last turn, transform CARDNAME. +SVar:TrigTransform:AB$SetState | Cost$ 0 | Defined$ Self | Mode$ Transform SVar:Picture:http://www.wizards.com/global/images/magic/general/mayor_of_avabruck.jpg AlternateMode:DoubleFaced SetInfo:ISD|Rare|http://magiccards.info/scans/en/isd/193a.jpg Oracle:Other Human creatures you control get +1/+1.\nAt the beginning of each upkeep, if no spells were cast last turn, transform Mayor of Avabruck. -#Shared -SVar:TrigTransform:AB$SetState | Cost$ 0 | Defined$ Self | Mode$ Transform - ALTERNATE Name:Howlpack Alpha @@ -24,8 +22,9 @@ PT:3/3 S:Mode$ Continuous | Affected$ Creature.Werewolf+Other+YouCtrl,Creature.Wolf+Other+YouCtrl | AddPower$ 1 | AddToughness$ 1 | Description$ Other Werewolf and Wolf creatures you control get +1/+1. T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ At the beginning of your end step, put a 2/2 green Wolf creature token onto the battlefield. T:Mode$Phase | Phase$ Upkeep | WerewolfUntransformCondition$ True | TriggerZones$ Battlefield | Execute$ TrigTransform | TriggerDescription$ At the beginning of each upkeep, if a player cast two or more spells last turn, transform CARDNAME. +SVar:TrigTransform:AB$SetState | Cost$ 0 | Defined$ Self | Mode$ Transform SVar:TrigToken:AB$ Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Wolf | TokenColors$ Green | TokenTypes$ Creature,Wolf | TokenOwner$ You | TokenPower$ 2 | TokenToughness$ 2 -SVar:Picture1:http://www.wizards.com/global/images/magic/general/howlpack_alpha.jpg +SVar:Picture:http://www.wizards.com/global/images/magic/general/howlpack_alpha.jpg SetInfo:ISD|Rare|http://magiccards.info/scans/en/isd/193b.jpg Oracle:Other Werewolf and Wolf creatures you control get +1/+1.\nAt the beginning of your end step, put a 2/2 green Wolf creature token onto the battlefield.\nAt the beginning of each upkeep, if a player cast two or more spells last turn, transform Howlpack Alpha. End \ No newline at end of file diff --git a/res/cardsfolder/m/mondronen_shaman_tovolars_magehunter.txt b/res/cardsfolder/m/mondronen_shaman_tovolars_magehunter.txt index 5eff3194c02..fdcab8e279a 100644 --- a/res/cardsfolder/m/mondronen_shaman_tovolars_magehunter.txt +++ b/res/cardsfolder/m/mondronen_shaman_tovolars_magehunter.txt @@ -4,14 +4,12 @@ Types:Creature Human Werewolf Shaman Text:no text PT:3/2 T:Mode$Phase | Phase$ Upkeep | WerewolfTransformCondition$ True | TriggerZones$ Battlefield | Execute$ TrigTransform | TriggerDescription$ At the beginning of each upkeep, if no spells were cast last turn, transform CARDNAME. +SVar:TrigTransform:AB$SetState | Cost$ 0 | Defined$ Self | Mode$ Transform AlternateMode:DoubleFaced SVar:Picture:http://www.wizards.com/global/images/magic/general/mondronen_shaman.jpg SetInfo:DKA|Rare|http://magiccards.info/scans/en/dka/98a.jpg Oracle:At the beginning of each upkeep, if no spells were cast last turn, transform Mondronen Shaman. -#Shared -SVar:TrigTransform:AB$SetState | Cost$ 0 | Defined$ Self | Mode$ Transform - ALTERNATE Name:Tovolar's Magehunter @@ -23,7 +21,8 @@ PT:5/5 T:Mode$ SpellCast | ValidCard$ Card | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigDealDamage | TriggerDescription$ Whenever an opponent casts a spell, CARDNAME deals 2 damage to that player. SVar:TrigDealDamage:AB$DealDamage | Cost$ 0 | Defined$ TriggeredPlayer | NumDmg$ 2 T:Mode$Phase | Phase$ Upkeep | WerewolfUntransformCondition$ True | TriggerZones$ Battlefield | Execute$ TrigTransform | TriggerDescription$ At the beginning of each upkeep, if a player cast two or more spells last turn, transform CARDNAME. -SVar:Picture1:http://www.wizards.com/global/images/magic/general/tovolars_magehunter.jpg +SVar:TrigTransform:AB$SetState | Cost$ 0 | Defined$ Self | Mode$ Transform +SVar:Picture:http://www.wizards.com/global/images/magic/general/tovolars_magehunter.jpg SetInfo:DKA|Rare|http://magiccards.info/scans/en/dka/98b.jpg Oracle:Whenever an opponent casts a spell, Tovolar's Magehunter deals 2 damage to that player.\nAt the beginning of each upkeep, if a player cast two or more spells last turn, transform Tovolar's Magehunter. End \ No newline at end of file diff --git a/res/cardsfolder/n/nezumi_graverobber_nighteyes_the_desecrator.txt b/res/cardsfolder/n/nezumi_graverobber_nighteyes_the_desecrator.txt index da60d2b03e3..b35ac57457a 100644 --- a/res/cardsfolder/n/nezumi_graverobber_nighteyes_the_desecrator.txt +++ b/res/cardsfolder/n/nezumi_graverobber_nighteyes_the_desecrator.txt @@ -22,7 +22,7 @@ Types:Legendary Creature Rat Wizard Text:no text PT:4/2 A:AB$ ChangeZone | Cost$ 4 B | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | ValidTgts$ Creature | TgtPrompt$ Select target creature. | SpellDescription$ Put target creature card from a graveyard onto the battlefield under your control. -SVar:Picture1:http://www.wizards.com/global/images/magic/general/nighteyes_the_desecrator.jpg +SVar:Picture:http://www.wizards.com/global/images/magic/general/nighteyes_the_desecrator.jpg SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/129b.jpg #SetInfo:COM|Uncommon|http://magiccards.info/scans/en/cmd/92b.jpg Oracle:{4}{B}: Put target creature card from a graveyard onto the battlefield under your control. diff --git a/res/cardsfolder/n/nezumi_shortfang_stabwhisker_the_odious.txt b/res/cardsfolder/n/nezumi_shortfang_stabwhisker_the_odious.txt index a0c7ecbb360..a77fd4d6268 100644 --- a/res/cardsfolder/n/nezumi_shortfang_stabwhisker_the_odious.txt +++ b/res/cardsfolder/n/nezumi_shortfang_stabwhisker_the_odious.txt @@ -24,7 +24,7 @@ SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | Defined$ TriggeredPlayer | LifeAmount$ SVar:X:SVar$Z/Minus.Y SVar:Y:Count$InOppHand SVar:Z:Number$3 -SVar:Picture1:http://www.wizards.com/global/images/magic/general/stabwhisker_the_odious.jpg +SVar:Picture:http://www.wizards.com/global/images/magic/general/stabwhisker_the_odious.jpg SetInfo:CHK|Rare|http://magiccards.info/scans/en/chk/131b.jpg Oracle:At the beginning of each opponent's upkeep, that player loses 1 life for each card fewer than three in his or her hand. End \ No newline at end of file diff --git a/res/cardsfolder/n/nurturing_licid.txt b/res/cardsfolder/n/nurturing_licid.txt index 978607617c9..616e306dca7 100644 --- a/res/cardsfolder/n/nurturing_licid.txt +++ b/res/cardsfolder/n/nurturing_licid.txt @@ -7,8 +7,6 @@ A:AB$ SetState | Cost$ G T | Defined$ Self | NewState$ Alternate | SubAbility$ D SVar:DBAttach:DB$ Attach | Cost$ 0 | ValidTgts$ Creature | AILogic$ Pump #If the value of AlternateMode isn't Flip or DoubleFaced, it will be the name of the state defined below, so you can switch to it with SetState+NewState$.The name of the first state defined is always "Original". AlternateMode:Alternate - -#Shared SVar:RemAIDeck:True SVar:Rarity:Uncommon SVar:Picture:http://www.wizards.com/global/images/magic/general/nurturing_licid.jpg @@ -26,5 +24,9 @@ K:Enchant creature A:SP$ Attach | Cost$ 0 | ValidTgts$ Creature | AILogic$ Pump A:AB$ Regenerate | Cost$ G | Defined$ Enchanted | SpellDescription$ Regenerate enchanted creature. A:AB$ SetState | Cost$ G | Defined$ Self | NewState$ Original | SpellDescription$ End this effect. - +SVar:RemAIDeck:True +SVar:Rarity:Uncommon +SVar:Picture:http://www.wizards.com/global/images/magic/general/nurturing_licid.jpg +SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/136.jpg +Oracle:{G}, {T}: Nurturing Licid loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {G} to end this effect./n{G}: Regenerate enchanted creature. End \ No newline at end of file diff --git a/res/cardsfolder/o/orochi_eggwatcher_shidako_broodmistress.txt b/res/cardsfolder/o/orochi_eggwatcher_shidako_broodmistress.txt index ff8f58cc121..3fe07d919ab 100644 --- a/res/cardsfolder/o/orochi_eggwatcher_shidako_broodmistress.txt +++ b/res/cardsfolder/o/orochi_eggwatcher_shidako_broodmistress.txt @@ -21,7 +21,7 @@ Text:no text PT:3/3 A:AB$Pump | Cost$ G Sac<1/Creature> | Tgt$ TgtC | NumAtt$ 3 | NumDef$ 3 | SpellDescription$ Target creature gets +3/+3 until end of turn. SVar:Rarity:Rare -SVar:Picture1:http://www.wizards.com/global/images/magic/general/shidako_broodmistress.jpg +SVar:Picture:http://www.wizards.com/global/images/magic/general/shidako_broodmistress.jpg SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/233b.jpg Oracle:{G}, Sacrifice a creature: Target creature gets +3/+3 until end of turn. End \ No newline at end of file diff --git a/res/cardsfolder/p/phantasmal_image.txt b/res/cardsfolder/p/phantasmal_image.txt index ff55e17299a..ca43d79e465 100644 --- a/res/cardsfolder/p/phantasmal_image.txt +++ b/res/cardsfolder/p/phantasmal_image.txt @@ -1,12 +1,16 @@ Name:Phantasmal Image ManaCost:1 U Types:Creature Illusion -Text:You may have Phantasmal Image enter the battlefield as a copy of any creature on the battlefield, except it's an Illusion in addition to its other types and it gains "When this creature becomes the target of a spell or ability, sacrifice it." +Text:no text PT:0/0 -SVar:NeedsToPlayVar:Y GE1 -SVar:Y:Count$Valid Creature +# Make Svars for granting abilities and triggers on clones distinct to avoid SVars getting overwritten when cloning a clone +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ ChooseCreature | Static$ True | TriggerDescription$ You may have CARDNAME enter the battlefield as a copy of any creature on the battlefield, except it's an Illusion in addition to its other types and it gains "When this creature becomes the target of a spell or ability, sacrifice it." +SVar:ChooseCreature:AB$ ChooseCard | Cost$ 0 | Defined$ You | Amount$ 1 | Choices$ Creature.Other | SubAbility$ DBCopy | RememberChosen$ True +SVar:DBCopy:DB$ Clone | Defined$ Remembered | AddTypes$ Illusion | AddTriggers$ PhantasmalImageTgtTrig | AddSVars$ PhantasmalImageSac +SVar:PhantasmalImageTgtTrig:Mode$ BecomesTarget | ValidTarget$ Card.Self | Execute$ PhantasmalImageSac | TriggerDescription$ When this creature becomes the target of a spell or ability, sacrifice it. +SVar:PhantasmalImageSac:AB$Sacrifice | Cost$ 0 | Defined$ Self SVar:Rarity:Rare SVar:Picture:http://www.wizards.com/global/images/magic/general/phantasmal_image.jpg SetInfo:M12|Rare|http://magiccards.info/scans/en/m12/72.jpg Oracle:You may have Phantasmal Image enter the battlefield as a copy of any creature on the battlefield, except it's an Illusion in addition to its other types and it gains "When this creature becomes the target of a spell or ability, sacrifice it." -End \ No newline at end of file +End diff --git a/res/cardsfolder/p/phyrexian_metamorph.txt b/res/cardsfolder/p/phyrexian_metamorph.txt index 6c94f4e3d72..810705c334c 100644 --- a/res/cardsfolder/p/phyrexian_metamorph.txt +++ b/res/cardsfolder/p/phyrexian_metamorph.txt @@ -1,8 +1,11 @@ Name:Phyrexian Metamorph ManaCost:3 PU Types:Artifact Creature Shapeshifter -Text:You may have CARDNAME enter the battlefield as a copy of any artifact or creature on the battlefield, except it's an artifact in addition to its other types. +Text:no text PT:0/0 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ ChooseCreature | Static$ True | TriggerDescription$ You may have CARDNAME enter the battlefield as a copy of any artifact or creature on the battlefield, except it's an artifact in addition to its other types. +SVar:ChooseCreature:AB$ ChooseCard | Cost$ 0 | Defined$ You | Amount$ 1 | Choices$ Creature.Other,Artifact.Other | SubAbility$ DBCopy | RememberChosen$ True +SVar:DBCopy:DB$ Clone | Defined$ Remembered | AddTypes$ Artifact SVar:Rarity:Rare SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_metamorph.jpg SetInfo:NPH|Rare|http://magiccards.info/scans/en/nph/42.jpg diff --git a/res/cardsfolder/q/quickening_licid.txt b/res/cardsfolder/q/quickening_licid.txt index 1d7e58adb67..47de74ce8ad 100644 --- a/res/cardsfolder/q/quickening_licid.txt +++ b/res/cardsfolder/q/quickening_licid.txt @@ -7,8 +7,6 @@ A:AB$ SetState | Cost$ 1 W T | Defined$ Self | NewState$ Alternate | SubAbility$ SVar:DBAttach:DB$ Attach | Cost$ 0 | ValidTgts$ Creature | AILogic$ Pump #If the value of AlternateMode isn't Flip or DoubleFaced, it will be the name of the state defined below, so you can switch to it with SetState+NewState$.The name of the first state defined is always "Original". AlternateMode:Alternate - -#Shared SVar:RemAIDeck:True SVar:Rarity:Uncommon SVar:Picture:http://www.wizards.com/global/images/magic/general/quickening_licid.jpg @@ -26,5 +24,9 @@ K:Enchant creature A:SP$ Attach | Cost$ 0 | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddKeyword$ First Strike | Description$ Enchanted creature has first strike. A:AB$ SetState | Cost$ W | Defined$ Self | NewState$ Original | SpellDescription$ End this effect. - +SVar:RemAIDeck:True +SVar:Rarity:Uncommon +SVar:Picture:http://www.wizards.com/global/images/magic/general/quickening_licid.jpg +SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/248.jpg +Oracle:{1}{W}, {T}: Quickening Licid loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {W} to end this effect.\nEnchanted creature has first strike. End \ No newline at end of file diff --git a/res/cardsfolder/q/quicksilver_gargantuan.txt b/res/cardsfolder/q/quicksilver_gargantuan.txt index 32b3d082d55..1ac1eba19e7 100644 --- a/res/cardsfolder/q/quicksilver_gargantuan.txt +++ b/res/cardsfolder/q/quicksilver_gargantuan.txt @@ -1,8 +1,11 @@ Name:Quicksilver Gargantuan ManaCost:5 U U Types:Creature Shapeshifter -Text:You may have CARDNAME enter the battlefield as a copy of any creature on the battlefield. It's still 7/7. +Text:no text PT:7/7 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ ChooseCreature | Static$ True | TriggerDescription$ You may have CARDNAME enter the battlefield as a copy of any creature on the battlefield. It's still 7/7. +SVar:ChooseCreature:AB$ ChooseCard | Cost$ 0 | Defined$ You | Amount$ 1 | Choices$ Creature.Other | SubAbility$ DBCopy | RememberChosen$ True +SVar:DBCopy:DB$ Clone | Defined$ Remembered | SetPower$ 7 | SetToughness$ 7 SVar:Rarity:Rare SVar:Picture:http://www.wizards.com/global/images/magic/general/quicksilver_gargantuan.jpg SetInfo:SOM|Mythic|http://magiccards.info/scans/en/som/39.jpg diff --git a/res/cardsfolder/r/ravenous_demon_archdemon_of_greed.txt b/res/cardsfolder/r/ravenous_demon_archdemon_of_greed.txt index c169425365e..8ed01209eff 100644 --- a/res/cardsfolder/r/ravenous_demon_archdemon_of_greed.txt +++ b/res/cardsfolder/r/ravenous_demon_archdemon_of_greed.txt @@ -25,7 +25,7 @@ SVar:DBTap:DB$ Tap | Cost$ 0 | Defined$ Self | ConditionCheckSVar$ X | Condition SVar:DBDamage:DB$ DealDamage | Cost$ 0 | Defined$ You | NumDmg$ 9 | ConditionCheckSVar$ X | ConditionSVarCompare$ LT1 | SubAbility$ DBCleanup | References$ X SVar:DBCleanup:DB$Cleanup | ClearRemembered$ True SVar:X:Remembered$Amount -SVar:Picture1:http://www.wizards.com/global/images/magic/general/archdemon_of_greed.jpg +SVar:Picture:http://www.wizards.com/global/images/magic/general/archdemon_of_greed.jpg SetInfo:DKA|Rare|http://magiccards.info/scans/en/dka/71b.jpg Oracle:At the beginning of your upkeep, sacrifice a Human. If you can't, tap Archdemon of Greed and it deals 9 damage to you. End \ No newline at end of file diff --git a/res/cardsfolder/r/reckless_waif_merciless_predator.txt b/res/cardsfolder/r/reckless_waif_merciless_predator.txt index 64b96b5292c..4d469ea1a8b 100644 --- a/res/cardsfolder/r/reckless_waif_merciless_predator.txt +++ b/res/cardsfolder/r/reckless_waif_merciless_predator.txt @@ -4,14 +4,12 @@ Types:Creature Human Rogue Werewolf Text:no text PT:1/1 T:Mode$Phase | Phase$ Upkeep | WerewolfTransformCondition$ True | TriggerZones$ Battlefield | Execute$ TrigTransform | TriggerDescription$ At the beginning of each upkeep, if no spells were cast last turn, transform CARDNAME. +SVar:TrigTransform:AB$SetState | Cost$ 0 | Defined$ Self | Mode$ Transform AlternateMode:DoubleFaced SVar:Picture:http://www.wizards.com/global/images/magic/general/reckless_waif.jpg SetInfo:ISD|Uncommon|http://magiccards.info/scans/en/isd/159a.jpg Oracle:At the beginning of each upkeep, if no spells were cast last turn, transform Reckless Waif. -#Shared -SVar:TrigTransform:AB$SetState | Cost$ 0 | Defined$ Self | Mode$ Transform - ALTERNATE Name:Merciless Predator @@ -21,7 +19,8 @@ Types:Creature Werewolf Text:no text PT:3/2 T:Mode$Phase | Phase$ Upkeep | WerewolfUntransformCondition$ True | TriggerZones$ Battlefield | Execute$ TrigTransform | TriggerDescription$ At the beginning of each upkeep, if a player cast two or more spells last turn, transform CARDNAME. -SVar:Picture1:http://www.wizards.com/global/images/magic/general/merciless_predator.jpg +SVar:TrigTransform:AB$SetState | Cost$ 0 | Defined$ Self | Mode$ Transform +SVar:Picture:http://www.wizards.com/global/images/magic/general/merciless_predator.jpg SetInfo:ISD|Uncommon|http://magiccards.info/scans/en/isd/159b.jpg Oracle:At the beginning of each upkeep, if a player cast two or more spells last turn, transform Merciless Predator. End \ No newline at end of file diff --git a/res/cardsfolder/r/rune_tail_kitsune_ascendant_rune_tails_essence.txt b/res/cardsfolder/r/rune_tail_kitsune_ascendant_rune_tails_essence.txt index bc03920b761..8453bf215b3 100644 --- a/res/cardsfolder/r/rune_tail_kitsune_ascendant_rune_tails_essence.txt +++ b/res/cardsfolder/r/rune_tail_kitsune_ascendant_rune_tails_essence.txt @@ -18,7 +18,7 @@ Colors:white Types:Legendary Enchantment Text:no text S:Mode$ Continuous | Affected$ Creature.YouCtrl | AddHiddenKeyword$ HIDDEN Prevent all damage that would be dealt to CARDNAME. | Description$ Prevent all damage that would be dealt to creatures you control. -SVar:Picture1:http://www.marc-fowler-design.com/cardforge/flippedcards/SOK/rune_tails_essence.jpg +SVar:Picture:http://www.marc-fowler-design.com/cardforge/flippedcards/SOK/rune_tails_essence.jpg # This link may be a temporary solution and could change in the near future. SetInfo:SOK|Rare|http://magiccards.info/scans/en/sok/166.jpg Oracle:Prevent all damage that would be dealt to creatures you control. diff --git a/res/cardsfolder/s/sakashima_the_impostor.txt b/res/cardsfolder/s/sakashima_the_impostor.txt index fe594d31587..b7bc2516e14 100644 --- a/res/cardsfolder/s/sakashima_the_impostor.txt +++ b/res/cardsfolder/s/sakashima_the_impostor.txt @@ -1,8 +1,14 @@ Name:Sakashima the Impostor ManaCost:2 U U Types:Legendary Creature Human Rogue -Text:You may have CARDNAME enter the battlefield as a copy of any creature on the battlefield, except its name is still CARDNAME, it's legendary in addition to its other types, and it gains "2 U U: Return CARDNAME to its owner's hand at the beginning of the next end step." +Text:no text PT:3/1 +# Make Svars for granting abilities and triggers on clones distinct to avoid SVars getting overwritten when cloning a clone +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ ChooseCreature | Static$ True | TriggerDescription$ You may have CARDNAME enter the battlefield as a copy of any creature on the battlefield, except its name is still CARDNAME, it's legendary in addition to its other types, and it gains "2 U U: Return CARDNAME to its owner's hand at the beginning of the next end step." +SVar:ChooseCreature:AB$ ChooseCard | Cost$ 0 | Defined$ You | Amount$ 1 | Choices$ Creature.Other | SubAbility$ DBCopy | RememberChosen$ True +SVar:DBCopy:DB$ Clone | Defined$ Remembered | KeepName$ True | AddTypes$ Legendary | AddAbilities$ ReturnSakashima | AddSVars$ TrigReturnSak +SVar:ReturnSakashima:AB$ DelayedTrigger | Cost$ 2 U U | Mode$ Phase | Phase$ End of Turn | Execute$ TrigReturnSak | SpellDescription$ Return CARDNAME to it's owners hand at the beginning of the next end step. +SVar:TrigReturnSak:AB$ChangeZone | Cost$ 0 | Defined$ Self | Origin$ Battlefield | Destination$ Hand SVar:Rarity:Rare SVar:Picture:http://www.wizards.com/global/images/magic/general/sakashima_the_impostor.jpg Oracle:You may have Sakashima the Impostor enter the battlefield as a copy of any creature on the battlefield, except its name is still Sakashima the Impostor, it's legendary in addition to its other types, and it gains "{2}{U}{U}: Return Sakashima the Impostor to its owner's hand at the beginning of the next end step." diff --git a/res/cardsfolder/s/sakashimas_student.txt b/res/cardsfolder/s/sakashimas_student.txt new file mode 100644 index 00000000000..4a355a91b06 --- /dev/null +++ b/res/cardsfolder/s/sakashimas_student.txt @@ -0,0 +1,14 @@ +Name:Sakashima's Student +ManaCost:2 U U +Types:Creature Human Ninja +Text:no text +PT:0/0 +A:AB$ ChangeZone | Cost$ 1 U Return<1/Creature.attacking+unblocked> | CostDesc$ Ninjutsu 1 U | ActivationZone$ Hand | Origin$ Hand | Ninjutsu$ True | Destination$ Battlefield | Defined$ Self | SpellDescription$ (1 U, Return an unblocked attacker you control to hand: Put this card onto the battlefield from your hand tapped and attacking.) +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ ChooseCreature | Static$ True | TriggerDescription$ You may have CARDNAME enter the battlefield as a copy of any creature on the battlefield, except it's still a Ninja in addition to its other creature types. +SVar:ChooseCreature:AB$ ChooseCard | Cost$ 0 | Defined$ You | Amount$ 1 | Choices$ Creature.Other | SubAbility$ DBCopy | RememberChosen$ True +SVar:DBCopy:DB$ Clone | Defined$ Remembered | AddTypes$ Ninja +SVar:Rarity:Rare +SVar:Picture:http://www.wizards.com/global/images/magic/general/sakashimas_student.jpg +SetInfo:PC2|Rare|http://magiccards.info/scans/en/pc2/24.jpg +Oracle:Ninjutsu {1}{U} ({1}{U}, Return an unblocked attacker you control to hand: Put this card onto the battlefield from your hand tapped and attacking.)\nYou may have Sakashima's Student enter the battlefield as a copy of any creature on the battlefield, except it's still a Ninja in addition to its other creature types. +End \ No newline at end of file diff --git a/res/cardsfolder/s/scorned_villager_moonscarred_werewolf.txt b/res/cardsfolder/s/scorned_villager_moonscarred_werewolf.txt index 7c420c65a67..c2acdc72f5f 100644 --- a/res/cardsfolder/s/scorned_villager_moonscarred_werewolf.txt +++ b/res/cardsfolder/s/scorned_villager_moonscarred_werewolf.txt @@ -5,14 +5,12 @@ Text:no text PT:1/1 A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. T:Mode$Phase | Phase$ Upkeep | WerewolfTransformCondition$ True | TriggerZones$ Battlefield | Execute$ TrigTransform | TriggerDescription$ At the beginning of each upkeep, if no spells were cast last turn, transform CARDNAME. +SVar:TrigTransform:AB$SetState | Cost$ 0 | Defined$ Self | Mode$ Transform AlternateMode:DoubleFaced SVar:Picture:http://www.wizards.com/global/images/magic/general/scorned_villager.jpg SetInfo:DKA|Common|http://magiccards.info/scans/en/dka/125a.jpg Oracle:{T}: Add {G} to your mana pool.\nAt the beginning of each upkeep, if no spells were cast last turn, transform Scorned Villager. -#Shared -SVar:TrigTransform:AB$SetState | Cost$ 0 | Defined$ Self | Mode$ Transform - ALTERNATE Name:Moonscarred Werewolf @@ -24,7 +22,8 @@ PT:2/2 K:Vigilance A:AB$ Mana | Cost$ T | Produced$ G | Amount$ 2 | SpellDescription$ Add G G to your mana pool. T:Mode$Phase | Phase$ Upkeep | WerewolfUntransformCondition$ True | TriggerZones$ Battlefield | Execute$ TrigTransform | TriggerDescription$ At the beginning of each upkeep, if a player cast two or more spells last turn, transform CARDNAME. -SVar:Picture1:http://www.wizards.com/global/images/magic/general/moonscarred_werewolf.jpg +SVar:TrigTransform:AB$SetState | Cost$ 0 | Defined$ Self | Mode$ Transform +SVar:Picture:http://www.wizards.com/global/images/magic/general/moonscarred_werewolf.jpg SetInfo:DKA|Common|http://magiccards.info/scans/en/dka/125b.jpg Oracle:Vigilance\n{T}: Add {G}{G} to your mana pool.\nAt the beginning of each upkeep, if a player cast two or more spells last turn, transform Moonscarred Werewolf. End \ No newline at end of file diff --git a/res/cardsfolder/s/screeching_bat_stalking_vampire.txt b/res/cardsfolder/s/screeching_bat_stalking_vampire.txt index 7c7f34d855b..985914c9cb0 100644 --- a/res/cardsfolder/s/screeching_bat_stalking_vampire.txt +++ b/res/cardsfolder/s/screeching_bat_stalking_vampire.txt @@ -5,14 +5,12 @@ Text:no text PT:2/2 K:Flying T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigTransform | OptionalDecider$ You | TriggerDescription$ At the beginning of your upkeep, you may pay 2 B B. If you do, transform CARDNAME. +SVar:TrigTransform:AB$SetState | Cost$ 2 B B | Defined$ Self | Mode$ Transform AlternateMode:DoubleFaced SVar:Picture:http://www.wizards.com/global/images/magic/general/screeching_bat.jpg Oracle:Flying\nAt the beginning of your upkeep, you may pay {2}{B}{B}. If you do, transform Screeching Bat.\n----\nStalking Vampire\n(Black)\nCreature - Vampire\n5/5\nAt the beginning of your upkeep, you may pay {2}{B}{B}. If you do, transform Stalking Vampire. SetInfo:ISD|Uncommon|http://magiccards.info/scans/en/isd/114a.jpg -#Shared -SVar:TrigTransform:AB$SetState | Cost$ 2 B B | Defined$ Self | Mode$ Transform - ALTERNATE Name:Stalking Vampire @@ -22,7 +20,8 @@ Types:Creature Vampire Text:no text PT:5/5 T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigTransform | OptionalDecider$ You | TriggerDescription$ At the beginning of your upkeep, you may pay 2 B B. If you do, transform CARDNAME. -SVar:Picture1:http://www.wizards.com/global/images/magic/general/stalking_vampire.jpg +SVar:TrigTransform:AB$SetState | Cost$ 2 B B | Defined$ Self | Mode$ Transform +SVar:Picture:http://www.wizards.com/global/images/magic/general/stalking_vampire.jpg Oracle:Creature - Vampire\n5/5\nAt the beginning of your upkeep, you may pay {2}{B}{B}. If you do, transform Stalking Vampire. SetInfo:ISD|Uncommon|http://magiccards.info/scans/en/isd/114b.jpg End \ No newline at end of file diff --git a/res/cardsfolder/s/sculpting_steel.txt b/res/cardsfolder/s/sculpting_steel.txt index afda4dc780a..9d0cf4c7d5c 100644 --- a/res/cardsfolder/s/sculpting_steel.txt +++ b/res/cardsfolder/s/sculpting_steel.txt @@ -1,7 +1,10 @@ Name:Sculpting Steel ManaCost:3 Types:Artifact -Text:You may have CARDNAME enter the battlefield as a copy of any artifact on the battlefield. +Text:no text +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ ChooseArtifact | Static$ True | TriggerDescription$ You may have CARDNAME enter the battlefield as a copy of any artifact on the battlefield. +SVar:ChooseArtifact:AB$ ChooseCard | Cost$ 0 | Defined$ You | Amount$ 1 | Choices$ Artifact.Other | SubAbility$ DBCopy | RememberChosen$ True +SVar:DBCopy:DB$ Clone | Defined$ Remembered SVar:Rarity:Rare SVar:Picture:http://www.wizards.com/global/images/magic/general/sculpting_steel.jpg SetInfo:MRD|Rare|http://magiccards.info/scans/en/mi/238.jpg diff --git a/res/cardsfolder/s/shapeshifters_marrow.txt b/res/cardsfolder/s/shapeshifters_marrow.txt new file mode 100644 index 00000000000..bfd98967109 --- /dev/null +++ b/res/cardsfolder/s/shapeshifters_marrow.txt @@ -0,0 +1,13 @@ +Name:Shapeshifter's Marrow +ManaCost:2 U U +Types:Enchantment +Text:no text +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Opponent | Execute$ TrigDig | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of each opponent's upkeep, that player reveals the top card of his or her library. If it's a creature card, the player puts the card into his or her graveyard and CARDNAME becomes a copy of that card. (If it does, it loses this ability.) +SVar:TrigDig:AB$ Dig | Cost$ 0 | Defined$ TriggeredPlayer | DigNum$ 1 | Reveal$ True | ChangeNum$ All | ChangeValid$ Creature | RememberChanged$ True | DestinationZone$ Graveyard | DestinationZone2$ Library | LibraryPosition2$ 0 | SubAbility$ DBCopy +SVar:DBCopy:DB$ Clone | Defined$ Remembered | ConditionDefined$ Remembered | ConditionPresent$ Creature | ConditionCompare$ EQ1 | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:Rarity:Rare +SVar:Picture:http://www.wizards.com/global/images/magic/general/shapeshifters_marrow.jpg +SetInfo:FUT|Rare|http://magiccards.info/scans/en/fut/58.jpg +Oracle:At the beginning of each opponent's upkeep, that player reveals the top card of his or her library. If it's a creature card, the player puts the card into his or her graveyard and Shapeshifter's Marrow becomes a copy of that card. (If it does, it loses this ability.) +End \ No newline at end of file diff --git a/res/cardsfolder/s/soul_seizer_ghastly_haunting.txt b/res/cardsfolder/s/soul_seizer_ghastly_haunting.txt index 74fb2d50bea..47958e74c12 100644 --- a/res/cardsfolder/s/soul_seizer_ghastly_haunting.txt +++ b/res/cardsfolder/s/soul_seizer_ghastly_haunting.txt @@ -22,7 +22,7 @@ Text:You control enchanted creature. K:Enchant creature A:SP$ Attach | Cost$ 0 | ValidTgts$ Creature | AILogic$ GainControl SVar:RemAIDeck:True -SVar:Picture1:http://www.wizards.com/global/images/magic/general/ghastly_haunting.jpg +SVar:Picture:http://www.wizards.com/global/images/magic/general/ghastly_haunting.jpg SetInfo:DKA|Uncommon|http://magiccards.info/scans/en/dka/50b.jpg Oracle:Enchant creature\nYou control enchanted creature. End \ No newline at end of file diff --git a/res/cardsfolder/s/stinging_licid.txt b/res/cardsfolder/s/stinging_licid.txt index 58a627e74b6..cb35f0bd7fd 100644 --- a/res/cardsfolder/s/stinging_licid.txt +++ b/res/cardsfolder/s/stinging_licid.txt @@ -7,8 +7,6 @@ A:AB$ SetState | Cost$ 1 U T | Defined$ Self | NewState$ Alternate | SubAbility$ SVar:DBAttach:DB$ Attach | Cost$ 0 | ValidTgts$ Creature | AILogic$ Curse #If the value of AlternateMode isn't Flip or DoubleFaced, it will be the name of the state defined below, so you can switch to it with SetState+NewState$.The name of the first state defined is always "Original". AlternateMode:Alternate - -#Shared SVar:RemAIDeck:True SVar:Rarity:Uncommon SVar:Picture:http://www.wizards.com/global/images/magic/general/stinging_licid.jpg @@ -27,5 +25,9 @@ A:SP$ Attach | Cost$ 0 | ValidTgts$ Creature | AILogic$ Curse T:Mode$ Taps | ValidCard$ Card.AttachedBy | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever enchanted creature becomes tapped, CARDNAME deals 2 damage to that creature's controller. SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Defined$ TriggeredCardController | NumDmg$ 2 A:AB$ SetState | Cost$ U | Defined$ Self | NewState$ Original | SpellDescription$ End this effect. - +SVar:RemAIDeck:True +SVar:Rarity:Uncommon +SVar:Picture:http://www.wizards.com/global/images/magic/general/stinging_licid.jpg +SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/91.jpg +Oracle:{1}{U}, {T}: Stinging Licid loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {U} to end this effect.\nWhenever enchanted creature becomes tapped, Stinging Licid deals 2 damage to that creature's controller. End \ No newline at end of file diff --git a/res/cardsfolder/s/student_of_elements_tobita_master_of_winds.txt b/res/cardsfolder/s/student_of_elements_tobita_master_of_winds.txt index 54100abff7f..a76d98ad20c 100644 --- a/res/cardsfolder/s/student_of_elements_tobita_master_of_winds.txt +++ b/res/cardsfolder/s/student_of_elements_tobita_master_of_winds.txt @@ -19,7 +19,7 @@ Types:Legendary Creature Human Wizard Text:no text PT:3/3 S:Mode$Continuous | Affected$ Creature.YouCtrl | AddKeyword$ Flying | Description$ Creatures you control have flying. -SVar:Picture1:http://www.wizards.com/global/images/magic/general/tobita_master_of_winds.jpg +SVar:Picture:http://www.wizards.com/global/images/magic/general/tobita_master_of_winds.jpg SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/310.jpg Oracle:Creatures you control have flying. diff --git a/res/cardsfolder/t/tempting_licid.txt b/res/cardsfolder/t/tempting_licid.txt index 054a8d0fad3..50ba2dbc3c1 100644 --- a/res/cardsfolder/t/tempting_licid.txt +++ b/res/cardsfolder/t/tempting_licid.txt @@ -7,8 +7,6 @@ A:AB$ SetState | Cost$ G T | Defined$ Self | NewState$ Alternate | SubAbility$ D SVar:DBAttach:DB$ Attach | Cost$ 0 | ValidTgts$ Creature | AILogic$ Pump #If the value of AlternateMode isn't Flip or DoubleFaced, it will be the name of the state defined below, so you can switch to it with SetState+NewState$.The name of the first state defined is always "Original". AlternateMode:Alternate - -#Shared SVar:RemAIDeck:True SVar:Rarity:Uncommon SVar:Picture:http://www.wizards.com/global/images/magic/general/tempting_licid.jpg @@ -26,5 +24,9 @@ K:Enchant creature A:SP$ Attach | Cost$ 0 | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddHiddenKeyword$ HIDDEN All creatures able to block CARDNAME do so. | Description$ All creatures able to block enchanted creature do so. A:AB$ SetState | Cost$ G | Defined$ Self | NewState$ Original | SpellDescription$ End this effect. - +SVar:RemAIDeck:True +SVar:Rarity:Uncommon +SVar:Picture:http://www.wizards.com/global/images/magic/general/tempting_licid.jpg +SetInfo:STH|Uncommon|http://magiccards.info/scans/en/sh/72.jpg +Oracle:{G}, {T}: CARDNAME loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {G} to end this effect.\nAll creatures able to block enchanted creature do so. End \ No newline at end of file diff --git a/res/cardsfolder/t/thraben_sentry_thraben_militia.txt b/res/cardsfolder/t/thraben_sentry_thraben_militia.txt index c524d7b6dd6..4b46e3e46c9 100644 --- a/res/cardsfolder/t/thraben_sentry_thraben_militia.txt +++ b/res/cardsfolder/t/thraben_sentry_thraben_militia.txt @@ -20,7 +20,7 @@ Types:Creature Human Soldier Text:no text PT:5/4 K:Trample -SVar:Picture1:http://www.wizards.com/global/images/magic/general/thraben_militia.jpg +SVar:Picture:http://www.wizards.com/global/images/magic/general/thraben_militia.jpg SetInfo:ISD|Common|http://magiccards.info/scans/en/isd/38b.jpg Oracle:Trample End \ No newline at end of file diff --git a/res/cardsfolder/t/tormented_pariah_rampaging_werewolf.txt b/res/cardsfolder/t/tormented_pariah_rampaging_werewolf.txt index b30c006f6a4..65beba840a1 100644 --- a/res/cardsfolder/t/tormented_pariah_rampaging_werewolf.txt +++ b/res/cardsfolder/t/tormented_pariah_rampaging_werewolf.txt @@ -4,14 +4,12 @@ Types:Creature Human Warrior Werewolf Text:no text PT:3/2 T:Mode$Phase | Phase$ Upkeep | WerewolfTransformCondition$ True | TriggerZones$ Battlefield | Execute$ TrigTransform | TriggerDescription$ At the beginning of each upkeep, if no spells were cast last turn, transform CARDNAME. +SVar:TrigTransform:AB$SetState | Cost$ 0 | Defined$ Self | Mode$ Transform AlternateMode:DoubleFaced SVar:Picture:http://www.wizards.com/global/images/magic/general/tormented_pariah.jpg SetInfo:ISD|Common|http://magiccards.info/scans/en/isd/165a.jpg Oracle:At the beginning of each upkeep, if no spells were cast last turn, transform Tormented Pariah. -#Shared -SVar:TrigTransform:AB$SetState | Cost$ 0 | Defined$ Self | Mode$ Transform - ALTERNATE Name:Rampaging Werewolf @@ -21,7 +19,8 @@ Types:Creature Werewolf Text:no text PT:6/4 T:Mode$Phase | Phase$ Upkeep | WerewolfUntransformCondition$ True | TriggerZones$ Battlefield | Execute$ TrigTransform | TriggerDescription$ At the beginning of each upkeep, if a player cast two or more spells last turn, transform CARDNAME. -SVar:Picture1:http://www.wizards.com/global/images/magic/general/rampaging_werewolf.jpg +SVar:TrigTransform:AB$SetState | Cost$ 0 | Defined$ Self | Mode$ Transform +SVar:Picture:http://www.wizards.com/global/images/magic/general/rampaging_werewolf.jpg SetInfo:ISD|Common|http://magiccards.info/scans/en/isd/165b.jpg Oracle:At the beginning of each upkeep, if a player cast two or more spells last turn, transform Rampaging Werewolf. End \ No newline at end of file diff --git a/res/cardsfolder/t/transmogrifying_licid.txt b/res/cardsfolder/t/transmogrifying_licid.txt index 7e4a395447d..103b0de3ced 100644 --- a/res/cardsfolder/t/transmogrifying_licid.txt +++ b/res/cardsfolder/t/transmogrifying_licid.txt @@ -7,8 +7,6 @@ A:AB$ SetState | Cost$ 1 T | Defined$ Self | NewState$ Alternate | SubAbility$ D SVar:DBAttach:DB$ Attach | Cost$ 0 | ValidTgts$ Creature | AILogic$ Pump #If the value of AlternateMode isn't Flip or DoubleFaced, it will be the name of the state defined below, so you can switch to it with SetState+NewState$.The name of the first state defined is always "Original". AlternateMode:Alternate - -#Shared SVar:RemAIDeck:True SVar:Rarity:Uncommon SVar:Picture:http://www.wizards.com/global/images/magic/general/transmogrifying_licid.jpg @@ -25,5 +23,9 @@ K:Enchant creature A:SP$ Attach | Cost$ 0 | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 1 | AddToughness$ 1 | AddType$ Artifact | Description$ Enchanted creature gets +1/+1 and is an artifact in addition to its other types. A:AB$ SetState | Cost$ 1 | Defined$ Self | NewState$ Original | SpellDescription$ End this effect. - +SVar:RemAIDeck:True +SVar:Rarity:Uncommon +SVar:Picture:http://www.wizards.com/global/images/magic/general/transmogrifying_licid.jpg +SetInfo:EXO|Uncommon|http://magiccards.info/scans/en/ex/141.jpg +Oracle:{1}, {T}: Transmogrifying Licid loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {1} to end this effect.\nEnchanted creature gets +1/+1 and is an artifact in addition to its other types. End \ No newline at end of file diff --git a/res/cardsfolder/u/ulvenwald_mystics_ulvenwald_primordials.txt b/res/cardsfolder/u/ulvenwald_mystics_ulvenwald_primordials.txt index 412cf342dbf..90b590d88f4 100644 --- a/res/cardsfolder/u/ulvenwald_mystics_ulvenwald_primordials.txt +++ b/res/cardsfolder/u/ulvenwald_mystics_ulvenwald_primordials.txt @@ -4,14 +4,12 @@ Types:Creature Human Shaman Werewolf Text:no text PT:3/3 T:Mode$Phase | Phase$ Upkeep | WerewolfTransformCondition$ True | TriggerZones$ Battlefield | Execute$ TrigTransform | TriggerDescription$ At the beginning of each upkeep, if no spells were cast last turn, transform CARDNAME. +SVar:TrigTransform:AB$SetState | Cost$ 0 | Defined$ Self | Mode$ Transform SVar:Picture:http://www.wizards.com/global/images/magic/general/ulvenwald_mystics.jpg AlternateMode:DoubleFaced SetInfo:ISD|Uncommon|http://magiccards.info/scans/en/isd/208a.jpg Oracle:At the beginning of each upkeep, if no spells were cast last turn, transform Ulvenwald Mystics. -#Shared -SVar:TrigTransform:AB$SetState | Cost$ 0 | Defined$ Self | Mode$ Transform - ALTERNATE Name:Ulvenwald Primordials @@ -22,7 +20,8 @@ Text:no text PT:5/5 A:AB$ Regenerate | Cost$ G | SpellDescription$ Regenerate CARDNAME. T:Mode$Phase | Phase$ Upkeep | WerewolfUntransformCondition$ True | TriggerZones$ Battlefield | Execute$ TrigTransform | TriggerDescription$ At the beginning of each upkeep, if a player cast two or more spells last turn, transform CARDNAME. -SVar:Picture1:http://www.wizards.com/global/images/magic/general/ulvenwald_primordials.jpg +SVar:TrigTransform:AB$SetState | Cost$ 0 | Defined$ Self | Mode$ Transform +SVar:Picture:http://www.wizards.com/global/images/magic/general/ulvenwald_primordials.jpg SetInfo:ISD|Uncommon|http://magiccards.info/scans/en/isd/208b.jpg Oracle:{G}: Regenerate Ulvenwald Primordials.\nAt the beginning of each upkeep, if a player cast two or more spells last turn, transform Ulvenwald Primordials. End \ No newline at end of file diff --git a/res/cardsfolder/u/unstable_shapeshifter.txt b/res/cardsfolder/u/unstable_shapeshifter.txt new file mode 100644 index 00000000000..59d42179dc0 --- /dev/null +++ b/res/cardsfolder/u/unstable_shapeshifter.txt @@ -0,0 +1,14 @@ +Name:Unstable Shapeshifter +ManaCost:3 U +Types:Creature Shapeshifter +Text:no text +PT:0/1 +# Make SVars for granting abilities and triggers on clones distinct to avoid SVars getting overwritten when cloning a clone +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Other | TriggerZones$ Battlefield | Execute$ USCopy | TriggerDescription$ Whenever another creature enters the battlefield, CARDNAME becomes a copy of that creature and gains this ability. +SVar:USCopy:AB$ Clone | Cost$ 0 | Defined$ TriggeredCard | AddTriggers$ USTrig | AddSVars$ USCopy,USTrig +SVar:USTrig:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Other | TriggerZones$ Battlefield | Execute$ USCopy | TriggerDescription$ Whenever another creature enters the battlefield, CARDNAME becomes a copy of that creature and gains this ability. +SVar:Rarity:Rare +SVar:Picture:http://www.wizards.com/global/images/magic/general/unstable_shapeshifter.jpg +SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/100.jpg +Oracle:Whenever another creature enters the battlefield, Unstable Shapeshifter becomes a copy of that creature and gains this ability. +End \ No newline at end of file diff --git a/res/cardsfolder/v/vesuva.txt b/res/cardsfolder/v/vesuva.txt new file mode 100644 index 00000000000..b44c7345f10 --- /dev/null +++ b/res/cardsfolder/v/vesuva.txt @@ -0,0 +1,12 @@ +Name:Vesuva +ManaCost:no cost +Types:Land +Text:no text +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ ChooseLand | Static$ True | TriggerDescription$ You may have CARDNAME enter the battlefield tapped as a copy of any land on the battlefield. +SVar:ChooseLand:AB$ ChooseCard | Cost$ 0 | Defined$ You | Amount$ 1 | Choices$ Land.Other | SubAbility$ DBCopy | RememberChosen$ True +SVar:DBCopy:DB$ Clone | Defined$ Remembered | IntoPlayTapped$ True +SVar:Rarity:Rare +SVar:Picture:http://www.wizards.com/global/images/magic/general/vesuva.jpg +SetInfo:TSP|Rare|http://magiccards.info/scans/en/ts/281.jpg +Oracle:You may have Vesuva enter the battlefield tapped as a copy of any land on the battlefield. +End \ No newline at end of file diff --git a/res/cardsfolder/v/vesuvan_doppelganger.txt b/res/cardsfolder/v/vesuvan_doppelganger.txt index f8027209e1b..c6318837d32 100644 --- a/res/cardsfolder/v/vesuvan_doppelganger.txt +++ b/res/cardsfolder/v/vesuvan_doppelganger.txt @@ -1,8 +1,14 @@ Name:Vesuvan Doppelganger ManaCost:3 U U Types:Creature Shapeshifter -Text:You may have CARDNAME enter the battlefield as a copy of any creature on the battlefield except it doesn't copy that creature's color and it gains "At the beginning of your upkeep, you may have this creature become a copy of target creature except it doesn't copy that creature's color. If you do, this creature gains this ability." +Text:no text PT:0/0 +# Make Svars for granting abilities and triggers on clones distinct to avoid SVars getting overwritten when cloning a clone +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ ChooseCreature | Static$ True | TriggerDescription$ You may have CARDNAME enter the battlefield as a copy of any creature on the battlefield except it doesn't copy that creature's color and it gains "At the beginning of your upkeep, you may have this creature become a copy of target creature except it doesn't copy that creature's color. If you do, this creature gains this ability." +SVar:ChooseCreature:AB$ ChooseCard | Cost$ 0 | Defined$ You | Amount$ 1 | Choices$ Creature.Other | SubAbility$ DBCopy | RememberChosen$ True +SVar:DBCopy:DB$ Clone | Defined$ Remembered | Colors$ Blue | OverwriteColors$ True | AddTriggers$ VesDopUpkeepTrig | AddSVars$ VesDopCopy,VesDopUpkeepTrig +SVar:VesDopUpkeepTrig:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ VesDopCopy | TriggerDescription$ At the beginning of your upkeep, you may have this creature become a copy of target creature except it doesn't copy that creature's color. If you do, this creature gains this ability. +SVar:VesDopCopy:AB$ Clone | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature to copy. | Optional$ True | Colors$ Blue | OverwriteColors$ True | AddTriggers$ VesDopUpkeepTrig | AddSVars$ VesDopCopy,VesDopUpkeepTrig | SubAbility$ DBCleanup SVar:RemAIDeck:True SVar:Rarity:Rare SVar:Picture:http://www.wizards.com/global/images/magic/general/vesuvan_doppelganger.jpg diff --git a/res/cardsfolder/v/village_ironsmith_ironfang.txt b/res/cardsfolder/v/village_ironsmith_ironfang.txt index 0653aef41f4..850129b649d 100644 --- a/res/cardsfolder/v/village_ironsmith_ironfang.txt +++ b/res/cardsfolder/v/village_ironsmith_ironfang.txt @@ -5,14 +5,12 @@ Text:no text PT:1/1 K:First Strike T:Mode$Phase | Phase$ Upkeep | WerewolfTransformCondition$ True | TriggerZones$ Battlefield | Execute$ TrigTransform | TriggerDescription$ At the beginning of each upkeep, if no spells were cast last turn, transform CARDNAME. +SVar:TrigTransform:AB$SetState | Cost$ 0 | Defined$ Self | Mode$ Transform AlternateMode:DoubleFaced SVar:Picture:http://www.wizards.com/global/images/magic/general/village_ironsmith.jpg SetInfo:ISD|Common|http://magiccards.info/scans/en/isd/168a.jpg Oracle:First Strike\nAt the beginning of each upkeep, if no spells were cast last turn, transform Village Ironsmith. -#Shared -SVar:TrigTransform:AB$SetState | Cost$ 0 | Defined$ Self | Mode$ Transform - ALTERNATE Name:Ironfang @@ -23,7 +21,8 @@ Text:no text PT:3/1 K:First Strike T:Mode$Phase | Phase$ Upkeep | WerewolfUntransformCondition$ True | TriggerZones$ Battlefield | Execute$ TrigTransform | TriggerDescription$ At the beginning of each upkeep, if a player cast two or more spells last turn, transform CARDNAME. -SVar:Picture1:http://www.wizards.com/global/images/magic/general/ironfang.jpg +SVar:TrigTransform:AB$SetState | Cost$ 0 | Defined$ Self | Mode$ Transform +SVar:Picture:http://www.wizards.com/global/images/magic/general/ironfang.jpg SetInfo:ISD|Common|http://magiccards.info/scans/en/isd/168b.jpg Oracle:First Strike\nAt the beginning of each upkeep, if a player cast two or more spells last turn, transform Ironfang. End \ No newline at end of file diff --git a/res/cardsfolder/v/villagers_of_estwald_howlpack_of_estwald.txt b/res/cardsfolder/v/villagers_of_estwald_howlpack_of_estwald.txt index 81f774b7194..d6d93a7891f 100644 --- a/res/cardsfolder/v/villagers_of_estwald_howlpack_of_estwald.txt +++ b/res/cardsfolder/v/villagers_of_estwald_howlpack_of_estwald.txt @@ -4,14 +4,12 @@ Types:Creature Human Werewolf Text:no text PT:2/3 T:Mode$Phase | Phase$ Upkeep | WerewolfTransformCondition$ True | TriggerZones$ Battlefield | Execute$ TrigTransform | TriggerDescription$ At the beginning of each upkeep, if no spells were cast last turn, transform CARDNAME. +SVar:TrigTransform:AB$SetState | Cost$ 0 | Defined$ Self | Mode$ Transform AlternateMode:DoubleFaced SVar:Picture:http://www.wizards.com/global/images/magic/general/villagers_of_estwald.jpg SetInfo:ISD|Common|http://magiccards.info/scans/en/isd/209a.jpg Oracle:At the beginning of each upkeep, if no spells were cast last turn, transform Villagers of Estwald. -#Shared -SVar:TrigTransform:AB$SetState | Cost$ 0 | Defined$ Self | Mode$ Transform - ALTERNATE Name:Howlpack of Estwald @@ -21,7 +19,8 @@ Types:Creature Werewolf Text:no text PT:4/6 T:Mode$Phase | Phase$ Upkeep | WerewolfUntransformCondition$ True | TriggerZones$ Battlefield | Execute$ TrigTransform | TriggerDescription$ At the beginning of each upkeep, if a player cast two or more spells last turn, transform CARDNAME. -SVar:Picture1:http://www.wizards.com/global/images/magic/general/howlpack_of_estwald.jpg +SVar:TrigTransform:AB$SetState | Cost$ 0 | Defined$ Self | Mode$ Transform +SVar:Picture:http://www.wizards.com/global/images/magic/general/howlpack_of_estwald.jpg SetInfo:ISD|Common|http://magiccards.info/scans/en/isd/209b.jpg Oracle:At the beginning of each upkeep, if a player cast two or more spells last turn, transform Howlpack of Estwald. End \ No newline at end of file diff --git a/res/cardsfolder/w/wolfbitten_captive_krallenhorde_killer.txt b/res/cardsfolder/w/wolfbitten_captive_krallenhorde_killer.txt index dc025b0bc47..c77a98dea45 100644 --- a/res/cardsfolder/w/wolfbitten_captive_krallenhorde_killer.txt +++ b/res/cardsfolder/w/wolfbitten_captive_krallenhorde_killer.txt @@ -5,14 +5,12 @@ Text:no text PT:1/1 A:AB$ Pump | Cost$ 1 G | NumAtt$ +2 | NumDef$ +2 | ActivationLimit$ 1 | SpellDescription$ CARDNAME gets +2/+2 until end of turn. Activate this ability only once each turn. T:Mode$Phase | Phase$ Upkeep | WerewolfTransformCondition$ True | TriggerZones$ Battlefield | Execute$ TrigTransform | TriggerDescription$ At the beginning of each upkeep, if no spells were cast last turn, transform CARDNAME. +SVar:TrigTransform:AB$SetState | Cost$ 0 | Defined$ Self | Mode$ Transform AlternateMode:DoubleFaced SVar:Picture:http://www.wizards.com/global/images/magic/general/wolfbitten_captive.jpg SetInfo:DKA|Rare|http://magiccards.info/scans/en/dka/133a.jpg Oracle:{1}{G}: Wolfbitten Captive gets +2/+2 until end of turn. Activate this ability only once each turn.\nAt the beginning of each upkeep, if no spells were cast last turn, transform Wolfbitten Captive. -#Shared -SVar:TrigTransform:AB$SetState | Cost$ 0 | Defined$ Self | Mode$ Transform - ALTERNATE Name:Krallenhorde Killer @@ -23,7 +21,8 @@ Text:no text PT:2/2 A:AB$ Pump | Cost$ 3 G | NumAtt$ +4 | NumDef$ +4 | ActivationLimit$ 1 | SpellDescription$ CARDNAME gets +4/+4 until end of turn. Activate this ability only once each turn. T:Mode$Phase | Phase$ Upkeep | WerewolfUntransformCondition$ True | TriggerZones$ Battlefield | Execute$ TrigTransform | TriggerDescription$ At the beginning of each upkeep, if a player cast two or more spells last turn, transform CARDNAME. -SVar:Picture1:http://www.wizards.com/global/images/magic/general/krallenhorde_killer.jpg +SVar:TrigTransform:AB$SetState | Cost$ 0 | Defined$ Self | Mode$ Transform +SVar:Picture:http://www.wizards.com/global/images/magic/general/krallenhorde_killer.jpg SetInfo:DKA|Rare|http://magiccards.info/scans/en/dka/133b.jpg Oracle:{3}{G}: Krallenhorde Killer gets +4/+4 until end of turn. Activate this ability only once each turn.\nAt the beginning of each upkeep, if a player cast two or more spells last turn, transform Krallenhorde Killer. End \ No newline at end of file diff --git a/res/preferences/main.properties b/res/preferences/main.properties index 0d6c7b62185..5371ab70a70 100644 --- a/res/preferences/main.properties +++ b/res/preferences/main.properties @@ -58,10 +58,10 @@ draft--properties=../draft/draft.properties lang--transparent-properties=../lang/lang.properties -image/base--file=../pics -image/token--file=../pics/tokens -image/icon--file=../pics/icons -image/product--file=../pics_product +image/base--file=C:/forge/pics +image/token--file=C:/forge/pics/tokens +image/icon--file=../../../pics/icons +image/product--file=../../../pics_product pics/booster/images--file=../quest/booster-images.txt quest/opponent/icons--file=../quest/quest-opponent-icons.txt diff --git a/src/main/java/forge/Card.java b/src/main/java/forge/Card.java index fd9ba5d7adf..975c1963337 100644 --- a/src/main/java/forge/Card.java +++ b/src/main/java/forge/Card.java @@ -80,7 +80,8 @@ public class Card extends GameEntity implements Comparable { private CardCharactersticName preTFDCharacteristic = CardCharactersticName.Original; private boolean isDoubleFaced = false; - private boolean isFlip = false; + private boolean isFlipCard = false; + private boolean isFlipped = false; private CardCharactersticName otherTransformable = null; private ZoneType castFrom = null; @@ -222,7 +223,7 @@ public class Card extends GameEntity implements Comparable { private Card haunting = null; private Card effectSource = null; - private Map sVars = new TreeMap(); + //private Map sVars = new TreeMap(); // hacky code below, used to limit the number of times an ability // can be used per turn like Vampire Bats @@ -455,22 +456,42 @@ public class Card extends GameEntity implements Comparable { } /** - * Checks if is flip. + * Checks if is flip card. * - * @return the isFlip + * @return the isFlipCard */ - public final boolean isFlip() { - return this.isFlip; + public final boolean isFlipCard() { + return this.isFlipCard; } /** - * Sets the flip. + * Sets the flip card. * * @param isFlip0 * the isFlip to set */ - public final void setFlip(final boolean isFlip0) { - this.isFlip = isFlip0; + public final void setFlipCard(final boolean isFlip0) { + this.isFlipCard = isFlip0; + } + + /** + * + * Checks if card status is flipped. + * + * @return the flipped + */ + public final boolean isFlipped() { + return this.isFlipped; + } + + /** + * Sets a cards flipped status. + * + * @param newStatus + * boolean with new flipped status + */ + public final void setFlipStaus(final boolean newStatus) { + this.isFlipped = newStatus; } /** @@ -665,6 +686,27 @@ public class Card extends GameEntity implements Comparable { return newtrig; } + /** + *

+ * addTrigger. + *

+ * + * @param t + * a {@link forge.card.trigger.Trigger} object. + * + * @param state + * a {@link forge.CardCharactersticName} object. + * + * @return a {@link forge.card.trigger.Trigger} object. + */ + public final Trigger addTrigger(final Trigger t, final CardCharactersticName state) { + final Trigger newtrig = t.getCopy(); + newtrig.setHostCard(this); + CardCharacteristics stateCharacteristics = this.getState(state); + stateCharacteristics.getTriggers().add(newtrig); + return newtrig; + } + /** * * moveTrigger. @@ -691,6 +733,22 @@ public class Card extends GameEntity implements Comparable { this.getCharacteristics().getTriggers().remove(t); } + /** + *

+ * removeTrigger. + *

+ * + * @param t + * a {@link forge.card.trigger.Trigger} object. + * + * @param state + * a {@link forge.CardCharactersticName} object. + */ + public final void removeTrigger(final Trigger t, final CardCharactersticName state) { + CardCharacteristics stateCharacteristics = this.getState(state); + stateCharacteristics.getTriggers().remove(t); + } + /** *

* Getter for the field triggers. @@ -1459,11 +1517,7 @@ public class Card extends GameEntity implements Comparable { * @return a {@link java.lang.String} object. */ public final String getSVar(final String var) { - if (this.sVars.containsKey(var)) { - return this.sVars.get(var); - } else { - return ""; - } + return this.getCharacteristics().getSVar(var); } /** @@ -1477,11 +1531,7 @@ public class Card extends GameEntity implements Comparable { * a {@link java.lang.String} object. */ public final void setSVar(final String var, final String str) { - if (this.sVars.containsKey(var)) { - this.sVars.remove(var); - } - - this.sVars.put(var, str); + this.getCharacteristics().setSVar(var, str); } /** @@ -1492,7 +1542,7 @@ public class Card extends GameEntity implements Comparable { * @return a Map object. */ public final Map getSVars() { - return this.sVars; + return this.getCharacteristics().getSVars(); } /** @@ -1504,7 +1554,7 @@ public class Card extends GameEntity implements Comparable { * a Map object. */ public final void setSVars(final Map newSVars) { - this.sVars = newSVars; + this.getCharacteristics().setSVars(newSVars); } /** @@ -2766,6 +2816,27 @@ public class Card extends GameEntity implements Comparable { } } + /** + *

+ * addSpellAbility. + *

+ * + * @param a + * a {@link forge.card.spellability.SpellAbility} object. + * + * @param state + * a {@link forge.CardCharactersticName} object. + */ + public final void addSpellAbility(final SpellAbility a, final CardCharactersticName state) { + a.setSourceCard(this); + CardCharacteristics stateCharacteristics = this.getState(state); + if (a instanceof AbilityMana) { + stateCharacteristics.getManaAbility().add((AbilityMana) a); + } else { + stateCharacteristics.getSpellAbility().add(a); + } + } + /** *

* removeSpellAbility. @@ -2784,6 +2855,28 @@ public class Card extends GameEntity implements Comparable { } } + /** + *

+ * removeSpellAbility. + *

+ * + * @param a + * a {@link forge.card.spellability.SpellAbility} object. + * + * @param state + * a {@link forge.CardCharactersticName} object. + */ + public final void removeSpellAbility(final SpellAbility a, final CardCharactersticName state) { + CardCharacteristics stateCharacteristics = this.getState(state); + if (a instanceof AbilityMana) { + // if (a.isExtrinsic()) //never remove intrinsic mana abilities, is + // this the way to go?? + stateCharacteristics.getManaAbility().remove(a); + } else { + stateCharacteristics.getSpellAbility().remove(a); + } + } + /** *

* removeAllExtrinsicManaAbilities. @@ -5516,6 +5609,30 @@ public class Card extends GameEntity implements Comparable { } } + /** + * Adds the static ability. + * + * @param s + * the s + * + * @param state + * a {@link forge.CardCharactersticName} object. + * + * @return a {@link forge.card.staticability.StaticAbility} object. + */ + public final StaticAbility addStaticAbility(final String s, final CardCharactersticName state) { + + if (s.trim().length() != 0) { + final StaticAbility stAb = new StaticAbility(s, this); + CardCharacteristics stateCharacteristics = this.getState(state); + stateCharacteristics.getStaticAbilities().add(stAb); + return stAb; + } + else { + return null; + } + } + /** *

* isPermanent. @@ -6435,7 +6552,7 @@ public class Card extends GameEntity implements Comparable { return false; } } else if (property.equals("Flip")) { - if (!this.isFlip) { + if (!this.isFlipCard) { return false; } } else if (property.startsWith("YouCtrl")) { @@ -8415,8 +8532,9 @@ public class Card extends GameEntity implements Comparable { * @return an int */ public final int getFoil() { - if (this.sVars.containsKey("Foil")) { - return Integer.parseInt(this.sVars.get("Foil")); + final String foil = this.getCharacteristics().getSVar("Foil"); + if (!foil.isEmpty()) { + return Integer.parseInt(foil); } return 0; } @@ -8429,7 +8547,7 @@ public class Card extends GameEntity implements Comparable { * an int */ public final void setFoil(final int f) { - this.sVars.put("Foil", Integer.toString(f)); + this.getCharacteristics().setSVar("Foil", Integer.toString(f)); } /** diff --git a/src/main/java/forge/CardReader.java b/src/main/java/forge/CardReader.java index 3e03a3ec80a..33fbc11bb01 100644 --- a/src/main/java/forge/CardReader.java +++ b/src/main/java/forge/CardReader.java @@ -481,7 +481,7 @@ public class CardReader implements Runnable { // 8/18/11 11:08 PM } else if (line.equals("ALTERNATE")) { CardCharactersticName mode; - if (card.isFlip()) { + if (card.isFlipCard()) { mode = CardCharactersticName.Flipped; } else if (card.isDoubleFaced()) { mode = CardCharactersticName.Transformed; @@ -494,7 +494,7 @@ public class CardReader implements Runnable { //System.out.println(card.getName()); final CardCharactersticName value = CardCharactersticName.smartValueOf(line.substring("AlternateMode:".length())); if (value == CardCharactersticName.Flipped) { - card.setFlip(true); + card.setFlipCard(true); } else if (value == CardCharactersticName.Transformed) { card.setDoubleFaced(true); } else { diff --git a/src/main/java/forge/GameAction.java b/src/main/java/forge/GameAction.java index ef1c20d8581..a6963f5012f 100644 --- a/src/main/java/forge/GameAction.java +++ b/src/main/java/forge/GameAction.java @@ -157,6 +157,13 @@ public class GameAction { c.switchStates(CardCharactersticName.Cloner, CardCharactersticName.Original); c.setState(CardCharactersticName.Original); c.clearStates(CardCharactersticName.Cloner); + if (c.isFlipCard()) { + c.clearStates(CardCharactersticName.Flipped); + } + } + // reset flip status when card leaves battlefield + if (zoneFrom.is(ZoneType.Battlefield)) { + c.setFlipStaus(false); } AllZone.getTriggerHandler().clearSuppression(TriggerType.Transformed); copied = AllZone.getCardFactory().copyCard(c); diff --git a/src/main/java/forge/card/CardCharacteristics.java b/src/main/java/forge/card/CardCharacteristics.java index 81776108a15..f7ef5fc5a2c 100644 --- a/src/main/java/forge/card/CardCharacteristics.java +++ b/src/main/java/forge/card/CardCharacteristics.java @@ -19,6 +19,8 @@ package forge.card; import java.util.ArrayList; import java.util.List; +import java.util.Map; +import java.util.TreeMap; import forge.CardColor; import forge.card.replacement.ReplacementEffect; @@ -50,6 +52,7 @@ public class CardCharacteristics { private String imageFilename = ""; private String imageName = ""; private ArrayList sets = new ArrayList(); + private Map sVars = new TreeMap(); /** * Gets the name. @@ -388,4 +391,104 @@ public class CardCharacteristics { public void setReplacementEffects(ArrayList replacementEffects0) { this.replacementEffects = replacementEffects0; } + + /** + *

+ * getSVar. + *

+ * + * @param var + * a {@link java.lang.String} object. + * @return a {@link java.lang.String} object. + */ + public final String getSVar(final String var) { + if (this.sVars.containsKey(var)) { + return this.sVars.get(var); + } else { + return ""; + } + } + + /** + *

+ * setSVar. + *

+ * + * @param var + * a {@link java.lang.String} object. + * @param str + * a {@link java.lang.String} object. + */ + public final void setSVar(final String var, final String str) { + if (this.sVars.containsKey(var)) { + this.sVars.remove(var); + } + + this.sVars.put(var, str); + } + + /** + *

+ * getSVars. + *

+ * + * @return a Map object. + */ + public final Map getSVars() { + return this.sVars; + } + + /** + *

+ * setSVars. + *

+ * + * @param newSVars + * a Map object. + */ + public final void setSVars(final Map newSVars) { + this.sVars = newSVars; + } + + /** + *

+ * copy. + *

+ * + * @param source + * a Map object. + */ + public final void copy(final CardCharacteristics source) { + // Makes a "deeper" copy of a CardCharacteristics object + + // String name : just copy reference + this.name = source.getName(); + // ArrayList type : list of String objects so use copy constructor + this.type = new ArrayList(source.getType()); + // CardManaCost manaCost : not sure if a deep copy is needed + this.manaCost = source.getManaCost(); + // ArrayList cardColor : not sure if a deep copy is needed + this.cardColor = new ArrayList(source.getCardColor()); + // boolean cardColorsOverridden : set value + this.cardColorsOverridden = source.isCardColorsOverridden(); + // int baseAttack : set value + this.baseAttack = source.getBaseAttack(); + // int baseDefense : set value + this.baseDefense = source.getBaseDefense(); + // ArrayList intrinsicKeyword : list of String objects so use copy constructor + this.intrinsicKeyword = new ArrayList(source.getIntrinsicKeyword()); + // ArrayList intrinsicAbility : list of String objects so use copy constructor + this.intrinsicAbility = new ArrayList(source.getIntrinsicAbility()); + // ArrayList staticAbilityStrings : list of String objects so use copy constructor + this.staticAbilityStrings = new ArrayList(source.getStaticAbilityStrings()); + // String imageFilename = copy reference + this.imageFilename = source.getImageFilename(); + // String imageName = ""; + this.imageName = source.getImageName(); + // ArrayList sets : deep copy not needed, just copy reference + this.sets = source.getSets(); + // Map sVars + this.sVars = new TreeMap(source.getSVars()); + + } } diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactory.java b/src/main/java/forge/card/abilityfactory/AbilityFactory.java index 3e30e230319..6742cb35787 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactory.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactory.java @@ -563,6 +563,14 @@ public class AbilityFactory { } } + else if (this.api.equals("Clone")) { + if (this.isAb) { + spellAbility = AbilityFactoryClone.createAbilityClone(this); + } else if (this.isDb) { + spellAbility = AbilityFactoryClone.createDrawbackClone(this); + } + } + else if (this.api.equals("CopyPermanent")) { if (this.isAb) { spellAbility = AbilityFactoryCopy.createAbilityCopyPermanent(this); @@ -1832,12 +1840,21 @@ public class AbilityFactory { } } else if (defined.startsWith("Triggered") && (sa != null)) { final SpellAbility root = sa.getRootSpellAbility(); - final Object crd = root.getTriggeringObject(defined.substring(9)); - if (crd instanceof Card) { - c = AllZoneUtil.getCardState((Card) crd); - } else if (crd instanceof CardList) { - for (final Card cardItem : (CardList) crd) { - cards.add(cardItem); + if (defined.contains("LKICopy")) { //TriggeredCardLKICopy + final Object crd = root.getTriggeringObject(defined.substring(9, 13)); + if (crd instanceof Card) { + c = (Card) crd; + } + } + else { + final Object crd = root.getTriggeringObject(defined.substring(9)); + if (crd instanceof Card) { + c = AllZoneUtil.getCardState((Card) crd); + c = (Card) crd; + } else if (crd instanceof CardList) { + for (final Card cardItem : (CardList) crd) { + cards.add(cardItem); + } } } } else if (defined.startsWith("Replaced") && (sa != null)) { diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryChoose.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryChoose.java index 4a55c4f9cad..b4746e4cb5a 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryChoose.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryChoose.java @@ -1893,8 +1893,11 @@ public final class AbilityFactoryChoose { } else { tgtPlayers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa); } - - CardList choices = AllZoneUtil.getCardsIn(ZoneType.Battlefield); + ZoneType choiceZone = ZoneType.Battlefield; + if (params.containsKey("ChoiceZone")) { + choiceZone = ZoneType.smartValueOf(params.get("ChoiceZone")); + } + CardList choices = AllZoneUtil.getCardsIn(choiceZone); if (params.containsKey("Choices")) { choices = choices.getValidCards(params.get("Choices"), host.getController(), host); } diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryClone.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryClone.java new file mode 100644 index 00000000000..ba5c2b2001c --- /dev/null +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryClone.java @@ -0,0 +1,674 @@ +/* + * Forge: Play Magic: the Gathering. + * Copyright (C) 2011 Forge Team + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package forge.card.abilityfactory; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +import forge.AllZone; +import forge.AllZoneUtil; +import forge.Card; +import forge.CardCharactersticName; +import forge.CardColor; +import forge.CardList; +import forge.CardUtil; +import forge.GameActionUtil; +import forge.Singletons; +import forge.card.CardCharacteristics; +import forge.card.cardfactory.AbstractCardFactory; +import forge.card.cardfactory.CardFactoryUtil; +import forge.card.cost.Cost; +import forge.card.spellability.AbilityActivated; +import forge.card.spellability.AbilitySub; +import forge.card.spellability.Spell; +import forge.card.spellability.SpellAbility; +import forge.card.spellability.Target; +import forge.card.trigger.Trigger; +import forge.card.trigger.TriggerHandler; +import forge.card.trigger.TriggerType; +import forge.game.phase.PhaseType; +import forge.game.player.ComputerUtil; +import forge.game.zone.ZoneType; + +/** + *

+ * AbilityFactoryClone class. + *

+ * + * @author Forge + * @version $Id: AbilityFactoryClone.java 15541 2012-05-14 11:47:16Z Sloth $ + */ +public final class AbilityFactoryClone { + + private AbilityFactoryClone() { + throw new AssertionError(); + } + + // ************************************************************** + // *************************** Clone **************************** + // ************************************************************** + + /** + *

+ * createAbilityClone. + *

+ * + * @param af + * a {@link forge.card.abilityfactory.AbilityFactory} object. + * @return a {@link forge.card.spellability.SpellAbility} object. + */ + public static SpellAbility createAbilityClone(final AbilityFactory af) { + class AbilityClone extends AbilityActivated { + public AbilityClone(final Card ca, final Cost co, final Target t) { + super(ca, co, t); + } + + @Override + public AbilityActivated getCopy() { + AbilityActivated res = new AbilityClone(getSourceCard(), + getPayCosts(), getTarget() == null ? null : new Target(getTarget())); + CardFactoryUtil.copySpellAbility(this, res); + return res; + } + + private static final long serialVersionUID = 1938171749867734123L; + + @Override + public boolean canPlayAI() { + return AbilityFactoryClone.cloneCanPlayAI(af, this); + } + + @Override + public void resolve() { + AbilityFactoryClone.cloneResolve(af, this); + } + + @Override + public String getStackDescription() { + return AbilityFactoryClone.cloneStackDescription(af, this); + } + + @Override + public boolean doTrigger(final boolean mandatory) { + return AbilityFactoryClone.cloneTriggerAI(af, this, mandatory); + } + } + + final SpellAbility abClone = new AbilityClone(af.getHostCard(), af.getAbCost(), af.getAbTgt()); + return abClone; + } + + /** + *

+ * createSpellClone. + *

+ * + * @param af + * a {@link forge.card.abilityfactory.AbilityFactory} object. + * @return a {@link forge.card.spellability.SpellAbility} object. + */ + public static SpellAbility createSpellClone(final AbilityFactory af) { + final SpellAbility spClone = new Spell(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { + private static final long serialVersionUID = -4047747186919390520L; + + @Override + public boolean canPlayAI() { + return AbilityFactoryClone.cloneCanPlayAI(af, this); + } + + @Override + public void resolve() { + AbilityFactoryClone.cloneResolve(af, this); + } + + @Override + public String getStackDescription() { + return AbilityFactoryClone.cloneStackDescription(af, this); + } + }; + return spClone; + } + + /** + *

+ * createDrawbackClone. + *

+ * + * @param af + * a {@link forge.card.abilityfactory.AbilityFactory} object. + * @return a {@link forge.card.spellability.SpellAbility} object. + */ + public static SpellAbility createDrawbackClone(final AbilityFactory af) { + class DrawbackClone extends AbilitySub { + public DrawbackClone(final Card ca, final Target t) { + super(ca, t); + } + + @Override + public AbilitySub getCopy() { + AbilitySub res = new DrawbackClone(getSourceCard(), + getTarget() == null ? null : new Target(getTarget())); + CardFactoryUtil.copySpellAbility(this, res); + return res; + } + + private static final long serialVersionUID = -8659938411435528741L; + + @Override + public void resolve() { + AbilityFactoryClone.cloneResolve(af, this); + } + + @Override + public boolean chkAIDrawback() { + return AbilityFactoryClone.clonePlayDrawbackAI(af, this); + } + + @Override + public String getStackDescription() { + return AbilityFactoryClone.cloneStackDescription(af, this); + } + + @Override + public boolean doTrigger(final boolean mandatory) { + return AbilityFactoryClone.cloneTriggerAI(af, this, mandatory); + } + } + + final SpellAbility dbClone = new DrawbackClone(af.getHostCard(), af.getAbTgt()); + return dbClone; + } + + /** + *

+ * cloneStackDescription. + *

+ * + * @param af + * a {@link forge.card.abilityfactory.AbilityFactory} object. + * @param sa + * a {@link forge.card.spellability.SpellAbility} object. + * @return a {@link java.lang.String} object. + */ + // TODO update this method + private static String cloneStackDescription(final AbilityFactory af, final SpellAbility sa) { + final HashMap params = af.getMapParams(); + + final StringBuilder sb = new StringBuilder(); + + if (sa instanceof AbilitySub) { + sb.append(" "); + } else { + sb.append(sa.getSourceCard().getName()).append(" - "); + } + + final Target tgt = sa.getTarget(); + ArrayList tgts; + if (tgt != null) { + tgts = tgt.getTargetCards(); + } else { + tgts = AbilityFactory.getDefinedCards(sa.getSourceCard(), params.get("Defined"), sa); + } + + sb.append(sa.getSourceCard()); + sb.append(" becomes a copy of "); + if (!tgts.isEmpty()) { + sb.append(tgts.get(0)).append("."); + } + else { + sb.append("target creature."); + } + + final AbilitySub abSub = sa.getSubAbility(); + if (abSub != null) { + sb.append(abSub.getStackDescription()); + } + + return sb.toString(); + } // end cloneStackDescription() + + /** + *

+ * cloneCanPlayAI. + *

+ * + * @param af + * a {@link forge.card.abilityfactory.AbilityFactory} object. + * @param sa + * a {@link forge.card.spellability.SpellAbility} object. + * @return a boolean. + */ + private static boolean cloneCanPlayAI(final AbilityFactory af, final SpellAbility sa) { + + final HashMap params = af.getMapParams(); + final Target tgt = sa.getTarget(); + final Card source = sa.getSourceCard(); + + boolean useAbility = true; + +// if (card.getController().isComputer()) { +// final CardList creatures = AllZoneUtil.getCreaturesInPlay(); +// if (!creatures.isEmpty()) { +// cardToCopy = CardFactoryUtil.getBestCreatureAI(creatures); +// } +// } + + // TODO - add some kind of check to answer + // "Am I going to attack with this?" + // TODO - add some kind of check for during human turn to answer + // "Can I use this to block something?" + + // don't use instant speed clone abilities outside computers + // Combat_Begin step + if (!Singletons.getModel().getGameState().getPhaseHandler().is(PhaseType.COMBAT_BEGIN) + && Singletons.getModel().getGameState().getPhaseHandler().isPlayerTurn(AllZone.getComputerPlayer()) && !AbilityFactory.isSorcerySpeed(sa) + && !params.containsKey("ActivationPhases") && !params.containsKey("Permanent")) { + return false; + } + + // don't use instant speed clone abilities outside humans + // Combat_Declare_Attackers_InstantAbility step + if ((!Singletons.getModel().getGameState().getPhaseHandler().is(PhaseType.COMBAT_DECLARE_ATTACKERS_INSTANT_ABILITY) || (AllZone.getCombat() + .getAttackers().isEmpty())) && Singletons.getModel().getGameState().getPhaseHandler().isPlayerTurn(AllZone.getHumanPlayer())) { + return false; + } + + // don't activate during main2 unless this effect is permanent + if (Singletons.getModel().getGameState().getPhaseHandler().is(PhaseType.MAIN2) && !params.containsKey("Permanent")) { + return false; + } + + if (null == tgt) { + final ArrayList defined = AbilityFactory.getDefinedCards(source, params.get("Defined"), sa); + + boolean bFlag = false; + for (final Card c : defined) { + bFlag |= (!c.isCreature() && !c.isTapped() && !(c.getTurnInZone() == Singletons.getModel().getGameState().getPhaseHandler().getTurn())); + + // for creatures that could be improved (like Figure of Destiny) + if (c.isCreature() && (params.containsKey("Permanent") || (!c.isTapped() && !c.isSick()))) { + int power = -5; + if (params.containsKey("Power")) { + power = AbilityFactory.calculateAmount(source, params.get("Power"), sa); + } + int toughness = -5; + if (params.containsKey("Toughness")) { + toughness = AbilityFactory.calculateAmount(source, params.get("Toughness"), sa); + } + if ((power + toughness) > (c.getCurrentPower() + c.getCurrentToughness())) { + bFlag = true; + } + } + + } + + if (!bFlag) { // All of the defined stuff is cloned, not very + // useful + return false; + } + } else { + tgt.resetTargets(); + useAbility &= AbilityFactoryClone.cloneTgtAI(af, sa); + } + + final AbilitySub subAb = sa.getSubAbility(); + if (subAb != null) { + useAbility &= subAb.chkAIDrawback(); + } + + return useAbility; + } // end cloneCanPlayAI() + + /** + *

+ * clonePlayDrawbackAI. + *

+ * + * @param af + * a {@link forge.card.abilityfactory.AbilityFactory} object. + * @param sa + * a {@link forge.card.spellability.SpellAbility} object. + * @return a boolean. + */ + private static boolean clonePlayDrawbackAI(final AbilityFactory af, final SpellAbility sa) { + // AI should only activate this during Human's turn + boolean chance = true; + + if (sa.getTarget() != null) { + chance = AbilityFactoryClone.cloneTgtAI(af, sa); + } + + final AbilitySub subAb = sa.getSubAbility(); + if (subAb != null) { + chance &= subAb.chkAIDrawback(); + } + + return chance; + } + + /** + *

+ * cloneTriggerAI. + *

+ * + * @param af + * a {@link forge.card.abilityfactory.AbilityFactory} object. + * @param sa + * a {@link forge.card.spellability.SpellAbility} object. + * @param mandatory + * a boolean. + * @return a boolean. + */ + private static boolean cloneTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + if (!ComputerUtil.canPayCost(sa)) { // If there is a cost payment + return false; + } + + boolean chance = true; + + if (sa.getTarget() != null) { + chance = AbilityFactoryClone.cloneTgtAI(af, sa); + } + + // Improve AI for triggers. If source is a creature with: + // When ETB, sacrifice a creature. Check to see if the AI has something + // to sacrifice + + // Eventually, we can call the trigger of ETB abilities with + // not mandatory as part of the checks to cast something + + final AbilitySub subAb = sa.getSubAbility(); + if (subAb != null) { + chance &= subAb.chkAIDrawback(); + } + + return chance || mandatory; + } + + /** + *

+ * cloneTgtAI. + *

+ * + * @param af + * a {@link forge.card.abilityfactory.AbilityFactory} object. + * @param sa + * a {@link forge.card.spellability.SpellAbility} object. + * @return a boolean. + */ + private static boolean cloneTgtAI(final AbilityFactory af, final SpellAbility sa) { + // This is reasonable for now. Kamahl, Fist of Krosa and a sorcery or + // two are the only things + // that clone a target. Those can just use SVar:RemAIDeck:True until + // this can do a reasonably + // good job of picking a good target + return false; + } + + /** + *

+ * cloneResolve. + *

+ * + * @param af + * a {@link forge.card.abilityfactory.AbilityFactory} object. + * @param sa + * a {@link forge.card.spellability.SpellAbility} object. + */ + private static void cloneResolve(final AbilityFactory af, final SpellAbility sa) { + final HashMap params = af.getMapParams(); + Card tgtCard; + final Card host = sa.getSourceCard(); + Map origSVars = host.getSVars(); + + + // find cloning source i.e. thing to be copied + Card cardToCopy = null; + final Target tgt = sa.getTarget(); + if (tgt != null) { + cardToCopy = tgt.getTargetCards().get(0); + } + else if (params.containsKey("Defined")) { + ArrayList cloneSources = AbilityFactory.getDefinedCards(host, params.get("Defined"), sa); + if (!cloneSources.isEmpty()) { + cardToCopy = cloneSources.get(0); + } + } + if (cardToCopy == null) { + return; + } + + final StringBuilder sb = new StringBuilder(); + sb.append("Do you want to copy " + cardToCopy + "?"); + boolean optional = params.containsKey("Optional"); + if (host.getController().isHuman() && optional + && !GameActionUtil.showYesNoDialog(host, sb.toString())) { + return; + } + + // find target of cloning i.e. card becoming a clone + ArrayList cloneTargets = AbilityFactory.getDefinedCards(host, params.get("CloneTarget"), sa); + if (!cloneTargets.isEmpty()) { + tgtCard = cloneTargets.get(0); + } + else { + tgtCard = host; + } + + String imageFileName = host.getImageFilename(); + + boolean keepName = params.containsKey("KeepName"); + String originalName = tgtCard.getName(); + boolean copyingSelf = (tgtCard == cardToCopy); + + AllZone.getTriggerHandler().suppressMode(TriggerType.Transformed); + + if (!copyingSelf) { + if (tgtCard.isCloned()) { // cloning again + tgtCard.switchStates(CardCharactersticName.Cloner, CardCharactersticName.Original); + tgtCard.setState(CardCharactersticName.Original); + tgtCard.clearStates(CardCharactersticName.Cloner); + } + // add "Cloner" state to clone + tgtCard.addAlternateState(CardCharactersticName.Cloner); + tgtCard.switchStates(CardCharactersticName.Original, CardCharactersticName.Cloner); + tgtCard.setState(CardCharactersticName.Original); + } + else { + //copy Original state to Cloned + tgtCard.addAlternateState(CardCharactersticName.Cloned); + tgtCard.switchStates(CardCharactersticName.Original, CardCharactersticName.Cloned); + if (tgtCard.isFlipCard()) { + tgtCard.setState(CardCharactersticName.Original); + } + } + + CardCharactersticName stateToCopy = null; + if (copyingSelf) { + stateToCopy = CardCharactersticName.Cloned; + } + else if (cardToCopy.isFlipCard()) { + stateToCopy = CardCharactersticName.Original; + } + else { + stateToCopy = cardToCopy.getCurState(); + } + + CardFactoryUtil.copyState(cardToCopy, stateToCopy, tgtCard); + // must call this before addAbilityFactoryAbilities so cloned added abilities are handled correctly + addExtraCharacteristics(tgtCard, params, origSVars); + CardFactoryUtil.addAbilityFactoryAbilities(tgtCard); + for (int i = 0; i < tgtCard.getStaticAbilityStrings().size(); i++) { + tgtCard.addStaticAbility(tgtCard.getStaticAbilityStrings().get(i)); + } + if (keepName) { + tgtCard.setName(originalName); + } + + // If target is a flipped card, also copy the flipped + // state. + if (cardToCopy.isFlipCard()) { + if (!copyingSelf) { + tgtCard.addAlternateState(CardCharactersticName.Flipped); + tgtCard.setState(CardCharactersticName.Flipped); + } + CardFactoryUtil.copyState(cardToCopy, CardCharactersticName.Flipped, tgtCard); + addExtraCharacteristics(tgtCard, params, origSVars); + CardFactoryUtil.addAbilityFactoryAbilities(tgtCard); + for (int i = 0; i < tgtCard.getStaticAbilityStrings().size(); i++) { + tgtCard.addStaticAbility(tgtCard.getStaticAbilityStrings().get(i)); + } + if (keepName) { + tgtCard.setName(originalName); + } + tgtCard.setFlipCard(true); + //keep the Clone card image for the cloned card + tgtCard.setImageFilename(imageFileName); + + if (!tgtCard.isFlipped()) { + tgtCard.setState(CardCharactersticName.Original); + } + } else { + tgtCard.setFlipCard(false); + } + + //Clean up copy of cloned state + if (copyingSelf) { + tgtCard.clearStates(CardCharactersticName.Cloned); + } + + AllZone.getTriggerHandler().clearSuppression(TriggerType.Transformed); + + //Clear Remembered and Imprint lists + tgtCard.clearRemembered(); + tgtCard.clearImprinted(); + + //keep the Clone card image for the cloned card + tgtCard.setImageFilename(imageFileName); + } // cloneResolve + + private static void addExtraCharacteristics(final Card tgtCard, final HashMap params, final Map origSVars) { + // additional types to clone + if (params.containsKey("AddTypes")) { + for (final String type : Arrays.asList(params.get("AddTypes").split(","))) { + tgtCard.addType(type); + } + } + + // triggers to add to clone + final ArrayList triggers = new ArrayList(); + if (params.containsKey("AddTriggers")) { + triggers.addAll(Arrays.asList(params.get("AddTriggers").split(","))); + for (final String s : triggers) { + if (origSVars.containsKey(s)) { + final String actualTrigger = origSVars.get(s); + final Trigger parsedTrigger = TriggerHandler.parseTrigger(actualTrigger, tgtCard, true); + tgtCard.addTrigger(parsedTrigger); + } + } + } + + // SVars to add to clone + if (params.containsKey("AddSVars")) { + for (final String s : Arrays.asList(params.get("AddSVars").split(","))) { + if (origSVars.containsKey(s)) { + final String actualsVar = origSVars.get(s); + tgtCard.setSVar(s, actualsVar); + } + } + } + + // abilities to add to clone + if (params.containsKey("AddAbilities")) { + for (final String s : Arrays.asList(params.get("AddAbilities").split(","))) { + if (origSVars.containsKey(s)) { + //final AbilityFactory newAF = new AbilityFactory(); + final String actualAbility = origSVars.get(s); + // final SpellAbility grantedAbility = newAF.getAbility(actualAbility, tgtCard); + // tgtCard.addSpellAbility(grantedAbility); + tgtCard.getIntrinsicAbilities().add(actualAbility); + } + } + } + + // keywords to add to clone + final ArrayList keywords = new ArrayList(); + if (params.containsKey("AddKeywords")) { + keywords.addAll(Arrays.asList(params.get("AddKeywords").split(" & "))); + // allow SVar substitution for keywords + for (int i = 0; i < keywords.size(); i++) { + final String k = keywords.get(i); + if (origSVars.containsKey(k)) { + keywords.add("\"" + k + "\""); + keywords.remove(k); + } + if (keywords.get(i).startsWith("HIDDEN")) { + tgtCard.addExtrinsicKeyword(keywords.get(i)); + } + else { + tgtCard.addIntrinsicKeyword(keywords.get(i)); + } + } + } + + // set power of clone + if (params.containsKey("IntoPlayTapped")) { + tgtCard.setTapped(true); + } + + // set power of clone + if (params.containsKey("SetPower")) { + String rhs = params.get("SetPower"); + int power = -1; + try { + power = Integer.parseInt(rhs); + } catch (final NumberFormatException e) { + power = CardFactoryUtil.xCount(tgtCard, tgtCard.getSVar(rhs)); + } + tgtCard.setBaseAttack(power); + } + + // set toughness of clone + if (params.containsKey("SetToughness")) { + String rhs = params.get("SetToughness"); + int toughness = -1; + try { + toughness = Integer.parseInt(rhs); + } catch (final NumberFormatException e) { + toughness = CardFactoryUtil.xCount(tgtCard, tgtCard.getSVar(rhs)); + } + tgtCard.setBaseDefense(toughness); + } + + // colors to be added or changed to + String shortColors = ""; + if (params.containsKey("Colors")) { + final String colors = params.get("Colors"); + if (colors.equals("ChosenColor")) { + shortColors = CardUtil.getShortColorsString(tgtCard.getChosenColor()); + } else { + shortColors = CardUtil.getShortColorsString(new ArrayList(Arrays.asList(colors.split(",")))); + } + } + tgtCard.addColor(shortColors, tgtCard, !params.containsKey("OverwriteColors"), true); + + } + + } // end class AbilityFactoryClone diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryCopy.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryCopy.java index 6797a9b0581..1d968e632fa 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryCopy.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryCopy.java @@ -447,7 +447,7 @@ public final class AbilityFactoryCopy { copy.setState(CardCharactersticName.Transformed); } } - if (c.isFlip()) { // Cloned Flips CAN flip. + if (c.isFlipCard()) { // Cloned Flips CAN flip. copy.setState(CardCharactersticName.Original); c.setState(CardCharactersticName.Original); copy.setImageFilename(c.getImageFilename()); diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactorySetState.java b/src/main/java/forge/card/abilityfactory/AbilityFactorySetState.java index 4d3d044f0e2..d2acfe262b3 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactorySetState.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactorySetState.java @@ -284,14 +284,21 @@ public class AbilityFactorySetState { } } } else if (mode.equals("Flip")) { - if (tgt.isFlip()) { + if (tgt.isFlipCard()) { if (tgt.getCurState() == CardCharactersticName.Original) { - if (tgt.setState(CardCharactersticName.Flipped) && remChanged) { - abilityFactory.getHostCard().addRemembered(tgt); + if (tgt.setState(CardCharactersticName.Flipped)) { + abilityFactory.getHostCard().setFlipStaus(true); + if (remChanged) { + abilityFactory.getHostCard().addRemembered(tgt); + } } + } else if (tgt.getCurState() == CardCharactersticName.Flipped) { - if (tgt.setState(CardCharactersticName.Original) && remChanged) { - abilityFactory.getHostCard().addRemembered(tgt); + if (tgt.setState(CardCharactersticName.Original)) { + abilityFactory.getHostCard().setFlipStaus(false); + if (remChanged) { + abilityFactory.getHostCard().addRemembered(tgt); + } } } } @@ -500,14 +507,20 @@ public class AbilityFactorySetState { } } } else if (mode.equals("Flip")) { - if (list.get(i).isFlip()) { + if (list.get(i).isFlipCard()) { if (list.get(i).getCurState() == CardCharactersticName.Original) { - if (list.get(i).setState(CardCharactersticName.Flipped) && remChanged) { - abilityFactory.getHostCard().addRemembered(tgt); + if (list.get(i).setState(CardCharactersticName.Flipped)) { + list.get(i).setFlipStaus(true); + if (remChanged) { + abilityFactory.getHostCard().addRemembered(tgt); + } } } else if (list.get(i).getCurState() == CardCharactersticName.Flipped) { - if (list.get(i).setState(CardCharactersticName.Original) && remChanged) { - abilityFactory.getHostCard().addRemembered(tgt); + if (list.get(i).setState(CardCharactersticName.Original)) { + list.get(i).setFlipStaus(false); + if (remChanged) { + abilityFactory.getHostCard().addRemembered(tgt); + } } } } diff --git a/src/main/java/forge/card/cardfactory/CardFactoryArtifacts.java b/src/main/java/forge/card/cardfactory/CardFactoryArtifacts.java index 63b72b6bc49..9483406b913 100644 --- a/src/main/java/forge/card/cardfactory/CardFactoryArtifacts.java +++ b/src/main/java/forge/card/cardfactory/CardFactoryArtifacts.java @@ -757,109 +757,7 @@ class CardFactoryArtifacts { card.addSpellAbility(ability); } // *************** END ************ END ************************** - // *************** START *********** START ************************** - else if (cardName.equals("Sculpting Steel")) { - final Card[] copyTarget = new Card[1]; - - final SpellAbility copy = new Spell(card) { - private static final long serialVersionUID = 4496978456522751302L; - - @Override - public void resolve() { - if (card.getController().isComputer()) { - final CardList cards = AllZoneUtil.getCardsIn(ZoneType.Battlefield).getType("Artifact"); - if (!cards.isEmpty()) { - copyTarget[0] = CardFactoryUtil.getBestAI(cards); - } - } - - if (copyTarget[0] != null) { - Card cloned; - - AllZone.getTriggerHandler().suppressMode(TriggerType.Transformed); - - // TODO: transform back and forth - cloned = AbstractCardFactory.getCard2(copyTarget[0], card.getOwner()); - // TODO: untransform - - card.addAlternateState(CardCharactersticName.Cloner); - card.switchStates(CardCharactersticName.Original, CardCharactersticName.Cloner); - card.setState(CardCharactersticName.Original); - - if (copyTarget[0].getCurState() == CardCharactersticName.Transformed && copyTarget[0].isDoubleFaced()) { - cloned.setState(CardCharactersticName.Transformed); - } - - CardFactoryUtil.copyCharacteristics(cloned, card); - this.grantExtras(); - - // If target is a flipped card, also copy the flipped - // state. - if (copyTarget[0].isFlip()) { - cloned.setState(CardCharactersticName.Flipped); - cloned.setImageFilename(CardUtil.buildFilename(cloned)); - card.addAlternateState(CardCharactersticName.Flipped); - card.setState(CardCharactersticName.Flipped); - CardFactoryUtil.copyCharacteristics(cloned, card); - this.grantExtras(); - - card.setFlip(true); - - card.setState(CardCharactersticName.Original); - } else { - card.setFlip(false); - } - - AllZone.getTriggerHandler().clearSuppression(TriggerType.Transformed); - } - - Singletons.getModel().getGameAction().moveToPlay(card); - } - - private void grantExtras() { - // Grant stuff from specific cloners - if (cardName.equals("Copy Artifact")) { - card.addType("Enchantment"); - } - - } - }; // SpellAbility - - final Input runtime = new Input() { - private static final long serialVersionUID = 8117808324791871452L; - - @Override - public void showMessage() { - final StringBuilder sb = new StringBuilder(); - sb.append(cardName).append(" - Select an artifact on the battlefield"); - CMatchUI.SINGLETON_INSTANCE.showMessage(sb.toString()); - ButtonUtil.enableOnlyCancel(); - } - - @Override - public void selectButtonCancel() { - this.stop(); - } - - @Override - public void selectCard(final Card c, final PlayerZone z) { - if (z.is(ZoneType.Battlefield) && c.isArtifact()) { - copyTarget[0] = c; - this.stopSetNext(new InputPayManaCost(copy)); - } - } - }; - // Do not remove SpellAbilities created by AbilityFactory or - // Keywords. - card.clearFirstSpell(); - card.addSpellAbility(copy); - final StringBuilder sb = new StringBuilder(); - sb.append(cardName).append(" - enters the battlefield as a copy of selected card."); - copy.setStackDescription(sb.toString()); - copy.setBeforePayMana(runtime); - } // *************** END ************ END ************************** - - return card; + return card; } } diff --git a/src/main/java/forge/card/cardfactory/CardFactoryCreatures.java b/src/main/java/forge/card/cardfactory/CardFactoryCreatures.java index 81083676a22..136f612782d 100644 --- a/src/main/java/forge/card/cardfactory/CardFactoryCreatures.java +++ b/src/main/java/forge/card/cardfactory/CardFactoryCreatures.java @@ -1485,214 +1485,7 @@ public class CardFactoryCreatures { card.addComesIntoPlayCommand(comesIntoPlay); } - - private static void getCard_ClonesSeries(final Card card, final String cardName) { - final Card[] copyTarget = new Card[1]; - - final SpellAbility copy = new Spell(card) { - private static final long serialVersionUID = 4496978456522751302L; - - @Override - public void resolve() { - String imageFileName = card.getImageFilename(); - - if (card.getController().isComputer()) { - final CardList creatures = AllZoneUtil.getCreaturesInPlay(); - if (!creatures.isEmpty()) { - copyTarget[0] = CardFactoryUtil.getBestCreatureAI(creatures); - } - } - - if (copyTarget[0] != null) { - Card cloned; - - AllZone.getTriggerHandler().suppressMode(TriggerType.Transformed); - - if (copyTarget[0].isToken()) { - cloned = CardFactoryUtil.copyStats(copyTarget[0]); - - cloned.setName(copyTarget[0].getName()); - cloned.setImageName(copyTarget[0].getImageName()); - - cloned.setOwner(this.getActivatingPlayer()); - cloned.addController(this.getActivatingPlayer()); - - cloned.setManaCost(copyTarget[0].getManaCost()); - cloned.setColor(copyTarget[0].getColor()); - cloned.setToken(true); - - cloned.setType(copyTarget[0].getType()); - - cloned.setBaseAttack(copyTarget[0].getBaseAttack()); - cloned.setBaseDefense(copyTarget[0].getBaseDefense()); - } - else { - Card origin = copyTarget[0]; - // TODO: transform back before copying - cloned = AbstractCardFactory.getCard2(origin, card.getOwner()); - // TODO: transform origin back to how it was (if needed) - } - card.addAlternateState(CardCharactersticName.Cloner); - card.switchStates(CardCharactersticName.Original, CardCharactersticName.Cloner); - card.setState(CardCharactersticName.Original); - - if (copyTarget[0].getCurState() == CardCharactersticName.Transformed && copyTarget[0].isDoubleFaced()) { - cloned.setState(CardCharactersticName.Transformed); - } - - CardFactoryUtil.copyCharacteristics(cloned, card); - CardFactoryUtil.addAbilityFactoryAbilities(card); - for (int i = 0; i < card.getStaticAbilityStrings().size(); i++) { - card.addStaticAbility(card.getStaticAbilityStrings().get(i)); - } - this.grantExtras(); - - // If target is a flipped card, also copy the flipped - // state. - if (copyTarget[0].isFlip()) { - cloned.setState(CardCharactersticName.Flipped); - cloned.setImageFilename(CardUtil.buildFilename(cloned)); - card.addAlternateState(CardCharactersticName.Flipped); - card.setState(CardCharactersticName.Flipped); - CardFactoryUtil.copyCharacteristics(cloned, card); - CardFactoryUtil.addAbilityFactoryAbilities(card); - for (int i = 0; i < card.getStaticAbilityStrings().size(); i++) { - card.addStaticAbility(card.getStaticAbilityStrings().get(i)); - } - this.grantExtras(); - - card.setFlip(true); - - card.setState(CardCharactersticName.Original); - } else { - card.setFlip(false); - } - - AllZone.getTriggerHandler().clearSuppression(TriggerType.Transformed); - } - - //keep the Clone card image for the cloned card - card.setImageFilename(imageFileName); - Singletons.getModel().getGameAction().moveToPlay(card); - } - - private void grantExtras() { - // Grant stuff from specific cloners - if (cardName.equals("Vesuvan Doppelganger")) { - final String keyword = "At the beginning of your upkeep, you may have this " - + "creature become a copy of target creature except it doesn't copy that " - + "creature's color. If you do, this creature gains this ability."; - card.addIntrinsicKeyword(keyword); - card.addColor("U"); - } else if (cardName.equals("Quicksilver Gargantuan")) { - card.setBaseAttack(7); - card.setBaseDefense(7); - } else if (cardName.equals("Phyrexian Metamorph")) { - card.addType("Artifact"); - } else if (cardName.equals("Phantasmal Image")) { - final Trigger t = forge.card.trigger.TriggerHandler - .parseTrigger( - "Mode$ BecomesTarget | ValidTarget$ Card.Self | Execute$ TrigSac | TriggerDescription$ When this creature becomes the target of a spell or ability, sacrifice it.", - card, true); - card.addTrigger(t); - card.setSVar("TrigSac", "AB$Sacrifice | Cost$ 0 | Defined$ Self"); - card.setSVar("Targeting", "Dies"); - card.addType("Illusion"); - } else if (cardName.equals("Evil Twin")) { - final AbilityFactory af = new AbilityFactory(); - - final SpellAbility ab = af - .getAbility( - "AB$Destroy | Cost$ U B T | ValidTgts$ Creature.sameName | TgtPrompt$ Select target creature with the same name. | SpellDescription$ Destroy target creature with the same name as this creature.", - card); - - card.addSpellAbility(ab); - } else if (cardName.equals("Sakashima the Impostor")) { - final AbilityFactory af = new AbilityFactory(); - final SpellAbility ab = af - .getAbility( - "AB$DelayedTrigger | Cost$ 2 U U | Mode$ Phase | Phase$ End of Turn | Execute$ TrigReturnSak | TriggerDescription$ Return CARDNAME to it's owners hand at the beginning of the next end step.", - card); - - card.addSpellAbility(ab); - card.setSVar("TrigReturnSak", - "AB$ChangeZone | Cost$ 0 | Defined$ Self | Origin$ Battlefield | Destination$ Hand"); - card.setName("Sakashima the Impostor"); - card.addType("Legendary"); - } - } - }; // SpellAbility - - final Input runtime = new Input() { - private static final long serialVersionUID = 7615038074569687330L; - - @Override - public void showMessage() { - String message = "Select a creature "; - if (cardName.equals("Phyrexian Metamorph")) { - message += "or artifact "; - } - message += "on the battlefield"; - CMatchUI.SINGLETON_INSTANCE.showMessage(cardName + " - " + message); - ButtonUtil.enableOnlyCancel(); - } - - @Override - public void selectButtonCancel() { - // player chooses not to copy anything - that's legal - AllZone.getStack().add(copy); - AllZone.getInputControl().resetInput(); - } - - @Override - public void selectCard(final Card c, final PlayerZone z) { - if (!z.is(ZoneType.Battlefield)) { - return; - } - if (cardName.equals("Jwari Shapeshifter") && !c.isType("Ally")) { - return; - } - if (c.isCreature() || (cardName.equals("Phyrexian Metamorph") && c.isArtifact())) { - copyTarget[0] = c; - - AllZone.getStack().add(copy); - AllZone.getInputControl().resetInput(); - } - } - }; - - final Input graveyardRuntime = new Input() { - private static final long serialVersionUID = 6950318443268022876L; - - @Override - public void showMessage() { - final String message = "Select a creature in a graveyard"; - final CardList choices = AllZoneUtil.getCardsIn(ZoneType.Graveyard); - final Object o = GuiUtils.chooseOneOrNone(message, choices.toArray()); - if (null == o) { - this.stop(); - } else { - final Card c = (Card) o; - copyTarget[0] = c; - this.stopSetNext(new InputPayManaCost(copy)); - } - } - }; - - // Do not remove SpellAbilities created by AbilityFactory or - // Keywords. - card.clearFirstSpell(); - card.addSpellAbility(copy); - final StringBuilder sb = new StringBuilder(); - sb.append(cardName).append(" - enters the battlefield as a copy of selected card."); - copy.setStackDescription(sb.toString()); - if (cardName.equals("Body Double")) { - copy.setBeforePayMana(graveyardRuntime); - } else { - copy.setAfterPayMana(runtime); - } - } - + private static void getCard_Nebuchadnezzar(final Card card, final String cardName) { /* * X, T: Name a card. Target opponent reveals X cards at random from @@ -1883,12 +1676,6 @@ public class CardFactoryCreatures { getCard_YoseiTheMorningStar(card, cardName); } else if (cardName.equals("Phyrexian Dreadnought")) { getCard_PhyrexianDreadnought(card, cardName); - } else if (cardName.equals("Clone") || cardName.equals("Vesuvan Doppelganger") - || cardName.equals("Quicksilver Gargantuan") || cardName.equals("Jwari Shapeshifter") - || cardName.equals("Phyrexian Metamorph") || cardName.equals("Phantasmal Image") - || cardName.equals("Body Double") || cardName.equals("Evil Twin") - || cardName.equals("Sakashima the Impostor")) { - getCard_ClonesSeries(card, cardName); } else if (cardName.equals("Nebuchadnezzar")) { getCard_Nebuchadnezzar(card, cardName); } else if (cardName.equals("Duct Crawler") || cardName.equals("Shrewd Hatchling") diff --git a/src/main/java/forge/card/cardfactory/CardFactoryEnchantments.java b/src/main/java/forge/card/cardfactory/CardFactoryEnchantments.java index 9498bb8e3af..91ec2e356ea 100644 --- a/src/main/java/forge/card/cardfactory/CardFactoryEnchantments.java +++ b/src/main/java/forge/card/cardfactory/CardFactoryEnchantments.java @@ -224,109 +224,7 @@ class CardFactoryEnchantments { card.addDestroyCommand(toGrave); } // *************** END ************ END ************************** - // *************** START *********** START ************************** - else if (cardName.equals("Copy Artifact")) { - final Card[] copyTarget = new Card[1]; - - final SpellAbility copy = new Spell(card) { - private static final long serialVersionUID = 4496978456522751302L; - - @Override - public void resolve() { - if (card.getController().isComputer()) { - final CardList cards = AllZoneUtil.getCardsIn(ZoneType.Battlefield).getType("Artifact"); - if (!cards.isEmpty()) { - copyTarget[0] = CardFactoryUtil.getBestAI(cards); - } - } - - if (copyTarget[0] != null) { - Card cloned; - - AllZone.getTriggerHandler().suppressMode(TriggerType.Transformed); - - // TODO: transform back and forth - cloned = AbstractCardFactory.getCard2(copyTarget[0], card.getOwner()); - // TODO: untransform - - card.addAlternateState(CardCharactersticName.Cloner); - card.switchStates(CardCharactersticName.Original, CardCharactersticName.Cloner); - card.setState(CardCharactersticName.Original); - - if (copyTarget[0].getCurState() == CardCharactersticName.Transformed && copyTarget[0].isDoubleFaced()) { - cloned.setState(CardCharactersticName.Transformed); - } - - CardFactoryUtil.copyCharacteristics(cloned, card); - this.grantExtras(); - - // If target is a flipped card, also copy the flipped - // state. - if (copyTarget[0].isFlip()) { - cloned.setState(CardCharactersticName.Flipped); - cloned.setImageFilename(CardUtil.buildFilename(cloned)); - card.addAlternateState(CardCharactersticName.Flipped); - card.setState(CardCharactersticName.Flipped); - CardFactoryUtil.copyCharacteristics(cloned, card); - this.grantExtras(); - - card.setFlip(true); - - card.setState(CardCharactersticName.Original); - } else { - card.setFlip(false); - } - - AllZone.getTriggerHandler().clearSuppression(TriggerType.Transformed); - } - - Singletons.getModel().getGameAction().moveToPlay(card); - } - - private void grantExtras() { - // Grant stuff from specific cloners - if (cardName.equals("Copy Artifact")) { - card.addType("Enchantment"); - } - - } - }; // SpellAbility - - final Input runtime = new Input() { - private static final long serialVersionUID = 8117808324791871452L; - - @Override - public void showMessage() { - final StringBuilder sb = new StringBuilder(); - sb.append(cardName).append(" - Select an artifact on the battlefield"); - CMatchUI.SINGLETON_INSTANCE.showMessage(sb.toString()); - ButtonUtil.enableOnlyCancel(); - } - - @Override - public void selectButtonCancel() { - this.stop(); - } - - @Override - public void selectCard(final Card c, final PlayerZone z) { - if (z.is(ZoneType.Battlefield) && c.isArtifact()) { - copyTarget[0] = c; - this.stopSetNext(new InputPayManaCost(copy)); - } - } - }; - // Do not remove SpellAbilities created by AbilityFactory or - // Keywords. - card.clearFirstSpell(); - card.addSpellAbility(copy); - final StringBuilder sb = new StringBuilder(); - sb.append(cardName).append(" - enters the battlefield as a copy of selected card."); - copy.setStackDescription(sb.toString()); - copy.setBeforePayMana(runtime); - } // *************** END ************ END ************************** - - // *************** START *********** START ************************** + // *************** START *********** START ************************** else if (cardName.equals("Sylvan Library")) { final Ability ability = new Ability(card, "") { diff --git a/src/main/java/forge/card/cardfactory/CardFactoryUtil.java b/src/main/java/forge/card/cardfactory/CardFactoryUtil.java index 5f482544bb7..692cf192940 100644 --- a/src/main/java/forge/card/cardfactory/CardFactoryUtil.java +++ b/src/main/java/forge/card/cardfactory/CardFactoryUtil.java @@ -40,6 +40,7 @@ import forge.CommandArgs; import forge.Counters; import forge.GameActionUtil; import forge.Singletons; +import forge.card.CardCharacteristics; import forge.card.abilityfactory.AbilityFactory; import forge.card.cost.Cost; import forge.card.mana.ManaCost; @@ -3880,7 +3881,7 @@ public class CardFactoryUtil { public static Card copyStats(final Card sim) { final Card c = new Card(); - c.setFlip(sim.isFlip()); + c.setFlipCard(sim.isFlipCard()); c.setDoubleFaced(sim.isDoubleFaced()); c.setCurSetCode(sim.getCurSetCode()); @@ -3933,6 +3934,31 @@ public class CardFactoryUtil { } + /** + * Copy characteristics. + * + * @param from + * the from + * @param to + * the to + */ + public static void copyState(final Card from, final CardCharactersticName stateToCopy, final Card to) { + + // copy characteristics not associated with a state + to.setCurSetCode(from.getCurSetCode()); + to.setBaseLoyalty(from.getBaseLoyalty()); + to.setBaseAttackString(from.getBaseAttackString()); + to.setBaseDefenseString(from.getBaseDefenseString()); + to.setText(from.getSpellText()); + + // get CardCharacteristics for desired state + CardCharacteristics characteristics = from.getState(stateToCopy); + to.getCharacteristics().copy(characteristics); + // handle triggers and replacement effect through Card class interface + to.setTriggers(characteristics.getTriggers()); + to.setReplacementEffects(characteristics.getReplacementEffects()); + } + public static void copySpellAbility(SpellAbility from, SpellAbility to) { to.setDescription(from.getDescription()); to.setStackDescription(from.getDescription()); diff --git a/src/main/java/forge/game/phase/Upkeep.java b/src/main/java/forge/game/phase/Upkeep.java index b90d8a0c882..6e243ccd6f9 100644 --- a/src/main/java/forge/game/phase/Upkeep.java +++ b/src/main/java/forge/game/phase/Upkeep.java @@ -22,7 +22,6 @@ import java.util.ArrayList; import forge.AllZone; import forge.AllZoneUtil; import forge.Card; -import forge.CardCharactersticName; import forge.CardList; import forge.CardListFilter; import forge.CardListUtil; @@ -36,7 +35,6 @@ import forge.card.spellability.Ability; import forge.card.spellability.AbilityMana; import forge.card.spellability.AbilityStatic; import forge.card.spellability.SpellAbility; -import forge.card.trigger.TriggerType; import forge.control.input.Input; import forge.game.player.ComputerUtil; import forge.game.player.Player; @@ -85,8 +83,6 @@ public class Upkeep extends Phase implements java.io.Serializable { Upkeep.upkeepDemonicHordes(); Upkeep.upkeepTangleWire(); - Upkeep.upkeepVesuvanDoppelgangerKeyword(); - // Kinship cards Upkeep.upkeepInkDissolver(); Upkeep.upkeepKithkinZephyrnaut(); @@ -2206,117 +2202,7 @@ public class Upkeep extends Phase implements java.io.Serializable { } } // for } // upkeepPowerSurge() - - /** - *

- * upkeepVesuvanDoppelgangerKeyword. - *

- */ - private static void upkeepVesuvanDoppelgangerKeyword() { - final Player player = Singletons.getModel().getGameState().getPhaseHandler().getPlayerTurn(); - final String keyword1 = "At the beginning of your upkeep, you may have this " - + "creature become a copy of target creature except it doesn't copy that " - + "creature's color. If you do, this creature gains this ability."; - final String keyword2 = "At the beginning of your upkeep, you may have this " - + "creature become a copy of another target creature. If you do, " - + "this creature gains this ability."; - CardList list = player.getCardsIn(ZoneType.Battlefield); - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.hasAnyKeyword(new String[] {keyword1, keyword2}); - } - }); - - for (final Card c : list) { - final String keyword = c.hasKeyword(keyword1) ? keyword1 : keyword2; - final SpellAbility ability = new Ability(c, "0") { - @Override - public void resolve() { - final StringBuilder question = new StringBuilder(); - question.append("Use triggered ability of ").append(c).append("?"); - question.append("\r\n").append("(").append(keyword).append(")").append("\r\n"); - if (GameActionUtil.showYesNoDialog(c, question.toString(), true)) { - final Card[] newTarget = new Card[1]; - newTarget[0] = null; - - final Ability switchTargets = new Ability(c, "0") { - @Override - public void resolve() { - - if (newTarget[0] != null) { - /* - * 1. need to select new card - DONE 1a. - * need to create the newly copied card with - * pic and setinfo 2. need to add the leaves - * play command 3. need to transfer the - * keyword 4. need to update the clone - * origin of new card and old card 5. remove - * clone leaves play commands from old 5a. - * remove old from play 6. add new to play - */ - - final Card newCopy = AllZone.getCardFactory().getCard( - newTarget[0].getState(CardCharactersticName.Original).getName(), player); - newCopy.setCurSetCode(newTarget[0].getCurSetCode()); - // preserve the image of the Vesuvan - // Doppelganger/whatever the source is - newCopy.setImageFilename(c.getImageFilename()); - - AllZone.getTriggerHandler().suppressMode(TriggerType.Transformed); - newCopy.setState(newTarget[0].getCurState()); - AllZone.getTriggerHandler().clearSuppression(TriggerType.Transformed); - - CardFactoryUtil.copyCharacteristics(newCopy, c); - - c.addExtrinsicKeyword(keyword); - if (c.hasKeyword(keyword1)) { - c.addColor("U"); - } - } - } - }; - - AllZone.getInputControl().setInput(new Input() { - private static final long serialVersionUID = 5662272658873063221L; - - @Override - public void showMessage() { - CMatchUI.SINGLETON_INSTANCE - .showMessage(c.getName() + " - Select target creature."); - ButtonUtil.enableOnlyCancel(); - } - - @Override - public void selectButtonCancel() { - this.stop(); - } - - @Override - public void selectCard(final Card selectedCard, final PlayerZone z) { - if (z.is(ZoneType.Battlefield) && selectedCard.isCreature() - && selectedCard.canBeTargetedBy(switchTargets)) { - newTarget[0] = selectedCard; - final StringBuilder sb = new StringBuilder(); - sb.append(c).append(" - switching to copy "); - sb.append(selectedCard.getName()).append("."); - switchTargets.setStackDescription(sb.toString()); - AllZone.getStack().add(switchTargets); - this.stop(); - } - } - }); - } - } - }; - - ability.setDescription(keyword); - ability.setStackDescription("(OPTIONAL) " + keyword); - - AllZone.getStack().addSimultaneousStackEntry(ability); - - } // foreach(Card) - } // upkeepVesuvanDoppelgangerKeyword - + /** *

* upkeepTangleWire. diff --git a/src/main/java/forge/gui/download/GuiDownloadPicturesLQ.java b/src/main/java/forge/gui/download/GuiDownloadPicturesLQ.java index 2f469e2d053..26578748a80 100644 --- a/src/main/java/forge/gui/download/GuiDownloadPicturesLQ.java +++ b/src/main/java/forge/gui/download/GuiDownloadPicturesLQ.java @@ -25,6 +25,8 @@ import javax.swing.JFrame; import forge.AllZone; import forge.Card; +import forge.CardCharactersticName; +import forge.card.CardCharacteristics; import forge.gui.GuiDisplayUtil; import forge.properties.ForgeProps; import forge.properties.NewConstants; @@ -93,22 +95,19 @@ public class GuiDownloadPicturesLQ extends GuiDownloader { private List createDLObjects(final Card c, final String base) { final ArrayList ret = new ArrayList(); - for (final String sVar : c.getSVars().keySet()) { + for (final CardCharactersticName state : c.getStates()) { + CardCharacteristics stateCharacteristics = c.getState(state); + final String url = stateCharacteristics.getSVar("Picture"); + if (!url.isEmpty()) { + final String[] urls = url.split("\\\\"); - if (!sVar.startsWith("Picture")) { - continue; + final String iName = GuiDisplayUtil.cleanString(stateCharacteristics.getImageName()); + ret.add(new DownloadObject(urls[0], new File(base, iName + ".jpg"))); + + for (int j = 1; j < urls.length; j++) { + ret.add(new DownloadObject(urls[j], new File(base, iName + j + ".jpg"))); + } } - - final String url = c.getSVar(sVar); - final String[] urls = url.split("\\\\"); - - final String iName = GuiDisplayUtil.cleanString(c.getImageName()); - ret.add(new DownloadObject(urls[0], new File(base, iName + ".jpg"))); - - for (int j = 1; j < urls.length; j++) { - ret.add(new DownloadObject(urls[j], new File(base, iName + j + ".jpg"))); - } - } return ret; diff --git a/src/main/java/forge/item/CardPrinted.java b/src/main/java/forge/item/CardPrinted.java index 425e0f05671..b73aa31a8d0 100644 --- a/src/main/java/forge/item/CardPrinted.java +++ b/src/main/java/forge/item/CardPrinted.java @@ -298,7 +298,7 @@ public final class CardPrinted implements Comparable, InventoryItem c.setImageFilename(this.getImageFilename()); if (c.hasAlternateState()) { - if (c.isFlip()) { + if (c.isFlipCard()) { c.setState(CardCharactersticName.Flipped); } if (c.isDoubleFaced()) {