From c2d78db724089590fa0457d28025a2f825b98fde Mon Sep 17 00:00:00 2001 From: Vittorio Alfieri Date: Thu, 22 Jun 2023 18:39:11 +0200 Subject: [PATCH] Added / fixed primitives from NEO set, added "mytgtforced" target for equipments and auras, added "numofactivation" keyword to give PT according to how many time an ability has triggred (e.g. "Bronze Cudgels"). --- .../bin/Res/sets/primitives/borderline.txt | 246 +++++++++++++++++- .../bin/Res/sets/primitives/planeswalkers.txt | 14 +- projects/mtg/include/AllAbilities.h | 63 +++++ projects/mtg/src/AllAbilities.cpp | 15 +- projects/mtg/src/TargetChooser.cpp | 4 +- 5 files changed, 335 insertions(+), 7 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/borderline.txt b/projects/mtg/bin/Res/sets/primitives/borderline.txt index 571a1e686..471320c4b 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 21-06-2023 +#I sorted this programmatically - Thanks to Vitty85 22-06-2023 [card] name=+2 Mace auto={3}:equip @@ -8272,6 +8272,20 @@ mana={1}{G} type=Instant [/card] [card] +name=Biting-Palm Ninja +autohand={2}{B}{N}:ninjutsu +auto=counter(0/0,1,Menace) +auto=this(counter{0/0.1.Menace}>0) menace +auto=@combatdamaged(player) from(this) restriction{compare(hascntmenace)~morethan~0,type(*[-land]|opponenthand)~morethan~0}:may name(Remove menace counter and look hand) counter(0/0,-1,Menace) && ability$!name(Exile nonland card) name(Exile nonland card) target(*[-land]|opponenthand) moveto(exile)!$ controller +auto=@combatdamaged(player) from(this) restriction{compare(hascntmenace)~morethan~0,type(*[-land]|opponenthand)~equalto~0}:may name(Remove menace counter and look hand) counter(0/0,-1,Menace) && ability$!name(Look opponent hand) name(Look opponent hand) target(*|opponenthand) moveto(myreveal) and!( moveto(opponenthand) )!!$ controller +text=Ninjutsu {2}{B} -- Biting-Palm Ninja enters the battlefield with a menace counter on it. -- Whenever Biting-Palm Ninja deals combat damage to a player, you may remove a menace counter from it. When you do, that player reveals their hand and you choose a nonland card from it. Exile that card. +mana={2}{B} +type=Creature +subtype=Human Ninja +power=3 +toughness=3 +[/card] +[card] name=Bitter Reunion auto=may reject notatarget(*|myhand) and!( draw:2 controller )! auto={1}{S}:all(creature|myBattlefield) haste ueot @@ -11911,7 +11925,7 @@ toughness=6 [/card] [card] name=Bronze Cudgels -auto=teach(creature) transforms((,newability[{2}:name(Creature gains X/0) counter(0/0.1.BronzeEffect) notrg && hascntbronzeeffect/0 ueot],newability[@each endofturn restriction{compare(hascntbronzeeffect)~morethan~0}:name(Effect ends) name(Effect ends) counter(0/0.-hascntbronzeeffect.BronzeEffect) notrg])) +auto=teach(creature) {2}:name(Creature gains X/0) numofactivation/0 ueot auto={1}:equip text={2}: Until end of turn, equipped creature gets +X/+0, where X is the number of times this ability has resolved this turn. -- Equip {1} ({1}: Attach to target creature you control. Equip only as a sorcery.) mana={1} @@ -13279,6 +13293,16 @@ subtype=Gnome Ranger power=1 toughness=4 [/card] +[card] +name=Careful Cultivation +target=artifact,creature +auto=teach(creature) transforms((,newability[{T}:name(Add 2 green mana) name(Add 2 green mana) add{G}{G}],newability[reach],newability[1/3])) +autohand={1}{G}{discard}:name(Discard and create human) token(Human Monk) +text=Enchant artifact or creature -- As long as enchanted permanent is a creature, it gets +1/+3 and has reach and "{T}: Add {G}{G}." -- Channel - {1}{G}, Discard Careful Cultivation: Create a 1/1 green Human Monk creature token with "{T}: Add {G}." +mana={2}{G} +type=Enchantment +subtype=Aura +[/card] [card] name=Careless Celebrant auto=_DIES_damage:2 target(creature,planeswalker|opponentBattlefield) @@ -18601,6 +18625,37 @@ power=2 toughness=1 [/card] [card] +name=Covert Technician +autohand={1}{U}{N}:ninjutsu +auto=@combatdamaged(player) from(this) restriction{compare(thatmuch)~equalto~0}:may name(Put artifact in play) target(artifact[manacost<=0]|myhand) moveto(mybattlefield) +auto=@combatdamaged(player) from(this) restriction{compare(thatmuch)~equalto~1}:may name(Put artifact in play) target(artifact[manacost<=1]|myhand) moveto(mybattlefield) +auto=@combatdamaged(player) from(this) restriction{compare(thatmuch)~equalto~2}:may name(Put artifact in play) target(artifact[manacost<=2]|myhand) moveto(mybattlefield) +auto=@combatdamaged(player) from(this) restriction{compare(thatmuch)~equalto~3}:may name(Put artifact in play) target(artifact[manacost<=3]|myhand) moveto(mybattlefield) +auto=@combatdamaged(player) from(this) restriction{compare(thatmuch)~equalto~4}:may name(Put artifact in play) target(artifact[manacost<=4]|myhand) moveto(mybattlefield) +auto=@combatdamaged(player) from(this) restriction{compare(thatmuch)~equalto~5}:may name(Put artifact in play) target(artifact[manacost<=5]|myhand) moveto(mybattlefield) +auto=@combatdamaged(player) from(this) restriction{compare(thatmuch)~equalto~6}:may name(Put artifact in play) target(artifact[manacost<=6]|myhand) moveto(mybattlefield) +auto=@combatdamaged(player) from(this) restriction{compare(thatmuch)~equalto~7}:may name(Put artifact in play) target(artifact[manacost<=7]|myhand) moveto(mybattlefield) +auto=@combatdamaged(player) from(this) restriction{compare(thatmuch)~equalto~8}:may name(Put artifact in play) target(artifact[manacost<=8]|myhand) moveto(mybattlefield) +auto=@combatdamaged(player) from(this) restriction{compare(thatmuch)~equalto~9}:may name(Put artifact in play) target(artifact[manacost<=9]|myhand) moveto(mybattlefield) +auto=@combatdamaged(player) from(this) restriction{compare(thatmuch)~equalto~10}:may name(Put artifact in play) target(artifact[manacost<=10]|myhand) moveto(mybattlefield) +auto=@combatdamaged(player) from(this) restriction{compare(thatmuch)~equalto~11}:may name(Put artifact in play) target(artifact[manacost<=11]|myhand) moveto(mybattlefield) +auto=@combatdamaged(player) from(this) restriction{compare(thatmuch)~equalto~12}:may name(Put artifact in play) target(artifact[manacost<=12]|myhand) moveto(mybattlefield) +auto=@combatdamaged(player) from(this) restriction{compare(thatmuch)~equalto~13}:may name(Put artifact in play) target(artifact[manacost<=13]|myhand) moveto(mybattlefield) +auto=@combatdamaged(player) from(this) restriction{compare(thatmuch)~equalto~14}:may name(Put artifact in play) target(artifact[manacost<=14]|myhand) moveto(mybattlefield) +auto=@combatdamaged(player) from(this) restriction{compare(thatmuch)~equalto~15}:may name(Put artifact in play) target(artifact[manacost<=15]|myhand) moveto(mybattlefield) +auto=@combatdamaged(player) from(this) restriction{compare(thatmuch)~equalto~16}:may name(Put artifact in play) target(artifact[manacost<=16]|myhand) moveto(mybattlefield) +auto=@combatdamaged(player) from(this) restriction{compare(thatmuch)~equalto~17}:may name(Put artifact in play) target(artifact[manacost<=17]|myhand) moveto(mybattlefield) +auto=@combatdamaged(player) from(this) restriction{compare(thatmuch)~equalto~18}:may name(Put artifact in play) target(artifact[manacost<=18]|myhand) moveto(mybattlefield) +auto=@combatdamaged(player) from(this) restriction{compare(thatmuch)~equalto~19}:may name(Put artifact in play) target(artifact[manacost<=19]|myhand) moveto(mybattlefield) +auto=@combatdamaged(player) from(this) restriction{compare(thatmuch)~morethan~19}:may name(Put artifact in play) target(artifact[manacost<=20]|myhand) moveto(mybattlefield) +text=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.) -- Whenever Covert Technician deals combat damage to a player, you may put an artifact card with mana value less than or equal to that damage from your hand onto the battlefield. +mana={2}{U} +type=Artifact Creature +subtype=Human Ninja +power=2 +toughness=4 +[/card] +[card] name=Coveted Jewel auto=draw:3 auto={T}:Add{W}{W}{W} @@ -18706,6 +18761,16 @@ power=* toughness=4 [/card] [card] +name=Crackling Emergence +target=land +auto=becomes(Creature Spirit,3/3,red,haste) +auto=@movedto(mytgt|graveyard) from(myBattlefield):name(Land becomes indestructible) transforms((,newability[all(land[zpos=type:*:mygraveyard]|mygraveyard) moveto(myBattlefield) and!( becomes(^^indestructible) ueot )!])) ueot +text=Enchant land you control -- Enchanted land is a 3/3 red Spirit creature with haste. It's still a land. -- If enchanted land would be destroyed, instead sacrifice Crackling Emergence and that land gains indestructible until end of turn. +mana={1}{R} +type=Enchantment +subtype=Aura +[/card] +[card] name=Cradle Clearcutter other={2}{G} name(prototype) auto=if paid(alternative) then becomes(,1/3,green) @@ -24721,6 +24786,16 @@ mana={1}{U}{R} type=Instant [/card] [card] +name=Dragonspark Reactor +auto=counter(0/0,1,Charge) +auto=@movedTo(other artifact|myBattlefield):name(Put charge counter) counter(0/0,1,Charge) +auto={4}{S}:name(Damage opponent and creature) damage:hascntcharge opponent && ability$!may name(Damage a creature) target(creature|battlefield) damage:storedhascntcharge!$ controller +auto={4}{S}:name(Damage controller and creature) damage:hascntcharge controller && ability$!may name(Damage a creature) target(creature|battlefield) damage:storedhascntcharge!$ controller +text=Whenever Dragonspark Reactor or another artifact enters the battlefield under your control, put a charge counter on Dragonspark Reactor. -- {4}, Sacrifice Dragonspark Reactor: It deals damage equal to the number of charge counters on it to target player and that much damage to up to one target creature. +mana={1}{R} +type=Artifact +[/card] +[card] name=Dragonwing Glider auto=teach(creature) 2/2 auto=teach(creature) flying @@ -29704,6 +29779,15 @@ mana={2}{U}{R} type=Sorcery [/card] [card] +name=Experimental Synthesizer +auto=name(Exile top card) all(*[zpos=1]|mylibrary) moveto(myexile) and!( transforms((,newability[canplayfromexile])) ueot )! +auto=_DIES_name(Exile top card) all(*[zpos=1]|mylibrary) moveto(myexile) and!( transforms((,newability[canplayfromexile])) ueot )! +auto={2}{R}{S}:name(Create samurai) token(Samurai,Creature Samurai,2/2,white,vigilance) +text=When Experimental Synthesizer enters or leaves the battlefield, exile the top card of your library. Until end of turn, you may play that card. -- {2}{R}, Sacrifice Experimental Synthesizer: Create a 2/2 white Samurai creature token with vigilance. Activate only as a sorcery. +mana={R} +type=Artifact +[/card] +[card] name=Explore the Underdark auto=_INITIATIVE_CONTROLLER_ auto=name(search 2 lands or gates) target(land[basic;gate]|myLibrary) moveTo(myBattlefield) and!( tap(noevent) )! @@ -38560,6 +38644,17 @@ power=3 toughness=4 [/card] [card] +name=Goro-Goro, Disciple of Ryusei +auto={R}:name(Creatures gain haste) all(creature|myBattlefield) transforms((,newability[haste])) ueot +auto=aslongas(creature[modified]|myBattlefield) {3}{R}{R}:name(Create dragon) name(Create dragon) token(Dragon Spirit,Creature Dragon Spirit,5/5,red,flying) +text={R}: Creatures you control gain haste until end of turn. -- {3}{R}{R}: Create a 5/5 red Dragon Spirit creature token with flying. Activate only if you control an attacking modified creature. (Equipment, Auras you control, and counters are modifications.) +mana={1}{R} +type=Legendary Creature +subtype=Goblin Samurai +power=2 +toughness=2 +[/card] +[card] name=Gossamer Chains auto={H}:name(prevent all combat damage that would be dealt by target creature) donothing target(creature[attacking]) && fog to(mytgt) oneshot && fog from(mytgt) oneshot text=Return Gossamer Chains to its owner's hand: Prevent all combat damage that would be dealt by target unblocked creature this turn. @@ -42631,6 +42726,17 @@ power=5 toughness=4 [/card] [card] +name=Hidetsugu, Devouring Chaos +auto={B}{S(creature|myBattlefield)}:name(Scry 2) _SCRY2_ +auto={2}{R}{T}:name(Exile the top card) all(*[zpos=1]|mylibrary) moveto(myexile) and!( transforms((,newability[canplayfromexile],newability[if cantargetcard(*[-land&manacost>=1]|*) then name(Deal damage) name(Deal damage) target(player^creature^planeswalker) damage:manacost])) ueot )! +text={B}, Sacrifice a creature: Scry 2. -- {2}{R}, {T}: Exile the top card of your library. You may play that card this turn. When you exile a nonland card this way, Hidetsugu, Devouring Chaos deals damage equal to the exiled card's mana value to any target. +mana={3}{B} +type=Legendary Creature +subtype=Ogre Demon +power=4 +toughness=4 +[/card] +[card] name=Hieroglyphic Illumination abilities=cycling auto=draw:2 controller @@ -47428,6 +47534,14 @@ text=Whenever you cast an instant or sorcery spell from your hand, you may copy type=Enchantment [/card] [card] +name=Invoke Calamity +abilities=exiledeath +auto=may name(Choose instants or sorceries) target(*[-creature&-artifact&-battle&-planeswalker&-enchantment&-tribal&manacost<=6]|mygraveyard,myhand) activate castcard(normal) and!( transforms((,newability[gainedexiledeath])) ueot )! +text=You may cast up to two instant and/or sorcery spells with total mana value 6 or less from your graveyard and/or hand without paying their mana costs. If those spells would be put into your graveyard, exile them instead. Exile Invoke Calamity. +mana={1}{R}{R}{R}{R} +type=Instant +[/card] +[card] name=Invoke Despair auto=if type(creature|opponentbattlefield)~morethan~0 then name(Opponent sacrifices creature) name(Opponent sacrifices creature) ability$!name(Sacrifice a creature) name(Sacrifice a creature) target(creature|mybattlefield) sacrifice!$ opponent auto=if type(creature|opponentbattlefield)~equalto~0 then name(Opponent cannot sacrifice creature) name(Opponent cannot sacrifice creature) life:-2 opponent && draw:1 controller @@ -49559,6 +49673,15 @@ power=1 toughness=1 [/card] [card] +name=Kami's Flare +target=creature,planeswalker +auto=damage:3 +auto=if type(creature[modified]|myBattlefield)~morethan~0 then damage:2 +text=Kami's Flare deals 3 damage to target creature or planeswalker. Kami's Flare also deals 2 damage to that permanent's controller if you control a modified creature. (Equipment, Auras you control, and counters are modifications.) +mana={1}{R} +type=Instant +[/card] +[card] name=Kangee's Lieutenant abilities=flying auto=_ATTACKING_all(creature[attacking;flying]) 1/1 ueot @@ -50183,6 +50306,17 @@ mana={3} type=Legendary Artifact [/card] [card] +name=Keimi +auto=@movedTo(enchantment|mystack):name(You gain life) life:1 controller +auto=@movedTo(enchantment|mystack):name(Opponent loses life) life:-1 opponent +text=Whenever you cast an enchantment spell, each opponent loses 1 life and you gain 1 life. +color=green +type=Creature +subtype=Frog +power=3 +toughness=3 +[/card] +[card] name=Keldon Overseer abilities=haste kicker={3}{R} @@ -56672,6 +56806,26 @@ mana={2}{U} type=Sorcery [/card] [card] +name=March of Reckless Joy +other={X}{R} name(Cast and exile red cards) +otherrestriction=type(*[red]|myhand)~morethan~0 +auto=if paid(alternative) then if type(other *[red]|myhand)~morethan~0 then choice name(Cast and exile 1 red card) name(Cast and exile 1 red card) name(Cast and exile 1 red card) activate castcard(copied noevent costx!:fullpaidplus2plusend:! named!:March of Reckless Joy:!) and!( ability$!name(Exile 1 red card) name(Exile 1 red card) target(*[red]|myhand) moveto(myexile)!$ controller )! +auto=if paid(alternative) then if type(other *[red]|myhand)~morethan~1 then choice name(Cast and exile 2 red cards) name(Cast and exile 2 red cards) name(Cast and exile 2 red cards) activate castcard(copied noevent costx!:fullpaidplus4plusend:! named!:March of Reckless Joy:!) and!( ability$!name(Exile 2 red cards) name(Exile 2 red cards) target(<2>*[red]|myhand) moveto(myexile)!$ controller )! +auto=if paid(alternative) then if type(other *[red]|myhand)~morethan~2 then choice name(Cast and exile 3 red cards) name(Cast and exile 3 red cards) name(Cast and exile 3 red cards) activate castcard(copied noevent costx!:fullpaidplus6plusend:! named!:March of Reckless Joy:!) and!( ability$!name(Exile 3 red cards) name(Exile 3 red cards) target(<3>*[red]|myhand) moveto(myexile)!$ controller )! +auto=if paid(alternative) then if type(other *[red]|myhand)~morethan~3 then choice name(Cast and exile 4 red cards) name(Cast and exile 4 red cards) name(Cast and exile 4 red cards) activate castcard(copied noevent costx!:fullpaidplus8plusend:! named!:March of Reckless Joy:!) and!( ability$!name(Exile 4 red cards) name(Exile 4 red cards) target(<4>*[red]|myhand) moveto(myexile)!$ controller )! +auto=if paid(alternative) then if type(other *[red]|myhand)~morethan~4 then choice name(Cast and exile 5 red cards) name(Cast and exile 5 red cards) name(Cast and exile 5 red cards) activate castcard(copied noevent costx!:fullpaidplus10plusend:! named!:March of Reckless Joy:!) and!( ability$!name(Exile 5 red cards) name(Exile 5 red cards) target(<5>*[red]|myhand) moveto(myexile)!$ controller )! +auto=if paid(alternative) then if type(other *[red]|myhand)~morethan~5 then choice name(Cast and exile 6 red cards) name(Cast and exile 6 red cards) name(Cast and exile 6 red cards) activate castcard(copied noevent costx!:fullpaidplus12plusend:! named!:March of Reckless Joy:!) and!( ability$!name(Exile 6 red cards) name(Exile 6 red cards) target(<6>*[red]|myhand) moveto(myexile)!$ controller )! +auto=if paid(alternative) then if type(other *[red]|myhand)~morethan~6 then choice name(Cast and exile 7 red cards) name(Cast and exile 7 red cards) name(Cast and exile 7 red cards) activate castcard(copied noevent costx!:fullpaidplus14plusend:! named!:March of Reckless Joy:!) and!( ability$!name(Exile 7 red cards) name(Exile 7 red cards) target(<7>*[red]|myhand) moveto(myexile)!$ controller )! +auto=if paid(alternative) then if type(other *[red]|myhand)~morethan~7 then choice name(Cast and exile 8 red cards) name(Cast and exile 8 red cards) name(Cast and exile 8 red cards) activate castcard(copied noevent costx!:fullpaidplus16plusend:! named!:March of Reckless Joy:!) and!( ability$!name(Exile 8 red cards) name(Exile 8 red cards) target(<8>*[red]|myhand) moveto(myexile)!$ controller )! +auto=if paid(alternative) then if type(other *[red]|myhand)~morethan~8 then choice name(Cast and exile 9 red cards) name(Cast and exile 9 red cards) name(Cast and exile 9 red cards) activate castcard(copied noevent costx!:fullpaidplus18plusend:! named!:March of Reckless Joy:!) and!( ability$!name(Exile 9 red cards) name(Exile 9 red cards) target(<9>*[red]|myhand) moveto(myexile)!$ controller )! +auto=if paid(alternative) then if type(other *[red]|myhand)~morethan~9 then choice name(Cast and exile 10 red cards) name(Cast and exile 10 red cards) name(Cast and exile 10 red cards) activate castcard(copied noevent costx!:fullpaidplus20plusend:! named!:March of Reckless Joy:!) and!( ability$!name(Exile 10 red cards) name(Exile 10 red cards) target(<10>*[red]|myhand) moveto(myexile)!$ controller )! +auto=ifnot paid(alternative) then name(Exile top cards) name(Exile top cards) all(*[zpos<=fullpaid]|mylibrary) moveto(myexile) and!( becomes(tobejoy) ueot )! +auto=ifnot paid(alternative) then may name(Choose 2 exiled cards) name(Choose 2 exiled cards) all(*[zpos=3]|myLibrary) transforms((,newability[name(Choose 2 exiled cards) target(tobejoy|myexile) transforms((,newability[canplayfromexile uynt],newability[all(other tobejoy|myexile) removetypes(tobejoy)])) uynt])) uynt +text=As an additional cost to cast this spell, you may exile any number of red cards from your hand. This spell costs {2} less to cast for each card exiled this way. -- Exile the top X cards of your library. You may play up to two of those cards until the end of your next turn. +mana={X}{R} +type=Instant +[/card] +[card] name=March of Swirling Mist other={X}{U} name(Cast and exile blue cards) otherrestriction=type(*[blue]|myhand)~morethan~0 @@ -56691,6 +56845,26 @@ mana={X}{U} type=Instant [/card] [card] +name=March of Wretched Sorrow +other={X}{B} name(Cast and exile black cards) +otherrestriction=type(*[black]|myhand)~morethan~0 +auto=if paid(alternative) then if type(other *[black]|myhand)~morethan~0 then choice name(Cast and exile 1 black card) name(Cast and exile 1 black card) name(Cast and exile 1 black card) activate castcard(copied noevent costx!:fullpaidplus2plusend:! named!:March of Wretched Sorrow:!) and!( ability$!name(Exile 1 black card) name(Exile 1 black card) target(*[black]|myhand) moveto(myexile)!$ controller )! +auto=if paid(alternative) then if type(other *[black]|myhand)~morethan~1 then choice name(Cast and exile 2 black cards) name(Cast and exile 2 black cards) name(Cast and exile 2 black cards) activate castcard(copied noevent costx!:fullpaidplus4plusend:! named!:March of Wretched Sorrow:!) and!( ability$!name(Exile 2 black cards) name(Exile 2 black cards) target(<2>*[black]|myhand) moveto(myexile)!$ controller )! +auto=if paid(alternative) then if type(other *[black]|myhand)~morethan~2 then choice name(Cast and exile 3 black cards) name(Cast and exile 3 black cards) name(Cast and exile 3 black cards) activate castcard(copied noevent costx!:fullpaidplus6plusend:! named!:March of Wretched Sorrow:!) and!( ability$!name(Exile 3 black cards) name(Exile 3 black cards) target(<3>*[black]|myhand) moveto(myexile)!$ controller )! +auto=if paid(alternative) then if type(other *[black]|myhand)~morethan~3 then choice name(Cast and exile 4 black cards) name(Cast and exile 4 black cards) name(Cast and exile 4 black cards) activate castcard(copied noevent costx!:fullpaidplus8plusend:! named!:March of Wretched Sorrow:!) and!( ability$!name(Exile 4 black cards) name(Exile 4 black cards) target(<4>*[black]|myhand) moveto(myexile)!$ controller )! +auto=if paid(alternative) then if type(other *[black]|myhand)~morethan~4 then choice name(Cast and exile 5 black cards) name(Cast and exile 5 black cards) name(Cast and exile 5 black cards) activate castcard(copied noevent costx!:fullpaidplus10plusend:! named!:March of Wretched Sorrow:!) and!( ability$!name(Exile 5 black cards) name(Exile 5 black cards) target(<5>*[black]|myhand) moveto(myexile)!$ controller )! +auto=if paid(alternative) then if type(other *[black]|myhand)~morethan~5 then choice name(Cast and exile 6 black cards) name(Cast and exile 6 black cards) name(Cast and exile 6 black cards) activate castcard(copied noevent costx!:fullpaidplus12plusend:! named!:March of Wretched Sorrow:!) and!( ability$!name(Exile 6 black cards) name(Exile 6 black cards) target(<6>*[black]|myhand) moveto(myexile)!$ controller )! +auto=if paid(alternative) then if type(other *[black]|myhand)~morethan~6 then choice name(Cast and exile 7 black cards) name(Cast and exile 7 black cards) name(Cast and exile 7 black cards) activate castcard(copied noevent costx!:fullpaidplus14plusend:! named!:March of Wretched Sorrow:!) and!( ability$!name(Exile 7 black cards) name(Exile 7 black cards) target(<7>*[black]|myhand) moveto(myexile)!$ controller )! +auto=if paid(alternative) then if type(other *[black]|myhand)~morethan~7 then choice name(Cast and exile 8 black cards) name(Cast and exile 8 black cards) name(Cast and exile 8 black cards) activate castcard(copied noevent costx!:fullpaidplus16plusend:! named!:March of Wretched Sorrow:!) and!( ability$!name(Exile 8 black cards) name(Exile 8 black cards) target(<8>*[black]|myhand) moveto(myexile)!$ controller )! +auto=if paid(alternative) then if type(other *[black]|myhand)~morethan~8 then choice name(Cast and exile 9 black cards) name(Cast and exile 9 black cards) name(Cast and exile 9 black cards) activate castcard(copied noevent costx!:fullpaidplus18plusend:! named!:March of Wretched Sorrow:!) and!( ability$!name(Exile 9 black cards) name(Exile 9 black cards) target(<9>*[black]|myhand) moveto(myexile)!$ controller )! +auto=if paid(alternative) then if type(other *[black]|myhand)~morethan~9 then choice name(Cast and exile 10 black cards) name(Cast and exile 10 black cards) name(Cast and exile 10 black cards) activate castcard(copied noevent costx!:fullpaidplus20plusend:! named!:March of Wretched Sorrow:!) and!( ability$!name(Exile 10 black cards) name(Exile 10 black cards) target(<10>*[black]|myhand) moveto(myexile)!$ controller )! +auto=ifnot paid(alternative) then name(Damage creature or planeswalker) name(Damage creature or planeswalker) target(*[creature;planeswalker]|battlefield) damage:fullpaid +auto=ifnot paid(alternative) then name(Gain life) name(Gain life) life:fullpaid controller +text=As an additional cost to cast this spell, you may exile any number of black cards from your hand. This spell costs {2} less to cast for each card exiled this way. -- March of Wretched Sorrow deals X damage to target creature or planeswalker and you gain X life. +mana={X}{B} +type=Instant +[/card] +[card] name=March of the Drowned auto=choice name(return creature) moveto(myhand) target(creature|mygraveyard) auto=choice name(return pirates) moveto(myhand) target(<2>pirate|mygraveyard) @@ -58527,6 +58701,18 @@ power=5 toughness=5 [/card] [card] +name=Mindlink Mech +abilities=flying +auto={0}:name(Copy and crew 1 [1 creature]) target(creature[-legendary&-tapped]|mybattlefield) tap && copy and!( transforms((Artifact Vechicle Creature,setpower=4,settoughness=3,newability[flying],newability[phaseaction[endofturn once sourceinplay] flip(myorigname) undocpy])) ueot )! restriction{compare(crewtotalpower)~morethan~0} limit:1 +auto={crew(other creature[power>=1]|myBattlefield)}:name(crew 1 [1 creature]) transforms((Artifact Vechicle Creature,setpower=4,settoughness=3,newability[flying])) ueot restriction{type(other creature[-tapped;power>=1]|mybattlefield)~morethan~0,compare(crewtotalpower)~morethan~0} +text=Flying -- Whenever Mindlink Mech becomes crewed for the first time each turn, until end of turn, Mindlink Mech becomes a copy of target nonlegendary creature that crewed it this turn, except it's 4/3, it's a Vehicle artifact in addition to its other types, and it has flying. -- Crew 1 +mana={2}{U} +type=Artifact +subtype=Vehicle +power=4 +toughness=3 +[/card] +[card] name=Mindsplice Apparatus abilities=flash auto=@each my upkeep:name(Put oil counter) counter(0/0,1,Oil) @@ -59599,6 +59785,19 @@ text={T}: Add {C}. -- {4}: Mobilized District becomes a 3/3 Citizen creature wit type=Land [/card] [card] +name=Mobilizer Mech +abilities=flying +auto={crew(other creature[power>=3]|myBattlefield)}:name(crew 3 [1 creature]) transforms((,newability[becomes(Artifact Creature) ueot],newability[may name(Transform another vehicle) target(vehicle[-creature]|mybattlefield) becomes(Artifact Creature) ueot])) ueot restriction{type(other creature[-tapped;power>=3]|mybattlefield)~morethan~0,compare(crewtotalpower)~morethan~2} +auto={crew(other creature[power>=1]|myBattlefield)}{crew(other creature[power>=2]|myBattlefield)}:name(crew 3 [2 creature]) transforms((,newability[becomes(Artifact Creature) ueot],newability[may name(Transform another vehicle) target(vehicle[-creature]|mybattlefield) becomes(Artifact Creature) ueot])) ueot restriction{type(other creature[-tapped;power>=1]|mybattlefield)~morethan~0,type(other creature[-tapped;power>=2]|mybattlefield)~morethan~0,type(other creature[-tapped;-cantcrew]|mybattlefield)~morethan~1,compare(crewtotalpower)~morethan~2} +auto={crew(other creature[power>=1]|myBattlefield)}{crew(other creature[power>=1]|myBattlefield)}{crew(other creature[power>=1]|myBattlefield)}:name(crew 3 [3 creature]) transforms((,newability[becomes(Artifact Creature) ueot],newability[may name(Transform another vehicle) target(vehicle[-creature]|mybattlefield) becomes(Artifact Creature) ueot])) ueot restriction{type(other creature[-tapped;power>=1]|mybattlefield)~morethan~2,compare(crewtotalpower)~morethan~2} +text=Flying -- Whenever Mobilizer Mech becomes crewed, up to one other target Vehicle you control becomes an artifact creature until end of turn. -- Crew 3 (Tap any number of creatures you control with total power 3 or more: This Vehicle becomes an artifact creature until end of turn.) +mana={1}{U} +type=Artifact +subtype=Vehicle +power=3 +toughness=4 +[/card] +[card] name=Mocking Doppelganger abilities=flash auto=may name(Clone a creature) target(creature|opponentBattlefield) clone and!( transforms((,newability[lord(other creature[share!name!]|battlefield) transforms((,newability[counter(0/0.1.Goaded)],newability[this(counter{0/0.1.Goaded}>0) mustattack]))])) forever )! @@ -60013,6 +60212,17 @@ power=3 toughness=2 [/card] [card] +name=Moon-Circuit Hacker +autohand={U}{N}:ninjutsu +auto=@combatdamaged(player) from(this):may name(Draw a card) draw:1 controller && if cantargetcard(*[-fresh]|*) then name(Discard a card) ability$!name(Discard a card) name(Discard a card) notatarget(*|myhand) reject!$ controller +text=Ninjutsu {U} ({U}, Return an unblocked attacker you control to hand: Put this card onto the battlefield from your hand tapped and attacking.) -- Whenever Moon-Circuit Hacker deals combat damage to a player, you may draw a card. If you do, discard a card unless Moon-Circuit Hacker entered the battlefield this turn. +mana={1}{U} +type=Enchantment Creature +subtype=Human Ninja +power=2 +toughness=1 +[/card] +[card] name=Moon-Eating Dog auto=aslongas(planeswalker[Yanling]|mybattlefield) flying text=As long as you control a Yanling planeswalker, Moon-Eating Dog has flying. (It can't be blocked except by creatures with flying or reach.) @@ -61495,6 +61705,18 @@ power=1 toughness=1 [/card] [card] +name=Nashi, Moon Sage's Scion +autohand={3}{B}{N}:ninjutsu +auto=@combatdamaged(player) from(this):name(Exile top cards) all(*[zpos=1]|myLibrary) moveto(myexile) and!( transforms((,newability[this(cantargetcard(*[land]|*) canplayfromexile],newability[this(cantargetcard(*[-land]|*) {0}:name(Pay life and cast) name(Pay life and cast) activate castcard(normal) and!( life:-manacost controller )!])) ueot )! +auto=@combatdamaged(player) from(this):name(Exile top cards) all(*[zpos=1]|opponentlibrary) moveto(myexile) and!( transforms((,newability[this(cantargetcard(*[land]|*) canplayfromexile],newability[this(cantargetcard(*[-land]|*) {0}:name(Pay life and cast) name(Pay life and cast) activate castcard(normal) and!( life:-manacost controller )!],newability[phaseaction[endofturn once checkex] moveto(ownerexile)])) ueot )! +text=Ninjutsu {3}{B} ({3}{B}, Return an unblocked attacker you control to hand: Put this card onto the battlefield from your hand tapped and attacking.) -- Whenever Nashi, Moon Sage's Scion deals combat damage to a player, exile the top card of each player's library. Until end of turn, you may play one of those cards. If you cast a spell this way, pay life equal to its mana value rather than paying its mana cost. +mana={1}{B}{B} +type=Legendary Creature +subtype=Rat Ninja +power=3 +toughness=2 +[/card] +[card] name=Nashi, Moon's Legacy abilities=menace auto=_WARD_(1) @@ -72979,6 +73201,15 @@ type=Enchantment subtype=Aura [/card] [card] +name=Reality Heist +abilities=affinityartifacts +aicode=activate transforms((,newability[if type(artifact[zpos<=7]|myLibrary)~morethan~0 then target(<2>artifact[zpos<=7]|myLibrary) moveTo(myHand) and!( all(other *[zpos<=7]|mylibrary) moveto(myreveal) and!( bottomoflibrary )! )! else all(*[zpos<=7]|mylibrary) moveto(myreveal) and!( bottomoflibrary )! ])) oneshot +auto=name(Look at the top 7 cards) reveal:7 optionone name(Choose 2 artifacts) target(artifact|reveal) moveto(myhand) optiononeend optiontwo name(Put on bottom) target(*|reveal) bottomoflibrary and!( all(*|reveal) bottomoflibrary )! optiontwoend revealend +text=This spell costs {1} less to cast for each artifact you control. -- Look at the top seven cards of your library. You may reveal up to two artifact cards from among them and put them into your hand. Put the rest on the bottom of your library in a random order. +mana={5}{U}{U} +type=Instant +[/card] +[card] name=Reality Shift target=creature auto=moveto(exile) && ability$! manifest all(*[zpos=1]|mylibrary) !$ targetController @@ -92253,6 +92484,17 @@ mana={4}{B}{B} type=Sorcery [/card] [card] +name=Tatsunari, Toad Rider +auto=@movedTo(enchantment|mystack) restriction{type(Keimi|myBattlefield)~equalto~0}:name(Create Keimi) name(Create Keimi) token(Keimi) +auto={1}{GU}:name(Can be blocked only by flying and reach) transforms((,newability[cantbeblockedby(creature[-flying&-reach])],newability[name(Target another frog) target(other frog|myBattlefield) transforms((,newability[cantbeblockedby(creature[-flying&-reach])])) ueot])) ueot +text=Whenever you cast an enchantment spell, if you don't control a creature named Keimi, create Keimi, a legendary 3/3 black and green Frog creature token with "Whenever you cast an enchantment spell, each opponent loses 1 life and you gain 1 life." -- {1}{G/U}: Tatsunari, Toad Rider and target Frog you control can't be blocked this turn except by creatures with flying or reach. +mana={2}{B} +type=Legendary Creature +subtype=Human Ninja +power=3 +toughness=3 +[/card] +[card] name=Tattered Apparition abilities=flying auto={1}{B}:1/1 ueot diff --git a/projects/mtg/bin/Res/sets/primitives/planeswalkers.txt b/projects/mtg/bin/Res/sets/primitives/planeswalkers.txt index 04a043bac..2ba19f051 100644 --- a/projects/mtg/bin/Res/sets/primitives/planeswalkers.txt +++ b/projects/mtg/bin/Res/sets/primitives/planeswalkers.txt @@ -1,6 +1,6 @@ #Planeswalkers Primitives Pack for Wagic the Homebrew. #Please keep these card alphabetized, and try to have the "name=" line at the top of each card -#We sorted this in alphabetical order - Luruz & Vitty85 21-06-2023 +#We sorted this in alphabetical order - Luruz & Vitty85 22-06-2023 [card] name=Abian, Luvion Usurper auto=counter(0/0,5,loyalty) @@ -3206,6 +3206,18 @@ type=Legendary Planeswalker subtype=Tezzeret [/card] [card] +name=Tezzeret, Betrayer of Flesh +#MISSING: The first activated ability of an artifact you activate each turn costs {2} less to activate. +auto=counter(0/0,4,loyalty) +auto={C(0/0,+1,Loyalty)}:name(+1: Draw and discard) draw:2 controller && transforms((,newability[if type(artifact|myhand)~morethan~0 then choice name(Discard artifact) name(Discard artifact) notatarget(artifact|myhand) reject],newability[if type(*[-artifact]|myhand)~morethan~1 then choice name(Don't discard artifact) name(Don't discard artifact) notatarget(<2>*[-artifact]|myhand) reject])) ueot +auto={C(0/0,-2,Loyalty)}:name(-2: Artifact becomes creature) target(artifact|battlefield) transforms((,newability[if cantargetcard(*[vehicle]|*) then becomes(Artifact Creature) ueot else becomes(Artifact Creature^4/4) ueot])) ueot +auto={C(0/0,-6,Loyalty)}:name(-6: Emblem on tapped artifact) emblem transforms((,newability[@tapped(artifact|battlefield):name(Draw a card) draw:1 controller])) forever dontremove +text=The first activated ability of an artifact you activate each turn costs {2} less to activate. -- [+1]: Draw two cards. Then discard two cards unless you discard an artifact card. -- [-2]: Target artifact becomes an artifact creature. If it isn't a Vehicle, it has base power and toughness 4/4. -- [-6]: You get an emblem with "Whenever an artifact you control becomes tapped, draw a card." +mana={2}{U}{U} +type=Legendary Planeswalker +subtype=Tezzeret +[/card] +[card] name=Tezzeret, Cruel Machinist auto=counter(0/0,4,loyalty) auto={C(0/0,1,Loyalty)}:name(+1: Draw a card) draw:1 controller diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index e84ee074d..a4f88c1aa 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -2731,11 +2731,13 @@ public: string PT; bool nonstatic; bool cda; + int triggers; APowerToughnessModifier(GameObserver* observer, int id, MTGCardInstance * _source, MTGCardInstance * _target, WParsedPT * wppt,string PT, bool nonstatic) : MTGAbility(observer, id, _source, _target), wppt(wppt),PT(PT),nonstatic(nonstatic) { aType = MTGAbility::STANDARD_PUMP; cda = PT.find("cdaactive") != string::npos; + triggers = 0; } void Update(float) @@ -2752,6 +2754,10 @@ public: this->forceDestroy = 1; return; } + if (newPhase == MTG_PHASE_AFTER_EOT) + { + triggers = 0; + } if(!cda || (cda && (((MTGCardInstance *) target)->isSettingBase < 1))) { if(((MTGCardInstance *) target)->isSwitchedPT) @@ -2762,6 +2768,20 @@ public: if(PT.size()) { SAFE_DELETE(wppt); + char buffer[4]; + sprintf(buffer, "%i", triggers); + string trg; + trg.append(buffer); + if(PT.find("numofactivation") != string::npos){ + size_t pos = PT.find("numofactivation"); + if(pos != string::npos) + PT.replace(pos, 15, trg); + } + if(PT.find("numofactivation") != string::npos){ + size_t pos = PT.find("numofactivation"); + if(pos != string::npos) + PT.replace(pos, 15, trg); + } if(cda) wppt = NEW WParsedPT(cReplaceString(PT, " cdaactive", ""),NULL,(MTGCardInstance *) source); else @@ -2779,6 +2799,20 @@ public: if(PT.size()) { SAFE_DELETE(wppt); + char buffer[4]; + sprintf(buffer, "%i", triggers); + string trg; + trg.append(buffer); + if(PT.find("numofactivation") != string::npos){ + size_t pos = PT.find("numofactivation"); + if(pos != string::npos) + PT.replace(pos, 15, trg); + } + if(PT.find("numofactivation") != string::npos){ + size_t pos = PT.find("numofactivation"); + if(pos != string::npos) + PT.replace(pos, 15, trg); + } if(cda) wppt = NEW WParsedPT(cReplaceString(PT, " cdaactive", ""),NULL,(MTGCardInstance *) source); else @@ -2794,6 +2828,20 @@ public: if(PT.size()) { SAFE_DELETE(wppt); + char buffer[4]; + sprintf(buffer, "%i", triggers); + string trg; + trg.append(buffer); + if(PT.find("numofactivation") != string::npos){ + size_t pos = PT.find("numofactivation"); + if(pos != string::npos) + PT.replace(pos, 15, trg); + } + if(PT.find("numofactivation") != string::npos){ + size_t pos = PT.find("numofactivation"); + if(pos != string::npos) + PT.replace(pos, 15, trg); + } if(cda) wppt = NEW WParsedPT(cReplaceString(PT, " cdaactive", ""),NULL,(MTGCardInstance *) source); else @@ -2845,6 +2893,20 @@ public: if(PT.size()) { SAFE_DELETE(wppt); + char buffer[4]; + sprintf(buffer, "%i", triggers); + string trg; + trg.append(buffer); + if(PT.find("numofactivation") != string::npos){ + size_t pos = PT.find("numofactivation"); + if(pos != string::npos) + PT.replace(pos, 15, trg); + } + if(PT.find("numofactivation") != string::npos){ + size_t pos = PT.find("numofactivation"); + if(pos != string::npos) + PT.replace(pos, 15, trg); + } if(cda) wppt = NEW WParsedPT(cReplaceString(PT, " cdaactive", ""),NULL,(MTGCardInstance *) source); else @@ -5257,6 +5319,7 @@ public: WParsedPT * wppt; string s; bool nonstatic; + int lastTriggeredTurn; WParsedPT * newWppt; PTInstant(GameObserver* observer, int id, MTGCardInstance * source, MTGCardInstance * target, WParsedPT * wppt, string s = "", bool nonstatic = false); int resolve(); diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index 426863a3f..24e77acaa 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -8056,21 +8056,29 @@ ATransformerInstant::~ATransformerInstant() } //P/t ueot -PTInstant::PTInstant(GameObserver* observer, int id, MTGCardInstance * source, MTGCardInstance * target, WParsedPT * wppt,string s,bool nonstatic) : -InstantAbility(observer, id, source, target), wppt(wppt),s(s),nonstatic(nonstatic) +PTInstant::PTInstant(GameObserver* observer, int id, MTGCardInstance * source, MTGCardInstance * target, WParsedPT * wppt, string s, bool nonstatic) : +InstantAbility(observer, id, source, target), wppt(wppt), s(s), nonstatic(nonstatic) { - ability = NEW APowerToughnessModifier(game, id, source, target, wppt,s,nonstatic); + ability = NEW APowerToughnessModifier(game, id, source, target, wppt, s, nonstatic); aType = MTGAbility::STANDARD_PUMP; + lastTriggeredTurn = source->getObserver()->turn; } int PTInstant::resolve() { + if(lastTriggeredTurn == source->getObserver()->turn) + ability->triggers++; + else + ability->triggers = 1; + lastTriggeredTurn = source->getObserver()->turn; APowerToughnessModifier * a = ability->clone(); + a->triggers = ability->triggers; GenericInstantAbility * wrapper = NEW GenericInstantAbility(game, 1, source, (Damageable *) (this->target), a); wrapper->addToGame(); ((Damageable *) (this->target))->afterDamage();//additional check the negative pt after resolving.. return 1; } + const string PTInstant::getMenuText() { return ability->getMenuText(); @@ -8087,6 +8095,7 @@ PTInstant::~PTInstant() { SAFE_DELETE(ability); } + // ASwapPTUEOT ASwapPTUEOT::ASwapPTUEOT(GameObserver* observer, int id, MTGCardInstance * source, MTGCardInstance * target) : InstantAbility(observer, id, source, target) diff --git a/projects/mtg/src/TargetChooser.cpp b/projects/mtg/src/TargetChooser.cpp index af4216792..78d7ea6a8 100644 --- a/projects/mtg/src/TargetChooser.cpp +++ b/projects/mtg/src/TargetChooser.cpp @@ -65,7 +65,9 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta if (found == 0) { MTGCardInstance * target = card->target; - if (ability) target = (MTGCardInstance *) (ability->target); + bool forced = (s.find("forced") != string::npos); + if (ability && !forced) + target = (MTGCardInstance *) (ability->target); return NEW CardTargetChooser(observer, target, card); };