From f8fc173e863ad2d3a66bca10761f506059ffa150 Mon Sep 17 00:00:00 2001 From: Vittorio Alfieri Date: Sun, 4 Jun 2023 20:11:40 +0200 Subject: [PATCH] Added / fixed some primitives, updated missing cards by set list, added new "reconfigure" ability based on "equip" one. --- .../mtg/bin/Res/missing_cards_by_sets/NEC.txt | 18 +++ .../missing_cards_by_sets/missingCardList.txt | 30 ---- .../bin/Res/sets/primitives/borderline.txt | 152 ++++++++++++++++-- projects/mtg/bin/Res/sets/primitives/mtg.txt | 42 ++--- projects/mtg/include/AllAbilities.h | 1 + projects/mtg/src/AllAbilities.cpp | 7 + projects/mtg/src/MTGAbility.cpp | 11 +- 7 files changed, 199 insertions(+), 62 deletions(-) create mode 100644 projects/mtg/bin/Res/missing_cards_by_sets/NEC.txt diff --git a/projects/mtg/bin/Res/missing_cards_by_sets/NEC.txt b/projects/mtg/bin/Res/missing_cards_by_sets/NEC.txt new file mode 100644 index 000000000..6c2f8c397 --- /dev/null +++ b/projects/mtg/bin/Res/missing_cards_by_sets/NEC.txt @@ -0,0 +1,18 @@ +[card] +name=Swift Reconfiguration +target=creature,vehicle +abilities=flash +text=Flash -- Enchant creature or Vehicle -- Enchanted permanent is a Vehicle artifact with crew 5 and it loses all other card types. (It's not a creature unless it's crewed.) +mana={W} +type=Enchantment +subtype=Aura +[/card] +[card] +name=Swift Reconfiguration +target=creature,vehicle +abilities=flash +text=Flash -- Enchant creature or Vehicle -- Enchanted permanent is a Vehicle artifact with crew 5 and it loses all other card types. (It's not a creature unless it's crewed.) +mana={W} +type=Enchantment +subtype=Aura +[/card] diff --git a/projects/mtg/bin/Res/missing_cards_by_sets/missingCardList.txt b/projects/mtg/bin/Res/missing_cards_by_sets/missingCardList.txt index e6c3f2a24..309d14f26 100644 --- a/projects/mtg/bin/Res/missing_cards_by_sets/missingCardList.txt +++ b/projects/mtg/bin/Res/missing_cards_by_sets/missingCardList.txt @@ -1,10 +1,7 @@ Primal Command Rowan Kenrith -Kitsune Ace Pyre-Sledge Arsonist Sokenzan Smelter -Hotshot Mechanic -Imperial Recovery Unit Ossuary Rats Rodolf Duskbringer Skullslither Worm @@ -27,7 +24,6 @@ Zask, Skittering Swarmlord Dutiful Replicator Instruments of War Planar Atlas -Ingenious Leonin Lita, Mechanical Engineer Magnanimous Magistrate Preston, the Vanisher @@ -476,27 +472,14 @@ Call In a Professional Whack Security Rhox Ormos, Archive Keeper -Ruthless Technomancer Myojin of Cryptic Dreams Kami of Celebration Collision of Realms Akki Battle Squad Smoke Spirits' Aid -Komainu Battle Armor -Shorikai, Genesis Engine Kaima, the Fractured Calm -Access Denied Katsumasa, the Animator -Imposter Mech -Universal Surveillance -Aerial Surveyor -Swift Reconfiguration -Release to Memory -Kotori, Pilot Prodigy -Kosei, Penitent Warlord -Tanuki Transplanter One with the Kami -Myojin of Towering Might Unforgiving One Silver-Fur Master Satsuki, the Living Lore @@ -510,7 +493,6 @@ Atsushi, the Blazing Sky Dramatist's Puppet Ambitious Assault Containment Construct -Lion Sash March of Otherworldly Light Akki Ember-Keeper Bronze Cudgels @@ -527,7 +509,6 @@ Risona, Asari Commander Tatsunari, Toad Rider Soul Transfer Prodigy's Prototype -Cloudsteel Kirin Naomi, Pillar of Order Reckoner Shakedown Kotose, the Silent Spider @@ -549,7 +530,6 @@ Webspinner Cuff Kami of Terrible Secrets Weaver of Harmony Teachings of the Kirin -Guardians of Oboro Go-Shintai of Lost Wisdom Invoke the Ancients Thundering Raiju @@ -568,8 +548,6 @@ Coiling Stalker March of Burgeoning Life Azusa's Many Journeys Upriser Renegade -Acquisition Octopus -Armguard Familiar Mech Hangar Explosive Singularity Anchor to Reality @@ -585,7 +563,6 @@ Goro-Goro, Disciple of Ryusei Biting-Palm Ninja Scrap Welder Thousand-Faced Shadow -Disruption Protocol Simian Sling Sokenzan, Crucible of Defiance Prosperous Thief @@ -599,7 +576,6 @@ Awakened Awareness Otawara, Soaring City Heiko Yamazaki, the General Invoke Despair -When We Were Young Boseiju, Who Endures Touch the Spirit Realm Kumano Faces Kakkazan @@ -611,14 +587,10 @@ Dragonspark Reactor Crackling Emergence Experimental Synthesizer Iron Apprentice -Regent's Authority Go-Shintai of Ancient Wars Reckoner Bankbuster -Norika Yamazaki, the Poet -The Reality Chip Flame Discharge Mirror Box -Blade of the Oni Mechtitan Core Hidetsugu, Devouring Chaos Season of Renewal @@ -631,7 +603,6 @@ Go-Shintai of Hidden Cruelty Enormous Energy Blade Debt to the Kami Assassin's Ink -Chainflail Centipede Go-Shintai of Boundless Vigor Reality Heist Harmonious Emergence @@ -640,7 +611,6 @@ Boseiju Reaches Skyward Blossom Prancer Moonsnare Prototype Careful Cultivation -Born to Drive Banishing Slash Ancestral Katana Lithoform Engine diff --git a/projects/mtg/bin/Res/sets/primitives/borderline.txt b/projects/mtg/bin/Res/sets/primitives/borderline.txt index 9a0a49d22..3515cb87f 100644 --- a/projects/mtg/bin/Res/sets/primitives/borderline.txt +++ b/projects/mtg/bin/Res/sets/primitives/borderline.txt @@ -1,7 +1,7 @@ grade=borderline #Bordeline Primitives Pack for Wagic the Homebrew. #Please keep these card alphabetized, and try to have the "name=" line at the top of each card -#I sorted this programmatically - Thanks to Vitty85 02-06-2023 +#I sorted this programmatically - Thanks to Vitty85 04-06-2023 [card] name=+2 Mace auto={3}:equip @@ -348,6 +348,19 @@ type=Legendary Enchantment subtype=Background [/card] [card] +name=Acquisition Octopus +auto={2}:reconfigure +auto=this(cantargetcard(*[attached]|*) {2}{unattach}:name(Reconfigure unattach) name(Reconfigure unattach) donothing asSorcery +auto=teach(creature) transforms((,newability[@combatdamaged(player) from(this):name(Draw a card) name(Draw a card) draw:1 controller])) +auto=@combatdamaged(player) from(this):name(Draw a card) name(Draw a card) ability$!name(Draw a card) name(Draw a card) draw:1 controller!$ controller +text=Whenever Acquisition Octopus or equipped creature deals combat damage to a player, draw a card. -- Reconfigure {2} ({2}: Attach to target creature you control; or unattach from a creature. Reconfigure only as a sorcery. While attached, this isn't a creature.) +mana={2}{U} +type=Artifact Creature +subtype=Equipment Octopus +power=2 +toughness=2 +[/card] +[card] name=Acquisitions Expert aicode=activate reject notatarget(*|opponenthand) auto=reveal:calculateparty revealzone(opponenthand) optionone name(choose discards) notatarget(<1>*|reveal) transforms((,newability[moveto(ownerhand) all(other *|reveal)],newability[moveto(ownerhand) and!(reject)!])) ueot optiononeend optiontwo name(put back) target(<1>*|reveal) moveto(ownerhand) and!( all(*|reveal) moveto(ownerhand) )! optiontwoend revealend @@ -4020,6 +4033,19 @@ mana={1}{W} type=Instant [/card] [card] +name=Armguard Familiar +auto={4}:reconfigure +auto=this(cantargetcard(*[attached]|*) {4}{unattach}:name(Reconfigure unattach) name(Reconfigure unattach) donothing asSorcery +auto=teach(creature) transforms((,newability[2/2],newability[@targeted(this) from(*|opponentstack):choice name(This spell costs 2 more) name(This spell costs 2 more) target(*|opponentstack) transforms((,newability[pay[[{2}]] name(pay 2 mana) donothing?fizzle])) oneshot])) +auto=_WARD_(2) +text=Ward {2} (Whenever this creature becomes the target of a spell or ability an opponent controls, counter it unless that player pays {2}.) -- Equipped creature gets +2/+1 and has ward {2}. -- Reconfigure {4} ({4}: Attach to target creature you control; or unattach from a creature. Reconfigure only as a sorcery. While attached, this isn't a creature.) +mana={1}{U} +type=Artifact Creature +subtype=Equipment Beast +power=2 +toughness=1 +[/card] +[card] name=Armix, Filigree Thrasher abilities=partner auto=_ATTACKING_may name(discard a card) reject notatarget(*|myhand) && ability$!name(Choose creature) target(creature|opponentbattlefield) -type:artifact:mygraveyardplustype:artifact:myBattlefieldplusend/-type:artifact:mygraveyardplustype:artifact:myBattlefieldplusend ueot!$ controller @@ -8101,6 +8127,19 @@ type=Artifact subtype=Equipment [/card] [card] +name=Blade of the Oni +abilities=menace +auto={2}{B}{B}:reconfigure +auto=this(cantargetcard(*[attached]|*) {2}{B}{B}{unattach}:name(Reconfigure unattach) name(Reconfigure unattach) donothing asSorcery +auto=teach(creature) transforms((Demon,setpower=5,settoughness=5,newcolors[black],newability[menace])) +text=Menace -- Equipped creature has base power and toughness 5/5, has menace, and is a black Demon in addition to its other colors and types. -- Reconfigure {2}{B}{B} ({2}{B}{B}: Attach to target creature you control; or unattach from a creature. Reconfigure only as a sorcery. While attached, this isn't a creature.) +mana={1}{B} +type=Artifact Creature +subtype=Equipment Demon +power=3 +toughness=1 +[/card] +[card] name=Blade-Blizzard Kitsune abilities=double strike autohand={3}{W}{N}:ninjutsu @@ -10357,6 +10396,16 @@ power=2 toughness=1 [/card] [card] +name=Born to Drive +target=artifact,creature +auto=teach(creature) foreach(*[creature;vehicle]|mybattlefield) 1/1 +autohand={2}{W}{D}:name(Create 2 pilots) token(Pilot)*2 +text=Enchant artifact or creature -- As long as enchanted permanent is a creature, it gets +1/+1 for each creature and/or Vehicle you control. -- Channel - {2}{W}, Discard Born to Drive: Create two 1/1 colorless Pilot creature tokens with "This creature crews Vehicles as though its power were 2 greater." +mana={2}{W} +type=Enchantment +subtype=Aura +[/card] +[card] name=Boros Challenger abilities=mentor auto=_ATTACKING_name(Choose attacking creature) transforms((,newability[target(other creature[attacking;power<=pminus1minusend]|myBattlefield) counter(1/1)])) oneshot @@ -10369,16 +10418,6 @@ power=2 toughness=3 [/card] [card] -name=Born to Drive -target=artifact,creature -auto=teach(creature) foreach(*[creature;vehicle]|mybattlefield) 1/1 -autohand={2}{W}{D}:name(Create 2 pilots) token(Pilot)*2 -text=Enchant artifact or creature -- As long as enchanted permanent is a creature, it gets +1/+1 for each creature and/or Vehicle you control. -- Channel - {2}{W}, Discard Born to Drive: Create two 1/1 colorless Pilot creature tokens with "This creature crews Vehicles as though its power were 2 greater." -mana={2}{W} -type=Enchantment -subtype=Aura -[/card] -[card] name=Boros Locket auto={T}:Add{R} auto={T}:Add{W} @@ -13866,6 +13905,19 @@ power=3 toughness=2 [/card] [card] +name=Chainflail Centipede +auto={2}:reconfigure +auto=this(cantargetcard(*[attached]|*) {2}{unattach}:name(Reconfigure unattach) name(Reconfigure unattach) donothing asSorcery +auto=teach(creature) transforms((,newability[@combat(attacking) source(this):name(Gains 2/0) name(Gains 2/0) 2/0 ueot])) +auto=@combat(attacking) source(this):name(Gains 2/0) name(Gains 2/0) ability$!name(Gains 2/0) all(mysource) 2/0 ueot!$ controller +text=Whenever Chainflail Centipede or equipped creature attacks, it gets +2/+0 until end of turn. -- Reconfigure {2} ({2}: Attach to target creature you control; or unattach from a creature. Reconfigure only as a sorcery. While attached, this isn't a creature.) +mana={2}{B} +type=Artifact Creature +subtype=Equipment Insect +power=2 +toughness=2 +[/card] +[card] name=Chains of Custody target=creature|myBattlefield auto=(blink)forsrc target(*[-land]|opponentbattlefield) @@ -16074,6 +16126,19 @@ power=1 toughness=1 [/card] [card] +name=Cloudsteel Kirin +abilities=flying +auto={5}:reconfigure +auto=this(cantargetcard(*[attached]|*) {5}{unattach}:name(Reconfigure unattach) name(Reconfigure unattach) donothing asSorcery +auto=teach(creature) transforms((,newability[flying],newability[cantlose])) +text=Flying -- Equipped creature has flying and "You can't lose the game and your opponents can't win the game." -- Reconfigure {5} ({5}: Attach to target creature you control; or unattach from a creature. Reconfigure only as a sorcery. While attached, this isn't a creature.) +mana={2}{W} +type=Artifact Creature +subtype=Equipment Kirin +power=3 +toughness=2 +[/card] +[card] name=Clue auto={S}{2}:name(Draw 1) draw:1 controller text={2}, Sacrifice this artifact: Draw a card. @@ -44589,6 +44654,16 @@ power=2 toughness=3 [/card] [card] +name=Ingenious Leonin +auto={3}{W}:name(Put counter) target(other creature[attacking]|myBattlefield) transforms((,newability[counter(1/1)],newability[if cantargetcard(*[cat]|*) then transforms((,newability[first strike])) ueot])) ueot +text={3}{W}: Put a +1/+1 counter on another target attacking creature you control. If that creature is a Cat, it gains first strike until end of turn. +mana={4}{W} +type=Creature +subtype=Cat Soldier +power=4 +toughness=4 +[/card] +[card] name=Ingenious Mastery other={2}{U} name(Cast without X) aicode=activate transforms((,newability[all(*[zpos<=2]|mylibrary) transforms((,newability[may name(Put on bottom of library) moveto(myreveal) and!( bottomoflibrary )!])) oneshot])) oneshot @@ -49857,6 +49932,20 @@ power=6 toughness=6 [/card] [card] +name=Komainu Battle Armor +abilities=menace +auto={4}:reconfigure +auto=this(cantargetcard(*[attached]|*) {4}{unattach}:name(Reconfigure unattach) name(Reconfigure unattach) donothing asSorcery +auto=teach(creature) transforms((,newability[menace],newability[2/2],newability[@combatdamagefoeof(player) from(this):name(Goad opponent creatures) name(Goad opponent creatures) all(creature|opponentbattlefield) _GOAD_])) +auto=@combatdamagefoeof(player) from(this):name(Goad opponent creatures) name(Goad opponent creatures) ability$!name(Goad opponent creatures) all(creature|mybattlefield) _GOAD_!$ controller +text=Menace -- Equipped creature gets +2/+2 and has menace. -- Whenever Komainu Battle Armor or equipped creature deals combat damage to a player, goad each creature that player controls. -- Reconfigure {4} ({4}: Attach to target creature you control; or unattach from a creature. Reconfigure only as a sorcery. While attached, this isn't a creature.) +mana={2}{R} +type=Artifact Creature +subtype=Equipment Dog +power=2 +toughness=2 +[/card] +[card] name=Kopala, Warden of Waves auto=@targeted(merfolk|myBattlefield) from(*[instant;sorcery]|opponentzones):choice name(This spell costs 2 more) name(This spell costs 2 more) target(*[instant;sorcery]|opponentzones) transforms((,newability[pay[[{2}]] name(pay 2 mana) donothing?fizzle])) oneshot text=Spells your opponents cast that target a Merfolk you control cost {2} more to cast. -- Abilities your opponents activate that target a Merfolk you control cost {2} more to activate. @@ -52326,6 +52415,19 @@ power=3 toughness=3 [/card] [card] +name=Lion Sash +auto={2}:reconfigure +auto=this(cantargetcard(*[attached]|*) {2}{unattach}:name(Reconfigure unattach) name(Reconfigure unattach) donothing +auto=teach(creature) storedhascnt11/storedhascnt11 nonstatic +auto={W}:name(Exile card from graveyard) target(*|graveyard) moveto(exile) and!( if cantargetcard(*[-instant;-sorcery]|*) then all(this) counter(1/1) )! +text={W}: Exile target card from a graveyard. If it was a permanent card, put a +1/+1 counter on Lion Sash. -- Equipped creature gets +1/+1 for each +1/+1 counter on Lion Sash. -- Reconfigure {2} ({2}: Attach to target creature you control; or unattach from a creature. Reconfigure only as a sorcery. While attached, this isn't a creature.) +mana={1}{W} +type=Artifact Creature +subtype=Equipment Cat +power=1 +toughness=1 +[/card] +[card] name=Liquid Fire target=creature auto=choice name(Choose 0) damage:5 targetcontroller @@ -75039,7 +75141,7 @@ auto={2}{B}{S(artifact|mybattlefield)}{S(artifact|mybattlefield)}{S(artifact|myb auto={2}{B}{S(artifact|mybattlefield)}{S(artifact|mybattlefield)}{S(artifact|mybattlefield)}{S(artifact|mybattlefield)}{S(artifact|mybattlefield)}{S(artifact|mybattlefield)}{S(artifact|mybattlefield)}{S(artifact|mybattlefield)}{S(artifact|mybattlefield)}{S(artifact|mybattlefield)}{S(artifact|mybattlefield)}{S(artifact|mybattlefield)}{S(artifact|mybattlefield)}{S(artifact|mybattlefield)}{S(artifact|mybattlefield)}{S(artifact|mybattlefield)}{S(artifact|mybattlefield)}{S(artifact|mybattlefield)}:name(Sacrifice 18 artifacts) target(creature[power<=18]|mygraveyard) moveto(mybattlefield) auto={2}{B}{S(artifact|mybattlefield)}{S(artifact|mybattlefield)}{S(artifact|mybattlefield)}{S(artifact|mybattlefield)}{S(artifact|mybattlefield)}{S(artifact|mybattlefield)}{S(artifact|mybattlefield)}{S(artifact|mybattlefield)}{S(artifact|mybattlefield)}{S(artifact|mybattlefield)}{S(artifact|mybattlefield)}{S(artifact|mybattlefield)}{S(artifact|mybattlefield)}{S(artifact|mybattlefield)}{S(artifact|mybattlefield)}{S(artifact|mybattlefield)}{S(artifact|mybattlefield)}{S(artifact|mybattlefield)}{S(artifact|mybattlefield)}:name(Sacrifice 19 artifacts) target(creature[power<=19]|mygraveyard) moveto(mybattlefield) auto={2}{B}{S(artifact|mybattlefield)}{S(artifact|mybattlefield)}{S(artifact|mybattlefield)}{S(artifact|mybattlefield)}{S(artifact|mybattlefield)}{S(artifact|mybattlefield)}{S(artifact|mybattlefield)}{S(artifact|mybattlefield)}{S(artifact|mybattlefield)}{S(artifact|mybattlefield)}{S(artifact|mybattlefield)}{S(artifact|mybattlefield)}{S(artifact|mybattlefield)}{S(artifact|mybattlefield)}{S(artifact|mybattlefield)}{S(artifact|mybattlefield)}{S(artifact|mybattlefield)}{S(artifact|mybattlefield)}{S(artifact|mybattlefield)}{S(artifact|mybattlefield)}:name(Sacrifice 20 artifacts) target(creature[power<=20]|mygraveyard) moveto(mybattlefield) -text=When Ruthless Technomancer enters the battlefield, you may sacrifice another creature you control. If you do, create a number of Treasure tokens equal to that creature’s power. -- {2}{B}, Sacrifice X artifacts: Return target creature card with power X or less from your graveyard to the battlefield. X can’t be 0. +text=When Ruthless Technomancer enters the battlefield, you may sacrifice another creature you control. If you do, create a number of Treasure tokens equal to that creatureâ??s power. -- {2}{B}, Sacrifice X artifacts: Return target creature card with power X or less from your graveyard to the battlefield. X canâ??t be 0. mana={3}{B} type=Creature subtype=Human Wizard @@ -89249,6 +89351,19 @@ type=Artifact subtype=Equipment [/card] [card] +name=Tanuki Transplanter +auto={3}:reconfigure +auto=this(cantargetcard(*[attached]|*) {3}{unattach}:name(Reconfigure unattach) name(Reconfigure unattach) donothing asSorcery +auto=teach(creature) transforms((,newability[@combat(attacking) source(this):name(Add green mana) thisforeach(variable{power}>0) ability$!name(Add green amana) add{G} doesntempty!$ controller])) +auto=@combat(attacking) source(this):name(Add green mana) thisforeach(variable{power}>0) ability$!name(Add green amana) add{G} doesntempty!$ controller +text=Whenever Tanuki Transplanter or equipped creature attacks, add an amount of {G} equal to its power. Until end of turn, you don't lose this mana as steps and phases end. -- Reconfigure {3} ({3}: Attach to target creature you control; or unattach from a creature. Reconfigure only as a sorcery. While attached, this isn't a creature.) +mana={3}{G} +type=Artifact Creature +subtype=Equipment Dog +power=2 +toughness=4 +[/card] +[card] name=Tapping at the Window flashback={2}{G} aicode=activate transforms((,newability[if type(creature[zpos<=3]|mylibrary)~equalto~0 then all(*[zpos<=3]|mylibrary) moveto(mygraveyard) else target(creature[zpos<=3]|mylibrary) moveto(myhand) and!( all(*[zpos<=3]|mylibrary) moveto(mygraveyard) )!])) oneshot @@ -91197,6 +91312,19 @@ type=Enchantment subtype=Saga [/card] [card] +name=The Reality Chip +abilities=showfromtoplibrary +auto={2}{U}:reconfigure +auto=this(cantargetcard(*[attached]|*) {2}{U}{unattach}:name(Reconfigure unattach) name(Reconfigure unattach) donothing asSorcery +auto=teach(creature) transforms((,newability[canplayfromlibrarytop])) +text=You may look at the top card of your library any time. -- As long as The Reality Chip is attached to a creature, you may play lands and cast spells from the top of your library. -- Reconfigure {2}{U} ({2}{U}: Attach to target creature you control; or unattach from a creature. Reconfigure only as a sorcery. While attached, this isn't a creature.) +mana={1}{U} +type=Legendary Artifact Creature +subtype=Equipment Jellyfish +power=0 +toughness=4 +[/card] +[card] name=The Reaver Cleaver auto=teach(creature) 1/1 auto=teach(creature) trample diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 16aa5291d..2369442ef 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -1,6 +1,6 @@ #Primitives Pack for Wagic the Homebrew. #Please keep these card alphabetized, and try to have the "name=" line at the top of each card -#I sorted this programmatically so the other comments are removed except for AUTO_DEFINE - Vitty85 23-05-2023 +#I sorted this programmatically so the other comments are removed except for AUTO_DEFINE - Vitty85 04-06-2023 [card] name=Abandon Reason target=creature @@ -18579,24 +18579,28 @@ type=Artifact [/card] [card] name=Chalice of the Void -auto=counter(0/0,xx,Charge) -auto=this(counter{0/0.1.Charge}<1) transforms((,newability[@movedTo(*[manacost=0]|stack):choice fizzle all(*[manacost==0]|stack)])) -auto=this(counter{0/0.1.Charge}) transforms((,newability[@movedTo(*[manacost=1]|stack):choice fizzle all(*[manacost==1]|stack)])) -auto=this(counter{0/0.2.Charge}) transforms((,newability[@movedTo(*[manacost=2]|stack):choice fizzle all(*[manacost==2]|stack)])) -auto=this(counter{0/0.3.Charge}) transforms((,newability[@movedTo(*[manacost=3]|stack):choice fizzle all(*[manacost==3]|stack)])) -auto=this(counter{0/0.4.Charge}) transforms((,newability[@movedTo(*[manacost=4]|stack):choice fizzle all(*[manacost==4]|stack)])) -auto=this(counter{0/0.5.Charge}) transforms((,newability[@movedTo(*[manacost=5]|stack):choice fizzle all(*[manacost==5]|stack)])) -auto=this(counter{0/0.6.Charge}) transforms((,newability[@movedTo(*[manacost=6]|stack):choice fizzle all(*[manacost==6]|stack)])) -auto=this(counter{0/0.7.Charge}) transforms((,newability[@movedTo(*[manacost=7]|stack):choice fizzle all(*[manacost==7]|stack)])) -auto=this(counter{0/0.8.Charge}) transforms((,newability[@movedTo(*[manacost=8]|stack):choice fizzle all(*[manacost==8]|stack)])) -auto=this(counter{0/0.9.Charge}) transforms((,newability[@movedTo(*[manacost=9]|stack):choice fizzle all(*[manacost==9]|stack)])) -auto=this(counter{0/0.10.Charge}) transforms((,newability[@movedTo(*[manacost=10]|stack):choice fizzle all(*[manacost==10]|stack)])) -auto=this(counter{0/0.11.Charge}) transforms((,newability[@movedTo(*[manacost=11]|stack):choice fizzle all(*[manacost=11]|stack)])) -auto=this(counter{0/0.12.Charge}) transforms((,newability[@movedTo(*[manacost=12]|stack):choice fizzle all(*[manacost=12]|stack)])) -auto=this(counter{0/0.13.Charge}) transforms((,newability[@movedTo(*[manacost=13]|stack):choice fizzle all(*[manacost=13]|stack)])) -auto=this(counter{0/0.14.Charge}) transforms((,newability[@movedTo(*[manacost=14]|stack):choice fizzle all(*[manacost=14]|stack)])) -auto=this(counter{0/0.15.Charge}) transforms((,newability[@movedTo(*[manacost=15]|stack):choice fizzle all(*[manacost=15]|stack)])) -auto=this(counter{0/0.16.Charge}) transforms((,newability[@movedTo(*[manacost=16]|stack):choice fizzle all(*[manacost=16]|stack)])) +auto=counter(0/0,halfpaid,Charge) +auto=@movedTo(*[manacost=0]|stack) restriction{compare(hascntcharge)~equalto~0}:choice name(Counter spell) fizzle all(*[manacost=0]|stack) +auto=@movedTo(*[manacost=1]|stack) restriction{compare(hascntcharge)~equalto~1}:choice name(Counter spell) fizzle all(*[manacost=1]|stack) +auto=@movedTo(*[manacost=2]|stack) restriction{compare(hascntcharge)~equalto~2}:choice name(Counter spell) fizzle all(*[manacost=2]|stack) +auto=@movedTo(*[manacost=3]|stack) restriction{compare(hascntcharge)~equalto~3}:choice name(Counter spell) fizzle all(*[manacost=3]|stack) +auto=@movedTo(*[manacost=4]|stack) restriction{compare(hascntcharge)~equalto~4}:choice name(Counter spell) fizzle all(*[manacost=4]|stack) +auto=@movedTo(*[manacost=5]|stack) restriction{compare(hascntcharge)~equalto~5}:choice name(Counter spell) fizzle all(*[manacost=5]|stack) +auto=@movedTo(*[manacost=6]|stack) restriction{compare(hascntcharge)~equalto~6}:choice name(Counter spell) fizzle all(*[manacost=6]|stack) +auto=@movedTo(*[manacost=7]|stack) restriction{compare(hascntcharge)~equalto~7}:choice name(Counter spell) fizzle all(*[manacost=7]|stack) +auto=@movedTo(*[manacost=8]|stack) restriction{compare(hascntcharge)~equalto~8}:choice name(Counter spell) fizzle all(*[manacost=8]|stack) +auto=@movedTo(*[manacost=9]|stack) restriction{compare(hascntcharge)~equalto~9}:choice name(Counter spell) fizzle all(*[manacost=9]|stack) +auto=@movedTo(*[manacost=10]|stack) restriction{compare(hascntcharge)~equalto~10}:choice name(Counter spell) fizzle all(*[manacost=10]|stack) +auto=@movedTo(*[manacost=11]|stack) restriction{compare(hascntcharge)~equalto~11}:choice name(Counter spell) fizzle all(*[manacost=11]|stack) +auto=@movedTo(*[manacost=12]|stack) restriction{compare(hascntcharge)~equalto~12}:choice name(Counter spell) fizzle all(*[manacost=12]|stack) +auto=@movedTo(*[manacost=13]|stack) restriction{compare(hascntcharge)~equalto~13}:choice name(Counter spell) fizzle all(*[manacost=13]|stack) +auto=@movedTo(*[manacost=14]|stack) restriction{compare(hascntcharge)~equalto~14}:choice name(Counter spell) fizzle all(*[manacost=14]|stack) +auto=@movedTo(*[manacost=15]|stack) restriction{compare(hascntcharge)~equalto~15}:choice name(Counter spell) fizzle all(*[manacost=15]|stack) +auto=@movedTo(*[manacost=16]|stack) restriction{compare(hascntcharge)~equalto~16}:choice name(Counter spell) fizzle all(*[manacost=16]|stack) +auto=@movedTo(*[manacost=17]|stack) restriction{compare(hascntcharge)~equalto~17}:choice name(Counter spell) fizzle all(*[manacost=17]|stack) +auto=@movedTo(*[manacost=18]|stack) restriction{compare(hascntcharge)~equalto~18}:choice name(Counter spell) fizzle all(*[manacost=18]|stack) +auto=@movedTo(*[manacost=19]|stack) restriction{compare(hascntcharge)~equalto~19}:choice name(Counter spell) fizzle all(*[manacost=19]|stack) +auto=@movedTo(*[manacost>=20]|stack) restriction{compare(hascntcharge)~morethan~19}:choice name(Counter spell) fizzle all(*[manacost>=20]|stack) text=Chalice of the Void enters the battlefield with X charge counters on it. -- Whenever a player casts a spell with mana value equal to the number of charge counters on Chalice of the Void, counter that spell. mana={X}{X} type=Artifact diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index fe16cf494..2f5d14e70 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -3545,6 +3545,7 @@ private: vector currentAbilities; public: + bool isReconfiguration; AEquip(GameObserver* observer, int _id, MTGCardInstance * _source, ManaCost * _cost = NULL, int restrictions = ActivatedAbility::AS_SORCERY); diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index 6ca9e6dd1..0fd642d65 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -9650,6 +9650,7 @@ AEquip::AEquip(GameObserver* observer, int _id, MTGCardInstance * _source, ManaC { aType = MTGAbility::STANDARD_EQUIP; isAttach = restrictions != ActivatedAbility::AS_SORCERY; + isReconfiguration = false; } int AEquip::unequip() @@ -9678,6 +9679,8 @@ int AEquip::unequip() } game->removeObserver(currentAbilities[i]); } + if(isReconfiguration && !source->hasType(Subtypes::TYPE_CREATURE)) + source->addType(Subtypes::TYPE_CREATURE); currentAbilities.clear(); WEvent * e = NEW WEventCardUnattached(source); game->receiveEvent(e); @@ -9686,6 +9689,8 @@ int AEquip::unequip() int AEquip::equip(MTGCardInstance * equipped) { + if(isReconfiguration && source->hasType(Subtypes::TYPE_CREATURE)) + source->removeType(Subtypes::TYPE_CREATURE); source->target = equipped; source->target->equipment += 1; source->parentCards.push_back(equipped); @@ -9768,6 +9773,8 @@ const string AEquip::getMenuText() { if (isAttach) return "Attach"; + else if (isReconfiguration) + return "Reconfigure Attach"; else return "Equip"; } diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index 1aa21d9b8..526f0aae2 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -3644,7 +3644,16 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG if ((s.find("equipment") == string::npos) && (s.find("equipped") == string::npos)) // Fix a bug on parser when reading the substring "equip" with a different meaning. return NEW AEquip(observer, id, card); } - + + //Reconfiguration + found = s.find("reconfigure"); + if (found != string::npos) + { + AEquip* a = NEW AEquip(observer, id, card); + a->isReconfiguration = true; + return a; + } + // TODO: deprecate this ability in favor of retarget //Equipment (attach) found = s.find("attach");