From e664ecfaf5e2253de7168bda88a1cf2e64802994 Mon Sep 17 00:00:00 2001 From: Xawotihs Date: Sat, 11 Jul 2015 18:05:39 +0200 Subject: [PATCH 001/249] Update .travis.yml Updated android build tools to 22.0.1 --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index a34e11b85..579290338 100644 --- a/.travis.yml +++ b/.travis.yml @@ -39,7 +39,7 @@ install: tar --absolute-names -jxf android-ndk-r9-linux-x86_64.tar.bz2 && tar -zxf android-sdk_r24.0.2-linux.tgz && $ANDROID list sdk --extended -a && - echo yes | $ANDROID update sdk --filter tools,platform-tools,build-tools-21.1.2,android-10 --no-ui --force --no-https; + echo yes | $ANDROID update sdk --filter tools,platform-tools,build-tools-22.0.1,android-10 --no-ui --force --no-https; fi - sudo pip install pyjavaproperties - sudo pip install github3.py From 38ed60bf6342171934f93b6dbf1c401468f55b56 Mon Sep 17 00:00:00 2001 From: Xawotihs Date: Sat, 11 Jul 2015 18:27:23 +0200 Subject: [PATCH 002/249] Update .travis.yml Add some \ to try fixing the script --- .travis.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 579290338..79c833ea3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -39,7 +39,10 @@ install: tar --absolute-names -jxf android-ndk-r9-linux-x86_64.tar.bz2 && tar -zxf android-sdk_r24.0.2-linux.tgz && $ANDROID list sdk --extended -a && - echo yes | $ANDROID update sdk --filter tools,platform-tools,build-tools-22.0.1,android-10 --no-ui --force --no-https; + echo yes | $ANDROID update sdk --no-ui --force --no-https --filter \ + tools,\ + platform-tools,\ + build-tools-22.0.1,android-10; fi - sudo pip install pyjavaproperties - sudo pip install github3.py From 6a37b5e46188d1fb78f2cd2d7a03d6f65f304c15 Mon Sep 17 00:00:00 2001 From: Xawotihs Date: Sat, 11 Jul 2015 18:36:34 +0200 Subject: [PATCH 003/249] Update .travis.yml And a last one. --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 79c833ea3..79952a243 100644 --- a/.travis.yml +++ b/.travis.yml @@ -42,7 +42,8 @@ install: echo yes | $ANDROID update sdk --no-ui --force --no-https --filter \ tools,\ platform-tools,\ - build-tools-22.0.1,android-10; + build-tools-22.0.1,\ + android-10; fi - sudo pip install pyjavaproperties - sudo pip install github3.py From 2d02f97f7f274a155de335ee62989e2666c311dc Mon Sep 17 00:00:00 2001 From: Xawotihs Date: Sat, 11 Jul 2015 18:51:11 +0200 Subject: [PATCH 004/249] Update .travis.yml Updated android SDK to 24.3.3 --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 79952a243..a3a5639b6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -21,7 +21,7 @@ before_install: export ANDROID="android-sdk-linux/tools/android" && if [ `uname -m` = x86_64 ]; then sudo apt-get install -qq --force-yes libgd2-xpm ia32-libs ia32-libs-multiarch jq; fi && wget http://dl.google.com/android/ndk/android-ndk-r9-linux-x86_64.tar.bz2 -nv && - wget http://dl.google.com/android/android-sdk_r24.0.2-linux.tgz -nv; + wget http://dl.google.com/android/android-sdk_r24.3.3-linux.tgz -nv; fi # Building for Qt here - if [ "$BUILD_Qt" == "YES" ]; then From 31b8ad248f6f7dd84cccb65b8d3e4fa223db3e08 Mon Sep 17 00:00:00 2001 From: Xawotihs Date: Sat, 11 Jul 2015 20:03:37 +0200 Subject: [PATCH 005/249] Update .travis.yml Fixed references to SDK package --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index a3a5639b6..96c7037f8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -37,7 +37,7 @@ install: fi - if [ "$BUILD_ANDROID" == "YES" ]; then tar --absolute-names -jxf android-ndk-r9-linux-x86_64.tar.bz2 && - tar -zxf android-sdk_r24.0.2-linux.tgz && + tar -zxf android-sdk_r24.3.3-linux.tgz && $ANDROID list sdk --extended -a && echo yes | $ANDROID update sdk --no-ui --force --no-https --filter \ tools,\ From 80379ecde5a1bb48e17b54b31015daa3de0e95f4 Mon Sep 17 00:00:00 2001 From: Xawotihs Date: Sat, 11 Jul 2015 21:52:20 +0200 Subject: [PATCH 006/249] Update .travis.yml --- .travis.yml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index 96c7037f8..b8dccdb27 100644 --- a/.travis.yml +++ b/.travis.yml @@ -39,11 +39,7 @@ install: tar --absolute-names -jxf android-ndk-r9-linux-x86_64.tar.bz2 && tar -zxf android-sdk_r24.3.3-linux.tgz && $ANDROID list sdk --extended -a && - echo yes | $ANDROID update sdk --no-ui --force --no-https --filter \ - tools,\ - platform-tools,\ - build-tools-22.0.1,\ - android-10; + echo yes | $ANDROID update sdk --no-ui --force --no-https --filter tools,platform-tools,build-tools-22.0.1,android-10; fi - sudo pip install pyjavaproperties - sudo pip install github3.py From 85741540717b8a5b40f6831d63d74bd31f77ffcb Mon Sep 17 00:00:00 2001 From: Xawotihs Date: Sat, 11 Jul 2015 21:58:30 +0200 Subject: [PATCH 007/249] Update .travis.yml --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index b8dccdb27..7c3c5011d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -39,7 +39,7 @@ install: tar --absolute-names -jxf android-ndk-r9-linux-x86_64.tar.bz2 && tar -zxf android-sdk_r24.3.3-linux.tgz && $ANDROID list sdk --extended -a && - echo yes | $ANDROID update sdk --no-ui --force --no-https --filter tools,platform-tools,build-tools-22.0.1,android-10; + echo yes | $ANDROID update sdk -a -t tools,platform-tools,build-tools-22.0.1,android-10 --no-ui --force --no-https; fi - sudo pip install pyjavaproperties - sudo pip install github3.py From d9561118bc3dcdae651ee507164ca1fd448266a2 Mon Sep 17 00:00:00 2001 From: Xawotihs Date: Mon, 20 Jul 2015 22:32:25 +0200 Subject: [PATCH 008/249] Update appveyor.yml Skip building macosx environment on windows --- appveyor.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/appveyor.yml b/appveyor.yml index 41490b4c9..f084c4475 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -4,6 +4,11 @@ # - All section names are case-sensitive. # - Section names should be unique on each level. +# branches to build +branches: + # blacklist + except: + - travis_mac_osx #---------------------------------# # environment configuration # #---------------------------------# From 60f3c87de1a1a9a5ff83797ed5257d44fc456d0e Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 10 Aug 2015 22:44:27 +0800 Subject: [PATCH 009/249] Count Total Power of Creatures you control example usage: auto={4}{G}:4/4 restriction{compare(powertotalinplay)~morethan~7} --- projects/mtg/include/AllAbilities.h | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index 69693794f..f39949ba0 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -635,6 +635,17 @@ private: { intValue = target->controller()->opponent()->game->hand->nb_cards; } + else if (s == "powertotalinplay")//Count Total Power of Creatures you control... Formidable + { + intValue = 0; + for (int j = card->controller()->game->inPlay->nb_cards - 1; j >= 0; --j) + { + if (card->controller()->game->inPlay->cards[j]->hasType(Subtypes::TYPE_CREATURE)) + { + intValue += card->controller()->game->inPlay->cards[j]->power; + } + } + } else { intValue = atoi(s.c_str()); From 32de6ac124e84434b5408144e77e6a19e31c607b Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Wed, 12 Aug 2015 17:32:42 +0800 Subject: [PATCH 010/249] Minor primitives correction corrected some typo and added some cards --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 61 +++++++++++++++++--- 1 file changed, 52 insertions(+), 9 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index e07e2a87f..7f6e74e9a 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -1313,7 +1313,7 @@ toughness=1 name=Akoum Battlesinger abilities=haste auto=may lord(ally|myBattlefield) 1/0 ueot -auto=@movedTo(other ally|myBattlefield):may all(ally|myBattlefield) 1/0 ueot +auto=@movedTo(other ally|myBattlefield):may lord(ally|myBattlefield) 1/0 ueot text=Haste -- Whenever Akoum Battlesinger or another Ally enters the battlefield under your control, you may have Ally creatures you control get +1/+0 until end of turn. mana={1}{R} type=Creature @@ -9499,7 +9499,7 @@ type=Artifact [card] name=Bloodthirsty Ogre auto={T}:counter(0/0,1,Devotion) -auto=aslongas(demon|myBattlefield) {T}:target(creature) counter{0%0.1.Devotion}/counter{0%0.1.Devotion} ueot +auto=aslongas(demon|myBattlefield) {T}:target(creature) -counter{0%0.1.Devotion}/-counter{0%0.1.Devotion} ueot text={T}: Put a devotion counter on Bloodthirsty Ogre. -- {T}: Target creature gets -X/-X until end of turn, where X is the number of devotion counters on Bloodthirsty Ogre. Activate this ability only if you control a Demon. mana={2}{B} type=Creature @@ -46346,7 +46346,7 @@ type=Land [/card] [card] name=Kabira Evangel -auto=chooseacolor all(creature|mybattlefield) protection from(*[chosencolor]) chooseend +auto=chooseacolor all(ally|mybattlefield) protection from(*[chosencolor]) chooseend auto=@movedTo(other ally|myBattlefield):may chooseacolor all(creature|mybattlefield) protection from(*[chosencolor]) chooseend text=Whenever Kabira Evangel or another Ally enters the battlefield under your control, you may choose a color. If you do, Allies you control gain protection from the chosen color until end of turn. mana={2}{W} @@ -49795,6 +49795,16 @@ mana={2}{U}{U} type=Enchantment [/card] [card] +name=Land Grant +other={0} name(Cast for free) +auto=moveto(myhand) notatarget(forest|mylibrary) +otherrestriction=type(land|myhand)~lessthan~1 +autostack=if paid(alternative) then ability$!name(look at opponent hand) notatarget(*|opponenthand) 0/0!$ opponent +text=If you have no land cards in hand, you may reveal your hand rather than pay Land Grant's mana cost. -- Search your library for a Forest card, reveal that card, and put it into your hand. Then shuffle your library. +mana={1}{G} +type=Sorcery +[/card] +[card] name=Land Leeches abilities=first strike text=First strike @@ -49954,10 +49964,10 @@ type=Instant [/card] [card] name=Last Kiss -target=creature,player +target=creature auto=damage:2 auto=life:2 controller -text=Last Kiss deals 2 damage to target creature or player and you gain 2 life. +text=Last Kiss deals 2 damage to target creature and you gain 2 life. mana={2}{B} type=Instant [/card] @@ -55324,6 +55334,16 @@ mana={U} type=Instant [/card] [card] +name=Mentor of the Meek +auto=@movedTo(other creature[power<=2]|myBattlefield):pay({1}) draw:1 +text=Whenever another creature with power 2 or less enters the battlefield under your control, you may pay {1}. If you do, draw a card. +mana={2}{W} +type=Creature +subtype=Human Solider +power=2 +toughness=2 +[/card] +[card] name=Mephidross Vampire abilities=flying auto=@damaged(creature) from(creature|mybattlefield):all(trigger[from]) counter(1/1,1) @@ -74599,7 +74619,7 @@ toughness=3 [card] name=Rust Elemental abilities=flying -auto=upcostmult[{S(other artifact|mybattlefield)}] tap && life:-4 controller +auto=upcostmulti[{S(other artifact|mybattlefield)}] tap && life:-4 controller text=Flying -- At the beginning of your upkeep, sacrifice an artifact other than Rust Elemental. If you can't, tap Rust Elemental and you lose 4 life. mana={4} type=Artifact Creature @@ -85213,8 +85233,8 @@ text=Metalcraft - Spiraling Duelist has double strike as long as you control thr mana={2}{R}{R} type=Creature subtype=Human Berserker -power=4 -toughness=2 +power=3 +toughness=1 [/card] [card] name=Spiraling Embers @@ -90070,7 +90090,7 @@ toughness=2 [card] name=Taniwha abilities=trample,phasing -auto=@each my upkeep:phasout all(land|myBattlefield) +auto=@each my upkeep:phaseout all(land|myBattlefield) text=Trample -- Phasing (This phases in or out before you untap during each of your untap steps. While it's phased out, it's treated as though it doesn't exist.) -- At the beginning of your upkeep, all lands you control phase out. (They phase in before you untap during your next untap step.) mana={3}{U}{U} type=Legendary Creature @@ -93248,6 +93268,17 @@ mana={W} type=Instant [/card] [card] +name=Tithe Drinker +abilities=lifelink +auto=@movedto(*|mystack):pay({WB}) life:-1 opponent && life:1 controller +text=Lifelink -- Extort (Whenever you cast a spell, you may pay {WB}. If you do, each opponent loses 1 life and you gain that much life.) +mana={W}{B} +type=Creature +subtype=Vampire +power=2 +toughness=1 +[/card] +[card] name=Tivadar of Thorn abilities=first strike,protection from red auto=destroy target(goblin) @@ -104958,6 +104989,18 @@ power=1 toughness=1 [/card] [card] +name=Zhur-Taa Druid +auto={T}:Add{G} +auto=@tappedformana(this):damage:1 opponent +auto={T}: Add {G} to your mana pool. Whenever you tap Zhur-Taa Druid for mana, it deals 1 damage to each opponent. +in your graveyard. +mana={R}{G} +type=Creature +subtype=Human Druid +power=1 +toughness=1 +[/card] +[card] name=Zhur-Taa Swine autohand={1}{R}{G}{discard}:name(bloodrush) target(creature[attacking]) 5/4 ueot text=Bloodrush — {1}{R}{G}, Discard Zhur-Taa Swine: Target attacking creature gets +5/+4 until end of turn. From 567650357f40e3a1c528c770794236007c903ae2 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Wed, 12 Aug 2015 18:03:46 +0800 Subject: [PATCH 011/249] Create JOU --- projects/mtg/bin/Res/JOU | 1 + 1 file changed, 1 insertion(+) create mode 100644 projects/mtg/bin/Res/JOU diff --git a/projects/mtg/bin/Res/JOU b/projects/mtg/bin/Res/JOU new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/projects/mtg/bin/Res/JOU @@ -0,0 +1 @@ + From 1738e216d0b69eb3744d94eae81c09991d051e7b Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Wed, 12 Aug 2015 18:05:45 +0800 Subject: [PATCH 012/249] Delete JOU --- projects/mtg/bin/Res/JOU | 1 - 1 file changed, 1 deletion(-) delete mode 100644 projects/mtg/bin/Res/JOU diff --git a/projects/mtg/bin/Res/JOU b/projects/mtg/bin/Res/JOU deleted file mode 100644 index 8b1378917..000000000 --- a/projects/mtg/bin/Res/JOU +++ /dev/null @@ -1 +0,0 @@ - From 22f4f2161965d3fb1b36b71bc80ffb91ead85871 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Wed, 12 Aug 2015 18:19:06 +0800 Subject: [PATCH 013/249] Added missing sets --- projects/mtg/bin/Res/sets/DTK/_cards.dat | 1324 ++++++++++++++++++++ projects/mtg/bin/Res/sets/DTK/booster.txt | 21 + projects/mtg/bin/Res/sets/FRF/_cards.dat | 934 ++++++++++++++ projects/mtg/bin/Res/sets/FRF/booster.txt | 21 + projects/mtg/bin/Res/sets/JOU/_cards.dat | 830 +++++++++++++ projects/mtg/bin/Res/sets/JOU/booster.txt | 21 + projects/mtg/bin/Res/sets/KTK/_cards.dat | 1354 +++++++++++++++++++++ projects/mtg/bin/Res/sets/KTK/booster.txt | 21 + 8 files changed, 4526 insertions(+) create mode 100644 projects/mtg/bin/Res/sets/DTK/_cards.dat create mode 100644 projects/mtg/bin/Res/sets/DTK/booster.txt create mode 100644 projects/mtg/bin/Res/sets/FRF/_cards.dat create mode 100644 projects/mtg/bin/Res/sets/FRF/booster.txt create mode 100644 projects/mtg/bin/Res/sets/JOU/_cards.dat create mode 100644 projects/mtg/bin/Res/sets/JOU/booster.txt create mode 100644 projects/mtg/bin/Res/sets/KTK/_cards.dat create mode 100644 projects/mtg/bin/Res/sets/KTK/booster.txt diff --git a/projects/mtg/bin/Res/sets/DTK/_cards.dat b/projects/mtg/bin/Res/sets/DTK/_cards.dat new file mode 100644 index 000000000..518a7d56a --- /dev/null +++ b/projects/mtg/bin/Res/sets/DTK/_cards.dat @@ -0,0 +1,1324 @@ +[meta] +author=Wagic Team +year=2015 +[/meta] +[card] +primitive=Acid-Spewer Dragon +id=394485 +rarity=U +[/card] +[card] +primitive=Aerie Bowmasters +id=394486 +rarity=C +[/card] +[card] +primitive=Ainok Artillerist +id=394487 +rarity=C +[/card] +[card] +primitive=Ainok Survivalist +id=394488 +rarity=U +[/card] +[card] +primitive=Ambuscade Shaman +id=394489 +rarity=U +[/card] +[card] +primitive=Anafenza, Kin-Tree Spirit +id=394490 +rarity=R +[/card] +[card] +primitive=Ancestral Statue +id=394491 +rarity=C +[/card] +[card] +primitive=Ancient Carp +id=394492 +rarity=C +[/card] +[card] +primitive=Anticipate +id=394493 +rarity=C +[/card] +[card] +primitive=Arashin Foremost +id=394494 +rarity=R +[/card] +[card] +primitive=Arashin Sovereign +id=394495 +rarity=R +[/card] +[card] +primitive=Artful Maneuver +id=394496 +rarity=C +[/card] +[card] +primitive=Assault Formation +id=394497 +rarity=R +[/card] +[card] +primitive=Atarka Beastbreaker +id=394498 +rarity=C +[/card] +[card] +primitive=Atarka Efreet +id=394499 +rarity=C +[/card] +[card] +primitive=Atarka Monument +id=394500 +rarity=U +[/card] +[card] +primitive=Atarka Pummeler +id=394501 +rarity=U +[/card] +[card] +primitive=Atarka's Command +id=394502 +rarity=R +[/card] +[card] +primitive=Avatar of the Resolute +id=394503 +rarity=R +[/card] +[card] +primitive=Aven Sunstriker +id=394504 +rarity=U +[/card] +[card] +primitive=Aven Tactician +id=394505 +rarity=C +[/card] +[card] +primitive=Battle Mastery +id=394506 +rarity=U +[/card] +[card] +primitive=Belltoll Dragon +id=394507 +rarity=U +[/card] +[card] +primitive=Berserkers' Onslaught +id=394508 +rarity=R +[/card] +[card] +primitive=Blessed Reincarnation +id=394509 +rarity=R +[/card] +[card] +primitive=Blood-Chin Fanatic +id=394510 +rarity=R +[/card] +[card] +primitive=Blood-Chin Rager +id=394511 +rarity=U +[/card] +[card] +primitive=Boltwing Marauder +id=394512 +rarity=R +[/card] +[card] +primitive=Butcher's Glee +id=394513 +rarity=C +[/card] +[card] +primitive=Center Soul +id=394514 +rarity=C +[/card] +[card] +primitive=Champion of Arashin +id=394515 +rarity=C +[/card] +[card] +primitive=Circle of Elders +id=394516 +rarity=U +[/card] +[card] +primitive=Clone Legion +id=394517 +rarity=M +[/card] +[card] +primitive=Coat with Venom +id=394518 +rarity=C +[/card] +[card] +primitive=Collected Company +id=394519 +rarity=R +[/card] +[card] +primitive=Colossodon Yearling +id=394520 +rarity=C +[/card] +[card] +primitive=Commune with Lava +id=394521 +rarity=R +[/card] +[card] +primitive=Conifer Strider +id=394522 +rarity=C +[/card] +[card] +primitive=Contradict +id=394523 +rarity=C +[/card] +[card] +primitive=Corpseweft +id=394524 +rarity=R +[/card] +[card] +primitive=Crater Elemental +id=394525 +rarity=R +[/card] +[card] +primitive=Cunning Breezedancer +id=394526 +rarity=U +[/card] +[card] +primitive=Custodian of the Trove +id=394527 +rarity=C +[/card] +[card] +primitive=Damnable Pact +id=394528 +rarity=R +[/card] +[card] +primitive=Dance of the Skywise +id=394529 +rarity=U +[/card] +[card] +primitive=Deadly Wanderings +id=394530 +rarity=U +[/card] +[card] +primitive=Death Wind +id=394531 +rarity=U +[/card] +[card] +primitive=Deathbringer Regent +id=394532 +rarity=R +[/card] +[card] +primitive=Deathmist Raptor +id=394533 +rarity=M +[/card] +[card] +primitive=Defeat +id=394534 +rarity=C +[/card] +[card] +primitive=Den Protector +id=394535 +rarity=R +[/card] +[card] +primitive=Descent of the Dragons +id=394536 +rarity=M +[/card] +[card] +primitive=Dirgur Nemesis +id=394537 +rarity=C +[/card] +[card] +primitive=Display of Dominance +id=394538 +rarity=U +[/card] +[card] +primitive=Draconic Roar +id=394539 +rarity=U +[/card] +[card] +primitive=Dragon Fodder +id=394540 +rarity=C +[/card] +[card] +primitive=Dragon Hunter +id=394541 +rarity=U +[/card] +[card] +primitive=Dragon Tempest +id=394542 +rarity=R +[/card] +[card] +primitive=Dragon Whisperer +id=394543 +rarity=M +[/card] +[card] +primitive=Dragonloft Idol +id=394545 +rarity=U +[/card] +[card] +primitive=Dragonlord Atarka +id=394546 +rarity=M +[/card] +[card] +primitive=Dragonlord Dromoka +id=394547 +rarity=M +[/card] +[card] +primitive=Dragonlord Kolaghan +id=394548 +rarity=M +[/card] +[card] +primitive=Dragonlord Ojutai +id=394549 +rarity=M +[/card] +[card] +primitive=Dragonlord Silumgar +id=394550 +rarity=M +[/card] +[card] +primitive=Dragonlord's Prerogative +id=394551 +rarity=R +[/card] +[card] +primitive=Dragonlord's Servant +id=394552 +rarity=U +[/card] +[card] +primitive=Dragon's Eye Sentry +id=394544 +rarity=C +[/card] +[card] +primitive=Dragon-Scarred Bear +id=394553 +rarity=C +[/card] +[card] +primitive=Dromoka Captain +id=394554 +rarity=U +[/card] +[card] +primitive=Dromoka Dunecaster +id=394555 +rarity=C +[/card] +[card] +primitive=Dromoka Monument +id=394556 +rarity=U +[/card] +[card] +primitive=Dromoka Warrior +id=394557 +rarity=C +[/card] +[card] +primitive=Dromoka's Command +id=394558 +rarity=R +[/card] +[card] +primitive=Dromoka's Gift +id=394559 +rarity=U +[/card] +[card] +primitive=Duress +id=394560 +rarity=C +[/card] +[card] +primitive=Dutiful Attendant +id=394561 +rarity=C +[/card] +[card] +primitive=Echoes of the Kin Tree +id=394562 +rarity=U +[/card] +[card] +primitive=Elusive Spellfist +id=394563 +rarity=C +[/card] +[card] +primitive=Encase in Ice +id=394564 +rarity=U +[/card] +[card] +primitive=Enduring Scalelord +id=394565 +rarity=U +[/card] +[card] +primitive=Enduring Victory +id=394566 +rarity=C +[/card] +[card] +primitive=Epic Confrontation +id=394567 +rarity=C +[/card] +[card] +primitive=Evolving Wilds +id=394568 +rarity=C +[/card] +[card] +primitive=Explosive Vegetation +id=394569 +rarity=U +[/card] +[card] +primitive=Fate Forgotten +id=394570 +rarity=C +[/card] +[card] +primitive=Flatten +id=394571 +rarity=C +[/card] +[card] +primitive=Foe-Razer Regent +id=394572 +rarity=R +[/card] +[card] +primitive=Forest +id=394575 +rarity=C +[/card] +[card] +primitive=Foul Renewal +id=394576 +rarity=R +[/card] +[card] +primitive=Foul-Tongue Invocation +id=394577 +rarity=U +[/card] +[card] +primitive=Foul-Tongue Shriek +id=394578 +rarity=C +[/card] +[card] +primitive=Gate Smasher +id=394579 +rarity=U +[/card] +[card] +primitive=Glade Watcher +id=394580 +rarity=C +[/card] +[card] +primitive=Glaring Aegis +id=394581 +rarity=C +[/card] +[card] +primitive=Gleam of Authority +id=394582 +rarity=R +[/card] +[card] +primitive=Glint +id=394583 +rarity=C +[/card] +[card] +primitive=Graceblade Artisan +id=394584 +rarity=U +[/card] +[card] +primitive=Gravepurge +id=394585 +rarity=C +[/card] +[card] +primitive=Great Teacher's Decree +id=394586 +rarity=U +[/card] +[card] +primitive=Guardian Shield-Bearer +id=394587 +rarity=C +[/card] +[card] +primitive=Gudul Lurker +id=394588 +rarity=U +[/card] +[card] +primitive=Gurmag Drowner +id=394589 +rarity=C +[/card] +[card] +primitive=Hand of Silumgar +id=394590 +rarity=C +[/card] +[card] +primitive=Harbinger of the Hunt +id=394591 +rarity=R +[/card] +[card] +primitive=Hardened Berserker +id=394592 +rarity=C +[/card] +[card] +primitive=Haven of the Spirit Dragon +id=394593 +rarity=R +[/card] +[card] +primitive=Hedonist's Trove +id=394594 +rarity=R +[/card] +[card] +primitive=Herald of Dromoka +id=394595 +rarity=C +[/card] +[card] +primitive=Herdchaser Dragon +id=394596 +rarity=U +[/card] +[card] +primitive=Hidden Dragonslayer +id=394597 +rarity=R +[/card] +[card] +primitive=Icefall Regent +id=394598 +rarity=R +[/card] +[card] +primitive=Illusory Gains +id=394599 +rarity=R +[/card] +[card] +primitive=Impact Tremors +id=394600 +rarity=C +[/card] +[card] +primitive=Inspiring Call +id=394601 +rarity=U +[/card] +[card] +primitive=Ire Shaman +id=394602 +rarity=R +[/card] +[card] +primitive=Island +id=394605 +rarity=C +[/card] +[card] +primitive=Keeper of the Lens +id=394606 +rarity=C +[/card] +[card] +primitive=Kindled Fury +id=394607 +rarity=C +[/card] +[card] +primitive=Kolaghan Aspirant +id=394608 +rarity=C +[/card] +[card] +primitive=Kolaghan Forerunners +id=394609 +rarity=U +[/card] +[card] +primitive=Kolaghan Monument +id=394610 +rarity=U +[/card] +[card] +primitive=Kolaghan Skirmisher +id=394611 +rarity=C +[/card] +[card] +primitive=Kolaghan Stormsinger +id=394612 +rarity=C +[/card] +[card] +primitive=Kolaghan's Command +id=394613 +rarity=R +[/card] +[card] +primitive=Learn from the Past +id=394614 +rarity=U +[/card] +[card] +primitive=Lightning Berserker +id=394615 +rarity=U +[/card] +[card] +primitive=Lightwalker +id=394616 +rarity=C +[/card] +[card] +primitive=Living Lore +id=394617 +rarity=R +[/card] +[card] +primitive=Lose Calm +id=394618 +rarity=C +[/card] +[card] +primitive=Lurking Arynx +id=394619 +rarity=U +[/card] +[card] +primitive=Magmatic Chasm +id=394620 +rarity=C +[/card] +[card] +primitive=Marang River Skeleton +id=394621 +rarity=U +[/card] +[card] +primitive=Marsh Hulk +id=394622 +rarity=C +[/card] +[card] +primitive=Mind Rot +id=394623 +rarity=C +[/card] +[card] +primitive=Minister of Pain +id=394624 +rarity=U +[/card] +[card] +primitive=Mirror Mockery +id=394625 +rarity=R +[/card] +[card] +primitive=Misthoof Kirin +id=394626 +rarity=C +[/card] +[card] +primitive=Monastery Loremaster +id=394627 +rarity=C +[/card] +[card] +primitive=Mountain +id=394628 +rarity=C +[/card] +[card] +primitive=Mystic Meditation +id=394631 +rarity=C +[/card] +[card] +primitive=Myth Realized +id=394632 +rarity=R +[/card] +[card] +primitive=Narset Transcendent +id=394633 +rarity=M +[/card] +[card] +primitive=Naturalize +id=394634 +rarity=C +[/card] +[card] +primitive=Necromaster Dragon +id=394635 +rarity=R +[/card] +[card] +primitive=Negate +id=394636 +rarity=C +[/card] +[card] +primitive=Obscuring Æther +id=394637 +rarity=R +[/card] +[card] +primitive=Ojutai Exemplars +id=394638 +rarity=M +[/card] +[card] +primitive=Ojutai Interceptor +id=394639 +rarity=C +[/card] +[card] +primitive=Ojutai Monument +id=394640 +rarity=U +[/card] +[card] +primitive=Ojutai's Breath +id=394641 +rarity=C +[/card] +[card] +primitive=Ojutai's Command +id=394642 +rarity=R +[/card] +[card] +primitive=Ojutai's Summons +id=394643 +rarity=C +[/card] +[card] +primitive=Orator of Ojutai +id=394644 +rarity=U +[/card] +[card] +primitive=Pacifism +id=394645 +rarity=C +[/card] +[card] +primitive=Palace Familiar +id=394646 +rarity=C +[/card] +[card] +primitive=Pinion Feast +id=394647 +rarity=C +[/card] +[card] +primitive=Pitiless Horde +id=394648 +rarity=R +[/card] +[card] +primitive=Plains +id=394649 +rarity=C +[/card] +[card] +primitive=Press the Advantage +id=394652 +rarity=U +[/card] +[card] +primitive=Pristine Skywise +id=394653 +rarity=R +[/card] +[card] +primitive=Profaner of the Dead +id=394654 +rarity=R +[/card] +[card] +primitive=Profound Journey +id=394655 +rarity=R +[/card] +[card] +primitive=Qal Sisma Behemoth +id=394656 +rarity=U +[/card] +[card] +primitive=Qarsi Deceiver +id=394657 +rarity=U +[/card] +[card] +primitive=Qarsi Sadist +id=394658 +rarity=C +[/card] +[card] +primitive=Radiant Purge +id=394659 +rarity=R +[/card] +[card] +primitive=Rakshasa Gravecaller +id=394660 +rarity=U +[/card] +[card] +primitive=Reckless Imp +id=394661 +rarity=C +[/card] +[card] +primitive=Reduce in Stature +id=394662 +rarity=C +[/card] +[card] +primitive=Rending Volley +id=394663 +rarity=U +[/card] +[card] +primitive=Resupply +id=394664 +rarity=C +[/card] +[card] +primitive=Revealing Wind +id=394665 +rarity=C +[/card] +[card] +primitive=Risen Executioner +id=394666 +rarity=M +[/card] +[card] +primitive=Roast +id=394667 +rarity=U +[/card] +[card] +primitive=Ruthless Deathfang +id=394668 +rarity=U +[/card] +[card] +primitive=Sabertooth Outrider +id=394669 +rarity=C +[/card] +[card] +primitive=Salt Road Ambushers +id=394670 +rarity=U +[/card] +[card] +primitive=Salt Road Quartermasters +id=394671 +rarity=U +[/card] +[card] +primitive=Sandcrafter Mage +id=394672 +rarity=C +[/card] +[card] +primitive=Sandsteppe Scavenger +id=394673 +rarity=C +[/card] +[card] +primitive=Sandstorm Charger +id=394674 +rarity=C +[/card] +[card] +primitive=Sarkhan Unbroken +id=394675 +rarity=M +[/card] +[card] +primitive=Sarkhan's Rage +id=394676 +rarity=C +[/card] +[card] +primitive=Sarkhan's Triumph +id=394677 +rarity=U +[/card] +[card] +primitive=Savage Ventmaw +id=394678 +rarity=U +[/card] +[card] +primitive=Scale Blessing +id=394679 +rarity=U +[/card] +[card] +primitive=Scaleguard Sentinels +id=394680 +rarity=U +[/card] +[card] +primitive=Scion of Ugin +id=394681 +rarity=U +[/card] +[card] +primitive=Screamreach Brawler +id=394682 +rarity=C +[/card] +[card] +primitive=Secure the Wastes +id=394683 +rarity=R +[/card] +[card] +primitive=Segmented Krotiq +id=394684 +rarity=C +[/card] +[card] +primitive=Seismic Rupture +id=394685 +rarity=U +[/card] +[card] +primitive=Self-Inflicted Wound +id=394686 +rarity=U +[/card] +[card] +primitive=Servant of the Scale +id=394687 +rarity=C +[/card] +[card] +primitive=Shaman of Forgotten Ways +id=394688 +rarity=M +[/card] +[card] +primitive=Shambling Goblin +id=394689 +rarity=C +[/card] +[card] +primitive=Shape the Sands +id=394690 +rarity=C +[/card] +[card] +primitive=Sheltered Aerie +id=394691 +rarity=C +[/card] +[card] +primitive=Shieldhide Dragon +id=394692 +rarity=U +[/card] +[card] +primitive=Shorecrasher Elemental +id=394693 +rarity=M +[/card] +[card] +primitive=Sibsig Icebreakers +id=394694 +rarity=C +[/card] +[card] +primitive=Sidisi, Undead Vizier +id=394695 +rarity=R +[/card] +[card] +primitive=Sidisi's Faithful +id=394696 +rarity=C +[/card] +[card] +primitive=Sight Beyond Sight +id=394697 +rarity=U +[/card] +[card] +primitive=Sight of the Scalelords +id=394698 +rarity=U +[/card] +[card] +primitive=Silkwrap +id=394699 +rarity=U +[/card] +[card] +primitive=Silumgar Assassin +id=394700 +rarity=R +[/card] +[card] +primitive=Silumgar Butcher +id=394701 +rarity=C +[/card] +[card] +primitive=Silumgar Monument +id=394702 +rarity=U +[/card] +[card] +primitive=Silumgar Sorcerer +id=394703 +rarity=U +[/card] +[card] +primitive=Silumgar Spell-Eater +id=394704 +rarity=U +[/card] +[card] +primitive=Silumgar's Command +id=394705 +rarity=R +[/card] +[card] +primitive=Silumgar's Scorn +id=394706 +rarity=U +[/card] +[card] +primitive=Skywise Teachings +id=394707 +rarity=U +[/card] +[card] +primitive=Spidersilk Net +id=394708 +rarity=C +[/card] +[card] +primitive=Sprinting Warbrute +id=394709 +rarity=C +[/card] +[card] +primitive=Stampeding Elk Herd +id=394710 +rarity=C +[/card] +[card] +primitive=Stormcrag Elemental +id=394711 +rarity=U +[/card] +[card] +primitive=Stormrider Rig +id=394712 +rarity=U +[/card] +[card] +primitive=Stormwing Dragon +id=394713 +rarity=U +[/card] +[card] +primitive=Stratus Dancer +id=394714 +rarity=R +[/card] +[card] +primitive=Strongarm Monk +id=394715 +rarity=U +[/card] +[card] +primitive=Student of Ojutai +id=394716 +rarity=C +[/card] +[card] +primitive=Summit Prowler +id=394717 +rarity=C +[/card] +[card] +primitive=Sunbringer's Touch +id=394718 +rarity=R +[/card] +[card] +primitive=Sunscorch Regent +id=394719 +rarity=R +[/card] +[card] +primitive=Surge of Righteousness +id=394720 +rarity=U +[/card] +[card] +primitive=Surrak, the Hunt Caller +id=394721 +rarity=R +[/card] +[card] +primitive=Swamp +id=394722 +rarity=C +[/card] +[card] +primitive=Swift Warkite +id=394725 +rarity=U +[/card] +[card] +primitive=Taigam's Strike +id=394726 +rarity=C +[/card] +[card] +primitive=Tail Slash +id=394727 +rarity=C +[/card] +[card] +primitive=Tapestry of the Ages +id=394728 +rarity=U +[/card] +[card] +primitive=Territorial Roc +id=394729 +rarity=C +[/card] +[card] +primitive=Thunderbreak Regent +id=394730 +rarity=R +[/card] +[card] +primitive=Tormenting Voice +id=394731 +rarity=C +[/card] +[card] +primitive=Tread Upon +id=394732 +rarity=C +[/card] +[card] +primitive=Twin Bolt +id=394733 +rarity=C +[/card] +[card] +primitive=Ukud Cobra +id=394734 +rarity=U +[/card] +[card] +primitive=Ultimate Price +id=394735 +rarity=U +[/card] +[card] +primitive=Updraft Elemental +id=394736 +rarity=C +[/card] +[card] +primitive=Vandalize +id=394737 +rarity=C +[/card] +[card] +primitive=Vial of Dragonfire +id=394738 +rarity=C +[/card] +[card] +primitive=Virulent Plague +id=394739 +rarity=U +[/card] +[card] +primitive=Void Squall +id=394740 +rarity=U +[/card] +[card] +primitive=Volcanic Rush +id=394741 +rarity=C +[/card] +[card] +primitive=Volcanic Vision +id=394742 +rarity=R +[/card] +[card] +primitive=Vulturous Aven +id=394743 +rarity=C +[/card] +[card] +primitive=Wandering Tombshell +id=394744 +rarity=C +[/card] +[card] +primitive=Warbringer +id=394745 +rarity=U +[/card] +[card] +primitive=Youthful Scholar +id=394746 +rarity=U +[/card] +[card] +primitive=Zephyr Scribe +id=394747 +rarity=C +[/card] +[card] +primitive=Zurgo Bellstriker +id=394748 +rarity=R +[/card] +[card] +primitive=Forest +id=394573 +rarity=C +[/card] +[card] +primitive=Forest +id=394574 +rarity=C +[/card] +[card] +primitive=Island +id=394603 +rarity=C +[/card] +[card] +primitive=Island +id=394604 +rarity=C +[/card] +[card] +primitive=Mountain +id=394629 +rarity=C +[/card] +[card] +primitive=Mountain +id=394630 +rarity=C +[/card] +[card] +primitive=Plains +id=394650 +rarity=C +[/card] +[card] +primitive=Plains +id=394651 +rarity=C +[/card] +[card] +primitive=Swamp +id=394723 +rarity=C +[/card] +[card] +primitive=Swamp +id=394724 +rarity=C +[/card] diff --git a/projects/mtg/bin/Res/sets/DTK/booster.txt b/projects/mtg/bin/Res/sets/DTK/booster.txt new file mode 100644 index 000000000..4ac4c617f --- /dev/null +++ b/projects/mtg/bin/Res/sets/DTK/booster.txt @@ -0,0 +1,21 @@ + + + rarity:mythic; + rarity:rare; + rarity:rare; + rarity:rare; + rarity:rare; + rarity:rare; + rarity:rare; + rarity:rare; + + + rarity:uncommon; + + + rarity:special; + + + rarity:common; + + \ No newline at end of file diff --git a/projects/mtg/bin/Res/sets/FRF/_cards.dat b/projects/mtg/bin/Res/sets/FRF/_cards.dat new file mode 100644 index 000000000..f70d7dfe8 --- /dev/null +++ b/projects/mtg/bin/Res/sets/FRF/_cards.dat @@ -0,0 +1,934 @@ +[meta] +author=Wagic Team +year=2015 +[/meta] +[card] +primitive=Abzan Advantage +id=391781 +rarity=C +[/card] +[card] +primitive=Abzan Beastmaster +id=391782 +rarity=U +[/card] +[card] +primitive=Abzan Kin-Guard +id=391783 +rarity=U +[/card] +[card] +primitive=Abzan Runemark +id=391784 +rarity=C +[/card] +[card] +primitive=Abzan Skycaptain +id=391785 +rarity=C +[/card] +[card] +primitive=Ainok Guide +id=391786 +rarity=C +[/card] +[card] +primitive=Alesha, Who Smiles at Death +id=391787 +rarity=R +[/card] +[card] +primitive=Alesha's Vanguard +id=391788 +rarity=C +[/card] +[card] +primitive=Ambush Krotiq +id=391789 +rarity=C +[/card] +[card] +primitive=Ancestral Vengeance +id=391790 +rarity=C +[/card] +[card] +primitive=Arashin Cleric +id=391791 +rarity=C +[/card] +[card] +primitive=Arashin War Beast +id=391792 +rarity=U +[/card] +[card] +primitive=Arcbond +id=391793 +rarity=R +[/card] +[card] +primitive=Archers of Qarsi +id=391794 +rarity=C +[/card] +[card] +primitive=Archfiend of Depravity +id=391795 +rarity=R +[/card] +[card] +primitive=Atarka, World Render +id=391796 +rarity=R +[/card] +[card] +primitive=Aven Skirmisher +id=391797 +rarity=C +[/card] +[card] +primitive=Aven Surveyor +id=391798 +rarity=C +[/card] +[card] +primitive=Bathe in Dragonfire +id=391799 +rarity=C +[/card] +[card] +primitive=Battle Brawler +id=391800 +rarity=U +[/card] +[card] +primitive=Battlefront Krushok +id=391801 +rarity=U +[/card] +[card] +primitive=Bloodfell Caves +id=391802 +rarity=C +[/card] +[card] +primitive=Bloodfire Enforcers +id=391803 +rarity=U +[/card] +[card] +primitive=Blossoming Sands +id=391804 +rarity=C +[/card] +[card] +primitive=Break Through the Line +id=391805 +rarity=U +[/card] +[card] +primitive=Brutal Hordechief +id=391806 +rarity=M +[/card] +[card] +primitive=Cached Defenses +id=391807 +rarity=U +[/card] +[card] +primitive=Channel Harm +id=391808 +rarity=U +[/card] +[card] +primitive=Citadel Siege +id=391809 +rarity=R +[/card] +[card] +primitive=Cloudform +id=391810 +rarity=U +[/card] +[card] +primitive=Collateral Damage +id=391811 +rarity=C +[/card] +[card] +primitive=Crucible of the Spirit Dragon +id=391812 +rarity=R +[/card] +[card] +primitive=Crux of Fate +id=391813 +rarity=R +[/card] +[card] +primitive=Cunning Strike +id=391814 +rarity=C +[/card] +[card] +primitive=Daghatar the Adamant +id=391815 +rarity=R +[/card] +[card] +primitive=Dark Deal +id=391816 +rarity=U +[/card] +[card] +primitive=Defiant Ogre +id=391817 +rarity=C +[/card] +[card] +primitive=Destructor Dragon +id=391818 +rarity=U +[/card] +[card] +primitive=Diplomacy of the Wastes +id=391819 +rarity=U +[/card] +[card] +primitive=Dismal Backwater +id=391820 +rarity=C +[/card] +[card] +primitive=Douse in Gloom +id=391821 +rarity=C +[/card] +[card] +primitive=Dragon Bell Monk +id=391822 +rarity=C +[/card] +[card] +primitive=Dragonrage +id=391823 +rarity=U +[/card] +[card] +primitive=Dragonscale General +id=391824 +rarity=R +[/card] +[card] +primitive=Dromoka, the Eternal +id=391825 +rarity=R +[/card] +[card] +primitive=Elite Scaleguard +id=391826 +rarity=U +[/card] +[card] +primitive=Enhanced Awareness +id=391827 +rarity=C +[/card] +[card] +primitive=Ethereal Ambush +id=391828 +rarity=C +[/card] +[card] +primitive=Fascination +id=391829 +rarity=U +[/card] +[card] +primitive=Fearsome Awakening +id=391830 +rarity=U +[/card] +[card] +primitive=Feral Krushok +id=391831 +rarity=C +[/card] +[card] +primitive=Fierce Invocation +id=391832 +rarity=C +[/card] +[card] +primitive=Flamerush Rider +id=391833 +rarity=R +[/card] +[card] +primitive=Flamewake Phoenix +id=391834 +rarity=R +[/card] +[card] +primitive=Forest +id=391836 +rarity=C +[/card] +[card] +primitive=Formless Nurturing +id=391837 +rarity=C +[/card] +[card] +primitive=Friendly Fire +id=391838 +rarity=U +[/card] +[card] +primitive=Frontier Mastodon +id=391839 +rarity=C +[/card] +[card] +primitive=Frontier Siege +id=391840 +rarity=R +[/card] +[card] +primitive=Frost Walker +id=391841 +rarity=U +[/card] +[card] +primitive=Fruit of the First Tree +id=391842 +rarity=U +[/card] +[card] +primitive=Ghastly Conscription +id=391843 +rarity=M +[/card] +[card] +primitive=Goblin Boom Keg +id=391844 +rarity=U +[/card] +[card] +primitive=Goblin Heelcutter +id=391845 +rarity=C +[/card] +[card] +primitive=Gore Swine +id=391846 +rarity=C +[/card] +[card] +primitive=Grave Strength +id=391847 +rarity=U +[/card] +[card] +primitive=Great-Horn Krushok +id=391848 +rarity=C +[/card] +[card] +primitive=Grim Contest +id=391849 +rarity=C +[/card] +[card] +primitive=Gurmag Angler +id=391850 +rarity=C +[/card] +[card] +primitive=Harsh Sustenance +id=391851 +rarity=C +[/card] +[card] +primitive=Hero's Blade +id=391852 +rarity=U +[/card] +[card] +primitive=Hewed Stone Retainers +id=391853 +rarity=U +[/card] +[card] +primitive=Honor's Reward +id=391854 +rarity=U +[/card] +[card] +primitive=Hooded Assassin +id=391855 +rarity=C +[/card] +[card] +primitive=Humble Defector +id=391856 +rarity=U +[/card] +[card] +primitive=Hungering Yeti +id=391857 +rarity=U +[/card] +[card] +primitive=Hunt the Weak +id=391858 +rarity=C +[/card] +[card] +primitive=Island +id=391859 +rarity=C +[/card] +[card] +primitive=Jeskai Barricade +id=391861 +rarity=U +[/card] +[card] +primitive=Jeskai Infiltrator +id=391862 +rarity=R +[/card] +[card] +primitive=Jeskai Runemark +id=391863 +rarity=C +[/card] +[card] +primitive=Jeskai Sage +id=391864 +rarity=C +[/card] +[card] +primitive=Jungle Hollow +id=391865 +rarity=C +[/card] +[card] +primitive=Kolaghan, the Storm's Fury +id=391866 +rarity=R +[/card] +[card] +primitive=Lightform +id=391867 +rarity=U +[/card] +[card] +primitive=Lightning Shrieker +id=391868 +rarity=C +[/card] +[card] +primitive=Lotus Path Djinn +id=391869 +rarity=C +[/card] +[card] +primitive=Lotus-Eye Mystics +id=391870 +rarity=U +[/card] +[card] +primitive=Map the Wastes +id=391871 +rarity=C +[/card] +[card] +primitive=Marang River Prowler +id=391872 +rarity=U +[/card] +[card] +primitive=Mardu Runemark +id=391873 +rarity=C +[/card] +[card] +primitive=Mardu Scout +id=391874 +rarity=C +[/card] +[card] +primitive=Mardu Shadowspear +id=391875 +rarity=U +[/card] +[card] +primitive=Mardu Strike Leader +id=391876 +rarity=R +[/card] +[card] +primitive=Mardu Woe-Reaper +id=391877 +rarity=U +[/card] +[card] +primitive=Mastery of the Unseen +id=391878 +rarity=R +[/card] +[card] +primitive=Merciless Executioner +id=391879 +rarity=U +[/card] +[card] +primitive=Mindscour Dragon +id=391880 +rarity=U +[/card] +[card] +primitive=Mistfire Adept +id=391881 +rarity=U +[/card] +[card] +primitive=Mob Rule +id=391882 +rarity=R +[/card] +[card] +primitive=Monastery Mentor +id=391883 +rarity=M +[/card] +[card] +primitive=Monk Token +id=-391883 +rarity=T +[/card] +[card] +primitive=Monastery Siege +id=391884 +rarity=R +[/card] +[card] +primitive=Mountain +id=391885 +rarity=C +[/card] +[card] +primitive=Neutralizing Blast +id=391887 +rarity=U +[/card] +[card] +primitive=Noxious Dragon +id=391888 +rarity=U +[/card] +[card] +primitive=Ojutai, Soul of Winter +id=391889 +rarity=R +[/card] +[card] +primitive=Orc Sureshot +id=391890 +rarity=U +[/card] +[card] +primitive=Outpost Siege +id=391891 +rarity=R +[/card] +[card] +primitive=Palace Siege +id=391892 +rarity=R +[/card] +[card] +primitive=Pilgrim of the Fires +id=391893 +rarity=U +[/card] +[card] +primitive=Plains +id=391895 +rarity=C +[/card] +[card] +primitive=Pressure Point +id=391896 +rarity=C +[/card] +[card] +primitive=Pyrotechnics +id=391897 +rarity=U +[/card] +[card] +primitive=Qarsi High Priest +id=391898 +rarity=U +[/card] +[card] +primitive=Rageform +id=391899 +rarity=U +[/card] +[card] +primitive=Rakshasa's Disdain +id=391900 +rarity=C +[/card] +[card] +primitive=Rally the Ancestors +id=391901 +rarity=R +[/card] +[card] +primitive=Reach of Shadows +id=391902 +rarity=C +[/card] +[card] +primitive=Reality Shift +id=391903 +rarity=U +[/card] +[card] +primitive=Refocus +id=391904 +rarity=C +[/card] +[card] +primitive=Renowned Weaponsmith +id=391905 +rarity=U +[/card] +[card] +primitive=Return to the Earth +id=391906 +rarity=C +[/card] +[card] +primitive=Rite of Undoing +id=391907 +rarity=U +[/card] +[card] +primitive=Rugged Highlands +id=391908 +rarity=C +[/card] +[card] +primitive=Ruthless Instincts +id=391909 +rarity=U +[/card] +[card] +primitive=Sage-Eye Avengers +id=391911 +rarity=R +[/card] +[card] +primitive=Sage's Reverie +id=391910 +rarity=U +[/card] +[card] +primitive=Sandblast +id=391912 +rarity=C +[/card] +[card] +primitive=Sandsteppe Mastodon +id=391913 +rarity=R +[/card] +[card] +primitive=Sandsteppe Outcast +id=391914 +rarity=C +[/card] +[card] +primitive=Scoured Barrens +id=391915 +rarity=C +[/card] +[card] +primitive=Scroll of the Masters +id=391916 +rarity=R +[/card] +[card] +primitive=Shaman of the Great Hunt +id=391917 +rarity=M +[/card] +[card] +primitive=Shamanic Revelation +id=391918 +rarity=R +[/card] +[card] +primitive=Shifting Loyalties +id=391919 +rarity=U +[/card] +[card] +primitive=Shockmaw Dragon +id=391920 +rarity=U +[/card] +[card] +primitive=Shu Yun, the Silent Tempest +id=391921 +rarity=R +[/card] +[card] +primitive=Sibsig Host +id=391922 +rarity=C +[/card] +[card] +primitive=Sibsig Muckdraggers +id=391923 +rarity=U +[/card] +[card] +primitive=Silumgar, the Drifting Death +id=391924 +rarity=R +[/card] +[card] +primitive=Smoldering Efreet +id=391925 +rarity=C +[/card] +[card] +primitive=Soul Summons +id=391926 +rarity=C +[/card] +[card] +primitive=Soulfire Grand Master +id=391927 +rarity=M +[/card] +[card] +primitive=Soulflayer +id=391928 +rarity=R +[/card] +[card] +primitive=Sudden Reclamation +id=391929 +rarity=U +[/card] +[card] +primitive=Sultai Emissary +id=391930 +rarity=C +[/card] +[card] +primitive=Sultai Runemark +id=391931 +rarity=C +[/card] +[card] +primitive=Sultai Skullkeeper +id=391932 +rarity=C +[/card] +[card] +primitive=Supplant Form +id=391933 +rarity=R +[/card] +[card] +primitive=Swamp +id=391934 +rarity=C +[/card] +[card] +primitive=Swiftwater Cliffs +id=391936 +rarity=C +[/card] +[card] +primitive=Tasigur, the Golden Fang +id=391937 +rarity=R +[/card] +[card] +primitive=Tasigur's Cruelty +id=391938 +rarity=C +[/card] +[card] +primitive=Temporal Trespass +id=391939 +rarity=M +[/card] +[card] +primitive=Temur Battle Rage +id=391940 +rarity=C +[/card] +[card] +primitive=Temur Runemark +id=391941 +rarity=C +[/card] +[card] +primitive=Temur Sabertooth +id=391942 +rarity=U +[/card] +[card] +primitive=Temur War Shaman +id=391943 +rarity=R +[/card] +[card] +primitive=Thornwood Falls +id=391944 +rarity=C +[/card] +[card] +primitive=Torrent Elemental +id=391945 +rarity=M +[/card] +[card] +primitive=Tranquil Cove +id=391946 +rarity=C +[/card] +[card] +primitive=Typhoid Rats +id=391947 +rarity=C +[/card] +[card] +primitive=Ugin, the Spirit Dragon +id=391948 +rarity=M +[/card] +[card] +primitive=Ugin's Construct +id=391949 +rarity=U +[/card] +[card] +primitive=Valorous Stance +id=391950 +rarity=U +[/card] +[card] +primitive=Vaultbreaker +id=391951 +rarity=U +[/card] +[card] +primitive=Wandering Champion +id=391952 +rarity=U +[/card] +[card] +primitive=War Flare +id=391953 +rarity=C +[/card] +[card] +primitive=Warden of the First Tree +id=391954 +rarity=M +[/card] +[card] +primitive=Wardscale Dragon +id=391955 +rarity=U +[/card] +[card] +primitive=Whisk Away +id=391956 +rarity=C +[/card] +[card] +primitive=Whisperer of the Wilds +id=391957 +rarity=C +[/card] +[card] +primitive=Whisperwood Elemental +id=391958 +rarity=M +[/card] +[card] +primitive=Wild Slash +id=391959 +rarity=U +[/card] +[card] +primitive=Wildcall +id=391960 +rarity=R +[/card] +[card] +primitive=Will of the Naga +id=391961 +rarity=C +[/card] +[card] +primitive=Winds of Qal Sisma +id=391962 +rarity=U +[/card] +[card] +primitive=Wind-Scarred Crag +id=391963 +rarity=C +[/card] +[card] +primitive=Write into Being +id=391964 +rarity=C +[/card] +[card] +primitive=Yasova Dragonclaw +id=391965 +rarity=R +[/card] +[card] +primitive=Forest +id=391835 +rarity=C +[/card] +[card] +primitive=Island +id=391860 +rarity=C +[/card] +[card] +primitive=Mountain +id=391886 +rarity=C +[/card] +[card] +primitive=Plains +id=391894 +rarity=C +[/card] +[card] +primitive=Swamp +id=391935 +rarity=C +[/card] diff --git a/projects/mtg/bin/Res/sets/FRF/booster.txt b/projects/mtg/bin/Res/sets/FRF/booster.txt new file mode 100644 index 000000000..1ff88b4f1 --- /dev/null +++ b/projects/mtg/bin/Res/sets/FRF/booster.txt @@ -0,0 +1,21 @@ + + + rarity:mythic; + rarity:rare; + rarity:rare; + rarity:rare; + rarity:rare; + rarity:rare; + rarity:rare; + rarity:rare; + + + rarity:uncommon; + + + rarity:special; + + + rarity:common; + + \ No newline at end of file diff --git a/projects/mtg/bin/Res/sets/JOU/_cards.dat b/projects/mtg/bin/Res/sets/JOU/_cards.dat new file mode 100644 index 000000000..097a564c1 --- /dev/null +++ b/projects/mtg/bin/Res/sets/JOU/_cards.dat @@ -0,0 +1,830 @@ +[meta] +author=Wagic Team +year=2014 +block=Theros +[/meta] +[card] +primitive=Aegis of the Gods +id=380364 +rarity=R +[/card] +[card] +primitive=Aerial Formation +id=380365 +rarity=C +[/card] +[card] +primitive=Agent of Erebos +id=380366 +rarity=U +[/card] +[card] +primitive=Ajani, Mentor of Heroes +id=380367 +rarity=M +[/card] +[card] +primitive=Ajani's Presence +id=380368 +rarity=C +[/card] +[card] +primitive=Akroan Line Breaker +id=380369 +rarity=U +[/card] +[card] +primitive=Akroan Mastiff +id=380370 +rarity=C +[/card] +[card] +primitive=Armament of Nyx +id=380371 +rarity=C +[/card] +[card] +primitive=Armory of Iroas +id=380372 +rarity=U +[/card] +[card] +primitive=Aspect of Gorgon +id=380373 +rarity=C +[/card] +[card] +primitive=Athreos, God of Passage +id=380374 +rarity=M +[/card] +[card] +primitive=Banishing Light +id=380375 +rarity=U +[/card] +[card] +primitive=Bassara Tower Archer +id=380376 +rarity=U +[/card] +[card] +primitive=Battlefield Thaumaturge +id=380377 +rarity=R +[/card] +[card] +primitive=Bearer of the Heavens +id=380378 +rarity=R +[/card] +[card] +primitive=Bladetusk Boar +id=380379 +rarity=C +[/card] +[card] +primitive=Blinding Flare +id=380380 +rarity=U +[/card] +[card] +primitive=Bloodcrazed Hoplite +id=380381 +rarity=C +[/card] +[card] +primitive=Brain Maggot +id=380382 +rarity=U +[/card] +[card] +primitive=Cast into Darkness +id=380383 +rarity=C +[/card] +[card] +primitive=Chariot of Victory +id=380384 +rarity=U +[/card] +[card] +primitive=Cloaked Siren +id=380385 +rarity=C +[/card] +[card] +primitive=Colossal Heroics +id=380386 +rarity=U +[/card] +[card] +primitive=Consign to Dust +id=380387 +rarity=U +[/card] +[card] +primitive=Countermand +id=380388 +rarity=C +[/card] +[card] +primitive=Cruel Feeding +id=380389 +rarity=C +[/card] +[card] +primitive=Crystalline Nautilus +id=380390 +rarity=U +[/card] +[card] +primitive=Cyclops of Eternal Fury +id=380391 +rarity=U +[/card] +[card] +primitive=Dakra Mystic +id=380392 +rarity=U +[/card] +[card] +primitive=Daring Thief +id=380393 +rarity=R +[/card] +[card] +primitive=Dawnbringer Charioteers +id=380394 +rarity=R +[/card] +[card] +primitive=Deicide +id=380395 +rarity=R +[/card] +[card] +primitive=Desecration Plague +id=380396 +rarity=C +[/card] +[card] +primitive=Deserter's Quarters +id=380397 +rarity=U +[/card] +[card] +primitive=Desperate Stand +id=380398 +rarity=U +[/card] +[card] +primitive=Dictate of Erebos +id=380399 +rarity=R +[/card] +[card] +primitive=Dictate of Heliod +id=380400 +rarity=R +[/card] +[card] +primitive=Dictate of Karametra +id=380401 +rarity=R +[/card] +[card] +primitive=Dictate of Kruphix +id=380402 +rarity=R +[/card] +[card] +primitive=Dictate of the Twin Gods +id=380403 +rarity=R +[/card] +[card] +primitive=Disciple of Deceit +id=380404 +rarity=U +[/card] +[card] +primitive=Doomwake Giant +id=380405 +rarity=R +[/card] +[card] +primitive=Dreadbringer Lampads +id=380406 +rarity=C +[/card] +[card] +primitive=Eagle of the Watch +id=380407 +rarity=C +[/card] +[card] +primitive=Eidolon of Blossoms +id=380408 +rarity=R +[/card] +[card] +primitive=Eidolon of Rhetoric +id=380409 +rarity=U +[/card] +[card] +primitive=Eidolon of the Great Revel +id=380410 +rarity=R +[/card] +[card] +primitive=Extinguish All Hope +id=380411 +rarity=R +[/card] +[card] +primitive=Feast of Dreams +id=380412 +rarity=C +[/card] +[card] +primitive=Felhide Petrifier +id=380413 +rarity=U +[/card] +[card] +primitive=Flamespeaker's Will +id=380414 +rarity=C +[/card] +[card] +primitive=Fleetfeather Cockatrice +id=380415 +rarity=U +[/card] +[card] +primitive=Flurry of Horns +id=380416 +rarity=C +[/card] +[card] +primitive=Font of Fertility +id=380417 +rarity=C +[/card] +[card] +primitive=Font of Fortunes +id=380418 +rarity=C +[/card] +[card] +primitive=Font of Ire +id=380419 +rarity=C +[/card] +[card] +primitive=Font of Return +id=380420 +rarity=C +[/card] +[card] +primitive=Font of Vigor +id=380421 +rarity=C +[/card] +[card] +primitive=Forgeborn Oreads +id=380422 +rarity=U +[/card] +[card] +primitive=Gluttonous Cyclops +id=380423 +rarity=C +[/card] +[card] +primitive=Gnarled Scarhide +id=380424 +rarity=U +[/card] +[card] +primitive=Godhunter Octopus +id=380425 +rarity=C +[/card] +[card] +primitive=Godsend +id=380426 +rarity=M +[/card] +[card] +primitive=Golden Hind +id=380427 +rarity=C +[/card] +[card] +primitive=Goldenhide Ox +id=380428 +rarity=U +[/card] +[card] +primitive=Gold-Forged Sentinel +id=380429 +rarity=U +[/card] +[card] +primitive=Grim Guardian +id=380430 +rarity=C +[/card] +[card] +primitive=Hall of Triumph +id=380431 +rarity=R +[/card] +[card] +primitive=Harness by Force +id=380432 +rarity=R +[/card] +[card] +primitive=Harvestguard Alseids +id=380433 +rarity=C +[/card] +[card] +primitive=Heroes' Bane +id=380434 +rarity=R +[/card] +[card] +primitive=Hour of Need +id=380435 +rarity=U +[/card] +[card] +primitive=Hubris +id=380436 +rarity=C +[/card] +[card] +primitive=Humbler of Mortals +id=380437 +rarity=C +[/card] +[card] +primitive=Hydra Broodmaster +id=380438 +rarity=R +[/card] +[card] +primitive=Hypnotic Siren +id=380439 +rarity=R +[/card] +[card] +primitive=Interpret the Signs +id=380440 +rarity=U +[/card] +[card] +primitive=Iroas, God of Victory +id=380441 +rarity=M +[/card] +[card] +primitive=Keranos, God of Storms +id=380442 +rarity=M +[/card] +[card] +primitive=King Macar, the Gold-Cursed +id=380443 +rarity=R +[/card] +[card] +primitive=Kiora's Dismissal +id=380444 +rarity=U +[/card] +[card] +primitive=Knowledge and Power +id=380445 +rarity=U +[/card] +[card] +primitive=Kruphix, God of Horizons +id=380446 +rarity=M +[/card] +[card] +primitive=Kruphix's Insight +id=380447 +rarity=C +[/card] +[card] +primitive=Lagonna-Band Trailblazer +id=380448 +rarity=C +[/card] +[card] +primitive=Launch the Fleet +id=380449 +rarity=R +[/card] +[card] +primitive=Leonin Iconoclast +id=380450 +rarity=U +[/card] +[card] +primitive=Lightning Diadem +id=380451 +rarity=C +[/card] +[card] +primitive=Magma Spray +id=380452 +rarity=C +[/card] +[card] +primitive=Mana Confluence +id=380453 +rarity=R +[/card] +[card] +primitive=Market Festival +id=380454 +rarity=C +[/card] +[card] +primitive=Master of the Feast +id=380455 +rarity=R +[/card] +[card] +primitive=Mogis's Warhound +id=380456 +rarity=U +[/card] +[card] +primitive=Mortal Obstinacy +id=380457 +rarity=C +[/card] +[card] +primitive=Nature's Panoply +id=380458 +rarity=C +[/card] +[card] +primitive=Nessian Game Warden +id=380459 +rarity=U +[/card] +[card] +primitive=Nightmarish End +id=380460 +rarity=U +[/card] +[card] +primitive=Nyx Infusion +id=380461 +rarity=C +[/card] +[card] +primitive=Nyx Weaver +id=380462 +rarity=U +[/card] +[card] +primitive=Nyx-Fleece Ram +id=380463 +rarity=U +[/card] +[card] +primitive=Oakheart Dryads +id=380464 +rarity=C +[/card] +[card] +primitive=Oppressive Rays +id=380465 +rarity=C +[/card] +[card] +primitive=Oreskos Swiftclaw +id=380466 +rarity=C +[/card] +[card] +primitive=Pensive Minotaur +id=380467 +rarity=C +[/card] +[card] +primitive=Phalanx Formation +id=380468 +rarity=U +[/card] +[card] +primitive=Pharika, God of Affliction +id=380469 +rarity=M +[/card] +[card] +primitive=Pharika's Chosen +id=380470 +rarity=C +[/card] +[card] +primitive=Pheres-Band Thunderhoof +id=380471 +rarity=C +[/card] +[card] +primitive=Pheres-Band Warchief +id=380472 +rarity=R +[/card] +[card] +primitive=Pin to the Earth +id=380473 +rarity=C +[/card] +[card] +primitive=Polymorphous Rush +id=380474 +rarity=R +[/card] +[card] +primitive=Prophetic Flamespeaker +id=380475 +rarity=M +[/card] +[card] +primitive=Pull from the Deep +id=380476 +rarity=U +[/card] +[card] +primitive=Quarry Colossus +id=380477 +rarity=U +[/card] +[card] +primitive=Ravenous Leucrocota +id=380478 +rarity=C +[/card] +[card] +primitive=Renowned Weaver +id=380479 +rarity=C +[/card] +[card] +primitive=Reprisal +id=380480 +rarity=U +[/card] +[card] +primitive=Returned Reveler +id=380481 +rarity=C +[/card] +[card] +primitive=Revel of the Fallen God +id=380482 +rarity=R +[/card] +[card] +primitive=Reviving Melody +id=380483 +rarity=U +[/card] +[card] +primitive=Riddle of Lightning +id=380484 +rarity=U +[/card] +[card] +primitive=Riptide Chimera +id=380485 +rarity=U +[/card] +[card] +primitive=Rise of Eagles +id=380486 +rarity=C +[/card] +[card] +primitive=Ritual of the Returned +id=380487 +rarity=U +[/card] +[card] +primitive=Rollick of Abandon +id=380488 +rarity=U +[/card] +[card] +primitive=Rotted Hulk +id=380489 +rarity=C +[/card] +[card] +primitive=Rouse the Mob +id=380490 +rarity=C +[/card] +[card] +primitive=Sage of Hours +id=380491 +rarity=M +[/card] +[card] +primitive=Satyr Grovedancer +id=380492 +rarity=C +[/card] +[card] +primitive=Satyr Hoplite +id=380493 +rarity=C +[/card] +[card] +primitive=Scourge of Fleets +id=380494 +rarity=R +[/card] +[card] +primitive=Setessan Tactics +id=380495 +rarity=R +[/card] +[card] +primitive=Sightless Brawler +id=380496 +rarity=U +[/card] +[card] +primitive=Sigiled Skink +id=380497 +rarity=C +[/card] +[card] +primitive=Sigiled Starfish +id=380498 +rarity=C +[/card] +[card] +primitive=Silence the Believers +id=380499 +rarity=R +[/card] +[card] +primitive=Skybind +id=380500 +rarity=R +[/card] +[card] +primitive=Skyspear Cavalry +id=380501 +rarity=U +[/card] +[card] +primitive=Solidarity of Heroes +id=380502 +rarity=U +[/card] +[card] +primitive=Spawn of Thraxes +id=380503 +rarity=R +[/card] +[card] +primitive=Spirespine +id=380504 +rarity=U +[/card] +[card] +primitive=Spite of Mogis +id=380505 +rarity=U +[/card] +[card] +primitive=Spiteful Blow +id=380506 +rarity=U +[/card] +[card] +primitive=Squelching Leeches +id=380507 +rarity=U +[/card] +[card] +primitive=Starfall +id=380508 +rarity=C +[/card] +[card] +primitive=Stonewise Fortifier +id=380509 +rarity=C +[/card] +[card] +primitive=Stormchaser Chimera +id=380510 +rarity=U +[/card] +[card] +primitive=Strength from the Fallen +id=380511 +rarity=U +[/card] +[card] +primitive=Supply-Line Cranes +id=380512 +rarity=C +[/card] +[card] +primitive=Swarmborn Giant +id=380513 +rarity=U +[/card] +[card] +primitive=Temple of Epiphany +id=380514 +rarity=R +[/card] +[card] +primitive=Temple of Malady +id=380515 +rarity=R +[/card] +[card] +primitive=Tethmos High Priest +id=380516 +rarity=U +[/card] +[card] +primitive=Thassa's Devourer +id=380517 +rarity=C +[/card] +[card] +primitive=Thassa's Ire +id=380518 +rarity=U +[/card] +[card] +primitive=Thoughtrender Lamia +id=380519 +rarity=U +[/card] +[card] +primitive=Tormented Thoughts +id=380520 +rarity=U +[/card] +[card] +primitive=Triton Cavalry +id=380521 +rarity=U +[/card] +[card] +primitive=Triton Shorestalker +id=380522 +rarity=C +[/card] +[card] +primitive=Twinflame +id=380523 +rarity=R +[/card] +[card] +primitive=Underworld Coinsmith +id=380524 +rarity=U +[/card] +[card] +primitive=War-Wing Siren +id=380525 +rarity=C +[/card] +[card] +primitive=Whitewater Naiads +id=380526 +rarity=U +[/card] +[card] +primitive=Wildfire Cerberus +id=380527 +rarity=U +[/card] +[card] +primitive=Worst Fears +id=380528 +rarity=M +[/card] diff --git a/projects/mtg/bin/Res/sets/JOU/booster.txt b/projects/mtg/bin/Res/sets/JOU/booster.txt new file mode 100644 index 000000000..11cead8ee --- /dev/null +++ b/projects/mtg/bin/Res/sets/JOU/booster.txt @@ -0,0 +1,21 @@ + + + rarity:mythic; + rarity:rare; + rarity:rare; + rarity:rare; + rarity:rare; + rarity:rare; + rarity:rare; + rarity:rare; + + + rarity:uncommon; + + + rarity:special; + + + rarity:common; + + \ No newline at end of file diff --git a/projects/mtg/bin/Res/sets/KTK/_cards.dat b/projects/mtg/bin/Res/sets/KTK/_cards.dat new file mode 100644 index 000000000..4528127e5 --- /dev/null +++ b/projects/mtg/bin/Res/sets/KTK/_cards.dat @@ -0,0 +1,1354 @@ +[meta] +author=Wagic Team +year=2014 +[/meta] +[card] +primitive=Abomination of Gudul +id=386463 +rarity=C +[/card] +[card] +primitive=Abzan Ascendancy +id=386464 +rarity=R +[/card] +[card] +primitive=Abzan Banner +id=386465 +rarity=C +[/card] +[card] +primitive=Abzan Battle Priest +id=386466 +rarity=U +[/card] +[card] +primitive=Abzan Charm +id=386467 +rarity=U +[/card] +[card] +primitive=Abzan Falconer +id=386468 +rarity=U +[/card] +[card] +primitive=Abzan Guide +id=386469 +rarity=C +[/card] +[card] +primitive=Act of Treason +id=386470 +rarity=C +[/card] +[card] +primitive=Ainok Bond-Kin +id=386471 +rarity=C +[/card] +[card] +primitive=Ainok Tracker +id=386472 +rarity=C +[/card] +[card] +primitive=Alabaster Kirin +id=386473 +rarity=C +[/card] +[card] +primitive=Alpine Grizzly +id=386474 +rarity=C +[/card] +[card] +primitive=Altar of the Brood +id=386475 +rarity=R +[/card] +[card] +primitive=Anafenza, the Foremost +id=386476 +rarity=M +[/card] +[card] +primitive=Ankle Shanker +id=386477 +rarity=R +[/card] +[card] +primitive=Arc Lightning +id=386478 +rarity=U +[/card] +[card] +primitive=Archers' Parapet +id=386479 +rarity=C +[/card] +[card] +primitive=Armament Corps +id=386480 +rarity=U +[/card] +[card] +primitive=Arrow Storm +id=386481 +rarity=C +[/card] +[card] +primitive=Ashcloud Phoenix +id=386482 +rarity=M +[/card] +[card] +primitive=Avalanche Tusker +id=386483 +rarity=R +[/card] +[card] +primitive=Awaken the Bear +id=386484 +rarity=C +[/card] +[card] +primitive=Barrage of Boulders +id=386485 +rarity=C +[/card] +[card] +primitive=Bear's Companion +id=386486 +rarity=U +[/card] +[card] +primitive=Become Immense +id=386487 +rarity=U +[/card] +[card] +primitive=Bellowing Saddlebrute +id=386488 +rarity=U +[/card] +[card] +primitive=Bitter Revelation +id=386489 +rarity=C +[/card] +[card] +primitive=Blinding Spray +id=386490 +rarity=U +[/card] +[card] +primitive=Bloodfell Caves +id=386491 +rarity=C +[/card] +[card] +primitive=Bloodfire Expert +id=386492 +rarity=C +[/card] +[card] +primitive=Bloodfire Mentor +id=386493 +rarity=C +[/card] +[card] +primitive=Bloodsoaked Champion +id=386494 +rarity=R +[/card] +[card] +primitive=Bloodstained Mire +id=386495 +rarity=R +[/card] +[card] +primitive=Blossoming Sands +id=386496 +rarity=C +[/card] +[card] +primitive=Brave the Sands +id=386497 +rarity=U +[/card] +[card] +primitive=Briber's Purse +id=386498 +rarity=U +[/card] +[card] +primitive=Bring Low +id=386499 +rarity=C +[/card] +[card] +primitive=Burn Away +id=386500 +rarity=U +[/card] +[card] +primitive=Butcher of the Horde +id=386501 +rarity=R +[/card] +[card] +primitive=Cancel +id=386502 +rarity=C +[/card] +[card] +primitive=Canyon Lurkers +id=386503 +rarity=C +[/card] +[card] +primitive=Chief of the Edge +id=386504 +rarity=U +[/card] +[card] +primitive=Chief of the Scale +id=386505 +rarity=U +[/card] +[card] +primitive=Clever Impersonator +id=386506 +rarity=M +[/card] +[card] +primitive=Crackling Doom +id=386507 +rarity=R +[/card] +[card] +primitive=Cranial Archive +id=386508 +rarity=U +[/card] +[card] +primitive=Crater's Claws +id=386509 +rarity=R +[/card] +[card] +primitive=Crippling Chill +id=386510 +rarity=C +[/card] +[card] +primitive=Dazzling Ramparts +id=386511 +rarity=U +[/card] +[card] +primitive=Dead Drop +id=386512 +rarity=U +[/card] +[card] +primitive=Death Frenzy +id=386513 +rarity=U +[/card] +[card] +primitive=Debilitating Injury +id=386514 +rarity=C +[/card] +[card] +primitive=Defiant Strike +id=386515 +rarity=C +[/card] +[card] +primitive=Deflecting Palm +id=386516 +rarity=R +[/card] +[card] +primitive=Despise +id=386517 +rarity=U +[/card] +[card] +primitive=Dig Through Time +id=386518 +rarity=R +[/card] +[card] +primitive=Disdainful Stroke +id=386519 +rarity=C +[/card] +[card] +primitive=Dismal Backwater +id=386520 +rarity=C +[/card] +[card] +primitive=Disowned Ancestor +id=386521 +rarity=C +[/card] +[card] +primitive=Dragon Grip +id=386522 +rarity=U +[/card] +[card] +primitive=Dragon Throne of Tarkir +id=386523 +rarity=R +[/card] +[card] +primitive=Dragon's Eye Savants +id=386524 +rarity=U +[/card] +[card] +primitive=Dragonscale Boon +id=386525 +rarity=C +[/card] +[card] +primitive=Dragon-Style Twins +id=386526 +rarity=R +[/card] +[card] +primitive=Duneblast +id=386527 +rarity=R +[/card] +[card] +primitive=Dutiful Return +id=386528 +rarity=C +[/card] +[card] +primitive=Efreet Weaponmaster +id=386529 +rarity=C +[/card] +[card] +primitive=Embodiment of Spring +id=386530 +rarity=C +[/card] +[card] +primitive=Empty the Pits +id=386531 +rarity=M +[/card] +[card] +primitive=End Hostilities +id=386532 +rarity=R +[/card] +[card] +primitive=Erase +id=386533 +rarity=C +[/card] +[card] +primitive=Feat of Resistance +id=386534 +rarity=C +[/card] +[card] +primitive=Feed the Clan +id=386535 +rarity=C +[/card] +[card] +primitive=Firehoof Cavalry +id=386536 +rarity=C +[/card] +[card] +primitive=Flooded Strand +id=386537 +rarity=R +[/card] +[card] +primitive=Flying Crane Technique +id=386538 +rarity=R +[/card] +[card] +primitive=Force Away +id=386539 +rarity=C +[/card] +[card] +primitive=Forest +id=386540 +rarity=L +[/card] +[card] +primitive=Forest +id=386541 +rarity=L +[/card] +[card] +primitive=Forest +id=386542 +rarity=L +[/card] +[card] +primitive=Forest +id=386543 +rarity=L +[/card] +[card] +primitive=Frontier Bivouac +id=386544 +rarity=U +[/card] +[card] +primitive=Ghostfire Blade +id=386545 +rarity=R +[/card] +[card] +primitive=Glacial Stalker +id=386546 +rarity=C +[/card] +[card] +primitive=Goblinslide +id=386547 +rarity=U +[/card] +[card] +primitive=Grim Haruspex +id=386548 +rarity=R +[/card] +[card] +primitive=Gurmag Swiftwing +id=386549 +rarity=U +[/card] +[card] +primitive=Hardened Scales +id=386550 +rarity=R +[/card] +[card] +primitive=Heart-Piercer Bow +id=386551 +rarity=U +[/card] +[card] +primitive=Heir of the Wilds +id=386552 +rarity=U +[/card] +[card] +primitive=Herald of Anafenza +id=386553 +rarity=R +[/card] +[card] +primitive=High Sentinels of Arashin +id=386554 +rarity=R +[/card] +[card] +primitive=Highland Game +id=386555 +rarity=C +[/card] +[card] +primitive=Highspire Mantis +id=386556 +rarity=U +[/card] +[card] +primitive=Hooded Hydra +id=386557 +rarity=M +[/card] +[card] +primitive=Hooting Mandrills +id=386558 +rarity=C +[/card] +[card] +primitive=Horde Ambusher +id=386559 +rarity=U +[/card] +[card] +primitive=Hordeling Outburst +id=386560 +rarity=U +[/card] +[card] +primitive=Howl of the Horde +id=386561 +rarity=R +[/card] +[card] +primitive=Icefeather Aven +id=386562 +rarity=U +[/card] +[card] +primitive=Icy Blast +id=386563 +rarity=R +[/card] +[card] +primitive=Incremental Growth +id=386564 +rarity=U +[/card] +[card] +primitive=Island +id=386565 +rarity=L +[/card] +[card] +primitive=Island +id=386566 +rarity=L +[/card] +[card] +primitive=Island +id=386567 +rarity=L +[/card] +[card] +primitive=Island +id=386568 +rarity=L +[/card] +[card] +primitive=Ivorytusk Fortress +id=386569 +rarity=R +[/card] +[card] +primitive=Jeering Instigator +id=386570 +rarity=R +[/card] +[card] +primitive=Jeskai Ascendancy +id=386571 +rarity=R +[/card] +[card] +primitive=Jeskai Banner +id=386572 +rarity=C +[/card] +[card] +primitive=Jeskai Charm +id=386573 +rarity=U +[/card] +[card] +primitive=Jeskai Elder +id=386574 +rarity=U +[/card] +[card] +primitive=Jeskai Student +id=386575 +rarity=C +[/card] +[card] +primitive=Jeskai Windscout +id=386576 +rarity=C +[/card] +[card] +primitive=Jungle Hollow +id=386577 +rarity=C +[/card] +[card] +primitive=Kheru Bloodsucker +id=386578 +rarity=U +[/card] +[card] +primitive=Kheru Dreadmaw +id=386579 +rarity=C +[/card] +[card] +primitive=Kheru Lich Lord +id=386580 +rarity=R +[/card] +[card] +primitive=Kheru Spellsnatcher +id=386581 +rarity=R +[/card] +[card] +primitive=Kill Shot +id=386582 +rarity=C +[/card] +[card] +primitive=Kin-Tree Invocation +id=386583 +rarity=U +[/card] +[card] +primitive=Kin-Tree Warden +id=386584 +rarity=C +[/card] +[card] +primitive=Krumar Bond-Kin +id=386585 +rarity=C +[/card] +[card] +primitive=Leaping Master +id=386586 +rarity=C +[/card] +[card] +primitive=Lens of Clarity +id=386587 +rarity=C +[/card] +[card] +primitive=Longshot Squad +id=386588 +rarity=C +[/card] +[card] +primitive=Mantis Rider +id=3865889 +rarity=R +[/card] +[card] +primitive=Mardu Ascendancy +id=386590 +rarity=R +[/card] +[card] +primitive=Mardu Banner +id=386591 +rarity=C +[/card] +[card] +primitive=Mardu Blazebringer +id=386592 +rarity=U +[/card] +[card] +primitive=Mardu Charm +id=386593 +rarity=U +[/card] +[card +primitive=Mardu Warrior token +id=-386593 +rarity=T +[/card] +[card] +primitive=Mardu Hateblade +id=386594 +rarity=C +[/card] +[card] +primitive=Mardu Heart-Piercer +id=386595 +rarity=U +[/card] +[card] +primitive=Mardu Hordechief +id=386596 +rarity=C +[/card] +[card] +primitive=Mardu Roughrider +id=386597 +rarity=U +[/card] +[card] +primitive=Mardu Skullhunter +id=386598 +rarity=C +[/card] +[card] +primitive=Mardu Warshrieker +id=386599 +rarity=C +[/card] +[card] +primitive=Master of Pearls +id=386600 +rarity=R +[/card] +[card] +primitive=Master the Way +id=386601 +rarity=U +[/card] +[card] +primitive=Meandering Towershell +id=386602 +rarity=R +[/card] +[card] +primitive=Mer-Ek Nightblade +id=386603 +rarity=U +[/card] +[card] +primitive=Mindswipe +id=386604 +rarity=R +[/card] +[card] +primitive=Mistfire Weaver +id=386605 +rarity=U +[/card] +[card] +primitive=Molting Snakeskin +id=386606 +rarity=C +[/card] +[card] +primitive=Monastery Flock +id=386607 +rarity=C +[/card] +[card] +primitive=Monastery Swiftspear +id=386608 +rarity=U +[/card] +[card] +primitive=Mountain +id=386609 +rarity=L +[/card] +[card] +primitive=Mountain +id=386610 +rarity=L +[/card] +[card] +primitive=Mountain +id=386611 +rarity=L +[/card] +[card] +primitive=Mountain +id=386612 +rarity=L +[/card] +[card] +primitive=Murderous Cut +id=386613 +rarity=U +[/card] +[card] +primitive=Mystic Monastery +id=386614 +rarity=U +[/card] +[card] +primitive=Mystic of the Hidden Way +id=386615 +rarity=C +[/card] +[card] +primitive=Narset, Enlightened Master +id=386616 +rarity=M +[/card] +[card] +primitive=Naturalize +id=386617 +rarity=C +[/card] +[card] +primitive=Necropolis Fiend +id=386618 +rarity=R +[/card] +[card] +primitive=Nomad Outpost +id=386619 +rarity=U +[/card] +[card] +primitive=Opulent Palace +id=386620 +rarity=U +[/card] +[card] +primitive=Pearl Lake Ancient +id=386621 +rarity=M +[/card] +[card] +primitive=Pine Walker +id=386622 +rarity=U +[/card] +[card] +primitive=Plains +id=386623 +rarity=L +[/card] +[card] +primitive=Plains +id=386624 +rarity=L +[/card] +[card] +primitive=Plains +id=386625 +rarity=L +[/card] +[card] +primitive=Plains +id=386626 +rarity=L +[/card] +[card] +primitive=Polluted Delta +id=386627 +rarity=R +[/card] +[card] +primitive=Ponyback Brigade +id=386628 +rarity=C +[/card] +[card] +primitive=Quiet Contemplation +id=386629 +rarity=U +[/card] +[card] +primitive=Raiders' Spoils +id=386630 +rarity=U +[/card] +[card] +primitive=Rakshasa Deathdealer +id=386631 +rarity=R +[/card] +[card] +primitive=Rakshasa Vizier +id=386632 +rarity=R +[/card] +[card] +primitive=Rakshasa's Secret +id=386633 +rarity=C +[/card] +[card] +primitive=Rattleclaw Mystic +id=386634 +rarity=R +[/card] +[card] +primitive=Retribution of the Ancients +id=386635 +rarity=R +[/card] +[card] +primitive=Ride Down +id=386636 +rarity=U +[/card] +[card] +primitive=Rite of the Serpent +id=386637 +rarity=C +[/card] +[card] +primitive=Riverwheel Aerialists +id=386638 +rarity=U +[/card] +[card] +primitive=Roar of Challenge +id=386639 +rarity=U +[/card] +[card] +primitive=Rotting Mastodon +id=386640 +rarity=C +[/card] +[card] +primitive=Rugged Highlands +id=386641 +rarity=C +[/card] +[card] +primitive=Rush of Battle +id=386642 +rarity=C +[/card] +[card] +primitive=Ruthless Ripper +id=386643 +rarity=U +[/card] +[card] +primitive=Sage of the Inward Eye +id=386644 +rarity=R +[/card] +[card] +primitive=Sage-Eye Harrier +id=386645 +rarity=C +[/card] +[card] +primitive=Sagu Archer +id=386646 +rarity=C +[/card] +[card] +primitive=Sagu Mauler +id=386647 +rarity=R +[/card] +[card] +primitive=Salt Road Patrol +id=386648 +rarity=R +[/card] +[card] +primitive=Sandsteppe Citadel +id=386649 +rarity=U +[/card] +[card] +primitive=Sarkhan, the Dragonspeaker +id=386650 +rarity=M +[/card] +[card] +primitive=Savage Knuckleblade +id=386651 +rarity=R +[/card] +[card] +primitive=Savage Punch +id=386652 +rarity=C +[/card] +[card] +primitive=Scaldkin +id=386653 +rarity=C +[/card] +[card] +primitive=Scion of Glaciers +id=386654 +rarity=U +[/card] +[card] +primitive=Scoured Barrens +id=386655 +rarity=C +[/card] +[card] +primitive=Scout the Borders +id=386656 +rarity=C +[/card] +[card] +primitive=Secret Plans +id=386657 +rarity=U +[/card] +[card] +primitive=See the Unwritten +id=386658 +rarity=M +[/card] +[card] +primitive=Seek the Horizon +id=386659 +rarity=U +[/card] +[card] +primitive=Seeker of the Way +id=386660 +rarity=U +[/card] +[card] +primitive=Set Adrift +id=386661 +rarity=U +[/card] +[card] +primitive=Shambling Attendants +id=386662 +rarity=C +[/card] +[card] +primitive=Shatter +id=386663 +rarity=C +[/card] +[card] +primitive=Sidisi, Brood Tyrant +id=386664 +rarity=M +[/card] +[card] +primitive=Sidisi's Pet +id=386665 +rarity=C +[/card] +[card] +primitive=Siege Rhino +id=386666 +rarity=R +[/card] +[card] +primitive=Siegecraft +id=386667 +rarity=C +[/card] +[card] +primitive=Singing Bell Strike +id=386668 +rarity=C +[/card] +[card] +primitive=Smite the Monstrous +id=386669 +rarity=C +[/card] +[card] +primitive=Smoke Teller +id=386670 +rarity=C +[/card] +[card] +primitive=Snowhorn Rider +id=386671 +rarity=C +[/card] +[card] +primitive=Sorin, Solemn Visitor +id=386672 +rarity=M +[/card] +[card] +primitive=Stubborn Denial +id=386673 +rarity=U +[/card] +[card] +primitive=Sultai Ascendancy +id=386674 +rarity=R +[/card] +[card] +primitive=Sultai Banner +id=386675 +rarity=C +[/card] +[card] +primitive=Sultai Charm +id=386676 +rarity=U +[/card] +[card] +primitive=Sultai Flayer +id=386677 +rarity=U +[/card] +[card] +primitive=Sultai Scavenger +id=386678 +rarity=C +[/card] +[card] +primitive=Sultai Soothsayer +id=386679 +rarity=U +[/card] +[card] +primitive=Summit Prowler +id=386680 +rarity=C +[/card] +[card] +primitive=Surrak Dragonclaw +id=386681 +rarity=M +[/card] +[card] +primitive=Suspension Field +id=386682 +rarity=U +[/card] +[card] +primitive=Swamp +id=386683 +rarity=L +[/card] +[card] +primitive=Swamp +id=386684 +rarity=L +[/card] +[card] +primitive=Swamp +id=386685 +rarity=L +[/card] +[card] +primitive=Swamp +id=386686 +rarity=L +[/card] +[card] +primitive=Swarm of Bloodflies +id=386687 +rarity=U +[/card] +[card] +primitive=Swift Kick +id=386688 +rarity=C +[/card] +[card] +primitive=Swiftwater Cliffs +id=386689 +rarity=C +[/card] +[card] +primitive=Taigam's Scheming +id=386690 +rarity=C +[/card] +[card] +primitive=Take Up Arms +id=386691 +rarity=U +[/card] +[card] +primitive=Temur Ascendancy +id=386692 +rarity=R +[/card] +[card] +primitive=Temur Banner +id=386693 +rarity=C +[/card] +[card] +primitive=Temur Charger +id=386694 +rarity=U +[/card] +[card] +primitive=Temur Charm +id=386695 +rarity=U +[/card] +[card] +primitive=Thornwood Falls +id=386696 +rarity=C +[/card] +[card] +primitive=Thousand Winds +id=386697 +rarity=R +[/card] +[card] +primitive=Throttle +id=386698 +rarity=C +[/card] +[card] +primitive=Timely Hordemate +id=386699 +rarity=U +[/card] +[card] +primitive=Tomb of the Spirit Dragon +id=386700 +rarity=U +[/card] +[card] +primitive=Tormenting Voice +id=386701 +rarity=C +[/card] +[card] +primitive=Trail of Mystery +id=386702 +rarity=R +[/card] +[card] +primitive=Tranquil Cove +id=386703 +rarity=C +[/card] +[card] +primitive=Trap Essence +id=386704 +rarity=R +[/card] +[card] +primitive=Treasure Cruise +id=386705 +rarity=C +[/card] +[card] +primitive=Trumpet Blast +id=386706 +rarity=C +[/card] +[card] +primitive=Tusked Colossodon +id=386707 +rarity=C +[/card] +[card] +primitive=Tuskguard Captain +id=386708 +rarity=U +[/card] +[card] +primitive=Ugin's Nexus +id=386709 +rarity=M +[/card] +[card] +primitive=Unyielding Krumar +id=386710 +rarity=C +[/card] +[card] +primitive=Utter End +id=386711 +rarity=R +[/card] +[card] +primitive=Valley Dasher +id=386712 +rarity=C +[/card] +[card] +primitive=Venerable Lammasu +id=386713 +rarity=U +[/card] +[card] +primitive=Villainous Wealth +id=386714 +rarity=R +[/card] +[card] +primitive=War Behemoth +id=386715 +rarity=C +[/card] +[card] +primitive=Warden of the Eye +id=386716 +rarity=U +[/card] +[card] +primitive=War-Name Aspirant +id=386717 +rarity=U +[/card] +[card] +primitive=Watcher of the Roost +id=386718 +rarity=U +[/card] +[card] +primitive=Waterwhirl +id=386719 +rarity=U +[/card] +[card] +primitive=Weave Fate +id=386720 +rarity=C +[/card] +[card] +primitive=Wetland Sambar +id=386721 +rarity=C +[/card] +[card] +primitive=Whirlwind Adept +id=386722 +rarity=C +[/card] +[card] +primitive=Wind-Scarred Crag +id=386723 +rarity=C +[/card] +[card] +primitive=Windstorm +id=386724 +rarity=U +[/card] +[card] +primitive=Windswept Heath +id=386725 +rarity=R +[/card] +[card] +primitive=Wingmate Roc +id=386726 +rarity=M +[/card] +[card] +primitive=Winterflame +id=386727 +rarity=U +[/card] +[card] +primitive=Witness of the Ages +id=386728 +rarity=U +[/card] +[card] +primitive=Wooded Foothills +id=386729 +rarity=R +[/card] +[card] +primitive=Woolly Loxodon +id=386730 +rarity=C +[/card] +[card] +primitive=Zurgo Helmsmasher +id=386731 +rarity=M +[/card] diff --git a/projects/mtg/bin/Res/sets/KTK/booster.txt b/projects/mtg/bin/Res/sets/KTK/booster.txt new file mode 100644 index 000000000..dc7345ae9 --- /dev/null +++ b/projects/mtg/bin/Res/sets/KTK/booster.txt @@ -0,0 +1,21 @@ + + + rarity:mythic; + rarity:rare; + rarity:rare; + rarity:rare; + rarity:rare; + rarity:rare; + rarity:rare; + rarity:rare; + + + rarity:uncommon; + + + rarity:special; + + + rarity:common; + + \ No newline at end of file From 307be96fd6ab2e2430ed0bcc552b4a26e141f03f Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Wed, 12 Aug 2015 20:16:07 +0800 Subject: [PATCH 014/249] Added Formidable cards --- projects/mtg/bin/Res/test/formidable.txt | 33 ++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 projects/mtg/bin/Res/test/formidable.txt diff --git a/projects/mtg/bin/Res/test/formidable.txt b/projects/mtg/bin/Res/test/formidable.txt new file mode 100644 index 000000000..0566d7d46 --- /dev/null +++ b/projects/mtg/bin/Res/test/formidable.txt @@ -0,0 +1,33 @@ +#Testing Atarka Beastbreaker,Stampeding Elk Herd -- Formidable +#Atarka Beastbreaker will become 6/6, and then attacks along with Stampeding Elk Herd, trample effect will trigger +#then p2 will block with Steel Wall, p2 must have 13 life... +[INIT] +COMBATATTACKERS +[PLAYER1] +inplay:Atarka Beastbreaker,Krosan Tusker,Stampeding Elk Herd +manapool:{4}{G} +[PLAYER2] +inplay:Steel Wall +life:20 +[DO] +Atarka Beastbreaker +choice 1 +Atarka Beastbreaker +Stampeding Elk Herd +next +Steel Wall +#blockers +next +#combatdamage 2 +next +next +#endofcombat 2 +[ASSERT] +COMBATEND +[PLAYER1] +inplay:Atarka Beastbreaker,Krosan Tusker,Stampeding Elk Herd +manapool:{0} +[PLAYER2] +graveyard:Steel Wall +life:13 +[END] \ No newline at end of file From bfbc0735937007d594df7be4247537f86bcfd182 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Wed, 12 Aug 2015 20:23:46 +0800 Subject: [PATCH 015/249] added cards --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 96 ++++++++++++++++++++ 1 file changed, 96 insertions(+) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 7f6e74e9a..9d9a51b32 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -4802,6 +4802,16 @@ power=2 toughness=3 [/card] [card] +name=Atarka Beastbreaker +auto={4}{G}:4/4 restriction{compare(powertotalinplay)~morethan~7} +text=Formidable — {4}{G}: Atarka Beastbreaker gets +4/+4 until end of turn. Activate this ability only if creatures you control have total power 8 or greater. +mana={1}{G} +type=Creature +subtype=Human Warrior +power=2 +toughness=2 +[/card] +[card] name=Atog auto={S(artifact|myBattlefield)}:2/2 text=Sacrifice an artifact: Atog gets +2/+2 until end of turn. @@ -15054,6 +15064,17 @@ power=3 toughness=2 [/card] [card] +name=Circle of Elders +abilities=vigilance +auto={T}:Add{3} restriction{compare(powertotalinplay)~morethan~7} +text=Vigilance -- Formidable — {T}: Add {3} to your mana pool. Activate this ability only if creatures you control have total power 8 or greater. +mana={2}{G}{G} +type=Creature +subtype=Human Shaman +power=2 +toughness=4 +[/card] +[card] name=Circle of Flame auto=@each opponent blockers:damage:1 all(creature[-flying&attacking]) text=Whenever a creature without flying attacks you or a planeswalker you control, Circle of Flame deals 1 damage to that creature. @@ -17640,6 +17661,17 @@ power=3 toughness=4 [/card] [card] +name=Crater Elemental +auto={R}{T}{S}:damage:4 target(creature) +auto={2}{R}:name(formidable) transforms((,setpower=8)) restriction{compare(powertotalinplay)~morethan~7} ueot +text={R}, {T}, Sacrifice Crater Elemental: Crater Elemental deals 4 damage to target creature. -- Formidable — {2}{R}: Crater Elemental has base power 8 until end of turn. Activate this ability only if creatures you control have total power 8 or greater. +mana={2}{R} +type=Creature +subtype=Elemental +power=0 +toughness=6 +[/card] +[card] name=Crater Hellion auto=damage:4 all(other creature) auto=upcost[{4}{R}{R};next upkeep] sacrifice @@ -23561,6 +23593,18 @@ power=2 toughness=3 [/card] [card] +name=Dragon Whisperer +auto={R}:flying +auto={1}{R}:1/0 +auto={4}{R}{R}:token(Dragon,creature dragon, 4/4,flying red) restriction{compare(powertotalinplay)~morethan~7} +text={R}: Dragon Whisperer gains flying until end of turn. -- {1}{R}: Dragon Whisperer gets +1/+0 until end of turn. -- Formidable — {4}{R}{R}: Put a 4/4 red Dragon creature token with flying onto the battlefield. Activate this ability only if creatures you control have total power 8 or greater. +mana={R}{R} +type=Creature +subtype=Human Shaman +power=2 +toughness=2 +[/card] +[card] name=Dragon Wings target=creature auto=flying @@ -23573,6 +23617,16 @@ type=Enchantment subtype=Aura [/card] [card] +name=Dragon-Scarred Bear +auto={1}{G}:regenerate restriction{compare(powertotalinplay)~morethan~7} +text=Formidable — {1}{G}: Regenerate Dragon-Scarred Bear. Activate this ability only if creatures you control have total power 8 or greater. +mana={2}{G} +type=Creature +subtype=Bear +power=3 +toughness=2 +[/card] +[card] name=Dragon's Claw auto=@movedTo(*[red]|stack):may life:1 controller text=Whenever a player casts a red spell, you may gain 1 life. @@ -35305,6 +35359,17 @@ power=4 toughness=4 [/card] [card] +name=Glade Watcher +abilities=defender +auto={G}:canattack restriction{compare(powertotalinplay)~morethan~7} ueot +text=Defender -- Formidable — {G}: Glade Watcher can attack this turn as though it didn't have defender. Activate this ability only if creatures you control have total power 8 or greater. +mana={1}{G} +type=Creature +subtype=Elemental +power=3 +toughness=3 +[/card] +[card] name=Gladecover Scout abilities=opponentshroud text=Hexproof (This creature can't be the target of spells or abilities your opponents control.) @@ -74795,6 +74860,17 @@ power=5 toughness=5 [/card] [card] +name=Sabertooth Outrider +abilities=trample +auto=@combat(attacking) source(this) restriction{compare(powertotalinplay)~morethan~7}:first strike ueot +text=Trample -- Formidable — Whenever Sabertooth Outrider attacks, if creatures you control have total power 8 or greater, Sabertooth Outrider gains first strike until end of turn. +mana={3}{R} +type=Creature +subtype=Human Warrior +power=4 +toughness=2 +[/card] +[card] name=Sabertooth Wyvern abilities=flying,first strike text=Flying, first strike @@ -86237,6 +86313,16 @@ power=1 toughness=1 [/card] [card] +name=Stampeding Elk Herd +auto=@combat(attacking) source(this) restriction{compare(powertotalinplay)~morethan~7}:lord(creature|myBattlefield) trample ueot +text=Formidable — Whenever Stampeding Elk Herd attacks, if creatures you control have total power 8 or greater, creatures you control gain trample until end of turn. +mana={3}{G}{G} +type=Creature +subtype=Elk +power=5 +toughness=5 +[/card] +[card] name=Stampeding Rhino abilities=trample text=Trample (If this creature would deal enough damage to its blockers to destroy them, you may have it deal the rest of its damage to defending player or planeswalker.) @@ -88771,6 +88857,16 @@ mana={3}{W} type=Instant [/card] [card] +name=Surrak, the Hunt Caller +auto=@each my combatbegins restriction{compare(powertotalinplay)~morethan~7}:haste target(creature|mybattlefield) ueot +text=Formidable — At the beginning of combat on your turn, if creatures you control have total power 8 or greater, target creature you control gains haste until end of turn. +mana={2}{G}{G} +type=Legendary Creature +subtype=Human Warrior +power=5 +toughness=4 +[/card] +[card] name=Surrakar Banisher auto=may moveTo(ownerhand) target(creature[tapped]) text=When Surrakar Banisher enters the battlefield, you may return target tapped creature to its owner's hand. From 3646219da44113dd00081c12dd03f8418f877510 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Wed, 12 Aug 2015 20:46:23 +0800 Subject: [PATCH 016/249] Added missing devotion cards --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 102 +++++++++++++++++++ projects/mtg/bin/Res/test/_tests.txt | 1 + 2 files changed, 103 insertions(+) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 9d9a51b32..eb8762c27 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -282,6 +282,19 @@ mana={1}{W} type=Instant [/card] [card] +name=Abhorrent Overlord +abilities=flying +auto=token(Harpy,creature harpy, 1/1,black,flying)*type:manaB +auto=@each my upkeep:sacrifice notatarget(creature|myBattlefield) +text=Flying. -- When Abhorrent Overlord enters the battlefield, put a number of 1/1 black Harpy creature tokens with flying onto the battlefield equal to your devotion to black. (Each {B} in the mana costs of permanents you control counts toward your devotion to black.) -- +At the beginning of your upkeep, sacrifice a creature. +mana={5}{B}{B} +type=Creature +subtype=Demon +power=6 +toughness=6 +[/card] +[card] name=Abjure target=*|stack auto=fizzle @@ -28289,6 +28302,16 @@ type=Enchantment subtype=Aura [/card] [card] +name=Evangel of Heliod +auto=token(Soldier,Creature Soldier,1/1,white)*type:manaW +text=When Evangel of Heliod enters the battlefield, put a number of 1/1 white Soldier creature tokens onto the battlefield equal to your devotion to white. (Each {W} in the mana costs of permanents you control counts toward your devotion to white.) +mana={4}{W}{W} +type=Creature +subtype=Human Cleric +power=1 +toughness=3 +[/card] +[card] name=Evangelize auto=ability$!name(choose a creature) target(creature|mybattlefield) moveTo(opponentbattlefield)!$ opponent buyback={4}{W}{2}{W}{W} @@ -29405,6 +29428,16 @@ mana={3}{B}{B} type=Sorcery [/card] [card] +name=Fanatic of Mogis +auto=damage:type:manaR opponent +text=When Fanatic of Mogis enters the battlefield, it deals damage to each opponent equal to your devotion to red. (Each {R} in the mana costs of permanents you control counts toward your devotion to red.) +mana={3}{R} +type=Creature +subtype=Minotaur Shaman +power=4 +toughness=2 +[/card] +[card] name=Fanatic of Xenagos abilities=trample auto=ability$!choice name(Tribute 1) all(mystored) counter(1/1) _ choice name(+1/+1 and Haste) all(mystored) haste ueot && all(mystored) 1/1 ueot!$ opponent @@ -46790,6 +46823,16 @@ power=6 toughness=7 [/card] [card] +name=Karametra's Acolyte +auto={T}:thisforeach(variable{type:manaG}>0) add{G} +text={T}: Add an amount of {G} to your mana pool equal to your devotion to green. (Each {G} in the mana costs of permanents you control counts toward your devotion to green.) +mana={3}{G} +type=Creature +subtype=Human Druid +power=1 +toughness=4 +[/card] +[card] name=Karametra's Favor target=creature auto=teach(creature) {T}:add{G} @@ -54519,6 +54562,16 @@ power=4 toughness=3 [/card] [card] +name=Marshmist Titan +autohand=affinity(type:manaB) reduce({1}) +text=Marshmist Titan costs {X} less to cast, where X is your devotion to black. (Each {B} in the mana costs of permanents you control counts toward your devotion to black.) +mana={6}{B} +type=Creature +subtype=Giant +power=4 +toughness=5 +[/card] +[card] name=Martial Coup auto=this(X>=5) destroy all(creature) auto=token(Soldier,creature soldier,1/1,white) *X @@ -57575,6 +57628,16 @@ power=2 toughness=2 [/card] [card] +name=Mogis's Marauder +auto=name(intimidate & haste) target(creature|battlefield) transforms((,newability[intimidate],newability[haste])) ueot +text=When Mogis's Marauder enters the battlefield, up to X target creatures each gain intimidate and haste until end of turn, where X is your devotion to black. (Each {B} in the mana costs of permanents you control counts toward your devotion to black.) +mana={2}{B} +type=Creature +subtype=Human Berserker +power=2 +toughness=2 +[/card] +[card] name=Mold Adder auto=@movedTo(*[black;blue]|opponentStack):may counter(1/1,1) text=Whenever an opponent casts a blue or black spell, you may put a +1/+1 counter on Mold Adder. @@ -61959,6 +62022,27 @@ power=1 toughness=1 [/card] [card] +name=Nykthos, Shrine to Nyx +auto={T}:Add{1} +auto={2}{T}:name(Green) thisforeach(variable{type:manaG}>0) add{G} +auto={2}{T}:name(Red) thisforeach(variable{type:manaR}>0) add{R} +auto={2}{T}:name(Blue) thisforeach(variable{type:manaU}>0) add{U} +auto={2}{T}:name(Black) thisforeach(variable{type:manaB}>0) add{B} +auto={2}{T}:name(White) thisforeach(variable{type:manaW}>0) add{W} +text={T}: Add {1} to your mana pool. -- {2}, {T}: Choose a color. Add to your mana pool an amount of mana of that color equal to your devotion to that color. (Your devotion to a color is the number of mana symbols of that color in the mana costs of permanents you control.) +type=Legendary Land +[/card] +[card] +name=Nylea's Disciple +auto=life:type:manaG controller +text=When Nylea's Disciple enters the battlefield, you gain life equal to your devotion to green. (Each {G} in the mana costs of permanents you control counts toward your devotion to green.) +mana={2}{G}{G} +type=Creature +subtype=Centaur Archer +power=3 +toughness=3 +[/card] +[card] name=Nyxathid auto=foreach(*|opponenthand) -1/-1 text=As Nyxathid enters the battlefield, choose an opponent. -- Nyxathid gets -1/-1 for each card in the chosen player's hand. @@ -72413,6 +72497,16 @@ mana={2}{W}{W} type=Enchantment [/card] [card] +name=Reverent Hunter +auto=thisforeach(variable{type:manaG}>0) counter(1/1,1) +text=When Reverent Hunter enters the battlefield, put a number of +1/+1 counters on it equal to your devotion to green. (Each {G} in the mana costs of permanents you control counts toward your devotion to green.) +mana={2}{G} +type=Creature +subtype=Human Archer +power=1 +toughness=1 +[/card] +[card] name=Reverent Mantra other={E(*[white]|myhand)} name(Exile a White Card from Hand) auto=choice name(all creatures gain protection from white) lord(creature) protection from white @@ -91537,6 +91631,14 @@ power=0 toughness=5 [/card] [card] +name=Thassa's Rebuff +target=*|stack +auto=transforms((,newability[pay[[{value:type:manaU}]] name(pay {value} mana) donothing?fizzle])) forever +text=Counter target spell unless its controller pays {X}, where X is your devotion to blue. (Each {U} in the mana costs of permanents you control counts toward your devotion to blue.) +mana={1}{U} +type=Instant +[/card] +[card] name=That Which Was Taken auto={4}{T}:counter(0/0,1,Divinity) target(other *) auto=lord(*[counter{0/0.1.Divinity}]) indestructible diff --git a/projects/mtg/bin/Res/test/_tests.txt b/projects/mtg/bin/Res/test/_tests.txt index 53bb5f826..0d65718ba 100644 --- a/projects/mtg/bin/Res/test/_tests.txt +++ b/projects/mtg/bin/Res/test/_tests.txt @@ -345,6 +345,7 @@ foratog.txt force_of_nature.txt force_of_nature2.txt force_of_nature3.txt +formidable.txt fountain_of_youth.txt Frogmite.txt fungus_sliver.txt From 7376ac382f8839637f7df1212a763850170df357 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Wed, 12 Aug 2015 20:53:30 +0800 Subject: [PATCH 017/249] added missing copy cards --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 47 ++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index eb8762c27..849d71941 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -13585,6 +13585,16 @@ power=0 toughness=5 [/card] [card] +name=Cemetery Puca +text=Whenever a creature is put into a graveyard from the battlefield, you may pay {1}. If you do, Cemetery Puca becomes a copy of that creature and gains this ability. +auto=@movedto(creature|graveyard) from(battlefield):all(trigger[from]) pay[[{1}]] copy +mana={1}{UB}{UB} +type=Creature +subtype=Shapeshifter +power=1 +toughness=2 +[/card] +[card] name=Cemetery Reaper auto=lord(other zombie|myBattlefield) 1/1 auto={2}{B}{T}:moveTo(Exile) target(creature|graveyard) && token(Zombie,Creature Zombie,2/2,black) @@ -18622,6 +18632,16 @@ power=0 toughness=0 [/card] [card] +name=Cryptoplasm +auto=@each my upkeep:may copy target(other creature|battlefield) +text=At the beginning of your upkeep, you may have Cryptoplasm become a copy of another target creature. If you do, Cryptoplasm gains this ability. +mana={1}{U}{U} +type=Creature +subtype=Shapeshifter +power=2 +toughness=2 +[/card] +[card] name=Cryptwailing auto={1}{E(creature|mygraveyard)}{E(creature|mygraveyard)}:target(player) ability$!name(discard) target(*|myhand) reject!$ targetedplayer asSorcery text={1}, Exile two creature cards from your graveyard: Target player discards a card. Activate this ability only any time you could cast a sorcery. @@ -22296,6 +22316,16 @@ power=2 toughness=2 [/card] [card] +name=Dimir Doppelganger +auto={1}{U}{B}:target(creature|graveyard) moveto(exile) and!(copy)! +text={1}{U}{B}: Exile target creature card from a graveyard. Dimir Doppelganger becomes a copy of that card and gains this ability. +mana={1}{U}{B} +type=Creature +subtype=Shapeshifter +power=0 +toughness=2 +[/card] +[card] name=Dimir Guildgate auto=tap auto={T}:add{U} @@ -91865,6 +91895,13 @@ mana={1}{G}{G} type=Sorcery [/card] [card] +name=Thespian's Stage +auto={T}:Add{1} +auto={2}{T}:copy target(land|battlefield) +text={T}: Add {1} to your mana pool. -- {2}, {T}: Thespian's Stage becomes a copy of target land and gains this ability. +type=Land +[/card] +[card] name=Thicket Basilisk auto=@combat(blocking,blocked) source(this) from(creature[-wall]):all(trigger[from]) phaseaction[combatends once] destroy text=Whenever Thicket Basilisk blocks or becomes blocked by a non-Wall creature, destroy that creature at end of combat. @@ -96605,6 +96642,16 @@ type=Enchantment subtype=Aura [/card] [card] +name=Unstable Shapeshifter +auto=@movedto(other creature|battlefield):all(trigger[from]) copy +text=Whenever another creature enters the battlefield, Unstable Shapeshifter becomes a copy of that creature and gains this ability. +mana={3}{U} +type=Creature +subtype=Shapeshifter +power=0 +toughness=1 +[/card] +[card] name=Unstoppable Ash abilities=trample auto=aslongas(other treefolk|mybattlefield) choice notatarget(other treefolk|mybattlefield) (blink)forsrc oneshot From 07f0175c5e046dacd06e454bb8c5bdb4c235c3b0 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Wed, 12 Aug 2015 21:33:46 +0800 Subject: [PATCH 018/249] fix bad line --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 849d71941..0f2044b1e 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -286,8 +286,7 @@ name=Abhorrent Overlord abilities=flying auto=token(Harpy,creature harpy, 1/1,black,flying)*type:manaB auto=@each my upkeep:sacrifice notatarget(creature|myBattlefield) -text=Flying. -- When Abhorrent Overlord enters the battlefield, put a number of 1/1 black Harpy creature tokens with flying onto the battlefield equal to your devotion to black. (Each {B} in the mana costs of permanents you control counts toward your devotion to black.) -- -At the beginning of your upkeep, sacrifice a creature. +text=Flying. -- When Abhorrent Overlord enters the battlefield, put a number of 1/1 black Harpy creature tokens with flying onto the battlefield equal to your devotion to black. (Each {B} in the mana costs of permanents you control counts toward your devotion to black.) -- At the beginning of your upkeep, sacrifice a creature. mana={5}{B}{B} type=Creature subtype=Demon @@ -105238,7 +105237,6 @@ name=Zhur-Taa Druid auto={T}:Add{G} auto=@tappedformana(this):damage:1 opponent auto={T}: Add {G} to your mana pool. Whenever you tap Zhur-Taa Druid for mana, it deals 1 damage to each opponent. -in your graveyard. mana={R}{G} type=Creature subtype=Human Druid From 66f3ba5a7b279c76a8539272e367cfa2528e46ca Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Wed, 12 Aug 2015 21:38:19 +0800 Subject: [PATCH 019/249] removed id collision avatar token already defined below ajani goldmane --- projects/mtg/bin/Res/sets/LRW/_cards.dat | 5 ----- 1 file changed, 5 deletions(-) diff --git a/projects/mtg/bin/Res/sets/LRW/_cards.dat b/projects/mtg/bin/Res/sets/LRW/_cards.dat index 58a8ff115..c1af94093 100644 --- a/projects/mtg/bin/Res/sets/LRW/_cards.dat +++ b/projects/mtg/bin/Res/sets/LRW/_cards.dat @@ -1513,8 +1513,3 @@ primitive=Zephyr Net id=142357 rarity=C [/card] -[card] -primitive=Avatar Token -id=-140233 -rarity=T -[/card] From 10bc8283eda50cad3d0c305e7fcbce2488a40cd4 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Wed, 12 Aug 2015 22:40:24 +0800 Subject: [PATCH 020/249] added JOU cards --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 993 +++++++++++++++++++ 1 file changed, 993 insertions(+) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 0f2044b1e..080881be5 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -844,6 +844,16 @@ power=5 toughness=5 [/card] [card] +name=Aegis of the Gods +abilities=playershroud +text=You have hexproof. (You can't be the target of spells or abilities your opponents control.) +mana={1}{W} +type=Enchantment Creature +subtype=Human Soldier +power=2 +toughness=1 +[/card] +[card] name=Aegis of the Meek auto={1}{T}:target(creature[power=1;toughness=1]) 1/2 ueot text={1}, {T}: Target 1/1 creature gets +1/+2 until end of turn. @@ -996,6 +1006,17 @@ power=4 toughness=4 [/card] [card] +name=Agent of Erebos +auto=choice target(player) moveTo(exile) all(*|targetedpersonsgraveyard) +auto=@movedto(enchantment|mybattlefield):choice target(player) moveTo(exile) all(*|targetedpersonsgraveyard) +text=Constellation — Whenever Agent of Erebos or another enchantment enters the battlefield under your control, exile all cards from target player's graveyard. +mana={3}{B} +type=Enchantment Creature +subtype=Zombie +power=2 +toughness=2 +[/card] +[card] name=Agent of Masks auto=@each my upkeep:life:-1 opponent auto=@each my upkeep:life:1 controller @@ -1363,6 +1384,27 @@ power=1 toughness=1 [/card] [card] +name=Akroan Line Breaker +auto=@targeted(this) from(*[instant;sorcery;enchantment]|myhand,mygraveyard):2/0 ueot +auto=@targeted(this) from(*[instant;sorcery;enchantment]|myhand,mygraveyard):intimidate ueot +text=Heroic — Whenever you cast a spell that targets Akroan Line Breaker, Akroan Line Breaker gets +2/+0 and gains intimidate until end of turn. +mana={2}{R} +type=Creature +subtype=Human Warrior +power=2 +toughness=1 +[/card] +[card] +name=Akroan Mastiff +auto={W}{T}:tap target(creature) +text={W},{T}: Tap target creature. +mana={3}{W} +type=Creature +subtype=Hound +power=2 +toughness=2 +[/card] +[card] name=Akroan Phalanx abilities=vigilance auto={2}{R}:all(creature|mybattlefield) 1/0 ueot @@ -4101,6 +4143,16 @@ power=2 toughness=2 [/card] [card] +name=Armament of Nyx +target=Creature +auto=teach(-enchantment) preventalldamage from(this) +auto=teach(enchantment) double strike +text=Enchant creature -- Enchanted creature has double strike as long as it's an enchantment. Otherwise, prevent all damage that would be dealt by enchanted creature. (A creature with double strike deals both first-strike and regular combat damage.) +mana={2}{W} +type=Enchantment +subtype=Aura +[/card] +[card] name=Armed Response target=creature[attacking] auto=damage:type:equipment:mybattlefield @@ -4275,6 +4327,15 @@ power=2 toughness=5 [/card] [card] +name=Armory of Iroas +auto={2}:equip +auto=@combat(attacking) source(mytgt):counter(1/1,1) +text=Whenever equipped creature attacks, put a +1/+1 counter on it. -- Equip {2} +mana={2} +type=Artifact +subtype=Equipment +[/card] +[card] name=Arms Dealer auto={1}{R}{S(goblin|myBattlefield)}:Damage:4 target(creature) text={1}{R}, Sacrifice a Goblin: Arms Dealer deals 4 damage to target creature. @@ -4655,6 +4716,16 @@ power=2 toughness=3 [/card] [card] +name=Aspect of Gorgon +target=creature +auto=teach(creature) deathtouch +auto=teach(creature) 1/3 +text=Enchant creature -- Enchanted creature gets +1/+3 and has deathtouch. (Any amount of damage it deals to a creature is enough to destroy it.) +mana={2}{B} +type=Enchantment +subtype=Aura +[/card] +[card] name=Aspect of Hydra target=creature auto=type:manag:mybattlefield/type:manag:mybattlefield ueot @@ -6352,6 +6423,13 @@ mana={U} type=Instant [/card] [card] +name=Banishing Light +auto=(blink)forsrc target(*[-land]|opponentbattlefield) +text=When Banishing Light enters the battlefield, exile target nonland permanent an opponent controls until Banishing Light leaves the battlefield. (That permanent returns under its owner's control.) +mana={2}{W} +type=Enchantment +[/card] +[card] name=Banishing Stroke target=*[artifact;creature;enchantment] auto=bottomoflibrary @@ -6887,6 +6965,16 @@ type=Artifact subtype=Equipment [/card] [card] +name=Bassara Tower Archer +abilities=opponentshroud,reach +text=Hexproof, reach +mana={G}{G} +type=Creature +subtype=Human Archer +power=2 +toughness=1 +[/card] +[card] name=Bathe in Light target=creature auto=choice name(white) protection from white && all(creature[share!color!]) protection from white @@ -7329,6 +7417,16 @@ power=2 toughness=2 [/card] [card] +name=Bearer of the Heavens +autograveyard=@movedto(this|graveyard) from(battlefield):phaseaction[endofturn once] destroy all(*|battlefield) +text=When Bearer of the Heavens dies, destroy all permanents at the beginning of the next end step. +mana={7}{R} +type=Creature +subtype=Giant +power=10 +toughness=10 +[/card] +[card] name=Bearscape auto={1}{G}{E(*|mygraveyard)}{E(*|mygraveyard)}:token(Bear,Creature Bear,2/2,green) text={1}{G}, Exile two cards from your graveyard: Put a 2/2 green Bear creature token onto the battlefield. @@ -9190,6 +9288,17 @@ power=2 toughness=2 [/card] [card] +name=Bloodcrazed Hoplite +auto=@targeted(this) from(*[instant;sorcery;enchantment]|myhand,mygraveyard):counter(1/1,1) +auto=@counteradded(1/1) from(this):counter(1/1,-1) target(creature|opponentbattlefield) +text=Heroic — Whenever you cast a spell that targets Bloodcrazed Hoplite, put a +1/+1 counter on it. -- Whenever a +1/+1 counter is placed on Bloodcrazed Hoplite, remove a +1/+1 counter from target creature an opponent controls. +mana={1}{B} +type=Creature +subtype=Human Soldier +power=2 +toughness=1 +[/card] +[card] name=Bloodcrazed Neonate abilities=mustattack auto=@combatdamaged(player) from(this):counter(1/1,1) @@ -10709,6 +10818,16 @@ mana={1}{U} type=Instant [/card] [card] +name=Brain Maggot +auto=choice name(target opponent) target(opponent) donothing && all(this) transforms((,newability[if type(*[-land]|targetedpersonshand)~lessthan~1 then name(look) donothing notatarget(*|targetedpersonshand) else hand(blink)forsrc notatarget(*[-land]|targetedpersonshand)])) forever +text=When Brain Maggot enters the battlefield, target opponent reveals his or her hand and you choose a nonland card from it. Exile that card until Brain Maggot leaves the battlefield. +mana={1}{B} +type=Enchantment Creature +subtype=Insect +power=1 +toughness=1 +[/card] +[card] name=Brain Weevil abilities=intimidate auto={S}:target(player) ability$!name(discard 2 cards) target(<2>*|myhand) reject!$ targetedplayer asSorcery @@ -13043,6 +13162,16 @@ text={T}: Add {1} to your mana pool. -- {(u/r)}, {T}: Add {U}{U}, {U}{R}, or {R} type=Land [/card] [card] +name=Cast into Darkness +target=creature +auto=teach(creature) cantblock +auto=teach(creature) -2/0 +text=Enchant creature -- Enchanted creature gets -2/-0 and can't block. +mana={1}{B} +type=Enchantment +subtype=Aura +[/card] +[card] name=Castigate target=opponent auto=if type(*[-land]|targetedpersonshand)~lessthan~1 then name(look) donothing notatarget(*|targetedpersonshand) else moveto(exile) notatarget(*[-land]|targetedpersonshand) @@ -14481,6 +14610,17 @@ mana={3} type=Artifact [/card] [card] +name=Chariot of Victory +auto={1}:equip +auto=first strike +auto=trample +auto=haste +text=Equipped creature has first strike, trample, and haste. +mana={3} +type=Artifact +subtype=Equipment +[/card] +[card] name=Charmbreaker Devils auto=@each my upkeep:moverandom(instant,sorcery) from(mygraveyard) to(myhand) auto=@movedTo(instant,sorcery|mystack):4/0 ueot @@ -15544,6 +15684,16 @@ type=Enchantment subtype=Aura [/card] [card] +name=Cloaked Siren +abilities=flash,flying +text=Flash -- Flying +mana={3}{U} +type=Creature +subtype=Siren +power=3 +toughness=2 +[/card] +[card] name=Clock of Omens auto={T(artifact|myBattlefield)}{T(artifact|myBattlefield)}:untap target(artifact) text=Tap two untapped artifacts you control: Untap target artifact. @@ -17409,6 +17559,14 @@ mana={2}{U}{U} type=Sorcery [/card] [card] +name=Countermand +target=*|stack +auto=fizzle && deplete:4 targetcontroller +text=Counter target spell. Its controller puts the top four cards of his or her library into his or her graveyard. +mana={2}{U}{U} +type=Instant +[/card] +[card] name=Counterspell target=*|stack auto=fizzle @@ -19116,6 +19274,16 @@ power=4 toughness=4 [/card] [card] +name=Cyclops of Eternal Fury +auto=lord(creature|mybattlefield) haste +text=Creatures you control have haste. +mana={4}{R}{R} +type=Enchantment Creature +subtype=Cyclops +power=5 +toughness=3 +[/card] +[card] name=Cyclops of One-Eyed Pass text= mana={2}{R}{R} @@ -20125,6 +20293,17 @@ type=Enchantment subtype=Aura [/card] [card] +name=Dawnbringer Charioteers +abilities=flying,lifelink +auto=@targeted(this) from(*[instant;sorcery;enchantment]|myhand,mygraveyard):counter(1/1,1) +text=Flying, lifelink -- Heroic —- Whenever you cast a spell that targets Dawnbringer Charioteers, put a +1/+1 counter on Dawnbringer Charioteers. +mana={2}{W}{W} +type=Creature +subtype=Human Soldier +power=2 +toughness=4 +[/card] +[card] name=Dawnfluke abilities=flash other={W} name(Evoke) @@ -21426,6 +21605,17 @@ type=Enchantment subtype=Aura [/card] [card] +name=Deicide +target=enchantment|battlefield +auto=moveTo(exile) +auto=if cantargetcard(*[god]|battlefield) then all(*[share!name!]|targetcontrollerhand) moveto(exile) +auto=if cantargetcard(*[god]|battlefield) then all(*[share!name!]|targetcontrollerlibrary) moveto(exile) +auto=if cantargetcard(*[god]|battlefield) then all(*[share!name!]|targetcontrollergraveyard) moveto(exile) +text=Exile target enchantment. If the exiled card is a God card, search its controller's graveyard, hand, and library for any number of cards with the same name as that card and exile them, then that player shuffles his or her library. +mana={1}{W} +type=Instant +[/card] +[card] name=Deity of Scars abilities=trample auto=counter(-1/-1,2) @@ -21777,6 +21967,14 @@ power=8 toughness=8 [/card] [card] +name=Desecration Plague +target=enchantment,land +auto=destroy +text=Destroy target enchantment, or land. +mana={3}{G} +type=Sorcery +[/card] +[card] name=Desecrator Hag auto=moveTo(ownerhand) target(creature[power=power:highest:creature:mygraveyard]|mygraveyard) oneshot text=When Desecrator Hag enters the battlefield, return to your hand the creature card in your graveyard with the greatest power. If two or more cards are tied for greatest power, you choose one of them. @@ -22252,6 +22450,31 @@ text={T}, Sacrifice a creature: You gain life equal to the sacrificed creature's type=Land [/card] [card] +name=Dictate of Erebos +abilities=flash +auto=@movedTo(creature|mygraveyard) from(mybattlefield):ability$!name(sacrifice) notatarget(creature|mybattlefield) sacrifice!$ opponent +text=Flash -- Whenever a creature you control dies, each opponent sacrifices a creature. +mana={3}{B}{B} +type=Enchantment +[/card] +[card] +name=Dictate of Heliod +abilities=flash +auto=lord(creature|mybattlefield) 2/2 +text=Flash -- Creatures you control get +2/+2. +mana={3}{W}{W} +type=Enchantment +[/card] +[card] +name=Dictate of Kruphix +abilities=flash +auto=@each my draw:draw:1 controller +auto=@each opponent draw:draw:1 opponent +text=Flash -- At the beginning of each player's draw step, that player draws an additional card. +mana={1}{U}{U} +type=Enchantment +[/card] +[card] name=Didgeridoo auto={3}:moveTo(myBattlefield) target(minotaur|myhand) text={3}: You may put a Minotaur permanent card from your hand onto the battlefield. @@ -23252,6 +23475,17 @@ power=10 toughness=10 [/card] [card] +name=Doomwake Giant +auto=all(creature|opponentbattlefield) -1/-1 +auto=@movedTo(enchantment|myBattlefield):all(creature|opponentbattlefield) -1/-1 +text=Constellation — Whenever Doomwake Giant or another enchantment enters the battlefield under your control, creatures your opponents control get -1/-1 until end of turn. +mana={4}{B} +type=Enchantment Creature +subtype=Giant +power=4 +toughness=6 +[/card] +[card] name=Door of Destinies auto=chooseatype transforms((,newability[@movedTo(creature[chosentype]|mystack)}:counter(0/0.1.Charge)],newability[thisforeach(counter{0/0.1.Charge}) lord(creature[chosentype]|mybattlefield) 1/1])) chooseend text=As Door of Destinies enters the battlefield, choose a creature type. -- Whenever you cast a spell of the chosen type, put a charge counter on Door of Destinies. -- Creatures you control of the chosen type get +1/+1 for each charge counter on Door of Destinies. @@ -24015,6 +24249,17 @@ mana={B}{R} type=Sorcery [/card] [card] +name=Dreadbringer Lampads +auto=name(intimidate) target(creature) transforms((,newability[intimidate])) ueot +auto=@movedTo(enchantment|myBattlefield):name(intimidate) target(creature) transforms((,newability[intimidate])) ueot +text=Constellation — Whenever Dreadbringer Lampads or another enchantment enters the battlefield under your control, target creature gains intimidate until end of turn. (It can't be blocked except by artifact creatures and/or creatures that share a color with it.) +mana={4}{B} +type=Enchantment Creature +subtype=Nymph +power=4 +toughness=2 +[/card] +[card] name=Dreadwaters target=player auto=deplete:type:land:mybattlefield @@ -25437,6 +25682,16 @@ power=1 toughness=1 [/card] [card] +name=Eagle of the Watch +abilities=flying,vigilance +text=Flying, vigilance +mana={2}{W} +type=Creature +subtype=Bird +power=2 +toughness=1 +[/card] +[card] name=Early Frost target=land auto=tap @@ -25870,6 +26125,39 @@ type=Tribal Instant subtype=Shapeshifter [/card] [card] +name=Eidolon of Blossoms +auto=draw:1 +auto=@movedTo(enchantment|myBattlefield):draw:1 +text=Constellation — Whenever Eidolon of Blossoms or another enchantment enters the battlefield under your control, draw a card. +mana={2}{G}{G} +type=Enchantment Creature +subtype=Spirit +power=2 +toughness=2 +[/card] +[card] +name=Eidolon of Rhetoric +auto=maxCast(*)1 +auto=maxCast(*)1 opponent +text=Each player can't cast more than one spell each turn. +mana={2}{W} +type=Enchantment Creature +subtype=Spirit +power=1 +toughness=4 +[/card] +[card] +name=Eidolon of the Great Revel +auto=@movedTo(*[manacost<=3]|mystack):damage:2 controller +auto=@movedTo(*[manacost<=3]|opponentstack):damage:2 opponent +text=Whenever a player casts a spell with converted mana cost 3 or less, Eidolon of the Great Revel deals 2 damage to that player. +mana={R}{R} +type=Enchantment Creature +subtype=Spirit +power=2 +toughness=2 +[/card] +[card] name=Eiganjo Castle auto={T}:Add{W} auto={W}{T}:prevent:2 target(creature[legendary]) @@ -28780,6 +29068,13 @@ mana={1}{U} type=Instant [/card] [card] +name=Extinguish All Hope +auto=all(creature[-enchantment]) destroy +text=Destroy all nonenchantment creatures. +mana={4}{B}{B} +type=Sorcery +[/card] +[card] name=Extortion target=player auto=target(*|targetedpersonshand) reject @@ -29859,6 +30154,14 @@ mana={1}{B} type=Sorcery [/card] [card] +name=Feast of Dreams +target=creature[enchantment],creature[enchanted] +auto=destroy +text=Destroy target enchanted creature or enchantment creature. +mana={1}{B} +type=Instant +[/card] +[card] name=Feast of Flesh target=creature auto=damage:1 @@ -29975,6 +30278,17 @@ power=2 toughness=2 [/card] [card] +name=Felhide Petrifier +abilities=deathtouch +auto=lord(creature[minotaur]|myBattlefield) deathtouch +text=Deathtouch -- Other Minotaur creatures you control have deathtouch. +mana={2}{B} +type=Creature +subtype=Minotaur Warrior +power=2 +toughness=3 +[/card] +[card] name=Felidar Sovereign abilities=vigilance,lifelink auto=@each my upkeep:this(controllerlife > 39) wingame @@ -31316,6 +31630,16 @@ mana={2}{R} type=Sorcery [/card] [card] +name=Flamespeaker's Will +target=creature|mybattlefield +auto=1/1 +auto=@combatdamaged(player) from(mytgt):may sacrifice(this) && destroy target(artifact) +text=Enchant creature you control -- Enchanted creature gets +1/+1. -- Whenever enchanted creature deals combat damage to a player, you may sacrifice Mortal Obstinacy. If you do, destroy target artifact. +mana={R} +type=Enchantment +subtype=Aura +[/card] +[card] name=Flametongue Kavu auto=damage:4 target(creature) text=When Flametongue Kavu enters the battlefield, it deals 4 damage to target creature. @@ -31537,6 +31861,17 @@ power=1 toughness=1 [/card] [card] +name=Fleetfeather Cockatrice +abilities=flash,flying,deathtouch +auto=this(cantargetcard(*[-monstrous]) {5}{G}{U}:becomes(monstrous) forever && counter(1/1,3) +text=Flash (You may cast this spell any time you could cast an instant.) -- Flying, deathtouch -- {5}{G}{U}: Monstrosity 3. (If this creature isn't monstrous, put three +1/+1 counters on it and it becomes monstrous.) +mana={3}{G}{U} +type=Creature +subtype=Cockatrice +power=3 +toughness=3 +[/card] +[card] name=Fleet-Footed Monk auto=cantbeblockedby(creature[power>=2]) text=Fleet-Footed Monk can't be blocked by creatures with power 2 or greater. @@ -32098,6 +32433,13 @@ power=3 toughness=3 [/card] [card] +name=Flurry of Horns +auto=token(Minotaur,Creature Minotaur,2/3,red,haste)*2 +text=Put two 2/3 red Minotaur creature tokens with haste onto the battlefield. +mana={4}{R} +type=Sorcery +[/card] +[card] name=Flurry of Wings auto=foreach(creature[attacking]) token(Bird Soldier,Creature Bird Soldier,1/1,white flying) text=Put X 1/1 white Bird Soldier creature tokens with flying onto the battlefield, where X is the number of attacking creatures. @@ -32256,6 +32598,27 @@ power=4 toughness=4 [/card] [card] +name=Font of Fertility +auto={1}{G}{S}:moveTo(myBattlefield) and!(tap)! target(basic|mylibrary) && shuffle +text={1}{G}, Sacrifice Font of Fertility: Search your library for a basic land card, put it onto the battlefield tapped, then shuffle your library. +mana={1}{G} +type=Enchantment +[/card] +[card] +name=Font of Fortunes +auto={1}{U}{T}{S}:draw:2 +text={1}{U}, Sacrifice Font of Fortunes: Draw two cards. +mana={1}{U} +type=Enchantment +[/card] +[card] +name=Font of Ire +auto={3}{R}{T}{S}:damage:5 target(player) +text={3}{R}, Sacrifice Font of Ire: Font of Ire deals 5 damage to target player. +mana={1}{R} +type=Enchantment +[/card] +[card] name=Font of Mythos auto=@each my draw:draw:2 controller auto=@each opponent draw:draw:2 opponent @@ -32264,6 +32627,20 @@ mana={4} type=Artifact [/card] [card] +name=Font of Return +auto={3}{B}{T}{S}:target(creature|mygraveyard) moveTo(myhand) +text={3}{B}, Sacrifice Font of Return: Return up to three target creature cards from your graveyard to your hand. +mana={1}{B} +type=Enchantment +[/card] +[card] +name=Font of Vigor +auto={2}{W}{T}{S}:life:7 +text={2}{W}, Sacrifice Font of Vigor: You gain 7 life. +mana={1}{W} +type=Enchantment +[/card] +[card] name=Fool's Demise target=creature auto=@movedTo(mytgt|graveyard) from(battlefield):all(trigger[to]) moveTo(mybattlefield) @@ -32513,6 +32890,17 @@ power=1 toughness=1 [/card] [card] +name=Forgeborn Oreads +auto=damage:1 target(creature,player) +auto=@movedTo(enchantment|myBattlefield):damage:1 target(creature,player) +text=Constellation — Whenever Forgeborn Oreads or another enchantment enters the battlefield under your control, Forgeborn Oreads deals 1 damage to target creature or player. +mana={2}{R}{R} +type=Enchantment Creature +subtype=Nymph +power=4 +toughness=2 +[/card] +[card] name=Forgestoker Dragon abilities=flying auto=this(attacking) {1}{R}:damage:1 target(creature|battlefield) && removefromcombat @@ -35869,6 +36257,16 @@ power=2 toughness=1 [/card] [card] +name=Gluttonous Cyclops +auto=this(cantargetcard(*[-monstrous]) {5}{R}{R}:becomes(monstrous) forever && counter(1/1,3) +text={5}{R}{R}: Monstrosity 3. (If this creature isn't monstrous, put three +1/+1 counters on it and it becomes monstrous.) +mana={5}{R} +type=Creature +subtype=Cyclops +power=5 +toughness=4 +[/card] +[card] name=Gluttonous Slime abilities=flash auto=may target(other creature|mybattlefield) sacrifice && counter(1/1,1) all(this) @@ -36968,6 +37366,18 @@ power=4 toughness=4 [/card] [card] +name=Godhunter Octopus +abilities=cantattack +auto=aslongas(enchantment|opponentBattlefield) -cantattack +auto=aslongas(*[enchanted]|opponentBattlefield) -cantattack +text=Godhunter Octopus can't attack unless defending player controls an enchantment or an enchanted permanent. +mana={5}{U} +type=Creature +subtype=Octopus +power=5 +toughness=5 +[/card] +[card] name=Godless Shrine auto=tap auto=pay({L:2}) untap @@ -37053,6 +37463,16 @@ power=4 toughness=3 [/card] [card] +name=Golden Hind +auto={T}:Add{G} +text={T}: Add {G} to your mana pool. +mana={1}{G} +type=Creature +subtype=Elk +power=2 +toughness=1 +[/card] +[card] name=Golden Urn auto=@each my upkeep:may counter(0/0,1,Charge) auto={T}{S}:dynamicability @@ -37123,6 +37543,16 @@ power=4 toughness=4 [/card] [card] +name=Gold-Forged Sentinel +abilities=flying +text=Flying +mana={6} +type=Artifact Creature +subtype=Chimera +power=4 +toughness=4 +[/card] +[card] name=Golem Artisan auto={2}:1/1 target(creature[artifact]) auto={2}:flying target(creature[artifact]) @@ -38349,6 +38779,17 @@ mana={5}{G} type=Sorcery [/card] [card] +name=Grim Guardian +auto=life:-1 opponent +auto=@movedTo(enchantment|myBattlefield):life:-1 opponent +text=Constellation — Whenever Grim Guardian or another enchantment enters the battlefield under your control, each opponent loses 1 life. +mana={2}{B} +type=Enchantment Creature +subtype=Zombie +power=1 +toughness=4 +[/card] +[card] name=Grim Harvest target=creature|mygraveyard auto=moveto(ownerhand) @@ -39534,6 +39975,13 @@ power=0 toughness=3 [/card] [card] +name=Hall of Triumph +auto=activatechooseacolor transforms((,newability[lord(creature[chosencolor]|mybattlefield) 1/1])) forever activatechooseend +text=As Hall of Triumph enters the battlefield, choose a color. -- Creatures you control of the chosen color get +1/+1. +mana={3} +type=Legendary Artifact +[/card] +[card] name=Hallowed Burial auto=all(creature) bottomoflibrary text=Put all creatures on the bottom of their owners' libraries. @@ -40046,6 +40494,17 @@ power=5 toughness=5 [/card] [card] +name=Harvestguard Alseids +auto=name(prevent all damage) target(creature) transforms((,newability[preventalldamage to(this)])) ueot +auto=@movedto(enchantment|mybattlefield):name(prevent all damage) target(creature) transforms((,newability[preventalldamage to(this)])) ueot +text=Constellation — Whenever Harvestguard Alseids or another enchantment enters the battlefield under your control, prevent all damage that would be dealt to target creature this turn. +mana={2}{W} +type=Enchantment Creature +subtype=Nymph +power=2 +toughness=3 +[/card] +[card] name=Hasran Ogress auto=@combat(attacking) source(this):pay({2}) name(pay 2 mana) donothing?damage:3 controller text=Whenever Hasran Ogress attacks, it deals 3 damage to you unless you pay {2}. @@ -41267,6 +41726,17 @@ type=Enchantment subtype=Aura [/card] [card] +name=Heroes' Bane +auto=counter(1/1,4) +auto={2}{G}{G}:counter(1/1,p) +text=Heroes' Bane enters the battlefield with four +1/+1 counters on it. -- {2}{G}{G}: Put X +1/+1 counters on Heroes' Bane, where X is its power. +mana={3}{G}{G} +type=Creature +subtype=Hydra +power=0 +toughness=0 +[/card] +[card] name=Heroes' Reunion target=player auto=life:7 @@ -42508,6 +42978,14 @@ power=1 toughness=2 [/card] [card] +name=Hubris +target=creature|battlefield +auto=transforms((,newability[moveto(ownerhand) all(children[aura]],newability[moveto(ownerhand)])) forever +text=Return target creature and all Auras attached to it to their owners' hands. +mana={1}{U} +type=Instant +[/card] +[card] name=Hulking Cyclops abilities=cantblock text=Hulking Cyclops can't block. @@ -42575,6 +43053,17 @@ power=2 toughness=2 [/card] [card] +name=Humbler of Mortals +auto=all(creature|myBattlefield) trample ueot +auto=@movedTo(enchantment|myBattlefield):all(creature|myBattlefield) trample ueot +text=Constellation — Whenever Humbler of Mortals or another enchantment enters the battlefield under your control, creatures you control gain trample until end of turn. +mana={4}{G}{G} +type=Enchantment Creature +subtype=Elemental +power=5 +toughness=5 +[/card] +[card] name=Hunding Gjornersen auto=rampage(1/1,1) text=Rampage 1 (Whenever this creature becomes blocked, it gets +1/+1 until end of turn for each creature blocking it beyond the first.) @@ -42948,6 +43437,16 @@ power=4 toughness=3 [/card] [card] +name=Hydra Broodmaster +auto=this(cantargetcard(*[-monstrous]) {X}{X}{G}:becomes(monstrous) forever && counter(1/1,xx) && token(Hydra,Creature Hydra,xx/xx,green)*xx +text={X}{X}{G}: Monstrosity X. (If this creature isn't monstrous, put X +1/+1 counters on it and it becomes monstrous.) -- When Hydra Broodmaster becomes monstrous, put X X/X green Hydra creature tokens onto the battlefield. +mana={4}{G}{G} +type=Creature +subtype=Hydra +power=7 +toughness=7 +[/card] +[card] name=Hydra Omnivore text=Whenever Hydra Omnivore deals combat damage to an opponent, it deals that much damage to each other opponent. mana={4}{G}{G} @@ -47936,6 +48435,16 @@ power=4 toughness=5 [/card] [card] +name=King Macar, the Gold-Cursed +auto=@untapped(this):may moveto(exile) target(creature) && token(-378445) controller +text=Inspired — Whenever King Macar, the Gold-Cursed becomes untapped, you may exile target creature. If you do, put a colorless artifact token named Gold onto the battlefield. It has "Sacrifice this artifact: Add one mana of any color to your mana pool." +mana={2}{B}{B} +type=Legendary Creature +subtype=Human +power=2 +toughness=3 +[/card] +[card] name=King Suleiman auto={T}:destroy target(djinn,efreet) text={T}: Destroy target Djinn or Efreet. @@ -49874,6 +50383,16 @@ power=3 toughness=3 [/card] [card] +name=Lagonna-Band Trailblazer +auto=@targeted(this) from(*[instant;sorcery;enchantment]|myhand,mygraveyard):counter(1/1,1) +text=Heroic —- Whenever you cast a spell that targets Lagonna-Band Trailblazer, put a +1/+1 counter on Lagonna-Band Trailblazer. +mana={W} +type=Creature +subtype=Centaur Scout +power=0 +toughness=4 +[/card] +[card] name=Lake of the Dead auto=if type(swamp|mybattlefield)~morethan~0 then sacrifice notatarget(swamp|mybattlefield) oneshot else sacrifice auto={T}:Add{B} @@ -50724,6 +51243,16 @@ power=1 toughness=1 [/card] [card] +name=Leonin Iconoclast +auto=@targeted(this) from(*[instant;sorcery;enchantment]|myhand,mygraveyard):destroy target(Creature[enchantment]|opponentbattlefield) +text=Heroic — Whenever you cast a spell that targets Leonin Iconoclast, destroy target enchantment creature an opponent controls. +mana={3}{W} +type=Creature +subtype=Cat Monk +power=3 +toughness=2 +[/card] +[card] name=Leonin Relic-Warder auto=may (blink)forsrc target(artifact,enchantment) text=When Leonin Relic-Warder enters the battlefield, you may exile target artifact or enchantment. -- When Leonin Relicguard leaves the battlefield, return the exiled card to the battlefield under its owner's control. @@ -51315,6 +51844,16 @@ mana={1}{R} type=Instant [/card] [card] +name=Lightning Diadem +target=creature +auto=2/2 +auto=damage:2 target(creature,player) +text=When Lightning Diadem enters the battlefield, it deals 2 damage to target creature or player. -- Enchanted creature gets +2/+2. +mana={5}{R} +type=Enchantment +subtype=Aura +[/card] +[card] name=Lightning Dragon abilities=flying auto={R}:1/0 @@ -53808,6 +54347,16 @@ type=Enchantment subtype=Aura [/card] [card] +name=Mana Confluence +auto={L}{T}:Add{W} +auto={L}{T}:Add{U} +auto={L}{T}:Add{B} +auto={L}{T}:Add{R} +auto={L}{T}:Add{G} +text={T}, Pay 1 life: Add one mana of any color to your mana pool. +type=Land +[/card] +[card] name=Mana Crypt auto={T}:Add{2} auto=@each my upkeep:flipacoin loseability damage:3 controller loseabilityend flipend @@ -54335,6 +54884,15 @@ power=2 toughness=3 [/card] [card] +name=Market Festival +target=land +auto=teach(land) transforms((,newability[@tappedformana(this):chooseacolor add{chosencolor} chooseend],newability[@tappedformana(this):chooseacolor add{chosencolor} chooseend])) +text=Whenever enchanted land is tapped for mana, its controller adds two mana in any combination of colors to his or her mana pool (in addition to the mana the land produces). +mana={3}{G} +type=Enchantment +subtype=Aura +[/card] +[card] name=Markov Blademaster abilities=double strike auto=@combatdamaged(opponent) from(this):counter(1/1,1) @@ -54880,6 +55438,17 @@ power=* toughness=* [/card] [card] +name=Master of the Feast +abilities=flying +auto=@each my upkeep:draw:1 opponent +text=Flying -- At the beginning of your upkeep, each opponent draws a card. +mana={1}{B}{B} +type=Enchantment Creature +subtype=Demon +power=5 +toughness=5 +[/card] +[card] name=Master of the Pearl Trident auto=lord(other merfolk|mybattlefield) 1/1 auto=lord(other merfolk|mybattlefield) islandwalk @@ -58466,6 +59035,16 @@ mana={2}{B}{B} type=Enchantment [/card] [card] +name=Mortal Obstinacy +target=creature|mybattlefield +auto=1/1 +auto=@combatdamaged(player) from(mytgt):may sacrifice(this) && destroy target(enchantment) +text=Enchant creature you control -- Enchanted creature gets +1/+1. -- Whenever enchanted creature deals combat damage to a player, you may sacrifice Mortal Obstinacy. If you do, destroy target enchantment. +mana={W} +type=Enchantment +subtype=Aura +[/card] +[card] name=Mortal Wound target=creature auto=@damaged(mytgt):destroy @@ -61123,6 +61702,14 @@ mana={3}{B} type=Sorcery [/card] [card] +name=Nightmarish End +target=creature +auto=foreach(*|myhand) -1/-1 +text=Target creature gets -X/-X until end of turn, where X is the number of cards in your hand. +mana={2}{B} +type=Instant +[/card] +[card] name=Nightscape Apprentice auto={U}{T}:moveTo(ownerLibrary) target(creature|myBattlefield) auto={R}{T}:first strike target(creature) @@ -62082,6 +62669,38 @@ power=7 toughness=7 [/card] [card] +name=Nyx Infusion +target=creature +auto=teach(creature[enchantment]) 2/2 +auto=teach(creature[-enchantment]) -2/-2 +text=Enchant creature -- Enchanted creature gets +2/+2 as long as it's an enchantment. Otherwise, it gets -2/-2. +mana={2}{B} +type=Enchantment +subtype=Aura +[/card] +[card] +name=Nyx Weaver +abilities=reach +auto=@each myupkeep:deplete:2 controller +auto={1}{B}{G}{E}:moveto(ownerhand) target(*|mygraveyard) +text=Reach -- At the beginning of your upkeep, put the top two cards of your library into your graveyard. -- {1}{B}{G}, Exile Nyx Weaver: Return target card from your graveyard to your hand. +mana={1}{B}{G} +type=Enchantment Creature +subtype=Spider +power=2 +toughness=3 +[/card] +[card] +name=Nyx-Fleece Ram +auto=@each my upkeep:life:1 controller +text=At the beginning of your upkeep, you gain 1 life. +mana={1}{W} +type=Enchantment Creature +subtype=Sheep +power=0 +toughness=5 +[/card] +[card] name=O-Naginata auto={2}:equip target(creature[power >=3]|mybattlefield) auto=teach(creature) 3/0 @@ -62121,6 +62740,17 @@ power=5 toughness=7 [/card] [card] +name=Oakheart Dryads +auto=1/1 target(creature) ueot +auto=@movedTo(enchantment|myBattlefield):1/1 target(creature) ueot +text=Constellation — Whenever Oakheart Dryads or another enchantment enters the battlefield under your control, target creature gets +1/+1 until end of turn. +mana={2}{G} +type=Enchantment Creature +subtype=Nymph Dryad +power=2 +toughness=3 +[/card] +[card] name=Oasis auto={T}:prevent:1 target(creature) text={T}: Prevent the next 1 damage that would be dealt to target creature this turn. @@ -63433,6 +64063,14 @@ power=2 toughness=2 [/card] [card] +name=Oreskos Swiftclaw +mana={1}{W} +type=Creature +subtype=Cat Warrior +power=3 +toughness=1 +[/card] +[card] name=Organ Grinder auto={T}{E(*|mygraveyard)}{E(*|mygraveyard)}{E(*|mygraveyard)}:life:-3 target(player) text={T}, Exile three cards from your graveyard: Target player loses 3 life. @@ -64980,6 +65618,14 @@ type=Artifact subtype=Equipment [/card] [card] +name=Pensive Minotaur +mana={2}{R} +type=Creature +subtype=Minotaur Warrior +power=2 +toughness=3 +[/card] +[card] name=Pentad Prism abilities=sunburst auto=counter(0/0,sunburst,charge) @@ -65651,6 +66297,16 @@ power=2 toughness=0 [/card] [card] +name=Pharika's Chosen +abilities=deathtouch +text=Deathtouch (Any amount of damage this deals to a creature is enough to destroy it.) +mana={B} +type=Creature +subtype=Snake +power=1 +toughness=1 +[/card] +[card] name=Phelddagrif auto={G}:trample && token(Hippo,Creature Hippo,1/1,green) && moveTo(opponentBattlefield) all(hippo[token]|myBattlefield) auto={W}:flying && life:2 opponent @@ -65686,6 +66342,16 @@ power=5 toughness=5 [/card] [card] +name=Pheres-Band Thunderhoof +auto=@targeted(this) from(*[instant;sorcery;enchantment]|myhand,mygraveyard):counter(1/1,2) +text=Heroic —- Whenever you cast a spell that targets Pheres-Band Thunderhoof, put two +1/+1 counters on Pheres-Band Thunderhoof. +mana={4}{G} +type=Creature +subtype=Centaur Warrior +power=3 +toughness=4 +[/card] +[card] name=Pheres-Band Tromper auto=@untapped(this):counter(1/1) text=Inspired -- Whenever Pheres-Band Tromper becomes untapped, put a +1/+1 counter on it. @@ -65696,6 +66362,19 @@ power=3 toughness=3 [/card] [card] +name=Pheres-Band Warchief +abilities=vigilance,trample +auto=lord(other Centaur|myBattlefield) 1/1 +auto=lord(other Centaur|myBattlefield) vigilance +auto=lord(other Centaur|myBattlefield) trample +text=Vigilance, trample -- Other Centaur creatures you control get +1/+1 and have vigilance and trample. +mana={3}{G} +type=Creature +subtype=Centaur Warrior +power=3 +toughness=3 +[/card] +[card] name=Phobian Phantasm abilities=flying,fear auto=cumulativeupcost[{B}] sacrifice @@ -66338,6 +67017,15 @@ type=Enchantment subtype=Aura [/card] [card] +name=Pin to the Earth +target=creature +auto=-6/0 +text=Enchant creature -- Enchanted creature gets -6/-0. +mana={1}{U} +type=Enchantment +subtype=Aura +[/card] +[card] name=Pincer Spider abilities=reach kicker={3} @@ -70660,6 +71348,17 @@ toughness=9 [/card] ###The 2 cards above should stay together (Flip Card)### [card] +name=Ravenous Leucrocota +abilities=vigilance +auto=this(cantargetcard(*[-monstrous]) {6}{G}:becomes(monstrous) forever && counter(1/1,3) +text={6}{G}: Monstrosity 3. (If this creature isn't monstrous, put three +1/+1 counters on it and it becomes monstrous.) +mana={3}{G} +type=Creature +subtype=Beast +power=2 +toughness=4 +[/card] +[card] name=Ravenous Rats auto=target(opponent) ability$!name(discard) target(*|myhand) reject!$ targetedplayer text=When Ravenous Rats enters the battlefield, target opponent discards a card. @@ -71969,6 +72668,16 @@ mana={1}{W} type=Instant [/card] [card] +name=Renowned Weaver +auto={1}{G}{S}:token(Spider,Enchantment Creature Spider,1/3,green,reach) +text={1}{G}, Sacrifice Renowned Weaver: Put a 1/3 green Spider enchantment creature token with reach onto the battlefield. (It can block creatures with flying.) +mana={G} +type=Creature +subtype=Human Shaman +power=1 +toughness=1 +[/card] +[card] name=Repay in Kind auto=all(player) lifeset:lowestlifetotal text=Each player's life total becomes the lowest life total among all players. @@ -72401,6 +73110,16 @@ mana={2}{W}{W} type=Instant [/card] [card] +name=Returned Reveler +auto=@movedto(this|graveyard) from(battlefield):deplete:3 controller && deplete:3 opponent +text=When Returned Reveler dies, each player puts the top three cards of his or her library into his or her graveyard. +mana={1}{B} +type=Creature +subtype=Zombie Satyr +power=1 +toughness=3 +[/card] +[card] name=Reveillark abilities=flying other={5}{W} name(Evoke) @@ -72434,6 +73153,13 @@ power=0 toughness=1 [/card] [card] +name=Revel of the Fallen God +auto=token(Satyr,Creature Satyr,2/2,red green,haste)*4 controller +text=Put four 2/2 red and green Satyr creature tokens with haste onto the battlefield. +mana={3}{R}{R}{G}{G} +type=Sorcery +[/card] +[card] name=Revelsong Horn auto={1}{T(other creature|myBattlefield)}{T}:1/1 target(creature) text={1}, {T}, Tap an untapped creature you control: Target creature gets +1/+1 until end of turn. @@ -72574,6 +73300,18 @@ mana={2}{W} type=Instant [/card] [card] +name=Reviving Melody +auto=alternative @movedto(creature|myhand) source(this):moveto(myhand) target(enchantment|mygraveyard) +auto=alternative @movedto(enchantment|myhand) source(this):moveto(myhand) target(creature|mygraveyard) +other={2}{G} name(Both) +target=creature,enchantment|mygraveyard +auto=moveto(myhand) +text=Choose one or both - Return target creature card from your graveyard to your hand; and/or return target enchantment card from your graveyard to your hand. +otherrestriction=type(creature|mygraveyard)~morethan~0,type(enchantment|mygraveyard)~morethan~0 +mana={2}{G} +type=Sorcery +[/card] +[card] name=Revoke Existence target=artifact,enchantment auto=moveTo(exile) @@ -73150,6 +73888,17 @@ power=1 toughness=2 [/card] [card] +name=Riptide Chimera +abilities=flying +auto=@each my upkeep:moveTo(ownerhand) notatarget(enchantment|myBattlefield) +text=Flying -- At the beginning of your upkeep, return an enchantment you control to its owner's hand. +mana={2}{U} +type=Enchantment Creature +subtype=Chimera +power=3 +toughness=4 +[/card] +[card] name=Riptide Chronologist auto={U}{S}:activatechooseatype untap all(creature[chosentype]) activatechooseend text={U}, Sacrifice Riptide Chronologist: Untap all creatures of the creature type of your choice. @@ -73822,6 +74571,13 @@ mana={2}{R}{R} type=Sorcery [/card] [card] +name=Rollick of Abandon +auto=all(creature) 2/-2 ueot +text=All creatures get +2/-2 until end of turn. +mana={3}{R}{R} +type=Sorcery +[/card] +[card] name=Rolling Earthquake auto=damage:X all(player) auto=damage:X all(creature[-horsemanship]) @@ -74199,6 +74955,14 @@ power=2 toughness=2 [/card] [card] +name=Rotted Hulk +mana={3}{B} +type=Creature +subtype=Elemental +power=2 +toughness=5 +[/card] +[card] name=Rotted Hystrix mana={4}{G} type=Creature @@ -75968,6 +76732,26 @@ power=2 toughness=4 [/card] [card] +name=Satyr Grovedancer +auto=counter(1/1,1) target(creature) +text=When Satyr Grovedancer enters the battlefield, put a +1/+1 counter on target creature. +mana={1}{G} +type=Creature +subtype=Satyr Shaman +power=1 +toughness=1 +[/card] +[card] +name=Satyr Hoplite +auto=@targeted(this) from(*[instant;sorcery;enchantment]|myhand,mygraveyard):counter(1/1,1) +text=Heroic —- Whenever you cast a spell that targets Satyr Hoplite, put a +1/+1 counter on Satyr Hoplite. +mana={R} +type=Creature +subtype=Satyr Soldier +power=1 +toughness=1 +[/card] +[card] name=Satyr Firedancer auto=@damaged(opponent) from(instant|mystack):damage:thatmuch target(creature|opponentbattlefield) auto=@damaged(opponent) from(sorcery|mystack):damage:thatmuch target(creature|opponentbattlefield) @@ -76786,6 +77570,16 @@ power=3 toughness=3 [/card] [card] +name=Scourge of Fleets +auto=moveto(ownerhand) all(creature[toughness<=type:island:mybattlefield]|opponentbattlefield) +text=When Scourge of Fleets enters the battlefield, return each creature your opponents control with toughness X or less to its owner's hand, where X is the number of Islands you control. +mana={5}{U}{U} +type=Creature +subtype=Kraken +power=6 +toughness=6 +[/card] +[card] name=Scourge of Geier Reach auto=foreach(creature|opponentbattlefield) 1/1 text=Scourge of Geier Reach gets +1/+1 for each creature your opponents control. @@ -81930,6 +82724,14 @@ power=2 toughness=1 [/card] [card] +name=Skybind +auto=(blink) target(*[-enchantment]) ueot +auto=@movedTo(enchantment|myBattlefield):(blink) target(*[-enchantment]) ueot +text=Constellation — Whenever Skybind or another enchantment enters the battlefield under your control, exile target nonenchantment permanent. Return that card to the battlefield under its owner's control at the beginning of the next end step. +mana={3}{W}{W} +type=Enchantment +[/card] +[card] name=Skyblinder Staff auto={3}:equip auto=1/0 @@ -82321,6 +83123,16 @@ power=* toughness=* [/card] [card] +name=Skyspear Cavalry +abilities=flying,double strike +text=Flying -- Double strike (This creature deals both first-strike and regular combat damage.) +mana={3}{W}{W} +type=Creature +subtype=Human Soldier +power=2 +toughness=2 +[/card] +[card] name=Skywatcher Adept auto={3}:counter(0/0,1,Level) asSorcery auto=this(counter{0/0.1.Level}) flying @@ -84573,6 +85385,17 @@ power=5 toughness=3 [/card] [card] +name=Spawn of Thraxes +abilities=flying +auto=damage:type:mountain:mybattlefield target(creature,player) +text=Flying -- When Spawn of Thraxes enters the battlefield, it deals damage to target creature or player equal to the number of Mountains you control. +mana={5}{R}{R} +type=Creature +subtype=Dragon +power=5 +toughness=5 +[/card] +[card] name=Spawnsire of Ulamog mana={10} auto=@combat(attacking) source(this):name(Annihilate) ability$!name(sacrifice a permanent) notatarget(<1>*|mybattlefield) sacrifice!$ opponent @@ -85687,6 +86510,16 @@ power=2 toughness=1 [/card] [card] +name=Spiteful Blow +target=creature +auto=destroy +auto=destroy target(land) +restriction=type(creature|battlefield)~morethan~0,type(land|battlefield)~morethan~0 +text=Destroy target creature and target land. +mana={4}{B}{B} +type=Sorcery +[/card] +[card] name=Spiteful Bully auto=@each my upkeep:damage:3 target(creature|myBattlefield) text=At the beginning of your upkeep, Spiteful Bully deals 3 damage to target creature you control. @@ -86234,6 +87067,16 @@ mana={3}{U} type=Enchantment [/card] [card] +name=Squelching Leeches +auto=foreach(swamp|myBattlefield) 1/1 +text=Squelching Leeches's power and toughness are each equal to the number of Swamps you control. +mana={2}{B}{B} +type=Creature +subtype=Leech +power=* +toughness=* +[/card] +[card] name=Squire mana={1}{W} type=Creature @@ -86546,6 +87389,15 @@ mana={2} type=Artifact [/card] [card] +name=Starfall +target=creature +auto=damage:3 +auto=if cantargetcard(enchantment) then damage:3 targetcontroller +text=Starfall deals 3 damage to target creature. If that creature is an enchantment, Starfall deals 3 damage to that creature's controller. +mana={4}{R} +type=Instant +[/card] +[card] name=Starke of Rath auto={T}:destroy target(artifact,creature) && moveTo(opponentbattlefield) all(this) text={T}: Destroy target artifact or creature. That permanent's controller gains control of Starke of Rath. (This effect lasts indefinitely.) @@ -87865,6 +88717,14 @@ power=6 toughness=4 [/card] [card] +name=Strength from the Fallen +auto=target(creature) type:creature:mygraveyard/type:creature:mygraveyard ueot +auto=@movedTo(enchantment|myBattlefield):target(creature) type:creature:mygraveyard/type:creature:mygraveyard ueot +text=Constellation — Whenever Strength from the Fallen or another enchantment enters the battlefield under your control, target creature gets +X/+X until end of turn, where X is the number of creature cards in your graveyard. +mana={1}{G} +type=Enchantment +[/card] +[card] name=Strength in Numbers target=creature auto=foreach(creature[attacking]) 1/1 @@ -88852,6 +89712,16 @@ mana={1}{W} type=Instant [/card] [card] +name=Supply-Line Cranes +auto=counter(1/1,1) target(creature) +text=When Supply-Line Cranes enters the battlefield, put a +1/+1 counter on target creature. +mana={3}{W}{W} +type=Creature +subtype=Bird +power=2 +toughness=4 +[/card] +[card] name=Supreme Exemplar abilities=flying auto=aslongas(other elemental|mybattlefield) choice notatarget(other elemental|mybattlefield) (blink)forsrc oneshot @@ -89160,6 +90030,17 @@ power=* toughness=1 [/card] [card] +name=Swarmborn Giant +auto=@combatdamaged(controller):sacrifice all(this) +auto=this(cantargetcard(*[-monstrous]) {4}{G}{G}:becomes(monstrous) forever && counter(1/1,2) && transforms((,newAbility[reach])) forever +text=When you're dealt combat damage, sacrifice Swarmborn Giant. -- {3}{G}{G}: Monstrosity 2. (If this creature isn't monstrous, put two +1/+1 counters on it and it becomes monstrous.) -- As long as Swarmborn Giant is monstrous, it has reach. +mana={2}{G}{G} +type=Creature +subtype=Giant +power=6 +toughness=6 +[/card] +[card] name=Swarmyard auto={T}:Add{1} auto={T}:name(insect) regenerate target(insect) @@ -91464,6 +92345,16 @@ power=2 toughness=2 [/card] [card] +name=Tethmos High Priest +auto=@targeted(this) from(*[instant;sorcery;enchantment]|myhand,mygraveyard):moveTo(mybattlefield) target(creature[manacost<=2]|mygraveyard) +text=Heroic — Whenever you cast a spell that targets Tethmos High Priest, return target creature card with converted mana cost 2 or less from your graveyard to the battlefield. +mana={2}{W} +type=Creature +subtype=Cat Cleric +power=2 +toughness=3 +[/card] +[card] name=Tetsuo Umezawa auto=cantbetargetof(aura) auto={U}{B}{B}{R}{T}:name(Destroy target tapped creature) destroy target(creature[tapped]) @@ -91660,6 +92551,25 @@ power=0 toughness=5 [/card] [card] +name=Thassa's Devourer +auto=deplete:2 target(player) +auto=@movedTo(enchantment|myBattlefield):deplete:2 target(player) +text=Constellation — Whenever Thassa's Devourer or another enchantment enters the battlefield under your control, target player puts the top two cards of his or her library into his or her graveyard. +mana={4}{U} +type=Enchantment Creature +subtype=Elemental +power=2 +toughness=6 +[/card] +[card] +name=Thassa's Ire +auto={3}{U}:tap target(creature) +auto={3}{U}:untap target(creature) +text={3}{U}: You may tap or untap target creature. +mana={U} +type=Enchantment +[/card] +[card] name=Thassa's Rebuff target=*|stack auto=transforms((,newability[pay[[{value:type:manaU}]] name(pay {value} mana) donothing?fizzle])) forever @@ -92272,6 +93182,17 @@ mana={G}{G} type=Enchantment [/card] [card] +name=Thoughtrender Lamia +auto=ability$!name(discard) target(*|myhand) reject!$ opponent +auto=@movedTo(enchantment|myBattlefield):ability$!name(discard) target(*|myhand) reject!$ opponent +text=Constellation — Whenever Thoughtrender Lamia or another enchantment enters the battlefield under your control, each opponent discards a card. +mana={4}{B}{B} +type=Enchantment Creature +subtype=Lamia +power=5 +toughness=3 +[/card] +[card] name=Thoughts of Ruin auto=if compare(phandcount)~morethan~0 then sacrifice notatarget(land|mybattlefield) auto=if compare(phandcount)~morethan~0 then ability$! sacrifice notatarget(land|mybattlefield) !$ opponent @@ -93855,6 +94776,14 @@ power=1 toughness=1 [/card] [card] +name=Tormented Thoughts +target=player +auto=ability$!name(discard cards) target(*|myhand) reject!$ targetedplayer +text=As an additional cost to cast Tormented Thoughts, sacrifice a creature. -- Target player discards a number of cards equal to the sacrificed creature's power. +mana={2}{B}{S(creature|mybattlefield)} +type=Sorcery +[/card] +[card] name=Tormentor Exarch auto=choice 2/0 target(creature) ueot auto=choice 0/-2 target(creature) ueot @@ -95256,6 +96185,26 @@ power=1 toughness=1 [/card] [card] +name=Triton Cavalry +auto=@targeted(this) from(*[instant;sorcery;enchantment]|myhand,mygraveyard):may moveTo(ownerhand) target(enchantment|battlefield) +text=Heroic — Whenever you cast a spell that targets Triton Cavalry, you may return target enchantment to its owner's hand. +mana={3}{U} +type=Creature +subtype=Merfolk Soldier +power=2 +toughness=4 +[/card] +[card] +name=Triton Shorestalker +abilities=unblockable +text=Triton Shorestalker can't be blocked. +mana={U} +type=Creature +subtype=Merfolk Rogue +power=1 +toughness=1 +[/card] +[card] name=Triumph of Cruelty auto=@each my upkeep restriction{type(creature[power=power:highest:creature:myBattlefield]|myBattlefield)~equalto~type(creature[power=power:highest:creature:opponentBattlefield]|opponentBattlefield)}:transforms((,newability[name(target opponent) target(opponent) ability$!name(discard) target(*|myhand) reject!$ targetedplayer])) ueot auto=@each my upkeep restriction{type(creature[power=power:highest:creature:myBattlefield]|myBattlefield)~morethan~type(creature[power=power:highest:creature:opponentBattlefield]|opponentBattlefield)}:transforms((,newability[name(target opponent) target(opponent) ability$!name(discard) target(*|myhand) reject!$ targetedplayer])) ueot @@ -96313,6 +97262,18 @@ mana={2}{U} type=Enchantment [/card] [card] +name=Underworld Coinsmith +auto=life:1 +auto=@movedTo(enchantment|myBattlefield):life:1 +auto={W}{B}{L}:life:-1 opponent +text=Constellation — Whenever Underworld Coinsmith or another enchantment enters the battlefield under your control, you gain 1 life. -- {W}{B}, Pay 1 life: Each opponent loses 1 life. +mana={W}{B} +type=Enchantment Creature +subtype=Human Cleric +power=2 +toughness=2 +[/card] +[card] name=Underworld Connections target=land auto=teach(land) {T}{L}:draw:1 @@ -101287,6 +102248,17 @@ power=1 toughness=1 [/card] [card] +name=War-Wing Siren +abilities=flying +auto=@targeted(this) from(*[instant;sorcery;enchantment]|myhand,mygraveyard):counter(1/1,1) +text=Flying -- Heroic -- Whenever you cast a spell that targets War-Wing Siren, put a +1/+1 counter on War-Wing Siren. +mana={2}{U} +type=Creature +subtype=Siren Soldier +power=1 +toughness=3 +[/card] +[card] name=War's Toll auto=@tappedformana(land|opponentBattlefield):tap all(land|opponentBattlefield) auto=@combat(attacking) source(creature|opponentBattlefield):mustattack all(creature|opponentBattlefield) ueot @@ -102509,6 +103481,17 @@ mana={1}{W} type=Instant [/card] [card] +name=Whitewater Naiads +auto=unblockable target(creature) ueot +auto=@movedTo(enchantment|myBattlefield):unblockable target(creature) ueot +text=Constellation — Whenever Whitewater Naiads or another enchantment enters the battlefield under your control, target creature can't be blocked this turn. +mana={3}{U}{U} +type=Enchantment Creature +subtype=Nymph +power=4 +toughness=4 +[/card] +[card] name=Wicked Pact auto=target(<2>creature[-black]) destroy auto=life:-5 controller @@ -102807,6 +103790,16 @@ mana={4}{R}{R} type=Sorcery [/card] [card] +name=Wildfire Cerberus +auto=this(cantargetcard(*[-monstrous]) {5}{R}{R}:becomes(monstrous) forever && counter(1/1,1) transforms((,newability[damage:2 opponent && damage:2 all(creature|opponentbattlefield)])) forever +text={5}{R}{R}: Monstrosity 1. (If this creature isn't monstrous, put a +1/+1 counter on it and it becomes monstrous.) --When Wildfire Cerberus becomes monstrous, it deals 2 damage to each opponent and each creature your opponents control. +mana={4}{R} +type=Creature +subtype=Hound +power=4 +toughness=3 +[/card] +[card] name=Wildfire Emissary abilities=protection from white auto={1}{R}:1/0 From 9999820a8ff8f8b11166c69743556b8b0f7ae6da Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 13 Aug 2015 23:19:20 +0800 Subject: [PATCH 021/249] added missing cards from theros block --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 117 ++++++++++++++++++- 1 file changed, 116 insertions(+), 1 deletion(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 080881be5..b5eb369ad 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -1017,6 +1017,16 @@ power=2 toughness=2 [/card] [card] +name=Agent of Horizons +auto={2}{U}:unblockable ueot +text={2}{U}: Agent of Horizons can't be blocked this turn. +mana={2}{G} +type=Creature +subtype=Human Rogue +power=3 +toughness=2 +[/card] +[card] name=Agent of Masks auto=@each my upkeep:life:-1 opponent auto=@each my upkeep:life:1 controller @@ -1384,6 +1394,16 @@ power=1 toughness=1 [/card] [card] +name=Akroan Conscriptor +auto=@targeted(this) from(*[instant;sorcery;enchantment]|myhand,mygraveyard):name(gain control of target creature until end of turn) target(creature|opponentbattlefield) transforms((,newability[moveTo(opponentbattlefield)],newability[phaseaction[endofturn sourceinplay] moveTo(ownerbattlefield)],newability[untap],haste)) ueot +text=Heroic — Whenever you cast a spell that targets Akroan Conscriptor, gain control of another target creature until end of turn. Untap that creature. It gains haste until end of turn. (WORKAROUND Only can target opponents creatures) +mana={4}{R} +type=Creature +subtype=Human Shaman +power=3 +toughness=2 +[/card] +[card] name=Akroan Line Breaker auto=@targeted(this) from(*[instant;sorcery;enchantment]|myhand,mygraveyard):2/0 ueot auto=@targeted(this) from(*[instant;sorcery;enchantment]|myhand,mygraveyard):intimidate ueot @@ -28024,6 +28044,17 @@ type=Legendary Enchantment [/card] ###The 2 cards above should stay together (Flip Card)### [card] +name=Erebos, God of the Dead +abilities=indestructible +auto=@lifed(opponent):life:-thatmuch opponent +auto={1}{B}{L:2}:Draw:1 controller +auto=this(variable{type:manab}>4) transforms((Creature,setpower=5,settoughness=7)) +text=Indestructible -- As long as your devotion to black is less than five, Erebos isn't a creature. (Each {B} in the mana costs of permanents you control counts toward your devotion to black.) -- Whenver your opponent gains life, he loses that much (WORKAROUND). -- {1}{B}, Pay 2 life: Draw a card. +mana={3}{B} +type=Legendary Enchantment +subtype=God +[/card] +[card] name=Erdwal Ripper abilities=haste auto=@combatdamaged(opponent) from(this):counter(1/1,1) @@ -32189,6 +32220,17 @@ text={T}, Pay 1 life, Sacrifice Flooded Strand: Search your library for a Plains type=Land [/card] [card] +name=Floodtide Serpent +abilities=cantattack +auto={H(enchantment|myBattlefield)}:-cantattack myturnonly +text=Floodtide Serpent can't attack unless you return an enchantment you control to its owner's hand. (WORKAROUND cost can be payed anytime on your turn) (This cost is paid as attackers are declared.) +mana={4}{U} +type=Creature +subtype=Serpent +power=4 +toughness=4 +[/card] +[card] name=Floodwater Dam auto={T}:name(X = 0) donothing auto={3}{T}:name(X = 1) target(land) tap @@ -39504,6 +39546,16 @@ power=0 toughness=4 [/card] [card] +name=Guardians of Meletis +abilities=defender +text=Defender +mana={3} +type=Artifact Creature +subtype=Golem +power=0 +toughness=6 +[/card] +[card] name=Guardian's Magemark abilities=flash target=creature @@ -57775,6 +57827,17 @@ power=1 toughness=1 [/card] [card] +name=Mistcutter Hydra +abilities=nofizzle,haste,protection from blue +auto=counter(1/1,X) +text=Mistcutter Hydra can't be countered. -- Haste, protection from blue. -- Mistcutter Hydra enters the battlefield with X +1/+1 counters on it. +mana={X}{G} +type=Creature +subtype=Hydra +power=0 +toughness=0 +[/card] +[card] name=Mistform Dreamer abilities=flying auto={1}:activatechooseatype all(this) becomes(removecreaturesubtypes) && becomes(chosentype) ueot activatechooseend @@ -62649,6 +62712,17 @@ text={T}: Add {1} to your mana pool. -- {2}, {T}: Choose a color. Add to your ma type=Legendary Land [/card] [card] +name=Nylea, God of the Hunt +abilities=indestructible +auto=lord(other creature|mybattlefield) trample +auto={3}{G}:2/2 target(creature) ueot +auto=this(variable{type:manag}>4) transforms((Creature,setpower=6,settoughness=6)) +text=Indestructible -- As long as your devotion to green is less than five, Nylea isn't a creature. (Each {G} in the mana costs of permanents you control counts toward your devotion to green.) -- Other creatures you control have trample. -- {3}{G}: Target creature gets +2/+2 until end of turn. +mana={3}{G} +type=Legendary Enchantment +subtype=God +[/card] +[card] name=Nylea's Disciple auto=life:type:manaG controller text=When Nylea's Disciple enters the battlefield, you gain life equal to your devotion to green. (Each {G} in the mana costs of permanents you control counts toward your devotion to green.) @@ -62659,6 +62733,16 @@ power=3 toughness=3 [/card] [card] +name=Nylea's Presence +target=land +auto=draw:1 controller +auto=teach(land) transforms((plains forest mountain swamp island,newability[{t}:add{w}],newability[{t}:add{g}],newability[{t}:add{r}],newability[{t}:add{b}],newability[{t}:add{u}])) +text=Enchant land -- When Nylea's Presence enters the battlefield, draw a card. -- Enchanted land is every basic land type in addition to its other types. +mana={1}{G} +type=Enchantment +subtype=Aura +[/card] +[card] name=Nyxathid auto=foreach(*|opponenthand) -1/-1 text=As Nyxathid enters the battlefield, choose an opponent. -- Nyxathid gets -1/-1 for each card in the chosen player's hand. @@ -73110,6 +73194,17 @@ mana={2}{W}{W} type=Instant [/card] [card] +name=Returned Phalanx +abilities=defender +auto={1}{U}:canattack ueot +text=Defender (This creature can't attack.) -- {1}{U}: Returned Phalanx can attack this turn as though it didn't have defender. +mana={1}{B} +type=Creature +subtype=Zombie Soldier +power=3 +toughness=3 +[/card] +[card] name=Returned Reveler auto=@movedto(this|graveyard) from(battlefield):deplete:3 controller && deplete:3 opponent text=When Returned Reveler dies, each player puts the top three cards of his or her library into his or her graveyard. @@ -78289,6 +78384,15 @@ power=2 toughness=1 [/card] [card] +name=Searing Blood +target=creature +auto=damage:2 +auto=transforms((newability[@movedto(this|graveyard) from(battlefield):damage:3 controller])) ueot +text=Searing Blood deals 2 damage to target creature. When that creature dies this turn, Searing Blood deals 3 damage to the creature's controller. (WORKAROUND creature deals secondary damage not Searing Blood) +mana={R}{R} +type=Instant +[/card] +[card] name=Searing Flesh auto=damage:7 opponent text=Searing Flesh deals 7 damage to target opponent. @@ -81381,6 +81485,17 @@ mana={U} type=Sorcery [/card] [card] +name=Silent Sentinel +abilities=flying +auto=@combat(attacking) source(this):may moveTo(myBattlefield) target(*[enchantment]|mygraveyard) && transforms((,newability[if cantargetcard(aura) then activate name(cast from graveyard) castcard(normal)])) oneshot +text=Flying -- Whenever Silent Sentinel attacks, you may return target enchantment card from your graveyard to the battlefield.(WORKAROUND uses a small workaround that recasts aura enchantments so that they can retarget as they should) +mana={5}{W}{W} +type=Creature +subtype=Archon +power=4 +toughness=6 +[/card] +[card] name=Silent Specter abilities=flying auto=@combatdamaged(player) from(this):ability$!name(discard 2 cards) target(<2>*|myhand) reject!$ opponent @@ -88801,7 +88916,7 @@ type=Instant [/card] [card] name=Stromgald Cabal -auto={L}{L}{T}:fizzle target(*[white]|stack) +auto={L}{T}:fizzle target(*[white]|stack) text={T}, Pay 1 life: Counter target white spell. mana={1}{B}{B} type=Creature From b51dfc7733de729193efaa5b695392fac0a5529d Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Fri, 14 Aug 2015 13:19:05 +0800 Subject: [PATCH 022/249] added THS cards --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 1299 ++++++++++++++++++ 1 file changed, 1299 insertions(+) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index b5eb369ad..bbb346cc7 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -1017,6 +1017,17 @@ power=2 toughness=2 [/card] [card] +name=Agent of the Fates +abilities=deathtouch +auto=@targeted(this) from(*[instant;sorcery;enchantment]|myhand,mygraveyard):ability$!name(sacrifice) notatarget(creature|mybattlefield) sacrifice !$ opponent +text=Deathtouch. -- Heroic - Whenever you cast a spell that targets Agent of the Fates, each opponent sacrifices a creature. +mana={1}{B}{B} +type=Creature +subtype=Human Assassin +power=3 +toughness=2 +[/card] +[card] name=Agent of Horizons auto={2}{U}:unblockable ueot text={2}{U}: Agent of Horizons can't be blocked this turn. @@ -1404,6 +1415,38 @@ power=3 toughness=2 [/card] [card] +name=Akroan Crusader +auto=@targeted(this) from(*[instant;sorcery;enchantment]|myhand,mygraveyard):token(Soldier,Creature Soldier,1/1,red,haste) controller +text=Heroic — Whenever you cast a spell that targets Akroan Crusader, put a 1/1 red Soldier creature token with haste onto the battlefield. +mana={R} +type=Creature +subtype=Human Soldier +power=1 +toughness=1 +[/card] +[card] +name=Akroan Hoplite +auto=@combat(attacking) source(this):foreach(creature[attacking]|myBattlefield) 1/0 ueot +text=Whenever Akroan Hoplite attacks, it gets +X/+0 until end of turn, where X is the number of attacking creatures you control. +mana={W}{R} +type=Creature +subtype=Human Soldier +power=1 +toughness=2 +[/card] +[card] +name=Akroan Horse +abilities=defender +auto=moveto(opponentBattlefield) +auto=@each my upkeep:token(Soldier,Creature Soldier,1/1,white) opponent +text=Defender. -- When Akroan Horse enters the battlefield, an opponent gains control of it. -- At the beginning of your upkeep, each opponent puts a 1/1 white Soldier creature token onto the battlefield. +mana={4} +type=Artifact Creature +subtype=Horse +power=0 +toughness=4 +[/card] +[card] name=Akroan Line Breaker auto=@targeted(this) from(*[instant;sorcery;enchantment]|myhand,mygraveyard):2/0 ueot auto=@targeted(this) from(*[instant;sorcery;enchantment]|myhand,mygraveyard):intimidate ueot @@ -2316,6 +2359,18 @@ power=2 toughness=2 [/card] [card] +name=Anax and Cymede +abilities=first strike,vigilance +auto=@targeted(this) from(*[instant;sorcery;enchantment]|myhand,mygraveyard):all(creature|myBattlefield) 1/1 ueot +auto=@targeted(this) from(*[instant;sorcery;enchantment]|myhand,mygraveyard):all(creature|mybattlefield) trample ueot +text=Heroic - Whenever you cast a spell that targets Anax and Cymede, creatures you control get +1/+1 and gain trample until end of turn. +mana={1}{R}{W} +type=Legendary Creature +subtype=Human Soldier +power=3 +toughness=2 +[/card] +[card] name=Ancestor's Chosen abilities=first strike auto=life:type:*:mygraveyard @@ -2834,6 +2889,14 @@ power=2 toughness=2 [/card] [card] +name=Anger of the Gods +auto=all(creature[-protection from red]) exiledeath +auto=damage:3 all(creature) +text=Anger of the Gods deals 3 damage to each creature. If a creature dealt damage this way would die this turn, exile it instead. +mana={1}{R}{R} +type=Sorcery +[/card] +[card] name=Angry Mob abilities=trample auto=phaseaction[my untap] type:swamp:opponentbattlefield/type:swamp:opponentbattlefield ueot nonstatic @@ -2997,6 +3060,16 @@ mana={3}{R} type=Enchantment [/card] [card] +name=Anthousa, Setessan Hero +auto=@targeted(this) from(*[instant;sorcery;enchantment]|myhand,mygraveyard):target(land) transforms((Creature Warrior,setpower=2,settoughness=2)) ueot +text=Heroic - Whenever you cast a spell that targets Anthoussa, Setessan Hero, up to three target lands you control each become 2/2 Warrior creatures until end of turn. They're still lands. +mana={3}{G}{G} +type=Legendary Creature +subtype=Human Warrior +power=4 +toughness=5 +[/card] +[card] name=Anthroplasm auto=counter(1/1,2) auto={X}{T}:+0/+1 all(this) && removeallcounters(1/1) && counter(1/1,X) && -0/-1 all(this) @@ -3070,6 +3143,16 @@ mana={2} type=Artifact [/card] [card] +name=Anvilwrought Raptor +abilities=flying,first strike +text=Flying, first strike +mana={4} +type=Artifact Creature +subtype=Bird +power=2 +toughness=1 +[/card] +[card] name=Apathy target=creature auto=teach(creature) doesnotuntap @@ -3353,6 +3436,17 @@ power=5 toughness=5 [/card] [card] +name=Arbor Colossus +abilities=reach +auto=this(cantargetcard(*[-monstrous]) {3}{G}{G}{G}:becomes(monstrous) forever && counter(1/1,3) && transforms((,newAbility[destroy target(creature[flying]|opponentbattlefield)])) forever +text=Reach -- {3}{G}{G}{G}: Monstrosity 3. (If this creature isn't monstrous, put three +1/+1 counters on it and it becomes monstrous.) -- When Arbor Colossus becomes monstrous, destroy target creature with flying an opponent controls +mana={2}{G}{G}{G} +type=Creature +subtype=Giant +power=6 +toughness=6 +[/card] +[card] name=Arbor Elf auto={t}:untap target(forest) text={T}: Untap target Forest. @@ -3954,6 +4048,16 @@ power=1 toughness=2 [/card] [card] +name=Arena Athlete +auto=@targeted(this) from(*[instant;sorcery;enchantment]|myhand,mygraveyard):cantblock target(creature|opponentbattlefield) ueot +text=Heroic - Whenever you cast a spell that targets Arena Athlete, target creature an opponent controls can't block this turn. +mana={1}{R} +type=Creature +subtype=Human +power=2 +toughness=1 +[/card] +[card] name=Arena of the Ancients auto=lord(creature[legendary]) doesnotuntap auto=tap all(creature[legendary]) @@ -4612,6 +4716,18 @@ mana={2}{B}{B} type=Sorcery [/card] [card] +name=Ashen Rider +abilities=flying +auto=moveTo(exile) target(*|battlefield) +autograveyard=@movedTo(this|graveyard) from(mybattlefield):moveTo(exile) target(*|battlefield) +text=Flying -- When Ashen Rider enters the battlefield or dies, exile target permanent. +mana={4}{W}{W}{B}{B} +type=Creature +subtype=Archon +power=5 +toughness=5 +[/card] +[card] name=Ashenmoor Cohort auto=aslongas(other creature[black]|myBattlefield) 1/1 != 0 text=Ashenmoor Cohort gets +1/+1 as long as you control another black creature. @@ -4773,6 +4889,16 @@ type=Enchantment subtype=Aura [/card] [card] +name=Asphodel Wanderer +auto={2}{B}:regenerate +text={2}{B}: Regenerate Asphodel Wanderer. +mana={B} +type=Creature +subtype=Skeleton Soldier +power=1 +toughness=1 +[/card] +[card] name=Asphyxiate target=Creature[-tapped] auto=destroy @@ -7841,6 +7967,16 @@ power=5 toughness=3 [/card] [card] +name=Benthic Giant +abilities=opponentshroud +text=Hexproof. +mana={5}{U} +type=Creature +subtype=Giant +power=4 +toughness=5 +[/card] +[card] name=Benthicore auto=token(Merfolk Wizard,Creature Merfolk Wizard,1/1,blue)*2 auto={T(merfolk|myBattlefield)}{T(merfolk|myBattlefield)}:untap && shroud @@ -7979,6 +8115,14 @@ mana={2}{U} type=Instant [/card] [card] +name=Bident of Thassa +auto=@combatdamaged(player) from(creature|myBattlefield):may draw:1 controller +auto={1}{U}{T}:all(creature|opponentbattlefield) mustattack ueot +text=Whenever a creature you control deals combat damage to a player, you may draw a card. -- {1}{U},{T}: Creatures your opponents control attack this turn if able. +mana={2}{U}{U} +type=Legendary Enchantment Artifact +[/card] +[card] name=Bifurcate target=creature[-token] auto=moveTo(mybattlefield) notatarget(*[share!name!]|mylibrary) @@ -9680,6 +9824,18 @@ power=1 toughness=1 [/card] [card] +name=Blood-Toll Harpy +abilities=Flying +auto=life:-1 controller +auto=life:-1 opponent +text=Flying. -- When Blood-Toll Harpy enters the battlefield, each player loses 1 life. +mana={2}{B} +type=Creature +subtype=Harpy +power=2 +toughness=1 +[/card] +[card] name=Bloom Tender auto={T}:aslongas(*[white]|myBattlefield) add{W} && aslongas(*[blue]|myBattlefield) add{U} && aslongas(*[black]|myBattlefield) add{B} && aslongas(*[red]|myBattlefield) add{R} && aslongas(*[green]|myBattlefield) add{G} text={T}: For each color among permanents you control, add one mana of that color to your mana pool. @@ -10398,6 +10554,16 @@ power=* toughness=* [/card] [card] +name=Boon of Erebos +target=creature +auto=2/0 +auto=regenerate +auto=life:-2 controller +text=Target creature gets +2/+0 until end of turn. Regenerate it. You lose 2 life. +mana={B} +type=Instant +[/card] +[card] name=Book of Rass auto={L:2}{2}:draw:1 text={2}, Pay 2 life: Draw a card. @@ -10453,6 +10619,14 @@ power=4 toughness=4 [/card] [card] +name=Borderland Minotaur +mana={2}{R}{R} +type=Creature +subtype=Minotaur Warrior +power=4 +toughness=3 +[/card] +[card] name=Borderland Ranger auto=may moveTo(myHand) target(basic|myLibrary) text=When Borderland Ranger enters the battlefield, you may search your library for a basic land card, reveal it, and put it into your hand. If you do, shuffle your library. @@ -10693,6 +10867,18 @@ text=Bottomless Vault enters the battlefield tapped. -- You may choose not to un type=Land [/card] [card] +name=Boulderfall +target=creature,player +auto=damage:1 +auto=damage:1 target(creature,player) +auto=ability$!name(damage) choice target(creature,player) damage:1!$ controller +auto=ability$!name(damage) choice target(creature,player) damage:1!$ controller +auto=ability$!name(damage) choice target(creature,player) damage:1!$ controller +text=Boulderfall deals 5 damage divided as you choose among any number of target creatures and/or players. +mana={6}{R}{R} +type=Sorcery +[/card] +[card] name=Bouncing Beebles auto=aslongas(artifact|opponentBattlefield) unblockable text=Bouncing Beebles is unblockable as long as defending player controls an artifact. @@ -10760,6 +10946,17 @@ power=2 toughness=2 [/card] [card] +name=Bow of Nylea +auto=lord(creature[attacking]|mybattlefield) deathtouch +auto={1}{G}{T}:name(+1/+1 counter) counter(1/1,1) target(creature) +auto={1}{G}{T}:name(2 damage to flyer) damage:2 target(creature[flying]) +auto={1}{G}{T}:name(gain 3 life) life:3 controller +auto={1}{G}{T}:name(put up to 4 on bottom) bottomoflibrary target(*|mygraveyard) +text=Attacking creatures you control have deathtouch. -- {1}{G},{T}: Choose one — Put a +1/+1 counter on target creature; or Bow of Nylea deals 2 damage to target creature with flying; or you gain 3 life; or put up to four target cards from your graveyard on the bottom of your library in any order. +mana={1}{G}{G} +type=Legendary Enchantment Artifact +[/card] +[card] name=Bower Passage auto=lord(creature[flying]) cantbeblockerof(creature|mybattlefield) text=Creatures with flying can't block creatures you control. @@ -11104,6 +11301,17 @@ mana={2}{B} type=Instant [/card] [card] +name=Breaching Hippocamp +abilities=flash +auto=untap target(other creature|mybattlefield) +text=Flash. -- When Breaching Hippocamp enters the battlefield, untap another target creature you control. +mana={3}{U} +type=Creature +subtype=Horse Fish +power=3 +toughness=2 +[/card] +[card] name=Break Asunder target=artifact,enchantment auto=destroy @@ -11499,6 +11707,14 @@ mana={1} type=Artifact [/card] [card] +name=Bronze Sable +mana={2} +type=Artifact Creature +subtype=Sable +power=2 +toughness=1 +[/card] +[card] name=Bronzebeak Moa auto=@movedTo(creature|mybattlefield):3/3 ueot text=Whenever another creature enters the battlefield under your control, Bronzebeak Moa gets +3/+3 until end of turn. @@ -11973,6 +12189,16 @@ power=2 toughness=2 [/card] [card] +name=Burnished Hart +auto={3}{S}:notatarget(land[basic]|mylibrary) and!(tap)! moveTo(mybattlefield) +text={3},Sacrifice Burnished Hart: Search your library for up to two basic land cards, put them onto the battlefield tapped, then shuffle your library. +mana={3} +type=Artifact Creature +subtype=Elk +power=2 +toughness=2 +[/card] +[card] name=Burnout target=instant|stack auto=teach(instant[blue]) fizzle @@ -12569,6 +12795,17 @@ mana={3} type=Artifact [/card] [card] +name=Calvary Pegasus +abilities=flying +auto=@combat(attacking) source(this):all(human[attacking]) flying ueot +text=Flying. -- Whenever Cavalry Pegasus attacks, each attacking Human gains flying until end of turn. +mana={1}{W} +type=Creature +subtype=Pegasus +power=1 +toughness=1 +[/card] +[card] name=Cancel target=*|stack auto=fizzle @@ -13782,6 +14019,16 @@ power=3 toughness=2 [/card] [card] +name=Centaur Battlemaster +auto=@targeted(this) from(*[instant;sorcery;enchantment]|myhand,mygraveyard):counter(1/1,3) +text=Heroic - Whenever you cast a spell that targets Centaur Battlemaster, put three +1/+1 counters on Centaur Battlemaster. +mana={3}{G}{G} +type=Creature +subtype=Centaur Warrior +power=3 +toughness=3 +[/card] +[card] name=Centaur Chieftain abilities=haste auto=aslongas(*|mygraveyard) 1/1 all(creature|mybattlefield) ueot >6 oneshot @@ -14130,6 +14377,15 @@ power=3 toughness=3 [/card] [card] +name=Chained to the Rocks +target=mountain|mybattlefield +auto=(blink)forsrc target(creature|opponentbattlefield) +text=Enchant Mountain you control. -- When Chained to the Rocks enters the battlefield, exile target creature an opponent controls until Chained to the Rocks leaves the battlefield. That creature returns under its owner's control.) +mana={W} +type=Enchantment +subtype=Aura +[/card] +[card] name=Chained Throatseeker abilities=infect auto=this(variable{opponentpoisoncount} <1) cantattack @@ -14988,6 +15244,16 @@ text=Creatures you control get +1/+0 until end of turn. mana={B} type=Sorcery [/card] +[card] +name=Chosen by Heliod +target=creature +auto=0/2 +auto=draw:1 targetcontroller +text=Enchant creature. -- When Chosen by Heliod enters the battlefield, draw a card. -- Enchanted creature gets +0/+2. +mana={1}{W} +type=Enchantment +subtype=Aura +[/card] ###The 2 cards below should stay together (Flip Card)### [card] name=Chosen of Markov @@ -15094,6 +15360,16 @@ type=Enchantment subtype=Aura [/card] [card] +name=Chronicler of Heroes +auto=aslongas(creature[counter{1/1.1}]|mybattlefield) draw:1 controller +text=When Chronicler of Heroes enters the battlefield, draw a card if you control a creature with a +1/+1 counter on it. +mana={1}{G}{W} +type=Creature +subtype=Centaur Wizard +power=3 +toughness=3 +[/card] +[card] name=Chronomaton auto={1}{T}:counter(1/1,1) text={1}, {T}: Put a +1/+1 counter on Chronomaton. @@ -16524,6 +16800,17 @@ mana={R}{G} type=Instant [/card] [card] +name=Colossus of Akros +abilities=defender,indestructible +auto=this(cantargetcard(*[-monstrous]) {10}:becomes(monstrous) forever && counter(1/1,10) && transforms((,newAbility[-defender],newability[trample])) forever +text=Defender, indestructible -- {10}: Monstrosity 10. (If this creature isn't monstrous, put ten +1/+1 counters on it and it becomes monstrous.) -- As long as Colossus of Akros is monstrous, it has trample and can attack as though it didn't have defender. +mana={8} +type=Artifact Creature +subtype=Golem +power=10 +toughness=10 +[/card] +[card] name=Colossus of Sardia abilities=doesnotuntap,trample auto={9}:untap myUpkeepOnly @@ -17116,6 +17403,15 @@ mana={2}{U} type=Instant [/card] [card] +name=Coordinated Assault +target=creature +auto=1/0 ueot +auto=first strike ueot +text=Up to two target creatures each get +1/+0 and gain first strike until end of turn. +mana={R} +type=Instant +[/card] +[card] name=Coordinated Barrage target=creature[attacking;blocking] auto=chooseatype damage:type:*[chosentype]:mybattlefield chooseend @@ -17754,6 +18050,16 @@ mana={1}{R} type=Enchantment [/card] [card] +name=Crackling Triton +auto={2}{R}{S}:damage:2 target(creature,player) +text={2}{R}, Sacrifice Crackling Triton: Crackling Triton deals 2 damage to target creature or player. +mana={2}{U} +type=Creature +subtype=Merfolk Wizard +power=2 +toughness=3 +[/card] +[card] name=Cradle Guard abilities=trample auto=upcost[{1}{G}{G};next upkeep] sacrifice @@ -19135,6 +19441,14 @@ type=Enchantment subtype=Aura Curse [/card] [card] +name=Curse of the Swine +target=creature|battlefield +auto=moveto(exile) && token(Boar,Creature Boar,2/2,green) targetcontroller +text=Exile X target creatures. For each creature exiled this way, its controller puts a 2/2 green Boar creature token onto the battlefield. +mana={X}{U}{U} +type=Sorcery +[/card] +[card] name=Curse of Thirst target=player auto=@each targetedplayer upkeep:damage:targetedcurses @@ -19259,6 +19573,15 @@ power=4 toughness=1 [/card] [card] +name=Cutthroat Maneuver +target=creature +auto=1/1 ueot +auto=lifelink ueot +text=Up to two target creatures each get +1/+1 and gain lifelink until end of turn. +mana={3}{B} +type=Instant +[/card] +[card] name=Cyclopean Mummy auto=@movedTo(this|graveyard) from(battlefield):moveto(exile) text=When Cyclopean Mummy dies, exile Cyclopean Mummy. @@ -19690,6 +20013,14 @@ mana={2}{B} type=Instant [/card] [card] +name=Dark Betrayal +target=creature[black] +auto=destroy +text=Destroy target black creature. +mana={B} +type=Instant +[/card] +[card] name=Darkblast target=creature auto=-1/-1 @@ -20171,6 +20502,14 @@ power=3 toughness=3 [/card] [card] +name=Dauntless Onslaught +target=creature +auto=2/2 ueot +text=Up to two target creatures each get +2/+2 until end of turn. +mana={2}{W} +type=Instant +[/card] +[card] name=Dauthi Cutthroat abilities=shadow auto={1}{B}{T}:destroy target(creature[shadow]) @@ -20893,6 +21232,17 @@ power=13 toughness=13 [/card] [card] +name=Deathbellow Raider +abilities=mustattack +auto={2}{B}:regenerate +text=Deathbellow Raider attacks each turn if able. --{2}{B}: Regenerate Deathbellow Raider. +mana={1}{R} +type=Creature +subtype=Minotaur Berserker +power=2 +toughness=3 +[/card] +[card] name=Deathbringer Liege auto=lord(other creature[black]|myBattlefield) 1/1 auto=lord(other creature[white]|myBattlefield) 1/1 @@ -21430,6 +21780,14 @@ type=Enchantment subtype=Aura [/card] [card] +name=Defend the Hearth +auto=preventAllcombatDamage controller ueot +auto=preventAllcombatDamage opponent ueot +text=Prevent all combat damage that would be dealt to players this turn. +mana={1}{G} +type=Instant +[/card] +[card] name=Defender en-Vec auto=fading:4 text=Fading 4 (This creature enters the battlefield with four fade counters on it. At the beginning of your upkeep, remove a fade counter from it. If you can't, sacrifice it.) -- Remove a fade counter from Defender en-Vec: Prevent the next 2 damage that would be dealt to target creature or player this turn. @@ -22164,6 +22522,15 @@ mana={5}{R}{R} type=Sorcery [/card] [card] +name=Destructive Revelry +target=artifact,enchantment +auto=destroy +auto=damage:2 targetcontroller +text=Destroy target artifact or enchantment. -- Destructive Revelry does 2 damage to that permanent's controller. +mana={R}{G} +type=Instant +[/card] +[card] name=Destructive Urge target=creature auto=@combatdamaged(player) from(mytgt):ability$!name(sacrifice land) notatarget(land|mybattlefield) sacrifice!$ opponent @@ -23830,6 +24197,16 @@ power=5 toughness=5 [/card] [card] +name=Dragon Mantle +target=creature +auto=draw:1 controller +auto=teach(creature) {R}:1/0 ueot +text=Enchant creature -- When Dragon Mantle enters the battlefield, draw a card. -- Enchanted creature has "{R}: This creature gets +1/+0 until end of turn." +mana={R} +type=Enchantment +subtype=Aura +[/card] +[card] name=Dragon Mask auto={3}{T}:target(creature|mybattlefield) transforms((,newability[2/2],newability[phaseaction[endofturn sourceinplay] moveTo(ownerhand)])) ueot text={3}, {T}: Target creature you control gets +2/+2 until end of turn. Return it to its owner's hand at the beginning of the next end step. (Return it only if it's on the battlefield.) @@ -26658,6 +27035,17 @@ type=Planeswalker subtype=Elspeth [/card] [card] +name=Elspeth, Sun's Champion +auto=counter(0/0,4,loyalty) +auto={C(0/0,1,Loyalty)}:name(+1: Creature Soldier tokens) token(Soldier,Creature Soldier,1/1,white)*3 +auto={C(0/0,-3,Loyalty)}:name(-3: Destroy all power 4 or more) Destroy all(creature[power>=4]|battlefield) +auto={C(0/0,-7,Loyalty)}:name(-7: Emblem) emblem transforms((,newability[lord(creature|mybattlefield) 2/2],newability[lord(creature|mybattlefield) flying])) forever dontremove +text=+1: Put three 1/1 white Soldier creature tokens onto the battlefield. -- -3: Destroy all creature with power 4 or greater -- -7: You get an emblem with "Creatures you control get +2/+2 and have flying." -- Starting Loyalty 4 +mana={4}{W}{W} +type=Planeswalker +subtype=Elspeth +[/card] +[card] name=Elsewhere Flask auto=draw:1 auto={S}:name(plains) all(land|mybattlefield) loseabilities && all(land|mybattlefield) losesubtypesof(land) && transforms((plains)) ueot all(land|mybattlefield) @@ -27132,6 +27520,16 @@ mana={6}{R} type=Instant [/card] [card] +name=Ember Swallower +auto=this(cantargetcard(*[-monstrous]) {5}{R}{R}:becomes(monstrous) forever && counter(1/1,3) && transforms((,newAbility[sacrifice notatarget(<3>land|mybattlefield)],newAbility[ability$! sacrifice notatarget(<3>land|mybattlefield) !$ opponent])) forever +text={5}{R}{R}: Monstrosity 3. (If this creature isn't monstrous, put three +1/+1 counters on it and it becomes monstrous.) -- When Ember Swallower becomes monstrous, each player sacrifices three lands. +mana={2}{R}{R} +type=Creature +subtype=Elemental +power=4 +toughness=5 +[/card] +[card] name=Ember Weaver abilities=reach auto=aslongas(*[red]|myBattlefield) 1/0 @@ -27952,6 +28350,16 @@ type=Enchantment subtype=Aura [/card] [card] +name=Ephara's Warden +auto={T}:tap target(creature[power<=3]) +text={T}:Tap target creature with power 3 or less. +mana={3}{W} +type=Creature +subtype=Human Cleric +power=1 +toughness=2 +[/card] +[card] name=Ephemeron abilities=flying auto={discard(*|myhand)}:moveTo(myhand) @@ -29312,6 +29720,17 @@ toughness=1 color=blue [/card] [card] +name=Fabled Hero +abilities=double strike +auto=@targeted(this) from(*[instant;sorcery;enchantment]|myhand,mygraveyard):counter(1/1,1) +text=Double strike. -- Heroic - Whenever you cast a spell that targets Fabled Hero, put a +1/+1 counter on Fabled Hero. +mana={1}{W}{W} +type=Creature +subtype=Human Soldier +power=2 +toughness=2 +[/card] +[card] name=Fabricate auto=moveTo(myHand) notatarget(artifact|myLibrary) text=Search your library for an artifact card, reveal it, and put it into your hand. Then shuffle your library. @@ -29369,6 +29788,14 @@ mana={B} type=Instant [/card] [card] +name=Fade into Antiquity +target=artifact,enchantment +auto=moveto(exile) +text=Exile target Artifact or Enchantment +mana={2}{G} +type=Sorcery +[/card] +[card] name=Faerie Conclave auto=tap auto={T}:Add{U} @@ -30024,6 +30451,16 @@ mana={2}{R} type=Instant [/card] [card] +name=Fate Foretold +target=creature +auto=draw:1 controller +auto=@movedTo(mytgt|graveyard) from(battlefield):draw:1 targetcontroller +text=Enchant creature -- When Fate Foretold enters the battlefield, draw a card. -- When enchanted creature dies, its controller draws a card. +mana={1}{U} +type=Enchantment +subtype=Aura +[/card] +[card] name=Fate Unraveler auto=@drawn(opponent):damage:1 opponent text=Whenever an opponent draws a card, Fate Unraveler deals 1 damage to that player. @@ -30156,6 +30593,16 @@ mana={1}{U} type=Enchantment [/card] [card] +name=Favored Hoplite +auto=@targeted(this) from(*[instant;sorcery;enchantment]|myhand,mygraveyard):counter(1/1,1) && preventAllDamage to(this) ueot +text=Heroic - Whenever you cast a spell that targets Favored Hoplite, put a +1/+1 counter on Favored Hoplite and prevent all damage that would be dealt to it this turn. +mana={W} +type=Creature +subtype=Human Warrior +power=1 +toughness=2 +[/card] +[card] name=Fear target=creature auto=fear @@ -30309,6 +30756,14 @@ power=2 toughness=2 [/card] [card] +name=Felhide Minotaur +mana={2}{B} +type=Creature +subtype=Minotaur +power=2 +toughness=3 +[/card] +[card] name=Felhide Petrifier abilities=deathtouch auto=lord(creature[minotaur]|myBattlefield) deathtouch @@ -30459,6 +30914,16 @@ mana={1}{G} type=Instant [/card] [card] +name=Feral Invocation +abilities=flash +target=creature +auto=2/2 +text=Flash (You may cast this spell any time you could cast an instant.) -- Enchant creature. -- Enchanted creature gets +2/+2. +mana={2}{G} +type=Enchantment +subtype=Aura +[/card] +[card] name=Feral Lightning auto=token(Elemental,Creature Elemental,3/1,red,haste,unearth)*3 text=Put three 3/1 red Elemental creature tokens with haste onto the battlefield. Exile them at the beginning of the next end step. @@ -31192,6 +31657,17 @@ type=Enchantment subtype=Aura [/card] [card] +name=Firedrinker Satyr +auto=@damaged(this):damage:thatmuch controller +auto={1}{R}:1/0 ueot && damage:1 controller +text=Whenever Firedrinker Satyr is dealt damage, it deals that much damage to you. -- {1}{R}:: Firedrinker Satyr gets +1/+0 until end of turn and deals 1 damage to you. +mana={R} +type=Creature +subtype=Satyr Shaman +power=2 +toughness=1 +[/card] +[card] name=Firefist Striker auto=@combat(attacking) source(this) restriction{type(other creature[attacking]|myBattlefield)~morethan~1}:cantblock target(creature) ueot text=Battalion — Whenever Firefist Striker and at least two other creatures attack, target creature can't block this turn. @@ -31611,6 +32087,13 @@ mana={R}{R}{R} type=Sorcery [/card] [card] +name=Flamecast Wheel +auto={5}{T}{S}:damage:3 target(creature) +text={5}{T},Sacrifice Flamecast Wheel: Flamecast Wheel deals 3 damage to target creature. +mana={1} +type=Artifact +[/card] +[card] name=Flamecore Elemental auto=upcost[{2}{R}{R};next upkeep] sacrifice text=Echo {2}{R}{R} (At the beginning of your upkeep, if this came under your control since the beginning of your last upkeep, sacrifice it unless you pay its echo cost.) @@ -31892,6 +32375,16 @@ power=1 toughness=1 [/card] [card] +name=Fleecemane Lion +auto=this(cantargetcard(*[-monstrous]) {3}{G}{W}:becomes(monstrous) forever && counter(1/1,1) && transforms((,newability[opponentshroud],newability[indestructible])) forever +text={3}{G}{W}: Monstrosity 1. (If this creature isn't monstrous, put a +1/+1 counter on it and it becomes monstrous.) -- As long as Fleecemane Lion is monstrous, it has hexproof and indestructible. +mana={G}{W} +type=Creature +subtype=Cat +power=3 +toughness=3 +[/card] +[card] name=Fleetfeather Cockatrice abilities=flash,flying,deathtouch auto=this(cantargetcard(*[-monstrous]) {5}{G}{U}:becomes(monstrous) forever && counter(1/1,3) @@ -31903,6 +32396,16 @@ power=3 toughness=3 [/card] [card] +name=Fleetfeather Sandals +auto={2}:equip +auto=teach(creature) flying +auto=teach(creature) haste +text=Equipped creature has flying and haste. -- Equip {2} +mana={2} +type=Artifact +subtype=Equipment +[/card] +[card] name=Fleet-Footed Monk auto=cantbeblockedby(creature[power>=2]) text=Fleet-Footed Monk can't be blocked by creatures with power 2 or greater. @@ -32018,6 +32521,16 @@ power=2 toughness=2 [/card] [card] +name=Fleshmad Steed +auto=@movedTo(other creature|graveyard) from(battlefield):tap +text=Whenever another creature dies, tap Fleshmad Steed +mana={1}{B} +type=Creature +subtype=Horse +power=2 +toughness=2 +[/card] +[card] name=Fleshwrither auto={1}{B}{B}{S}:moveTo(myBattlefield) target(creature[manacost=4]|mylibrary) asSorcery text=Transfigure {1}{B}{B} ({1}{B}{B}, Sacrifice this creature: Search your library for a creature card with the same converted mana cost as this creature and put that card onto the battlefield. Then shuffle your library. Transfigure only as a sorcery.) @@ -35661,6 +36174,16 @@ type=Enchantment subtype=Aura [/card] [card] +name=Gift of Immortality +target=creature +auto=@movedTo(mytgt|graveyard) from(battlefield):all(this) transforms((,newability[@next end:target(creature[gift]) retarget])) oneshot +auto=@movedTo(mytgt|graveyard) from(battlefield):all(trigger[to]) moveTo(targetcontrollerbattlefield) and!( transforms((gift)) ueot)! +text=Enchant creature -- When enchanted creature dies, return that card to the battlefield under its owner's control. Return Gift of Immortality to the battlefield attached to that creature at the beginning of the next end step. +mana={2}{W} +type=Enchantment +subtype=Aura +[/card] +[card] name=Gift of Orzhova target=creature auto=1/1 @@ -35872,6 +36395,14 @@ power=1 toughness=1 [/card] [card] +name=Glare of Heresy +target=*[white] +auto=moveto(exile) +text=Exile target white permanent. +mana={1}{W} +type=Sorcery +[/card] +[card] name=Glare of Subdual auto={T(creature|mybattlefield)}:tap target(creature,artifact) text=Tap an untapped creature you control: Tap target artifact or creature. @@ -40142,6 +40673,14 @@ mana={1}{R}{R} type=Sorcery [/card] [card] +name=Hammer of Purphoros +auto=lord(creature|mybattlefield) haste +auto={2}{R}{S(land|myBattlefield)}:token(Golem,Enchantment Artifact Creature Golem,3/3) controller +text=Creatures you control have haste. --{2}{R}, {T}: Sacrifice a land: Put a 3/3 colorless Golem enchantment artifact creature token onto the battlefield. +mana={1}{R}{R} +type=Legendary Enchantment Artifact +[/card] +[card] name=Hammer of Ruin auto={2}:equip auto=2/0 @@ -41356,6 +41895,17 @@ power=2 toughness=2 [/card] [card] +name=Heliod, God of the Sun +abilities=indestructible +auto=lord(other creature|mybattlefield) vigilance +auto={2}{W}{W}:token(Cleric,Creature Enchantment Cleric,2/1,white) controller +auto=this(variable{type:manaw}>4) transforms((Creature,setpower=5,settoughness=6)) +text=Indestructible -- As long as your devotion to white is less than five, Heliod isn't a creature. (Each {W} in the mana costs of permanents you control counts toward your devotion to white.) -- Other creatures you control have vigilance. -- {2}{W}{W}: Put a 2/1 white Cleric enchantment creature token onto the battlefield. +mana={3}{W} +type=Legendary Enchantment +subtype=God +[/card] +[card] name=Helionaut abilities=flying auto={1}{T}:Add{W} @@ -41769,6 +42319,14 @@ mana={1}{B} type=Instant [/card] [card] +name=Hero's Downfall +target=creature,planeswalker +auto=destroy +text=Destroy target creature or planeswalker. +mana={1}{B}{B} +type=Instant +[/card] +[card] name=Hero's Resolve target=creature auto=1/5 @@ -42637,6 +43195,17 @@ text={T}, Pay 1 life: Add {G} or {W} to your mana pool. -- {1}, {T}, Sacrifice H type=Land [/card] [card] +name=Horizon Chimera +abilities=flash,flying,trample +auto=@drawn(controller):life:1 controller +text=Flash. -- Flying. -- Trample. -- Whenever you draw a card, you gain 1 life. +mana={2}{G}{U} +type=Creature +subtype=Chimera +power=3 +toughness=2 +[/card] +[card] name=Horizon Drake abilities=flying auto=protection from(land) @@ -43185,6 +43754,16 @@ power=1 toughness=1 [/card] [card] +name=Hunt the Hunter +target=creature[green]|mybattlefield +auto=2/2 ueot +auto=transforms((,newability[target(creature[green]|opponentbattlefield) dynamicability])) ueot +restriction=type(creature[green]|opponentbattlefield)~morethan~0 +text=Target green creature you control gets +2/+2 until end of turn. It fights target green creature an opponent controls. +mana={G} +type=Sorcery +[/card] +[card] name=Hunted Dragon abilities=flying,haste auto=token(Knight,Creature Knight,2/2,first strike,white)*3 opponent @@ -43639,6 +44218,17 @@ power=3 toughness=4 [/card] [card] +name=Hythonia the Cruel +abilities=deathtouch +auto=this(cantargetcard(*[-monstrous]) {6}{B}{B}:becomes(monstrous) forever && counter(1/1,3) && transforms((,newability[destroy all(creature[-gorgon])])) forever +text=Deathtouch -- {6}{B}{B}: Monstrosity 3. (If this creature isn't monstrous, put three +1/+1 counters on it and it becomes monstrous.) -- When Hythonia the Cruel becomes monstrous, destroy all non-Gorgon creatures. +mana={4}{B}{B} +type=Legendary Creature +subtype=Gorgon +power=4 +toughness=6 +[/card] +[card] name=Ib Halfheart, Goblin Tactician auto=@combat(blocked) source(other goblin|mybattlefield) from(creature):all(trigger[to]) sacrifice auto=@combat(blocked) source(other goblin|mybattlefield) from(creature):all(trigger[from]) damage:4 @@ -43965,6 +44555,17 @@ mana={B} type=Enchantment [/card] [card] +name=Ill-Tempered Cyclops +abilities=trample +auto=this(cantargetcard(*[-monstrous]) {5}{R}:becomes(monstrous) forever && counter(1/1,3) +text=Trample -- {5}{R}: Monstrosity 3. (If this creature isn't monstrous, put three +1/+1 counters on it and it becomes monstrous.) +mana={3}{R} +type=Creature +subtype=Cyclops +power=3 +toughness=3 +[/card] +[card] name=Illuminated Wings target=creature auto=flying @@ -44963,6 +45564,16 @@ power=2 toughness=2 [/card] [card] +name=Insatiable Harpy +abilities=flying,lifelink +text=Flying -- Lifelink. +mana={2}{B}{B} +type=Creature +subtype=Harpy +power=2 +toughness=2 +[/card] +[card] name=Insatiable Souleater auto={p(G)}:trample text=({p(G)} may be paid for with either {G} or 2 life.) -- {p(G)}: Insatiable Souleater gains trample until end of turn. @@ -48053,6 +48664,17 @@ power=6 toughness=6 [/card] [card] +name=Keepsake Gorgon +abilities=deathtouch +auto=this(cantargetcard(*[-monstrous]) {5}{B}{B}:becomes(monstrous) forever && counter(1/1,1) && transforms((,newability[destroy target(creature[-gorgon]|opponentbattlefield)])) forever +text=Deathtouch -- {5}{B}{B}: Monstrosity 1. (If this creature isn't monstrous, put a +1/+1 counters on it and it becomes monstrous.) -- When Keepsake Gorgon becomes monstrous, destroy target non-Gorgon creature an opponent controls. +mana={3}{B}{B} +type=Creature +subtype=Gorgon +power=2 +toughness=5 +[/card] +[card] name=Keiga, the Tide Star abilities=flying auto=@movedTo(this|graveyard) from(battlefield):moveTo(myBattlefield) target(creature) @@ -49673,6 +50295,17 @@ power=2 toughness=3 [/card] [card] +name=Kragma Warcaller +auto=lord(creature[minotaur]|myBattlefield) haste +auto=lord(minotaur[attacking]|myBattlefield) 2/0 ueot +text=Minotaur Creatures you control have haste. -- Whenever a Minotaur you control attacks, it gets +2/+0 until end of turn. +mana={3}{B}{R} +type=Creature +subtype=Minotaur Warrior +power=2 +toughness=3 +[/card] +[card] name=Kraul Warrior auto={5}{G}:3/3 ueot text={5}{G}: Kraul Warrior gets +3/+3 until end of turn. @@ -50320,6 +50953,16 @@ power=2 toughness=2 [/card] [card] +name=Labyrinth Champion +auto=@targeted(this) from(*[instant;sorcery;enchantment]|myhand,mygraveyard):damage:2 target(creature,player) +text=Heroic - Whenever you cast a spell that targets Labyrinth Champion, Labyrinth Champion deals 2 damage to target creature or player. +mana={3}{R} +type=Creature +subtype=Human Warrior +power=2 +toughness=2 +[/card] +[card] name=Labyrinth Minotaur auto=@combat(blocking) source(this) from(creature):all(trigger[from]) frozen text=Whenever Labyrinth Minotaur blocks a creature, that creature doesn't untap during its controller's next untap step. @@ -50435,6 +51078,16 @@ power=3 toughness=3 [/card] [card] +name=Lagonna-Band Elder +auto=aslongas(enchantment|mybattlefield) life:3 controller +text=When Lagonna-Band Elder enters the battlefield, if you control an enchantment, you gain 3 life. +mana={2}{W} +type=Creature +subtype=Centaur Advisor +power=3 +toughness=2 +[/card] +[card] name=Lagonna-Band Trailblazer auto=@targeted(this) from(*[instant;sorcery;enchantment]|myhand,mygraveyard):counter(1/1,1) text=Heroic —- Whenever you cast a spell that targets Lagonna-Band Trailblazer, put a +1/+1 counter on Lagonna-Band Trailblazer. @@ -50607,6 +51260,14 @@ mana={3}{B}{B} type=Enchantment [/card] [card] +name=Lash of the Whip +target=creature +auto=-4/-4 ueot +text=Target creature gets -4/-4 until end of turn. +mana={4}{B} +type=Instant +[/card] +[card] name=Lashknife target=creature auto=first strike @@ -51334,6 +51995,16 @@ power=2 toughness=2 [/card] [card] +name=Leonin Snarecaster +auto=may tap target(creature) +text=When Leonin Snarecaster enters the battlefield, you may tap target creature. +mana={1}{W} +type=Creature +subtype=Cat Soldier +power=2 +toughness=1 +[/card] +[card] name=Leonin Squire auto=moveTo(myhand) target(artifact[manacost<=1]|mygraveyard) text=When Leonin Squire enters the battlefield, return target artifact card with converted mana cost 1 or less from your graveyard to your hand. @@ -52008,6 +52679,14 @@ power=2 toughness=1 [/card] [card] +name=Lightning Strike +target=creature,player +auto=damage:3 +text=Lightning Strike deals 3 damage to target creature or player. +mana={1}{R} +type=Instant +[/card] +[card] name=Lightning Talons target=creature auto=3/0 @@ -55069,6 +55748,14 @@ power=3 toughness=3 [/card] [card] +name=March of the Returned +target=creature|mygraveyard +auto=moveTo(ownerhand) +text=Return up to two target creature cards from your graveyard to your hand. +mana={3}{B} +type=Sorcery +[/card] +[card] name=Marsh Boa abilities=swampwalk text=Swampwalk @@ -56497,6 +57184,16 @@ power=2 toughness=2 [/card] [card] +name=Messenger's Speed +target=creature +auto=teach(creature) trample +auto=teach(creature) haste +text=Enchant creature -- Enchanted creature has trample and haste. +mana={R} +type=Enchantment +subtype=Aura +[/card] +[card] name=Metal Fatigue auto=tap all(artifact) text=Tap all artifacts. @@ -57409,6 +58106,17 @@ power=3 toughness=4 [/card] [card] +name=Minotaur Skullcleaver +abilities=haste +auto=2/0 ueot +text=Haste. -- When Minotaur Skullcleaver enters the battlefield, it gets +2/+0 until end of turn. +mana={2}{R} +type=Creature +subtype=Minotaur Berserker +power=2 +toughness=2 +[/card] +[card] name=Minotaur Tactician abilities=haste auto=aslongas(creature[white]|myBattlefield) 1/1 @@ -61207,6 +61915,17 @@ power=1 toughness=1 [/card] [card] +name=Nessian Asp +abilities=reach +auto=this(cantargetcard(*[-monstrous]) {6}{G}:becomes(monstrous) forever && counter(1/1,4) +text=Reach -- {6}{G}: Monstrosity 4. (If this creature isn't monstrous, put four +1/+1 counters on it and it becomes monstrous.) +mana={4}{G} +type=Creature +subtype=Snake +power=4 +toughness=5 +[/card] +[card] name=Nessian Courser mana={2}{G} type=Creature @@ -63696,6 +64415,20 @@ power=2 toughness=2 [/card] [card] +name=Opaline Unicorn +auto={T}:Add{G} +auto={T}:Add{W} +auto={T}:Add{U} +auto={T}:Add{B} +auto={T}:Add{R} +text={T}: Add one mana of any color to your mana pool. +mana={3} +type=Artifact Creature +subtype=Unicorn +power=1 +toughness=2 +[/card] +[card] name=Open the Vaults auto=moveTo(myBattlefield) all(artifact,enchantment|myGraveyard) auto=moveTo(opponentBattlefield) all(artifact,enchantment|opponentGraveyard) @@ -65531,6 +66264,15 @@ mana={W} type=Sorcery [/card] [card] +name=Peak Eruption +target=mountain +auto=destroy +auto=Damage:3 targetController +text=Destroy target Mountain. Peak Eruption deals 3 damage to that land's controller. +mana={2}{R} +type=Sorcery +[/card] +[card] name=Pearl Dragon abilities=flying auto={1}{W}:0/1 @@ -66114,6 +66856,16 @@ power=4 toughness=4 [/card] [card] +name=Phalanx Leader +auto=@targeted(this) from(*[instant;sorcery;enchantment]|myhand,mygraveyard):counter(1/1,1) all(creature|mybattlefield) +text=Heroic - Whenever you cast a spell that targets Phalanx Leader, put a+1/+1 counter on each creature you control. +mana={W}{W} +type=Creature +subtype=Human Soldier +power=1 +toughness=1 +[/card] +[card] name=Phantasmal Abomination abilities=defender auto=@targeted(this):sacrifice @@ -66391,6 +67143,25 @@ power=1 toughness=1 [/card] [card] +name=Pharika's Cure +target=creature +auto=Damage:2 +auto=life:2 controller +text=Pharika's Cure deals 2 damage to target creature and you gain 2 life. +mana={B}{B} +type=Instant +[/card] +[card] +name=Pharika's Mender +auto=may moveTo(myhand) target(creature,enchantment|mygraveyard) +text=When Pharika's Mender enters the battlefield, you may return target creature or enchantment card from your graveyard to your hand. +mana={3}{B}{G} +type=Creature +subtype=Gorgon +power=4 +toughness=3 +[/card] +[card] name=Phelddagrif auto={G}:trample && token(Hippo,Creature Hippo,1/1,green) && moveTo(opponentBattlefield) all(hippo[token]|myBattlefield) auto={W}:flying && life:2 opponent @@ -66416,6 +67187,14 @@ power=4 toughness=7 [/card] [card] +name=Pheres-Band Centaur +mana={4}{G} +type=Creature +subtype=Centaur Warrior +power=3 +toughness=7 +[/card] +[card] name=Pheres-Band Raiders auto=@untapped(this):name(pay 2G for 3/3 Centaur) pay[[{2}{G}]] name(Pay 2G) token(Centaur,Enchantment Creature Centaur,3/3,green) controller text=Inspired -- Whenever Pheres-Band Raiders becomes untapped, you may pay {2}{G}. If you do, put a 3/3 green Centaur enchantment creature token onto the battlefield. @@ -67834,6 +68613,17 @@ power=11 toughness=11 [/card] [card] +name=Polis Crusher +abilities=Trample, protection from(enchantment) +auto=this(cantargetcard(*[-monstrous]) {4}{R}{G}:becomes(monstrous) forever && counter(1/1,3) && transforms((,newAbility[@combatdamaged(player) source(this[monstrous]):destroy target(enchantment|opponentbattlefield)])) forever +text=Trample, protection from enchantments -- {4}{R}{G}: Monstrosity 3. (If this creature isn't monstrous, put three +1/+1 counters on it and it becomes monstrous.) -- Whenever Polis Crusher deals combat damage to a player, if Polis Crusher is monstrous, destroy target enchantment that player controls. +mana={2}{R}{G} +type=Creature +subtype=Cyclops +power=4 +toughness=4 +[/card] +[card] name=Pollenbright Wings target=creature auto=flying @@ -68388,6 +69178,16 @@ power=2 toughness=1 [/card] [card] +name=Priest of Iroas +auto={3}{W}{S}:destroy target(enchantment) +text={3}{W}, Sacrifice Priest of Iroas: Destroy target enchantment. +mana={R} +type=Creature +subtype=Human Cleric +power=1 +toughness=1 +[/card] +[card] name=Priest of Titania auto={T}:foreach(elf) add{G} text={T}: Add {G} to your mana pool for each Elf on the battlefield. @@ -68946,6 +69746,17 @@ mana={3}{W} type=Enchantment [/card] [card] +name=Prophet of Kruphix +auto=@each opponent untap:untap all(creature,land|mybattlefield) +auto=lord(creature|myhand) flash forcedalive +text=Untap all creatures and lands you control during each other player's untap step. -- You may cast creature cards as though they had flash. +mana={3}{G}{U} +type=Creature +subtype=Human Wizard +power=2 +toughness=3 +[/card] +[card] name=Prophetic Prism auto=draw:1 auto={1}{T}:add{W} @@ -69015,6 +69826,15 @@ type=Tribal Enchantment subtype=Elf [/card] [card] +name=Prowler's Helm +auto={2}:equip +auto=teach(creature) cantBeBlockedBy(creature[-wall]) +text=Equipped creature can't be blocked except by Walls. -- Equip {2}. +mana={2} +type=Artifact +subtype=Equipment +[/card] +[card] name=Prowling Nightstalker auto=cantbeblockedby(creature[-black]) text=Prowling Nightstalker can't be blocked except by black creatures. @@ -69476,6 +70296,17 @@ mana={W} type=Instant [/card] [card] +name=Purphoros, God of the Forge +abilities=indestructible +auto=@movedto(other creature|mybattlefield):damage:2 opponent +auto={2}{R}:all(creature|mybattlefield) 1/0 ueot +auto=this(variable{type:manar}>4) transforms((Creature,setpower=6,settoughness=5)) +text=Indestructible -- As long as your devotion to red is less than five, Purphoros isn't a creature. Whenever another creature enters the battlefield under your control, Purphoros deals 2 damage to each opponent. -- {2}{R}: Creatures you control get +1/+0 until end of turn. +mana={3}{R} +type=Legendary Enchantment +subtype=God +[/card] +[card] name=Purraj of Urborg auto=@combat(attacking) source(this):first strike ueot auto=@movedto(*[black]|stack):pay({B}) counter(1/1,1) @@ -70394,6 +71225,18 @@ power=2 toughness=1 [/card] [card] +name=Rageblood Shaman +abilities=trample +auto=lord(other minotaur|mybattlefield) +1/+1 +auto=lord(other minotaur|mybattlefield) trample +text=Trample. -- Other Minotaur creatures you control get +1/+1 and have trample. +mana={1}{R}{R} +type=Creature +subtype=Minotaur Shaman +power=2 +toughness=3 +[/card] +[card] name=Ragged Veins abilities=flash target=creature @@ -71508,6 +72351,15 @@ mana={3}{U} type=Instant [/card] [card] +name=Ray of Dissolution +target=enchantment +auto=destroy +auto=life:3 controller +text=Destroy target enchantment. -- You gain 3 life. +mana={2}{W} +type=Instant +[/card] +[card] name=Ray of Distortion target=artifact,enchantment auto=destroy @@ -73194,6 +74046,16 @@ mana={2}{W}{W} type=Instant [/card] [card] +name=Returned Centaur +auto=deplete:4 target(player) +text=When Returned Centaur enters the battlefield, target player puts the top four cards of his or her library into his or her graveyard. +mana={3}{B} +type=Creature +subtype=Zombie Centaur +power=2 +toughness=4 +[/card] +[card] name=Returned Phalanx abilities=defender auto={1}{U}:canattack ueot @@ -76837,6 +77699,16 @@ power=1 toughness=1 [/card] [card] +name=Satyr Hedonist +auto={R}{S}:Add{R}{R}{R} +text={R}, Sacrifice Satyr Hedonist: Add {R}{R}{R} to your mana pool. +mana={1}{G} +type=Creature +subtype=Satyr +power=2 +toughness=1 +[/card] +[card] name=Satyr Hoplite auto=@targeted(this) from(*[instant;sorcery;enchantment]|myhand,mygraveyard):counter(1/1,1) text=Heroic —- Whenever you cast a spell that targets Satyr Hoplite, put a +1/+1 counter on Satyr Hoplite. @@ -76868,6 +77740,16 @@ power=2 toughness=1 [/card] [card] +name=Satyr Rambler +abilities=trample +text=Trample +mana={1}{R} +type=Creature +subtype=Satyr +power=2 +toughness=1 +[/card] +[card] name=Savage Beating restriction=during battle otherrestriction=during battle @@ -77431,6 +78313,16 @@ mana={1}{U}{U} type=Artifact [/card] [card] +name=Scholar of Athreos +auto={2}{B}:life:-1 opponent && life:1 controller +text={2}{B}: Each opponent loses 1 life. You gain life equal to the life lost this way. +mana={2}{W} +type=Creature +subtype=Human Cleric +power=1 +toughness=4 +[/card] +[card] name=School of Piranha auto=upcost[{1}{U}] sacrifice text=At the beginning of your upkeep, sacrifice School of Piranha unless you pay {1}{U}. @@ -77741,6 +78633,16 @@ power=3 toughness=3 [/card] [card] +name=Scourgemark +target=creature +auto=1/0 +auto=draw:1 controller +text=Enchant creature -- When Scourgemark enters the battlefield, draw a card. -- Enchanted creature gets +1/+0. +mana={1}{B} +type=Enchantment +subtype=Aura +[/card] +[card] name=Scourglass auto={T}{S}:all(*[-artifact;-land]) destroy myUpkeepOnly text={T}, Sacrifice Scourglass: Destroy all permanents except for artifacts and lands. Activate this ability only during your upkeep. @@ -78349,6 +79251,18 @@ mana={G} type=Enchantment [/card] [card] +name=Sealock Monster +abilities=cantattack +auto=aslongas(island|opponentBattlefield) -cantattack +auto=this(cantargetcard(*[-monstrous]) {5}{U}{U}:becomes(monstrous) forever && counter(1/1,3) && transforms((,newAbility[target(land|opponentbattlefield) becomes(island) forever])) forever +text=Sealock Monster can't attack unless defending player controls an Island. -- {5}{U}{U}: Monstrosity 3. (If this creature isn't monstrous, put three +1/+1 counters on it and it becomes monstrous.) -- When Sealock Monster becomes monstrous, target land becomes an Island in addition to its other types. +mana={3}{U}{U} +type=Creature +subtype=Octopus +power=5 +toughness=5 +[/card] +[card] name=Seance auto=@each my upkeep:may target(creature|mygraveyard) moveto(exile) and!(clone with(unearth) addtype(spirit))! text=At the beginning of each upkeep, you may exile target creature card from your graveyard. If you do, put a token onto the battlefield that's a copy of that card except it's a Spirit in addition to its other types. Exile it at the beginning of the next end step. @@ -78591,6 +79505,16 @@ mana={3}{W} type=Enchantment [/card] [card] +name=Sedge Scorpion +abilities=deathtouch +text=Deathtouch +mana={G} +type=Creature +subtype=Scorpion +power=1 +toughness=1 +[/card] +[card] name=Sedge Sliver auto=aslongas(swamp|myBattlefield) lord(sliver) 1/1 auto=lord(sliver) {B}:regenerate @@ -79207,6 +80131,17 @@ power=2 toughness=3 [/card] [card] +name=Sentry of the Underworld +abilities=flying,vigilance +auto={W}{B}{L}{L}{L}:regenerate +text={W}{B}, Pay 3 life: Regenerate Sentry of the Underworld. +mana={3}{W}{B} +type=Creature +subtype=Griffin Skeleton +power=3 +toughness=3 +[/card] +[card] name=Septic Rats abilities=infect auto=@combat(attacking) source(this) opponentpoisoned:1/1 ueot @@ -79638,6 +80573,27 @@ power=3 toughness=4 [/card] [card] +name=Setessan Battle Priest +auto=@targeted(this) from(*[instant;sorcery;enchantment]|myhand,mygraveyard):life:2 controller +text=Heroic - Whenever you cast a spell that targets Setessan Battle Priest, you gain 2 life. +mana={1}{W} +type=Creature +subtype=Human Cleric +power=1 +toughness=3 +[/card] +[card] +name=Setessan Griffin +abilities=flying +auto={2}{G}{G}: 2/2 ueot limit:1 +text=Flying. -- {2}{G}{G}:Setessan Griffin gets +2/+2 until end of turn. Activate this ability only once each turn. +mana={4}{W} +type=Creature +subtype=Griffin +power=3 +toughness=2 +[/card] +[card] name=Setessan Oathsworn auto=@targeted(this) from(*[instant;sorcery;enchantment]|myhand,mygraveyard):counter(1/1,2) text=Heroic -- Whenever you cast a spell that targets Setessan Oathsworn, put two +1/+1 counters on Setessan Oathsworn. @@ -80616,6 +81572,18 @@ text={T}: Add {R} to your mana pool. -- {R}, {T}: Target legendary creature gain type=Legendary Land [/card] [card] +name=Shipwreck Singer +abilities=flying +auto={1}{U}:mustattack target(creature|opponentinplay) ueot +auto={1}{B}{T}:all(creature[attacking]) -1/-1 ueot +text=Flying. -- {1}{U}: Target creature an opponent controls attacks this turn if able. -- {1}{B}{T}: Attacking creatures get -1/-1 until end of turn. +mana={U}{B} +type=Creature +subtype=Siren +power=1 +toughness=2 +[/card] +[card] name=Shisato, Whispering Hunter auto=@each my upkeep:target(snake|mybattlefield) sacrifice auto=@combatdamaged(opponent) from(this):nextphasealter(remove,untap,opponent) @@ -80926,6 +81894,14 @@ mana={1}{B} type=Instant [/card] [card] +name=Shredding Winds +target=creature[flying] +auto=damage:7 +text=Shredding Winds deals 7 damage to target creature with flying. +mana={2}{G} +type=Instant +[/card] +[card] name=Shrewd Hatchling auto={UR}:target(creature) ueot cantbeblockerof(this) auto=@movedTo(*[red]|mystack):counter(-1/-1,-1) @@ -81456,6 +82432,15 @@ mana={W} type=Instant [/card] [card] +name=Silent Artisan +text= +mana={3}{W}{W} +type=Creature +subtype=Giant +power=3 +toughness=5 +[/card] +[card] name=Silent Assassin auto={3}{B}:target(creature[blocking]) phaseaction[combatends once] destroy text={3}{B}: Destroy target blocking creature at end of combat. @@ -82043,6 +83028,15 @@ type=Enchantment subtype=Aura [/card] [card] +name=Sip of Hemlock +target=creature +auto=destroy +auto=life:-2 targetController +text=Destroy target creature. Its controller loses 2 life. +mana={4}{B}{B} +type=Sorcery +[/card] +[card] name=Sir Shandlar of Eberyn mana={4}{G}{W} type=Legendary Creature @@ -84421,6 +85415,17 @@ power=1 toughness=1 [/card] [card] +name=Soldier of the Pantheon +auto=protection from(*[multicolor]) +auto=@movedTo(*[multicolor]|opponentstack:life:1 controller +text=Protection from multicolored. -- Whenever an opponent casts a multicolored spell, you gain 1 life. +mana={W} +type=Creature +subtype=Human Soldier +power=2 +toughness=1 +[/card] +[card] name=Soldier Replica auto={1}{W}{S}:Damage:3 target(creature[attacking;blocking]) text={1}{W}, Sacrifice Soldier Replica: Soldier Replica deals 3 damage to target attacking or blocking creature. @@ -85559,6 +86564,14 @@ text=Spawning Pool enters the battlefield tapped. -- {T}: Add {B} to your mana p type=Land [/card] [card] +name=Spear of Heliod +auto=lord(creature|mybattlefield) 1/1 +auto={1}{W}{W}{T}:target(creature[controllerdamager]|battlefield) destroy +text=Creatures you control get +1/+1. -- {1}{W}{W}, {T}: Destroy target creature that dealt damage to you this turn. +mana={1}{W}{W} +type=Legendary Enchantment Artifact +[/card] +[card] name=Spearbreaker Behemoth abilities=indestructible auto={1}:indestructible target(creature[power>=5]) @@ -85824,6 +86837,18 @@ power=3 toughness=1 [/card] [card] +name=Spellheart Chimera +abilities=flying,trample +auto=type:*[instant]:mygraveyard/0 nonstatic +auto=type:*[sorcery]:mygraveyard/0 nonstatic +text=Flying. -- Trample. -- Spellheart Chimera's power is equal to the number of instant and sorcery cards in your graveyard. +mana={1}{U}{R} +type=Creature +subtype=Chimera +power=* +toughness=3 +[/card] +[card] name=Spellshock auto=@movedTo(*|mystack):damage:2 controller auto=@movedTo(*|opponentstack):damage:2 opponent @@ -87625,6 +88650,16 @@ power=3 toughness=4 [/card] [card] +name=Staunch-Hearted Warrior +auto=@targeted(this) from(*[instant;sorcery;enchantment]|myhand,mygraveyard):counter(1/1,2) +text=Heroic - Whenever you cast a spell that targets Staunch-Hearted Warrior, put two +1/+1 counters on Staunch-Hearted Warrior. +mana={3}{G} +type=Creature +subtype=Human Warrior +power=2 +toughness=2 +[/card] +[card] name=Stave Off target=creature auto=choice name(protection from white) target(creature) protection from white @@ -88394,6 +89429,16 @@ power=1 toughness=1 [/card] [card] +name=Stoneshock Giant +auto=this(cantargetcard(*[-monstrous]) {6}{R}{R}:becomes(monstrous) forever && counter(1/1,3) && transforms((,newAbility[all(creature[-flying]|opponentbattlefield) cantblock ueot)])) forever +text={6}{R}{R}: Monstrosity 3. (If this creature isn't monstrous, put three +1/+1 counters on it and it becomes monstrous.) -- When Stoneshock Giant becomes monstrous, creatures without flying your opponents control can't block this turn. +mana={3}{R}{R} +type=Creature +subtype=Giant +power=5 +toughness=4 +[/card] +[card] name=Stonewood Invoker auto={7}{G}:5/5 text={7}{G}: Stonewood Invoker gets +5/+5 until end of turn. @@ -88560,6 +89605,17 @@ power=2 toughness=2 [/card] [card] +name=Stormbreath Dragon +abilities=flying,haste,protection from white +auto=this(cantargetcard(*[-monstrous]) {5}{R}{R}:becomes(monstrous) forever && counter(1/1,3) && transforms((,newability[damage:type:*:opponenthand all(opponent)])) forever +text={5}{R}{R}: Monstrosity 3. (If this creature isn't monstrous, put three +1/+1 counters on it and it becomes monstrous.) -- When Stormbreath Dragon becomes monstrous, it deals damage to each opponent equal to the number of cards in that player's hand. +mana={3}{R}{R} +type=Creature +subtype=Dragon +power=4 +toughness=4 +[/card] +[card] name=Stormcloud Djinn abilities=flying,cloud auto={R}{R}:2/0 && damage:1 controller @@ -90135,6 +91191,15 @@ power=0 toughness=1 [/card] [card] +name=Swan Song +target=enchantment,instant,sorcery|stack +auto=fizzle +auto=token(Bird,Creature Bird,2/2,blue,flying) targetcontroller +text=Counter target enchantment, instant or sorcery spell. Its controller puts a 2/2 blue Bird creature token with flying onto the battlefield under their control. +mana={U} +type=Instant +[/card] +[card] name=Swarm of Rats auto=foreach(rat|myBattlefield) 1/0 text=Swarm of Rats's power is equal to the number of Rats you control. @@ -90483,6 +91548,21 @@ mana={5}{G} type=Instant [/card] [card] +name=Sylvan Caryatid +abilities=defender,opponentshroud +auto={T}:Add{G} +auto={T}:Add{W} +auto={T}:Add{U} +auto={T}:Add{B} +auto={T}:Add{R} +text={T}: Defender. -- Hexproof. -- Add one mana of any color to your mana pool. +mana={1}{G} +type=Creature +subtype=Plant +power=0 +toughness=3 +[/card] +[card] name=Sylvan Hierophant auto=@movedto(this|graveyard) from(battlefield):moveto(myhand) target(other creature|myGraveyard) autograveyard=@movedto(this|graveyard) from(battlefield):moveto(exile) @@ -92666,6 +93746,15 @@ power=0 toughness=5 [/card] [card] +name=Thassa's Bounty +target=player +auto=deplete:3 +auto=draw:3 controller +text=Draw three cards. Target player puts the top three cards of his or her library into his or her graveyard. +mana={5}{U} +type=Sorcery +[/card] +[card] name=Thassa's Devourer auto=deplete:2 target(player) auto=@movedTo(enchantment|myBattlefield):deplete:2 target(player) @@ -94345,6 +95434,16 @@ mana={8}{U}{U} type=Sorcery [/card] [card] +name=Time to Feed +target=creature|opponentbattlefield +auto=transforms((prey,newability[@movedto(this|graveyard) from(battlefield):life:3 opponent])) ueot +auto=target(creature|mybattlefield) transforms((,newability[target(creature[prey]|opponentbattlefield) dynamicability])) ueot +restriction=type(creature|opponentbattlefield)~morethan~0 +text=Choose target creature an opponent controls. When that creature dies this turn, you gain 3 life. Target creature you control fights that creature. (Each deals damage equal to its power to the other.) +mana={2}{G} +type=Sorcery +[/card] +[card] name=Time Walk auto=turns:+1 controller text=Take an extra turn after this one. @@ -94474,6 +95573,16 @@ mana={3} type=Artifact [/card] [card] +name=Titan of Eternal Fire +auto=lord(human|myBattlefield) {R}{T}:damage:1 target(creature,player) +text=Each Human creature you control has "{R}{T}: This creature deals 1 damage to target creature or player." +mana={5}{R} +type=Creature +subtype=Giant +power=5 +toughness=6 +[/card] +[card] name=Titania's Boon auto=lord(creature|mybattlefield) counter(1/1,1) text=Put a +1/+1 counter on each creature you control. @@ -94881,6 +95990,18 @@ toughness=4 [/card] ###The 2 cards above should stay together (Flip Card)### [card] +name=Tormented Hero +auto=tap +auto=@targeted(this) from(*[instant;sorcery;enchantment]|myhand,mygraveyard):life:-1 opponent +auto=@targeted(this) from(*[instant;sorcery;enchantment]|myhand,mygraveyard):life:1 controller +text=Tormented Hero enters the battlefield tapped. -- Heroic - Whenever you cast a spell that targets Tormented Hero, each opponent loses 1 life. You gain life equal to the life lost this way. +mana={B} +type=Creature +subtype=Human Warrior +power=2 +toughness=1 +[/card] +[card] name=Tormented Soul abilities=cantblock,unblockable text=Tormented Soul can't block and is unblockable. @@ -95746,6 +96867,15 @@ type=Enchantment subtype=Aura [/card] [card] +name=Traveling Philosopher +text= +mana={1}{W} +type=Creature +subtype=Human Advisor +power=2 +toughness=2 +[/card] +[card] name=Treacherous Pit-Dweller autograveyard=@movedTo(mybattlefield) from(this|graveyard):all(trigger[to]) all(this) moveTo(opponentbattlefield) abilities=undying @@ -96087,6 +97217,18 @@ type=Land subtype=Lair [/card] [card] +name=Triad of Fates +auto={1}{T}:counter(0/0,1,fate) target(other creature|battlefield) +auto={W}{T}:(blink) target(creature[counter{0/0.1.fate}]|battlefield) +auto={B}{T}:moveto(exile) target(creature[counter{0/0.1.fate}]|battlefield) && draw:2 targetcontroller +text={1},{T}: Put a fate counter on another target creature. -- {W},{T}: Exile target creature that has a fate counter on it, then return it to the battlefield under its owner's control. -- {B},{T}: Exile target creature that has a fate counter on it. Its controller draws two cards. +mana={2}{W}{B} +type=Legendary Creature +subtype=Human Wizard +power=3 +toughness=3 +[/card] +[card] name=Triassic Egg auto={3}{T}:counter(0/0,1,Hatchling) auto={C(0/0,-2,Hatchling)}{S}:moveTo(myBattlefield) target(creature|myhand,mygraveyard) @@ -96310,6 +97452,16 @@ power=2 toughness=4 [/card] [card] +name=Triton Fortune Hunter +auto=@targeted(this) from(*[instant;sorcery;enchantment]|myhand,mygraveyard):draw:1 controller +text=Heroic - Whenever you cast a spell that targets Triton Fortune Hunter, draw a card. +mana={2}{U} +type=Creature +subtype=Merfolk Soldier +power=2 +toughness=2 +[/card] +[card] name=Triton Shorestalker abilities=unblockable text=Triton Shorestalker can't be blocked. @@ -96320,6 +97472,25 @@ power=1 toughness=1 [/card] [card] +name=Triton Shorethief +text= +mana={U} +type=Creature +subtype=Merfolk Rogue +power=1 +toughness=2 +[/card] +[card] +name=Triton Tactics +target=creature +auto=0/3 +auto=untap +auto=transforms((,newability[@combat(blocking) source(this) from(creature):all(trigger[from]) phaseaction[combatends once] tap],newability[@combat(blocking) source(this) from(creature):all(trigger[from]) phaseaction[combatends once] frozen])) ueot +text=Up to two target creatures each get +0/+3 until end of turn. Untap those creatures. At this turn's next end of combat, tap each creature that was blocked by one of those creatures this turn and it doesn't untap during its controller's next untap step. +mana={U} +type=Instant +[/card] +[card] name=Triumph of Cruelty auto=@each my upkeep restriction{type(creature[power=power:highest:creature:myBattlefield]|myBattlefield)~equalto~type(creature[power=power:highest:creature:opponentBattlefield]|opponentBattlefield)}:transforms((,newability[name(target opponent) target(opponent) ability$!name(discard) target(*|myhand) reject!$ targetedplayer])) ueot auto=@each my upkeep restriction{type(creature[power=power:highest:creature:myBattlefield]|myBattlefield)~morethan~type(creature[power=power:highest:creature:opponentBattlefield]|opponentBattlefield)}:transforms((,newability[name(target opponent) target(opponent) ability$!name(discard) target(*|myhand) reject!$ targetedplayer])) ueot @@ -96940,6 +98111,27 @@ mana={2}{U} type=Instant [/card] [card] +name=Two-Headed Cerberus +abilities=double strike +text=Double strike. +mana={1}{R}{R} +type=Creature +subtype=Hound +power=1 +toughness=2 +[/card] +[card] +name=Tymaret, the Murder King +auto={1}{R}{S(other creature|mybattlefield)}:damage:2 target(player) +autograveyard={1}{B}{S(creature|mybattlefield)}:moveto(myhand) +text={1}{R}, Sacrifice another creature: Tymaret, the Murder King deals 2 damage to target player. -- {1}{B}, Sacrifice a creature: Return Tymaret from your graveyard to your hand. +mana={B}{R} +type=Legendary Creature +subtype=Zombie Warrior +power=2 +toughness=2 +[/card] +[card] name=Typhoid Rats abilities=deathtouch text=Deathtouch @@ -97553,6 +98745,17 @@ mana={1}{U} type=Instant [/card] [card] +name=Unknown Shores +auto={T}:Add{1} +auto={1}{T}:Add{G} +auto={1}{T}:Add{R} +auto={1}{T}:Add{B} +auto={1}{T}:Add{U} +auto={1}{T}:Add{W} +text={T}: Add {1} to your mana pool. -- {1}, {T}: Add one mana of any color to your mana pool. +type=Land +[/card] +[card] name=Unlikely Alliance auto={1}{W}:0/2 target(creature[-attacking;-blocking]) text={1}{W}: Target nonattacking, nonblocking creature gets +0/+2 until end of turn. @@ -98622,6 +99825,16 @@ type=Enchantment subtype=Aura [/card] [card] +name=Vaporkin +abilities=flying,cloud +text=Flying -- Vaporkin can block only creatures with flying. +mana={1}{U} +type=Creature +subtype=Elemental +power=2 +toughness=1 +[/card] +[card] name=Vaporous Djinn abilities=flying auto=upcost[{U}{U}] phaseout @@ -100195,6 +101408,16 @@ type=Tribal Instant subtype=Faerie [/card] [card] +name=Viper's Kiss +target=creature +auto=-1/-1 +auto=noactivatedability +text=Enchant creature -- Enchanted creature gets -1/-1, and its activated abilities can't be activated. +mana={B} +type=Enchantment +subtype=Aura +[/card] +[card] name=Viral Drake abilities=flying,infect auto={3}{U}:target(proliferation) proliferate @@ -101244,6 +102467,16 @@ mana={1} type=Artifact [/card] [card] +name=Voyaging Satyr +auto={T}:untap target(land) +text={T}: Untap target land. +mana={1}{G} +type=Creature +subtype=Satyr Druid +power=1 +toughness=2 +[/card] +[card] name=Vow of Duty target=creature auto=2/2 @@ -101330,6 +102563,16 @@ power=3 toughness=4 [/card] [card] +name=Vulpine Goliath +abilities=trample +text=Trample +mana={4}{G}{G} +type=Creature +subtype=Fox +power=6 +toughness=5 +[/card] +[card] name=Vulshok Battlegear auto={3}:equip auto=3/3 @@ -102582,6 +103825,14 @@ mana={2}{W} type=Instant [/card] [card] +name=Warrior's Lesson +target=creature|mybattlefield +auto=transforms((,newability[@combatdamaged(opponent) from(this):draw:1 controller])) ueot +text=Until end of turn, up to two target creatures you control each gain "Whenever this creature deals combat damage to a player, draw a card." +mana={G} +type=Instant +[/card] +[card] name=Warrior's Oath auto=turns:+1 controller auto=transforms((,newability[@each my upkeep:phaseaction[endofturn once] winGame opponent])) forever @@ -102812,6 +104063,16 @@ mana={4}{W} type=Sorcery [/card] [card] +name=Wavecrash Triton +auto=@targeted(this) from(*[instant;sorcery;enchantment]|myhand,mygraveyard):target(creature|opponentbattlefield) transforms((,newability[tap],newability[frozen])) oneshot +text=Heroic — Whenever you cast a spell that targets Wavecrash Triton, tap target creature an opponent controls. That creature doesn't untap during its controller's next untap step. +mana={2}{U} +type=Creature +subtype=Merfolk Wizard +power=1 +toughness=4 +[/card] +[card] name=Waves of Aggression retrace={3}{RW}{RW}{S(land|myhand)} auto=nextphasealter(add,combatphaseswithmain,controller,after) @@ -103356,6 +104617,14 @@ mana={1}{R} type=Sorcery [/card] [card] +name=Whip of Erebos +auto=lord(creature|mybattlefield) lifelink +auto={2}{B}{B}{T}:target(creature|mygraveyard) moveTo(mybattlefield) && transforms((,unearth,haste)) ueot asSorcery +text=Creatures you control have lifelink. -- {2}{B}{B},{T}:Return target creature card from your graveyard to the battlefield. It gains haste. Exile it at the beginning of the next end step. If it would leave the battlefield, exile it instead of putting it anywhere else. Activate this ability only any time you could cast a sorcery. +mana={2}{B}{B} +type=Legendary Enchantment Artifact +[/card] +[card] name=Whip Sergeant auto={R}:haste target(creature) text={R}: Target creature gains haste until end of turn. (It can attack this turn.) @@ -103710,6 +104979,16 @@ power=1 toughness=1 [/card] [card] +name=Wild Celebrants +auto=may destroy target(artifact) +text=When Wild Celebrants enters the battlefield, you may destroy target artifact. +mana={3}{R}{R} +type=Creature +subtype=Satyr +power=5 +toughness=3 +[/card] +[card] name=Wild Colos abilities=haste text=Haste @@ -104359,6 +105638,17 @@ type=Tribal Instant subtype=Shapeshifter [/card] [card] +name=Wingsteed Rider +abilities=flying +auto=@targeted(this) from(*[instant;sorcery;enchantment]|myhand,mygraveyard):counter(1/1,1) +text=Flying. -- Heroic -- Whenever you cast a spell that targets Wingsteed Rider, put a +1/+1 counter on Wingsteed Rider. +mana={1}{W}{W} +type=Creature +subtype=Human Knight +power=2 +toughness=2 +[/card] +[card] name=Winnow target=*[-land] auto=aslongas(*[share!name!]|battlefield) destroy @@ -105966,6 +107256,15 @@ type=Enchantment subtype=Aura [/card] [card] +name=Yoked Ox +text= +mana={W} +type=Creature +subtype=Ox +power=0 +toughness=4 +[/card] +[card] name=Yoked Plowbeast autohand=__CYCLING__({2}) text=Cycling {2} ({2}, Discard this card: Draw a card.) From c2be7dd02594f094e2bd38616cd9a19db2999046 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sat, 15 Aug 2015 08:07:36 +0800 Subject: [PATCH 023/249] Fix M14 card dat --- projects/mtg/bin/Res/sets/M14/_cards.dat | 48 +++++++++++++----------- 1 file changed, 27 insertions(+), 21 deletions(-) diff --git a/projects/mtg/bin/Res/sets/M14/_cards.dat b/projects/mtg/bin/Res/sets/M14/_cards.dat index c2c52c8be..eb5cd4d15 100644 --- a/projects/mtg/bin/Res/sets/M14/_cards.dat +++ b/projects/mtg/bin/Res/sets/M14/_cards.dat @@ -11,7 +11,7 @@ rarity=C [card] primitive=Accorder's Shield id=370581 -rarity=C +rarity=U [/card] [card] primitive=Accursed Spirit @@ -31,7 +31,7 @@ rarity=C [card] primitive=Air Servant id=370688 -rarity=C +rarity=U [/card] [card] primitive=Ajani, Caller of the Pride @@ -121,7 +121,7 @@ rarity=C [card] primitive=Blur Sliver id=370593 -rarity=U +rarity=C [/card] [card] primitive=Bogbrew Witch @@ -156,7 +156,7 @@ rarity=C [card] primitive=Bubbling Cauldron id=370661 -rarity=R +rarity=U [/card] [card] primitive=Burning Earth @@ -261,7 +261,7 @@ rarity=R [card] primitive=Darksteel Forge id=370734 -rarity=R +rarity=M [/card] [card] primitive=Darksteel Ingot @@ -326,7 +326,7 @@ rarity=R [card] primitive=Doom Blade id=370609 -rarity=C +rarity=U [/card] [card] primitive=Door of Destinies @@ -339,6 +339,11 @@ id=370660 rarity=U [/card] [card] +primitive=Dragon Egg Dragon +id=-370660 +rarity=T +[/card] +[card] primitive=Dragon Hatchling id=370717 rarity=C @@ -431,7 +436,7 @@ rarity=C [card] primitive=Fortify id=370712 -rarity=U +rarity=C [/card] [card] primitive=Frost Breath @@ -581,7 +586,7 @@ rarity=R [card] primitive=Kalonian Hydra id=370766 -rarity=R +rarity=M [/card] [card] primitive=Kalonian Tusker @@ -591,7 +596,7 @@ rarity=U [card] primitive=Lava Axe id=370595 -rarity= +rarity=C [/card] [card] primitive=Lay of the Land @@ -619,8 +624,8 @@ id=370740 rarity=R [/card] [card] -primitive=Zombie Token -id=-339967 +primitive=Liliana's Reaver Zombie +id=-370740 rarity=T [/card] [card] @@ -736,7 +741,7 @@ rarity=R [card] primitive=Nightwing Shade id=370705 -rarity=U +rarity=C [/card] [card] primitive=Oath of the Ancient Wood @@ -831,7 +836,7 @@ rarity=R [card] primitive=Quag Sickness id=370714 -rarity=U +rarity=C [/card] [card] primitive=Quicken @@ -846,7 +851,7 @@ rarity=C [card] primitive=Ratchet Bomb id=370623 -rarity=C +rarity=R [/card] [card] primitive=Regathan Firecat @@ -896,7 +901,7 @@ rarity=R [card] primitive=Scourge of Valkas id=370584 -rarity=R +rarity=M [/card] [card] primitive=Scroll Thief @@ -951,7 +956,7 @@ rarity=M [card] primitive=Shimmering Grotto id=370631 -rarity=C +rarity=U [/card] [card] primitive=Shivan Dragon @@ -1031,6 +1036,7 @@ rarity=U [card] primitive=Staff of the Mind Magus id=370676 +rarity=U [/card] [card] primitive=Staff of the Wild Magus @@ -1105,7 +1111,7 @@ rarity=R [card] primitive=Thunder Strike id=370607 -rarity=U +rarity=C [/card] [card] primitive=Tidebinder Mage @@ -1115,7 +1121,7 @@ rarity=R [card] primitive=Time Ebb id=370641 -rarity=R +rarity=C [/card] [card] primitive=Tome Scour @@ -1215,7 +1221,7 @@ rarity=R [card] primitive=Windreader Sphinx id=370810 -rarity=U +rarity=M [/card] [card] primitive=Windstorm @@ -1243,8 +1249,8 @@ id=370619 rarity=R [/card] [card] -primitive=Zombie Token -id=-339968 +primitive=Xathrid Necromancer Zombie +id=-370619 rarity=T [/card] [card] From f4ef7b9851635ba79e22030e8945d1bbfb6dd742 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sat, 15 Aug 2015 08:17:21 +0800 Subject: [PATCH 024/249] added M14 cards --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 969 +++++++++++++++++++ 1 file changed, 969 insertions(+) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index bbb346cc7..08e0649c2 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -497,6 +497,17 @@ power=2 toughness=3 [/card] [card] +name=Academy Raider +abilities=intimidate +auto=@combatdamaged(player) from(this):if type(*|myhand)~morethan~0 then ability$!may reject notatarget(*|myhand) and!(draw:1)! !$ controller +text=Intimidate. -- Whenever Academy Raider deals combat damage to a player, you may discard a card. If you do, draw a card. +mana={2}{R} +type=Creature +subtype=Human Warrior +power=1 +toughness=1 +[/card] +[card] name=Academy Rector auto=@movedTo(this|graveyard) from(battlefield):may all(trigger[to]) moveto(exile) && target(enchantment|mylibrary) moveTo(mybattlefield) text=When Academy Rector dies, you may exile it. If you do, search your library for an enchantment card, put that card onto the battlefield, then shuffle your library. @@ -587,6 +598,16 @@ power=2 toughness=2 [/card] [card] +name=Accursed Spirit +abilities=intimidate +text=Intimidate. +mana={3}{B} +type=Creature +subtype=Spirit +power=3 +toughness=2 +[/card] +[card] name=Acid Rain auto=destroy all(forest) text=Destroy all Forests. @@ -833,6 +854,16 @@ mana={1}{G}{G}{W} type=Instant [/card] [card] +name=Advocate of the Beast +auto=@each my endofturn:target(creature[Beast]|mybattlefield) counter(1/1,1) +text=At the beginning of your end step, put a +1/+1 counter on target Beast creature you control. +mana={2}{G} +type=Creature +subtype=Elf Shaman +power=2 +toughness=3 +[/card] +[card] name=Aegis Angel abilities=flying auto=target(other *) transforms((,indestructible)) @@ -3762,6 +3793,17 @@ power=5 toughness=5 [/card] [card] +name=Archangel of Thune +abilities=flying,lifelink +auto=@lifed(controller):all(creature|mybattlefield) counter(1/1,1) +text=Flying. -- Lifelink. -- Whenever you gain life, put a +1/+1 counter on each creature you control. +mana={3}{W}{W} +type=Creature +subtype=Angel +power=3 +toughness=4 +[/card] +[card] name=Archangel's Light auto=life:twicetype:*:mygraveyard auto=moveto(myLibrary) all(*|myGraveyard) && shuffle @@ -4588,6 +4630,15 @@ type=Enchantment subtype=Aura [/card] [card] +name=Artificer's Hex +target=equipment +auto=@each my upkeep:transforms((,newability[destroy all(parents)])) ueot +text=Enchant Equipment. -- At the beginning of your upkeep, if enchanted Equipment is attached to a creature, destroy that creature. +mana={B} +type=Enchantment +subtype=Aura +[/card] +[card] name=Artificer's Intuition auto={U}{discard(artifact|myhand)}:moveTo(myhand) target(artifact[manacost<=1]|mylibrary) text={U}, Discard an artifact card: Search your library for an artifact card with converted mana cost 1 or less, reveal that card, and put it into your hand. Then shuffle your library. @@ -5861,6 +5912,15 @@ power=2 toughness=2 [/card] [card] +name=Awaken the Ancient +target=mountain +auto=transforms((Giant Creature,setpower=7,settoughness=7,red,haste)) +text=Enchant Mountain -- {2}: Enchanted Mountain becomes a 7/7 red Giant creature with haste. It's still a land. +mana={1}{R}{R}{R} +type=Enchantment +subtype=Aura +[/card] +[card] name=Awakener Druid auto=target(forest) transforms((Treefolk Creature,setpower=4,settoughness=5,green)) text=When Awakener Druid enters the battlefield, target Forest becomes a 4/5 green Treefolk creature for as long as Awakener Druid is on the battlefield. It's still a land. @@ -6561,6 +6621,16 @@ type=Enchantment subtype=Aura [/card] [card] +name=Banisher Priest +auto=(blink)forsrc target(creature|opponentbattlefield) +text=When Banisher Priest enters the battlefield, exile target creature an opponent controls until Banisher Priest leaves the battlefield. +mana={1}{W}{W} +type=Creature +subtype=Human Cleric +power=2 +toughness=2 +[/card] +[card] name=Banishing Knack target=creature auto=teach(creature) {T}:moveto(ownerhand) target(*[-land]|battlefield) @@ -6915,6 +6985,13 @@ power=3 toughness=2 [/card] [card] +name=Barrage of Expendables +auto={R}{S(creature|myBattlefield)}:damage:1 target(creature,player) +text={R}, Sacrifice a creature: Barrage of Expendables deals 1 damage to target creature or player. +mana={R} +type=Enchantment +[/card] +[card] name=Barrage Ogre auto={T}{S(artifact|myBattlefield)}:damage:2 target(creature,player) text={T}, Sacrifice an artifact: Barrage Ogre deals 2 damage to target creature or player. @@ -7287,6 +7364,16 @@ mana={2}{W}{W} type=Sorcery [/card] [card] +name=Battle Sliver +auto=lord(sliver|mybattlefield) 2/0 +text=All Sliver creatures you control get +2/+0. +mana={4}{R} +type=Creature +subtype=Sliver +power=2 +toughness=2 +[/card] +[card] name=Battle Squadron abilities=flying auto=foreach(creature|myBattlefield) 1/1 @@ -8831,6 +8918,16 @@ type=Artifact subtype=Equipment [/card] [card] +name=Blightcaster +auto=@movedTo(enchantment|mystack):may target(creature) -2/-2 ueot +text=Whenever you cast an enchantment spell, you may have target creature get -2/-2 until end of turn. +mana={3}{B} +type=Creature +subtype=Human Wizard +power=2 +toughness=2 +[/card] +[card] name=Blighted Agent abilities=infect,unblockable text=Infect -- Blighted Agent is unblockable. @@ -9215,6 +9312,17 @@ power=0 toughness=1 [/card] [card] +name=Blood Bairn +abilities=flying +auto={S(other creature|myBattlefield)}:2/2 +text=Sacrifice another creature: Blood Bairn gets +2/+2 until end of turn. +mana={2}{B} +type=Creature +subtype=Vampire +power=2 +toughness=2 +[/card] +[card] name=Blood Baron of Vizkopa abilities=lifelink,protection from white,protection from black auto=this(opponentlife < 11) this(controllerlife >29) 6/6 @@ -9921,6 +10029,16 @@ mana={3}{G} type=Instant [/card] [card] +name=Blur Sliver +auto=lord(sliver|mybattlefield) haste +text=All Sliver creatures you control have haste. +mana={2}{R} +type=Creature +subtype=Sliver +power=2 +toughness=2 +[/card] +[card] name=Blurred Mongoose abilities=shroud,nofizzle text=Blurred Mongoose can't be countered. -- Shroud (This permanent can't be the target of spells or abilities.) @@ -10175,6 +10293,16 @@ power=3 toughness=4 [/card] [card] +name=Bogbrew Witch +auto={2}{T}:moveTo(myBattlefield) and!(tap)! target(Festering Newt,Bubbling Cauldron|mylibrary) +text={2}{T}: Search your library for a card named Festering Newt or Bubbling Cauldron, put it onto the battlefield tapped, then shuffle your library. +mana={3}{B} +type=Creature +subtype=Human Wizard +power=1 +toughness=3 +[/card] +[card] name=Boggart Arsonists abilities=plainswalk auto={2}{R}{S}:destroy target(scarecrow,plains) @@ -10513,6 +10641,16 @@ power=1 toughness=1 [/card] [card] +name=Bonescythe Sliver +auto=lord(sliver|mybattlefield) double strike +text=All Sliver creatures you control have double strike. +mana={3}{W} +type=Creature +subtype=Sliver +power=2 +toughness=2 +[/card] +[card] name=Boneshard Slasher abilities=flying auto=aslongas(*|mygraveyard) 2/2 >6 @@ -11929,6 +12067,14 @@ subtype=Beeble power=3 toughness=3 [/card] +[card] +name=Bubbling Cauldron +auto={1}{S(creature|mybattlefield)}{T}:name(sacrifice creature) life:4 controller +auto={1}{S(festering newt|mybattlefield)}{T}:name(sacrifice newt) life:-4 opponent && life:4 controller +text={1}, {T}, Sacrifice a creature: You gain 4 life. {1}, {T}, Sacrifice a creature named Festering Newt: Each opponent loses 4 life. You gain life equal to the life lost this way. +mana={2} +type=Artifact +[/card] ###The 2 cards below should stay together (Flip Card)### [card] name=Budoka Gardener @@ -12118,6 +12264,14 @@ mana={R} type=Sorcery [/card] [card] +name=Burning Earth +auto=@tappedformana(land[-basic]|opponentBattlefield):damage:1 opponent +auto=@tappedformana(land[-basic]|myBattlefield):damage:1 controller +text=Whenever a player taps a nonbasic land for mana, Burning Earth deals 1 damage to that player. +mana={3}{R} +type=Enchantment +[/card] +[card] name=Burning Fields auto=Damage:5 opponent text=Burning Fields deals 5 damage to target opponent. @@ -13880,6 +14034,14 @@ text=Celestial Colonnade enters the battlefield tapped. -- {T}: Add {W} or {U} t type=Land [/card] [card] +name=Celestial Flare +target=player +auto=ability$!name(sacrifice creature) notatarget(creature[attacking;blocking]|mybattlefield) sacrifice!$ targetedplayer +text=Target player sacrifices an attacking or blocking creature. +mana={W}{W} +type=Instant +[/card] +[card] name=Celestial Force auto=@each upkeep:life:3 controller text=At the beginning of each upkeep, you gain 3 life. @@ -14836,6 +14998,17 @@ power=3 toughness=3 [/card] [card] +name=Charging Griffin +abilities=flying +auto=@combat(attacking) source(this):1/1 ueot +text=Whenever Charging Griffin attacks, it gets +1/+1 until end of turn. +mana={3}{W} +type=Creature +subtype=Griffin +power=2 +toughness=2 +[/card] +[card] name=Charging Rhino abilities=oneblocker text=Charging Rhino can't be blocked by more than one creature. @@ -16800,6 +16973,17 @@ mana={R}{G} type=Instant [/card] [card] +name=Colossal Whale +abilities=islandwalk +auto=@combat(attacking) source(this):may (blink)forsrc target(creature|opponentbattlefield) +text=Islandwalk. -- Whenever Colossal Whale attacks, you may exile target creature defending player controls until Colossal Whale leaves the battlefield. +mana={5}{U}{U} +type=Creature +subtype=Whale +power=5 +toughness=5 +[/card] +[card] name=Colossus of Akros abilities=defender,indestructible auto=this(cantargetcard(*[-monstrous]) {10}:becomes(monstrous) forever && counter(1/1,10) && transforms((,newAbility[-defender],newability[trample])) forever @@ -17664,6 +17848,16 @@ power=3 toughness=3 [/card] [card] +name=Corpse Hauler +auto={2}{B}{S}:moveTo(ownerhand) target(other creature|mygraveyard) +text={2}{B}, Sacrifice Corpse Hauler. Return another target creature card from your graveyard to your hand. +mana={3}{B} +type=Creature +subtype=Human Rogue +power=2 +toughness=1 +[/card] +[card] name=Corpse Lunge target=creature auto=damage:storedpower @@ -19636,6 +19830,17 @@ power=5 toughness=2 [/card] [card] +name=Cyclops Tyrant +abilities=intimidate +auto=cantbeblockerof(creature[power>=2]) +text=Intimidate. -- Cyclops Tyrant can't block creatures with power 2 or less. +mana={5}{R} +type=Creature +subtype=Cyclops +power=3 +toughness=4 +[/card] +[card] name=Cylian Elf mana={1}{G} type=Creature @@ -20097,6 +20302,13 @@ type=Enchantment subtype=Aura [/card] [card] +name=Dark Prophecy +auto=@movedTo(creature|mygraveyard) from(battlefield):draw:1 controller && life:-1 +text=Whenever a creature you control dies, you draw a card and lose 1 life. +mana={B}{B}{B} +type=Enchantment +[/card] +[card] name=Dark Revenant autograveyard=moveTo(ownerlibrary) text=Flying -- When Dark Revenant dies, put it on top of its owner's library. @@ -20729,6 +20941,16 @@ power=1 toughness=1 [/card] [card] +name=Dawnstrike Paladin +abilities=vigilance,lifelink +text=Vigilance. -- Lifelink. +mana={3}{W}{W} +type=Creature +subtype=Human Knight +power=2 +toughness=4 +[/card] +[card] name=Dawntreader Elk auto={G}{S}:moveTo(myBattlefield) and!(tap)! target(basic|mylibrary) && shuffle text={G}, Sacrifice Dawntrader Elk: Search your library for a basic land card, put it onto the battlefield tapped, then shuffle your library. @@ -21288,6 +21510,16 @@ power=4 toughness=3 [/card] [card] +name=Deathgaze Cockatrice +abilities=flying,deathtouch +text=Flying. -- Deathtouch. +mana={2}{B}{B} +type=Creature +subtype=Cockatrice +power=2 +toughness=2 +[/card] +[card] name=Deathgreeter auto=@movedTo(graveyard) from(other creature|battlefield):may life:1 text=Whenever another creature dies, you may gain 1 life. @@ -22739,6 +22971,14 @@ power=2 toughness=2 [/card] [card] +name=Devout Invocation +target=creature[-tapped]|mybattlefield +auto=tap && token(Angel, Creature Angel,4/4,flying,white) +text=Tap any number of untapped creatures you control. -- Put a 4/4 white Angel creature token with flying onto the battlefield for each creature tapped this way. +mana={6}{W} +type=Sorcery +[/card] +[card] name=Devout Lightcaster abilities=protection from black auto=moveTo(exile) target(*[black]) @@ -23372,6 +23612,13 @@ mana={2}{U}{U} type=Instant [/card] [card] +name=Dismiss into Dream +auto=lord(creature|opponentbattlefield) transforms((Illusion,newability[@targeted(this):sacrifice])) +text=Enchantment. -- Each creature your opponents control is an Illusion in addition to its other types and has "When this creature becomes the target of a spell or ability, sacrifice it." +mana={6}{U} +type=Enchantment +[/card] +[card] name=Disorder auto=damage:2 all(creature[white]) auto=aslongas(creature[white]|myBattlefield) damage:2 controller @@ -24147,6 +24394,28 @@ toughness=1 color=Red,Green [/card] [card] +name=Dragon Egg +abilities=defender +auto=@movedTo(this|graveyard) from(mybattlefield):token(-370660) +text=Defender. -- When Dragon Egg dies, put a 2/2 red Dragon creature token with flying onto the battlefield. It has "{R}: This creature gets +1/+0 until end of turn". +mana={2}{R} +type=Creature +subtype=Dragon +power=0 +toughness=2 +[/card] +[card] +name=Dragon Egg Dragon +abilities=flying +auto={R}:1/0 ueot +text=Flying -- {R}: This creature gets +1/+0 until end of turn. +type=Creature +subtype=Dragon +color=red +power=2 +toughness=2 +[/card] +[card] name=Dragon Engine auto={2}:1/0 text={2}: Dragon Engine gets +1/+0 until end of turn. @@ -27338,6 +27607,16 @@ power=1 toughness=1 [/card] [card] +name=Elvish Mystic +auto={T}:Add{G} +text={T}: Add {G} to your mana pool. +mana={G} +type=Creature +subtype=Elf Druid +power=1 +toughness=1 +[/card] +[card] name=Elvish Pathcutter auto={2}{G}:forestwalk target(elf) text={2}{G}: Target Elf creature gains forestwalk until end of turn. @@ -27885,6 +28164,13 @@ mana={B} type=Sorcery [/card] [card] +name=Encroaching Wastes +auto={T}:Add{1} +auto={4}{T}{S}:destroy target(land[-basic]) +text={T}: Add {1} to your mana pool. -- {4}{T}:Sacrifice Encroaching Wastes: Destroy target nonbasic land. +type=Land +[/card] +[card] name=Encrust target=artifact,creature auto=doesnotuntap @@ -31083,6 +31369,16 @@ power=1 toughness=1 [/card] [card] +name=Festering Newt +auto=@movedto(this|graveyard) from(mybattlefield):if type(Bogbrew Witch|mybattlefield)~morethan~0 then target(creature|opponentbattlefield) -4/-4 ueot else target(creature|opponentbattlefield) -1/-1 ueot +text=When Festering Newt dies, target creature an opponent controls gets -1/-1 until end of turn. That creature gets -4/-4 instead if you control a creature named Bogbrew Witch. +mana={B} +type=Creature +subtype=Salamander +power=1 +toughness=1 +[/card] +[card] name=Festering Wound target=creature auto=@each my upkeep:may counter(0/0,1,Infection) @@ -32531,6 +32827,16 @@ power=2 toughness=2 [/card] [card] +name=Fleshpulper Giant +auto=may destroy target(creature[toughness<=2]|battlefield) +text=When Fleshpulper Giant enters the battlefield, you may destroy target creature with a toughness of 2 or less. +mana={5}{R}{R} +type=Creature +subtype=Giant +power=4 +toughness=4 +[/card] +[card] name=Fleshwrither auto={1}{B}{B}{S}:moveTo(myBattlefield) target(creature[manacost=4]|mylibrary) asSorcery text=Transfigure {1}{B}{B} ({1}{B}{B}, Sacrifice this creature: Search your library for a creature card with the same converted mana cost as this creature and put that card onto the battlefield. Then shuffle your library. Transfigure only as a sorcery.) @@ -34647,6 +34953,16 @@ power=3 toughness=3 [/card] [card] +name=Galerider Sliver +auto=lord(sliver|mybattlefield) flying +text=Sliver creatures you control have flying. +mana={U} +type=Creature +subtype=Sliver +power=1 +toughness=1 +[/card] +[card] name=Galina's Knight abilities=protection from red text=Protection from red @@ -36925,6 +37241,16 @@ mana={2}{G} type=Instant [/card] [card] +name=Gnawing Zombie +auto={S(creature|myBattlefield)}:life:-1 target(player) && life:1 controller +text={1}{B}, Sacrifice a creature: Target player loses 1 life and you gain 1 life. +mana={1}{B} +type=Creature +subtype=Zombie +power=1 +toughness=3 +[/card] +[card] name=Gobbling Ooze auto={G}{S(other creature|mybattlefield)}:counter(1/1,1) text={G}, Sacrifice another creature: Put a +1/+1 counter on Gobbling Ooze. @@ -37204,6 +37530,16 @@ power=1 toughness=1 [/card] [card] +name=Goblin Diplomats +auto={T}:all(creature|battlefield) mustattack ueot +text={T}: Each creature attacks this turn if able. +mana={1}{R} +type=Creature +subtype=Goblin +power=2 +toughness=1 +[/card] +[card] name=Goblin Dirigible abilities=doesnotuntap,flying auto={4}:untap myUpkeepOnly @@ -39402,6 +39738,13 @@ power=4 toughness=4 [/card] [card] +name=Grim Return +auto=moveTo(myBattlefield) target(creature[fresh]|graveyard) +text=Choose target creature card in a graveyard that was put there from the battlefield this turn. Put that card onto the battlefield under your control. +mana={2}{B} +type=Instant +[/card] +[card] name=Grim Roustabout auto=may counter(1/1,1) auto=this(counter{1/1.1}>=1) cantblock @@ -39778,6 +40121,16 @@ power=2 toughness=1 [/card] [card] +name=Groundshaker Sliver +auto=lord(sliver|mybattlefield) trample +text=All Sliver creatures you control have trample. +mana={6}{G} +type=Creature +subtype=Sliver +power=5 +toughness=5 +[/card] +[card] name=Groundskeeper auto={1}{G}:moveto(myhand) target(land[basic]|mygraveyard) text={1}{G}: Return target basic land card from your graveyard to your hand. @@ -40047,6 +40400,17 @@ power=1 toughness=2 [/card] [card] +name=Guardian of the Ages +abilities=defender +auto=@combat(attacking) source(creature|opponentbattlefield): transforms((,newability[-defender],newability[trample])) forever dontremove +text=Defender. -- Whenever a creature attacks you or a planeswalker you control, if Guardian of the Ages has defender, it loses defender and gains trample. +mana={7} +type=Artifact Creature +subtype=Golem +power=7 +toughness=7 +[/card] +[card] name=Guardian of the Guildpact auto=protection from(*[-multicolor]) text=Protection from monocolored @@ -41201,6 +41565,16 @@ power=2 toughness=1 [/card] [card] +name=Haunted Plate Mail +auto={4}:equip +auto=4/4 +auto={0}:all(this) loseabilities ueot && becomes(Spirit Artifact Creature,4/4) ueot restriction{type(creature|mybattlefield)~lessthan~1} +text=Equipped creature gets +4/+4. -- {0}: Until end of turn, Haunted Plate Mail becomes a 4/4 Spirit artifact creature that's no longer an Equipment. Activate this ability only if you control no creatures. +mana={4} +type=Artifact +subtype=Equipment +[/card] +[card] name=Haunting Apparition abilities=flying auto=foreach(creature[green]|opponentgraveyard) 1/0 @@ -42716,6 +43090,13 @@ mana={1}{B}{B} type=Enchantment [/card] [card] +name=Hive Stirrings +auto=token(Sliver,Artifact Creature Sliver,1/1)*2 +text=Put two 1/1 colorless Sliver creature tokens onto the battlefield. +mana={2}{W} +type=Sorcery +[/card] +[card] name=Hivestone auto=lord(creature|mybattlefield) transforms((sliver)) text=Creatures you control are Slivers in addition to their other creature types. @@ -43764,6 +44145,16 @@ mana={G} type=Sorcery [/card] [card] +name=Hunt the Weak +target=creature|mybattlefield +auto=counter(1/1,1) +auto=transforms((,newability[target(creature|opponentbattlefield) dynamicability])) ueot +restriction=type(creature|opponentbattlefield)~morethan~0 +text=Put a +1/+1 counter on target creature you control. -- Then that creature fights target creature you don't control. +mana={3}{G} +type=Sorcery +[/card] +[card] name=Hunted Dragon abilities=flying,haste auto=token(Knight,Creature Knight,2/2,first strike,white)*3 opponent @@ -44585,6 +44976,16 @@ mana={W}{W} type=Instant [/card] [card] +name=Illusionary Armor +target=creature +auto=4/4 +auto=@targeted(mytgt):sacrifice all(this) +text=Enchant creature -- Enchanted creature gets +4/+4. -- When enchanted creature becomes the target of a spell or ability, sacrifice Illusionary Armor. +mana={4}{U} +type=Enchantment +subtype=Aura +[/card] +[card] name=Illusionary Forces abilities=flying auto=cumulativeupcost[{U}] sacrifice @@ -44840,6 +45241,16 @@ mana={4}{R} type=Sorcery [/card] [card] +name=Imposing Sovereign +auto=@movedTo(creature|opponentBattlefield):all(trigger) tap +text=Creatures your opponents control enter the battlefield tapped. +mana={1}{W} +type=Creature +subtype=Human +power=2 +toughness=1 +[/card] +[card] name=Improvised Armor target=creature auto=2/5 @@ -47781,6 +48192,27 @@ power=9 toughness=9 [/card] [card] +name=Kalonian Hydra +abilities=trample +auto=counter(1/1,4) +auto=@combat(attacking) source(this):all(creature|mybattlefield) transforms((,newability[thisforeach(counter{1/1.1}) counter(1/1)*2])) +text=Trample. -- Kalonian Hydra enters the battlefield with four +1/+1 counters on it. -- Whenever Kalonian Hydra attacks, double the number of +1/+1 counters on each creature you control. +mana={3}{G}{G} +type=Creature +subtype=Hydra +power=0 +toughness=0 +[/card] +[card] +name=Kalonian Tusker +text= +mana={G}{G} +type=Creature +subtype=Beast +power=3 +toughness=3 +[/card] +[card] name=Kamahl's Desire target=creature auto=first strike @@ -52339,6 +52771,17 @@ mana={4} type=Artifact [/card] [card] +name=Lifebane Zombie +abilities=intimidate +auto=choice name(target opponent) target(opponent) donothing && all(this) transforms((,newability[if type(creature[green;white]|targetedpersonshand)~lessthan~1 then name(look) donothing notatarget(*|targetedpersonshand) else moveto(exile) notatarget(creature[green;white]|targetedpersonshand)],black)) oneshot +text=Intimidate. -- When Lifebane Zombie enters the battlefield, target opponent reveals his or her hand. You choose a green or white creature card from it and exile that card. +mana={1}{B}{B} +type=Creature +subtype=Zombie +power=3 +toughness=1 +[/card] +[card] name=Lifeblood auto=@tapped(mountain|opponentBattlefield):life:1 controller text=Whenever a Mountain an opponent controls becomes tapped, you gain 1 life. @@ -52744,6 +53187,27 @@ mana={1}{B} type=Enchantment [/card] [card] +name=Liliana's Reaver +abilities=deathtouch +auto=@combatdamaged(opponent) from(this):token(-370740) +auto=@combatdamaged(opponent) from(this):ability$!name(discard) notatarget(*|myhand) reject!$ opponent +text=Deathtouch. -- Whenever Liliana's Reaver deals combat damage to a player, that player discards a card and you put a 2/2 black Zombie creature token onto the battlefield tapped. +mana={2}{B}{B} +type=Creature +subtype=Zombie +power=4 +toughness=3 +[/card] +[card] +name=Liliana's Reaver Zombie +type=Creature +subtype=Zombie +auto=tap +power=2 +toughness=2 +color=black +[/card] +[card] name=Liliana's Shade auto=name(fetch) may moveTo(myhand) target(swamp|mylibrary) auto={B}:1/1 @@ -52930,6 +53394,15 @@ power=7 toughness=7 [/card] [card] +name=Liturgy of Blood +target=creature +auto=destroy +auto=add{B}{B}{B} +text=Destroy target creature. Add {B}{B}{B} to your mana pool. +mana={3}{B}{B} +type=Sorcery +[/card] +[card] name=Living Airship abilities=flying auto={2}{G}:regenerate @@ -55313,6 +55786,16 @@ power=1 toughness=1 [/card] [card] +name=Manaweft Sliver +auto=lord(sliver|mybattlefield) transforms((,newability[{t}:add{g}],newability[{t}:add{r}],newability[{t}:add{u}],newability[{t}:add{b}],newability[{t}:add{w}])) +text=Sliver creatures you control have "{T}: Add one mana of any color to your mana pool." +mana={1}{G} +type=Creature +subtype=Sliver +power=1 +toughness=1 +[/card] +[card] name=Mangara of Corondor auto={T}:moveTo(exile) all(this) && moveTo(exile) target(*) text={T}: Exile Mangara of Corondor and target permanent. @@ -55444,6 +55927,17 @@ power=2 toughness=2 [/card] [card] +name=Marauding Maulhorn +abilities=mustattack +auto=aslongas(Advocate of the Beast|mybattlefield)transforms((,newability[-mustattack])) +text=Maurading Maulhorn attacks each combat if able unless you control a creature named Advocate of the Beast. +mana={2}{R}{R} +type=Creature +subtype=Beast +power=5 +toughness=3 +[/card] +[card] name=Maraxus of Keld auto=foreach(artifact[-tapped]|myBattlefield) 1/1 auto=foreach(creature[-tapped]|myBattlefield) 1/1 @@ -56166,6 +56660,16 @@ power=1 toughness=4 [/card] [card] +name=Master of Diversion +auto=@combat(attacking) source(this):tap target(creature|opponentbattlefield) +text=Whenever Master of Diversionl attacks, tap target creature defending player controls. +mana={2}{W} +type=Creature +subtype=Human Scout +power=2 +toughness=2 +[/card] +[card] name=Master of Etherium auto=lord(other creature[artifact]|mybattlefield) 1/1 auto=foreach(artifact|mybattlefield) 1/1 @@ -56515,6 +57019,16 @@ mana={2}{U} type=Instant [/card] [card] +name=Megantic Sliver +auto=lord(sliver|mybattlefield) 3/3 +text=All Sliver creatures you control get +3/+3. +mana={5}{G} +type=Creature +subtype=Sliver +power=3 +toughness=3 +[/card] +[card] name=Megatherium abilities=trample auto=if compare(phandcount)~equalto~1 then transforms((,newability[pay[[{1}]] name(pay 1 mana) donothing?sacrifice])) forever @@ -57173,6 +57687,17 @@ mana={1}{U}{U} type=Enchantment [/card] [card] +name=Messenger Drake +auto=@movedTo(this|graveyard) from(battlefield):draw:1 controller +abilities=flying +text=Flying -- When Messenger Drake dies, draw a card. +mana={3}{U}{U} +type=Creature +subtype=Drake +power=3 +toughness=3 +[/card] +[card] name=Messenger Falcons abilities=flying auto=draw:1 @@ -57937,6 +58462,18 @@ power=4 toughness=3 [/card] [card] +name=Mindsparker +abilities=first strike +auto=@movedTo(instant[white;blue]|opponentStack):damage:2 opponent +auto=@movedTo(sorcery[white;blue]|opponentStack):damage:2 opponent +text=First strike. -- Whenever an opponent casts a white or blue instant or sorcery spell, Mindsparker deals 2 damage to that player. +mana={1}{R}{R} +type=Creature +subtype=Elemental +power=3 +toughness=2 +[/card] +[card] name=Mindstab auto=target(player) ability$!name(discard 3 cards) target(<3>*|myhand) reject!$ targetedplayer suspend(4)={b} @@ -58074,6 +58611,15 @@ power=1 toughness=1 [/card] [card] +name=Minotaur Abomination +text= +mana={4}{B}{B} +type=Creature +subtype=Zombie Minotaur +power=4 +toughness=6 +[/card] +[card] name=Minotaur Aggressor abilities=first strike,haste text=First strike, haste @@ -63584,6 +64130,14 @@ mana={1}{R} type=Enchantment [/card] [card] +name=Oath of the Ancient Wood +auto=may counter(1/1,1) target(creature) restriction{type(creature|battlefield)~morethan~0} +auto=@movedTo(enchantment|myBattlefield) restriction{type(creature|battlefield)~morethan~0}:may counter(1/1,1) target(creature) +text=Whenever Oath of the Ancient Wood or another enchantment enters the battlefield under your control, you may put a +1/+1 counter on target creature. +mana={2}{G} +type=Enchantment +[/card] +[card] name=Oathsworn Giant abilities=vigilance auto=lord(other creature|myBattlefield) 0/2 @@ -63920,6 +64474,17 @@ power=3 toughness=3 [/card] [card] +name=Ogre Battledriver +auto=@movedto(creature|myBattlefield):all(trigger) 2/0 ueot +auto=@movedto(creature|myBattlefield):all(trigger) haste ueot +text=Whenever another creature enters the battlefield under your control, that creature gets +2/+0 and gains haste until end of turn. +mana={2}{R}{R} +type=Creature +subtype=Ogre Warrior +power=3 +toughness=3 +[/card] +[card] name=Ogre Berserker abilities=haste text=Haste @@ -66094,6 +66659,15 @@ type=Instant subtype=Arcane [/card] [card] +name=Path of Bravery +auto=this(controllerlife > 19) lord(creature|mybattlefield) 1/1 +auto=@each my blockers:life:type:creature[attacking]|mybattlefield controller +text=Enchantment. -- As long as your life total is greater than or equal to your starting life total, creatures you control get +1/+1. -- +Whenever one or more creatures you control attack, you gain life equal to the number of attacking creatures. +mana={2}{W} +type=Enchantment +[/card] +[card] name=Path of Peace target=creature auto=destroy @@ -69030,6 +69604,16 @@ power=3 toughness=2 [/card] [card] +name=Predatory Sliver +auto=lord(sliver|mybattlefield) 1/1 +text=All Sliver creatures you control get +1/+1. +mana={1}{G} +type=Creature +subtype=Sliver +power=1 +toughness=1 +[/card] +[card] name=Predatory Urge target=creature auto=transforms((,newability[{T}:target(creature) dynamicability])) @@ -69365,6 +69949,15 @@ power=1 toughness=1 [/card] [card] +name=Primeval Bounty +auto=@movedTo(creature|mystack):token(Beast,Creature Beast,3/3,green) controller +auto=@movedTo(*[-creature]|mystack):counter(1/1,3) target(creature|mybattlefield) +auto=@movedTo(land|myBattlefield):life:3 controller +text=Enchantment. -- Whenever you cast a creature spell, put a 3/3 green Beast creature token onto the battlefield. -- Whenever you cast a noncreature spell, put three +1/+1 counters on target creature you control. -- Whenever a land enters the battlefield under your control, you gain 3 life. +mana={5}{G} +type=Enchantment +[/card] +[card] name=Primeval Force auto=aslongas(forest|mybattlefield) choice name(sacrifice forests) target(<3>forest|mybattlefield) sacrifice oneshot >2 auto=choice name(sacrifice this) sacrifice all(this) @@ -73188,6 +73781,15 @@ power=2 toughness=3 [/card] [card] +name=Regathan Firecat +text= +mana={2}{R} +type=Creature +subtype=Elemental Cat +power=4 +toughness=1 +[/card] +[card] name=Regenerate target=creature auto=regenerate @@ -74732,6 +75334,14 @@ mana={5} type=Artifact [/card] [card] +name=Ring of Three Wishes +auto=counter(0/0,3,Wish) +auto={5}{T}{C(0/0,-1,Wish)}:moveTo(myHand) notatarget(*|mylibrary) +text=Ring of Three Wishes enters the battlefield with three wish counters on it. -- {5}{T}, Remove a wish counter from Ring of Three Wishes: Search your library for a card and put that card into your hand. Then shuffle your library. +mana={5} +type=Artifact +[/card] +[card] name=Ring of Thune auto={1}:equip auto=vigilance @@ -74939,6 +75549,14 @@ power=2 toughness=1 [/card] [card] +name=Rise of the Dark Realms +auto=moveTo(myBattlefield) all(creature|mygraveyard) +auto=moveTo(myBattlefield) all(creature|opponentgraveyard) +text=Put all creature cards from all graveyards onto the battlefield under your control. +mana={7}{B}{B} +type=Sorcery +[/card] +[card] name=Rise of the Hobgoblins auto={RW}:lord(creature[white;red]|myBattlefield) first strike auto=Token(Goblin Soldier,Creature Goblin Soldier,1/1,red white)*x @@ -76194,6 +76812,15 @@ mana={2}{W} type=Enchantment [/card] [card] +name=Rumbling Baloth +text= +mana={2}{G}{G} +type=Creature +subtype=Beast +power=4 +toughness=4 +[/card] +[card] name=Rumbling Crescendo auto=@each my upkeep:may counter(0/0,1,Verse) auto=this(counter{0/0.1.Verse}=) {R}{S}:destroy target(land) @@ -78633,6 +79260,19 @@ power=3 toughness=3 [/card] [card] +name=Scourge of Valkas +abilities=flying +auto={R}:1/0 ueot +auto=damage:type:dragon:mybattlefield target(creature,player) +auto=lord(dragon[-scourge of valkas]|mybattlefield) transforms((,newability[name(damage creature) damage:type:dragon:mybattlefield target(creature)],newability[name(damage player) damage:type:dragon:mybattlefield target(player)])) +text=Flying. -- Whenever Scourge of Valkas or another Dragon enters the battlefield under your control, it deals X damage to target creature or player, where X is the number of Dragons you control. -- {R}: Scourge of Valkas gets +1/+0 until end of turn. +mana={2}{R}{R}{R} +type=Creature +subtype=Dragon +power=4 +toughness=4 +[/card] +[card] name=Scourgemark target=creature auto=1/0 @@ -79187,6 +79827,16 @@ text=Seachrome Coast enters the battlefield tapped unless you control two or few type=Land [/card] [card] +name=Seacoast Drake +abilities=flying +text=Flying. +mana={1}{U} +type=Creature +subtype=Drake +power=1 +toughness=3 +[/card] +[card] name=Seafloor Debris auto=tap auto={T}:Add{U} @@ -79760,6 +80410,13 @@ mana={2}{R}{R} type=Sorcery [/card] [card] +name=Seismic Stomp +auto=all(creature[-flying]) cantblock ueot +text=Creatures without flying can't block this turn. +mana={1}{R} +type=Sorcery +[/card] +[card] name=Seismic Strike target=creature auto=damage:type:mountain:mybattlefield @@ -80111,6 +80768,16 @@ type=Enchantment subtype=Aura [/card] [card] +name=Sentinel Sliver +auto=lord(sliver|mybattlefield) vigilance +text=All Sliver creatures you control have vigilance. +mana={1}{W} +type=Creature +subtype=Sliver +power=2 +toughness=2 +[/card] +[card] name=Sentinel Spider abilities=vigilance,reach text=Vigilance (Attacking doesn't cause this creature to tap.) -- Reach (This creature can block creatures with flying.) @@ -80174,6 +80841,17 @@ power=2 toughness=4 [/card] [card] +name=Seraph of the Sword +abilities=flying +auto=preventAllCombatDamage to(this) +text=Flying. -- Prevent all combat damage that would be dealt to Seraph of the Sword. +mana={3}{W} +type=Creature +subtype=Angel +power=3 +toughness=3 +[/card] +[card] name=Seraph Sanctuary auto=life:1 controller auto=@movedTo(angel|mybattlefield):life:1 controller @@ -80848,6 +81526,28 @@ text={1}, {T}: Add {B}{R} to your mana pool. type=Land [/card] [card] +name=Shadowborn Apostle +auto={B}{S(Shadowborn Apostle|myBattlefield)}{S(Shadowborn Apostle|myBattlefield)}{S(Shadowborn Apostle|myBattlefield)}{S(Shadowborn Apostle|myBattlefield)}{S(Shadowborn Apostle|myBattlefield)}{S(Shadowborn Apostle|myBattlefield)}:moveTo(mybattlefield) target(creature[Demon]|mylibrary) +text= A deck can have any number of cards named Shadowborn Apostle. -- {B}, Sacrifice six creatures named Shadowborn Apostle: Search your library for a Demon creature card and put it onto the battlefield. Then shuffle your library. +mana={B} +type=Creature +subtype=Human Cleric +power=1 +toughness=1 +[/card] +[card] +name=Shadowborn Demon +abilities=flying +auto=destroy target(creature[-demon]) +auto=@each myupkeep:if type(creature|mygraveyard)~lessthan~6 then sacrifice +text=Flying -- When Shadowborn Demon enters the battlefield, destroy target non-demon creature. -- At the beginning of your upkeep, if there are fewer than six creature cards in your graveyard, sacrifice a creature. +mana={3}{B}{B} +type=Creature +subtype=Demon +power=5 +toughness=6 +[/card] +[card] name=Shadowfeed target=*|graveyard auto=moveto(exile) @@ -84727,6 +85427,15 @@ power=1 toughness=1 [/card] [card] +name=Sliver Construct +text= +mana={3} +type=Artifact Creature +subtype=Sliver Construct +power=2 +toughness=2 +[/card] +[card] name=Sliver Legion auto=lord(sliver) foreach(other sliver|battlefield) 1/1 text=All Sliver creatures get +1/+1 for each other Sliver on the battlefield. @@ -86271,6 +86980,16 @@ power=* toughness=* [/card] [card] +name=Soulmender +auto={T}:life:1 controller +text={T}: You gain 1 life. +mana={W} +type=Creature +subtype=Human Cleric +power=1 +toughness=1 +[/card] +[card] name=Soulquake auto=moveto(ownerhand) all(creature|battlefield) auto=moveto(ownerhand) all(creature|graveyard) @@ -87957,6 +88676,16 @@ power=1 toughness=5 [/card] [card] +name=Sporemound +auto=@movedTo(land|myBattlefield):token(Saproling,Creature Saproling, 1/1,green) +text=Whenever a land enters the battlefield under your control, put a 1/1 green Saproling creature token onto the battlefield. +mana={3}{G}{G} +type=Creature +subtype=Fungus +power=3 +toughness=3 +[/card] +[card] name=Sporesower Thallid text=At the beginning of your upkeep, put a spore counter on each Fungus you control. -- Remove three spore counters from Sporesower Thallid: Put a 1/1 green Saproling creature token onto the battlefield. mana={2}{G}{G} @@ -88303,6 +89032,46 @@ mana={6} type=Artifact [/card] [card] +name=Staff of the Death Magus +auto=@movedTo(*[black]|mystack):life:1 controller +auto=@movedTo(swamp|mybattlefield):life:1 controller +text=Whenever you cast a black spell or a swamp enters the battlefield under your control, you gain 1 life. +mana={3} +type=Artifact +[/card] +[card] +name=Staff of the Flame Magus +auto=@movedTo(*[red]|mystack):life:1 controller +auto=@movedTo(mountain|mybattlefield):life:1 controller +text=Whenever you cast a red spell or a mountain enters the battlefield under your control, you gain 1 life. +mana={3} +type=Artifact +[/card] +[card] +name=Staff of the Mind Magus +auto=@movedTo(*[blue]|mystack):life:1 controller +auto=@movedTo(island|mybattlefield):life:1 controller +text=Whenever you cast a blue spell or an island enters the battlefield under your control, you gain 1 life. +mana={3} +type=Artifact +[/card] +[card] +name=Staff of the Sun Magus +auto=@movedTo(*[white]|mystack):life:1 controller +auto=@movedTo(plains|mybattlefield):life:1 controller +text=Whenever you cast a white spell or a plains enters the battlefield under your control, you gain 1 life. +mana={3} +type=Artifact +[/card] +[card] +name=Staff of the Wild Magus +auto=@movedTo(*[green]|mystack):life:1 controller +auto=@movedTo(forest|mybattlefield):life:1 controller +text=Whenever you cast a green spell or a forest enters the battlefield under your control, you gain 1 life. +mana={3} +type=Artifact +[/card] +[card] name=Staff of Zegon auto={3}{T}:-2/0 target(creature) text={3}, {T}: Target creature gets -2/-0 until end of turn. @@ -88882,6 +89651,16 @@ power=4 toughness=5 [/card] [card] +name=Steelform Sliver +auto=lord(sliver|mybattlefield) 0/1 +text=All Sliver creatures you control get +0/+1. +mana={2}{W} +type=Creature +subtype=Sliver +power=2 +toughness=2 +[/card] +[card] name=Steeling Stance auto=lord(creature|mybattlefield) 1/1 ueot autohand={W}:1/1 target(creature) limit:1 myUpkeepOnly @@ -89404,6 +90183,16 @@ power=4 toughness=4 [/card] [card] +name=Stonehorn Chanter +auto={5}{W}:vigilance ueot && lifelink ueot +text={5}{W}:Stonehorn Chanter gains vigilance and lifelink until end of turn. +mana={5}{W} +type=Creature +subtype=Rhino Cleric +power=4 +toughness=4 +[/card] +[card] name=Stonehorn Dignitary auto=nextphasealter(remove,combatbegins,opponent) auto=nextphasealter(remove,combatattackers,opponent) @@ -89946,6 +90735,16 @@ type=Artifact subtype=Equipment [/card] [card] +name=Striking Sliver +auto=lord(sliver|mybattlefield) first strike +text=All Sliver creatures you control have first strike. +mana={R} +type=Creature +subtype=Sliver +power=1 +toughness=1 +[/card] +[card] name=Strip Mine auto={T}:Add{1} auto={T}{S}:destroy target(land) @@ -91814,6 +92613,16 @@ mana={3}{B} type=Sorcery [/card] [card] +name=Syphon Sliver +auto=lord(sliver|mybattlefield) lifelink +text=All Sliver creatures you control have lifelink. +mana={2}{B} +type=Creature +subtype=Sliver +power=2 +toughness=2 +[/card] +[card] name=Syphon Soul auto=damage:2 opponent auto=life:2 controller @@ -93201,6 +94010,16 @@ power=5 toughness=5 [/card] [card] +name=Tenacious Dead +autograveyard=@movedto(this|mygraveyard) from(mybattlefield):all(trigger) transforms((,newability[name(Pay 1B) pay[[{1}{B}]] name(pay 1B mana) moveto(ownerbattlefield} && tap?name(cancel) donothing])) oneshot +text=When Tenacious Dead dies, you may pay {1}{B}. If you do, return it to the battlefield tapped under its owner's control. +mana={B} +type=Creature +subtype=Skeleton Warrior +power=1 +toughness=1 +[/card] +[card] name=Tendo Ice Bridge auto=counter(0/0,1,Charge) auto={T}:add{1} @@ -94179,6 +94998,16 @@ type=Tribal Artifact subtype=Shaman Equipment [/card] [card] +name=Thorncaster Sliver +auto=lord(sliver|mybattlefield) transforms((,newability[@combat(attacking) source(this):damage:1 target(creature,player)])) +text=Sliver creatures you control have "Whenever this creature attacks, it deals 1 damage to target creature or player." +mana={4}{R} +type=Creature +subtype=Sliver +power=2 +toughness=2 +[/card] +[card] name=Thornling auto={G}:haste auto={G}:trample @@ -95147,6 +95976,16 @@ mana={2}{U} type=Instant [/card] [card] +name=Tidebinder Mage +auto=target(creature[red;green]|opponentbattlefield) transforms((,doesnotuntap,newability[tap])) +text=When Tidebinder Mage enters the battlefield, tap target red or green creature an opponent controls. That creature doesn't untap during its controller's untap step for as long as you control Tidebinder Mage. +mana={U}{U} +type=Creature +subtype=Merfolk Wizard +power=2 +toughness=2 +[/card] +[card] name=Tideforce Elemental auto={U}{T}:tap target(other creature) auto={U}{T}:untap target(other creature) @@ -96566,6 +97405,17 @@ power=2 toughness=2 [/card] [card] +name=Trained Condor +abilities=flying +auto=@combat(attacking) source(this):flying target(other creature|myBattlefield) ueot +text=Flying. -- Whenever Trained Condor attacks, another target creature you control gains flying until end of turn. +mana={2}{U} +type=Creature +subtype=Bird +power=2 +toughness=1 +[/card] +[card] name=Trained Jackal mana={G} type=Creature @@ -98489,6 +99339,15 @@ power=3 toughness=1 [/card] [card] +name=Undead Minotaur +text= +mana={2}{B} +type=Creature +subtype=Zombie Minotaur +power=2 +toughness=3 +[/card] +[card] name=Undead Slayer auto={W}{T}:moveTo(Exile) target(Skeleton,Vampire,Zombie) text={W}, {T}: Exile target Skeleton, Vampire, or Zombie. @@ -99662,6 +100521,16 @@ power=2 toughness=2 [/card] [card] +name=Vampire Warlord +auto={S(other creature|myBattlefield)}:regenerate +text= Sacrifice another creature: Regenerate Vampire Warlord. +mana={4}{B} +type=Creature +subtype=Vampire Warrior +power=4 +toughness=2 +[/card] +[card] name=Vampire's Bite target=creature kicker={2}{B} @@ -99904,6 +100773,17 @@ power=5 toughness=6 [/card] [card] +name=Vastwood Hydra +auto=counter(1/1,X) +auto=@movedTo(this|mygraveyard) from(myBattlefield):may thisforeach(counter{1/1.1}) ability$!name(give counter) notatarget(creature|mybattlefield) counter(1/1)!$ controller +text=Vastwood Hydra enters the battlefield with X +1/+1 counters on it. -- When Vastwood Hydra dies, you may distribute a number of +1/+1 counters equal to the number of +1/+1 counters on Vastwood Hydra among any number of creatures you control. +mana={X}{G}{G} +type=Creature +subtype=Hydra +power=0 +toughness=0 +[/card] +[card] name=Vastwood Zendikon target=land auto=becomes(Creature Elemental,6/4,green) @@ -100792,6 +101672,13 @@ power=3 toughness=3 [/card] [card] +name=Vial of Poison +auto={1}{S}:target(creature) deathtouch ueot +text={1}, Sacrifice Vial of Poison: Target creature gains deathtouch until end of turn. +mana={1} +type=Artifact +[/card] +[card] name=Viashino Bey auto=aslongas(viashino bey[attacking]|myBattlefield) lord(creature|myBattlefield) mustattack text=If Viashino Bey attacks, all creatures you control attack if able. @@ -103667,6 +104554,17 @@ power=2 toughness=2 [/card] [card] +name=Warden of Evos Isle +abilities=flying +auto=lord(creature[flying]|myhand) altercost(colorless, -1) +text=Flying. -- Creature spells with flying you cast cost 1 less to cast. +mana={2}{U} +type=Creature +subtype=Bird Wizard +power=2 +toughness=2 +[/card] +[card] name=Warden of the Wall auto=tap auto={T}:Add{1} @@ -105407,6 +106305,17 @@ power=6 toughness=6 [/card] [card] +name=Windreader Sphinx +abilities=flying +auto=@each blockers:foreach(creature[attacking;flying]|battlefield) draw:1 controller +text=Flying. -- Whenever a creature with flying attacks, you may draw a card. +mana={5}{U}{U} +type=Creature +subtype=Sphinx +power=3 +toughness=7 +[/card] +[card] name=Windreaper Falcon abilities=flying,protection from blue text=Flying, protection from blue @@ -105874,6 +106783,17 @@ mana={4} type=Artifact [/card] [card] +name=Witchstalker +abilities=opponentshroud +auto=@movedto(*[blue;black]|opponentstack) restriction{myturnonly}: counter(1/1,1) all(this) +text=Hexproof. -- Whenever an opponent casts a blue or black spell during your turn, put a +1/+1 counter on Witchstalker. +mana={1}{G}{G} +type=Creature +subtype=Wolf +power=3 +toughness=3 +[/card] +[card] name=Witch-Maw Nephilim auto=@movedTo(*|mystack):may counter(1/1,2) auto=lord(witch-maw nephilim[attacking;power>=10]) trample @@ -106222,6 +107142,17 @@ power=6 toughness=6 [/card] [card] +name=Woodborn Behemoth +auto=aslongas(land|mybattlefield) 4/4 >7 +auto=aslongas(land|mybattlefield) trample >7 +text=As long as you control eight or more lands, Woodborn Behemoth gets +4/+4 and has trample. +mana={3}{G}{G} +type=Creature +subtype=Elemental +power=4 +toughness=4 +[/card] +[card] name=Wooden Stake auto=1/0 auto=@combat(blocking,blocked) source(mytgt) from(vampire):all(trigger[from]) bury @@ -106931,6 +107862,26 @@ power=3 toughness=6 [/card] [card] +name=Xathrid Necromancer +autograveyard=@movedTo(this|graveyard) from(mybattlefield):token(-370619) controller +auto=@movedTo(other human|graveyard) from(mybattlefield):token(-370619) controller +text=Whenever Xathrid Necromancer or another Human creature you control dies, put a 2/2 black Zombie creature token onto the battlefield tapped. +mana={2}{B} +type=Creature +subtype=Human Wizard +power=2 +toughness=2 +[/card] +[card] +name=Xathrid Necromancer Zombie +type=Creature +subtype=Zombie +auto=tap +power=2 +toughness=2 +color=black +[/card] +[card] name=Xenagos, God of Revels abilities=indestructible auto=@each my combatbegins:name(haste and +x/+x) target(other creature|mybattlefield) transforms((,newability[haste],newability[power/power])) ueot @@ -107305,6 +108256,17 @@ power=2 toughness=2 [/card] [card] +name=Young Pyromancer +auto=@movedTo(instant|mystack):token(Elemental,Creature Elemental, 1/1,red) controller +auto=@movedTo(sorcery|mystack):token(Elemental,Creature Elemental, 1/1,red) controller +text=Whenever you cast an instant or sorcery spell, put a 1/1 red Elemental creature token onto the battlefield. +mana={1}{R} +type=Creature +subtype=Human Shaman +power=2 +toughness=1 +[/card] +[card] name=Young Wei Recruits abilities=cantblock text=Young Wei Recruits can't block. @@ -107515,6 +108477,13 @@ type=Enchantment subtype=Aura [/card] [card] +name=Zephyr Charge +auto={1}{U}:flying target(creature) ueot +text=Enchantment. -- {1}{U}: Target creature gains flying until end of turn. +mana={1}{U} +type=Enchantment +[/card] +[card] name=Zephyr Falcon abilities=flying,vigilance text=Flying, vigilance From 94a97a3032852fb3305c36c1a755fa279d313908 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sat, 15 Aug 2015 08:18:35 +0800 Subject: [PATCH 025/249] give credits thanks KF1 and Tacoghandi --- projects/mtg/src/GameStateOptions.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/projects/mtg/src/GameStateOptions.cpp b/projects/mtg/src/GameStateOptions.cpp index 16decd052..5817744fe 100644 --- a/projects/mtg/src/GameStateOptions.cpp +++ b/projects/mtg/src/GameStateOptions.cpp @@ -236,8 +236,8 @@ void GameStateOptions::Render() "Nakano, Niegen, Kaioshin, Psyringe, r1c47, Superhiro,", "Szei, Thanatos02, Whismer, Wololo", "", - "Thanks also go to Dr.Watson, Orine, Raphael, Sakya, Tyranid", - "for their help.", + "Thanks also go to Dr.Watson, KF1, Orine, Raphael, Sakya,", + "Tacoghandi, Tyranid for their help.", "", "Thanks to everyone who contributes code/content on the forums!", "", From 9cf6e621abeab60159d06ed1e71090c71230f046 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sat, 15 Aug 2015 14:51:26 +0800 Subject: [PATCH 026/249] Removes viewing of tokens (rarity with T) on Spoiler --- projects/mtg/include/WFilter.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/mtg/include/WFilter.h b/projects/mtg/include/WFilter.h index 16d30c59d..2ea305be5 100644 --- a/projects/mtg/include/WFilter.h +++ b/projects/mtg/include/WFilter.h @@ -234,7 +234,7 @@ public: WCFilterSet(string arg); bool isMatch(MTGCard *c) { - return (setid == MTGSets::ALL_SETS || c->setId == setid); + return (setid == MTGSets::ALL_SETS || c->setId == setid) && (c->getRarity() != 'T'); //removes viewing of card tokens. tokens will not display on spoiler and should not affect gameplay :) } ; string getCode(); From ccdd16bbc77edccb24ec868bd606bbd758d9e388 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sat, 15 Aug 2015 19:13:48 +0800 Subject: [PATCH 027/249] Used proper constant --- projects/mtg/include/WFilter.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/mtg/include/WFilter.h b/projects/mtg/include/WFilter.h index 2ea305be5..0a246925b 100644 --- a/projects/mtg/include/WFilter.h +++ b/projects/mtg/include/WFilter.h @@ -234,7 +234,7 @@ public: WCFilterSet(string arg); bool isMatch(MTGCard *c) { - return (setid == MTGSets::ALL_SETS || c->setId == setid) && (c->getRarity() != 'T'); //removes viewing of card tokens. tokens will not display on spoiler and should not affect gameplay :) + return (setid == MTGSets::ALL_SETS || c->setId == setid) && (c->getRarity() != Constants::RARITY_T); //removes viewing of card tokens. tokens will not display on spoiler and should not affect gameplay :) } ; string getCode(); From 4a721a7e187c11e7720d30d2fd9438577a7e2314 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sat, 15 Aug 2015 23:41:31 +0800 Subject: [PATCH 028/249] added KTK cards --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 1922 +++++++++++++++++- 1 file changed, 1883 insertions(+), 39 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 08e0649c2..c86547215 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -321,6 +321,19 @@ power=2 toughness=6 [/card] [card] +name=Abomination of Gudul +abilities=flying +facedown={3} +autofacedown={2}{B}{G}{U}:morph +auto=@combatdamaged(player) from(this):may name(draw & discard) ability$!draw:1 _ choice notatarget(*|myhand) reject)!$ controller +text=Flying. -- Whenever Abomination of Gudul deals combat damage to a player, you may draw a card. If you do, discard a card. -- Morph {2}{B}{G}{U}: (You may cast this card face down as a 2/2 creature for 3. Turn it face up any time for its morph cost.) +mana={3}{B}{G}{U} +type=Creature +subtype=Horror +power=3 +toughness=4 +[/card] +[card] name=Aboroth auto=cumulativeupcost[{C(-1/-1.1}] sacrifice text=Cumulative upkeep - Put a -1/-1 counter on Aboroth. (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) @@ -497,6 +510,68 @@ power=2 toughness=3 [/card] [card] +name=Abzan Ascendancy +auto=all(creature|mybattlefield) counter(1/1,1) +auto=@movedto(creature[-token]|graveyard) from(mybattlefield):token(Spirit,Creature Spirit,1/1,white flying) controller +text=When Abzan Ascendancy enters the battlefield, put a +1/+1 counter on each creature you control. -- Whenever a nontoken creature you control dies, put a 1/1 white Spirit creature token with flying onto the battlefield. +mana={W}{B}{G} +type=Enchantment +[/card] +[card] +name=Abzan Banner +auto={T}: Add{W} +auto={T}: Add{B} +auto={T}: Add{G} +auto={W}{B}{G}{T}{S}:draw:1 controller +text={T}: Add {W},{B} or {G} to your mana pool. -- {W}{B}{G}, {T}, Sacrifice Abzan Banner: Draw a card. +mana={3} +type=Artifact +[/card] +[card] +name=Abzan Battle Priest +auto={W}{T}:counter(1/1,1) asSorcery +auto=lord(creature[counter{1/1.1}]|mybattlefield) lifelink +text=Outlast {W} ({W},{T}: Put a +1/+1 counter on this creature. Outlast only as a sorcery.) -- Each creature you control with a +1/+1 counter on it has first strike. +mana={3}{W} +type=Creature +subtype=Human Cleric +power=3 +toughness=2 +[/card] +[card] +name=Abzan Charm +auto=choice name(Exile power 3 or more) moveTo(exile) target(creature[power>=3]|battlefield) +auto=choice name(Draw 2 cards lose 2 life) draw:2 controller && life:-2 controller +auto=choice name(2 counters on 1 creature) counter(1/1,2) target(creature) +auto=if type(creature|battlefield)~morethan~1 then choice name(1 counter on 2 creatures) counter(1/1,1) target(<2>creature) +text=Choose one: -- Exile target creature with power 3 or greater. -- You draw two cards and you lose 2 life. -- Distribute two +1/+1 counters among one or two target creatures. +mana={W}{B}{G} +type=Instant +[/card] +[card] +name=Abzan Falconer +auto={W}{T}:counter(1/1,1) asSorcery +auto=lord(creature[counter{1/1.1}]|myBattlefield) flying +text=Outlast {W} ({W}, {T}: Put a +1/+1 counter on this creature. Outlast only as a sorcery.) -- Each creature you control with a +1/+1 counter on it has flying. +mana={2}{W} +type=Creature +subtype=Human Soldier +power=2 +toughness=3 +[/card] +[card] +name=Abzan Guide +abilities=lifelink +facedown={3} +autofacedown={2}{W}{B}{G}:morph +text=Lifelink (Damage dealt by this creature also causes you to gain that much life.) -- Morph {2}{W}{B}{G} (You may cast this card face down as a 2/2 creature for 3. Turn it face up any time for its morph cost.) +mana={3}{W}{B}{G} +type=Creature +subtype=Human Warrior +power=4 +toughness=4 +[/card] +[card] name=Academy Raider abilities=intimidate auto=@combatdamaged(player) from(this):if type(*|myhand)~morethan~0 then ability$!may reject notatarget(*|myhand) and!(draw:1)! !$ controller @@ -1184,6 +1259,29 @@ power=3 toughness=3 [/card] [card] +name=Ainok Bond-Kin +auto={1}{W}{T}:counter(1/1,1) asSorcery +auto=lord(creature[counter{1/1.1}]|mybattlefield) first strike +text=Outlast {1}{W} ({1}{W}, {T}: Put a +1/+1 counter on this creature. Outlast only as a sorcery.) -- Each creature you control with a +1/+1 counter on it has first strike. +mana={1}{W} +type=Creature +subtype=Hound Soldier +power=2 +toughness=1 +[/card] +[card] +name=Ainok Tracker +abilities=first strike +facedown={3} +autofacedown={4}{R}:morph +text=First strike -- Morph {4}{R} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) +mana={5}{R} +type=Creature +subtype=Hound Scout +power=3 +toughness=3 +[/card] +[card] name=Air Bladder target=creature auto=flying @@ -1637,6 +1735,16 @@ power=4 toughness=4 [/card] [card] +name=Alabaster Kirin +abilities=flying,vigilance +text=Flying, vigilance +mana={3}{W} +type=Creature +subtype=Kirin +power=2 +toughness=3 +[/card] +[card] name=Alabaster Leech auto=lord(*[white]|myhand) altercost(white, +1) text=White spells you cast cost {W} more to cast. @@ -2035,6 +2143,15 @@ power=6 toughness=5 [/card] [card] +name=Alpine Grizzly +text= +mana={2}{G} +type=Creature +subtype=Bear +power=4 +toughness=2 +[/card] +[card] name=Altar Golem abilities=trample,doesnotuntap auto=foreach(creature|battlefield) 1/1 @@ -2069,6 +2186,13 @@ mana={7} type=Artifact [/card] [card] +name=Altar of the Brood +auto=@movedTo(other *|myBattlefield):deplete:1 opponent +text=Whenever another permanent enters the battlefield under your control, each opponent puts the top card of his or her library into his or her graveyard. +mana={1} +type=Artifact +[/card] +[card] name=Altar's Light target=artifact,enchantment auto=moveTo(exile) @@ -2362,6 +2486,17 @@ power=3 toughness=3 [/card] [card] +name=Anafenza, the Foremost +auto=@combat(attacking) source(this):counter(1/1,1) target(other creature[tapped]|mybattlefield) +auto=@movedTo(creature|opponentGraveyard):all(trigger[to]) moveTo(exile) +text=When Anafenza, the Foremost attacks, put a +1/+1 counter on another target tapped creature you control. -- If a creature card would be put into an opponent's graveyard from anywhere, exile it instead. +mana={W}{B}{G} +type=Legendary Creature +subtype=Human Soldier +power=4 +toughness=4 +[/card] +[card] name=Anarchist auto=may moveTo(myhand) target(sorcery|mygraveyard) text=When Anarchist enters the battlefield, you may return target sorcery card from your graveyard to your hand. @@ -3019,6 +3154,17 @@ mana={2} type=Artifact [/card] [card] +name=Ankle Shanker +abilities=haste +auto=@combat(attacking) source(this):all(creature|mybattlefield) transforms((newability[first strike ueot],newability[deathtouch ueot])) ueot +text=Haste -- Whenever Ankle Shanker attacks, creatures you control gain first strike and deathtouch until end of turn. +mana={2}{R}{W}{B} +type=Creature +subtype=Goblin Berserker +power=2 +toughness=2 +[/card] +[card] name=Annex target=Land alias=1194 @@ -3824,6 +3970,17 @@ power=6 toughness=6 [/card] [card] +name=Archers' Parapet +abilities=defender +auto={1}{B}{T}:life:-1 opponent +text=Defender -- {1}{B}, {T}: Each opponent loses 1 life. +mana={1}{G} +type=Creature +subtype=Wall +power=0 +toughness=5 +[/card] +[card] name=Archery Training target=creature auto=@each my upkeep:may counter(0/0,1,Archery) all(this) @@ -4290,6 +4447,17 @@ mana={6} type=Artifact [/card] [card] +name=Armament Corps +auto=choice name(one creature) counter(1/1,2) target(creature|mybattlefield) +auto=if type(creature|mybattlefield)~morethan~1 then choice name(2 creatures) counter(1/1.1) target(<2>creature|mybattlefield) +text=When Armament Corps enters the battlefield, distribute two +1/+1 counters among one or two target creatures you control. +mana={2}{W}{B}{G} +type=Creature +subtype=Human Soldier +power=4 +toughness=4 +[/card] +[card] name=Armament Master auto=this(gear=1) lord(other creature[kor]|myBattlefield) 2/2 auto=this(gear=2) lord(other creature[kor]|myBattlefield) 4/4 @@ -5921,6 +6089,15 @@ type=Enchantment subtype=Aura [/card] [card] +name=Awaken the Bear +target=creature +auto=trample ueot +auto=3/3 ueot +text=Target creature gets +3/+3 and gains trample until end of turn. +mana={2}{G} +type=Instant +[/card] +[card] name=Awakener Druid auto=target(forest) transforms((Treefolk Creature,setpower=4,settoughness=5,green)) text=When Awakener Druid enters the battlefield, target Forest becomes a 4/5 green Treefolk creature for as long as Awakener Druid is on the battlefield. It's still a land. @@ -6985,6 +7162,14 @@ power=3 toughness=2 [/card] [card] +name=Barrage of Boulders +auto=damage:1 all(creature|opponentbattlefield) +auto=if type(creature[power>=4]|mybattlefield)~morethan~0 then all(creature|battlefield) transforms((newability[cantblock ueot])) ueot +text=Barrage of Boulders deals 1 damage to each creature you don't control. -- Ferocious If you control a creature with power 4 or greater, creatures can't block this turn. +mana={2}{R} +type=Sorcery +[/card] +[card] name=Barrage of Expendables auto={R}{S(creature|myBattlefield)}:damage:1 target(creature,player) text={R}, Sacrifice a creature: Barrage of Expendables deals 1 damage to target creature or player. @@ -7650,6 +7835,16 @@ power=2 toughness=2 [/card] [card] +name=Bear's Companion +auto=token(Bear,Creature Bear, 4/4,green) +text=When Bear's Companion enters the battlefield, put a 4/4 green Bear creature token onto the battlefield. +mana={2}{G}{U}{R} +type=Creature +subtype=Human Warrior +power=2 +toughness=2 +[/card] +[card] name=Bearer of the Heavens autograveyard=@movedto(this|graveyard) from(battlefield):phaseaction[endofturn once] destroy all(*|battlefield) text=When Bearer of the Heavens dies, destroy all permanents at the beginning of the next end step. @@ -7868,6 +8063,16 @@ power=3 toughness=3 [/card] [card] +name=Bellowing Saddlebrute +auto=ifnot thisturn(creature[attacking]|mybattlefield)~morethan~0 then life:-4 controller +text=Raid — When Bellowing Saddlebrute enters the battlefield, you lose 4 life unless you attacked with a creature this turn. +mana={3}{B} +type=Creature +subtype=Orc Warrior +power=4 +toughness=5 +[/card] +[card] name=Bellowing Tanglewurm abilities=intimidate auto=lord(other creature[green]|myBattlefield) intimidate @@ -9117,6 +9322,14 @@ power=1 toughness=3 [/card] [card] +name=Blinding Spray +auto=all(creature|opponentbattlefield) -4/0 ueot +auto=draw:1 controller +text=Creatures your opponents control get -4/-0 until end of turn. -- Draw a card. +mana={4}{U} +type=Instant +[/card] +[card] name=Blinking Spirit auto={0}:moveto(ownerhand) text={0}: Return Blinking Spirit to its owner's hand. @@ -9603,6 +9816,15 @@ mana={X}{B} type=Sorcery [/card] [card] +name=Bloodfell Caves +auto=tap +auto=life:1 +auto={T}:Add{B} +auto={T}:Add{R} +text=Bloodfell Caves enters the battlefield tapped. -- When Bloodfell Caves enters the battlefield, you gain 1 life. -- {T}: Add {B} or {R} to your mana pool. +type=Land +[/card] +[card] name=Bloodfire Colossus auto={R}{S}:damage:6 all(creature,player) text={R}, Sacrifice Bloodfire Colossus: Bloodfire Colossus deals 6 damage to each creature and each player. @@ -9623,6 +9845,16 @@ power=1 toughness=1 [/card] [card] +name=Bloodfire Expert +auto=@movedTo(*[-creature]|mystack):1/1 ueot +text=Prowess (Whenever you cast a noncreature spell, this creature gets +1/+1 until end of turn.) +mana={2}{R} +type=Creature +subtype=Efreet Monk +power=3 +toughness=1 +[/card] +[card] name=Bloodfire Infusion target=creature|mybattlefield auto=teach(creature) {R}{S}:all(creature) damage:storedpower @@ -9642,6 +9874,16 @@ power=2 toughness=2 [/card] [card] +name=Bloodfire Mentor +auto={2}{U}{T}:draw:1 && transforms((,newability[target(*|myhand) reject])) forever +text={2}{U}{T}: Draw a card, then discard a card. +mana={2}{R} +type=Creature +subtype=Efreet Shaman +power=0 +toughness=5 +[/card] +[card] name=Bloodflow Connoisseur auto={S(creature|myBattlefield)}:counter(1/1,1) text=Sacrifice a creature: Put a +1/+1 counter on Bloodflow Connoisseur. @@ -9827,6 +10069,17 @@ power=3 toughness=3 [/card] [card] +name=Bloodsoaked Champion +abilities=cantblock +autograveyard={1}{B}:moveTo(mybattlefield) restriction{thisturn(creature[attacking]|mybattlefield)~morethan~0} +text=Bloodsoaked Champion can't block. -- Raid — {1}{B}: Return Bloodsoaked Champion from your graveyard to the battlefield. Activate this ability only if you attacked with a creature this turn. +mana={B} +type=Creature +subtype=Human Warrior +power=2 +toughness=1 +[/card] +[card] name=Bloodscale Prowler auto=bloodthirst:1 text=Bloodthirst 1 (If an opponent was dealt damage this turn, this creature enters the battlefield with a +1/+1 counter on it.) @@ -9954,6 +10207,15 @@ power=1 toughness=1 [/card] [card] +name=Blossoming Sands +auto=tap +auto=life:1 +auto={T}:Add{G} +auto={T}:Add{W} +text=Blossoming Sands enters the battlefield tapped. -- When Blossoming Sands enters the battlefield, you gain 1 life. -- {T}: Add {G} or {W} to your mana pool. +type=Land +[/card] +[card] name=Blossoming Wreath auto=life:type:creature:mygraveyard controller text=You gain life equal to the number of creature cards in your graveyard. @@ -11612,6 +11874,14 @@ power=3 toughness=3 [/card] [card] +name=Briber's Purse +auto=counter(0/0,X,gem) +auto={1}{T}{C(0/0,-1,gem)}:target(creature) transforms((,newability[cantattack ueot],newability[cantblock ueot])) ueot +text=Briber's Purse enters the battlefield with X gem counters on it. -- 1, Tap, Remove a gem counter from Briber's Purse: Target creature can't attack or block this turn. +mana={X} +type=Artifact +[/card] +[card] name=Bribery target=creature|opponentLibrary auto=moveTo(myBattlefield) @@ -11752,6 +12022,14 @@ power=1 toughness=1 [/card] [card] +name=Bring Low +target=creature|battlefield +auto=if cantargetcard(creature[counter{1/1.1}]) then damage:5 else damage:3 +text=Bring Low deals 3 damage to target creature. -- If that creature has a +1/+1 counter on it, Bring Low deals 5 damage to it instead. +mana={3}{R} +type=Instant +[/card] +[card] name=Bringer of the Black Dawn other={W}{U}{B}{R}{G} name(Spend WUBRG to Cast) auto=@each my upkeep:may name(search for a card) life:-2 controller && moveTo(library) target(*|mylibrary) @@ -12236,6 +12514,14 @@ mana={G} type=Enchantment [/card] [card] +name=Burn Away +auto=target(creature|battlefield) damage:6 +auto=@movedTo(mytgt|graveyard) from(battlefield):all(trigger[to]) moveTo(exile) all(*|ownergraveyard) +text=Burn Away deals 6 damage to target creature. When that creature dies this turn, exile all cards from its controller's graveyard +mana={4}{R} +type=Instant +[/card] +[card] name=Burn the Impure target=creature auto=damage:3 @@ -12505,6 +12791,19 @@ power=5 toughness=4 [/card] [card] +name=Butcher of the Horde +abilities=flying +auto={S(other creature|mybattlefield)}:name(vigilance) vigilance ueot +auto={S(other creature|mybattlefield)}:name(lifelink) lifelink ueot +auto={S(other creature|mybattlefield)}:name(haste) haste ueot +text=Flying. -- Sacrifice another creature: Butcher of the Horde gains your choice of Vigilance, lifelink, or haste until end of turn. +mana={1}{R}{W}{B} +type=Creature +subtype=Demon +power=5 +toughness=4 +[/card] +[card] name=Butcher's Cleaver auto={3}:equip auto=3/0 @@ -13074,6 +13373,17 @@ power=1 toughness=2 [/card] [card] +name=Canyon Lurkers +facedown={3} +autofacedown={3}{R}:morph +text=Morph {3}{R} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) +mana={4}{R} +type=Creature +subtype=Human Rogue +power=5 +toughness=2 +[/card] +[card] name=Canyon Minotaur mana={3}{R} type=Creature @@ -15131,6 +15441,26 @@ mana={G} type=Sorcery [/card] [card] +name=Chief of the Edge +auto=lord(other warrior|myBattlefield) 1/0 +text=Other Warrior creatures you control get +1/+0. +mana={W}{B} +type=Creature +subtype=Human Warrior +power=3 +toughness=2 +[/card] +[card] +name=Chief of the Scale +auto=lord(other warrior|myBattlefield) 0/1 +text=Other Warrior creatures you control get +0/+1. +mana={W}{B} +type=Creature +subtype=Human Warrior +power=2 +toughness=3 +[/card] +[card] name=Chieftain en-Dal auto=@combat(attacking) source(this):all(creature[attacking]) first strike ueot text=Whenever Chieftain en-Dal attacks, attacking creatures gain first strike until end of turn. @@ -16036,6 +16366,16 @@ power=1 toughness=1 [/card] [card] +name=Clever Impersonator +auto=may copy NotATarget(*[-land]) +text=You may have Clever Impersonator enter the battlefield as a copy of any nonland permanent on the battlefield. +mana={2}{U}{U} +type=Creature +subtype=Shapeshifter +power=0 +toughness=0 +[/card] +[card] name=Clickslither abilities=haste auto={S(goblin|myBattlefield)}:2/2 && trample @@ -18311,6 +18651,13 @@ power=4 toughness=4 [/card] [card] +name=Cranial Archive +auto={2}{E}:name(shuffle graveyard) target(player) donothing && moveto(ownerlibrary) and!(shuffle)! all(*|targetedpersonsgraveyard) +text={2}, Exile Cranial Archive: Target player shuffles his or her graveyard into his or her library. +mana={2} +type=Artifact +[/card] +[card] name=Cranial Plating auto=foreach(artifact|mybattlefield) 1/0 auto={B}{B}:name(attach) retarget target(creature|mybattlefield) @@ -18383,6 +18730,15 @@ power=6 toughness=6 [/card] [card] +name=Crater's Claws +target=creature,player +auto=if type(creature[power=>4]|mybattlefield) then damage:2 +auto=damage:X +text=Crater's Claws deals X damage to target creature or player. -- Ferocious — Crater's Claws deals X plus 2 damage to that creature or player instead if you control a creature with power 4 or greater. +mana={R}{X} +type=Sorcery +[/card] +[card] name=Craterhoof Behemoth abilities=haste auto=all(creature|mybattlefield) type:creature:mybattlefield/type:creature:mybattlefield && trample all(creature|mybattlefield) @@ -21028,6 +21384,17 @@ mana={1}{U} type=Instant [/card] [card] +name=Dazzling Ramparts +abilities=defender +auto={1}{W}{T}:tap target(creature) +text=Defender -- {1}{W}, {T}: Tap target creature. +mana={4}{W} +type=Creature +subtype=Wall +power=0 +toughness=7 +[/card] +[card] name=Dead Reveler auto=may counter(1/1,1) auto=this(counter{1/1.1}>=1) cantblock @@ -21303,6 +21670,14 @@ type=Instant subtype=Arcane [/card] [card] +name=Death Frenzy +auto=emblem transforms((,newability[@movedto(creature|graveyard) from(battlefield):life:1 controller])) ueot +auto=all(creature) -2/-2 ueot +text=All creatures get -2/-2 until end of turn. Whenever a creature dies this turn, you gain 1 life. +mana={3}{B}{G} +type=Sorcery +[/card] +[card] name=Death Grasp target=creature,player auto=damage:X @@ -21625,6 +22000,15 @@ power=1 toughness=1 [/card] [card] +name=Debilitating Injury +target=creature +auto=-2/-2 +text=Enchant creature (Target a creature as you cast this. This card enters the battlefield attached to that creature.) -- Enchanted creature gets -2/-2. +mana={1}{B} +type=Enchantment +subtype=Aura +[/card] +[card] name=Debt to the Deathless auto=@lifeloss(opponent):life:thatmuch controller auto=life:-twiceX opponent @@ -22117,6 +22501,15 @@ mana={1}{W} type=Instant [/card] [card] +name=Defiant Strike +target=creature +auto=1/0 ueot +auto=draw:1 controller +text=Target creature gets +1/+0 until end of turn. -- Draw a card. +mana={W} +type=Instant +[/card] +[card] name=Defiant Vanguard auto=@combat(blocking) source(this):all(trigger[to]) phaseaction[combatends once] destroy auto=@combat(blocking) source(this) from(creature):all(trigger[from]) phaseaction[combatends once] destroy @@ -23494,6 +23887,14 @@ power=2 toughness=2 [/card] [card] +name=Disdainful Stroke +target=*[manacost>=4]|stack +auto=fizzle +text=Counter target spell with converted mana cost 4 or greater. +mana={1}{U} +type=Instant +[/card] +[card] name=Disease Carriers auto=@movedTo(this|graveyard) from(battlefield):-2/-2 target(creature) text=When Disease Carriers dies, target creature gets -2/-2 until end of turn. @@ -23575,6 +23976,15 @@ mana={X}{R} type=Sorcery [/card] [card] +name=Dismal Backwater +auto=tap +auto=life:1 +auto={T}:Add{U} +auto={T}:Add{B} +text=Dismal Backwater enters the battlefield tapped. -- When Dismal Backwater enters the battlefield, you gain 1 life. -- {T}: Add {U} or {B} to your mana pool. +type=Land +[/card] +[card] name=Dismal Failure target=*|stack auto=fizzle @@ -23636,6 +24046,16 @@ mana={3}{U} type=Instant [/card] [card] +name=Disowned Ancestor +auto={1}{B}{T}:counter(1/1,1) asSorcery +text=Outlast {1}{B}, {T}: Put a +1/+1 counter on this creature. Outlast only as a sorcery.) +mana={B} +type=Creature +subtype=Spirit Warrior +power=0 +toughness=4 +[/card] +[card] name=Dispatch target=creature auto=tap @@ -23736,6 +24156,14 @@ power=1 toughness=1 [/card] [card] +name=Dissipate +target=*|stack +auto=fizzleto(exile) +text=Counter target spell. If that spell is countered this way, exile it instead of putting it into its owner's graveyard. +mana={1}{U}{U} +type=Instant +[/card] +[card] name=Distant Melody auto=chooseatype foreach(*[chosentype]|mybattlefield) draw:1 controller chooseend text=Choose a creature type. Draw a card for each permanent you control of that type. @@ -24444,6 +24872,17 @@ mana={1}{R} type=Sorcery [/card] [card] +name=Dragon Grip +target=creature +autohand={2}{R}: activate castcard(normal) restriction{type(creature[power>=4]|mybattlefield)~morethan~0} +auto=2/0 +auto=first strike +text=Ferocious. -- If you control a creature with power 4 or greater, you may cast Dragon Grip as though it had flash. (You may cast it any time you could cast an instant.) (WORKAROUND USES HAND ABILITY CODE) -- Enchant creature. -- Enchanted creature gets +2/+0 and has first strike. +mana={2}{R} +type=Enchantment +subtype=Aura +[/card] +[card] name=Dragon Hatchling auto={R}:1/0 abilities=flying @@ -24569,6 +25008,17 @@ power=3 toughness=2 [/card] [card] +name=Dragon-Style Twins +abilities=double strike +auto=@movedTo(*[-creature]|mystack):1/1 ueot +text=Prowess (Whenever you cast a noncreature spell, this creature gets +1/+1 until end of turn.) -- Whenever Jeskai Elder deals combat damage to a player, you may draw a card. If you do, discard a card. +mana={3}{R}{R} +type=Creature +subtype=Human Monk +power=3 +toughness=3 +[/card] +[card] name=Dragon's Claw auto=@movedTo(*[red]|stack):may life:1 controller text=Whenever a player casts a red spell, you may gain 1 life. @@ -24606,6 +25056,15 @@ power=1 toughness=1 [/card] [card] +name=Dragonscale Boon +target=creature +auto=counter(1/1,2) +auto=untap +text=Put two +1/+1 counters on target creature and untap it. +mana={3}{G} +type=Instant +[/card] +[card] name=Dragonskull Summit auto=tap auto=aslongas(mountain,swamp|myBattlefield) untap @@ -25799,6 +26258,14 @@ power=2 toughness=1 [/card] [card] +name=Duneblast +auto=choice name(Save a creature) notatarget(creature) transforms((,newability[destroy all(other creature)])) +auto=choice name(destroy all creatures) destroy all(creature) +text=Choose up to one creature. Destroy the rest. +mana={4}{W}{B}{G} +type=Sorcery +[/card] +[card] name=Dune-Brood Nephilim auto=@combatdamaged(player) from(this):foreach(land|myBattlefield) token(Sand,creature sand,1/1) text=Whenever Dune-Brood Nephilim deals combat damage to a player, put a 1/1 colorless Sand creature token onto the battlefield for each land you control. @@ -26039,6 +26506,14 @@ mana={1}{W}{W} type=Sorcery [/card] [card] +name=Dutiful Return +target=creature|mygraveyard +auto=moveTo(ownerhand) +text=Return up to two target creature cards from your graveyard to your hand. +mana={3}{B} +type=Sorcery +[/card] +[card] name=Dutiful Thrull auto={B}:regenerate text={B}: Regenerate Dutiful Thrull. @@ -26781,6 +27256,20 @@ type=Sorcery subtype=Arcane [/card] [card] +name=Efreet Weaponmaster +abilities=first strike +auto=target(other creature|mybattlefield) 3/0 ueot +facedown={3} +autofacedown={2}{U}{R}{W}:morph +autofaceup=target(other creature|mybattlefield) 3/0 +text=Morph {2}{U}{R}{W} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -- When Efreet Weaponmaster enters the battlefield or is turned face up, another target creature you control gets +3/+0 until end of turn. +mana={3}{U}{R}{W} +type=Creature +subtype=Efreet Monk +power=4 +toughness=3 +[/card] +[card] name=Ego Erasure abilities=changeling target=player @@ -27894,6 +28383,16 @@ type=Enchantment subtype=Aura [/card] [card] +name=Embodiment of Spring +auto={1}{G}{T}{S}:moveTo(myBattlefield) and!(tap)! target(basic|mylibrary) +text={1}{G}{T}:Sacrifice Embodiment of Spring: Search your library for a basic land card, put it onto the battlefield tapped, then shuffle your library. +mana={U} +type=Creature +subtype=Elemental +power=0 +toughness=3 +[/card] +[card] name=Emerald Charm auto=aslongas(*|battlefield) choice untap target(*) auto=aslongas(enchantment[-aura]|battlefield) choice destroy target(enchantment[-aura]) @@ -28181,6 +28680,14 @@ type=Enchantment subtype=Aura [/card] [card] +name=End Hostilities +auto=destroy all(creature) +auto=all(creature) transforms((,newability[destroy all(children)])) ueot +text=Destroy all creatures and all permanents attached to creatures +mana={3}{W}{W} +type=Sorcery +[/card] +[card] name=Endangered Armodon auto=aslongas(creature[toughness<=2]|myBattlefield) sacrifice text=When you control a creature with toughness 2 or less, sacrifice Endangered Armodon. @@ -30965,6 +31472,15 @@ mana={3}{B} type=Instant [/card] [card] +name=Feat of Resistance +target=creature|mybattlefield +auto=counter(1/1) +auto=activatechooseacolor protection from(*[chosencolor]) ueot activatechooseend +text=Put a +1/+1 counter on target creature you control. It gains protection from the color of your choice until end of turn. +mana={1}{W} +type=Instant +[/card] +[card] name=Fecundity auto=@movedTo(creature|mygraveyard) from(battlefield):may draw:1 controller auto=@movedTo(creature|opponentgraveyard) from(battlefield):draw:1 opponent @@ -30983,6 +31499,13 @@ type=Enchantment subtype=Aura [/card] [card] +name=Feed the Clan +auto=if type(creature[power>=4]|mybattlefield)~morethan~0 then life:10 controller else life:5 controller +text=You gain 5 life. -- Ferocious - You gain 10 life instead if you control a creature with power 4 or greater. +mana={1}{G} +type=Instant +[/card] +[card] name=Feedback target=enchantment auto=@each targetController upkeep:damage:1 targetcontroller @@ -31995,29 +32518,14 @@ power=1 toughness=1 [/card] [card] -name=Remand -target=*|stack -auto=fizzleto(hand) -auto=draw:1 controller -text=Counter target spell. If that spell is countered this way, put it into its owner's hand instead of into that player's graveyard. -- Draw a card. -mana={1}{U} -type=Instant -[/card] -[card] -name=Memory Lapse -target=*|stack -auto=fizzleto(librarytop) -text=Counter target spell. If that spell is countered this way, put it on top of its owner's library instead of into that player's graveyard. -mana={1}{U} -type=Instant -[/card] -[card] -name=Dissipate -target=*|stack -auto=fizzleto(exile) -text=Counter target spell. If that spell is countered this way, exile it instead of putting it into its owner's graveyard. -mana={1}{U}{U} -type=Instant +name=Firehoof Calvary +auto={3}{R}:transforms((,newability[2/0],newability[trample])) ueot +text={3}{R}: Firehoof Cavalry gets +2/+0 and gains trample until end of turn. +mana={W} +type=Creature +subtype=Human Berserker +power=1 +toughness=1 [/card] [card] name=Firemane Angel @@ -33336,6 +33844,15 @@ mana={4} type=Artifact [/card] [card] +name=Flying Crane Technique +auto=untap all(creature|myBattlefield) +auto=all(creature|mybattlefield) double strike ueot +auto=all(creature|mybattlefield) flying ueot +text=Untap all creatures you control. -- Creatures you control gain flying and double strike until end of turn. +mana={3}{U}{R}{W} +type=Instant +[/card] +[card] name=Flying Men abilities=flying text=Flying @@ -33605,6 +34122,15 @@ text=Forbidding Watchtower enters the battlefield tapped. -- {T}: Add {W} to you type=Land [/card] [card] +name=Force Away +target=creature +auto=moveTo(ownerhand) +auto=if type(creature[power>=4]|mybattlefield)~morethan~0 then may draw:1 controller && ability$!reject notatarget(*|myhand)!$ controller +text=Return target creature to its owner's hand. Ferocious - If you control a creature with power 4 or greater, you may draw a card. If you do, discard a card. +mana={1}{U} +type=Instant +[/card] +[card] name=Force of Nature abilities=trample auto=upcost[{G}{G}{G}{G}] damage:8 controller @@ -34299,6 +34825,15 @@ power=1 toughness=1 [/card] [card] +name=Frontier Bivouac +auto=tap +auto={T}:Add{G} +auto={T}:Add{U} +auto={T}:Add{R} +text=Frontier Bivouac enters the battlefield tapped. -- {T}: Add {G}, {U}, or {R} to your mana pool. +type=Land +[/card] +[card] name=Frontier Guide auto={3}{G}{T}:moveTo(myBattlefield) and!(tap)! target(land[basic]|myLibrary) text={3}{G}, {T}: Search your library for a basic land card and put it onto the battlefield tapped. Then shuffle your library. @@ -36661,6 +37196,17 @@ text=Glacial Fortress enters the battlefield tapped unless you control a Plains type=Land [/card] [card] +name=Glacial Stalker +facedown={3} +autofacedown={4}{U}:morph +text=Morph {2}{W} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) +mana={5}{U} +type=Creature +subtype=Elemental +power=4 +toughness=5 +[/card] +[card] name=Glacial Wall abilities=defender text=Defender (This creature can't attack.) @@ -38254,6 +38800,13 @@ power=1 toughness=1 [/card] [card] +name=Goblinslide +auto=@movedTo(*[-creature]|mystack):pay({1}) token(Goblin,Creature Goblin,1/1, haste, red) +text=Enchantment. -- Whenever you cast a noncreature spell, you may pay {1}. If you do, put a 1/1 red Goblin creature token with haste onto the battlefield. +mana={2}{R} +type=Enchantment +[/card] +[card] name=God-Favored General auto=@untapped(this):name(pay 2W for 2 1/1 Soldiers) pay[[{2}{W}]] name(Pay 2W) token(Soldier,Enchantment Creature Soldier,1/1,white)*2 controller text=Inspired -- Whenever God-Favored General becomes untapped, you may pay {2}{W}. If you do, put two 1/1 white Soldier enchantment creature tokens onto the battlefield. @@ -39699,6 +40252,18 @@ power=1 toughness=4 [/card] [card] +name=Grim Haruspex +facedown={3} +autofacedown={B}:morph +auto=@movedTo(other creature[-token]|graveyard) from(mybattlefield):draw:1 controller +text=Morph {B} (You may cast this card face down as a 2/2 creature for 3. Turn it face up any time for its morph cost.) -- Whenever another nontoken creature you control dies, draw a card. +mana={2}{B} +type=Creature +subtype=Human Wizard +power=3 +toughness=2 +[/card] +[card] name=Grim Harvest target=creature|mygraveyard auto=moveto(ownerhand) @@ -40561,6 +41126,16 @@ power=2 toughness=2 [/card] [card] +name=Gurmag Swiftwing +abilities=flying,first strike,haste +text=Flying, first strike, haste +mana={1}{B} +type=Creature +subtype=Bat +power=1 +toughness=2 +[/card] +[card] name=Gurzigost auto=@each my upkeep restriction{type(*|mygraveyard)~morethan~1}:transforms((,newability[choice name(put at bottom of library) target(<2>*|mygraveyard) bottomoflibrary],newability[choice sacrifice])) ueot auto=@each my upkeep restriction{type(*|mygraveyard)~lessthan~2}:sacrifice @@ -42075,6 +42650,15 @@ power=3 toughness=4 [/card] [card] +name=Heart-Piercer Bow +auto={1}:equip +auto=@combat(attacking) source(mytgt) :damage:1 target(creature|opponentbattlefield) +text=Whenever equipped creature attacks, Heart-Piercer Bow deals 1 damage to target creature defending player controls. +mana={2} +type=Artifact +subtype=Equipment +[/card] +[card] name=Heat Ray target=creature auto=damage:X @@ -42258,6 +42842,17 @@ mana={3}{U}{U} type=Enchantment [/card] [card] +name=Heir of the Wilds +abilities=deathtouch +auto=@combat(attacking) source(this) restriction{type(creature[power>=4]|myBattlefield)~morethan~0}:1/1 ueot +text=Deathtouch. -- Ferocious - Whenever Heir of the Wilds attacks, if you control a creature with power 4 or greater, Heir of the Wilds gets +1/+1 until end of turn. +mana={1}{G} +type=Creature +subtype=Human Warrior +power=2 +toughness=2 +[/card] +[card] name=Heirs of Stromkirk abilities=intimidate auto=@combatdamaged(player) from(this):counter(1/1,1) @@ -42592,6 +43187,16 @@ text={T}: Add {1} to your mana pool. -- {2}, {T}: Add one mana of any color to y type=Land [/card] [card] +name=Herald of Anafenza +auto={2}{W}{T}:token(Warrior,Creature Warrior,1/1,white) && counter(1/1,1) asSorcery +text=Outlast {2}{W} ({2}{W}, {T}: Put a +1/+1 counter on this creature. Outlast only as a sorcery.) -- Whenever you activate Herald of Anafenza's outlast ability, put a 1/1 white Warrior creature token onto the battlefield. +mana={W} +type=Creature +subtype=Human Soldier +power=1 +toughness=2 +[/card] +[card] name=Herald of Serra abilities=flying,vigilance auto=upcost[{2}{W}{W};next upkeep] sacrifice @@ -42902,6 +43507,18 @@ mana={2}{U} type=Enchantment [/card] [card] +name=High Sentinels of Arashin +abilities=flying +auto=foreach(other creature[counter{1/1.1}]|mybattlefield) 1/1 +auto={3}{W}:counter(1/1,1) target(creature) +text=High Sentinels of Arashin gets +1/+1 for each other creature you control with a +1/+1 counter on it. -- {3}{W}: Put a +1/+1 counter on target creature. +mana={3}{W} +type=Creature +subtype=Bird Soldier +power=3 +toughness=4 +[/card] +[card] name=High Tide auto=all(island) transforms((,newability[@tappedformana(this):add{U}])) ueot text=Until end of turn, whenever a player taps an Island for mana, that player adds {U} to his or her mana pool (in addition to the mana the land produces). @@ -42930,6 +43547,16 @@ power=2 toughness=1 [/card] [card] +name=Highland Game +autograveyard=@movedto(this|graveyard) from(mybattlefield):life:2 controller +text=When Highland Game dies, you gain 2 life. +mana={1}{G} +type=Creature +subtype=Elk +power=2 +toughness=1 +[/card] +[card] name=Highland Giant mana={2}{R}{R} type=Creature @@ -42946,6 +43573,16 @@ text=Highland Weald enters the battlefield tapped. -- {T}: Add {R} or {G} to you type=Snow Land [/card] [card] +name=Highspire Mantis +abilities=flying,trample +text=Flying, trample +mana={2}{R}{W} +type=Creature +subtype=Insect +power=3 +toughness=3 +[/card] +[card] name=Highway Robber auto=ability$!choice life:-2 target(opponent) && life:2 controller!$ controller text=When Highway Robber enters the battlefield, target opponent loses 2 life and you gain 2 life. @@ -43492,6 +44129,21 @@ mana={3} type=Artifact [/card] [card] +name=Hooded Hydra +facedown={3} +autofacedown={3}{G}{G}:morph +autofaceup=counter(1/1,5) +auto=counter(1/1,X) +auto=0/-1 +auto=@movedTo(this|Graveyard) from(myBattlefield):thisforeach(counter{1/1.1}) token(Snake,Creature Snake,1/1,green) +text=Hooded Hydra enters the battlefield with X +1/+1 counters on it. -- When Hooded Hydra dies, put a 1/1 green Snake creature token onto the battlefield for each +1/+1 counter on it. -- Morph {3}G}{G}: As Hooded Hydra is turned face up, put five +1/+1 counters on it. +mana={X}{G}{G} +type=Creature +subtype=Snake Hydra +power=0 +toughness=1 +[/card] +[card] name=Hooded Kavu auto={B}:fear text={B}: Hooded Kavu gains fear until end of turn. (It can't be blocked except by artifact creatures and/or black creatures.) @@ -43568,6 +44220,13 @@ power=5 toughness=5 [/card] [card] +name=Hordeling Outburst +auto=token(Goblin,creature goblin, 1/1,red)*3 +text=Put three 1/1 red Goblin creature tokens onto the battlefield. +mana={1}{R}{R} +type=Sorcery +[/card] +[card] name=Horizon Canopy auto={T}{L}:Add{G} auto={T}{L}:Add{W} @@ -44760,6 +45419,19 @@ mana={2}{R}{R} type=Sorcery [/card] [card] +name=Icefeather Aven +abilities=flying +facedown={3} +autofacedown={1}{G}{U}:morph +autofaceup=moveTo(ownerhand) target(other creature|battlefield) +text=Morph {1}{G}{U} (You may cast this card face down as a 2/2 creature for 3. Turn it face up any time for its morph cost.)-- When Icefeather Aven is turned face up, you may return another target creature to its owner's hand. +mana={G}{U} +type=Creature +subtype=Bird Shaman +power=2 +toughness=2 +[/card] +[card] name=Icequake target=land auto=teach(land[snow]) damage:1 targetcontroller @@ -44826,6 +45498,15 @@ mana={4} type=Artifact [/card] [card] +name=Icy Blast +target=creature|battlefield +auto=tap +auto=if type(creature[power>=4]|mybattlefield)~morethan~0 then frozen +text=Tap X target creatures. -- Ferocious — If you control a creature with power 4 or greater, those creatures don't untap during their controllers' next untap steps. +mana={X}{U} +type=Instant +[/card] +[card] name=Ideas Unbound auto=draw:3 auto=phaseaction[endofturn] reject target(<3>*|myhand) @@ -46732,6 +47413,16 @@ mana={1} type=Artifact [/card] [card] +name=Ivorytusk Fortress +auto=@each opponent untap:untap all(creature[counter{1/1.1}]|mybattlefield) +text=Untap each creature you control with a +1/+1 counter on it during each other player's untap step. +mana={2}{W}{B}{G} +type=Creature +subtype=Elephant +power=5 +toughness=7 +[/card] +[card] name=Ivy Dancer auto={T}:forestwalk target(creature) text={T}: Target creature gains forestwalk until end of turn. @@ -47163,6 +47854,18 @@ power=2 toughness=5 [/card] [card] +name=Jeering Instigator +facedown={3} +autofacedown={2}{R}:morph +autofaceup=if compare(restriction{myturnonly}~morethan~0) then target(creature|opponentbattlefield) transforms((,newability[moveTo(opponentbattlefield)],newability[phaseaction[endofturn sourceinplay] moveTo(ownerbattlefield)],newability[untap],haste)) ueot +text=Morph {2}{R} (You may cast this card face down as a 2/2 creature for 3. Turn it face up any time for its morph cost.) -- When Jeering Instigator is turned face up, if it's your turn, gain control of another target creature until end of turn. Untap that creature. It gains haste until end of turn. +mana={1}{R} +type=Creature +subtype=Goblin Rogue +power=2 +toughness=1 +[/card] +[card] name=Jenara, Asura of War abilities=flying auto={1}{W}:counter(1/1,1) @@ -47204,6 +47907,66 @@ power=3 toughness=1 [/card] [card] +name=Jeskai Ascendancy +auto=@movedTo(*[-creature]|mystack):all(creature|myBattlefield) 1/1 ueot +auto=@movedTo(*[-creature]|mystack):all(creature|mybattlefield) untap +auto=@movedTo(*[-creature]|mystack):may name(draw & discard) ability$!draw:1 _ choice notatarget(*|myhand) reject)!$ controller +text=Enchantment. -- Whenever you cast a noncreature spell, creatures you control get +1/+1 until end of turn. Untap those creatures. -- Whenever you cast a noncreature spell, you may draw a card. If you do, discard a card. +mana={U}{R}{W} +type=Enchantment +[/card] +[card] +name=Jeskai Banner +auto={T}: Add{U} +auto={T}: Add{R} +auto={T}: Add{W} +auto={U}{R}{W}{T}{S}:draw:1 controller +text={T}: Add {U},{R} or {W} to your mana pool. -- {U}{R}{W}, {T}, Sacrifice Jeskai Banner: Draw a card. +mana={3} +type=Artifact +[/card] +[card] +name=Jeskai Charm +auto=choice name(top of library) moveTo(ownerLibrary) target(creature) +auto=choice name(4 damage) damage:4 target(opponent) +auto=choice name(1/1 and Lifelink) all(creature|myBattlefield) transforms((,newability[1/1],newability[lifelink])) ueot +text=Choose one: -- Put target creature on top of its owner's library. -- Jeskai Charm deals 4 damage to target opponent. -- Creatures you control get +1/+1 and gain lifelink until end of turn. +mana={U}{R}{W} +type=Instant +[/card] +[card] +name=Jeskai Elder +auto=@movedTo(*[-creature]|mystack):1/1 ueot +auto=@combatdamaged(player) from(this):may name(draw & discard) ability$!draw:1 _ choice notatarget(*|myhand) reject)!$ controller +text=Prowess (Whenever you cast a noncreature spell, this creature gets +1/+1 until end of turn.) -- Whenever Jeskai Elder deals combat damage to a player, you may draw a card. If you do, discard a card. +mana={1}{U} +type=Creature +subtype=Human Monk +power=1 +toughness=2 +[/card] +[card] +name=Jeskai Student +auto=@movedTo(*[-creature]|mystack):1/1 ueot +text=Prowess (Whenever you cast a noncreature spell, this creature gets +1/+1 until end of turn.) +mana={1}{W} +type=Creature +subtype=Human Monk +power=1 +toughness=3 +[/card] +[card] +name=Jeskai Windscout +abilities=flying +auto=@movedTo(*[-creature]|mystack):1/1 ueot +text=Flying -- Prowess (Whenever you cast a noncreature spell, this creature gets +1/+1 until end of turn.) +mana={2}{U} +type=Creature +subtype=Bird Scout +power=2 +toughness=1 +[/card] +[card] name=Jester's Cap auto={2}{T}{S}:choice name(target player) target(player) moveto(exile) target(<3>*|targetedpersonslibrary) text={2}, {T}, Sacrifice Jester's Cap: Search target player's library for three cards and exile them. Then that player shuffles his or her library. @@ -47785,6 +48548,15 @@ text=Jungle Basin enters the battlefield tapped. -- When Jungle Basin enters the type=Land [/card] [card] +name=Jungle Hollow +auto=tap +auto=life:1 +auto={T}:Add{B} +auto={T}:Add{G} +text=Jungle Hollow enters the battlefield tapped. -- When Jungle Hollow enters the battlefield, you gain 1 life. -- {T}: Add {B} or {G} to your mana pool. +type=Land +[/card] +[card] name=Jungle Lion abilities=cantblock text=Jungle Lion can't block. @@ -49418,6 +50190,28 @@ text={T}: Add {1} to your mana pool. -- {1}{R}, {T}: Put a 0/1 red Kobold creatu type=Legendary Land [/card] [card] +name=Kheru Bloodsucker +auto=@movedTo(graveyard) from(creature[toughness>=4]|mybattlefield):life:-2 opponent && life:2 controller +auto={2}{B}{S(other creature|mybattlefield)}:counter(1/1,1) +text=Whenever a creature you control with toughness 4 or greater dies, each opponent loses 2 life and you gain 2 life. -- (2)(B}, Sacrifice another creature: Put a +1/+1 counter on Kheru Bloodsucker. +mana={2}{B} +type=Creature +subtype=Vampire +power=2 +toughness=2 +[/card] +[card] +name=Kheru Dreadmaw +abilities=defender +auto={1}{G}{S(other creature|myBattlefield)}:life:storedtoughness +text={1}{G}, Sacrifice another creature: You gain life equal to the sacrificed creature's toughness. +mana={4}{B} +type=Creature +subtype=Zombie Crocodile +power=4 +toughness=4 +[/card] +[card] name=Kiki-Jiki, Mirror Breaker abilities=haste auto={T}:clone with(treason,haste) target(creature[-legendary]|mybattlefield) @@ -49447,6 +50241,14 @@ mana={B}{B} type=Sorcery [/card] [card] +name=Kill Shot +target=creature[attacking] +auto=destroy +text=Destroy target attacking creature. +mana={2}{W} +type=Instant +[/card] +[card] name=Killer Bees abilities=flying auto={G}:1/1 @@ -49646,6 +50448,25 @@ power=2 toughness=2 [/card] [card] +name=Kin-Tree Invocation +auto=token(Spirit Warrior,Creature Spirit Warrior,toughness:highest:creature:mybattlefield/toughness:highest:creature:mybattlefield,black,green) +text=Put an X/X black and green Spirit Warrior creature token onto the battlefield, where X is the greatest toughness among creatures you control. +mana={B}{G} +type=Sorcery +[/card] +[card] +name=Kin-Tree Warden +facedown={3} +autofacedown={G}:morph +auto={2}:regenerate +text={2}: Regenerate Kin-Tree Warden. -- Morph {G} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) +mana={G} +type=Creature +subtype=Human Warrior +power=1 +toughness=1 +[/card] +[card] name=Kiora, the Crashing Wave auto=counter(0/0,2,loyalty) auto={C(0/0,1,Loyalty)}:name(+1: Prevention) token(37852101) controller @@ -51116,6 +51937,17 @@ power=2 toughness=1 [/card] [card] +name=Krumar Bond-Kin +facedown={3} +autofacedown={4}{B}:morph +text=Morph {4}{B} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) +mana={3}{B}{B} +type=Creature +subtype=Orc Warrior +power=5 +toughness=3 +[/card] +[card] name=Kry Shield auto={2}{T}:target(creature|mybattlefield) dynamicability preventalldamage from(mytgt) ueot text={2}, {T}: Prevent all damage that would be dealt this turn by target creature you control. That creature gets +0/+X until end of turn, where X is its converted mana cost. @@ -52225,6 +53057,16 @@ power=2 toughness=3 [/card] [card] +name=Leaping Master +auto={2}{W}:flying ueot +text=Leaping Master gains flying until end of turn. +mana={1}{R} +type=Creature +subtype=Human Monk +power=2 +toughness=1 +[/card] +[card] name=Leashling auto={s2l(*|myhand)}:moveTo(myhand) text=Put a card in your hand on top of your library: Return Leashling to its owner's hand. @@ -53839,6 +54681,17 @@ mana={3} type=Artifact [/card] [card] +name=Longshot Squad +auto={1}{G}{T}:counter(1/1,1) asSorcery +auto=lord(creature[counter{1/1.1}]|myBattlefield) reach +text=Outlast {1}{G} ({1}{G}, {T}: Put a +1/+1 counter on this creature. Outlast only as a sorcery.) -- Each creature you control with a +1/+1 counter on it has reach. +mana={3}{G} +type=Creature +subtype=Hound Archer +power=3 +toughness=3 +[/card] +[card] name=Looming Hoverguard abilities=flying auto=moveTo(ownerLibrary) target(artifact) @@ -55906,6 +56759,16 @@ power=3 toughness=3 [/card] [card] +name=Mantis Rider +abilities=flying,vigilance,haste +text=Flying,vigilance,haste +mana={U}{R}{W} +type=Creature +subtype=Human Monk +power=3 +toughness=3 +[/card] +[card] name=Mantle of Leadership abilities=flash target=Creature @@ -56001,6 +56864,115 @@ type=Enchantment text=Each noncreature artifact is an artifact creature with power and toughness each equal to its converted mana cost. (Equipment that's a creature can't equip a creature.) [/card] [card] +name=Mardu Ascendancy +auto=@combat(attacking) source(creature[-token]|myBattlefield):token(Goblin Token,Creature Goblin,1/1,red,battleready) +auto={S}:all(creature|myBattlefield) 0/3 ueot +text=Enchantment. -- Whenever a nontoken creature you control attacks, put a 1/1 red Goblin creature token onto the battlefield tapped and attacking. -- Sacrifice Mardu Ascendancy: Creatures you control get +0/+3 until end of turn. +mana={R}{W}{B} +type=Enchantment +[/card] +[card] +name=Mardu Banner +auto={T}: Add{R} +auto={T}: Add{W} +auto={T}: Add{B} +auto={R}{W}{B}{T}{S}:draw:1 controller +text={T}: Add {R},{W} or {B} to your mana pool. -- {R}{W}{B}, {T}, Sacrifice Mardu Banner: Draw a card. +mana={3} +type=Artifact +[/card] +[card] +name=Mardu Blazebringer +auto=@combat(attacking) source(this):phaseaction[combatends,sourceinplay] sacrifice +auto=@combat(blocking) source(this):phaseaction[combatends,sourceinplay] sacrifice +text=When Mardu Blazebringer attacks or blocks, sacrifice it at end of combat. +mana={2}{R} +type=Creature +subtype=Ogre Warrior +power=4 +toughness=4 +[/card] +[card] +name=Mardu Charm +auto=choice name(4 Damage) damage:4 target(creature) +auto=choice name(2 Warrior tokens) token(-386593)*2 +auto=choice name(Duress opponent) transforms((,newability[if type(*[-creature;-land]|opponenthand)~lessthan~1 then name(look) donothing notatarget(*|opponenthand) else reject notatarget(*[-creature;-land]|opponenthand)])) forever +text=Choose one: -- Mardu Charm deals 4 damage to target creature. -- Put two 1/1 white Warrior creature tokens onto the battlefield. They gain first strike until end of turn. -- Target opponent (WORKAROUND DOES NOT TARGET OPPONENT) reveals his or her hand. You choose a noncreature, nonland card from it. That player discards that card. +mana={R}{W}{B} +type=Instant +[/card] +[card] +name=Mardu Warrior token +auto=first strike ueot +text= +type=Creature +color=white +subtype=Warrior +power=1 +toughness=1 +[/card] +[card] +name=Mardu Hateblade +auto={B}:deathtouch ueot +text={B}: Mardu Hateblade gains deathtouch until end of turn. (Any amount of damage it deals to a creature is enough to destroy it.) +mana={W} +type=Creature +subtype=Human Warrior +power=1 +toughness=1 +[/card] +[card] +name=Mardu Heart-Piercer +auto=if thisturn(creature[attacking]|mybattlefield)~morethan~0 then damage:2 target(creature,player) +text=Raid -- When Mardu Heart-Piercer enters the battlefield, if you attacked with a creature this turn, Mardu Heart-Piercer deals 2 damage to target creature or player. +mana={3}{R} +type=Creature +subtype=Human Archer +power=2 +toughness=3 +[/card] +[card] +name=Mardu Hordechief +auto=if thisturn(creature[attacking]|mybattlefield)~morethan~0 then token(Warrior,Creature Warrior,1/1,white) +text=Raid - When Mardu Hordechief enters the battlefield, if you attacked with a creature this turn, put a 1/1 white Warrior creature token onto the battlefield. +mana={2}{W} +type=Creature +subtype=Human Warrior +power=2 +toughness=3 +[/card] +[card] +name=Mardu Roughrider +auto=@combat(attacking) source(this):cantblock target(creature) ueot +text=Whenever Mardu Roughrider attacks, target creature can't block this turn. +mana={2}{R}{W}{B} +type=Creature +subtype=Orc Warrior +power=5 +toughness=4 +[/card] +[card] +name=Mardu Skullhunter +auto=tap +auto=if thisturn(creature[attacking]|mybattlefield)~morethan~0 then target(opponent) ability$!name(discard) target(*|myhand) reject!$ targetedplayer +text=Mardu Skullhunter enters the battlefield tapped. -- Raid - When Mardu Skullhunter enters the battlefield, if you attacked with a creature this turn, target opponent discards a card. +mana={1}{B} +type=Creature +subtype=Human Warrior +power=2 +toughness=1 +[/card] +[card] +name=Mardu Warshrieker +auto=if thisturn(creature[attacking]|mybattlefield)~morethan~0 then Add{R}{W}{B} +text=Raid - When Mardu Warshrieker enters the battlefield, if you attacked with a creature this turn, add {R}{W}{B} to your mana pool. +mana={3}{R} +type=Creature +subtype=Orc Shaman +power=3 +toughness=3 +[/card] +[card] name=Marhault Elsdragon auto=rampage(1/1,1) text=Rampage 1 (Whenever this creature becomes blocked, it gets +1/+1 until end of turn for each creature blocking it beyond the first.) @@ -56681,6 +57653,18 @@ power=* toughness=* [/card] [card] +name=Master of Pearls +facedown={3} +autofacedown={3}{W}{W}:morph +autofaceup=all(creature|myBattlefield) 2/2 ueot +text=Morph {3}{W}{W} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -- When Master of Pearls is turned face up, creatures you control get +2/+2 until end of turn. +mana={1}{W} +type=Creature +subtype=Human Monk +power=2 +toughness=2 +[/card] +[card] name=Master of the Feast abilities=flying auto=@each my upkeep:draw:1 opponent @@ -56703,6 +57687,15 @@ power=2 toughness=2 [/card] [card] +name=Master the Way +target=creature,player +auto=draw:1 controller +auto=damage:phandcount +text=Draw a card. -- Master the Way deals damage to target creature or player equal to the number of cards in your hand. +mana={3}{U}{R} +type=Sorcery +[/card] +[card] name=Master of Waves abilities=protection from red auto=lord(Elemental|mybattlefield) 1/1 @@ -57209,6 +58202,14 @@ mana={5} type=Artifact [/card] [card] +name=Memory Lapse +target=*|stack +auto=fizzleto(librarytop) +text=Counter target spell. If that spell is countered this way, put it on top of its owner's library instead of into that player's graveyard. +mana={1}{U} +type=Instant +[/card] +[card] name=Memory Plunder target=*[instant;sorcery]|opponentgraveyard auto=castcard(normal) @@ -57640,6 +58641,17 @@ power=1 toughness=1 [/card] [card] +name=Mer-Ek Nightblade +auto={B}{T}:counter(1/1,1) asSorcery +auto=lord(creature[counter{1/1.1}]|myBattlefield) deathtouch +text=Outlast {B}({B}, {T}: Put a +1/+1 counter on this creature. Outlast only as a sorcery.) -- Each creature you control with a +1/+1 counter on it has dathtouch. +mana={3}{B} +type=Creature +subtype=Orc Assassin +power=2 +toughness=3 +[/card] +[card] name=Mesa Enchantress auto=@movedTo(enchantment|mystack):may draw:1 controller text=Whenever you cast an enchantment spell, you may draw a card. @@ -58508,6 +59520,15 @@ mana={3} type=Artifact [/card] [card] +name=Mindswipe +target=*|stack +auto=transforms((,newability[pay[[{value:storedx}]] name(pay {value} mana) donothing?fizzle])) forever +auto=damage:x targetcontroller +text=Counter target spell unless its controller pays {X}. Mindswipe deals X damage to that spell's controller. +mana={X}{U}{R} +type=Instant +[/card] +[card] name=Mindwarper auto=counter(1/1,3) auto={2}{B}{c(1/1,-1)}:target(player) ability$!name(discard) target(*|myhand) reject!$ targetedplayer asSorcery @@ -59092,6 +60113,19 @@ power=0 toughness=0 [/card] [card] +name=Mistfire Weaver +abilities=flying +facedown={3} +autofacedown={2}{U}:morph +autofaceup=opponentshroud target(creature|mybattlefield) ueot +text=Flying -- Morph {2}{U} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -- When Mistfire Weaver is turned face up, target creature you control gains hexproof until end of turn. +mana={3}{U} +type=Creature +subtype=Djinn Wizard +power=3 +toughness=1 +[/card] +[card] name=Mistform Dreamer abilities=flying auto={1}:activatechooseatype all(this) becomes(removecreaturesubtypes) && becomes(chosentype) ueot activatechooseend @@ -59710,6 +60744,18 @@ power=0 toughness=4 [/card] [card] +name=Moltensteel Dragon +abilities=flying +auto={p(R)}:1/0 +text=({p(R)} may be paid for with either {R} or 2 life.) -- {p(R)}: Moltensteel Dragon gets +1/+0 until end of turn. +color=red +mana={4}{p(R)}{p(R)} +type=Artifact Creature +subtype=Dragon +power=4 +toughness=4 +[/card] +[card] name=Molten-Tail Masticore auto=upcost[{discard(*|myhand)}] sacrifice auto={4}{E(creature|mygraveyard)}:damage:4 target(creature,player) @@ -59740,16 +60786,14 @@ mana={2}{G} type=Enchantment [/card] [card] -name=Moltensteel Dragon -abilities=flying -auto={p(R)}:1/0 -text=({p(R)} may be paid for with either {R} or 2 life.) -- {p(R)}: Moltensteel Dragon gets +1/+0 until end of turn. -color=red -mana={4}{p(R)}{p(R)} -type=Artifact Creature -subtype=Dragon -power=4 -toughness=4 +name=Molting Snakeskin +target=creature +auto=2/0 +auto=teach(creature) {2}{B}:regenerate +text=Enchant creature -- Enchanted creature gets +2/+0 and has "{2}{B}: Regenerate this creature." +mana={B} +type=Enchantment +subtype=Aura [/card] [card] name=Moment of Heroism @@ -59807,6 +60851,29 @@ text=Prevent all combat damage that would be dealt this turn. -- Flashback {2}{G mana={1}{G} type=Instant [/card] +[card] +name=Monastery Flock +abilities=flying,defender +facedown={3} +autofacedown={U}:morph +text=Flying. -- Defender. -- Morph {2}{U} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) +mana={U} +type=Creature +subtype=Bird +power=0 +toughness=5 +[/card] +[card] +name=Monastery Swiftspear +abilities=haste +auto=@movedTo(*[-creature]|mystack):1/1 ueot +text=Prowess (Whenever you cast a noncreature spell, this creature gets +1/+1 until end of turn.) +mana={R} +type=Creature +subtype=Human Monk +power=1 +toughness=2 +[/card] ###The 2 cards below should stay together (Flip Card)### [card] name=Mondronen Shaman @@ -61462,6 +62529,27 @@ type=Enchantment subtype=Aura [/card] [card] +name=Mystic Monastery +auto=tap +auto={T}:Add{U} +auto={T}:Add{R} +auto={T}:Add{W} +text=Mystic Monastery enters the battlefield tapped. -- {T}: Add {U}, {R}, or {W} to your mana pool. +type=Land +[/card] +[card] +name=Mystic of the Hidden Way +abilities=unblockable +facedown={3} +autofacedown={2}{U}:morph +text=Mystic of the Hidden Way can't be blocked. -- Morph {2}{U} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) +mana={4}{U} +type=Creature +subtype=Human Monk +power=3 +toughness=2 +[/card] +[card] name=Mystic Penitent abilities=vigilance auto=aslongas(*|mygraveyard) 1/1 >6 @@ -63609,6 +64697,15 @@ power=2 toughness=2 [/card] [card] +name=Nomad Outpost +auto=tap +auto={T}:Add{R} +auto={T}:Add{W} +auto={T}:Add{B} +text=Nomad Outpost enters the battlefield tapped. -- {T}: Add {R}, {W}, or {B} to your mana pool. +type=Land +[/card] +[card] name=Nomad Stadium auto={T}:Add{W} && damage:1 controller auto=aslongas(*|mygraveyard) {W}{T}{S}:life:4 >6 @@ -65055,6 +66152,15 @@ mana={1}{B}{B} type=Enchantment [/card] [card] +name=Opulent Palace +auto=tap +auto={T}:Add{B} +auto={T}:Add{G} +auto={T}:Add{U} +text=Opulent Palace enters the battlefield tapped. -- {T}: Add {B}, {G}, or {U} to your mana pool. +type=Land +[/card] +[card] name=Oracle of Nectars auto={X}{T}:life:X text={X}, {T}: You gain X life. @@ -66858,6 +67964,18 @@ power=4 toughness=4 [/card] [card] +name=Pearl Lake Ancient +abilities=flash,nofizzle +auto=@movedTo(*[-creature]|mystack):1/1 ueot +auto={H(land|myBattlefield)}{H(land|myBattlefield)}{H(land|myBattlefield)}: moveto(ownerhand) +text=Flash. -- Pearl Lake Ancient can't be countered. -- Prowess (Whenever you cast a noncreature spell, this creature gets +1/+1 until end of turn.) -- Return three lands you control to their owner's hand: Return Pearl Lake Ancient to its owner's hand. +mana={5}{U}{U} +type=Creature +subtype=Leviathan +power=6 +toughness=7 +[/card] +[card] name=Pearl Medallion auto=lord(*[white]|myhand) altercost(colorless,-1) text=White spells you cast cost {1} less to cast. @@ -69259,6 +70377,19 @@ power=2 toughness=7 [/card] [card] +name=Ponyback Brigade +auto=token(Goblin,Creature Goblin,1/1, haste, red) *3 +facedown={3} +autofacedown={2}{R}{W}{B}:morph +autofaceup=token(Goblin,Creature Goblin,1/1, haste, red) *3 +text=When Ponyback Brigade enters the battlefield or is turned face up, put three 1/1 red Goblin creature tokens onto the battlefield. -- Morph {2}{R}{W}{B}: (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) +mana={3}{R}{W}{B} +type=Creature +subtype=Goblin Warrior +power=2 +toughness=2 +[/card] +[card] name=Pooling Venom target=land auto=@tapped(mytgt):life:-2 targetController @@ -71432,6 +72563,13 @@ mana={4}{U} type=Instant [/card] [card] +name=Quiet Contemplation +auto=@movedTo(*[-creature]|mystack):pay({1}) name(tap target creature) target(creature|opponentbattlefield) transforms((,newability[tap],newability[frozen])) +text=Enchantment. -- Whenever you cast a noncreatrue spell, you may pay 1. If you do, tap target creature an opponent controls and it doesn't untap during its controller's next untap step. +mana={2}{U} +type=Enchantment +[/card] +[card] name=Quiet Purity target=enchantment auto=destroy @@ -71953,6 +73091,14 @@ mana={2}{R} type=Enchantment [/card] [card] +name=Raiders' Spoils +auto=lord(creature|mybattlefield) 1/0 +auto=@combatdamaged(player) from(warrior|mybattlefield):pay({L}) draw:1 controller +text=Creatures you control get +1/+0. -- Whenever a Warrior you control deals combat damage to a player, you may pay 1 life. If you do, draw a card. +mana={3}{B} +type=Enchantment +[/card] +[card] name=Raiding Nightstalker abilities=swampwalk text=Swampwalk @@ -72310,6 +73456,36 @@ power=3 toughness=4 [/card] [card] +name=Rakshasa Deathdealer +auto={B}{G}:2/2 ueot +auto={B}{G}:regenerate +text={B}{G}: Rakshasa Deathdealer gets +2/+2 until end of turn. -- {B}{G}: Regenerate Rakshasa Deathdealer. +mana={B}{G} +type=Creature +subtype=Cat Demon +power=2 +toughness=2 +[/card] +[card] +name=Rakshasa Vizier +auto=@movedTo(*|exile) from(mygraveyard):counter(1/1,1) +text=Whenever one or more cards are put into exile from your graveyard, put that many +1/+1 counters on Rakasha Vizier. +mana={2}{B}{G}{U} +type=Creature +subtype=Cat Demon +power=4 +toughness=4 +[/card] +[card] +name=Rakshasa's Secret +target=opponent +auto=ability$!reject notatarget(<2>*|myhand)!$ targetedplayer +auto=deplete:2 controller +text=Target opponent discards two cards. Put the top two cards of your library into your graveyard. +mana={2}{B} +type=Sorcery +[/card] +[card] name=Rally auto=lord(creature[blocking]) 1/1 text=Blocking creatures get +1/+1 until end of turn. @@ -72741,6 +73917,21 @@ power=5 toughness=3 [/card] [card] +name=Rattleclaw Mystic +facedown={3} +autofacedown={2}:morph +autofaceup=Add{G}{U}{R} +auto={T}:Add{G} +auto={T}:Add{U} +auto={T}:Add{R} +text={T}: Add {G}, {U}, or {R} to your mana pool.-- Morph {2}. (You may cast this card face down as a 2/2 creature for 3. Turn it face up any time for its morph cost.) -- When Rattleclaw Mystic is turned face up, add {G}{U}{R} to your mana pool. +mana={1}{G} +type=Creature +subtype=Human Shaman +power=2 +toughness=1 +[/card] +[card] name=Ravaged Highlands auto=tap auto={T}:Add{R} @@ -74031,6 +75222,15 @@ text=You have no maximum hand size. -- {T}: Add {1} to your mana pool. type=Land [/card] [card] +name=Remand +target=*|stack +auto=fizzleto(hand) +auto=draw:1 controller +text=Counter target spell. If that spell is countered this way, put it into its owner's hand instead of into that player's graveyard. -- Draw a card. +mana={1}{U} +type=Instant +[/card] +[card] name=Remembrance auto=@movedTo(creature|graveyard) from(mybattlefield):may all(trigger[to]) transforms((,newability[target(creature[share!name!]|mylibrary) moveTo(myhand)])) text=Whenever a nontoken creature you control dies, you may search your library for a card with the same name as that creature, reveal it, and put it into your hand. If you do, shuffle your library. @@ -75693,6 +76893,15 @@ mana={2}{U}{U} type=Sorcery [/card] [card] +name=Rite of the Serpent +target=creature +auto=if cantargetcard(creature[counter{1/1.1}]|battlefield) then token(Snake,Creature Snake,1/1,green) controller +auto=destroy +text=Destroy target creature. If that creature had a +1/+1 counter on it, put a 1/1 green Snake creature token onto the battlefield. +mana={4}{B}{B} +type=Sorcery +[/card] +[card] name=Rites of Flourishing auto=maxplay(land)+1 opponent auto=maxplay(land)+1 @@ -75843,6 +77052,17 @@ power=2 toughness=1 [/card] [card] +name=Riverwheel Aerialists +abilities=flying +auto=@movedTo(*[-creature]|mystack):1/1 ueot +text=Flying -- Prowess (Whenever you cast a noncreature spell, this creature gets +1/+1 until end of turn.) -- Whenever Jeskai Elder deals combat damage to a player, you may draw a card. If you do, discard a card. +mana={5}{U} +type=Creature +subtype=Djinn Monk +power=4 +toughness=5 +[/card] +[card] name=Rix Maadi Guildmage auto={B}{R}:name(target creature -1/-1) target(creature[blocking]) -1/-1 ueot auto={B}{R}:name(target controller life -1) target(controller) life:-1 restriction{compare(lifelost)~morethan~0} @@ -75862,6 +77082,15 @@ text={T}: Add {1} to your mana pool. -- {1}{B}{R}, {T}: Each player discards a c type=Land [/card] [card] +name=Roar of Challenge +target=creature +auto=lure ueot +auto=if type(creature[power>=4]|mybattlefield)~morethan~0 then indestructible ueot +text=All creatures able to block target creature this turn do so. -- Ferocious - That creature gains indestructible until end of turn if you control a creature with power 4 or greater. +mana={2}{G} +type=Sorcery +[/card] +[card] name=Roar of the Kha other={2}{W}{W} name(Entwine) auto=if paid(alternative) then all(creature|mybattlefield) 1/1 ueot && untap all(creature|mybattlefield) @@ -76574,6 +77803,15 @@ power=4 toughness=5 [/card] [card] +name=Rotting Mastodon +text= +mana={4}{B} +type=Creature +subtype=Zombie Elephant +power=2 +toughness=8 +[/card] +[card] name=Rotting Rats auto=transforms((,newability[ability$!name(discard) notatarget(*|myhand) reject!$ controller],newability[ability$!name(discard) notatarget(*|myhand) reject!$ opponent])) ueot autograveyard={1}{B}:moveto(mybattlefield) && transforms((,unearth,haste)) asSorcery forever @@ -76732,6 +77970,15 @@ mana={4}{G} type=Sorcery [/card] [card] +name=Rugged Highlands +auto=tap +auto=life:1 +auto={T}:Add{G} +auto={T}:Add{R} +text=Rugged Highlands enters the battlefield tapped. -- When Rugged Highlands enters the battlefield, you gain 1 life. -- {T}: Add {G} or {R} to your mana pool. +type=Land +[/card] +[card] name=Rugged Prairie auto={T}:Add{1} auto={RW}{T}:Add{R}{R} @@ -77061,6 +78308,14 @@ text=Rupture Spire enters the battlefield tapped. -- When Rupture Spire enters t type=Land [/card] [card] +name=Rush of Battle +auto=all(creature|myBattlefield) 2/1 ueot +auto=all(Warrior|myBattlefield) lifelink ueot +text=Creature you control get +2/+1 until end of turn. Warrior creatures you control also gain lifelink until end of turn. (Damage dealt by those Warriors also causes their controller to gain that much life.) +mana={3}{W} +type=Sorcery +[/card] +[card] name=Rush of Blood target=creature auto=dynamicability ueot @@ -77497,6 +78752,14 @@ text={2}, {T}: Exile target creature you control. -- At the beginning of your up type=Land [/card] [card] +name=Safe Passage +auto=all(creature|mybattlefield) prevent:9999 +auto=prevent:9999 controller +text=Prevent all damage that would be dealt to you and creatures you control this turn. +mana={2}{W} +type=Instant +[/card] +[card] name=Safeguard auto={2}{W}:name(prevent all combat damage from target creature) donothing target(creature) && fog from(mytgt) oneshot text={2}{W}: Prevent all combat damage that would be dealt by target creature this turn. @@ -77573,12 +78836,27 @@ power=1 toughness=2 [/card] [card] -name=Safe Passage -auto=all(creature|mybattlefield) prevent:9999 -auto=prevent:9999 controller -text=Prevent all damage that would be dealt to you and creatures you control this turn. -mana={2}{W} -type=Instant +name=Sage of the Inward Eye +abilities=flying +auto=@movedTo(*[-creature]|mystack):all(creature|myBattlefield) lifelink ueot +text=Flying -- Whenever you cast a noncreature spell, creatures you control gain lifelink until end of turn. (Damage dealt by those creatures also causes their controller to gain that much life.) +mana={2}{U}{R}{W} +type=Creature +subtype=Djinn Wizard +power=3 +toughness=4 +[/card] +[card] +name=Sage-Eye Harrier +abilities=flying +facedown={3} +autofacedown={3}{W}:morph +text=Flying -- Morph {3}{W} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) +mana={4}{W} +type=Creature +subtype=Bird Warrior +power=1 +toughness=5 [/card] [card] name=Sage's Dousing @@ -77609,6 +78887,30 @@ power=2 toughness=3 [/card] [card] +name=Sagu Archer +abilities=Reach +facedown={3} +autofacedown={4}{G}:morph +text=Reach -- Morph {4}{G} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) +mana={4}{G} +type=Creature +subtype=Naga Archer +power=2 +toughness=5 +[/card] +[card] +name=Sagu Mauler +abilities=trample,opponentshroud +facedown={3} +autofacedown={3}{G}{U}:morph +text=Trample, hexproof. -- Morph {3}{G}{U} (You may cast this card face down as a 2/2 creature for 3. Turn it face up any time for its morph cost.) +mana={4}{G}{U} +type=Creature +subtype=Beast +power=6 +toughness=6 +[/card] +[card] name=Sai of the Shinobi auto={2}:equip auto=1/1 @@ -77688,6 +78990,16 @@ text=Salt Marsh enters the battlefield tapped. -- {T}: Add {U} or {B} to your ma type=Land [/card] [card] +name=Salt Road Patrol +auto={1}{W}{T}:counter(1/1,1) asSorcery +text=Outlast {1}{W} ({1}{W}, {T}: Put a +1/+1 counter on this creature. Outlast only as a sorcery.) +mana={3}{W} +type=Creature +subtype=Human Scout +power=2 +toughness=5 +[/card] +[card] name=Saltskitter auto=@movedTo(other creature|battlefield):(blink)ueot text=Whenever another creature enters the battlefield, exile Saltskitter. Return Saltskitter to the battlefield under its owner's control at the beginning of the next end step. @@ -77958,6 +79270,15 @@ power=1 toughness=3 [/card] [card] +name=Sandsteppe Citadel +auto=tap +auto={T}:Add{W} +auto={T}:Add{B} +auto={T}:Add{G} +text=Sandsteppe Citadel enters the battlefield tapped. -- {T}: Add {W}, {B}, or {G} to your mana pool. +type=Land +[/card] +[card] name=Sandstone Deadfall auto={T}{S(land|myBattlefield)}{S(land|myBattlefield)}{S}:destroy target(creature[attacking]) text={T}, Sacrifice two lands and Sandstone Deadfall: Destroy target attacking creature. @@ -78250,6 +79571,17 @@ type=Planeswalker subtype=Sarkhan [/card] [card] +name=Sarkhan, the Dragonspeaker +auto=counter(0/0,4,loyalty) +auto={C(0/0,1,Loyalty)}:name(+1: becomes dragon) transforms((Creature Dragon,setpower=4,settoughness=4,indestructible,flying,haste,newability[preventAllDamage to(this)])) ueot +auto={C(0/0,-3,Loyalty)}:name(-3: 4 Damage to creature) damage:4 target(creature) +auto={C(0/0,-6,Loyalty)}:name(-6: Emblem) emblem transforms((,newability[@each my draw:draw:2 controller],newability[@each my end:moveTo(graveyard) all(*|myhand)])) forever dontremove +mana={3}{R}{R} +text=+1 Until end of turn, Sarkhan, the Dragonspeaker becomes a legendary 4/4 red Dragon creature with flying, indestructible, and haste. (He doesn't lose loyalty while he's not a planeswalker. -- -3: Sarkhan, the Dragonspeaker deals 4 damage to target creature. -- -6: You get an emblem with "At the beginning of your draw step, draw two additional cards" and "At the beginning of your end step, discard your hand." -- Starting Loyalty (4) +type=Planeswalker +subtype=Sarkhan +[/card] +[card] name=Sarpadian Empires, Vol. VII auto=choice name(white citizen) counter(0/0,1,White Citizen) all(this) auto=choice name(blue camarid) counter(0/0,1,Blue Camarid) all(this) @@ -78429,6 +79761,18 @@ type=Enchantment subtype=Aura [/card] [card] +name=Savage Knuckleblade +auto={2}{G}: 2/2 ueot limit:1 +auto={2}{U}:moveto(ownerhand) +auto={R}:haste +text={2}{G}: Savage Knuckleblade gets +2/+2 until end of turn. Activate this ability only once each turn. -- {2}{U}: Return Savage Knuckleblade to its owner's hand. -- {R}: Savage Knuckleblade gains haste until end of turn. +mana={G}{U}{R} +type=Creature +subtype=Ogre Warrior +power=4 +toughness=4 +[/card] +[card] name=Savage Lands auto=tap auto={T}:Add{B} @@ -78447,6 +79791,16 @@ mana={1}{R} type=Sorcery [/card] [card] +name=Savage Punch +target=creature|mybattlefield +auto=transforms((,newability[target(creature|opponentbattlefield) dynamicability])) ueot +restriction=type(creature|opponentbattlefield)~morethan~0 +auto=if type(creature[power>=4]|mybattlefield)~morethan~0 then 2/2 ueot +text=Target creature you control fights target creature you don't control. -- Ferocious - The creature you control gets +2/+2 until end of turn before it fights if you control a creature with power 4 or greater. +mana={1}{G} +type=Sorcery +[/card] +[card] name=Savage Silhouette target=creature auto=2/2 @@ -78621,6 +79975,17 @@ mana={1}{R} type=Enchantment [/card] [card] +name=Scaldkin +abilities=flying +auto={2}{R}{S}:damage:2 target(creature,player) +text=Flying -- {2}{R}, Sacrifice Scaldkin: Scaldkin deals 2 damage to target creature or player. +mana={3}{U} +type=Creature +subtype=Elemental +power=2 +toughness=2 +[/card] +[card] name=Scalding Devil auto={2}{R}:damage:1 target(player) text={2}{R}: Scalding Devil deals 1 damage to target player. @@ -78983,6 +80348,16 @@ power=6 toughness=6 [/card] [card] +name=Scion of Glaciers +auto={U}:1/-1 ueot +text={U}: Scion of Glaciers gets +1/-1 until end of turn. +mana={2}{U}{U} +type=Creature +subtype=Elemental +power=2 +toughness=5 +[/card] +[card] name=Scion of Oona abilities=flash,flying auto=lord(other faerie|myBattlefield) 1/1 @@ -79173,6 +80548,15 @@ mana={2}{W}{W} type=Instant [/card] [card] +name=Scoured Barrens +auto=tap +auto=life:1 +auto={T}:Add{W} +auto={T}:Add{B} +text=Scoured Barrens enters the battlefield tapped. -- When Scoured Barrens enters the battlefield, you gain 1 life. -- {T}: Add {W} or {B} to your mana pool. +type=Land +[/card] +[card] name=Scourge Devil auto=1/0 all(creature|myBattlefield) autograveyard={2}{R}:moveto(mybattlefield) && transforms((,unearth,haste)) asSorcery forever @@ -80299,6 +81683,17 @@ type=Enchantment subtype=Aura [/card] [card] +name=Seeker of the Way +auto=@movedTo(*[-creature]|mystack):1/1 ueot +auto=@movedTo(*[-creature]|mystack):lifelink ueot +text=Prowess (Whenever you cast a noncreature spell, this creature gets +1/+1 until end of turn.) -- Whenever you cast a noncreature spell, Seeker of the Way gains lifelink until end of turn. +mana={1}{W} +type=Creature +subtype=Human Monk +power=2 +toughness=2 +[/card] +[card] name=Seedtime restriction=during my turn auto=if casted(*[blue]|opponentstack) then turns:+1 controller @@ -82955,6 +84350,18 @@ power=1 toughness=1 [/card] [card] +name=Sidisi's Pet +abilities=Lifelink +facedown={3} +autofacedown={1}{B}:morph +text=Lifelink (Damage dealt by this creature also causes you to gain that much life.) -- Morph {1}{B} (You may cast this card face down as a 2/2 creature for 3. Turn it face up any time for its morph cost.) +mana={3}{B} +type=Creature +subtype=Zombie Ape +power=1 +toughness=4 +[/card] +[card] name=Siege Mastodon mana={4}{W} type=Creature @@ -82963,6 +84370,27 @@ power=3 toughness=5 [/card] [card] +name=Siege Rhino +abilities=trample +auto=all(opponent) life:-3 +auto=life:3 controller +text=Trample. -- When Siege Rhino enters the battlefield, each opponent loses 3 life and you gain 3 life. +mana={1}{W}{B}{G} +type=Creature +subtype=Rhino +power=4 +toughness=5 +[/card] +[card] +name=Siegecraft +target=creature +auto=teach(creature) 2/4 +text=Enchant creature -- Enchanted creature gets +2/+4. +mana={3}{W} +type=Enchantment +subtype=Aura +[/card] +[card] name=Siege-Gang Commander auto=token(Goblin,Creature Goblin,1/1,red)*3 auto={1}{R}{S(goblin|myBattlefield)}:Damage:2 target(creature,player) @@ -83672,6 +85100,17 @@ mana={R} type=Instant [/card] [card] +name=Singing Bell Strike +target=creature +auto=tap +auto=doesnotuntap +auto=teach(creature) {6}:untap +text=Enchant creature -- When Claustrophobia enters the battlefield, tap enchanted creature. -- Enchanted creature doesn't untap during its controller's untap step. -- Enchanted creature has "{6}: Untap this creature." +mana={1}{U} +type=Enchantment +subtype=Aura +[/card] +[card] name=Singing Tree auto={T}:target(creature[attacking]) transforms((,setpower=0)) ueot text={T}: Target attacking creature's power becomes 0 until end of turn. @@ -85905,6 +87344,18 @@ power=1 toughness=1 [/card] [card] +name=Snowhorn Rider +abilities=trample +facedown={3} +autofacedown={2}{G}{U}{R}:morph +text=Trample -- Morph {2}{G}{U}{R} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) +mana={3}{G}{U}{R} +type=Creature +subtype=Human Warrior +power=5 +toughness=5 +[/card] +[card] name=Snow-Covered Forest text=G type=Basic Snow Land @@ -86597,6 +88048,17 @@ type=Planeswalker subtype=Sorin [/card] [card] +name=Sorin, Solemn Visitor +auto=counter(0/0,4,loyalty) +auto={C(0/0,1,Loyalty)}:name(+1: 1/0 and Lifelink) emblem transforms((,newability[lord(creature|mybattlefield) 1/0],newability[lord(creature|mybattlefield) lifelink])) uynt +auto={C(0/0,-2,Loyalty)}:name(-2: vampire token) token(Vampire,Creature Vampire,2/2,black,flying) +auto={C(0/0,-6,Loyalty)}:name(-6: emblem) emblem transforms((,newability[@each opponent upkeep:ability$!name(sacrifice creature) notatarget(creature|mybattlefield) sacrifice!$ opponent])) forever dontremove +mana={2}{W}{B} +text=+1: Until your next turn, creatures you control get +1/+0 and gain lifelink. -- -2: Put a 2/2 black Vampire creature token with flying onto the battlefield. -- -6: You get an emblem with "At the beginning of each opponent's upkeep, that player sacrifices a creature." -- Starting Loyalty (4) +type=Planeswalker +subtype=Sorin +[/card] +[card] name=Sorin's Thirst target=creature auto=damage:2 @@ -90914,6 +92376,14 @@ subtype=Human power=3 toughness=3 [/card] +[card] +name=Stubborn Denial +target=*[-creature]|stack +auto=if type(creature[power>=4]|mybattlefield) then fizzle else transforms((,newability[pay[[{1}]] name(pay 1 mana) donothing?fizzle])) forever +text=Counter target noncreature spell unless its controller pays {1}. -- Ferocious — If you control a creature with power 4 or greater, counter that spell instead. +mana={U} +type=Instant +[/card] ###The 2 cards below should stay together (Flip Card)### [card] name=Student of Elements @@ -91224,6 +92694,35 @@ text={T}: Add {1} to your mana pool. -- {T}: Add {B} or {R} to your mana pool. S type=Land [/card] [card] +name=Sultai Banner +auto={T}: Add{B} +auto={T}: Add{G} +auto={T}: Add{U} +auto={B}{G}{U}{T}{S}:draw:1 controller +text={T}: Add {B},{G} or {U} to your mana pool. -- {B}{G}{U}, {T}, Sacrifice Sultai Banner: Draw a card. +mana={3} +type=Artifact +[/card] +[card] +name=Sultai Charm +auto=choice name(Destroy monocolored) destroy target(creature[-multicolor]) +auto=choice name(destroy artifact or enchantment) destroy target(artifact,enchantment) +auto=choice name(Draw 2 and discard 1) draw:2 && transforms((,newability[target(*|myhand) reject])) forever +text=Choose one: -- Destroy target monocolored creature. -- Destroy target artifact or enchantment. -- Draw two cards, then discard a card. +mana={B}{G}{U} +type=Instant +[/card] +[card] +name=Sultai Flayer +auto=@movedTo(creature[toughness>=4]|graveyard) from(myBattlefield):life:4 controller +text=Whenever a creature you control with toughness 4 or greater dies, you gain 4 life. +mana={3}{G} +type=Creature +subtype=Naga Shaman +power=3 +toughness=4 +[/card] +[card] name=Summer Bloom auto=maxPlay(land)+3 text=You may play up to three additional lands this turn. @@ -91231,6 +92730,15 @@ mana={1}{G} type=Sorcery [/card] [card] +name=Summit Prowler +text= +mana={2}{R}{R} +type=Creature +subtype=Yeti +power=4 +toughness=3 +[/card] +[card] name=Summoner's Bane target=creature|stack auto=fizzle @@ -91820,6 +93328,18 @@ mana={3}{W} type=Instant [/card] [card] +name=Surrak Dragonclaw +abilities=flash,nofizzle +auto=lord(creature|myhand) flash forcedalive +auto=lord(other creature|mybattlefield) trample +text=Flash -- Surrak Dragonclaw can't be countered. -- Creature spells you control can't be countered. -- Other creatures you control have trample. +mana={2}{G}{U}{R} +type=Legendary Creature +subtype=Human Warrior +power=6 +toughness=6 +[/card] +[card] name=Surrak, the Hunt Caller auto=@each my combatbegins restriction{compare(powertotalinplay)~morethan~7}:haste target(creature|mybattlefield) ueot text=Formidable — At the beginning of combat on your turn, if creatures you control have total power 8 or greater, target creature you control gains haste until end of turn. @@ -91898,6 +93418,13 @@ power=2 toughness=1 [/card] [card] +name=Suspension Field +auto=may (blink)forsrc target(creature[toughness>=3]) +text=When Suspension Field enters the battlefield, you may exile target creature with toughness 3 or greater until Suspension Field leaves the battlefield. (That creature returns under its owner's control.) +mana={1}{W} +type=Enchantment +[/card] +[card] name=Sustainer of the Realm abilities=flying auto=@combat(blocking) source(this):0/2 ueot @@ -91999,6 +93526,18 @@ mana={U} type=Instant [/card] [card] +name=Swarm of Bloodflies +abilities=flying +auto=counter(1/1,2) +auto=@movedTo(other creature|graveyard) from(battlefield):counter(1/1,1) +text=Flying. -- Swarm of Bloodflies enters the battlefield with two +1/+1 counters on it. -- Whenever another creatures dies put a +1/+1 counter on Swarm of Bloodflies. +mana={4}{B} +type=Creature +subtype=Insect +power=0 +toughness=0 +[/card] +[card] name=Swarm of Rats auto=foreach(rat|myBattlefield) 1/0 text=Swarm of Rats's power is equal to the number of Rats you control. @@ -92085,6 +93624,16 @@ mana={W} type=Instant [/card] [card] +name=Swift Kick +target=creature|mybattlefield +auto=1/0 ueot +auto=transforms((,newability[target(creature|opponentbattlefield) dynamicability])) ueot +restriction=type(creature|opponentbattlefield)~morethan~0 +text=Target creature you control gets +1/+0 until end of turn. It fights target creature you don't control. +mana={3}{R} +type=Instant +[/card] +[card] name=Swift Maneuver target=creature,player auto=prevent:2 @@ -92112,6 +93661,15 @@ type=Artifact subtype=Equipment [/card] [card] +name=Swiftwater Cliffs +auto=tap +auto=life:1 +auto={T}:Add{U} +auto={T}:Add{R} +text=Swiftwater Cliffs enters the battlefield tapped. -- When Swiftwater Cliffs enters the battlefield, you gain 1 life. -- {T}: Add {U} or {R} to your mana pool. +type=Land +[/card] +[card] name=Swirling Sandstorm auto=aslongas(*|mygraveyard) lord(creature[-flying]) damage:5 >6 text=Threshold - Swirling Sandstorm deals 5 damage to each creature without flying if seven or more cards are in your graveyard. @@ -92764,6 +94322,13 @@ subtype=Aura abilities=split second [/card] [card] +name=Take up Arms +auto=token(Warrior,Creature Warrior,1/1,white)*3 +text=Put three 1/1 white Warrior creature tokens onto the battlefield. +mana={4}{W} +type=Instant +[/card] +[card] name=Takeno's Cavalry auto=bushido(1/1) auto={T}:damage:1 target(spirit[attacking;blocking]) @@ -94010,6 +95575,33 @@ power=5 toughness=5 [/card] [card] +name=Temur Ascendancy +auto=lord(creature|myBattlefield) haste +auto=@movedTo(creature[power>=4]|myBattlefield):may draw:1 controller +text=Creatures you control have haste. -- Whenever a creature with power 4 or greater enters the battlefield under your control, you may draw a card. +mana={G}{U}{R} +type=Enchantment +[/card] +[card] +name=Temur Banner +auto={T}: Add{G} +auto={T}: Add{U} +auto={T}: Add{R} +auto={G}{U}{R}{T}{S}:draw:1 controller +text={T}: Add {G},{U} or {R} to your mana pool. -- {G}{U}{R}, {T}, Sacrifice Temur Banner: Draw a card. +mana={3} +type=Artifact +[/card] +[card] +name=Temur Charm +auto=choice name(+1/+1 and fight) target(creature|mybattlefield) transforms((,newability[1/1 ueot],newability[target(creature|opponentbattlefield) dynamicability])) ueot restriction{type(creature|opponentbattlefield)~morethan~0} +auto=choice name(Mana Leak) target(*|stack) transforms((,newability[pay[[{3}]] name(pay 3 mana) donothing?fizzle])) forever restriction{type(*|stack)~morethan~0} +auto=choice name(Creatures power 3 or less cant block) all(creature[power>=3]) cantblock ueot +text=Choose one: -- Target creature you control gets +1/+1 until end of turn. That creature fights target creature you don't control. -- Counter target spell unless its controller pays {3}. -- Creatures with power 3 or less can't block this turn. +mana={R}{G}{U} +type=Instant +[/card] +[card] name=Tenacious Dead autograveyard=@movedto(this|mygraveyard) from(mybattlefield):all(trigger) transforms((,newability[name(Pay 1B) pay[[{1}{B}]] name(pay 1B mana) moveto(ownerbattlefield} && tap?name(cancel) donothing])) oneshot text=When Tenacious Dead dies, you may pay {1}{B}. If you do, return it to the battlefield tapped under its owner's control. @@ -95100,6 +96692,15 @@ power=1 toughness=1 [/card] [card] +name=Thornwood Falls +auto=tap +auto=life:1 +auto={T}:Add{G} +auto={T}:Add{U} +text=Thornwood Falls enters the battlefield tapped. -- When Thornwood Falls enters the battlefield, you gain 1 life. -- {T}: Add {G} or {U} to your mana pool. +type=Land +[/card] +[card] name=Thorn-Thrash Viashino auto=may target(other creature|mybattlefield) sacrifice && counter(1/1,2) all(this) auto={G}:trample @@ -95251,6 +96852,19 @@ mana={4}{WU}{WU} type=Instant [/card] [card] +name=Thousand Winds +abilities=flying +facedown={3} +autofacedown={5}{U}{U}:morph +autofaceup=moveTo(ownerhand) all(creature[tapped]) +text=Morph {5}{U}{U} (You may cast this card face down as a 2/2 creature for 3. Turn it face up any time for its morph cost.) -- When Thousand Winds is turned face up, return all other tapped creatures to their owner's hands. +mana={4}{U}{U} +type=Creature +subtype=Elemental +power=5 +toughness=6 +[/card] +[card] name=Thousand-legged Kami auto=@movedTo(this|mygraveyard) from(myBattlefield):may moveTo(myhand) target(other spirit[manacost<=7]|mygraveyard) text=Soulshift 7 (When this dies, you may return target Spirit card with converted mana cost 7 or less from your graveyard to your hand.) @@ -95558,6 +97172,14 @@ mana={2} type=Artifact [/card] [card] +name=Throttle +target=creature +auto=-4/-4 ueot +text=Target creature gets -4/-4 until end of turn. +mana={4}{B} +type=Instant +[/card] +[card] name=Thrull Retainer target=creature auto=1/1 @@ -96298,6 +97920,16 @@ mana={3}{U}{U} type=Sorcery [/card] [card] +name=Timely Hordemate +auto=if thisturn(creature[attacking]|mybattlefield)~morethan~0 then moveTo(mybattlefield) target(creature[manacost<=2]|mygraveyard) +text=Raid - When Timely Hordemate enters the battlefield, if you attacked with a creature this turn, return target creature card with converted mana cost 2 or less from your graveyard to the battlefield. +mana={3}{W} +type=Creature +subtype=Human Warrior +power=3 +toughness=2 +[/card] +[card] name=Timely Reinforcements auto=if type(creature|opponentbattlefield)~morethan~type(creature|mybattlefield) then token(Soldier,Creature Soldier,1/1,white)*3 auto=if compare(lifetotal)~lessthan~compare(opponentlifetotal) then life:6 @@ -96634,6 +98266,13 @@ mana={2}{B} type=Instant [/card] [card] +name=Tomb of the Spirit Dragon +auto={T}:Add{1} +auto={2}{T}:life:type:creature[-white;-blue;-black;-red;-green]:battlefield controller +text={T}: Add {1} to your mana pool. -- {2},{T}: You gain 1 life for each colorless creature you control. +type=Land +[/card] +[card] name=Tomb of Urami auto={T}:add{B} && aslongas(ogre|myBattlefield) damage:1 controller <1 auto={2}{B}{B}{T}:moveTo(mygraveyard) all(land|myBattlefield) && token(Urami,Legendary Creature Demon Spirit, 5/5,flying,black) @@ -96859,6 +98498,13 @@ mana={2}{B}{S(creature|mybattlefield)} type=Sorcery [/card] [card] +name=Tormenting Voice +auto=draw:2 +text=As an additional cost to cast Tormenting Voice, discard a card. -- Draw two cards. +mana={1}{R}{discard(*|myhand)} +type=Sorcery +[/card] +[card] name=Tormentor Exarch auto=choice 2/0 target(creature) ueot auto=choice 0/-2 target(creature) ueot @@ -97498,6 +99144,15 @@ mana={4}{BR} type=Sorcery [/card] [card] +name=Tranquil Cove +auto=tap +auto=life:1 +auto={T}:Add{W} +auto={T}:Add{U} +text=Tranquil Cove enters the battlefield tapped. -- When Tranquil Cove enters the battlefield, you gain 1 life. -- {T}: Add {W} or {U} to your mana pool. +type=Land +[/card] +[card] name=Tranquil Domain auto=destroy all(enchantment[-aura]) text=Destroy all non-Aura enchantments. @@ -97620,6 +99275,15 @@ power=1 toughness=3 [/card] [card] +name=Trap Essence +target=*[creature]|stack +auto=fizzle +auto=may counter(1/1,2) target(creature) +text=Counter target creature spell. Put two +1/+1 counters on up to one target creature. +mana={G}{U}{R} +type=Instant +[/card] +[card] name=Trapfinder's Trick target=player auto=name(see target hand)target(*|targetedpersonshand) donothing @@ -98831,6 +100495,26 @@ power=1 toughness=4 [/card] [card] +name=Tusked Colossodon +text= +mana={4}{G}{G} +type=Creature +subtype=Beast +power=6 +toughness=5 +[/card] +[card] +name=Tuskguard Captain +auto={G}{T}:counter(1/1,1) asSorcery +auto=lord(creature[counter{1/1.1}]|myBattlefield) trample +text=Outlast {G} ({G}, {T}: Put a +1/+1 counter on this creature. Outlast only as a sorcery.) -- Each creature you control with a +1/+1 counter on it has trample. +mana={2}{G} +type=Creature +subtype=Human Warrior +power=2 +toughness=3 +[/card] +[card] name=Twiddle auto=may tap target(artifact,creature,land) auto=may untap target(artifact,creature,land) @@ -99885,6 +101569,16 @@ power=2 toughness=2 [/card] [card] +name=Unyielding Krumar +auto={1}{W}:first strike ueot +text={1}{W}: Unyielding Krumar gains first strike until end of turn. +mana={3}{B} +type=Creature +subtype=Orc Warrior +power=3 +toughness=3 +[/card] +[card] name=Updraft target=creature auto=flying @@ -100307,6 +102001,14 @@ type=Enchantment subtype=Aura [/card] [card] +name=Utter End +target=*[-land] +auto=moveTo(exile) +text=Exile target nonland permanent. +mana={2}{W}{B} +type=Instant +[/card] +[card] name=Utvara Hellkite auto=@combat(attacking) source(creature[dragon]|myBattlefield):token(Dragon,Creature Dragon,6/6,red,flying) abilities=flying @@ -100399,6 +102101,16 @@ power=0 toughness=3 [/card] [card] +name=Valley Dasher +abilities=haste,mustattack +text=Haste -- Valley Dasher attacks each turn if able. +mana={1}{R} +type=Creature +subtype=Human Berserker +power=2 +toughness=2 +[/card] +[card] name=Valley Rannet autohand={2}{cycle}:name(mountaincycling or forestcycling) moveTo(myhand) target(mountain,forest|mylibrary) text=Mountaincycling {2}, forestcycling {2} ({2}, Discard this card: Search your library for a Mountain or Forest card, reveal it, and put it into your hand. Then shuffle your library.) @@ -101154,6 +102866,16 @@ power=2 toughness=3 [/card] [card] +name=Venerable Lammasu +abilities=flying +text=Flying +mana={6}{W} +type=Creature +subtype=Lammasu +power=5 +toughness=4 +[/card] +[card] name=Venerable Monk auto=life:2 controller text=When Venerable Monk enters the battlefield, you gain 2 life. @@ -104407,6 +106129,17 @@ power=7 toughness=6 [/card] [card] +name=War Behemoth +facedown={3} +autofacedown={4}{W}:morph +text=Morph {4}{W} (You may cast this card face down as a 2/2 creature for 3. Turn it face up any time for its morph cost.) +mana={5}{W} +type=Creature +subtype=Beast +power=3 +toughness=6 +[/card] +[card] name=War Dance auto=@each my upkeep:may counter(0/0,1,Verse) auto={S}:thisforeach(counter{0/0.1.Verse}) 1/1 target(creature) @@ -104472,6 +106205,17 @@ mana={3}{W} type=Instant [/card] [card] +name=War-Name Aspirant +auto=if thisturn(creature[attacking]|mybattlefield)~morethan~0 then counter(1/1,1) +auto=cantbeblockedby(creature[power<=1]) +text=Raid - War-Name Aspirant enters the battlefield with a +1/+1 counter on it if you attacked with a creature this turn. -- War-Name Aspirant can't be blocked by creatures with power 1 or less. +mana={1}{R} +type=Creature +subtype=Human Warrior +power=2 +toughness=1 +[/card] +[card] name=War-Spike Changeling abilities=changeling auto={R}:first strike @@ -104565,6 +106309,16 @@ power=2 toughness=2 [/card] [card] +name=Warden of the Eye +auto=moveTo(myhand) target(*[-creature;-land]|mygraveyard) +text=When Warden of the Eye enters the battlefield, return target noncreature, nonland card from your graveyard to your hand. +mana={2}{U}{R}{W} +type=Creature +subtype=Djinn Wizard +power=3 +toughness=3 +[/card] +[card] name=Warden of the Wall auto=tap auto={T}:Add{1} @@ -104928,6 +106682,14 @@ text={T}: Add {1} to your mana pool. -- {T}: Add {U} or {B} to your mana pool. W type=Land [/card] [card] +name=Waterwhirl +target=creature|battlefield +auto=moveTo(ownerhand) +text=Return up to two target creatures to their owners' hands. +mana={4}{U}{U} +type=Instant +[/card] +[card] name=Watery Grave auto=tap auto=pay({L:2}) untap @@ -105139,6 +106901,13 @@ power=5 toughness=3 [/card] [card] +name=Weave Fate +auto=draw:2 controller +text=Draw two cards. +mana={3}{U} +type=Instant +[/card] +[card] name=Web target=creature auto=reach @@ -105390,6 +107159,15 @@ power=3 toughness=3 [/card] [card] +name=Wetland Sambar +text= +mana={1}{U} +type=Creature +subtype=Elk +power=2 +toughness=1 +[/card] +[card] name=Whalebone Glider auto={2}{T}:flying target(creature[power<=3]) text={2}, {T}: Target creature with power 3 or less gains flying until end of turn. @@ -105641,6 +107419,17 @@ mana={2}{G}{G} type=Sorcery [/card] [card] +name=Whirlwind Adept +abilities=opponentshroud +auto=@movedTo(*[-creature]|mystack):1/1 ueot +text=Hexproof (This creature can't be the target of spells or abilities your opponents control.) -- Prowess (Whenever you cast a noncreature spell, this creature gets +1/+1 until end of turn.) +mana={4}{U} +type=Creature +subtype=Djinn Monk +power=4 +toughness=2 +[/card] +[card] name=Whispering Shade abilities=swampwalk auto={B}:1/1 @@ -106366,6 +108155,15 @@ mana={3}{W}{W} type=Sorcery [/card] [card] +name=Wind-Scarred Crag +auto=tap +auto=life:1 +auto={T}:Add{R} +auto={T}:Add{W} +text=Wind-Scarred Crag enters the battlefield tapped. -- When Wind-Scarred Crag enters the battlefield, you gain 1 life. -- {T}: Add {R} or {W} to your mana pool. +type=Land +[/card] +[card] name=Windscouter abilities=flying auto=@each combatends:moveTo(ownerhand) all(windscouter[attacking;blocking]|myBattlefield) @@ -106505,6 +108303,18 @@ power=1 toughness=1 [/card] [card] +name=Wingmate Roc +abilities=flying +auto=if thisturn(creature[attacking]|mybattlefield)~morethan~0 then token(Bird,Creature Bird,3/4,white,flying) +auto=@combat(attacking) source(this):life:type:creature[attacking]:battlefield controller +text=Flying. -- Raid - When Wingmate Roc enters the battlefield, if you attacked with a creature this turn, put a 3/4 white Bird creature token with flying onto the battlefield. -- Whenever Wingmate Roc attacks, you gain 1 life for each attacking creature. +mana={3}{W}{W} +type=Creature +subtype=Bird +power=3 +toughness=4 +[/card] +[card] name=Wingrattle Scarecrow auto=aslongas(creature[blue]|myBattlefield) flying auto=aslongas(creature[black]|myBattlefield) persist @@ -106859,6 +108669,17 @@ power=9 toughness=9 [/card] [card] +name=Witness of the Ages +facedown={3} +autofacedown={5}:morph +text=Morph {5} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) +mana={6} +type=Artifact Creature +subtype=Golem +power=4 +toughness=4 +[/card] +[card] name=Wit's End target=player auto=ability$!all(*|myhand) reject!$ targetedplayer @@ -107250,6 +109071,17 @@ power=2 toughness=2 [/card] [card] +name=Woolly Loxodon +facedown={3} +autofacedown={5}{G}:morph +text=Morph {5}{G} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) +mana={5}{G}{G} +type=Creature +subtype=Elephant Warrior +power=6 +toughness=7 +[/card] +[card] name=Woolly Mammoths auto=aslongas(land[snow]|myBattlefield) trample text=Woolly Mammoths has trample as long as you control a snow land. @@ -108977,6 +110809,18 @@ subtype=Human Wizard power=1 toughness=1 [/card] +[card] +name=Zurgo Helmsmasher +abilities=haste,mustattack +auto=this(variable{controllerturn}) indestructible +auto=@vampired(creature) from(this):counter(1/1,1) all(this) +text=Haste. -- Zurgo Helmsmasher attacks each combat if able. -- Zurgo Helmsmasher has indestructible as long as it is your turn. -- Whenever a creature dealt damage by Zurgo Helmsmasher dies, put a +1/+1 counter on Zurgo Helmsmasher. +mana={2}{R}{W}{B} +type=Legendary Creature +subtype=Orc Warrior +power=7 +toughness=2 +[/card] ##due to card type association dryad arbor is placed at the end. any other card that associates 2 super types in this manner should also ##be in the end of the primitive to avoid abilities like changling thinking that "forest" is a creature type. [card] name=Dryad Arbor From 636b07b3500a19384017a0b25f0650441ca94ed7 Mon Sep 17 00:00:00 2001 From: Xawotihs Date: Sat, 15 Aug 2015 23:29:47 +0200 Subject: [PATCH 029/249] Try to fix macosx branch deletion --- tools/build-macos-script.sh | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tools/build-macos-script.sh b/tools/build-macos-script.sh index 41bf6ebd4..48e49fc75 100755 --- a/tools/build-macos-script.sh +++ b/tools/build-macos-script.sh @@ -16,10 +16,8 @@ git remote set-url origin "https://${GH_TOKEN}@github.com/WagicProject/wagic.git ## Delete remote Travis-Mac branch (if any) export REMOTE=$(git branch -r | grep "origin/$TRAVIS_MAC_BRANCH\$") if test -n "$REMOTE" ; then - # Delete remote branch - git branch -r -D "origin/$TRAVIS_MAC_BRANCH" # Push (delete) remote branch on temote server (e.g. github) - git push origin ":$TRAVIS_MAC_BRANCH" + git push origin --delete "$TRAVIS_MAC_BRANCH" fi ## Create a new branch From e6514a8b3387d890805030049b351d8272f526ac Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sun, 16 Aug 2015 14:17:26 +0800 Subject: [PATCH 030/249] added gravecrawler gravecrawler is supported :) --- projects/mtg/bin/Res/sets/primitives/borderline.txt | 11 ----------- projects/mtg/bin/Res/sets/primitives/mtg.txt | 11 +++++++++++ 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/borderline.txt b/projects/mtg/bin/Res/sets/primitives/borderline.txt index fb52b39fb..37f37ddf5 100644 --- a/projects/mtg/bin/Res/sets/primitives/borderline.txt +++ b/projects/mtg/bin/Res/sets/primitives/borderline.txt @@ -86,17 +86,6 @@ mana={5}{U} type=Sorcery [/card] [card] -name=Gravecrawler -abilities=cantblock -autograveyard=aslongas(zombie|myBattlefield) {B}:name(cast from graveyard) activate name(cast from graveyard) castcard(normal) assorcery -text=Gravecrawler can't block. -- You may cast Gravecrawler from your graveyard as long as you control a Zombie. -mana={B} -type=Creature -subtype=Zombie -power=2 -toughness=1 -[/card] -[card] name=Ivy Seer auto={2}{G}{T}:foreach(*[green]|myhand) 1/1 target(creature) text={2}{G}, {T}: Reveal any number of green cards in your hand. Target creature gets +X/+X until end of turn, where X is the number of cards revealed this way. diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index c86547215..2ec88c39f 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -39626,6 +39626,17 @@ power=3 toughness=3 [/card] [card] +name=Gravecrawler +abilities=cantblock +autograveyard=aslongas(zombie|myBattlefield) transforms((,newability[CanPlayFromGraveyard])) +text=Gravecrawler can't block. -- You may cast Gravecrawler from your graveyard as long as you control a Zombie. +mana={B} +type=Creature +subtype=Zombie +power=2 +toughness=1 +[/card] +[card] name=Gravedigger auto=may moveTo(myhand) target(creature|mygraveyard) text=When Gravedigger enters the battlefield, you may return target creature card from your graveyard to your hand. From baa90fb605ec494c928cc7457f53374248ca9657 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sun, 16 Aug 2015 14:57:34 +0800 Subject: [PATCH 031/249] added Ral Zarek --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 10 ++++++++++ projects/mtg/bin/Res/sets/primitives/unsupported.txt | 7 ------- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 2ec88c39f..a5d7c8b7e 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -73497,6 +73497,16 @@ mana={2}{B} type=Sorcery [/card] [card] +name=Ral Zarek +auto={C(0/0,1,Loyalty)}:tap target(*) && ability$!untap target(*)!$ controller +auto={C(0/0,-2,Loyalty)}:damage:3 target(creature,player) +auto={C(0/0,-7,Loyalty)}:flipacoin winability turns:+1 controller winabilityend flipend && flipacoin winability turns:+1 controller winabilityend flipend && flipacoin winability turns:+1 controller winabilityend flipend && flipacoin winability turns:+1 controller winabilityend flipend && flipacoin winability turns:+1 controller winabilityend flipend +text=+1: Tap target permanent, then untap another target permanent. -- -2: Ral Zarek deals 3 damage to target creature or player. -- -7: Flip five coins. Take an extra turn after this one for each coin that comes up heads. +mana={2}{U}{R} +type=Planeswalker +subtype=Ral +[/card] +[card] name=Rally auto=lord(creature[blocking]) 1/1 text=Blocking creatures get +1/+1 until end of turn. diff --git a/projects/mtg/bin/Res/sets/primitives/unsupported.txt b/projects/mtg/bin/Res/sets/primitives/unsupported.txt index 3c72654be..c24eaa983 100644 --- a/projects/mtg/bin/Res/sets/primitives/unsupported.txt +++ b/projects/mtg/bin/Res/sets/primitives/unsupported.txt @@ -12877,13 +12877,6 @@ mana={R}{R} type=Enchantment [/card] [card] -name=Ral Zarek -text=+1: Tap target permanent, then untap another target permanent. -- -2: Ral Zarek deals 3 damage to target creature or player. -- -7: Flip five coins. Take an extra turn after this one for each coin that comes up heads. -mana={2}{U}{R} -type=Planeswalker -subtype=Ral -[/card] -[card] name=Raiding Party text=Raiding Party can't be the target of white spells or abilities from white sources. -- Sacrifice an Orc: Each player may tap any number of untapped white creatures he or she controls. For each creature tapped this way, that player chooses up to two Plains. Then destroy all Plains that weren't chosen this way by any player. mana={2}{R} From 2a1cb0348459ed58cf5988ac5ea806cb01e33fb6 Mon Sep 17 00:00:00 2001 From: Xawotihs Date: Sun, 16 Aug 2015 18:02:22 +0200 Subject: [PATCH 032/249] OMG what a stupid typo --- tools/build-macos-script.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/build-macos-script.sh b/tools/build-macos-script.sh index 48e49fc75..6d6ead026 100755 --- a/tools/build-macos-script.sh +++ b/tools/build-macos-script.sh @@ -14,7 +14,7 @@ git config --global user.email $GH_EMAIL git remote set-url origin "https://${GH_TOKEN}@github.com/WagicProject/wagic.git" ## Delete remote Travis-Mac branch (if any) -export REMOTE=$(git branch -r | grep "origin/$TRAVIS_MAC_BRANCH\$") +export REMOTE=$(git branch -r | grep "origin/$TRAVIS_MAC_BRANCH") if test -n "$REMOTE" ; then # Push (delete) remote branch on temote server (e.g. github) git push origin --delete "$TRAVIS_MAC_BRANCH" From 7d8fdbfd58030b1b1b515ea2f90983374de867b1 Mon Sep 17 00:00:00 2001 From: Xawotihs Date: Sun, 16 Aug 2015 18:24:57 +0200 Subject: [PATCH 033/249] Restored branch removal and added some debug --- tools/build-macos-script.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tools/build-macos-script.sh b/tools/build-macos-script.sh index 6d6ead026..a71a96af2 100755 --- a/tools/build-macos-script.sh +++ b/tools/build-macos-script.sh @@ -16,6 +16,9 @@ git remote set-url origin "https://${GH_TOKEN}@github.com/WagicProject/wagic.git ## Delete remote Travis-Mac branch (if any) export REMOTE=$(git branch -r | grep "origin/$TRAVIS_MAC_BRANCH") if test -n "$REMOTE" ; then + echo "Removing old $TRAVIS_MAC_BRANCH branch" + # Delete remote branch + git branch -r -D "origin/$TRAVIS_MAC_BRANCH" # Push (delete) remote branch on temote server (e.g. github) git push origin --delete "$TRAVIS_MAC_BRANCH" fi @@ -26,7 +29,6 @@ git checkout -q -b "$TRAVIS_MAC_BRANCH" "$TRAVIS_BRANCH" ## Write a new Travis-CI configuration file cp tools/macos.travis.yml .travis.yml git add .travis.yml -git rm appveyor.yml git commit -m "Auto-Updated Travis-CI configuration for Mac" ## Push new branch to remote server git push -q origin $TRAVIS_MAC_BRANCH:$TRAVIS_MAC_BRANCH 2> /dev/null > /dev/null From 07683480b454d3ae66abfddbb41e70c643ed7955 Mon Sep 17 00:00:00 2001 From: Xawotihs Date: Sun, 16 Aug 2015 18:41:36 +0200 Subject: [PATCH 034/249] build => release => tag => build ... --- appveyor.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/appveyor.yml b/appveyor.yml index f084c4475..b0a86032a 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -9,6 +9,9 @@ branches: # blacklist except: - travis_mac_osx +# Do not build on tags (GitHub only) +skip_tags: true + #---------------------------------# # environment configuration # #---------------------------------# From 8ce85636d98e517576e2250116dc60e44ca638a7 Mon Sep 17 00:00:00 2001 From: Xawotihs Date: Sun, 16 Aug 2015 20:52:10 +0200 Subject: [PATCH 035/249] More debug --- tools/build-macos-script.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tools/build-macos-script.sh b/tools/build-macos-script.sh index a71a96af2..da91c0a20 100755 --- a/tools/build-macos-script.sh +++ b/tools/build-macos-script.sh @@ -15,12 +15,14 @@ git remote set-url origin "https://${GH_TOKEN}@github.com/WagicProject/wagic.git ## Delete remote Travis-Mac branch (if any) export REMOTE=$(git branch -r | grep "origin/$TRAVIS_MAC_BRANCH") -if test -n "$REMOTE" ; then +if [ test -n "$REMOTE" ]; then echo "Removing old $TRAVIS_MAC_BRANCH branch" # Delete remote branch git branch -r -D "origin/$TRAVIS_MAC_BRANCH" # Push (delete) remote branch on temote server (e.g. github) git push origin --delete "$TRAVIS_MAC_BRANCH" +else + echo "No $TRAVIS_MAC_BRANCH to remove" fi ## Create a new branch From 8c6f694645b5a91b5fd84924c5c74b1bb3fb2b22 Mon Sep 17 00:00:00 2001 From: Xawotihs Date: Sun, 16 Aug 2015 21:11:41 +0200 Subject: [PATCH 036/249] Replaced suspicious test --- tools/build-macos-script.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/build-macos-script.sh b/tools/build-macos-script.sh index da91c0a20..ca3eec0d1 100755 --- a/tools/build-macos-script.sh +++ b/tools/build-macos-script.sh @@ -15,7 +15,7 @@ git remote set-url origin "https://${GH_TOKEN}@github.com/WagicProject/wagic.git ## Delete remote Travis-Mac branch (if any) export REMOTE=$(git branch -r | grep "origin/$TRAVIS_MAC_BRANCH") -if [ test -n "$REMOTE" ]; then +if [ "$REMOTE" = "origin/$TRAVIS_MAC_BRANCH" ]; then echo "Removing old $TRAVIS_MAC_BRANCH branch" # Delete remote branch git branch -r -D "origin/$TRAVIS_MAC_BRANCH" From 27ad95603457ced68c33d0e5833e70c9063d2c5a Mon Sep 17 00:00:00 2001 From: Xawotihs Date: Mon, 17 Aug 2015 21:57:29 +0200 Subject: [PATCH 037/249] More debug of the mac script --- tools/build-macos-script.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/build-macos-script.sh b/tools/build-macos-script.sh index ca3eec0d1..816d13b00 100755 --- a/tools/build-macos-script.sh +++ b/tools/build-macos-script.sh @@ -22,7 +22,7 @@ if [ "$REMOTE" = "origin/$TRAVIS_MAC_BRANCH" ]; then # Push (delete) remote branch on temote server (e.g. github) git push origin --delete "$TRAVIS_MAC_BRANCH" else - echo "No $TRAVIS_MAC_BRANCH to remove" + echo "$REMOTE : No $TRAVIS_MAC_BRANCH to remove" fi ## Create a new branch From e982ba50bea0d75893689944f8ab0582de450a13 Mon Sep 17 00:00:00 2001 From: Xawotihs Date: Mon, 17 Aug 2015 22:27:39 +0200 Subject: [PATCH 038/249] Removed a suspicous $ from the mac script --- tools/build-macos-script.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/build-macos-script.sh b/tools/build-macos-script.sh index 816d13b00..f284c2fb5 100755 --- a/tools/build-macos-script.sh +++ b/tools/build-macos-script.sh @@ -14,7 +14,7 @@ git config --global user.email $GH_EMAIL git remote set-url origin "https://${GH_TOKEN}@github.com/WagicProject/wagic.git" ## Delete remote Travis-Mac branch (if any) -export REMOTE=$(git branch -r | grep "origin/$TRAVIS_MAC_BRANCH") +export REMOTE=(git branch -r | grep "origin/$TRAVIS_MAC_BRANCH") if [ "$REMOTE" = "origin/$TRAVIS_MAC_BRANCH" ]; then echo "Removing old $TRAVIS_MAC_BRANCH branch" # Delete remote branch From 19c96e496bf0e6510dc2c4d595f95a2ca734d07b Mon Sep 17 00:00:00 2001 From: Xawotihs Date: Mon, 17 Aug 2015 23:03:53 +0200 Subject: [PATCH 039/249] More debug --- tools/build-macos-script.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/build-macos-script.sh b/tools/build-macos-script.sh index f284c2fb5..44d5df64b 100755 --- a/tools/build-macos-script.sh +++ b/tools/build-macos-script.sh @@ -14,7 +14,8 @@ git config --global user.email $GH_EMAIL git remote set-url origin "https://${GH_TOKEN}@github.com/WagicProject/wagic.git" ## Delete remote Travis-Mac branch (if any) -export REMOTE=(git branch -r | grep "origin/$TRAVIS_MAC_BRANCH") +echo git branches = `git branch -r` +export REMOTE=$(git branch -r | grep "origin/$TRAVIS_MAC_BRANCH") if [ "$REMOTE" = "origin/$TRAVIS_MAC_BRANCH" ]; then echo "Removing old $TRAVIS_MAC_BRANCH branch" # Delete remote branch From 62d42fb61f5f12e7fb4cfdf9ecf32dac9f8a42b9 Mon Sep 17 00:00:00 2001 From: Xawotihs Date: Mon, 17 Aug 2015 23:53:11 +0200 Subject: [PATCH 040/249] Removed local check of mac branch --- tools/build-macos-script.sh | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/tools/build-macos-script.sh b/tools/build-macos-script.sh index 44d5df64b..09a75aa90 100755 --- a/tools/build-macos-script.sh +++ b/tools/build-macos-script.sh @@ -15,16 +15,16 @@ git remote set-url origin "https://${GH_TOKEN}@github.com/WagicProject/wagic.git ## Delete remote Travis-Mac branch (if any) echo git branches = `git branch -r` -export REMOTE=$(git branch -r | grep "origin/$TRAVIS_MAC_BRANCH") -if [ "$REMOTE" = "origin/$TRAVIS_MAC_BRANCH" ]; then - echo "Removing old $TRAVIS_MAC_BRANCH branch" - # Delete remote branch - git branch -r -D "origin/$TRAVIS_MAC_BRANCH" +#export REMOTE=$(git branch -r | grep "origin/$TRAVIS_MAC_BRANCH") +#if [ "$REMOTE" = "origin/$TRAVIS_MAC_BRANCH" ]; then +# echo "Removing old $TRAVIS_MAC_BRANCH branch" +# # Delete remote branch +# git branch -r -D "origin/$TRAVIS_MAC_BRANCH" # Push (delete) remote branch on temote server (e.g. github) git push origin --delete "$TRAVIS_MAC_BRANCH" -else - echo "$REMOTE : No $TRAVIS_MAC_BRANCH to remove" -fi +#else +# echo "$REMOTE : No $TRAVIS_MAC_BRANCH to remove" +#fi ## Create a new branch git checkout -q -b "$TRAVIS_MAC_BRANCH" "$TRAVIS_BRANCH" From 59c0cf467f3bc2f0867361f9eff413112a84ddd8 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 20 Aug 2015 23:11:44 +0800 Subject: [PATCH 041/249] serum powder code serum powder second ability... Any time you could mulligan and Serum Powder is in your hand, you may exile all the cards from your hand, then draw that many cards. --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 8 ++++++ .../bin/Res/sets/primitives/unsupported.txt | 6 ----- projects/mtg/include/AllAbilities.h | 11 ++++++++ projects/mtg/include/GameObserver.h | 1 + projects/mtg/include/Player.h | 1 + projects/mtg/src/AllAbilities.cpp | 26 +++++++++++++++++++ projects/mtg/src/GameObserver.cpp | 7 +++++ projects/mtg/src/MTGAbility.cpp | 10 +++++++ projects/mtg/src/Player.cpp | 16 ++++++++++++ 9 files changed, 80 insertions(+), 6 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index a5d7c8b7e..b37e26f12 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -82616,6 +82616,14 @@ power=2 toughness=2 [/card] [card] +name=Serum Powder +auto={T}:Add{1} +autohand={0}:serumpowder +text={T}: Add {1} to your mana pool. -- Any time you could mulligan and Serum Powder is in your hand, you may exile all the cards from your hand, then draw that many cards. (You can do this in addition to taking mulligans.) +mana={3} +type=Artifact +[/card] +[card] name=Serum Tank auto=counter(0/0,1,Charge) auto=@movedTo(other artifact|Battlefield):counter(0/0,1,Charge) diff --git a/projects/mtg/bin/Res/sets/primitives/unsupported.txt b/projects/mtg/bin/Res/sets/primitives/unsupported.txt index c24eaa983..5d4a1bc3e 100644 --- a/projects/mtg/bin/Res/sets/primitives/unsupported.txt +++ b/projects/mtg/bin/Res/sets/primitives/unsupported.txt @@ -14506,12 +14506,6 @@ mana={W} type=Enchantment [/card] [card] -name=Serum Powder -text={T}: Add {1} to your mana pool. -- Any time you could mulligan and Serum Powder is in your hand, you may exile all the cards from your hand, then draw that many cards. (You can do this in addition to taking mulligans.) -mana={3} -type=Artifact -[/card] -[card] name=Serum Visions text=Draw a card. -- Scry 2. (To scry 2, look at the top two cards of your library, then put any number of them on the bottom of your library and the rest on top in any order.) mana={U} diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index f39949ba0..1e7d361cd 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -5540,6 +5540,17 @@ public: AAShuffle * clone() const; }; +//Mulligan +class AAMulligan: public ActivatedAbilityTP +{ +public: + AAMulligan(GameObserver* observer, int _id, MTGCardInstance * card, Targetable * _target, ManaCost * _cost = NULL, int who = + TargetChooser::UNSET); + int resolve(); + const string getMenuText(); + AAMulligan * clone() const; +}; + //Remove Mana From ManaPool class AARemoveMana: public ActivatedAbilityTP { diff --git a/projects/mtg/include/GameObserver.h b/projects/mtg/include/GameObserver.h index 5b3bfcbbe..25fcf745b 100644 --- a/projects/mtg/include/GameObserver.h +++ b/projects/mtg/include/GameObserver.h @@ -151,6 +151,7 @@ class GameObserver{ bool undo(); bool isLoading(){ return mLoading; }; void Mulligan(Player* player = NULL); + void serumMulligan(Player* player = NULL); Player* getPlayer(size_t index) { return players[index];}; bool isStarted() { return (mLayers!=NULL);}; RandomGenerator* getRandomGenerator() { return &randomGenerator; }; diff --git a/projects/mtg/include/Player.h b/projects/mtg/include/Player.h index 099b24604..66d66acd1 100644 --- a/projects/mtg/include/Player.h +++ b/projects/mtg/include/Player.h @@ -68,6 +68,7 @@ public: MTGInPlay * inPlay(); ManaPool * getManaPool(); void takeMulligan(); + void serumMulligan(); ManaCost * doesntEmpty; ManaCost * poolDoesntEmpty; void cleanupPhase(); diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index 26cd01faa..2acd7af90 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -2941,6 +2941,32 @@ AAShuffle * AAShuffle::clone() const return NEW AAShuffle(*this); } +// Mulligan +AAMulligan::AAMulligan(GameObserver* observer, int _id, MTGCardInstance * card, Targetable * _target, ManaCost * _cost, int who) : + ActivatedAbilityTP(observer, _id, card, _target, _cost, who) +{ +} + +int AAMulligan::resolve() +{ + Player * player = getPlayerFromTarget(getTarget()); + if (player) + { + player->serumMulligan(); + } + return 1; +} + +const string AAMulligan::getMenuText() +{ + return "Mulligan"; +} + +AAMulligan * AAMulligan::clone() const +{ + return NEW AAMulligan(*this); +} + // Remove Mana From ManaPool AARemoveMana::AARemoveMana(GameObserver* observer, int _id, MTGCardInstance * card, Targetable * _target, string manaDesc, int who) : ActivatedAbilityTP(observer, _id, card, _target, NULL, who) diff --git a/projects/mtg/src/GameObserver.cpp b/projects/mtg/src/GameObserver.cpp index 80fb9a0f4..2f77f9d36 100644 --- a/projects/mtg/src/GameObserver.cpp +++ b/projects/mtg/src/GameObserver.cpp @@ -1839,6 +1839,13 @@ void GameObserver::Mulligan(Player* player) player->takeMulligan(); } +void GameObserver::serumMulligan(Player* player) +{ + if(!player) player = currentPlayer; + logAction(player, "mulligan serum powder"); + player->serumMulligan(); +} + Player* GameObserver::createPlayer(const string& playerMode #ifdef TESTSUITE , TestSuiteGame* testgame diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index a4ad3f5e2..393ba8a19 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -2532,6 +2532,16 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG return a; } + //Serum Powder + found = s.find("serumpowder"); + if (found != string::npos) + { + Targetable * t = spell? spell->getNextTarget() : NULL; + MTGAbility * a = NEW AAMulligan(observer, id, card, t, NULL, who); + a->oneShot = 1; + return a; + } + //Remove Mana from ManaPool vector splitRemove = parseBetween(s, "removemana(", ")"); if (splitRemove.size()) diff --git a/projects/mtg/src/Player.cpp b/projects/mtg/src/Player.cpp index 2792c5a11..6cbb98dbd 100644 --- a/projects/mtg/src/Player.cpp +++ b/projects/mtg/src/Player.cpp @@ -217,6 +217,22 @@ void Player::takeMulligan() //Draw hand with 1 less card penalty //almhum } +void Player::serumMulligan() +{ + MTGPlayerCards * currentPlayerZones = game; + int cardsinhand = currentPlayerZones->hand->nb_cards; + for (int i = 0; i < cardsinhand; i++) //Exile + currentPlayerZones->putInZone(currentPlayerZones->hand->cards[0], + currentPlayerZones->hand, + currentPlayerZones->exile); + + currentPlayerZones->library->shuffle(); //Shuffle + + for (int i = 0; i < (cardsinhand); i++) + game->drawFromLibrary(); + //Draw hand no penalty +} + //Cleanup phase at the end of a turn void Player::cleanupPhase() { From 2679213121927b712f1bba8e2a56c9ba2d4905e3 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Fri, 21 Aug 2015 17:38:15 +0800 Subject: [PATCH 042/249] added FRF --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 1130 +++++++++++++++++- 1 file changed, 1129 insertions(+), 1 deletion(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index b37e26f12..601b4299d 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -510,6 +510,15 @@ power=2 toughness=3 [/card] [card] +name=Abzan Advantage +target=player +auto=ability$!name(sacrifice enchantment) notatarget(enchantment|myBattlefield) sacrifice!$ targetedplayer +auto=ability$!name(Bolster) notatarget(creature[toughness=toughness:lowest:creature:mybattlefield]|mybattlefield) counter(1/1,1)!$ controller +text=Target player sacrifices an enchantment. -- Bolster 1. (Choose a creature with the least toughness among creatures you control and put a +1/+1 counter on it.) +mana={1}{W} +type=Instant +[/card] +[card] name=Abzan Ascendancy auto=all(creature|mybattlefield) counter(1/1,1) auto=@movedto(creature[-token]|graveyard) from(mybattlefield):token(Spirit,Creature Spirit,1/1,white flying) controller @@ -539,6 +548,16 @@ power=3 toughness=2 [/card] [card] +name=Abzan Beastmaster +auto=@each my upkeep restriction{type(creature[toughness=toughness:highest:creature:Battlefield]|myBattlefield)~morethan~0}:draw:1 controller +text=At the beginning of your upkeep, draw a card if you control the creature with the greatest toughness or tied for the greatest toughness. +mana={2}{G} +type=Creature +subtype=Hound Shaman +power=2 +toughness=1 +[/card] +[card] name=Abzan Charm auto=choice name(Exile power 3 or more) moveTo(exile) target(creature[power>=3]|battlefield) auto=choice name(Draw 2 cards lose 2 life) draw:2 controller && life:-2 controller @@ -572,6 +591,37 @@ power=4 toughness=4 [/card] [card] +name=Abzan Kin-Guard +auto=aslongas(*[white;black]|mybattlefield) lifelink +text=Abzan Kin-Guard has lifelink as long as you control a white or black permanent. +mana={3}{G} +type=Creature +subtype=Human Warrior +power=3 +toughness=3 +[/card] +[card] +name=Abzan Runemark +target=creature +auto=2/2 +auto=aslongas(*[black;green]|mybattlefield):teach(creature) vigilance +text=Enchant creature. -- Enchanted creature gets +2/+2. -- Enchanted creature has vigilance as long as you control a black or green permanent. +mana={2}{W} +type=Enchantment +subtype=Aura +[/card] +[card] +name=Abzan Skycaptain +abilities=flying +auto=@movedTo(this|graveyard) from(battlefield):ability$!name(Bolster) notatarget(creature[toughness=toughness:lowest:creature:mybattlefield]|mybattlefield) counter(1/1,2)!$ controller +text=Flying. -- When Abzan Skycaptain dies, bolster 2. (Choose a creature with the least toughness among creatures you control and put two +1/+1 counters on it.) +mana={3}{W} +type=Creature +subtype=Bird Soldier +power=2 +toughness=2 +[/card] +[card] name=Academy Raider abilities=intimidate auto=@combatdamaged(player) from(this):if type(*|myhand)~morethan~0 then ability$!may reject notatarget(*|myhand) and!(draw:1)! !$ controller @@ -1270,6 +1320,17 @@ power=2 toughness=1 [/card] [card] +name=Ainok Guide +auto=choice name(+1/+1 counter) counter(1/1,1) +auto=choice name(search for a land) moveTo(ownerlibrary) notatarget(land[basic]|mylibrary) +text=When Ainok Guide enters the battlefield, choose one: -- Put a +1/+1 counter on Ainok Guide. -- Search your library for a basic land card, reveal it, then shuffle your library and put that card on top of it. +mana={1}{G} +type=Creature +subtype=Hound Scout +power=1 +toughness=1 +[/card] +[card] name=Ainok Tracker abilities=first strike facedown={3} @@ -1919,6 +1980,28 @@ power=2 toughness=2 [/card] [card] +name=Alesha, Who Smiles at Death +abilities=first strike +auto=@combat(attacking) source(this) restriction{type(creature[power<=2]|mygraveyard)~morethan~0}:pay({WB}{WB}) target(creature[power<=2]|mygraveyard) ninjutsu +text=First strike -- Whenever Alesha, Who Smiles at Death attacks, you may pay [W/B][W/B]. If you do, return target creature card with power 2 or less from your graveyard to the battlefield tapped and attacking. +mana={2}{R} +type=Legendary Creature +subtype=Human Warrior +power=3 +toughness=2 +[/card] +[card] +name=Alesha's Vanguard +other={2}{B} name(Dash) +auto=if paid(alternative) then transforms((,newability[haste],newability[phaseaction[endofturn sourceinplay] moveto(ownerhand) all(this)])) forever +text=Dash {2}{B} (You may cast this spell for its dash cost. If you do, it gains haste, and it's returned from the battlefield to its owner's hand at the beginning of the next end step.) +mana={3}{B} +type=Creature +subtype=Orc Warrior +power=3 +toughness=3 +[/card] +[card] name=Alexi, Zephyr Mage auto={X}{U}{T}{discard(*|myhand)}{discard(*|myhand)}:name(X = 0) donothing auto={1}{U}{T}{discard(*|myhand)}{discard(*|myhand)}:name(X = 1) target(creature) moveTo(ownerhand) @@ -2262,6 +2345,17 @@ power=2 toughness=2 [/card] [card] +name=Ambush Krotiq +abilities=trample +auto=moveTo(ownerhand) notatarget(other creature|myBattlefield) +text=Trample -- When Ambush Krotiq enters the battlefield, return another creature you control to its owner's hand. +mana={5}{G} +type=Creature +subtype=Insect +power=5 +toughness=5 +[/card] +[card] name=Ambush Party abilities=first strike,haste text=First strike, haste @@ -2593,6 +2687,16 @@ mana={5}{W}{W} type=Sorcery [/card] [card] +name=Ancestral Vengeance +target=creature +auto=-1/-1 +auto=counter(1/1,1) target(creature|mybattlefield) +text=When Ancestral Vengeance enters the battlefield, put a +1/+1 counter on target creature you control. -- Enchanted creature gets -1/-1. +mana={B}{B} +type=Enchantment +subtype=Aura +[/card] +[card] name=Ancient Amphitheater auto=tap auto=aslongas(giant|myHand) untap @@ -3592,6 +3696,16 @@ power=5 toughness=5 [/card] [card] +name=Arashin Cleric +auto=life:3 +text=When Arashin Cleric enters the battlefield, you gain 3 life. +mana={1}{W} +type=Creature +subtype=Human Cleric +power=1 +toughness=3 +[/card] +[card] name=Arbalest Elite auto={2}{W}{T}:damage:3 target(creature[attacking;blocking]) && all(this) frozen text={2}{W}, {T}: Arbalest Elite deals 3 damage to target attacking or blocking creature. Arbalest Elite doesn't untap during your next untap step. @@ -3775,6 +3889,13 @@ power=3 toughness=4 [/card] [card] +name=Arcbond +auto=target(creature) transforms((,newability[@damaged(this):damage:thatmuch all(other creature|battlefield)],newability[@damaged(this):damage:thatmuch all(player)])) ueot +text=Choose target creature. Whenever that creature is dealt damage this turn, it deals that much damage to each other creature and each player. +mana={2}{R} +type=Instant +[/card] +[card] name=Arcbound Bruiser auto=counter(1/1,3) auto=@movedTo(this|mygraveyard) from(myBattlefield):may thisforeach(counter{1/1.1}) counter(1/1,1) target(creature[artifact]) @@ -3970,6 +4091,16 @@ power=6 toughness=6 [/card] [card] +name=Archers of Qarsi +abilities=defender,reach +text=Defender -- Reach (This creature can block creatures with flying.) +mana={3}{G} +type=Creature +subtype=Naga Archer +power=5 +toughness=2 +[/card] +[card] name=Archers' Parapet abilities=defender auto={1}{B}{T}:life:-1 opponent @@ -5260,6 +5391,17 @@ power=2 toughness=2 [/card] [card] +name=Atarka, World Render +abilities=flying,trample +auto=lord(dragon|mybattlefield) transforms((,newability[@combat(attacking) source(this):double strike ueot])) +text=Flying,trample. -- Whenever a Dragon you control attacks, it gains double strike until end of turn. +mana={5}{R}}{G} +type=Legendary Creature +subtype=Dragon +power=6 +toughness=4 +[/card] +[card] name=Atog auto={S(artifact|myBattlefield)}:2/2 text=Sacrifice an artifact: Atog gets +2/+2 until end of turn. @@ -5965,6 +6107,16 @@ mana={1}{W}{W} type=Enchantment [/card] [card] +name=Aven Skirmisher +abilities=flying +text=Flying +mana={W} +type=Creature +subtype=Bird Warrior +power=1 +toughness=1 +[/card] +[card] name=Aven Smokeweaver abilities=flying,protection from red text=Flying, protection from red @@ -5985,6 +6137,18 @@ power=1 toughness=1 [/card] [card] +name=Aven Surveyor +abilities=flying +auto=choice name(+1/+1 counter) counter(1/1,1) +auto=choice name(bounce creature) moveto(ownerhand) target(creature) +text=Flying. -- When Aven Surveyor enters the battlefield, choose one: -- Put a +1/+1 counter on Aven Surveyor. -- Return target creature to its owners hand. +mana={3}{U}{U} +type=Creature +subtype=Bird Scout +power=2 +toughness=2 +[/card] +[card] name=Aven Trailblazer abilities=flying auto=aslongas(forest|myBattlefield) 0/1 @@ -7383,6 +7547,14 @@ power=2 toughness=1 [/card] [card] +name=Bathe in Dragonfire +target=creature +auto=damage:4 +text=Bathe in Dragonfire deals 4 damage to target creature. +mana={2}{R} +type=Sorcery +[/card] +[card] name=Bathe in Light target=creature auto=choice name(white) protection from white && all(creature[share!color!]) protection from white @@ -7481,6 +7653,17 @@ type=Artifact subtype=Equipment [/card] [card] +name=Battle Brawler +auto=aslongas(*[red;white]|mybattlefield) 1/0 +auto=aslongas(*[red;white]|mybattlefield) first strike +text=As long as you control a red or white permanent, Battle Brawler gets +1/+0 and has first strike. +mana={1}{B} +type=Creature +subtype=Orc Warrior +power=2 +toughness=2 +[/card] +[card] name=Battle Cry auto=untap all(creature[white]|mybattlefield) auto=all(creature|myBattlefield) transforms((,newability[@combat(blocking) source(this) once:0/1 ueot])) ueot @@ -7639,6 +7822,17 @@ power=2 toughness=2 [/card] [card] +name=Battlefront Krushok +abilities=oneblocker +auto=lord(creature[counter{1/1.1}]|myBattlefield) oneblocker +text=Battlefront Krushok can't be blocked by more than one creature. -- Each creature you control with a +1/+1 counter on it can't be blocked by more than one creature. +mana={4}{G} +type=Creature +subtype=Beast +power=3 +toughness=4 +[/card] +[card] name=Battlegate Mimic auto=@movedTo(*[red&white]|mystack) turnlimited:transforms((,setpower=4,settoughness=2,first strike)) ueot text=Whenever you cast a spell that's both red and white, Battlegate Mimic becomes 4/2 and gains first strike until end of turn. @@ -9845,6 +10039,17 @@ power=1 toughness=1 [/card] [card] +name=Bloodfire Enforcers +auto=aslongas(*[instant]|mygraveyard)aslongas(*[sorcery]|mygraveyard) first strike +auto=aslongas(*[instant]|mygraveyard)aslongas(*[sorcery]|mygraveyard) trample +text=Bloodfire Enforcers has first strike and trample as long as an instant card and a sorcery card are in your graveyard. +mana={3}{R} +type=Creature +subtype=Human Monk +power=5 +toughness=2 +[/card] +[card] name=Bloodfire Expert auto=@movedTo(*[-creature]|mystack):1/1 ueot text=Prowess (Whenever you cast a noncreature spell, this creature gets +1/+1 until end of turn.) @@ -11729,6 +11934,13 @@ mana={1}{W} type=Instant [/card] [card] +name=Break Through the Line +auto={R}:target(creature[power<=2]) transforms((,newability[haste ueot],newability[unblockable ueot])) ueot +text={R}:Target creature with power 2 or less gains haste until end of turn and can't be blocked this turn. +mana={1}{R} +type=Enchantment +[/card] +[card] name=Breath of Darigaaz kicker={2} auto=damage:1 all(creature[-flying]) @@ -12929,6 +13141,13 @@ power=4 toughness=4 [/card] [card] +name=Cached Defenses +auto=ability$!name(Bolster) notatarget(creature[toughness=toughness:lowest:creature:mybattlefield]|mybattlefield) counter(1/1,3)!$ controller +text=Bolster 3. (Choose a creature with the least toughness among creatures you control and put three +1/+1 counters on it.) +mana={2}{G} +type=Sorcery +[/card] +[card] name=Cackling Counterpart target=creature|mybattlefield auto=clone @@ -16100,6 +16319,14 @@ mana={2}{R} type=Enchantment [/card] [card] +name=Citadel Siege +auto=choice name(Khans) transforms((,newability[counter(0/0.1.Khans)],newability[@each my combatbegins:counter(1/1.2) target(creature|mybattlefield)])) forever +auto=choice name(Dragons) transforms((,newability[counter(0/0.1.Dragons)],newability[@each opponent combatbegins:tap target(creature|opponentbattlefield)])) forever +text=As Citadel Siege enters the battlefield, choose Khans or Dragons. -- ? Khans ? At the beginning of combat on your turn, put two +1/+1 counters on target creature you control. -- ? Dragons ? At the beginning of combat on each opponent's turn, tap target creature that player controls. +mana={2}{W}{W} +type=Enchantment +[/card] +[card] name=Citanul Centaurs abilities=shroud auto=upcost[{3}{G};next upkeep] sacrifice @@ -17279,6 +17506,14 @@ mana={3}{R} type=Enchantment [/card] [card] +name=Collateral Damage +target=creature,player +auto=damage:3 +text=As an additional cost to cast Collateral Damage, sacrifice a creature. -- Reckless Abandon deals 3 damage to target creature or player. +mana={R}{S(creature|mybattlefield)} +type=Instant +[/card] +[card] name=Collective Blessing auto=lord(creature|mybattlefield) 3/3 text=Creatures you control get +3/+3. @@ -19533,6 +19768,14 @@ type=Tribal Instant subtype=Giant [/card] [card] +name=Crux of Fate +auto=choice name(destroy dragons) destroy all(creature[dragon]) +auto=choice name(destroy non-dragons) destroy all(creature[-dragon]) +text=Choose one: -- Destroy all Dragon creatures. -- Destroy all non-Dragon creatures. +mana={3}{B}{B} +type=Sorcery +[/card] +[card] name=Cryoclasm target=plains,island auto=destroy @@ -19875,6 +20118,16 @@ power=0 toughness=1 [/card] [card] +name=Cunning Strike +target=creature +auto=damage:2 +auto=damage:2 target(player) +auto=draw:1 +text=Cunning Strike deals 2 damage to target creature and 2 damage to target player. -- Draw a card. +mana={3}{U}{R} +type=Instant +[/card] +[card] name=Cuombajj Witches auto={T}:damage:1 target(creature,player) && ability$!target(creature,player|mybattlefield) damage:1!$ opponent text={T}: Cuombajj Witches deals 1 damage to target creature or player and 1 damage to target creature or player of an opponent's choice. @@ -22491,6 +22744,17 @@ power=1 toughness=1 [/card] [card] +name=Defiant Ogre +auto=choice name(+1/+1 counter) counter(1/1,1) +auto=choice name(destroy artifact) target(artifact) destroy +text=When Defiant Ogre enters the battlefield, choose one: -- Put a +1/+1 counter on Defiant Ogre. -- Destroy target artifact. +mana={5}{R} +type=Creature +subtype=Ogre Warrior +power=3 +toughness=5 +[/card] +[card] name=Defiant Stand target=creature auto=1/3 @@ -23165,6 +23429,17 @@ type=Enchantment subtype=Aura [/card] [card] +name=Destructor Dragon +abilities=flying +auto=@movedTo(this|graveyard) from(Battlefield):destroy target(*[-creature]) +text=Flying -- When Destructor Dragon dies, destroy target noncreature permanent. +mana={4}{G}{G} +type=Creature +subtype=Dragon +power=4 +toughness=4 +[/card] +[card] name=Detainment Spell target=creature auto=noactivatedability @@ -23662,6 +23937,15 @@ power=4 toughness=4 [/card] [card] +name=Diplomacy of the Wastes +target=opponent +auto=if type(*[-land]|targetedpersonshand)~lessthan~1 then name(look) donothing notatarget(*|targetedpersonshand) else reject notatarget(*[-land]|targetedpersonshand) +auto=if type(*[warrior]|mybattlefield)~morethan~0 then life:-2 targetedplayer +text=Target opponent reveals his or her hand. You choose a nonland card from it. That player discards that card. If you control a Warrior, that player loses 2 life. +mana={2}{B} +type=Sorcery +[/card] +[card] name=Diplomatic Immunity abilities=shroud target=creature @@ -24782,6 +25066,17 @@ mana={5} type=Artifact [/card] [card] +name=Dragon Bell Monk +abilities=vigilance +auto=@movedTo(*[-creature]|mystack):1/1 ueot +text=Vigilance. -- Prowess (Whenever you cast a noncreature spell, this creature gets +1/+1 until end of turn.) +mana={2}{W} +type=Creature +subtype=Human Monk +power=2 +toughness=2 +[/card] +[card] name=Dragon Blood auto={3}{T}:counter(1/1,1) target(creature) text={3}, {T}: Put a +1/+1 counter on target creature. @@ -25056,6 +25351,14 @@ power=1 toughness=1 [/card] [card] +name=Dragonrage +auto=foreach(creature[attacking}|mybattlefield) add{R} +auto=emblem transforms((,newability[lord(creature[attacking]|mybattlefield) {R}:1/0 ueot])) ueot +text=Add {R} to your mana pool for each attacking creature you control. Until end of turn, attacking creatures you control gain "{R}: This creature gets +1/+0 until end of turn." +mana={2}{R} +type=Instant +[/card] +[card] name=Dragonscale Boon target=creature auto=counter(1/1,2) @@ -25065,6 +25368,16 @@ mana={3}{G} type=Instant [/card] [card] +name=Dragonscale General +auto=@each my end:ability$!name(Bolster) counter(1/1,type:creature[tapped]:mybattlefield) notatarget(creature[toughness=toughness:lowest:creature:mybattlefield])!$ controller +text=At the beginning of your end step, bolster X, where X is the number of tapped creatures you control. (Choose a creature with the least toughness among creatures you control and put X +1/+1 counters on it.) +mana={3}{W} +type=Creature +subtype=Human Warrior +power=2 +toughness=3 +[/card] +[card] name=Dragonskull Summit auto=tap auto=aslongas(mountain,swamp|myBattlefield) untap @@ -25835,6 +26148,17 @@ mana={W}{U}{B} type=Instant [/card] [card] +name=Dromoka, the Eternal +abilities=flying +auto=@combat(attacking) source(dragon|mybattlefield):ability$!name(Bolster) notatarget(creature[toughness=toughness:lowest:creature:mybattlefield]|mybattlefield) counter(1/1,2)!$ controller +text=Flying -- Whenever a Dragon you control attacks, bolster 2. (Choose a creature with the least toughness among creatures you control and put two +1/+1 counters on it.) +mana={3}{G}{W} +type=Legendary Creature +subtype=Dragon +power=5 +toughness=5 +[/card] +[card] name=Dromosaur auto=@combat(blocking,blocked,turnlimited) source(this):2/-2 ueot text=Whenever Dromosaur blocks or becomes blocked, it gets +2/-2 until end of turn. @@ -27715,6 +28039,17 @@ power=2 toughness=2 [/card] [card] +name=Elite Scaleguard +auto=ability$!name(Bolster) notatarget(creature[toughness=toughness:lowest:creature:mybattlefield]|mybattlefield) counter(1/1,2)!$ controller +auto=@combat(attacking) source(creature[counter{1/1.1}]|mybattlefield):tap target(creature|opponentbattlefield) +text=When Elite Scaleguard enters the battlefield, bolster 2. (Choose a creature with the least toughness among creatures you control and put two +1/+1 counters on it.) -- Whenever a creature you control with a +1/+1 counter on it attacks, tap target creature defending player controls. +mana={4}{W} +type=Creature +subtype=Human Soldier +power=2 +toughness=3 +[/card] +[card] name=Elite Skirmisher auto=@targeted(this) from(*[instant;sorcery;enchantment]|myhand,mygraveyard):may tap target(creature) text=Heroic -- Whenever you cast a spell that targets Elite Skirmisher, you may tap target creature. @@ -28942,6 +29277,14 @@ power=2 toughness=2 [/card] [card] +name=Enhanced Awareness +auto=draw:3 +auto=reject notatarget(*|myhand) +text=Draw three cards, then discard a card. +mana={4}{U} +type=Instant +[/card] +[card] name=Enlightened Tutor auto=moveTo(ownerlibrary) notatarget(artifact,enchantment|mylibrary) text=Search your library for an artifact or enchantment card and reveal that card. Shuffle your library, then put the card on top of it. @@ -31201,6 +31544,14 @@ mana={5} type=Artifact [/card] [card] +name=Fascination +auto=choice name(each player draws) Draw:X all(player) +auto=choice name(each player mills) deplete:X all(player) +text=Choose one: -- Each player draws X cards. -- Each player puts the top X cards of his or her library into his or her graveyard. +mana={X}{U}{U} +type=Sorcery +[/card] +[card] name=Fastbond alias=1243 text=You may play any number of additional lands on each of your turns. -- Whenever you play a land, if it wasn't the first land you played this turn, Fastbond deals 1 damage to you. @@ -31405,6 +31756,14 @@ type=Enchantment subtype=Aura [/card] [card] +name=Fearsome Awakening +target=creature|mygraveyard +auto=moveto(mybattlefield) && transforms((,newability[if cantargetcard(dragon) then counter(1/1.2)])) oneshot +text=Return target creature card from your graveyard to the battlefield. If it's a Dragon, put two +1/+1 counters on it. +mana={4}{B} +type=Sorcery +[/card] +[card] name=Fearsome Temper target=creature auto=2/2 @@ -31733,6 +32092,15 @@ type=Enchantment subtype=Aura [/card] [card] +name=Feral Krushok +text= +mana={4}{G} +type=Creature +subtype=Beast +power=5 +toughness=4 +[/card] +[card] name=Feral Lightning auto=token(Elemental,Creature Elemental,3/1,red,haste,unearth)*3 text=Put three 3/1 red Elemental creature tokens with haste onto the battlefield. Exile them at the beginning of the next end step. @@ -32968,6 +33336,17 @@ power=4 toughness=2 [/card] [card] +name=Flamewake Phoenix +abilities=Flying,haste,mustattack +autograveyard=@each my combatbegins restriction{type(creature[power>=4]|mybattlefield)~morethan~0}:pay({R}) name(Pay {R} to return phoenix) moveTo(mybattlefield) +text=Flying, haste. -- Flamewake Phoenix attacks each turn if able. -- Ferocious - At the beginning of combat on your turn, if you control a creature with power 4 or greater, you may pay {R}. If you do, return Flamewake Phoenix from your graveyard to the battlefield. +mana={1}{R}{R} +type=Creature +subtype=Phoenix +power=2 +toughness=2 +[/card] +[card] name=Flamewave Invoker auto={7}{R}:Damage:5 target(player) text={7}{R}: Flamewave Invoker deals 5 damage to target player. @@ -34844,6 +35223,16 @@ power=1 toughness=1 [/card] [card] +name=Frontier Mastodon +auto=if type(creature[power>=4]|mybattlefield)~morethan~0 then counter(1/1,1) +text=Ferocious - Frontier Mastodon enters the battlefield with a +1/+1 counter on it if you control a creature with power 4 or greater. +mana={2}{G} +type=Creature +subtype=Elephant +power=3 +toughness=2 +[/card] +[card] name=Frontline Sage abilities=exalted auto={u}{T}:draw:1 && transforms((,newability[target(*|myhand) reject])) forever @@ -34902,6 +35291,16 @@ power=5 toughness=3 [/card] [card] +name=Frost Walker +auto=@targeted(this):sacrifice +text=When Frost Walker becomes the target of a spell or ability, sacrifice it. +mana={1}{U} +type=Creature +subtype=Elemental +power=4 +toughness=1 +[/card] +[card] name=Frostburn Weird auto={UR}:1/-1 text={UR}: Frostburn Weird gets +1/-1 until end of turn. @@ -34982,6 +35381,15 @@ type=Enchantment subtype=Aura [/card] [card] +name=Fruit of the First Tree +target=creature|mybattlefield +auto=@movedto(mytgt|graveyard) from(Battlefield):choice life:toughness controller && draw:toughness controller +text=Enchant creature you control -- When enchanted creature dies, you gain X life and draw X cards, where X is its toughness. +mana={3}{G} +type=Enchantment +subtype=Aura +[/card] +[card] name=Fruition auto=life:type:forest:battlefield text=You gain 1 life for each Forest on the battlefield. @@ -37911,6 +38319,14 @@ mana={1}{R} type=Enchantment [/card] [card] +name=Goblin Boom Keg +auto=@each my upkeep:sacrifice +auto=@movedTo(this|graveyard) from(battlefield):damage:3 target(creature,player) +text=At the beginning of your upkeep, sacrifice Goblin Boom Keg. -- When Goblin Boom Keg is put into a graveyard from the battlefield, it deals 3 damage to target creature or player. +mana={4} +type=Artifact +[/card] +[card] name=Goblin Brawler abilities=first strike auto=cantbetargetof(equipment) @@ -38227,6 +38643,18 @@ mana={R}{S(goblin|mybattlefield)} type=Sorcery [/card] [card] +name=Goblin Heelcutter +auto=@combat(attacking) source(this):cantblock target(creature) ueot +other={2}{R} name(Dash) +auto=if paid(alternative) then transforms((,newability[haste],newability[phaseaction[endofturn sourceinplay] moveto(ownerhand) all(this)])) forever +text=Dash {2}{R} (You may cast this spell for its dash cost. If you do, it gains haste, and it's returned from the battlefield to its owner's hand at the beginning of the next end step.) -- Whenever Goblin Heelcutter attacks, target creature can't block this turn. +mana={3}{R} +type=Creature +subtype=Goblin Berserker +power=3 +toughness=2 +[/card] +[card] name=Goblin Hero mana={2}{R} type=Creature @@ -39214,6 +39642,14 @@ power=7 toughness=6 [/card] [card] +name=Gore Swine +mana={2}{R} +type=Creature +subtype=Boar +power=4 +toughness=1 +[/card] +[card] name=Gore Vassal auto={S}:target(creature) transforms((,newability[counter(-1/-1,1)],newability[if cantargetcard(creature[power>=1]) then regenerate])) forever text=Sacrifice Gore Vassal: Put a -/1-1 counter on target creature. Then, if that creature's toughness is 1 or greater, regenerate it. @@ -39594,6 +40030,15 @@ power=1 toughness=1 [/card] [card] +name=Grave Strength +target=creature +auto=deplete:3 +auto=foreach(creature|mygraveyard) counter(1/1,1) +text=Choose target creature. Put the top three cards of your library into your graveyard, then put a +1/+1 counter on that creature for each creature card in your graveyard. +mana={1}{B} +type=Sorcery +[/card] +[card] name=Grave Titan abilities=deathtouch auto=token(Zombie,Creature Zombie,2/2,black)*2 @@ -40000,6 +40445,14 @@ type=Artifact subtype=Equipment [/card] [card] +name=Great-Horn Krushok +mana={4}{W} +type=Creature +subtype=Beast +power=3 +toughness=5 +[/card] +[card] name=Greed auto={L:2}{B}:draw:1 text={B}, Pay 2 life: Draw a card. @@ -40237,6 +40690,15 @@ text={T}: Add 1 to your mana pool. -- {2}{B}{G},{T},Sacrifice a creature: Draw a type=Land [/card] [card] +name=Grim Contest +target=creature|mybattlefield +auto=transforms((,newability[target(creature|opponentbattlefield) dynamicability])) ueot +restriction=type(creature|opponentbattlefield)~morethan~0 +text=Choose target creature you control and target creature an opponent controls. Each of those creatures deals damage equal to its toughness to the other. +mana={1}{B}{G} +type=Instant +[/card] +[card] name=Grim Feast auto=@each my upkeep:damage:1 controller auto=@movedTo(creature|opponentgraveyard) from(battlefield):all(trigger[to]) dynamicability @@ -41992,6 +42454,15 @@ mana={2}{W} type=Sorcery [/card] [card] +name=Harsh Sustenance +target=creature,player +auto=damage:type:creature:mybattlefield +auto=life:type:creature:mybattlefield controller +text=Harsh Sustenance deals X damage to target creature or player and you gain X life, where X is the number of creatures you control. +mana={1}{W}{B} +type=Instant +[/card] +[card] name=Haru-Onna auto=draw:1 controller auto=@movedto(arcane,spirit|mystack):may moveto(ownerhand) @@ -42297,7 +42768,7 @@ toughness=3 [/card] [card] name=Hazezon Tamar -auto=@next my upkeep:foreach(land|myBattlefield) token(Sand Warrior,Creature Sand Warrior,1/1,red,green,white) +auto=phaseaction[my upkeep once]: token(Sand Warrior,Creature Sand Warrior,1/1,red,green,white)*type:land:mybattlefield auto=@movedTo(this|nonbattlezone) from(battlefield):moveto(exile) all(sand warrior) text=When Hazezon Tamar enters the battlefield, put X 1/1 Sand Warrior creature tokens that are red, green, and white onto the battlefield at the beginning of your next upkeep, where X is the number of lands you control at that time. -- When Hazezon leaves the battlefield, exile all Sand Warriors. mana={4}{R}{G}{W} @@ -43301,6 +43772,16 @@ power=4 toughness=2 [/card] [card] +name=Hero's Blade +auto={4}:equip +auto=3/2 +auto=@movedto(creature[legendary]|mybattlefield):may all(trigger[to]) retarget +text=Equipped creature gets +3/+2. -- Whenever a legendary creature enters the battlefield under your control, you may attach Hero's Blade to it. +mana={2} +type=Artifact +subtype=Equipment +[/card] +[card] name=Hero's Demise target=creature[legendary] auto=destroy @@ -43360,6 +43841,16 @@ mana={1}{U} type=Enchantment [/card] [card] +name=Hewed Stone Retainers +restriction=casted a spell +text=Cast Hewed Stone Retainers only if you've cast another spell this turn. +mana={3} +type=Artifact Creature +subtype=Golem +power=4 +toughness=4 +[/card] +[card] name=Hex target=<6>creature auto=destroy @@ -44132,6 +44623,14 @@ power=1 toughness=1 [/card] [card] +name=Honor's Reward +auto=life:4 controller +auto=ability$!name(Bolster) notatarget(creature[toughness=toughness:lowest:creature:mybattlefield]|mybattlefield) counter(1/1,2)!$ controller +text=You gain 4 life. Bolster 2. (Choose a creature with the least toughness among creatures you control and put two +1/+1 counters on it.) +mana={2}{W} +type=Instant +[/card] +[card] name=Honor-Worn Shaku auto={T}:add{1} auto={T(*[legendary]|mybattlefield)}:untap @@ -44140,6 +44639,17 @@ mana={3} type=Artifact [/card] [card] +name=Hooded Assassin +auto=choice name(+1/+1 counter) counter(1/1,1) +auto=choice name(destroy damaged creature) destroy target(creature[damaged]|battlefield) +text=When Hooded Assassin enters the battlefield, choose one: -- Put a +1/+1 counter on Hooded Assassin. -- Destroy target creature that was dealt damage this turn. +mana={2}{B} +type=Creature +subtype=Human Assassin +power=1 +toughness=2 +[/card] +[card] name=Hooded Hydra facedown={3} autofacedown={3}{G}{G}:morph @@ -44725,6 +45235,16 @@ power=2 toughness=2 [/card] [card] +name=Humble Defector +auto={T}:draw:2 controller && transforms((,newability[choice target(opponent) && moveto(targetedpersonsbattlefield) all(this)])) forever myturnonly +text={T}: Draw two cards. Target opponent gains control of Humble Defector. Activate this ability only during your turn. +mana={1}{R} +type=Creature +subtype=Human Rogue +power=2 +toughness=1 +[/card] +[card] name=Humbler of Mortals auto=all(creature|myBattlefield) trample ueot auto=@movedTo(enchantment|myBattlefield):all(creature|myBattlefield) trample ueot @@ -47937,6 +48457,17 @@ mana={3} type=Artifact [/card] [card] +name=Jeskai Barricade +abilities=flash,defender +auto=may name(bounce target creature you control) moveTo(ownerhand) target(other creature|myBattlefield) +text=Flash (You may cast this spell any time you could cast an instant.) -- Defender -- When Jeskai Barricade enters the battlefield, you may return another target creature you control to its owner's hand. +mana={1}{W} +type=Creature +subtype=Wall +power=0 +toughness=4 +[/card] +[card] name=Jeskai Charm auto=choice name(top of library) moveTo(ownerLibrary) target(creature) auto=choice name(4 damage) damage:4 target(opponent) @@ -47957,6 +48488,27 @@ power=1 toughness=2 [/card] [card] +name=Jeskai Runemark +target=creature +auto=2/2 +auto=aslongas(*[red;white]|mybattlefield):teach(creature) flying +text=Enchant creature -- Enchanted creature gets +2/+2. -- Enchanted creature has flying as long as you control a red or white permanent. +mana={2}{U} +type=Enchantment +subtype=Aura +[/card] +[card] +name=Jeskai Sage +auto=@movedto(*[-creature]|mystack):1/1 ueot +auto=@movedto(this|graveyard) from(mybattlefield):draw:1 controller +text=Prowess (Whenever you cast a noncreature spell, this creature gets +1/+1 until end of turn.) -- When Jeskai Sage dies, draw a card. +mana={1}{U} +type=Creature +subtype=Human Monk +power=1 +toughness=1 +[/card] +[card] name=Jeskai Student auto=@movedTo(*[-creature]|mystack):1/1 ueot text=Prowess (Whenever you cast a noncreature spell, this creature gets +1/+1 until end of turn.) @@ -51267,6 +51819,19 @@ power=5 toughness=5 [/card] [card] +name=Kolaghan, the Storm's Fury +abilities=flying +auto=@combat(attacking) source(dragon|mybattlefield):all(creature|mybattlefield) 1/0 ueot +other={3}{R}{B} name(Dash) +auto=if paid(alternative) then transforms((,newability[haste],newability[phaseaction[endofturn sourceinplay] moveto(ownerhand) all(this)])) forever +text=Flying. -- Whenever a Dragon you control attacks, creatures you control get +1/+0 until end of turn. -- Dash {3}{B}{R} (You may cast this spell for its dash cost. If you do, it gains haste, and it's returned from the battlefield to its owner's hand at the beginning of the next end step.) +mana={3}{B}}{R} +type=Legendary Creature +subtype=Dragon +power=4 +toughness=5 +[/card] +[card] name=Konda, Lord of Eiganjo abilities=vigilance,indestructible auto=bushido(5/5) @@ -53975,6 +54540,17 @@ power=2 toughness=1 [/card] [card] +name=Lightning Shrieker +abilities=flying,trample,haste +auto=@each endofturn:moveto(ownerlibrary) && shuffle +text=Flying, trample, haste. -- At the beginning of the end step, Lightning Shrieker's owner shuffles it into his or her library. +mana={4}{R} +type=Creature +subtype=Dragon +power=5 +toughness=5 +[/card] +[card] name=Lightning Strike target=creature,player auto=damage:3 @@ -54887,6 +55463,17 @@ power=1+* toughness=1+* [/card] [card] +name=Lotus Path Djinn +abilities=flying +auto=@movedTo(*[-creature]|mystack):1/1 ueot +text=Flying. -- Prowess (Whenever you cast a noncreature spell, this creature gets +1/+1 until end of turn.) +mana={3}{U} +type=Creature +subtype=Djinn Monk +power=2 +toughness=3 +[/card] +[card] name=Lost Soul abilities=swampwalk text=Swampwalk @@ -54981,6 +55568,17 @@ text=If Lotus Vale would enter the battlefield, sacrifice two untapped lands ins type=Land [/card] [card] +name=Lotus-Eye Mystics +auto=@movedTo(*[-creature]|mystack):1/1 ueot +auto=choice moveTo(myhand) target(enchantment|mygraveyard) +text=Prowess (Whenever you cast a noncreature spell, this creature gets +1/+1 until end of turn.) -- When Lotus-Eye Mystics enters the battlefield, return target enchantment card from your graveyard to your hand. +mana={3}{W} +type=Creature +subtype=Human Monk +power=3 +toughness=2 +[/card] +[card] name=Lovisa Coldeyes auto=lord(warrior,berserker,other barbarian) 2/2 auto=lord(warrior,berserker,other barbarian) haste @@ -56790,6 +57388,14 @@ type=Enchantment subtype=Aura [/card] [card] +name=Map the Wastes +auto=moveTo(myBattlefield) and!(tap)! notatarget(land[basic]|myLibrary) +auto=ability$!name(Bolster) notatarget(creature[toughness=toughness:lowest:creature:mybattlefield]|mybattlefield) counter(1/1,1)!$ controller +text=Search your library for a basic land card and put that card onto the battlefield tapped. Then shuffle your library. -- Bolster 1. (Choose a creature with the least toughness among creatures you control and put a +1/+1 counter on it.) +mana={2}{G} +type=Sorcery +[/card] +[card] name=Marauding Knight abilities=protection from white auto=foreach(Plains|opponentBattlefield) 1/1 @@ -56963,6 +57569,39 @@ power=5 toughness=4 [/card] [card] +name=Mardu Runemark +target=creature +auto=2/2 +auto=aslongas(*[white;black]|mybattlefield):teach(creature) first strike +text=Enchant creature. -- Enchanted creature gets +2/+2. -- Enchanted creature has first strike as long as you control a white or black permanent. +mana={2}{R} +type=Enchantment +subtype=Aura +[/card] +[card] +name=Mardu Scout +other={1}{R} name(Dash) +auto=if paid(alternative) then transforms((,newability[haste],newability[phaseaction[endofturn sourceinplay] moveto(ownerhand) all(this)])) forever +text=Dash {1}{R} (You may cast this spell for its dash cost. If you do, it gains haste, and it's returned from the battlefield to its owner's hand at the beginning of the next end step.) +mana={R}{R} +type=Creature +subtype=Goblin Scout +power=3 +toughness=1 +[/card] +[card] +name=Mardu Shadowspear +auto=@combat(attacking) source(this):life:-1 opponent +other={1}{B} name(Dash) +auto=if paid(alternative) then transforms((,newability[haste],newability[phaseaction[endofturn sourceinplay] moveto(ownerhand) all(this)])) forever +text=Whenever Mardu Shadowspear attacks, each opponent loses 1 life. -- Dash {1}{B} (You may cast this spell for its dash cost. If you do, it gains haste, and it's returned from the battlefield to its owner's hand at the beginning of the next end step.) +mana={B} +type=Creature +subtype=Human Warrior +power=1 +toughness=1 +[/card] +[card] name=Mardu Skullhunter auto=tap auto=if thisturn(creature[attacking]|mybattlefield)~morethan~0 then target(opponent) ability$!name(discard) target(*|myhand) reject!$ targetedplayer @@ -56974,6 +57613,18 @@ power=2 toughness=1 [/card] [card] +name=Mardu Strike Leader +auto=@combat(attacking) source(this):token(Warrior,Creature Warrior,2/1,black) controller +other={3}{B} name(Dash) +auto=if paid(alternative) then transforms((,newability[haste],newability[phaseaction[endofturn sourceinplay] moveto(ownerhand) all(this)])) forever +text=Whenever Mardu Strike Leader attacks, put a 2/1 black Warrior creature token onto the battlefield. -- Dash {3}{B} (You may cast this spell for its dash cost. If you do, it gains haste, and it's returned from the battlefield to its owner's hand at the beginning of the next end step.) +mana={2}{B} +type=Creature +subtype=Human Warrior +power=3 +toughness=2 +[/card] +[card] name=Mardu Warshrieker auto=if thisturn(creature[attacking]|mybattlefield)~morethan~0 then Add{R}{W}{B} text=Raid - When Mardu Warshrieker enters the battlefield, if you attacked with a creature this turn, add {R}{W}{B} to your mana pool. @@ -56984,6 +57635,17 @@ power=3 toughness=3 [/card] [card] +name=Mardu Woe-Reaper +auto=may moveTo(Exile) target(creature|graveyard) && life:1 controller +auto=@movedTo(warrior|myBattlefield):may moveTo(Exile) target(creature|graveyard) && life:1 controller +text=Whenever Mardu Woe-Reaper or another Warrior enters the battlefield under your control, you may exile target creature card from a graveyard. If you do, you gain 1 life. +mana={W} +type=Creature +subtype=Human Warrior +power=2 +toughness=1 +[/card] +[card] name=Marhault Elsdragon auto=rampage(1/1,1) text=Rampage 1 (Whenever this creature becomes blocked, it gets +1/+1 until end of turn for each creature blocking it beyond the first.) @@ -58459,6 +59121,17 @@ mana={4}{W}{B} type=Sorcery [/card] [card] +name=Merciless Executioner +auto=sacrifice notatarget(creature|mybattlefield) +auto=ability$! sacrifice notatarget(creature|mybattlefield) !$ opponent +text=When Merciless Executioner enters the battlefield, each player sacrifices a creature. +mana={2}{B} +type=Creature +subtype=Orc Warrior +power=3 +toughness=1 +[/card] +[card] name=Mercy Killing target=creature auto=sacrifice && token(Elf Warrior,Creature Elf Warrior,1/1,green white)*power targetcontroller @@ -59475,6 +60148,17 @@ mana={4}{R} type=Enchantment [/card] [card] +name=Mindscour Dragon +abilities=flying +auto=@combatdamaged(opponent) from(this):deplete:4 target(player) +text=Flying -- Whenever Mindscour Dragon deals combat damage to an opponent, target player puts the top 4 cards of his or her library into his or her graveyard. +mana={4}{U}{U} +type=Creature +subtype=Dragon +power=4 +toughness=4 +[/card] +[card] name=Mindslicer auto=@movedto(this|graveyard) from(battlefield):reject all(*|hand) text=When Mindslicer dies, each player discards his or her hand. @@ -60124,6 +60808,17 @@ power=0 toughness=0 [/card] [card] +name=Mistfire Adept +auto=@movedTo(*[-creature]|mystack):1/1 ueot +auto=@movedTo(*[-creature]|mystack):target(creature) flying ueot +text=Prowess (Whenever you cast a noncreature spell, this creature gets +1/+1 until end of turn.) -- Whenever you cast a noncreature spell, target creature gains flying until end of turn. +mana={3}{U} +type=Creature +subtype=Human Monk +power=3 +toughness=3 +[/card] +[card] name=Mistfire Weaver abilities=flying facedown={3} @@ -60396,6 +61091,14 @@ mana={1}{R} type=Sorcery [/card] [card] +name=Mob Rule +auto=choice name(Power 4 or greater) all(creature[power>=4]|opponentbattlefield) transforms((,newability[moveTo(opponentbattlefield)],newability[phaseaction[endofturn sourceinplay] moveTo(ownerbattlefield)],newability[untap],haste)) ueot +auto=choice name(Power 3 or less) all(creature[power<=3]|opponentbattlefield) transforms((,newability[moveTo(opponentbattlefield)],newability[phaseaction[endofturn sourceinplay] moveTo(ownerbattlefield)],newability[untap],haste)) ueot +text=Choose one: --Gain control of all creatures with power 4 or greater until end of turn. Untap those creatures. They gain haste until end of turn. --Gain control of all creatures with power 3 or less until end of turn. Untap those creatures. They gain haste until end of turn. +mana={4}{R}{R} +type=Sorcery +[/card] +[card] name=Mobile Fort abilities=defender auto={3}:3/-1 && canattack ueot limit:1 @@ -60875,6 +61578,27 @@ power=0 toughness=5 [/card] [card] +name=Monastery Mentor +auto=@movedTo(*[-creature]|mystack):1/1 ueot +auto=@movedTo(*[-creature]|mystack):choice name(Create Monk) token(-391883) controller +text=Prowess (Whenever you cast a noncreature spell, this creature gets +1/+1 until end of turn.) -- Whenever you cast a noncreature spell, put a 1/1 white Monk creature token with prowess onto the battlefield. +mana={2}{W} +type=Creature +subtype=Human Monk +power=2 +toughness=2 +[/card] +[card] +name=Monk Token +auto=@movedTo(*[-creature]|mystack):1/1 ueot +text=Prowess (Whenever you cast a noncreature spell, this creature gets +1/+1 until end of turn.) +color=white +type=Creature +subtype=Monk +power=1 +toughness=1 +[/card] +[card] name=Monastery Swiftspear abilities=haste auto=@movedTo(*[-creature]|mystack):1/1 ueot @@ -63779,6 +64503,14 @@ type=Artifact subtype=Equipment [/card] [card] +name=Neutralizing Blast +target=*[multicolor]|stack +auto=fizzle +text=Counter target multicolored spell. +mana={1}{U} +type=Instant +[/card] +[card] name=Nevermaker abilities=flying other={3}{U} name(Evoke) @@ -64896,6 +65628,17 @@ power=0 toughness=0 [/card] [card] +name=Noxious Dragon +abilities=flying +auto=@movedTo(this|graveyard) from(Battlefield):may destroy target(creature[manacost<=3]) +text=Flying -- When Noxious Dragon dies, you may destroy target creature with converted mana cost 3 or less. +mana={4}{B}{B} +type=Creature +subtype=Dragon +power=4 +toughness=4 +[/card] +[card] name=Noxious Field target=land|myBattlefield auto=teach(land) {T}:damage:1 all(creature,player) @@ -65733,6 +66476,17 @@ power=1 toughness=3 [/card] [card] +name=Ojutai, Soul of Winter +abilities=flying,vigilance +auto=@combat(attacking) source(dragon|mybattlefield):name(tap & Freeze) target(*[-land]|opponentbattlefield) transforms((,newability[tap],newability[frozen])) uynt +text=Flying, vigilance. -- Whenever a Dragon you control attacks, Tap target nonland permament your opponents control. It doesn't untap during its controller's next untap step. +mana={5}{W}}{U} +type=Legendary Creature +subtype=Dragon +power=5 +toughness=6 +[/card] +[card] name=Okiba-Gang Shinobi auto=@combatdamaged(opponent) from(this):ability$!name(discard 2 cards) target(<2>*|myhand) reject!$ opponent autohand={3}{B}{N}:ninjutsu @@ -66273,6 +67027,16 @@ power=2 toughness=2 [/card] [card] +name=Orc Sureshot +auto=@movedTo(other creature|myBattlefield):target(creature|opponentbattlefield) -1/-1 ueot +text=Whenever another creature enters the battlefield under your control, target creature an opponent controls gets -1/-1 until end of turn. +mana={3}{B} +type=Creature +subtype=Orc Archer +power=4 +toughness=2 +[/card] +[card] name=Orcish Artillery auto={T}:damage:2 target(creature,player) && damage:3 controller text={T}: Orcish Artillery deals 2 damage to target creature or player and 3 damage to you. @@ -67272,6 +68036,14 @@ power=5 toughness=4 [/card] [card] +name=Palace Siege +auto=choice name(Khans) transforms((,newability[counter(0/0.1.Khans)],newability[@each my upkeep:moveto(myhand) target(creature|mygraveyard)])) forever +auto=choice name(Dragons) transforms((,newability[counter(0/0.1.Dragons)],newability[@each my upkeep:life:-2 opponent && life:2 controller])) forever +As Palace Siege enters the battlefield, choose Khans or Dragons. -- ? Khans ? At the beginning of your upkeep, return target creature card from your graveyard to your hand. -- ? Dragons ? At the beginning of your upkeep, each opponent loses 2 life and you gain 2 life. +mana={3}{B}{B} +type=Enchantment +[/card] +[card] name=Paladin en-Vec abilities=first strike,protection from black,protection from red text=First strike, protection from black and from red (This creature deals combat damage before creatures without first strike. It can't be blocked, targeted, dealt damage, or enchanted by anything black or red.) @@ -69504,6 +70276,16 @@ power=1 toughness=1 [/card] [card] +name=Pilgrim of the Fires +abilities=first strike,trample +text=First strike, Trample +mana={7} +type=Artifact Creature +subtype=Golem +power=6 +toughness=4 +[/card] +[card] name=Pilgrim's Eye abilities=flying auto=may moveTo(ownerhand) target(land[basic]|mylibrary) @@ -70807,6 +71589,15 @@ mana={2}{W}{W} type=Sorcery [/card] [card] +name=Pressure Point +target=creature +auto=tap +auto=draw:1 controller +text=Tap target creature. -- Draw a card. +mana={1}{W} +type=Instant +[/card] +[card] name=Pretender's Claim target=creature auto=@combat(blocked,turnlimited) source(mytgt):tap all(land|opponentbattlefield) @@ -73514,6 +74305,14 @@ mana={W}{W} type=Instant [/card] [card] +name=Rally the Ancestors +auto=moveTo(exile) +auto=moveTo(mybattlefield) all(creature[manacost<=X]|mygraveyard) and!( transforms((,newability[phaseaction[my upkeep sourceinplay]:moveto(exile)])) forever )! +text=Return each creature card with converted mana cost X or less from your graveyard to the battlefield. Exile those creatures at the beginning of your next upkeep. Exile Rally the Ancestors. +mana={X}{W}{W} +type=Instant +[/card] +[card] name=Rally the Forces auto=all(creature[attacking]) 1/0 auto=all(creature[attacking]) first strike @@ -74374,6 +75173,14 @@ type=Tribal Instant subtype=Treefolk [/card] [card] +name=Reach of Shadows +target=creature[white;blue;black;red;green] +auto=destroy +text=Destroy target creature that's one or more colors. +mana={4}{B} +type=Instant +[/card] +[card] name=Reach Through Mists auto=draw:1 text=Draw a card. @@ -74946,6 +75753,15 @@ type=Enchantment subtype=Aura [/card] [card] +name=Refocus +target=creature +auto=untap +auto=draw:1 controller +text=Untap target creature. Draw a card. +mana={1}{U} +type=Instant +[/card] +[card] name=Reforge the Soul auto=reject all(*|hand) auto=draw:7 opponent @@ -75869,6 +76685,15 @@ mana={2}{W}{W} type=Instant [/card] [card] +name=Return to the Earth +auto=choice name(artifact) destroy target(artifact|battlefield) restriction{type(artifact|battlefield)~morethan~0} +auto=choice name(enchantment) destroy target(enchantment|battlefield) restriction{type(enchantment|battlefield)~morethan~0} +auto=choice name(Creature with Flying) destroy target(creature[flying]|battlefield) restriction{type(creature[flying]|battlefield)~morethan~0} +text=Destroy target artifact, enchantment, or creature with flying. +mana={3}{G} +type=Instant +[/card] +[card] name=Returned Centaur auto=deplete:4 target(player) text=When Returned Centaur enters the battlefield, target player puts the top four cards of his or her library into his or her graveyard. @@ -78537,6 +79362,14 @@ power=2 toughness=1 [/card] [card] +name=Ruthless Instincts +auto=choice name(reach and deathtouch) target(creature[-attacking]) transforms((,newability[reach ueot],newability[deathtouch ueot],newability[untap])) ueot +auto=choice name(+2/+2 and Trample) target(creature[attacking]) transforms((,newability[2/2 ueot],newability[trample ueot])) ueot +text=Choose one: -- Target nonattacking creature gains reach and deathtouch until end of turn. Untap it. -- Target attacking creature gets +2/+2 and gains trample until end of turn. +mana={2}{G} +type=Instant +[/card] +[card] name=Ruthless Invasion auto=all(creature[-artifact]) cantblock text=({p(R)} may be paid for with either {R} or 2 life.) -- Nonartifact creatures can't block this turn. @@ -79264,6 +80097,14 @@ power=3 toughness=4 [/card] [card] +name=Sandblast +target=creature[attacking;blocking] +auto=damage:5 +text=Sandblast deals 5 damage to target attacking creature or blocking creature. +mana={2}{W} +type=Instant +[/card] +[card] name=Sands of Delirium auto={x}{T}:deplete:x target(player) text={X}, {T}: Target player puts the top X cards of his or her library into his or her graveyard. @@ -79300,6 +80141,28 @@ text=Sandsteppe Citadel enters the battlefield tapped. -- {T}: Add {W}, {B}, or type=Land [/card] [card] +name=Sandsteppe Mastodon +abilities=Reach +auto=ability$!name(Bolster) notatarget(creature[toughness=toughness:lowest:creature:mybattlefield]|mybattlefield) counter(1/1,5)!$ controller +text=When Sandsteppe Mastodon enters the battlefield Bolster 5 (Choose a creature with the least toughness or tied with the least toughness among creatures you control. Put 5 +1/+1 counters on it.) +mana={5}{G}{G} +type=Creature +subtype=Elephant +power=5 +toughness=5 +[/card] +[card] +name=Sandsteppe Outcast +auto=choice name(+1/+1 counter) counter(1/1,1) +auto=choice name(Spirit Token) token(Spirit,Creature Spirit,1/1,white,flying) +text=When Sandsteppe Outcast enters the battlefield, choose one: -- Put a +1/+1 counter on Sandsteppe Outcast. -- Put a 1/1 white Spirit creature token with flying onto the battlefield. +mana={2}{W} +type=Creature +subtype=Human Warrior +power=2 +toughness=1 +[/card] +[card] name=Sandstone Deadfall auto={T}{S(land|myBattlefield)}{S(land|myBattlefield)}{S}:destroy target(creature[attacking]) text={T}, Sacrifice two lands and Sandstone Deadfall: Destroy target attacking creature. @@ -80940,6 +81803,14 @@ mana={2} type=Artifact [/card] [card] +name=Scroll of the Masters +auto=@movedTo(*[-creature]|mystack):counter (0/0,Lore) all(this) +auto={3}{T}:thisforeach(counter{0/0.1.Lore}) 1/1 target(creature|mybattlefield) ueot +text=Whenever you cast a noncreature spell, put a lore counter on Scroll of the Masters. -- {3}{T}: Target creature you control gets +1/+1 until end of turn for each lore counter on Scroll of the Masters. +mana={2} +type=Artifact +[/card] +[card] name=Scroll Thief auto=@combatdamaged(player) from(this):draw:1 text=Whenever Scroll Thief deals combat damage to a player, draw a card. @@ -83022,6 +83893,26 @@ power=3 toughness=2 [/card] [card] +name=Shaman of the Great Hunt +abilities=haste +auto=lord(creature|mybattlefield) transforms((,newability[@combatdamaged(player) from(this):counter(1/1.1) all(this)])) +auto={2}{GU}{GU}:foreach(creature[power>=4]|mybattlefield) draw:1 +text=Haste -- Whenever a creature you control deals combat damage to a player, put a +1/+1 counter on it. -- Ferocious ? {2}{G/U}{G/U}: Draw a card for each creature you control with power 4 or greater. +mana={3}{R} +type=Creature +subtype=Orc Shaman +power=4 +toughness=2 +[/card] +[card] +name=Shamanic Revelation +auto=draw:type:creature:mybattlefield +auto=foreach(creature[power>=4]|mybattlefield) life:4 +text=Draw a card for each creature you control. -- Ferocious ? You gain 4 life for each creature you control with power 4 or greater. +mana={3}{G}{G} +type=Sorcery +[/card] +[card] name=Shambleshark abilities=flash auto=evolve @@ -83902,6 +84793,17 @@ power=1 toughness=1 [/card] [card] +name=Shockmaw Dragon +abilities=flying +auto=@combatdamaged(opponent) from(this):all(creature|opponentbattlefield) damage:1 +text=Flying -- Whenever Shockmaw Dragon deals combat damage to a player, it deals 1 damage to each creature that player controls. +mana={4}{R}{R} +type=Creature +subtype=Dragon +power=4 +toughness=4 +[/card] +[card] name=Shore Snapper auto={U}:islandwalk text={U}: Shore Snapper gains islandwalk until end of turn. @@ -84278,6 +85180,17 @@ power=2 toughness=4 [/card] [card] +name=Shu Yun, the Silent Tempest +auto=@movedTo(*[-creature]|mystack):1/1 ueot +auto=@movedTo(*[-creature]|mystack):name(Pay {RW}{RW} for Double Strike) pay({RW}{RW}) name(double Strike) target(creature) double strike ueot +text=Prowess (Whenever you cast a noncreature spell, this creature gets +1/+1 until end of turn.) -- Whenever you cast a noncreature spell, you may pay Red or WhiteRed or White. If you do, target creature gains double strike until end of turn. +mana={2}{U} +type=Legendary Creature +subtype=Human Monk +power=3 +toughness=2 +[/card] +[card] name=Shuko auto={0}:equip auto=1/0 @@ -84308,6 +85221,16 @@ power=5 toughness=6 [/card] [card] +name=Sibsig Host +auto=choice all(player) deplete:3 +text=When Sibsig Host enters the battlefield, each player puts the top three cards of his or her library into his or her graveyard. +mana={4}{B} +type=Creature +subtype=Zombie +power=2 +toughness=6 +[/card] +[card] name=Sick and Tired target=<2>creature auto=-1/-1 @@ -84766,6 +85689,17 @@ power=3 toughness=3 [/card] [card] +name=Silumgar, the Drifting Death +abilities=flying,opponentshroud +auto=@combat(attacking) source(dragon|mybattlefield):all(creature|opponentbattlefield) -1/-1 ueot +text=Flying,hexproof. -- Whenever a Dragon you control attacks, creatures defending player control each get -1/-1 until end of turn. +mana={4}{U}{B} +type=Legendary Creature +subtype=Dragon +power=3 +toughness=7 +[/card] +[card] name=Silver Drake abilities=flying auto=moveTo(ownerhand) notatarget(creature[white;blue]|myBattlefield) @@ -87153,6 +88087,16 @@ text=Smoldering Crater enters the battlefield tapped. -- {T}: Add {R} to your ma type=Land [/card] [card] +name=Smoldering Efreet +auto=@movedto(this|graveyard) from(battlefield):damage:2 controller +text=When Smoldering Efreet dies, it deals 2 damage to you. +mana={1}{R} +type=Creature +subtype=Efreet Monk +power=2 +toughness=2 +[/card] +[card] name=Smoldering Spires auto=tap auto=cantblock target(creature) ueot @@ -92639,6 +93583,14 @@ mana={3}{R} type=Instant [/card] [card] +name=Sudden Reclamation +auto=deplete:4 controller +auto=transforms((,newability[ability$!notatarget(creature|mygraveyard) moveto(ownerhand)!$ controller],newability[ability$!notatarget(land|mygraveyard) moveto(ownerhand)!$ controller])) oneshot +text=Put the top four cards of your library into your graveyard, then return a creature card and a land card from your graveyard to your hand. +mana={3}{G} +type=Instant +[/card] +[card] name=Sudden Shock target=creature,player auto=damage:2 @@ -92752,6 +93704,26 @@ power=3 toughness=4 [/card] [card] +name=Sultai Runemark +target=creature +auto=2/2 +auto=aslongas(*[green;blue]|mybattlefield):teach(creature) deathtouch +text=Enchant creature. -- Enchanted creature gets +2/+2. -- Enchanted creature has deathtouch as long as you control a green or blue permanent. +mana={2}{B} +type=Enchantment +subtype=Aura +[/card] +[card] +name=Sultai Skullkeeper +auto=deplete:2 controller +text=When Sultai Skullkeeper enters the battlefield, put the top two cards of your library into your graveyard. +mana={1}{U} +type=Creature +subtype=Naga Shaman +power=2 +toughness=1 +[/card] +[card] name=Summer Bloom auto=maxPlay(land)+3 text=You may play up to three additional lands this turn. @@ -93219,6 +94191,15 @@ mana={1}{W} type=Instant [/card] [card] +name=Supplant Form +target=creature +auto=moveTo(ownerhand) +auto=clone +text=Return target creature to its owner's hand. You put a token onto the battlefield that's a copy of that creature. +mana={4}{U}{U} +type=Instant +[/card] +[card] name=Supply-Line Cranes auto=counter(1/1,1) target(creature) text=When Supply-Line Cranes enters the battlefield, put a +1/+1 counter on target creature. @@ -95622,6 +96603,15 @@ mana={3} type=Artifact [/card] [card] +name=Temur Battle Rage +target=creature +auto=double strike ueot +auto=if type(creature[power>=4]|mybattlefield)~morethan~0 then trample ueot +text=Target creature gains double strike until end of turn. (It deals both first-strike and regular combat damage.) -- Ferocious - That creature also gains trample until end of turn if you control a creature with power 4 or greater. +mana={1}{R} +type=Instant +[/card] +[card] name=Temur Charm auto=choice name(+1/+1 and fight) target(creature|mybattlefield) transforms((,newability[1/1 ueot],newability[target(creature|opponentbattlefield) dynamicability])) ueot restriction{type(creature|opponentbattlefield)~morethan~0} auto=choice name(Mana Leak) target(*|stack) transforms((,newability[pay[[{3}]] name(pay 3 mana) donothing?fizzle])) forever restriction{type(*|stack)~morethan~0} @@ -95631,6 +96621,26 @@ mana={R}{G}{U} type=Instant [/card] [card] +name=Temur Runemark +target=creature +auto=2/2 +auto=aslongas(*[blue;red]|mybattlefield):teach(creature) trample +text=Enchant creature. -- Enchanted creature gets +2/+2. -- Enchanted creature has trample as long as you control a blue or red permanent. +mana={2}{G} +type=Enchantment +subtype=Aura +[/card] +[card] +name=Temur Sabertooth +auto={H(other creature|mybattlefield)}{1}{G}:indestructible ueot +text={1}{G}: You may return another creature you control to its owner's hand. If you do, Temur Sabertooth gains indestructible until end of turn. +mana={2}{G}{G} +type=Creature +subtype=Cat +power=4 +toughness=3 +[/card] +[card] name=Tenacious Dead autograveyard=@movedto(this|mygraveyard) from(mybattlefield):all(trigger) transforms((,newability[name(Pay 1B) pay[[{1}{B}]] name(pay 1B mana) moveto(ownerbattlefield} && tap?name(cancel) donothing])) oneshot text=When Tenacious Dead dies, you may pay {1}{B}. If you do, return it to the battlefield tapped under its owner's control. @@ -100740,6 +101750,47 @@ power=2 toughness=4 [/card] [card] +name=Ugin, the Spirit Dragon +auto=counter(0/0,7,loyalty) +auto={C(0/0,2,Loyalty)}:name(+2: damage 3) damage:3 target(creature,player) +auto={C(0/0,-0,Loyalty)}:name(X=0) moveto(exile) all(*[white;blue;black;red;green;manacost<=0]) +auto={C(0/0,-1,Loyalty)}:name(X=1) moveto(exile) all(*[white;blue;black;red;green;manacost<=1]) +auto={C(0/0,-2,Loyalty)}:name(X=2) moveto(exile) all(*[white;blue;black;red;green;manacost<=2]) +auto={C(0/0,-3,Loyalty)}:name(X=3) moveto(exile) all(*[white;blue;black;red;green;manacost<=3]) +auto={C(0/0,-4,Loyalty)}:name(X=4) moveto(exile) all(*[white;blue;black;red;green;manacost<=4]) +auto={C(0/0,-5,Loyalty)}:name(X=5) moveto(exile) all(*[white;blue;black;red;green;manacost<=5]) +auto={C(0/0,-6,Loyalty)}:name(X=6) moveto(exile) all(*[white;blue;black;red;green;manacost<=6]) +auto={C(0/0,-7,Loyalty)}:name(X=7) moveto(exile) all(*[white;blue;black;red;green;manacost<=7]) +auto={C(0/0,-8,Loyalty)}:name(X=8) moveto(exile) all(*[white;blue;black;red;green;manacost<=8]) +auto={C(0/0,-9,Loyalty)}:name(X=9) moveto(exile) all(*[white;blue;black;red;green;manacost<=9]) +auto={C(0/0,-10,Loyalty)}:name(X=10) moveto(exile) all(*[white;blue;black;red;green;manacost<=10]) +auto={C(0/0,-11,Loyalty)}:name(X=11) moveto(exile) all(*[white;blue;black;red;green;manacost<=11]) +auto={C(0/0,-12,Loyalty)}:name(X=12) moveto(exile) all(*[white;blue;black;red;green;manacost<=12]) +auto={C(0/0,-13,Loyalty)}:name(X=13) moveto(exile) all(*[white;blue;black;red;green;manacost<=13]) +auto={C(0/0,-14,Loyalty)}:name(X=14) moveto(exile) all(*[white;blue;black;red;green;manacost<=14]) +auto={C(0/0,-15,Loyalty)}:name(X=15) moveto(exile) all(*[white;blue;black;red;green;manacost<=15]) +auto={C(0/0,-16,Loyalty)}:name(X=16) moveto(exile) all(*[white;blue;black;red;green;manacost<=16]) +auto={C(0/0,-17,Loyalty)}:name(X=17) moveto(exile) all(*[white;blue;black;red;green;manacost<=17]) +auto={C(0/0,-18,Loyalty)}:name(X=18) moveto(exile) all(*[white;blue;black;red;green;manacost<=18]) +auto={C(0/0,-19,Loyalty)}:name(X=19) moveto(exile) all(*[white;blue;black;red;green;manacost<=19]) +auto={C(0/0,-20,Loyalty)}:name(X=20) moveto(exile) all(*[white;blue;black;red;green;manacost<=20]) +auto={C(0/0,-10,Loyalty)}:name(-10: Ultimate) life:7 && draw:7 && transforms((,newability[choice moveto(mybattlefield) target(*[-instant;-sorcery]|myhand)])) forever +text=+2: Ugin, the Spirit Dragon deals 3 damage to target creature or player. -- -X: Exile each permanent with converted mana cost X or less that's one or more colors. -- -10: You gain 7 life, draw seven cards, then put up to seven permanent cards from your hand onto the battlefield. +mana={8} +type=Planeswalker +subtype=Ugin +[/card] +[card] +name=Ugin's Construct +auto=sacrifice notatarget(*[white;blue;black;red;green]|myBattlefield) +text=When Ugin's Construct enters the battlefield, sacrifice a permanent that's one or more colors. +mana={4} +type=Artifact Creature +subtype=Construct +power=4 +toughness=5 +[/card] +[card] name=Uktabi Drake abilities=flying,haste auto=upcost[{1}{G}{G};next upkeep] sacrifice @@ -102179,6 +103230,15 @@ mana={1}{W}{W} type=Sorcery [/card] [card] +name=Valorous Stance +target=creature +auto=choice name(indestructible) indestructible ueot +auto=if cantargetcard(creature[power>=4]|battlefield) then choice name(Destroy) destroy +text=Choose one ? Target creature gains indestructible until end of turn. - Destroy target creature with toughness 4 or greater. +mana={1}{W} +type=Instant +[/card] +[card] name=Vampire Aristocrat auto={S(creature|myBattlefield)}:2/2 text=Sacrifice a creature: Vampire Aristocrat gets +2/+2 until end of turn. @@ -102568,6 +103628,18 @@ mana={U} type=Instant [/card] [card] +name=Vaultbreaker +other={2}{R} name(Dash) +auto=if paid(alternative) then transforms((,newability[haste],newability[phaseaction[endofturn sourceinplay] moveto(ownerhand) all(this)])) forever +auto=@combat(attacking) source(this):may name(discard and draw) reject notatarget(*|myhand) && transforms((,newability[draw:1 controller])) forever +text=Whenever Vaultbreaker attacks, you may discard a card. If you do, draw a card. -- Dash {2}{R} (You may cast this spell for its dash cost. If you do, it gains haste, and it's returned from the battlefield to its owner's hand at the beginning of the next end step.) +mana={3}{R} +type=Creature +subtype=Orc Rogue +power=4 +toughness=2 +[/card] +[card] name=Vebulid auto=counter(1/1,1) auto=@each my upkeep:may counter(1/1,1) @@ -106067,6 +107139,16 @@ power=3 toughness=3 [/card] [card] +name=Wandering Champion +auto=@combatdamaged(player) from(this) restriction{type(*[blue;red]|mybattlefield)~morethan~0}:may name(discard and draw) reject notatarget(*|myhand) && transforms((,newability[draw:1 controller])) forever +text=Whenever Wandering Champion deals combat damage to a player, if you control a blue or red permanent, you may discard a card. If you do, draw a card. +mana={1}{W} +type=Creature +subtype=Human Monk +power=3 +toughness=1 +[/card] +[card] name=Wandering Goblins auto={3}:aslongas(plains|myBattlefield]) 1/0 && aslongas(island|myBattlefield]) 1/0 && aslongas(swamp|myBattlefield]) 1/0 && aslongas(mountain|myBattlefield]) 1/0 && aslongas(forest|myBattlefield]) 1/0 text=Domain - {3}: Wandering Goblins gets +1/+0 until end of turn for each basic land type among lands you control. @@ -106206,6 +107288,14 @@ power=2 toughness=1 [/card] [card] +name=War Flare +auto=all(creature|myBattlefield) 2/1 ueot +auto=untap all(creature|myBattlefield) +text=Creatures you control get +2/+1 until end of turn. Untap those creatures. +mana={2}{R}{W} +type=Instant +[/card] +[card] name=War Mammoth abilities=trample text=Trample @@ -106348,6 +107438,18 @@ power=3 toughness=3 [/card] [card] +name=Warden of the First Tree +auto={1}{WB}:becomes(Human Warrior,3/3) forever +auto=this(cantargetcard(*[Warrior]) {2}{WB}{WB}:becomes(Human Spirit Warrior,trample,lifelink) forever ) +auto=this(cantargetcard(*[Spirit]) {3}{WB}{WB}{WB}:counter(1/1,5) +text={1}{WB}: Warden of the First Tree becomes a Human Warrior with base power and toughness 3/3. -- {2}{WB}{WB}: If Warden of the First Tree is a Warrior, it becomes a Human Spirit Warrior with trample and lifelink. -- {3}{WB}{WB}{WB}: If Warden of the First Tree is a Spirit, put five +1/+1 counters on it. +mana={G} +type=Creature +subtype=Human +power=1 +toughness=1 +[/card] +[card] name=Warden of the Wall auto=tap auto={T}:Add{1} @@ -107459,6 +108561,25 @@ power=4 toughness=2 [/card] [card] +name=Whisk Away +target=creature[attacking;blocking] +auto=moveto(ownerlibrary) +text=Put target attacking or blocking creature on top of its owner's library. +mana={2}{U} +type=Instant +[/card] +[card] +name=Whisperer of the Wilds +auto={T}:add{G} +auto=aslongas(creature[power>=4]|mybattlefield) {T}:Add{G}{G} +text={T}: Add {G} to your mana pool. Ferocious - {T}: Add {G}{G} to your mana pool. Activate this ability only if you control a creature with power 4 or greater. +mana={1}{G} +type=Creature +subtype=Human Shaman +power=0 +toughness=2 +[/card] +[card] name=Whispering Shade abilities=swampwalk auto={B}:1/1 @@ -108177,6 +109298,13 @@ mana={R} type=Sorcery [/card] [card] +name=Winds of Qal Sisma +auto=if type(creature[power>=4]|mybattlefield)~morethan~0 then preventAllCombatDamage from(creature|opponentbattlefield) ueot else preventAllcombatDamage ueot +text=Prevent all combat damage that would be dealt this turn. -- Ferocious - If you control a creature with power 4 or greater, instead prevent all combat damage that would be dealt this turn by creatures your opponents control. +mana={1}{G} +type=Instant +[/card] +[card] name=Winds of Rath auto=bury all(creature[-enchanted]) text=Destroy all creatures that aren't enchanted. They can't be regenerated. From f940f8e3030c721e577ef8917b9b36c7ef533f49 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sat, 22 Aug 2015 23:40:31 +0800 Subject: [PATCH 043/249] some corrections added Induce Paranoia, Draining Whelk --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 110 +++++++----------- .../bin/Res/sets/primitives/unsupported.txt | 15 --- projects/mtg/src/AllAbilities.cpp | 7 ++ 3 files changed, 47 insertions(+), 85 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 601b4299d..c29fe830a 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -24143,18 +24143,8 @@ toughness=1 [card] name=Discordant Dirge auto=@each my upkeep:may counter(0/0,1,Verse) -auto=this(counter{0/0.1.Verse}=) {B}{S}:reject target(*|opponenthand) -auto=this(counter{0/0.2.Verse}=) {B}{S}:reject target(*|opponenthand) -auto=this(counter{0/0.3.Verse}=) {B}{S}:reject target(*|opponenthand) -auto=this(counter{0/0.4.Verse}=) {B}{S}:reject target(*|opponenthand) -auto=this(counter{0/0.5.Verse}=) {B}{S}:reject target(*|opponenthand) -auto=this(counter{0/0.6.Verse}=) {B}{S}:reject target(*|opponenthand) -auto=this(counter{0/0.7.Verse}=) {B}{S}:reject target(*|opponenthand) -auto=this(counter{0/0.8.Verse}=) {B}{S}:reject target(*|opponenthand) -auto=this(counter{0/0.9.Verse}=) {B}{S}:reject target(*|opponenthand) -auto=this(counter{0/0.10.Verse}=) {B}{S}:reject target(*|opponenthand) -auto=this(counter{0/0.11.Verse}=) {B}{S}:reject target(*|opponenthand) -auto=this(counter{0/0.12.Verse}=) {B}{S}:reject target(*|opponenthand) +auto=this(counter{0/0.1.Verse}<1) {B}{S}:name(look) donothing target(*|opponenthand) +auto=this(counter{0/0.1.Verse}>0) {B}{S}:reject target(*|opponenthand) text=At the beginning of your upkeep, you may put a verse counter on Discordant Dirge. -- {B}, Sacrifice Discordant Dirge: Look at target opponent's hand and choose up to X cards from it, where X is the number of verse counters on Discordant Dirge. That player discards those cards. mana={3}{B}{B} type=Enchantment @@ -25444,6 +25434,18 @@ mana={1}{B}{X:black} type=Sorcery [/card] [card] +name=Draining Whelk +abilities=flash,flying +auto=target(*|stack) fizzle +alias=111057 +text=Flash (You may cast this spell any time you could cast an instant.) -- Flying -- When Draining Whelk enters the battlefield, counter target spell. Put X +1/+1 counters on Draining Whelk, where X is that spell's converted mana cost. +mana={4}{U}{U} +type=Creature +subtype=Illusion +power=1 +toughness=1 +[/card] +[card] name=Drainpipe Vermin auto=@movedto(this|graveyard) from(battlefield):pay({B}) name(discard) target(player) ability$!name(discard) target(*|myhand) reject!$ targetedplayer text=When Drainpipe Vermin dies, you may pay {B}. If you do, target player discards a card. @@ -46776,6 +46778,14 @@ power=4 toughness=4 [/card] [card] +name=Induce Paranoia +target=*|stack +auto=if spent({B}) then transforms((,newability[deplete:manacost],newability[fizzle])) else fizzle +text=Counter target spell. If {B} was spent to cast Induce Paranoia, that spell's controller puts the top X cards of his or her library into his or her graveyard, where X is the spell's converted mana cost. +mana={2}{U}{U} +type=Instant +[/card] +[card] name=Inertia Bubble target=artifact auto=doesnotuntap @@ -75396,18 +75406,8 @@ type=Sorcery [card] name=Recantation auto=@each my upkeep:may counter(0/0,1,Verse) -auto=this(counter{0/0.1.Verse}=) {U}{S}:moveTo(ownerhand) target(*|battlefield) -auto=this(counter{0/0.2.Verse}=) {U}{S}:moveTo(ownerhand) target(*|battlefield) -auto=this(counter{0/0.3.Verse}=) {U}{S}:moveTo(ownerhand) target(*|battlefield) -auto=this(counter{0/0.4.Verse}=) {U}{S}:moveTo(ownerhand) target(*|battlefield) -auto=this(counter{0/0.5.Verse}=) {U}{S}:moveTo(ownerhand) target(*|battlefield) -auto=this(counter{0/0.6.Verse}=) {U}{S}:moveTo(ownerhand) target(*|battlefield) -auto=this(counter{0/0.7.Verse}=) {U}{S}:moveTo(ownerhand) target(*|battlefield) -auto=this(counter{0/0.8.Verse}=) {U}{S}:moveTo(ownerhand) target(*|battlefield) -auto=this(counter{0/0.9.Verse}=) {U}{S}:moveTo(ownerhand) target(*|battlefield) -auto=this(counter{0/0.10.Verse}=) {U}{S}:moveTo(ownerhand) target(*|battlefield) -auto=this(counter{0/0.11.Verse}=) {U}{S}:moveTo(ownerhand) target(*|battlefield) -auto=this(counter{0/0.12.Verse}=) {U}{S}:moveTo(ownerhand) target(*|battlefield) +auto=this(counter{0/0.1.Verse}<1) {U}{S}:name(do nothing) donothing +auto=this(counter{0/0.1.Verse}>0) {U}{S}:moveTo(ownerhand) target(*|battlefield) text=At the beginning of your upkeep, you may put a verse counter on Recantation. -- {U}, Sacrifice Recantation: Return up to X target permanents to their owners' hands, where X is the number of verse counters on Recantation. mana={3}{U}{U} type=Enchantment @@ -78916,18 +78916,8 @@ toughness=4 [card] name=Rumbling Crescendo auto=@each my upkeep:may counter(0/0,1,Verse) -auto=this(counter{0/0.1.Verse}=) {R}{S}:destroy target(land) -auto=this(counter{0/0.2.Verse}=) {R}{S}:destroy target(land) -auto=this(counter{0/0.3.Verse}=) {R}{S}:destroy target(land) -auto=this(counter{0/0.4.Verse}=) {R}{S}:destroy target(land) -auto=this(counter{0/0.5.Verse}=) {R}{S}:destroy target(land) -auto=this(counter{0/0.6.Verse}=) {R}{S}:destroy target(land) -auto=this(counter{0/0.7.Verse}=) {R}{S}:destroy target(land) -auto=this(counter{0/0.8.Verse}=) {R}{S}:destroy target(land) -auto=this(counter{0/0.9.Verse}=) {R}{S}:destroy target(land) -auto=this(counter{0/0.10.Verse}=) {R}{S}:destroy target(land) -auto=this(counter{0/0.11.Verse}=) {R}{S}:destroy target(land) -auto=this(counter{0/0.12.Verse}=) {R}{S}:destroy target(land) +auto=this(counter{0/0.1.Verse}<1) {R}{S}:name(do nothing) donothing +auto=this(counter{0/0.1.Verse}>0) {R}{S}:destroy target(land) text=At the beginning of your upkeep, you may put a verse counter on Rumbling Crescendo. -- {R}, Sacrifice Rumbling Crescendo: Destroy up to X target lands, where X is the number of verse counters on Rumbling Crescendo. mana={3}{R}{R} type=Enchantment @@ -83445,18 +83435,8 @@ subtype=Aura [card] name=Serra's Liturgy auto=@each my upkeep:may counter(0/0,1,Verse) -auto=this(counter{0/0.1.Verse}=) {W}{S}:destroy target(artifact,enchantment) -auto=this(counter{0/0.2.Verse}=) {W}{S}:destroy target(artifact,enchantment) -auto=this(counter{0/0.3.Verse}=) {W}{S}:destroy target(artifact,enchantment) -auto=this(counter{0/0.4.Verse}=) {W}{S}:destroy target(artifact,enchantment) -auto=this(counter{0/0.5.Verse}=) {W}{S}:destroy target(artifact,enchantment) -auto=this(counter{0/0.6.Verse}=) {W}{S}:destroy target(artifact,enchantment) -auto=this(counter{0/0.7.Verse}=) {W}{S}:destroy target(artifact,enchantment) -auto=this(counter{0/0.8.Verse}=) {W}{S}:destroy target(artifact,enchantment) -auto=this(counter{0/0.9.Verse}=) {W}{S}:destroy target(artifact,enchantment) -auto=this(counter{0/0.10.Verse}=) {W}{S}:destroy target(artifact,enchantment) -auto=this(counter{0/0.11.Verse}=) {W}{S}:destroy target(artifact,enchantment) -auto=this(counter{0/0.12.Verse}=) {W}{S}:destroy target(artifact,enchantment) +auto=this(counter{0/0.1.Verse}<1) {W}{S}:name(do nothing) donothing +auto=this(counter{0/0.1.Verse}>0) {W}{S}:destroy target(artifact,enchantment) text=At the beginning of your upkeep, you may put a verse counter on Serra's Liturgy. -- {W}, Sacrifice Serra's Liturgy: Destroy up to X target artifacts and/or enchantments, where X is the number of verse counters on Serra's Liturgy. mana={2}{W}{W} type=Enchantment @@ -99574,13 +99554,13 @@ type=Artifact [card] name=Tornado auto=cumulativeupcost[{G}] sacrifice -auto=this(counter{0/0.1.Velocity}<1) {2}{G}:destroy target(*) && all(this) counter(0/0,1,Velocity) -auto=this(counter{0/0.1.Velocity}=) {2}{G}{L:3}:destroy target(*) && all(this) counter(0/0,1,Velocity) -auto=this(counter{0/0.2.Velocity}=) {2}{G}{L:6}:destroy target(*) && all(this) counter(0/0,1,Velocity) -auto=this(counter{0/0.3.Velocity}=) {2}{G}{L:9}:destroy target(*) && all(this) counter(0/0,1,Velocity) -auto=this(counter{0/0.4.Velocity}=) {2}{G}{L:12}:destroy target(*) && all(this) counter(0/0,1,Velocity) -auto=this(counter{0/0.5.Velocity}=) {2}{G}{L:15}:destroy target(*) && all(this) counter(0/0,1,Velocity) -auto=this(counter{0/0.6.Velocity}=) {2}{G}{L:18}:destroy target(*) && all(this) counter(0/0,1,Velocity) +auto=this(counter{0/0.1.Velocity}<1) {2}{G}:destroy target(*) && all(this) counter(0/0,1,Velocity) limit:1 +auto=this(counter{0/0.1.Velocity}=) {2}{G}{L:3}:destroy target(*) && all(this) counter(0/0,1,Velocity) limit:1 +auto=this(counter{0/0.2.Velocity}=) {2}{G}{L:6}:destroy target(*) && all(this) counter(0/0,1,Velocity) limit:1 +auto=this(counter{0/0.3.Velocity}=) {2}{G}{L:9}:destroy target(*) && all(this) counter(0/0,1,Velocity) limit:1 +auto=this(counter{0/0.4.Velocity}=) {2}{G}{L:12}:destroy target(*) && all(this) counter(0/0,1,Velocity) limit:1 +auto=this(counter{0/0.5.Velocity}=) {2}{G}{L:15}:destroy target(*) && all(this) counter(0/0,1,Velocity) limit:1 +auto=this(counter{0/0.6.Velocity}=) {2}{G}{L:18}:destroy target(*) && all(this) counter(0/0,1,Velocity) limit:1 text=Cumulative upkeep {G} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -- {2}{G}, Pay 3 life for each velocity counter on Tornado: Destroy target permanent and put a velocity counter on Tornado. Activate this ability only once each turn. mana={4}{G} type=Enchantment @@ -104913,18 +104893,8 @@ type=Instant [card] name=Vile Requiem auto=@each my upkeep:may counter(0/0,1,Verse) -auto=this(counter{0/0.1.Verse}=) {1}{B}{S}:bury target(creature[-black]) -auto=this(counter{0/0.2.Verse}=) {1}{B}{S}:bury target(creature[-black]) -auto=this(counter{0/0.3.Verse}=) {1}{B}{S}:bury target(creature[-black]) -auto=this(counter{0/0.4.Verse}=) {1}{B}{S}:bury target(creature[-black]) -auto=this(counter{0/0.5.Verse}=) {1}{B}{S}:bury target(creature[-black]) -auto=this(counter{0/0.6.Verse}=) {1}{B}{S}:bury target(creature[-black]) -auto=this(counter{0/0.7.Verse}=) {1}{B}{S}:bury target(creature[-black]) -auto=this(counter{0/0.8.Verse}=) {1}{B}{S}:bury target(creature[-black]) -auto=this(counter{0/0.9.Verse}=) {1}{B}{S}:bury target(creature[-black]) -auto=this(counter{0/0.10.Verse}=) {1}{B}{S}:bury target(creature[-black]) -auto=this(counter{0/0.11.Verse}=) {1}{B}{S}:bury target(creature[-black]) -auto=this(counter{0/0.12.Verse}=) {1}{B}{S}:bury target(creature[-black]) +auto=this(counter{0/0.1.Verse}<1) {1}{B}{S}:name(do nothing) donothing +auto=this(counter{0/0.1.Verse}>0) {1}{B}{S}:bury target(creature[-black]) text=At the beginning of your upkeep, you may put a verse counter on Vile Requiem. -- {1}{B}, Sacrifice Vile Requiem: Destroy up to X target nonblack creatures, where X is the number of verse counters on Vile Requiem. They can't be regenerated. mana={2}{B}{B} type=Enchantment @@ -106515,8 +106485,8 @@ toughness=7 name=Walking Archive abilities=defender auto=counter(1/1,1) -auto=@each my upkeep:thisforeach(counter{1/1.1}) draw:1 controller -auto=@each opponent upkeep:thisforeach(counter{1/1.1}) draw:1 opponent +auto=@each my upkeep:draw:counter{1%1} controller +auto=@each opponent upkeep:draw:counter{1%1} opponent auto={2}{W}{U}:counter(1/1,1) text=Defender (This creature can't attack.) -- Walking Archive enters the battlefield with a +1/+1 counter on it. -- At the beginning of each player's upkeep, that player draws a card for each +1/+1 counter on Walking Archive. -- {2}{W}{U}: Put a +1/+1 counter on Walking Archive. mana={3} @@ -109939,7 +109909,7 @@ type=Instant [/card] [card] name=Wolf Pack -auto=@combat(blocked,turnlimited) source(this):may name(assign combat damage to defending player) thisforeach(power>=1) damage:1 opponent && fog from(this) +auto=@combat(blocked,turnlimited) source(this):may name(assign combat damage to defending player) damage:power opponent && fog from(this) text=You may have Wolf Pack assign its combat damage as though it weren't blocked. mana={6}{G}{G} type=Creature diff --git a/projects/mtg/bin/Res/sets/primitives/unsupported.txt b/projects/mtg/bin/Res/sets/primitives/unsupported.txt index 5d4a1bc3e..2700d7866 100644 --- a/projects/mtg/bin/Res/sets/primitives/unsupported.txt +++ b/projects/mtg/bin/Res/sets/primitives/unsupported.txt @@ -4149,15 +4149,6 @@ mana={U}{U} type=Sorcery [/card] [card] -name=Draining Whelk -text=Flash (You may cast this spell any time you could cast an instant.) -- Flying -- When Draining Whelk enters the battlefield, counter target spell. Put X +1/+1 counters on Draining Whelk, where X is that spell's converted mana cost. -mana={4}{U}{U} -type=Creature -subtype=Illusion -power=1 -toughness=1 -[/card] -[card] name=Drake Umbra mana={4}{U} type=Enchantment @@ -7676,12 +7667,6 @@ type=Instant text=As an additional cost to cast Induce Despair, reveal a creature card from your hand. Target creature gets -X/-X until end of turn, where X is the revealed card's converted mana cost. [/card] [card] -name=Induce Paranoia -text=Counter target spell. If {B} was spent to cast Induce Paranoia, that spell's controller puts the top X cards of his or her library into his or her graveyard, where X is the spell's converted mana cost. -mana={2}{U}{U} -type=Instant -[/card] -[card] name=Inescapable Brute text=Wither (This deals damage to creatures in the form of -1/-1 counters.) -- Inescapable Brute must be blocked if able. mana={5}{R} diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index 2acd7af90..364f1408f 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -1359,6 +1359,13 @@ int AAFizzler::resolve() sCard = sTarget->source; if (!sCard || !sTarget || sCard->has(Constants::NOFIZZLE)) return 0; + if (source->alias == 111057 && sTarget)//Draining Whelk + { + for (int j = sTarget->cost->getConvertedCost(); j > 0; j--) + { + source->counters->addCounter(1,1); + } + } stack->Fizzle(sTarget, fizzleMode); return 1; } From 176b74489ed4f3542a8448fd105f5a73b36ea864 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sun, 23 Aug 2015 21:56:23 +0800 Subject: [PATCH 044/249] added parallel lives support token doubler... :) --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 7 +++++++ projects/mtg/include/AllAbilities.h | 19 ++++++++++++++++++- projects/mtg/include/MTGDefinitions.h | 3 ++- projects/mtg/src/MTGDefinitions.cpp | 3 ++- 4 files changed, 29 insertions(+), 3 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index c29fe830a..2cb306c77 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -68366,6 +68366,13 @@ mana={3}{G}{G} type=Sorcery [/card] [card] +name=Parallel Lives +abilities=tokenizer +text=If an effect would put one or more tokens onto the battlefield under your control, it puts twice that many of those tokens onto the battlefield instead. +mana={3}{G} +type=Enchantment +[/card] +[card] name=Paralyze target=creature auto=tap diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index 1e7d361cd..e3eb4a783 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -3140,7 +3140,7 @@ public: SAFE_DELETE(NewPow); SAFE_DELETE(NewTou); } - for (int i = 0; i < multiplier->getValue(); ++i) + for (int i = 0; i < Tokenizer(); ++i) { //MTGCardInstance * myToken; if (tokenId) @@ -3199,6 +3199,23 @@ public: return 1; } + int Tokenizer()//tokenizer + { + int tokenize = 1; + if (source->controller()->game->battlefield->hasAbility(Constants::TOKENIZER)) + { + int nbcards = source->controller()->game->battlefield->nb_cards; + for (int j = 0; j < nbcards; j++) + { + if (source->controller()->game->battlefield->cards[j]->has(Constants::TOKENIZER)) + tokenize *= 2; + } + return multiplier->getValue()*tokenize; + } + else + return multiplier->getValue(); + } + void setTokenOwner() { switch(who) diff --git a/projects/mtg/include/MTGDefinitions.h b/projects/mtg/include/MTGDefinitions.h index 08667058e..1240c25ca 100644 --- a/projects/mtg/include/MTGDefinitions.h +++ b/projects/mtg/include/MTGDefinitions.h @@ -219,7 +219,8 @@ class Constants LURE = 101, NOLEGEND = 102, CANPLAYFROMGRAVEYARD = 103, - NB_BASIC_ABILITIES = 104, + TOKENIZER = 104, + NB_BASIC_ABILITIES = 105, RARITY_S = 'S', //Special Rarity diff --git a/projects/mtg/src/MTGDefinitions.cpp b/projects/mtg/src/MTGDefinitions.cpp index 3161c3749..952f0be75 100644 --- a/projects/mtg/src/MTGDefinitions.cpp +++ b/projects/mtg/src/MTGDefinitions.cpp @@ -132,7 +132,8 @@ const char* Constants::MTGBasicAbilities[] = { "soulbond", "lure", "nolegend", - "canplayfromgraveyard" + "canplayfromgraveyard", + "tokenizer"//parallel lives }; map Constants::MTGBasicAbilitiesMap; From 907274f9bd856ab64482a124d52ed920fe0e9b0c Mon Sep 17 00:00:00 2001 From: xawotihs Date: Sun, 23 Aug 2015 21:23:55 +0200 Subject: [PATCH 045/249] Fixed cross-compiling with theos --- JGE/include/JLBFont.h | 2 - JGE/include/JRenderer.h | 10 +- JGE/include/JSoundSystem.h | 2 + JGE/include/JSpline.h | 19 +- JGE/src/JFileSystem.cpp | 8 +- JGE/src/JSpline.cpp | 14 +- JGE/src/iOS/EAGLViewController.h | 1 + JGE/src/iOS/EAGLViewController.m | 10 +- JGE/src/iOS/wagicAppDelegate.m | 2 +- JGE/src/unzip/crypt.h | 14 +- JGE/src/unzip/ioapi.c | 60 ++--- JGE/src/unzip/unzip.c | 198 ++++++---------- JGE/src/unzip/zip.c | 216 +++++++++--------- JGE/src/zipFS/zfsystem.cpp | 1 - .../Reachability/Reachability.m | 2 +- .../mtg/iOS/SoundManager/MyOpenALSupport.c | 115 +++++----- projects/mtg/iOS/SoundManager/SoundManager.m | 4 +- .../UI/WagicDownloadProgressViewController.m | 6 +- .../mtg/iOS/asi-http-request/ASIHTTPRequest.m | 4 +- projects/mtg/src/AIPlayer.cpp | 2 - projects/mtg/src/DeckMenu.cpp | 3 - projects/mtg/src/GameStateDuel.cpp | 3 - projects/mtg/src/SimplePad.cpp | 7 +- projects/mtg/src/WGui.cpp | 2 + projects/mtg/src/WResourceManager.cpp | 2 + 25 files changed, 320 insertions(+), 387 deletions(-) diff --git a/JGE/include/JLBFont.h b/JGE/include/JLBFont.h index 3c911a9ce..79031f3e5 100644 --- a/JGE/include/JLBFont.h +++ b/JGE/include/JLBFont.h @@ -178,8 +178,6 @@ private: float mSpacing; PIXEL_TYPE mColor; - int mBlend; - int mBase; }; diff --git a/JGE/include/JRenderer.h b/JGE/include/JRenderer.h index 0a7b264e3..452ac4955 100644 --- a/JGE/include/JRenderer.h +++ b/JGE/include/JRenderer.h @@ -598,8 +598,6 @@ private: GLint prog2_positionLoc; GLint prog2_texCoordLoc; GLint prog2_colorLoc; - // MVP matrix - ESMatrix prog2_mvpMatrix; // Uniform locations GLint prog2_mvpLoc; @@ -612,13 +610,11 @@ private: int mCurrentTextureFormat; #endif +#ifdef PSP bool mVsync; - + int mTexCounter; +#endif int mSwizzle; - int mTexCounter; - - - int mCurrentTextureFilter; int mCurrTexBlendSrc; diff --git a/JGE/include/JSoundSystem.h b/JGE/include/JSoundSystem.h index 130935813..50771a646 100644 --- a/JGE/include/JSoundSystem.h +++ b/JGE/include/JSoundSystem.h @@ -258,7 +258,9 @@ private: #endif int mVolume; +#ifndef IOS int mMusicVolume; +#endif int mSampleVolume; diff --git a/JGE/include/JSpline.h b/JGE/include/JSpline.h index e5b6f28e2..ca0c57eee 100644 --- a/JGE/include/JSpline.h +++ b/JGE/include/JSpline.h @@ -18,12 +18,11 @@ using namespace std; #define MID_POINT_THRESHOLD 1.0f - ////////////////////////////////////////////////////////////////////////// /// Position of a single dot on screen. /// ////////////////////////////////////////////////////////////////////////// -class Point +class JPoint { public: @@ -34,13 +33,13 @@ public: /// @param _y - Y position. /// ////////////////////////////////////////////////////////////////////////// - Point(float _x, float _y) { x = _x; y = _y; } + JPoint(float _x, float _y) { x = _x; y = _y; } ////////////////////////////////////////////////////////////////////////// /// Constructor, set position to default (0.0f, 0.0f) /// ////////////////////////////////////////////////////////////////////////// - Point() { x = 0.0f; y = 0.0f; } + JPoint() { x = 0.0f; y = 0.0f; } float x; ///< X position. float y; ///< Y position. @@ -95,7 +94,7 @@ public: /// @param pt - Control point. /// ////////////////////////////////////////////////////////////////////////// - void AddControlPoint(const Point &pt); + void AddControlPoint(const JPoint &pt); ////////////////////////////////////////////////////////////////////////// /// Get a control point of the spline. @@ -105,7 +104,7 @@ public: /// @return Control point. /// ////////////////////////////////////////////////////////////////////////// - void GetControlPoint(Point &point, int index); + void GetControlPoint(JPoint &point, int index); ////////////////////////////////////////////////////////////////////////// /// Work out all pixels of the spline. @@ -128,7 +127,7 @@ public: /// @return Position of the desire point. /// ////////////////////////////////////////////////////////////////////////// - void PointOnCurve(Point &out, float t, const Point &p0, const Point &p1, const Point &p2, const Point &p3); + void PointOnCurve(JPoint &out, float t, const JPoint &p0, const JPoint &p1, const JPoint &p2, const JPoint &p3); ////////////////////////////////////////////////////////////////////////// /// Get a number of pixels for this spline. @@ -146,7 +145,7 @@ public: /// @return Position of the desire point. /// ////////////////////////////////////////////////////////////////////////// - void GetPixel(Point &point, int index); + void GetPixel(JPoint &point, int index); ////////////////////////////////////////////////////////////////////////// /// Render the spline to screen. @@ -156,8 +155,8 @@ public: private: - vector mMidPoints; - vector mPixels; + vector mMidPoints; + vector mPixels; int mCount; }; diff --git a/JGE/src/JFileSystem.cpp b/JGE/src/JFileSystem.cpp index 7d190c562..4eeff8f4f 100644 --- a/JGE/src/JFileSystem.cpp +++ b/JGE/src/JFileSystem.cpp @@ -38,6 +38,12 @@ The content that users should not be touching. #include #endif +/* +#ifdef IOS +#include +#endif +*/ + JFileSystem* JFileSystem::mInstance = NULL; JZipCache::JZipCache() @@ -248,7 +254,7 @@ void JFileSystem::clearZipCache() bool JFileSystem::AttachZipFile(const string &zipfile, char *password /* = NULL */) { - if (mZipAvailable && mZipFile != NULL) + if (mZipAvailable && mZipFile.is_open()) { if (mZipFileName != zipfile) DetachZipFile(); // close the previous zip file diff --git a/JGE/src/JSpline.cpp b/JGE/src/JSpline.cpp index 05d17958e..2131fb02c 100644 --- a/JGE/src/JSpline.cpp +++ b/JGE/src/JSpline.cpp @@ -71,7 +71,7 @@ bool JSpline::Load(const char *filename, float xscale, float yscale) element->QueryFloatAttribute("x", &xx); element->QueryFloatAttribute("y", &yy); - Point pt(xx*xscale, yy*yscale); + JPoint pt(xx*xscale, yy*yscale); AddControlPoint(pt); } @@ -84,7 +84,7 @@ bool JSpline::Load(const char *filename, float xscale, float yscale) -void JSpline::PointOnCurve(Point &out, float t, const Point &p0, const Point &p1, const Point &p2, const Point &p3) +void JSpline::PointOnCurve(JPoint &out, float t, const JPoint &p0, const JPoint &p1, const JPoint &p2, const JPoint &p3) { float t2 = t * t; float t3 = t2 * t; @@ -113,8 +113,8 @@ void JSpline::GeneratePixels() x = mMidPoints[1].x; y = mMidPoints[1].y; - Point newPt(x, y); - Point extraPt; + JPoint newPt(x, y); + JPoint extraPt; mPixels.push_back(newPt); @@ -151,13 +151,13 @@ void JSpline::GeneratePixels() } -void JSpline::AddControlPoint(const Point &pt) +void JSpline::AddControlPoint(const JPoint &pt) { mMidPoints.push_back(pt); } -void JSpline::GetControlPoint(Point &point, int index) +void JSpline::GetControlPoint(JPoint &point, int index) { if (index < (int)mMidPoints.size()) { @@ -167,7 +167,7 @@ void JSpline::GetControlPoint(Point &point, int index) } -void JSpline::GetPixel(Point &point, int index) +void JSpline::GetPixel(JPoint &point, int index) { if (index < (int)mPixels.size()) { diff --git a/JGE/src/iOS/EAGLViewController.h b/JGE/src/iOS/EAGLViewController.h index 3cc59827e..743644c10 100755 --- a/JGE/src/iOS/EAGLViewController.h +++ b/JGE/src/iOS/EAGLViewController.h @@ -10,5 +10,6 @@ void resumeGame(); @property (nonatomic, retain) id eaglView; @property (nonatomic, retain) UITextField *inputField; @property (nonatomic, assign) BOOL bannerIsVisible; +- (void)toggleKeyboardWithState: (NSString *) initialText; @end diff --git a/JGE/src/iOS/EAGLViewController.m b/JGE/src/iOS/EAGLViewController.m index 4ad3950b1..d0f93b9c3 100755 --- a/JGE/src/iOS/EAGLViewController.m +++ b/JGE/src/iOS/EAGLViewController.m @@ -53,28 +53,28 @@ - (void)viewWillAppear:(BOOL)animated { NSLog(@"EAGL ViewController - view Will Appear"); - [self.view resumeGame]; + [(id)self.view resumeGame]; } - (void)viewWillDisappear:(BOOL)animated { - [self.view pauseGame]; + [(id)self.view pauseGame]; } - (void)pauseGame { - [self.view pauseGame]; + [(id)self.view pauseGame]; } - (void)resumeGame { - [self.view resumeGame]; + [(id)self.view resumeGame]; } - (void)endGame { - [self.view endGame]; + [(id)self.view endGame]; } - (void)viewDidAppear:(BOOL)animated { diff --git a/JGE/src/iOS/wagicAppDelegate.m b/JGE/src/iOS/wagicAppDelegate.m index 909c639dc..607b05afa 100755 --- a/JGE/src/iOS/wagicAppDelegate.m +++ b/JGE/src/iOS/wagicAppDelegate.m @@ -337,7 +337,7 @@ - (void)applicationWillTerminate:(UIApplication *)application { - [self.glViewController.view destroyGame]; + [(id)self.glViewController.view destroyGame]; } - (void)initializeKeyboard: (id) initialState diff --git a/JGE/src/unzip/crypt.h b/JGE/src/unzip/crypt.h index 622f4bc2e..91e13f2ed 100644 --- a/JGE/src/unzip/crypt.h +++ b/JGE/src/unzip/crypt.h @@ -87,13 +87,13 @@ static void init_keys(const char* passwd,unsigned long* pkeys,const unsigned lon # define ZCR_SEED2 3141592654UL /* use PI as default pattern */ # endif -static int crypthead(passwd, buf, bufSize, pkeys, pcrc_32_tab, crcForCrypting) - const char *passwd; /* password string */ - unsigned char *buf; /* where to write header */ - int bufSize; - unsigned long* pkeys; - const unsigned long* pcrc_32_tab; - unsigned long crcForCrypting; +static int crypthead( + const char *passwd, /* password string */ + unsigned char *buf, /* where to write header */ + int bufSize, + unsigned long* pkeys, + const unsigned long* pcrc_32_tab, + unsigned long crcForCrypting) { int n; /* index in random header */ int t; /* temporary */ diff --git a/JGE/src/unzip/ioapi.c b/JGE/src/unzip/ioapi.c index f1bee23e6..160119939 100644 --- a/JGE/src/unzip/ioapi.c +++ b/JGE/src/unzip/ioapi.c @@ -65,10 +65,10 @@ int ZCALLBACK ferror_file_func OF(( voidpf stream)); -voidpf ZCALLBACK fopen_file_func (opaque, filename, mode) - voidpf opaque; - const char* filename; - int mode; +voidpf ZCALLBACK fopen_file_func ( + voidpf opaque, + const char* filename, + int mode) { FILE* file = NULL; const char* mode_fopen = NULL; @@ -87,11 +87,11 @@ voidpf ZCALLBACK fopen_file_func (opaque, filename, mode) } -uLong ZCALLBACK fread_file_func (opaque, stream, buf, size) - voidpf opaque; - voidpf stream; - void* buf; - uLong size; +uLong ZCALLBACK fread_file_func ( + voidpf opaque, + voidpf stream, + void* buf, + uLong size) { uLong ret; ret = (uLong)fread(buf, 1, (size_t)size, (FILE *)stream); @@ -99,31 +99,31 @@ uLong ZCALLBACK fread_file_func (opaque, stream, buf, size) } -uLong ZCALLBACK fwrite_file_func (opaque, stream, buf, size) - voidpf opaque; - voidpf stream; - const void* buf; - uLong size; +uLong ZCALLBACK fwrite_file_func ( + voidpf opaque, + voidpf stream, + const void* buf, + uLong size) { uLong ret; ret = (uLong)fwrite(buf, 1, (size_t)size, (FILE *)stream); return ret; } -long ZCALLBACK ftell_file_func (opaque, stream) - voidpf opaque; - voidpf stream; +long ZCALLBACK ftell_file_func ( + voidpf opaque, + voidpf stream) { long ret; ret = ftell((FILE *)stream); return ret; } -long ZCALLBACK fseek_file_func (opaque, stream, offset, origin) - voidpf opaque; - voidpf stream; - uLong offset; - int origin; +long ZCALLBACK fseek_file_func ( + voidpf opaque, + voidpf stream, + uLong offset, + int origin) { int fseek_origin=0; long ret; @@ -145,26 +145,26 @@ long ZCALLBACK fseek_file_func (opaque, stream, offset, origin) return ret; } -int ZCALLBACK fclose_file_func (opaque, stream) - voidpf opaque; - voidpf stream; +int ZCALLBACK fclose_file_func ( + voidpf opaque, + voidpf stream) { int ret; ret = fclose((FILE *)stream); return ret; } -int ZCALLBACK ferror_file_func (opaque, stream) - voidpf opaque; - voidpf stream; +int ZCALLBACK ferror_file_func ( + voidpf opaque, + voidpf stream) { int ret; ret = ferror((FILE *)stream); return ret; } -void fill_fopen_filefunc (pzlib_filefunc_def) - zlib_filefunc_def* pzlib_filefunc_def; +void fill_fopen_filefunc ( + zlib_filefunc_def* pzlib_filefunc_def) { pzlib_filefunc_def->zopen_file = fopen_file_func; pzlib_filefunc_def->zread_file = fread_file_func; diff --git a/JGE/src/unzip/unzip.c b/JGE/src/unzip/unzip.c index 0b122e4fe..79e77181d 100644 --- a/JGE/src/unzip/unzip.c +++ b/JGE/src/unzip/unzip.c @@ -168,10 +168,7 @@ local int unzlocal_getByte OF(( voidpf filestream, int *pi)); -local int unzlocal_getByte(pzlib_filefunc_def,filestream,pi) - const zlib_filefunc_def* pzlib_filefunc_def; - voidpf filestream; - int *pi; +local int unzlocal_getByte(const zlib_filefunc_def* pzlib_filefunc_def,voidpf filestream,int *pi) { unsigned char c; int err = (int)ZREAD(*pzlib_filefunc_def,filestream,&c,1); @@ -198,10 +195,7 @@ local int unzlocal_getShort OF(( voidpf filestream, uLong *pX)); -local int unzlocal_getShort (pzlib_filefunc_def,filestream,pX) - const zlib_filefunc_def* pzlib_filefunc_def; - voidpf filestream; - uLong *pX; +local int unzlocal_getShort (const zlib_filefunc_def* pzlib_filefunc_def,voidpf filestream,uLong *pX) { uLong x ; int i; @@ -226,10 +220,7 @@ local int unzlocal_getLong OF(( voidpf filestream, uLong *pX)); -local int unzlocal_getLong (pzlib_filefunc_def,filestream,pX) - const zlib_filefunc_def* pzlib_filefunc_def; - voidpf filestream; - uLong *pX; +local int unzlocal_getLong (const zlib_filefunc_def* pzlib_filefunc_def,voidpf filestream,uLong *pX) { uLong x ; int i; @@ -259,9 +250,7 @@ local int unzlocal_getLong (pzlib_filefunc_def,filestream,pX) /* My own strcmpi / strcasecmp */ -local int strcmpcasenosensitive_internal (fileName1,fileName2) - const char* fileName1; - const char* fileName2; +local int strcmpcasenosensitive_internal (const char* fileName1,const char* fileName2) { for (;;) { @@ -302,10 +291,7 @@ local int strcmpcasenosensitive_internal (fileName1,fileName2) (like 1 on Unix, 2 on Windows) */ -extern int ZEXPORT unzStringFileNameCompare (fileName1,fileName2,iCaseSensitivity) - const char* fileName1; - const char* fileName2; - int iCaseSensitivity; +extern int ZEXPORT unzStringFileNameCompare (const char* fileName1,const char* fileName2,int iCaseSensitivity) { if (iCaseSensitivity==0) iCaseSensitivity=CASESENSITIVITYDEFAULTVALUE; @@ -328,9 +314,7 @@ local uLong unzlocal_SearchCentralDir OF(( const zlib_filefunc_def* pzlib_filefunc_def, voidpf filestream)); -local uLong unzlocal_SearchCentralDir(pzlib_filefunc_def,filestream) - const zlib_filefunc_def* pzlib_filefunc_def; - voidpf filestream; +local uLong unzlocal_SearchCentralDir(const zlib_filefunc_def* pzlib_filefunc_def,voidpf filestream) { unsigned char* buf; uLong uSizeFile; @@ -394,9 +378,7 @@ local uLong unzlocal_SearchCentralDir(pzlib_filefunc_def,filestream) Else, the return value is a unzFile Handle, usable with other function of this unzip package. */ -extern unzFile ZEXPORT unzOpen2 (path, pzlib_filefunc_def) - const char *path; - zlib_filefunc_def* pzlib_filefunc_def; +extern unzFile ZEXPORT unzOpen2 (const char *path, zlib_filefunc_def* pzlib_filefunc_def) { unz_s us; unz_s *s; @@ -497,8 +479,7 @@ extern unzFile ZEXPORT unzOpen2 (path, pzlib_filefunc_def) } -extern unzFile ZEXPORT unzOpen (path) - const char *path; +extern unzFile ZEXPORT unzOpen (const char *path) { return unzOpen2(path, NULL); } @@ -508,8 +489,7 @@ extern unzFile ZEXPORT unzOpen (path) If there is files inside the .Zip opened with unzipOpenCurrentFile (see later), these files MUST be closed with unzipCloseCurrentFile before call unzipClose. return UNZ_OK if there is no problem. */ -extern int ZEXPORT unzClose (file) - unzFile file; +extern int ZEXPORT unzClose (unzFile file) { unz_s* s; if (file==NULL) @@ -529,9 +509,7 @@ extern int ZEXPORT unzClose (file) Write info about the ZipFile in the *pglobal_info structure. No preparation of the structure is needed return UNZ_OK if there is no problem. */ -extern int ZEXPORT unzGetGlobalInfo (file,pglobal_info) - unzFile file; - unz_global_info *pglobal_info; +extern int ZEXPORT unzGetGlobalInfo (unzFile file,unz_global_info *pglobal_info) { unz_s* s; if (file==NULL) @@ -545,9 +523,7 @@ extern int ZEXPORT unzGetGlobalInfo (file,pglobal_info) /* Translate date/time from Dos format to tm_unz (readable more easilty) */ -local void unzlocal_DosDateToTmuDate (ulDosDate, ptm) - uLong ulDosDate; - tm_unz* ptm; +local void unzlocal_DosDateToTmuDate (uLong ulDosDate, tm_unz* ptm) { uLong uDate; uDate = (uLong)(ulDosDate>>16); @@ -574,21 +550,16 @@ local int unzlocal_GetCurrentFileInfoInternal OF((unzFile file, char *szComment, uLong commentBufferSize)); -local int unzlocal_GetCurrentFileInfoInternal (file, - pfile_info, - pfile_info_internal, - szFileName, fileNameBufferSize, - extraField, extraFieldBufferSize, - szComment, commentBufferSize) - unzFile file; - unz_file_info *pfile_info; - unz_file_info_internal *pfile_info_internal; - char *szFileName; - uLong fileNameBufferSize; - void *extraField; - uLong extraFieldBufferSize; - char *szComment; - uLong commentBufferSize; +local int unzlocal_GetCurrentFileInfoInternal ( + unzFile file, + unz_file_info *pfile_info, + unz_file_info_internal *pfile_info_internal, + char *szFileName, + uLong fileNameBufferSize, + void *extraField, + uLong extraFieldBufferSize, + char *szComment, + uLong commentBufferSize) { unz_s* s; unz_file_info file_info; @@ -746,19 +717,15 @@ local int unzlocal_GetCurrentFileInfoInternal (file, No preparation of the structure is needed return UNZ_OK if there is no problem. */ -extern int ZEXPORT unzGetCurrentFileInfo (file, - pfile_info, - szFileName, fileNameBufferSize, - extraField, extraFieldBufferSize, - szComment, commentBufferSize) - unzFile file; - unz_file_info *pfile_info; - char *szFileName; - uLong fileNameBufferSize; - void *extraField; - uLong extraFieldBufferSize; - char *szComment; - uLong commentBufferSize; +extern int ZEXPORT unzGetCurrentFileInfo ( + unzFile file, + unz_file_info *pfile_info, + char *szFileName, + uLong fileNameBufferSize, + void *extraField, + uLong extraFieldBufferSize, + char *szComment, + uLong commentBufferSize) { return unzlocal_GetCurrentFileInfoInternal(file,pfile_info,NULL, szFileName,fileNameBufferSize, @@ -770,8 +737,7 @@ extern int ZEXPORT unzGetCurrentFileInfo (file, Set the current file of the zipfile to the first file. return UNZ_OK if there is no problem */ -extern int ZEXPORT unzGoToFirstFile (file) - unzFile file; +extern int ZEXPORT unzGoToFirstFile (unzFile file) { int err=UNZ_OK; unz_s* s; @@ -792,8 +758,7 @@ extern int ZEXPORT unzGoToFirstFile (file) return UNZ_OK if there is no problem return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. */ -extern int ZEXPORT unzGoToNextFile (file) - unzFile file; +extern int ZEXPORT unzGoToNextFile (unzFile file) { unz_s* s; int err; @@ -826,10 +791,7 @@ extern int ZEXPORT unzGoToNextFile (file) UNZ_OK if the file is found. It becomes the current file. UNZ_END_OF_LIST_OF_FILE if the file is not found */ -extern int ZEXPORT unzLocateFile (file, szFileName, iCaseSensitivity) - unzFile file; - const char *szFileName; - int iCaseSensitivity; +extern int ZEXPORT unzLocateFile (unzFile file, const char *szFileName, int iCaseSensitivity) { unz_s* s; int err; @@ -905,9 +867,7 @@ typedef struct unz_file_pos_s } unz_file_pos; */ -extern int ZEXPORT unzGetFilePos(file, file_pos) - unzFile file; - unz_file_pos* file_pos; +extern int ZEXPORT unzGetFilePos(unzFile file, unz_file_pos* file_pos) { unz_s* s; @@ -923,9 +883,7 @@ extern int ZEXPORT unzGetFilePos(file, file_pos) return UNZ_OK; } -extern int ZEXPORT unzGoToFilePos(file, file_pos) - unzFile file; - unz_file_pos* file_pos; +extern int ZEXPORT unzGoToFilePos(unzFile file, unz_file_pos*file_pos) { unz_s* s; int err; @@ -959,13 +917,11 @@ extern int ZEXPORT unzGoToFilePos(file, file_pos) store in *piSizeVar the size of extra info in local header (filename and size of extra field data) */ -local int unzlocal_CheckCurrentFileCoherencyHeader (s,piSizeVar, - poffset_local_extrafield, - psize_local_extrafield) - unz_s* s; - uInt* piSizeVar; - uLong *poffset_local_extrafield; - uInt *psize_local_extrafield; +local int unzlocal_CheckCurrentFileCoherencyHeader ( + unz_s* s, + uInt* piSizeVar, + uLong *poffset_local_extrafield, + uInt *psize_local_extrafield) { uLong uMagic,uData,uFlags; uLong size_filename; @@ -1050,12 +1006,12 @@ local int unzlocal_CheckCurrentFileCoherencyHeader (s,piSizeVar, Open for reading data the current file in the zipfile. If there is no error and the file is opened, the return value is UNZ_OK. */ -extern int ZEXPORT unzOpenCurrentFile3 (file, method, level, raw, password) - unzFile file; - int* method; - int* level; - int raw; - const char* password; +extern int ZEXPORT unzOpenCurrentFile3 ( + unzFile file, + int* method, + int* level, + int raw, + const char* password) { int err=UNZ_OK; uInt iSizeVar; @@ -1136,7 +1092,7 @@ extern int ZEXPORT unzOpenCurrentFile3 (file, method, level, raw, password) pfile_in_zip_read_info->stream.zalloc = (alloc_func)0; pfile_in_zip_read_info->stream.zfree = (free_func)0; pfile_in_zip_read_info->stream.opaque = (voidpf)0; - pfile_in_zip_read_info->stream.next_in = (voidpf)0; + pfile_in_zip_read_info->stream.next_in = (Bytef*)0; pfile_in_zip_read_info->stream.avail_in = 0; err=inflateInit2(&pfile_in_zip_read_info->stream, -MAX_WBITS); @@ -1195,24 +1151,21 @@ extern int ZEXPORT unzOpenCurrentFile3 (file, method, level, raw, password) return UNZ_OK; } -extern int ZEXPORT unzOpenCurrentFile (file) - unzFile file; +extern int ZEXPORT unzOpenCurrentFile (unzFile file) { return unzOpenCurrentFile3(file, NULL, NULL, 0, NULL); } -extern int ZEXPORT unzOpenCurrentFilePassword (file, password) - unzFile file; - const char* password; +extern int ZEXPORT unzOpenCurrentFilePassword (unzFile file, const char* password) { return unzOpenCurrentFile3(file, NULL, NULL, 0, password); } -extern int ZEXPORT unzOpenCurrentFile2 (file,method,level,raw) - unzFile file; - int* method; - int* level; - int raw; +extern int ZEXPORT unzOpenCurrentFile2 ( + unzFile file, + int* method, + int* level, + int raw) { return unzOpenCurrentFile3(file, method, level, raw, NULL); } @@ -1227,10 +1180,10 @@ extern int ZEXPORT unzOpenCurrentFile2 (file,method,level,raw) return <0 with error code if there is an error (UNZ_ERRNO for IO error, or zLib error for uncompress error) */ -extern int ZEXPORT unzReadCurrentFile (file, buf, len) - unzFile file; - voidp buf; - unsigned len; +extern int ZEXPORT unzReadCurrentFile( + unzFile file, + voidp buf, + unsigned len) { int err=UNZ_OK; uInt iRead = 0; @@ -1388,8 +1341,7 @@ extern int ZEXPORT unzReadCurrentFile (file, buf, len) /* Give the current position in uncompressed data */ -extern z_off_t ZEXPORT unztell (file) - unzFile file; +extern z_off_t ZEXPORT unztell (unzFile file) { unz_s* s; file_in_zip_read_info_s* pfile_in_zip_read_info; @@ -1408,8 +1360,7 @@ extern z_off_t ZEXPORT unztell (file) /* return 1 if the end of file was reached, 0 elsewhere */ -extern int ZEXPORT unzeof (file) - unzFile file; +extern int ZEXPORT unzeof (unzFile file) { unz_s* s; file_in_zip_read_info_s* pfile_in_zip_read_info; @@ -1441,10 +1392,10 @@ extern int ZEXPORT unzeof (file) the return value is the number of bytes copied in buf, or (if <0) the error code */ -extern int ZEXPORT unzGetLocalExtrafield (file,buf,len) - unzFile file; - voidp buf; - unsigned len; +extern int ZEXPORT unzGetLocalExtrafield ( + unzFile file, + voidp buf, + unsigned len) { unz_s* s; file_in_zip_read_info_s* pfile_in_zip_read_info; @@ -1492,8 +1443,7 @@ extern int ZEXPORT unzGetLocalExtrafield (file,buf,len) Close the file in zip opened with unzipOpenCurrentFile Return UNZ_CRCERROR if all the file was read but the CRC is not good */ -extern int ZEXPORT unzCloseCurrentFile (file) - unzFile file; +extern int ZEXPORT unzCloseCurrentFile (unzFile file) { int err=UNZ_OK; @@ -1535,12 +1485,11 @@ extern int ZEXPORT unzCloseCurrentFile (file) uSizeBuf is the size of the szComment buffer. return the number of byte copied or an error code <0 */ -extern int ZEXPORT unzGetGlobalComment (file, szComment, uSizeBuf) - unzFile file; - char *szComment; - uLong uSizeBuf; +extern int ZEXPORT unzGetGlobalComment ( + unzFile file, + char *szComment, + uLong uSizeBuf) { - int err=UNZ_OK; unz_s* s; uLong uReadThis ; if (file==NULL) @@ -1567,8 +1516,7 @@ extern int ZEXPORT unzGetGlobalComment (file, szComment, uSizeBuf) } /* Additions by RX '2004 */ -extern uLong ZEXPORT unzGetOffset (file) - unzFile file; +extern uLong ZEXPORT unzGetOffset (unzFile file) { unz_s* s; @@ -1583,9 +1531,9 @@ extern uLong ZEXPORT unzGetOffset (file) return s->pos_in_central_dir; } -extern int ZEXPORT unzSetOffset (file, pos) - unzFile file; - uLong pos; +extern int ZEXPORT unzSetOffset ( + unzFile file, + uLong pos) { unz_s* s; int err; diff --git a/JGE/src/unzip/zip.c b/JGE/src/unzip/zip.c index 7fbe00274..ec5abeba4 100644 --- a/JGE/src/unzip/zip.c +++ b/JGE/src/unzip/zip.c @@ -172,8 +172,7 @@ local linkedlist_datablock_internal* allocate_new_datablock() return ldi; } -local void free_datablock(ldi) - linkedlist_datablock_internal* ldi; +local void free_datablock(linkedlist_datablock_internal* ldi) { while (ldi!=NULL) { @@ -183,24 +182,24 @@ local void free_datablock(ldi) } } -local void init_linkedlist(ll) - linkedlist_data* ll; +local void init_linkedlist( + linkedlist_data* ll) { ll->first_block = ll->last_block = NULL; } -local void free_linkedlist(ll) - linkedlist_data* ll; +local void free_linkedlist( + linkedlist_data* ll) { free_datablock(ll->first_block); ll->first_block = ll->last_block = NULL; } -local int add_data_in_datablock(ll,buf,len) - linkedlist_data* ll; - const void* buf; - uLong len; +local int add_data_in_datablock( + linkedlist_data* ll, + const void* buf, + uLong len) { linkedlist_datablock_internal* ldi; const unsigned char* from_copy; @@ -263,11 +262,11 @@ local int add_data_in_datablock(ll,buf,len) local int ziplocal_putValue OF((const zlib_filefunc_def* pzlib_filefunc_def, voidpf filestream, uLong x, int nbByte)); -local int ziplocal_putValue (pzlib_filefunc_def, filestream, x, nbByte) - const zlib_filefunc_def* pzlib_filefunc_def; - voidpf filestream; - uLong x; - int nbByte; +local int ziplocal_putValue ( + const zlib_filefunc_def* pzlib_filefunc_def, + voidpf filestream, + uLong x, + int nbByte) { unsigned char buf[4]; int n; @@ -291,10 +290,10 @@ local int ziplocal_putValue (pzlib_filefunc_def, filestream, x, nbByte) } local void ziplocal_putValue_inmemory OF((void* dest, uLong x, int nbByte)); -local void ziplocal_putValue_inmemory (dest, x, nbByte) - void* dest; - uLong x; - int nbByte; +local void ziplocal_putValue_inmemory ( + void* dest, + uLong x, + int nbByte) { unsigned char* buf=(unsigned char*)dest; int n; @@ -315,9 +314,9 @@ local void ziplocal_putValue_inmemory (dest, x, nbByte) /****************************************************************************/ -local uLong ziplocal_TmzDateToDosDate(ptm,dosDate) - const tm_zip* ptm; - uLong dosDate; +local uLong ziplocal_TmzDateToDosDate( + const tm_zip* ptm, + uLong dosDate) { uLong year = (uLong)ptm->tm_year; if (year>1980) @@ -337,10 +336,10 @@ local int ziplocal_getByte OF(( voidpf filestream, int *pi)); -local int ziplocal_getByte(pzlib_filefunc_def,filestream,pi) - const zlib_filefunc_def* pzlib_filefunc_def; - voidpf filestream; - int *pi; +local int ziplocal_getByte( + const zlib_filefunc_def* pzlib_filefunc_def, + voidpf filestream, + int *pi) { unsigned char c; int err = (int)ZREAD(*pzlib_filefunc_def,filestream,&c,1); @@ -367,10 +366,10 @@ local int ziplocal_getShort OF(( voidpf filestream, uLong *pX)); -local int ziplocal_getShort (pzlib_filefunc_def,filestream,pX) - const zlib_filefunc_def* pzlib_filefunc_def; - voidpf filestream; - uLong *pX; +local int ziplocal_getShort ( + const zlib_filefunc_def* pzlib_filefunc_def, + voidpf filestream, + uLong *pX) { uLong x ; int i; @@ -395,10 +394,10 @@ local int ziplocal_getLong OF(( voidpf filestream, uLong *pX)); -local int ziplocal_getLong (pzlib_filefunc_def,filestream,pX) - const zlib_filefunc_def* pzlib_filefunc_def; - voidpf filestream; - uLong *pX; +local int ziplocal_getLong ( + const zlib_filefunc_def* pzlib_filefunc_def, + voidpf filestream, + uLong *pX) { uLong x ; int i; @@ -437,9 +436,9 @@ local uLong ziplocal_SearchCentralDir OF(( const zlib_filefunc_def* pzlib_filefunc_def, voidpf filestream)); -local uLong ziplocal_SearchCentralDir(pzlib_filefunc_def,filestream) - const zlib_filefunc_def* pzlib_filefunc_def; - voidpf filestream; +local uLong ziplocal_SearchCentralDir( + const zlib_filefunc_def* pzlib_filefunc_def, + voidpf filestream) { unsigned char* buf; uLong uSizeFile; @@ -496,11 +495,11 @@ local uLong ziplocal_SearchCentralDir(pzlib_filefunc_def,filestream) #endif /* !NO_ADDFILEINEXISTINGZIP*/ /************************************************************/ -extern zipFile ZEXPORT zipOpen2 (pathname, append, globalcomment, pzlib_filefunc_def) - const char *pathname; - int append; - zipcharpc* globalcomment; - zlib_filefunc_def* pzlib_filefunc_def; +extern zipFile ZEXPORT zipOpen2 ( + const char *pathname, + int append, + zipcharpc* globalcomment, + zlib_filefunc_def* pzlib_filefunc_def) { zip_internal ziinit; zip_internal* zi; @@ -615,7 +614,7 @@ extern zipFile ZEXPORT zipOpen2 (pathname, append, globalcomment, pzlib_filefunc if (size_comment>0) { - ziinit.globalcomment = ALLOC(size_comment+1); + ziinit.globalcomment = (char*)ALLOC(size_comment+1); if (ziinit.globalcomment) { size_comment = ZREAD(ziinit.z_filefunc, ziinit.filestream,ziinit.globalcomment,size_comment); @@ -680,35 +679,30 @@ extern zipFile ZEXPORT zipOpen2 (pathname, append, globalcomment, pzlib_filefunc } } -extern zipFile ZEXPORT zipOpen (pathname, append) - const char *pathname; - int append; +extern zipFile ZEXPORT zipOpen ( + const char *pathname, + int append) { return zipOpen2(pathname,append,NULL,NULL); } -extern int ZEXPORT zipOpenNewFileInZip3 (file, filename, zipfi, - extrafield_local, size_extrafield_local, - extrafield_global, size_extrafield_global, - comment, method, level, raw, - windowBits, memLevel, strategy, - password, crcForCrypting) - zipFile file; - const char* filename; - const zip_fileinfo* zipfi; - const void* extrafield_local; - uInt size_extrafield_local; - const void* extrafield_global; - uInt size_extrafield_global; - const char* comment; - int method; - int level; - int raw; - int windowBits; - int memLevel; - int strategy; - const char* password; - uLong crcForCrypting; +extern int ZEXPORT zipOpenNewFileInZip3 ( + zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw, + int windowBits, + int memLevel, + int strategy, + const char* password, + uLong crcForCrypting) { zip_internal* zi; uInt size_filename; @@ -896,21 +890,18 @@ extern int ZEXPORT zipOpenNewFileInZip3 (file, filename, zipfi, return err; } -extern int ZEXPORT zipOpenNewFileInZip2(file, filename, zipfi, - extrafield_local, size_extrafield_local, - extrafield_global, size_extrafield_global, - comment, method, level, raw) - zipFile file; - const char* filename; - const zip_fileinfo* zipfi; - const void* extrafield_local; - uInt size_extrafield_local; - const void* extrafield_global; - uInt size_extrafield_global; - const char* comment; - int method; - int level; - int raw; +extern int ZEXPORT zipOpenNewFileInZip2( + zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw) { return zipOpenNewFileInZip3 (file, filename, zipfi, extrafield_local, size_extrafield_local, @@ -920,20 +911,17 @@ extern int ZEXPORT zipOpenNewFileInZip2(file, filename, zipfi, NULL, 0); } -extern int ZEXPORT zipOpenNewFileInZip (file, filename, zipfi, - extrafield_local, size_extrafield_local, - extrafield_global, size_extrafield_global, - comment, method, level) - zipFile file; - const char* filename; - const zip_fileinfo* zipfi; - const void* extrafield_local; - uInt size_extrafield_local; - const void* extrafield_global; - uInt size_extrafield_global; - const char* comment; - int method; - int level; +extern int ZEXPORT zipOpenNewFileInZip ( + zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level) { return zipOpenNewFileInZip2 (file, filename, zipfi, extrafield_local, size_extrafield_local, @@ -941,8 +929,8 @@ extern int ZEXPORT zipOpenNewFileInZip (file, filename, zipfi, comment, method, level, 0); } -local int zipFlushWriteBuffer(zi) - zip_internal* zi; +local int zipFlushWriteBuffer( + zip_internal* zi) { int err=ZIP_OK; @@ -963,10 +951,10 @@ local int zipFlushWriteBuffer(zi) return err; } -extern int ZEXPORT zipWriteInFileInZip (file, buf, len) - zipFile file; - const void* buf; - unsigned len; +extern int ZEXPORT zipWriteInFileInZip ( + zipFile file, + const void* buf, + unsigned len) { zip_internal* zi; int err=ZIP_OK; @@ -978,9 +966,9 @@ extern int ZEXPORT zipWriteInFileInZip (file, buf, len) if (zi->in_opened_file_inzip == 0) return ZIP_PARAMERROR; - zi->ci.stream.next_in = (void*)buf; + zi->ci.stream.next_in = (Bytef*)buf; zi->ci.stream.avail_in = len; - zi->ci.crc32 = crc32(zi->ci.crc32,buf,len); + zi->ci.crc32 = crc32(zi->ci.crc32,(const Bytef*)buf,len); while ((err==ZIP_OK) && (zi->ci.stream.avail_in>0)) { @@ -1028,10 +1016,10 @@ extern int ZEXPORT zipWriteInFileInZip (file, buf, len) return err; } -extern int ZEXPORT zipCloseFileInZipRaw (file, uncompressed_size, crc32) - zipFile file; - uLong uncompressed_size; - uLong crc32; +extern int ZEXPORT zipCloseFileInZipRaw ( + zipFile file, + uLong uncompressed_size, + uLong crc32) { zip_internal* zi; uLong compressed_size; @@ -1124,15 +1112,15 @@ extern int ZEXPORT zipCloseFileInZipRaw (file, uncompressed_size, crc32) return err; } -extern int ZEXPORT zipCloseFileInZip (file) - zipFile file; +extern int ZEXPORT zipCloseFileInZip ( + zipFile file) { return zipCloseFileInZipRaw (file,0,0); } -extern int ZEXPORT zipClose (file, global_comment) - zipFile file; - const char* global_comment; +extern int ZEXPORT zipClose ( + zipFile file, + const char* global_comment) { zip_internal* zi; int err = 0; diff --git a/JGE/src/zipFS/zfsystem.cpp b/JGE/src/zipFS/zfsystem.cpp index 34699d080..7611b60cf 100644 --- a/JGE/src/zipFS/zfsystem.cpp +++ b/JGE/src/zipFS/zfsystem.cpp @@ -42,7 +42,6 @@ filesystem * filesystem::pCurrentFS = NULL; std::vector filesystem::m_Buffers; static const int STORED = 0; -static const int DEFLATED = 8; ////////////////////////////////////////////////////////////////////// // Construction/Destruction diff --git a/projects/mtg/iOS/Reachability/Reachability 2.0.4ddg/Reachability/Reachability.m b/projects/mtg/iOS/Reachability/Reachability 2.0.4ddg/Reachability/Reachability.m index 05ed2692f..257d5d9a1 100644 --- a/projects/mtg/iOS/Reachability/Reachability 2.0.4ddg/Reachability/Reachability.m +++ b/projects/mtg/iOS/Reachability/Reachability 2.0.4ddg/Reachability/Reachability.m @@ -180,7 +180,7 @@ static void logNetworkStatus_(const char *name, int line, NetworkStatus status) #define logNetworkStatus(status) #endif -@interface Reachability (private) +@interface Reachability () - (NetworkStatus) networkStatusForFlags: (SCNetworkReachabilityFlags) flags; diff --git a/projects/mtg/iOS/SoundManager/MyOpenALSupport.c b/projects/mtg/iOS/SoundManager/MyOpenALSupport.c index 51265e1af..4a51223d9 100755 --- a/projects/mtg/iOS/SoundManager/MyOpenALSupport.c +++ b/projects/mtg/iOS/SoundManager/MyOpenALSupport.c @@ -73,66 +73,67 @@ void* MyGetOpenALAudioData(CFURLRef inFileURL, ALsizei *outDataSize, ALenum *out void* theData = NULL; AudioStreamBasicDescription theOutputFormat; - // Open a file with ExtAudioFileOpen() - err = ExtAudioFileOpenURL(inFileURL, &extRef); - if(err) { printf("MyGetOpenALAudioData: ExtAudioFileOpenURL FAILED, Error = %ld\n", err); goto Exit; } - - // Get the audio data format - err = ExtAudioFileGetProperty(extRef, kExtAudioFileProperty_FileDataFormat, &thePropertySize, &theFileFormat); - if(err) { printf("MyGetOpenALAudioData: ExtAudioFileGetProperty(kExtAudioFileProperty_FileDataFormat) FAILED, Error = %ld\n", err); goto Exit; } - if (theFileFormat.mChannelsPerFrame > 2) { printf("MyGetOpenALAudioData - Unsupported Format, channel count is greater than stereo\n"); goto Exit;} + do { + // Open a file with ExtAudioFileOpen() + err = ExtAudioFileOpenURL(inFileURL, &extRef); + if(err) { printf("MyGetOpenALAudioData: ExtAudioFileOpenURL FAILED, Error = %ld\n", err); break; } - // Set the client format to 16 bit signed integer (native-endian) data - // Maintain the channel count and sample rate of the original source format - theOutputFormat.mSampleRate = theFileFormat.mSampleRate; - theOutputFormat.mChannelsPerFrame = theFileFormat.mChannelsPerFrame; + // Get the audio data format + err = ExtAudioFileGetProperty(extRef, kExtAudioFileProperty_FileDataFormat, &thePropertySize, &theFileFormat); + if(err) { printf("MyGetOpenALAudioData: ExtAudioFileGetProperty(kExtAudioFileProperty_FileDataFormat) FAILED, Error = %ld\n", err); break; } + if (theFileFormat.mChannelsPerFrame > 2) { printf("MyGetOpenALAudioData - Unsupported Format, channel count is greater than stereo\n"); break;} - theOutputFormat.mFormatID = kAudioFormatLinearPCM; - theOutputFormat.mBytesPerPacket = 2 * theOutputFormat.mChannelsPerFrame; - theOutputFormat.mFramesPerPacket = 1; - theOutputFormat.mBytesPerFrame = 2 * theOutputFormat.mChannelsPerFrame; - theOutputFormat.mBitsPerChannel = 16; - theOutputFormat.mFormatFlags = kAudioFormatFlagsNativeEndian | kAudioFormatFlagIsPacked | kAudioFormatFlagIsSignedInteger; + // Set the client format to 16 bit signed integer (native-endian) data + // Maintain the channel count and sample rate of the original source format + theOutputFormat.mSampleRate = theFileFormat.mSampleRate; + theOutputFormat.mChannelsPerFrame = theFileFormat.mChannelsPerFrame; + + theOutputFormat.mFormatID = kAudioFormatLinearPCM; + theOutputFormat.mBytesPerPacket = 2 * theOutputFormat.mChannelsPerFrame; + theOutputFormat.mFramesPerPacket = 1; + theOutputFormat.mBytesPerFrame = 2 * theOutputFormat.mChannelsPerFrame; + theOutputFormat.mBitsPerChannel = 16; + theOutputFormat.mFormatFlags = kAudioFormatFlagsNativeEndian | kAudioFormatFlagIsPacked | kAudioFormatFlagIsSignedInteger; + + // Set the desired client (output) data format + err = ExtAudioFileSetProperty(extRef, kExtAudioFileProperty_ClientDataFormat, sizeof(theOutputFormat), &theOutputFormat); + if(err) { printf("MyGetOpenALAudioData: ExtAudioFileSetProperty(kExtAudioFileProperty_ClientDataFormat) FAILED, Error = %ld\n", err); break; } + + // Get the total frame count + thePropertySize = sizeof(theFileLengthInFrames); + err = ExtAudioFileGetProperty(extRef, kExtAudioFileProperty_FileLengthFrames, &thePropertySize, &theFileLengthInFrames); + if(err) { printf("MyGetOpenALAudioData: ExtAudioFileGetProperty(kExtAudioFileProperty_FileLengthFrames) FAILED, Error = %ld\n", err); break; } + + // Read all the data into memory + UInt32 dataSize = theFileLengthInFrames * theOutputFormat.mBytesPerFrame;; + theData = malloc(dataSize); + if (theData) + { + AudioBufferList theDataBuffer; + theDataBuffer.mNumberBuffers = 1; + theDataBuffer.mBuffers[0].mDataByteSize = dataSize; + theDataBuffer.mBuffers[0].mNumberChannels = theOutputFormat.mChannelsPerFrame; + theDataBuffer.mBuffers[0].mData = theData; + + // Read the data into an AudioBufferList + err = ExtAudioFileRead(extRef, (UInt32*)&theFileLengthInFrames, &theDataBuffer); + if(err == noErr) + { + // success + *outDataSize = (ALsizei)dataSize; + *outDataFormat = (theOutputFormat.mChannelsPerFrame > 1) ? AL_FORMAT_STEREO16 : AL_FORMAT_MONO16; + *outSampleRate = (ALsizei)theOutputFormat.mSampleRate; + } + else + { + // failure + free (theData); + theData = NULL; // make sure to return NULL + printf("MyGetOpenALAudioData: ExtAudioFileRead FAILED, Error = %ld\n", err); break; + } + } + } while(0); - // Set the desired client (output) data format - err = ExtAudioFileSetProperty(extRef, kExtAudioFileProperty_ClientDataFormat, sizeof(theOutputFormat), &theOutputFormat); - if(err) { printf("MyGetOpenALAudioData: ExtAudioFileSetProperty(kExtAudioFileProperty_ClientDataFormat) FAILED, Error = %ld\n", err); goto Exit; } - - // Get the total frame count - thePropertySize = sizeof(theFileLengthInFrames); - err = ExtAudioFileGetProperty(extRef, kExtAudioFileProperty_FileLengthFrames, &thePropertySize, &theFileLengthInFrames); - if(err) { printf("MyGetOpenALAudioData: ExtAudioFileGetProperty(kExtAudioFileProperty_FileLengthFrames) FAILED, Error = %ld\n", err); goto Exit; } - - // Read all the data into memory - UInt32 dataSize = theFileLengthInFrames * theOutputFormat.mBytesPerFrame;; - theData = malloc(dataSize); - if (theData) - { - AudioBufferList theDataBuffer; - theDataBuffer.mNumberBuffers = 1; - theDataBuffer.mBuffers[0].mDataByteSize = dataSize; - theDataBuffer.mBuffers[0].mNumberChannels = theOutputFormat.mChannelsPerFrame; - theDataBuffer.mBuffers[0].mData = theData; - - // Read the data into an AudioBufferList - err = ExtAudioFileRead(extRef, (UInt32*)&theFileLengthInFrames, &theDataBuffer); - if(err == noErr) - { - // success - *outDataSize = (ALsizei)dataSize; - *outDataFormat = (theOutputFormat.mChannelsPerFrame > 1) ? AL_FORMAT_STEREO16 : AL_FORMAT_MONO16; - *outSampleRate = (ALsizei)theOutputFormat.mSampleRate; - } - else - { - // failure - free (theData); - theData = NULL; // make sure to return NULL - printf("MyGetOpenALAudioData: ExtAudioFileRead FAILED, Error = %ld\n", err); goto Exit; - } - } - -Exit: // Dispose the ExtAudioFileRef, it is no longer needed if (extRef) ExtAudioFileDispose(extRef); return theData; diff --git a/projects/mtg/iOS/SoundManager/SoundManager.m b/projects/mtg/iOS/SoundManager/SoundManager.m index d6c79cc32..22ad35d6b 100644 --- a/projects/mtg/iOS/SoundManager/SoundManager.m +++ b/projects/mtg/iOS/SoundManager/SoundManager.m @@ -206,7 +206,7 @@ SYNTHESIZE_SINGLETON_FOR_CLASS(SoundManager); ALenum format; ALsizei size; ALsizei freq; - ALvoid *data; + ALvoid *data = 0; alError = AL_NO_ERROR; NSBundle *bundle = [NSBundle mainBundle]; @@ -780,8 +780,6 @@ SYNTHESIZE_SINGLETON_FOR_CLASS(SoundManager); - (void)setActivated:(BOOL)aState { - OSStatus result; - if(aState) { NSLog(@"INFO - SoundManager: OpenAL Active"); diff --git a/projects/mtg/iOS/UI/WagicDownloadProgressViewController.m b/projects/mtg/iOS/UI/WagicDownloadProgressViewController.m index 480145397..fb0274c77 100644 --- a/projects/mtg/iOS/UI/WagicDownloadProgressViewController.m +++ b/projects/mtg/iOS/UI/WagicDownloadProgressViewController.m @@ -21,8 +21,6 @@ #define WAGIC_IOS_RESOURCE_NAME WAGIC_CORE_VERSION_STRING "_iOS.zip" -static NSString *kDownloadUrlPath = @"http://wagic.googlecode.com/files/"; - - (void) handleFailedDownload: (NSNotification *) sender { NSString *downloadType = [sender object]; @@ -103,6 +101,7 @@ static NSString *kDownloadUrlPath = @"http://wagic.googlecode.com/files/"; NSURL *url = nil; NSString *downloadFilename = nil; // determine which file to download + kDownloadFileName = [NSString stringWithCString: WAGIC_RESOURCE_NAME encoding:NSUTF8StringEncoding]; kDownloadIosUpdateFileName = [NSString stringWithCString: WAGIC_IOS_RESOURCE_NAME encoding:NSUTF8StringEncoding]; @@ -118,8 +117,9 @@ static NSString *kDownloadUrlPath = @"http://wagic.googlecode.com/files/"; { NSLog( @"Not Implemented for type: %@", downloadType); } + + url = [NSURL URLWithString: [NSString stringWithCString: WAGIC_RESOURCE_URL encoding:NSUTF8StringEncoding]]; - url = [NSURL URLWithString: [NSString stringWithFormat: @"%@/%@", kDownloadUrlPath, downloadFilename]]; NSString *downloadFilePath = [systemResourceDirectory stringByAppendingString: [NSString stringWithFormat: @"/%@", downloadFilename]]; NSLog(@"Downloading %@", [url absoluteURL]); diff --git a/projects/mtg/iOS/asi-http-request/ASIHTTPRequest.m b/projects/mtg/iOS/asi-http-request/ASIHTTPRequest.m index 77eac076c..cc8ba445a 100644 --- a/projects/mtg/iOS/asi-http-request/ASIHTTPRequest.m +++ b/projects/mtg/iOS/asi-http-request/ASIHTTPRequest.m @@ -573,7 +573,7 @@ static NSOperationQueue *sharedQueue = nil; return; } if ([self shouldStreamPostDataFromDisk]) { - [[self postBodyWriteStream] write:[data bytes] maxLength:[data length]]; + [[self postBodyWriteStream] write:(const uint8_t *)[data bytes] maxLength:[data length]]; } else { [[self postBody] appendData:data]; } @@ -3367,7 +3367,7 @@ static NSOperationQueue *sharedQueue = nil; [[self inflatedFileDownloadOutputStream] open]; } - [[self inflatedFileDownloadOutputStream] write:[inflatedData bytes] maxLength:[inflatedData length]]; + [[self inflatedFileDownloadOutputStream] write:(const uint8_t *)[inflatedData bytes] maxLength:[inflatedData length]]; } diff --git a/projects/mtg/src/AIPlayer.cpp b/projects/mtg/src/AIPlayer.cpp index fdb1e23bf..51b458c0d 100644 --- a/projects/mtg/src/AIPlayer.cpp +++ b/projects/mtg/src/AIPlayer.cpp @@ -16,8 +16,6 @@ int AIPlayer::totalAIDecks = -1; -const char * const MTG_LAND_TEXTS[] = { "artifact", "forest", "island", "mountain", "swamp", "plains", "other lands" }; - AIAction::AIAction(AIPlayer * owner, MTGCardInstance * c, MTGCardInstance * t) : owner(owner), ability(NULL), player(NULL), click(c), target(t) { diff --git a/projects/mtg/src/DeckMenu.cpp b/projects/mtg/src/DeckMenu.cpp index 8524fc90e..7c2e060f5 100644 --- a/projects/mtg/src/DeckMenu.cpp +++ b/projects/mtg/src/DeckMenu.cpp @@ -21,13 +21,10 @@ namespace DeckMenuConst const float kDescriptionVerticalBoxPadding = -5; const float kDescriptionHorizontalBoxPadding = 5; - const float kDefaultFontScale = 1.0f; const float kVerticalScrollSpeed = 7.0f; const int DETAILED_INFO_THRESHOLD = 20; const int kDetailedInfoButtonId = 10000; - - const PIXEL_TYPE kRedColor = ARGB(0xFF, 0xFF, 0x00, 0x00); } hgeParticleSystem* DeckMenu::stars = NULL; diff --git a/projects/mtg/src/GameStateDuel.cpp b/projects/mtg/src/GameStateDuel.cpp index b93b31b53..2af6be905 100644 --- a/projects/mtg/src/GameStateDuel.cpp +++ b/projects/mtg/src/GameStateDuel.cpp @@ -28,9 +28,6 @@ #include #endif -const float MENU_FONT_SCALE = 1.0f; - - enum ENUM_DUEL_STATE { DUEL_STATE_UNSET = 0, diff --git a/projects/mtg/src/SimplePad.cpp b/projects/mtg/src/SimplePad.cpp index f9d492c61..3f472657f 100644 --- a/projects/mtg/src/SimplePad.cpp +++ b/projects/mtg/src/SimplePad.cpp @@ -355,10 +355,9 @@ void SimplePad::Render() //This could use some cleaning up to make margins more explicit WFont * mFont = WResourceManager::Instance()->GetWFont(Fonts::MENU_FONT); - float offX = 0, offY = 0; + float offY = 0; float kH = mFont->GetHeight(); float hSpacing = mFont->GetStringWidth("W"); - float rowLen = mFont->GetStringWidth("JKLMNOPQR") + 14 * 7; float vSpacing = 0; float kW = hSpacing; @@ -401,7 +400,9 @@ void SimplePad::Render() if (!bShowNumpad) vSpacing -= kH + 12; #ifndef IOS - + float offX = 0; + float rowLen = mFont->GetStringWidth("JKLMNOPQR") + 14 * 7; + for (int x = 0; x < nbitems; x++) if (keys[x]) { diff --git a/projects/mtg/src/WGui.cpp b/projects/mtg/src/WGui.cpp index 4a1308f1b..f84fe3a1c 100644 --- a/projects/mtg/src/WGui.cpp +++ b/projects/mtg/src/WGui.cpp @@ -2308,8 +2308,10 @@ void WGuiKeyBinder::setData() j->ResetInput(); } +#if (!defined IOS) static const JButton btnToCheck[] = { JGE_BTN_MENU, JGE_BTN_CTRL, JGE_BTN_RIGHT, JGE_BTN_LEFT, JGE_BTN_UP, JGE_BTN_DOWN, JGE_BTN_OK, JGE_BTN_CANCEL, JGE_BTN_PRI, JGE_BTN_SEC, JGE_BTN_PREV, JGE_BTN_NEXT }; +#endif #define C(o) (static_cast(o)) WGuiBase::CONFIRM_TYPE WGuiKeyBinder::needsConfirm() diff --git a/projects/mtg/src/WResourceManager.cpp b/projects/mtg/src/WResourceManager.cpp index 2df9ffb7e..80e3c72ae 100644 --- a/projects/mtg/src/WResourceManager.cpp +++ b/projects/mtg/src/WResourceManager.cpp @@ -11,8 +11,10 @@ #endif #include "WFont.h" +#ifdef FORCE_LOW_CACHE_MEMORY //#define FORCE_LOW_CACHE_MEMORY const unsigned int kConstrainedCacheLimit = 8 * 1024 * 1024; +#endif extern bool neofont; int idCounter = OTHERS_OFFSET; From dbd7f82eabac421cb1f63b138654ee23ba349ab8 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 24 Aug 2015 10:03:34 +0800 Subject: [PATCH 046/249] added tokenizer test --- projects/mtg/bin/Res/test/tokenizer.txt | 29 ++++++++++++++++++++++++ projects/mtg/bin/Res/test/tokenizer2.txt | 27 ++++++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 projects/mtg/bin/Res/test/tokenizer.txt create mode 100644 projects/mtg/bin/Res/test/tokenizer2.txt diff --git a/projects/mtg/bin/Res/test/tokenizer.txt b/projects/mtg/bin/Res/test/tokenizer.txt new file mode 100644 index 000000000..96875f319 --- /dev/null +++ b/projects/mtg/bin/Res/test/tokenizer.txt @@ -0,0 +1,29 @@ +# Testing Tokenizer - Parallel Lives (ISD) 249662 +# Dragon Fodder (ALA) 174936 +# text=Put two 1/1 red Goblin creature tokens into play. +# Tokens must be 2.. since there are no tokenizer. +[INIT] +FIRSTMAIN +[PLAYER1] +hand:174936 +manapool:{R}{1} +inplay:249662 +[PLAYER2] +hand:Demystify +manapool:{W} +[DO] +174936 +no +yes +Demystify +249662 +endinterruption +[ASSERT] +FIRSTMAIN +[PLAYER1] +graveyard:249662,174936 +inplay:-174936,-174936 +[PLAYER2] +graveyard:Demystify +life:20 +[END] \ No newline at end of file diff --git a/projects/mtg/bin/Res/test/tokenizer2.txt b/projects/mtg/bin/Res/test/tokenizer2.txt new file mode 100644 index 000000000..0f413c291 --- /dev/null +++ b/projects/mtg/bin/Res/test/tokenizer2.txt @@ -0,0 +1,27 @@ +# Testing Tokenizer - Parallel Lives (ISD) 249662 +# Dragon Fodder (ALA) 174936 +# text=Put two 1/1 red Goblin creature tokens into play. +# Tokens must be 8.. since there are two tokenizer... original value +# is 2 with first tokenizer it will become 4, with the second tokenizer +# the value will be 8... +[INIT] +FIRSTMAIN +[PLAYER1] +hand:174936 +manapool:{R}{1} +inplay:249662,249662 +[PLAYER2] +inplay:plains +hand:Demystify +[DO] +174936 +[ASSERT] +FIRSTMAIN +[PLAYER1] +graveyard:174936 +inplay:249662,249662,-174936,-174936,-174936,-174936,-174936,-174936,-174936,-174936 +[PLAYER2] +hand:Demystify +inplay:plains +life:20 +[END] \ No newline at end of file From ac29367ff8c735f57a1eb239b205c07c1d5fdf40 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 24 Aug 2015 10:05:05 +0800 Subject: [PATCH 047/249] update _tests.txt --- projects/mtg/bin/Res/test/_tests.txt | 2 ++ projects/mtg/include/AllAbilities.h | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/projects/mtg/bin/Res/test/_tests.txt b/projects/mtg/bin/Res/test/_tests.txt index 0d65718ba..a286cede6 100644 --- a/projects/mtg/bin/Res/test/_tests.txt +++ b/projects/mtg/bin/Res/test/_tests.txt @@ -662,6 +662,8 @@ tidal_warrior_i649.txt tidal_warrior_i652.txt Timely_Reinforcements.txt titanic_ultimatum.txt +tokenizer.txt +tokenizer2.txt torture.txt tranquil_domain.txt turn_to_slag.txt diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index e3eb4a783..476c670b3 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -3212,7 +3212,7 @@ public: } return multiplier->getValue()*tokenize; } - else + else return multiplier->getValue(); } From 2998e95a3b2692d5d9f11d75dcb748c3491b7400 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 24 Aug 2015 22:39:54 +0800 Subject: [PATCH 048/249] tokenizer should work now for cloning ability Populate(Put a token onto the battlefield that's a copy of a creature token you control.) --- projects/mtg/src/AllAbilities.cpp | 68 +++++++++++++++++++------------ 1 file changed, 41 insertions(+), 27 deletions(-) diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index 364f1408f..f45b94a7d 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -2489,35 +2489,49 @@ int AACloner::resolve() Player * targetPlayer = who == 1 ? source->controller()->opponent() : source->controller(); - MTGCardInstance * myClone = NEW MTGCardInstance(clone, targetPlayer->game); - targetPlayer->game->temp->addCard(myClone); + int tokenize = 1;//tokenizer support for cloning + if (targetPlayer->game->battlefield->hasAbility(Constants::TOKENIZER)) + { + int nbcards = targetPlayer->game->battlefield->nb_cards; + for (int j = 0; j < nbcards; j++) + { + if (targetPlayer->game->battlefield->cards[j]->has(Constants::TOKENIZER)) + tokenize *= 2; + } + } + + for (int i = 0; i < tokenize; ++i) + { + MTGCardInstance * myClone = NEW MTGCardInstance(clone, targetPlayer->game); + targetPlayer->game->temp->addCard(myClone); - Spell * spell = NEW Spell(game, myClone); - spell->source->isToken = 1; - spell->resolve(); - spell->source->fresh = 1; - spell->source->model = spell->source; - spell->source->model->data = spell->source; - if(_target->isToken) - { - spell->source->power = _target->origpower; - spell->source->toughness = _target->origtoughness; - spell->source->life = _target->origtoughness; + Spell * spell = NEW Spell(game, myClone); + spell->source->isToken = 1; + spell->resolve(); + spell->source->fresh = 1; + spell->source->model = spell->source; + spell->source->model->data = spell->source; + if(_target->isToken) + { + spell->source->power = _target->origpower; + spell->source->toughness = _target->origtoughness; + spell->source->life = _target->origtoughness; + } + list::iterator it; + for (it = awith.begin(); it != awith.end(); it++) + { + spell->source->basicAbilities[*it] = 1; + } + for (it = colors.begin(); it != colors.end(); it++) + { + spell->source->setColor(*it); + } + for (it = typesToAdd.begin(); it != typesToAdd.end(); it++) + { + spell->source->addType(*it); + } + delete spell; } - list::iterator it; - for (it = awith.begin(); it != awith.end(); it++) - { - spell->source->basicAbilities[*it] = 1; - } - for (it = colors.begin(); it != colors.end(); it++) - { - spell->source->setColor(*it); - } - for (it = typesToAdd.begin(); it != typesToAdd.end(); it++) - { - spell->source->addType(*it); - } - delete spell; return 1; } From 588f7fe2fb6bb574c1043444fb0f59c1f49acfbc Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Wed, 26 Aug 2015 23:40:30 +0800 Subject: [PATCH 049/249] remove token workaround --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 32 +++----------------- 1 file changed, 4 insertions(+), 28 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 2cb306c77..27e003d88 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -3777,7 +3777,7 @@ type=Sorcery [/card] [card] name=Arc Mage -auto={2}{R}{T}:token(-1111113) && damage:1 target(creature,player) +auto={2}{R}{T}{discard(*|myhand)}:damage:1 target(creature,player) && activate damage:1 target(creature,player) text={2}{R}, {T}, Discard a card: Arc Mage deals 2 damage divided as you choose among one or two target creatures and/or players. mana={2}{R} type=Creature @@ -3786,14 +3786,6 @@ power=2 toughness=2 [/card] [card] -name=Arc Mage's 2nd Damage -auto=counter(0/0,1,Arc Mage) -auto=@damaged(creature,player):thisforeach(counter{0/0.1.Arc Mage}>0) damage:1 target(creature,player) && counter(0/0,-1,Arc Mage) && counter(0/0,1,Bury) -auto=thisforeach(counter{0/0.1.Bury}>0) bury -id=-1111113 -type=Nothing -[/card] -[card] name=Arc Runner abilities=haste,treason text=Haste -- At the beginning of the end step, sacrifice Arc Runner. @@ -32660,20 +32652,13 @@ toughness=1 name=Fire at Will target=creature[attacking;blocking] auto=damage:1 -auto=may damage:1 target(creature[attacking;blocking]) -auto=token(-1111121) +auto=damage:1 target(creature[attacking;blocking]) +auto=ability$!name(damage) choice target(creature[attacking;blocking]) damage:1!$ controller text=Fire at Will deals 3 damage divided as you choose among one, two, or three target attacking or blocking creatures. mana={RW}{RW}{RW} type=Instant [/card] [card] -name=Fire at Will's 3rd Damage -auto=@movedto(exile) from(this):may damage:1 target(creature,player) -auto=moveto(exile) -id=-1111121 -type=Nothing -[/card] -[card] name=Firebolt target=creature,player auto=damage:2 @@ -51042,7 +51027,7 @@ toughness=1 [card] name=Kiora, the Crashing Wave auto=counter(0/0,2,loyalty) -auto={C(0/0,1,Loyalty)}:name(+1: Prevention) token(37852101) controller +auto={C(0/0,1,Loyalty)}:name(+1: Prevention) target(*|opponentbattlefield) transforms((,newability[preventalldamage from(this)],newability[preventalldamage to(this)])) uynt auto={C(0/0,-1,Loyalty)}:name(-1: Draw 1 and Lands +1) draw:1 controller && maxPlay(land)+1 ueot auto={C(0/0,-5,Loyalty)}:emblem name(-5: Emblem) transforms((,newability[@each my endofturn:token(-378521) controller])) forever dontremove text=+1: Until your next turn, prevent all damage that would be dealt to and dealt by target permanent an opponent controls. -- -1: Draw a card. You may play an additional land this turn. -- -5: You get an emblem with "At the beginning of your end step, put a 9/9 blue Kraken creature token onto the battlefield." -- Starting Loyalty (2) @@ -51051,15 +51036,6 @@ type=Planeswalker subtype=Kiora [/card] [card] -name=Kiora's Prevention -abilities=indestructible,shroud -type=nothing -text=Until your next turn, prevent all damage that would be dealt to and dealt by target permanent an opponent controls. -auto=name(Prevention) target(*|opponentbattlefield) transforms((,newability[preventalldamage from(this)],newability[preventalldamage to(this)])) uynt -auto=@each myuntap:moveto(exile) all(this) -color=green,blue -[/card] -[card] name=Kiora's Kraken type=Creature subtype=Kraken From 7436bf9e64f48f4988407b51c217844a1e055a0f Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 27 Aug 2015 11:07:18 +0800 Subject: [PATCH 050/249] added ORI _cards.dat --- projects/mtg/bin/Res/sets/ORI/_cards.dat | 1391 ++++++++++++++++++++++ 1 file changed, 1391 insertions(+) create mode 100644 projects/mtg/bin/Res/sets/ORI/_cards.dat diff --git a/projects/mtg/bin/Res/sets/ORI/_cards.dat b/projects/mtg/bin/Res/sets/ORI/_cards.dat new file mode 100644 index 000000000..55bb1f173 --- /dev/null +++ b/projects/mtg/bin/Res/sets/ORI/_cards.dat @@ -0,0 +1,1391 @@ +[meta] +author=Wagic Team +name=Magic Origins +year=2015 +[/meta] +[card] +primitive=Abbot of Keral Keep +id=398411 +rarity=R +[/card] +[card] +primitive=Acolyte of the Inferno +id=398574 +rarity=U +[/card] +[card] +primitive=Act of Treason +id=398578 +rarity=C +[/card] +[card] +primitive=Aerial Volley +id=398565 +rarity=C +[/card] +[card] +primitive=Akroan Jailer +id=398656 +rarity=C +[/card] +[card] +primitive=Akroan Sergeant +id=398604 +rarity=C +[/card] +[card] +primitive=Alchemist's Vial +id=398640 +rarity=C +[/card] +[card] +primitive=Alhammarret, High Arbiter +id=398436 +rarity=R +[/card] +[card] +primitive=Alhammarret's Archive +id=398564 +rarity=M +[/card] +[card] +primitive=Ampryn Tactician +id=398603 +rarity=C +[/card] +[card] +primitive=Anchor to the AEther +id=398474 +rarity=U +[/card] +[card] +primitive=Angel's Tomb +id=398418 +rarity=U +[/card] +[card] +primitive=Animist's Awakening +id=398437 +rarity=R +[/card] +[card] +primitive=Anointer of Champions +id=398455 +rarity=U +[/card] +[card] +primitive=Archangel of Tithes +id=398571 +rarity=M +[/card] +[card] +primitive=Artificer's Epiphany +id=398462 +rarity=C +[/card] +[card] +primitive=Aspiring Aeronaut +id=398674 +rarity=C +[/card] +[card] +primitive=Auramancer +id=398678 +rarity=C +[/card] +[card] +primitive=Avaricious Dragon +id=398667 +rarity=M +[/card] +[card] +primitive=Aven Battle Priest +id=398627 +rarity=C +[/card] +[card] +primitive=Battlefield Forge +id=398417 +rarity=R +[/card] +[card] +primitive=Bellows Lizard +id=398439 +rarity=C +[/card] +[card] +primitive=Blazing Hellhound +id=398660 +rarity=U +[/card] +[card] +primitive=Blessed Spirits +id=398628 +rarity=U +[/card] +[card] +primitive=Blightcaster +id=398618 +rarity=U +[/card] +[card] +primitive=Blood-Cursed Knight +id=398527 +rarity=U +[/card] +[card] +primitive=Boggart Brute +id=398606 +rarity=C +[/card] +[card] +primitive=Bonded Construct +id=398665 +rarity=C +[/card] +[card] +primitive=Bone to Ash +id=398539 +rarity=C +[/card] +[card] +primitive=Bounding Krasis +id=398635 +rarity=U +[/card] +[card] +primitive=Brawler's Plate +id=398532 +rarity=U +[/card] +[card] +primitive=Calculated Dismissal +id=398480 +rarity=C +[/card] +[card] +primitive=Call of the Full Moon +id=398457 +rarity=U +[/card] +[card] +primitive=Catacomb Slug +id=398473 +rarity=C +[/card] +[card] +primitive=Caustic Caterpillar +id=398409 +rarity=C +[/card] +[card] +primitive=Caves of Koilos +id=398504 +rarity=R +[/card] +[card] +primitive=Celestial Flare +id=398488 +rarity=C +[/card] +[card] +primitive=Chandra, Fire of Kaladesh +id=398422 +rarity=M +[/card] +[card] +primitive=Chandra, Roaring Flame +id=398423 +rarity=T +[/card] +[card] +primitive=Chandra's Fury +id=398632 +rarity=C +[/card] +[card] +primitive=Chandra's Ignition +id=398416 +rarity=R +[/card] +[card] +primitive=Charging Griffin +id=398560 +rarity=C +[/card] +[card] +primitive=Chief of the Foundry +id=398581 +rarity=U +[/card] +[card] +primitive=Citadel Castellan +id=398672 +rarity=U +[/card] +[card] +primitive=Clash of Wills +id=398542 +rarity=U +[/card] +[card] +primitive=Claustrophobia +id=398607 +rarity=C +[/card] +[card] +primitive=Cleric of the Forward Order +id=398451 +rarity=C +[/card] +[card] +primitive=Cobblebrute +id=398616 +rarity=C +[/card] +[card] +primitive=Conclave Naturalists +id=398419 +rarity=U +[/card] +[card] +primitive=Consecrated by Blood +id=398512 +rarity=U +[/card] +[card] +primitive=Consul's Lieutenant +id=398446 +rarity=U +[/card] +[card] +primitive=Cruel Revival +id=398415 +rarity=U +[/card] +[card] +primitive=Dark Dabbling +id=398466 +rarity=C +[/card] +[card] +primitive=Dark Petition +id=398525 +rarity=R +[/card] +[card] +primitive=Day's Undoing +id=398652 +rarity=M +[/card] +[card] +primitive=Deadbridge Shaman +id=398500 +rarity=C +[/card] +[card] +primitive=Deep-Sea Terror +id=398605 +rarity=C +[/card] +[card] +primitive=Demolish +id=398486 +rarity=C +[/card] +[card] +primitive=Demonic Pact +id=398433 +rarity=M +[/card] +[card] +primitive=Despoiler of Souls +id=398587 +rarity=R +[/card] +[card] +primitive=Disciple of the Ring +id=398583 +rarity=M +[/card] +[card] +primitive=Disperse +id=398528 +rarity=C +[/card] +[card] +primitive=Displacement Wave +id=398580 +rarity=R +[/card] +[card] +primitive=Dragon Fodder +id=398647 +rarity=C +[/card] +[card] +primitive=Dreadwaters +id=398405 +rarity=C +[/card] +[card] +primitive=Dwynen, Gilt-Leaf Daen +id=398546 +rarity=R +[/card] +[card] +primitive=Dwynen's Elite +id=398609 +rarity=U +[/card] +[card] +primitive=Elemental Bond +id=398406 +rarity=U +[/card] +[card] +primitive=Elvish Visionary +id=398554 +rarity=C +[/card] +[card] +primitive=Embermaw Hellion +id=398576 +rarity=R +[/card] +[card] +primitive=Enlightened Ascetic +id=398414 +rarity=C +[/card] +[card] +primitive=Enshrouding Mist +id=398654 +rarity=C +[/card] +[card] +primitive=Enthralling Victor +id=398493 +rarity=U +[/card] +[card] +primitive=Erebos's Titan +id=398584 +rarity=M +[/card] +[card] +primitive=Evolutionary Leap +id=398573 +rarity=R +[/card] +[card] +primitive=Evolving Wilds +id=398548 +rarity=C +[/card] +[card] +primitive=Exquisite Firecraft +id=398513 +rarity=R +[/card] +[card] +primitive=Eyeblight Assassin +id=398535 +rarity=C +[/card] +[card] +primitive=Eyeblight Massacre +id=398645 +rarity=U +[/card] +[card] +primitive=Faerie Miscreant +id=398459 +rarity=C +[/card] +[card] +primitive=Fetid Imp +id=398633 +rarity=C +[/card] +[card] +primitive=Fiery Conclusion +id=398497 +rarity=U +[/card] +[card] +primitive=Fiery Impulse +id=398516 +rarity=C +[/card] +[card] +primitive=Firefiend Elemental +id=398590 +rarity=C +[/card] +[card] +primitive=Flameshadow Conjuring +id=398547 +rarity=R +[/card] +[card] +primitive=Fleshbag Marauder +id=398625 +rarity=U +[/card] +[card] +primitive=Forest +id=398570 +rarity=C +[/card] +[card] +primitive=Foundry of the Consuls +id=398613 +rarity=U +[/card] +[card] +primitive=Gaea's Revenge +id=398501 +rarity=R +[/card] +[card] +primitive=Gather the Pack +id=398448 +rarity=U +[/card] +[card] +primitive=Ghirapur AEther Grid +id=398517 +rarity=U +[/card] +[card] +primitive=Ghirapur Gearcrafter +id=398681 +rarity=C +[/card] +[card] +primitive=Gideon, Battle-Forged +id=398429 +rarity=T +[/card] +[card] +primitive=Gideon's Phalanx +id=398471 +rarity=R +[/card] +[card] +primitive=Gilt-Leaf Winnower +id=398495 +rarity=R +[/card] +[card] +primitive=Gnarlroot Trapper +id=398413 +rarity=U +[/card] +[card] +primitive=Goblin Glory Chaser +id=398598 +rarity=U +[/card] +[card] +primitive=Goblin Piledriver +id=398537 +rarity=R +[/card] +[card] +primitive=Gold-Forged Sentinel +id=398585 +rarity=U +[/card] +[card] +primitive=Grasp of the Hieromancer +id=398558 +rarity=C +[/card] +[card] +primitive=Graveblade Marauder +id=398526 +rarity=R +[/card] +[card] +primitive=Guardian Automaton +id=398509 +rarity=C +[/card] +[card] +primitive=Guardians of Meletis +id=398553 +rarity=C +[/card] +[card] +primitive=Hallowed Moonlight +id=398505 +rarity=R +[/card] +[card] +primitive=Hangarback Walker +id=398572 +rarity=R +[/card] +[card] +primitive=Harbinger of the Tides +id=398569 +rarity=R +[/card] +[card] +primitive=Healing Hands +id=398563 +rarity=C +[/card] +[card] +primitive=Heavy Infantry +id=398408 +rarity=C +[/card] +[card] +primitive=Helm of the Gods +id=398588 +rarity=R +[/card] +[card] +primitive=Herald of the Pantheon +id=398460 +rarity=R +[/card] +[card] +primitive=Hitchclaw Recluse +id=398676 +rarity=C +[/card] +[card] +primitive=Hixus, Prison Warden +id=398611 +rarity=R +[/card] +[card] +primitive=Honored Hierarch +id=398450 +rarity=R +[/card] +[card] +primitive=Hydrolash +id=398666 +rarity=U +[/card] +[card] +primitive=Infectious Bloodlust +id=398582 +rarity=C +[/card] +[card] +primitive=Infernal Scarring +id=398638 +rarity=C +[/card] +[card] +primitive=Infinite Obliteration +id=398503 +rarity=R +[/card] +[card] +primitive=Iroas's Champion +id=398653 +rarity=U +[/card] +[card] +primitive=Island +id=398586 +rarity=C +[/card] +[card] +primitive=Jace, Telepath Unbound +id=398435 +rarity=T +[/card] +[card] +primitive=Jace, Vryn's Prodigy +id=398434 +rarity=M +[/card] +[card] +primitive=Jace's Sanctum +id=398614 +rarity=R +[/card] +[card] +primitive=Jayemdae Tome +id=398530 +rarity=U +[/card] +[card] +primitive=Jhessian Thief +id=398536 +rarity=U +[/card] +[card] +primitive=Joraga Invocation +id=398642 +rarity=U +[/card] +[card] +primitive=Knight of the Pilgrim's Road +id=398420 +rarity=C +[/card] +[card] +primitive=Knight of the White Orchid +id=398594 +rarity=R +[/card] +[card] +primitive=Knightly Valor +id=398622 +rarity=U +[/card] +[card] +primitive=Kothophed, Soul Hoarder +id=398443 +rarity=R +[/card] +[card] +primitive=Kytheon, Hero of Akros +id=398428 +rarity=M +[/card] +[card] +primitive=Kytheon's Irregulars +id=398561 +rarity=R +[/card] +[card] +primitive=Kytheon's Tactics +id=398470 +rarity=C +[/card] +[card] +primitive=Languish +id=398597 +rarity=R +[/card] +[card] +primitive=Leaf Gilder +id=398634 +rarity=C +[/card] +[card] +primitive=Lightning Javelin +id=398538 +rarity=C +[/card] +[card] +primitive=Liliana, Defiant Necromancer +id=398442 +rarity=T +[/card] +[card] +primitive=Liliana, Heretical Healer +id=398441 +rarity=M +[/card] +[card] +primitive=Llanowar Empath +id=398482 +rarity=C +[/card] +[card] +primitive=Llanowar Wastes +id=398589 +rarity=R +[/card] +[card] +primitive=Macabre Waltz +id=398494 +rarity=C +[/card] +[card] +primitive=Mage-Ring Bully +id=398426 +rarity=C +[/card] +[card] +primitive=Mage-Ring Network +id=398533 +rarity=U +[/card] +[card] +primitive=Mage-Ring Responder +id=398620 +rarity=R +[/card] +[card] +primitive=Magmatic Insight +id=398496 +rarity=U +[/card] +[card] +primitive=Malakir Cullblade +id=398556 +rarity=U +[/card] +[card] +primitive=Managorger Hydra +id=398456 +rarity=R +[/card] +[card] +primitive=Mantle of Webs +id=398577 +rarity=C +[/card] +[card] +primitive=Maritime Guard +id=398670 +rarity=C +[/card] +[card] +primitive=Meteorite +id=398499 +rarity=U +[/card] +[card] +primitive=Might of the Masses +id=398662 +rarity=C +[/card] +[card] +primitive=Mighty Leap +id=398630 +rarity=C +[/card] +[card] +primitive=Mizzium Meddler +id=398596 +rarity=R +[/card] +[card] +primitive=Molten Vortex +id=398649 +rarity=R +[/card] +[card] +primitive=Mountain +id=398510 +rarity=C +[/card] +[card] +primitive=Murder Investigation +id=398641 +rarity=U +[/card] +[card] +primitive=Nantuko Husk +id=398440 +rarity=C +[/card] +[card] +primitive=Necromantic Summons +id=398491 +rarity=U +[/card] +[card] +primitive=Negate +id=398629 +rarity=C +[/card] +[card] +primitive=Nightsnare +id=398562 +rarity=C +[/card] +[card] +primitive=Nissa, Sage Animist +id=398432 +rarity=T +[/card] +[card] +primitive=Nissa, Vastwood Seer +id=398438 +rarity=M +[/card] +[card] +primitive=Nissa's Pilgrimage +id=398593 +rarity=C +[/card] +[card] +primitive=Nissa's Revelation +id=398506 +rarity=R +[/card] +[card] +primitive=Nivix Barrier +id=398465 +rarity=C +[/card] +[card] +primitive=Orbs of Warding +id=398551 +rarity=R +[/card] +[card] +primitive=Orchard Spirit +id=398644 +rarity=C +[/card] +[card] +primitive=Outland Colossus +id=398668 +rarity=R +[/card] +[card] +primitive=Patron of the Valiant +id=398631 +rarity=U +[/card] +[card] +primitive=Pharika's Disciple +id=398531 +rarity=C +[/card] +[card] +primitive=Pia and Kiran Nalaar +id=398453 +rarity=R +[/card] +[card] +primitive=Plains +id=398675 +rarity=C +[/card] +[card] +primitive=Possessed Skaab +id=398657 +rarity=U +[/card] +[card] +primitive=Prickleboar +id=398449 +rarity=C +[/card] +[card] +primitive=Priest of the Blood Rite +id=398639 +rarity=R +[/card] +[card] +primitive=Prism Ring +id=398646 +rarity=U +[/card] +[card] +primitive=Psychic Rebuttal +id=398479 +rarity=U +[/card] +[card] +primitive=Pyromancer's Goggles +id=398427 +rarity=M +[/card] +[card] +primitive=Rabid Bloodsucker +id=398557 +rarity=C +[/card] +[card] +primitive=Ramroller +id=398467 +rarity=U +[/card] +[card] +primitive=Ravaging Blaze +id=398601 +rarity=U +[/card] +[card] +primitive=Read the Bones +id=398637 +rarity=C +[/card] +[card] +primitive=Reave Soul +id=398591 +rarity=C +[/card] +[card] +primitive=Reclaim +id=398543 +rarity=C +[/card] +[card] +primitive=Reclusive Artificer +id=398521 +rarity=U +[/card] +[card] +primitive=Relic Seeker +id=398476 +rarity=R +[/card] +[card] +primitive=Returned Centaur +id=398468 +rarity=C +[/card] +[card] +primitive=Revenant +id=398575 +rarity=U +[/card] +[card] +primitive=Rhox Maulers +id=398663 +rarity=C +[/card] +[card] +primitive=Ringwarden Owl +id=398464 +rarity=C +[/card] +[card] +primitive=Rogue's Passage +id=398523 +rarity=U +[/card] +[card] +primitive=Runed Servitor +id=398643 +rarity=U +[/card] +[card] +primitive=Scab-Clan Berserker +id=398461 +rarity=R +[/card] +[card] +primitive=Scrapskin Drake +id=398478 +rarity=C +[/card] +[card] +primitive=Screeching Skaab +id=398487 +rarity=C +[/card] +[card] +primitive=Seismic Elemental +id=398579 +rarity=U +[/card] +[card] +primitive=Send to Sleep +id=398545 +rarity=C +[/card] +[card] +primitive=Sentinel of the Eternal Watch +id=398659 +rarity=U +[/card] +[card] +primitive=Separatist Voidmage +id=398608 +rarity=C +[/card] +[card] +primitive=Shadows of the Past +id=398522 +rarity=U +[/card] +[card] +primitive=Shaman of the Pack +id=398489 +rarity=U +[/card] +[card] +primitive=Shambling Ghoul +id=398552 +rarity=C +[/card] +[card] +primitive=Shivan Reef +id=398444 +rarity=R +[/card] +[card] +primitive=Sigil of the Empty Throne +id=398524 +rarity=R +[/card] +[card] +primitive=Sigil of Valor +id=398515 +rarity=U +[/card] +[card] +primitive=Sigiled Starfish +id=398592 +rarity=U +[/card] +[card] +primitive=Skaab Goliath +id=398559 +rarity=U +[/card] +[card] +primitive=Skyraker Giant +id=398430 +rarity=U +[/card] +[card] +primitive=Skysnare Spider +id=398650 +rarity=U +[/card] +[card] +primitive=Smash to Smithereens +id=398669 +rarity=C +[/card] +[card] +primitive=Somberwald Alpha +id=398626 +rarity=U +[/card] +[card] +primitive=Soulblade Djinn +id=398485 +rarity=R +[/card] +[card] +primitive=Sphinx's Tutelage +id=398520 +rarity=U +[/card] +[card] +primitive=Stalwart Aven +id=398624 +rarity=C +[/card] +[card] +primitive=Starfield of Nyx +id=398475 +rarity=M +[/card] +[card] +primitive=Stratus Walk +id=398549 +rarity=C +[/card] +[card] +primitive=Subterranean Scout +id=398458 +rarity=C +[/card] +[card] +primitive=Suppression Bonds +id=398602 +rarity=C +[/card] +[card] +primitive=Swamp +id=398555 +rarity=C +[/card] +[card] +primitive=Swift Reckoning +id=398481 +rarity=U +[/card] +[card] +primitive=Sword of the Animist +id=398492 +rarity=R +[/card] +[card] +primitive=Sylvan Messenger +id=398651 +rarity=U +[/card] +[card] +primitive=Tainted Remedy +id=398612 +rarity=R +[/card] +[card] +primitive=Talent of the Telepath +id=398483 +rarity=R +[/card] +[card] +primitive=The Great Aurora +id=398679 +rarity=M +[/card] +[card] +primitive=Thopter Engineer +id=398514 +rarity=U +[/card] +[card] +primitive=Thopter Spy Network +id=398519 +rarity=R +[/card] +[card] +primitive=Thornbow Archer +id=398407 +rarity=C +[/card] +[card] +primitive=Throwing Knife +id=398595 +rarity=U +[/card] +[card] +primitive=Thunderclap Wyvern +id=398655 +rarity=U +[/card] +[card] +primitive=Timberpack Wolf +id=398445 +rarity=C +[/card] +[card] +primitive=Titanic Growth +id=398648 +rarity=C +[/card] +[card] +primitive=Titan's Strength +id=398680 +rarity=C +[/card] +[card] +primitive=Topan Freeblade +id=398619 +rarity=C +[/card] +[card] +primitive=Tormented Thoughts +id=398623 +rarity=U +[/card] +[card] +primitive=Totem-Guide Hartebeest +id=398599 +rarity=U +[/card] +[card] +primitive=Touch of Moonglove +id=398600 +rarity=C +[/card] +[card] +primitive=Tower Geist +id=398615 +rarity=U +[/card] +[card] +primitive=Tragic Arrogance +id=398610 +rarity=R +[/card] +[card] +primitive=Turn to Frog +id=398463 +rarity=U +[/card] +[card] +primitive=Undead Servant +id=398484 +rarity=C +[/card] +[card] +primitive=Undercity Troll +id=398568 +rarity=U +[/card] +[card] +primitive=Unholy Hunger +id=398452 +rarity=C +[/card] +[card] +primitive=Valeron Wardens +id=398447 +rarity=U +[/card] +[card] +primitive=Valor in Akros +id=398529 +rarity=U +[/card] +[card] +primitive=Vastwood Gorger +id=398469 +rarity=C +[/card] +[card] +primitive=Veteran's Sidearm +id=398498 +rarity=C +[/card] +[card] +primitive=Vine Snare +id=398658 +rarity=C +[/card] +[card] +primitive=Volcanic Rambler +id=398636 +rarity=C +[/card] +[card] +primitive=Vryn Wingmare +id=398567 +rarity=R +[/card] +[card] +primitive=War Horn +id=398673 +rarity=U +[/card] +[card] +primitive=War Oracle +id=398621 +rarity=U +[/card] +[card] +primitive=Watercourser +id=398540 +rarity=C +[/card] +[card] +primitive=Weight of the Underworld +id=398544 +rarity=C +[/card] +[card] +primitive=Whirler Rogue +id=398410 +rarity=U +[/card] +[card] +primitive=Wild Instincts +id=398508 +rarity=C +[/card] +[card] +primitive=Willbreaker +id=398502 +rarity=R +[/card] +[card] +primitive=Woodland Bellower +id=398511 +rarity=M +[/card] +[card] +primitive=Yavimaya Coast +id=398566 +rarity=R +[/card] +[card] +primitive=Yeva's Forcemage +id=398424 +rarity=C +[/card] +[card] +primitive=Yoked Ox +id=398671 +rarity=C +[/card] +[card] +primitive=Zendikar Incarnate +id=398661 +rarity=U +[/card] +[card] +primitive=Zendikar's Roil +id=398518 +rarity=U +[/card] +[card] +primitive=Forest +id=398421 +rarity=C +[/card] +[card] +primitive=Forest +id=398454 +rarity=C +[/card] +[card] +primitive=Forest +id=398617 +rarity=C +[/card] +[card] +primitive=Island +id=398431 +rarity=C +[/card] +[card] +primitive=Island +id=398477 +rarity=C +[/card] +[card] +primitive=Island +id=398664 +rarity=C +[/card] +[card] +primitive=Mountain +id=398412 +rarity=C +[/card] +[card] +primitive=Mountain +id=398425 +rarity=C +[/card] +[card] +primitive=Mountain +id=398490 +rarity=C +[/card] +[card] +primitive=Plains +id=398534 +rarity=C +[/card] +[card] +primitive=Plains +id=398541 +rarity=C +[/card] +[card] +primitive=Plains +id=398550 +rarity=C +[/card] +[card] +primitive=Swamp +id=398472 +rarity=C +[/card] +[card] +primitive=Swamp +id=398507 +rarity=C +[/card] +[card] +primitive=Swamp +id=398677 +rarity=C +[/card] + From 5af7de61d0bdd623b727290eb1453d42181d653f Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sat, 29 Aug 2015 09:35:51 +0800 Subject: [PATCH 051/249] Added test for power toughness modifier soul warden must be sent to graveyard due to last gasp before tundra wolves resolves and put onto the battlefield. --- projects/mtg/bin/Res/test/PTInstant.txt | 29 +++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 projects/mtg/bin/Res/test/PTInstant.txt diff --git a/projects/mtg/bin/Res/test/PTInstant.txt b/projects/mtg/bin/Res/test/PTInstant.txt new file mode 100644 index 000000000..437357e6d --- /dev/null +++ b/projects/mtg/bin/Res/test/PTInstant.txt @@ -0,0 +1,29 @@ +# BUG..cast tundra wolves with soul warden in play, kill soul warden with last gasp, you still get a life because the spell resolved +# first before Soul Warden goes to graveyard. +[INIT] +FIRSTMAIN +[PLAYER1] +hand:Tundra Wolves +manapool:{W} +inplay:Soul Warden +life:20 +[PLAYER2] +manapool:{B}{B} +hand:Last Gasp +[DO] +Tundra Wolves +no +yes +Last Gasp +Soul Warden +endinterruption +[ASSERT] +FIRSTMAIN +[PLAYER1] +graveyard:Soul Warden +inplay:Tundra Wolves +life:20 +[PLAYER2] +graveyard:Last Gasp +life:20 +[END] From c2b359ceeda0805af55fc380feccacf71898126b Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sat, 29 Aug 2015 09:42:18 +0800 Subject: [PATCH 052/249] Update _tests.txt Added PTInstant test --- projects/mtg/bin/Res/test/_tests.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/projects/mtg/bin/Res/test/_tests.txt b/projects/mtg/bin/Res/test/_tests.txt index a286cede6..3e01d0157 100644 --- a/projects/mtg/bin/Res/test/_tests.txt +++ b/projects/mtg/bin/Res/test/_tests.txt @@ -530,6 +530,7 @@ protomatter_powder.txt prowess_of_the_fair.txt prowess_of_the_fair2.txt prowess_of_the_fair3.txt +PTInstant.txt pygmy_troll.txt pyknite_i426.txt pyroclasm.txt From 474ad5c0fed916237e16398375dda4a0b208bcce Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sun, 30 Aug 2015 23:03:01 +0800 Subject: [PATCH 053/249] additional test for sacrificed event --- projects/mtg/bin/Res/test/thraximundar.txt | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 projects/mtg/bin/Res/test/thraximundar.txt diff --git a/projects/mtg/bin/Res/test/thraximundar.txt b/projects/mtg/bin/Res/test/thraximundar.txt new file mode 100644 index 000000000..9d37da1cb --- /dev/null +++ b/projects/mtg/bin/Res/test/thraximundar.txt @@ -0,0 +1,19 @@ +#Bug: thraximundar ability must resolve first... and survives +[INIT] +FIRSTMAIN +[PLAYER1] +inplay:thraximundar,bloodfire colossus +manapool:{R} +[PLAYER2] +[DO] +bloodfire colossus +[ASSERT] +FIRSTMAIN +[PLAYER1] +graveyard:bloodfire colossus +inplay:thraximundar +manapool:{0} +life:14 +[PLAYER2] +life:14 +[END] \ No newline at end of file From 410f2d4e69fe3ae4c26d3b994c996c9ecf2e1e31 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sun, 30 Aug 2015 23:04:15 +0800 Subject: [PATCH 054/249] updated tests --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 2 +- projects/mtg/bin/Res/test/_tests.txt | 1 + projects/mtg/src/AllAbilities.cpp | 1 + projects/mtg/src/MTGAbility.cpp | 9 +++++++++ 4 files changed, 12 insertions(+), 1 deletion(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 27e003d88..f620d5ea0 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -78369,7 +78369,7 @@ type=Enchantment [/card] [card] name=Root Spider -auto=@combat(blocking) source(this):choice 1/0 && first strike ueot +auto=@combat(blocking) source(this):all(this) 1/0 ueot && all(this) first strike ueot text=Whenever Root Spider blocks, it gets +1/+0 and gains first strike until end of turn. mana={3}{G} type=Creature diff --git a/projects/mtg/bin/Res/test/_tests.txt b/projects/mtg/bin/Res/test/_tests.txt index 3e01d0157..8898324a5 100644 --- a/projects/mtg/bin/Res/test/_tests.txt +++ b/projects/mtg/bin/Res/test/_tests.txt @@ -656,6 +656,7 @@ thallid.txt the_tabernacle_at_pendrell_vale.txt thelon_of_havenwood.txt threaten.txt +thraximundar.txt throne_of_bone.txt thunder-thrash_elder.txt tidal_warrior_i646.txt diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index f45b94a7d..1b2612e1a 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -4363,6 +4363,7 @@ int PTInstant::resolve() APowerToughnessModifier * a = ability->clone(); 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() diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index 393ba8a19..d38ce37b0 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -4952,6 +4952,15 @@ int TriggeredAbility::receiveEvent(WEvent * e) resolve(); return 1; } + if(dynamic_cast(e)) + { + //sacrificed event + //thraximundar vs bloodfore collosus, thraximundar + //must be able to survive a sacrificed bloodfire collosus, + //same with mortician beetle vs phyrexian denouncer test + resolve(); + return 1; + } WEventZoneChange * stackCheck = dynamic_cast(e); if(stackCheck && (stackCheck->to == game->currentPlayer->game->stack||stackCheck->to == game->currentPlayer->opponent()->game->stack)) { From bfeeaeabfb8957d7ad4e4b73bebb5fc3e24cf63d Mon Sep 17 00:00:00 2001 From: xawotihs Date: Sun, 30 Aug 2015 17:27:19 +0200 Subject: [PATCH 055/249] replaced .travis.yml for easier test and added the iOS makefile --- .travis.yml | 64 +++--------- projects/mtg/iOS/Makefile | 201 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 215 insertions(+), 50 deletions(-) create mode 100644 projects/mtg/iOS/Makefile diff --git a/.travis.yml b/.travis.yml index 7c3c5011d..eea629472 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,60 +1,24 @@ -language: cpp -branches: - except: - - latest-master +language: objective-c before_install: - - export BUILD_PSP=YES - - export BUILD_ANDROID=YES - - export BUILD_Qt=YES - - export BUILD_MAC=YES - - sudo apt-get update -qq -# Building for PSP here - - if [ "$BUILD_PSP" == "YES" ]; then - export PSPDEV="$TRAVIS_BUILD_DIR/opt/pspsdk" && - export PSPSDK="$PSPDEV/psp/sdk" && - export PATH="$PATH:$PSPDEV/bin:$PSPSDK/bin" && - wget -O sdk.lzma http://sourceforge.net/projects/minpspw/files/SDK%20%2B%20devpak/pspsdk%200.11.2/minpspw_0.11.2-amd64.tar.lzma/download; - fi -# Building for Android here - - if [ "$BUILD_ANDROID" == "YES" ]; then - export ANDROID="android-sdk-linux/tools/android" && - if [ `uname -m` = x86_64 ]; then sudo apt-get install -qq --force-yes libgd2-xpm ia32-libs ia32-libs-multiarch jq; fi && - wget http://dl.google.com/android/ndk/android-ndk-r9-linux-x86_64.tar.bz2 -nv && - wget http://dl.google.com/android/android-sdk_r24.3.3-linux.tgz -nv; - fi -# Building for Qt here - - if [ "$BUILD_Qt" == "YES" ]; then - sudo add-apt-repository --yes ppa:ubuntu-sdk-team/ppa && - sudo apt-get update -qq && - sudo apt-get install -qq qt5-qmake qtbase5-dev qtdeclarative5-dev qttools5-dev qtmultimedia5-dev pulseaudio libpulse-dev && - export QMAKE="qmake -qt=qt5"; - fi - -install: -- if [ "$BUILD_PSP" == "YES" ]; then - tar -x --xz -f sdk.lzma; - fi -- if [ "$BUILD_ANDROID" == "YES" ]; then - tar --absolute-names -jxf android-ndk-r9-linux-x86_64.tar.bz2 && - tar -zxf android-sdk_r24.3.3-linux.tgz && - $ANDROID list sdk --extended -a && - echo yes | $ANDROID update sdk -a -t tools,platform-tools,build-tools-22.0.1,android-10 --no-ui --force --no-https; - fi +- brew update +- brew install qt5 - sudo pip install pyjavaproperties - sudo pip install github3.py -- sudo pip install cpp-coveralls +- brew install dpkg +- curl -s -f -L https://raw.github.com/r-plus/dotfiles/master/install_theos.sh | bash +- pwd +- ls env: global: - - secure: "EBzr1+qjQsOhn0s+tcFmXR1jP9B0xiOSXuXbRXWZ1OEHNvp8+A5/pS84LYVFlaZqmxr5dApxvPtwhgLIUbQ3EPXm8LpC3KgSD4dS+9/QMbxhe5TK4oczgFRGcDTMJQZsCzhOh7hp3tbcbJg5Gp+VT7aFjFQSHDGwhzSJXsXwh/8=" - - secure: "X5dTQfofqAutnXxmu11Ep2MQ5QYnMN8m0AITRtwymhEF2UclcOudI1+skPtuhAGbWQnSO+lhunV3cvMfw2/Ml3k/VDz6VdFSKFrzAu7ja1VLJfcxr7chi0s8q30pVBb66tGydjIBac3B+RQyqgmZQW1frbRrhC/kPFQ6wPWOJdQ=" - - secure: "T97NUPnxCpVZ/c5HH0zfo0FO3DPSRMSmze58ubW5EUTZOjAMtEt+OFdsrNZvUTCugUj2M1agtonZbAbczpaAL+lgZcHDgXgWMkfO0pMnsWX1yyCNqMuE/iTMpJr/xsLQeyWlftWjJLsseQU45abZsd1XVmda/G+ZhrDLF1y55SA=" + secure: "EBzr1+qjQsOhn0s+tcFmXR1jP9B0xiOSXuXbRXWZ1OEHNvp8+A5/pS84LYVFlaZqmxr5dApxvPtwhgLIUbQ3EPXm8LpC3KgSD4dS+9/QMbxhe5TK4oczgFRGcDTMJQZsCzhOh7hp3tbcbJg5Gp+VT7aFjFQSHDGwhzSJXsXwh/8=" -script: "tools/travis-script.sh" +script: +- /usr/local/opt/qt5/bin/qmake projects/mtg/wagic-qt.pro CONFIG+=graphics +- make -j 4 dmg +- cd projects/mtg/iOS +- make -j 4 after_success: -- coveralls -b . -e JGE/src -e JGE/include -i projects/mtg/include -i projects/mtg/src --gcov-options '\-lp' -- python tools/upload-binaries.py -t $GH_TOKEN -s $TRAVIS_COMMIT -l core.zip -r Wagic-core.zip -b $TRAVIS_BRANCH -- python tools/upload-binaries.py -t $GH_TOKEN -s $TRAVIS_COMMIT -l projects/mtg/Android/bin/Wagic-debug.apk -r Wagic-android.apk -b $TRAVIS_BRANCH -- python tools/upload-binaries.py -t $GH_TOKEN -s $TRAVIS_COMMIT -l projects/mtg/psprelease.zip -r Wagic-psp.zip -b $TRAVIS_BRANCH +- python tools/upload-binaries.py -t $GH_TOKEN -s $TRAVIS_COMMIT -l wagic.dmg -r Wagic-macosx.dmg -b $TRAVIS_BRANCH diff --git a/projects/mtg/iOS/Makefile b/projects/mtg/iOS/Makefile new file mode 100644 index 000000000..92bb03473 --- /dev/null +++ b/projects/mtg/iOS/Makefile @@ -0,0 +1,201 @@ +export ARCHS = armv7 armv7s +export TARGET = iphone:clang:latest:8.0 + +include theos/makefiles/common.mk + +APPLICATION_NAME = wagic +wagic_FILES = ../../../JGE/src/iOS/main.m\ + ../../../JGE/src/iOS/wagicAppDelegate.m\ + ../../../JGE/src/iOS/ES2Renderer.m\ + ../../../JGE/src/iOS/EAGLView.m\ + ../../../JGE/src/iOS/EAGLViewController.m\ + ../../../JGE/src/iOS/JSfx.cpp\ + ../../../JGE/src/pc/JGfx.cpp\ + ../iOS/UI/WagicDownloadProgressViewController.m\ + ../iOS/asi-http-request/ASIAuthenticationDialog.m\ + ../iOS/asi-http-request/ASIDataCompressor.m\ + ../iOS/asi-http-request/ASIDataDecompressor.m\ + ../iOS/asi-http-request/ASIDownloadCache.m\ + ../iOS/asi-http-request/ASIFormDataRequest.m\ + ../iOS/asi-http-request/ASIHTTPRequest.m\ + ../iOS/asi-http-request/ASIInputStream.m\ + ../iOS/asi-http-request/ASINetworkQueue.m\ + ../iOS/SoundManager/SoundManager.m\ + ../iOS/SoundManager/MyOpenALSupport.c\ + ../iOS/Reachability/Reachability/Reachability.m\ + ../../../JGE/src/unzip/unzip.c\ + ../../../JGE/src/unzip/zip.c\ + ../../../JGE/src/unzip/ioapi.c\ + ../ZipArchive.mm\ + ../src/SimpleMenu.cpp\ + ../src/AbilityParser.cpp\ + ../src/ActionElement.cpp\ + ../src/ActionLayer.cpp\ + ../src/ActionStack.cpp\ + ../src/AIHints.cpp\ + ../src/AIMomirPlayer.cpp\ + ../src/AIPlayer.cpp\ + ../src/AIPlayerBaka.cpp\ + ../src/AIStats.cpp\ + ../src/AllAbilities.cpp\ + ../src/CardDescriptor.cpp\ + ../src/CardDisplay.cpp\ + ../src/CardGui.cpp\ + ../src/CardPrimitive.cpp\ + ../src/CardSelector.cpp\ + ../src/CarouselDeckView.cpp\ + ../src/Closest.cpp\ + ../src/Counters.cpp\ + ../src/Credits.cpp\ + ../src/Damage.cpp\ + ../src/DamagerDamaged.cpp\ + ../src/DeckDataWrapper.cpp\ + ../src/DeckEditorMenu.cpp\ + ../src/DeckManager.cpp\ + ../src/DeckMenu.cpp\ + ../src/DeckMenuItem.cpp\ + ../src/DeckMetaData.cpp\ + ../src/DeckStats.cpp\ + ../src/DeckView.cpp\ + ../src/DuelLayers.cpp\ + ../src/ExtraCost.cpp\ + ../src/GameApp.cpp\ + ../src/GameLauncher.cpp\ + ../src/GameObserver.cpp\ + ../src/GameOptions.cpp\ + ../src/GameStateAwards.cpp\ + ../src/GameState.cpp\ + ../src/GameStateDeckViewer.cpp\ + ../src/GameStateDuel.cpp\ + ../src/GameStateMenu.cpp\ + ../src/GameStateOptions.cpp\ + ../src/GameStateShop.cpp\ + ../src/GameStateStory.cpp\ + ../src/GameStateTransitions.cpp\ + ../src/GridDeckView.cpp\ + ../src/GuiAvatars.cpp\ + ../src/GuiBackground.cpp\ + ../src/GuiCardsController.cpp\ + ../src/GuiCombat.cpp\ + ../src/GuiFrame.cpp\ + ../src/GuiHand.cpp\ + ../src/GuiLayers.cpp\ + ../src/GuiMana.cpp\ + ../src/GuiPhaseBar.cpp\ + ../src/GuiPlay.cpp\ + ../src/GuiStatic.cpp\ + ../src/IconButton.cpp\ + ../src/InteractiveButton.cpp\ + ../src/ManaCost.cpp\ + ../src/ManaCostHybrid.cpp\ + ../src/MenuItem.cpp\ + ../src/ModRules.cpp\ + ../src/MTGAbility.cpp\ + ../src/MTGCard.cpp\ + ../src/MTGCardInstance.cpp\ + ../src/MTGDeck.cpp\ + ../src/MTGDefinitions.cpp\ + ../src/MTGGamePhase.cpp\ + ../src/MTGGameZones.cpp\ + ../src/MTGPack.cpp\ + ../src/MTGRules.cpp\ + ../src/ObjectAnalytics.cpp\ + ../src/OptionItem.cpp\ + ../src/PhaseRing.cpp\ + ../src/Player.cpp\ + ../src/PlayerData.cpp\ + ../src/PlayGuiObject.cpp\ + ../src/PlayGuiObjectController.cpp\ + ../src/PlayRestrictions.cpp\ + ../src/Pos.cpp\ + ../src/PriceList.cpp\ + ../src/ReplacementEffects.cpp\ + ../src/Rules.cpp\ + ../src/SimpleButton.cpp\ + ../src/SimpleMenu.cpp\ + ../src/SimpleMenuItem.cpp\ + ../src/SimplePad.cpp\ + ../src/SimplePopup.cpp\ + ../src/StoryFlow.cpp\ + ../src/Subtypes.cpp\ + ../src/StyleManager.cpp\ + ../src/TargetChooser.cpp\ + ../src/TargetsList.cpp\ + ../src/Tasks.cpp\ + ../src/TextScroller.cpp\ + ../src/ThisDescriptor.cpp\ + ../src/Token.cpp\ + ../src/Translate.cpp\ + ../src/TranslateKeys.cpp\ + ../src/Trash.cpp\ + ../src/utils.cpp\ + ../src/WCachedResource.cpp\ + ../src/WDataSrc.cpp\ + ../src/WEvent.cpp\ + ../src/WFilter.cpp\ + ../src/WFont.cpp\ + ../src/WGui.cpp\ + ../src/WResourceManager.cpp \ + ../src/AIPlayerBakaB.cpp \ + ../src/TestSuiteAI.cpp\ + ../../../JGE/src/Encoding.cpp\ + ../../../JGE/src/JAnimator.cpp\ + ../../../JGE/src/JApp.cpp\ + ../../../JGE/src/JDistortionMesh.cpp\ + ../../../JGE/src/JFileSystem.cpp\ + ../../../JGE/src/JGameObject.cpp\ + ../../../JGE/src/JGE.cpp\ + ../../../JGE/src/JGui.cpp\ + ../../../JGE/src/JLogger.cpp\ + ../../../JGE/src/JLBFont.cpp\ + ../../../JGE/src/JOBJModel.cpp\ + ../../../JGE/src/JParticle.cpp\ + ../../../JGE/src/JParticleEffect.cpp\ + ../../../JGE/src/JParticleEmitter.cpp\ + ../../../JGE/src/JParticleSystem.cpp\ + ../../../JGE/src/JResourceManager.cpp\ + ../../../JGE/src/JSpline.cpp\ + ../../../JGE/src/JSprite.cpp\ + ../../../JGE/src/Vector2D.cpp\ + ../../../JGE/src/tinyxml/tinystr.cpp\ + ../../../JGE/src/tinyxml/tinyxml.cpp\ + ../../../JGE/src/tinyxml/tinyxmlerror.cpp\ + ../../../JGE/src/tinyxml/tinyxmlparser.cpp\ + ../../../JGE/src/hge/hgecolor.cpp\ + ../../../JGE/src/hge/hgedistort.cpp\ + ../../../JGE/src/hge/hgefont.cpp\ + ../../../JGE/src/hge/hgeparticle.cpp\ + ../../../JGE/src/hge/hgerect.cpp\ + ../../../JGE/src/hge/hgevector.cpp\ + ../../../JGE/src/zipFS/zfsystem.cpp\ + ../../../JGE/src/zipFS/ziphdr.cpp\ + ../../../JGE/src/zipFS/zstream.cpp\ + ../../../Boost/lib/pthread/once.cpp\ + ../../../Boost/lib/pthread/thread.cpp\ + + +wagic_LDFLAGS = -lz +wagic_FRAMEWORKS = UIKit CoreGraphics OpenGLES Foundation CFNetwork MobileCoreServices AVFoundation OpenAL AudioToolbox QuartzCore SystemConfiguration +include $(THEOS_MAKE_PATH)/application.mk + +ADDITIONAL_CFLAGS = -I ../include\ + -I ../../../JGE/include\ + -I ../../../JGE/src/unzip\ + -I ../../../JGE/src/zipFS\ + -I ../../../JGE/Dependencies/include\ + -I ../../../Boost\ + -I ../../../JGE/src/iOS\ + -I ../iOS/UI\ + -I ../iOS/Reachability/Reachability\ 2.0.4ddg/Reachability\ + -I ../iOS/asi-http-request\ + -I ../iOS/ZipArchive\ + -I ../iOS/SoundManager\ + -DIOS -D__arm__ -DTIXML_USE_STL -DVERSION=\"$(GIT_VERSION)\"\ + -Wno-parentheses-equality -Wno-delete-non-virtual-dtor\ + -Wno-tautological-undefined-compare -Wno-undefined-bool-conversion\ + -Wno-visibility -Wno-deprecated-declarations -Wno-non-literal-null-conversion\ + -Wno-format -Wno-distributed-object-modifiers -Wno-missing-braces\ + -Wno-unused-const-variable -Wno-unused-function\ + -x objective-c++ + +_THEOS_TARGET_ONLY_OBJCFLAGS :="" From 4cf3f1bcd51a514664eb0316f7decd090f849d95 Mon Sep 17 00:00:00 2001 From: Xawotihs Date: Sun, 30 Aug 2015 17:55:02 +0200 Subject: [PATCH 056/249] Should fix relative paths --- projects/mtg/iOS/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/projects/mtg/iOS/Makefile b/projects/mtg/iOS/Makefile index 92bb03473..92f52b826 100644 --- a/projects/mtg/iOS/Makefile +++ b/projects/mtg/iOS/Makefile @@ -1,7 +1,7 @@ export ARCHS = armv7 armv7s export TARGET = iphone:clang:latest:8.0 -include theos/makefiles/common.mk +include ../../../theos/makefiles/common.mk APPLICATION_NAME = wagic wagic_FILES = ../../../JGE/src/iOS/main.m\ @@ -176,7 +176,7 @@ wagic_FILES = ../../../JGE/src/iOS/main.m\ wagic_LDFLAGS = -lz wagic_FRAMEWORKS = UIKit CoreGraphics OpenGLES Foundation CFNetwork MobileCoreServices AVFoundation OpenAL AudioToolbox QuartzCore SystemConfiguration -include $(THEOS_MAKE_PATH)/application.mk +include ../../../theos/makefile/application.mk ADDITIONAL_CFLAGS = -I ../include\ -I ../../../JGE/include\ From 915befbb3a21d88941e502e55162b01510235635 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sun, 30 Aug 2015 23:59:05 +0800 Subject: [PATCH 057/249] update savra --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index f620d5ea0..e79fe1cf3 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -80739,7 +80739,7 @@ type=Sorcery [card] name=Savra, Queen of the Golgari auto=@sacrificed(creature[black]|mybattlefield):may life:-2 && ability$!sacrifice notatarget(creature|mybattlefield)!$ opponent -auto=@sacrificed(creature[green]|mybattlefield):may life:2 controller +auto=@sacrificed(creature[green]|mybattlefield):life:2 controller text=Whenever you sacrifice a black creature, you may pay 2 life. If you do, each other player sacrifices a creature. -- Whenever you sacrifice a green creature, you may gain 2 life. mana={2}{B}{G} type=Legendary Creature From 58b5e9997976aea66ec07dc62208a32edb5e754e Mon Sep 17 00:00:00 2001 From: Xawotihs Date: Sun, 30 Aug 2015 18:17:41 +0200 Subject: [PATCH 058/249] Fixed typo --- projects/mtg/iOS/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/mtg/iOS/Makefile b/projects/mtg/iOS/Makefile index 92f52b826..00979b543 100644 --- a/projects/mtg/iOS/Makefile +++ b/projects/mtg/iOS/Makefile @@ -176,7 +176,7 @@ wagic_FILES = ../../../JGE/src/iOS/main.m\ wagic_LDFLAGS = -lz wagic_FRAMEWORKS = UIKit CoreGraphics OpenGLES Foundation CFNetwork MobileCoreServices AVFoundation OpenAL AudioToolbox QuartzCore SystemConfiguration -include ../../../theos/makefile/application.mk +include ../../../theos/makefiles/application.mk ADDITIONAL_CFLAGS = -I ../include\ -I ../../../JGE/include\ From a7bb43278f164f15a71b111a819ef9a15856beb5 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 31 Aug 2015 01:51:36 +0800 Subject: [PATCH 059/249] fix bad lines --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index e79fe1cf3..47abaa844 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -68025,7 +68025,7 @@ toughness=4 name=Palace Siege auto=choice name(Khans) transforms((,newability[counter(0/0.1.Khans)],newability[@each my upkeep:moveto(myhand) target(creature|mygraveyard)])) forever auto=choice name(Dragons) transforms((,newability[counter(0/0.1.Dragons)],newability[@each my upkeep:life:-2 opponent && life:2 controller])) forever -As Palace Siege enters the battlefield, choose Khans or Dragons. -- ? Khans ? At the beginning of your upkeep, return target creature card from your graveyard to your hand. -- ? Dragons ? At the beginning of your upkeep, each opponent loses 2 life and you gain 2 life. +text=As Palace Siege enters the battlefield, choose Khans or Dragons. -- ? Khans ? At the beginning of your upkeep, return target creature card from your graveyard to your hand. -- ? Dragons ? At the beginning of your upkeep, each opponent loses 2 life and you gain 2 life. mana={3}{B}{B} type=Enchantment [/card] @@ -68544,8 +68544,7 @@ subtype=Arcane name=Path of Bravery auto=this(controllerlife > 19) lord(creature|mybattlefield) 1/1 auto=@each my blockers:life:type:creature[attacking]|mybattlefield controller -text=Enchantment. -- As long as your life total is greater than or equal to your starting life total, creatures you control get +1/+1. -- -Whenever one or more creatures you control attack, you gain life equal to the number of attacking creatures. +text=Enchantment. -- As long as your life total is greater than or equal to your starting life total, creatures you control get +1/+1. -- Whenever one or more creatures you control attack, you gain life equal to the number of attacking creatures. mana={2}{W} type=Enchantment [/card] From e1793fe2765e4d2c0b35c0a74e08889ad1caed49 Mon Sep 17 00:00:00 2001 From: Xawotihs Date: Sun, 30 Aug 2015 22:39:44 +0200 Subject: [PATCH 060/249] Removed error on unknown warning option --- projects/mtg/iOS/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/mtg/iOS/Makefile b/projects/mtg/iOS/Makefile index 00979b543..4d4280de2 100644 --- a/projects/mtg/iOS/Makefile +++ b/projects/mtg/iOS/Makefile @@ -195,7 +195,7 @@ ADDITIONAL_CFLAGS = -I ../include\ -Wno-tautological-undefined-compare -Wno-undefined-bool-conversion\ -Wno-visibility -Wno-deprecated-declarations -Wno-non-literal-null-conversion\ -Wno-format -Wno-distributed-object-modifiers -Wno-missing-braces\ - -Wno-unused-const-variable -Wno-unused-function\ + -Wno-unused-const-variable -Wno-unused-function -Wno-unknown-warning-option\ -x objective-c++ _THEOS_TARGET_ONLY_OBJCFLAGS :="" From c8e4ec14f0ec1bf218d2a94a47d8a28b7d2e4f09 Mon Sep 17 00:00:00 2001 From: Xawotihs Date: Sun, 30 Aug 2015 23:39:13 +0200 Subject: [PATCH 061/249] Update Wagic_Version.h --- projects/mtg/include/Wagic_Version.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/projects/mtg/include/Wagic_Version.h b/projects/mtg/include/Wagic_Version.h index 4978f7c5d..82d9d8d4b 100644 --- a/projects/mtg/include/Wagic_Version.h +++ b/projects/mtg/include/Wagic_Version.h @@ -26,7 +26,9 @@ Author: Michael Nguyen #define WAGIC_RESOURCE_VERSION VERSION_FILE(WAGIC_VERSION_MAJOR, WAGIC_VERSION_MEDIUM, WAGIC_VERSION_MINOR) #define WAGIC_VERSION_STRING VERSION_STRINGIFY(WAGIC_VERSION) #define WAGIC_CORE_VERSION_STRING "core_" VERSION_STRINGIFY(WAGIC_RESOURCE_VERSION) -#define WAGIC_RESOURCE_NAME WAGIC_CORE_VERSION_STRING ".zip" +#define WAGIC_RESOURCE_NAME "Wagic-core.zip" +#define WAGIC_RELEASE_NAME "latest-master" +#define WAGIC_RESOURCE_URL "https://github.com/WagicProject/wagic/releases/download/" WAGIC_RELEASE_NAME "/" WAGIC_RESOURCE_NAME #endif From 7c3f15f79b12214ba5d68032c4c9b2690605952d Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 31 Aug 2015 07:51:12 +0800 Subject: [PATCH 062/249] updated some cards reflects the changes i made earlier, you can see the steps while running them in test mode... mortician beetle, thraximundar and savra queen of the golgari. --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 8 ++++---- projects/mtg/bin/Res/test/Savra_Queen_of_the_Golgari.txt | 3 +++ projects/mtg/bin/Res/test/thraximundar.txt | 1 + 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 47abaa844..753b0fd67 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -25035,7 +25035,7 @@ type=Sorcery [card] name=Dragon Appeasement auto=phasealter(remove,draw,controller) -auto=@sacrificed(creature|mybattlefield):may draw:1 controller +auto=@sacrificed(creature|mybattlefield):name(draw) ability$!may draw:1!$ controller text=Skip your draw step. -- Whenever you sacrifice a creature, you may draw a card. mana={3}{B}{R}{G} type=Enchantment @@ -62189,7 +62189,7 @@ subtype=Equipment [/card] [card] name=Mortician Beetle -auto=@sacrificed(creature):may counter(1/1,1) +auto=@sacrificed(creature):name(counter +1/+1) ability$!may counter(1/1,1) all(mystored)!$ controller text=Whenever a player sacrifices a creature, you may put a +1/+1 counter on Mortician Beetle. mana={B} type=Creature @@ -80738,7 +80738,7 @@ type=Sorcery [card] name=Savra, Queen of the Golgari auto=@sacrificed(creature[black]|mybattlefield):may life:-2 && ability$!sacrifice notatarget(creature|mybattlefield)!$ opponent -auto=@sacrificed(creature[green]|mybattlefield):life:2 controller +auto=@sacrificed(creature[green]|mybattlefield):name(gain life) ability$!may life:2!$ controller text=Whenever you sacrifice a black creature, you may pay 2 life. If you do, each other player sacrifices a creature. -- Whenever you sacrifice a green creature, you may gain 2 life. mana={2}{B}{G} type=Legendary Creature @@ -98048,7 +98048,7 @@ toughness=3 name=Thraximundar abilities=haste auto=@combat(attacking) source(this):ability$!name(sacrifice) notatarget(creature|mybattlefield) sacrifice!$ opponent -auto=@sacrificed(creature):counter(1/1,1) +auto=@sacrificed(creature):name(counter +1/+1) ability$!may counter(1/1,1) all(mystored)!$ controller text=Haste -- Whenever Thraximundar attacks, defending player sacrifices a creature. -- Whenever a player sacrifices a creature, you may put a +1/+1 counter on Thraximundar. mana={4}{U}{B}{R} type=Legendary Creature diff --git a/projects/mtg/bin/Res/test/Savra_Queen_of_the_Golgari.txt b/projects/mtg/bin/Res/test/Savra_Queen_of_the_Golgari.txt index 1ea05e352..0b385dca1 100644 --- a/projects/mtg/bin/Res/test/Savra_Queen_of_the_Golgari.txt +++ b/projects/mtg/bin/Res/test/Savra_Queen_of_the_Golgari.txt @@ -16,6 +16,9 @@ choice 0 choice 0 choice 0 180595 +choice 0 +180595 +choice 1 eot [ASSERT] untap diff --git a/projects/mtg/bin/Res/test/thraximundar.txt b/projects/mtg/bin/Res/test/thraximundar.txt index 9d37da1cb..a6ad2ddf9 100644 --- a/projects/mtg/bin/Res/test/thraximundar.txt +++ b/projects/mtg/bin/Res/test/thraximundar.txt @@ -7,6 +7,7 @@ manapool:{R} [PLAYER2] [DO] bloodfire colossus +choice 0 [ASSERT] FIRSTMAIN [PLAYER1] From 29ac95362d6111ce028889db63be6831cf9a55ef Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 31 Aug 2015 19:06:51 +0800 Subject: [PATCH 063/249] multicolor correction not multicolored is single colored or monocolored not colorless... colorless has no color... --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 2 +- projects/mtg/src/CardGui.cpp | 1 + projects/mtg/src/TargetChooser.cpp | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 753b0fd67..261522a02 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -35578,7 +35578,7 @@ toughness=3 [/card] [card] name=Furnace Celebration -auto=@sacrificed(other *|mybattlefield):pay({2}) damage:2 target(creature,player) +auto=@sacrificed(other *|mybattlefield):ability$!name(pay 2 for damage) pay[[{2}]] name(pay 2 for damage) damage:2 target(creature,player)!$ controller mana={1}{R}{R} type=Enchantment text=Whenever you sacrifice another permanent, you may pay {2}. If you do, Furnace Celebration deals 2 damage to target creature or player. diff --git a/projects/mtg/src/CardGui.cpp b/projects/mtg/src/CardGui.cpp index 0b5b9d44a..681e1b559 100644 --- a/projects/mtg/src/CardGui.cpp +++ b/projects/mtg/src/CardGui.cpp @@ -1242,6 +1242,7 @@ bool CardGui::FilterCard(MTGCard * _card,string filter) if (minus) { cd.setisMultiColored(-1); + cd.SetExclusionColor(0);//not multicolored is monocolored not colorless, use iscolorless attribute } else { diff --git a/projects/mtg/src/TargetChooser.cpp b/projects/mtg/src/TargetChooser.cpp index e69f29702..8724235c3 100644 --- a/projects/mtg/src/TargetChooser.cpp +++ b/projects/mtg/src/TargetChooser.cpp @@ -503,6 +503,7 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta if (minus) { cd->setisMultiColored(-1); + cd->SetExclusionColor(0);//not multicolored is monocolored not colorless, use iscolorless attribute } else { From b2b54b7c5b9674e32faf4057646b14aa9e3bb692 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 31 Aug 2015 22:03:41 +0800 Subject: [PATCH 064/249] attribute -multicolor will return single colored cards use iscolorless to find colorless... :) --- projects/mtg/src/CardGui.cpp | 2 ++ projects/mtg/src/TargetChooser.cpp | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/projects/mtg/src/CardGui.cpp b/projects/mtg/src/CardGui.cpp index 681e1b559..de5efb003 100644 --- a/projects/mtg/src/CardGui.cpp +++ b/projects/mtg/src/CardGui.cpp @@ -1243,6 +1243,8 @@ bool CardGui::FilterCard(MTGCard * _card,string filter) { cd.setisMultiColored(-1); cd.SetExclusionColor(0);//not multicolored is monocolored not colorless, use iscolorless attribute + cd.SetExclusionColor(6);//restriction... green, red, blue, black or white colored only + cd.mode = CardDescriptor::CD_OR; } else { diff --git a/projects/mtg/src/TargetChooser.cpp b/projects/mtg/src/TargetChooser.cpp index 8724235c3..fd12b317a 100644 --- a/projects/mtg/src/TargetChooser.cpp +++ b/projects/mtg/src/TargetChooser.cpp @@ -503,7 +503,9 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta if (minus) { cd->setisMultiColored(-1); - cd->SetExclusionColor(0);//not multicolored is monocolored not colorless, use iscolorless attribute + cd->SetExclusionColor(0);//not multicolored is monocolored not colorless, use iscolorless attribute + cd->SetExclusionColor(6);//restriction... green, red, blue, black or white colored only + cd->mode = CardDescriptor::CD_OR; } else { From 9fb460c17698ecc78ffe7b88eebe304661b484ac Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 3 Sep 2015 07:01:45 +0800 Subject: [PATCH 065/249] life state check on trigger life state check when players gain or lose life bugs\exquisite_blood_i953.txt will stop looping as long as the conditions are met on the check --- projects/mtg/src/MTGAbility.cpp | 38 +++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index d38ce37b0..a6c81c6eb 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -4961,6 +4961,44 @@ int TriggeredAbility::receiveEvent(WEvent * e) resolve(); return 1; } + if(dynamic_cast(e)) + { + //check life state... basic prevention for infinite loop of bugs\exquisite_blood_i953.txt test.. + //exquisite blood and sanguine bond in play will stop looping as long as the triggered player + //met this condition... taken from gamestatebasecheck... + WEventLife * lifecheck = dynamic_cast(e); + if ((lifecheck->player->life <= 0)||(lifecheck->player->poisonCount >= 10)) + { + int cantlosers = 0; + MTGGameZone * z = lifecheck->player->game->inPlay; + int nbcards = z->nb_cards; + for (int j = 0; j < nbcards; ++j) + { + MTGCardInstance * c = z->cards[j]; + if (c->has(Constants::CANTLOSE) || (c->has(Constants::CANTLIFELOSE) && lifecheck->player->poisonCount < 10)) + { + cantlosers++; + } + } + MTGGameZone * k = lifecheck->player->opponent()->game->inPlay; + int onbcards = k->nb_cards; + for (int m = 0; m < onbcards; ++m) + { + MTGCardInstance * e = k->cards[m]; + if (e->has(Constants::CANTWIN)) + { + cantlosers++; + } + } + if (cantlosers < 1) + { + //lifecheck->player->getObserver()->setLoser(lifecheck->player); + return 0; + } + } + fireAbility(); + return 1; + } WEventZoneChange * stackCheck = dynamic_cast(e); if(stackCheck && (stackCheck->to == game->currentPlayer->game->stack||stackCheck->to == game->currentPlayer->opponent()->game->stack)) { From fd02e9ab2241b0425161d57786272b02aeb67ab8 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 3 Sep 2015 20:07:31 +0800 Subject: [PATCH 066/249] Rename projects/mtg/bin/Res/test/bugs/exquisite_blood_i953.txt to projects/mtg/bin/Res/test/exquisite_blood_i953.txt --- projects/mtg/bin/Res/test/{bugs => }/exquisite_blood_i953.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename projects/mtg/bin/Res/test/{bugs => }/exquisite_blood_i953.txt (100%) diff --git a/projects/mtg/bin/Res/test/bugs/exquisite_blood_i953.txt b/projects/mtg/bin/Res/test/exquisite_blood_i953.txt similarity index 100% rename from projects/mtg/bin/Res/test/bugs/exquisite_blood_i953.txt rename to projects/mtg/bin/Res/test/exquisite_blood_i953.txt From 886eaa400264992d43d086fa23b46dd1ee108afb Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 3 Sep 2015 20:10:19 +0800 Subject: [PATCH 067/249] Update _tests.txt --- projects/mtg/bin/Res/test/_tests.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/projects/mtg/bin/Res/test/_tests.txt b/projects/mtg/bin/Res/test/_tests.txt index 8898324a5..598704221 100644 --- a/projects/mtg/bin/Res/test/_tests.txt +++ b/projects/mtg/bin/Res/test/_tests.txt @@ -313,6 +313,7 @@ executioners_swing.txt executioners_swing2.txt executioners_swing3.txt explore.txt +exquisite_blood_i953.txt Faceless_Butcher.txt fading.txt fangren_pathcutter.txt From 42d0480f77ce1883a8b5aa8a40102a08298b9ea7 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 3 Sep 2015 20:11:47 +0800 Subject: [PATCH 068/249] refactored lifestate check --- projects/mtg/include/Player.h | 1 + projects/mtg/src/GameObserver.cpp | 29 +---------------- projects/mtg/src/MTGAbility.cpp | 52 +++++++++++-------------------- projects/mtg/src/Player.cpp | 34 ++++++++++++++++++++ 4 files changed, 55 insertions(+), 61 deletions(-) diff --git a/projects/mtg/include/Player.h b/projects/mtg/include/Player.h index 66d66acd1..589e8766a 100644 --- a/projects/mtg/include/Player.h +++ b/projects/mtg/include/Player.h @@ -69,6 +69,7 @@ public: ManaPool * getManaPool(); void takeMulligan(); void serumMulligan(); + bool DeadLifeState(); ManaCost * doesntEmpty; ManaCost * poolDoesntEmpty; void cleanupPhase(); diff --git a/projects/mtg/src/GameObserver.cpp b/projects/mtg/src/GameObserver.cpp index 2f77f9d36..b82960119 100644 --- a/projects/mtg/src/GameObserver.cpp +++ b/projects/mtg/src/GameObserver.cpp @@ -727,34 +727,7 @@ void GameObserver::gameStateBasedEffects() /////////////////////////////////////////////////////////// //life checks/poison checks also checks cant win or lose.// /////////////////////////////////////////////////////////// - if (players[i]->life <= 0 || players[i]->poisonCount >= 10) - { - int cantlosers = 0; - MTGGameZone * z = players[i]->game->inPlay; - int nbcards = z->nb_cards; - for (int j = 0; j < nbcards; ++j) - { - MTGCardInstance * c = z->cards[j]; - if (c->has(Constants::CANTLOSE) || (c->has(Constants::CANTLIFELOSE) && players[i]->poisonCount < 10)) - { - cantlosers++; - } - } - MTGGameZone * k = players[i]->opponent()->game->inPlay; - int onbcards = k->nb_cards; - for (int m = 0; m < onbcards; ++m) - { - MTGCardInstance * e = k->cards[m]; - if (e->has(Constants::CANTWIN)) - { - cantlosers++; - } - } - if (cantlosers < 1) - { - setLoser(players[i]); - } - } + players[i]->DeadLifeState();//refactored } ////////////////////////////////////////////////////// //-------------card based states effects------------// diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index a6c81c6eb..e8d6c34ed 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -4963,39 +4963,25 @@ int TriggeredAbility::receiveEvent(WEvent * e) } if(dynamic_cast(e)) { - //check life state... basic prevention for infinite loop of bugs\exquisite_blood_i953.txt test.. - //exquisite blood and sanguine bond in play will stop looping as long as the triggered player - //met this condition... taken from gamestatebasecheck... - WEventLife * lifecheck = dynamic_cast(e); - if ((lifecheck->player->life <= 0)||(lifecheck->player->poisonCount >= 10)) - { - int cantlosers = 0; - MTGGameZone * z = lifecheck->player->game->inPlay; - int nbcards = z->nb_cards; - for (int j = 0; j < nbcards; ++j) - { - MTGCardInstance * c = z->cards[j]; - if (c->has(Constants::CANTLOSE) || (c->has(Constants::CANTLIFELOSE) && lifecheck->player->poisonCount < 10)) - { - cantlosers++; - } - } - MTGGameZone * k = lifecheck->player->opponent()->game->inPlay; - int onbcards = k->nb_cards; - for (int m = 0; m < onbcards; ++m) - { - MTGCardInstance * e = k->cards[m]; - if (e->has(Constants::CANTWIN)) - { - cantlosers++; - } - } - if (cantlosers < 1) - { - //lifecheck->player->getObserver()->setLoser(lifecheck->player); - return 0; - } - } + //check life state on life triger + WEventLife * lifecheck = dynamic_cast(e); + if (lifecheck->player->DeadLifeState()) + { + return 0; + } + fireAbility(); + return 1; + } + if(dynamic_cast(e)) + { + //check life state on damage trigger + WEventDamage * lifecheck = dynamic_cast(e); + if (lifecheck->damage->target->type_as_damageable == Damageable::DAMAGEABLE_PLAYER) + { + Player * triggerPlayer = (Player *) lifecheck->damage->target; + if(triggerPlayer->DeadLifeState()) + return 0; + } fireAbility(); return 1; } diff --git a/projects/mtg/src/Player.cpp b/projects/mtg/src/Player.cpp index 6cbb98dbd..2003d0b83 100644 --- a/projects/mtg/src/Player.cpp +++ b/projects/mtg/src/Player.cpp @@ -233,6 +233,40 @@ void Player::serumMulligan() //Draw hand no penalty } +bool Player::DeadLifeState() +{ + if ((life <= 0)||(poisonCount >= 10)) + { + int cantlosers = 0; + MTGGameZone * z = game->inPlay; + int nbcards = z->nb_cards; + for (int j = 0; j < nbcards; ++j) + { + MTGCardInstance * c = z->cards[j]; + if (c->has(Constants::CANTLOSE) || (c->has(Constants::CANTLIFELOSE) && poisonCount < 10)) + { + cantlosers++; + } + } + MTGGameZone * k = opponent()->game->inPlay; + int onbcards = k->nb_cards; + for (int m = 0; m < onbcards; ++m) + { + MTGCardInstance * e = k->cards[m]; + if (e->has(Constants::CANTWIN)) + { + cantlosers++; + } + } + if (cantlosers < 1) + { + getObserver()->setLoser(this); + return true; + } + } + return false; +} + //Cleanup phase at the end of a turn void Player::cleanupPhase() { From 54f7030d6804d94bdd8cff31fc6c7f9fcbe7b043 Mon Sep 17 00:00:00 2001 From: xawotihs Date: Fri, 4 Sep 2015 00:03:47 +0200 Subject: [PATCH 069/249] Moved reachability files --- .../{Reachability 2.0.4ddg => }/Reachability/Reachability.h | 0 .../{Reachability 2.0.4ddg => }/Reachability/Reachability.m | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename projects/mtg/iOS/Reachability/{Reachability 2.0.4ddg => }/Reachability/Reachability.h (100%) rename projects/mtg/iOS/Reachability/{Reachability 2.0.4ddg => }/Reachability/Reachability.m (100%) diff --git a/projects/mtg/iOS/Reachability/Reachability 2.0.4ddg/Reachability/Reachability.h b/projects/mtg/iOS/Reachability/Reachability/Reachability.h similarity index 100% rename from projects/mtg/iOS/Reachability/Reachability 2.0.4ddg/Reachability/Reachability.h rename to projects/mtg/iOS/Reachability/Reachability/Reachability.h diff --git a/projects/mtg/iOS/Reachability/Reachability 2.0.4ddg/Reachability/Reachability.m b/projects/mtg/iOS/Reachability/Reachability/Reachability.m similarity index 100% rename from projects/mtg/iOS/Reachability/Reachability 2.0.4ddg/Reachability/Reachability.m rename to projects/mtg/iOS/Reachability/Reachability/Reachability.m From cbb603818a572083fab9cf668014ec33d3f85ef7 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Fri, 4 Sep 2015 12:04:17 +0800 Subject: [PATCH 070/249] correction for untap cost 602.5a comprehensive rule as of 6/1/2014 --- projects/mtg/src/ExtraCost.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/projects/mtg/src/ExtraCost.cpp b/projects/mtg/src/ExtraCost.cpp index 37b398807..3bd2ce7a2 100644 --- a/projects/mtg/src/ExtraCost.cpp +++ b/projects/mtg/src/ExtraCost.cpp @@ -540,7 +540,12 @@ ExtraCost("UnTap") int UnTapCost::isPaymentSet() { - if (source && !source->isTapped()) +/*602.5a A creature's activated ability with the tap symbol ({T}) or the untap symbol ({Q}) + * in its activation cost can't be activated unless the creature has been under its + * controller's control since the start of his or her most recent turn. + * Ignore this rule for creatures with haste (see rule 702.10). As of 6/1/2014 Comprehensive Rules + */ + if (source && (!source->isTapped() || source->hasSummoningSickness())) { return 0; } From 5175f439a0250bc26a63f45ec28bb92e7a727eb0 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Fri, 4 Sep 2015 12:05:19 +0800 Subject: [PATCH 071/249] add support for yawgmoth's agenda and other similar cards --- projects/mtg/include/MTGDefinitions.h | 4 +++- projects/mtg/src/MTGDefinitions.cpp | 4 +++- projects/mtg/src/MTGGameZones.cpp | 8 ++++++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/projects/mtg/include/MTGDefinitions.h b/projects/mtg/include/MTGDefinitions.h index 1240c25ca..a87e49ef5 100644 --- a/projects/mtg/include/MTGDefinitions.h +++ b/projects/mtg/include/MTGDefinitions.h @@ -220,7 +220,9 @@ class Constants NOLEGEND = 102, CANPLAYFROMGRAVEYARD = 103, TOKENIZER = 104, - NB_BASIC_ABILITIES = 105, + MYGRAVEEXILER = 105, + OPPGRAVEEXILER = 106, + NB_BASIC_ABILITIES = 107, RARITY_S = 'S', //Special Rarity diff --git a/projects/mtg/src/MTGDefinitions.cpp b/projects/mtg/src/MTGDefinitions.cpp index 952f0be75..82ea0ca46 100644 --- a/projects/mtg/src/MTGDefinitions.cpp +++ b/projects/mtg/src/MTGDefinitions.cpp @@ -133,7 +133,9 @@ const char* Constants::MTGBasicAbilities[] = { "lure", "nolegend", "canplayfromgraveyard", - "tokenizer"//parallel lives + "tokenizer",//parallel lives, + "mygraveexiler", + "oppgraveexiler" }; map Constants::MTGBasicAbilitiesMap; diff --git a/projects/mtg/src/MTGGameZones.cpp b/projects/mtg/src/MTGGameZones.cpp index 39fcc1afd..052d4ec51 100644 --- a/projects/mtg/src/MTGGameZones.cpp +++ b/projects/mtg/src/MTGGameZones.cpp @@ -321,6 +321,14 @@ MTGCardInstance * MTGPlayerCards::putInZone(MTGCardInstance * card, MTGGameZone return card; //Error check int doCopy = 1; + //Leyline of the Void, Yawgmoth's Agenda... effect... + for(int i = 0; i < 2; ++i) + { + if ((to == g->players[i]->game->graveyard) && ( + g->players[i]->game->battlefield->hasAbility(Constants::MYGRAVEEXILER) || + g->players[i]->opponent()->game->battlefield->hasAbility(Constants::OPPGRAVEEXILER))) + to = g->players[i]->game->exile; + } //When a card is moved from inPlay to inPlay (controller change, for example), it is still the same object if ((to == g->players[0]->game->inPlay || to == g->players[1]->game->inPlay) && (from == g->players[0]->game->inPlay || from == g->players[1]->game->inPlay)) From 11a9766ba03ecad85846fad634d6b1fc91b5efff Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Fri, 4 Sep 2015 16:47:11 +0800 Subject: [PATCH 072/249] adds support for darksteel colossus, gravebane zombie --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 51 +++++++++++++++---- .../bin/Res/sets/primitives/unsupported.txt | 30 ----------- projects/mtg/include/MTGDefinitions.h | 4 +- projects/mtg/src/MTGDefinitions.cpp | 4 +- projects/mtg/src/MTGGameZones.cpp | 14 +++++ 5 files changed, 61 insertions(+), 42 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 261522a02..cf3f881e9 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -9371,8 +9371,7 @@ toughness=1 [/card] [card] name=Blightsteel Colossus -abilities=trample,indestructible,infect -autograveyard=moveTo(ownerlibrary) && shuffle +abilities=trample,indestructible,infect,shufflelibrarydeath text=Trample,infect -- Blightsteel Colossus is indestructible. -- If Blightsteel Colossus would be put into a graveyard from anywhere, reveal Blightsteel Colossus and shuffle it into its owner's library instead. mana={12} type=Artifact Creature @@ -21047,8 +21046,7 @@ type=Artifact Land [/card] [card] name=Darksteel Colossus -abilities=trample,indestructible -autograveyard=moveTo(ownerlibrary) && shuffle +abilities=trample,indestructible,shufflelibrarydeath text=Trample -- Darksteel Colossus is indestructible. -- If Darksteel Colossus would be put into a graveyard from anywhere, reveal Darksteel Colossus and shuffle it into its owner's library instead. mana={11} type=Artifact Creature @@ -34460,6 +34458,14 @@ mana={1}{U}{U} type=Instant [/card] [card] +name=Forbidden Crypt +abilities=mygraveexiler +auto=replacedraw if type(*|mygraveyard)~morethan~0 then moveto(ownerhand) notatarget(*|mygraveyard) else wingame opponent +text=If you would draw a card, return a card from your graveyard to your hand instead. If you can't, you lose the game. -- If a card would be put into your graveyard from anywhere, exile that card instead. +mana={3}{B}{B} +type=Enchantment +[/card] +[card] name=Forbidden Lore target=land auto=teach(land) {T}:2/1 target(creature) @@ -40038,6 +40044,16 @@ power=6 toughness=6 [/card] [card] +name=Gravebane Zombie +abilities=librarydeath +text=If Gravebane Zombie would be put into a graveyard from the battlefield, put Gravebane Zombie on top of its owner's library instead. +mana={3}{B} +type=Creature +subtype=Zombie +power=3 +toughness=2 +[/card] +[card] name=Gravebind target=creature auto=cantregen @@ -53686,8 +53702,8 @@ toughness=2 [/card] [card] name=Legacy Weapon +abilities=shufflelibrarydeath auto={w}{R}{G}{B}{U}:moveto(exile) target(*|battlefield) -autograveyard=moveTo(ownerlibrary) && shuffle text={w}{R}{G}{B}{U}:Exile target permanent. -- If Legacy Weapon would be put into a graveyard from anywhere, reveal Legacy Weapon and shuffle it into its owner's library instead. type=Legendary Artifact mana={7} @@ -53995,12 +54011,10 @@ abilities=leyline [/card] [card] name=Leyline of the Void -#need to have opponentOwn attribute like auto=lord(*[opponentOwn]) transforms((,newability[exiledeath])) -auto=@movedTo(*|opponentGraveyard):all(trigger[to]) moveTo(exile) +abilities=leyline,oppgraveexiler text=If Leyline of the Void is in your opening hand, you may begin the game with it on the battlefield. -- If a card would be put into an opponent's graveyard from anywhere, exile it instead. mana={2}{B}{B} type=Enchantment -abilities=leyline [/card] [card] name=Leyline Phantom @@ -72202,8 +72216,8 @@ type=Sorcery [/card] [card] name=Progenitus +abilities=shufflelibrarydeath auto=protection from(*) -autograveyard=moveTo(ownerlibrary) && shuffle text=Protection from everything -- If Progenitus would be put into a graveyard from anywhere, reveal Progenitus and shuffle it into its owner's library instead. mana={W}{W}{U}{U}{B}{B}{R}{R}{G}{G} type=Legendary Creature @@ -72584,7 +72598,7 @@ subtype=Arcane [card] name=Pulmonic Sliver auto=lord(sliver) flying -auto=lord(sliver) transforms((,newability[@movedTo(this|graveyard) from(battlefield):all(trigger[to]) moveTo(ownerlibrary)])) +auto=lord(sliver) transforms((,newability[librarydeath])) text=All Sliver creatures have flying. -- All Slivers have "If this permanent would be put into a graveyard, you may put it on top of its owner's library instead." mana={3}{W}{W} type=Creature @@ -76497,6 +76511,14 @@ mana={1}{W} type=Instant [/card] [card] +name=Rest in Peace +abilities=mygraveexiler,oppgraveexiler +auto=moveto(exile) all(*|graveyard) +text=When Rest in Peace enters the battlefield, exile all cards from all graveyards. -- If a card or token would be put into a graveyard from anywhere, exile it instead. +mana={1}{W} +type=Enchantment +[/card] +[card] name=Restless Apparition abilities=persist auto={WB}{WB}{WB}:3/3 @@ -111046,6 +111068,15 @@ power=6 toughness=6 [/card] [card] +name=Yawgmoth's Agenda +abilities=mygraveexiler +auto=lord(*|mygraveyard) canPlayFromGraveyard +auto=maxCast(*)1 +text=You can't cast more than one spell each turn. -- You may play cards from your graveyard. -- If a card would be put into your graveyard from anywhere, exile it instead. +mana={3}{B}{B} +type=Enchantment +[/card] +[card] name=Yawgmoth's Bargain auto=phasealter(remove,draw,controller) auto={L}:draw:1 controller diff --git a/projects/mtg/bin/Res/sets/primitives/unsupported.txt b/projects/mtg/bin/Res/sets/primitives/unsupported.txt index 2700d7866..9b1b81fb3 100644 --- a/projects/mtg/bin/Res/sets/primitives/unsupported.txt +++ b/projects/mtg/bin/Res/sets/primitives/unsupported.txt @@ -5428,12 +5428,6 @@ mana={2}{G} type=Enchantment [/card] [card] -name=Forbidden Crypt -text=If you would draw a card, return a card from your graveyard to your hand instead. If you can't, you lose the game. -- If a card would be put into your graveyard from anywhere, exile that card instead. -mana={3}{B}{B} -type=Enchantment -[/card] -[card] name=Forbidden Ritual text=Sacrifice a nontoken permanent. If you do, target opponent loses 2 life unless he or she sacrifices a permanent or discards a card. You may repeat this process any number of times. mana={2}{B}{B} @@ -6598,15 +6592,6 @@ type=Enchantment subtype=Aura [/card] [card] -name=Gravebane Zombie -text=If Gravebane Zombie would be put into a graveyard from the battlefield, put Gravebane Zombie on top of its owner's library instead. -mana={3}{B} -type=Creature -subtype=Zombie -power=3 -toughness=2 -[/card] -[card] name=Graven Dominator text=Flying -- Haunt (When this card is put into a graveyard from the battlefield, exile it haunting target creature.) -- When Graven Dominator enters the battlefield or the creature it haunts is put into a graveyard, each other creature becomes 1/1 until end of turn. mana={4}{W}{W} @@ -13271,15 +13256,6 @@ mana={1}{U} type=Sorcery [/card] [card] -name=Rest in Peace -#Note this is replacement effect, I think wagic has no override rule. -auto=moveto(exile) all(*|graveyard) -auto=@movedTo(*|graveyard):all(trigger[to]) moveTo(exile) -text=When Rest in Peace enters the battlefield, exile all cards from all graveyards. -- If a card or token would be put into a graveyard from anywhere, exile it instead. -mana={1}{W} -type=Enchantment -[/card] -[card] name=Restless Dreams text=As an additional cost to cast Restless Dreams, discard X cards. -- Return X target creature cards from your graveyard to your hand. mana={B} @@ -18954,12 +18930,6 @@ mana={2}{W} type=Instant [/card] [card] -name=Yawgmoth's Agenda -text=You can't cast more than one spell each turn. -- You may play cards from your graveyard. -- If a card would be put into your graveyard from anywhere, exile it instead. -mana={3}{B}{B} -type=Enchantment -[/card] -[card] name=Ydwen Efreet text=Whenever Ydwen Efreet blocks, flip a coin. If you lose the flip, remove Ydwen Efreet from combat and it can't block this turn. Creatures it was blocking that had become blocked by only Ydwen Efreet this combat become unblocked. mana={R}{R}{R} diff --git a/projects/mtg/include/MTGDefinitions.h b/projects/mtg/include/MTGDefinitions.h index a87e49ef5..79311fc1b 100644 --- a/projects/mtg/include/MTGDefinitions.h +++ b/projects/mtg/include/MTGDefinitions.h @@ -222,7 +222,9 @@ class Constants TOKENIZER = 104, MYGRAVEEXILER = 105, OPPGRAVEEXILER = 106, - NB_BASIC_ABILITIES = 107, + LIBRARYDEATH = 107, + SHUFFLELIBRARYDEATH = 108, + NB_BASIC_ABILITIES = 109, RARITY_S = 'S', //Special Rarity diff --git a/projects/mtg/src/MTGDefinitions.cpp b/projects/mtg/src/MTGDefinitions.cpp index 82ea0ca46..bf2ca0f09 100644 --- a/projects/mtg/src/MTGDefinitions.cpp +++ b/projects/mtg/src/MTGDefinitions.cpp @@ -135,7 +135,9 @@ const char* Constants::MTGBasicAbilities[] = { "canplayfromgraveyard", "tokenizer",//parallel lives, "mygraveexiler", - "oppgraveexiler" + "oppgraveexiler", + "librarydeath", + "shufflelibrarydeath" }; map Constants::MTGBasicAbilitiesMap; diff --git a/projects/mtg/src/MTGGameZones.cpp b/projects/mtg/src/MTGGameZones.cpp index 052d4ec51..d4fd3139a 100644 --- a/projects/mtg/src/MTGGameZones.cpp +++ b/projects/mtg/src/MTGGameZones.cpp @@ -321,6 +321,17 @@ MTGCardInstance * MTGPlayerCards::putInZone(MTGCardInstance * card, MTGGameZone return card; //Error check int doCopy = 1; + bool shufflelibrary = card->basicAbilities[(int)Constants::SHUFFLELIBRARYDEATH]; + //Darksteel Colossus, Legacy Weapon ... top priority since we replace destination directly automatically... + for(int i = 0; i < 2; ++i) + { + if ((to == g->players[i]->game->graveyard) && ( + card->basicAbilities[(int)Constants::LIBRARYDEATH]|| + card->basicAbilities[(int)Constants::SHUFFLELIBRARYDEATH])) + { + to = g->players[i]->game->library; + } + } //Leyline of the Void, Yawgmoth's Agenda... effect... for(int i = 0; i < 2; ++i) { @@ -392,6 +403,9 @@ MTGCardInstance * MTGPlayerCards::putInZone(MTGCardInstance * card, MTGGameZone } if(!asCopy) { + if(shufflelibrary) + copy->owner->game->library->shuffle(); + WEvent * e = NEW WEventZoneChange(copy, from, to); g->receiveEvent(e); } From 7878252692d7052720652208bf4a96db2c370cd5 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Fri, 4 Sep 2015 23:45:16 +0800 Subject: [PATCH 073/249] support for Rest in Peace tokens are not cards... a little dirty... --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 2 +- projects/mtg/src/MTGGameZones.cpp | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index cf3f881e9..6ef4b64b7 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -98565,7 +98565,7 @@ type=Instant [/card] [card] name=Tidal Influence -restrction=one of a kind +restriction=one of a kind auto=counter(0/0,1,Tide) auto=@each my upkeep:all(tidal influence[counter{0/0.4.Tide}]) removeallcounters(0/0,1,Tide) auto=@each my upkeep:counter(0/0,1,Tide) diff --git a/projects/mtg/src/MTGGameZones.cpp b/projects/mtg/src/MTGGameZones.cpp index d4fd3139a..04dd8d629 100644 --- a/projects/mtg/src/MTGGameZones.cpp +++ b/projects/mtg/src/MTGGameZones.cpp @@ -322,6 +322,9 @@ MTGCardInstance * MTGPlayerCards::putInZone(MTGCardInstance * card, MTGGameZone int doCopy = 1; bool shufflelibrary = card->basicAbilities[(int)Constants::SHUFFLELIBRARYDEATH]; + bool ripToken = false; + if (g->players[0]->game->battlefield->hasName("Rest in Peace")||g->players[1]->game->battlefield->hasName("Rest in Peace")) + ripToken = true; //Darksteel Colossus, Legacy Weapon ... top priority since we replace destination directly automatically... for(int i = 0; i < 2; ++i) { @@ -338,7 +341,12 @@ MTGCardInstance * MTGPlayerCards::putInZone(MTGCardInstance * card, MTGGameZone if ((to == g->players[i]->game->graveyard) && ( g->players[i]->game->battlefield->hasAbility(Constants::MYGRAVEEXILER) || g->players[i]->opponent()->game->battlefield->hasAbility(Constants::OPPGRAVEEXILER))) - to = g->players[i]->game->exile; + { + if ((card->isToken && ripToken)) + to = g->players[i]->game->exile; + if (!card->isToken) + to = g->players[i]->game->exile; + } } //When a card is moved from inPlay to inPlay (controller change, for example), it is still the same object if ((to == g->players[0]->game->inPlay || to == g->players[1]->game->inPlay) && (from == g->players[0]->game->inPlay || from From 74bba5263a07f905e1231698d35eb0b9a852a1f5 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sat, 5 Sep 2015 06:44:10 +0800 Subject: [PATCH 074/249] added test for leyline of the void and rest in peace and darksteel colossus --- .../mtg/bin/Res/test/leyline_of_the_void.txt | 26 +++++++++++++++++++ projects/mtg/bin/Res/test/restinpeace.txt | 23 ++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 projects/mtg/bin/Res/test/leyline_of_the_void.txt create mode 100644 projects/mtg/bin/Res/test/restinpeace.txt diff --git a/projects/mtg/bin/Res/test/leyline_of_the_void.txt b/projects/mtg/bin/Res/test/leyline_of_the_void.txt new file mode 100644 index 000000000..48bf357b2 --- /dev/null +++ b/projects/mtg/bin/Res/test/leyline_of_the_void.txt @@ -0,0 +1,26 @@ +#Testing Leyline of the Void vs Darksteel Colossus and Black Sun's Zenith +#Darksteel Colossus must be on owners library +[INIT] +FIRSTMAIN +[PLAYER1] +inplay:Leyline of the Void, Forbidden Orchard +hand:Black Sun's Zenith +manapool:{B}{B}{B}{B}{B}{B}{B}{B}{B}{B}{B}{B}{B}{B} +[PLAYER2] +inplay:Darksteel Colossus +library:Mountain +[DO] +Forbidden Orchard +choice 2 +Black Sun's Zenith +[ASSERT] +FIRSTMAIN +[PLAYER1] +inplay:Leyline of the Void, Forbidden Orchard +library:Black Sun's Zenith +manapool:{0} +life:20 +[PLAYER2] +library:Mountain, Darksteel Colossus +life:20 +[END] \ No newline at end of file diff --git a/projects/mtg/bin/Res/test/restinpeace.txt b/projects/mtg/bin/Res/test/restinpeace.txt new file mode 100644 index 000000000..347121900 --- /dev/null +++ b/projects/mtg/bin/Res/test/restinpeace.txt @@ -0,0 +1,23 @@ +#Testing Rest in Peace vs Disenchant +#Rest in Peace should be exiled while Disenchant must be put +#in the owner's graveyard.. +[INIT] +FIRSTMAIN +[PLAYER1] +inplay:Rest in Peace +hand:Disenchant +manapool:{W}{W} +[PLAYER2] +[DO] +Disenchant +Rest in Peace +[ASSERT] +FIRSTMAIN +[PLAYER1] +graveyard:Disenchant +manapool:{0} +exile:Rest in Peace +life:20 +[PLAYER2] +life:20 +[END] \ No newline at end of file From bcb75dac65ed9ed9f4a46851c2f28028e6e8f881 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sat, 5 Sep 2015 06:50:33 +0800 Subject: [PATCH 075/249] updated test --- projects/mtg/bin/Res/test/_tests.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/projects/mtg/bin/Res/test/_tests.txt b/projects/mtg/bin/Res/test/_tests.txt index 598704221..56160cba3 100644 --- a/projects/mtg/bin/Res/test/_tests.txt +++ b/projects/mtg/bin/Res/test/_tests.txt @@ -440,6 +440,7 @@ kudzu_i168.txt Lethargy_Trap.txt Lethargy_Trap2.txt leveler.txt +leyline_of_the_void.txt lhurgoyf.txt liability.txt library_of_alexandria1.txt @@ -569,6 +570,7 @@ Rending_Vines2.txt resounding_roar.txt resurrection.txt resuscitate_i210.txt +restinpeace.txt righteous_cause.txt rise_from_the_grave.txt river_kelpie2_i335.txt From da34530d98a3f9c38c4192acbaaa8e43a9ae0a2c Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sat, 5 Sep 2015 07:20:28 +0800 Subject: [PATCH 076/249] added test for Gravebane Zombie --- .../mtg/bin/Res/test/Gravebane_Zombie.txt | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 projects/mtg/bin/Res/test/Gravebane_Zombie.txt diff --git a/projects/mtg/bin/Res/test/Gravebane_Zombie.txt b/projects/mtg/bin/Res/test/Gravebane_Zombie.txt new file mode 100644 index 000000000..a1a944388 --- /dev/null +++ b/projects/mtg/bin/Res/test/Gravebane_Zombie.txt @@ -0,0 +1,28 @@ +#Testing Gravebane Zombie +#after gravebane zombie dies, activate archivist +#and you must draw gravebane zombie if its on the top +#of your library +[INIT] +FIRSTMAIN +[PLAYER1] +inplay:Gravebane Zombie, Archivist +hand:Wrecking Ball +library:mountain, plains, swamp +manapool:{2}{R}{B} +[PLAYER2] +[DO] +Wrecking Ball +Gravebane Zombie +Archivist +[ASSERT] +FIRSTMAIN +[PLAYER1] +inplay:Archivist +library:mountain, plains, swamp +hand:Gravebane Zombie +graveyard:Wrecking Ball +manapool:{0} +life:20 +[PLAYER2] +life:20 +[END] \ No newline at end of file From 45b880ef76d48b3aa4b59c9efe728376e05ec2ef Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sat, 5 Sep 2015 07:23:35 +0800 Subject: [PATCH 077/249] updated test --- projects/mtg/bin/Res/test/_tests.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/projects/mtg/bin/Res/test/_tests.txt b/projects/mtg/bin/Res/test/_tests.txt index 56160cba3..68fc41c15 100644 --- a/projects/mtg/bin/Res/test/_tests.txt +++ b/projects/mtg/bin/Res/test/_tests.txt @@ -374,6 +374,7 @@ goblin_lackey4.txt goblin_offensive.txt goblin_razerunners.txt golgari_germination_i153.txt +Gravebane_Zombie.txt gravedigger.txt gravity_well.txt gravity_well2.txt From 17f5d8f0c2c4491bf1cc17963f72f252a9c7fc9d Mon Sep 17 00:00:00 2001 From: Xawotihs Date: Sat, 5 Sep 2015 09:21:42 +0200 Subject: [PATCH 078/249] Fixed reachability include path --- projects/mtg/iOS/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/mtg/iOS/Makefile b/projects/mtg/iOS/Makefile index 4d4280de2..e7422e072 100644 --- a/projects/mtg/iOS/Makefile +++ b/projects/mtg/iOS/Makefile @@ -186,7 +186,7 @@ ADDITIONAL_CFLAGS = -I ../include\ -I ../../../Boost\ -I ../../../JGE/src/iOS\ -I ../iOS/UI\ - -I ../iOS/Reachability/Reachability\ 2.0.4ddg/Reachability\ + -I ../iOS/Reachability/Reachability\ -I ../iOS/asi-http-request\ -I ../iOS/ZipArchive\ -I ../iOS/SoundManager\ From a6c331042a5fd3820aa9abdab1567971f577cff9 Mon Sep 17 00:00:00 2001 From: xawotihs Date: Sun, 6 Sep 2015 21:12:15 +0200 Subject: [PATCH 079/249] Removed minizip directory, moved ZipArchive, updated xcode project and iOS makefile --- projects/mtg/iOS/Makefile | 2 +- .../Reachability 2.0.4ddg/._.DS_Store | Bin 82 -> 0 bytes .../DDG Reachability/._.DS_Store | Bin 82 -> 0 bytes .../DDG Reachability/._Airport.png | Bin 229 -> 0 bytes .../DDG Reachability/._Default.png | Bin 229 -> 0 bytes .../DDG Reachability/._Network.png | Bin 229 -> 0 bytes .../DDG Reachability/._WWAN5.png | Bin 229 -> 0 bytes .../DDG Reachability/._icon.png | Bin 229 -> 0 bytes .../DDG Reachability/._red.png | Bin 229 -> 0 bytes .../DDG Reachability/._stop-32.png | Bin 229 -> 0 bytes .../Classes/._ReachabilityAppDelegate.h | Bin 229 -> 0 bytes .../Classes/._ReachabilityAppDelegate.m | Bin 171 -> 0 bytes .../Reachability/._Reachability.h | Bin 171 -> 0 bytes .../Reachability/._Reachability.m | Bin 171 -> 0 bytes .../mtg/{ => iOS/ZipArchive}/ZipArchive.mm | 0 projects/mtg/minizip/crypt.h | 132 -- projects/mtg/minizip/ioapi.c | 177 -- projects/mtg/minizip/ioapi.h | 75 - projects/mtg/minizip/mztools.c | 281 --- projects/mtg/minizip/mztools.h | 31 - projects/mtg/minizip/unzip.c | 1598 ----------------- projects/mtg/minizip/unzip.h | 354 ---- projects/mtg/minizip/zip.c | 1219 ------------- projects/mtg/minizip/zip.h | 235 --- projects/mtg/wagic.xcodeproj/project.pbxproj | 86 +- 25 files changed, 40 insertions(+), 4150 deletions(-) delete mode 100644 projects/mtg/iOS/Reachability/__MACOSX/Reachability 2.0.4ddg/._.DS_Store delete mode 100644 projects/mtg/iOS/Reachability/__MACOSX/Reachability 2.0.4ddg/DDG Reachability/._.DS_Store delete mode 100644 projects/mtg/iOS/Reachability/__MACOSX/Reachability 2.0.4ddg/DDG Reachability/._Airport.png delete mode 100644 projects/mtg/iOS/Reachability/__MACOSX/Reachability 2.0.4ddg/DDG Reachability/._Default.png delete mode 100644 projects/mtg/iOS/Reachability/__MACOSX/Reachability 2.0.4ddg/DDG Reachability/._Network.png delete mode 100644 projects/mtg/iOS/Reachability/__MACOSX/Reachability 2.0.4ddg/DDG Reachability/._WWAN5.png delete mode 100644 projects/mtg/iOS/Reachability/__MACOSX/Reachability 2.0.4ddg/DDG Reachability/._icon.png delete mode 100644 projects/mtg/iOS/Reachability/__MACOSX/Reachability 2.0.4ddg/DDG Reachability/._red.png delete mode 100644 projects/mtg/iOS/Reachability/__MACOSX/Reachability 2.0.4ddg/DDG Reachability/._stop-32.png delete mode 100644 projects/mtg/iOS/Reachability/__MACOSX/Reachability 2.0.4ddg/DDG Reachability/Classes/._ReachabilityAppDelegate.h delete mode 100644 projects/mtg/iOS/Reachability/__MACOSX/Reachability 2.0.4ddg/DDG Reachability/Classes/._ReachabilityAppDelegate.m delete mode 100644 projects/mtg/iOS/Reachability/__MACOSX/Reachability 2.0.4ddg/Reachability/._Reachability.h delete mode 100644 projects/mtg/iOS/Reachability/__MACOSX/Reachability 2.0.4ddg/Reachability/._Reachability.m rename projects/mtg/{ => iOS/ZipArchive}/ZipArchive.mm (100%) delete mode 100644 projects/mtg/minizip/crypt.h delete mode 100644 projects/mtg/minizip/ioapi.c delete mode 100644 projects/mtg/minizip/ioapi.h delete mode 100644 projects/mtg/minizip/mztools.c delete mode 100644 projects/mtg/minizip/mztools.h delete mode 100644 projects/mtg/minizip/unzip.c delete mode 100644 projects/mtg/minizip/unzip.h delete mode 100644 projects/mtg/minizip/zip.c delete mode 100644 projects/mtg/minizip/zip.h diff --git a/projects/mtg/iOS/Makefile b/projects/mtg/iOS/Makefile index e7422e072..753632933 100644 --- a/projects/mtg/iOS/Makefile +++ b/projects/mtg/iOS/Makefile @@ -26,7 +26,7 @@ wagic_FILES = ../../../JGE/src/iOS/main.m\ ../../../JGE/src/unzip/unzip.c\ ../../../JGE/src/unzip/zip.c\ ../../../JGE/src/unzip/ioapi.c\ - ../ZipArchive.mm\ + ../iOS/ZipArchive/ZipArchive.mm\ ../src/SimpleMenu.cpp\ ../src/AbilityParser.cpp\ ../src/ActionElement.cpp\ diff --git a/projects/mtg/iOS/Reachability/__MACOSX/Reachability 2.0.4ddg/._.DS_Store b/projects/mtg/iOS/Reachability/__MACOSX/Reachability 2.0.4ddg/._.DS_Store deleted file mode 100644 index 460d887a2e21de5e7ccf222b0fdc4fbe43f67e75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 82 ucmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}u>uf-_(4Dn2M%x+Dgyuy>I7i` diff --git a/projects/mtg/iOS/Reachability/__MACOSX/Reachability 2.0.4ddg/DDG Reachability/._.DS_Store b/projects/mtg/iOS/Reachability/__MACOSX/Reachability 2.0.4ddg/DDG Reachability/._.DS_Store deleted file mode 100644 index 460d887a2e21de5e7ccf222b0fdc4fbe43f67e75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 82 ucmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}u>uf-_(4Dn2M%x+Dgyuy>I7i` diff --git a/projects/mtg/iOS/Reachability/__MACOSX/Reachability 2.0.4ddg/DDG Reachability/._Airport.png b/projects/mtg/iOS/Reachability/__MACOSX/Reachability 2.0.4ddg/DDG Reachability/._Airport.png deleted file mode 100644 index bfd971348cbcb4d676ab3d4e6694d4cc91551a41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 229 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}@n#?f@t*=Q5x_AdB#6=Ktszh;NXHBy z_C?dih!7V|&d=3LEGWoH)hjGbEK1BP$;?Y-DAYFq0&9~*3xgC3Lv!ok#I(esOlu=I sH**VTH)CBhS5sqM6JtwfT?;ouXI*n+Cub8gOEWhk7vma)fe>8`0KZ!&cmMzZ diff --git a/projects/mtg/iOS/Reachability/__MACOSX/Reachability 2.0.4ddg/DDG Reachability/._Default.png b/projects/mtg/iOS/Reachability/__MACOSX/Reachability 2.0.4ddg/DDG Reachability/._Default.png deleted file mode 100644 index 40fb6c3435a2231a7516cbdf303a01121b2f6f87..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 229 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}@n#?f@t*=Q5x_AdB#6=Kttn6`NXHBy z_C?dih!7V|&d=3LEGWoH)hjGbEK1BP$;?Y-DAYFq0&9~*3xgC3Lv!ok#I(esOlu=I sH**VTH)CBhS5sqM6JtwfT?;ouXI*n+Cub8gOEWhk7vma)fe>8`0KtPNd;kCd diff --git a/projects/mtg/iOS/Reachability/__MACOSX/Reachability 2.0.4ddg/DDG Reachability/._Network.png b/projects/mtg/iOS/Reachability/__MACOSX/Reachability 2.0.4ddg/DDG Reachability/._Network.png deleted file mode 100644 index 35682fa90956ea5d13a5bbb62ddd0e7582764fb5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 229 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}@n#?f@t*=Q5x_AdB#6=KttC(?NXHBy z_C?dih!7V|&d=3LEGWoH)hjGbEK1BP$;?Y-DAYFq0&9~*3xgC3Lv!ok#I(esOlu=I sH**VTH)CBhS5sqM6JtwfT?;ouXI*n+Cub8gOEWhk7vma)fe>8`0K=;%fB*mh diff --git a/projects/mtg/iOS/Reachability/__MACOSX/Reachability 2.0.4ddg/DDG Reachability/._WWAN5.png b/projects/mtg/iOS/Reachability/__MACOSX/Reachability 2.0.4ddg/DDG Reachability/._WWAN5.png deleted file mode 100644 index d8369e0b24d57da74cce50338cda78f685524df8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 229 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}@n#?f@t*=Q5x_AdB#6=Ktus(5NXHBy z_C?dih!7V|&d=3LEGWoH)hjGbEK1BP$;?Y-DAYFq0&9~*3xgC3Lv!ok#I(esOlu=I sH**VTH)CBhS5sqM6JtwfT?;ouXI*n+Cub8gOEWhk7vma)fe>8`0Lc$0iU0rr diff --git a/projects/mtg/iOS/Reachability/__MACOSX/Reachability 2.0.4ddg/DDG Reachability/._icon.png b/projects/mtg/iOS/Reachability/__MACOSX/Reachability 2.0.4ddg/DDG Reachability/._icon.png deleted file mode 100644 index 3248fe19427e64551a591444c17d6229f7c740ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 229 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}@n#?f@t*=Q5x_AdB#6=Ktr<`$NXHBy z_C?dih!7V|&d=3LEGWoH)hjGbEK1BP$;?Y-DAYFq0&9~*3xgC3Lv!ok#I(esOlu=I sH**VTH)CBhS5sqM6JtwfT?;ouXI*n+Cub8gOEWhk7vma)fe>8`0KyF?eE$Vqox1Ojhs@R)|o50+1L3ClDI}@n#?f@t*=Q5x_AdB#6=Kts_t=NXHBy z_C?dih!7V|&d=3LEGWoH)hjGbEK1BP$;?Y-DAYFq0&9~*3xgC3Lv!ok#I(esOlu=I sH**VTH)CBhS5sqM6JtwfT?;ouXI*n+Cub8gOEWhk7vma)fe>8`0LS|$hyVZp diff --git a/projects/mtg/iOS/Reachability/__MACOSX/Reachability 2.0.4ddg/DDG Reachability/._stop-32.png b/projects/mtg/iOS/Reachability/__MACOSX/Reachability 2.0.4ddg/DDG Reachability/._stop-32.png deleted file mode 100644 index 3eddbdfcc1300ab334fea0df863175ce82dd548f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 229 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}@n#?f@t*=Q5x_AdB#6=KtrJiwNXHBy z_C?dih!7V|&d=3LEGWoH)hjGbEK1BP$;?Y-DAYFq0&9~*3xgC3Lv!ok#I(esOlu=I sH**VTH)CBhS5sqM6JtwfT?;ouXI*n+Cub8gOEWhk7vma)fe>8`0LX$Vqox1Ojhs@R)|o50+1L3ClDI}@n#?f@t*=Q5x_AdB#6=Ktuat3NXHBy z_C?dih!7V|&d=3LEGWoH)hjGbEK1BP$;?Y-DAYFq0&9~*3xgC3Lv!ok#I(esOlu=I sH**VTH)CBhS5sqM6JtwfT?;ouXI*n+Cub8gOEWhk7vma)fe>8`0Kji2dH?_b diff --git a/projects/mtg/iOS/Reachability/__MACOSX/Reachability 2.0.4ddg/DDG Reachability/Classes/._ReachabilityAppDelegate.m b/projects/mtg/iOS/Reachability/__MACOSX/Reachability 2.0.4ddg/DDG Reachability/Classes/._ReachabilityAppDelegate.m deleted file mode 100644 index 6d4e1fc8f9534b69cdf4fe2bdc7ea6b1124ababd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 171 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62xfr)&!^&q+<>c z^P_2FM2L$g=jZAr78K;9>V>3Ml(^<4=ci=mr2`d|mZa%gSQ{Ff7#W&dT9^O;OcWKu diff --git a/projects/mtg/iOS/Reachability/__MACOSX/Reachability 2.0.4ddg/Reachability/._Reachability.h b/projects/mtg/iOS/Reachability/__MACOSX/Reachability 2.0.4ddg/Reachability/._Reachability.h deleted file mode 100644 index 2f77ca5711871d83064a2c97c7d52caae55f0685..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 171 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}K2;dkJ62xfrwi&1tq+<>c z^P_2FM2L$g=jZAr78K;9>V>3Ml(^<4=ci=mr2`d|mZa%gSQ{Ff7#W&dT9^O;WW*K` diff --git a/projects/mtg/iOS/Reachability/__MACOSX/Reachability 2.0.4ddg/Reachability/._Reachability.m b/projects/mtg/iOS/Reachability/__MACOSX/Reachability 2.0.4ddg/Reachability/._Reachability.m deleted file mode 100644 index c20617b41cc45270f9d9ecbc247f77a7312e2548..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 171 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aU~Fg_^W}KA;dKz1VrNojv*mIj8<>g z0#$%?%mHG4G}Vj> 8)) - -/*********************************************************************** - * Return the next byte in the pseudo-random sequence - */ -static int decrypt_byte(unsigned long* pkeys, const unsigned long* pcrc_32_tab) -{ - unsigned temp; /* POTENTIAL BUG: temp*(temp^1) may overflow in an - * unpredictable manner on 16-bit systems; not a problem - * with any known compiler so far, though */ - - temp = ((unsigned)(*(pkeys+2)) & 0xffff) | 2; - return (int)(((temp * (temp ^ 1)) >> 8) & 0xff); -} - -/*********************************************************************** - * Update the encryption keys with the next byte of plain text - */ -static int update_keys(unsigned long* pkeys,const unsigned long* pcrc_32_tab,int c) -{ - (*(pkeys+0)) = CRC32((*(pkeys+0)), c); - (*(pkeys+1)) += (*(pkeys+0)) & 0xff; - (*(pkeys+1)) = (*(pkeys+1)) * 134775813L + 1; - { - register int keyshift = (int)((*(pkeys+1)) >> 24); - (*(pkeys+2)) = CRC32((*(pkeys+2)), keyshift); - } - return c; -} - - -/*********************************************************************** - * Initialize the encryption keys and the random header according to - * the given password. - */ -static void init_keys(const char* passwd,unsigned long* pkeys,const unsigned long* pcrc_32_tab) -{ - *(pkeys+0) = 305419896L; - *(pkeys+1) = 591751049L; - *(pkeys+2) = 878082192L; - while (*passwd != '\0') { - update_keys(pkeys,pcrc_32_tab,(int)*passwd); - passwd++; - } -} - -#define zdecode(pkeys,pcrc_32_tab,c) \ - (update_keys(pkeys,pcrc_32_tab,c ^= decrypt_byte(pkeys,pcrc_32_tab))) - -#define zencode(pkeys,pcrc_32_tab,c,t) \ - (t=decrypt_byte(pkeys,pcrc_32_tab), update_keys(pkeys,pcrc_32_tab,c), t^(c)) - -#ifdef INCLUDECRYPTINGCODE_IFCRYPTALLOWED - -#define RAND_HEAD_LEN 12 - /* "last resort" source for second part of crypt seed pattern */ -# ifndef ZCR_SEED2 -# define ZCR_SEED2 3141592654UL /* use PI as default pattern */ -# endif - -static int crypthead(passwd, buf, bufSize, pkeys, pcrc_32_tab, crcForCrypting) - const char *passwd; /* password string */ - unsigned char *buf; /* where to write header */ - int bufSize; - unsigned long* pkeys; - const unsigned long* pcrc_32_tab; - unsigned long crcForCrypting; -{ - int n; /* index in random header */ - int t; /* temporary */ - int c; /* random byte */ - unsigned char header[RAND_HEAD_LEN-2]; /* random header */ - static unsigned calls = 0; /* ensure different random header each time */ - - if (bufSize> 7) & 0xff; - header[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, c, t); - } - /* Encrypt random header (last two bytes is high word of crc) */ - init_keys(passwd, pkeys, pcrc_32_tab); - for (n = 0; n < RAND_HEAD_LEN-2; n++) - { - buf[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, header[n], t); - } - buf[n++] = zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 16) & 0xff, t); - buf[n++] = zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 24) & 0xff, t); - return n; -} - -#endif diff --git a/projects/mtg/minizip/ioapi.c b/projects/mtg/minizip/ioapi.c deleted file mode 100644 index 7f20c182f..000000000 --- a/projects/mtg/minizip/ioapi.c +++ /dev/null @@ -1,177 +0,0 @@ -/* ioapi.c -- IO base function header for compress/uncompress .zip - files using zlib + zip or unzip API - - Version 1.01e, February 12th, 2005 - - Copyright (C) 1998-2005 Gilles Vollant -*/ - -#include -#include -#include - -#include "zlib.h" -#include "ioapi.h" - - - -/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */ - -#ifndef SEEK_CUR -#define SEEK_CUR 1 -#endif - -#ifndef SEEK_END -#define SEEK_END 2 -#endif - -#ifndef SEEK_SET -#define SEEK_SET 0 -#endif - -voidpf ZCALLBACK fopen_file_func OF(( - voidpf opaque, - const char* filename, - int mode)); - -uLong ZCALLBACK fread_file_func OF(( - voidpf opaque, - voidpf stream, - void* buf, - uLong size)); - -uLong ZCALLBACK fwrite_file_func OF(( - voidpf opaque, - voidpf stream, - const void* buf, - uLong size)); - -long ZCALLBACK ftell_file_func OF(( - voidpf opaque, - voidpf stream)); - -long ZCALLBACK fseek_file_func OF(( - voidpf opaque, - voidpf stream, - uLong offset, - int origin)); - -int ZCALLBACK fclose_file_func OF(( - voidpf opaque, - voidpf stream)); - -int ZCALLBACK ferror_file_func OF(( - voidpf opaque, - voidpf stream)); - - -voidpf ZCALLBACK fopen_file_func (opaque, filename, mode) - voidpf opaque; - const char* filename; - int mode; -{ - FILE* file = NULL; - const char* mode_fopen = NULL; - if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) - mode_fopen = "rb"; - else - if (mode & ZLIB_FILEFUNC_MODE_EXISTING) - mode_fopen = "r+b"; - else - if (mode & ZLIB_FILEFUNC_MODE_CREATE) - mode_fopen = "wb"; - - if ((filename!=NULL) && (mode_fopen != NULL)) - file = fopen(filename, mode_fopen); - return file; -} - - -uLong ZCALLBACK fread_file_func (opaque, stream, buf, size) - voidpf opaque; - voidpf stream; - void* buf; - uLong size; -{ - uLong ret; - ret = (uLong)fread(buf, 1, (size_t)size, (FILE *)stream); - return ret; -} - - -uLong ZCALLBACK fwrite_file_func (opaque, stream, buf, size) - voidpf opaque; - voidpf stream; - const void* buf; - uLong size; -{ - uLong ret; - ret = (uLong)fwrite(buf, 1, (size_t)size, (FILE *)stream); - return ret; -} - -long ZCALLBACK ftell_file_func (opaque, stream) - voidpf opaque; - voidpf stream; -{ - long ret; - ret = ftell((FILE *)stream); - return ret; -} - -long ZCALLBACK fseek_file_func (opaque, stream, offset, origin) - voidpf opaque; - voidpf stream; - uLong offset; - int origin; -{ - int fseek_origin=0; - long ret; - switch (origin) - { - case ZLIB_FILEFUNC_SEEK_CUR : - fseek_origin = SEEK_CUR; - break; - case ZLIB_FILEFUNC_SEEK_END : - fseek_origin = SEEK_END; - break; - case ZLIB_FILEFUNC_SEEK_SET : - fseek_origin = SEEK_SET; - break; - default: return -1; - } - ret = 0; - fseek((FILE *)stream, offset, fseek_origin); - return ret; -} - -int ZCALLBACK fclose_file_func (opaque, stream) - voidpf opaque; - voidpf stream; -{ - int ret; - ret = fclose((FILE *)stream); - return ret; -} - -int ZCALLBACK ferror_file_func (opaque, stream) - voidpf opaque; - voidpf stream; -{ - int ret; - ret = ferror((FILE *)stream); - return ret; -} - -void fill_fopen_filefunc (pzlib_filefunc_def) - zlib_filefunc_def* pzlib_filefunc_def; -{ - pzlib_filefunc_def->zopen_file = fopen_file_func; - pzlib_filefunc_def->zread_file = fread_file_func; - pzlib_filefunc_def->zwrite_file = fwrite_file_func; - pzlib_filefunc_def->ztell_file = ftell_file_func; - pzlib_filefunc_def->zseek_file = fseek_file_func; - pzlib_filefunc_def->zclose_file = fclose_file_func; - pzlib_filefunc_def->zerror_file = ferror_file_func; - pzlib_filefunc_def->opaque = NULL; -} diff --git a/projects/mtg/minizip/ioapi.h b/projects/mtg/minizip/ioapi.h deleted file mode 100644 index e73a3b2bd..000000000 --- a/projects/mtg/minizip/ioapi.h +++ /dev/null @@ -1,75 +0,0 @@ -/* ioapi.h -- IO base function header for compress/uncompress .zip - files using zlib + zip or unzip API - - Version 1.01e, February 12th, 2005 - - Copyright (C) 1998-2005 Gilles Vollant -*/ - -#ifndef _ZLIBIOAPI_H -#define _ZLIBIOAPI_H - - -#define ZLIB_FILEFUNC_SEEK_CUR (1) -#define ZLIB_FILEFUNC_SEEK_END (2) -#define ZLIB_FILEFUNC_SEEK_SET (0) - -#define ZLIB_FILEFUNC_MODE_READ (1) -#define ZLIB_FILEFUNC_MODE_WRITE (2) -#define ZLIB_FILEFUNC_MODE_READWRITEFILTER (3) - -#define ZLIB_FILEFUNC_MODE_EXISTING (4) -#define ZLIB_FILEFUNC_MODE_CREATE (8) - - -#ifndef ZCALLBACK - -#if (defined(WIN32) || defined (WINDOWS) || defined (_WINDOWS)) && defined(CALLBACK) && defined (USEWINDOWS_CALLBACK) -#define ZCALLBACK CALLBACK -#else -#define ZCALLBACK -#endif -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -typedef voidpf (ZCALLBACK *open_file_func) OF((voidpf opaque, const char* filename, int mode)); -typedef uLong (ZCALLBACK *read_file_func) OF((voidpf opaque, voidpf stream, void* buf, uLong size)); -typedef uLong (ZCALLBACK *write_file_func) OF((voidpf opaque, voidpf stream, const void* buf, uLong size)); -typedef long (ZCALLBACK *tell_file_func) OF((voidpf opaque, voidpf stream)); -typedef long (ZCALLBACK *seek_file_func) OF((voidpf opaque, voidpf stream, uLong offset, int origin)); -typedef int (ZCALLBACK *close_file_func) OF((voidpf opaque, voidpf stream)); -typedef int (ZCALLBACK *testerror_file_func) OF((voidpf opaque, voidpf stream)); - -typedef struct zlib_filefunc_def_s -{ - open_file_func zopen_file; - read_file_func zread_file; - write_file_func zwrite_file; - tell_file_func ztell_file; - seek_file_func zseek_file; - close_file_func zclose_file; - testerror_file_func zerror_file; - voidpf opaque; -} zlib_filefunc_def; - - - -void fill_fopen_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def)); - -#define ZREAD(filefunc,filestream,buf,size) ((*((filefunc).zread_file))((filefunc).opaque,filestream,buf,size)) -#define ZWRITE(filefunc,filestream,buf,size) ((*((filefunc).zwrite_file))((filefunc).opaque,filestream,buf,size)) -#define ZTELL(filefunc,filestream) ((*((filefunc).ztell_file))((filefunc).opaque,filestream)) -#define ZSEEK(filefunc,filestream,pos,mode) ((*((filefunc).zseek_file))((filefunc).opaque,filestream,pos,mode)) -#define ZCLOSE(filefunc,filestream) ((*((filefunc).zclose_file))((filefunc).opaque,filestream)) -#define ZERROR(filefunc,filestream) ((*((filefunc).zerror_file))((filefunc).opaque,filestream)) - - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/projects/mtg/minizip/mztools.c b/projects/mtg/minizip/mztools.c deleted file mode 100644 index bc5c7982d..000000000 --- a/projects/mtg/minizip/mztools.c +++ /dev/null @@ -1,281 +0,0 @@ -/* - Additional tools for Minizip - Code: Xavier Roche '2004 - License: Same as ZLIB (www.gzip.org) -*/ - -/* Code */ -#include -#include -#include -#include "zlib.h" -#include "unzip.h" - -#define READ_8(adr) ((unsigned char)*(adr)) -#define READ_16(adr) ( READ_8(adr) | (READ_8(adr+1) << 8) ) -#define READ_32(adr) ( READ_16(adr) | (READ_16((adr)+2) << 16) ) - -#define WRITE_8(buff, n) do { \ - *((unsigned char*)(buff)) = (unsigned char) ((n) & 0xff); \ -} while(0) -#define WRITE_16(buff, n) do { \ - WRITE_8((unsigned char*)(buff), n); \ - WRITE_8(((unsigned char*)(buff)) + 1, (n) >> 8); \ -} while(0) -#define WRITE_32(buff, n) do { \ - WRITE_16((unsigned char*)(buff), (n) & 0xffff); \ - WRITE_16((unsigned char*)(buff) + 2, (n) >> 16); \ -} while(0) - -extern int ZEXPORT unzRepair(file, fileOut, fileOutTmp, nRecovered, bytesRecovered) -const char* file; -const char* fileOut; -const char* fileOutTmp; -uLong* nRecovered; -uLong* bytesRecovered; -{ - int err = Z_OK; - FILE* fpZip = fopen(file, "rb"); - FILE* fpOut = fopen(fileOut, "wb"); - FILE* fpOutCD = fopen(fileOutTmp, "wb"); - if (fpZip != NULL && fpOut != NULL) { - int entries = 0; - uLong totalBytes = 0; - char header[30]; - char filename[256]; - char extra[1024]; - int offset = 0; - int offsetCD = 0; - while ( fread(header, 1, 30, fpZip) == 30 ) { - int currentOffset = offset; - - /* File entry */ - if (READ_32(header) == 0x04034b50) { - unsigned int version = READ_16(header + 4); - unsigned int gpflag = READ_16(header + 6); - unsigned int method = READ_16(header + 8); - unsigned int filetime = READ_16(header + 10); - unsigned int filedate = READ_16(header + 12); - unsigned int crc = READ_32(header + 14); /* crc */ - unsigned int cpsize = READ_32(header + 18); /* compressed size */ - unsigned int uncpsize = READ_32(header + 22); /* uncompressed sz */ - unsigned int fnsize = READ_16(header + 26); /* file name length */ - unsigned int extsize = READ_16(header + 28); /* extra field length */ - filename[0] = extra[0] = '\0'; - - /* Header */ - if (fwrite(header, 1, 30, fpOut) == 30) { - offset += 30; - } else { - err = Z_ERRNO; - break; - } - - /* Filename */ - if (fnsize > 0) { - if (fread(filename, 1, fnsize, fpZip) == fnsize) { - if (fwrite(filename, 1, fnsize, fpOut) == fnsize) { - offset += fnsize; - } else { - err = Z_ERRNO; - break; - } - } else { - err = Z_ERRNO; - break; - } - } else { - err = Z_STREAM_ERROR; - break; - } - - /* Extra field */ - if (extsize > 0) { - if (fread(extra, 1, extsize, fpZip) == extsize) { - if (fwrite(extra, 1, extsize, fpOut) == extsize) { - offset += extsize; - } else { - err = Z_ERRNO; - break; - } - } else { - err = Z_ERRNO; - break; - } - } - - /* Data */ - { - int dataSize = cpsize; - if (dataSize == 0) { - dataSize = uncpsize; - } - if (dataSize > 0) { - char* data = malloc(dataSize); - if (data != NULL) { - if ((int)fread(data, 1, dataSize, fpZip) == dataSize) { - if ((int)fwrite(data, 1, dataSize, fpOut) == dataSize) { - offset += dataSize; - totalBytes += dataSize; - } else { - err = Z_ERRNO; - } - } else { - err = Z_ERRNO; - } - free(data); - if (err != Z_OK) { - break; - } - } else { - err = Z_MEM_ERROR; - break; - } - } - } - - /* Central directory entry */ - { - char header[46]; - char* comment = ""; - int comsize = (int) strlen(comment); - WRITE_32(header, 0x02014b50); - WRITE_16(header + 4, version); - WRITE_16(header + 6, version); - WRITE_16(header + 8, gpflag); - WRITE_16(header + 10, method); - WRITE_16(header + 12, filetime); - WRITE_16(header + 14, filedate); - WRITE_32(header + 16, crc); - WRITE_32(header + 20, cpsize); - WRITE_32(header + 24, uncpsize); - WRITE_16(header + 28, fnsize); - WRITE_16(header + 30, extsize); - WRITE_16(header + 32, comsize); - WRITE_16(header + 34, 0); /* disk # */ - WRITE_16(header + 36, 0); /* int attrb */ - WRITE_32(header + 38, 0); /* ext attrb */ - WRITE_32(header + 42, currentOffset); - /* Header */ - if (fwrite(header, 1, 46, fpOutCD) == 46) { - offsetCD += 46; - - /* Filename */ - if (fnsize > 0) { - if (fwrite(filename, 1, fnsize, fpOutCD) == fnsize) { - offsetCD += fnsize; - } else { - err = Z_ERRNO; - break; - } - } else { - err = Z_STREAM_ERROR; - break; - } - - /* Extra field */ - if (extsize > 0) { - if (fwrite(extra, 1, extsize, fpOutCD) == extsize) { - offsetCD += extsize; - } else { - err = Z_ERRNO; - break; - } - } - - /* Comment field */ - if (comsize > 0) { - if ((int)fwrite(comment, 1, comsize, fpOutCD) == comsize) { - offsetCD += comsize; - } else { - err = Z_ERRNO; - break; - } - } - - - } else { - err = Z_ERRNO; - break; - } - } - - /* Success */ - entries++; - - } else { - break; - } - } - - /* Final central directory */ - { - int entriesZip = entries; - char header[22]; - char* comment = ""; // "ZIP File recovered by zlib/minizip/mztools"; - int comsize = (int) strlen(comment); - if (entriesZip > 0xffff) { - entriesZip = 0xffff; - } - WRITE_32(header, 0x06054b50); - WRITE_16(header + 4, 0); /* disk # */ - WRITE_16(header + 6, 0); /* disk # */ - WRITE_16(header + 8, entriesZip); /* hack */ - WRITE_16(header + 10, entriesZip); /* hack */ - WRITE_32(header + 12, offsetCD); /* size of CD */ - WRITE_32(header + 16, offset); /* offset to CD */ - WRITE_16(header + 20, comsize); /* comment */ - - /* Header */ - if (fwrite(header, 1, 22, fpOutCD) == 22) { - - /* Comment field */ - if (comsize > 0) { - if ((int)fwrite(comment, 1, comsize, fpOutCD) != comsize) { - err = Z_ERRNO; - } - } - - } else { - err = Z_ERRNO; - } - } - - /* Final merge (file + central directory) */ - fclose(fpOutCD); - if (err == Z_OK) { - fpOutCD = fopen(fileOutTmp, "rb"); - if (fpOutCD != NULL) { - int nRead; - char buffer[8192]; - while ( (nRead = (int)fread(buffer, 1, sizeof(buffer), fpOutCD)) > 0) { - if ((int)fwrite(buffer, 1, nRead, fpOut) != nRead) { - err = Z_ERRNO; - break; - } - } - fclose(fpOutCD); - } - } - - /* Close */ - fclose(fpZip); - fclose(fpOut); - - /* Wipe temporary file */ - (void)remove(fileOutTmp); - - /* Number of recovered entries */ - if (err == Z_OK) { - if (nRecovered != NULL) { - *nRecovered = entries; - } - if (bytesRecovered != NULL) { - *bytesRecovered = totalBytes; - } - } - } else { - err = Z_STREAM_ERROR; - } - return err; -} diff --git a/projects/mtg/minizip/mztools.h b/projects/mtg/minizip/mztools.h deleted file mode 100644 index 82d1597ad..000000000 --- a/projects/mtg/minizip/mztools.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - Additional tools for Minizip - Code: Xavier Roche '2004 - License: Same as ZLIB (www.gzip.org) -*/ - -#ifndef _zip_tools_H -#define _zip_tools_H - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef _ZLIB_H -#include "zlib.h" -#endif - -#include "unzip.h" - -/* Repair a ZIP file (missing central directory) - file: file to recover - fileOut: output file after recovery - fileOutTmp: temporary file name used for recovery -*/ -extern int ZEXPORT unzRepair(const char* file, - const char* fileOut, - const char* fileOutTmp, - uLong* nRecovered, - uLong* bytesRecovered); - -#endif diff --git a/projects/mtg/minizip/unzip.c b/projects/mtg/minizip/unzip.c deleted file mode 100644 index 3a7062980..000000000 --- a/projects/mtg/minizip/unzip.c +++ /dev/null @@ -1,1598 +0,0 @@ -/* unzip.c -- IO for uncompress .zip files using zlib - Version 1.01e, February 12th, 2005 - - Copyright (C) 1998-2005 Gilles Vollant - - Read unzip.h for more info -*/ - -/* Decryption code comes from crypt.c by Info-ZIP but has been greatly reduced in terms of -compatibility with older software. The following is from the original crypt.c. Code -woven in by Terry Thorsen 1/2003. -*/ -/* - Copyright (c) 1990-2000 Info-ZIP. All rights reserved. - - See the accompanying file LICENSE, version 2000-Apr-09 or later - (the contents of which are also included in zip.h) for terms of use. - If, for some reason, all these files are missing, the Info-ZIP license - also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html -*/ -/* - crypt.c (full version) by Info-ZIP. Last revised: [see crypt.h] - - The encryption/decryption parts of this source code (as opposed to the - non-echoing password parts) were originally written in Europe. The - whole source package can be freely distributed, including from the USA. - (Prior to January 2000, re-export from the US was a violation of US law.) - */ - -/* - This encryption code is a direct transcription of the algorithm from - Roger Schlafly, described by Phil Katz in the file appnote.txt. This - file (appnote.txt) is distributed with the PKZIP program (even in the - version without encryption capabilities). - */ - - -#include -#include -#include -#include "zlib.h" -#include "unzip.h" - -#ifdef STDC -# include -# include -# include -#endif -#ifdef NO_ERRNO_H - extern int errno; -#else -# include -#endif - - -#ifndef local -# define local static -#endif -/* compile with -Dlocal if your debugger can't find static symbols */ - - -#ifndef CASESENSITIVITYDEFAULT_NO -# if !defined(unix) && !defined(CASESENSITIVITYDEFAULT_YES) -# define CASESENSITIVITYDEFAULT_NO -# endif -#endif - - -#ifndef UNZ_BUFSIZE -#define UNZ_BUFSIZE (16384) -#endif - -#ifndef UNZ_MAXFILENAMEINZIP -#define UNZ_MAXFILENAMEINZIP (256) -#endif - -#ifndef ALLOC -# define ALLOC(size) (malloc(size)) -#endif -#ifndef TRYFREE -# define TRYFREE(p) {if (p) free(p);} -#endif - -#define SIZECENTRALDIRITEM (0x2e) -#define SIZEZIPLOCALHEADER (0x1e) - - - - -const char unz_copyright[] = - " unzip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll"; - -/* unz_file_info_interntal contain internal info about a file in zipfile*/ -typedef struct unz_file_info_internal_s -{ - uLong offset_curfile;/* relative offset of local header 4 bytes */ -} unz_file_info_internal; - - -/* file_in_zip_read_info_s contain internal information about a file in zipfile, - when reading and decompress it */ -typedef struct -{ - char *read_buffer; /* internal buffer for compressed data */ - z_stream stream; /* zLib stream structure for inflate */ - - uLong pos_in_zipfile; /* position in byte on the zipfile, for fseek*/ - uLong stream_initialised; /* flag set if stream structure is initialised*/ - - uLong offset_local_extrafield;/* offset of the local extra field */ - uInt size_local_extrafield;/* size of the local extra field */ - uLong pos_local_extrafield; /* position in the local extra field in read*/ - - uLong crc32; /* crc32 of all data uncompressed */ - uLong crc32_wait; /* crc32 we must obtain after decompress all */ - uLong rest_read_compressed; /* number of byte to be decompressed */ - uLong rest_read_uncompressed;/*number of byte to be obtained after decomp*/ - zlib_filefunc_def z_filefunc; - voidpf filestream; /* io structore of the zipfile */ - uLong compression_method; /* compression method (0==store) */ - uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ - int raw; -} file_in_zip_read_info_s; - - -/* unz_s contain internal information about the zipfile -*/ -typedef struct -{ - zlib_filefunc_def z_filefunc; - voidpf filestream; /* io structore of the zipfile */ - unz_global_info gi; /* public global information */ - uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ - uLong num_file; /* number of the current file in the zipfile*/ - uLong pos_in_central_dir; /* pos of the current file in the central dir*/ - uLong current_file_ok; /* flag about the usability of the current file*/ - uLong central_pos; /* position of the beginning of the central dir*/ - - uLong size_central_dir; /* size of the central directory */ - uLong offset_central_dir; /* offset of start of central directory with - respect to the starting disk number */ - - unz_file_info cur_file_info; /* public info about the current file in zip*/ - unz_file_info_internal cur_file_info_internal; /* private info about it*/ - file_in_zip_read_info_s* pfile_in_zip_read; /* structure about the current - file if we are decompressing it */ - int encrypted; -# ifndef NOUNCRYPT - unsigned long keys[3]; /* keys defining the pseudo-random sequence */ - const unsigned long* pcrc_32_tab; -# endif -} unz_s; - - -#ifndef NOUNCRYPT -#include "crypt.h" -#endif - -/* =========================================================================== - Read a byte from a gz_stream; update next_in and avail_in. Return EOF - for end of file. - IN assertion: the stream s has been sucessfully opened for reading. -*/ - - -local int unzlocal_getByte OF(( - const zlib_filefunc_def* pzlib_filefunc_def, - voidpf filestream, - int *pi)); - -local int unzlocal_getByte(pzlib_filefunc_def,filestream,pi) - const zlib_filefunc_def* pzlib_filefunc_def; - voidpf filestream; - int *pi; -{ - unsigned char c; - int err = (int)ZREAD(*pzlib_filefunc_def,filestream,&c,1); - if (err==1) - { - *pi = (int)c; - return UNZ_OK; - } - else - { - if (ZERROR(*pzlib_filefunc_def,filestream)) - return UNZ_ERRNO; - else - return UNZ_EOF; - } -} - - -/* =========================================================================== - Reads a long in LSB order from the given gz_stream. Sets -*/ -local int unzlocal_getShort OF(( - const zlib_filefunc_def* pzlib_filefunc_def, - voidpf filestream, - uLong *pX)); - -local int unzlocal_getShort (pzlib_filefunc_def,filestream,pX) - const zlib_filefunc_def* pzlib_filefunc_def; - voidpf filestream; - uLong *pX; -{ - uLong x ; - int i; - int err; - - err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); - x = (uLong)i; - - if (err==UNZ_OK) - err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); - x += ((uLong)i)<<8; - - if (err==UNZ_OK) - *pX = x; - else - *pX = 0; - return err; -} - -local int unzlocal_getLong OF(( - const zlib_filefunc_def* pzlib_filefunc_def, - voidpf filestream, - uLong *pX)); - -local int unzlocal_getLong (pzlib_filefunc_def,filestream,pX) - const zlib_filefunc_def* pzlib_filefunc_def; - voidpf filestream; - uLong *pX; -{ - uLong x ; - int i; - int err; - - err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); - x = (uLong)i; - - if (err==UNZ_OK) - err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); - x += ((uLong)i)<<8; - - if (err==UNZ_OK) - err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); - x += ((uLong)i)<<16; - - if (err==UNZ_OK) - err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); - x += ((uLong)i)<<24; - - if (err==UNZ_OK) - *pX = x; - else - *pX = 0; - return err; -} - - -/* My own strcmpi / strcasecmp */ -local int strcmpcasenosensitive_internal (fileName1,fileName2) - const char* fileName1; - const char* fileName2; -{ - for (;;) - { - char c1=*(fileName1++); - char c2=*(fileName2++); - if ((c1>='a') && (c1<='z')) - c1 -= 0x20; - if ((c2>='a') && (c2<='z')) - c2 -= 0x20; - if (c1=='\0') - return ((c2=='\0') ? 0 : -1); - if (c2=='\0') - return 1; - if (c1c2) - return 1; - } -} - - -#ifdef CASESENSITIVITYDEFAULT_NO -#define CASESENSITIVITYDEFAULTVALUE 2 -#else -#define CASESENSITIVITYDEFAULTVALUE 1 -#endif - -#ifndef STRCMPCASENOSENTIVEFUNCTION -#define STRCMPCASENOSENTIVEFUNCTION strcmpcasenosensitive_internal -#endif - -/* - Compare two filename (fileName1,fileName2). - If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) - If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi - or strcasecmp) - If iCaseSenisivity = 0, case sensitivity is defaut of your operating system - (like 1 on Unix, 2 on Windows) - -*/ -extern int ZEXPORT unzStringFileNameCompare (fileName1,fileName2,iCaseSensitivity) - const char* fileName1; - const char* fileName2; - int iCaseSensitivity; -{ - if (iCaseSensitivity==0) - iCaseSensitivity=CASESENSITIVITYDEFAULTVALUE; - - if (iCaseSensitivity==1) - return strcmp(fileName1,fileName2); - - return STRCMPCASENOSENTIVEFUNCTION(fileName1,fileName2); -} - -#ifndef BUFREADCOMMENT -#define BUFREADCOMMENT (0x400) -#endif - -/* - Locate the Central directory of a zipfile (at the end, just before - the global comment) -*/ -local uLong unzlocal_SearchCentralDir OF(( - const zlib_filefunc_def* pzlib_filefunc_def, - voidpf filestream)); - -local uLong unzlocal_SearchCentralDir(pzlib_filefunc_def,filestream) - const zlib_filefunc_def* pzlib_filefunc_def; - voidpf filestream; -{ - unsigned char* buf; - uLong uSizeFile; - uLong uBackRead; - uLong uMaxBack=0xffff; /* maximum size of global comment */ - uLong uPosFound=0; - - if (ZSEEK(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0) - return 0; - - - uSizeFile = ZTELL(*pzlib_filefunc_def,filestream); - - if (uMaxBack>uSizeFile) - uMaxBack = uSizeFile; - - buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); - if (buf==NULL) - return 0; - - uBackRead = 4; - while (uBackReaduMaxBack) - uBackRead = uMaxBack; - else - uBackRead+=BUFREADCOMMENT; - uReadPos = uSizeFile-uBackRead ; - - uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? - (BUFREADCOMMENT+4) : (uSizeFile-uReadPos); - if (ZSEEK(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0) - break; - - if (ZREAD(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize) - break; - - for (i=(int)uReadSize-3; (i--)>0;) - if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && - ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06)) - { - uPosFound = uReadPos+i; - break; - } - - if (uPosFound!=0) - break; - } - TRYFREE(buf); - return uPosFound; -} - -/* - Open a Zip file. path contain the full pathname (by example, - on a Windows NT computer "c:\\test\\zlib114.zip" or on an Unix computer - "zlib/zlib114.zip". - If the zipfile cannot be opened (file doesn't exist or in not valid), the - return value is NULL. - Else, the return value is a unzFile Handle, usable with other function - of this unzip package. -*/ -extern unzFile ZEXPORT unzOpen2 (path, pzlib_filefunc_def) - const char *path; - zlib_filefunc_def* pzlib_filefunc_def; -{ - unz_s us; - unz_s *s; - uLong central_pos,uL; - - uLong number_disk; /* number of the current dist, used for - spaning ZIP, unsupported, always 0*/ - uLong number_disk_with_CD; /* number the the disk with central dir, used - for spaning ZIP, unsupported, always 0*/ - uLong number_entry_CD; /* total number of entries in - the central dir - (same than number_entry on nospan) */ - - int err=UNZ_OK; - - if (unz_copyright[0]!=' ') - return NULL; - - if (pzlib_filefunc_def==NULL) - fill_fopen_filefunc(&us.z_filefunc); - else - us.z_filefunc = *pzlib_filefunc_def; - - us.filestream= (*(us.z_filefunc.zopen_file))(us.z_filefunc.opaque, - path, - ZLIB_FILEFUNC_MODE_READ | - ZLIB_FILEFUNC_MODE_EXISTING); - if (us.filestream==NULL) - return NULL; - - central_pos = unzlocal_SearchCentralDir(&us.z_filefunc,us.filestream); - if (central_pos==0) - err=UNZ_ERRNO; - - if (ZSEEK(us.z_filefunc, us.filestream, - central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0) - err=UNZ_ERRNO; - - /* the signature, already checked */ - if (unzlocal_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) - err=UNZ_ERRNO; - - /* number of this disk */ - if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_disk)!=UNZ_OK) - err=UNZ_ERRNO; - - /* number of the disk with the start of the central directory */ - if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_disk_with_CD)!=UNZ_OK) - err=UNZ_ERRNO; - - /* total number of entries in the central dir on this disk */ - if (unzlocal_getShort(&us.z_filefunc, us.filestream,&us.gi.number_entry)!=UNZ_OK) - err=UNZ_ERRNO; - - /* total number of entries in the central dir */ - if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_entry_CD)!=UNZ_OK) - err=UNZ_ERRNO; - - if ((number_entry_CD!=us.gi.number_entry) || - (number_disk_with_CD!=0) || - (number_disk!=0)) - err=UNZ_BADZIPFILE; - - /* size of the central directory */ - if (unzlocal_getLong(&us.z_filefunc, us.filestream,&us.size_central_dir)!=UNZ_OK) - err=UNZ_ERRNO; - - /* offset of start of central directory with respect to the - starting disk number */ - if (unzlocal_getLong(&us.z_filefunc, us.filestream,&us.offset_central_dir)!=UNZ_OK) - err=UNZ_ERRNO; - - /* zipfile comment length */ - if (unzlocal_getShort(&us.z_filefunc, us.filestream,&us.gi.size_comment)!=UNZ_OK) - err=UNZ_ERRNO; - - if ((central_pospfile_in_zip_read!=NULL) - unzCloseCurrentFile(file); - - ZCLOSE(s->z_filefunc, s->filestream); - TRYFREE(s); - return UNZ_OK; -} - - -/* - Write info about the ZipFile in the *pglobal_info structure. - No preparation of the structure is needed - return UNZ_OK if there is no problem. */ -extern int ZEXPORT unzGetGlobalInfo (file,pglobal_info) - unzFile file; - unz_global_info *pglobal_info; -{ - unz_s* s; - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - *pglobal_info=s->gi; - return UNZ_OK; -} - - -/* - Translate date/time from Dos format to tm_unz (readable more easilty) -*/ -local void unzlocal_DosDateToTmuDate (ulDosDate, ptm) - uLong ulDosDate; - tm_unz* ptm; -{ - uLong uDate; - uDate = (uLong)(ulDosDate>>16); - ptm->tm_mday = (uInt)(uDate&0x1f) ; - ptm->tm_mon = (uInt)((((uDate)&0x1E0)/0x20)-1) ; - ptm->tm_year = (uInt)(((uDate&0x0FE00)/0x0200)+1980) ; - - ptm->tm_hour = (uInt) ((ulDosDate &0xF800)/0x800); - ptm->tm_min = (uInt) ((ulDosDate&0x7E0)/0x20) ; - ptm->tm_sec = (uInt) (2*(ulDosDate&0x1f)) ; -} - -/* - Get Info about the current file in the zipfile, with internal only info -*/ -local int unzlocal_GetCurrentFileInfoInternal OF((unzFile file, - unz_file_info *pfile_info, - unz_file_info_internal - *pfile_info_internal, - char *szFileName, - uLong fileNameBufferSize, - void *extraField, - uLong extraFieldBufferSize, - char *szComment, - uLong commentBufferSize)); - -local int unzlocal_GetCurrentFileInfoInternal (file, - pfile_info, - pfile_info_internal, - szFileName, fileNameBufferSize, - extraField, extraFieldBufferSize, - szComment, commentBufferSize) - unzFile file; - unz_file_info *pfile_info; - unz_file_info_internal *pfile_info_internal; - char *szFileName; - uLong fileNameBufferSize; - void *extraField; - uLong extraFieldBufferSize; - char *szComment; - uLong commentBufferSize; -{ - unz_s* s; - unz_file_info file_info; - unz_file_info_internal file_info_internal; - int err=UNZ_OK; - uLong uMagic; - long lSeek=0; - - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - if (ZSEEK(s->z_filefunc, s->filestream, - s->pos_in_central_dir+s->byte_before_the_zipfile, - ZLIB_FILEFUNC_SEEK_SET)!=0) - err=UNZ_ERRNO; - - - /* we check the magic */ - if (err==UNZ_OK) - if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK) - err=UNZ_ERRNO; - else if (uMagic!=0x02014b50) - err=UNZ_BADZIPFILE; - - if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.version) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.version_needed) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.flag) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.compression_method) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.dosDate) != UNZ_OK) - err=UNZ_ERRNO; - - unzlocal_DosDateToTmuDate(file_info.dosDate,&file_info.tmu_date); - - if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.crc) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.compressed_size) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.uncompressed_size) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_filename) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_extra) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_comment) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.disk_num_start) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.internal_fa) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.external_fa) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info_internal.offset_curfile) != UNZ_OK) - err=UNZ_ERRNO; - - lSeek+=file_info.size_filename; - if ((err==UNZ_OK) && (szFileName!=NULL)) - { - uLong uSizeRead ; - if (file_info.size_filename0) && (fileNameBufferSize>0)) - if (ZREAD(s->z_filefunc, s->filestream,szFileName,uSizeRead)!=uSizeRead) - err=UNZ_ERRNO; - lSeek -= uSizeRead; - } - - - if ((err==UNZ_OK) && (extraField!=NULL)) - { - uLong uSizeRead ; - if (file_info.size_file_extraz_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) - lSeek=0; - else - err=UNZ_ERRNO; - if ((file_info.size_file_extra>0) && (extraFieldBufferSize>0)) - if (ZREAD(s->z_filefunc, s->filestream,extraField,uSizeRead)!=uSizeRead) - err=UNZ_ERRNO; - lSeek += file_info.size_file_extra - uSizeRead; - } - else - lSeek+=file_info.size_file_extra; - - - if ((err==UNZ_OK) && (szComment!=NULL)) - { - uLong uSizeRead ; - if (file_info.size_file_commentz_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) - lSeek=0; - else - err=UNZ_ERRNO; - if ((file_info.size_file_comment>0) && (commentBufferSize>0)) - if (ZREAD(s->z_filefunc, s->filestream,szComment,uSizeRead)!=uSizeRead) - err=UNZ_ERRNO; - lSeek+=file_info.size_file_comment - uSizeRead; - } - else - lSeek+=file_info.size_file_comment; - - if ((err==UNZ_OK) && (pfile_info!=NULL)) - *pfile_info=file_info; - - if ((err==UNZ_OK) && (pfile_info_internal!=NULL)) - *pfile_info_internal=file_info_internal; - - return err; -} - - - -/* - Write info about the ZipFile in the *pglobal_info structure. - No preparation of the structure is needed - return UNZ_OK if there is no problem. -*/ -extern int ZEXPORT unzGetCurrentFileInfo (file, - pfile_info, - szFileName, fileNameBufferSize, - extraField, extraFieldBufferSize, - szComment, commentBufferSize) - unzFile file; - unz_file_info *pfile_info; - char *szFileName; - uLong fileNameBufferSize; - void *extraField; - uLong extraFieldBufferSize; - char *szComment; - uLong commentBufferSize; -{ - return unzlocal_GetCurrentFileInfoInternal(file,pfile_info,NULL, - szFileName,fileNameBufferSize, - extraField,extraFieldBufferSize, - szComment,commentBufferSize); -} - -/* - Set the current file of the zipfile to the first file. - return UNZ_OK if there is no problem -*/ -extern int ZEXPORT unzGoToFirstFile (file) - unzFile file; -{ - int err=UNZ_OK; - unz_s* s; - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - s->pos_in_central_dir=s->offset_central_dir; - s->num_file=0; - err=unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, - &s->cur_file_info_internal, - NULL,0,NULL,0,NULL,0); - s->current_file_ok = (err == UNZ_OK); - return err; -} - -/* - Set the current file of the zipfile to the next file. - return UNZ_OK if there is no problem - return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. -*/ -extern int ZEXPORT unzGoToNextFile (file) - unzFile file; -{ - unz_s* s; - int err; - - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - if (!s->current_file_ok) - return UNZ_END_OF_LIST_OF_FILE; - if (s->gi.number_entry != 0xffff) /* 2^16 files overflow hack */ - if (s->num_file+1==s->gi.number_entry) - return UNZ_END_OF_LIST_OF_FILE; - - s->pos_in_central_dir += SIZECENTRALDIRITEM + s->cur_file_info.size_filename + - s->cur_file_info.size_file_extra + s->cur_file_info.size_file_comment ; - s->num_file++; - err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, - &s->cur_file_info_internal, - NULL,0,NULL,0,NULL,0); - s->current_file_ok = (err == UNZ_OK); - return err; -} - - -/* - Try locate the file szFileName in the zipfile. - For the iCaseSensitivity signification, see unzipStringFileNameCompare - - return value : - UNZ_OK if the file is found. It becomes the current file. - UNZ_END_OF_LIST_OF_FILE if the file is not found -*/ -extern int ZEXPORT unzLocateFile (file, szFileName, iCaseSensitivity) - unzFile file; - const char *szFileName; - int iCaseSensitivity; -{ - unz_s* s; - int err; - - /* We remember the 'current' position in the file so that we can jump - * back there if we fail. - */ - unz_file_info cur_file_infoSaved; - unz_file_info_internal cur_file_info_internalSaved; - uLong num_fileSaved; - uLong pos_in_central_dirSaved; - - - if (file==NULL) - return UNZ_PARAMERROR; - - if (strlen(szFileName)>=UNZ_MAXFILENAMEINZIP) - return UNZ_PARAMERROR; - - s=(unz_s*)file; - if (!s->current_file_ok) - return UNZ_END_OF_LIST_OF_FILE; - - /* Save the current state */ - num_fileSaved = s->num_file; - pos_in_central_dirSaved = s->pos_in_central_dir; - cur_file_infoSaved = s->cur_file_info; - cur_file_info_internalSaved = s->cur_file_info_internal; - - err = unzGoToFirstFile(file); - - while (err == UNZ_OK) - { - char szCurrentFileName[UNZ_MAXFILENAMEINZIP+1]; - err = unzGetCurrentFileInfo(file,NULL, - szCurrentFileName,sizeof(szCurrentFileName)-1, - NULL,0,NULL,0); - if (err == UNZ_OK) - { - if (unzStringFileNameCompare(szCurrentFileName, - szFileName,iCaseSensitivity)==0) - return UNZ_OK; - err = unzGoToNextFile(file); - } - } - - /* We failed, so restore the state of the 'current file' to where we - * were. - */ - s->num_file = num_fileSaved ; - s->pos_in_central_dir = pos_in_central_dirSaved ; - s->cur_file_info = cur_file_infoSaved; - s->cur_file_info_internal = cur_file_info_internalSaved; - return err; -} - - -/* -/////////////////////////////////////////// -// Contributed by Ryan Haksi (mailto://cryogen@infoserve.net) -// I need random access -// -// Further optimization could be realized by adding an ability -// to cache the directory in memory. The goal being a single -// comprehensive file read to put the file I need in a memory. -*/ - -/* -typedef struct unz_file_pos_s -{ - uLong pos_in_zip_directory; // offset in file - uLong num_of_file; // # of file -} unz_file_pos; -*/ - -extern int ZEXPORT unzGetFilePos(file, file_pos) - unzFile file; - unz_file_pos* file_pos; -{ - unz_s* s; - - if (file==NULL || file_pos==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - if (!s->current_file_ok) - return UNZ_END_OF_LIST_OF_FILE; - - file_pos->pos_in_zip_directory = s->pos_in_central_dir; - file_pos->num_of_file = s->num_file; - - return UNZ_OK; -} - -extern int ZEXPORT unzGoToFilePos(file, file_pos) - unzFile file; - unz_file_pos* file_pos; -{ - unz_s* s; - int err; - - if (file==NULL || file_pos==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - - /* jump to the right spot */ - s->pos_in_central_dir = file_pos->pos_in_zip_directory; - s->num_file = file_pos->num_of_file; - - /* set the current file */ - err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, - &s->cur_file_info_internal, - NULL,0,NULL,0,NULL,0); - /* return results */ - s->current_file_ok = (err == UNZ_OK); - return err; -} - -/* -// Unzip Helper Functions - should be here? -/////////////////////////////////////////// -*/ - -/* - Read the local header of the current zipfile - Check the coherency of the local header and info in the end of central - directory about this file - store in *piSizeVar the size of extra info in local header - (filename and size of extra field data) -*/ -local int unzlocal_CheckCurrentFileCoherencyHeader (s,piSizeVar, - poffset_local_extrafield, - psize_local_extrafield) - unz_s* s; - uInt* piSizeVar; - uLong *poffset_local_extrafield; - uInt *psize_local_extrafield; -{ - uLong uMagic,uData,uFlags; - uLong size_filename; - uLong size_extra_field; - int err=UNZ_OK; - - *piSizeVar = 0; - *poffset_local_extrafield = 0; - *psize_local_extrafield = 0; - - if (ZSEEK(s->z_filefunc, s->filestream,s->cur_file_info_internal.offset_curfile + - s->byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET)!=0) - return UNZ_ERRNO; - - - if (err==UNZ_OK) - if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK) - err=UNZ_ERRNO; - else if (uMagic!=0x04034b50) - err=UNZ_BADZIPFILE; - - if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) - err=UNZ_ERRNO; -/* - else if ((err==UNZ_OK) && (uData!=s->cur_file_info.wVersion)) - err=UNZ_BADZIPFILE; -*/ - if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uFlags) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) - err=UNZ_ERRNO; - else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compression_method)) - err=UNZ_BADZIPFILE; - - if ((err==UNZ_OK) && (s->cur_file_info.compression_method!=0) && - (s->cur_file_info.compression_method!=Z_DEFLATED)) - err=UNZ_BADZIPFILE; - - if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* date/time */ - err=UNZ_ERRNO; - - if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* crc */ - err=UNZ_ERRNO; - else if ((err==UNZ_OK) && (uData!=s->cur_file_info.crc) && - ((uFlags & 8)==0)) - err=UNZ_BADZIPFILE; - - if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size compr */ - err=UNZ_ERRNO; - else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compressed_size) && - ((uFlags & 8)==0)) - err=UNZ_BADZIPFILE; - - if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size uncompr */ - err=UNZ_ERRNO; - else if ((err==UNZ_OK) && (uData!=s->cur_file_info.uncompressed_size) && - ((uFlags & 8)==0)) - err=UNZ_BADZIPFILE; - - - if (unzlocal_getShort(&s->z_filefunc, s->filestream,&size_filename) != UNZ_OK) - err=UNZ_ERRNO; - else if ((err==UNZ_OK) && (size_filename!=s->cur_file_info.size_filename)) - err=UNZ_BADZIPFILE; - - *piSizeVar += (uInt)size_filename; - - if (unzlocal_getShort(&s->z_filefunc, s->filestream,&size_extra_field) != UNZ_OK) - err=UNZ_ERRNO; - *poffset_local_extrafield= s->cur_file_info_internal.offset_curfile + - SIZEZIPLOCALHEADER + size_filename; - *psize_local_extrafield = (uInt)size_extra_field; - - *piSizeVar += (uInt)size_extra_field; - - return err; -} - -/* - Open for reading data the current file in the zipfile. - If there is no error and the file is opened, the return value is UNZ_OK. -*/ -extern int ZEXPORT unzOpenCurrentFile3 (file, method, level, raw, password) - unzFile file; - int* method; - int* level; - int raw; - const char* password; -{ - int err=UNZ_OK; - uInt iSizeVar; - unz_s* s; - file_in_zip_read_info_s* pfile_in_zip_read_info; - uLong offset_local_extrafield; /* offset of the local extra field */ - uInt size_local_extrafield; /* size of the local extra field */ -# ifndef NOUNCRYPT - char source[12]; -# else - if (password != NULL) - return UNZ_PARAMERROR; -# endif - - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - if (!s->current_file_ok) - return UNZ_PARAMERROR; - - if (s->pfile_in_zip_read != NULL) - unzCloseCurrentFile(file); - - if (unzlocal_CheckCurrentFileCoherencyHeader(s,&iSizeVar, - &offset_local_extrafield,&size_local_extrafield)!=UNZ_OK) - return UNZ_BADZIPFILE; - - pfile_in_zip_read_info = (file_in_zip_read_info_s*) - ALLOC(sizeof(file_in_zip_read_info_s)); - if (pfile_in_zip_read_info==NULL) - return UNZ_INTERNALERROR; - - pfile_in_zip_read_info->read_buffer=(char*)ALLOC(UNZ_BUFSIZE); - pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield; - pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield; - pfile_in_zip_read_info->pos_local_extrafield=0; - pfile_in_zip_read_info->raw=raw; - - if (pfile_in_zip_read_info->read_buffer==NULL) - { - TRYFREE(pfile_in_zip_read_info); - return UNZ_INTERNALERROR; - } - - pfile_in_zip_read_info->stream_initialised=0; - - if (method!=NULL) - *method = (int)s->cur_file_info.compression_method; - - if (level!=NULL) - { - *level = 6; - switch (s->cur_file_info.flag & 0x06) - { - case 6 : *level = 1; break; - case 4 : *level = 2; break; - case 2 : *level = 9; break; - } - } - - if ((s->cur_file_info.compression_method!=0) && - (s->cur_file_info.compression_method!=Z_DEFLATED)) - err=UNZ_BADZIPFILE; - - pfile_in_zip_read_info->crc32_wait=s->cur_file_info.crc; - pfile_in_zip_read_info->crc32=0; - pfile_in_zip_read_info->compression_method = - s->cur_file_info.compression_method; - pfile_in_zip_read_info->filestream=s->filestream; - pfile_in_zip_read_info->z_filefunc=s->z_filefunc; - pfile_in_zip_read_info->byte_before_the_zipfile=s->byte_before_the_zipfile; - - pfile_in_zip_read_info->stream.total_out = 0; - - if ((s->cur_file_info.compression_method==Z_DEFLATED) && - (!raw)) - { - pfile_in_zip_read_info->stream.zalloc = (alloc_func)0; - pfile_in_zip_read_info->stream.zfree = (free_func)0; - pfile_in_zip_read_info->stream.opaque = (voidpf)0; - pfile_in_zip_read_info->stream.next_in = (voidpf)0; - pfile_in_zip_read_info->stream.avail_in = 0; - - err=inflateInit2(&pfile_in_zip_read_info->stream, -MAX_WBITS); - if (err == Z_OK) - pfile_in_zip_read_info->stream_initialised=1; - else - { - TRYFREE(pfile_in_zip_read_info); - return err; - } - /* windowBits is passed < 0 to tell that there is no zlib header. - * Note that in this case inflate *requires* an extra "dummy" byte - * after the compressed stream in order to complete decompression and - * return Z_STREAM_END. - * In unzip, i don't wait absolutely Z_STREAM_END because I known the - * size of both compressed and uncompressed data - */ - } - pfile_in_zip_read_info->rest_read_compressed = - s->cur_file_info.compressed_size ; - pfile_in_zip_read_info->rest_read_uncompressed = - s->cur_file_info.uncompressed_size ; - - - pfile_in_zip_read_info->pos_in_zipfile = - s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER + - iSizeVar; - - pfile_in_zip_read_info->stream.avail_in = (uInt)0; - - s->pfile_in_zip_read = pfile_in_zip_read_info; - -# ifndef NOUNCRYPT - if (password != NULL) - { - int i; - s->pcrc_32_tab = get_crc_table(); - init_keys(password,s->keys,s->pcrc_32_tab); - if (ZSEEK(s->z_filefunc, s->filestream, - s->pfile_in_zip_read->pos_in_zipfile + - s->pfile_in_zip_read->byte_before_the_zipfile, - SEEK_SET)!=0) - return UNZ_INTERNALERROR; - if(ZREAD(s->z_filefunc, s->filestream,source, 12)<12) - return UNZ_INTERNALERROR; - - for (i = 0; i<12; i++) - zdecode(s->keys,s->pcrc_32_tab,source[i]); - - s->pfile_in_zip_read->pos_in_zipfile+=12; - s->encrypted=1; - } -# endif - - - return UNZ_OK; -} - -extern int ZEXPORT unzOpenCurrentFile (file) - unzFile file; -{ - return unzOpenCurrentFile3(file, NULL, NULL, 0, NULL); -} - -extern int ZEXPORT unzOpenCurrentFilePassword (file, password) - unzFile file; - const char* password; -{ - return unzOpenCurrentFile3(file, NULL, NULL, 0, password); -} - -extern int ZEXPORT unzOpenCurrentFile2 (file,method,level,raw) - unzFile file; - int* method; - int* level; - int raw; -{ - return unzOpenCurrentFile3(file, method, level, raw, NULL); -} - -/* - Read bytes from the current file. - buf contain buffer where data must be copied - len the size of buf. - - return the number of byte copied if somes bytes are copied - return 0 if the end of file was reached - return <0 with error code if there is an error - (UNZ_ERRNO for IO error, or zLib error for uncompress error) -*/ -extern int ZEXPORT unzReadCurrentFile (file, buf, len) - unzFile file; - voidp buf; - unsigned len; -{ - int err=UNZ_OK; - uInt iRead = 0; - unz_s* s; - file_in_zip_read_info_s* pfile_in_zip_read_info; - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - pfile_in_zip_read_info=s->pfile_in_zip_read; - - if (pfile_in_zip_read_info==NULL) - return UNZ_PARAMERROR; - - - if ((pfile_in_zip_read_info->read_buffer == NULL)) - return UNZ_END_OF_LIST_OF_FILE; - if (len==0) - return 0; - - pfile_in_zip_read_info->stream.next_out = (Bytef*)buf; - - pfile_in_zip_read_info->stream.avail_out = (uInt)len; - - if ((len>pfile_in_zip_read_info->rest_read_uncompressed) && - (!(pfile_in_zip_read_info->raw))) - pfile_in_zip_read_info->stream.avail_out = - (uInt)pfile_in_zip_read_info->rest_read_uncompressed; - - if ((len>pfile_in_zip_read_info->rest_read_compressed+ - pfile_in_zip_read_info->stream.avail_in) && - (pfile_in_zip_read_info->raw)) - pfile_in_zip_read_info->stream.avail_out = - (uInt)pfile_in_zip_read_info->rest_read_compressed+ - pfile_in_zip_read_info->stream.avail_in; - - while (pfile_in_zip_read_info->stream.avail_out>0) - { - if ((pfile_in_zip_read_info->stream.avail_in==0) && - (pfile_in_zip_read_info->rest_read_compressed>0)) - { - uInt uReadThis = UNZ_BUFSIZE; - if (pfile_in_zip_read_info->rest_read_compressedrest_read_compressed; - if (uReadThis == 0) - return UNZ_EOF; - if (ZSEEK(pfile_in_zip_read_info->z_filefunc, - pfile_in_zip_read_info->filestream, - pfile_in_zip_read_info->pos_in_zipfile + - pfile_in_zip_read_info->byte_before_the_zipfile, - ZLIB_FILEFUNC_SEEK_SET)!=0) - return UNZ_ERRNO; - if (ZREAD(pfile_in_zip_read_info->z_filefunc, - pfile_in_zip_read_info->filestream, - pfile_in_zip_read_info->read_buffer, - uReadThis)!=uReadThis) - return UNZ_ERRNO; - - -# ifndef NOUNCRYPT - if(s->encrypted) - { - uInt i; - for(i=0;iread_buffer[i] = - zdecode(s->keys,s->pcrc_32_tab, - pfile_in_zip_read_info->read_buffer[i]); - } -# endif - - - pfile_in_zip_read_info->pos_in_zipfile += uReadThis; - - pfile_in_zip_read_info->rest_read_compressed-=uReadThis; - - pfile_in_zip_read_info->stream.next_in = - (Bytef*)pfile_in_zip_read_info->read_buffer; - pfile_in_zip_read_info->stream.avail_in = (uInt)uReadThis; - } - - if ((pfile_in_zip_read_info->compression_method==0) || (pfile_in_zip_read_info->raw)) - { - uInt uDoCopy,i ; - - if ((pfile_in_zip_read_info->stream.avail_in == 0) && - (pfile_in_zip_read_info->rest_read_compressed == 0)) - return (iRead==0) ? UNZ_EOF : iRead; - - if (pfile_in_zip_read_info->stream.avail_out < - pfile_in_zip_read_info->stream.avail_in) - uDoCopy = pfile_in_zip_read_info->stream.avail_out ; - else - uDoCopy = pfile_in_zip_read_info->stream.avail_in ; - - for (i=0;istream.next_out+i) = - *(pfile_in_zip_read_info->stream.next_in+i); - - pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32, - pfile_in_zip_read_info->stream.next_out, - uDoCopy); - pfile_in_zip_read_info->rest_read_uncompressed-=uDoCopy; - pfile_in_zip_read_info->stream.avail_in -= uDoCopy; - pfile_in_zip_read_info->stream.avail_out -= uDoCopy; - pfile_in_zip_read_info->stream.next_out += uDoCopy; - pfile_in_zip_read_info->stream.next_in += uDoCopy; - pfile_in_zip_read_info->stream.total_out += uDoCopy; - iRead += uDoCopy; - } - else - { - uLong uTotalOutBefore,uTotalOutAfter; - const Bytef *bufBefore; - uLong uOutThis; - int flush=Z_SYNC_FLUSH; - - uTotalOutBefore = pfile_in_zip_read_info->stream.total_out; - bufBefore = pfile_in_zip_read_info->stream.next_out; - - /* - if ((pfile_in_zip_read_info->rest_read_uncompressed == - pfile_in_zip_read_info->stream.avail_out) && - (pfile_in_zip_read_info->rest_read_compressed == 0)) - flush = Z_FINISH; - */ - err=inflate(&pfile_in_zip_read_info->stream,flush); - - if ((err>=0) && (pfile_in_zip_read_info->stream.msg!=NULL)) - err = Z_DATA_ERROR; - - uTotalOutAfter = pfile_in_zip_read_info->stream.total_out; - uOutThis = uTotalOutAfter-uTotalOutBefore; - - pfile_in_zip_read_info->crc32 = - crc32(pfile_in_zip_read_info->crc32,bufBefore, - (uInt)(uOutThis)); - - pfile_in_zip_read_info->rest_read_uncompressed -= - uOutThis; - - iRead += (uInt)(uTotalOutAfter - uTotalOutBefore); - - if (err==Z_STREAM_END) - return (iRead==0) ? UNZ_EOF : iRead; - if (err!=Z_OK) - break; - } - } - - if (err==Z_OK) - return iRead; - return err; -} - - -/* - Give the current position in uncompressed data -*/ -extern z_off_t ZEXPORT unztell (file) - unzFile file; -{ - unz_s* s; - file_in_zip_read_info_s* pfile_in_zip_read_info; - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - pfile_in_zip_read_info=s->pfile_in_zip_read; - - if (pfile_in_zip_read_info==NULL) - return UNZ_PARAMERROR; - - return (z_off_t)pfile_in_zip_read_info->stream.total_out; -} - - -/* - return 1 if the end of file was reached, 0 elsewhere -*/ -extern int ZEXPORT unzeof (file) - unzFile file; -{ - unz_s* s; - file_in_zip_read_info_s* pfile_in_zip_read_info; - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - pfile_in_zip_read_info=s->pfile_in_zip_read; - - if (pfile_in_zip_read_info==NULL) - return UNZ_PARAMERROR; - - if (pfile_in_zip_read_info->rest_read_uncompressed == 0) - return 1; - else - return 0; -} - - - -/* - Read extra field from the current file (opened by unzOpenCurrentFile) - This is the local-header version of the extra field (sometimes, there is - more info in the local-header version than in the central-header) - - if buf==NULL, it return the size of the local extra field that can be read - - if buf!=NULL, len is the size of the buffer, the extra header is copied in - buf. - the return value is the number of bytes copied in buf, or (if <0) - the error code -*/ -extern int ZEXPORT unzGetLocalExtrafield (file,buf,len) - unzFile file; - voidp buf; - unsigned len; -{ - unz_s* s; - file_in_zip_read_info_s* pfile_in_zip_read_info; - uInt read_now; - uLong size_to_read; - - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - pfile_in_zip_read_info=s->pfile_in_zip_read; - - if (pfile_in_zip_read_info==NULL) - return UNZ_PARAMERROR; - - size_to_read = (pfile_in_zip_read_info->size_local_extrafield - - pfile_in_zip_read_info->pos_local_extrafield); - - if (buf==NULL) - return (int)size_to_read; - - if (len>size_to_read) - read_now = (uInt)size_to_read; - else - read_now = (uInt)len ; - - if (read_now==0) - return 0; - - if (ZSEEK(pfile_in_zip_read_info->z_filefunc, - pfile_in_zip_read_info->filestream, - pfile_in_zip_read_info->offset_local_extrafield + - pfile_in_zip_read_info->pos_local_extrafield, - ZLIB_FILEFUNC_SEEK_SET)!=0) - return UNZ_ERRNO; - - if (ZREAD(pfile_in_zip_read_info->z_filefunc, - pfile_in_zip_read_info->filestream, - buf,read_now)!=read_now) - return UNZ_ERRNO; - - return (int)read_now; -} - -/* - Close the file in zip opened with unzipOpenCurrentFile - Return UNZ_CRCERROR if all the file was read but the CRC is not good -*/ -extern int ZEXPORT unzCloseCurrentFile (file) - unzFile file; -{ - int err=UNZ_OK; - - unz_s* s; - file_in_zip_read_info_s* pfile_in_zip_read_info; - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - pfile_in_zip_read_info=s->pfile_in_zip_read; - - if (pfile_in_zip_read_info==NULL) - return UNZ_PARAMERROR; - - - if ((pfile_in_zip_read_info->rest_read_uncompressed == 0) && - (!pfile_in_zip_read_info->raw)) - { - if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait) - err=UNZ_CRCERROR; - } - - - TRYFREE(pfile_in_zip_read_info->read_buffer); - pfile_in_zip_read_info->read_buffer = NULL; - if (pfile_in_zip_read_info->stream_initialised) - inflateEnd(&pfile_in_zip_read_info->stream); - - pfile_in_zip_read_info->stream_initialised = 0; - TRYFREE(pfile_in_zip_read_info); - - s->pfile_in_zip_read=NULL; - - return err; -} - - -/* - Get the global comment string of the ZipFile, in the szComment buffer. - uSizeBuf is the size of the szComment buffer. - return the number of byte copied or an error code <0 -*/ -extern int ZEXPORT unzGetGlobalComment (file, szComment, uSizeBuf) - unzFile file; - char *szComment; - uLong uSizeBuf; -{ - int err=UNZ_OK; - unz_s* s; - uLong uReadThis ; - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - - uReadThis = uSizeBuf; - if (uReadThis>s->gi.size_comment) - uReadThis = s->gi.size_comment; - - if (ZSEEK(s->z_filefunc,s->filestream,s->central_pos+22,ZLIB_FILEFUNC_SEEK_SET)!=0) - return UNZ_ERRNO; - - if (uReadThis>0) - { - *szComment='\0'; - if (ZREAD(s->z_filefunc,s->filestream,szComment,uReadThis)!=uReadThis) - return UNZ_ERRNO; - } - - if ((szComment != NULL) && (uSizeBuf > s->gi.size_comment)) - *(szComment+s->gi.size_comment)='\0'; - return (int)uReadThis; -} - -/* Additions by RX '2004 */ -extern uLong ZEXPORT unzGetOffset (file) - unzFile file; -{ - unz_s* s; - - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - if (!s->current_file_ok) - return 0; - if (s->gi.number_entry != 0 && s->gi.number_entry != 0xffff) - if (s->num_file==s->gi.number_entry) - return 0; - return s->pos_in_central_dir; -} - -extern int ZEXPORT unzSetOffset (file, pos) - unzFile file; - uLong pos; -{ - unz_s* s; - int err; - - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - - s->pos_in_central_dir = pos; - s->num_file = s->gi.number_entry; /* hack */ - err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, - &s->cur_file_info_internal, - NULL,0,NULL,0,NULL,0); - s->current_file_ok = (err == UNZ_OK); - return err; -} diff --git a/projects/mtg/minizip/unzip.h b/projects/mtg/minizip/unzip.h deleted file mode 100644 index c3206a058..000000000 --- a/projects/mtg/minizip/unzip.h +++ /dev/null @@ -1,354 +0,0 @@ -/* unzip.h -- IO for uncompress .zip files using zlib - Version 1.01e, February 12th, 2005 - - Copyright (C) 1998-2005 Gilles Vollant - - This unzip package allow extract file from .ZIP file, compatible with PKZip 2.04g - WinZip, InfoZip tools and compatible. - - Multi volume ZipFile (span) are not supported. - Encryption compatible with pkzip 2.04g only supported - Old compressions used by old PKZip 1.x are not supported - - - I WAIT FEEDBACK at mail info@winimage.com - Visit also http://www.winimage.com/zLibDll/unzip.htm for evolution - - Condition of use and distribution are the same than zlib : - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. - - -*/ - -/* for more info about .ZIP format, see - http://www.info-zip.org/pub/infozip/doc/appnote-981119-iz.zip - http://www.info-zip.org/pub/infozip/doc/ - PkWare has also a specification at : - ftp://ftp.pkware.com/probdesc.zip -*/ - -#ifndef _unz_H -#define _unz_H - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef _ZLIB_H -#include "zlib.h" -#endif - -#ifndef _ZLIBIOAPI_H -#include "ioapi.h" -#endif - -#if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP) -/* like the STRICT of WIN32, we define a pointer that cannot be converted - from (void*) without cast */ -typedef struct TagunzFile__ { int unused; } unzFile__; -typedef unzFile__ *unzFile; -#else -typedef voidp unzFile; -#endif - - -#define UNZ_OK (0) -#define UNZ_END_OF_LIST_OF_FILE (-100) -#define UNZ_ERRNO (Z_ERRNO) -#define UNZ_EOF (0) -#define UNZ_PARAMERROR (-102) -#define UNZ_BADZIPFILE (-103) -#define UNZ_INTERNALERROR (-104) -#define UNZ_CRCERROR (-105) - -/* tm_unz contain date/time info */ -typedef struct tm_unz_s -{ - uInt tm_sec; /* seconds after the minute - [0,59] */ - uInt tm_min; /* minutes after the hour - [0,59] */ - uInt tm_hour; /* hours since midnight - [0,23] */ - uInt tm_mday; /* day of the month - [1,31] */ - uInt tm_mon; /* months since January - [0,11] */ - uInt tm_year; /* years - [1980..2044] */ -} tm_unz; - -/* unz_global_info structure contain global data about the ZIPfile - These data comes from the end of central dir */ -typedef struct unz_global_info_s -{ - uLong number_entry; /* total number of entries in - the central dir on this disk */ - uLong size_comment; /* size of the global comment of the zipfile */ -} unz_global_info; - - -/* unz_file_info contain information about a file in the zipfile */ -typedef struct unz_file_info_s -{ - uLong version; /* version made by 2 bytes */ - uLong version_needed; /* version needed to extract 2 bytes */ - uLong flag; /* general purpose bit flag 2 bytes */ - uLong compression_method; /* compression method 2 bytes */ - uLong dosDate; /* last mod file date in Dos fmt 4 bytes */ - uLong crc; /* crc-32 4 bytes */ - uLong compressed_size; /* compressed size 4 bytes */ - uLong uncompressed_size; /* uncompressed size 4 bytes */ - uLong size_filename; /* filename length 2 bytes */ - uLong size_file_extra; /* extra field length 2 bytes */ - uLong size_file_comment; /* file comment length 2 bytes */ - - uLong disk_num_start; /* disk number start 2 bytes */ - uLong internal_fa; /* internal file attributes 2 bytes */ - uLong external_fa; /* external file attributes 4 bytes */ - - tm_unz tmu_date; -} unz_file_info; - -extern int ZEXPORT unzStringFileNameCompare OF ((const char* fileName1, - const char* fileName2, - int iCaseSensitivity)); -/* - Compare two filename (fileName1,fileName2). - If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) - If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi - or strcasecmp) - If iCaseSenisivity = 0, case sensitivity is defaut of your operating system - (like 1 on Unix, 2 on Windows) -*/ - - -extern unzFile ZEXPORT unzOpen OF((const char *path)); -/* - Open a Zip file. path contain the full pathname (by example, - on a Windows XP computer "c:\\zlib\\zlib113.zip" or on an Unix computer - "zlib/zlib113.zip". - If the zipfile cannot be opened (file don't exist or in not valid), the - return value is NULL. - Else, the return value is a unzFile Handle, usable with other function - of this unzip package. -*/ - -extern unzFile ZEXPORT unzOpen2 OF((const char *path, - zlib_filefunc_def* pzlib_filefunc_def)); -/* - Open a Zip file, like unzOpen, but provide a set of file low level API - for read/write the zip file (see ioapi.h) -*/ - -extern int ZEXPORT unzClose OF((unzFile file)); -/* - Close a ZipFile opened with unzipOpen. - If there is files inside the .Zip opened with unzOpenCurrentFile (see later), - these files MUST be closed with unzipCloseCurrentFile before call unzipClose. - return UNZ_OK if there is no problem. */ - -extern int ZEXPORT unzGetGlobalInfo OF((unzFile file, - unz_global_info *pglobal_info)); -/* - Write info about the ZipFile in the *pglobal_info structure. - No preparation of the structure is needed - return UNZ_OK if there is no problem. */ - - -extern int ZEXPORT unzGetGlobalComment OF((unzFile file, - char *szComment, - uLong uSizeBuf)); -/* - Get the global comment string of the ZipFile, in the szComment buffer. - uSizeBuf is the size of the szComment buffer. - return the number of byte copied or an error code <0 -*/ - - -/***************************************************************************/ -/* Unzip package allow you browse the directory of the zipfile */ - -extern int ZEXPORT unzGoToFirstFile OF((unzFile file)); -/* - Set the current file of the zipfile to the first file. - return UNZ_OK if there is no problem -*/ - -extern int ZEXPORT unzGoToNextFile OF((unzFile file)); -/* - Set the current file of the zipfile to the next file. - return UNZ_OK if there is no problem - return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. -*/ - -extern int ZEXPORT unzLocateFile OF((unzFile file, - const char *szFileName, - int iCaseSensitivity)); -/* - Try locate the file szFileName in the zipfile. - For the iCaseSensitivity signification, see unzStringFileNameCompare - - return value : - UNZ_OK if the file is found. It becomes the current file. - UNZ_END_OF_LIST_OF_FILE if the file is not found -*/ - - -/* ****************************************** */ -/* Ryan supplied functions */ -/* unz_file_info contain information about a file in the zipfile */ -typedef struct unz_file_pos_s -{ - uLong pos_in_zip_directory; /* offset in zip file directory */ - uLong num_of_file; /* # of file */ -} unz_file_pos; - -extern int ZEXPORT unzGetFilePos( - unzFile file, - unz_file_pos* file_pos); - -extern int ZEXPORT unzGoToFilePos( - unzFile file, - unz_file_pos* file_pos); - -/* ****************************************** */ - -extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file, - unz_file_info *pfile_info, - char *szFileName, - uLong fileNameBufferSize, - void *extraField, - uLong extraFieldBufferSize, - char *szComment, - uLong commentBufferSize)); -/* - Get Info about the current file - if pfile_info!=NULL, the *pfile_info structure will contain somes info about - the current file - if szFileName!=NULL, the filemane string will be copied in szFileName - (fileNameBufferSize is the size of the buffer) - if extraField!=NULL, the extra field information will be copied in extraField - (extraFieldBufferSize is the size of the buffer). - This is the Central-header version of the extra field - if szComment!=NULL, the comment string of the file will be copied in szComment - (commentBufferSize is the size of the buffer) -*/ - -/***************************************************************************/ -/* for reading the content of the current zipfile, you can open it, read data - from it, and close it (you can close it before reading all the file) - */ - -extern int ZEXPORT unzOpenCurrentFile OF((unzFile file)); -/* - Open for reading data the current file in the zipfile. - If there is no error, the return value is UNZ_OK. -*/ - -extern int ZEXPORT unzOpenCurrentFilePassword OF((unzFile file, - const char* password)); -/* - Open for reading data the current file in the zipfile. - password is a crypting password - If there is no error, the return value is UNZ_OK. -*/ - -extern int ZEXPORT unzOpenCurrentFile2 OF((unzFile file, - int* method, - int* level, - int raw)); -/* - Same than unzOpenCurrentFile, but open for read raw the file (not uncompress) - if raw==1 - *method will receive method of compression, *level will receive level of - compression - note : you can set level parameter as NULL (if you did not want known level, - but you CANNOT set method parameter as NULL -*/ - -extern int ZEXPORT unzOpenCurrentFile3 OF((unzFile file, - int* method, - int* level, - int raw, - const char* password)); -/* - Same than unzOpenCurrentFile, but open for read raw the file (not uncompress) - if raw==1 - *method will receive method of compression, *level will receive level of - compression - note : you can set level parameter as NULL (if you did not want known level, - but you CANNOT set method parameter as NULL -*/ - - -extern int ZEXPORT unzCloseCurrentFile OF((unzFile file)); -/* - Close the file in zip opened with unzOpenCurrentFile - Return UNZ_CRCERROR if all the file was read but the CRC is not good -*/ - -extern int ZEXPORT unzReadCurrentFile OF((unzFile file, - voidp buf, - unsigned len)); -/* - Read bytes from the current file (opened by unzOpenCurrentFile) - buf contain buffer where data must be copied - len the size of buf. - - return the number of byte copied if somes bytes are copied - return 0 if the end of file was reached - return <0 with error code if there is an error - (UNZ_ERRNO for IO error, or zLib error for uncompress error) -*/ - -extern z_off_t ZEXPORT unztell OF((unzFile file)); -/* - Give the current position in uncompressed data -*/ - -extern int ZEXPORT unzeof OF((unzFile file)); -/* - return 1 if the end of file was reached, 0 elsewhere -*/ - -extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file, - voidp buf, - unsigned len)); -/* - Read extra field from the current file (opened by unzOpenCurrentFile) - This is the local-header version of the extra field (sometimes, there is - more info in the local-header version than in the central-header) - - if buf==NULL, it return the size of the local extra field - - if buf!=NULL, len is the size of the buffer, the extra header is copied in - buf. - the return value is the number of bytes copied in buf, or (if <0) - the error code -*/ - -/***************************************************************************/ - -/* Get the current file offset */ -extern uLong ZEXPORT unzGetOffset (unzFile file); - -/* Set the current file offset */ -extern int ZEXPORT unzSetOffset (unzFile file, uLong pos); - - - -#ifdef __cplusplus -} -#endif - -#endif /* _unz_H */ diff --git a/projects/mtg/minizip/zip.c b/projects/mtg/minizip/zip.c deleted file mode 100644 index 400e2ba37..000000000 --- a/projects/mtg/minizip/zip.c +++ /dev/null @@ -1,1219 +0,0 @@ -/* zip.c -- IO on .zip files using zlib - Version 1.01e, February 12th, 2005 - - 27 Dec 2004 Rolf Kalbermatter - Modification to zipOpen2 to support globalComment retrieval. - - Copyright (C) 1998-2005 Gilles Vollant - - Read zip.h for more info -*/ - - -#include -#include -#include -#include -#include "zlib.h" -#include "zip.h" - -#ifdef STDC -# include -# include -# include -#endif -#ifdef NO_ERRNO_H - extern int errno; -#else -# include -#endif - - -#ifndef local -# define local static -#endif -/* compile with -Dlocal if your debugger can't find static symbols */ - -#ifndef VERSIONMADEBY -# define VERSIONMADEBY (0x0) /* platform depedent */ -#endif - -#ifndef Z_BUFSIZE -#define Z_BUFSIZE (16384) -#endif - -#ifndef Z_MAXFILENAMEINZIP -#define Z_MAXFILENAMEINZIP (256) -#endif - -#ifndef ALLOC -# define ALLOC(size) (malloc(size)) -#endif -#ifndef TRYFREE -# define TRYFREE(p) {if (p) free(p);} -#endif - -/* -#define SIZECENTRALDIRITEM (0x2e) -#define SIZEZIPLOCALHEADER (0x1e) -*/ - -/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */ - -#ifndef SEEK_CUR -#define SEEK_CUR 1 -#endif - -#ifndef SEEK_END -#define SEEK_END 2 -#endif - -#ifndef SEEK_SET -#define SEEK_SET 0 -#endif - -#ifndef DEF_MEM_LEVEL -#if MAX_MEM_LEVEL >= 8 -# define DEF_MEM_LEVEL 8 -#else -# define DEF_MEM_LEVEL MAX_MEM_LEVEL -#endif -#endif -const char zip_copyright[] = - " zip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll"; - - -#define SIZEDATA_INDATABLOCK (4096-(4*4)) - -#define LOCALHEADERMAGIC (0x04034b50) -#define CENTRALHEADERMAGIC (0x02014b50) -#define ENDHEADERMAGIC (0x06054b50) - -#define FLAG_LOCALHEADER_OFFSET (0x06) -#define CRC_LOCALHEADER_OFFSET (0x0e) - -#define SIZECENTRALHEADER (0x2e) /* 46 */ - -typedef struct linkedlist_datablock_internal_s -{ - struct linkedlist_datablock_internal_s* next_datablock; - uLong avail_in_this_block; - uLong filled_in_this_block; - uLong unused; /* for future use and alignement */ - unsigned char data[SIZEDATA_INDATABLOCK]; -} linkedlist_datablock_internal; - -typedef struct linkedlist_data_s -{ - linkedlist_datablock_internal* first_block; - linkedlist_datablock_internal* last_block; -} linkedlist_data; - - -typedef struct -{ - z_stream stream; /* zLib stream structure for inflate */ - int stream_initialised; /* 1 is stream is initialised */ - uInt pos_in_buffered_data; /* last written byte in buffered_data */ - - uLong pos_local_header; /* offset of the local header of the file - currenty writing */ - char* central_header; /* central header data for the current file */ - uLong size_centralheader; /* size of the central header for cur file */ - uLong flag; /* flag of the file currently writing */ - - int method; /* compression method of file currenty wr.*/ - int raw; /* 1 for directly writing raw data */ - Byte buffered_data[Z_BUFSIZE];/* buffer contain compressed data to be writ*/ - uLong dosDate; - uLong crc32; - int encrypt; -#ifndef NOCRYPT - unsigned long keys[3]; /* keys defining the pseudo-random sequence */ - const unsigned long* pcrc_32_tab; - int crypt_header_size; -#endif -} curfile_info; - -typedef struct -{ - zlib_filefunc_def z_filefunc; - voidpf filestream; /* io structore of the zipfile */ - linkedlist_data central_dir;/* datablock with central dir in construction*/ - int in_opened_file_inzip; /* 1 if a file in the zip is currently writ.*/ - curfile_info ci; /* info on the file curretly writing */ - - uLong begin_pos; /* position of the beginning of the zipfile */ - uLong add_position_when_writting_offset; - uLong number_entry; -#ifndef NO_ADDFILEINEXISTINGZIP - char *globalcomment; -#endif -} zip_internal; - - - -#ifndef NOCRYPT -#define INCLUDECRYPTINGCODE_IFCRYPTALLOWED -#include "crypt.h" -#endif - -local linkedlist_datablock_internal* allocate_new_datablock() -{ - linkedlist_datablock_internal* ldi; - ldi = (linkedlist_datablock_internal*) - ALLOC(sizeof(linkedlist_datablock_internal)); - if (ldi!=NULL) - { - ldi->next_datablock = NULL ; - ldi->filled_in_this_block = 0 ; - ldi->avail_in_this_block = SIZEDATA_INDATABLOCK ; - } - return ldi; -} - -local void free_datablock(ldi) - linkedlist_datablock_internal* ldi; -{ - while (ldi!=NULL) - { - linkedlist_datablock_internal* ldinext = ldi->next_datablock; - TRYFREE(ldi); - ldi = ldinext; - } -} - -local void init_linkedlist(ll) - linkedlist_data* ll; -{ - ll->first_block = ll->last_block = NULL; -} - -local void free_linkedlist(ll) - linkedlist_data* ll; -{ - free_datablock(ll->first_block); - ll->first_block = ll->last_block = NULL; -} - - -local int add_data_in_datablock(ll,buf,len) - linkedlist_data* ll; - const void* buf; - uLong len; -{ - linkedlist_datablock_internal* ldi; - const unsigned char* from_copy; - - if (ll==NULL) - return ZIP_INTERNALERROR; - - if (ll->last_block == NULL) - { - ll->first_block = ll->last_block = allocate_new_datablock(); - if (ll->first_block == NULL) - return ZIP_INTERNALERROR; - } - - ldi = ll->last_block; - from_copy = (unsigned char*)buf; - - while (len>0) - { - uInt copy_this; - uInt i; - unsigned char* to_copy; - - if (ldi->avail_in_this_block==0) - { - ldi->next_datablock = allocate_new_datablock(); - if (ldi->next_datablock == NULL) - return ZIP_INTERNALERROR; - ldi = ldi->next_datablock ; - ll->last_block = ldi; - } - - if (ldi->avail_in_this_block < len) - copy_this = (uInt)ldi->avail_in_this_block; - else - copy_this = (uInt)len; - - to_copy = &(ldi->data[ldi->filled_in_this_block]); - - for (i=0;ifilled_in_this_block += copy_this; - ldi->avail_in_this_block -= copy_this; - from_copy += copy_this ; - len -= copy_this; - } - return ZIP_OK; -} - - - -/****************************************************************************/ - -#ifndef NO_ADDFILEINEXISTINGZIP -/* =========================================================================== - Inputs a long in LSB order to the given file - nbByte == 1, 2 or 4 (byte, short or long) -*/ - -local int ziplocal_putValue OF((const zlib_filefunc_def* pzlib_filefunc_def, - voidpf filestream, uLong x, int nbByte)); -local int ziplocal_putValue (pzlib_filefunc_def, filestream, x, nbByte) - const zlib_filefunc_def* pzlib_filefunc_def; - voidpf filestream; - uLong x; - int nbByte; -{ - unsigned char buf[4]; - int n; - for (n = 0; n < nbByte; n++) - { - buf[n] = (unsigned char)(x & 0xff); - x >>= 8; - } - if (x != 0) - { /* data overflow - hack for ZIP64 (X Roche) */ - for (n = 0; n < nbByte; n++) - { - buf[n] = 0xff; - } - } - - if (ZWRITE(*pzlib_filefunc_def,filestream,buf,nbByte)!=(uLong)nbByte) - return ZIP_ERRNO; - else - return ZIP_OK; -} - -local void ziplocal_putValue_inmemory OF((void* dest, uLong x, int nbByte)); -local void ziplocal_putValue_inmemory (dest, x, nbByte) - void* dest; - uLong x; - int nbByte; -{ - unsigned char* buf=(unsigned char*)dest; - int n; - for (n = 0; n < nbByte; n++) { - buf[n] = (unsigned char)(x & 0xff); - x >>= 8; - } - - if (x != 0) - { /* data overflow - hack for ZIP64 */ - for (n = 0; n < nbByte; n++) - { - buf[n] = 0xff; - } - } -} - -/****************************************************************************/ - - -local uLong ziplocal_TmzDateToDosDate(ptm,dosDate) - const tm_zip* ptm; - uLong dosDate; -{ - uLong year = (uLong)ptm->tm_year; - if (year>1980) - year-=1980; - else if (year>80) - year-=80; - return - (uLong) (((ptm->tm_mday) + (32 * (ptm->tm_mon+1)) + (512 * year)) << 16) | - ((ptm->tm_sec/2) + (32* ptm->tm_min) + (2048 * (uLong)ptm->tm_hour)); -} - - -/****************************************************************************/ - -local int ziplocal_getByte OF(( - const zlib_filefunc_def* pzlib_filefunc_def, - voidpf filestream, - int *pi)); - -local int ziplocal_getByte(pzlib_filefunc_def,filestream,pi) - const zlib_filefunc_def* pzlib_filefunc_def; - voidpf filestream; - int *pi; -{ - unsigned char c; - int err = (int)ZREAD(*pzlib_filefunc_def,filestream,&c,1); - if (err==1) - { - *pi = (int)c; - return ZIP_OK; - } - else - { - if (ZERROR(*pzlib_filefunc_def,filestream)) - return ZIP_ERRNO; - else - return ZIP_EOF; - } -} - - -/* =========================================================================== - Reads a long in LSB order from the given gz_stream. Sets -*/ -local int ziplocal_getShort OF(( - const zlib_filefunc_def* pzlib_filefunc_def, - voidpf filestream, - uLong *pX)); - -local int ziplocal_getShort (pzlib_filefunc_def,filestream,pX) - const zlib_filefunc_def* pzlib_filefunc_def; - voidpf filestream; - uLong *pX; -{ - uLong x ; - int i; - int err; - - err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); - x = (uLong)i; - - if (err==ZIP_OK) - err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); - x += ((uLong)i)<<8; - - if (err==ZIP_OK) - *pX = x; - else - *pX = 0; - return err; -} - -local int ziplocal_getLong OF(( - const zlib_filefunc_def* pzlib_filefunc_def, - voidpf filestream, - uLong *pX)); - -local int ziplocal_getLong (pzlib_filefunc_def,filestream,pX) - const zlib_filefunc_def* pzlib_filefunc_def; - voidpf filestream; - uLong *pX; -{ - uLong x ; - int i; - int err; - - err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); - x = (uLong)i; - - if (err==ZIP_OK) - err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); - x += ((uLong)i)<<8; - - if (err==ZIP_OK) - err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); - x += ((uLong)i)<<16; - - if (err==ZIP_OK) - err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); - x += ((uLong)i)<<24; - - if (err==ZIP_OK) - *pX = x; - else - *pX = 0; - return err; -} - -#ifndef BUFREADCOMMENT -#define BUFREADCOMMENT (0x400) -#endif -/* - Locate the Central directory of a zipfile (at the end, just before - the global comment) -*/ -local uLong ziplocal_SearchCentralDir OF(( - const zlib_filefunc_def* pzlib_filefunc_def, - voidpf filestream)); - -local uLong ziplocal_SearchCentralDir(pzlib_filefunc_def,filestream) - const zlib_filefunc_def* pzlib_filefunc_def; - voidpf filestream; -{ - unsigned char* buf; - uLong uSizeFile; - uLong uBackRead; - uLong uMaxBack=0xffff; /* maximum size of global comment */ - uLong uPosFound=0; - - if (ZSEEK(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0) - return 0; - - - uSizeFile = ZTELL(*pzlib_filefunc_def,filestream); - - if (uMaxBack>uSizeFile) - uMaxBack = uSizeFile; - - buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); - if (buf==NULL) - return 0; - - uBackRead = 4; - while (uBackReaduMaxBack) - uBackRead = uMaxBack; - else - uBackRead+=BUFREADCOMMENT; - uReadPos = uSizeFile-uBackRead ; - - uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? - (BUFREADCOMMENT+4) : (uSizeFile-uReadPos); - if (ZSEEK(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0) - break; - - if (ZREAD(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize) - break; - - for (i=(int)uReadSize-3; (i--)>0;) - if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && - ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06)) - { - uPosFound = uReadPos+i; - break; - } - - if (uPosFound!=0) - break; - } - TRYFREE(buf); - return uPosFound; -} -#endif /* !NO_ADDFILEINEXISTINGZIP*/ - -/************************************************************/ -extern zipFile ZEXPORT zipOpen2 (pathname, append, globalcomment, pzlib_filefunc_def) - const char *pathname; - int append; - zipcharpc* globalcomment; - zlib_filefunc_def* pzlib_filefunc_def; -{ - zip_internal ziinit; - zip_internal* zi; - int err=ZIP_OK; - - - if (pzlib_filefunc_def==NULL) - fill_fopen_filefunc(&ziinit.z_filefunc); - else - ziinit.z_filefunc = *pzlib_filefunc_def; - - ziinit.filestream = (*(ziinit.z_filefunc.zopen_file)) - (ziinit.z_filefunc.opaque, - pathname, - (append == APPEND_STATUS_CREATE) ? - (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_CREATE) : - (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_EXISTING)); - - if (ziinit.filestream == NULL) - return NULL; - ziinit.begin_pos = ZTELL(ziinit.z_filefunc,ziinit.filestream); - ziinit.in_opened_file_inzip = 0; - ziinit.ci.stream_initialised = 0; - ziinit.number_entry = 0; - ziinit.add_position_when_writting_offset = 0; - init_linkedlist(&(ziinit.central_dir)); - - - zi = (zip_internal*)ALLOC(sizeof(zip_internal)); - if (zi==NULL) - { - ZCLOSE(ziinit.z_filefunc,ziinit.filestream); - return NULL; - } - - /* now we add file in a zipfile */ -# ifndef NO_ADDFILEINEXISTINGZIP - ziinit.globalcomment = NULL; - if (append == APPEND_STATUS_ADDINZIP) - { - uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ - - uLong size_central_dir; /* size of the central directory */ - uLong offset_central_dir; /* offset of start of central directory */ - uLong central_pos,uL; - - uLong number_disk; /* number of the current dist, used for - spaning ZIP, unsupported, always 0*/ - uLong number_disk_with_CD; /* number the the disk with central dir, used - for spaning ZIP, unsupported, always 0*/ - uLong number_entry; - uLong number_entry_CD; /* total number of entries in - the central dir - (same than number_entry on nospan) */ - uLong size_comment; - - central_pos = ziplocal_SearchCentralDir(&ziinit.z_filefunc,ziinit.filestream); - if (central_pos==0) - err=ZIP_ERRNO; - - if (ZSEEK(ziinit.z_filefunc, ziinit.filestream, - central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0) - err=ZIP_ERRNO; - - /* the signature, already checked */ - if (ziplocal_getLong(&ziinit.z_filefunc, ziinit.filestream,&uL)!=ZIP_OK) - err=ZIP_ERRNO; - - /* number of this disk */ - if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_disk)!=ZIP_OK) - err=ZIP_ERRNO; - - /* number of the disk with the start of the central directory */ - if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_disk_with_CD)!=ZIP_OK) - err=ZIP_ERRNO; - - /* total number of entries in the central dir on this disk */ - if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_entry)!=ZIP_OK) - err=ZIP_ERRNO; - - /* total number of entries in the central dir */ - if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_entry_CD)!=ZIP_OK) - err=ZIP_ERRNO; - - if ((number_entry_CD!=number_entry) || - (number_disk_with_CD!=0) || - (number_disk!=0)) - err=ZIP_BADZIPFILE; - - /* size of the central directory */ - if (ziplocal_getLong(&ziinit.z_filefunc, ziinit.filestream,&size_central_dir)!=ZIP_OK) - err=ZIP_ERRNO; - - /* offset of start of central directory with respect to the - starting disk number */ - if (ziplocal_getLong(&ziinit.z_filefunc, ziinit.filestream,&offset_central_dir)!=ZIP_OK) - err=ZIP_ERRNO; - - /* zipfile global comment length */ - if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&size_comment)!=ZIP_OK) - err=ZIP_ERRNO; - - if ((central_pos0) - { - ziinit.globalcomment = ALLOC(size_comment+1); - if (ziinit.globalcomment) - { - size_comment = ZREAD(ziinit.z_filefunc, ziinit.filestream,ziinit.globalcomment,size_comment); - ziinit.globalcomment[size_comment]=0; - } - } - - byte_before_the_zipfile = central_pos - - (offset_central_dir+size_central_dir); - ziinit.add_position_when_writting_offset = byte_before_the_zipfile; - - { - uLong size_central_dir_to_read = size_central_dir; - size_t buf_size = SIZEDATA_INDATABLOCK; - void* buf_read = (void*)ALLOC(buf_size); - if (ZSEEK(ziinit.z_filefunc, ziinit.filestream, - offset_central_dir + byte_before_the_zipfile, - ZLIB_FILEFUNC_SEEK_SET) != 0) - err=ZIP_ERRNO; - - while ((size_central_dir_to_read>0) && (err==ZIP_OK)) - { - uLong read_this = SIZEDATA_INDATABLOCK; - if (read_this > size_central_dir_to_read) - read_this = size_central_dir_to_read; - if (ZREAD(ziinit.z_filefunc, ziinit.filestream,buf_read,read_this) != read_this) - err=ZIP_ERRNO; - - if (err==ZIP_OK) - err = add_data_in_datablock(&ziinit.central_dir,buf_read, - (uLong)read_this); - size_central_dir_to_read-=read_this; - } - TRYFREE(buf_read); - } - ziinit.begin_pos = byte_before_the_zipfile; - ziinit.number_entry = number_entry_CD; - - if (ZSEEK(ziinit.z_filefunc, ziinit.filestream, - offset_central_dir+byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET)!=0) - err=ZIP_ERRNO; - } - - if (globalcomment) - { - *globalcomment = ziinit.globalcomment; - } -# endif /* !NO_ADDFILEINEXISTINGZIP*/ - - if (err != ZIP_OK) - { -# ifndef NO_ADDFILEINEXISTINGZIP - TRYFREE(ziinit.globalcomment); -# endif /* !NO_ADDFILEINEXISTINGZIP*/ - TRYFREE(zi); - return NULL; - } - else - { - *zi = ziinit; - return (zipFile)zi; - } -} - -extern zipFile ZEXPORT zipOpen (pathname, append) - const char *pathname; - int append; -{ - return zipOpen2(pathname,append,NULL,NULL); -} - -extern int ZEXPORT zipOpenNewFileInZip3 (file, filename, zipfi, - extrafield_local, size_extrafield_local, - extrafield_global, size_extrafield_global, - comment, method, level, raw, - windowBits, memLevel, strategy, - password, crcForCrypting) - zipFile file; - const char* filename; - const zip_fileinfo* zipfi; - const void* extrafield_local; - uInt size_extrafield_local; - const void* extrafield_global; - uInt size_extrafield_global; - const char* comment; - int method; - int level; - int raw; - int windowBits; - int memLevel; - int strategy; - const char* password; - uLong crcForCrypting; -{ - zip_internal* zi; - uInt size_filename; - uInt size_comment; - uInt i; - int err = ZIP_OK; - -# ifdef NOCRYPT - if (password != NULL) - return ZIP_PARAMERROR; -# endif - - if (file == NULL) - return ZIP_PARAMERROR; - if ((method!=0) && (method!=Z_DEFLATED)) - return ZIP_PARAMERROR; - - zi = (zip_internal*)file; - - if (zi->in_opened_file_inzip == 1) - { - err = zipCloseFileInZip (file); - if (err != ZIP_OK) - return err; - } - - - if (filename==NULL) - filename="-"; - - if (comment==NULL) - size_comment = 0; - else - size_comment = (uInt)strlen(comment); - - size_filename = (uInt)strlen(filename); - - if (zipfi == NULL) - zi->ci.dosDate = 0; - else - { - if (zipfi->dosDate != 0) - zi->ci.dosDate = zipfi->dosDate; - else zi->ci.dosDate = ziplocal_TmzDateToDosDate(&zipfi->tmz_date,zipfi->dosDate); - } - - zi->ci.flag = 0; - if ((level==8) || (level==9)) - zi->ci.flag |= 2; - if ((level==2)) - zi->ci.flag |= 4; - if ((level==1)) - zi->ci.flag |= 6; - if (password != NULL) - zi->ci.flag |= 1; - - zi->ci.crc32 = 0; - zi->ci.method = method; - zi->ci.encrypt = 0; - zi->ci.stream_initialised = 0; - zi->ci.pos_in_buffered_data = 0; - zi->ci.raw = raw; - zi->ci.pos_local_header = ZTELL(zi->z_filefunc,zi->filestream) ; - zi->ci.size_centralheader = SIZECENTRALHEADER + size_filename + - size_extrafield_global + size_comment; - zi->ci.central_header = (char*)ALLOC((uInt)zi->ci.size_centralheader); - - ziplocal_putValue_inmemory(zi->ci.central_header,(uLong)CENTRALHEADERMAGIC,4); - /* version info */ - ziplocal_putValue_inmemory(zi->ci.central_header+4,(uLong)VERSIONMADEBY,2); - ziplocal_putValue_inmemory(zi->ci.central_header+6,(uLong)20,2); - ziplocal_putValue_inmemory(zi->ci.central_header+8,(uLong)zi->ci.flag,2); - ziplocal_putValue_inmemory(zi->ci.central_header+10,(uLong)zi->ci.method,2); - ziplocal_putValue_inmemory(zi->ci.central_header+12,(uLong)zi->ci.dosDate,4); - ziplocal_putValue_inmemory(zi->ci.central_header+16,(uLong)0,4); /*crc*/ - ziplocal_putValue_inmemory(zi->ci.central_header+20,(uLong)0,4); /*compr size*/ - ziplocal_putValue_inmemory(zi->ci.central_header+24,(uLong)0,4); /*uncompr size*/ - ziplocal_putValue_inmemory(zi->ci.central_header+28,(uLong)size_filename,2); - ziplocal_putValue_inmemory(zi->ci.central_header+30,(uLong)size_extrafield_global,2); - ziplocal_putValue_inmemory(zi->ci.central_header+32,(uLong)size_comment,2); - ziplocal_putValue_inmemory(zi->ci.central_header+34,(uLong)0,2); /*disk nm start*/ - - if (zipfi==NULL) - ziplocal_putValue_inmemory(zi->ci.central_header+36,(uLong)0,2); - else - ziplocal_putValue_inmemory(zi->ci.central_header+36,(uLong)zipfi->internal_fa,2); - - if (zipfi==NULL) - ziplocal_putValue_inmemory(zi->ci.central_header+38,(uLong)0,4); - else - ziplocal_putValue_inmemory(zi->ci.central_header+38,(uLong)zipfi->external_fa,4); - - ziplocal_putValue_inmemory(zi->ci.central_header+42,(uLong)zi->ci.pos_local_header- zi->add_position_when_writting_offset,4); - - for (i=0;ici.central_header+SIZECENTRALHEADER+i) = *(filename+i); - - for (i=0;ici.central_header+SIZECENTRALHEADER+size_filename+i) = - *(((const char*)extrafield_global)+i); - - for (i=0;ici.central_header+SIZECENTRALHEADER+size_filename+ - size_extrafield_global+i) = *(comment+i); - if (zi->ci.central_header == NULL) - return ZIP_INTERNALERROR; - - /* write the local header */ - err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)LOCALHEADERMAGIC,4); - - if (err==ZIP_OK) - err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)20,2);/* version needed to extract */ - if (err==ZIP_OK) - err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.flag,2); - - if (err==ZIP_OK) - err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.method,2); - - if (err==ZIP_OK) - err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.dosDate,4); - - if (err==ZIP_OK) - err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* crc 32, unknown */ - if (err==ZIP_OK) - err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* compressed size, unknown */ - if (err==ZIP_OK) - err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* uncompressed size, unknown */ - - if (err==ZIP_OK) - err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_filename,2); - - if (err==ZIP_OK) - err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_extrafield_local,2); - - if ((err==ZIP_OK) && (size_filename>0)) - if (ZWRITE(zi->z_filefunc,zi->filestream,filename,size_filename)!=size_filename) - err = ZIP_ERRNO; - - if ((err==ZIP_OK) && (size_extrafield_local>0)) - if (ZWRITE(zi->z_filefunc,zi->filestream,extrafield_local,size_extrafield_local) - !=size_extrafield_local) - err = ZIP_ERRNO; - - zi->ci.stream.avail_in = (uInt)0; - zi->ci.stream.avail_out = (uInt)Z_BUFSIZE; - zi->ci.stream.next_out = zi->ci.buffered_data; - zi->ci.stream.total_in = 0; - zi->ci.stream.total_out = 0; - - if ((err==ZIP_OK) && (zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) - { - zi->ci.stream.zalloc = (alloc_func)0; - zi->ci.stream.zfree = (free_func)0; - zi->ci.stream.opaque = (voidpf)0; - - if (windowBits>0) - windowBits = -windowBits; - - err = deflateInit2(&zi->ci.stream, level, - Z_DEFLATED, windowBits, memLevel, strategy); - - if (err==Z_OK) - zi->ci.stream_initialised = 1; - } -# ifndef NOCRYPT - zi->ci.crypt_header_size = 0; - if ((err==Z_OK) && (password != NULL)) - { - unsigned char bufHead[RAND_HEAD_LEN]; - unsigned int sizeHead; - zi->ci.encrypt = 1; - zi->ci.pcrc_32_tab = get_crc_table(); - /*init_keys(password,zi->ci.keys,zi->ci.pcrc_32_tab);*/ - - sizeHead=crypthead(password,bufHead,RAND_HEAD_LEN,zi->ci.keys,zi->ci.pcrc_32_tab,crcForCrypting); - zi->ci.crypt_header_size = sizeHead; - - if (ZWRITE(zi->z_filefunc,zi->filestream,bufHead,sizeHead) != sizeHead) - err = ZIP_ERRNO; - } -# endif - - if (err==Z_OK) - zi->in_opened_file_inzip = 1; - return err; -} - -extern int ZEXPORT zipOpenNewFileInZip2(file, filename, zipfi, - extrafield_local, size_extrafield_local, - extrafield_global, size_extrafield_global, - comment, method, level, raw) - zipFile file; - const char* filename; - const zip_fileinfo* zipfi; - const void* extrafield_local; - uInt size_extrafield_local; - const void* extrafield_global; - uInt size_extrafield_global; - const char* comment; - int method; - int level; - int raw; -{ - return zipOpenNewFileInZip3 (file, filename, zipfi, - extrafield_local, size_extrafield_local, - extrafield_global, size_extrafield_global, - comment, method, level, raw, - -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, - NULL, 0); -} - -extern int ZEXPORT zipOpenNewFileInZip (file, filename, zipfi, - extrafield_local, size_extrafield_local, - extrafield_global, size_extrafield_global, - comment, method, level) - zipFile file; - const char* filename; - const zip_fileinfo* zipfi; - const void* extrafield_local; - uInt size_extrafield_local; - const void* extrafield_global; - uInt size_extrafield_global; - const char* comment; - int method; - int level; -{ - return zipOpenNewFileInZip2 (file, filename, zipfi, - extrafield_local, size_extrafield_local, - extrafield_global, size_extrafield_global, - comment, method, level, 0); -} - -local int zipFlushWriteBuffer(zi) - zip_internal* zi; -{ - int err=ZIP_OK; - - if (zi->ci.encrypt != 0) - { -#ifndef NOCRYPT - uInt i; - int t; - for (i=0;ici.pos_in_buffered_data;i++) - zi->ci.buffered_data[i] = zencode(zi->ci.keys, zi->ci.pcrc_32_tab, - zi->ci.buffered_data[i],t); -#endif - } - if (ZWRITE(zi->z_filefunc,zi->filestream,zi->ci.buffered_data,zi->ci.pos_in_buffered_data) - !=zi->ci.pos_in_buffered_data) - err = ZIP_ERRNO; - zi->ci.pos_in_buffered_data = 0; - return err; -} - -extern int ZEXPORT zipWriteInFileInZip (file, buf, len) - zipFile file; - const void* buf; - unsigned len; -{ - zip_internal* zi; - int err=ZIP_OK; - - if (file == NULL) - return ZIP_PARAMERROR; - zi = (zip_internal*)file; - - if (zi->in_opened_file_inzip == 0) - return ZIP_PARAMERROR; - - zi->ci.stream.next_in = (void*)buf; - zi->ci.stream.avail_in = len; - zi->ci.crc32 = crc32(zi->ci.crc32,buf,len); - - while ((err==ZIP_OK) && (zi->ci.stream.avail_in>0)) - { - if (zi->ci.stream.avail_out == 0) - { - if (zipFlushWriteBuffer(zi) == ZIP_ERRNO) - err = ZIP_ERRNO; - zi->ci.stream.avail_out = (uInt)Z_BUFSIZE; - zi->ci.stream.next_out = zi->ci.buffered_data; - } - - - if(err != ZIP_OK) - break; - - if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) - { - uLong uTotalOutBefore = zi->ci.stream.total_out; - err=deflate(&zi->ci.stream, Z_NO_FLUSH); - zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ; - - } - else - { - uInt copy_this,i; - if (zi->ci.stream.avail_in < zi->ci.stream.avail_out) - copy_this = zi->ci.stream.avail_in; - else - copy_this = zi->ci.stream.avail_out; - for (i=0;ici.stream.next_out)+i) = - *(((const char*)zi->ci.stream.next_in)+i); - { - zi->ci.stream.avail_in -= copy_this; - zi->ci.stream.avail_out-= copy_this; - zi->ci.stream.next_in+= copy_this; - zi->ci.stream.next_out+= copy_this; - zi->ci.stream.total_in+= copy_this; - zi->ci.stream.total_out+= copy_this; - zi->ci.pos_in_buffered_data += copy_this; - } - } - } - - return err; -} - -extern int ZEXPORT zipCloseFileInZipRaw (file, uncompressed_size, crc32) - zipFile file; - uLong uncompressed_size; - uLong crc32; -{ - zip_internal* zi; - uLong compressed_size; - int err=ZIP_OK; - - if (file == NULL) - return ZIP_PARAMERROR; - zi = (zip_internal*)file; - - if (zi->in_opened_file_inzip == 0) - return ZIP_PARAMERROR; - zi->ci.stream.avail_in = 0; - - if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) - while (err==ZIP_OK) - { - uLong uTotalOutBefore; - if (zi->ci.stream.avail_out == 0) - { - if (zipFlushWriteBuffer(zi) == ZIP_ERRNO) - err = ZIP_ERRNO; - zi->ci.stream.avail_out = (uInt)Z_BUFSIZE; - zi->ci.stream.next_out = zi->ci.buffered_data; - } - uTotalOutBefore = zi->ci.stream.total_out; - err=deflate(&zi->ci.stream, Z_FINISH); - zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ; - } - - if (err==Z_STREAM_END) - err=ZIP_OK; /* this is normal */ - - if ((zi->ci.pos_in_buffered_data>0) && (err==ZIP_OK)) - if (zipFlushWriteBuffer(zi)==ZIP_ERRNO) - err = ZIP_ERRNO; - - if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) - { - err=deflateEnd(&zi->ci.stream); - zi->ci.stream_initialised = 0; - } - - if (!zi->ci.raw) - { - crc32 = (uLong)zi->ci.crc32; - uncompressed_size = (uLong)zi->ci.stream.total_in; - } - compressed_size = (uLong)zi->ci.stream.total_out; -# ifndef NOCRYPT - compressed_size += zi->ci.crypt_header_size; -# endif - - ziplocal_putValue_inmemory(zi->ci.central_header+16,crc32,4); /*crc*/ - ziplocal_putValue_inmemory(zi->ci.central_header+20, - compressed_size,4); /*compr size*/ - if (zi->ci.stream.data_type == Z_ASCII) - ziplocal_putValue_inmemory(zi->ci.central_header+36,(uLong)Z_ASCII,2); - ziplocal_putValue_inmemory(zi->ci.central_header+24, - uncompressed_size,4); /*uncompr size*/ - - if (err==ZIP_OK) - err = add_data_in_datablock(&zi->central_dir,zi->ci.central_header, - (uLong)zi->ci.size_centralheader); - free(zi->ci.central_header); - - if (err==ZIP_OK) - { - long cur_pos_inzip = ZTELL(zi->z_filefunc,zi->filestream); - if (ZSEEK(zi->z_filefunc,zi->filestream, - zi->ci.pos_local_header + 14,ZLIB_FILEFUNC_SEEK_SET)!=0) - err = ZIP_ERRNO; - - if (err==ZIP_OK) - err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,crc32,4); /* crc 32, unknown */ - - if (err==ZIP_OK) /* compressed size, unknown */ - err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,compressed_size,4); - - if (err==ZIP_OK) /* uncompressed size, unknown */ - err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,uncompressed_size,4); - - if (ZSEEK(zi->z_filefunc,zi->filestream, - cur_pos_inzip,ZLIB_FILEFUNC_SEEK_SET)!=0) - err = ZIP_ERRNO; - } - - zi->number_entry ++; - zi->in_opened_file_inzip = 0; - - return err; -} - -extern int ZEXPORT zipCloseFileInZip (file) - zipFile file; -{ - return zipCloseFileInZipRaw (file,0,0); -} - -extern int ZEXPORT zipClose (file, global_comment) - zipFile file; - const char* global_comment; -{ - zip_internal* zi; - int err = 0; - uLong size_centraldir = 0; - uLong centraldir_pos_inzip; - uInt size_global_comment; - if (file == NULL) - return ZIP_PARAMERROR; - zi = (zip_internal*)file; - - if (zi->in_opened_file_inzip == 1) - { - err = zipCloseFileInZip (file); - } - -#ifndef NO_ADDFILEINEXISTINGZIP - if (global_comment==NULL) - global_comment = zi->globalcomment; -#endif - if (global_comment==NULL) - size_global_comment = 0; - else - size_global_comment = (uInt)strlen(global_comment); - - centraldir_pos_inzip = ZTELL(zi->z_filefunc,zi->filestream); - if (err==ZIP_OK) - { - linkedlist_datablock_internal* ldi = zi->central_dir.first_block ; - while (ldi!=NULL) - { - if ((err==ZIP_OK) && (ldi->filled_in_this_block>0)) - if (ZWRITE(zi->z_filefunc,zi->filestream, - ldi->data,ldi->filled_in_this_block) - !=ldi->filled_in_this_block ) - err = ZIP_ERRNO; - - size_centraldir += ldi->filled_in_this_block; - ldi = ldi->next_datablock; - } - } - free_datablock(zi->central_dir.first_block); - - if (err==ZIP_OK) /* Magic End */ - err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)ENDHEADERMAGIC,4); - - if (err==ZIP_OK) /* number of this disk */ - err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,2); - - if (err==ZIP_OK) /* number of the disk with the start of the central directory */ - err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,2); - - if (err==ZIP_OK) /* total number of entries in the central dir on this disk */ - err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->number_entry,2); - - if (err==ZIP_OK) /* total number of entries in the central dir */ - err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->number_entry,2); - - if (err==ZIP_OK) /* size of the central directory */ - err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_centraldir,4); - - if (err==ZIP_OK) /* offset of start of central directory with respect to the - starting disk number */ - err = ziplocal_putValue(&zi->z_filefunc,zi->filestream, - (uLong)(centraldir_pos_inzip - zi->add_position_when_writting_offset),4); - - if (err==ZIP_OK) /* zipfile comment length */ - err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_global_comment,2); - - if ((err==ZIP_OK) && (size_global_comment>0)) - if (ZWRITE(zi->z_filefunc,zi->filestream, - global_comment,size_global_comment) != size_global_comment) - err = ZIP_ERRNO; - - if (ZCLOSE(zi->z_filefunc,zi->filestream) != 0) - if (err == ZIP_OK) - err = ZIP_ERRNO; - -#ifndef NO_ADDFILEINEXISTINGZIP - TRYFREE(zi->globalcomment); -#endif - TRYFREE(zi); - - return err; -} diff --git a/projects/mtg/minizip/zip.h b/projects/mtg/minizip/zip.h deleted file mode 100644 index cd38b670f..000000000 --- a/projects/mtg/minizip/zip.h +++ /dev/null @@ -1,235 +0,0 @@ -/* zip.h -- IO for compress .zip files using zlib - Version 1.01e, February 12th, 2005 - - Copyright (C) 1998-2005 Gilles Vollant - - This unzip package allow creates .ZIP file, compatible with PKZip 2.04g - WinZip, InfoZip tools and compatible. - Multi volume ZipFile (span) are not supported. - Encryption compatible with pkzip 2.04g only supported - Old compressions used by old PKZip 1.x are not supported - - For uncompress .zip file, look at unzip.h - - - I WAIT FEEDBACK at mail info@winimage.com - Visit also http://www.winimage.com/zLibDll/unzip.html for evolution - - Condition of use and distribution are the same than zlib : - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. - - -*/ - -/* for more info about .ZIP format, see - http://www.info-zip.org/pub/infozip/doc/appnote-981119-iz.zip - http://www.info-zip.org/pub/infozip/doc/ - PkWare has also a specification at : - ftp://ftp.pkware.com/probdesc.zip -*/ - -#ifndef _zip_H -#define _zip_H - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef _ZLIB_H -#include "zlib.h" -#endif - -#ifndef _ZLIBIOAPI_H -#include "ioapi.h" -#endif - -#if defined(STRICTZIP) || defined(STRICTZIPUNZIP) -/* like the STRICT of WIN32, we define a pointer that cannot be converted - from (void*) without cast */ -typedef struct TagzipFile__ { int unused; } zipFile__; -typedef zipFile__ *zipFile; -#else -typedef voidp zipFile; -#endif - -#define ZIP_OK (0) -#define ZIP_EOF (0) -#define ZIP_ERRNO (Z_ERRNO) -#define ZIP_PARAMERROR (-102) -#define ZIP_BADZIPFILE (-103) -#define ZIP_INTERNALERROR (-104) - -#ifndef DEF_MEM_LEVEL -# if MAX_MEM_LEVEL >= 8 -# define DEF_MEM_LEVEL 8 -# else -# define DEF_MEM_LEVEL MAX_MEM_LEVEL -# endif -#endif -/* default memLevel */ - -/* tm_zip contain date/time info */ -typedef struct tm_zip_s -{ - uInt tm_sec; /* seconds after the minute - [0,59] */ - uInt tm_min; /* minutes after the hour - [0,59] */ - uInt tm_hour; /* hours since midnight - [0,23] */ - uInt tm_mday; /* day of the month - [1,31] */ - uInt tm_mon; /* months since January - [0,11] */ - uInt tm_year; /* years - [1980..2044] */ -} tm_zip; - -typedef struct -{ - tm_zip tmz_date; /* date in understandable format */ - uLong dosDate; /* if dos_date == 0, tmu_date is used */ -/* uLong flag; */ /* general purpose bit flag 2 bytes */ - - uLong internal_fa; /* internal file attributes 2 bytes */ - uLong external_fa; /* external file attributes 4 bytes */ -} zip_fileinfo; - -typedef const char* zipcharpc; - - -#define APPEND_STATUS_CREATE (0) -#define APPEND_STATUS_CREATEAFTER (1) -#define APPEND_STATUS_ADDINZIP (2) - -extern zipFile ZEXPORT zipOpen OF((const char *pathname, int append)); -/* - Create a zipfile. - pathname contain on Windows XP a filename like "c:\\zlib\\zlib113.zip" or on - an Unix computer "zlib/zlib113.zip". - if the file pathname exist and append==APPEND_STATUS_CREATEAFTER, the zip - will be created at the end of the file. - (useful if the file contain a self extractor code) - if the file pathname exist and append==APPEND_STATUS_ADDINZIP, we will - add files in existing zip (be sure you don't add file that doesn't exist) - If the zipfile cannot be opened, the return value is NULL. - Else, the return value is a zipFile Handle, usable with other function - of this zip package. -*/ - -/* Note : there is no delete function into a zipfile. - If you want delete file into a zipfile, you must open a zipfile, and create another - Of couse, you can use RAW reading and writing to copy the file you did not want delte -*/ - -extern zipFile ZEXPORT zipOpen2 OF((const char *pathname, - int append, - zipcharpc* globalcomment, - zlib_filefunc_def* pzlib_filefunc_def)); - -extern int ZEXPORT zipOpenNewFileInZip OF((zipFile file, - const char* filename, - const zip_fileinfo* zipfi, - const void* extrafield_local, - uInt size_extrafield_local, - const void* extrafield_global, - uInt size_extrafield_global, - const char* comment, - int method, - int level)); -/* - Open a file in the ZIP for writing. - filename : the filename in zip (if NULL, '-' without quote will be used - *zipfi contain supplemental information - if extrafield_local!=NULL and size_extrafield_local>0, extrafield_local - contains the extrafield data the the local header - if extrafield_global!=NULL and size_extrafield_global>0, extrafield_global - contains the extrafield data the the local header - if comment != NULL, comment contain the comment string - method contain the compression method (0 for store, Z_DEFLATED for deflate) - level contain the level of compression (can be Z_DEFAULT_COMPRESSION) -*/ - - -extern int ZEXPORT zipOpenNewFileInZip2 OF((zipFile file, - const char* filename, - const zip_fileinfo* zipfi, - const void* extrafield_local, - uInt size_extrafield_local, - const void* extrafield_global, - uInt size_extrafield_global, - const char* comment, - int method, - int level, - int raw)); - -/* - Same than zipOpenNewFileInZip, except if raw=1, we write raw file - */ - -extern int ZEXPORT zipOpenNewFileInZip3 OF((zipFile file, - const char* filename, - const zip_fileinfo* zipfi, - const void* extrafield_local, - uInt size_extrafield_local, - const void* extrafield_global, - uInt size_extrafield_global, - const char* comment, - int method, - int level, - int raw, - int windowBits, - int memLevel, - int strategy, - const char* password, - uLong crcForCtypting)); - -/* - Same than zipOpenNewFileInZip2, except - windowBits,memLevel,,strategy : see parameter strategy in deflateInit2 - password : crypting password (NULL for no crypting) - crcForCtypting : crc of file to compress (needed for crypting) - */ - - -extern int ZEXPORT zipWriteInFileInZip OF((zipFile file, - const void* buf, - unsigned len)); -/* - Write data in the zipfile -*/ - -extern int ZEXPORT zipCloseFileInZip OF((zipFile file)); -/* - Close the current file in the zipfile -*/ - -extern int ZEXPORT zipCloseFileInZipRaw OF((zipFile file, - uLong uncompressed_size, - uLong crc32)); -/* - Close the current file in the zipfile, for fiel opened with - parameter raw=1 in zipOpenNewFileInZip2 - uncompressed_size and crc32 are value for the uncompressed size -*/ - -extern int ZEXPORT zipClose OF((zipFile file, - const char* global_comment)); -/* - Close the zipfile -*/ - -#ifdef __cplusplus -} -#endif - -#endif /* _zip_H */ diff --git a/projects/mtg/wagic.xcodeproj/project.pbxproj b/projects/mtg/wagic.xcodeproj/project.pbxproj index d951b708e..ccf864056 100755 --- a/projects/mtg/wagic.xcodeproj/project.pbxproj +++ b/projects/mtg/wagic.xcodeproj/project.pbxproj @@ -186,10 +186,6 @@ 12059E3F14980B7300DAC43B /* ASIHTTPRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 12211E3314931CBB00641703 /* ASIHTTPRequest.m */; }; 12059E4014980B7300DAC43B /* ASIInputStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 12211E3714931CBB00641703 /* ASIInputStream.m */; }; 12059E4114980B7300DAC43B /* ASINetworkQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = 12211E3914931CBB00641703 /* ASINetworkQueue.m */; }; - 12059E4214980B7300DAC43B /* ioapi.c in Sources */ = {isa = PBXBuildFile; fileRef = 12211EA214933D4A00641703 /* ioapi.c */; }; - 12059E4314980B7300DAC43B /* mztools.c in Sources */ = {isa = PBXBuildFile; fileRef = 12211EA414933D4A00641703 /* mztools.c */; }; - 12059E4414980B7300DAC43B /* unzip.c in Sources */ = {isa = PBXBuildFile; fileRef = 12211EA614933D4A00641703 /* unzip.c */; }; - 12059E4514980B7300DAC43B /* zip.c in Sources */ = {isa = PBXBuildFile; fileRef = 12211EA814933D4A00641703 /* zip.c */; }; 12059E4614980B7300DAC43B /* ZipArchive.mm in Sources */ = {isa = PBXBuildFile; fileRef = 12211EAE14933D6600641703 /* ZipArchive.mm */; }; 12059E4714980B7300DAC43B /* Reachability.m in Sources */ = {isa = PBXBuildFile; fileRef = 12211EB61493483C00641703 /* Reachability.m */; }; 12059E4814980B7300DAC43B /* WagicDownloadProgressViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 12211EC81494360C00641703 /* WagicDownloadProgressViewController.m */; }; @@ -222,10 +218,6 @@ 12211E7E14931CBB00641703 /* ASIHTTPRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 12211E3314931CBB00641703 /* ASIHTTPRequest.m */; }; 12211E7F14931CBB00641703 /* ASIInputStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 12211E3714931CBB00641703 /* ASIInputStream.m */; }; 12211E8014931CBB00641703 /* ASINetworkQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = 12211E3914931CBB00641703 /* ASINetworkQueue.m */; }; - 12211EAA14933D4A00641703 /* ioapi.c in Sources */ = {isa = PBXBuildFile; fileRef = 12211EA214933D4A00641703 /* ioapi.c */; }; - 12211EAB14933D4A00641703 /* mztools.c in Sources */ = {isa = PBXBuildFile; fileRef = 12211EA414933D4A00641703 /* mztools.c */; }; - 12211EAC14933D4A00641703 /* unzip.c in Sources */ = {isa = PBXBuildFile; fileRef = 12211EA614933D4A00641703 /* unzip.c */; }; - 12211EAD14933D4A00641703 /* zip.c in Sources */ = {isa = PBXBuildFile; fileRef = 12211EA814933D4A00641703 /* zip.c */; }; 12211EAF14933D6600641703 /* ZipArchive.mm in Sources */ = {isa = PBXBuildFile; fileRef = 12211EAE14933D6600641703 /* ZipArchive.mm */; }; 12211EB71493483C00641703 /* Reachability.m in Sources */ = {isa = PBXBuildFile; fileRef = 12211EB61493483C00641703 /* Reachability.m */; }; 12211EB914934A1900641703 /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 12211EB814934A1800641703 /* MobileCoreServices.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; @@ -277,6 +269,10 @@ 12DCD02E14DBE1F90023B966 /* JSfx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12DCD02C14DBE1F90023B966 /* JSfx.cpp */; }; 12DCD03414DBECC50023B966 /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 12DCD03114DBECC50023B966 /* CoreAudio.framework */; }; 12DCD03514DBECC50023B966 /* OpenAL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 12DCD03214DBECC50023B966 /* OpenAL.framework */; }; + 188B71D01B9B9F9400D5522B /* ioapi.c in Sources */ = {isa = PBXBuildFile; fileRef = 188B71C41B9B9F9400D5522B /* ioapi.c */; }; + 188B71D11B9B9F9400D5522B /* unzip.c in Sources */ = {isa = PBXBuildFile; fileRef = 188B71C51B9B9F9400D5522B /* unzip.c */; }; + 188B71D21B9B9F9400D5522B /* zip.c in Sources */ = {isa = PBXBuildFile; fileRef = 188B71C61B9B9F9400D5522B /* zip.c */; }; + 188B71D61B9B9F9400D5522B /* mztools.c in Sources */ = {isa = PBXBuildFile; fileRef = 188B71CC1B9B9F9400D5522B /* mztools.c */; }; 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; }; 28FD15000DC6FC520079059D /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 28FD14FF0DC6FC520079059D /* OpenGLES.framework */; }; @@ -474,18 +470,9 @@ 12211E3914931CBB00641703 /* ASINetworkQueue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ASINetworkQueue.m; sourceTree = ""; }; 12211E3A14931CBB00641703 /* ASIProgressDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASIProgressDelegate.h; sourceTree = ""; }; 12211E9F14933D0600641703 /* ZipArchive.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ZipArchive.h; path = iOS/ZipArchive/ZipArchive.h; sourceTree = ""; }; - 12211EA114933D4A00641703 /* crypt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = crypt.h; sourceTree = ""; }; - 12211EA214933D4A00641703 /* ioapi.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ioapi.c; sourceTree = ""; }; - 12211EA314933D4A00641703 /* ioapi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ioapi.h; sourceTree = ""; }; - 12211EA414933D4A00641703 /* mztools.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mztools.c; sourceTree = ""; }; - 12211EA514933D4A00641703 /* mztools.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mztools.h; sourceTree = ""; }; - 12211EA614933D4A00641703 /* unzip.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = unzip.c; sourceTree = ""; }; - 12211EA714933D4A00641703 /* unzip.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = unzip.h; sourceTree = ""; }; - 12211EA814933D4A00641703 /* zip.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip.c; sourceTree = ""; }; - 12211EA914933D4A00641703 /* zip.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = zip.h; sourceTree = ""; }; - 12211EAE14933D6600641703 /* ZipArchive.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ZipArchive.mm; sourceTree = ""; }; - 12211EB51493483C00641703 /* Reachability.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Reachability.h; path = "iOS/Reachability/Reachability 2.0.4ddg/Reachability/Reachability.h"; sourceTree = ""; }; - 12211EB61493483C00641703 /* Reachability.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Reachability.m; path = "iOS/Reachability/Reachability 2.0.4ddg/Reachability/Reachability.m"; sourceTree = ""; }; + 12211EAE14933D6600641703 /* ZipArchive.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = ZipArchive.mm; path = iOS/ZipArchive/ZipArchive.mm; sourceTree = ""; }; + 12211EB51493483C00641703 /* Reachability.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Reachability.h; path = iOS/Reachability/Reachability/Reachability.h; sourceTree = ""; }; + 12211EB61493483C00641703 /* Reachability.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Reachability.m; path = iOS/Reachability/Reachability/Reachability.m; sourceTree = ""; }; 12211EB814934A1800641703 /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = System/Library/Frameworks/MobileCoreServices.framework; sourceTree = SDKROOT; }; 12211EBA14934A2C00641703 /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = System/Library/Frameworks/CFNetwork.framework; sourceTree = SDKROOT; }; 12211EC71494360C00641703 /* WagicDownloadProgressViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WagicDownloadProgressViewController.h; path = UI/WagicDownloadProgressViewController.h; sourceTree = ""; }; @@ -570,6 +557,15 @@ 12DCD03014DBECC40023B966 /* AudioUnit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioUnit.framework; path = System/Library/Frameworks/AudioUnit.framework; sourceTree = SDKROOT; }; 12DCD03114DBECC50023B966 /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; }; 12DCD03214DBECC50023B966 /* OpenAL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenAL.framework; path = System/Library/Frameworks/OpenAL.framework; sourceTree = SDKROOT; }; + 188B71C31B9B9F9400D5522B /* crypt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = crypt.h; path = unzip/crypt.h; sourceTree = ""; }; + 188B71C41B9B9F9400D5522B /* ioapi.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ioapi.c; path = unzip/ioapi.c; sourceTree = ""; }; + 188B71C51B9B9F9400D5522B /* unzip.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = unzip.c; path = unzip/unzip.c; sourceTree = ""; }; + 188B71C61B9B9F9400D5522B /* zip.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip.c; path = unzip/zip.c; sourceTree = ""; }; + 188B71C71B9B9F9400D5522B /* ioapi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ioapi.h; path = unzip/ioapi.h; sourceTree = ""; }; + 188B71CC1B9B9F9400D5522B /* mztools.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mztools.c; path = unzip/mztools.c; sourceTree = ""; }; + 188B71CD1B9B9F9400D5522B /* mztools.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mztools.h; path = unzip/mztools.h; sourceTree = ""; }; + 188B71CE1B9B9F9400D5522B /* unzip.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = unzip.h; path = unzip/unzip.h; sourceTree = ""; }; + 188B71CF1B9B9F9400D5522B /* zip.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = zip.h; path = unzip/zip.h; sourceTree = ""; }; 1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 1D6058910D05DD3D006BFB54 /* wagic.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = wagic.app; sourceTree = BUILT_PRODUCTS_DIR; }; 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; @@ -976,22 +972,6 @@ name = ZipArchive; sourceTree = ""; }; - 12211EA014933D4A00641703 /* minizip */ = { - isa = PBXGroup; - children = ( - 12211EA114933D4A00641703 /* crypt.h */, - 12211EA214933D4A00641703 /* ioapi.c */, - 12211EA314933D4A00641703 /* ioapi.h */, - 12211EA414933D4A00641703 /* mztools.c */, - 12211EA514933D4A00641703 /* mztools.h */, - 12211EA614933D4A00641703 /* unzip.c */, - 12211EA714933D4A00641703 /* unzip.h */, - 12211EA814933D4A00641703 /* zip.c */, - 12211EA914933D4A00641703 /* zip.h */, - ); - path = minizip; - sourceTree = ""; - }; 12211EB01493449A00641703 /* Networking Packages */ = { isa = PBXGroup; children = ( @@ -1053,7 +1033,6 @@ isa = PBXGroup; children = ( 128ED372148BAE7B00C58E83 /* GoogleAdMobAdsSDKiOS-5.0.5 */, - 12211EA014933D4A00641703 /* minizip */, 12211E9E14933CC200641703 /* ZipArchive */, ); name = Tools; @@ -1190,6 +1169,22 @@ name = ios; sourceTree = ""; }; + 188B71C21B9B9F0100D5522B /* unzip */ = { + isa = PBXGroup; + children = ( + 188B71C31B9B9F9400D5522B /* crypt.h */, + 188B71C41B9B9F9400D5522B /* ioapi.c */, + 188B71C51B9B9F9400D5522B /* unzip.c */, + 188B71C61B9B9F9400D5522B /* zip.c */, + 188B71C71B9B9F9400D5522B /* ioapi.h */, + 188B71CC1B9B9F9400D5522B /* mztools.c */, + 188B71CD1B9B9F9400D5522B /* mztools.h */, + 188B71CE1B9B9F9400D5522B /* unzip.h */, + 188B71CF1B9B9F9400D5522B /* zip.h */, + ); + name = unzip; + sourceTree = ""; + }; 19C28FACFE9D520D11CA2CBB /* Products */ = { isa = PBXGroup; children = ( @@ -1591,6 +1586,7 @@ CEE232AF128A01F400C34032 /* src */ = { isa = PBXGroup; children = ( + 188B71C21B9B9F0100D5522B /* unzip */, 1235D03F14DEAC6A00B02B42 /* psp */, 1235D03D14DE397200B02B42 /* android */, 12DCD02B14DBE1AF0023B966 /* ios */, @@ -1947,10 +1943,6 @@ 12059E3F14980B7300DAC43B /* ASIHTTPRequest.m in Sources */, 12059E4014980B7300DAC43B /* ASIInputStream.m in Sources */, 12059E4114980B7300DAC43B /* ASINetworkQueue.m in Sources */, - 12059E4214980B7300DAC43B /* ioapi.c in Sources */, - 12059E4314980B7300DAC43B /* mztools.c in Sources */, - 12059E4414980B7300DAC43B /* unzip.c in Sources */, - 12059E4514980B7300DAC43B /* zip.c in Sources */, 12059E4614980B7300DAC43B /* ZipArchive.mm in Sources */, 12059E4714980B7300DAC43B /* Reachability.m in Sources */, 12059E4814980B7300DAC43B /* WagicDownloadProgressViewController.m in Sources */, @@ -1996,6 +1988,7 @@ CEE23323128A01F400C34032 /* tinystr.cpp in Sources */, CEE23324128A01F400C34032 /* tinyxml.cpp in Sources */, CEE23325128A01F400C34032 /* tinyxmlerror.cpp in Sources */, + 188B71D01B9B9F9400D5522B /* ioapi.c in Sources */, CEE23326128A01F400C34032 /* tinyxmlparser.cpp in Sources */, CEE23330128A01F400C34032 /* Vector2D.cpp in Sources */, CEE23331128A01F400C34032 /* vram.c in Sources */, @@ -2018,6 +2011,7 @@ CEA377691291C60500B9016A /* Damage.cpp in Sources */, CEA3776A1291C60500B9016A /* DamagerDamaged.cpp in Sources */, CEA3776B1291C60500B9016A /* DeckDataWrapper.cpp in Sources */, + 188B71D61B9B9F9400D5522B /* mztools.c in Sources */, CEA3776C1291C60500B9016A /* DeckEditorMenu.cpp in Sources */, CEA3776D1291C60500B9016A /* DeckManager.cpp in Sources */, CEA3776E1291C60500B9016A /* DeckMenu.cpp in Sources */, @@ -2087,6 +2081,7 @@ CEA377B41291C60500B9016A /* TextScroller.cpp in Sources */, CEA377B51291C60500B9016A /* ThisDescriptor.cpp in Sources */, CEA377B61291C60500B9016A /* Token.cpp in Sources */, + 188B71D11B9B9F9400D5522B /* unzip.c in Sources */, CEA377B71291C60500B9016A /* Translate.cpp in Sources */, CEA377B81291C60500B9016A /* TranslateKeys.cpp in Sources */, CEA377B91291C60500B9016A /* Trash.cpp in Sources */, @@ -2123,6 +2118,7 @@ 12769488144127380088F6D3 /* TestSuiteAI.cpp in Sources */, 12CCA030144A05D100E343A0 /* AbilityParser.cpp in Sources */, 12211E7914931CBB00641703 /* ASIAuthenticationDialog.m in Sources */, + 188B71D21B9B9F9400D5522B /* zip.c in Sources */, 12211E7A14931CBB00641703 /* ASIDataCompressor.m in Sources */, 12211E7B14931CBB00641703 /* ASIDataDecompressor.m in Sources */, 12211E7C14931CBB00641703 /* ASIDownloadCache.m in Sources */, @@ -2130,10 +2126,6 @@ 12211E7E14931CBB00641703 /* ASIHTTPRequest.m in Sources */, 12211E7F14931CBB00641703 /* ASIInputStream.m in Sources */, 12211E8014931CBB00641703 /* ASINetworkQueue.m in Sources */, - 12211EAA14933D4A00641703 /* ioapi.c in Sources */, - 12211EAB14933D4A00641703 /* mztools.c in Sources */, - 12211EAC14933D4A00641703 /* unzip.c in Sources */, - 12211EAD14933D4A00641703 /* zip.c in Sources */, 12211EAF14933D6600641703 /* ZipArchive.mm in Sources */, 12211EB71493483C00641703 /* Reachability.m in Sources */, 12211EC91494360C00641703 /* WagicDownloadProgressViewController.m in Sources */, @@ -2273,7 +2265,7 @@ "iOS/Reachability/Reachability\\ 2.0.4ddg/DDG\\ Reachability/Classes/", ); INFOPLIST_FILE = "wagic-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 4.0; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; LIBRARY_SEARCH_PATHS = ( "$(inherited)", "\"$(SRCROOT)/../../admobsdk/iOS/GoogleAdMobAdsSDKiOS-5.0.5\"", @@ -2315,7 +2307,7 @@ "iOS/Reachability/Reachability\\ 2.0.4ddg/DDG\\ Reachability/Classes/", ); INFOPLIST_FILE = "wagic-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 4.0; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; LIBRARY_SEARCH_PATHS = ( "$(inherited)", "\"$(SRCROOT)/../../admobsdk/iOS/GoogleAdMobAdsSDKiOS-5.0.5\"", From 022a15a5e942ccf3479e2704275782dba94b6eda Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 7 Sep 2015 10:09:34 +0800 Subject: [PATCH 080/249] added epic cards, fixed maxcast bug maxcast(*)0 - checks for the current action player of that turn, but when you passes the turn to the opponent, you can cast instant or cards with flash instead because you are not the current player, it mustcheck the controller of the card with play restriction if he can play it or not whether it your turn or the opponents turn. --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 64 ++++++++++++++----- .../bin/Res/sets/primitives/unsupported.txt | 24 ------- projects/mtg/include/AllAbilities.h | 14 ++++ projects/mtg/include/Player.h | 1 + projects/mtg/src/AllAbilities.cpp | 25 ++++++++ projects/mtg/src/MTGAbility.cpp | 12 +++- projects/mtg/src/MTGRules.cpp | 18 ++++-- projects/mtg/src/Player.cpp | 1 + 8 files changed, 113 insertions(+), 46 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 6ef4b64b7..58dc353d2 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -16398,10 +16398,10 @@ type=Land [/card] [card] name=City of Solitude -auto=this(variable{controllerturn}) maxCast(*)0 opponent -auto=this(variable{controllerturn}) lord(*|opponentbattlefield) noactivatedability -auto=this(variable{opponentturn}) maxCast(*)0 controller -auto=this(variable{opponentturn}) lord(*|mybattlefield) noactivatedability +auto=this(variable{controllerturn}>0) maxCast(*)0 opponent +auto=this(variable{controllerturn}>0) lord(*|opponentbattlefield) noactivatedability +auto=this(variable{opponentturn}>0) maxCast(*)0 controller +auto=this(variable{opponentturn}>0) lord(*|mybattlefield) noactivatedability text=Players can cast spells and activate abilities only during their own turns. mana={2}{G} type=Enchantment @@ -24860,8 +24860,8 @@ type=Land [/card] [card] name=Dosan the Falling Leaf -auto=this(variable{controllerturn}) maxCast(*)0 opponent -auto=this(variable{opponentturn}) maxCast(*)0 controller +auto=this(variable{controllerturn}>0) maxCast(*)0 opponent +auto=this(variable{opponentturn}>0) maxCast(*)0 controller text=Players can cast spells only during their own turns. mana={1}{G}{G} type=Legendary Creature @@ -29061,6 +29061,14 @@ type=Enchantment subtype=Aura [/card] [card] +name=Endless Swarm +auto=token(Snake,Creature Snake,1/1,green)*phandcount +auto=if compare(epicactivated)~lessthan~1 then emblem transforms((,newability[epic controller],newability[@each my upkeep:castcard(copied named!:Endless Swarm:!)])) forever dontremove +text=Put a 1/1 green Snake creature token onto the battlefield for each card in your hand. -- Epic (For the rest of the game, you can't cast spells. At the beginning of each of your upkeeps, copy this spell except for its epic ability.) +mana={5}{G}{G}{G} +type=Sorcery +[/card] +[card] name=Endless Whispers auto=@each endofturn:moveto(mybattlefield) all(creature[fresh]|opponentgraveyard) auto=@each endofturn:moveto(opponentbattlefield) all(creature[fresh]|mygraveyard) @@ -29113,6 +29121,14 @@ mana={3}{W}{W} type=Instant [/card] [card] +name=Enduring Ideal +auto=moveto(mybattlefield) notatarget(enchantment|mylibrary) and!( transforms((,newability[if cantargetcard(aura) then retarget target(creature|mybattlefield)])) )! +auto=if compare(epicactivated)~lessthan~1 then emblem transforms((,newability[epic controller],newability[@each my upkeep:castcard(copied named!:Enduring Ideal:!)])) forever dontremove +text=Search your library for an enchantment card and put it onto the battlefield. Then shuffle your library. -- Epic (For the rest of the game, you can't cast spells. At the beginning of each of your upkeeps, copy this spell except for its epic ability.) +mana={5}{W}{W} +type=Sorcery +[/card] +[card] name=Enemy of the Guildpact auto=protection from(*[multicolor]) text=Protection from multicolored @@ -29981,6 +29997,15 @@ power=0 toughness=0 [/card] [card] +name=Eternal Dominion +target=opponent +auto=target(*[artifact;creature;enchantment;land]|targetedpersonslibrary) moveto(mybattlefield) +auto=if compare(epicactivated)~lessthan~1 then emblem transforms((,newability[epic controller],newability[@each my upkeep:castcard(copied named!:Eternal Dominion:!)])) forever dontremove +text=Search target opponent's library for an artifact, creature, enchantment, or land card. Put that card onto the battlefield under your control. Then that player shuffles his or her library. -- Epic (For the rest of the game, you can't cast spells. At the beginning of each of your upkeeps, copy this spell except for its epic ability. You may choose a new target for the copy.) +mana={7}{U}{U}{U} +type=Sorcery +[/card] +[card] name=Eternal Dragon abilities=flying autohand={2}{cycle}:name(plainscycling) moveTo(myhand) target(plains|mylibrary) @@ -38047,8 +38072,8 @@ toughness=3 [/card] [card] name=Glory of Warfare -auto=this(variable{controllerturn}) lord(creature|mybattlefield) 2/0 -auto=this(variable{opponentturn}) lord(creature|mybattlefield) 0/2 +auto=this(variable{controllerturn}>0) lord(creature|mybattlefield) 2/0 +auto=this(variable{opponentturn}>0) lord(creature|mybattlefield) 0/2 text=As long as it's your turn, creatures you control get +2/+0. -- As long as it's not your turn, creatures you control get +0/+2. mana={2}{R}{W} type=Enchantment @@ -39827,8 +39852,8 @@ type=Artifact [/card] [card] name=Grand Abolisher -auto=this(variable{controllerturn}) maxCast(*)0 opponent -auto=this(variable{controllerturn}) lord(*[artifact;enchantment;creature]|opponentbattlefield) noactivatedability +auto=this(variable{controllerturn}>0) maxCast(*)0 opponent +auto=this(variable{controllerturn}>0) lord(*[artifact;enchantment;creature]|opponentbattlefield) noactivatedability text=During your turn, your opponents can't cast spells or activate abilities of artifacts, creatures, or enchantments. mana={W}{W} type=Creature @@ -64511,6 +64536,15 @@ mana={1}{U} type=Instant [/card] [card] +name=Neverending Torment +target=player +auto=moveto(exile) target(*|targetedpersonslibrary) +auto=if compare(epicactivated)~lessthan~1 then emblem transforms((,newability[epic controller],newability[@each my upkeep:castcard(copied named!:Neverending Torment:!)])) forever dontremove +text=Search target player's library for X cards, where X is the number of cards in your hand, and exile them. Then that player shuffles his or her library. -- Epic (For the rest of the game, you can't cast spells. At the beginning of each of your upkeeps, copy this spell except for its epic ability. You may choose a new target for the copy.) +mana={4}{B}{B} +type=Sorcery +[/card] +[card] name=Nevermaker abilities=flying other={3}{U} name(Evoke) @@ -65912,7 +65946,7 @@ subtype=Equipment [/card] [card] name=Oak Street Innkeeper -auto=this(variable{opponentturn}) lord(creature[tapped]|mybattlefield) opponentshroud +auto=this(variable{opponentturn}>0) lord(creature[tapped]|mybattlefield) opponentshroud text=As long as it's not your turn, tapped creatures you control have hexproof. mana={2}{G} type=Creature @@ -66036,7 +66070,7 @@ type=Artifact [/card] [card] name=Ob Nixilis, the Fallen -auto=@movedTo(land|myBattlefield):may counter(1/1,3) && life:-3 opponent +auto=@movedTo(land|myBattlefield):may life:-3 target(player) && counter(1/1,3) all(this) text=Landfall - Whenever a land enters the battlefield under your control, you may have target player lose 3 life. If you do, put three +1/+1 counters on Ob Nixilis, the Fallen. mana={3}{B}{B} type=Legendary Creature @@ -104694,8 +104728,8 @@ toughness=4 [/card] [card] name=Vibrating Sphere -auto=this(variable{controllerturn}) lord(creature|mybattlefield) 2/0 -auto=this(variable{opponentturn}) lord(creature|mybattlefield) 0/-2 +auto=this(variable{controllerturn}>0) lord(creature|mybattlefield) 2/0 +auto=this(variable{opponentturn}>0) lord(creature|mybattlefield) 0/-2 text=As long as it's your turn, creatures you control get +2/+0. -- As long as it's not your turn, creatures you control get -0/-2. mana={4} type=Artifact @@ -111952,7 +111986,7 @@ toughness=1 [card] name=Zurgo Helmsmasher abilities=haste,mustattack -auto=this(variable{controllerturn}) indestructible +auto=this(variable{controllerturn}>0) indestructible auto=@vampired(creature) from(this):counter(1/1,1) all(this) text=Haste. -- Zurgo Helmsmasher attacks each combat if able. -- Zurgo Helmsmasher has indestructible as long as it is your turn. -- Whenever a creature dealt damage by Zurgo Helmsmasher dies, put a +1/+1 counter on Zurgo Helmsmasher. mana={2}{R}{W}{B} diff --git a/projects/mtg/bin/Res/sets/primitives/unsupported.txt b/projects/mtg/bin/Res/sets/primitives/unsupported.txt index 9b1b81fb3..345ecc823 100644 --- a/projects/mtg/bin/Res/sets/primitives/unsupported.txt +++ b/projects/mtg/bin/Res/sets/primitives/unsupported.txt @@ -4509,24 +4509,12 @@ mana={3}{W} type=Enchantment [/card] [card] -name=Endless Swarm -text=Put a 1/1 green Snake creature token onto the battlefield for each card in your hand. -- Epic (For the rest of the game, you can't cast spells. At the beginning of each of your upkeeps, copy this spell except for its epic ability.) -mana={5}{G}{G}{G} -type=Sorcery -[/card] -[card] name=Endoskeleton text=You may choose not to untap Endoskeleton during your untap step. -- {2}, {T}: Target creature gets +0/+3 for as long as Endoskeleton remains tapped. mana={2} type=Artifact [/card] [card] -name=Enduring Ideal -text=Search your library for an enchantment card and put it onto the battlefield. Then shuffle your library. -- Epic (For the rest of the game, you can't cast spells. At the beginning of each of your upkeeps, copy this spell except for its epic ability.) -mana={5}{W}{W} -type=Sorcery -[/card] -[card] name=Enduring Renewal text=Play with your hand revealed. -- If you would draw a card, reveal the top card of your library instead. If it's a creature card, put it into your graveyard. Otherwise, draw a card. -- Whenever a creature is put into your graveyard from the battlefield, return it to your hand. mana={2}{W}{W} @@ -4707,12 +4695,6 @@ type=Enchantment subtype=Aura [/card] [card] -name=Eternal Dominion -text=Search target opponent's library for an artifact, creature, enchantment, or land card. Put that card onto the battlefield under your control. Then that player shuffles his or her library. -- Epic (For the rest of the game, you can't cast spells. At the beginning of each of your upkeeps, copy this spell except for its epic ability. You may choose a new target for the copy.) -mana={7}{U}{U}{U} -type=Sorcery -[/card] -[card] name=Etherium-Horn Sorcerer text={1}{U}{R}: Return Etherium-Horn Sorcerer to its owner's hand. -- Cascade (When you cast this spell, exile cards from the top of your library until you exile a nonland card that costs less. You may cast it without paying its mana cost. Put the exiled cards on the bottom in a random order.) mana={4}{U}{R} @@ -10798,12 +10780,6 @@ power=2 toughness=2 [/card] [card] -name=Neverending Torment -text=Search target player's library for X cards, where X is the number of cards in your hand, and exile them. Then that player shuffles his or her library. -- Epic (For the rest of the game, you can't cast spells. At the beginning of each of your upkeeps, copy this spell except for its epic ability. You may choose a new target for the copy.) -mana={4}{B}{B} -type=Sorcery -[/card] -[card] name=New Benalia text=New Benalia enters the battlefield tapped. -- When New Benalia enters the battlefield, scry 1. (To scry 1, look at the top card of your library, then you may put that card on the bottom of your library.) -- {T}: Add {W} to your mana pool. type=Land diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index 476c670b3..77671fe5e 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -599,6 +599,10 @@ private: { intValue = target->controller()->opponent()->drawCounter; } + else if (s == "epicactivated") + { + intValue = target->controller()->epic; + } else if (s == "p" || s == "power") { intValue = target->getPower(); @@ -1335,6 +1339,16 @@ public: AAFakeAbility * clone() const; }; +class AAEPIC: public ActivatedAbility +{ +public: + string named; + AAEPIC(GameObserver* observer, int id, MTGCardInstance * source, MTGCardInstance * target,string _newName, ManaCost * cost = NULL); + int resolve(); + const string getMenuText(); + AAEPIC * clone() const; +}; + class AAFizzler: public ActivatedAbility { public: diff --git a/projects/mtg/include/Player.h b/projects/mtg/include/Player.h index 589e8766a..938f6d80a 100644 --- a/projects/mtg/include/Player.h +++ b/projects/mtg/include/Player.h @@ -42,6 +42,7 @@ public: int skippingTurn; int extraTurn; int drawCounter; + int epic; vector prowledTypes; vectorcurses; Player(GameObserver *observer, string deckFile, string deckFileSmall, MTGDeck * deck = NULL); diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index 1b2612e1a..e868654bb 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -1328,6 +1328,31 @@ AAFakeAbility * AAFakeAbility::clone() const return NEW AAFakeAbility(*this); } +//EPIC + AAEPIC::AAEPIC(GameObserver* observer, int id, MTGCardInstance * source, MTGCardInstance * _target, string _named,ManaCost * cost): + ActivatedAbility(observer, id, source, cost, 0),named(_named) +{ + this->target = _target; +} +int AAEPIC::resolve() +{ + MTGCardInstance * _target = (MTGCardInstance *)target; + _target->controller()->epic = 1; + return 1; +} + +const string AAEPIC::getMenuText() +{ + if(named.size()) + return named.c_str(); + return "EPIC"; +} + +AAEPIC * AAEPIC::clone() const +{ + return NEW AAEPIC(*this); +} + // Fizzler AAFizzler::AAFizzler(GameObserver* observer, int _id, MTGCardInstance * card, Spell * _target, ManaCost * _cost) : ActivatedAbility(observer, _id, card, _cost, 0) diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index e8d6c34ed..fca67f710 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -2408,7 +2408,7 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG return a; } - //Reset damages on cards + //Do nothing found = s.find("donothing"); if (found != string::npos) { @@ -2418,6 +2418,16 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG return a; } + //Epic + found = s.find("epic"); + if (found != string::npos) + { + + MTGAbility * a = NEW AAEPIC(observer, id, card, target,newName); + a->oneShot = 1; + return a; + } + //Damage vector splitDamage = parseBetween(s, "damage:", " ", false); if (splitDamage.size()) diff --git a/projects/mtg/src/MTGRules.cpp b/projects/mtg/src/MTGRules.cpp index 0c6e9ec10..b174b612b 100644 --- a/projects/mtg/src/MTGRules.cpp +++ b/projects/mtg/src/MTGRules.cpp @@ -318,13 +318,15 @@ int MTGPutInPlayRule::isReactingToClick(MTGCardInstance * card, ManaCost *) } } else if ((card->hasType(Subtypes::TYPE_INSTANT)) || card->has(Constants::FLASH) - || (player == currentPlayer && !game->isInterrupting + || (player == card->controller() && !game->isInterrupting && (game->getCurrentGamePhase() == MTG_PHASE_FIRSTMAIN || game->getCurrentGamePhase() == MTG_PHASE_SECONDMAIN)) ) { + if(card->controller()->epic) + return 0; - if (game->currentActionPlayer->game->playRestrictions->canPutIntoZone(card, game->currentActionPlayer->game->stack) == PlayRestriction::CANT_PLAY) + if (card->controller()->game->playRestrictions->canPutIntoZone(card, game->currentActionPlayer->game->stack) == PlayRestriction::CANT_PLAY) return 0; ManaCost * playerMana = player->getManaPool(); ManaCost * cost = card->getManaCost(); @@ -650,12 +652,14 @@ int MTGAlternativeCostRule::isReactingToClick(MTGCardInstance * card, ManaCost * return 1; } else if ((card->hasType(Subtypes::TYPE_INSTANT)) || card->has(Constants::FLASH) - || (player == currentPlayer && !game->isInterrupting + || (player == card->controller() && !game->isInterrupting && (game->getCurrentGamePhase() == MTG_PHASE_FIRSTMAIN || game->getCurrentGamePhase() == MTG_PHASE_SECONDMAIN)) ) { - if (game->currentActionPlayer->game->playRestrictions->canPutIntoZone(card, game->currentActionPlayer->game->stack) == PlayRestriction::CANT_PLAY) + if(card->controller()->epic) + return 0; + if (card->controller()->game->playRestrictions->canPutIntoZone(card, card->controller()->game->stack) == PlayRestriction::CANT_PLAY) return 0; ManaCost * playerMana = player->getManaPool(); @@ -1035,14 +1039,16 @@ int MTGMorphCostRule::isReactingToClick(MTGCardInstance * card, ManaCost *) return 0; if(!allowedToAltCast(card,player)) return 0; + if(card->controller()->epic)//zoetic cavern... morph is casted for a cost... + return 0; //note lands can morph too, this is different from other cost types. - if ((card->hasType(Subtypes::TYPE_INSTANT)) || card->has(Constants::FLASH) || (player == currentPlayer + if ((card->hasType(Subtypes::TYPE_INSTANT)) || card->has(Constants::FLASH) || (player == card->controller() && !game->isInterrupting && (game->getCurrentGamePhase() == MTG_PHASE_FIRSTMAIN || game->getCurrentGamePhase() == MTG_PHASE_SECONDMAIN)) ) { - if (game->currentActionPlayer->game->playRestrictions->canPutIntoZone(card, game->currentActionPlayer->game->stack) == PlayRestriction::CANT_PLAY) + if (card->controller()->game->playRestrictions->canPutIntoZone(card, card->controller()->game->stack) == PlayRestriction::CANT_PLAY) return 0; ManaCost * playerMana = player->getManaPool(); ManaCost * morph = card->getManaCost()->getMorph(); diff --git a/projects/mtg/src/Player.cpp b/projects/mtg/src/Player.cpp index 2003d0b83..c55d7b9c3 100644 --- a/projects/mtg/src/Player.cpp +++ b/projects/mtg/src/Player.cpp @@ -33,6 +33,7 @@ Player::Player(GameObserver *observer, string file, string fileSmall, MTGDeck * skippingTurn = 0; extraTurn = 0; drawCounter = 0; + epic = 0; prowledTypes.clear(); doesntEmpty = NEW ManaCost(); poolDoesntEmpty = NEW ManaCost(); From 3f639976942bda3b3e75d6b3ad1fb69221b3f78c Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 7 Sep 2015 13:40:28 +0800 Subject: [PATCH 081/249] morethanfourcards for cards like black vise --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 13 ++++++++++--- projects/mtg/include/AllAbilities.h | 15 +++++++++++++++ 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 58dc353d2..3f10c009a 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -8883,7 +8883,7 @@ type=Sorcery [card] name=Black Vise auto=name(choose opponent) notatarget(opponent) deplete:0 -auto=@each targetedplayer upkeep:foreach(*|targetedpersonshand) damage:1 targetedplayer >4 +auto=@each targetedplayer upkeep:damage:morethanfourcards targetedplayer text=As Black Vise enters the battlefield, choose an opponent. -- At the beginning of the chosen player's upkeep, Black Vise deals X damage to that player, where X is the number of cards in his or her hand minus 4. mana={1} type=Artifact @@ -47645,7 +47645,7 @@ type=Artifact [/card] [card] name=Iron Maiden -auto=@each opponent upkeep:foreach(*|opponenthand) damage:1 opponent >4 +auto=@each opponent upkeep:damage:morethanfourcards opponent text=At the beginning of each opponent's upkeep, Iron Maiden deals X damage to that player, where X is the number of cards in his or her hand minus 4. mana={3} type=Artifact @@ -76605,6 +76605,13 @@ power=3 toughness=4 [/card] [card] +name=Restore the Peace +auto=all(creature[damager]) moveto(ownerhand) +text=Return each creature that dealt damage this turn to its owner's hand. +mana={1}{W}{U} +type=Instant +[/card] +[card] name=Restrain target=creature[attacking] auto=0/0 && fog from(mytgt) oneshot @@ -105376,7 +105383,7 @@ toughness=3 [/card] [card] name=Viseling -auto=@each opponent upkeep:foreach(*|opponenthand) damage:1 opponent >4 +auto=@each opponent upkeep:damage:morethanfourcards opponent text=At the beginning of each opponent's upkeep, Viseling deals X damage to that player, where X is the number of cards in his or her hand minus 4. mana={4} type=Artifact Creature diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index 77671fe5e..e8d099441 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -639,6 +639,21 @@ private: { intValue = target->controller()->opponent()->game->hand->nb_cards; } + else if (s == "morethanfourcards") + { + if(card->playerTarget) + {//blackvise + intValue = 0; + if ((card->playerTarget->game->hand->nb_cards - 4)>0) + intValue = (card->playerTarget->game->hand->nb_cards - 4); + } + else + {//viseling + intValue = 0; + if ((card->controller()->opponent()->game->hand->nb_cards - 4)>0) + intValue = (card->controller()->opponent()->game->hand->nb_cards - 4); + } + } else if (s == "powertotalinplay")//Count Total Power of Creatures you control... Formidable { intValue = 0; From 5bdb80db357028fff024f8103e525031672485f1 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 7 Sep 2015 19:52:53 +0800 Subject: [PATCH 082/249] added DTK cards :) --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 1698 ++++++++++++++++++ 1 file changed, 1698 insertions(+) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 3f10c009a..15bd61f4e 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -751,6 +751,20 @@ power=3 toughness=5 [/card] [card] +name=Acid-Spewer Dragon +abilities=flying,deathtouch +facedown={3} +autofacedown={5}{B}{B}:morph +autofaceup=counter(1/1,1) +autofaceup=counter(1/1,1) all(other creature[dragon]|mybattlefield) +text=Flying, deathtouch -- Megamorph {5}{B}{B} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its megamorph cost and put a +1/+1 counter on it.) -- When Acid-Spewer Dragon is turned face up, put a +1/+1 counter on each other Dragon creature you control. +mana={5}{B} +type=Creature +subtype=Dragon +power=3 +toughness=3 +[/card] +[card] name=Acidic Slime abilities=deathtouch auto=destroy target(artifact,enchantment,land) @@ -1042,6 +1056,19 @@ mana={2}{G} type=Instant [/card] [card] +name=Aerie Bowmasters +abilities=reach +facedown={3} +autofacedown={5}{G}:morph +autofaceup=counter(1/1,1) +text=Reach (This creature can block creatures with flying.) -- Megamorph {5}{G} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its megamorph cost and put a +1/+1 counter on it.) +mana={2}{G}{G} +type=Creature +subtype=Hound Archer +power=3 +toughness=4 +[/card] +[card] name=Aerie Mystics abilities=flying auto={1}{G}{U}:lord(creature|myBattlefield) shroud ueot @@ -1309,6 +1336,16 @@ power=3 toughness=3 [/card] [card] +name=Ainok Artillerist +auto=this(counter{1/1.1}>0) reach +text=Ainok Artillerist has reach as long as it has a +1/+1 counter on it. (It can block creatures with flying.) +mana={2}{G} +type=Creature +subtype=Hound Archer +power=4 +toughness=1 +[/card] +[card] name=Ainok Bond-Kin auto={1}{W}{T}:counter(1/1,1) asSorcery auto=lord(creature[counter{1/1.1}]|mybattlefield) first strike @@ -1331,6 +1368,19 @@ power=1 toughness=1 [/card] [card] +name=Ainok Survivalist +facedown={3} +autofacedown={1}{G}:morph +autofaceup=counter(1/1,1) +autofaceup=destroy target(*[artifact;enchantment]|opponentbattlefield) +text=Megamorph {1}{G} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its megamorph cost and put a +1/+1 counter on it.) -- When Ainok Survivalist is turned face up, destroy target artifact or enchantment an opponent controls. +mana={1}{G} +type=Creature +subtype=Hound Shaman +power=2 +toughness=1 +[/card] +[card] name=Ainok Tracker abilities=first strike facedown={3} @@ -2327,6 +2377,19 @@ mana={3}{B} type=Sorcery [/card] [card] +name=Ambuscade Shaman +other={3}{B} name(Dash) +auto=if paid(alternative) then transforms((,newability[haste],newability[phaseaction[endofturn sourceinplay] moveto(ownerhand) all(this)])) forever +auto=2/2 ueot +auto=@movedto(other creature|mybattlefield):all(trigger) 2/2 ueot +text=Whenever Ambuscade Shaman or another creature enters the battlefield under your control, that creature gets +2/+2 until end of turn. -- Dash {3}{B} (You may cast this spell for its dash cost. If you do, it gains haste, and it's returned from the battlefield to its owner's hand at the beginning of the next end step.) +mana={2}{B} +type=Creature +subtype=Orc Shaman +power=2 +toughness=2 +[/card] +[card] name=Ambush auto=lord(creature[blocking]) first strike text=Blocking creatures gain first strike until end of turn. @@ -2580,6 +2643,16 @@ power=3 toughness=3 [/card] [card] +name=Anafenza, Kin-Tree Spirit +auto=@movedTo(other creature[-token]|mybattlefield):ability$!name(Bolster) counter(1/1,1) notatarget(creature[toughness=toughness:lowest:creature:battlefield]|mybattlefield)!$ controller +text=Whenever another nontoken creature enters the battlefield under your control, bolster 1. (Choose a creature with the least toughness among creatures you control and put a +1/+1 counter on it.) +mana={W}{W} +type=Legendary Creature +subtype=Spirit Soldier +power=2 +toughness=2 +[/card] +[card] name=Anafenza, the Foremost auto=@combat(attacking) source(this):counter(1/1,1) target(other creature[tapped]|mybattlefield) auto=@movedTo(creature|opponentGraveyard):all(trigger[to]) moveTo(exile) @@ -2679,6 +2752,16 @@ mana={U} type=Instant [/card] [card] +name=Ancestral Statue +auto=moveto(ownerhand) notatarget(*[-land]|mybattlefield) +text=When Ancestral Statue enters the battlefield, return a nonland permanent you control to its owner's hand. +mana={4} +type=Artifact Creature +subtype=Golem +power=3 +toughness=4 +[/card] +[card] name=Ancestral Tribute auto=life:twicetype:*:mygraveyard flashback={9}{W}{W}{W} @@ -2706,6 +2789,15 @@ text=As Ancient Amphitheater enters the battlefield, you may reveal a Giant card type=Land [/card] [card] +name=Ancient Carp +text=null +mana={4}{U} +type=Creature +subtype=Fish +power=2 +toughness=5 +[/card] +[card] name=Ancient Craving auto=draw:3 auto=life:-3 @@ -3706,6 +3798,29 @@ power=1 toughness=3 [/card] [card] +name=Arashin Foremost +abilities=double strike +auto=target(other creature[warrior]|mybattlefield) double strike ueot +auto=@combat(attacking) source(this):target(other creature[warrior]|mybattlefield) double strike ueot +text=Double strike -- Whenever Arashin Foremost enters the battlefield or attacks, another target Warrior creature you control gains double strike until end of turn. +mana={1}{W}{W} +type=Creature +subtype=Human Warrior +power=2 +toughness=2 +[/card] +[card] +name=Arashin Sovereign +abilities=flying +auto=@movedto(this|graveyard) from(mybattlefield):may name(put on top or bottom) transforms((,newability[choice name(Top of Library) moveto(ownerlibrary) ],newability[choice bottomoflibrary])) forever +text=Flying -- When Arashin Sovereign dies, you may put it on the top or bottom of its owner's library. +mana={5}{G}{W} +type=Creature +subtype=Dragon +power=6 +toughness=6 +[/card] +[card] name=Arbalest Elite auto={2}{W}{T}:damage:3 target(creature[attacking;blocking]) && all(this) frozen text={2}{W}, {T}: Arbalest Elite deals 3 damage to target attacking or blocking creature. Arbalest Elite doesn't untap during your next untap step. @@ -5394,6 +5509,28 @@ power=6 toughness=4 [/card] [card] +name=Atarka Efreet +facedown={3} +autofacedown={2}{R}:morph +autofaceup=counter(1/1,1) +autofaceup=damage:1 target(creature,player) +text=Megamorph {2}{R} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its megamorph cost and put a +1/+1 counter on it.) -- When Atarka Efreet is turned face up, it deals 1 damage to target creature or player. +mana={3}{R} +type=Creature +subtype=Efreet Shaman +power=5 +toughness=1 +[/card] +[card] +name=Atarka Monument +auto={T}:add{G} +auto={T}:add{R} +auto={4}{R}{G}:becomes(Artifact Creature Dragon,4/4,flying,red,green) ueot +text={T}: Add {R} or {G} to your mana pool. -- {4}{R}{G}: Atarka Monument becomes a 4/4 red and green Dragon artifact creature with flying until end of turn. +mana={3} +type=Artifact +[/card] +[card] name=Atog auto={S(artifact|myBattlefield)}:2/2 text=Sacrifice an artifact: Atog gets +2/+2 until end of turn. @@ -5906,6 +6043,17 @@ power=8 toughness=8 [/card] [card] +name=Avatar of the Resolute +abilities=reach,trample +auto=foreach(creature[counter{1/1.1}]|mybattlefield) counter(1/1,1) +text=Reach, trample -- Avatar of the Resolute enters the battlefield with a +1/+1 counter on it for each other creature you control with a +1/+1 counter on it. +mana={G}{G} +type=Creature +subtype=Avatar +power=3 +toughness=2 +[/card] +[card] name=Avatar of Will abilities=flying otherrestriction=type(*|opponenthand)~equalto~0 @@ -6129,6 +6277,20 @@ power=1 toughness=1 [/card] [card] +name=Aven Sunstriker +abilities=flying,double strike +facedown={3} +autofacedown={4}{W}:morph +autofaceup=counter(1/1,1) +text=Flying +Double strike (This creature deals both first-strike and regular combat damage.) -- Megamorph {4}{W} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its megamorph cost and put a +1/+1 counter on it.) +mana={1}{W}{W} +type=Creature +subtype=Bird Warrior +power=1 +toughness=1 +[/card] +[card] name=Aven Surveyor abilities=flying auto=choice name(+1/+1 counter) counter(1/1,1) @@ -6141,6 +6303,17 @@ power=2 toughness=2 [/card] [card] +name=Aven Tactician +abilities=flying +auto=ability$!name(Bolster) notatarget(creature[toughness=toughness:lowest:creature:mybattlefield]|mybattlefield) counter(1/1,1)!$ controller +text=Flying -- When Aven Tactician enters the battlefield, bolster 1. (Choose a creature with the least toughness among creatures you control and put a +1/+1 counter on it.) +mana={4}{W} +type=Creature +subtype=Bird Soldier +power=2 +toughness=3 +[/card] +[card] name=Aven Trailblazer abilities=flying auto=aslongas(forest|myBattlefield) 0/1 @@ -8280,6 +8453,20 @@ power=1 toughness=1 [/card] [card] +name=Belltoll Dragon +abilities=flying,opponentshroud +facedown={3} +autofacedown={5}{U}{U}:morph +autofaceup=counter(1/1,1) +autofaceup=counter(1/1,1) all(other creature[dragon]|mybattlefield) +text=Flying, hexproof -- Megamorph {5}{U}{U} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its megamorph cost and put a +1/+1 counter on it.) -- When Belltoll Dragon is turned face up, put a +1/+1 counter on each other Dragon creature you control. +mana={5}{U} +type=Creature +subtype=Dragon +power=3 +toughness=3 +[/card] +[card] name=Belltower Sphinx abilities=flying auto=@damaged(this) from(*|opponentbattlefield):deplete:thatmuch opponent @@ -8515,6 +8702,13 @@ power=4 toughness=4 [/card] [card] +name=Berserkers' Onslaught +auto=lord(creature[attacking]|mybattlefield) double strike +text=Attacking creatures you control have double strike. +mana={3}{R}{R} +type=Enchantment +[/card] +[card] name=Beseech the Queen auto=moveTo(myhand) notatarget(*[manacost<=type:land:mybattlefield]|mylibrary) text=({(2/b)} can be paid with any two mana or with {B}. This card's converted mana cost is 6.) -- Search your library for a card with converted mana cost less than or equal to the number of lands you control, reveal it, and put it into your hand. Then shuffle your library. @@ -9932,6 +10126,16 @@ power=2 toughness=2 [/card] [card] +name=Blood-Chin Fanatic +auto={1}{B}{S(other creature[warrior]|mybattlefield)}:target(player) life:-storedpower && life:storedpower controller +text={1}{B}, Sacrifice another Warrior creature: Target player loses X life and you gain X life, where X is the sacrificed creature's power. +mana={1}{B}{B} +type=Creature +subtype=Orc Warrior +power=3 +toughness=3 +[/card] +[card] name=Bloodbond March auto=lord(creature) transforms((,newability[if casted(this) then all(*[share!name!]|targetcontrollergraveyard) moveto(battlefield)])) forever text=Whenever a player casts a creature spell, each player returns all cards with the same name as that spell from his or her graveyard to the battlefield. @@ -10950,6 +11154,17 @@ power=5 toughness=5 [/card] [card] +name=Boltwing Marauder +abilities=flying +auto=@movedto(other creature|mybattlefield):target(creature) 2/0 ueot +text=Flying -- Whenever another creature enters the battlefield under your control, target creature gets +2/+0 until end of turn. +mana={3}{B}{R} +type=Creature +subtype=Dragon +power=5 +toughness=4 +[/card] +[card] name=Bomb Squad auto={T}:target(creature) counter(0/0,1,Fuse) auto=@each my upkeep:counter(0/0,1,Fuse) all(creature[counter{0/0.1.Fuse}]) @@ -13017,6 +13232,16 @@ type=Artifact subtype=Equipment [/card] [card] +name=Butcher's Glee +target=creature|battlefield +auto=3/0 ueot +auto=lifelink ueot +auto=regenerate +text=Target creature gets +3/+0 and gains lifelink until end of turn. Regenerate it. (Damage dealt by a creature with lifelink also causes its controller to gain that much life.) +mana={2}{B} +type=Instant +[/card] +[card] name=Cabal Archon auto={B}{S(cleric|myBattlefield)}:life:-2 target(player) && life:2 controller text={B}, Sacrifice a Cleric: Target player loses 2 life and you gain 2 life. @@ -15193,6 +15418,16 @@ power=3 toughness=3 [/card] [card] +name=Champion of Arashin +abilities=lifelink +text=Lifelink (Damage dealt by this creature also causes you to gain that much life.) +mana={3}{W} +type=Creature +subtype=Hound Warrior +power=3 +toughness=2 +[/card] +[card] name=Champion of the Parish auto=@movedTo(other creature[human]|mybattlefield):counter(1/1,1) text=Whenever another Human enters the battlefield under your control, put a +1/+1 counter on Champion of the Parish. @@ -16894,6 +17129,14 @@ power=0 toughness=0 [/card] [card] +name=Clone Legion +target=player +auto=clone all(creature|targetedpersonsbattlefield) +text=For each creature target player controls, put a token onto the battlefield that's a copy of that creature. +mana={7}{U}{U} +type=Sorcery +[/card] +[card] name=Close Quarters auto=@combat(blocked) source(creature|mybattlefield):damage:1 target(creature,player) text=Whenever a creature you control becomes blocked, Close Quarters deals 1 damage to target creature or player. @@ -17331,6 +17574,15 @@ power=1 toughness=1 [/card] [card] +name=Coat with Venom +target=creature|battlefield +auto=1/2 ueot +auto=deathtouch ueot +text=Target creature gets +1/+2 and gains deathtouch until end of turn. (Any amount of damage it deals to a creature is enough to destroy it.) +mana={B} +type=Instant +[/card] +[card] name=Cobalt Golem auto={1}{U}:flying text={1}{U}: Cobalt Golem gains flying until end of turn. @@ -17550,6 +17802,15 @@ power=5 toughness=5 [/card] [card] +name=Colossodon Yearling +text=null +mana={2}{G} +type=Creature +subtype=Beast +power=2 +toughness=4 +[/card] +[card] name=Colossus of Akros abilities=defender,indestructible auto=this(cantargetcard(*[-monstrous]) {10}:becomes(monstrous) forever && counter(1/1,10) && transforms((,newAbility[-defender],newability[trample])) forever @@ -17814,6 +18075,16 @@ mana={G}{G}{W} type=Instant [/card] [card] +name=Conifer Strider +abilities=opponentshroud +text=Hexproof (This creature can't be the target of spells or abilities your opponents control.) +mana={3}{G} +type=Creature +subtype=Elemental +power=5 +toughness=1 +[/card] +[card] name=Conjurer's Bauble auto={T}{S}:bottomoflibrary target(*|mygraveyard) && draw:1 controller text={T}, Sacrifice Conjurer's Bauble: Put up to one target card from your graveyard on the bottom of your library. Draw a card. @@ -18053,6 +18324,16 @@ text=Whenever a creature deals combat damage to you, that creature's controller type=Land [/card] [card] +name=Contradict +target=*|stack +auto=fizzle +auto=draw:1 controller +text=Counter target spell. +Draw a card. +mana={3}{U}{U} +type=Instant +[/card] +[card] name=Control Magic target=creature alias=1194 @@ -20088,6 +20369,17 @@ toughness=2 [/card] ###The 2 cards above should stay together (Flip Card)### [card] +name=Cunning Breezedancer +abilities=flying +auto=@movedto(*[-creature]|mystack):2/2 ueot +text=Flying -- Whenever you cast a noncreature spell, Cunning Breezedancer gets +2/+2 until end of turn. +mana={4}{W}{U} +type=Creature +subtype=Dragon +power=4 +toughness=4 +[/card] +[card] name=Cunning Giant auto=@combat(notblocked,turnlimited) source(this):may name(assign combat damage to a creature defending player controls) thisforeach(power>=1) damage:1 target(creature) && fog from(this) text=If Cunning Giant is unblocked, you may have it assign its combat damage to a creature defending player controls. @@ -20326,6 +20618,17 @@ mana={2} type=Artifact [/card] [card] +name=Custodian of the Trove +abilities=defender +auto=tap +text=Defender -- Custodian of the Trove enters the battlefield tapped. +mana={3} +type=Artifact Creature +subtype=Golem +power=2 +toughness=5 +[/card] +[card] name=Custody Battle target=creature text=Enchant creature -- Enchanted creature has "At the beginning of your upkeep, target opponent gains control of this creature unless you sacrifice a land." @@ -20645,6 +20948,15 @@ power=4 toughness=4 [/card] [card] +name=Damnable Pact +target=player +auto=draw:X targetedplayer +auto=life:-X targetedplayer +text=Target player draws X cards and loses X life. +mana={X}{B}{B} +type=Sorcery +[/card] +[card] name=Damnation auto=bury all(creature) text=Destroy all creatures. They can't be regenerated. @@ -20680,6 +20992,17 @@ type=Sorcery subtype=Arcane [/card] [card] +name=Dance of the Skywise +target=creature|mybattlefield +auto=ueot loseabilities +auto=flying ueot +auto=ueot transforms((,setpower=4,settoughness=4)) +auto=ueot transforms((Dragon Illusion,blue)) +text=Until end of turn, target creature you control becomes a blue Dragon Illusion with base power and toughness 4/4, loses all abilities, and gains flying. +mana={1}{U} +type=Instant +[/card] +[card] name=Dancing Scimitar abilities=flying text=Flying (This creature can't be blocked except by creatures with flying or reach.) @@ -21735,6 +22058,15 @@ power=1 toughness=2 [/card] [card] +name=Deadly Wanderings +auto=aslongas(creature|mybattlefield) lord(creature|mybattlefield) 2/0 <2 +auto=aslongas(creature|mybattlefield) lord(creature|mybattlefield) deathtouch <2 +auto=aslongas(creature|mybattlefield) lord(creature|mybattlefield) lifelink <2 +text=As long as you control exactly one creature, that creature gets +2/+0 and has deathtouch and lifelink. +mana={3}{B}{B} +type=Enchantment +[/card] +[card] name=Deadshot target=creature auto=tap @@ -22096,6 +22428,17 @@ power=3 toughness=4 [/card] [card] +name=Deathbringer Regent +abilities=flying +auto=if type(other creature|battlefield)~morethan~4 then destroy all(other creature|battlefield) +text=Flying -- When Deathbringer Regent enters the battlefield, if you cast it from your hand and there are five or more other creatures on the battlefield, destroy all other creatures. +mana={5}{B}{B} +type=Creature +subtype=Dragon +power=5 +toughness=6 +[/card] +[card] name=Deathbringer Thoctar text=Whenever another creature dies, you may put a +1/+1 counter on Deathbringer Thoctar. -- Remove a +1/+1 counter from Deathbringer Thoctar: Deathbringer Thoctar deals 1 damage to target creature or player. mana={4}{B}{R} @@ -22639,6 +22982,14 @@ type=Enchantment subtype=Aura [/card] [card] +name=Defeat +target=creature[power<=2]|battlefield +auto=destroy +text=Destroy target creature with power 2 or less. +mana={1}{B} +type=Sorcery +[/card] +[card] name=Defend the Hearth auto=preventAllcombatDamage controller ueot auto=preventAllcombatDamage opponent ueot @@ -23117,6 +23468,21 @@ mana={W} type=Instant [/card] [card] +name=Den Protector +abilities=strong +facedown={3} +autofacedown={1}{G}:morph +autofaceup=counter(1/1,1) +autofaceup=moveto(ownerhand) target(*|mygraveyard) +text=Creatures with power less than Den Protector's power can't block it. +Megamorph {1}{G} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its megamorph cost and put a +1/+1 counter on it.) -- When Den Protector is turned face up, return target card from your graveyard to your hand. +mana={1}{G} +type=Creature +subtype=Human Warrior +power=2 +toughness=1 +[/card] +[card] name=Denizen of the Deep auto=moveto(ownerHand) all(other creature|myBattlefield) text=When Denizen of the Deep enters the battlefield, return each other creature you control to its owner's hand. @@ -23213,6 +23579,15 @@ power=1 toughness=1 [/card] [card] +name=Descent of the Dragons +target=creature|battlefield +auto=token(Dragon,Creature Dragon,4/4,red,flying) targetcontroller +auto=destroy +text=Destroy any number of target creatures. For each creature destroyed this way, its controller puts a 4/4 red Dragon creature token with flying onto the battlefield. +mana={4}{R}{R} +type=Sorcery +[/card] +[card] name=Desecration Elemental abilities=fear auto=@movedto(*|stack):moveTo(ownergraveyard) notatarget(creature|myBattlefield) @@ -23995,6 +24370,19 @@ mana={2}{B} type=Sorcery [/card] [card] +name=Dirgur Nemesis +abilities=defender +facedown={3} +autofacedown={6}{U}:morph +autofaceup=counter(1/1,1) +text=Defender -- Megamorph {6}{U} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its megamorph cost and put a +1/+1 counter on it.) +mana={5}{U} +type=Creature +subtype=Serpent +power=6 +toughness=5 +[/card] +[card] name=Dirtcowl Wurm auto=@movedTo(land|opponentbattlefield) from(opponenthand):counter(1/1,1) text=Whenever an opponent plays a land, put a +1/+1 counter on Dirtcowl Wurm. @@ -25011,6 +25399,15 @@ mana={3} type=Artifact [/card] [card] +name=Draconic Roar +target=creature|battlefield +auto=damage:3 +auto=if type(dragon|mybattlefield)~morethan~0 then damage:3 targetcontroller else if type(dragon|myhand)~morethan~0 then damage:3 targetcontroller +text=As an additional cost to cast Draconic Roar, you may reveal a Dragon card from your hand. -- Draconic Roar deals 3 damage to target creature. If you revealed a Dragon card or controlled a Dragon as you cast Draconic Roar, Draconic Roar deals 3 damage to that creature's controller. +mana={1}{R} +type=Instant +[/card] +[card] name=Drag Down target=creature auto=aslongas(forest|myBattlefield) -1/-1 @@ -25226,6 +25623,14 @@ type=Enchantment subtype=Aura [/card] [card] +name=Dragon Tempest +auto=@movedto(creature[flying]|mybattlefield):all(trigger[to]) haste ueot +auto=@movedto(creature[dragon]|mybattlefield):all(trigger[to]) transforms((,newability[damage:type:dragon:mybattlefield target(creature;player)])) forever +text=Whenever a creature with flying enters the battlefield under your control, it gains haste until end of turn. -- Whenever a Dragon enters the battlefield under your control, it deals X damage to target creature or player, where X is the number of Dragons you control. +mana={1}{R} +type=Enchantment +[/card] +[card] name=Dragon Tyrant abilities=flying,trample,double strike auto=upcost[{R}{R}{R}{R}] sacrifice @@ -25301,6 +25706,16 @@ mana={2} type=Artifact [/card] [card] +name=Dragon's Eye Sentry +abilities=defender,first strike +text=Defender, first strike +mana={W} +type=Creature +subtype=Human Monk +power=1 +toughness=3 +[/card] +[card] name=Dragon's Herald auto={2}{R}{T}{S(creature[black]|myBattlefield)}{S(creature[red]|myBattlefield)}{S(creature[green]|myBattlefield)}:moveTo(mybattlefield) target(hellkite overlord|mylibrary) text={2}{R}, {T}, Sacrifice a black creature, a red creature, and a green creature: Search your library for a card named Hellkite Overlord and put it onto the battlefield. Then shuffle your library. @@ -25321,6 +25736,51 @@ power=5 toughness=6 [/card] [card] +name=Dragonloft Idol +auto=aslongas(dragon|mybattlefield) 1/1 +auto=aslongas(dragon|mybattlefield) flying +auto=aslongas(dragon|mybattlefield) trample +text=As long as you control a Dragon, Dragonloft Idol gets +1/+1 and has flying and trample. +mana={4} +type=Artifact Creature +subtype=Gargoyle +power=3 +toughness=3 +[/card] +[card] +name=Dragonlord Dromoka +abilities=nofizzle,flying,lifelink +auto=this(variable{controllerturn}) maxCast(*)0 opponent +text=Dragonlord Dromoka can't be countered. -- Flying, lifelink -- Your opponents can't cast spells during your turn. +mana={4}{G}{W} +type=Legendary Creature +subtype=Elder Dragon +power=5 +toughness=7 +[/card] +[card] +name=Dragonlord Kolaghan +abilities=flying,haste +auto=lord(other creature|mybattlefield) haste +auto=@movedto(*[creature;planeswalker]|opponentstack):all(trigger[to]) transforms((,newability[if type(*[share!name!]|mygraveyard)~morethan~0 then life:-10 controller])) oneshot +text=Flying, haste -- Other creatures you control have haste. -- Whenever an opponent casts a creature or planeswalker spell with the same name as a card in his or her graveyard, that player loses 10 life. +mana={4}{B}{R} +type=Legendary Creature +subtype=Elder Dragon +power=6 +toughness=5 +[/card] +[card] +name=Dragonlord's Servant +auto=lord(dragon|myhand) altercost(colorless, -1) +text=Dragon spells you cast cost {1} less to cast. +mana={1}{R} +type=Creature +subtype=Goblin Shaman +power=1 +toughness=3 +[/card] +[card] name=Dragonmaster Outcast auto=@each my upkeep restriction{type(land|myBattlefield)~morethan~5}:token(Dragon,creature dragon, 5/5,flying red) text=At the beginning of your upkeep, if you control six or more lands, put a 5/5 red Dragon creature token with flying onto the battlefield. @@ -26151,6 +26611,51 @@ power=5 toughness=5 [/card] [card] +name=Dromoka Captain +abilities=first strike +auto=@combat(attacking) source(this):ability$!name(Bolster) notatarget(creature[toughness=toughness:lowest:creature:mybattlefield]|mybattlefield) counter(1/1,1)!$ controller +text=First strike -- Whenever Dromoka Captain attacks, bolster 1. (Choose a creature with the least toughness among creatures you control and put a +1/+1 counter on it.) +mana={2}{W} +type=Creature +subtype=Human Soldier +power=1 +toughness=1 +[/card] +[card] +name=Dromoka Dunecaster +auto={1}{W}{T}:tap target(creature[-flying]|battlefield) +text={1}{W},{T}: Tap target creature without flying. +mana={W} +type=Creature +subtype=Human Wizard +power=0 +toughness=2 +[/card] +[card] +name=Dromoka Monument +auto={T}:add{G} +auto={T}:add{W} +auto={4}{G}{W}:becomes(Artifact Creature Dragon,4/4,flying,green,white) ueot +text={T}: Add {G} or {W} to your mana pool. -- {4}{G}{W}: Dromoka Monument becomes a 4/4 green and white Dragon artifact creature with flying until end of turn. +mana={3} +type=Artifact +[/card] +[card] +name=Dromoka Warrior +mana={1}{W} +type=Creature +subtype=Human Warrior +power=3 +toughness=1 +[/card] +[card] +name=Dromoka's Gift +auto=ability$!name(Bolster) notatarget(creature[toughness=toughness:lowest:creature:mybattlefield]|mybattlefield) counter(1/1,4)!$ controller +text=Bolster 4. (Choose a creature with the least toughness among creatures you control and put four +1/+1 counters on it.) +mana={4}{G} +type=Instant +[/card] +[card] name=Dromosaur auto=@combat(blocking,blocked,turnlimited) source(this):2/-2 ueot text=Whenever Dromosaur blocks or becomes blocked, it gets +2/-2 until end of turn. @@ -26822,6 +27327,16 @@ mana={1}{W}{W} type=Sorcery [/card] [card] +name=Dutiful Attendant +auto=@movedTo(this|graveyard) from(battlefield):moveTo(myhand) target(other creature|mygraveyard) +text=When Dutiful Attendant dies, return another target creature card from your graveyard to your hand. +mana={2}{B} +type=Creature +subtype=Human Warrior +power=1 +toughness=2 +[/card] +[card] name=Dutiful Return target=creature|mygraveyard auto=moveTo(ownerhand) @@ -27482,6 +27997,13 @@ power=2 toughness=2 [/card] [card] +name=Echoes of the Kin Tree +auto={2}{W}:ability$!name(Bolster) notatarget(creature[toughness=toughness:lowest:creature:mybattlefield]|mybattlefield) counter(1/1,1)!$ controller +text={2}{W}: Bolster 1. (Choose a creature with the least toughness among creatures you control and put a +1/+1 counter on it.) +mana={1}{W} +type=Enchantment +[/card] +[card] name=Echoing Calm target=enchantment auto=destroy @@ -28154,6 +28676,17 @@ power=0 toughness=4 [/card] [card] +name=Elusive Spellfist +auto=@movedto(*[-creature]|mystack):1/0 ueot +auto=@movedto(*[-creature]|mystack):unblockable ueot +text=Whenever you cast a noncreature spell, Elusive Spellfist gets +1/+0 until end of turn and can't be blocked this turn. +mana={1}{U} +type=Creature +subtype=Human Monk +power=1 +toughness=3 +[/card] +[card] name=Elven Cache target=*|myGraveyard auto=moveTo(myHand) @@ -28932,6 +29465,17 @@ power=3 toughness=5 [/card] [card] +name=Encase in Ice +abilities=flash +target=creature[red;green]|battlefield +auto=tap +auto=doesnotuntap +text=Flash (You may cast this spell any time you could cast an instant.) -- Enchant red or green creature -- When Encase in Ice enters the battlefield, tap enchanted creature. -- Enchanted creature doesn't untap during its controller's untap step. +mana={1}{U} +type=Enchantment +subtype=Aura +[/card] +[card] name=Enchanted Being auto=preventAllCombatDamage from(creature[enchanted]) to(this) text=Prevent all combat damage that would be dealt to Enchanted Being by enchanted creatures. @@ -29129,6 +29673,15 @@ mana={5}{W}{W} type=Sorcery [/card] [card] +name=Enduring Victory +target=creature[attacking;blocking]|battlefield +auto=destroy +auto=ability$!name(Bolster) notatarget(creature[toughness=toughness:lowest:creature:mybattlefield]|mybattlefield) counter(1/1,1)!$ controller +text=Destroy target attacking or blocking creature. Bolster 1. (Choose a creature with the least toughness among creatures you control and put a +1/+1 counter on it.) +mana={4}{W} +type=Instant +[/card] +[card] name=Enemy of the Guildpact auto=protection from(*[multicolor]) text=Protection from multicolored @@ -29523,6 +30076,16 @@ mana={4}{R} type=Sorcery [/card] [card] +name=Epic Confrontation +target=creature|mybattlefield +auto=1/2 ueot +auto=transforms((,newability[target(creature|opponentbattlefield) dynamicability])) ueot +restriction=type(creature|opponentbattlefield)~morethan~0 +text=Target creature you control gets +1/+2 until end of turn. It fights target creature you don't control. (Each deals damage equal to its power to the other.) +mana={1}{G} +type=Sorcery +[/card] +[card] name=Epic Proportions abilities=flash target=creature @@ -31612,6 +32175,14 @@ mana={2}{R} type=Instant [/card] [card] +name=Fate Forgotten +target=artifact,enchantment|battlefield +auto=moveto(exile) +text=Exile target artifact or enchantment. +mana={2}{W} +type=Instant +[/card] +[card] name=Fate Foretold target=creature auto=draw:1 controller @@ -33460,6 +34031,14 @@ mana={1}{U} type=Instant [/card] [card] +name=Flatten +target=creature|battlefield +auto=-4/-4 ueot +text=Target creature gets -4/-4 until end of turn. +mana={3}{B} +type=Instant +[/card] +[card] name=Flay target=player auto=discard:1 @@ -34898,6 +35477,24 @@ power=3 toughness=2 [/card] [card] +name=Foul-Tongue Invocation +target=player +auto=ability$!name(sacrifice a creature) notatarget(creature|mybattlefield) sacrifice!$ targetedplayer +auto=if type(dragon|mybattlefield)~morethan~0 then life:4 controller else if type(dragon|myhand)~morethan~0 then life:4 controller +text=As an additional cost to cast Foul-Tongue Invocation, you may reveal a Dragon card from your hand. -- Target player sacrifices a creature. If you revealed a Dragon card or controlled a Dragon as you cast Foul-Tongue Invocation, you gain 4 life. +mana={2}{B} +type=Instant +[/card] +[card] +name=Foul-Tongue Shriek +target=opponent +auto=life:-type:creature[attacking]:mybattlefield targetedplayer +auto=life:type:creature[attacking]:mybattlefield controller +text=Target opponent loses 1 life for each attacking creature you control. You gain that much life. +mana={B} +type=Instant +[/card] +[card] name=Foundry Champion auto=damage:type:creature:mybattlefield target(creature,player) auto={R}:1/0 ueot @@ -36221,6 +36818,16 @@ power=1 toughness=1 [/card] [card] +name=Gate Smasher +auto={3}:equip target(creature[toughness>=4]|mybattlefield) +auto=teach(creature) 3/0 +auto=teach(creature) trample +text=Gate Smasher can be attached only to a creature with toughness 4 or greater. -- Equipped creature gets +3/+0 and has trample. -- Equip {3} +mana={3} +type=Artifact +subtype=Equipment +[/card] +[card] name=Gate to Phyrexia auto={S(creature|myBattlefield)}:destroy target(artifact) limit:1 myUpkeepOnly text=Sacrifice a creature: Destroy target artifact. Activate this ability only during your upkeep and only once each turn. @@ -37711,6 +38318,16 @@ power=3 toughness=1 [/card] [card] +name=Glaring Aegis +target=creature|battlefield +auto=tap target(creature|opponentbattlefield) +auto=teach(creature) 1/3 +text=Enchant creature -- When Glaring Aegis enters the battlefield, tap target creature an opponent controls. -- Enchanted creature gets +1/+3. +mana={W} +type=Enchantment +subtype=Aura +[/card] +[card] name=Glaring Spotlight auto=lord(creature|opponentbattlefield) -opponentshroud auto={3}{S}:name(hexproof & unblockable) all(creature|mybattlefield) transforms((,opponentshroud,unblockable)) ueot @@ -37894,6 +38511,15 @@ mana={G} type=Sorcery [/card] [card] +name=Glint +target=creature|mybattlefield +auto=0/3 ueot +auto=opponentshroud ueot +text=Target creature you control gets +0/+3 and gains hexproof until end of turn. (It can't be the target of spells or abilities your opponents control.) +mana={1}{U} +type=Instant +[/card] +[card] name=Glint-Eye Nephilim auto=@combatdamaged(player) from(this):draw:thatmuch controller auto={1}{discard(*|myhand)}:1/1 @@ -39825,6 +40451,16 @@ power=4 toughness=4 [/card] [card] +name=Graceblade Artisan +auto=thisforeach(auras > 0) 2/2 +text=Graceblade Artisan gets +2/+2 for each Aura attached to it. +mana={2}{W} +type=Creature +subtype=Human Monk +power=2 +toughness=3 +[/card] +[card] name=Graceful Adept abilities=nomaxhand text=You have no maximum hand size. @@ -41487,6 +42123,19 @@ power=2 toughness=3 [/card] [card] +name=Guardian Shield-Bearer +facedown={3} +autofacedown={3}{G}:morph +autofaceup=counter(1/1,1) +autofaceup=counter(1/1,1) target(other creature|mybattlefield) +text=Megamorph {3}{G} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its megamorph cost and put a +1/+1 counter on it.) -- When Guardian Shield-Bearer is turned face up, put a +1/+1 counter on another target creature you control. +mana={1}{G} +type=Creature +subtype=Human Soldier +power=2 +toughness=1 +[/card] +[card] name=Guardian Zendikon target=land auto=becomes(Creature Wall,2/6,defender,white) @@ -41534,6 +42183,19 @@ mana={1}{W}{W} type=Instant [/card] [card] +name=Gudul Lurker +abilities=unblockable +facedown={3} +autofacedown={U}:morph +autofaceup=counter(1/1,1) +text=Gudul Lurker can't be blocked. -- Megamorph {U} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its megamorph cost and put a +1/+1 counter on it.) +mana={U} +type=Creature +subtype=Salamander +power=1 +toughness=1 +[/card] +[card] name=Guided Strike target=creature auto=1/0 @@ -42234,6 +42896,16 @@ power=2 toughness=6 [/card] [card] +name=Hand of Silumgar +abilities=deathtouch +text=Deathtouch (Any amount of damage this deals to a creature is enough to destroy it.) +mana={1}{B} +type=Creature +subtype=Human Warrior +power=2 +toughness=1 +[/card] +[card] name=Hand of the Praetors abilities=infect auto=lord(other creature[infect]|myBattlefield) 1/1 @@ -42312,6 +42984,18 @@ power=0 toughness=1 [/card] [card] +name=Harbinger of the Hunt +abilities=flying +auto={2}{R}:name(Damage non-flying) damage:1 all(creature[-flying]|battlefield) +auto={2}{G}:name(Damage Flying) damage:1 all(other creature[flying]|battlefield) +text=Flying -- {2}{R}: Harbinger of the Hunt deals 1 damage to each creature without flying. -- {2}{G}: Harbinger of the Hunt deals 1 damage to each other creature with flying. +mana={3}{R}{G} +type=Creature +subtype=Dragon +power=5 +toughness=3 +[/card] +[card] name=Harbinger of Night auto=@each my upkeep:all(creature) counter(-1/-1,1) text=At the beginning of your upkeep, put a -1/-1 counter on each creature. @@ -43747,6 +44431,31 @@ power=2 toughness=2 [/card] [card] +name=Herald of Dromoka +abilities=vigilance +auto=lord(other creature[warrior]|mybattlefield) vigilance +text=Vigilance -- Other Warrior creatures you control have vigilance. +mana={1}{W} +type=Creature +subtype=Human Warrior +power=2 +toughness=2 +[/card] +[card] +name=Herdchaser Dragon +abilities=flying,trample +facedown={3} +autofacedown={5}{G}{G}:morph +autofaceup=counter(1/1,1) +autofaceup=counter(1/1,1) all(other creature[dragon]|mybattlefield) +text=Flying, trample -- Megamorph {5}{G}{G} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its megamorph cost and put a +1/+1 counter on it.) -- When Herdchaser Dragon is turned face up, put a +1/+1 counter on each other Dragon creature you control. +mana={5}{G} +type=Creature +subtype=Dragon +power=3 +toughness=3 +[/card] +[card] name=Heritage Druid auto={T(elf|myBattlefield)}{T(elf|myBattlefield)}{T(elf|myBattlefield)}:Add{G}{G}{G} text=Tap three untapped Elves you control: Add {G}{G}{G} to your mana pool. @@ -43929,6 +44638,20 @@ mana={1}{G} type=Enchantment [/card] [card] +name=Hidden Dragonslayer +abilities=lifelink +facedown={3} +autofacedown={2}{W}:morph +autofaceup=counter(1/1,1) +autofaceup=destroy target(creature[power>=4]|opponentbattlefield) +text=Lifelink -- Megamorph {2}{W} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its megamorph cost and put a +1/+1 counter on it.) -- When Hidden Dragonslayer is turned face up, destroy target creature with power 4 or greater an opponent controls. +mana={1}{W} +type=Creature +subtype=Human Warrior +power=2 +toughness=1 +[/card] +[card] name=Hidden Gibbons auto=@movedto(instant|opponentstack) once:transforms((removetypes)) forever && transforms((Ape Creature,setpower=4,settoughness=4)) forever text=When an opponent casts an instant spell, if Hidden Gibbons is an enchantment, Hidden Gibbons becomes a 4/4 Ape creature. @@ -46356,6 +47079,13 @@ mana={X}{WB}{WB}{WB} type=Sorcery [/card] [card] +name=Impact Tremors +auto=@movedto(creature|mybattlefield):damage:1 all(opponent) +text=Whenever a creature enters the battlefield under your control, Impact Tremors deals 1 damage to each opponent. +mana={1}{R} +type=Enchantment +[/card] +[card] name=Impaler Shrike abilities=flying auto=@combatdamaged(player) from(this):may sacrifice all(this) && draw:3 @@ -47305,6 +48035,14 @@ power=2 toughness=2 [/card] [card] +name=Inspiring Call +auto=draw:type:creature[counter{1/1.1}]:mybattlefield +auto=all(creature[counter{1/1.1}]|mybattlefield) indestructible ueot +text=Draw a card for each creature you control with a +1/+1 counter on it. Those creatures gain indestructible until end of turn. (Damage and effects that say "destroy" don't destroy them.) +mana={2}{G} +type=Instant +[/card] +[card] name=Inspirit target=creature auto=untap @@ -51859,6 +52597,63 @@ power=4 toughness=5 [/card] [card] +name=Kolaghan Aspirant +auto=@combat(blocked) source(this) from(creature):all(trigger[from]) damage:1 +text=Whenever Kolaghan Aspirant becomes blocked by a creature, Kolaghan Aspirant deals 1 damage to that creature. +mana={1}{R} +type=Creature +subtype=Human Warrior +power=2 +toughness=1 +[/card] +[card] +name=Kolaghan Forerunners +abilities=trample +auto=foreach(creature|mybattlefield) 1/0 +other={R}{2} name(Dash) +auto=if paid(alternative) then transforms((,newability[haste],newability[phaseaction[endofturn sourceinplay] moveto(ownerhand) all(this)])) forever +text=Trample -- Kolaghan Forerunners's power is equal to the number of creatures you control. -- Dash {2}{R} (You may cast this spell for its dash cost. If you do, it gains haste, and it's returned from the battlefield to its owner's hand at the beginning of the next end step.) +mana={2}{R} +type=Creature +subtype=Human Berserker +power=* +toughness=3 +[/card] +[card] +name=Kolaghan Monument +auto={T}:add{B} +auto={T}:add{R} +auto={4}{B}{R}:becomes(Artifact Creature Dragon,4/4,flying,black,red) ueot +text={T}: Add {B} or {R} to your mana pool. -- {4}{B}{R}: Kolaghan Monument becomes a 4/4 black and red Dragon artifact creature with flying until end of turn. +mana={3} +type=Artifact +[/card] +[card] +name=Kolaghan Skirmisher +other={2}{B} name(Dash) +auto=if paid(alternative) then transforms((,newability[haste],newability[phaseaction[endofturn sourceinplay] moveto(ownerhand) all(this)])) forever +text=Dash {2}{B} (You may cast this spell for its dash cost. If you do, it gains haste, and it's returned from the battlefield to its owner's hand at the beginning of the next end step.) +mana={1}{B} +type=Creature +subtype=Human Warrior +power=2 +toughness=2 +[/card] +[card] +name=Kolaghan Stormsinger +abilities=haste +facedown={3} +autofacedown={R}:morph +autofaceup=counter(1/1,1) +autofaceup=target(creature|battlefield) haste ueot +text=Haste -- Megamorph {R} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its megamorph cost and put a +1/+1 counter on it.) -- When Kolaghan Stormsinger is turned face up, target creature gains haste until end of turn. +mana={R} +type=Creature +subtype=Human Shaman +power=1 +toughness=1 +[/card] +[card] name=Konda, Lord of Eiganjo abilities=vigilance,indestructible auto=bushido(5/5) @@ -53670,6 +54465,16 @@ power=2 toughness=1 [/card] [card] +name=Learn from the Past +target=player +auto=moveTo(ownerlibrary) and!(shuffle)! all(*|targetedpersonsgraveyard) +auto=draw:1 controller +text=Target player shuffles his or her graveyard into his or her library. +Draw a card. +mana={3}{U} +type=Instant +[/card] +[card] name=Leashling auto={s2l(*|myhand)}:moveTo(myhand) text=Put a card in your hand on top of your library: Return Leashling to its owner's hand. @@ -54389,6 +55194,18 @@ mana={R}{discard(other *|myhand)} type=Instant [/card] [card] +name=Lightning Berserker +other={R} name(Dash) +auto=if paid(alternative) then transforms((,newability[haste],newability[phaseaction[endofturn sourceinplay] moveto(ownerhand) all(this)])) forever +auto={R}:1/0 ueot +text={R}: Lightning Berserker gets +1/+0 until end of turn. -- Dash {R} (You may cast this spell for its dash cost. If you do, it gains haste, and it's returned from the battlefield to its owner's hand at the beginning of the next end step.) +mana={R} +type=Creature +subtype=Human Berserker +power=1 +toughness=1 +[/card] +[card] name=Lightning Blast target=creature,player auto=Damage:4 @@ -54601,6 +55418,16 @@ mana={3}{R} type=Instant [/card] [card] +name=Lightwalker +auto=this(counter{1/1.1}>0) flying +text=Lightwalker has flying as long as it has a +1/+1 counter on it. +mana={1}{W} +type=Creature +subtype=Human Warrior +power=2 +toughness=1 +[/card] +[card] name=Lightwielder Paladin abilities=first strike auto=@combatdamaged(player) from(this):may moveTo(exile) target(*[black;red]|opponentBattlefield) @@ -56585,6 +57412,13 @@ power=0 toughness=0 [/card] [card] +name=Magmatic Chasm +auto=all(creature[-flying]|battlefield) cantblock ueot +text=Creatures without flying can't block this turn. +mana={1}{R} +type=Sorcery +[/card] +[card] name=Magmaw auto={1}{S(*[-land]|myBattlefield)}:damage:1 target(creature,player) text={1}, Sacrifice a nonland permanent: Magmaw deals 1 damage to target creature or player. @@ -57421,6 +58255,19 @@ mana={2}{G} type=Sorcery [/card] [card] +name=Marang River Skeleton +facedown={3} +autofacedown={3}{B}:morph +autofaceup=counter(1/1,1) +auto={B}:regenerate +text={B}: Regenerate Marang River Skeleton. -- Megamorph {3}{B} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its megamorph cost and put a +1/+1 counter on it.) +mana={1}{B} +type=Creature +subtype=Skeleton +power=1 +toughness=1 +[/card] +[card] name=Marauding Knight abilities=protection from white auto=foreach(Plains|opponentBattlefield) 1/1 @@ -57985,6 +58832,18 @@ power=1 toughness=1 [/card] [card] +name=Marsh Hulk +facedown={3} +autofacedown={6}{B}:morph +autofaceup=counter(1/1,1) +text=Megamorph {6}{B} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its megamorph cost and put a +1/+1 counter on it.) +mana={4}{B}{B} +type=Creature +subtype=Zombie Ogre +power=4 +toughness=6 +[/card] +[card] name=Marsh Lurker auto={S(swamp|myBattlefield)}:fear text=Sacrifice a Swamp: Marsh Lurker gains fear until end of turn. (It can't be blocked except by artifact creatures and/or black creatures.) @@ -60352,6 +61211,16 @@ power=1 toughness=1 [/card] [card] +name=Minister of Pain +auto=may name(Exploit) sacrifice notatarget(creature|mybattlefield) && all(creature|opponentbattlefield) -1/-1 ueot +text=Exploit (When this creature enters the battlefield, you may sacrifice a creature.) -- When Minister of Pain exploits a creature, creatures your opponents control get -1/-1 until end of turn. +mana={2}{B} +type=Creature +subtype=Human Shaman +power=2 +toughness=3 +[/card] +[card] name=Minotaur Abomination text= mana={4}{B}{B} @@ -60989,6 +61858,19 @@ power=1 toughness=3 [/card] [card] +name=Misthoof Kirin +abilities=flying,vigilance +facedown={3} +autofacedown={1}{W}:morph +autofaceup=counter(1/1,1) +text=Flying, vigilance -- Megamorph {1}{W} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its megamorph cost and put a +1/+1 counter on it.) +mana={2}{W} +type=Creature +subtype=Kirin +power=2 +toughness=1 +[/card] +[card] name=Mistmeadow Skulk abilities=lifelink auto=protection from(*[manacost>=3]) @@ -61603,6 +62485,19 @@ power=0 toughness=5 [/card] [card] +name=Monastery Loremaster +facedown={3} +autofacedown={5}{U}:morph +autofaceup=counter(1/1,1) +autofaceup=moveto(myhand) target(*[-creature;-land]|mygraveyard) +text=Megamorph {5}{U} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its megamorph cost and put a +1/+1 counter on it.) -- When Monastery Loremaster is turned face up, return target noncreature, nonland card from your graveyard to your hand. +mana={3}{U} +type=Creature +subtype=Djinn Wizard +power=3 +toughness=2 +[/card] +[card] name=Monastery Mentor auto=@movedTo(*[-creature]|mystack):1/1 ueot auto=@movedTo(*[-creature]|mystack):choice name(Create Monk) token(-391883) controller @@ -63197,6 +64092,16 @@ mana={4}{U} type=Instant [/card] [card] +name=Myth Realized +auto=@movedto(*[-creature]|mystack):counter(0/0,1,lore) +auto={2}{W}:counter(0/0,1,lore) +auto=counter{0%0.1.lore}/counter{0%0.1.lore} nonstatic +auto={W}:transforms((Monk Avatar Creature,setpower=counter{0%0.1.lore},settoughness=counter{0%0.1.lore})) ueot +text=Whenever you cast a noncreature spell, put a lore counter on Myth Realized. -- {2}{W}: Put a lore counter on Myth Realized. -- {W}: Until end of turn, Myth Realized becomes a Monk Avatar creature in addition to its other types and gains "This creature's power and toughness are each equal to the number of lore counters on it." +mana={W} +type=Enchantment +[/card] +[card] name=Mystic Compass auto={1}{T}:ueot name(land becomes a plains) loseabilities && losesubtypesof(land) && transforms((plains)) target(land) auto={1}{T}:ueot name(land becomes an island) loseabilities && losesubtypesof(land) && transforms((island)) target(land) @@ -63270,6 +64175,14 @@ text={T}: Add {1} to your mana pool. -- {(w/u)}, {T}: Add {W}{W}, {W}{U}, or {U} type=Land [/card] [card] +name=Mystic Meditation +auto=draw:3 +auto=transforms((,newability[choice name(discard 2 cards) reject target(<2>*|myhand)],newability[aslongas(creature|myHand) choice name(discard a creature card) reject target(creature|myhand)])) +text=Draw three cards. Then discard two cards unless you discard a creature card. +mana={3}{U} +type=Sorcery +[/card] +[card] name=Mystic Melting target=artifact,enchantment auto=destroy @@ -64023,6 +64936,17 @@ type=Enchantment subtype=Aura [/card] [card] +name=Necromaster Dragon +abilities=flying +auto=@combatdamaged(player) from(this):pay({2}) token(Zombie,Creature Zombie,2/2,black) controller && deplete:2 all(opponent) +text=Flying -- Whenever Necromaster Dragon deals combat damage to a player, you may pay {2}. If you do, put a 2/2 black Zombie creature token onto the battlefield and each opponent puts the top two cards of his or her library into his or her graveyard. +mana={3}{U}{B} +type=Creature +subtype=Dragon +power=4 +toughness=4 +[/card] +[card] name=Necropede abilities=infect auto=@movedTo(this|graveyard) from(battlefield):may counter(-1/-1) target(creature) @@ -66521,6 +67445,40 @@ power=5 toughness=6 [/card] [card] +name=Ojutai Exemplars +auto=@movedto(*[-creature]|mystack):choice name(Tap target creature) tap target(creature|battlefield) +auto=@movedto(*[-creature]|mystack):choice name(First Strike and Lifelink) transforms((,newability[first strike ueot],newability[lifelink ueot])) ueot +auto=@movedto(*[-creature]|mystack):choice name(Exile and returned tapped) moveto(exile) and!( transforms((,newability[moveto(ownerbattlefield) and!(tap)!])) forever)! +text=Whenever you cast a noncreature spell, choose one — -- • Tap target creature. -- • Ojutai Exemplars gains first strike and lifelink until end of turn. -- • Exile Ojutai Exemplars, then return it to the battlefield tapped under its owner's control. +mana={2}{W}{W} +type=Creature +subtype=Human Monk +power=4 +toughness=4 +[/card] +[card] +name=Ojutai Interceptor +abilities=flying +facedown={3} +autofacedown={3}{U}:morph +autofaceup=counter(1/1,1) +text=Flying -- Megamorph {3}{U} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its megamorph cost and put a +1/+1 counter on it.) +mana={3}{U} +type=Creature +subtype=Bird Soldier +power=3 +toughness=1 +[/card] +[card] +name=Ojutai Monument +auto={T}:add{W} +auto={T}:add{U} +auto={4}{W}{U}:becomes(Artifact Creature Dragon,4/4,flying,white,blue) ueot +text={T}: Add {W} or {U} to your mana pool. -- {4}{W}{U}: Ojutai Monument becomes a 4/4 white and blue Dragon artifact creature with flying until end of turn. +mana={3} +type=Artifact +[/card] +[card] name=Okiba-Gang Shinobi auto=@combatdamaged(opponent) from(this):ability$!name(discard 2 cards) target(<2>*|myhand) reject!$ opponent autohand={3}{B}{N}:ninjutsu @@ -67001,6 +67959,17 @@ power=1 toughness=1 [/card] [card] +name=Orator of Ojutai +abilities=defender,flying +auto=if type(dragon|mybattlefield)~morethan~0 then choice draw:1 controller else if type(dragon|myhand)~morethan~0 then choice draw:1 controller +text=As an additional cost to cast Orator of Ojutai, you may reveal a Dragon card from your hand. -- Defender, flying -- When Orator of Ojutai enters the battlefield, if you revealed a Dragon card or controlled a Dragon as you cast Orator of Ojutai, draw a card. +mana={1}{W} +type=Creature +subtype=Bird Monk +power=0 +toughness=4 +[/card] +[card] name=Oraxid abilities=Protection from red text=Protection from red @@ -68070,6 +69039,17 @@ power=5 toughness=4 [/card] [card] +name=Palace Familiar +abilities=flying +auto=@movedto(this|graveyard) from(mybattlefield):draw:1 +text=Flying -- When Palace Familiar dies, draw a card. +mana={1}{U} +type=Creature +subtype=Bird +power=1 +toughness=1 +[/card] +[card] name=Palace Siege auto=choice name(Khans) transforms((,newability[counter(0/0.1.Khans)],newability[@each my upkeep:moveto(myhand) target(creature|mygraveyard)])) forever auto=choice name(Dragons) transforms((,newability[counter(0/0.1.Dragons)],newability[@each my upkeep:life:-2 opponent && life:2 controller])) forever @@ -70453,6 +71433,15 @@ text={T}: Add {1} to your mana pool. -- {T}: Add {R} or {G} to your mana pool. P type=Land [/card] [card] +name=Pinion Feast +target=creature[flying]|battlefield +auto=destroy +auto=abliity$!name(Bolster) notatarget(creature[toughness=toughness:lowest:creature:mybattlefield]|mybattlefield) counter(1/1,2)!$ controller +text=Destroy target creature with flying. Bolster 2. (Choose a creature with the least toughness among creatures you control and put two +1/+1 counters on it.) +mana={4}{G} +type=Instant +[/card] +[card] name=Pinnacle of Rage target=<2>creature,player auto=damage:3 @@ -70639,6 +71628,18 @@ power=2 toughness=4 [/card] [card] +name=Pitiless Horde +other={2}{B}{B} name(Dash) +auto=@each my upkeep:life:-2 controller +auto=if paid(alternative) then transforms((,newability[haste],newability[phaseaction[endofturn sourceinplay] moveto(ownerhand) all(this)])) forever +text=At the beginning of your upkeep, you lose 2 life. -- Dash {2}{B}{B} (You may cast this spell for its dash cost. If you do, it gains haste, and it's returned from the battlefield to its owner's hand at the beginning of the next end step.) +mana={2}{B} +type=Creature +subtype=Orc Berserker +power=5 +toughness=3 +[/card] +[card] name=Pixie Queen abilities=flying auto={G}{G}{G}{T}:flying target(creature) @@ -71629,6 +72630,15 @@ mana={2}{W}{W} type=Sorcery [/card] [card] +name=Press the Advantage +target=creature|battlefield +auto=2/2 ueot +auto=trample ueot +text=Up to two target creatures each get +2/+2 and gain trample until end of turn. +mana={2}{G}{G} +type=Instant +[/card] +[card] name=Pressure Point target=creature auto=tap @@ -72157,6 +73167,18 @@ power=4 toughness=4 [/card] [card] +name=Pristine Skywise +abilities=flying +auto=@movedto(*[-creature]|mystack):activatechooseacolor protection from(*[chosencolor]) ueot activatechooseend +auto=@movedto(*[-creature]|mystack):untap +text=Flying -- Whenever you cast a noncreature spell, untap Pristine Skywise. It gains protection from the color of your choice until end of turn. +mana={4}{W}{U} +type=Creature +subtype=Dragon +power=6 +toughness=4 +[/card] +[card] name=Pristine Talisman auto={T}:add{1} && life:1 text={T}: Add {1} to your mana pool.You gain 1 life. @@ -73163,6 +74185,27 @@ power=3 toughness=2 [/card] [card] +name=Qal Sisma Behemoth +auto=@combat(attacking) source(this):pay({2}) donothing?removefromcombat && untap +auto=@combat(blocking) source(this):pay({2}) donothing?removefromcombat && untap +text=Qal Sisma Behemoth can't attack or block unless you pay {2}. +mana={2}{R} +type=Creature +subtype=Ogre Warrior +power=5 +toughness=5 +[/card] +[card] +name=Qarsi Sadist +auto=may name(Exploit) sacrifice notatarget(creature|mybattlefield) && transforms((,newability[target(opponent) life:-2],newability[life:2 controller])) forever +text=Exploit (When this creature enters the battlefield, you may sacrifice a creature.) -- When Qarsi Sadist exploits a creature, target opponent loses 2 life and you gain 2 life. +mana={1}{B} +type=Creature +subtype=Human Cleric +power=1 +toughness=3 +[/card] +[card] name=Qasali Pridemage abilities=exalted auto={1}{S}:destroy target(artifact,enchantment) @@ -73676,6 +74719,14 @@ power=3 toughness=3 [/card] [card] +name=Radiant Purge +auto=choice name(creature) moveto(exile) target(creature[multicolor]|battlefield) restriction{type(creature[multicolor]|battlefield)~morethan~0} +auto=choice name(enchantment) moveto(exile) target(enchantment[multicolor]|battlefield) restriction{type(enchantment[multicolor]|battlefield)~morethan~0} +text=Exile target multicolored creature or multicolored enchantment. +mana={1}{W} +type=Instant +[/card] +[card] name=Radiant's Dragoons auto=life:5 auto=upcost[{3}{W};next upkeep] sacrifice @@ -74298,6 +75349,16 @@ power=3 toughness=4 [/card] [card] +name=Rakshasa Gravecaller +auto=may name(Exploit) sacrifice notatarget(creature|mybattlefield) && token(Zombie,Creature Zombie,2/2,black)*2 +text=Exploit (When this creature enters the battlefield, you may sacrifice a creature.) -- When Rakshasa Gravecaller exploits a creature, put two 2/2 black Zombie creature tokens onto the battlefield. +mana={4}{B} +type=Creature +subtype=Cat Demon +power=3 +toughness=6 +[/card] +[card] name=Rakshasa Deathdealer auto={B}{G}:2/2 ueot auto={B}{G}:regenerate @@ -75495,6 +76556,18 @@ power=2 toughness=2 [/card] [card] +name=Reckless Imp +abilities=flying,cantblock +other={1}{B} name(Dash) +auto=if paid(alternative) then transforms((,newability[haste],newability[phaseaction[endofturn sourceinplay] moveto(ownerhand) all(this)])) forever +text=Flying -- Reckless Imp can't block. -- Dash {1}{B} (You may cast this spell for its dash cost. If you do, it gains haste, and it's returned from the battlefield to its owner's hand at the beginning of the next end step.) +mana={2}{B} +type=Creature +subtype=Imp +power=2 +toughness=2 +[/card] +[card] name=Reckless Ogre auto=@combat(attackedalone) source(this):3/0 ueot text=Whenever Reckless Ogre attacks alone, it gets +3/+0 until end of turn. @@ -75725,6 +76798,15 @@ mana={1}{W} type=Instant [/card] [card] +name=Reduce in Stature +target=creature|battlefield +auto=teach(creature) becomes(0/2) +text=Enchant creature -- Enchanted creature has base power and toughness 0/2. +mana={2}{U} +type=Enchantment +subtype=Aura +[/card] +[card] name=Reduce to Dreams auto=moveto(ownerhand) all(artifact,enchantment) text=Return all artifacts and enchantments to their owners' hands. @@ -76187,6 +77269,16 @@ type=Instant subtype=Arcane [/card] [card] +name=Rending Volley +abilities=nofizzle +target=creature[white;blue]|battlefield +auto=damage:4 +text=Rending Volley can't be countered by spells or abilities. +Rending Volley deals 4 damage to target white or blue creature. +mana={R} +type=Instant +[/card] +[card] name=Render Silent target=*|stack auto=fizzle @@ -76536,6 +77628,14 @@ power=2 toughness=2 [/card] [card] +name=Resupply +auto=life:6 +auto=draw:1 +text=You gain 6 life. -- Draw a card. +mana={5}{W} +type=Instant +[/card] +[card] name=Rest for the Weary target=player auto=life:4 @@ -78035,6 +79135,14 @@ power=6 toughness=4 [/card] [card] +name=Roast +target=creature[-flying]|battlefield +auto=damage:5 +text=Roast deals 5 damage to target creature without flying. +mana={1}{R} +type=Sorcery +[/card] +[card] name=Robber Fly abilities=flying auto=@combat(blocked,turnlimited) source(this):all(*|opponenthand) transforms((,newability[reject],newability[draw:1])) ueot @@ -79397,6 +80505,17 @@ power=2 toughness=1 [/card] [card] +name=Ruthless Deathfang +abilities=flying +auto=@sacrificed(creature|mybattlefield):target(opponent) ability$!sacrifice notatarget(creature|mybattlefield)!$ targetedplayer +text=Flying -- Whenever you sacrifice a creature, target opponent sacrifices a creature. +mana={4}{U}{B} +type=Creature +subtype=Dragon +power=4 +toughness=4 +[/card] +[card] name=Ruthless Instincts auto=choice name(reach and deathtouch) target(creature[-attacking]) transforms((,newability[reach ueot],newability[deathtouch ueot],newability[untap])) ueot auto=choice name(+2/+2 and Trample) target(creature[attacking]) transforms((,newability[2/2 ueot],newability[trample ueot])) ueot @@ -79889,6 +81008,17 @@ power=2 toughness=5 [/card] [card] +name=Salt Road Quartermasters +auto=counter(1/1,2) +auto={2}{G}{C(1/1,-1)}:counter(1/1,1) target(creature|battlefield) +text=Salt Road Quartermasters enters the battlefield with two +1/+1 counters on it. -- {2}{G}, Remove a +1/+1 counter from Salt Road Quartermasters: Put a +1/+1 counter on target creature. +mana={2}{G} +type=Creature +subtype=Human Soldier +power=1 +toughness=1 +[/card] +[card] name=Saltskitter auto=@movedTo(other creature|battlefield):(blink)ueot text=Whenever another creature enters the battlefield, exile Saltskitter. Return Saltskitter to the battlefield under its owner's control at the beginning of the next end step. @@ -80140,6 +81270,16 @@ mana={2}{W} type=Instant [/card] [card] +name=Sandcrafter Mage +auto=ability$!name(Bolster) notatarget(creature[toughness=toughness:lowest:creature:mybattlefield]|mybattlefield) counter(1/1,1)!$ controller +text=When Sandcrafter Mage enters the battlefield, bolster 1. (Choose a creature with the least toughness among creatures you control and put a +1/+1 counter on it.) +mana={2}{W} +type=Creature +subtype=Human Wizard +power=2 +toughness=2 +[/card] +[card] name=Sands of Delirium auto={x}{T}:deplete:x target(player) text={X}, {T}: Target player puts the top X cards of his or her library into his or her graveyard. @@ -80198,6 +81338,16 @@ power=2 toughness=1 [/card] [card] +name=Sandsteppe Scavenger +auto=ability$!name(Bolster) notatarget(creature[toughness=toughness:lowest:creature:mybattlefield]|mybattlefield) counter(1/1,2)!$ controller +text=When Sandsteppe Scavenger enters the battlefield, bolster 2. (Choose a creature with the least toughness among creatures you control and put two +1/+1 counters on it.) +mana={4}{G} +type=Creature +subtype=Hound Scout +power=2 +toughness=2 +[/card] +[card] name=Sandstone Deadfall auto={T}{S(land|myBattlefield)}{S(land|myBattlefield)}{S}:destroy target(creature[attacking]) text={T}, Sacrifice two lands and Sandstone Deadfall: Destroy target attacking creature. @@ -80233,6 +81383,18 @@ mana={G} type=Instant [/card] [card] +name=Sandstorm Charger +facedown={3} +autofacedown={4}{W}:morph +autofaceup=counter(1/1,1) +text=Megamorph {4}{W} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its megamorph cost and put a +1/+1 counter on it.) +mana={4}{W} +type=Creature +subtype=Beast +power=3 +toughness=4 +[/card] +[card] name=Sandstorm Eidolon auto={R}{S}:cantblock target(creature) autograveyard=@movedTo(*[multicolor]|mystack):may moveTo(myhand) @@ -80501,6 +81663,33 @@ type=Planeswalker subtype=Sarkhan [/card] [card] +name=Sarkhan Unbroken +auto=counter(0/0,9,Loyalty) +auto={C(0/0,1,Loyalty)}:name(+1: Draw card add mana) draw:1 controller && transforms((,newability[activatechooseacolor add{chosencolor} activatechooseend])) forever asSorcery +auto={C(0/0,-2,Loyalty)}:name(-2: 4/4 dragon token) token(Dragon,creature dragon,4/4,flying,red) controller asSorcery +auto={C(0/0,-8,Loyalty)}:name(-8: Search for any number of dragons) moveto(mybattlefield) notatarget(creature[dragon]|mylibrary) asSorcery +text=+1: Draw a card, then add one mana of any color to your mana pool. -- -2: Put a 4/4 red Dragon creature token with flying onto the battlefield. -- -8: Search your library for any number of Dragon creature cards and put them onto the battlefield. Then shuffle your library. -- Starting Loyalty (4) +mana={2}{G}{U}{R} +type=Planeswalker +subtype=Sarkhan +[/card] +[card] +name=Sarkhan's Rage +target=creature,player|battlefield +auto=damage:5 +auto=if type(dragon|mybattlefield)~lessthan~1 then damage:2 controller +text=Sarkhan's Rage deals 5 damage to target creature or player. If you control no Dragons, Sarkhan's Rage deals 2 damage to you. +mana={4}{R} +type=Instant +[/card] +[card] +name=Sarkhan's Triumph +auto=moveto(myhand) notatarget(creature[dragon]|mylibrary) +text=Search your library for a Dragon creature card, reveal it, put it into your hand, then shuffle your library. +mana={2}{R} +type=Instant +[/card] +[card] name=Sarpadian Empires, Vol. VII auto=choice name(white citizen) counter(0/0,1,White Citizen) all(this) auto=choice name(blue camarid) counter(0/0,1,Blue Camarid) all(this) @@ -80966,6 +82155,13 @@ power=7 toughness=6 [/card] [card] +name=Scale Blessing +auto=name(Bolster) notatarget(creature[toughness=toughness:lowest:creature:mybattlefield]|mybattlefield) transforms((,newability[counter(1/1.2)],newability[counter(1/1.1) all(other creature[counter{1/1.1}]|mybattlefield)])) forever +text=Bolster 1, then put a +1/+1 counter on each creature you control with a +1/+1 counter on it. (To bolster 1, choose a creature with the least toughness among creatures you control and put a +1/+1 counter on it.) +mana={3}{W} +type=Instant +[/card] +[card] name=Scale of Chiss-Goria abilities=affinityartifacts,flash auto={T}:0/1 target(creature) @@ -80974,6 +82170,16 @@ mana={3} type=Artifact [/card] [card] +name=Scaleguard Sentinels +auto=if type(dragon|mybattlefield)~morethan~0 then counter(1/1,1) else if type(dragon|myhand)~morethan~0 then counter(1/1,1) +text=As an additional cost to cast Scaleguard Sentinels, you may reveal a Dragon card from your hand. -- Scaleguard Sentinels enters the battlefield with a +1/+1 counter on it if you revealed a Dragon card or controlled a Dragon as you cast Scaleguard Sentinels. +mana={G}{G} +type=Creature +subtype=Human Soldier +power=2 +toughness=3 +[/card] +[card] name=Scapegoat target=creature|mybattlefield auto=moveTo(ownerhand) @@ -81299,6 +82505,16 @@ power=* toughness=* [/card] [card] +name=Scion of Ugin +abilities=flying +text=Flying +mana={6} +type=Creature +subtype=Dragon Spirit +power=4 +toughness=4 +[/card] +[card] name=Scion of Vitu-Ghazi auto=if casted(this) then token(Bird,Creature Bird,1/1,flying,white) auto=if casted(this) then ability$! name(populate) clone notatarget(creature[token]|mybattlefield) !$ controller @@ -81701,6 +82917,17 @@ power=2 toughness=2 [/card] [card] +name=Screamreach Brawler +other={1}{R} name(Dash) +auto=if paid(alternative) then transforms((,newability[haste],newability[phaseaction[endofturn sourceinplay] moveto(ownerhand) all(this)])) forever +text=Dash {1}{R} (You may cast this spell for its dash cost. If you do, it gains haste, and it's returned from the battlefield to its owner's hand at the beginning of the next end step.) +mana={2}{R} +type=Creature +subtype=Orc Berserker +power=2 +toughness=3 +[/card] +[card] name=Screams of the Damned auto={1}{B}{E(*|mygraveyard)}:damage:1 all(creature,player) text={1}{B}, Exile a card from your graveyard: Screams of the Damned deals 1 damage to each creature and each player. @@ -82449,6 +83676,13 @@ mana={2}{U} type=Enchantment [/card] [card] +name=Secure the Wastes +auto=token(Warrior,Creature Warrior,1/1,white)*X +text=Put X 1/1 white Warrior creature tokens onto the battlefield. +mana={X}{W} +type=Instant +[/card] +[card] name=Security Blockade target=land auto=teach(land) transforms((,newability[{T}:prevent:1 controller])) @@ -82679,6 +83913,18 @@ mana={2}{R} type=Instant [/card] [card] +name=Segmented Krotiq +facedown={3} +autofacedown={6}{G}:morph +autofaceup=counter(1/1,1) +text=Megamorph {6}{G} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its megamorph cost and put a +1/+1 counter on it.) +mana={5}{G} +type=Creature +subtype=Insect +power=6 +toughness=5 +[/card] +[card] name=Segmented Wurm auto=@targeted(this):counter(-1/-1,1) text=Whenever Segmented Wurm becomes the target of a spell or ability, put a -1/-1 counter on it. @@ -82716,6 +83962,13 @@ power=1 toughness=1 [/card] [card] +name=Seismic Rupture +auto=damage:2 all(creature[-flying]|battlefield) +text=Seismic Rupture deals 2 damage to each creature without flying. +mana={2}{R} +type=Sorcery +[/card] +[card] name=Seismic Shudder auto=damage:1 all(creature[-flying]) text=Seismic Shudder deals 1 damage to each creature without flying. @@ -83539,6 +84792,17 @@ power=3 toughness=1 [/card] [card] +name=Servant of the Scale +auto=counter(1/1,1) +auto=@movedTo(this|mygraveyard) from(myBattlefield):choice thisforeach(counter{1/1.1}) counter(1/1,1) target(creature|mybattlefield) +text=Servant of the Scale enters the battlefield with a +1/+1 counter on it. -- When Servant of the Scale dies, put X +1/+1 counters on target creature you control, where X is the number of +1/+1 counters on Servant of the Scale. +mana={G} +type=Creature +subtype=Human Soldier +power=0 +toughness=0 +[/card] +[card] name=Servant of Tymaret auto=@untapped(this):life:-1 opponent && life:1 controller auto={2}{B}:regenerate @@ -83949,6 +85213,16 @@ power=2 toughness=1 [/card] [card] +name=Shambling Goblin +auto=@movedTo(this|graveyard) from(battlefield):-1/-1 target(creature|opponentbattlefield) ueot +text=When Shambling Goblin dies, target creature an opponent controls gets -1/-1 until end of turn. +mana={B} +type=Creature +subtype=Zombie Goblin +power=1 +toughness=1 +[/card] +[card] name=Shambling Remains abilities=cantblock autograveyard={B}{R}:moveto(mybattlefield) && transforms((,unearth,haste)) asSorcery forever @@ -83991,6 +85265,15 @@ power=1 toughness=1 [/card] [card] +name=Shape the Sands +target=creature|battlefield +auto=0/5 ueot +auto=reach ueot +text=Target creature gets +0/+5 and gains reach until end of turn. (It can block creatures with flying.) +mana={G} +type=Instant +[/card] +[card] name=Shaper Guildmage auto={W}{T}:first strike target(creature) auto={B}{T}:1/0 target(creature) @@ -84201,6 +85484,19 @@ mana={1}{W} type=Instant [/card] [card] +name=Sheltered Aerie +target=land|battlefield +auto=teach(land) {T}:add{G}{G} +auto=teach(land) {T}:add{W}{W} +auto=teach(land) {T}:add{U}{U} +auto=teach(land) {T}:add{R}{R} +auto=teach(land) {T}:add{B}{B} +text=Enchant land -- Enchanted land has "{T}: Add two mana of any one color to your mana pool." +mana={2}{G} +type=Enchantment +subtype=Aura +[/card] +[card] name=Sheltered Valley auto=sacrifice all(other sheltered valley|mybattlefield) auto={T}:Add{1} @@ -84355,6 +85651,20 @@ mana={W} type=Instant [/card] [card] +name=Shieldhide Dragon +abilities=flying,lifelink +facedown={3} +autofacedown={5}{W}{W}:morph +autofaceup=counter(1/1,1) +autofaceup=counter(1/1,1) all(other creature[dragon]|mybattlefield) +text=Flying, lifelink -- Megamorph {5}{W}{W} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its megamorph cost and put a +1/+1 counter on it.) -- When Shieldhide Dragon is turned face up, put a +1/+1 counter on each other Dragon creature you control. +mana={5}{W} +type=Creature +subtype=Dragon +power=3 +toughness=3 +[/card] +[card] name=Shielding Plax target=creature auto=opponentshroud @@ -85256,6 +86566,16 @@ power=2 toughness=6 [/card] [card] +name=Sibsig Icebreakers +auto=transforms((,newability[ability$!name(discard) notatarget(*|myhand) reject!$ controller],newability[ability$!name(discard) notatarget(*|myhand) reject!$ opponent])) ueot +text=When Sibsig Icebreakers enters the battlefield, each player discards a card. +mana={2}{B} +type=Creature +subtype=Zombie +power=2 +toughness=3 +[/card] +[card] name=Sick and Tired target=<2>creature auto=-1/-1 @@ -85327,6 +86647,27 @@ power=1 toughness=1 [/card] [card] +name=Sidisi, Undead Vizier +abilities=deathtouch +auto=may name(Exploit) sacrifice notatarget(creature|mybattlefield) && transforms((,newability[moveto(myhand) notatarget(*|mylibrary)])) forever +text=Deathtouch -- Exploit (When this creature enters the battlefield, you may sacrifice a creature.) -- When Sidisi, Undead Vizier exploits a creature, you may search your library for a card, put it into your hand, then shuffle your library. +mana={3}{B}{B} +type=Legendary Creature +subtype=Zombie Naga +power=4 +toughness=6 +[/card] +[card] +name=Sidisi's Faithful +auto=may name(Exploit) sacrifice notatarget(creature|mybattlefield) && transforms((,newability[moveto(myhand) target(creature|battlefield)])) forever +text=Exploit (When this creature enters the battlefield, you may sacrifice a creature.) -- When Sidisi's Faithful exploits a creature, return target creature to its owner's hand. +mana={U} +type=Creature +subtype=Naga Wizard +power=0 +toughness=4 +[/card] +[card] name=Sidisi's Pet abilities=Lifelink facedown={3} @@ -85397,6 +86738,13 @@ type=Instant subtype=Arcane [/card] [card] +name=Sight of the Scalelords +auto=@each my combatbegins restriction{type(creature[toughness>=4]|mybattlefield)~morethan~0}:all(creature[toughness>=4]|mybattlefield) transforms((,newability[2/2 ueot],newability[vigilance ueot])) ueot +text=At the beginning of combat on your turn, creatures you control with toughness 4 or greater get +2/+2 and gain vigilance until end of turn. +mana={4}{G} +type=Enchantment +[/card] +[card] name=Sighted-Caste Sorcerer abilities=exalted auto={U}:shroud @@ -85704,6 +87052,13 @@ power=2 toughness=1 [/card] [card] +name=Silkwrap +auto=(blink)forsrc target(creature[manacost<=3]|opponentbattlefield) +text=When Silkwrap enters the battlefield, exile target creature with converted mana cost 3 or less an opponent controls until Silkwrap leaves the battlefield. (That creature returns under its owner's control.) +mana={1}{W} +type=Enchantment +[/card] +[card] name=Silt Crawler auto=tap all(land|myBattlefield) text=When Silt Crawler enters the battlefield, tap all lands you control. @@ -85725,6 +87080,71 @@ power=3 toughness=7 [/card] [card] +name=Silumgar Assassin +abilities=strong +facedown={3} +autofacedown={2}{B}:morph +autofaceup=counter(1/1,1) +autofaceup=destroy target(creature[power<=3]|opponentbattlefield) +text=Creatures with power greater than Silumgar Assassin's power can't block it. -- Megamorph {2}{B} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its megamorph cost and put a +1/+1 counter on it.) -- When Silumgar Assassin is turned face up, destroy target creature with power 3 or less an opponent controls. +mana={1}{B} +type=Creature +subtype=Human Assassin +power=2 +toughness=1 +[/card] +[card] +name=Silumgar Butcher +auto=may name(Exploit) sacrifice notatarget(creature|mybattlefield) && transforms((,newability[target(creature|battlefield) -3/-3 ueot])) forever +text=Exploit (When this creature enters the battlefield, you may sacrifice a creature.) -- When Silumgar Butcher exploits a creature, target creature gets -3/-3 until end of turn. +mana={4}{B} +type=Creature +subtype=Zombie Djinn +power=3 +toughness=3 +[/card] +[card] +name=Silumgar Monument +auto={T}:add{U} +auto={T}:add{B} +auto={4}{U}{B}:becomes(Artifact Creature Dragon,4/4,flying,blue,black) ueot +text={T}: Add {U} or {B} to your mana pool. -- {4}{U}{B}: Silumgar Monument becomes a 4/4 blue and black Dragon artifact creature with flying until end of turn. +mana={3} +type=Artifact +[/card] +[card] +name=Silumgar Sorcerer +abilities=flash,flying +auto=may name(Exploit) sacrifice notatarget(creature|mybattlefield) && transforms((,newability[target(creature|stack) fizzle])) forever +text=Flash (You may cast this spell any time you could cast an instant.) -- Flying -- Exploit (When this creature enters the battlefield, you may sacrifice a creature.) -- When Silumgar Sorcerer exploits a creature, counter target creature spell. +mana={1}{U}{U} +type=Creature +subtype=Human Wizard +power=2 +toughness=1 +[/card] +[card] +name=Silumgar Spell-Eater +facedown={3} +autofacedown={4}{U}:morph +autofaceup=counter(1/1,1) +autofaceup=target(*|stack) transforms((,newability[pay[[{3}]] name(pay 3 mana) donothing?fizzle])) forever +text=Megamorph {4}{U} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its megamorph cost and put a +1/+1 counter on it.) -- When Silumgar Spell-Eater is turned face up, counter target spell unless its controller pays {3}. +mana={2}{U} +type=Creature +subtype=Naga Wizard +power=2 +toughness=3 +[/card] +[card] +name=Silumgar's Scorn +target=*|stack +auto=if type(dragon|mybattlefield)~morethan~0 then fizzle else if type(dragon|myhand)~morethan~0 then fizzle else transforms((,newability[pay[[{1}]] name(pay 1 mana) donothing?fizzle])) forever +text=As an additional cost to cast Silumgar's Scorn, you may reveal a Dragon card from your hand. -- Counter target spell unless its controller pays {1}. If you revealed a Dragon card or controlled a Dragon as you cast Silumgar's Scorn, counter that spell instead. +mana={U}{U} +type=Instant +[/card] +[card] name=Silver Drake abilities=flying auto=moveTo(ownerhand) notatarget(creature[white;blue]|myBattlefield) @@ -87404,6 +88824,13 @@ power=2 toughness=1 [/card] [card] +name=Skywise Teachings +auto=@movedto(*[-creature]|mystack):pay[{1}{U}] name(Pay 1U mana) token(Djinn Monk,Creature Djinn Monk,2/2,flying,blue) controller +text=Whenever you cast a noncreature spell, you may pay {1}{U}. If you do, put a 2/2 blue Djinn Monk creature token with flying onto the battlefield. +mana={3}{U} +type=Enchantment +[/card] +[card] name=Sky-Eel School abilities=flying auto=draw:1 @@ -91247,6 +92674,18 @@ mana={1} type=Artifact [/card] [card] +name=Sprinting Warbrute +abilities=mustattack +other={3}{R} name(Dash) +auto=if paid(alternative) then transforms((,newability[haste],newability[phaseaction[endofturn sourceinplay] moveto(ownerhand) all(this)])) forever +text=Sprinting Warbrute attacks each turn if able. -- Dash {3}{R} (You may cast this spell for its dash cost. If you do, it gains haste, and it's returned from the battlefield to its owner's hand at the beginning of the next end step.) +mana={4}{R} +type=Creature +subtype=Ogre Berserker +power=5 +toughness=4 +[/card] +[card] name=Sprite Noble abilities=flying auto=lord(creature[flying]|myBattlefield) 0/1 other @@ -92876,6 +94315,19 @@ power=3 toughness=3 [/card] [card] +name=Stormcrag Elemental +abilities=trample +facedown={3} +autofacedown={4}{R}{R}:morph +autofaceup=counter(1/1,1) +text=Trample -- Megamorph {4}{R}{R} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its megamorph cost and put a +1/+1 counter on it.) +mana={5}{R} +type=Creature +subtype=Elemental +power=5 +toughness=5 +[/card] +[card] name=Stormfront Pegasus abilities=flying text=Flying @@ -92898,6 +94350,16 @@ power=4 toughness=3 [/card] [card] +name=Stormrider Rig +auto={2}:equip +auto=1/1 +auto=@movedto(creature|mybattlefield):may all(trigger[to]) retarget +text=Equipped creature gets +1/+1. -- Whenever a creature enters the battlefield under your control, you may attach Stormrider Rig to it. -- Equip {2} +mana={2} +type=Artifact +subtype=Equipment +[/card] +[card] name=Stormscape Apprentice auto={W}{T}:Tap target(creature) auto={B}{T}:life:-1 target(player) @@ -92958,6 +94420,20 @@ power=2 toughness=1 [/card] [card] +name=Stormwing Dragon +abilities=flying,first strike +facedown={3} +autofacedown={5}{R}{R}:morph +autofaceup=counter(1/1,1) +autofaceup=counter(1/1,1) all(other creature[dragon]|mybattlefield) +text=Flying, first strike -- Megamorph {5}{R}{R} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its megamorph cost and put a +1/+1 counter on it.) -- When Stormwing Dragon is turned face up, put a +1/+1 counter on each other Dragon creature you control. +mana={5}{R} +type=Creature +subtype=Dragon +power=3 +toughness=3 +[/card] +[card] name=Strafe target=creature[-red] auto=Damage:3 @@ -93023,6 +94499,20 @@ power=4 toughness=4 [/card] [card] +name=Stratus Dancer +abilities=flying +facedown={3} +autofacedown={1}{U}:morph +autofaceup=counter(1/1,1) +autofaceup=target(*[instant;sorcery]|stack) fizzle +text=Flying -- Megamorph {1}{U} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its megamorph cost and put a +1/+1 counter on it.) -- When Stratus Dancer is turned face up, counter target instant or sorcery spell. +mana={1}{U} +type=Creature +subtype=Djinn Monk +power=2 +toughness=1 +[/card] +[card] name=Stratus Walk target=creature auto=draw:1 controller @@ -93285,6 +94775,16 @@ power=4 toughness=3 [/card] [card] +name=Strongarm Monk +auto=@movedto(*[-creature]|mystack):all(creature|mybattlefield) 1/1 ueot +text=Whenever you cast a noncreature spell, creatures you control get +1/+1 until end of turn. +mana={4}{W} +type=Creature +subtype=Human Monk +power=3 +toughness=3 +[/card] +[card] name=Strongarm Thug auto=may moveto(myhand) target(mercenary|mygraveyard) text=When Strongarm Thug enters the battlefield, you may return target Mercenary card from your graveyard to your hand. @@ -93405,6 +94905,16 @@ toughness=3 [/card] ###The 2 cards above should stay together (Flip Card)### [card] +name=Student of Ojutai +auto=@movedto(*[-creature]|mystack):life:2 controller +text=Whenever you cast a noncreature spell, you gain 2 life. +mana={3}{W} +type=Creature +subtype=Human Monk +power=2 +toughness=4 +[/card] +[card] name=Student of Warfare auto={W}:counter(0/0,1,Level) asSorcery auto=this(counter{0/0,2,Level}) first strike @@ -93890,6 +95400,13 @@ type=Enchantment subtype=Aura [/card] [card] +name=Sunbringer's Touch +auto=name(Bolster) notatarget(creature[toughness=toughness:lowest:creature:mybattlefield]|mybattlefield) transforms((,newability[counter(1/1.type:*:myhand)],newability[trample ueot],newability[all(other creature[counter{1/1.1}]|mybattlefield) trample ueot])) oneshot +text=Bolster X, where X is the number of cards in your hand. Each creature you control with a +1/+1 counter on it gains trample until end of turn. (To bolster X, choose a creature with the least toughness among creatures you control and put X +1/+1 counters on it.) +mana={2}{G}{G} +type=Sorcery +[/card] +[card] name=Suncrusher abilities=sunburst auto=counter(1/1,sunburst) @@ -94099,6 +95616,17 @@ power=2 toughness=2 [/card] [card] +name=Sunscorch Regent +abilities=flying +auto=@movedto(*|opponentstack):counter(1/1,1) +text=Flying -- Whenever an opponent casts a spell, put a +1/+1 counter on Sunscorch Regent and you gain 1 life. +mana={3}{W}{W} +type=Creature +subtype=Dragon +power=4 +toughness=3 +[/card] +[card] name=Sunscour auto=destroy all(creature) other={E(other *[white]|myhand)}{E(other *[white]|myhand)} name(Exile 2 White Cards from Hand) @@ -94305,6 +95833,15 @@ mana={1} type=Artifact [/card] [card] +name=Surge of Righteousness +target=creature[attacking;blocking;black;red]|battlefield +auto=destroy +auto=life:2 controller +text=Destroy target black or red creature that's attacking or blocking. You gain 2 life. +mana={1}{W} +type=Instant +[/card] +[card] name=Surge of Strength target=auto auto=trample @@ -94686,6 +96223,17 @@ mana={2}{W}{U}{U} type=Instant [/card] [card] +name=Swift Warkite +abilities=flying +auto=moveTo(myBattlefield) target(creature[manacost<=3]|myhand,mygraveyard) and!( transforms((,newability[haste],newability[phaseaction[endofturn sourceinplay] moveto(ownerhand) all(this)])) forever)! +text=Flying -- When Swift Warkite enters the battlefield, you may put a creature card with converted mana cost 3 or less from your hand or graveyard onto the battlefield. That creature gains haste. Return it to your hand at the beginning of the next end step. +mana={4}{B}{R} +type=Creature +subtype=Dragon +power=4 +toughness=4 +[/card] +[card] name=Swiftfoot Boots auto={1}:equip auto=teach(creature) haste @@ -95247,6 +96795,14 @@ type=Land subtype=Mountain Forest [/card] [card] +name=Tail Slash +target=creature|mybattlefield +auto=transforms((,newability[target(creature|opponentbattlefield) dynamicability])) forever +text=Target creature you control deals damage equal to its power to target creature you don't control. +mana={2}{R} +type=Instant +[/card] +[card] name=Tainted AEther auto=@movedTo(creature|mybattlefield):sacrifice notatarget(creature,land|mybattlefield) auto=@movedTo(creature|opponentbattlefield):ability$!name(sacrifice) sacrifice notatarget(creature,land|mybattlefield) !$ opponent @@ -95823,6 +97379,13 @@ power=2 toughness=2 [/card] [card] +name=Tapestry of the Ages +auto={2}{T}:draw:1 controller restriction{thisturn(*[-creature]|mystack)~morethan~0} +text={2}, {T}: Draw a card. Activate this ability only if you've cast a noncreature spell this turn. +mana={4} +type=Artifact +[/card] +[card] name=Tar Pitcher auto={T}{S(goblin|myBattlefield)}:damage:2 target(creature,player) text={T}, Sacrifice a Goblin: Tar Pitcher deals 2 damage to target creature or player. @@ -96939,6 +98502,16 @@ mana={4}{R}{R} type=Enchantment [/card] [card] +name=Territorial Roc +abilities=flying +text=Flying +mana={1}{W} +type=Creature +subtype=Bird +power=1 +toughness=3 +[/card] +[card] name=Terror target=creature[-black;-artifact] auto=bury @@ -98398,6 +99971,19 @@ mana={1}{R} type=Instant [/card] [card] +name=Thunderbreak Regent +abilities=flying +auto=@targeted(dragon|mybattlefield) from(*|opponentbattlefield):damage:3 opponent +auto=@targeted(dragon|mybattlefield) from(*|opponenthand):damage:3 opponent +auto=@targeted(dragon|mybattlefield) from(*|graveyard):damage:3 opponent +text=Flying -- Whenever a Dragon you control becomes the target of a spell or ability an opponent controls, Thunderbreak Regent deals 3 damage to that player. +mana={2}{R}{R} +type=Creature +subtype=Dragon +power=4 +toughness=4 +[/card] +[card] name=Thunderclap target=creature other={S(mountain|mybattlefield)} name(Sacrifice a Mountain) @@ -100499,6 +102085,15 @@ type=Enchantment subtype=Aura [/card] [card] +name=Tread Upon +target=creature|battlefield +auto=2/2 ueot +auto=trample ueot +text=Target creature gets +2/+2 and gains trample until end of turn. +mana={1}{G} +type=Instant +[/card] +[card] name=Treasure Hunter auto=may moveTo(myhand) target(artifact|mygraveyard) text=When Treasure Hunter enters the battlefield, you may return target artifact card from your graveyard to your hand. @@ -101628,6 +103223,15 @@ power=5 toughness=5 [/card] [card] +name=Twin Bolt +target=creature,player +auto=damage:1 +auto=damage:1 target(creature,player) +text=Twin Bolt deals 2 damage divided as you choose among one or two target creatures and/or players. +mana={1}{R} +type=Instant +[/card] +[card] name=Twinblade Slasher abilities=wither auto={1}{G}:2/2 limit:1 @@ -101869,6 +103473,16 @@ power=* toughness=* [/card] [card] +name=Ukud Cobra +abilities=deathtouch +text=Deathtouch +mana={3}{B} +type=Creature +subtype=Snake +power=2 +toughness=5 +[/card] +[card] name=Ulamog, the Infinite Gyre abilities=indestructible auto=if casted(this) then destroy target(*) @@ -102693,6 +104307,16 @@ mana={1}{U} type=Instant [/card] [card] +name=Updraft Elemental +abilities=flying +text=Flying +mana={2}{U} +type=Creature +subtype=Elemental +power=1 +toughness=4 +[/card] +[card] name=Upheaval auto=moveTo(ownerhand) all(*|battlefield) text=Return all permanents to their owners' hands. @@ -104520,6 +106144,13 @@ power=3 toughness=3 [/card] [card] +name=Vial of Dragonfire +auto={2}{T}{S}:damage:2 target(creature|battlefield) +text={2}, {T}, Sacrifice Vial of Dragonfire: Vial of Dragonfire deals 2 damage to target creature. +mana={2} +type=Artifact +[/card] +[card] name=Vial of Poison auto={1}{S}:target(creature) deathtouch ueot text={1}, Sacrifice Vial of Poison: Target creature gains deathtouch until end of turn. @@ -105308,6 +106939,13 @@ mana={2}{W} type=Sorcery [/card] [card] +name=Virulent Plague +auto=lord(creature[token]|battlefield) -2/-2 +text=Creature tokens get -2/-2. +mana={2}{B} +type=Enchantment +[/card] +[card] name=Virulent Sliver auto=lord(sliver) poisontoxic text=All Sliver creatures have poisonous 1. (Whenever a Sliver deals combat damage to a player, that player gets a poison counter. A player with ten or more poison counters loses the game.) @@ -105964,6 +107602,14 @@ type=Land subtype=Island Mountain [/card] [card] +name=Volcanic Rush +auto=all(creature[attacking]) 2/0 ueot +auto=all(creature[attacking]) trample ueot +text=Attacking creatures get +2/+0 and gain trample until end of turn. +mana={4}{R} +type=Instant +[/card] +[card] name=Volcanic Spray auto=damage:1 all(creature[-flying]) auto=damage:1 all(player) @@ -106399,6 +108045,17 @@ power=5 toughness=5 [/card] [card] +name=Vulturous Aven +abilities=flying +auto=may name(Exploit) sacrifice notatarget(creature|mybattlefield) && draw:2 controller && life:-2 controller +text=Flying -- Exploit (When this creature enters the battlefield, you may sacrifice a creature.) -- When Vulturous Aven exploits a creature, you draw two cards and you lose 2 life. +mana={3}{B} +type=Creature +subtype=Bird Shaman +power=2 +toughness=3 +[/card] +[card] name=Vulturous Zombie abilities=flying auto=@movedTo(*|opponentgraveyard):counter(1/1,1) @@ -107205,6 +108862,14 @@ mana={2}{G} type=Sorcery [/card] [card] +name=Wandering Tombshell +mana={3}{B} +type=Creature +subtype=Zombie Turtle +power=1 +toughness=6 +[/card] +[card] name=Wandering Wolf abilities=strong text=Creatures with power less than Wandering Wolf's power can't block it. @@ -111310,6 +112975,16 @@ power=2 toughness=1 [/card] [card] +name=Youthful Scholar +auto=@movedto(this|graveyard) from(mybattlefield):draw:2 controller +text=When Youthful Scholar dies, draw two cards. +mana={3}{U} +type=Creature +subtype=Human Wizard +power=2 +toughness=2 +[/card] +[card] name=Yuan Shao, the Indecisive abilities=horsemanship auto=lord(creature|myBattlefield) oneblocker @@ -111517,6 +113192,17 @@ type=Enchantment subtype=Aura [/card] [card] +name=Zephyr Scribe +auto={U}{T}:draw:1 && transforms((,newability[target(*|myhand) reject])) forever +auto=@movedto(*[-creature]|mystack):untap all(this) +text={U}, {T}: Draw a card, then discard a card. -- Whenever you cast a noncreature spell, untap Zephyr Scribe. +mana={2}{U} +type=Creature +subtype=Human Monk +power=2 +toughness=1 +[/card] +[card] name=Zephyr Spirit auto=@combat(blocking) source(this):moveTo(ownerhand) text=When Zephyr Spirit blocks, return it to its owner's hand. @@ -111991,6 +113677,18 @@ power=1 toughness=1 [/card] [card] +name=Zurgo Bellstriker +auto=cantbeblockerof(creature[power>=2]) +other={1}{R} name(Dash) +auto=if paid(alternative) then transforms((,newability[haste],newability[phaseaction[endofturn sourceinplay] moveto(ownerhand) all(this)])) forever +text=Zurgo Bellstriker can't block creatures with power 2 or greater. -- Dash {1}{R} (You may cast this spell for its dash cost. If you do, it gains haste, and it's returned from the battlefield to its owner's hand at the beginning of the next end step.) +mana={R} +type=Legendary Creature +subtype=Orc Warrior +power=2 +toughness=2 +[/card] +[card] name=Zurgo Helmsmasher abilities=haste,mustattack auto=this(variable{controllerturn}>0) indestructible From a57e919e44c5cdbac4b1d816ea9047f9afeaec45 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 7 Sep 2015 19:53:16 +0800 Subject: [PATCH 083/249] commented out unused variable... --- projects/mtg/src/MTGRules.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/mtg/src/MTGRules.cpp b/projects/mtg/src/MTGRules.cpp index b174b612b..d3ef99baf 100644 --- a/projects/mtg/src/MTGRules.cpp +++ b/projects/mtg/src/MTGRules.cpp @@ -1032,7 +1032,7 @@ int MTGMorphCostRule::isReactingToClick(MTGCardInstance * card, ManaCost *) { Player * player = game->currentlyActing(); - Player * currentPlayer = game->currentPlayer; + //Player * currentPlayer = game->currentPlayer; if (!player->game->hand->hasCard(card)) return 0; if (!card->getManaCost()->getMorph()) From ef707e6d5df037d22181122e31ce78ce50f76728 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Tue, 8 Sep 2015 12:26:03 +0800 Subject: [PATCH 084/249] added basic offering support usage tap lands to produce mana then sacrifice an offering... example you have Guttersnipe in play, it has a mana cost of {2}{R}, and you have Patron of the Akki in hand that costs {4}{R}{R}. You need to produce {2}{R} mana first before casting Patron of the Akki, then choose Guttersnipe as an offering. --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 60 +++++++++++++++++++ .../bin/Res/sets/primitives/unsupported.txt | 45 -------------- projects/mtg/include/ExtraCost.h | 11 ++++ projects/mtg/include/MTGDefinitions.h | 3 +- projects/mtg/src/ExtraCost.cpp | 59 ++++++++++++++++++ projects/mtg/src/MTGAbility.cpp | 6 ++ projects/mtg/src/MTGDefinitions.cpp | 3 +- projects/mtg/src/MTGRules.cpp | 4 +- projects/mtg/src/ManaCost.cpp | 27 +++++++++ 9 files changed, 169 insertions(+), 49 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 15bd61f4e..14913a391 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -69645,6 +69645,66 @@ power=1 toughness=1 [/card] [card] +name=Patron of the Akki +other={kgoblin} name(Goblin Offering) +abilities=offering +auto=@combat(attacking) source(this):all(creature[attacking]) 2/0 ueot +text=Goblin offering (You may cast this card any time you could cast an instant by sacrificing a Goblin and paying the difference in mana costs between this and the sacrificed Goblin. Mana cost includes color.) -- Whenever Patron of the Akki attacks, creatures you control get +2/+0 until end of turn. +mana={4}{R}{R} +type=Legendary Creature +subtype=Spirit +power=5 +toughness=5 +[/card] +[card] +name=Patron of the Kitsune +other={kfox} name(Fox Offering) +abilities=offering +auto=@each blockers:may life:type:creature[attacking]:battlefield controller +text=Fox offering (You may cast this card any time you could cast an instant by sacrificing a Fox and paying the difference in mana costs between this and the sacrificed Fox. Mana cost includes color.) -- Whenever a creature attacks, you may gain 1 life. +mana={4}{W}{W} +type=Legendary Creature +subtype=Spirit +power=5 +toughness=6 +[/card] +[card] +name=Patron of the Moon +other={kmoonfolk} name(Moonfolk Offering) +abilities=flying,offering +auto={1}:name(put 2 lands in play) moveto(mybattlefield) and!(tap)! notatarget(land|myhand) +text=Moonfolk offering (You may cast this card any time you could cast an instant by sacrificing a Moonfolk and paying the difference in mana costs between this and the sacrificed Moonfolk. Mana cost includes color.) -- Flying -- {1}: Put up to two land cards from your hand onto the battlefield tapped. +mana={5}{U}{U} +type=Legendary Creature +subtype=Spirit +power=5 +toughness=4 +[/card] +[card] +name=Patron of the Nezumi +other={krat} name(Rat Offering) +abilities=offering +auto=@movedto(*|opponentgraveyard) from(battlefield):life:-1 opponent +text=Rat offering (You may cast this card any time you could cast an instant by sacrificing a Rat and paying the difference in mana costs between this and the sacrificed Rat. Mana cost includes color.) -- Whenever a permanent is put into an opponent's graveyard, that player loses 1 life. +mana={5}{B}{B} +type=Legendary Creature +subtype=Spirit +power=6 +toughness=6 +[/card] +[card] +name=Patron of the Orochi +other={ksnake} name(Snake Offering) +abilities=offering +auto={T}:name(untap all green creatures and forests) untap all(forest) && untap all(creature[green]) limit:1 +text=Snake offering (You may cast this card any time you could cast an instant by sacrificing a Snake and paying the difference in mana costs between this and the sacrificed Snake. Mana cost includes color.) -- {T}: Untap all Forests and all green creatures. Activate this ability only once each turn. +mana={6}{G}{G} +type=Legendary Creature +subtype=Spirit +power=7 +toughness=7 +[/card] +[card] name=Patron of the Wild facedown={3} autofacedown={2}{G}:morph diff --git a/projects/mtg/bin/Res/sets/primitives/unsupported.txt b/projects/mtg/bin/Res/sets/primitives/unsupported.txt index 345ecc823..f1608d66b 100644 --- a/projects/mtg/bin/Res/sets/primitives/unsupported.txt +++ b/projects/mtg/bin/Res/sets/primitives/unsupported.txt @@ -11637,51 +11637,6 @@ mana={3}{B}{B} type=Sorcery [/card] [card] -name=Patron of the Akki -text=Goblin offering (You may cast this card any time you could cast an instant by sacrificing a Goblin and paying the difference in mana costs between this and the sacrificed Goblin. Mana cost includes color.) -- Whenever Patron of the Akki attacks, creatures you control get +2/+0 until end of turn. -mana={4}{R}{R} -type=Legendary Creature -subtype=Spirit -power=5 -toughness=5 -[/card] -[card] -name=Patron of the Kitsune -text=Fox offering (You may cast this card any time you could cast an instant by sacrificing a Fox and paying the difference in mana costs between this and the sacrificed Fox. Mana cost includes color.) -- Whenever a creature attacks, you may gain 1 life. -mana={4}{W}{W} -type=Legendary Creature -subtype=Spirit -power=5 -toughness=6 -[/card] -[card] -name=Patron of the Moon -text=Moonfolk offering (You may cast this card any time you could cast an instant by sacrificing a Moonfolk and paying the difference in mana costs between this and the sacrificed Moonfolk. Mana cost includes color.) -- Flying -- {1}: Put up to two land cards from your hand onto the battlefield tapped. -mana={5}{U}{U} -type=Legendary Creature -subtype=Spirit -power=5 -toughness=4 -[/card] -[card] -name=Patron of the Nezumi -text=Rat offering (You may cast this card any time you could cast an instant by sacrificing a Rat and paying the difference in mana costs between this and the sacrificed Rat. Mana cost includes color.) -- Whenever a permanent is put into an opponent's graveyard, that player loses 1 life. -mana={5}{B}{B} -type=Legendary Creature -subtype=Spirit -power=6 -toughness=6 -[/card] -[card] -name=Patron of the Orochi -text=Snake offering (You may cast this card any time you could cast an instant by sacrificing a Snake and paying the difference in mana costs between this and the sacrificed Snake. Mana cost includes color.) -- {T}: Untap all Forests and all green creatures. Activate this ability only once each turn. -mana={6}{G}{G} -type=Legendary Creature -subtype=Spirit -power=7 -toughness=7 -[/card] -[card] name=Pay No Heed text=Prevent all damage a source of your choice would deal this turn. mana={W} diff --git a/projects/mtg/include/ExtraCost.h b/projects/mtg/include/ExtraCost.h index bf935ec8b..09cf9323a 100644 --- a/projects/mtg/include/ExtraCost.h +++ b/projects/mtg/include/ExtraCost.h @@ -254,6 +254,17 @@ public: virtual Ninja * clone() const; }; +//offering cost +class Offering : public ExtraCost +{ +public: + Offering(TargetChooser *_tc = NULL); + virtual int canPay(); + virtual int isPaymentSet(); + virtual int doPay(); + virtual Offering * clone() const; +}; + class CounterCost : public ExtraCost { public: diff --git a/projects/mtg/include/MTGDefinitions.h b/projects/mtg/include/MTGDefinitions.h index 79311fc1b..5f4ea6dde 100644 --- a/projects/mtg/include/MTGDefinitions.h +++ b/projects/mtg/include/MTGDefinitions.h @@ -224,7 +224,8 @@ class Constants OPPGRAVEEXILER = 106, LIBRARYDEATH = 107, SHUFFLELIBRARYDEATH = 108, - NB_BASIC_ABILITIES = 109, + OFFERING = 109, + NB_BASIC_ABILITIES = 110, RARITY_S = 'S', //Special Rarity diff --git a/projects/mtg/src/ExtraCost.cpp b/projects/mtg/src/ExtraCost.cpp index 3bd2ce7a2..8158f6e62 100644 --- a/projects/mtg/src/ExtraCost.cpp +++ b/projects/mtg/src/ExtraCost.cpp @@ -762,6 +762,65 @@ int Ninja::doPay() } //endbouncetargetcostforninja + +//Sacrifice target as cost for Offering +Offering * Offering::clone() const +{ + Offering * ec = NEW Offering(*this); + if (tc) + ec->tc = tc->clone(); + return ec; +} + +Offering::Offering(TargetChooser *_tc) : +ExtraCost("Select creature to offer", _tc) +{ +} + +int Offering::canPay() +{ + if (target && (!source->controller()->getManaPool()->canAfford(source->getManaCost()->Diff(target->getManaCost())))) + { + tc->removeTarget(target); + target = NULL; + return 0; + } + if (target && (source->controller()->getManaPool()->canAfford(source->getManaCost()->Diff(target->getManaCost())))) + return 1; + return 0; +} + +int Offering::isPaymentSet() +{ + if (target && (!source->controller()->getManaPool()->canAfford(source->getManaCost()->Diff(target->getManaCost())))) + { + tc->removeTarget(target); + target = NULL; + return 0; + } + if (target && (source->controller()->getManaPool()->canAfford(source->getManaCost()->Diff(target->getManaCost())))) + return 1; + return 0; +} + +int Offering::doPay() +{ + if (target) + { + target->controller()->getManaPool()->pay(source->getManaCost()->Diff(target->getManaCost())); + MTGCardInstance * beforeCard = target; + source->storedCard = target->createSnapShot(); + target->controller()->game->putInGraveyard(target); + WEvent * e = NEW WEventCardSacrifice(beforeCard,target); + GameObserver * game = target->owner->getObserver(); + game->receiveEvent(e); + target = NULL; + if (tc) + tc->initTargets(); + return 1; + } + return 0; +} //------------------------------------------------------------ SacrificeCost * SacrificeCost::clone() const diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index fca67f710..f6b8539c3 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -447,6 +447,12 @@ int AbilityFactory::parseCastRestrictions(MTGCardInstance * card, Player * playe if(cPhase < MTG_PHASE_COMBATBEGIN ||cPhase > MTG_PHASE_COMBATEND ) return 0; } + check = restriction[i].find("during my main phases"); + if(check != string::npos) + { + if( player != observer->currentPlayer && (cPhase != MTG_PHASE_FIRSTMAIN ||cPhase != MTG_PHASE_SECONDMAIN) ) + return 0; + } check = restriction[i].find("during my turn"); if(check != string::npos) { diff --git a/projects/mtg/src/MTGDefinitions.cpp b/projects/mtg/src/MTGDefinitions.cpp index bf2ca0f09..13d0ec579 100644 --- a/projects/mtg/src/MTGDefinitions.cpp +++ b/projects/mtg/src/MTGDefinitions.cpp @@ -137,7 +137,8 @@ const char* Constants::MTGBasicAbilities[] = { "mygraveexiler", "oppgraveexiler", "librarydeath", - "shufflelibrarydeath" + "shufflelibrarydeath", + "offering" }; map Constants::MTGBasicAbilitiesMap; diff --git a/projects/mtg/src/MTGRules.cpp b/projects/mtg/src/MTGRules.cpp index d3ef99baf..c85bff344 100644 --- a/projects/mtg/src/MTGRules.cpp +++ b/projects/mtg/src/MTGRules.cpp @@ -317,7 +317,7 @@ int MTGPutInPlayRule::isReactingToClick(MTGCardInstance * card, ManaCost *) return 1; } } - else if ((card->hasType(Subtypes::TYPE_INSTANT)) || card->has(Constants::FLASH) + else if ((card->hasType(Subtypes::TYPE_INSTANT)) || card->has(Constants::FLASH) || (player == card->controller() && !game->isInterrupting && (game->getCurrentGamePhase() == MTG_PHASE_FIRSTMAIN || game->getCurrentGamePhase() == MTG_PHASE_SECONDMAIN)) @@ -651,7 +651,7 @@ int MTGAlternativeCostRule::isReactingToClick(MTGCardInstance * card, ManaCost * ) return 1; } - else if ((card->hasType(Subtypes::TYPE_INSTANT)) || card->has(Constants::FLASH) + else if ((card->hasType(Subtypes::TYPE_INSTANT)) || card->has(Constants::FLASH) || card->has(Constants::OFFERING) || (player == card->controller() && !game->isInterrupting && (game->getCurrentGamePhase() == MTG_PHASE_FIRSTMAIN || game->getCurrentGamePhase() == MTG_PHASE_SECONDMAIN)) diff --git a/projects/mtg/src/ManaCost.cpp b/projects/mtg/src/ManaCost.cpp index 4c0b0a2e3..31a338161 100644 --- a/projects/mtg/src/ManaCost.cpp +++ b/projects/mtg/src/ManaCost.cpp @@ -193,6 +193,33 @@ ManaCost * ManaCost::parseManaCost(string s, ManaCost * _manaCost, MTGCardInstan manaCost->addExtraCost(NEW Ninja(tc)); break; } + case 'k': //kill offering + { + TargetChooserFactory tcf(g); + if (value == "kgoblin") + { + tc = tcf.createTargetChooser("creature[goblin]|myBattlefield", c); + } + else if (value == "kfox") + { + tc = tcf.createTargetChooser("creature[fox]|myBattlefield", c); + } + else if (value == "kmoonfolk") + { + tc = tcf.createTargetChooser("creature[moonfolk]|myBattlefield", c); + } + else if (value == "krat") + { + tc = tcf.createTargetChooser("creature[rat]|myBattlefield", c); + } + else if (value == "ksnake") + { + tc = tcf.createTargetChooser("creature[snake]|myBattlefield", c); + } + //TODO iterate subtypes of creatures + manaCost->addExtraCost(NEW Offering(tc)); + break; + } case 'p' : { SAFE_DELETE(tc); From 93ed2b3bff51ce2b01d5ebbfe3e84fe0d365b8f3 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Wed, 9 Sep 2015 22:17:37 +0800 Subject: [PATCH 085/249] added test --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 2 +- projects/mtg/bin/Res/test/PT_M15_errata.txt | 33 ++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 projects/mtg/bin/Res/test/PT_M15_errata.txt diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 14913a391..635d12de9 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -30657,7 +30657,7 @@ toughness=4 [/card] [card] name=Ethereal Haze -auto=preventalldamage to(creature) ueot +auto=preventalldamage from(creature) ueot text=Prevent all damage that would be dealt by creatures this turn. mana={W} type=Instant diff --git a/projects/mtg/bin/Res/test/PT_M15_errata.txt b/projects/mtg/bin/Res/test/PT_M15_errata.txt new file mode 100644 index 000000000..25f5eb1bd --- /dev/null +++ b/projects/mtg/bin/Res/test/PT_M15_errata.txt @@ -0,0 +1,33 @@ +#Testing Turn to Frog to Serra Angel with Crusade in play. +#M15 uses base power template, so setting the power/toughness. +#only affects the base or original power/toughness. +#Turn to Frog makes Serra Angel a 1/1 blue frog... latest pull +#request from GIT fixes the issue of Serra Angel dying +#from crusade because of invalid reduction of P/T :) +[INIT] +FIRSTMAIN +[PLAYER1] +inplay:Serra Angel,Crusade +hand:Turn to Frog +manapool:{1}{U} +[PLAYER2] +[DO] +Turn to Frog +Serra Angel +next +next +Serra Angel +next +eot +next +next +next +[ASSERT] +FIRSTMAIN +[PLAYER1] +inplay:Serra Angel, Crusade +graveyard:Turn to Frog +manapool:{0} +[PLAYER2] +life:19 +[END] \ No newline at end of file From 62dd54c886ed45838b5a34d28f2c741de5e0e724 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Wed, 9 Sep 2015 22:18:13 +0800 Subject: [PATCH 086/249] Base Power/Toughness Template as of M15 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 208.4. Effects that set a creature’s power and/or toughness to specific values may refer to that creature’s “base power,†“base toughness,†or “base power and toughness.†Other continuous effects may further modify the creature’s power and toughness. See rule 613, “Interaction of Continuous Effects.†--- projects/mtg/bin/Res/test/_tests.txt | 1 + projects/mtg/include/AllAbilities.h | 4 ++-- projects/mtg/src/AllAbilities.cpp | 18 ++++++++---------- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/projects/mtg/bin/Res/test/_tests.txt b/projects/mtg/bin/Res/test/_tests.txt index 68fc41c15..6c7f3e37f 100644 --- a/projects/mtg/bin/Res/test/_tests.txt +++ b/projects/mtg/bin/Res/test/_tests.txt @@ -534,6 +534,7 @@ prowess_of_the_fair.txt prowess_of_the_fair2.txt prowess_of_the_fair3.txt PTInstant.txt +PT_M15_errata.txt pygmy_troll.txt pyknite_i426.txt pyroclasm.txt diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index e8d099441..78df9b851 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -4307,10 +4307,10 @@ public: string newpower; bool newpowerfound; - int oldpower; + int oldpowerbonus; string newtoughness; bool newtoughnessfound; - int oldtoughness; + int oldtoughnessbonus; map > newAbilities; vector newAbilitiesList; bool newAbilityFound; diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index e868654bb..429d51edd 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -4181,20 +4181,18 @@ for (it = types.begin(); it != types.end(); it++) } } if(newpowerfound ) - { + {//setting p/t only overrides base p/t as of M15 changes WParsedInt * val = NEW WParsedInt(newpower,NULL, source); - oldpower = _target->power; - _target->power += val->getValue(); - _target->power -= oldpower; + oldpowerbonus = _target->power - _target->origpower;//keep bonus if any + _target->setPower(oldpowerbonus + val->getValue()); _target->power += reapplyCountersBonus(_target,false,true); delete val; } if(newtoughnessfound ) - { + {//setting p/t only overrides base p/t as of M15 changes WParsedInt * val = NEW WParsedInt(newtoughness,NULL, source); - oldtoughness = _target->toughness; - _target->addToToughness(val->getValue()); - _target->addToToughness(-oldtoughness); + oldtoughnessbonus = _target->toughness - _target->origtoughness;// keep bonus if any + _target->setToughness(oldtoughnessbonus + val->getValue()); _target->addToToughness(reapplyCountersBonus(_target,true,false)); _target->life = _target->toughness; delete val; @@ -4283,11 +4281,11 @@ int ATransformer::destroy() if(newpowerfound ) { - _target->power = oldpower; + _target->setPower(oldpowerbonus + _target->origpower); } if(newtoughnessfound ) { - _target->setToughness(oldtoughness); + _target->setToughness(oldtoughnessbonus + _target->origtoughness); } if(newAbilityFound) { From 9d668342bee3c4a95f97a832bfd576692d9698c2 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 10 Sep 2015 00:26:20 +0800 Subject: [PATCH 087/249] PT should work fine now... --- projects/mtg/src/AllAbilities.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index 429d51edd..4bfff0d2a 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -4185,7 +4185,8 @@ for (it = types.begin(); it != types.end(); it++) WParsedInt * val = NEW WParsedInt(newpower,NULL, source); oldpowerbonus = _target->power - _target->origpower;//keep bonus if any _target->setPower(oldpowerbonus + val->getValue()); - _target->power += reapplyCountersBonus(_target,false,true); + _target->origpower = val->getValue(); + //_target->power += reapplyCountersBonus(_target,false,true); delete val; } if(newtoughnessfound ) @@ -4193,7 +4194,8 @@ for (it = types.begin(); it != types.end(); it++) WParsedInt * val = NEW WParsedInt(newtoughness,NULL, source); oldtoughnessbonus = _target->toughness - _target->origtoughness;// keep bonus if any _target->setToughness(oldtoughnessbonus + val->getValue()); - _target->addToToughness(reapplyCountersBonus(_target,true,false)); + _target->origtoughness = val->getValue(); + //_target->addToToughness(reapplyCountersBonus(_target,true,false)); _target->life = _target->toughness; delete val; } From c1e9fad271c9792d167dc6ecfff731525659366f Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 10 Sep 2015 05:26:09 +0800 Subject: [PATCH 088/249] added basepower and basetoughness added these two so if we want to access original power and toughness, we can point to origpower and origtoughness respectively. --- projects/mtg/include/MTGCardInstance.h | 2 ++ projects/mtg/src/AllAbilities.cpp | 12 ++++++------ projects/mtg/src/MTGCardInstance.cpp | 2 ++ 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/projects/mtg/include/MTGCardInstance.h b/projects/mtg/include/MTGCardInstance.h index 82053bcf1..3b3c5b6d3 100644 --- a/projects/mtg/include/MTGCardInstance.h +++ b/projects/mtg/include/MTGCardInstance.h @@ -72,7 +72,9 @@ public: int regenerateTokens; int isToken; int origpower; + int basepower; int origtoughness; + int basetoughness; int isMultiColored; int isLeveler; bool enchanted; diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index 4bfff0d2a..058014c45 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -4183,18 +4183,18 @@ for (it = types.begin(); it != types.end(); it++) if(newpowerfound ) {//setting p/t only overrides base p/t as of M15 changes WParsedInt * val = NEW WParsedInt(newpower,NULL, source); - oldpowerbonus = _target->power - _target->origpower;//keep bonus if any + oldpowerbonus = _target->power - _target->basepower;//keep bonus if any _target->setPower(oldpowerbonus + val->getValue()); - _target->origpower = val->getValue(); + _target->basepower = val->getValue(); //_target->power += reapplyCountersBonus(_target,false,true); delete val; } if(newtoughnessfound ) {//setting p/t only overrides base p/t as of M15 changes WParsedInt * val = NEW WParsedInt(newtoughness,NULL, source); - oldtoughnessbonus = _target->toughness - _target->origtoughness;// keep bonus if any + oldtoughnessbonus = _target->toughness - _target->basetoughness;// keep bonus if any _target->setToughness(oldtoughnessbonus + val->getValue()); - _target->origtoughness = val->getValue(); + _target->basetoughness = val->getValue(); //_target->addToToughness(reapplyCountersBonus(_target,true,false)); _target->life = _target->toughness; delete val; @@ -4283,11 +4283,11 @@ int ATransformer::destroy() if(newpowerfound ) { - _target->setPower(oldpowerbonus + _target->origpower); + _target->setPower(oldpowerbonus + _target->basepower); } if(newtoughnessfound ) { - _target->setToughness(oldtoughnessbonus + _target->origtoughness); + _target->setToughness(oldtoughnessbonus + _target->basetoughness); } if(newAbilityFound) { diff --git a/projects/mtg/src/MTGCardInstance.cpp b/projects/mtg/src/MTGCardInstance.cpp index b957afa0c..c2daef4a1 100644 --- a/projects/mtg/src/MTGCardInstance.cpp +++ b/projects/mtg/src/MTGCardInstance.cpp @@ -36,7 +36,9 @@ MTGCardInstance::MTGCardInstance(MTGCard * card, MTGPlayerCards * arg_belongs_to attacker = 0; lifeOrig = life; origpower = power; + basepower = origpower; origtoughness = toughness; + basetoughness = origtoughness; belongs_to = arg_belongs_to; owner = NULL; if (arg_belongs_to) From d3a7ff7e11c50aa68fff93bb72b040e11311d310 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 10 Sep 2015 06:04:43 +0800 Subject: [PATCH 089/249] reinitialize counters on destroy --- projects/mtg/include/MTGCardInstance.h | 4 ++-- projects/mtg/src/AllAbilities.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/projects/mtg/include/MTGCardInstance.h b/projects/mtg/include/MTGCardInstance.h index 3b3c5b6d3..c7132e310 100644 --- a/projects/mtg/include/MTGCardInstance.h +++ b/projects/mtg/include/MTGCardInstance.h @@ -72,9 +72,9 @@ public: int regenerateTokens; int isToken; int origpower; - int basepower; + int basepower;//to keep origpower intact int origtoughness; - int basetoughness; + int basetoughness;//to keep origtoughness intact int isMultiColored; int isLeveler; bool enchanted; diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index 058014c45..1d862ad99 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -4186,7 +4186,6 @@ for (it = types.begin(); it != types.end(); it++) oldpowerbonus = _target->power - _target->basepower;//keep bonus if any _target->setPower(oldpowerbonus + val->getValue()); _target->basepower = val->getValue(); - //_target->power += reapplyCountersBonus(_target,false,true); delete val; } if(newtoughnessfound ) @@ -4195,7 +4194,6 @@ for (it = types.begin(); it != types.end(); it++) oldtoughnessbonus = _target->toughness - _target->basetoughness;// keep bonus if any _target->setToughness(oldtoughnessbonus + val->getValue()); _target->basetoughness = val->getValue(); - //_target->addToToughness(reapplyCountersBonus(_target,true,false)); _target->life = _target->toughness; delete val; } @@ -4284,10 +4282,12 @@ int ATransformer::destroy() if(newpowerfound ) { _target->setPower(oldpowerbonus + _target->basepower); + _target->power += reapplyCountersBonus(_target,false,true); } if(newtoughnessfound ) { _target->setToughness(oldtoughnessbonus + _target->basetoughness); + _target->addToToughness(reapplyCountersBonus(_target,true,false)); } if(newAbilityFound) { From b33a9994586d06a7b8afa366111c3460d3642e31 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Fri, 11 Sep 2015 10:53:36 +0800 Subject: [PATCH 090/249] Finally PT Calculation is fixed :) I didn't take into account that the new bonus must be calculated on the event the effect was destroyed... silly me... :accept: --- projects/mtg/include/AllAbilities.h | 3 +++ projects/mtg/src/AllAbilities.cpp | 26 +++++++++++++++++--------- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index 78df9b851..698eb8a58 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -4307,9 +4307,12 @@ public: string newpower; bool newpowerfound; + + int oldpower; int oldpowerbonus; string newtoughness; bool newtoughnessfound; + int oldtoughness; int oldtoughnessbonus; map > newAbilities; vector newAbilitiesList; diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index 1d862ad99..cdff3bc9b 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -4183,17 +4183,22 @@ for (it = types.begin(); it != types.end(); it++) if(newpowerfound ) {//setting p/t only overrides base p/t as of M15 changes WParsedInt * val = NEW WParsedInt(newpower,NULL, source); - oldpowerbonus = _target->power - _target->basepower;//keep bonus if any + oldpower = _target->power; + oldpowerbonus = oldpower - _target->basepower; _target->setPower(oldpowerbonus + val->getValue()); _target->basepower = val->getValue(); + //?effects that change pt outside this? + //_target->power += reapplyCountersBonus(_target,false,true); delete val; } if(newtoughnessfound ) {//setting p/t only overrides base p/t as of M15 changes WParsedInt * val = NEW WParsedInt(newtoughness,NULL, source); - oldtoughnessbonus = _target->toughness - _target->basetoughness;// keep bonus if any + oldtoughness = _target->toughness; + oldtoughnessbonus = oldtoughness - _target->basetoughness; _target->setToughness(oldtoughnessbonus + val->getValue()); - _target->basetoughness = val->getValue(); + _target->basetoughness = val->getValue(); + //_target->addToToughness(reapplyCountersBonus(_target,true,false)); _target->life = _target->toughness; delete val; } @@ -4280,14 +4285,17 @@ int ATransformer::destroy() } if(newpowerfound ) - { - _target->setPower(oldpowerbonus + _target->basepower); - _target->power += reapplyCountersBonus(_target,false,true); + {//override since we changed tha base, the bonus must have changed + oldpowerbonus = (_target->power - _target->basepower);//math hurts my head...it's all over the place :P + _target->setPower(_target->origpower + oldpowerbonus); + _target->basepower = _target->origpower;//revert } if(newtoughnessfound ) - { - _target->setToughness(oldtoughnessbonus + _target->basetoughness); - _target->addToToughness(reapplyCountersBonus(_target,true,false)); + {//override since we changed tha base, the bonus must have changed + oldtoughnessbonus = (_target->toughness - _target->basetoughness); + _target->setToughness(_target->origtoughness + oldtoughnessbonus); + _target->basetoughness = _target->origtoughness;//revert + _target->life = _target->toughness;//update } if(newAbilityFound) { From 10d7690ca6a7c0a0958f4e0abd085e90dc2537ad Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Fri, 11 Sep 2015 11:05:52 +0800 Subject: [PATCH 091/249] Update PT_M15_errata.txt --- projects/mtg/bin/Res/test/PT_M15_errata.txt | 22 +++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/projects/mtg/bin/Res/test/PT_M15_errata.txt b/projects/mtg/bin/Res/test/PT_M15_errata.txt index 25f5eb1bd..6aa8b7770 100644 --- a/projects/mtg/bin/Res/test/PT_M15_errata.txt +++ b/projects/mtg/bin/Res/test/PT_M15_errata.txt @@ -4,10 +4,13 @@ #Turn to Frog makes Serra Angel a 1/1 blue frog... latest pull #request from GIT fixes the issue of Serra Angel dying #from crusade because of invalid reduction of P/T :) +# +#First attack is 1/1 blue Serra Angel unaffected by Crusade +#Second attack is 5/5 Serra Angel affected by Crusade :) [INIT] FIRSTMAIN [PLAYER1] -inplay:Serra Angel,Crusade +inplay:Serra Angel, Crusade hand:Turn to Frog manapool:{1}{U} [PLAYER2] @@ -19,15 +22,26 @@ next Serra Angel next eot +eot +#untap next +#upkeep next +#draw next +#main1 +next +#combat begin +next +#attackers +Serra Angel +eot [ASSERT] -FIRSTMAIN +UNTAP [PLAYER1] inplay:Serra Angel, Crusade graveyard:Turn to Frog manapool:{0} [PLAYER2] -life:19 -[END] \ No newline at end of file +life:14 +[END] From 69bdac52c7656ea5bc52640a73aaf582f5b2af0c Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Fri, 11 Sep 2015 11:07:48 +0800 Subject: [PATCH 092/249] Create PT_M15_errata2.txt Additional test --- projects/mtg/bin/Res/test/PT_M15_errata2.txt | 41 ++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 projects/mtg/bin/Res/test/PT_M15_errata2.txt diff --git a/projects/mtg/bin/Res/test/PT_M15_errata2.txt b/projects/mtg/bin/Res/test/PT_M15_errata2.txt new file mode 100644 index 000000000..b71083d80 --- /dev/null +++ b/projects/mtg/bin/Res/test/PT_M15_errata2.txt @@ -0,0 +1,41 @@ +#Testing Turn to Frog to Serra Angel with Glorious Anthem in play. +#First attack is 2/2 blue Serra Angel affected by Glorious Anthem +#Second attack is 5/5 Serra Angel affected by Glorious Anthem :) +[INIT] +FIRSTMAIN +[PLAYER1] +inplay:Serra Angel, Glorious Anthem +hand:Turn to Frog +manapool:{1}{U} +[PLAYER2] +[DO] +Turn to Frog +Serra Angel +next +next +Serra Angel +next +eot +eot +#untap +next +#upkeep +next +#draw +next +#main1 +next +#combat begin +next +#attackers +Serra Angel +eot +[ASSERT] +UNTAP +[PLAYER1] +inplay:Serra Angel, Glorious Anthem +graveyard:Turn to Frog +manapool:{0} +[PLAYER2] +life:13 +[END] From 38145957af96a3f11b5a6cb6a8a97b7ce225ac98 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Fri, 11 Sep 2015 11:09:02 +0800 Subject: [PATCH 093/249] Update _tests.txt --- projects/mtg/bin/Res/test/_tests.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/projects/mtg/bin/Res/test/_tests.txt b/projects/mtg/bin/Res/test/_tests.txt index 6c7f3e37f..eede5159b 100644 --- a/projects/mtg/bin/Res/test/_tests.txt +++ b/projects/mtg/bin/Res/test/_tests.txt @@ -535,6 +535,7 @@ prowess_of_the_fair2.txt prowess_of_the_fair3.txt PTInstant.txt PT_M15_errata.txt +PT_M15_errata2.txt pygmy_troll.txt pyknite_i426.txt pyroclasm.txt From 11d68c0e27dd3ddb33d65557ba1e18ce7bc55636 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sat, 12 Sep 2015 12:03:52 +0800 Subject: [PATCH 094/249] Separated PT Modifiers, Fixed Changeling, Modified Counter as a cost CDA Todo --- projects/mtg/include/AllAbilities.h | 58 +++++++++++++------------- projects/mtg/include/Counters.h | 3 +- projects/mtg/include/MTGCardInstance.h | 7 ++++ projects/mtg/src/AllAbilities.cpp | 29 +++++-------- projects/mtg/src/Counters.cpp | 28 +++++++++---- projects/mtg/src/ExtraCost.cpp | 4 +- projects/mtg/src/MTGAbility.cpp | 16 ++++--- projects/mtg/src/MTGCardInstance.cpp | 32 ++++++++++++++ projects/mtg/src/TargetChooser.cpp | 8 +++- 9 files changed, 119 insertions(+), 66 deletions(-) diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index 698eb8a58..6bf905528 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -2260,16 +2260,18 @@ public: { if(!nonstatic) return; - ((MTGCardInstance *) target)->power -= wppt->power.getValue(); - ((MTGCardInstance *) target)->addToToughness(-wppt->toughness.getValue()); + ((MTGCardInstance *) target)->pbonus -= wppt->power.getValue(); + ((MTGCardInstance *) target)->tbonus -= wppt->toughness.getValue(); + ((MTGCardInstance *) target)->applyPTL(); if(PT.size()) { SAFE_DELETE(wppt); wppt = NEW WParsedPT(PT,NULL,(MTGCardInstance *) source); } MTGCardInstance * _target = (MTGCardInstance *) target; - _target->power += wppt->power.getValue(); - _target->addToToughness(wppt->toughness.getValue()); + _target->pbonus += wppt->power.getValue(); + _target->tbonus += wppt->toughness.getValue(); + _target->applyPTL(); } int addToGame() @@ -2280,8 +2282,9 @@ public: SAFE_DELETE(wppt); wppt = NEW WParsedPT(PT,NULL,(MTGCardInstance *) source); } - _target->power += wppt->power.getValue(); - _target->addToToughness(wppt->toughness.getValue()); + _target->pbonus += wppt->power.getValue(); + _target->tbonus += wppt->toughness.getValue(); + _target->applyPTL(); if(_target->has(Constants::INDESTRUCTIBLE) && wppt->toughness.getValue() < 0 && _target->toughness <= 0) { _target->controller()->game->putInGraveyard(_target); @@ -2291,8 +2294,9 @@ public: int destroy() { - ((MTGCardInstance *) target)->power -= wppt->power.getValue(); - ((MTGCardInstance *) target)->addToToughness(-wppt->toughness.getValue()); + ((MTGCardInstance *) target)->pbonus -= wppt->power.getValue(); + ((MTGCardInstance *) target)->tbonus -= wppt->toughness.getValue(); + ((MTGCardInstance *) target)->applyPTL(); return 1; } const string getMenuText() @@ -4027,8 +4031,6 @@ string menu; class ASwapPT: public InstantAbility { public: - int oldpower; - int oldtoughness; ASwapPT(GameObserver* observer, int _id, MTGCardInstance * _source, MTGCardInstance * _target) : InstantAbility(observer, _id, _source, _target) { @@ -4042,13 +4044,13 @@ public: { while (_target->next) _target = _target->next; //This is for cards such as rampant growth - oldpower = _target->power; - oldtoughness = _target->toughness; - - _target->addToToughness(oldpower); - _target->addToToughness(-oldtoughness); - _target->power = oldtoughness; + + if(_target->isPTswitch) + _target->isPTswitch = false; + else + _target->isPTswitch = true; + _target->applyPTL(); } return 1; } @@ -4060,12 +4062,10 @@ public: { while (_target->next) _target = _target->next; //This is for cards such as rampant growth - oldpower = _target->power; - oldtoughness = _target->toughness; + + _target->isPTswitch = false; - _target->addToToughness(oldpower); - _target->addToToughness(-oldtoughness); - _target->power = oldtoughness; + _target->applyPTL(); } return 1; @@ -4307,13 +4307,9 @@ public: string newpower; bool newpowerfound; - - int oldpower; - int oldpowerbonus; string newtoughness; bool newtoughnessfound; - int oldtoughness; - int oldtoughnessbonus; + map > newAbilities; vector newAbilitiesList; bool newAbilityFound; @@ -5651,15 +5647,17 @@ public: { nbOpponents = source->blockers.size(); if (nbOpponents <= MaxOpponent) return 0; - source->power += PowerModifier * (nbOpponents - MaxOpponent); - source->addToToughness(ToughnessModifier * (nbOpponents - MaxOpponent)); + source->pbonus += PowerModifier * (nbOpponents - MaxOpponent); + source->tbonus += ToughnessModifier * (nbOpponents - MaxOpponent); + source->applyPTL(); } else if (WEventPhaseChange* pe = dynamic_cast(event)) { if (MTG_PHASE_AFTER_EOT == pe->to->id && nbOpponents > MaxOpponent) { - source->power -= PowerModifier * (nbOpponents - MaxOpponent); - source->addToToughness(-ToughnessModifier * (nbOpponents - MaxOpponent)); + source->pbonus -= PowerModifier * (nbOpponents - MaxOpponent); + source->tbonus -= ToughnessModifier * (nbOpponents - MaxOpponent); + source->applyPTL(); nbOpponents = 0; } } diff --git a/projects/mtg/include/Counters.h b/projects/mtg/include/Counters.h index 92ea68e7f..26478fa8d 100644 --- a/projects/mtg/include/Counters.h +++ b/projects/mtg/include/Counters.h @@ -33,8 +33,9 @@ public: MTGCardInstance * target; Counters(MTGCardInstance * _target); ~Counters(); - int addCounter(const char * _name, int _power = 0, int _toughness = 0); + int addCounter(const char * _name, int _power = 0, int _toughness = 0, bool _noevent = false); int addCounter(int _power, int _toughness); + int addCounter(int _power, int _toughness, bool _noevent); int removeCounter(const char * _name, int _power = 0, int _toughness = 0); int removeCounter(int _power, int _toughness); Counter * hasCounter(const char * _name, int _power = 0, int _toughness = 0); diff --git a/projects/mtg/include/MTGCardInstance.h b/projects/mtg/include/MTGCardInstance.h index c7132e310..fa7ad35e6 100644 --- a/projects/mtg/include/MTGCardInstance.h +++ b/projects/mtg/include/MTGCardInstance.h @@ -73,8 +73,10 @@ public: int isToken; int origpower; int basepower;//to keep origpower intact + int pbonus; int origtoughness; int basetoughness;//to keep origtoughness intact + int tbonus; int isMultiColored; int isLeveler; bool enchanted; @@ -184,6 +186,11 @@ public: int addToToughness(int value); int setToughness(int value); + bool isSettingBase; + bool isPTswitch; + int oldP; + int oldT; + void applyPTL(); vectorprotections; int addProtection(TargetChooser * tc); diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index cdff3bc9b..f5d54aae1 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -4183,23 +4183,17 @@ for (it = types.begin(); it != types.end(); it++) if(newpowerfound ) {//setting p/t only overrides base p/t as of M15 changes WParsedInt * val = NEW WParsedInt(newpower,NULL, source); - oldpower = _target->power; - oldpowerbonus = oldpower - _target->basepower; - _target->setPower(oldpowerbonus + val->getValue()); _target->basepower = val->getValue(); - //?effects that change pt outside this? - //_target->power += reapplyCountersBonus(_target,false,true); + _target->isSettingBase = true; + _target->applyPTL(); delete val; } if(newtoughnessfound ) {//setting p/t only overrides base p/t as of M15 changes WParsedInt * val = NEW WParsedInt(newtoughness,NULL, source); - oldtoughness = _target->toughness; - oldtoughnessbonus = oldtoughness - _target->basetoughness; - _target->setToughness(oldtoughnessbonus + val->getValue()); _target->basetoughness = val->getValue(); - //_target->addToToughness(reapplyCountersBonus(_target,true,false)); - _target->life = _target->toughness; + _target->isSettingBase = true; + _target->applyPTL(); delete val; } @@ -4286,16 +4280,15 @@ int ATransformer::destroy() if(newpowerfound ) {//override since we changed tha base, the bonus must have changed - oldpowerbonus = (_target->power - _target->basepower);//math hurts my head...it's all over the place :P - _target->setPower(_target->origpower + oldpowerbonus); - _target->basepower = _target->origpower;//revert + _target->isSettingBase = false; + _target->basepower = _target->origpower; + _target->applyPTL(); } if(newtoughnessfound ) - {//override since we changed tha base, the bonus must have changed - oldtoughnessbonus = (_target->toughness - _target->basetoughness); - _target->setToughness(_target->origtoughness + oldtoughnessbonus); - _target->basetoughness = _target->origtoughness;//revert - _target->life = _target->toughness;//update + { + _target->isSettingBase = false; + _target->basetoughness = _target->origtoughness; + _target->applyPTL(); } if(newAbilityFound) { diff --git a/projects/mtg/src/Counters.cpp b/projects/mtg/src/Counters.cpp index f61504e27..bd76e6ff0 100644 --- a/projects/mtg/src/Counters.cpp +++ b/projects/mtg/src/Counters.cpp @@ -56,8 +56,9 @@ int Counter::added() { if (power != 0 || toughness != 0) { - target->power += power; - target->addToToughness(toughness); + target->pbonus += power; + target->tbonus += toughness; + target->applyPTL(); } return 1; } @@ -66,8 +67,9 @@ int Counter::removed() { if (power != 0 || toughness != 0) { - target->power -= power; - target->addToToughness(-toughness); + target->pbonus -= power; + target->tbonus -= toughness; + target->applyPTL(); } return 1; } @@ -85,7 +87,7 @@ Counters::~Counters() } } -int Counters::addCounter(const char * _name, int _power, int _toughness) +int Counters::addCounter(const char * _name, int _power, int _toughness, bool _noevent) { /*420.5n If a permanent has both a +1/+1 counter and a -1/-1 counter on it, N +1/+1 and N -1/-1 counters are removed from it, where N is the smaller of the number of +1/+1 and -1/-1 counters on it.*/ GameObserver *g = target->getObserver(); @@ -109,9 +111,12 @@ int Counters::addCounter(const char * _name, int _power, int _toughness) Counter * counter = NEW Counter(target, _name, _power, _toughness); counters.push_back(counter); counter->added(); - WEvent * w = NEW WEventCounters(this,_name,_power,_toughness,true,false); - dynamic_cast(w)->targetCard = this->target; - g->receiveEvent(w); + if (!_noevent) + { + WEvent * w = NEW WEventCounters(this,_name,_power,_toughness,true,false); + dynamic_cast(w)->targetCard = this->target; + g->receiveEvent(w); + } mCount++; this->target->doDamageTest = 1; this->target->afterDamage(); @@ -122,7 +127,12 @@ int Counters::addCounter(const char * _name, int _power, int _toughness) int Counters::addCounter(int _power, int _toughness) { - return addCounter("", _power, _toughness); + return addCounter("", _power, _toughness, false); +} + +int Counters::addCounter(int _power, int _toughness, bool _noevent) +{ + return addCounter("", _power, _toughness, _noevent); } int Counters::init() diff --git a/projects/mtg/src/ExtraCost.cpp b/projects/mtg/src/ExtraCost.cpp index 8158f6e62..efa341ba6 100644 --- a/projects/mtg/src/ExtraCost.cpp +++ b/projects/mtg/src/ExtraCost.cpp @@ -949,8 +949,8 @@ int CounterCost::doPay() if (counter->nb >= 0) { //Add counters as a cost for (int i = 0; i < counter->nb; i++) - { - target->counters->addCounter(counter->name.c_str(), counter->power, counter->toughness); + {//send no event because its a cost not an effect... for doubling season + target->counters->addCounter(counter->name.c_str(), counter->power, counter->toughness, true); } if (tc) tc->initTargets(); diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index f6b8539c3..0c0e2dd00 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -3597,9 +3597,9 @@ int AbilityFactory::getAbilities(vector * v, Spell * spell, MTGCar if(card->previous && card->previous->morphed && !card->turningOver) { magicText = card->magicTexts["facedown"]; - card->power = 2; + card->basepower = 2; card->life = 2; - card->toughness = 2; + card->basetoughness = 2; card->setColor(0,1); card->name = "Morph"; card->types.clear(); @@ -3607,12 +3607,17 @@ int AbilityFactory::getAbilities(vector * v, Spell * spell, MTGCar card->setType(cre.c_str()); card->basicAbilities.reset(); card->getManaCost()->resetCosts(); + card->isSettingBase = true; + card->applyPTL(); } else if(card && !card->morphed && card->turningOver) { - card->power += card->origpower-2; - card->life += card->origtoughness-2; - card->toughness += card->origtoughness-2; + card->isSettingBase = false; + card->power = card->origpower; + card->basepower = card->origpower; + card->life = card->origtoughness; + card->toughness = card->origtoughness; + card->basetoughness = card->origtoughness; card->setColor(0,1); card->name = card->model->data->name; card->types = card->model->data->types; @@ -3626,6 +3631,7 @@ int AbilityFactory::getAbilities(vector * v, Spell * spell, MTGCar string faceupC= card->magicTexts["faceup"]; magicText.append("\n"); magicText.append(faceupC); + card->applyPTL(); } else if(card && card->hasType(Subtypes::TYPE_EQUIPMENT) && card->target) diff --git a/projects/mtg/src/MTGCardInstance.cpp b/projects/mtg/src/MTGCardInstance.cpp index c2daef4a1..373c2d85a 100644 --- a/projects/mtg/src/MTGCardInstance.cpp +++ b/projects/mtg/src/MTGCardInstance.cpp @@ -37,8 +37,10 @@ MTGCardInstance::MTGCardInstance(MTGCard * card, MTGPlayerCards * arg_belongs_to lifeOrig = life; origpower = power; basepower = origpower; + pbonus = 0; origtoughness = toughness; basetoughness = origtoughness; + tbonus = 0; belongs_to = arg_belongs_to; owner = NULL; if (arg_belongs_to) @@ -51,6 +53,8 @@ MTGCardInstance::MTGCardInstance(MTGCard * card, MTGPlayerCards * arg_belongs_to thatmuch = 0; flanked = 0; castMethod = Constants::NOT_CAST; + isSettingBase = false; + isPTswitch = false; } MTGCardInstance * MTGCardInstance::createSnapShot() @@ -62,6 +66,34 @@ MTGCardInstance::MTGCardInstance(MTGCard * card, MTGPlayerCards * arg_belongs_to return snapShot; } +void MTGCardInstance::applyPTL() +{ + //7a ??how to add cda(Characteristic Defining Ability)?? + power = origpower; + toughness = origtoughness; + //7b + if (isSettingBase) + { + power = basepower; + toughness = basetoughness; + } + //7c - 7d shared? + power += pbonus; + toughness += tbonus; + life = toughness; + //7e switch is last + if (isPTswitch) + { + oldP = power; + oldT = toughness; + this->addToToughness(oldP); + this->addToToughness(-oldT); + this->power = oldT; + } + /* end */ + doDamageTest = 1; +} + void MTGCardInstance::copy(MTGCardInstance * card) { MTGCard * source = card->model; diff --git a/projects/mtg/src/TargetChooser.cpp b/projects/mtg/src/TargetChooser.cpp index fd12b317a..ca085a98e 100644 --- a/projects/mtg/src/TargetChooser.cpp +++ b/projects/mtg/src/TargetChooser.cpp @@ -1078,7 +1078,13 @@ bool TypeTargetChooser::canTarget(Targetable * target,bool withoutProtections) { if (card->hasSubtype(types[i])) return true; - if (card->data->basicAbilities[(int)Constants::CHANGELING]) return true;//changelings can be targeted as any subtype. + if (card->data->basicAbilities[(int)Constants::CHANGELING]) + { + if (!MTGAllCards::isSubtypeOfType(i,Subtypes::TYPE_CREATURE)) + return false; + + return true; + } if(card->getLCName().size()) { if (MTGAllCards::findType(card->getLCName()) == types[i]) From fb9b0b8166fad3d276c7afb9b3944d506845fd9a Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sat, 12 Sep 2015 19:37:35 +0800 Subject: [PATCH 095/249] Added Konda's Banner --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 635d12de9..79db499c3 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -52665,6 +52665,15 @@ power=3 toughness=3 [/card] [card] +name=Konda's Banner +auto={2}:equip target(creature[legendary]|mybattlefield) +auto=teach(creature) transforms((,newability[lord(creature[share!color!]) 1/1],newability[lord(creature[share!types!]) 1/1])) +text=Konda's Banner can be attached only to a legendary creature. -- Creatures that share a color with equipped creature get +1/+1. -- Creatures that share a creature type with equipped creature get +1/+1. -- Equip {2} +mana={2} +type=Legendary Artifact +subtype=Equipment +[/card] +[card] name=Konda's Hatamoto auto=bushido(1/1) auto=aslongas(samurai[legendary]|mybattlefield) 1/2 From 59792b3456f4836f222954d467a078f449a54dcb Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sat, 12 Sep 2015 19:58:09 +0800 Subject: [PATCH 096/249] X in manacost is always 0 except on the stack --- projects/mtg/include/AllAbilities.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index 6bf905528..4c9d88e33 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -170,7 +170,10 @@ private: } else if (s == "manacost") { - intValue = target->getManaCost()->getConvertedCost(); + if (target->currentZone == target->controller()->game->stack)//X is 0 except if it's on the stack + intValue = target->getManaCost()->getConvertedCost() + target->castX; + else + intValue = target->getManaCost()->getConvertedCost(); } else if (s == "azorius")//devotion blue white { From 24187b84139266102e2815db737d4df7a2abfc70 Mon Sep 17 00:00:00 2001 From: xawotihs Date: Sun, 13 Sep 2015 20:54:25 +0200 Subject: [PATCH 097/249] Enable usage of iOS resources from both xcode and theos makefile. Creates iOS package. --- .travis.yml | 2 +- .../{ => iOS/Resources}/Default-568h@2x.png | Bin .../{ => iOS/Resources}/Default-Landscape.png | Bin .../Resources}/Default-Landscape~ipad.png | Bin .../{ => iOS/Resources}/Default-Portrait.png | Bin .../Resources}/Default-Portrait~ipad.png | Bin projects/mtg/{ => iOS/Resources}/Default.png | Bin .../mtg/{ => iOS/Resources}/Default@2x.png | Bin .../mtg/iOS/Resources/EAGLViewController.xib | 333 +++++++++++++ projects/mtg/iOS/Resources/Info.plist | Bin 0 -> 1377 bytes projects/mtg/iOS/Resources/MainWindow.xib | 465 ++++++++++++++++++ .../mtg/iOS/Resources/ResourceRules.plist | 25 + projects/mtg/iOS/Resources/wagic-64x64.png | Bin 0 -> 4415 bytes projects/mtg/wagic.xcodeproj/project.pbxproj | 68 ++- 14 files changed, 852 insertions(+), 41 deletions(-) rename projects/mtg/{ => iOS/Resources}/Default-568h@2x.png (100%) rename projects/mtg/{ => iOS/Resources}/Default-Landscape.png (100%) rename projects/mtg/{ => iOS/Resources}/Default-Landscape~ipad.png (100%) rename projects/mtg/{ => iOS/Resources}/Default-Portrait.png (100%) rename projects/mtg/{ => iOS/Resources}/Default-Portrait~ipad.png (100%) rename projects/mtg/{ => iOS/Resources}/Default.png (100%) rename projects/mtg/{ => iOS/Resources}/Default@2x.png (100%) create mode 100755 projects/mtg/iOS/Resources/EAGLViewController.xib create mode 100644 projects/mtg/iOS/Resources/Info.plist create mode 100755 projects/mtg/iOS/Resources/MainWindow.xib create mode 100644 projects/mtg/iOS/Resources/ResourceRules.plist create mode 100644 projects/mtg/iOS/Resources/wagic-64x64.png diff --git a/.travis.yml b/.travis.yml index eea629472..d416f94ba 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,7 +18,7 @@ script: - /usr/local/opt/qt5/bin/qmake projects/mtg/wagic-qt.pro CONFIG+=graphics - make -j 4 dmg - cd projects/mtg/iOS -- make -j 4 +- make -j 4 package after_success: - python tools/upload-binaries.py -t $GH_TOKEN -s $TRAVIS_COMMIT -l wagic.dmg -r Wagic-macosx.dmg -b $TRAVIS_BRANCH diff --git a/projects/mtg/Default-568h@2x.png b/projects/mtg/iOS/Resources/Default-568h@2x.png similarity index 100% rename from projects/mtg/Default-568h@2x.png rename to projects/mtg/iOS/Resources/Default-568h@2x.png diff --git a/projects/mtg/Default-Landscape.png b/projects/mtg/iOS/Resources/Default-Landscape.png similarity index 100% rename from projects/mtg/Default-Landscape.png rename to projects/mtg/iOS/Resources/Default-Landscape.png diff --git a/projects/mtg/Default-Landscape~ipad.png b/projects/mtg/iOS/Resources/Default-Landscape~ipad.png similarity index 100% rename from projects/mtg/Default-Landscape~ipad.png rename to projects/mtg/iOS/Resources/Default-Landscape~ipad.png diff --git a/projects/mtg/Default-Portrait.png b/projects/mtg/iOS/Resources/Default-Portrait.png similarity index 100% rename from projects/mtg/Default-Portrait.png rename to projects/mtg/iOS/Resources/Default-Portrait.png diff --git a/projects/mtg/Default-Portrait~ipad.png b/projects/mtg/iOS/Resources/Default-Portrait~ipad.png similarity index 100% rename from projects/mtg/Default-Portrait~ipad.png rename to projects/mtg/iOS/Resources/Default-Portrait~ipad.png diff --git a/projects/mtg/Default.png b/projects/mtg/iOS/Resources/Default.png similarity index 100% rename from projects/mtg/Default.png rename to projects/mtg/iOS/Resources/Default.png diff --git a/projects/mtg/Default@2x.png b/projects/mtg/iOS/Resources/Default@2x.png similarity index 100% rename from projects/mtg/Default@2x.png rename to projects/mtg/iOS/Resources/Default@2x.png diff --git a/projects/mtg/iOS/Resources/EAGLViewController.xib b/projects/mtg/iOS/Resources/EAGLViewController.xib new file mode 100755 index 000000000..81b2d2bac --- /dev/null +++ b/projects/mtg/iOS/Resources/EAGLViewController.xib @@ -0,0 +1,333 @@ + + + + 800 + 10D573 + 762 + 1038.29 + 460.00 + + YES + + YES + + + YES + + + + YES + + + + YES + + + YES + + + + YES + + IBFilesOwner + IBIPadFramework + + + IBFirstResponder + IBIPadFramework + + + + + YES + + + + YES + + 0 + + + + + + -1 + + + EAGL View Controller + + + -2 + + + + + + + YES + + YES + -1.CustomClassName + -2.CustomClassName + + + YES + EAGLViewController + UIResponder + + + + YES + + + YES + + + + + YES + + + YES + + + + 3 + + + + YES + + EAGLViewController + UIViewController + + IBProjectSource + Classes/EAGLViewController.h + + + + + YES + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSError.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFileManager.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueObserving.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyedArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSNetServices.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObject.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSPort.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSRunLoop.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSStream.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSThread.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURL.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLConnection.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSXMLParser.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CAAnimation.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CALayer.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIAccessibility.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UINibLoading.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIResponder.h + + + + UIResponder + NSObject + + + + UISearchBar + UIView + + IBFrameworkSource + UIKit.framework/Headers/UISearchBar.h + + + + UISearchDisplayController + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UISearchDisplayController.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UITextField.h + + + + UIView + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIView.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UINavigationController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UIPopoverController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UISplitViewController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UITabBarController.h + + + + UIViewController + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIViewController.h + + + + + 0 + IBIPadFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + wagic.xcodeproj + 3 + 87 + + diff --git a/projects/mtg/iOS/Resources/Info.plist b/projects/mtg/iOS/Resources/Info.plist new file mode 100644 index 0000000000000000000000000000000000000000..b8ab0609cbf969b504dccbf09b8836052a22dcc2 GIT binary patch literal 1377 zcmah}J8;}Y7?!kahy%fECl17U5Ic$UBC_s$xe!7KIqQr?&h~M-%bDOL^X#6{z0WfCErUZ1}@ckRsuwZ8b)lJ>TN(86LZW|l)btwwv>C!v9k7F!zYdnz>}>ML6-GhwXLf+GT1~zZ;?AO4M?ap2OcAc;M>p2uu-G)_xRvWQ*k zY~Nndmoa54w3p~N&_qF@@$iWDDG9nc%M*w7En>z|Vv-L^5usC?arS_0JT6bx#oJhz$72JhyA=lYyJ*wL%9@?iG#nX?8u(b0CB&jw~zXkwor$)})N z)E;oyvE5-!J~08N9B}6U0UbZ27E!%TreBmxyc3()rsjoeWvg0|eP(yk@16IkpUkrt za?ohL*STCPU8?FOS-E#{jpp-yfA(~@R8q@|Qp(Op+t-`TMz_vvenkv+ZdU62tURh$ zWaa+#8WNFoE9q00GRxcCU?h@LM%nZN(pD<-<&3R;jX!IJ3O;~E#appMLOH#E3^ZeU zu8e)(Av`{-d?-84U03EmEVH>mMc5;(3O(UN;d9}k@SX6J@JJjHr$j|u5_QoRKM}ta zzY%{B|CC0gY3U8ADczRtNFPa`O82C%q=(Y?(r?l~;2@X=Ghh~+2k(F_@EQ0Td<%XA zzkpxC@8A#c7x)`I0{=o0?uGl{Bs>g{z-f3Eo`WS=hE;eOUV&HP670ft*n>9o;m1Py PNMg1MH}W-K;1~Y^=XS!T literal 0 HcmV?d00001 diff --git a/projects/mtg/iOS/Resources/MainWindow.xib b/projects/mtg/iOS/Resources/MainWindow.xib new file mode 100755 index 000000000..32b0a474d --- /dev/null +++ b/projects/mtg/iOS/Resources/MainWindow.xib @@ -0,0 +1,465 @@ + + + + 1056 + 10H574 + 823 + 1038.35 + 461.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 132 + + + YES + + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + YES + + YES + + + YES + + + + YES + + IBFilesOwner + IBIPadFramework + + + IBFirstResponder + IBIPadFramework + + + IBIPadFramework + + + + 2 + + + 1 + + IBIPadFramework + NO + + + + 292 + {768, 1024} + + 1 + MSAxIDEAA + + NO + NO + IBIPadFramework + YES + YES + + + + + YES + + + window + + + + 7 + + + + delegate + + + + 8 + + + + glViewController + + + + 12 + + + + + YES + + 0 + + + + + + -1 + + + File's Owner + + + -2 + + + + + 2 + + + YES + + + + + 6 + + + + + 11 + + + EAGL View Controller + + + + + YES + + YES + -1.CustomClassName + -2.CustomClassName + 11.CustomClassName + 11.IBEditorWindowLastContentRect + 11.IBPluginDependency + 2.IBEditorWindowLastContentRect + 2.IBPluginDependency + 2.IBViewBoundsToFrameTransform + 6.CustomClassName + 6.IBPluginDependency + + + YES + UIApplication + UIResponder + EAGLViewController + {{-4, -150}, {500, 698}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + {{0, 4}, {783, 852}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAAAAAAAAxH+AAA + + wagicAppDelegate + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + YES + + + YES + + + + + YES + + + YES + + + + 12 + + + + YES + + EAGLViewController + UIViewController + + IBProjectSource + Classes/EAGLViewController.h + + + + wagicAppDelegate + NSObject + + YES + + YES + glViewController + window + + + YES + EAGLViewController + UIWindow + + + + YES + + YES + glViewController + window + + + YES + + glViewController + EAGLViewController + + + window + UIWindow + + + + + IBProjectSource + Classes/wagicAppDelegate.h + + + + wagicAppDelegate + NSObject + + IBUserSource + + + + + + YES + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSError.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFileManager.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueObserving.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyedArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObject.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSRunLoop.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSThread.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURL.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLConnection.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CAAnimation.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CALayer.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIAccessibility.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UINibLoading.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIResponder.h + + + + UIApplication + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIApplication.h + + + + UIResponder + NSObject + + + + UISearchBar + UIView + + IBFrameworkSource + UIKit.framework/Headers/UISearchBar.h + + + + UISearchDisplayController + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UISearchDisplayController.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIPrintFormatter.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UITextField.h + + + + UIView + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIView.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UINavigationController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UIPopoverController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UISplitViewController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UITabBarController.h + + + + UIViewController + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIViewController.h + + + + UIWindow + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIWindow.h + + + + + 0 + IBIPadFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + wagic.xcodeproj + 3 + 132 + + diff --git a/projects/mtg/iOS/Resources/ResourceRules.plist b/projects/mtg/iOS/Resources/ResourceRules.plist new file mode 100644 index 000000000..e7ec329dc --- /dev/null +++ b/projects/mtg/iOS/Resources/ResourceRules.plist @@ -0,0 +1,25 @@ + + + + + rules + + .* + + Info.plist + + omit + + weight + 10 + + ResourceRules.plist + + omit + + weight + 100 + + + + diff --git a/projects/mtg/iOS/Resources/wagic-64x64.png b/projects/mtg/iOS/Resources/wagic-64x64.png new file mode 100644 index 0000000000000000000000000000000000000000..b54e9a716a7fdfd996d58a2fa5a68a48ce54fb1c GIT binary patch literal 4415 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 FV1l|JToM2P literal 0 HcmV?d00001 diff --git a/projects/mtg/wagic.xcodeproj/project.pbxproj b/projects/mtg/wagic.xcodeproj/project.pbxproj index ccf864056..d65919aff 100755 --- a/projects/mtg/wagic.xcodeproj/project.pbxproj +++ b/projects/mtg/wagic.xcodeproj/project.pbxproj @@ -19,12 +19,6 @@ 12059D7214980B7200DAC43B /* zfs.vcxproj.filters in Resources */ = {isa = PBXBuildFile; fileRef = 12B8122C1404B9E10092E303 /* zfs.vcxproj.filters */; }; 12059D7314980B7200DAC43B /* modrules.xml in Resources */ = {isa = PBXBuildFile; fileRef = 129654D5148AA2390031100B /* modrules.xml */; }; 12059D7414980B7200DAC43B /* README.txt in Resources */ = {isa = PBXBuildFile; fileRef = 128ED37A148BAE7B00C58E83 /* README.txt */; }; - 12059D7914980B7200DAC43B /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = 12211ECA1494811D00641703 /* Default.png */; }; - 12059D7A14980B7200DAC43B /* Default-Landscape~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 12211ECC149481B600641703 /* Default-Landscape~ipad.png */; }; - 12059D7B14980B7200DAC43B /* Default-Portrait~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 12211ECE149481C300641703 /* Default-Portrait~ipad.png */; }; - 12059D7C14980B7200DAC43B /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 12211ED01494823E00641703 /* Default@2x.png */; }; - 12059D7D14980B7200DAC43B /* Default-Landscape.png in Resources */ = {isa = PBXBuildFile; fileRef = 12211ED21494916D00641703 /* Default-Landscape.png */; }; - 12059D7E14980B7200DAC43B /* Default-Portrait.png in Resources */ = {isa = PBXBuildFile; fileRef = 12211ED31494916D00641703 /* Default-Portrait.png */; }; 12059D8014980B7200DAC43B /* Encoding.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CEE232B1128A01F400C34032 /* Encoding.cpp */; }; 12059D8114980B7200DAC43B /* hgecolor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CEE232B4128A01F400C34032 /* hgecolor.cpp */; }; 12059D8214980B7200DAC43B /* hgedistort.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CEE232B5128A01F400C34032 /* hgedistort.cpp */; }; @@ -223,12 +217,6 @@ 12211EB914934A1900641703 /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 12211EB814934A1800641703 /* MobileCoreServices.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; 12211EBB14934A2C00641703 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 12211EBA14934A2C00641703 /* CFNetwork.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; 12211EC91494360C00641703 /* WagicDownloadProgressViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 12211EC81494360C00641703 /* WagicDownloadProgressViewController.m */; }; - 12211ECB1494811D00641703 /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = 12211ECA1494811D00641703 /* Default.png */; }; - 12211ECD149481B600641703 /* Default-Landscape~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 12211ECC149481B600641703 /* Default-Landscape~ipad.png */; }; - 12211ECF149481C400641703 /* Default-Portrait~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 12211ECE149481C300641703 /* Default-Portrait~ipad.png */; }; - 12211ED11494823F00641703 /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 12211ED01494823E00641703 /* Default@2x.png */; }; - 12211ED41494916D00641703 /* Default-Landscape.png in Resources */ = {isa = PBXBuildFile; fileRef = 12211ED21494916D00641703 /* Default-Landscape.png */; }; - 12211ED51494916D00641703 /* Default-Portrait.png in Resources */ = {isa = PBXBuildFile; fileRef = 12211ED31494916D00641703 /* Default-Portrait.png */; }; 12272FC414CD57CF00192DC7 /* SimpleButton.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12272FC314CD57CF00192DC7 /* SimpleButton.cpp */; }; 12272FC514CD57CF00192DC7 /* SimpleButton.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12272FC314CD57CF00192DC7 /* SimpleButton.cpp */; }; 12272FC814CD6A3900192DC7 /* InteractiveButton.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12272FC714CD6A3900192DC7 /* InteractiveButton.cpp */; }; @@ -269,6 +257,13 @@ 12DCD02E14DBE1F90023B966 /* JSfx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12DCD02C14DBE1F90023B966 /* JSfx.cpp */; }; 12DCD03414DBECC50023B966 /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 12DCD03114DBECC50023B966 /* CoreAudio.framework */; }; 12DCD03514DBECC50023B966 /* OpenAL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 12DCD03214DBECC50023B966 /* OpenAL.framework */; }; + 180633481BA5F82D003FB092 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 180633411BA5F82D003FB092 /* Default-568h@2x.png */; }; + 180633491BA5F82D003FB092 /* Default-Landscape.png in Resources */ = {isa = PBXBuildFile; fileRef = 180633421BA5F82D003FB092 /* Default-Landscape.png */; }; + 1806334A1BA5F82D003FB092 /* Default-Landscape~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 180633431BA5F82D003FB092 /* Default-Landscape~ipad.png */; }; + 1806334B1BA5F82D003FB092 /* Default-Portrait.png in Resources */ = {isa = PBXBuildFile; fileRef = 180633441BA5F82D003FB092 /* Default-Portrait.png */; }; + 1806334C1BA5F82D003FB092 /* Default-Portrait~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 180633451BA5F82D003FB092 /* Default-Portrait~ipad.png */; }; + 1806334D1BA5F82D003FB092 /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = 180633461BA5F82D003FB092 /* Default.png */; }; + 1806334E1BA5F82D003FB092 /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 180633471BA5F82D003FB092 /* Default@2x.png */; }; 188B71D01B9B9F9400D5522B /* ioapi.c in Sources */ = {isa = PBXBuildFile; fileRef = 188B71C41B9B9F9400D5522B /* ioapi.c */; }; 188B71D11B9B9F9400D5522B /* unzip.c in Sources */ = {isa = PBXBuildFile; fileRef = 188B71C51B9B9F9400D5522B /* unzip.c */; }; 188B71D21B9B9F9400D5522B /* zip.c in Sources */ = {isa = PBXBuildFile; fileRef = 188B71C61B9B9F9400D5522B /* zip.c */; }; @@ -280,7 +275,6 @@ 751E1F1518FAE53E001B1E16 /* CarouselDeckView.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 751E1F1218FAE53E001B1E16 /* CarouselDeckView.cpp */; }; 751E1F1618FAE53E001B1E16 /* DeckView.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 751E1F1318FAE53E001B1E16 /* DeckView.cpp */; }; 751E1F1718FAE53E001B1E16 /* GridDeckView.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 751E1F1418FAE53E001B1E16 /* GridDeckView.cpp */; }; - 75D209D3181D54FD009916AC /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 75D209D1181D54FD009916AC /* Default-568h@2x.png */; }; 75D209D4181D54FD009916AC /* wagic-80x80.png in Resources */ = {isa = PBXBuildFile; fileRef = 75D209D2181D54FD009916AC /* wagic-80x80.png */; }; CE97CD1E1295AB4300FDFD3B /* SimplePopup.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CE97CD1D1295AB4300FDFD3B /* SimplePopup.cpp */; }; CE9A478512B514BA00C9F38A /* EAGLView.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9A477612B514BA00C9F38A /* EAGLView.m */; }; @@ -477,12 +471,6 @@ 12211EBA14934A2C00641703 /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = System/Library/Frameworks/CFNetwork.framework; sourceTree = SDKROOT; }; 12211EC71494360C00641703 /* WagicDownloadProgressViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WagicDownloadProgressViewController.h; path = UI/WagicDownloadProgressViewController.h; sourceTree = ""; }; 12211EC81494360C00641703 /* WagicDownloadProgressViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = WagicDownloadProgressViewController.m; path = UI/WagicDownloadProgressViewController.m; sourceTree = ""; }; - 12211ECA1494811D00641703 /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Default.png; path = ../Default.png; sourceTree = ""; }; - 12211ECC149481B600641703 /* Default-Landscape~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default-Landscape~ipad.png"; path = "../Default-Landscape~ipad.png"; sourceTree = ""; }; - 12211ECE149481C300641703 /* Default-Portrait~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default-Portrait~ipad.png"; path = "../Default-Portrait~ipad.png"; sourceTree = ""; }; - 12211ED01494823E00641703 /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default@2x.png"; path = "../Default@2x.png"; sourceTree = ""; }; - 12211ED21494916D00641703 /* Default-Landscape.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default-Landscape.png"; path = "../Default-Landscape.png"; sourceTree = ""; }; - 12211ED31494916D00641703 /* Default-Portrait.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default-Portrait.png"; path = "../Default-Portrait.png"; sourceTree = ""; }; 12272FC114CD558C00192DC7 /* SimpleButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleButton.h; sourceTree = ""; }; 12272FC314CD57CF00192DC7 /* SimpleButton.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SimpleButton.cpp; sourceTree = ""; }; 12272FC614CD68FB00192DC7 /* InteractiveButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InteractiveButton.h; sourceTree = ""; }; @@ -557,6 +545,13 @@ 12DCD03014DBECC40023B966 /* AudioUnit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioUnit.framework; path = System/Library/Frameworks/AudioUnit.framework; sourceTree = SDKROOT; }; 12DCD03114DBECC50023B966 /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; }; 12DCD03214DBECC50023B966 /* OpenAL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenAL.framework; path = System/Library/Frameworks/OpenAL.framework; sourceTree = SDKROOT; }; + 180633411BA5F82D003FB092 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default-568h@2x.png"; path = "Resources/Default-568h@2x.png"; sourceTree = ""; }; + 180633421BA5F82D003FB092 /* Default-Landscape.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default-Landscape.png"; path = "Resources/Default-Landscape.png"; sourceTree = ""; }; + 180633431BA5F82D003FB092 /* Default-Landscape~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default-Landscape~ipad.png"; path = "Resources/Default-Landscape~ipad.png"; sourceTree = ""; }; + 180633441BA5F82D003FB092 /* Default-Portrait.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default-Portrait.png"; path = "Resources/Default-Portrait.png"; sourceTree = ""; }; + 180633451BA5F82D003FB092 /* Default-Portrait~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default-Portrait~ipad.png"; path = "Resources/Default-Portrait~ipad.png"; sourceTree = ""; }; + 180633461BA5F82D003FB092 /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Default.png; path = Resources/Default.png; sourceTree = ""; }; + 180633471BA5F82D003FB092 /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default@2x.png"; path = "Resources/Default@2x.png"; sourceTree = ""; }; 188B71C31B9B9F9400D5522B /* crypt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = crypt.h; path = unzip/crypt.h; sourceTree = ""; }; 188B71C41B9B9F9400D5522B /* ioapi.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ioapi.c; path = unzip/ioapi.c; sourceTree = ""; }; 188B71C51B9B9F9400D5522B /* unzip.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = unzip.c; path = unzip/unzip.c; sourceTree = ""; }; @@ -578,7 +573,6 @@ 751E1F1218FAE53E001B1E16 /* CarouselDeckView.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CarouselDeckView.cpp; sourceTree = ""; }; 751E1F1318FAE53E001B1E16 /* DeckView.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DeckView.cpp; sourceTree = ""; }; 751E1F1418FAE53E001B1E16 /* GridDeckView.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GridDeckView.cpp; sourceTree = ""; }; - 75D209D1181D54FD009916AC /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = SOURCE_ROOT; }; 75D209D2181D54FD009916AC /* wagic-80x80.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "wagic-80x80.png"; sourceTree = SOURCE_ROOT; }; 8D1107310486CEB800E47090 /* wagic-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "wagic-Info.plist"; plistStructureDefinitionIdentifier = "com.apple.xcode.plist.structure-definition.iphone.info-plist"; sourceTree = ""; }; CE8B8A231299C22900A3CDEF /* DebugRoutines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DebugRoutines.h; sourceTree = ""; }; @@ -1057,14 +1051,14 @@ 128FB96A149537A600ED4EE6 /* Images */ = { isa = PBXGroup; children = ( - 75D209D1181D54FD009916AC /* Default-568h@2x.png */, + 180633411BA5F82D003FB092 /* Default-568h@2x.png */, + 180633421BA5F82D003FB092 /* Default-Landscape.png */, + 180633431BA5F82D003FB092 /* Default-Landscape~ipad.png */, + 180633441BA5F82D003FB092 /* Default-Portrait.png */, + 180633451BA5F82D003FB092 /* Default-Portrait~ipad.png */, + 180633461BA5F82D003FB092 /* Default.png */, + 180633471BA5F82D003FB092 /* Default@2x.png */, 75D209D2181D54FD009916AC /* wagic-80x80.png */, - 12211ED21494916D00641703 /* Default-Landscape.png */, - 12211ED31494916D00641703 /* Default-Portrait.png */, - 12211ED01494823E00641703 /* Default@2x.png */, - 12211ECE149481C300641703 /* Default-Portrait~ipad.png */, - 12211ECC149481B600641703 /* Default-Landscape~ipad.png */, - 12211ECA1494811D00641703 /* Default.png */, ); name = Images; sourceTree = ""; @@ -1739,12 +1733,6 @@ 12059D7214980B7200DAC43B /* zfs.vcxproj.filters in Resources */, 12059D7314980B7200DAC43B /* modrules.xml in Resources */, 12059D7414980B7200DAC43B /* README.txt in Resources */, - 12059D7914980B7200DAC43B /* Default.png in Resources */, - 12059D7A14980B7200DAC43B /* Default-Landscape~ipad.png in Resources */, - 12059D7B14980B7200DAC43B /* Default-Portrait~ipad.png in Resources */, - 12059D7C14980B7200DAC43B /* Default@2x.png in Resources */, - 12059D7D14980B7200DAC43B /* Default-Landscape.png in Resources */, - 12059D7E14980B7200DAC43B /* Default-Portrait.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1753,25 +1741,25 @@ buildActionMask = 2147483647; files = ( F233DC3812A111EB008594F2 /* wagic-64x64.png in Resources */, + 1806334B1BA5F82D003FB092 /* Default-Portrait.png in Resources */, F2CDD5E312A6F7A2007B35AF /* EAGLViewController.xib in Resources */, CECB67E112B517C000321D5A /* MainWindow.xib in Resources */, 127D4C6F1376B33200109AB4 /* mtg.txt in Resources */, + 1806334C1BA5F82D003FB092 /* Default-Portrait~ipad.png in Resources */, 12B812341404B9E20092E303 /* !Pak0.cpk in Resources */, + 180633481BA5F82D003FB092 /* Default-568h@2x.png in Resources */, + 1806334A1BA5F82D003FB092 /* Default-Landscape~ipad.png in Resources */, 12B812351404B9E20092E303 /* !Pak1.cpk in Resources */, 12B812391404B9E20092E303 /* zfs.sln in Resources */, + 1806334D1BA5F82D003FB092 /* Default.png in Resources */, + 1806334E1BA5F82D003FB092 /* Default@2x.png in Resources */, + 180633491BA5F82D003FB092 /* Default-Landscape.png in Resources */, 12B8123A1404B9E20092E303 /* zfs.vcproj in Resources */, 12B8123B1404B9E20092E303 /* zfs.vcxproj in Resources */, 12B8123C1404B9E20092E303 /* zfs.vcxproj.filters in Resources */, 129654D6148AA23A0031100B /* modrules.xml in Resources */, 128ED37C148BAE7B00C58E83 /* README.txt in Resources */, - 75D209D3181D54FD009916AC /* Default-568h@2x.png in Resources */, - 12211ECB1494811D00641703 /* Default.png in Resources */, 75D209D4181D54FD009916AC /* wagic-80x80.png in Resources */, - 12211ECD149481B600641703 /* Default-Landscape~ipad.png in Resources */, - 12211ECF149481C400641703 /* Default-Portrait~ipad.png in Resources */, - 12211ED11494823F00641703 /* Default@2x.png in Resources */, - 12211ED41494916D00641703 /* Default-Landscape.png in Resources */, - 12211ED51494916D00641703 /* Default-Portrait.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; From 743b2608136ffaf01a42c767e3cfdc16d6a81428 Mon Sep 17 00:00:00 2001 From: xawotihs Date: Sun, 13 Sep 2015 23:50:21 +0200 Subject: [PATCH 098/249] Adds control file --- projects/mtg/iOS/control | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 projects/mtg/iOS/control diff --git a/projects/mtg/iOS/control b/projects/mtg/iOS/control new file mode 100644 index 000000000..5e3a20f29 --- /dev/null +++ b/projects/mtg/iOS/control @@ -0,0 +1,12 @@ +Package: net.wagic +Name: wagic +Depends: +Version: 0.19.2 +Architecture: iphoneos-arm +Description: Wagic is an heroic fantasy collectible trading card game + In Wagic, you play/Users/ybi/Documents/wagic/tools/Makefile.backup as a wizard against the CPU with your army of minions. You start the game with a small collection of cards (symbolizing creatures and spells), and as you win battles against the AI, you earn credits that allow you to buy more cards and build more powerful decks. + As you play, you unlock cards and new game modes, so Wagic is much more than a simple card simulation. Wagic features several thousands of cards in the official release,but if that’s not enough for you, it is highly customizable and allows to create your own cards and mods. +Homepage: https://github.com/WagicProject/wagic +Maintainer: WagicProject +Author: WagicProject +Section: Games From 7df76697e146a22324c8261f286530b0779c7702 Mon Sep 17 00:00:00 2001 From: xawotihs Date: Mon, 14 Sep 2015 23:50:19 +0200 Subject: [PATCH 099/249] Added iOS package upload after successfull build --- tools/macos.travis.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tools/macos.travis.yml b/tools/macos.travis.yml index 3858e7193..ebdd04c69 100644 --- a/tools/macos.travis.yml +++ b/tools/macos.travis.yml @@ -1,15 +1,25 @@ language: objective-c + before_install: - brew update - brew install qt5 - sudo pip install pyjavaproperties - sudo pip install github3.py +- brew install dpkg +- curl -s -f -L https://raw.github.com/r-plus/dotfiles/master/install_theos.sh | bash +- pwd +- ls env: global: secure: "EBzr1+qjQsOhn0s+tcFmXR1jP9B0xiOSXuXbRXWZ1OEHNvp8+A5/pS84LYVFlaZqmxr5dApxvPtwhgLIUbQ3EPXm8LpC3KgSD4dS+9/QMbxhe5TK4oczgFRGcDTMJQZsCzhOh7hp3tbcbJg5Gp+VT7aFjFQSHDGwhzSJXsXwh/8=" + script: - /usr/local/opt/qt5/bin/qmake projects/mtg/wagic-qt.pro CONFIG+=graphics - make -j 4 dmg +- cd projects/mtg/iOS +- make -j 4 package + after_success: - python tools/upload-binaries.py -t $GH_TOKEN -s $TRAVIS_COMMIT -l wagic.dmg -r Wagic-macosx.dmg -b $TRAVIS_BRANCH +- python tools/upload-binaries.py -t $GH_TOKEN -s $TRAVIS_COMMIT -l net.wagic_0.19.2-1_iphoneos-arm.deb -r Wagic-iOS.deb -b $TRAVIS_BRANCH From 07e1c139baf6b1ae06f475ef2cfe1dbf8777230b Mon Sep 17 00:00:00 2001 From: xawotihs Date: Mon, 14 Sep 2015 23:55:33 +0200 Subject: [PATCH 100/249] Restored .travis file back to its original state --- .travis.yml | 64 +++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 50 insertions(+), 14 deletions(-) diff --git a/.travis.yml b/.travis.yml index d416f94ba..7c3c5011d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,24 +1,60 @@ -language: objective-c +language: cpp +branches: + except: + - latest-master before_install: -- brew update -- brew install qt5 + - export BUILD_PSP=YES + - export BUILD_ANDROID=YES + - export BUILD_Qt=YES + - export BUILD_MAC=YES + - sudo apt-get update -qq +# Building for PSP here + - if [ "$BUILD_PSP" == "YES" ]; then + export PSPDEV="$TRAVIS_BUILD_DIR/opt/pspsdk" && + export PSPSDK="$PSPDEV/psp/sdk" && + export PATH="$PATH:$PSPDEV/bin:$PSPSDK/bin" && + wget -O sdk.lzma http://sourceforge.net/projects/minpspw/files/SDK%20%2B%20devpak/pspsdk%200.11.2/minpspw_0.11.2-amd64.tar.lzma/download; + fi +# Building for Android here + - if [ "$BUILD_ANDROID" == "YES" ]; then + export ANDROID="android-sdk-linux/tools/android" && + if [ `uname -m` = x86_64 ]; then sudo apt-get install -qq --force-yes libgd2-xpm ia32-libs ia32-libs-multiarch jq; fi && + wget http://dl.google.com/android/ndk/android-ndk-r9-linux-x86_64.tar.bz2 -nv && + wget http://dl.google.com/android/android-sdk_r24.3.3-linux.tgz -nv; + fi +# Building for Qt here + - if [ "$BUILD_Qt" == "YES" ]; then + sudo add-apt-repository --yes ppa:ubuntu-sdk-team/ppa && + sudo apt-get update -qq && + sudo apt-get install -qq qt5-qmake qtbase5-dev qtdeclarative5-dev qttools5-dev qtmultimedia5-dev pulseaudio libpulse-dev && + export QMAKE="qmake -qt=qt5"; + fi + +install: +- if [ "$BUILD_PSP" == "YES" ]; then + tar -x --xz -f sdk.lzma; + fi +- if [ "$BUILD_ANDROID" == "YES" ]; then + tar --absolute-names -jxf android-ndk-r9-linux-x86_64.tar.bz2 && + tar -zxf android-sdk_r24.3.3-linux.tgz && + $ANDROID list sdk --extended -a && + echo yes | $ANDROID update sdk -a -t tools,platform-tools,build-tools-22.0.1,android-10 --no-ui --force --no-https; + fi - sudo pip install pyjavaproperties - sudo pip install github3.py -- brew install dpkg -- curl -s -f -L https://raw.github.com/r-plus/dotfiles/master/install_theos.sh | bash -- pwd -- ls +- sudo pip install cpp-coveralls env: global: - secure: "EBzr1+qjQsOhn0s+tcFmXR1jP9B0xiOSXuXbRXWZ1OEHNvp8+A5/pS84LYVFlaZqmxr5dApxvPtwhgLIUbQ3EPXm8LpC3KgSD4dS+9/QMbxhe5TK4oczgFRGcDTMJQZsCzhOh7hp3tbcbJg5Gp+VT7aFjFQSHDGwhzSJXsXwh/8=" + - secure: "EBzr1+qjQsOhn0s+tcFmXR1jP9B0xiOSXuXbRXWZ1OEHNvp8+A5/pS84LYVFlaZqmxr5dApxvPtwhgLIUbQ3EPXm8LpC3KgSD4dS+9/QMbxhe5TK4oczgFRGcDTMJQZsCzhOh7hp3tbcbJg5Gp+VT7aFjFQSHDGwhzSJXsXwh/8=" + - secure: "X5dTQfofqAutnXxmu11Ep2MQ5QYnMN8m0AITRtwymhEF2UclcOudI1+skPtuhAGbWQnSO+lhunV3cvMfw2/Ml3k/VDz6VdFSKFrzAu7ja1VLJfcxr7chi0s8q30pVBb66tGydjIBac3B+RQyqgmZQW1frbRrhC/kPFQ6wPWOJdQ=" + - secure: "T97NUPnxCpVZ/c5HH0zfo0FO3DPSRMSmze58ubW5EUTZOjAMtEt+OFdsrNZvUTCugUj2M1agtonZbAbczpaAL+lgZcHDgXgWMkfO0pMnsWX1yyCNqMuE/iTMpJr/xsLQeyWlftWjJLsseQU45abZsd1XVmda/G+ZhrDLF1y55SA=" -script: -- /usr/local/opt/qt5/bin/qmake projects/mtg/wagic-qt.pro CONFIG+=graphics -- make -j 4 dmg -- cd projects/mtg/iOS -- make -j 4 package +script: "tools/travis-script.sh" after_success: -- python tools/upload-binaries.py -t $GH_TOKEN -s $TRAVIS_COMMIT -l wagic.dmg -r Wagic-macosx.dmg -b $TRAVIS_BRANCH +- coveralls -b . -e JGE/src -e JGE/include -i projects/mtg/include -i projects/mtg/src --gcov-options '\-lp' +- python tools/upload-binaries.py -t $GH_TOKEN -s $TRAVIS_COMMIT -l core.zip -r Wagic-core.zip -b $TRAVIS_BRANCH +- python tools/upload-binaries.py -t $GH_TOKEN -s $TRAVIS_COMMIT -l projects/mtg/Android/bin/Wagic-debug.apk -r Wagic-android.apk -b $TRAVIS_BRANCH +- python tools/upload-binaries.py -t $GH_TOKEN -s $TRAVIS_COMMIT -l projects/mtg/psprelease.zip -r Wagic-psp.zip -b $TRAVIS_BRANCH From 72aaa18a35a17b344166c09a24e9128196dbc841 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Tue, 15 Sep 2015 06:35:07 +0800 Subject: [PATCH 101/249] CDA CDA works by using "cdaactive" keyword on PT changes. Instead of granting bonus, we modify the orig power and toughness since they are dynamic PT. cdaactive are for cards like maro, tarmogoyf, etc. To Follow/To Do: Additional Tests and other bug fix --- projects/mtg/include/AllAbilities.h | 131 +++++++++++++++++++++++---- projects/mtg/src/MTGAbility.cpp | 9 +- projects/mtg/src/MTGCardInstance.cpp | 10 +- 3 files changed, 124 insertions(+), 26 deletions(-) diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index 4c9d88e33..a3ec7c5f3 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -642,6 +642,81 @@ private: { intValue = target->controller()->opponent()->game->hand->nb_cards; } + else if (s == "pgbzombie")//Soulless One + { + intValue = 0; + for (int i = 0; i < 2; i++) + { + Player * p = card->getObserver()->players[i]; + for (int j = p->game->graveyard->nb_cards - 1; j >= 0; --j) + { + if (p->game->graveyard->cards[j]->hasType("zombie")) + { + intValue += 1; + } + } + for (int j = p->game->inPlay->nb_cards - 1; j >= 0; --j) + { + if (p->game->inPlay->cards[j]->hasType("zombie")) + { + intValue += 1; + } + } + } + } + else if (s == "pginstantsorcery")//Spellheart Chimera + { + intValue = 0; + for (int j = card->controller()->game->graveyard->nb_cards - 1; j >= 0; --j) + { + if (card->controller()->game->graveyard->cards[j]->hasType(Subtypes::TYPE_INSTANT) + ||card->controller()->game->graveyard->cards[j]->hasType(Subtypes::TYPE_SORCERY)) + { + intValue += 1; + } + } + } + else if (s == "gravecardtypes")//Tarmogoyf + { + intValue = 0; + bool art, cre, enc, ins, lnd, sor, trb, pwk = false; + for (int i = 0; i < 2; i++) + { + Player * p = card->getObserver()->players[i]; + if(p->game->graveyard->hasType("planeswalker")) + pwk = true; + if(p->game->graveyard->hasType("tribal")) + trb = true; + if(p->game->graveyard->hasType("sorcery")) + sor = true; + if(p->game->graveyard->hasType("land")) + lnd = true; + if(p->game->graveyard->hasType("instant")) + ins = true; + if(p->game->graveyard->hasType("enchantment")) + enc = true; + if(p->game->graveyard->hasType("creature")) + cre = true; + if(p->game->graveyard->hasType("artifact")) + art = true; + } + if (art) + intValue += 1; + if (cre) + intValue += 1; + if (enc) + intValue += 1; + if (ins) + intValue += 1; + if (lnd) + intValue += 1; + if (sor) + intValue += 1; + if (trb) + intValue += 1; + if (pwk) + intValue += 1; + } else if (s == "morethanfourcards") { if(card->playerTarget) @@ -2253,30 +2328,37 @@ public: WParsedPT * wppt; string PT; bool nonstatic; + bool cda; 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; - } - - void Update(float) + cda = PT.find("cdaactive") != string::npos; + } + void Update(float) + { + if(!nonstatic) + return; + if(!((MTGCardInstance *) target)->isSettingBase) { - if(!nonstatic) - return; - ((MTGCardInstance *) target)->pbonus -= wppt->power.getValue(); - ((MTGCardInstance *) target)->tbonus -= wppt->toughness.getValue(); - ((MTGCardInstance *) target)->applyPTL(); + ((MTGCardInstance *) target)->power -= wppt->power.getValue(); + ((MTGCardInstance *) target)->addToToughness(-wppt->toughness.getValue()); if(PT.size()) { SAFE_DELETE(wppt); wppt = NEW WParsedPT(PT,NULL,(MTGCardInstance *) source); } MTGCardInstance * _target = (MTGCardInstance *) target; - _target->pbonus += wppt->power.getValue(); - _target->tbonus += wppt->toughness.getValue(); - _target->applyPTL(); + _target->power += wppt->power.getValue(); + _target->addToToughness(wppt->toughness.getValue()); + //update + if(cda) + {//7a update wppt + _target->origpower = wppt->power.getValue(); + _target->origtoughness = wppt->toughness.getValue(); + } } - + } int addToGame() { MTGCardInstance * _target = (MTGCardInstance *) target; @@ -2285,21 +2367,36 @@ public: SAFE_DELETE(wppt); wppt = NEW WParsedPT(PT,NULL,(MTGCardInstance *) source); } - _target->pbonus += wppt->power.getValue(); - _target->tbonus += wppt->toughness.getValue(); - _target->applyPTL(); + if(cda) + {//Characteristic-defining abilities + _target->origpower = wppt->power.getValue(); + _target->origtoughness = wppt->toughness.getValue(); + _target->applyPTL(); + } + else + { + _target->pbonus += wppt->power.getValue(); + _target->tbonus += wppt->toughness.getValue(); + _target->applyPTL(); + } if(_target->has(Constants::INDESTRUCTIBLE) && wppt->toughness.getValue() < 0 && _target->toughness <= 0) { _target->controller()->game->putInGraveyard(_target); } return MTGAbility::addToGame(); } - int destroy() { + if(cda) + { + ; + } + else + { ((MTGCardInstance *) target)->pbonus -= wppt->power.getValue(); ((MTGCardInstance *) target)->tbonus -= wppt->toughness.getValue(); ((MTGCardInstance *) target)->applyPTL(); + } return 1; } const string getMenuText() @@ -2318,12 +2415,10 @@ public: a->wppt = NEW WParsedPT(*(a->wppt)); return a; } - ~APowerToughnessModifier() { delete (wppt); } - }; class GenericInstantAbility: public InstantAbility, public NestedAbility diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index 0c0e2dd00..68afc32f0 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -2629,7 +2629,7 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG int MaxOpponent = atoi(rampageParameters[1].c_str()); return NEW ARampageAbility(observer, id, card, power, toughness, MaxOpponent); } - + //evole if (s.find("evolve") != string::npos) { @@ -2924,7 +2924,12 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG { return NEW PTInstant(observer, id, card, target, wppt,s,nonstatic); } - return NEW APowerToughnessModifier(observer, id, card, target, wppt,s,nonstatic); + else if(s.find("cdaactive") != string::npos) + { + return NEW APowerToughnessModifier(observer, id, card, target, wppt,s,true); + } + else + return NEW APowerToughnessModifier(observer, id, card, target, wppt,s,nonstatic); } return NEW PTInstant(observer, id, card, target, wppt,s,nonstatic); } diff --git a/projects/mtg/src/MTGCardInstance.cpp b/projects/mtg/src/MTGCardInstance.cpp index 373c2d85a..6901738f5 100644 --- a/projects/mtg/src/MTGCardInstance.cpp +++ b/projects/mtg/src/MTGCardInstance.cpp @@ -68,7 +68,7 @@ MTGCardInstance::MTGCardInstance(MTGCard * card, MTGPlayerCards * arg_belongs_to void MTGCardInstance::applyPTL() { - //7a ??how to add cda(Characteristic Defining Ability)?? + //7a ??(Characteristic Defining Ability)?? power = origpower; toughness = origtoughness; //7b @@ -80,17 +80,15 @@ void MTGCardInstance::applyPTL() //7c - 7d shared? power += pbonus; toughness += tbonus; - life = toughness; //7e switch is last if (isPTswitch) { oldP = power; oldT = toughness; - this->addToToughness(oldP); - this->addToToughness(-oldT); - this->power = oldT; + toughness = oldP; + power = oldT; } - /* end */ + life = toughness; doDamageTest = 1; } From fdfb8e0c34e23cd1fea25d8aba4412de3a221aa3 Mon Sep 17 00:00:00 2001 From: Xawotihs Date: Tue, 15 Sep 2015 07:58:24 +0200 Subject: [PATCH 102/249] Should fix package upload --- tools/macos.travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/macos.travis.yml b/tools/macos.travis.yml index ebdd04c69..1ff9154bb 100644 --- a/tools/macos.travis.yml +++ b/tools/macos.travis.yml @@ -19,7 +19,8 @@ script: - make -j 4 dmg - cd projects/mtg/iOS - make -j 4 package +- cd ../../.. after_success: - python tools/upload-binaries.py -t $GH_TOKEN -s $TRAVIS_COMMIT -l wagic.dmg -r Wagic-macosx.dmg -b $TRAVIS_BRANCH -- python tools/upload-binaries.py -t $GH_TOKEN -s $TRAVIS_COMMIT -l net.wagic_0.19.2-1_iphoneos-arm.deb -r Wagic-iOS.deb -b $TRAVIS_BRANCH +- python tools/upload-binaries.py -t $GH_TOKEN -s $TRAVIS_COMMIT -l projects/mtg/iOS/net.wagic_0.19.2-1_iphoneos-arm.deb -r Wagic-iOS.deb -b $TRAVIS_BRANCH From 6aab17d0b35d5409c79a62c10f25dea6c8a4c21f Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Wed, 16 Sep 2015 06:42:02 +0800 Subject: [PATCH 103/249] CDA complete This fixes the bug I introduced lst time. The damage was not taking into account, but this time the damage reflects... TODO/TOFOLLOW: update test and update all cards that uses CDA :) --- projects/mtg/include/AllAbilities.h | 115 +++++++++++++------------ projects/mtg/include/MTGCardInstance.h | 5 -- projects/mtg/src/AllAbilities.cpp | 30 ++++--- projects/mtg/src/Counters.cpp | 10 ++- projects/mtg/src/MTGAbility.cpp | 16 ++-- projects/mtg/src/MTGCardInstance.cpp | 28 ------ 6 files changed, 94 insertions(+), 110 deletions(-) diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index a3ec7c5f3..49d29f760 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -679,43 +679,28 @@ private: else if (s == "gravecardtypes")//Tarmogoyf { intValue = 0; - bool art, cre, enc, ins, lnd, sor, trb, pwk = false; + int art, cre, enc, ins, lnd, sor, trb, pwk = 0; for (int i = 0; i < 2; i++) { Player * p = card->getObserver()->players[i]; if(p->game->graveyard->hasType("planeswalker")) - pwk = true; + pwk = 1; if(p->game->graveyard->hasType("tribal")) - trb = true; + trb = 1; if(p->game->graveyard->hasType("sorcery")) - sor = true; + sor = 1; if(p->game->graveyard->hasType("land")) - lnd = true; + lnd = 1; if(p->game->graveyard->hasType("instant")) - ins = true; + ins = 1; if(p->game->graveyard->hasType("enchantment")) - enc = true; + enc = 1; if(p->game->graveyard->hasType("creature")) - cre = true; + cre = 1; if(p->game->graveyard->hasType("artifact")) - art = true; + art = 1; } - if (art) - intValue += 1; - if (cre) - intValue += 1; - if (enc) - intValue += 1; - if (ins) - intValue += 1; - if (lnd) - intValue += 1; - if (sor) - intValue += 1; - if (trb) - intValue += 1; - if (pwk) - intValue += 1; + intValue = art + cre + enc + ins + lnd + sor + trb + pwk; } else if (s == "morethanfourcards") { @@ -2339,24 +2324,28 @@ public: { if(!nonstatic) return; - if(!((MTGCardInstance *) target)->isSettingBase) + if(!cda) { ((MTGCardInstance *) target)->power -= wppt->power.getValue(); ((MTGCardInstance *) target)->addToToughness(-wppt->toughness.getValue()); if(PT.size()) - { - SAFE_DELETE(wppt); - wppt = NEW WParsedPT(PT,NULL,(MTGCardInstance *) source); - } + { + SAFE_DELETE(wppt); + wppt = NEW WParsedPT(PT,NULL,(MTGCardInstance *) source); + } MTGCardInstance * _target = (MTGCardInstance *) target; _target->power += wppt->power.getValue(); _target->addToToughness(wppt->toughness.getValue()); - //update - if(cda) - {//7a update wppt - _target->origpower = wppt->power.getValue(); - _target->origtoughness = wppt->toughness.getValue(); - } + } + else + {//CDA 7a update wppt + if(PT.size()) + { + SAFE_DELETE(wppt); + wppt = NEW WParsedPT(PT,NULL,(MTGCardInstance *) source); + } + ((MTGCardInstance *) target)->origpower = wppt->power.getValue(); + ((MTGCardInstance *) target)->origtoughness = wppt->toughness.getValue(); } } int addToGame() @@ -2369,15 +2358,23 @@ public: } if(cda) {//Characteristic-defining abilities - _target->origpower = wppt->power.getValue(); - _target->origtoughness = wppt->toughness.getValue(); - _target->applyPTL(); + _target->origpower = wppt->power.getValue();//set orig pt + _target->origtoughness = wppt->toughness.getValue(); + _target->power -= _target->pbonus;//remove current bonuses + _target->addToToughness(-_target->tbonus); + _target->setPower(_target->origpower);//update PT + _target->setToughness(_target->origtoughness); + _target->power += _target->pbonus;//add new bonus + _target->addToToughness(_target->tbonus); } else { - _target->pbonus += wppt->power.getValue(); + _target->power -= _target->pbonus;//remove current bonuses + _target->addToToughness(-_target->tbonus); + _target->pbonus += wppt->power.getValue();//update bonus _target->tbonus += wppt->toughness.getValue(); - _target->applyPTL(); + _target->power += _target->pbonus;//add new bonus + _target->addToToughness(_target->tbonus); } if(_target->has(Constants::INDESTRUCTIBLE) && wppt->toughness.getValue() < 0 && _target->toughness <= 0) { @@ -2393,9 +2390,12 @@ public: } else { + ((MTGCardInstance *) target)->power -= ((MTGCardInstance *) target)->pbonus; + ((MTGCardInstance *) target)->addToToughness(-((MTGCardInstance *) target)->tbonus); ((MTGCardInstance *) target)->pbonus -= wppt->power.getValue(); ((MTGCardInstance *) target)->tbonus -= wppt->toughness.getValue(); - ((MTGCardInstance *) target)->applyPTL(); + ((MTGCardInstance *) target)->power += ((MTGCardInstance *) target)->pbonus; + ((MTGCardInstance *) target)->addToToughness(((MTGCardInstance *) target)->tbonus); } return 1; } @@ -4129,6 +4129,8 @@ string menu; class ASwapPT: public InstantAbility { public: + int oldP; + int oldT; ASwapPT(GameObserver* observer, int _id, MTGCardInstance * _source, MTGCardInstance * _target) : InstantAbility(observer, _id, _source, _target) { @@ -4143,12 +4145,11 @@ public: while (_target->next) _target = _target->next; //This is for cards such as rampant growth - if(_target->isPTswitch) - _target->isPTswitch = false; - else - _target->isPTswitch = true; - - _target->applyPTL(); + oldP = _target->power; + oldT = _target->toughness; + _target->addToToughness(oldP); + _target->addToToughness(-oldT); + _target->setPower(oldT); } return 1; } @@ -4161,9 +4162,11 @@ public: while (_target->next) _target = _target->next; //This is for cards such as rampant growth - _target->isPTswitch = false; - - _target->applyPTL(); + oldP = _target->power; + oldT = _target->toughness; + _target->addToToughness(oldP); + _target->addToToughness(-oldT); + _target->setPower(oldT); } return 1; @@ -5745,17 +5748,23 @@ public: { nbOpponents = source->blockers.size(); if (nbOpponents <= MaxOpponent) return 0; + source->power -= source->pbonus; + source->addToToughness(-source->tbonus); source->pbonus += PowerModifier * (nbOpponents - MaxOpponent); source->tbonus += ToughnessModifier * (nbOpponents - MaxOpponent); - source->applyPTL(); + source->power += source->pbonus; + source->addToToughness(source->tbonus); } else if (WEventPhaseChange* pe = dynamic_cast(event)) { if (MTG_PHASE_AFTER_EOT == pe->to->id && nbOpponents > MaxOpponent) { + source->power -= source->pbonus; + source->addToToughness(-source->tbonus); source->pbonus -= PowerModifier * (nbOpponents - MaxOpponent); source->tbonus -= ToughnessModifier * (nbOpponents - MaxOpponent); - source->applyPTL(); + source->power += source->pbonus; + source->addToToughness(source->tbonus); nbOpponents = 0; } } diff --git a/projects/mtg/include/MTGCardInstance.h b/projects/mtg/include/MTGCardInstance.h index fa7ad35e6..0ecd3b749 100644 --- a/projects/mtg/include/MTGCardInstance.h +++ b/projects/mtg/include/MTGCardInstance.h @@ -186,11 +186,6 @@ public: int addToToughness(int value); int setToughness(int value); - bool isSettingBase; - bool isPTswitch; - int oldP; - int oldT; - void applyPTL(); vectorprotections; int addProtection(TargetChooser * tc); diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index f5d54aae1..0e6f192d8 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -4181,19 +4181,23 @@ for (it = types.begin(); it != types.end(); it++) } } if(newpowerfound ) - {//setting p/t only overrides base p/t as of M15 changes + { WParsedInt * val = NEW WParsedInt(newpower,NULL, source); _target->basepower = val->getValue(); - _target->isSettingBase = true; - _target->applyPTL(); + _target->power -= _target->pbonus; + _target->power = (_target->power + _target->basepower) - _target->power; + _target->power += _target->pbonus; delete val; } if(newtoughnessfound ) - {//setting p/t only overrides base p/t as of M15 changes + {//we should consider the damage if there is, if you have a 5/5 creature with 1 damage, + //and you turn it into 1/1, the 1 damage is still there and the creature must die... + //the toughness is intact but what we see in the game is the life... WParsedInt * val = NEW WParsedInt(newtoughness,NULL, source); _target->basetoughness = val->getValue(); - _target->isSettingBase = true; - _target->applyPTL(); + _target->addToToughness(-_target->tbonus); + _target->addToToughness(_target->basetoughness - _target->toughness); + _target->addToToughness(_target->tbonus); delete val; } @@ -4279,16 +4283,20 @@ int ATransformer::destroy() } if(newpowerfound ) - {//override since we changed tha base, the bonus must have changed - _target->isSettingBase = false; + { + _target->power -= _target->pbonus; + _target->power += _target->origpower; + _target->power -= _target->basepower; + _target->power += _target->pbonus; _target->basepower = _target->origpower; - _target->applyPTL(); } if(newtoughnessfound ) { - _target->isSettingBase = false; + _target->addToToughness(-_target->tbonus); + _target->addToToughness(_target->origtoughness); + _target->addToToughness(-_target->basetoughness); + _target->addToToughness(_target->tbonus); _target->basetoughness = _target->origtoughness; - _target->applyPTL(); } if(newAbilityFound) { diff --git a/projects/mtg/src/Counters.cpp b/projects/mtg/src/Counters.cpp index bd76e6ff0..25f1f90a5 100644 --- a/projects/mtg/src/Counters.cpp +++ b/projects/mtg/src/Counters.cpp @@ -56,9 +56,12 @@ int Counter::added() { if (power != 0 || toughness != 0) { + target->power -= target->pbonus; + target->addToToughness(-target->tbonus); target->pbonus += power; target->tbonus += toughness; - target->applyPTL(); + target->power += target->pbonus; + target->addToToughness(target->pbonus); } return 1; } @@ -67,9 +70,12 @@ int Counter::removed() { if (power != 0 || toughness != 0) { + target->power -= target->pbonus; + target->addToToughness(-target->tbonus); target->pbonus -= power; target->tbonus -= toughness; - target->applyPTL(); + target->power += target->pbonus; + target->addToToughness(target->pbonus); } return 1; } diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index 68afc32f0..653104756 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -3602,9 +3602,9 @@ int AbilityFactory::getAbilities(vector * v, Spell * spell, MTGCar if(card->previous && card->previous->morphed && !card->turningOver) { magicText = card->magicTexts["facedown"]; - card->basepower = 2; + card->power = 2; card->life = 2; - card->basetoughness = 2; + card->toughness = 2; card->setColor(0,1); card->name = "Morph"; card->types.clear(); @@ -3612,17 +3612,12 @@ int AbilityFactory::getAbilities(vector * v, Spell * spell, MTGCar card->setType(cre.c_str()); card->basicAbilities.reset(); card->getManaCost()->resetCosts(); - card->isSettingBase = true; - card->applyPTL(); } else if(card && !card->morphed && card->turningOver) { - card->isSettingBase = false; - card->power = card->origpower; - card->basepower = card->origpower; - card->life = card->origtoughness; - card->toughness = card->origtoughness; - card->basetoughness = card->origtoughness; + card->power += card->origpower-2; + card->life += card->origtoughness-2; + card->toughness += card->origtoughness-2; card->setColor(0,1); card->name = card->model->data->name; card->types = card->model->data->types; @@ -3636,7 +3631,6 @@ int AbilityFactory::getAbilities(vector * v, Spell * spell, MTGCar string faceupC= card->magicTexts["faceup"]; magicText.append("\n"); magicText.append(faceupC); - card->applyPTL(); } else if(card && card->hasType(Subtypes::TYPE_EQUIPMENT) && card->target) diff --git a/projects/mtg/src/MTGCardInstance.cpp b/projects/mtg/src/MTGCardInstance.cpp index 6901738f5..da3e4e666 100644 --- a/projects/mtg/src/MTGCardInstance.cpp +++ b/projects/mtg/src/MTGCardInstance.cpp @@ -53,8 +53,6 @@ MTGCardInstance::MTGCardInstance(MTGCard * card, MTGPlayerCards * arg_belongs_to thatmuch = 0; flanked = 0; castMethod = Constants::NOT_CAST; - isSettingBase = false; - isPTswitch = false; } MTGCardInstance * MTGCardInstance::createSnapShot() @@ -66,32 +64,6 @@ MTGCardInstance::MTGCardInstance(MTGCard * card, MTGPlayerCards * arg_belongs_to return snapShot; } -void MTGCardInstance::applyPTL() -{ - //7a ??(Characteristic Defining Ability)?? - power = origpower; - toughness = origtoughness; - //7b - if (isSettingBase) - { - power = basepower; - toughness = basetoughness; - } - //7c - 7d shared? - power += pbonus; - toughness += tbonus; - //7e switch is last - if (isPTswitch) - { - oldP = power; - oldT = toughness; - toughness = oldP; - power = oldT; - } - life = toughness; - doDamageTest = 1; -} - void MTGCardInstance::copy(MTGCardInstance * card) { MTGCard * source = card->model; From db649ddc96e0fc020b4c1b75b42630a04ee0538e Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Wed, 16 Sep 2015 09:34:32 +0800 Subject: [PATCH 104/249] Added Update on CDA This controls whether to update Power and Toughness if we are setting base PT or not. If we are setting base PT update the CDA but it will not be applied since we have an effect that sets PT to a default base. If there are no effect that sets base PT, apply it on CDA using current/updated PT. The buffs are not affected. Yeah... --- projects/mtg/include/AllAbilities.h | 14 +++++++------- projects/mtg/include/MTGCardInstance.h | 1 + projects/mtg/src/AllAbilities.cpp | 5 +++++ projects/mtg/src/MTGCardInstance.cpp | 1 + 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index 49d29f760..f502bffae 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -2324,7 +2324,7 @@ public: { if(!nonstatic) return; - if(!cda) + if(!cda || (cda && (((MTGCardInstance *) target)->isSettingBase < 1))) { ((MTGCardInstance *) target)->power -= wppt->power.getValue(); ((MTGCardInstance *) target)->addToToughness(-wppt->toughness.getValue()); @@ -2337,8 +2337,8 @@ public: _target->power += wppt->power.getValue(); _target->addToToughness(wppt->toughness.getValue()); } - else - {//CDA 7a update wppt + if(cda) + {//update but not apply if(PT.size()) { SAFE_DELETE(wppt); @@ -2385,11 +2385,11 @@ public: int destroy() { if(cda) - { - ; + { + ; } - else - { + else + { ((MTGCardInstance *) target)->power -= ((MTGCardInstance *) target)->pbonus; ((MTGCardInstance *) target)->addToToughness(-((MTGCardInstance *) target)->tbonus); ((MTGCardInstance *) target)->pbonus -= wppt->power.getValue(); diff --git a/projects/mtg/include/MTGCardInstance.h b/projects/mtg/include/MTGCardInstance.h index 0ecd3b749..38a4a5cd0 100644 --- a/projects/mtg/include/MTGCardInstance.h +++ b/projects/mtg/include/MTGCardInstance.h @@ -186,6 +186,7 @@ public: int addToToughness(int value); int setToughness(int value); + int isSettingBase; vectorprotections; int addProtection(TargetChooser * tc); diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index 0e6f192d8..354e45608 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -4180,6 +4180,8 @@ for (it = types.begin(); it != types.end(); it++) } } } + if(newpowerfound || newtoughnessfound) + _target->isSettingBase += 1; if(newpowerfound ) { WParsedInt * val = NEW WParsedInt(newpower,NULL, source); @@ -4281,6 +4283,9 @@ int ATransformer::destroy() { _target->setColor(*it); } + + if(newpowerfound || newtoughnessfound) + _target->isSettingBase -= 1; if(newpowerfound ) { diff --git a/projects/mtg/src/MTGCardInstance.cpp b/projects/mtg/src/MTGCardInstance.cpp index da3e4e666..6a9a7d8a0 100644 --- a/projects/mtg/src/MTGCardInstance.cpp +++ b/projects/mtg/src/MTGCardInstance.cpp @@ -53,6 +53,7 @@ MTGCardInstance::MTGCardInstance(MTGCard * card, MTGPlayerCards * arg_belongs_to thatmuch = 0; flanked = 0; castMethod = Constants::NOT_CAST; + isSettingBase = 0; } MTGCardInstance * MTGCardInstance::createSnapShot() From 8e057379cea1e4f8e3ad6bb1511def1f4ba54e49 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Wed, 16 Sep 2015 10:45:43 +0800 Subject: [PATCH 105/249] Finally Fixed... :) The issue last commit was the toughness is refreshed and the damage is not reflected. This commit fixes the bug. Yey... --- projects/mtg/include/AllAbilities.h | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index f502bffae..7f5435397 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -2345,7 +2345,7 @@ public: wppt = NEW WParsedPT(PT,NULL,(MTGCardInstance *) source); } ((MTGCardInstance *) target)->origpower = wppt->power.getValue(); - ((MTGCardInstance *) target)->origtoughness = wppt->toughness.getValue(); + ((MTGCardInstance *) target)->origtoughness = (wppt->toughness.getValue() + ((MTGCardInstance *) target)->life)-((MTGCardInstance *) target)->life;//what? } } int addToGame() @@ -2359,9 +2359,7 @@ public: if(cda) {//Characteristic-defining abilities _target->origpower = wppt->power.getValue();//set orig pt - _target->origtoughness = wppt->toughness.getValue(); - _target->power -= _target->pbonus;//remove current bonuses - _target->addToToughness(-_target->tbonus); + _target->origtoughness = wppt->toughness.getValue(); _target->setPower(_target->origpower);//update PT _target->setToughness(_target->origtoughness); _target->power += _target->pbonus;//add new bonus @@ -2386,16 +2384,16 @@ public: { if(cda) { - ; + /*??Do Nothing??*/; } else { - ((MTGCardInstance *) target)->power -= ((MTGCardInstance *) target)->pbonus; - ((MTGCardInstance *) target)->addToToughness(-((MTGCardInstance *) target)->tbonus); - ((MTGCardInstance *) target)->pbonus -= wppt->power.getValue(); - ((MTGCardInstance *) target)->tbonus -= wppt->toughness.getValue(); - ((MTGCardInstance *) target)->power += ((MTGCardInstance *) target)->pbonus; - ((MTGCardInstance *) target)->addToToughness(((MTGCardInstance *) target)->tbonus); + ((MTGCardInstance *) target)->power -= ((MTGCardInstance *) target)->pbonus; + ((MTGCardInstance *) target)->addToToughness(-((MTGCardInstance *) target)->tbonus); + ((MTGCardInstance *) target)->pbonus -= wppt->power.getValue(); + ((MTGCardInstance *) target)->tbonus -= wppt->toughness.getValue(); + ((MTGCardInstance *) target)->power += ((MTGCardInstance *) target)->pbonus; + ((MTGCardInstance *) target)->addToToughness(((MTGCardInstance *) target)->tbonus); } return 1; } From 425b51de0805ec7dd9f359a428ffd80ad3807981 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Wed, 16 Sep 2015 20:36:58 +0800 Subject: [PATCH 106/249] Fix for token cloning Some tokens when cloned produces miscalculated PT(Using foreach, aslongas and others that needs CDA). This should fix the issue. TODO: add tests and updated mtg.txt ... --- projects/mtg/include/AllAbilities.h | 32 ++++++++++++++++++++++++----- projects/mtg/src/AllAbilities.cpp | 5 +++-- projects/mtg/src/Token.cpp | 12 ++++++++++- 3 files changed, 41 insertions(+), 8 deletions(-) diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index 7f5435397..3f7b552fa 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -2319,7 +2319,17 @@ public: { aType = MTGAbility::STANDARD_PUMP; cda = PT.find("cdaactive") != string::npos; - } + } + string ReplaceString(string subject, const string& search, const string& replace) + { + size_t pos = 0; + while ((pos = subject.find(search, pos)) != string::npos) + { + subject.replace(pos, search.length(), replace); + pos += replace.length(); + } + return subject; + } void Update(float) { if(!nonstatic) @@ -2331,7 +2341,10 @@ public: if(PT.size()) { SAFE_DELETE(wppt); - wppt = NEW WParsedPT(PT,NULL,(MTGCardInstance *) source); + if(cda) + wppt = NEW WParsedPT(ReplaceString(PT, "cdaactive", ""),NULL,(MTGCardInstance *) source); + else + wppt = NEW WParsedPT(ReplaceString(PT, "nonstatic", ""),NULL,(MTGCardInstance *) source); } MTGCardInstance * _target = (MTGCardInstance *) target; _target->power += wppt->power.getValue(); @@ -2342,7 +2355,10 @@ public: if(PT.size()) { SAFE_DELETE(wppt); - wppt = NEW WParsedPT(PT,NULL,(MTGCardInstance *) source); + if(cda) + wppt = NEW WParsedPT(ReplaceString(PT, "cdaactive", ""),NULL,(MTGCardInstance *) source); + else + wppt = NEW WParsedPT(ReplaceString(PT, "nonstatic", ""),NULL,(MTGCardInstance *) source); } ((MTGCardInstance *) target)->origpower = wppt->power.getValue(); ((MTGCardInstance *) target)->origtoughness = (wppt->toughness.getValue() + ((MTGCardInstance *) target)->life)-((MTGCardInstance *) target)->life;//what? @@ -2354,7 +2370,10 @@ public: if(PT.size()) { SAFE_DELETE(wppt); - wppt = NEW WParsedPT(PT,NULL,(MTGCardInstance *) source); + if(cda) + wppt = NEW WParsedPT(ReplaceString(PT, "cdaactive", ""),NULL,(MTGCardInstance *) source); + else + wppt = NEW WParsedPT(ReplaceString(PT, "nonstatic", ""),NULL,(MTGCardInstance *) source); } if(cda) {//Characteristic-defining abilities @@ -2402,7 +2421,10 @@ public: if(PT.size()) { SAFE_DELETE(wppt); - wppt = NEW WParsedPT(PT,NULL,(MTGCardInstance *) source); + if(cda) + wppt = NEW WParsedPT(ReplaceString(PT, "cdaactive", ""),NULL,(MTGCardInstance *) source); + else + wppt = NEW WParsedPT(ReplaceString(PT, "nonstatic", ""),NULL,(MTGCardInstance *) source); } sprintf(menuText, "%i/%i", wppt->power.getValue(), wppt->toughness.getValue()); return menuText; diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index 354e45608..1bb059a35 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -2536,12 +2536,13 @@ int AACloner::resolve() spell->source->fresh = 1; spell->source->model = spell->source; spell->source->model->data = spell->source; - if(_target->isToken) + //commenting this out fixes some problems when duplicating tokens 9/16/2015 + /*if(_target->isToken) { spell->source->power = _target->origpower; spell->source->toughness = _target->origtoughness; spell->source->life = _target->origtoughness; - } + }*/ list::iterator it; for (it = awith.begin(); it != awith.end(); it++) { diff --git a/projects/mtg/src/Token.cpp b/projects/mtg/src/Token.cpp index 1e9eeae50..a63bb9167 100644 --- a/projects/mtg/src/Token.cpp +++ b/projects/mtg/src/Token.cpp @@ -13,6 +13,8 @@ Token::Token(string _name, MTGCardInstance * source, int _power, int _toughness) lifeOrig = life; origpower = _power; origtoughness = _toughness; + basepower = power; + basetoughness = toughness; rarity = Constants::RARITY_T; name = _name; if (name.size() && name[0] >= 97 && name[0] <= 122) name[0] -= 32; //Poor man's camelcase. We assume strings we get are either Camelcased or lowercase @@ -25,6 +27,9 @@ Token::Token(string _name, MTGCardInstance * source, int _power, int _toughness) attacker = 0; defenser = NULL; banding = NULL; + pbonus = 0; + tbonus = 0; + isSettingBase = 0; } Token::Token(int id) : @@ -45,7 +50,11 @@ Token::Token(const Token& source) : life = source.life; lifeOrig = source.life; origpower = source.origpower; - origtoughness = source.origpower; + origtoughness = source.origtoughness; + basepower = source.origpower; + basetoughness = source.origpower; + pbonus = source.pbonus; + tbonus = source.tbonus; rarity = source.rarity; name = source.name; setId = source.setId; @@ -56,6 +65,7 @@ Token::Token(const Token& source) : attacker = source.attacker; defenser = source.defenser; banding = source.banding; + isSettingBase = source.isSettingBase; } From 6cba14181d93af14d8d62fddc0d8849857269eb3 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 17 Sep 2015 11:16:29 +0800 Subject: [PATCH 107/249] support "other" in type:* parsing if a card with a cleric subtype has an autoline like this: othertype:cleric:battlefield, means that the targetchooser excludes that card, only the other "cleric" are counted. --- projects/mtg/include/AllAbilities.h | 23 +++++++++++++++++++++++ projects/mtg/include/Wagic_Version.h | 4 ++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index 3f7b552fa..eec795a76 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -68,6 +68,7 @@ private: bool plusone = false; bool plustwo = false; bool plusthree = false; + bool other = false;//othertype:[subtype] if (!target) target = card; int multiplier = 1; if (s[0] == '-') @@ -134,6 +135,12 @@ private: size_t pThree = s.find("plusthree"); s.erase(pThree,pThree + 9); } + if(s.find("othertype") != string::npos) + { + other = true; + size_t oth = s.find("othertype"); + s.erase(oth,oth + 5); + } if(s == "prex") { ManaCost * cX = card->controller()->getManaPool()->Diff(card->getManaCost()); @@ -395,6 +402,7 @@ private: } TargetChooserFactory tf(card->getObserver()); TargetChooser * tc = tf.createTargetChooser(theType.c_str(),NULL); + tc->other = other; for (int i = 0; i < 2; i++) { Player * p = card->getObserver()->players[i]; @@ -642,6 +650,21 @@ private: { intValue = target->controller()->opponent()->game->hand->nb_cards; } + else if (s == "myname")//Plague Rats and others + { + intValue = 0; + for (int i = 0; i < 2; i++) + { + Player * p = card->getObserver()->players[i]; + for (int j = p->game->battlefield->nb_cards - 1; j >= 0; --j) + { + if (p->game->battlefield->cards[j]->name == card->name) + { + intValue += 1; + } + } + } + } else if (s == "pgbzombie")//Soulless One { intValue = 0; diff --git a/projects/mtg/include/Wagic_Version.h b/projects/mtg/include/Wagic_Version.h index 82d9d8d4b..58f7175d4 100644 --- a/projects/mtg/include/Wagic_Version.h +++ b/projects/mtg/include/Wagic_Version.h @@ -12,8 +12,8 @@ Author: Michael Nguyen /* Wagic versions */ #define WAGIC_VERSION_MAJOR 0 -#define WAGIC_VERSION_MEDIUM 19 -#define WAGIC_VERSION_MINOR 2 +#define WAGIC_VERSION_MEDIUM 20 +#define WAGIC_VERSION_MINOR 1 #define VERSION_DOT(a, b, c) a ##.## b ##.## c #define VERSION_WITHOUT_DOT(a, b, c) a ## b ## c From e097d3834720524d9353a5a6ef5a2dfc298124c6 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 17 Sep 2015 18:39:33 +0800 Subject: [PATCH 108/249] Updated CDA cards --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 230 ++++++++----------- projects/mtg/include/AllAbilities.h | 57 ++++- 2 files changed, 157 insertions(+), 130 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 79db499c3..b7ef62287 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -2,7 +2,7 @@ #Please keep these card alphabetized, and try to have the "name=" line at the top of each card [card] name=Aeon Chronicler -auto=phandcount/phandcount nonstatic +auto=phandcount/phandcount cdaactive autoexile=@counterremoved(0/0,1,Time) from(sourcecard) suspended:draw:1 suspend(0)={X}{3}{U} text=Aeon Chronicler's power and toughness are each equal to the number of cards in your hand. -- Suspend X - {X}{3}{U}. X can't be 0. (Rather than cast this card from your hand, you may pay {X}{3}{U} and exile it with X time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost. It has haste.) -- Whenever a time counter is removed from Aeon Chronicler while it's exiled, draw a card. @@ -867,7 +867,7 @@ type=Instant [/card] [card] name=Adamaro, First to Desire -auto=foreach(*|opponenthand) 1/1 +auto=type:*:opponenthand/type:*:opponenthand cdaactive text=Adamaro, First to Desire's power and toughness are each equal to the number of cards in the hand of the opponent with the most cards in hand. mana={1}{R}{R} type=Legendary Creature @@ -1464,7 +1464,7 @@ subtype=Ajani [/card] [card] name=Avatar Token -auto=thisforeach(controllerlife) 1/1 +auto=controllerlife/controllerlife cdaactive type=Creature subtype=Avatar power=* @@ -2287,7 +2287,7 @@ toughness=2 [card] name=Altar Golem abilities=trample,doesnotuntap -auto=foreach(creature|battlefield) 1/1 +auto=type:creature:battlefield/type:creature:battlefield cdaactive auto={T(creature|myBattlefield)}{T(creature|myBattlefield)}{T(creature|myBattlefield)}{T(creature|myBattlefield)}{T(creature|myBattlefield)}:untap text=Trample -- Altar Golem's power and toughness are each equal to the number of creatures on the battlefield. -- Altar Golem doesn't untap during your untap step. -- Tap five untapped creatures you control: Untap Altar Golem. mana={7} @@ -2853,22 +2853,7 @@ toughness=3 [/card] [card] name=Ancient Ooze -auto=foreach(other creature[manacost=1]|mybattlefield) 1/1 -auto=foreach(other creature[manacost=2]|mybattlefield) 2/2 -auto=foreach(other creature[manacost=3]|mybattlefield) 3/3 -auto=foreach(other creature[manacost=4]|mybattlefield) 4/4 -auto=foreach(other creature[manacost=5]|mybattlefield) 5/5 -auto=foreach(other creature[manacost=6]|mybattlefield) 6/6 -auto=foreach(other creature[manacost=7]|mybattlefield) 7/7 -auto=foreach(other creature[manacost=8]|mybattlefield) 8/8 -auto=foreach(other creature[manacost=9]|mybattlefield) 9/9 -auto=foreach(other creature[manacost=10]|mybattlefield) 10/10 -auto=foreach(other creature[manacost=11]|mybattlefield) 11/11 -auto=foreach(other creature[manacost=12]|mybattlefield) 12/12 -auto=foreach(other creature[manacost=13]|mybattlefield) 13/13 -auto=foreach(other creature[manacost=14]|mybattlefield) 14/14 -auto=foreach(other creature[manacost=15]|mybattlefield) 15/15 -auto=foreach(other creature[manacost=16]|mybattlefield) 16/16 +auto=pancientooze/pancientooze cdaactive text=Ancient Ooze's power and toughness are each equal to the total converted mana cost of other creatures you control. mana={5}{G}{G} type=Creature @@ -7909,7 +7894,7 @@ toughness=2 [card] name=Battle Squadron abilities=flying -auto=foreach(creature|myBattlefield) 1/1 +auto=type:creature:myBattlefield/type:creature:myBattlefield cdaactive text=Flying -- Battle Squadron's power and toughness are each equal to the number of creatures you control. mana={3}{R}{R} type=Creature @@ -8222,7 +8207,7 @@ type=Enchantment [/card] [card] name=Beast of Burden -auto=foreach(creature|Battlefield) 1/1 +auto=type:creature:Battlefield/type:creature:Battlefield cdaactive text=Beast of Burden's power and toughness are each equal to the number of creatures on the battlefield. mana={6} type=Artifact Creature @@ -8512,7 +8497,7 @@ toughness=2 [/card] [card] name=Benalish Commander -auto=type:soldier:mybattlefield/type:soldier:mybattlefield nonstatic +auto=type:soldier:mybattlefield/type:soldier:mybattlefield cdaactive autoexile=@counterremoved(0/0,1,Time) from(sourcecard) suspended:token(Soldier,Creature Soldier,1/1,white) suspend(0)={X}{W}{W} text=Benalish Commander's power and toughness are each equal to the number of Soldiers you control. -- Suspend X - {X}{W}{W}. X can't be 0. (Rather than cast this card from your hand, you may pay {X}{W}{W} and exile it with X time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost. It has haste.) -- Whenever a time counter is removed from Benalish Commander while it's exiled, put a 1/1 white Soldier creature token onto the battlefield. @@ -11356,7 +11341,7 @@ toughness=2 [/card] [card] name=Boneyard Wurm -auto=foreach(creature|mygraveyard) 1/1 +auto=type:creature:mygraveyard/type:creature:mygraveyard cdaactive text=Boneyard Wurm's power and toughness are each equal to the number of creature cards in your graveyard. mana={1}{G} type=Creature @@ -12639,7 +12624,7 @@ toughness=4 [card] name=Broodstar abilities=affinityartifacts,flying -auto=foreach(artifact|mybattlefield) 1/1 +auto=type:artifact:mybattlefield/type:artifact:mybattlefield cdaactive text=Affinity for artifacts (This spell costs {1} less to cast for each artifact you control.) -- Flying -- Broodstar's power and toughness are each equal to the number of artifacts you control. mana={8}{U}{U} type=Creature @@ -13633,6 +13618,7 @@ subtype=Elf power=2 toughness=2 [/card] +#chosentype and chosencolor not compatible with cdaactive... [card] name=Caller of the Hunt auto=chooseatype foreach(creature[chosentype]|battlefield) 1/1 chooseend @@ -13788,7 +13774,7 @@ type=Sorcery [card] name=Cantivore abilities=vigilance -auto=foreach(enchantment|graveyard) 1/1 +auto=type:enchantment:graveyard/type:enchantment:graveyard cdaactive text=Vigilance -- Cantivore's power and toughness are each equal to the number of enchantment cards in all graveyards. mana={1}{W}{W} type=Creature @@ -15399,7 +15385,11 @@ toughness=4 [/card] [card] name=Chameleon Spirit -auto=chooseacolor foreach(*[chosencolor]|opponentBattlefield) 1/1 chooseend +auto=choice name(green) activate type:*[green]:opponentBattlefield/type:*[green]:opponentBattlefield cdaactive +auto=choice name(red) activate type:*[red]:opponentBattlefield/type:*[red]:opponentBattlefield cdaactive +auto=choice name(blue) activate type:*[blue]:opponentBattlefield/type:*[blue]:opponentBattlefield cdaactive +auto=choice name(white) activate type:*[white]:opponentBattlefield/type:*[white]:opponentBattlefield cdaactive +auto=choice name(black) activate type:*[black]:opponentBattlefield/type:*[black]:opponentBattlefield cdaactive text=As Chameleon Spirit enters the battlefield, choose a color. -- Chameleon Spirit's power and toughness are each equal to the number of permanents of the chosen color your opponents control. mana={3}{U} type=Creature @@ -17666,7 +17656,7 @@ type=Instant [card] name=Cognivore abilities=flying -auto=foreach(instant|graveyard) 1/1 +auto=type:instant:graveyard/type:instant:graveyard cdaactive text=Flying -- Cognivore's power and toughness are each equal to the number of instant cards in all graveyards. mana={6}{U}{U} type=Creature @@ -17686,7 +17676,7 @@ toughness=1 [/card] [card] name=Coiling Woodworm -auto=foreach(forest|battlefield) 1/0 +auto=type:forest:battlefield/1 cdaactive text=Coiling Woodworm's power is equal to the number of Forests on the battlefield. mana={2}{G} type=Creature @@ -19763,7 +19753,7 @@ toughness=4 [card] name=Crowd of Cinders abilities=fear -auto=foreach(*[black]|myBattlefield) 1/1 +auto=type:*[black]:myBattlefield/type:*[black]:myBattlefield cdaactive text=Fear (This creature can't be blocked except by artifact creatures and/or black creatures.) -- Crowd of Cinders's power and toughness are each equal to the number of black permanents you control. mana={3}{B} type=Creature @@ -19968,7 +19958,7 @@ type=Enchantment [/card] [card] name=Crusader of Odric -auto=foreach(creature|mybattlefield) 1/1 +auto=type:creature:mybattlefield/type:creature:mybattlefield cdaactive text=Crusader of Odric's power and toughness are each equal to the number of creatures you control. mana={2}{W} type=Creature @@ -20858,7 +20848,7 @@ subtype=Aura [/card] [card] name=Dakkon Blackblade -auto=foreach(land|myBattlefield) 1/1 +auto=type:land:myBattlefield/type:land:myBattlefield cdaactive text=Dakkon Blackblade's power and toughness are each equal to the number of lands you control. mana={2}{W}{U}{U}{B} type=Legendary Creature @@ -20921,7 +20911,7 @@ toughness=1 [/card] [card] name=Dakmor Sorceress -auto=foreach(swamp|myBattlefield) 1/0 +auto=type:swamp:myBattlefield/4 cdaactive text=Dakmor Sorceress's power is equal to the number of Swamps you control. mana={5}{B} type=Creature @@ -21419,7 +21409,7 @@ type=Artifact [card] name=Darksteel Juggernaut abilities=mustattack,indestructible -auto=foreach(artifact|mybattlefield) 1/1 +auto=type:artifact:mybattlefield/type:artifact:mybattlefield cdaactive text=Darksteel Juggernaut's power and toughness are equal to the number of artifacts you control. -- Darksteel Juggernaut is indestructible and attacks each turn if able. mana={5} type=Artifact Creature @@ -21615,8 +21605,7 @@ toughness=3 [/card] [card] name=Dauntless Dourbark -auto=foreach(forest|myBattlefield) 1/1 -auto=foreach(treefolk|myBattlefield) 1/1 +auto=pdauntless/pdauntless cdaactive auto=aslongas(other treefolk|myBattlefield) trample text=Dauntless Dourbark's power and toughness are each equal to the number of Forests you control plus the number of Treefolk you control. -- Dauntless Dourbark has trample as long as you control another Treefolk. mana={3}{G} @@ -21749,7 +21738,7 @@ toughness=1 [card] name=Dauthi Warlord abilities=shadow -auto=foreach(creature[shadow]|battlefield) 1/0 +auto=type:creature[shadow]:battlefield/1 cdaactive text=Shadow (This creature can block or be blocked by only creatures with shadow.) -- Dauthi Warlord's power is equal to the number of creatures with shadow on the battlefield. mana={1}{B} type=Creature @@ -23831,7 +23820,7 @@ text=Destroy target artifact with converted mana cost X. It can't be regenerated [/card] [card] name=Detritivore -auto=type:land[-basic]:opponentgraveyard/type:land[-basic]:opponentgraveyard nonstatic +auto=type:land[-basic]:opponentgraveyard/type:land[-basic]:opponentgraveyard cdaactive autoexile=@counterremoved(0/0,1,Time) from(sourcecard) suspended:destroy target(land[-basic]) suspend(0)={X}{3}{R} text=Detritivore's power and toughness are each equal to the number of nonbasic land cards in your opponents' graveyards. -- Suspend X - {X}{3}{R}. X can't be 0. (Rather than cast this card from your hand, you may pay {X}{3}{R} and exile it with X time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost. It has haste.) -- Whenever a time counter is removed from Detritivore while it's exiled, destroy target nonbasic land. @@ -25292,7 +25281,7 @@ type=Artifact [card] name=Doubtless One auto=spiritlink -auto=foreach(cleric) 1/1 +auto=type:cleric:battlefield/type:cleric:battlefield cdaactive text=Doubtless One's power and toughness are each equal to the number of Clerics on the battlefield. -- Whenever Doubtless One deals damage, you gain that much life. mana={3}{W} type=Creature @@ -26421,7 +26410,7 @@ toughness=5 [card] name=Drift of the Dead abilities=defender -auto=foreach(land[snow]|myBattlefield) 1/1 +auto=type:land[snow]:myBattlefield/type:land[snow]:myBattlefield cdaactive text=Defender (This creature can't attack.) -- Drift of the Dead's power and toughness are each equal to the number of snow lands you control. mana={3}{B} type=Creature @@ -26781,7 +26770,7 @@ toughness=1 [card] name=Drove of Elves abilities=opponentshroud -auto=foreach(*[green]|myBattlefield) 1/1 +auto=type:*[green]:myBattlefield/type:*[green]:myBattlefield cdaactive text=Drove of Elves's power and toughness are each equal to the number of green permanents you control. -- Drove of Elves can't be the target of spells or abilities your opponents control. mana={3}{G} type=Creature @@ -27132,7 +27121,7 @@ toughness=1 [card] name=Dungrove Elder abilities=opponentshroud -auto=foreach(forest|mybattlefield) 1/1 +auto=type:forest:mybattlefield/type:forest:mybattlefield cdaactive text=Hexproof (This creature can't be the target of spells or abilities your opponents control.) -- Dungrove Elder's power and toughness are each equal to the number of Forests you control. mana={2}{G} type=Creature @@ -28466,7 +28455,7 @@ type=Sorcery name=Elephant T1 type=Creature subtype=Elephant -auto=foreach(creature|mygraveyard) 1/1 +auto=type:creature:mygraveyard/type:creature:mygraveyard cdaactive text=This creature's power and toughness are each equal to the number of creature cards in its controller's graveyard. power=* toughness=* @@ -30000,7 +29989,7 @@ toughness=2 [/card] [card] name=Entropic Specter -auto=foreach(*|opponenthand) 1/1 +auto=type:*:opponenthand/type:*:opponenthand cdaactive auto=@damaged(controller) from(this):ability$!name(discard) target(*|myhand) reject!$ controller auto=@damaged(opponent) from(this):ability$!name(discard) target(*|myhand) reject!$ opponent text=Flying -- As Entropic Specter enters the battlefield, choose an opponent. -- Entropic Specter's power and toughness are each equal to the number of cards in the chosen player's hand. -- Whenever Entropic Specter deals damage to a player, that player discards a card. @@ -31590,7 +31579,7 @@ toughness=1 [card] name=Faerie Swarm abilities=flying -auto=foreach(*[blue]|myBattlefield) 1/1 +auto=type:*[blue]:myBattlefield/type:*[blue]:myBattlefield cdaactive text=Flying -- Faerie Swarm's power and toughness are each equal to the number of blue permanents you control. mana={3}{U} type=Creature @@ -37037,7 +37026,7 @@ type=Instant name=Geist-Honored Monk abilities=vigilance auto=token(Spirit,Creature Spirit,1/1,white,flying)*2 -auto=foreach(creature|mybattlefield) 1/1 +auto=type:creature:mybattlefield/type:creature:mybattlefield cdaactive text=Vigilance -- Geist-Honored Monk's power and toughness are each equal to the number of creatures you control. -- When Geist-Honored Monk enters the battlefield, put two 1/1 white Spirit creature tokens with flying onto the battlefield. mana={3}{W}{W} type=Creature @@ -44009,7 +43998,7 @@ subtype=Arcane [card] name=Heedless One abilities=trample -auto=foreach(elf) 1/1 +auto=type:elf:battlefield/type:elf:battlefield cdaactive text=Trample -- Heedless One's power and toughness are each equal to the number of Elves on the battlefield. mana={3}{G} type=Creature @@ -48996,7 +48985,7 @@ toughness=4 [/card] [card] name=Jagged-Scar Archers -auto=foreach(elf|myBattlefield) 1/1 +auto=type:elf:myBattlefield/type:elf:myBattlefield cdaactive auto={T}:target(creature[flying]) dynamicability text=Jagged-Scar Archers's power and toughness are each equal to the number of Elves you control. -- {T}: Jagged-Scar Archers deals damage equal to its power to target creature with flying. mana={1}{G}{G} @@ -50252,8 +50241,8 @@ abilities=defender [/card] [card] name=Kagemaro, First to Suffer -auto=foreach(*|myhand) 1/1 -auto={B}{S}:foreach(*|myhand) -1/-1 all(creature) +auto=type:*:myhand/type:*:myhand cdaactive +auto={B}{S}:-type:*:myhand/-type:*:myhand all(creature) text=Kagemaro, First to Suffer's power and toughness are each equal to the number of cards in your hand. -- {B}, Sacrifice Kagemaro: All creatures get -X/-X until end of turn, where X is the number of cards in your hand. mana={3}{B}{B} type=Legendary Creature @@ -51342,7 +51331,7 @@ toughness=1 [/card] [card] name=Keldon Warlord -auto=foreach(creature[-wall]|myBattlefield) 1/1 +auto=type:creature[-wall]:myBattlefield/type:creature[-wall]:myBattlefield cdaactive text=Keldon Warlord's power and toughness are each equal to the number of non-Wall creatures you control. mana={2}{R}{R} type=Creature @@ -51991,7 +51980,7 @@ toughness=2 [card] name=Kithkin Rabble abilities=vigilance -auto=foreach(*[white]|myBattlefield) 1/1 +auto=type:*[white]:myBattlefield/type:*[white]:myBattlefield cdaactive text=Vigilance -- Kithkin Rabble's power and toughness are each equal to the number of white permanents you control. mana={3}{W} type=Creature @@ -52115,7 +52104,7 @@ toughness=1 [/card] [card] name=Kiyomaro, First to Stand -auto=foreach(*|myhand) 1/1 +auto=type:*:myhand/type:*:myhand cdaactive auto=aslongas(*|myhand) vigilance >3 auto=@damaged(player) from(this) restriction{type(*|myhand)~morethan~6}:life:7 controller >6 auto=@damaged(creature) from(this) restriction{type(*|myhand)~morethan~6}:life:7 controller >6 @@ -52609,7 +52598,7 @@ toughness=1 [card] name=Kolaghan Forerunners abilities=trample -auto=foreach(creature|mybattlefield) 1/0 +auto=type:creature:mybattlefield/3 cdaactive other={R}{2} name(Dash) auto=if paid(alternative) then transforms((,newability[haste],newability[phaseaction[endofturn sourceinplay] moveto(ownerhand) all(this)])) forever text=Trample -- Kolaghan Forerunners's power is equal to the number of creatures you control. -- Dash {2}{R} (You may cast this spell for its dash cost. If you do, it gains haste, and it's returned from the battlefield to its owner's hand at the beginning of the next end step.) @@ -52843,7 +52832,7 @@ toughness=1 [card] name=Korlash Heir to Blackblade auto={discard(korlash heir to blackblade|myhand)}:moveto(mybattlefield) and!(tap)! target(swamp|mylibrary) -auto=foreach(swamp|mybattlefield) 1/1 +auto=type:swamp:mybattlefield/type:swamp:mybattlefield cdaactive auto={1}{B}:regenerate text=Korlash, Heir to Blackblade's power and toughness are each equal to the number of Swamps you control. -- {1}{B}: Regenerate Korlash. -- Grandeur - Discard another card named Korlash, Heir to Blackblade: Search your library for up to two Swamp cards, put them onto the battlefield tapped, then shuffle your library. mana={2}{B}{B} @@ -53276,7 +53265,7 @@ subtype=Aura [card] name=Krovikan Mist abilities=flying -auto=foreach(illusion|battlefield) 1/1 +auto=type:illusion:battlefield/type:illusion:battlefield cdaactive text=Flying -- Krovikan Mist's power and toughness are each equal to the number of Illusions on the battlefield. mana={1}{U} type=Creature @@ -54868,7 +54857,7 @@ toughness=5 [/card] [card] name=Lhurgoyf -auto=foreach(creature|graveyard) 1/1 +auto=type:creature:graveyard/plusonetype:creature:graveyard cdaactive text=Lhurgoyf's power is equal to the number of creature cards in all graveyards and its toughness is equal to that number plus 1. mana={2}{G}{G} type=Creature @@ -56197,7 +56186,7 @@ toughness=2 [/card] [card] name=Lord of Extinction -auto=foreach(*|graveyard) 1/1 +auto=type:*:graveyard/type:*:graveyard cdaactive text=Lord of Extinction's power and toughness are each equal to the number of cards in all graveyards. mana={3}{B}{G} type=Creature @@ -57509,7 +57498,7 @@ toughness=6 [card] name=Magnivore abilities=haste -auto=foreach(sorcery|graveyard) 1/1 +auto=type:sorcery:graveyard/type:sorcery:graveyard cdaactive text=Haste (This creature can attack the turn it comes under your control.) -- Magnivore's power and toughness are each equal to the number of sorcery cards in all graveyards. mana={2}{R}{R} type=Creature @@ -58300,9 +58289,7 @@ toughness=3 [/card] [card] name=Maraxus of Keld -auto=foreach(artifact[-tapped]|myBattlefield) 1/1 -auto=foreach(creature[-tapped]|myBattlefield) 1/1 -auto=foreach(land[-tapped]|myBattlefield) 1/1 +auto=type:*[-tapped&-enchantment;-tapped&-planeswalker]/type:*[-tapped&-enchantment;-tapped&-planeswalker] cdaactive text=Maraxus of Keld's power and toughness are each equal to the number of untapped artifacts, creatures, and lands you control. mana={4}{R}{R} type=Legendary Creature @@ -58677,7 +58664,7 @@ toughness=4 [/card] [card] name=Maro -auto=foreach(*|myhand) 1/1 +auto=type:*:myhand/type:*:myhand cdaactive text=Maro's power and toughness are each equal to the number of cards in your hand. mana={2}{G}{G} type=Creature @@ -59210,7 +59197,7 @@ toughness=2 [card] name=Master of Etherium auto=lord(other creature[artifact]|mybattlefield) 1/1 -auto=foreach(artifact|mybattlefield) 1/1 +auto=type:artifact:mybattlefield/type:artifact:mybattlefield cdaactive text=Master of Etherium's power and toughness are each equal to the number of artifacts you control. -- Other artifact creatures you control get +1/+1. mana={2}{U} type=Artifact Creature @@ -59315,7 +59302,7 @@ toughness=4 [/card] [card] name=Masumaro, First to Live -auto=foreach(*|myhand) 2/2 +auto=twicetype:*:myhand/twicetype:*:myhand cdaactive text=Masumaro, First to Live's power and toughness are each equal to twice the number of cards in your hand. mana={3}{G}{G}{G} type=Legendary Creature @@ -59325,11 +59312,7 @@ toughness=* [/card] [card] name=Matca Rioters -auto=aslongas(forest|myBattlefield) 1/1 -auto=aslongas(island|myBattlefield) 1/1 -auto=aslongas(plains|myBattlefield) 1/1 -auto=aslongas(mountain|myBattlefield) 1/1 -auto=aslongas(swamp|myBattlefield) 1/1 +auto=pbasiclandtypes/pbasiclandtypes cdaactive text=Domain - Matca Rioters's power and toughness are each equal to the number of basic land types among lands you control. mana={2}{G} type=Creature @@ -62302,7 +62285,7 @@ toughness=8 [card] name=Molimo, Maro-Sorcerer abilities=trample -auto=foreach(land|myBattlefield) 1/1 +auto=type:land:myBattlefield/type:land:myBattlefield cdaactive text=Trample (If this creature would deal enough damage to its blockers to destroy them, you may have it deal the rest of its damage to defending player or planeswalker.) -- Molimo, Maro-Sorcerer's power and toughness are each equal to the number of lands you control. mana={4}{G}{G}{G} type=Legendary Creature @@ -63180,7 +63163,7 @@ toughness=2 [card] name=Mortivore auto={B}:regenerate -auto=foreach(creature|graveyard) 1/1 +auto=type:creature:graveyard/type:creature:graveyard cdaactive text=Mortivore's power and toughness are each equal to the number of creature cards in all graveyards. -- {B}: Regenerate Mortivore. (The next time this creature would be destroyed this turn, it isn't. Instead tap it, remove all damage from it, and remove it from combat.) mana={2}{B}{B} type=Creature @@ -63575,8 +63558,7 @@ toughness=2 [card] name=Multani, Maro-Sorcerer abilities=shroud -auto=foreach(*|myhand) 1/1 -auto=foreach(*|opponenthand) 1/1 +auto=type:*:hand/type:*:hand cdaactive text=Shroud (This permanent can't be the target of spells or abilities.) -- Multani's power and toughness are each equal to the total number of cards in all players' hands. mana={4}{G}{G} type=Legendary Creature @@ -64389,7 +64371,7 @@ subtype=Shapeshifter name=Nameless One facedown={3} autofacedown={2}{U}:morph -auto=foreach(wizard) 1/1 +auto=type:wizard:battlefield/type:wizard:battlefield cdaactive text=Nameless One's power and toughness are each equal to the number of Wizards on the battlefield. -- Morph {2}{U} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) mana={3}{U} type=Creature @@ -65793,7 +65775,7 @@ type=Sorcery [card] name=Nightmare abilities=flying -auto=foreach(swamp|myBattlefield) 1/1 +auto=type:swamp:mybattlefield/type:swamp:mybattlefield cdaactive text=Flying -- Nightmare's power and toughness are each equal to the number of Swamps you control. mana={5}{B} type=Creature @@ -65911,7 +65893,7 @@ toughness=4 [/card] [card] name=Nightstalker Engine -auto=foreach(creature|myGraveyard) 1/0 +auto=type:creature:myGraveyard/3 cdaactive text=Nightstalker Engine's power is equal to the number of creature cards in your graveyard. mana={4}{B} type=Creature @@ -68690,7 +68672,7 @@ toughness=2 [/card] [card] name=Overbeing of Myth -auto=foreach(*|myhand) 1/1 +auto=type:*:myhand/type:*:myhand cdaactive auto=@each my draw:draw:1 text=Overbeing of Myth's power and toughness are each equal to the number of cards in your hand. -- At the beginning of your draw step, draw an additional card. mana={GU}{GU}{GU}{GU}{GU} @@ -68943,7 +68925,7 @@ type=Sorcery [/card] [card] name=Pack Rat -auto=foreach(creature[rat]|mybattlefield) 1/1 +auto=type:rat:mybattlefield/type:rat:mybattlefield cdaactive auto={2}{B}{discard(*|myhand)}:token(253624) text=Pack Rat's power and toughness are each equal to the number of Rats you control. -- {2}{B}, Discard a card: Put a token onto the battlefield that's a copy of Pack Rat. mana={1}{B} @@ -69187,7 +69169,7 @@ toughness=4 [/card] [card] name=Pallimud -auto=foreach(land[tapped]|opponentBattlefield) 1/0 +auto=type:land[tapped]:opponentbattlefield/3 cdaactive text=As Pallimud enters the battlefield, choose an opponent. -- Pallimud's power is equal to the number of tapped lands the chosen player controls. mana={2}{R} type=Creature @@ -70317,7 +70299,7 @@ toughness=6 [/card] [card] name=Pestilence Rats -auto=foreach(other rat) 1/0 +auto=othertype:rat:battlefield/3 cdaactive text=Pestilence Rats's power is equal to the number of other Rats on the battlefield. (For example, as long as there are two other Rats on the battlefield, Pestilence Rats's power and toughness are 2/3.) mana={2}{B} type=Creature @@ -71781,7 +71763,7 @@ toughness=1 [/card] [card] name=Plague Rats -auto=foreach(plague rats) 1/1 +auto=myname/myname cdaactive text=Plague Rats's power and toughness are each equal to the number of creatures named Plague Rats on the battlefield. mana={2}{B} type=Creature @@ -72982,7 +72964,7 @@ subtype=Aura [card] name=Primalcrux abilities=trample -auto=thisforeach(variable{type:manag:mybattlefield}>0) 1/1 +auto=type:manag:mybattlefield/type:manag:mybattlefield cdaactive text=Trample -- Chroma - Primalcrux's power and toughness are each equal to the number of green mana symbols in the mana costs of permanents you control. mana={G}{G}{G}{G}{G}{G} type=Creature @@ -73655,7 +73637,7 @@ type=Enchantment [/card] [card] name=Psychosis Crawler -auto=foreach(*|myhand) 1/1 +auto=type:*:myhand/type:*:myhand cdaactive auto=@drawn(controller):life:-1 opponent text=Psychosis Crawler's power and toughness are each equal to the number of cards in your hand. - Whenever you draw a card, each opponent loses 1 life. mana={5} @@ -76649,7 +76631,7 @@ toughness=2 [card] name=Reckless One abilities=haste -auto=foreach(goblin) 1/1 +auto=type:goblin:battlefield/type:goblin:battlefield cdaactive text=Haste -- Reckless One's power and toughness are each equal to the number of Goblins on the battlefield. mana={3}{R} type=Creature @@ -77988,7 +77970,7 @@ type=Artifact [card] name=Revenant abilities=flying -auto=foreach(creature|mygraveyard) 1/1 +auto=type:creature:mygraveyard/type:creature:mygraveyard cdaactive text=Flying -- Revenant's power and toughness are each equal to the number of creature cards in your graveyard. mana={4}{B} type=Creature @@ -80001,7 +79983,7 @@ toughness=3 [/card] [card] name=Rubblehulk -auto=type:land:mybattlefield/type:land:mybattlefield nonstatic +auto=type:land:mybattlefield/type:land:mybattlefield cdaactive autohand={1}{R}{G}{discard}:name(bloodrush) target(creature[attacking]) type:land:mybattlefield/type:land:mybattlefield ueot text=Rubblehulk's power and toughness are each equal to the number of lands you control. -- Bloodrush — {1}{R}{G}, Discard Rubblehulk: Target attacking creature gets +X/+X until end of turn, where X is the number of lands you control. mana={4}{R}{G} @@ -80525,7 +80507,7 @@ type=Artifact [card] name=Rusting Golem auto=fading:5 -auto=thisforeach(counter{0/0.1.Fade}) 1/1 +auto=counter{0%0.1.Fade}/counter{0%0.1.Fade} cdaactive text=Fading 5 (This creature enters the battlefield with five fade counters on it. At the beginning of your upkeep, remove a fade counter from it. If you can't, sacrifice it.) -- Rusting Golem's power and toughness are each equal to the number of fade counters on it. mana={4} type=Artifact Creature @@ -82565,7 +82547,7 @@ toughness=1 [/card] [card] name=Scion of the Wild -auto=foreach(creature|myBattlefield) 1/1 +auto=type:creature:myBattlefield/type:creature:myBattlefield cdaactive text=Scion of the Wild's power and toughness are each equal to the number of creatures you control. mana={1}{G}{G} type=Creature @@ -84617,7 +84599,7 @@ toughness=3 name=Serpent of the Endless Sea abilities=cantattack auto=aslongas(island|opponentBattlefield) -cantattack -auto=foreach(island|myBattlefield) 1/1 +auto=type:island:myBattlefield/type:island:myBattlefield cdaactive text=Serpent of the Endless Sea's power and toughness are each equal to the number of Islands you control. -- Serpent of the Endless Sea can't attack unless defending player controls an Island. mana={4}{U} type=Creature @@ -84690,7 +84672,7 @@ toughness=1 [/card] [card] name=Serra Avatar -auto=thisforeach(controllerlife) 1/1 +auto=controllerlife/controllerlife cdaactive autograveyard=moveTo(ownerlibrary) && shuffle text=Serra Avatar's power and toughness are each equal to your life total. -- When Serra Avatar is put into a graveyard from anywhere, shuffle it into its owner's library. mana={4}{W}{W}{W} @@ -85006,8 +84988,8 @@ toughness=2 [/card] [card] name=Sewer Nemesis -auto=choice name(opponent) transforms((,newability[foreach(*|opponentgraveyard) 1/1],newability[@movedTo(*|opponentstack):deplete:1 opponent])) forever -auto=choice name(you) transforms((,newability[foreach(*|mygraveyard) 1/1],newability[@movedTo(*|mystack):deplete:1 controller])) forever +auto=choice name(opponent) transforms((,newability[type:*:opponentgraveyard/type:*:opponentgraveyard cdaactive],newability[@movedTo(*|opponentstack):deplete:1 opponent])) forever +auto=choice name(you) transforms((,newability[type:*:mygraveyard/type:*:mygraveyard cdaactive],newability[@movedTo(*|mystack):deplete:1 controller])) forever text=As Sewer Nemesis enters the battlefield, choose a player. -- Sewer Nemesis's power and toughness are each equal to the number of cards in the chosen player's graveyard. -- Whenever the chosen player casts a spell, that player puts the top card of his or her library into his or her graveyard. mana={3}{B} type=Creature @@ -87386,7 +87368,7 @@ toughness=5 [/card] [card] name=Sima Yi, Wei Field Marshal -auto=foreach(swamp|myBattlefield) 1/0 +auto=type:swamp:myBattlefield/4 cdaactive text=Sima Yi, Wei Field Marshal's power is equal to the number of Swamps you control. mana={5}{B} type=Legendary Creature @@ -88839,7 +88821,7 @@ toughness=3 [card] name=Skyshroud War Beast abilities=trample -auto=foreach(land[-basic]|opponentBattlefield) 1/1 +auto=type:land[-basic]:opponentBattlefield/type:land[-basic]:opponentBattlefield cdaactive text=Trample -- As Skyshroud War Beast enters the battlefield, choose an opponent. -- Skyshroud War Beast's power and toughness are each equal to the number of nonbasic lands the chosen player controls. mana={1}{G} type=Creature @@ -88913,7 +88895,7 @@ toughness=3 [/card] [card] name=Slag Fiend -auto=foreach(artifact|graveyard) 1/1 +auto=type:artifact:graveyard/type:artifact:graveyard cdaactive text=Slag Fiend's power and toughness are each equal to the number of artifact cards in all graveyards. mana={R} type=Creature @@ -90410,7 +90392,7 @@ toughness=1 [card] name=Soramaro, First to Dream abilities=flying -auto=foreach(*|myhand) 1/1 +auto=type:*:myhand/type:*:myhand cdaactive auto={4}{H(land|myBattlefield)}:draw:1 text=Flying -- Soramaro, First to Dream's power and toughness are each equal to the number of cards in your hand. -- {4}, Return a land you control to its owner's hand: Draw a card. mana={4}{U}{U} @@ -90926,8 +90908,7 @@ toughness=2 [/card] [card] name=Soulless One -auto=foreach(zombie|graveyard) 1/1 -auto=foreach(zombie) 1/1 +auto=pgbzombie/pgbzombie cdaactive text=Soulless One's power and toughness are each equal to the number of Zombies on the battlefield plus the number of Zombie cards in all graveyards. mana={3}{B} type=Creature @@ -90984,7 +90965,7 @@ type=Instant [card] name=Soulsurge Elemental abilities=first strike -auto=foreach(creature|myBattlefield) 1/0 +auto=type:creature:myBattlefield/1 cdaactive text=First strike -- Soulsurge Elemental's power is equal to the number of creatures you control. mana={3}{R} type=Creature @@ -91514,8 +91495,7 @@ toughness=1 [card] name=Spellheart Chimera abilities=flying,trample -auto=type:*[instant]:mygraveyard/0 nonstatic -auto=type:*[sorcery]:mygraveyard/0 nonstatic +auto=pginstantsorcery/3 cdaactive text=Flying. -- Trample. -- Spellheart Chimera's power is equal to the number of instant and sorcery cards in your graveyard. mana={1}{U}{R} type=Creature @@ -92502,7 +92482,7 @@ color=green [card] name=Splinterfright abilities=trample -auto=foreach(creature|mygraveyard) 1/1 +auto=type:creature:mygraveyard/type:creature:mygraveyard cdaactive auto=@each my upkeep:deplete:2 controller text=Trample -- Splinterfright's power and toughness are each equal to the number of creature cards in your graveyard -- At the beginning of your upkeep, put the top two cards of your library into your graveyard. mana={2}{G} @@ -92905,7 +92885,7 @@ type=Enchantment [/card] [card] name=Squelching Leeches -auto=foreach(swamp|myBattlefield) 1/1 +auto=type:swamp:myBattlefield/type:swamp:myBattlefield cdaactive text=Squelching Leeches's power and toughness are each equal to the number of Swamps you control. mana={2}{B}{B} type=Creature @@ -95064,7 +95044,7 @@ toughness=6 [card] name=Sturmgeist abilities=flying -auto=foreach(*|myhand) 1/1 +auto=type:*:myhand/type:*:myhand cdaactive auto=@combatdamaged(player) from(this):draw:1 controller text=Flying -- Sturmgeist's power and toughness are each equal to the number of cards in your hand. -- Whenever Sturmgeist deals combat damage to a player, draw a card. mana={3}{U}{U} @@ -96180,7 +96160,7 @@ toughness=0 [/card] [card] name=Swarm of Rats -auto=foreach(rat|myBattlefield) 1/0 +auto=type:rat:mybattlefield/1 cdaactive text=Swarm of Rats's power is equal to the number of Rats you control. mana={1}{B} type=Creature @@ -96647,7 +96627,7 @@ type=Sorcery [/card] [card] name=Sylvan Yeti -auto=foreach(*|myhand) 1/0 +auto=type:*:myhand/4 cdaactive text=Sylvan Yeti's power is equal to the number of cards in your hand. mana={2}{G}{G} type=Creature @@ -97496,14 +97476,7 @@ toughness=7 [/card] [card] name=Tarmogoyf -auto=aslongas(artifact|graveyard) 1/1 -auto=aslongas(creature|graveyard) 1/1 -auto=aslongas(enchantment|graveyard) 1/1 -auto=aslongas(instant|graveyard) 1/1 -auto=aslongas(land|graveyard) 1/1 -auto=aslongas(sorcery|graveyard) 1/1 -auto=aslongas(tribal|graveyard) 1/1 -auto=aslongas(planeswalker|graveyard) 1/1 +auto=gravecardtypes/plusonegravecardtypes cdaactive text=Tarmogoyf's power is equal to the number of card types among cards in all graveyards and its toughness is equal to that number plus 1. (The card types are artifact, creature, enchantment, instant, land, planeswalker, sorcery, and tribal.) mana={1}{G} type=Creature @@ -98535,7 +98508,7 @@ type=Artifact [card] name=Terravore abilities=trample -auto=foreach(land|graveyard) 1/1 +auto=type:land:graveyard/type:land:graveyard cdaactive text=Trample -- Terravore's power and toughness are each equal to the number of land cards in all graveyards. mana={1}{G}{G} type=Creature @@ -100385,8 +100358,8 @@ toughness=5 [/card] [card] name=Tidewalker -auto=foreach(island|myBattlefield) counter(0/0,1,Time) -auto=thisforeach(counter{0/0.1.Time}) 1/1 +auto=foreach(island|myBattlefield) counter(0/0,1,Time) oneshot +auto=counter{0%0.1.Time}/counter{0%0.1.Time} cdaactive auto=vanishing:0 text=Tidewalker enters the battlefield with a time counter on it for each Island you control. -- Vanishing (At the beginning of your upkeep, remove a time counter from this permanent. When the last is removed, sacrifice it.) -- Tidewalker's power and toughness are each equal to the number of time counters on it. mana={2}{U} @@ -103532,7 +103505,7 @@ toughness=2 [/card] [card] name=Uktabi Wildcats -auto=foreach(forest|myBattlefield) 1/1 +auto=type:forest:mybattlefield/type:forest:mybattlefield cdaactive auto={G}{S(forest|myBattlefield)}:regenerate text=Uktabi Wildcats's power and toughness are each equal to the number of Forests you control. -- {G}, Sacrifice a Forest: Regenerate Uktabi Wildcats. mana={4}{G} @@ -103577,16 +103550,16 @@ toughness=8 [/card] [card] name=Ulasht, the Hate Seed -auto=foreach(other creature[red]|myBattlefield) counter(1/1,1) -auto=foreach(other creature[green]|myBattlefield) counter(1/1,1) +auto=foreach(other creature[red]|myBattlefield) counter(1/1,1) oneshot +auto=foreach(other creature[green]|myBattlefield) counter(1/1,1) oneshot auto={1}{C(1/1,-1)}:damage:1 target(creature) auto={1}{C(1/1,-1)}:token(Saproling,Creature Saproling,1/1,green) text=Ulasht, the Hate Seed enters the battlefield with a +1/+1 counter on it for each other red creature you control and a +1/+1 counter on it for each other green creature you control. -- {1}, Remove a +1/+1 counter from Ulasht: Choose one - Ulasht deals 1 damage to target creature; or put a 1/1 green Saproling creature token onto the battlefield. mana={2}{R}{G} type=Legendary Creature subtype=Hellion Hydra -power=* -toughness=* +power=0 +toughness=0 [/card] [card] name=Ultimate Price @@ -103661,7 +103634,7 @@ type=Artifact [/card] [card] name=Umbra Stalker -auto=thisforeach(variable{type:manab:mygraveyard}>0) 1/1 +auto=type:manab:mygraveyard/type:manab:mygraveyard cdaactive text=Chroma - Umbra Stalker's power and toughness are each equal to the number of black mana symbols in the mana costs of cards in your graveyard. mana={4}{B}{B}{B} type=Creature @@ -107478,7 +107451,7 @@ toughness=2 name=Elemental type=Creature subtype=Elemental -auto=foreach(creature|mybattlefield) 1/1 +auto=type:creature:mybattlefield/type:creature:mybattlefield cdaactive text=This creature's power and toughness are each equal to the number of creature cards in its controller's battlefield. power=* toughness=* @@ -109682,7 +109655,7 @@ toughness=3 [/card] [card] name=Wayfaring Temple -auto=foreach(creature|mybattlefield) 1/1 +auto=type:creature:mybattlefield/type:creature:mybattlefield cdaactive auto=@combatdamaged(player) from(this) restriction{type(creature[token]|mybattlefield)~morethan~0}:name(populate) clone notatarget(creature[token]|mybattlefield) text=Wayfaring Temple's power and toughness are each equal to the number of creatures you control. -- Whenever Wayfaring Temple deals combat damage to a player, populate. (Put a token onto the battlefield that's a copy of a creature token you control.) mana={1}{G}{W} @@ -110732,7 +110705,7 @@ toughness=4 [card] name=Wilderness Elemental abilities=trample -auto=foreach(land[-basic]|opponentBattlefield) 1/0 +auto=type:land[-basic]:opponentbattlefield/3 cdaactive text=Trample -- Wilderness Elemental's power is equal to the number of nonbasic lands your opponents control. mana={1}{R}{G} type=Creature @@ -112791,8 +112764,7 @@ type=Legendary Land [/card] [card] name=Yavimaya Kavu -auto=foreach(creature[red]|battlefield) 1/0 -auto=foreach(creature[green]|battlefield) 0/1 +auto=type:creature[red]:battlefield/type:creature[green]:battlefield cdaactive text=Yavimaya Kavu's power is equal to the number of red creatures on the battlefield. -- Yavimaya Kavu's toughness is equal to the number of green creatures on the battlefield. mana={2}{R}{G} type=Creature diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index eec795a76..8e70d92c8 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -402,7 +402,7 @@ private: } TargetChooserFactory tf(card->getObserver()); TargetChooser * tc = tf.createTargetChooser(theType.c_str(),NULL); - tc->other = other; + tc->other = other; for (int i = 0; i < 2; i++) { Player * p = card->getObserver()->players[i]; @@ -650,6 +650,61 @@ private: { intValue = target->controller()->opponent()->game->hand->nb_cards; } + else if (s == "pancientooze")//Ancient Ooze + { + intValue = 0; + for (int j = card->controller()->game->inPlay->nb_cards - 1; j >= 0; --j) + { + if (card->controller()->game->inPlay->cards[j]->hasType(Subtypes::TYPE_CREATURE) && card->controller()->game->inPlay->cards[j] != card) + { + intValue += card->controller()->game->inPlay->cards[j]->getManaCost()->getConvertedCost(); + } + } + } + else if (s == "pdauntless")//Dauntless Dourbark + { + intValue = 0; + for (int j = card->controller()->game->battlefield->nb_cards - 1; j >= 0; --j) + { + if (card->controller()->game->battlefield->cards[j]->hasType("forest")) + { + intValue += 1; + } + if (card->controller()->game->battlefield->cards[j]->hasType("treefolk")) + { + intValue += 1; + } + } + } + else if (s == "pbasiclandtypes")//Basic Land types + { + intValue = 0; + int forest, plains, swamp, island, mountain = 0; + for (int j = card->controller()->game->battlefield->nb_cards - 1; j >= 0; --j) + { + if (card->controller()->game->battlefield->cards[j]->hasType("forest")) + { + forest = 1; + } + if (card->controller()->game->battlefield->cards[j]->hasType("plains")) + { + plains = 1; + } + if (card->controller()->game->battlefield->cards[j]->hasType("swamp")) + { + swamp = 1; + } + if (card->controller()->game->battlefield->cards[j]->hasType("island")) + { + island = 1; + } + if (card->controller()->game->battlefield->cards[j]->hasType("mountain")) + { + mountain = 1; + } + } + intValue = mountain + island + forest + swamp + plains; + } else if (s == "myname")//Plague Rats and others { intValue = 0; From 478dea6af427569f45ed77621dc7ed4e17f80806 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 17 Sep 2015 21:30:55 +0800 Subject: [PATCH 109/249] Tidy up a little... --- projects/mtg/include/AllAbilities.h | 51 ++++---------- projects/mtg/include/MTGCardInstance.h | 15 ++++ projects/mtg/src/AllAbilities.cpp | 22 ++---- projects/mtg/src/Counters.cpp | 14 +--- projects/mtg/src/MTGCardInstance.cpp | 95 ++++++++++++++++++++++++++ 5 files changed, 129 insertions(+), 68 deletions(-) diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index 8e70d92c8..17f62efe8 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -2420,9 +2420,9 @@ public: { SAFE_DELETE(wppt); if(cda) - wppt = NEW WParsedPT(ReplaceString(PT, "cdaactive", ""),NULL,(MTGCardInstance *) source); + wppt = NEW WParsedPT(ReplaceString(PT, " cdaactive", ""),NULL,(MTGCardInstance *) source); else - wppt = NEW WParsedPT(ReplaceString(PT, "nonstatic", ""),NULL,(MTGCardInstance *) source); + wppt = NEW WParsedPT(ReplaceString(PT, " nonstatic", ""),NULL,(MTGCardInstance *) source); } MTGCardInstance * _target = (MTGCardInstance *) target; _target->power += wppt->power.getValue(); @@ -2434,9 +2434,9 @@ public: { SAFE_DELETE(wppt); if(cda) - wppt = NEW WParsedPT(ReplaceString(PT, "cdaactive", ""),NULL,(MTGCardInstance *) source); + wppt = NEW WParsedPT(ReplaceString(PT, " cdaactive", ""),NULL,(MTGCardInstance *) source); else - wppt = NEW WParsedPT(ReplaceString(PT, "nonstatic", ""),NULL,(MTGCardInstance *) source); + wppt = NEW WParsedPT(ReplaceString(PT, " nonstatic", ""),NULL,(MTGCardInstance *) source); } ((MTGCardInstance *) target)->origpower = wppt->power.getValue(); ((MTGCardInstance *) target)->origtoughness = (wppt->toughness.getValue() + ((MTGCardInstance *) target)->life)-((MTGCardInstance *) target)->life;//what? @@ -2449,27 +2449,17 @@ public: { SAFE_DELETE(wppt); if(cda) - wppt = NEW WParsedPT(ReplaceString(PT, "cdaactive", ""),NULL,(MTGCardInstance *) source); + wppt = NEW WParsedPT(ReplaceString(PT, " cdaactive", ""),NULL,(MTGCardInstance *) source); else - wppt = NEW WParsedPT(ReplaceString(PT, "nonstatic", ""),NULL,(MTGCardInstance *) source); + wppt = NEW WParsedPT(ReplaceString(PT, " nonstatic", ""),NULL,(MTGCardInstance *) source); } if(cda) {//Characteristic-defining abilities - _target->origpower = wppt->power.getValue();//set orig pt - _target->origtoughness = wppt->toughness.getValue(); - _target->setPower(_target->origpower);//update PT - _target->setToughness(_target->origtoughness); - _target->power += _target->pbonus;//add new bonus - _target->addToToughness(_target->tbonus); + _target->cdaPT(wppt->power.getValue(),wppt->toughness.getValue()); } else { - _target->power -= _target->pbonus;//remove current bonuses - _target->addToToughness(-_target->tbonus); - _target->pbonus += wppt->power.getValue();//update bonus - _target->tbonus += wppt->toughness.getValue(); - _target->power += _target->pbonus;//add new bonus - _target->addToToughness(_target->tbonus); + _target->addptbonus(wppt->power.getValue(),wppt->toughness.getValue()); } if(_target->has(Constants::INDESTRUCTIBLE) && wppt->toughness.getValue() < 0 && _target->toughness <= 0) { @@ -2485,12 +2475,7 @@ public: } else { - ((MTGCardInstance *) target)->power -= ((MTGCardInstance *) target)->pbonus; - ((MTGCardInstance *) target)->addToToughness(-((MTGCardInstance *) target)->tbonus); - ((MTGCardInstance *) target)->pbonus -= wppt->power.getValue(); - ((MTGCardInstance *) target)->tbonus -= wppt->toughness.getValue(); - ((MTGCardInstance *) target)->power += ((MTGCardInstance *) target)->pbonus; - ((MTGCardInstance *) target)->addToToughness(((MTGCardInstance *) target)->tbonus); + ((MTGCardInstance *) target)->removeptbonus(wppt->power.getValue(),wppt->toughness.getValue()); } return 1; } @@ -2500,9 +2485,9 @@ public: { SAFE_DELETE(wppt); if(cda) - wppt = NEW WParsedPT(ReplaceString(PT, "cdaactive", ""),NULL,(MTGCardInstance *) source); + wppt = NEW WParsedPT(ReplaceString(PT, " cdaactive", ""),NULL,(MTGCardInstance *) source); else - wppt = NEW WParsedPT(ReplaceString(PT, "nonstatic", ""),NULL,(MTGCardInstance *) source); + wppt = NEW WParsedPT(ReplaceString(PT, " nonstatic", ""),NULL,(MTGCardInstance *) source); } sprintf(menuText, "%i/%i", wppt->power.getValue(), wppt->toughness.getValue()); return menuText; @@ -5846,23 +5831,13 @@ public: { nbOpponents = source->blockers.size(); if (nbOpponents <= MaxOpponent) return 0; - source->power -= source->pbonus; - source->addToToughness(-source->tbonus); - source->pbonus += PowerModifier * (nbOpponents - MaxOpponent); - source->tbonus += ToughnessModifier * (nbOpponents - MaxOpponent); - source->power += source->pbonus; - source->addToToughness(source->tbonus); + source->addptbonus(PowerModifier * (nbOpponents - MaxOpponent),ToughnessModifier * (nbOpponents - MaxOpponent)); } else if (WEventPhaseChange* pe = dynamic_cast(event)) { if (MTG_PHASE_AFTER_EOT == pe->to->id && nbOpponents > MaxOpponent) { - source->power -= source->pbonus; - source->addToToughness(-source->tbonus); - source->pbonus -= PowerModifier * (nbOpponents - MaxOpponent); - source->tbonus -= ToughnessModifier * (nbOpponents - MaxOpponent); - source->power += source->pbonus; - source->addToToughness(source->tbonus); + source->removeptbonus(PowerModifier * (nbOpponents - MaxOpponent),ToughnessModifier * (nbOpponents - MaxOpponent)); nbOpponents = 0; } } diff --git a/projects/mtg/include/MTGCardInstance.h b/projects/mtg/include/MTGCardInstance.h index 38a4a5cd0..45dd49439 100644 --- a/projects/mtg/include/MTGCardInstance.h +++ b/projects/mtg/include/MTGCardInstance.h @@ -220,6 +220,21 @@ public: void tap(); void attemptUntap(); + //cda and other func + void stripPTbonus(); + void minusPTbonus(int p = 0, int t = 0); + void plusPTbonus(int p = 0, int t = 0); + void applyPTbonus(); + void addcounter(int p = 0, int t = 0); + void removecounter(int p = 0, int t = 0); + void addptbonus(int p = 0, int t = 0); + void removeptbonus(int p = 0, int t = 0); + void addbaseP(int p = 0); + void addbaseT(int t = 0); + void revertbaseP(); + void revertbaseT(); + void cdaPT(int p = 0, int t = 0); + void eventattacked(); void eventattackedAlone(); void eventattackednotblocked(); diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index 1bb059a35..7265690c7 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -4186,10 +4186,7 @@ for (it = types.begin(); it != types.end(); it++) if(newpowerfound ) { WParsedInt * val = NEW WParsedInt(newpower,NULL, source); - _target->basepower = val->getValue(); - _target->power -= _target->pbonus; - _target->power = (_target->power + _target->basepower) - _target->power; - _target->power += _target->pbonus; + _target->addbaseP(val->getValue()); delete val; } if(newtoughnessfound ) @@ -4197,10 +4194,7 @@ for (it = types.begin(); it != types.end(); it++) //and you turn it into 1/1, the 1 damage is still there and the creature must die... //the toughness is intact but what we see in the game is the life... WParsedInt * val = NEW WParsedInt(newtoughness,NULL, source); - _target->basetoughness = val->getValue(); - _target->addToToughness(-_target->tbonus); - _target->addToToughness(_target->basetoughness - _target->toughness); - _target->addToToughness(_target->tbonus); + _target->addbaseT(val->getValue()); delete val; } @@ -4290,19 +4284,11 @@ int ATransformer::destroy() if(newpowerfound ) { - _target->power -= _target->pbonus; - _target->power += _target->origpower; - _target->power -= _target->basepower; - _target->power += _target->pbonus; - _target->basepower = _target->origpower; + _target->revertbaseP(); } if(newtoughnessfound ) { - _target->addToToughness(-_target->tbonus); - _target->addToToughness(_target->origtoughness); - _target->addToToughness(-_target->basetoughness); - _target->addToToughness(_target->tbonus); - _target->basetoughness = _target->origtoughness; + _target->revertbaseT(); } if(newAbilityFound) { diff --git a/projects/mtg/src/Counters.cpp b/projects/mtg/src/Counters.cpp index 25f1f90a5..a1111c928 100644 --- a/projects/mtg/src/Counters.cpp +++ b/projects/mtg/src/Counters.cpp @@ -56,12 +56,7 @@ int Counter::added() { if (power != 0 || toughness != 0) { - target->power -= target->pbonus; - target->addToToughness(-target->tbonus); - target->pbonus += power; - target->tbonus += toughness; - target->power += target->pbonus; - target->addToToughness(target->pbonus); + target->addcounter(power, toughness); } return 1; } @@ -70,12 +65,7 @@ int Counter::removed() { if (power != 0 || toughness != 0) { - target->power -= target->pbonus; - target->addToToughness(-target->tbonus); - target->pbonus -= power; - target->tbonus -= toughness; - target->power += target->pbonus; - target->addToToughness(target->pbonus); + target->removecounter(power, toughness); } return 1; } diff --git a/projects/mtg/src/MTGCardInstance.cpp b/projects/mtg/src/MTGCardInstance.cpp index 6a9a7d8a0..b64305392 100644 --- a/projects/mtg/src/MTGCardInstance.cpp +++ b/projects/mtg/src/MTGCardInstance.cpp @@ -599,6 +599,101 @@ int MTGCardInstance::setToughness(int value) return 1; } +void MTGCardInstance::stripPTbonus() +{ + power -= pbonus; + addToToughness(-tbonus); +} + +void MTGCardInstance::plusPTbonus(int p, int t) +{ + pbonus += p; + tbonus += t; +} + +void MTGCardInstance::minusPTbonus(int p, int t) +{ + pbonus -= p; + tbonus -= t; +} + +void MTGCardInstance::applyPTbonus() +{ + power += pbonus; + addToToughness(tbonus); +} + +void MTGCardInstance::addcounter(int p, int t) +{ + stripPTbonus(); + plusPTbonus(p,t); + applyPTbonus(); +} + +void MTGCardInstance::addptbonus(int p, int t) +{ + stripPTbonus(); + plusPTbonus(p,t); + applyPTbonus(); +} + +void MTGCardInstance::removecounter(int p, int t) +{ + stripPTbonus(); + minusPTbonus(p,t); + applyPTbonus(); +} + +void MTGCardInstance::removeptbonus(int p, int t) +{ + stripPTbonus(); + minusPTbonus(p,t); + applyPTbonus(); +} + +void MTGCardInstance::addbaseP(int p) +{ + basepower = p; + power -= pbonus; + power = p; + power += pbonus; +} + +void MTGCardInstance::addbaseT(int t) +{ + basetoughness = t; + addToToughness(-tbonus); + addToToughness(t - toughness); + addToToughness(tbonus); +} + +void MTGCardInstance::revertbaseP() +{ + power -= pbonus; + power += origpower; + power -= basepower; + power += pbonus; + basepower = origpower; +} + +void MTGCardInstance::revertbaseT() +{ + addToToughness(-tbonus); + addToToughness(origtoughness); + addToToughness(-basetoughness); + addToToughness(tbonus); + basetoughness = origtoughness; +} + +void MTGCardInstance::cdaPT(int p, int t) +{ + origpower = p; + origtoughness = t; + setPower(p); + setToughness(t); + applyPTbonus(); +} + int MTGCardInstance::canBlock() { if (tapped) From 53153b237c25d81c67af4a9c5f41a5c4af6f7a3b Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 17 Sep 2015 22:50:21 +0800 Subject: [PATCH 110/249] CDA test # 1 Testing layer 7a, 7b and 7c :) --- projects/mtg/bin/Res/test/CDA#1.txt | 46 +++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 projects/mtg/bin/Res/test/CDA#1.txt diff --git a/projects/mtg/bin/Res/test/CDA#1.txt b/projects/mtg/bin/Res/test/CDA#1.txt new file mode 100644 index 000000000..4c583a5e9 --- /dev/null +++ b/projects/mtg/bin/Res/test/CDA#1.txt @@ -0,0 +1,46 @@ +#Testing CDA Tarmogoyf vs Godhead of Awe +#Godhead of Awe makes other creatures 1/1 on layer 7b +#Tarmogoyf's CDA ability is on layer 7a so it will be overriden +#by Godhead of Awe. Giant Growth's ability is on layer 7c so +#the +3/+3 bonus is intact. :) +[INIT] +FIRSTMAIN +[PLAYER1] +inplay:Concordant Crossroads, Godhead of Awe, Forest +hand:Tarmogoyf, Giant Growth +graveyard:mountain, lightning bolt, grizzly bear +manapool:{1}{G} +[PLAYER2] +[DO] +Tarmogoyf +next +next +Tarmogoyf +next +eot +eot +#untap +next +#upkeep +next +#draw +next +#main1 +Forest +Giant Growth +Tarmogoyf +next +#combat begin +next +#attackers +Tarmogoyf +eot +[ASSERT] +UNTAP +[PLAYER1] +inplay:Concordant Crossroads, Godhead of Awe, Tarmogoyf, Forest +graveyard:mountain, lightning bolt, grizzly bear, Giant Growth +manapool:{0} +[PLAYER2] +life:15 +[END] From 7ce05fb4fce692a480cabd54eccac89fd8ed0f5b Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Fri, 18 Sep 2015 05:27:48 +0800 Subject: [PATCH 111/249] CDA test # 2 --- projects/mtg/bin/Res/test/CDA#2.txt | 38 +++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 projects/mtg/bin/Res/test/CDA#2.txt diff --git a/projects/mtg/bin/Res/test/CDA#2.txt b/projects/mtg/bin/Res/test/CDA#2.txt new file mode 100644 index 000000000..c1fca2d5b --- /dev/null +++ b/projects/mtg/bin/Res/test/CDA#2.txt @@ -0,0 +1,38 @@ +#Testing CDA Turn to Frog vs Krosan Cloudscraper +#Krosan Cloudscraper that is turned into frog with 1 damage +#from Lightning Dart must die because when you change +#the power and toughness into 1/1, the 1 point of damage +#is taken into account... +[INIT] +FIRSTMAIN +[PLAYER1] +inplay:Krosan Cloudscraper +[PLAYER2] +inplay:Mountain, Plains, Swamp, Island +hand:Lightning Dart, Turn to Frog +[DO] +next +next +Krosan Cloudscraper +next +no +yes +Mountain +Plains +Lightning Dart +Krosan Cloudscraper +Swamp +Island +Turn to Frog +Krosan Cloudscraper +endinterruption +eot +[ASSERT] +UNTAP +[PLAYER1] +graveyard:Krosan Cloudscraper +[PLAYER2] +inplay:Mountain, Plains, Swamp, Island +graveyard:Lightning Dart, Turn to Frog +life:20 +[END] From 8c9a98e3e9c33f15f527e270998c6c36be6d9938 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Fri, 18 Sep 2015 05:31:13 +0800 Subject: [PATCH 112/249] Update _tests.txt --- projects/mtg/bin/Res/test/_tests.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/projects/mtg/bin/Res/test/_tests.txt b/projects/mtg/bin/Res/test/_tests.txt index eede5159b..34d5ed0d0 100644 --- a/projects/mtg/bin/Res/test/_tests.txt +++ b/projects/mtg/bin/Res/test/_tests.txt @@ -210,6 +210,8 @@ Call_to_Heel_1.txt Call_to_Heel_2.txt castle.txt cathodion.txt +CDA#1.txt +CDA#2.txt celestial_mantle.txt celestial_purge.txt celestial_sword.txt From 13bb6dbe9383c13cdf1a6656c0230e197f2b38ad Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Fri, 18 Sep 2015 06:03:53 +0800 Subject: [PATCH 113/249] Update Token.cpp Fix typo --- projects/mtg/src/Token.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/mtg/src/Token.cpp b/projects/mtg/src/Token.cpp index a63bb9167..bb303558f 100644 --- a/projects/mtg/src/Token.cpp +++ b/projects/mtg/src/Token.cpp @@ -52,7 +52,7 @@ Token::Token(const Token& source) : origpower = source.origpower; origtoughness = source.origtoughness; basepower = source.origpower; - basetoughness = source.origpower; + basetoughness = source.origtoughness; pbonus = source.pbonus; tbonus = source.tbonus; rarity = source.rarity; From 6cd0474eca4b4f100e17d2516d9934ff7f7ddf33 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Fri, 18 Sep 2015 19:56:02 +0800 Subject: [PATCH 114/249] Bug Fix on Cloning Tokens --- projects/mtg/include/AllAbilities.h | 1 + projects/mtg/include/MTGCardInstance.h | 1 + projects/mtg/src/AllAbilities.cpp | 25 ++++++++++++++++++------- projects/mtg/src/MTGCardInstance.cpp | 1 + 4 files changed, 21 insertions(+), 7 deletions(-) diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index 17f62efe8..ef0b8b31a 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -2456,6 +2456,7 @@ public: if(cda) {//Characteristic-defining abilities _target->cdaPT(wppt->power.getValue(),wppt->toughness.getValue()); + _target->isCDA = true; } else { diff --git a/projects/mtg/include/MTGCardInstance.h b/projects/mtg/include/MTGCardInstance.h index 45dd49439..723013148 100644 --- a/projects/mtg/include/MTGCardInstance.h +++ b/projects/mtg/include/MTGCardInstance.h @@ -234,6 +234,7 @@ public: void revertbaseP(); void revertbaseT(); void cdaPT(int p = 0, int t = 0); + bool isCDA; void eventattacked(); void eventattackedAlone(); diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index 7265690c7..434f5ad4a 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -2536,16 +2536,27 @@ int AACloner::resolve() spell->source->fresh = 1; spell->source->model = spell->source; spell->source->model->data = spell->source; - //commenting this out fixes some problems when duplicating tokens 9/16/2015 - /*if(_target->isToken) + //if the token doesn't have cda/dynamic pt then allow this... + if((_target->isToken) && (!_target->isCDA)) { - spell->source->power = _target->origpower; - spell->source->toughness = _target->origtoughness; - spell->source->life = _target->origtoughness; - }*/ + if(_target->pbonus > 0) + spell->source->power = _target->power - _target->pbonus; + else + spell->source->power = _target->power + _target->pbonus; + if(_target->tbonus > 0) + { + spell->source->toughness = _target->toughness - _target->tbonus; + spell->source->life = _target->toughness - _target->tbonus; + } + else + { + spell->source->toughness = _target->toughness + _target->tbonus; + spell->source->life = _target->toughness + _target->tbonus; + } + } list::iterator it; for (it = awith.begin(); it != awith.end(); it++) - { + {//there must be a layer of temporary abilities and original abilities spell->source->basicAbilities[*it] = 1; } for (it = colors.begin(); it != colors.end(); it++) diff --git a/projects/mtg/src/MTGCardInstance.cpp b/projects/mtg/src/MTGCardInstance.cpp index b64305392..88458bcb1 100644 --- a/projects/mtg/src/MTGCardInstance.cpp +++ b/projects/mtg/src/MTGCardInstance.cpp @@ -54,6 +54,7 @@ MTGCardInstance::MTGCardInstance(MTGCard * card, MTGPlayerCards * arg_belongs_to flanked = 0; castMethod = Constants::NOT_CAST; isSettingBase = 0; + isCDA = false; } MTGCardInstance * MTGCardInstance::createSnapShot() From 11124205e51e38ed6632b0be851e3b3ed17d8361 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Fri, 18 Sep 2015 20:16:28 +0800 Subject: [PATCH 115/249] basic color code on PT if a creature was damaged or has a negative toughness bonus, the pt changes to crimson red, if the creature was not damaged and has power buff, the color changes to spring green, normal was default white. --- projects/mtg/src/AllAbilities.cpp | 2 +- projects/mtg/src/CardGui.cpp | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index 434f5ad4a..8f46e5728 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -2541,7 +2541,7 @@ int AACloner::resolve() { if(_target->pbonus > 0) spell->source->power = _target->power - _target->pbonus; - else + else spell->source->power = _target->power + _target->pbonus; if(_target->tbonus > 0) { diff --git a/projects/mtg/src/CardGui.cpp b/projects/mtg/src/CardGui.cpp index de5efb003..8c49bb260 100644 --- a/projects/mtg/src/CardGui.cpp +++ b/projects/mtg/src/CardGui.cpp @@ -285,7 +285,12 @@ void CardGui::Render() sprintf(buffer, "%i/%i", card->power, card->life); renderer->FillRect(actX - (12 * actZ), actY + 6 * actZ, 25 * actZ, 12 * actZ, ARGB(((static_cast(actA))/2),0,0,0)); - mFont->SetColor(ARGB(static_cast(actA),255,255,255)); + if(card->wasDealtDamage || card->tbonus < 0) + mFont->SetColor(ARGB(static_cast(actA),220,20,60));//crimson + else if(!card->wasDealtDamage && card->pbonus > 0) + mFont->SetColor(ARGB(static_cast(actA),0,255,127));//spring green + else + mFont->SetColor(ARGB(static_cast(actA),255,255,255));//white mFont->SetScale(actZ); mFont->DrawString(buffer, actX - 10 * actZ, actY + 8 * actZ); mFont->SetScale(1); From ef690f6438a430a9739f6b1b7bd445a9cb1cb78a Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sat, 19 Sep 2015 07:50:04 +0800 Subject: [PATCH 116/249] update pt colors --- projects/mtg/src/CardGui.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/projects/mtg/src/CardGui.cpp b/projects/mtg/src/CardGui.cpp index 8c49bb260..dc78f226f 100644 --- a/projects/mtg/src/CardGui.cpp +++ b/projects/mtg/src/CardGui.cpp @@ -285,10 +285,18 @@ void CardGui::Render() sprintf(buffer, "%i/%i", card->power, card->life); renderer->FillRect(actX - (12 * actZ), actY + 6 * actZ, 25 * actZ, 12 * actZ, ARGB(((static_cast(actA))/2),0,0,0)); - if(card->wasDealtDamage || card->tbonus < 0) - mFont->SetColor(ARGB(static_cast(actA),220,20,60));//crimson + if(card->wasDealtDamage && card->life <= 2) + mFont->SetColor(ARGB(static_cast(actA),255,0,0));//red else if(!card->wasDealtDamage && card->pbonus > 0) - mFont->SetColor(ARGB(static_cast(actA),0,255,127));//spring green + mFont->SetColor(ARGB(static_cast(actA),152,251,152));//pale green + else if(card->getRarity() == Constants::RARITY_M) + mFont->SetColor(ARGB(static_cast(actA),255,165,0));//orange + else if(card->getRarity() == Constants::RARITY_R) + mFont->SetColor(ARGB(static_cast(actA),255,215,0));//gold + else if(card->getRarity() == Constants::RARITY_T) + mFont->SetColor(ARGB(static_cast(actA),245,245,245));//smoke + else if(card->hasType("legendary") && card->hasType("eldrazi")) + mFont->SetColor(ARGB(static_cast(actA),238,130,238));//violet else mFont->SetColor(ARGB(static_cast(actA),255,255,255));//white mFont->SetScale(actZ); From 81f0c916f5c26fd282f927abe3b4c96f78fd1481 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sat, 19 Sep 2015 08:04:26 +0800 Subject: [PATCH 117/249] readjustment --- projects/mtg/src/CardGui.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/projects/mtg/src/CardGui.cpp b/projects/mtg/src/CardGui.cpp index dc78f226f..a37941143 100644 --- a/projects/mtg/src/CardGui.cpp +++ b/projects/mtg/src/CardGui.cpp @@ -285,11 +285,7 @@ void CardGui::Render() sprintf(buffer, "%i/%i", card->power, card->life); renderer->FillRect(actX - (12 * actZ), actY + 6 * actZ, 25 * actZ, 12 * actZ, ARGB(((static_cast(actA))/2),0,0,0)); - if(card->wasDealtDamage && card->life <= 2) - mFont->SetColor(ARGB(static_cast(actA),255,0,0));//red - else if(!card->wasDealtDamage && card->pbonus > 0) - mFont->SetColor(ARGB(static_cast(actA),152,251,152));//pale green - else if(card->getRarity() == Constants::RARITY_M) + if(card->getRarity() == Constants::RARITY_M) mFont->SetColor(ARGB(static_cast(actA),255,165,0));//orange else if(card->getRarity() == Constants::RARITY_R) mFont->SetColor(ARGB(static_cast(actA),255,215,0));//gold @@ -299,6 +295,14 @@ void CardGui::Render() mFont->SetColor(ARGB(static_cast(actA),238,130,238));//violet else mFont->SetColor(ARGB(static_cast(actA),255,255,255));//white + //damaged or buffed or powered down + if(card->wasDealtDamage && card->life <= 2) + mFont->SetColor(ARGB(static_cast(actA),255,0,0));//red + else if(!card->wasDealtDamage && card->pbonus > 0) + mFont->SetColor(ARGB(static_cast(actA),152,251,152));//pale green + else if(!card->wasDealtDamage && card->pbonus < 0) + mFont->SetColor(ARGB(static_cast(actA),216,191,216));//thistle + mFont->SetScale(actZ); mFont->SetScale(actZ); mFont->DrawString(buffer, actX - 10 * actZ, actY + 8 * actZ); mFont->SetScale(1); From e25b78953c0ea057627f5b82b73c905254a86869 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sat, 19 Sep 2015 10:29:02 +0800 Subject: [PATCH 118/249] other indicators must be somewhere else --- projects/mtg/src/CardGui.cpp | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/projects/mtg/src/CardGui.cpp b/projects/mtg/src/CardGui.cpp index a37941143..29291784f 100644 --- a/projects/mtg/src/CardGui.cpp +++ b/projects/mtg/src/CardGui.cpp @@ -285,23 +285,17 @@ void CardGui::Render() sprintf(buffer, "%i/%i", card->power, card->life); renderer->FillRect(actX - (12 * actZ), actY + 6 * actZ, 25 * actZ, 12 * actZ, ARGB(((static_cast(actA))/2),0,0,0)); - if(card->getRarity() == Constants::RARITY_M) - mFont->SetColor(ARGB(static_cast(actA),255,165,0));//orange - else if(card->getRarity() == Constants::RARITY_R) - mFont->SetColor(ARGB(static_cast(actA),255,215,0));//gold + //damaged or buffed or powered down + if(card->wasDealtDamage && card->life <= 2) + mFont->SetColor(ARGB(static_cast(actA),255,0,0));//red + else if(!card->wasDealtDamage && card->pbonus < 0) + mFont->SetColor(ARGB(static_cast(actA),216,191,216));//thistle else if(card->getRarity() == Constants::RARITY_T) mFont->SetColor(ARGB(static_cast(actA),245,245,245));//smoke else if(card->hasType("legendary") && card->hasType("eldrazi")) mFont->SetColor(ARGB(static_cast(actA),238,130,238));//violet else mFont->SetColor(ARGB(static_cast(actA),255,255,255));//white - //damaged or buffed or powered down - if(card->wasDealtDamage && card->life <= 2) - mFont->SetColor(ARGB(static_cast(actA),255,0,0));//red - else if(!card->wasDealtDamage && card->pbonus > 0) - mFont->SetColor(ARGB(static_cast(actA),152,251,152));//pale green - else if(!card->wasDealtDamage && card->pbonus < 0) - mFont->SetColor(ARGB(static_cast(actA),216,191,216));//thistle mFont->SetScale(actZ); mFont->SetScale(actZ); mFont->DrawString(buffer, actX - 10 * actZ, actY + 8 * actZ); From c9d9d3d4d3c7b48a11688a1f2c5d9e7b2bebaf12 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sat, 19 Sep 2015 13:05:16 +0800 Subject: [PATCH 119/249] Random I have a profile with 100+ decks and it seems with the previous code, the random deck seems not random. --- projects/mtg/src/DeckMenu.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/projects/mtg/src/DeckMenu.cpp b/projects/mtg/src/DeckMenu.cpp index 7c2e060f5..961bc8332 100644 --- a/projects/mtg/src/DeckMenu.cpp +++ b/projects/mtg/src/DeckMenu.cpp @@ -215,7 +215,10 @@ void DeckMenu::selectRandomDeck(bool isAi) { DeckManager *deckManager = DeckManager::GetInstance(); vector *deckList = isAi ? deckManager->getAIDeckOrderList() : deckManager->getPlayerDeckOrderList(); - int random = (WRand() * 1000) % deckList->size(); + //int random = (WRand() * 1000) % deckList->size(); + int lowest=0, highest = deckList->size(); + int range=(highest-lowest)+1; + int random = lowest+int(range*rand()/(RAND_MAX + 1.0)); selectDeck( random, isAi ); } From 64c6d19ae7eddfaca25ac0baec809b855902d69f Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sat, 19 Sep 2015 13:28:14 +0800 Subject: [PATCH 120/249] lowest is 0, typo... --- projects/mtg/src/DeckMenu.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/mtg/src/DeckMenu.cpp b/projects/mtg/src/DeckMenu.cpp index 961bc8332..9c544a535 100644 --- a/projects/mtg/src/DeckMenu.cpp +++ b/projects/mtg/src/DeckMenu.cpp @@ -217,7 +217,7 @@ void DeckMenu::selectRandomDeck(bool isAi) vector *deckList = isAi ? deckManager->getAIDeckOrderList() : deckManager->getPlayerDeckOrderList(); //int random = (WRand() * 1000) % deckList->size(); int lowest=0, highest = deckList->size(); - int range=(highest-lowest)+1; + int range=(highest-lowest); int random = lowest+int(range*rand()/(RAND_MAX + 1.0)); selectDeck( random, isAi ); } From c372ffa1116457e04beaa9e9b5faff759dfbdb04 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sat, 19 Sep 2015 23:25:33 +0800 Subject: [PATCH 121/249] Switching PT, Token Indicator Added Switching PT like Layer 7e, Token Indicator for cloned Cards --- projects/mtg/include/AllAbilities.h | 107 ++++++++++++++++--------- projects/mtg/include/MTGCardInstance.h | 4 + projects/mtg/include/utils.h | 1 + projects/mtg/src/AllAbilities.cpp | 18 ++++- projects/mtg/src/CardGui.cpp | 11 +++ projects/mtg/src/Counters.cpp | 16 +++- projects/mtg/src/GameStateDuel.cpp | 4 +- projects/mtg/src/MTGCardInstance.cpp | 21 +++++ projects/mtg/src/utils.cpp | 11 +++ 9 files changed, 150 insertions(+), 43 deletions(-) diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index ef0b8b31a..fc4e7db8c 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -2398,45 +2398,42 @@ public: aType = MTGAbility::STANDARD_PUMP; cda = PT.find("cdaactive") != string::npos; } - string ReplaceString(string subject, const string& search, const string& replace) - { - size_t pos = 0; - while ((pos = subject.find(search, pos)) != string::npos) - { - subject.replace(pos, search.length(), replace); - pos += replace.length(); - } - return subject; - } + void Update(float) { if(!nonstatic) return; if(!cda || (cda && (((MTGCardInstance *) target)->isSettingBase < 1))) { + if(((MTGCardInstance *) target)->isSwitchedPT) + ((MTGCardInstance *) target)->switchPT(false);//revert + ((MTGCardInstance *) target)->power -= wppt->power.getValue(); ((MTGCardInstance *) target)->addToToughness(-wppt->toughness.getValue()); if(PT.size()) { SAFE_DELETE(wppt); if(cda) - wppt = NEW WParsedPT(ReplaceString(PT, " cdaactive", ""),NULL,(MTGCardInstance *) source); + wppt = NEW WParsedPT(cReplaceString(PT, " cdaactive", ""),NULL,(MTGCardInstance *) source); else - wppt = NEW WParsedPT(ReplaceString(PT, " nonstatic", ""),NULL,(MTGCardInstance *) source); + wppt = NEW WParsedPT(cReplaceString(PT, " nonstatic", ""),NULL,(MTGCardInstance *) source); } MTGCardInstance * _target = (MTGCardInstance *) target; _target->power += wppt->power.getValue(); _target->addToToughness(wppt->toughness.getValue()); + + if(_target->isSwitchedPT) + _target->switchPT(true);//reaapply } - if(cda) + if(cda) {//update but not apply if(PT.size()) { SAFE_DELETE(wppt); if(cda) - wppt = NEW WParsedPT(ReplaceString(PT, " cdaactive", ""),NULL,(MTGCardInstance *) source); + wppt = NEW WParsedPT(cReplaceString(PT, " cdaactive", ""),NULL,(MTGCardInstance *) source); else - wppt = NEW WParsedPT(ReplaceString(PT, " nonstatic", ""),NULL,(MTGCardInstance *) source); + wppt = NEW WParsedPT(cReplaceString(PT, " nonstatic", ""),NULL,(MTGCardInstance *) source); } ((MTGCardInstance *) target)->origpower = wppt->power.getValue(); ((MTGCardInstance *) target)->origtoughness = (wppt->toughness.getValue() + ((MTGCardInstance *) target)->life)-((MTGCardInstance *) target)->life;//what? @@ -2449,22 +2446,37 @@ public: { SAFE_DELETE(wppt); if(cda) - wppt = NEW WParsedPT(ReplaceString(PT, " cdaactive", ""),NULL,(MTGCardInstance *) source); + wppt = NEW WParsedPT(cReplaceString(PT, " cdaactive", ""),NULL,(MTGCardInstance *) source); else - wppt = NEW WParsedPT(ReplaceString(PT, " nonstatic", ""),NULL,(MTGCardInstance *) source); + wppt = NEW WParsedPT(cReplaceString(PT, " nonstatic", ""),NULL,(MTGCardInstance *) source); } if(cda) {//Characteristic-defining abilities - _target->cdaPT(wppt->power.getValue(),wppt->toughness.getValue()); + if(_target->isSwitchedPT) + { + _target->switchPT(false); + _target->cdaPT(wppt->power.getValue(),wppt->toughness.getValue()); + _target->switchPT(true); + } + else + _target->cdaPT(wppt->power.getValue(),wppt->toughness.getValue()); + _target->isCDA = true; } - else + else { - _target->addptbonus(wppt->power.getValue(),wppt->toughness.getValue()); + if(_target->isSwitchedPT) + { + _target->switchPT(false); + _target->addptbonus(wppt->power.getValue(),wppt->toughness.getValue()); + _target->switchPT(true); + } + else + _target->addptbonus(wppt->power.getValue(),wppt->toughness.getValue()); } if(_target->has(Constants::INDESTRUCTIBLE) && wppt->toughness.getValue() < 0 && _target->toughness <= 0) { - _target->controller()->game->putInGraveyard(_target); + _target->controller()->game->putInGraveyard(_target); } return MTGAbility::addToGame(); } @@ -2486,9 +2498,9 @@ public: { SAFE_DELETE(wppt); if(cda) - wppt = NEW WParsedPT(ReplaceString(PT, " cdaactive", ""),NULL,(MTGCardInstance *) source); + wppt = NEW WParsedPT(cReplaceString(PT, " cdaactive", ""),NULL,(MTGCardInstance *) source); else - wppt = NEW WParsedPT(ReplaceString(PT, " nonstatic", ""),NULL,(MTGCardInstance *) source); + wppt = NEW WParsedPT(cReplaceString(PT, " nonstatic", ""),NULL,(MTGCardInstance *) source); } sprintf(menuText, "%i/%i", wppt->power.getValue(), wppt->toughness.getValue()); return menuText; @@ -4213,8 +4225,6 @@ string menu; class ASwapPT: public InstantAbility { public: - int oldP; - int oldT; ASwapPT(GameObserver* observer, int _id, MTGCardInstance * _source, MTGCardInstance * _target) : InstantAbility(observer, _id, _source, _target) { @@ -4229,11 +4239,16 @@ public: while (_target->next) _target = _target->next; //This is for cards such as rampant growth - oldP = _target->power; - oldT = _target->toughness; - _target->addToToughness(oldP); - _target->addToToughness(-oldT); - _target->setPower(oldT); + if(!_target->isSwitchedPT) + { + _target->isSwitchedPT = true; + _target->switchPT(true); + } + else + { + _target->isSwitchedPT = false; + _target->switchPT(false); + } } return 1; } @@ -4246,12 +4261,11 @@ public: while (_target->next) _target = _target->next; //This is for cards such as rampant growth - oldP = _target->power; - oldT = _target->toughness; - _target->addToToughness(oldP); - _target->addToToughness(-oldT); - _target->setPower(oldT); - + if(_target->isSwitchedPT) + { + _target->isSwitchedPT = false; + _target->switchPT(false); + } } return 1; } @@ -5832,14 +5846,29 @@ public: { nbOpponents = source->blockers.size(); if (nbOpponents <= MaxOpponent) return 0; - source->addptbonus(PowerModifier * (nbOpponents - MaxOpponent),ToughnessModifier * (nbOpponents - MaxOpponent)); + if(source->isSwitchedPT) + { + source->switchPT(false); + source->addptbonus(PowerModifier * (nbOpponents - MaxOpponent),ToughnessModifier * (nbOpponents - MaxOpponent)); + source->switchPT(true); + } + else + source->addptbonus(PowerModifier * (nbOpponents - MaxOpponent),ToughnessModifier * (nbOpponents - MaxOpponent)); } else if (WEventPhaseChange* pe = dynamic_cast(event)) { if (MTG_PHASE_AFTER_EOT == pe->to->id && nbOpponents > MaxOpponent) { - source->removeptbonus(PowerModifier * (nbOpponents - MaxOpponent),ToughnessModifier * (nbOpponents - MaxOpponent)); - nbOpponents = 0; + if(source->isSwitchedPT) + { + source->switchPT(false); + source->removeptbonus(PowerModifier * (nbOpponents - MaxOpponent),ToughnessModifier * (nbOpponents - MaxOpponent)); + source->switchPT(true); + } + else + source->removeptbonus(PowerModifier * (nbOpponents - MaxOpponent),ToughnessModifier * (nbOpponents - MaxOpponent)); + + nbOpponents = 0; } } return 1; diff --git a/projects/mtg/include/MTGCardInstance.h b/projects/mtg/include/MTGCardInstance.h index 723013148..5e92c3a02 100644 --- a/projects/mtg/include/MTGCardInstance.h +++ b/projects/mtg/include/MTGCardInstance.h @@ -235,6 +235,10 @@ public: void revertbaseT(); void cdaPT(int p = 0, int t = 0); bool isCDA; + void switchPT(bool apply = false); + int swapP; + int swapT; + bool isSwitchedPT; void eventattacked(); void eventattackedAlone(); diff --git a/projects/mtg/include/utils.h b/projects/mtg/include/utils.h index 25a4c392d..41e21c7a7 100644 --- a/projects/mtg/include/utils.h +++ b/projects/mtg/include/utils.h @@ -121,6 +121,7 @@ bool fileExists(const char * filename); bool FileExists(const string & filename); std::string buildFilePath(const vector & folders, const string & filename); std::string ensureFolder(const string & folderName); +std::string cReplaceString(string subject, const string& search, const string& replace); /* template istream& operator>>(istream& in, T& p) { diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index 8f46e5728..80df4716e 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -4197,7 +4197,14 @@ for (it = types.begin(); it != types.end(); it++) if(newpowerfound ) { WParsedInt * val = NEW WParsedInt(newpower,NULL, source); - _target->addbaseP(val->getValue()); + if(_target->isSwitchedPT) + { + _target->switchPT(false); + _target->addbaseP(val->getValue()); + _target->switchPT(true); + } + else + _target->addbaseP(val->getValue()); delete val; } if(newtoughnessfound ) @@ -4205,7 +4212,14 @@ for (it = types.begin(); it != types.end(); it++) //and you turn it into 1/1, the 1 damage is still there and the creature must die... //the toughness is intact but what we see in the game is the life... WParsedInt * val = NEW WParsedInt(newtoughness,NULL, source); - _target->addbaseT(val->getValue()); + if(_target->isSwitchedPT) + { + _target->switchPT(false); + _target->addbaseT(val->getValue()); + _target->switchPT(true); + } + else + _target->addbaseT(val->getValue()); delete val; } diff --git a/projects/mtg/src/CardGui.cpp b/projects/mtg/src/CardGui.cpp index 29291784f..61c6ab2c3 100644 --- a/projects/mtg/src/CardGui.cpp +++ b/projects/mtg/src/CardGui.cpp @@ -302,6 +302,17 @@ void CardGui::Render() mFont->SetScale(1); } + if(card->getRarity() == Constants::RARITY_T) + { + mFont->SetScale(DEFAULT_MAIN_FONT_SCALE); + char buffer[200]; + sprintf(buffer, "T"); + mFont->SetColor(ARGB(static_cast(actA),255,222,173));//Navajo + mFont->SetScale(0.8f); + mFont->DrawString(buffer, actX - 10 * actZ, actY - (18 * actZ)); + mFont->SetScale(1); + } + if (card->counters->mCount > 0) { unsigned c = -1; diff --git a/projects/mtg/src/Counters.cpp b/projects/mtg/src/Counters.cpp index a1111c928..b01c57644 100644 --- a/projects/mtg/src/Counters.cpp +++ b/projects/mtg/src/Counters.cpp @@ -56,7 +56,14 @@ int Counter::added() { if (power != 0 || toughness != 0) { - target->addcounter(power, toughness); + if(target->isSwitchedPT) + { + target->switchPT(false); + target->addcounter(power, toughness); + target->switchPT(true); + } + else + target->addcounter(power, toughness); } return 1; } @@ -65,6 +72,13 @@ int Counter::removed() { if (power != 0 || toughness != 0) { + if(target->isSwitchedPT) + { + target->switchPT(false); + target->removecounter(power, toughness); + target->switchPT(true); + } + else target->removecounter(power, toughness); } return 1; diff --git a/projects/mtg/src/GameStateDuel.cpp b/projects/mtg/src/GameStateDuel.cpp index 2af6be905..2d902c8b8 100644 --- a/projects/mtg/src/GameStateDuel.cpp +++ b/projects/mtg/src/GameStateDuel.cpp @@ -1857,7 +1857,9 @@ int Tournament::getRandomDeck(bool noEasyDecks) while(isDouble && decks.size()>0) { isDouble=false; - k = rand() % (int)decks.size(); + int lowest=0, highest = (int)decks.size(); + int range=(highest-lowest); + k = lowest+int(range*rand()/(RAND_MAX + 1.0)); random = decks.at(k); deckNumber = deckList->at(random)->getDeckId(); diff --git a/projects/mtg/src/MTGCardInstance.cpp b/projects/mtg/src/MTGCardInstance.cpp index 88458bcb1..616757249 100644 --- a/projects/mtg/src/MTGCardInstance.cpp +++ b/projects/mtg/src/MTGCardInstance.cpp @@ -55,6 +55,7 @@ MTGCardInstance::MTGCardInstance(MTGCard * card, MTGPlayerCards * arg_belongs_to castMethod = Constants::NOT_CAST; isSettingBase = 0; isCDA = false; + isSwitchedPT = false; } MTGCardInstance * MTGCardInstance::createSnapShot() @@ -695,6 +696,26 @@ void MTGCardInstance::cdaPT(int p, int t) applyPTbonus(); } +void MTGCardInstance::switchPT(bool apply) +{ + stripPTbonus(); + swapP = power; + swapT = toughness; + power += origpower; + power -= swapP; + addToToughness(origtoughness); + addToToughness(-swapT); + applyPTbonus(); + if(apply) + { + swapP = toughness; + swapT = power; + addToToughness(swapT); + addToToughness(-swapP); + setPower(swapP); + } +} + int MTGCardInstance::canBlock() { if (tapped) diff --git a/projects/mtg/src/utils.cpp b/projects/mtg/src/utils.cpp index 2217b6143..ce846d21c 100644 --- a/projects/mtg/src/utils.cpp +++ b/projects/mtg/src/utils.cpp @@ -98,6 +98,17 @@ bool FileExists(const string & filename) return JFileSystem::GetInstance()->FileExists(filename); } +std::string cReplaceString(string subject, const string& search, const string& replace) +{ + size_t pos = 0; + while ((pos = subject.find(search, pos)) != string::npos) + { + subject.replace(pos, search.length(), replace); + pos += replace.length(); + } + return subject; +} + /* #ifdef LINUX From 5c93d3e7c4155e6fdec04f72166966f4fae712c6 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sat, 19 Sep 2015 23:30:11 +0800 Subject: [PATCH 122/249] Create PTswitch.txt --- projects/mtg/bin/Res/test/PTswitch.txt | 36 ++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 projects/mtg/bin/Res/test/PTswitch.txt diff --git a/projects/mtg/bin/Res/test/PTswitch.txt b/projects/mtg/bin/Res/test/PTswitch.txt new file mode 100644 index 000000000..93ffb1260 --- /dev/null +++ b/projects/mtg/bin/Res/test/PTswitch.txt @@ -0,0 +1,36 @@ +#Testing PT Switch. Windreaver and Screaming Fury... Layer 7e +#A 1/3 creature is given +0/+1 by an effect. Then another effect switches the +#creature’s power and toughness. Its new power and toughness is 4/1. A new effect gives +#the creature +5/+0. Its “unswitched†power and toughness would be 6/4, so its actual +#power and toughness is 4/6. +[INIT] +FIRSTMAIN +[PLAYER1] +hand:Screaming Fury +inplay:Windreaver, Mountain, Plains, Swamp, Island, Forest +[PLAYER2] +[DO] +Plains +Windreaver +choice 1 +Island +Windreaver +choice 0 +Mountain +Forest +Swamp +Screaming Fury +Windreaver +next +next +Windreaver +next +eot +[ASSERT] +UNTAP +[PLAYER1] +inplay:Windreaver, Mountain, Plains, Swamp, Island, Forest +graveyard:Screaming Fury +[PLAYER2] +life:16 +[END] From e9c4d70126ea2f94a041ae9e715eb30ac4ba91b8 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sat, 19 Sep 2015 23:31:18 +0800 Subject: [PATCH 123/249] Update _tests.txt --- projects/mtg/bin/Res/test/_tests.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/projects/mtg/bin/Res/test/_tests.txt b/projects/mtg/bin/Res/test/_tests.txt index 34d5ed0d0..0b94c47ff 100644 --- a/projects/mtg/bin/Res/test/_tests.txt +++ b/projects/mtg/bin/Res/test/_tests.txt @@ -536,6 +536,7 @@ prowess_of_the_fair.txt prowess_of_the_fair2.txt prowess_of_the_fair3.txt PTInstant.txt +PTswitch.txt PT_M15_errata.txt PT_M15_errata2.txt pygmy_troll.txt From 0e90426cff38ecc8ec63ccf066849e32d2317199 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sun, 20 Sep 2015 13:19:03 +0800 Subject: [PATCH 124/249] Support for Silumgar Assassin, Minor PT color and Token, Clone Indicators When a creature is damaged and has critical life, PT turns to red(critical life is 2 and below), if a card has a powered down status like from -1/-1 counter, the PT turns to thistle, if powered up above 4, the PT turns into yellow, default is white. legendary eldrazi pt is violet. Token Indicator is T, and C for cards with copy abilities(so we can differentiate them from originals), TC for both token and copy cat cards. --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 2 +- projects/mtg/include/MTGCardInstance.h | 1 + projects/mtg/include/MTGDefinitions.h | 3 ++- projects/mtg/src/AllAbilities.cpp | 1 + projects/mtg/src/CardGui.cpp | 28 +++++++++++++------- projects/mtg/src/MTGCardInstance.cpp | 3 +++ projects/mtg/src/MTGDefinitions.cpp | 3 ++- 7 files changed, 28 insertions(+), 13 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index b7ef62287..abb0e7cc4 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -87132,7 +87132,7 @@ toughness=7 [/card] [card] name=Silumgar Assassin -abilities=strong +abilities=evadebigger facedown={3} autofacedown={2}{B}:morph autofaceup=counter(1/1,1) diff --git a/projects/mtg/include/MTGCardInstance.h b/projects/mtg/include/MTGCardInstance.h index 5e92c3a02..78414efff 100644 --- a/projects/mtg/include/MTGCardInstance.h +++ b/projects/mtg/include/MTGCardInstance.h @@ -239,6 +239,7 @@ public: int swapP; int swapT; bool isSwitchedPT; + bool isACopier; void eventattacked(); void eventattackedAlone(); diff --git a/projects/mtg/include/MTGDefinitions.h b/projects/mtg/include/MTGDefinitions.h index 5f4ea6dde..867a315d9 100644 --- a/projects/mtg/include/MTGDefinitions.h +++ b/projects/mtg/include/MTGDefinitions.h @@ -225,7 +225,8 @@ class Constants LIBRARYDEATH = 107, SHUFFLELIBRARYDEATH = 108, OFFERING = 109, - NB_BASIC_ABILITIES = 110, + EVADEBIGGER = 110, + NB_BASIC_ABILITIES = 111, RARITY_S = 'S', //Special Rarity diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index 80df4716e..327970347 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -384,6 +384,7 @@ int AACopier::resolve() if (_target) { source->copy(_target); + source->isACopier = true; return 1; } return 0; diff --git a/projects/mtg/src/CardGui.cpp b/projects/mtg/src/CardGui.cpp index 61c6ab2c3..7cba76de2 100644 --- a/projects/mtg/src/CardGui.cpp +++ b/projects/mtg/src/CardGui.cpp @@ -287,29 +287,37 @@ void CardGui::Render() ARGB(((static_cast(actA))/2),0,0,0)); //damaged or buffed or powered down if(card->wasDealtDamage && card->life <= 2) - mFont->SetColor(ARGB(static_cast(actA),255,0,0));//red + mFont->SetColor(ARGB(static_cast(actA),255,0,0));//red critical and damaged else if(!card->wasDealtDamage && card->pbonus < 0) - mFont->SetColor(ARGB(static_cast(actA),216,191,216));//thistle - else if(card->getRarity() == Constants::RARITY_T) - mFont->SetColor(ARGB(static_cast(actA),245,245,245));//smoke + mFont->SetColor(ARGB(static_cast(actA),216,191,216));//thistle powered down + else if(!card->wasDealtDamage && card->pbonus >= 3) + mFont->SetColor(ARGB(static_cast(actA),255,255,0));//yellow buff else if(card->hasType("legendary") && card->hasType("eldrazi")) - mFont->SetColor(ARGB(static_cast(actA),238,130,238));//violet + mFont->SetColor(ARGB(static_cast(actA),238,130,238));//violet legendary eldrazi else - mFont->SetColor(ARGB(static_cast(actA),255,255,255));//white + mFont->SetColor(ARGB(static_cast(actA),255,255,255));//white default mFont->SetScale(actZ); mFont->SetScale(actZ); mFont->DrawString(buffer, actX - 10 * actZ, actY + 8 * actZ); mFont->SetScale(1); } - if(card->getRarity() == Constants::RARITY_T) + string buff = ""; + if(card->isToken && !card->isACopier) + buff = "T"; + if(card->isToken && card->isACopier) + buff = "CT"; + if(!card->isToken && card->isACopier) + buff = "C"; + + if(!alternate && buff != "") { mFont->SetScale(DEFAULT_MAIN_FONT_SCALE); char buffer[200]; - sprintf(buffer, "T"); - mFont->SetColor(ARGB(static_cast(actA),255,222,173));//Navajo + sprintf(buffer, "%c", buff); + mFont->SetColor(ARGB(static_cast(actA),255,182,193));//Light Pink indicator mFont->SetScale(0.8f); - mFont->DrawString(buffer, actX - 10 * actZ, actY - (18 * actZ)); + mFont->DrawString(buffer, actX - 10 * actZ, actY - (16 * actZ)); mFont->SetScale(1); } diff --git a/projects/mtg/src/MTGCardInstance.cpp b/projects/mtg/src/MTGCardInstance.cpp index 616757249..1744a8d56 100644 --- a/projects/mtg/src/MTGCardInstance.cpp +++ b/projects/mtg/src/MTGCardInstance.cpp @@ -56,6 +56,7 @@ MTGCardInstance::MTGCardInstance(MTGCard * card, MTGPlayerCards * arg_belongs_to isSettingBase = 0; isCDA = false; isSwitchedPT = false; + isACopier = false; } MTGCardInstance * MTGCardInstance::createSnapShot() @@ -750,6 +751,8 @@ int MTGCardInstance::canBlock(MTGCardInstance * opponent) return 0; if (opponent->basicAbilities[(int)Constants::ONEBLOCKER] && opponent->blocked) return 0; + if(opponent->basicAbilities[(int)Constants::EVADEBIGGER] && power > opponent->power) + return 0; if(opponent->basicAbilities[(int)Constants::STRONG] && power < opponent->power) return 0; if(this->basicAbilities[(int)Constants::WEAK] && power < opponent->power) diff --git a/projects/mtg/src/MTGDefinitions.cpp b/projects/mtg/src/MTGDefinitions.cpp index 13d0ec579..77b162f5e 100644 --- a/projects/mtg/src/MTGDefinitions.cpp +++ b/projects/mtg/src/MTGDefinitions.cpp @@ -138,7 +138,8 @@ const char* Constants::MTGBasicAbilities[] = { "oppgraveexiler", "librarydeath", "shufflelibrarydeath", - "offering" + "offering", + "evadebigger" }; map Constants::MTGBasicAbilitiesMap; From 5985c518f6c848da211ee8a1f26c513a29b9371e Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sun, 20 Sep 2015 14:17:43 +0800 Subject: [PATCH 125/249] buff.c_str() --- projects/mtg/src/CardGui.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/mtg/src/CardGui.cpp b/projects/mtg/src/CardGui.cpp index 7cba76de2..629c6172a 100644 --- a/projects/mtg/src/CardGui.cpp +++ b/projects/mtg/src/CardGui.cpp @@ -314,7 +314,7 @@ void CardGui::Render() { mFont->SetScale(DEFAULT_MAIN_FONT_SCALE); char buffer[200]; - sprintf(buffer, "%c", buff); + sprintf(buffer, "%c", buff.c_str()); mFont->SetColor(ARGB(static_cast(actA),255,182,193));//Light Pink indicator mFont->SetScale(0.8f); mFont->DrawString(buffer, actX - 10 * actZ, actY - (16 * actZ)); From 18f09ab2efa73df169afadfb86b7eb7a8ad5cd2a Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sun, 20 Sep 2015 14:26:40 +0800 Subject: [PATCH 126/249] %c to %s --- projects/mtg/src/CardGui.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/mtg/src/CardGui.cpp b/projects/mtg/src/CardGui.cpp index 629c6172a..405edab77 100644 --- a/projects/mtg/src/CardGui.cpp +++ b/projects/mtg/src/CardGui.cpp @@ -314,7 +314,7 @@ void CardGui::Render() { mFont->SetScale(DEFAULT_MAIN_FONT_SCALE); char buffer[200]; - sprintf(buffer, "%c", buff.c_str()); + sprintf(buffer, "%s", buff.c_str()); mFont->SetColor(ARGB(static_cast(actA),255,182,193));//Light Pink indicator mFont->SetScale(0.8f); mFont->DrawString(buffer, actX - 10 * actZ, actY - (16 * actZ)); From 72b119d62216b2887bc248ed8c3f67b8f07b98dc Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sun, 20 Sep 2015 15:25:01 +0800 Subject: [PATCH 127/249] fix bad lines --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index abb0e7cc4..7bf2d416a 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -6267,8 +6267,7 @@ abilities=flying,double strike facedown={3} autofacedown={4}{W}:morph autofaceup=counter(1/1,1) -text=Flying -Double strike (This creature deals both first-strike and regular combat damage.) -- Megamorph {4}{W} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its megamorph cost and put a +1/+1 counter on it.) +text=Flying -- Double strike (This creature deals both first-strike and regular combat damage.) -- Megamorph {4}{W} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its megamorph cost and put a +1/+1 counter on it.) mana={1}{W}{W} type=Creature subtype=Bird Warrior @@ -18318,8 +18317,7 @@ name=Contradict target=*|stack auto=fizzle auto=draw:1 controller -text=Counter target spell. -Draw a card. +text=Counter target spell. Draw a card. mana={3}{U}{U} type=Instant [/card] @@ -23463,8 +23461,7 @@ facedown={3} autofacedown={1}{G}:morph autofaceup=counter(1/1,1) autofaceup=moveto(ownerhand) target(*|mygraveyard) -text=Creatures with power less than Den Protector's power can't block it. -Megamorph {1}{G} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its megamorph cost and put a +1/+1 counter on it.) -- When Den Protector is turned face up, return target card from your graveyard to your hand. +text=Creatures with power less than Den Protector's power can't block it. Megamorph {1}{G} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its megamorph cost and put a +1/+1 counter on it.) -- When Den Protector is turned face up, return target card from your graveyard to your hand. mana={1}{G} type=Creature subtype=Human Warrior @@ -54467,8 +54464,7 @@ name=Learn from the Past target=player auto=moveTo(ownerlibrary) and!(shuffle)! all(*|targetedpersonsgraveyard) auto=draw:1 controller -text=Target player shuffles his or her graveyard into his or her library. -Draw a card. +text=Target player shuffles his or her graveyard into his or her library. Draw a card. mana={3}{U} type=Instant [/card] @@ -77324,8 +77320,7 @@ name=Rending Volley abilities=nofizzle target=creature[white;blue]|battlefield auto=damage:4 -text=Rending Volley can't be countered by spells or abilities. -Rending Volley deals 4 damage to target white or blue creature. +text=Rending Volley can't be countered by spells or abilities. Rending Volley deals 4 damage to target white or blue creature. mana={R} type=Instant [/card] From 9bf329bd1785e4f83ce9c99213a552211d3cd3dc Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sun, 20 Sep 2015 19:53:49 +0800 Subject: [PATCH 128/249] I just found this out.... Make the indicator for classic game type. Maybe there is another way to produce cards by using the function from castcard... --- projects/mtg/src/CardGui.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/mtg/src/CardGui.cpp b/projects/mtg/src/CardGui.cpp index 405edab77..a114df329 100644 --- a/projects/mtg/src/CardGui.cpp +++ b/projects/mtg/src/CardGui.cpp @@ -310,7 +310,7 @@ void CardGui::Render() if(!card->isToken && card->isACopier) buff = "C"; - if(!alternate && buff != "") + if(!alternate && buff != "" && game->gameType() == GAME_TYPE_CLASSIC)//it seems that other game modes makes cards as tokens!!! hmmm... { mFont->SetScale(DEFAULT_MAIN_FONT_SCALE); char buffer[200]; From 725a285e7f32c40075c49e47a52e427a343100bb Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sun, 20 Sep 2015 22:28:08 +0800 Subject: [PATCH 129/249] Reverted Random --- projects/mtg/src/DeckMenu.cpp | 5 +---- projects/mtg/src/GameStateDuel.cpp | 4 +--- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/projects/mtg/src/DeckMenu.cpp b/projects/mtg/src/DeckMenu.cpp index 9c544a535..d1c0adef2 100644 --- a/projects/mtg/src/DeckMenu.cpp +++ b/projects/mtg/src/DeckMenu.cpp @@ -215,10 +215,7 @@ void DeckMenu::selectRandomDeck(bool isAi) { DeckManager *deckManager = DeckManager::GetInstance(); vector *deckList = isAi ? deckManager->getAIDeckOrderList() : deckManager->getPlayerDeckOrderList(); - //int random = (WRand() * 1000) % deckList->size(); - int lowest=0, highest = deckList->size(); - int range=(highest-lowest); - int random = lowest+int(range*rand()/(RAND_MAX + 1.0)); + int random = rand() % (int)deckList->size(); selectDeck( random, isAi ); } diff --git a/projects/mtg/src/GameStateDuel.cpp b/projects/mtg/src/GameStateDuel.cpp index 2d902c8b8..2af6be905 100644 --- a/projects/mtg/src/GameStateDuel.cpp +++ b/projects/mtg/src/GameStateDuel.cpp @@ -1857,9 +1857,7 @@ int Tournament::getRandomDeck(bool noEasyDecks) while(isDouble && decks.size()>0) { isDouble=false; - int lowest=0, highest = (int)decks.size(); - int range=(highest-lowest); - k = lowest+int(range*rand()/(RAND_MAX + 1.0)); + k = rand() % (int)decks.size(); random = decks.at(k); deckNumber = deckList->at(random)->getDeckId(); From 726b087d0d6d419fb86a374c32d70ca8aa94c2a0 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 21 Sep 2015 12:00:02 +0800 Subject: [PATCH 130/249] Create _cards.dat --- projects/mtg/bin/Res/sets/M15/_cards.dat | 1445 ++++++++++++++++++++++ 1 file changed, 1445 insertions(+) create mode 100644 projects/mtg/bin/Res/sets/M15/_cards.dat diff --git a/projects/mtg/bin/Res/sets/M15/_cards.dat b/projects/mtg/bin/Res/sets/M15/_cards.dat new file mode 100644 index 000000000..bf494208d --- /dev/null +++ b/projects/mtg/bin/Res/sets/M15/_cards.dat @@ -0,0 +1,1445 @@ +[meta] +author=Wagic Team +name=Magic 2015 +year=2014 +[/meta] +[card] +primitive=Accursed Spirit +id=383175 +rarity=C +[/card] +[card] +primitive=Act on Impulse +id=383176 +rarity=U +[/card] +[card] +primitive=Aegis Angel +id=383160 +rarity=R +[/card] +[card] +primitive=Aeronaut Tinkerer +id=383177 +rarity=C +[/card] +[card] +primitive=AEtherspouts +id=383178 +rarity=R +[/card] +[card] +primitive=Aggressive Mining +id=383179 +rarity=R +[/card] +[card] +primitive=Ajani Steadfast +id=383180 +rarity=M +[/card] +[card] +primitive=Ajani's Pridemate +id=383181 +rarity=U +[/card] +[card] +primitive=Altac Bloodseeker +id=383182 +rarity=U +[/card] +[card] +primitive=Amphin Pathmage +id=383183 +rarity=C +[/card] +[card] +primitive=Ancient Silverback +id=383184 +rarity=U +[/card] +[card] +primitive=Avacyn, Guardian Angel +id=383185 +rarity=R +[/card] +[card] +primitive=Avarice Amulet +id=383186 +rarity=R +[/card] +[card] +primitive=Back to Nature +id=383187 +rarity=U +[/card] +[card] +primitive=Battle Mastery +id=383188 +rarity=U +[/card] +[card] +primitive=Battlefield Forge +id=383189 +rarity=R +[/card] +[card] +primitive=Belligerent Sliver +id=383190 +rarity=U +[/card] +[card] +primitive=Black Cat +id=383191 +rarity=C +[/card] +[card] +primitive=Blastfire Bolt +id=383192 +rarity=C +[/card] +[card] +primitive=Blood Host +id=383193 +rarity=U +[/card] +[card] +primitive=Boonweaver Giant +id=383194 +rarity=U +[/card] +[card] +primitive=Borderland Marauder +id=383195 +rarity=C +[/card] +[card] +primitive=Brawler's Plate +id=383196 +rarity=U +[/card] +[card] +primitive=Bronze Sable +id=383197 +rarity=C +[/card] +[card] +primitive=Brood Keeper +id=383198 +rarity=U +[/card] +[card] +primitive=Brood Keeper Dragon +id=-383198 +rarity=T +[/card] +[card] +primitive=Burning Anger +id=383199 +rarity=R +[/card] +[card] +primitive=Cancel +id=383161 +rarity=C +[/card] +[card] +primitive=Carnivorous Moss-Beast +id=383200 +rarity=C +[/card] +[card] +primitive=Carrion Crow +id=383201 +rarity=C +[/card] +[card] +primitive=Caustic Tar +id=383202 +rarity=U +[/card] +[card] +primitive=Caves of Koilos +id=383203 +rarity=R +[/card] +[card] +primitive=Centaur Courser +id=383162 +rarity=C +[/card] +[card] +primitive=Chandra, Pyromaster +id=383204 +rarity=M +[/card] +[card] +primitive=Charging Rhino +id=383205 +rarity=C +[/card] +[card] +primitive=Chasm Skulker +id=383206 +rarity=R +[/card] +[card] +primitive=Chief Engineer +id=383207 +rarity=R +[/card] +[card] +primitive=Child of Night +id=383208 +rarity=C +[/card] +[card] +primitive=Chord of Calling +id=383209 +rarity=R +[/card] +[card] +primitive=Chronostutter +id=383210 +rarity=C +[/card] +[card] +primitive=Circle of Flame +id=383211 +rarity=U +[/card] +[card] +primitive=Clear a Path +id=383212 +rarity=C +[/card] +[card] +primitive=Cone of Flame +id=383213 +rarity=U +[/card] +[card] +primitive=Congregate +id=383214 +rarity=U +[/card] +[card] +primitive=Constricting Sliver +id=383215 +rarity=U +[/card] +[card] +primitive=Coral Barrier +id=383216 +rarity=C +[/card] +[card] +primitive=Covenant of Blood +id=383217 +rarity=C +[/card] +[card] +primitive=Crippling Blight +id=383218 +rarity=C +[/card] +[card] +primitive=Crowd's Favor +id=383219 +rarity=C +[/card] +[card] +primitive=Crucible of Fire +id=383220 +rarity=R +[/card] +[card] +primitive=Cruel Sadist +id=383221 +rarity=R +[/card] +[card] +primitive=Darksteel Citadel +id=383222 +rarity=U +[/card] +[card] +primitive=Dauntless River Marshal +id=383223 +rarity=U +[/card] +[card] +primitive=Devouring Light +id=383224 +rarity=U +[/card] +[card] +primitive=Diffusion Sliver +id=383225 +rarity=U +[/card] +[card] +primitive=Dissipate +id=383226 +rarity=U +[/card] +[card] +primitive=Divination +id=383227 +rarity=C +[/card] +[card] +primitive=Divine Favor +id=383228 +rarity=C +[/card] +[card] +primitive=Divine Verdict +id=383163 +rarity=C +[/card] +[card] +primitive=Elvish Mystic +id=383229 +rarity=U +[/card] +[card] +primitive=Encrust +id=383230 +rarity=C +[/card] +[card] +primitive=Endless Obedience +id=383231 +rarity=U +[/card] +[card] +primitive=Ensoul Artifact +id=383232 +rarity=U +[/card] +[card] +primitive=Ephemeral Shields +id=383233 +rarity=C +[/card] +[card] +primitive=Eternal Thirst +id=383234 +rarity=C +[/card] +[card] +primitive=Evolving Wilds +id=383235 +rarity=C +[/card] +[card] +primitive=Feast on the Fallen +id=383236 +rarity=U +[/card] +[card] +primitive=Feral Incarnation +id=383237 +rarity=U +[/card] +[card] +primitive=Festergloom +id=383238 +rarity=C +[/card] +[card] +primitive=First Response +id=383239 +rarity=U +[/card] +[card] +primitive=Flesh to Dust +id=383240 +rarity=C +[/card] +[card] +primitive=Forest +id=383241 +rarity=L +[/card] +[card] +primitive=Forest +id=383242 +rarity=L +[/card] +[card] +primitive=Forest +id=383243 +rarity=L +[/card] +[card] +primitive=Forest +id=383244 +rarity=L +[/card] +[card] +primitive=Forge Devil +id=383245 +rarity=C +[/card] +[card] +primitive=Foundry Street Denizen +id=383246 +rarity=C +[/card] +[card] +primitive=Frenzied Goblin +id=383247 +rarity=U +[/card] +[card] +primitive=Frost Lynx +id=383248 +rarity=C +[/card] +[card] +primitive=Fugitive Wizard +id=383249 +rarity=C +[/card] +[card] +primitive=Furnace Whelp +id=383164 +rarity=U +[/card] +[card] +primitive=Gargoyle Sentinel +id=383250 +rarity=U +[/card] +[card] +primitive=Garruk, Apex Predator +id=383251 +rarity=M +[/card] +[card] +primitive=Garruk's Packleader +id=383165 +rarity=U +[/card] +[card] +primitive=Gather Courage +id=383252 +rarity=U +[/card] +[card] +primitive=Geist of the Moors +id=383253 +rarity=U +[/card] +[card] +primitive=Generator Servant +id=383254 +rarity=C +[/card] +[card] +primitive=Genesis Hydra +id=383255 +rarity=R +[/card] +[card] +primitive=Glacial Crasher +id=383256 +rarity=C +[/card] +[card] +primitive=Goblin Kaboomist +id=383257 +rarity=R +[/card] +[card] +primitive=Land Mine +id=-383257 +rarity=T +[/card] +[card] +primitive=Goblin Rabblemaster +id=383258 +rarity=R +[/card] +[card] +primitive=Goblin Roughrider +id=383259 +rarity=C +[/card] +[card] +primitive=Gravedigger +id=383260 +rarity=U +[/card] +[card] +primitive=Grindclock +id=383261 +rarity=R +[/card] +[card] +primitive=Hammerhand +id=383262 +rarity=C +[/card] +[card] +primitive=Haunted Plate Mail +id=383263 +rarity=R +[/card] +[card] +primitive=Heat Ray +id=383264 +rarity=U +[/card] +[card] +primitive=Heliod's Pilgrim +id=383265 +rarity=C +[/card] +[card] +primitive=Hoarding Dragon +id=383266 +rarity=R +[/card] +[card] +primitive=Hornet Nest +id=383267 +rarity=R +[/card] +[card] +primitive=Hornet Queen +id=383268 +rarity=R +[/card] +[card] +primitive=Hot Soup +id=383269 +rarity=U +[/card] +[card] +primitive=Hunt the Weak +id=383270 +rarity=C +[/card] +[card] +primitive=Hunter's Ambush +id=383271 +rarity=C +[/card] +[card] +primitive=Hushwing Gryff +id=383272 +rarity=R +[/card] +[card] +primitive=Hydrosurge +id=383273 +rarity=C +[/card] +[card] +primitive=Illusory Angel +id=383274 +rarity=U +[/card] +[card] +primitive=In Garruk's Wake +id=383275 +rarity=R +[/card] +[card] +primitive=Indulgent Tormentor +id=383276 +rarity=R +[/card] +[card] +primitive=Inferno Fist +id=383277 +rarity=C +[/card] +[card] +primitive=Inspired Charge +id=383166 +rarity=C +[/card] +[card] +primitive=Into the Void +id=383278 +rarity=U +[/card] +[card] +primitive=Invasive Species +id=383279 +rarity=C +[/card] +[card] +primitive=Invisibility +id=383280 +rarity=C +[/card] +[card] +primitive=Island +id=383281 +rarity=L +[/card] +[card] +primitive=Island +id=383282 +rarity=L +[/card] +[card] +primitive=Island +id=383283 +rarity=L +[/card] +[card] +primitive=Island +id=383284 +rarity=L +[/card] +[card] +primitive=Jace, the Living Guildpact +id=383285 +rarity=M +[/card] +[card] +primitive=Jace's Ingenuity +id=383286 +rarity=U +[/card] +[card] +primitive=Jalira, Master Polymorphist +id=383287 +rarity=R +[/card] +[card] +primitive=Jorubai Murk Lurker +id=383288 +rarity=U +[/card] +[card] +primitive=Juggernaut +id=383289 +rarity=U +[/card] +[card] +primitive=Kalonian Twingrove +id=383290 +rarity=R +[/card] +[card] +primitive=Treefolk Warrior +id=-383290 +rarity=T +[/card] +[card] +primitive=Kapsho Kitefins +id=383291 +rarity=U +[/card] +[card] +primitive=Kinsbaile Skirmisher +id=383292 +rarity=C +[/card] +[card] +primitive=Kird Chieftain +id=383293 +rarity=U +[/card] +[card] +primitive=Krenko's Enforcer +id=383294 +rarity=C +[/card] +[card] +primitive=Kurkesh, Onakke Ancient +id=383295 +rarity=R +[/card] +[card] +primitive=Lava Axe +id=383296 +rarity=C +[/card] +[card] +primitive=Leeching Sliver +id=383297 +rarity=U +[/card] +[card] +primitive=Life's Legacy +id=383298 +rarity=R +[/card] +[card] +primitive=Lightning Strike +id=383299 +rarity=C +[/card] +[card] +primitive=Liliana Vess +id=383300 +rarity=M +[/card] +[card] +primitive=Living Totem +id=383301 +rarity=C +[/card] +[card] +primitive=Llanowar Wastes +id=383302 +rarity=R +[/card] +[card] +primitive=Mahamoti Djinn +id=383167 +rarity=R +[/card] +[card] +primitive=Marked by Honor +id=383303 +rarity=C +[/card] +[card] +primitive=Mass Calcify +id=383304 +rarity=R +[/card] +[card] +primitive=Master of Predicaments +id=383305 +rarity=R +[/card] +[card] +primitive=Meditation Puzzle +id=383306 +rarity=C +[/card] +[card] +primitive=Mercurial Pretender +id=383307 +rarity=R +[/card] +[card] +primitive=Meteorite +id=383308 +rarity=U +[/card] +[card] +primitive=Midnight Guard +id=383309 +rarity=C +[/card] +[card] +primitive=Might Makes Right +id=383310 +rarity=U +[/card] +[card] +primitive=Military Intelligence +id=383311 +rarity=U +[/card] +[card] +primitive=Mind Rot +id=383312 +rarity=C +[/card] +[card] +primitive=Mind Sculpt +id=383313 +rarity=C +[/card] +[card] +primitive=Miner's Bane +id=383314 +rarity=C +[/card] +[card] +primitive=Mountain +id=383315 +rarity=L +[/card] +[card] +primitive=Mountain +id=383316 +rarity=L +[/card] +[card] +primitive=Mountain +id=383317 +rarity=L +[/card] +[card] +primitive=Mountain +id=383318 +rarity=L +[/card] +[card] +primitive=Naturalize +id=383319 +rarity=C +[/card] +[card] +primitive=Necrobite +id=383320 +rarity=C +[/card] +[card] +primitive=Necrogen Scudder +id=383321 +rarity=U +[/card] +[card] +primitive=Necromancer's Assistant +id=383322 +rarity=C +[/card] +[card] +primitive=Necromancer's Stockpile +id=383323 +rarity=R +[/card] +[card] +primitive=Zombie Token +id=-383323 +rarity=T +[/card] +[card] +primitive=Negate +id=383324 +rarity=C +[/card] +[card] +primitive=Netcaster Spider +id=383325 +rarity=C +[/card] +[card] +primitive=Nightfire Giant +id=383326 +rarity=U +[/card] +[card] +primitive=Nightmare +id=383168 +rarity=R +[/card] +[card] +primitive=Nimbus of the Isles +id=383327 +rarity=C +[/card] +[card] +primitive=Nissa, Worldwaker +id=383328 +rarity=M +[/card] +[card] +primitive=Nissa's Expedition +id=383329 +rarity=U +[/card] +[card] +primitive=Ob Nixilis, Unshackled +id=383330 +rarity=R +[/card] +[card] +primitive=Obelisk of Urd +id=383331 +rarity=R +[/card] +[card] +primitive=Oppressive Rays +id=383332 +rarity=C +[/card] +[card] +primitive=Oreskos Swiftclaw +id=383333 +rarity=C +[/card] +[card] +primitive=Ornithopter +id=383334 +rarity=C +[/card] +[card] +primitive=Overwhelm +id=383335 +rarity=U +[/card] +[card] +primitive=Paragon of Eternal Wilds +id=383336 +rarity=U +[/card] +[card] +primitive=Paragon of Fierce Defiance +id=383337 +rarity=U +[/card] +[card] +primitive=Paragon of Gathering Mists +id=383338 +rarity=U +[/card] +[card] +primitive=Paragon of New Dawns +id=383339 +rarity=U +[/card] +[card] +primitive=Paragon of Open Graves +id=383340 +rarity=U +[/card] +[card] +primitive=Peel from Reality +id=383341 +rarity=C +[/card] +[card] +primitive=Perilous Vault +id=383342 +rarity=M +[/card] +[card] +primitive=Phyrexian Revoker +id=383343 +rarity=R +[/card] +[card] +primitive=Phytotitan +id=383344 +rarity=R +[/card] +[card] +primitive=Pillar of Light +id=383345 +rarity=C +[/card] +[card] +primitive=Plains +id=383346 +rarity=L +[/card] +[card] +primitive=Plains +id=383347 +rarity=L +[/card] +[card] +primitive=Plains +id=383348 +rarity=L +[/card] +[card] +primitive=Plains +id=383349 +rarity=L +[/card] +[card] +primitive=Plummet +id=383350 +rarity=C +[/card] +[card] +primitive=Polymorphist's Jest +id=383351 +rarity=R +[/card] +[card] +primitive=Preeminent Captain +id=383352 +rarity=R +[/card] +[card] +primitive=Profane Memento +id=383353 +rarity=U +[/card] +[card] +primitive=Quickling +id=383354 +rarity=U +[/card] +[card] +primitive=Radiant Fountain +id=383355 +rarity=C +[/card] +[card] +primitive=Raise the Alarm +id=383356 +rarity=C +[/card] +[card] +primitive=Ranger's Guile +id=383357 +rarity=C +[/card] +[card] +primitive=Razorfoot Griffin +id=383358 +rarity=C +[/card] +[card] +primitive=Reclamation Sage +id=383359 +rarity=U +[/card] +[card] +primitive=Research Assistant +id=383360 +rarity=C +[/card] +[card] +primitive=Resolute Archangel +id=383361 +rarity=R +[/card] +[card] +primitive=Restock +id=383362 +rarity=U +[/card] +[card] +primitive=Return to the Ranks +id=383363 +rarity=R +[/card] +[card] +primitive=Roaring Primadox +id=383364 +rarity=U +[/card] +[card] +primitive=Rogue's Gloves +id=383365 +rarity=U +[/card] +[card] +primitive=Rotfeaster Maggot +id=383366 +rarity=C +[/card] +[card] +primitive=Rummaging Goblin +id=383367 +rarity=C +[/card] +[card] +primitive=Runeclaw Bear +id=383368 +rarity=C +[/card] +[card] +primitive=Sacred Armory +id=383369 +rarity=U +[/card] +[card] +primitive=Sanctified Charge +id=383370 +rarity=C +[/card] +[card] +primitive=Satyr Wayfinder +id=383371 +rarity=C +[/card] +[card] +primitive=Scrapyard Mongrel +id=383372 +rarity=C +[/card] +[card] +primitive=Scuttling Doom Engine +id=383373 +rarity=R +[/card] +[card] +primitive=Seismic Strike +id=383169 +rarity=C +[/card] +[card] +primitive=Selfless Cathar +id=383374 +rarity=C +[/card] +[card] +primitive=Sengir Vampire +id=383170 +rarity=U +[/card] +[card] +primitive=Seraph of the Masses +id=383375 +rarity=U +[/card] +[card] +primitive=Serra Angel +id=383171 +rarity=U +[/card] +[card] +primitive=Shadowcloak Vampire +id=383376 +rarity=C +[/card] +[card] +primitive=Shaman of Spring +id=383377 +rarity=C +[/card] +[card] +primitive=Shield of the Avatar +id=383378 +rarity=R +[/card] +[card] +primitive=Shivan Dragon +id=383172 +rarity=R +[/card] +[card] +primitive=Shivan Reef +id=383379 +rarity=R +[/card] +[card] +primitive=Shrapnel Blast +id=383380 +rarity=U +[/card] +[card] +primitive=Siege Dragon +id=383381 +rarity=R +[/card] +[card] +primitive=Siege Wurm +id=383382 +rarity=C +[/card] +[card] +primitive=Sign in Blood +id=383383 +rarity=C +[/card] +[card] +primitive=Sliver Hive +id=383384 +rarity=R +[/card] +[card] +primitive=Sliver Hivelord +id=383385 +rarity=M +[/card] +[card] +primitive=Solemn Offering +id=383386 +rarity=C +[/card] +[card] +primitive=Soul of Innistrad +id=383387 +rarity=M +[/card] +[card] +primitive=Soul of New Phyrexia +id=383388 +rarity=M +[/card] +[card] +primitive=Soul of Ravnica +id=383389 +rarity=M +[/card] +[card] +primitive=Soul of Shandalar +id=383390 +rarity=M +[/card] +[card] +primitive=Soul of Theros +id=383391 +rarity=M +[/card] +[card] +primitive=Soul of Zendikar +id=383392 +rarity=M +[/card] +[card] +primitive=Soulmender +id=383393 +rarity=C +[/card] +[card] +primitive=Spectra Ward +id=383394 +rarity=R +[/card] +[card] +primitive=Spirit Bonds +id=383395 +rarity=R +[/card] +[card] +primitive=Stab Wound +id=383396 +rarity=U +[/card] +[card] +primitive=Staff of the Death Magus +id=383397 +rarity=U +[/card] +[card] +primitive=Staff of the Flame Magus +id=383398 +rarity=U +[/card] +[card] +primitive=Staff of the Mind Magus +id=383399 +rarity=U +[/card] +[card] +primitive=Staff of the Sun Magus +id=383400 +rarity=U +[/card] +[card] +primitive=Staff of the Wild Magus +id=383401 +rarity=U +[/card] +[card] +primitive=Stain the Mind +id=383402 +rarity=R +[/card] +[card] +primitive=Statute of Denial +id=383403 +rarity=C +[/card] +[card] +primitive=Stoke the Flames +id=383404 +rarity=U +[/card] +[card] +primitive=Stormtide Leviathan +id=383405 +rarity=R +[/card] +[card] +primitive=Sunblade Elf +id=383406 +rarity=U +[/card] +[card] +primitive=Sungrace Pegasus +id=383407 +rarity=C +[/card] +[card] +primitive=Swamp +id=383408 +rarity=L +[/card] +[card] +primitive=Swamp +id=383409 +rarity=L +[/card] +[card] +primitive=Swamp +id=383410 +rarity=L +[/card] +[card] +primitive=Swamp +id=383411 +rarity=L +[/card] +[card] +primitive=Terra Stomper +id=383173 +rarity=R +[/card] +[card] +primitive=The Chain Veil +id=383412 +rarity=M +[/card] +[card] +primitive=Thundering Giant +id=383413 +rarity=C +[/card] +[card] +primitive=Tireless Missionaries +id=383414 +rarity=C +[/card] +[card] +primitive=Titanic Growth +id=383415 +rarity=C +[/card] +[card] +primitive=Torch Fiend +id=383416 +rarity=C +[/card] +[card] +primitive=Tormod's Crypt +id=383417 +rarity=U +[/card] +[card] +primitive=Triplicate Spirits +id=383418 +rarity=C +[/card] +[card] +primitive=Turn to Frog +id=383419 +rarity=U +[/card] +[card] +primitive=Typhoid Rats +id=383420 +rarity=C +[/card] +[card] +primitive=Tyrant's Machine +id=383421 +rarity=C +[/card] +[card] +primitive=Ulcerate +id=383422 +rarity=U +[/card] +[card] +primitive=Undergrowth Scavenger +id=383423 +rarity=C +[/card] +[card] +primitive=Unmake the Graves +id=383424 +rarity=C +[/card] +[card] +primitive=Urborg, Tomb of Yawgmoth +id=383425 +rarity=R +[/card] +[card] +primitive=Venom Sliver +id=383426 +rarity=U +[/card] +[card] +primitive=Verdant Haven +id=383427 +rarity=C +[/card] +[card] +primitive=Vineweft +id=383428 +rarity=C +[/card] +[card] +primitive=Void Snare +id=383429 +rarity=C +[/card] +[card] +primitive=Walking Corpse +id=383174 +rarity=C +[/card] +[card] +primitive=Wall of Essence +id=383430 +rarity=U +[/card] +[card] +primitive=Wall of Fire +id=383431 +rarity=C +[/card] +[card] +primitive=Wall of Frost +id=383432 +rarity=U +[/card] +[card] +primitive=Wall of Limbs +id=383433 +rarity=U +[/card] +[card] +primitive=Wall of Mulch +id=383434 +rarity=U +[/card] +[card] +primitive=Warden of the Beyond +id=383435 +rarity=U +[/card] +[card] +primitive=Waste Not +id=383436 +rarity=R +[/card] +[card] +primitive=Welkin Tern +id=383437 +rarity=C +[/card] +[card] +primitive=Will-Forged Golem +id=383438 +rarity=C +[/card] +[card] +primitive=Witch's Familiar +id=383439 +rarity=C +[/card] +[card] +primitive=Xathrid Slyblade +id=383440 +rarity=U +[/card] +[card] +primitive=Yavimaya Coast +id=383441 +rarity=R +[/card] +[card] +primitive=Yisan, the Wanderer Bard +id=383442 +rarity=R +[/card] +[card] +primitive=Zof Shade +id=383443 +rarity=C +[/card] From 7b3da0e2c260f5fd382e0a8f59b5c6a80cf60e98 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 21 Sep 2015 12:00:34 +0800 Subject: [PATCH 131/249] added M15 cards :) added M15 cards and support for cards that use startinglife keyword(Resolute Archangel) --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 1076 +++++++++++++++++- projects/mtg/include/AllAbilities.h | 10 + projects/mtg/include/Player.h | 1 + projects/mtg/src/Rules.cpp | 1 + 4 files changed, 1076 insertions(+), 12 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 7bf2d416a..fe9ec137f 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -1101,6 +1101,16 @@ power=2 toughness=4 [/card] [card] +name=Aeronaut Tinkerer +auto=aslongas(artifact|myBattlefield) flying +text=Aeronaut Tinkerer has flying as long as you control an artifact.(It can't be blocked except by creatures flying or reach.) +mana={2}{U} +type=Creature +subtype=Human Artificer +power=2 +toughness=3 +[/card] +[card] name=Aesthir Glider abilities=flying,cantblock text=Flying -- Aesthir Glider can't block. @@ -1252,6 +1262,14 @@ power=1 toughness=1 [/card] [card] +name=Aggressive Mining +auto=maxPlay(land)-99 controller +auto={S(land|mybattlefield):draw:2 controller limit:1 +text=You can't play lands. -- Sacrifice a land: Draw two cards. Activate this ability only once each turn. +mana={3}{R} +type=Enchantment +[/card] +[card] name=Aggressive Urge target=creature auto=1/1 @@ -2285,6 +2303,18 @@ power=4 toughness=2 [/card] [card] +name=Altac Bloodseeker +auto=@movedTo(creature|graveyard) from(opponentbattlefield):2/0 ueot +auto=@movedTo(creature|graveyard) from(opponentbattlefield):first strike ueot +auto=@movedTo(creature|graveyard) from(opponentbattlefield):haste ueot +text=Whenever a creature an opponent controls dies, Altac Bloodseeker gets +2/+0 and gains first strike and haste until end of turn. (It deals combat damage before creatures without first strike, and it can attack and {T} as soon as it comes under your control.) +mana={1}{R} +type=Creature +subtype=Human Berserker +power=2 +toughness=1 +[/card] +[card] name=Altar Golem abilities=trample,doesnotuntap auto=type:creature:battlefield/type:creature:battlefield cdaactive @@ -2466,6 +2496,16 @@ power=2 toughness=4 [/card] [card] +name=Amphin Pathmage +auto={2}{U}:unblockable target(creature) ueot +text={2}{U}: Target creature can't be blocked this turn. +mana={3}{U} +type=Creature +subtype=Salamander Wizard +power=3 +toughness=2 +[/card] +[card] name=Amoeboid Changeling abilities=changeling auto={T}:transforms((allsubtypes)) target(creature) ueot @@ -5940,6 +5980,18 @@ power=8 toughness=8 [/card] [card] +name=Avacyn, Guardian Angel +abilities=flying,vigilance +auto={1}{W}:name(target Creature) target(other creature) activatechooseacolor transforms((,newability[preventalldamage from(*[chosencolor])])) ueot activatechooseend +auto={5}{W}{W}:name(target Player) target(player) && activatechooseacolor emblem transforms((,newability[preventalldamage to(targetedplayer) from(*[chosencolor])])) ueot activatechooseend +text=Flying, vigilance -- {1}{W}: Prevent all damage that would be dealt to another target creature this turn by sources of the color of your choice. -- {5}{W}{W}: Prevent all damage that would be dealt to target player this turn by sources of the color of your choice. +mana={2}{W}{W}{W} +type=Legendary Creature +subtype=Angel +power=5 +toughness=4 +[/card] +[card] name=Avacynian Priest auto={1}{T}:tap target(creature[-human]) text={1}, {T}: Tap target non-Human creature. @@ -6076,6 +6128,18 @@ power=3 toughness=3 [/card] [card] +name=Avarice Amulet +auto=teach(creature) 2/0 +auto=teach(creature) vigilance +auto=teach(creature) transforms((,newability[@each my upkeep:draw:1])) +auto=@movedto(graveyard) from(mytgt|battlefield):choice target(opponent) && moveto(targetedpersonsbattlefield) all(this) +auto={2}:equip +text=Equipped creature gets +2/+0 and has vigilance and "At the beginning of your upkeep, draw a card." -- When equipped creature dies, target opponent gains control of Avarice Amulet. -- Equip {2} ({2}: Attach to target creature you control. Equip only as a sorcery.) +mana={4} +type=Artifact +subtype=Equipment +[/card] +[card] name=Avarice Totem auto={5}:moveto(mybattlefield) target(*[-land]|opponentbattlefield) && moveto(opponentbattlefield) all(this) text={5}: Exchange control of Avarice Totem and target nonland permanent. @@ -9283,6 +9347,14 @@ power=2 toughness=2 [/card] [card] +name=Blastfire Bolt +target=creature +auto=transforms((,newability[damage:5],newability[destroy all(children)])) ueot +text=Blastfire Bolt deals 5 damage to target creature. Destroy all Equipment attached to that creature. +mana={5}{R} +type=Instant +[/card] +[card] name=Blasting Station auto=@movedTo(creature|battlefield):may untap auto={T}{S(creature|myBattlefield)}:damage:1 target(creature,player) @@ -9962,6 +10034,16 @@ mana={1}{R} type=Instant [/card] [card] +name=Blood Host +auto={1}{B}{S(other creature|mybattlefield)}:counter(1/1,1) && Life:2 controller +text={1}{B}, Sacrifice another creature: Put a +1/+1 counter on Blood Host and you gain 2 life. +mana={3}{B}{B} +type=Creature +subtype=Vampire +power=3 +toughness=3 +[/card] +[card] name=Blood Hound auto=@damaged(controller):may counter(1/1,thatmuch) auto=@each my endofturn:removeallcounters(1/1) @@ -11359,6 +11441,16 @@ mana={B} type=Instant [/card] [card] +name=Boonweaver Giant +auto=may name(attach an aura) target(aura|myhand,mylibrary,mygraveyard) newtarget +text=When Boonweaver Giant enters the battlefield, you may search your graveyard, hand and/or library for an Aura card and put it onto the battlefield attached to Boonweaver Giant. If you search your library this way, shuffle it. +mana={6}{W} +type=Creature +subtype=Giant Monk +power=4 +toughness=4 +[/card] +[card] name=Book of Rass auto={L:2}{2}:draw:1 text={2}, Pay 2 life: Draw a card. @@ -11414,6 +11506,16 @@ power=4 toughness=4 [/card] [card] +name=Borderland Marauder +auto=@combat(attacking) source(this):2/0 ueot +text=Whenever Borderland Marauder attacks, it gets +2/+0 until end of turn. +mana={1}{R} +type=Creature +subtype=Human Warrior +power=1 +toughness=2 +[/card] +[card] name=Borderland Minotaur mana={2}{R}{R} type=Creature @@ -12069,6 +12171,16 @@ mana={3}{R}{R} type=Instant [/card] [card] +name=Brawler's Plate +auto=teach(creature) 2/2 +auto=teach(creature) trample +auto={4}:equip +text=Equipped creature gets +2/+2 and has trample. (If it would assign enough damage to its blockers to destroy them, you may have it assign the rest of its damage to defending player or planeswalker.) -- Equip 4 (4: Attach to target creature you control. Equip only as a sorcery.) +mana={3} +type=Artifact +subtype=Equipment +[/card] +[card] name=Brawn abilities=trample autograveyard=aslongas(forest|myBattlefield) lord(creature|myBattlefield) trample @@ -12565,6 +12677,27 @@ mana={1}{R} type=Sorcery [/card] [card] +name=Brood Keeper +auto=@targeted(this) from(aura|hand,graveyard):token(-383198) controller +text=Whenever an Aura becomes attached to Brood Keeper, put a 2/2 red Dragon creature token with flying onto the battlefield. It has "{R}: This creature gets +1/+0 until end of turn". +mana={3}{R} +type=Creature +subtype=Human Shaman +power=2 +toughness=3 +[/card] +[card] +name=Brood Keeper Dragon +abilities=flying +auto={R}:1/0 ueot +text=Flying -- {R}: This creature gets +1/+0 until end of turn. +type=Creature +subtype=Dragon +color=red +power=2 +toughness=2 +[/card] +[card] name=Brood of Cockroaches auto=@movedTo(mygraveyard) from(this|battlefield):phaseaction[endofturn once] life:-1 controller auto=@movedTo(mygraveyard) from(this|battlefield):phaseaction[endofturn once] moveTo(myhand) @@ -12943,6 +13076,15 @@ mana={3}{R} type=Sorcery [/card] [card] +name=Burning Anger +target=creature +auto=teach(creature) transforms((,newability[{T}:name(Target Creature) target(creature) dynamicability],newability[{T}:name(Target Player) target(player) dynamicability])) +text=Enchant creature. -- Enchanted creature has "{T}: This creature deals damage equal to its power to target creature or player." +mana={4}{R} +type=Enchantment +subtype=Aura +[/card] +[card] name=Burning Cloak target=creature auto=2/0 @@ -14151,6 +14293,16 @@ mana={1}{B} type=Enchantment [/card] [card] +name=Carnivorous Moss-Beast +auto={5}{G}{G}:counter(1/1,1) +text={5}{G}{G}: Put a +1/+1 counter on Carnivorous Moss-Beast +mana={4}{G}{G} +type=Creature +subtype=Plant Elemental Beast +power=4 +toughness=5 +[/card] +[card] name=Carnivorous Plant abilities=defender text=Defender @@ -14217,6 +14369,17 @@ mana={3}{G} type=Instant [/card] [card] +name=Carrion Crow +abilities=flying +auto=tap +text=Flying (This creature can't be blocked except by creatures with flying or reach.) -- Carrion Crow enters the battlefield tapped. +mana={2}{B} +type=Creature +subtype=Zombie Bird +power=2 +toughness=2 +[/card] +[card] name=Carrion Feeder abilities=cantblock auto={S(creature|myBattlefield)}:all(this) counter(1/1,1) @@ -15858,6 +16021,17 @@ power=3 toughness=3 [/card] [card] +name=Chasm Skulker +auto=@drawn(controller):counter(1/1,1) +auto=@movedTo(this|Graveyard) from(myBattlefield):thisforeach(counter{1/1.1}):token(Squid,Creature Squid,1/1,islandwalk,blue) +text=Whenever you draw a card, put a +1/+1 counter on Chasm Skulker. -- When Chasm Skulker dies, put X 1/1 blue Squid creature tokens with islandwalk onto the battlefield, where X is the number of +1/+1 counters on Chasm Skulker. +mana={2}{U} +type=Creature +subtype=Squid Horror +power=1 +toughness=1 +[/card] +[card] name=Chastise target=creature[attacking] auto=destroy @@ -18162,6 +18336,17 @@ mana={1}{G} type=Instant [/card] [card] +name=Constricting Sliver +auto=(blink)forsrc target(creature|opponentbattlefield) +auto=@movedto(sliver|mybattlefield):all(trigger[to]) transforms((,newability[(blink)forsrc target(creature|opponentbattlefield)])) forever +text=Sliver creatures you control have "When this creature enters the battlefield, you may exile target creature an opponent controls until this creature leaves the battlefield." +mana={5}{W} +type=Creature +subtype=Sliver +power=3 +toughness=3 +[/card] +[card] name=Constricting Tendrils target=creature auto=-3/-0 @@ -18542,6 +18727,17 @@ text=Coral Atoll enters the battlefield tapped. -- When Coral Atoll enters the b type=Land [/card] [card] +name=Coral Barrier +abilities=defender +auto=token(Squid,Creature Squid,1/1,islandwalk,blue) controller +text=Defender (This creature can't attack.) -- When Coral Barrier enters the battlefield, put a 1/1 blue Squid creature token with islandwalk onto the battlefield. (It can't be blocked as long as defending player controls an Island.) +mana={2}{U} +type=Creature +subtype=Wall +power=1 +toughness=3 +[/card] +[card] name=Coral Eel mana={1}{U} type=Creature @@ -19891,6 +20087,36 @@ mana={4}{B} type=Instant [/card] [card] +name=Cruel Sadist +auto={L}{B}{T}:counter(1/1,1) +auto={2}{B}{T}{C(1/1,-1)}:name(Remove 1 Counters) damage:1 target(creature) +auto={2}{B}{T}{C(1/1,-2)}:name(Remove 2 Counters) damage:2 target(creature) +auto={2}{B}{T}{C(1/1,-3)}:name(Remove 3 Counters) damage:3 target(creature) +auto={2}{B}{T}{C(1/1,-4)}:name(Remove 4 Counters) damage:4 target(creature) +auto={2}{B}{T}{C(1/1,-5)}:name(Remove 5 Counters) damage:5 target(creature) +auto={2}{B}{T}{C(1/1,-6)}:name(Remove 6 Counters) damage:6 target(creature) +auto={2}{B}{T}{C(1/1,-7)}:name(Remove 7 Counters) damage:7 target(creature) +auto={2}{B}{T}{C(1/1,-8)}:name(Remove 8 Counters) damage:8 target(creature) +auto={2}{B}{T}{C(1/1,-9)}:name(Remove 9 Counters) damage:9 target(creature) +auto={2}{B}{T}{C(1/1,-10)}:name(Remove 10 Counters) damage:10 target(creature) +auto={2}{B}{T}{C(1/1,-11)}:name(Remove 11 Counters) damage:11 target(creature) +auto={2}{B}{T}{C(1/1,-12)}:name(Remove 12 Counters) damage:12 target(creature) +auto={2}{B}{T}{C(1/1,-13)}:name(Remove 13 Counters) damage:13 target(creature) +auto={2}{B}{T}{C(1/1,-14)}:name(Remove 14 Counters) damage:14 target(creature) +auto={2}{B}{T}{C(1/1,-15)}:name(Remove 15 Counters) damage:15 target(creature) +auto={2}{B}{T}{C(1/1,-16)}:name(Remove 16 Counters) damage:16 target(creature) +auto={2}{B}{T}{C(1/1,-17)}:name(Remove 17 Counters) damage:17 target(creature) +auto={2}{B}{T}{C(1/1,-18)}:name(Remove 18 Counters) damage:18 target(creature) +auto={2}{B}{T}{C(1/1,-19)}:name(Remove 19 Counters) damage:19 target(creature) +auto={2}{B}{T}{C(1/1,-20)}:name(Remove 20 Counters) damage:20 target(creature) +text={B}{T} Pay 1 life: Put a +1/+1 counter on Cruel Sadist. -- {2}{B}{T} Remove X +1/+1 counters from Cruel Sadist: Cruel Sadist deals X damage to target creature. +mana={B} +type=Creature +subtype=Human Assassin +power=1 +toughness=1 +[/card] +[card] name=Cruel Tutor auto=moveTo(ownerlibrary) notatarget(*|mylibrary) auto=life:-2 controller @@ -21631,6 +21857,17 @@ mana={2}{W} type=Instant [/card] [card] +name=Dauntless River Marshal +auto=aslongas(Island|myBattlefield) 1/1 +auto={3}{U}:tap target(creature) +text=Dauntless River Marshal gets +1/+1 as long as you control an Island. -- {3}{U}: Tap target creature. +mana={1}{W} +type=Creature +subtype=Human Soldier +power=2 +toughness=1 +[/card] +[card] name=Dauthi Cutthroat abilities=shadow auto={1}{B}{T}:destroy target(creature[shadow]) @@ -29929,6 +30166,15 @@ mana={3} type=Artifact [/card] [card] +name=Ensoul Artifact +target=artifact +auto=teach(artifact) becomes(Creature,5/5) +text=Enchant artifact -- Enchanted artifact is a creature with base power and toughness 5/5 in addition to its other types. +mana={1}{U} +type=Enchantment +subtype=Aura +[/card] +[card] name=Entangling Vines target=creature[tapped] auto=doesnotuntap @@ -30575,6 +30821,16 @@ mana={2}{R}{R} type=Sorcery [/card] [card] +name=Eternal Thirst +target=creature +auto=teach(creature) lifelink +auto=@movedTo(creature|graveyard) from(opponentBattlefield):counter(1/1,1) +text=Enchant creature -- Enchanted creature has lifelink and "Whenever a creature an opponent controls dies, put a +1/+1 counter on this creature." (Damage dealt by a creature with lifelink also cause its controller to gain that much life.) +mana={1}{B} +type=Enchantment +subtype=Aura +[/card] +[card] name=Eternal Warrior target=creature auto=vigilance @@ -32805,6 +33061,13 @@ power=0 toughness=0 [/card] [card] +name=Festergloom +auto=all(creature[-black]|battlefield) -1/-1 ueot +text=Nonblack creatures get -1/-1 until end of turn. +mana={2}{B} +type=Sorcery +[/card] +[card] name=Festerhide Boar abilities=trample auto=if morbid then choice counter(1/1,2) @@ -34237,6 +34500,14 @@ power=4 toughness=4 [/card] [card] +name=Flesh to Dust +target=creature +auto=bury +text=Destroy target creature. It can't be regenerated. +mana={3}{B}{B} +type=Instant +[/card] +[card] name=Flesh-Eater Imp abilities=flying,infect auto={S(creature|mybattlefield)}:1/1 @@ -35876,6 +36147,16 @@ power=4 toughness=4 [/card] [card] +name=Frost Lynx +auto=name(Tap and Freeze) target(creature|opponentbattlefield) transforms((,newability[tap],newability[frozen])) +text=When Frost Lynx enters the battlefield, tap target creature an opponent controls. It doesn't untap during its controller's next untap step. +mana={2}{U} +type=Creature +subtype=Elemental Cat +power=2 +toughness=2 +[/card] +[card] name=Frost Marsh auto=tap auto={T}:Add{U} @@ -36689,6 +36970,18 @@ power=3 toughness=3 [/card] [card] +name=Garruk, Apex Predator +auto=counter(0/0,5,loyalty) +auto={C(0/0,1,Loyalty)}:name(destroy Planeswalker) destroy target(other planeswalker|battlefield) +auto={C(0/0,1,Loyalty)}:name(3/3 Beast) token(Beast,Creature Beast,3/3,deathtouch,black) +auto={C(0/0,-3,Loyalty)}:name(Destroy Creature) target(creature) dynamicability && destroy +auto={C(0/0,-8,Loyalty)}:name(Emblem) emblem transforms((,newability[@combat(attacking) source(creature|mybattlefield):all(trigger[to]) 5/5 ueot],newability[@combat(attacking) source(creature|mybattlefield):all(trigger[to]) trample ueot])) forever dontremove +text=+1: Destroy another target planeswalker. -- +1: Put a 3/3 black Beast creature token with deathtouch onto the battlefield. -- -3: Destroy target creature. You gain life equal to its toughness. -- -8: Target opponent gets an emblem with "Whenever a creature attacks you, it gets +5/+5 and gains trample until end of turn." -- Starting Loyalty {5} +mana={5}{B}{G} +type=Planeswalker +subtype=Garruk +[/card] +[card] name=Garruk, Primal Hunter auto=counter(0/0,3,loyalty) auto={C(0/0,1,Loyalty)}:token(Beast,Creature Beast,3/3,green) @@ -36981,6 +37274,16 @@ power=2 toughness=2 [/card] [card] +name=Geist of the Moors +abilities=flying +text=Flying +mana={1}{W}{W} +type=Creature +subtype=Spirit +power=3 +toughness=1 +[/card] +[card] name=Geist Snatch target=creature|stack auto=fizzle @@ -38199,6 +38502,17 @@ text=Cumulative upkeep - Pay 2 life. (At the beginning of your upkeep, put an ag type=Land [/card] [card] +name=Glacial Crasher +abilities=trample, cantattack +auto=aslongas(mountain|Battlefield) -cantattack +text=Trample (If this creature would assign enough damage to its blockers to destroy them, you may have it assign the rest of its damage to defending player or planeswalker.) -- Glacial Crasher can't attack unless there is a mountain on the battlefield. +mana={4}{U}{U} +type=Creature +subtype=Elemental +power=5 +toughness=5 +[/card] +[card] name=Glacial Crevasses auto={S(mountain[snow]|myBattlefield)}:fog oneshot text=Sacrifice a snow Mountain: Prevent all combat damage that would be dealt this turn. @@ -39293,6 +39607,22 @@ power=2 toughness=2 [/card] [card] +name=Goblin Kaboomist +auto=@each my upkeep:token(-383257) controller && flipacoin loseability damage:2 loseabilityend flipend +text=At the beginning of your upkeep, put a colorless artifact token named Land Mine onto the battlefield with "Red, Sacrifice this artifact: This artifact deals 2 damage to target attacking creature without flying." Then flip a coin. If you lose the flip, Goblin Kaboomist deals 2 damage to itself. +mana={1}{R} +type=Creature +subtype=Goblin Warrior +power=1 +toughness=2 +[/card] +[card] +name=Land Mine +auto={R}{S}:damage:2 target(creature[attacking;-flying]) +text={R}, Sacrifice this artifact: This artifact deals 2 damage to target attacking creature without flying. +type=Artifact +[/card] +[card] name=Goblin King auto=lord(other goblin) 1/1 auto=lord(other goblin) mountainwalk @@ -39478,6 +39808,18 @@ power=2 toughness=2 [/card] [card] +name=Goblin Rabblemaster +auto=lord(other goblin|mybattlefield) mustattack +auto=@each my combatbegins:token(Goblin,Creature Goblin,1/1,haste,red) +auto=@combat(attacking) source(this):all(this) foreach(other goblin[attacking]|battlefield) 1/0 ueot +text=Other Goblin creatures you control attack each turn if able. -- At the beginning of combat on your turn, put a 1/1 red Goblin creature token with haste onto the battlefield. -- Whenever Goblin Rabblemaster attacks, it gets +1/+0 until end of turn for each other attacking Goblin. +mana={2}{R} +type=Creature +subtype=Goblin Warrior +power=2 +toughness=2 +[/card] +[card] name=Goblin Rally auto=token(Goblin,Creature Goblin,1/1,red)*4 text=Put four 1/1 red Goblin creature tokens onto the battlefield. @@ -42790,6 +43132,17 @@ power=5 toughness=4 [/card] [card] +name=Hammerhand +target=creature +auto=teach(creature) haste +auto=teach(creature) 1/1 +auto=target(creature) cantblock ueot +text=Enchant creature -- When Hammerhand enters the battlefield, target creature can't block this turn. -- Enchanted creature gets +1/+1 and has haste. +mana={R} +type=Enchantment +subtype=Aura +[/card] +[card] name=Hammerhead Shark abilities=cantattack auto=aslongas(island|opponentbattlefield) -cantattack @@ -44055,6 +44408,16 @@ type=Legendary Enchantment subtype=God [/card] [card] +name=Heliod's Pilgrim +auto=may name(Search for an Aura) moveTo(myhand) target(aura|myLibrary) +text=When Heliod's Pilgrim enters the battlefield, you may search your library for an Aura card, reveal it, put it into your hand, then shuffle your library. +mana={2}{W} +type=Creature +subtype=Human Cleric +power=1 +toughness=2 +[/card] +[card] name=Helionaut abilities=flying auto={1}{T}:Add{W} @@ -45659,6 +46022,17 @@ power=2 toughness=2 [/card] [card] +name=Hornet Nest +abilities=defender +auto=@damaged(this):token(Insect,Creature Insect,1/1,flying,deathtouch,green)*thatmuch +text=Defender. -- Whenever Hornet Nest is dealt damage, put that many 1/1 green Insect creature tokens with flying and deathtouch onto the battlefield. (Any amount of damage a creature with deathtouch deals to a creature is enough to destroy it.) +mana={2}{G} +type=Creature +subtype=Insect +power=0 +toughness=2 +[/card] +[card] name=Hornet Queen abilities=flying,deathtouch auto=token(Insect,Creature Insect,1/1,green,flying,deathtouch)*4 @@ -45744,6 +46118,16 @@ type=Enchantment subtype=Aura [/card] [card] +name=Hot Soup +auto={3}:equip +auto=teach(creature) unblockable +auto=@damaged(mytgt):destroy all(mytgt) +text=Equipped creature is unblockable. -- Whenever equipped creature is dealt damage, destroy it. -- Equip {3} ({3}: Attach to target creature you control. Equip only as a sorcery.) +mana={1} +type=Artifact +subtype=Equipment +[/card] +[card] name=Hot Springs target=land|myBattlefield auto=teach(land) {T}:prevent:1 target(creature,player) @@ -46176,6 +46560,13 @@ mana={3}{G} type=Sorcery [/card] [card] +name=Hunter's Ambush +auto=preventAllCombatDamage from(creature[-Green]) ueot +text=Prevent all combat damage that would be dealt by nongreen creatures this turn. +mana={2}{G} +type=Instant +[/card] +[card] name=Hunter's Insight target=creature|mybattlefield auto=transforms((,newability[@combatdamaged(player) from(this):draw:thatmuch controller],newability[@combatdamaged(planeswalker) from(this):draw:thatmuch controller])) ueot @@ -47226,6 +47617,13 @@ mana={1}{B} type=Instant [/card] [card] +name=In Garruk's Wake +auto=destroy all(creature,planeswalker|opponentbattlefield) +text=Destroy all creatures you don't control and all planeswalkers you don't control. +mana={7}{B}{B} +type=Sorcery +[/card] +[card] name=In the Eye of Chaos auto=@movedto(instant[manacost=1]|stack):all(trigger[to]) transforms((,newability[pay[[{1}]] name(pay 1 mana) donothing?fizzle])) forever auto=@movedto(instant[manacost=2]|stack):all(trigger[to]) transforms((,newability[pay[[{2}]] name(pay 2 mana) donothing?fizzle])) forever @@ -47656,6 +48054,16 @@ power=4 toughness=4 [/card] [card] +name=Inferno Fist +target=creature|mybattlefield +auto=teach(creature) 2/0 +auto={R}{S}:damage:2 target(creature,player) +text=Enchant creature you control. -- Enchanted creature gets +2/+0. -- {R} Sacrifice Inferno Fist: Inferno Fist deals 2 damage to target creature or player +mana={1}{R} +type=Enchantment +subtype=Aura +[/card] +[card] name=Infest auto=lord(creature) -2/-2 text=All creatures get -2/-2 until end of turn. @@ -48210,6 +48618,16 @@ mana={3}{U}{U}{U} type=Sorcery [/card] [card] +name=Invasive Species +auto=moveTo(ownerhand) notatarget(other *|mybattlefield) +text=When Invasive Species enters the battlefield, return another permanent you control to its owner's hand. +mana={2}{G} +type=Creature +subtype=Insect +power=3 +toughness=3 +[/card] +[card] name=Invert the Skies auto=if spent({G}) then all(creature|opponentbattlefield) -flying ueot auto=if spent({U}) then all(creature|mybattlefield) flying ueot @@ -49653,6 +50071,17 @@ power=1 toughness=1 [/card] [card] +name=Jorubai Murk Lurker +auto=aslongas(Swamp|myBattlefield) 1/1 +auto={1}{B}:target(creature) lifelink ueot +text=Jorubai Murk Lurker gets +1/+1 as long as you control a Swamp. -- {1}{B}: Target creature gains lifelink until end of turn. (Damage dealt by the creature also causes its controller ot gain that much life.) +mana={2}{U} +type=Creature +subtype=Leech +power=1 +toughness=3 +[/card] +[card] name=Jotun Owl Keeper auto=cumulativeupcost[{WU}] sacrifice auto=@movedTo(this|graveyard) from(battlefield):thisforeach(counter{0/0.1.Age}) token(Bird,Creature Bird,1/1,white flying) @@ -50308,6 +50737,27 @@ power=3 toughness=3 [/card] [card] +name=Kalonian Twingrove +auto=type:forest:mybattlefield/type:forest:mybattlefield cdaactive +auto=token(-383290) +text=Kalonian Twingrove's power and toughness are each equal to the number of Forests you control. -- When Kalonian Twingrove enters the battlefield, put a green Treefolk Warrior creature token onto the battlefield with "this creature's power and toughness are each equal to the number of forests you control." +mana={5}{G} +type=Creature +subtype=Treefolk Warrior +power=* +toughness=* +[/card] +[card] +name=Treefolk Warrior +auto=type:forest:mybattlefield/type:forest:mybattlefield cdaactive +text=This creature's power and toughness are each equal to the number of forests you control. +color=green +type=Creature +subtype=Treefolk Warrior +power=* +toughness=* +[/card] +[card] name=Kamahl's Desire target=creature auto=first strike @@ -50521,6 +50971,18 @@ power=2 toughness=2 [/card] [card] +name=Kapsho Kitefins +abilities=flying +auto=tap target(creature) +auto=@movedTo(other creature|mybattlefield):tap target(creature|opponentbattlefield) +text=Flying -- Whenever Kapsho Kitefins or another creature enters the battlefield under your control, tap target creature an opponent controls. +mana={4}{U}{U} +type=Creature +subtype=Fish +power=3 +toughness=3 +[/card] +[card] name=Karakas auto={T}:Add{W} auto={T}:moveTo(ownerhand) target(creature[legendary]) @@ -51829,6 +52291,17 @@ power=1 toughness=1 [/card] [card] +name=Kird Chieftain +auto=aslongas(forest|myBattlefield) 1/1 +auto={4}{G}:name(2/2 and Trample) target(creature) transforms((,newability[2/2],newability[trample])) ueot +text=Kird Chieftain gets +1/+1 as long as you control a Forest. -- {4}{G}: Target creature gets +2/+2 and gains trample until end of turn. (If it would assign enough damage to its blockers to destroy them, you may have it assign the rest of its damage to defending player or planeswalker.) +mana={3}{R} +type=Creature +subtype=Ape +power=3 +toughness=3 +[/card] +[card] name=Kiri-Onna auto=moveTo(ownerhand) target(creature) auto=@movedto(arcane,spirit|mystack):may moveTo(ownerhand) @@ -53072,6 +53545,16 @@ mana={1}{R} type=Sorcery [/card] [card] +name=Krenko's Enforcer +abilities=intimidate +text=Intimidate (This creature can't be blocked except by artifact creatures and/or creatures that share a color with it.) +mana={1}{R}{R} +type=Creature +subtype=Goblin Warrior +power=2 +toughness=2 +[/card] +[card] name=Kris Mage auto={R}{T}{discard(*|myhand)}:damage:1 target(creature,player) text={R}, {T}, Discard a card: Kris Mage deals 1 damage to target creature or player. @@ -54487,6 +54970,16 @@ power=4 toughness=5 [/card] [card] +name=Leeching Sliver +auto=lord(sliver|mybattlefield) transforms((,newability[@combat(attacking) source(this):life:-1 opponent])) +text=Whenever a Sliver you control attacks, defending player loses 1 life. +mana={1}{B} +type=Creature +subtype=Sliver +power=1 +toughness=1 +[/card] +[card] name=Leechridden Swamp auto=tap auto=aslongas(*[black]|myBattlefield) {B}{T}:life:-1 opponent >1 @@ -55076,6 +55569,13 @@ mana={4}{B}{B} type=Sorcery [/card] [card] +name=Life's Legacy +auto=draw:storedpower controller +text=As an additional cost to cast Life's Legacy, sacrifice a creature. -- Draw cards equal to the sacrificed creature's power. +mana={1}{G} +type=Sorcery +[/card] +[card] name=Lifesmith auto=@movedto(artifact|mystack):pay({1}) life:3 mana={1}{G} @@ -58607,6 +59107,16 @@ type=Enchantment subtype=Aura [/card] [card] +name=Marked by Honor +target=creature +auto=teach(creature) 2/2 +auto=teach(creature) vigilance +text=Enchant creature -- Enchanted creature gets +2/+2 and has vigilance. (Attacking doesn't cause it to tap.) +mana={3}{W} +type=Enchantment +subtype=Aura +[/card] +[card] name=Marker Beetles auto=@movedTo(this|graveyard) from(battlefield):1/1 target(creature|battlefield) ueot auto={S}:draw:1 @@ -60034,6 +60544,17 @@ power=2 toughness=2 [/card] [card] +name=Mercurial Pretender +auto=may copy NotATarget(creature) +auto=transforms((,newability[{2}{U}{U}:moveto(ownerhand)])) forever +text=You may have Mercurial Pretender enter the battlefield as a copy of any creature you control except it gains “{2}{U}{U}: Return this creature to its owner’s hand.” +mana={4}{U} +type=Creature +subtype=Shapeshifter +power=0 +toughness=0 +[/card] +[card] name=Merfolk Assassin auto={T}:destroy target(creature[islandwalk]) text={T}: Destroy target creature with islandwalk. @@ -60427,6 +60948,18 @@ mana={R}{G} type=Enchantment [/card] [card] +name=Meteorite +auto=damage:2 target(creature,player) +auto={T}:Add{W} +auto={T}:Add{U} +auto={T}:Add{B} +auto={T}:Add{R} +auto={T}:Add{G} +text=When Meteorite enters the battlefield it deals 2 damage to target creature or player. -- {T}: Add one mana of any color to your mana pool. +mana={5} +type=Artifact +[/card] +[card] name=Metropolis Sprite abilities=flying auto={U}:1/-1 ueot @@ -60679,6 +61212,13 @@ power=2 toughness=1 [/card] [card] +name=Military Intelligence +auto=@each my blockers restriction{type(creature[attacking]|myBattlefield)~morethan~1}:draw:1 +text=Whenever you attack with two or more creatures, draw a card. +mana={1}{U} +type=Enchantment +[/card] +[card] name=Militia's Pride auto=@combat(attacking) source(creature[-token]|mybattlefield):pay({W}) token(Kithkin Soldier,Creature Kithkin Soldier,1/1,white,battleready) text=Whenever a nontoken creature you control attacks, you may pay {W}. If you do, put a 1/1 white Kithkin Soldier creature token onto the battlefield tapped and attacking. @@ -61151,6 +61691,16 @@ power=1 toughness=1 [/card] [card] +name=Miner's Bane +auto={2}{R}:name(1/0 and Trample) transforms((,newability[1/0],newability[trample])) ueot +text={2}{R}: Miner's Bane gets +1/+0 and gains trample until end of turn. (If it would assign enough damage to its blockers to destroy them, you may have it assign the rest of its damage to defending player or planeswalker.) +mana={4}{R}{R} +type=Creature +subtype=Elemental +power=6 +toughness=3 +[/card] +[card] name=Minion of Leshrac abilities=protection from black auto={T}:destroy target(creature,land) @@ -64895,6 +65445,16 @@ mana={B}{G} type=Enchantment [/card] [card] +name=Necromancer's Assistant +auto=deplete:3 controller +text=When Necromancer's Assistant enters the battlefield, put the top three cards of your library into your graveyard. +mana={2}{B} +type=Creature +subtype=Zombie +power=3 +toughness=1 +[/card] +[card] name=Necromancer's Covenant auto=choice name(exile all creatures from opponent's graveyard) foreach(creature|opponentgraveyard) token(Zombie,Creature Zombie,2/2,black) && moveTo(exile) all(creature|opponentgraveyard) auto=choice name(exile all creatures from my graveyard) foreach(creature|mygraveyard) token(Zombie,Creature Zombie,2/2,black) && moveTo(exile) all(creature|mygraveyard) @@ -64914,6 +65474,13 @@ type=Enchantment subtype=Aura [/card] [card] +name=Necromancer's Stockpile +auto=aslongas(creature|myhand) {1}{B}:notatarget(creature|myhand) and!( if cantargetcard(zombie|*) then token(-383323) )! reject && draw:1 +text={1}{B},Discard a creature card: Draw a card. If the discarded card was a Zombie card, put a 2/2 black Zombie creature token onto the battlefield tapped. +mana={1}{B} +type=Enchantment +[/card] +[card] name=Necromantic Thirst target=creature auto=@combatdamaged(player) from(mytgt):may moveTo(myhand) target(creature|mygraveyard) @@ -65270,6 +65837,17 @@ power=4 toughness=3 [/card] [card] +name=Netcaster Spider +abilities=reach +auto=@combat(blocking) source(this) from(creature[flying]):all(this) 2/0 ueot +text=Reach (This creature can block creatures with flying.) -- Whenever Netcaster Spider blocks a creature with flying, Netcaster Spider gets +2/+0 until end of turn. +mana={2}{G} +type=Creature +subtype=Spider +power=2 +toughness=3 +[/card] +[card] name=Nether Horror mana={3}{B} type=Creature @@ -65750,6 +66328,17 @@ mana={B}{B} type=Instant [/card] [card] +name=Nightfire Giant +auto=aslongas(Mountain|myBattlefield) 1/1 +auto={4}{R}:damage:2 target(creature,player) +text=Nightfire Giant gets +1/+1 as long as you control a Mountain. -- {4}{R}: Nightfire Giant deals 2 damage to target creature or player. +mana={4}{B} +type=Creature +subtype=Zombie Giant +power=4 +toughness=3 +[/card] +[card] name=Nightguard Patrol abilities=first strike,vigilance text=First strike, vigilance @@ -66061,6 +66650,16 @@ text={T}: Add {1} to your mana pool. -- {T}: Add {W} to your mana pool. Activate type=Land [/card] [card] +name=Nimbus of the Isles +abilities=flying +text=Flying (This creature can't be blocked except by creatures with flying or reach.) +mana={4}{U} +type=Creature +subtype=Elemental +power=3 +toughness=3 +[/card] +[card] name=Nimbus Swimmer abilities=flying auto=counter(1/1,X) @@ -66146,6 +66745,17 @@ toughness=4 mana={4}{B}{B} [/card] [card] +name=Nissa, Worldwaker +auto=counter(0/0,3,loyalty) +auto={C(0/0,1,Loyalty)}:name(land becomes 4/4) target(land|mybattlefield) becomes(Elemental Creature,4/4,trample) forever +auto={C(0/0,1,Loyalty)}:name(untap up to 4 forest) target(forest|mybattlefield) untap +auto={C(0/0,-7,Loyalty)}:name(search Lands) moveTo(mybattlefield) target(land[basic]|mylibrary) and!( becomes(Elemental Creature,4/4,trample) forever )! oneshot +text=+1: Target land you control becomes a 4/4 Elemental creature with trample. It's still a land. -- +1: Untap up to four target Forests. -- -7: Search your library for any number of basic land cards, put them onto the battlefield, then shuffle your library. Those lands become 4/4 Elemental creatures with trample. They're still lands. +mana={3}{G}{G} +type=Planeswalker +subtype=Nissa +[/card] +[card] name=Nissa Revane auto=counter(0/0,2,loyalty) auto={C(0/0,1,Loyalty)}:moveTo(mybattlefield) target(Nissa's Chosen|mylibrary) @@ -69288,6 +69898,61 @@ mana={4} type=Artifact [/card] [card] +name=Paragon of Eternal Wilds +auto=lord(other creature[green]|myBattlefield) 1/1 +auto={G}{T}:target(other creature[green]|myBattlefield):trample ueot +text=Other green creatures you control get +1/+1. -- {G}{T}: Another target green creature you control gains trample until end of turn. +mana={3}{G} +type=Creature +subtype=Human Druid +power=2 +toughness=2 +[/card] +[card] +name=Paragon of Fierce Defiance +auto=lord(other creature[red]|myBattlefield) 1/1 +auto={R}{T}:target(other creature[red]|myBattlefield):haste ueot +text=Other red creatures you control get +1/+1. -- {R}{T}: Another target red creature you control gains haste until end of turn. +mana={3}{R} +type=Creature +subtype=Human Warrior +power=2 +toughness=2 +[/card] +[card] +name=Paragon of Gathering Mists +auto=lord(other creature[blue]|myBattlefield) 1/1 +auto={U}{T}:target(other creature[blue]|myBattlefield):flying ueot +text=Other blue creatures you control get +1/+1. -- {G}{T}: Another target blue creature you control gains flying until end of turn. +mana={3}{U} +type=Creature +subtype=Human Wizard +power=2 +toughness=2 +[/card] +[card] +name=Paragon of New Dawns +auto=lord(other creature[white]|myBattlefield) 1/1 +auto={W}{T}:target(other creature[white]|myBattlefield):vigilance ueot +text=Other white creatures you control get +1/+1. -- {W}{T}: Another target white creature you control gains vigilance until end of turn. +mana={3}{W} +type=Creature +subtype=Human Soldier +power=2 +toughness=2 +[/card] +[card] +name=Paragon of Open Graves +auto=lord(other creature[black]|myBattlefield) 1/1 +auto={1}{B}{T}:target(other creature[black]|myBattlefield):deathtouch ueot +text=Other black creatures you control get +1/+1. -- {1}{B}{T}: Another target black creature you control gains deathtouch until end of turn. +mana={3}{B} +type=Creature +subtype=Skeleton Warrior +power=2 +toughness=2 +[/card] +[card] name=Paragon of the Amesha abilities=first strike auto={W}{U}{B}{R}{G}:3/3 && transforms((Angel Creature,flying,lifelink)) ueot @@ -69557,7 +70222,7 @@ subtype=Arcane [/card] [card] name=Path of Bravery -auto=this(controllerlife > 19) lord(creature|mybattlefield) 1/1 +auto=this(variable{abundantlife}) lord(creature|mybattlefield) 1/1 auto=@each my blockers:life:type:creature[attacking]|mybattlefield controller text=Enchantment. -- As long as your life total is greater than or equal to your starting life total, creatures you control get +1/+1. -- Whenever one or more creatures you control attack, you gain life equal to the number of attacking creatures. mana={2}{W} @@ -70169,6 +70834,13 @@ power=0 toughness=4 [/card] [card] +name=Perilous Vault +auto={5}{T}{E}:moveTo(exile) all(*[-land]|battlefield) +text={5},{T}, exile Perilous Vault: Exile all nonland permanents. +mana={4} +type=Artifact +[/card] +[card] name=Perimeter Captain abilities=defender auto=@combat(blocking) source(creature[defender]|mybattlefield):life:2 controller @@ -71283,6 +71955,16 @@ power=1 toughness=1 [/card] [card] +name=Phytotitan +autograveyard=@movedTo(this|graveyard) from(myBattlefield):phaseaction[my upkeep once]:moveTo(myBattlefield) and!(tap)! +text=When Phytotitan dies, return it to the battlefield tapped under its owner's control at the beginning of his or her next upkeep. +mana={4}{G}{G} +type=Creature +subtype=Plant Elemental +power=7 +toughness=2 +[/card] +[card] name=Pianna, Nomad Captain auto=@combat(attacking) source(this):all(creature[attacking]) 1/1 ueot text=Whenever Pianna, Nomad Captain attacks, attacking creatures get +1/+1 until end of turn. @@ -71392,6 +72074,14 @@ mana={R} type=Sorcery [/card] [card] +name=Pillar of Light +target=creature[toughness>=4] +auto=moveTo(exile) +text=Exile target creature with toughness 4 or greater. +mana={2}{W} +type=Instant +[/card] +[card] name=Pillar of War abilities=defender auto=this(auras >= 1) canattack @@ -73309,6 +73999,13 @@ power=1 toughness=1 [/card] [card] +name=Profane Memento +auto=@movedto(creature|opponentgraveyard):life:1 controller +text=Whenever a creature card is put into an opponent's graveyard from anywhere, you gain 1 life. +mana={1} +type=Artifact +[/card] +[card] name=Profane Prayers target=creature,player auto=damage:type:cleric:battlefield @@ -74442,6 +75139,18 @@ mana={1}{U} type=Instant [/card] [card] +name=Quickling +abilities=flying,flash +auto=aslongas(other creature|mybattlefield) choice notatarget(other creature|mybattlefield) moveTo(ownerhand) oneshot +auto=choice sacrifice +text=Flash (You may cast this spell any time you could cast an instant.) -- Flying -- When Quickling enters the battlefield, sacrifice it unless you return another creature you control to its owner's hand. +mana={1}{U} +type=Creature +subtype=Faerie Rogue +power=2 +toughness=2 +[/card] +[card] name=Quicksand auto={T}:Add{1} auto={T}{S}:-1/-2 target(creature[attacking;-flying]) @@ -74756,6 +75465,13 @@ power=2 toughness=3 [/card] [card] +name=Radiant Fountain +auto=life:2 +auto={T}:Add{1} +text=When Radiant Fountain enters the battlefield, you gain 2 life. -- {T}: Add {1} to your mana pool. +type=Land +[/card] +[card] name=Radiant Kavu auto={R}{G}{W}:fog from(creature[blue]) oneshot && fog from(creature[black]) oneshot text={R}{G}{W}: Prevent all combat damage blue creatures and black creatures would deal this turn. @@ -76695,6 +77411,16 @@ mana={G} type=Instant [/card] [card] +name=Reclamation Sage +auto=may destroy target(artifact,enchantment) +text=When Reclamation Sage enters the battlefield, you may destroy target artifact or enchantment. +mana={2}{G} +type=Creature +subtype=Elf Shaman +power=2 +toughness=1 +[/card] +[card] name=Reclusive Wight auto=@each my upkeep restriction{type(*[-land]|myBattlefield)~morethan~1}:sacrifice text=At the beginning of your upkeep, if you control another nonland permanent, sacrifice Reclusive Wight. @@ -77544,6 +78270,16 @@ power=5 toughness=5 [/card] [card] +name=Research Assistant +auto={3}{U}{T}:draw:1 && transforms((,newability[target(*|myhand) reject])) forever +text={3}{U}{T}: Draw a card, then discard a card. +mana={1}{U} +type=Creature +subtype=Human Wizard +power=1 +toughness=3 +[/card] +[card] name=Rescind target=* auto=moveTo(ownerhand) @@ -77610,6 +78346,17 @@ mana={1}{G} type=Instant [/card] [card] +name=Resolute Archangel +abilities=flying +auto=if compare(lifetotal)~lessthan~compare(startinglife) then lifeset:startinglife controller +text=Flying. -- When Resolute Archangel enters the battlefield, if your life total is less than your starting life total, it becomes equal to your starting life total. +mana={5}{W}{W} +type=Creature +subtype=Angel +power=4 +toughness=4 +[/card] +[card] name=Resounding Roar target=creature auto=3/3 @@ -79393,6 +80140,15 @@ power=3 toughness=4 [/card] [card] +name=Rogue's Gloves +auto={2}:equip +auto=@damaged(opponent) from(mytgt):may draw:1 controller +text=Whenever equipped creature deals combat damage to a player, you may draw a card. -- Equip: 2 +mana={2} +type=Artifact +subtype=Equipment +[/card] +[card] name=Rogue's Passage auto={T}:Add{1} auto={4}{T}:unblockable target(creature) @@ -79793,6 +80549,16 @@ power=0 toughness=2 [/card] [card] +name=Rotfeaster Maggot +auto=moveTo(exile) target(creature|graveyard) and!( dynamicability )! +text=When Rotfeaster Maggot enters the battlefield, exile target creature card from a graveyard. You gain life equal to that card’s toughness. +mana={4}{B} +type=Creature +subtype=Insect +power=3 +toughness=3 +[/card] +[card] name=Rotlung Reanimator auto=@movedTo(this|graveyard) from(battlefield):token(Zombie,Creature Zombie, 2/2,black) auto=@movedTo(graveyard) from(other cleric|battlefield):token(Zombie,Creature Zombie, 2/2,black) @@ -80692,6 +81458,13 @@ power=1 toughness=3 [/card] [card] +name=Sacred Armory +auto={2}:1/0 target(creature) +text={2}: Target creatures gets +1/+0 until end of turn. +mana={2} +type=Artifact +[/card] +[card] name=Sacred Foundry auto=tap auto=may untap && life:-2 controller @@ -81212,6 +81985,14 @@ power=2 toughness=2 [/card] [card] +name=Sanctified Charge +auto=all(creature|myBattlefield) 2/1 ueot +auto=all(creature[white]|myBattlefield) first strike ueot +text=Creature you control get +2/+1 until end of turn. White creatures you control also gain first strike until end of turn. (They deal combat damage before creatures without first strike.) +mana={4}{W} +type=Instant +[/card] +[card] name=Sanctimony auto=@tappedformana(mountain|opponentbattlefield):may life:1 controller text=Whenever an opponent taps a Mountain for mana, you may gain 1 life. @@ -82935,6 +83716,17 @@ power=2 toughness=3 [/card] [card] +name=Scrapyard Mongrel +auto=aslongas(Artifact|myBattlefield) 2/0 +auto=aslongas(Artifact|myBattlefield) trample +text=As long as you control an artifact, Scrapyard Mongrel gets +2/+0 and has trample. +mana={3}{R} +type=Creature +subtype=Hound +power=3 +toughness=3 +[/card] +[card] name=Scrapyard Salvo target=player auto=damage:type:artifact:mygraveyard @@ -83235,6 +84027,17 @@ power=4 toughness=2 [/card] [card] +name=Scuttling Doom Engine +auto=cantbeblockedby(creature[power<=2]) +autograveyard=@movedTo(this|graveyard) from(mybattlefield):damage:6 target(opponent) +text=Scuttling Doom Engine can't be blocked by creatures with power 2 or less. -- When Scuttling Doom Engine dies, it deals 6 damage to target opponent. +mana={6} +type=Artifact Creature +subtype=Construct +power=6 +toughness=6 +[/card] +[card] name=Scuzzback Marauders abilities=trample,persist text=Trample -- Persist (When this creature dies, if it had no -1/-1 counters on it, return it to the battlefield under its owner's control with a -1/-1 counter on it.) @@ -85178,6 +85981,16 @@ power=5 toughness=6 [/card] [card] +name=Shadowcloak Vampire +auto={L}{L}:flying ueot +text=Pay 2 life: Shadowcloak Vampire gains flying until end of turn. +mana={4}{B} +type=Creature +subtype=Vampire +power=4 +toughness=3 +[/card] +[card] name=Shadowfeed target=*|graveyard auto=moveto(exile) @@ -85228,6 +86041,16 @@ power=3 toughness=2 [/card] [card] +name=Shaman of Spring +auto=draw:1 +text=When Shaman of Spring enters the battlefield, draw a card. +mana={3}{G} +type=Creature +subtype=Elf Shaman +power=2 +toughness=2 +[/card] +[card] name=Shaman of the Great Hunt abilities=haste auto=lord(creature|mybattlefield) transforms((,newability[@combatdamaged(player) from(this):counter(1/1.1) all(this)])) @@ -86726,6 +87549,18 @@ power=1 toughness=4 [/card] [card] +name=Siege Dragon +abilities=flying +auto=destroy all(creature[wall]|opponentbattlefield) +auto=@combat(attacking) source(this) restriction{type(creature[wall]|opponentbattlefield)~lessthan~1}:damage:2 all(creature|opponentbattlefield) +text=Flying. -- When Siege Dragon enters the battlefield, destroy all Walls your opponent controls. -- Whenever Siege Dragon attacks, if your opponent control no Walls, it deals 2 damage to each creature without flying defending player controls. +mana={5}{R}{R} +type=Creature +subtype=Dragon +power=5 +toughness=5 +[/card] +[card] name=Siege Mastodon mana={4}{W} type=Creature @@ -89336,6 +90171,16 @@ power=2 toughness=2 [/card] [card] +name=Sliver Hivelord +auto=lord(sliver|myBattlefield) indestructible +text=Sliver creatures you control have indestructible. (Damage and effects that say "destroy" don't destroy them.) +mana={W}{U}{B}{R}{G} +type=Legendary Creature +subtype=Sliver +power=5 +toughness=5 +[/card] +[card] name=Sliver Legion auto=lord(sliver) foreach(other sliver|battlefield) 1/1 text=All Sliver creatures get +1/+1 for each other Sliver on the battlefield. @@ -90658,6 +91503,66 @@ mana={3}{W}{W} type=Instant [/card] [card] +name=Soul of Innistrad +abilities=deathtouch +auto={3}{B}{B}:target(creature|myGraveyard) moveTo(myHand) +autograveyard={3}{B}{B}{E}:target(creature|myGraveyard) moveTo(myHand) +text=Deathtouch -- {3}{B}{B}: Return up to three target creature cards from your graveyard to your hand. -- {3}{B}{B}{E}: Exile Soul of Innistrad from your graveyard: Return up to three target creature cards from your graveyard to your hand. +mana={4}{B}{B} +type=Creature +subtype=Avatar +power=6 +toughness=6 +[/card] +[card] +name=Soul of New Phyrexia +abilities=trample +auto={5}:all(*|mybattlefield) indestructible ueot +autograveyard={5}{E}:all(*|mybattlefield) indestructible ueot +text=Trample. -- {5}: Permanents you control gain indestructible until end of turn. -- {5}: Permanents you control gain indestructible until end of turn. +mana={6} +type=Artifact Creature +subtype=Avatar +power=6 +toughness=6 +[/card] +[card] +name=Soul of Ravnica +abilities=flying +auto={3}{U}{U}:aslongas(*[white]|myBattlefield) draw:1 && aslongas(*[blue]|myBattlefield) draw:1 && aslongas(*[black]|myBattlefield) draw:1 && aslongas(*[red]|myBattlefield) draw:1 && aslongas(*[green]|myBattlefield) draw:1 +autograveyard={3}{U}{U}{E}:aslongas(*[white]|myBattlefield) draw:1 && aslongas(*[blue]|myBattlefield) draw:1 && aslongas(*[black]|myBattlefield) draw:1 && aslongas(*[red]|myBattlefield) draw:1 && aslongas(*[green]|myBattlefield) draw:1 +text=Flying -- {3}{U}{U}: Draw a card for each color among permanents you control. -- {3}{U}{U}: Exile Soul of Ravnica from your graveyard: Draw a card for each color among permanents you control. +mana={4}{U}{U} +type=Creature +subtype=Avatar +power=6 +toughness=6 +[/card] +[card] +name=Soul of Theros +abilities=vigilance +auto={4}{W}{W}:all(creature|myBattlefield) transforms((,newability[2/2],newability[first strike],newability[lifelink])) ueot +autograveyard={4}{W}{W}{E}:all(creature|myBattlefield) transforms((,newability[2/2],newability[first strike],newability[lifelink])) ueot +text=Vigilance. -- {4}{W}{W}: Creatures you control get +2/+2 and gain first strike and lifelink until end of turn. -- {4}{W}{W}: Exile Soul of Theros from your graveyard: Creatures you control get +2/+2 and gain first strike and lifelink until end of turn. +mana={4}{W}{W} +type=Creature +subtype=Avatar +power=6 +toughness=6 +[/card] +[card] +name=Soul of Zendikar +abilities=reach +auto={3}{G}{G}:token(Beast,Creature Beast,3/3,green) +autograveyard={3}{G}{G}{E}:token(Beast,Creature Beast,3/3,green) +text=Reach. -- {3}{G}{G}: Put a 3/3 green Beast creature token onto the battlefield. -- {3}{G}{G}: Exile Soul of Zendikar from your graveyard: Put a 3/3 green Beast creature token onto the battlefield. +mana={4}{G}{G} +type=Creature +subtype=Avatar +power=6 +toughness=6 +[/card] +[card] name=Soul Reap target=creature[-green] auto=destroy @@ -91262,6 +92167,20 @@ mana={1}{B} type=Sorcery [/card] [card] +name=Spectra Ward +target=creature +auto=teach(creature) 2/2 +auto=teach(creature) protection from(White) +auto=teach(creature) protection from(Blue) +auto=teach(creature) protection from(Black) +auto=teach(creature) protection from(Red) +auto=teach(creature) protection from(Green) +text=Enchant creature -- Enchanted creature gets +2/+2 and gains protection from all colors. This effect does not remove auras. +mana={3}{W}{W} +type=Enchantment +subtype=Aura +[/card] +[card] name=Spectral Bears auto=@each my combatdamage restriction{type(*[black]|opponentbattlefield)~lessthan~1}:frozen text=Whenever Spectral Bears attacks, if defending player controls no black nontoken permanents, it doesn't untap during your next untap step. @@ -92119,6 +93038,14 @@ type=Enchantment subtype=Aura [/card] [card] +name=Spirit Bonds +auto=@movedto(creature[-token]|mybattlefield):pay({W}) token(Spirit,Creature Spirit,1/1,flying,white) +auto={1}{S(creature[spirit]|mybattlefield)}:name(indestructible) target(creature[-Spirit]) transforms((,newability[indestructible])) ueot +text=Whenever a nontoken creature enters the battlefield under your control, you may pay {W}. If you do, put a 1/1 white Spirit creature token with flying onto the battlefield. -- {1}{W}, sacrifice a Spirit: Target non-Spirit creature gains indestructible until end of turn. (Effects that say "destroy" don't destroy it. A creature with indestructible can't be destroyed by damage.) +mana={1}{W} +type=Enchantment +[/card] +[card] name=Spirit Cairn auto=@discarded(*|hand):pay({W}) token(Spirit,Creature Spirit,1/1,flying,white) text=Whenever a player discards a card, you may pay {W}. If you do, put a 1/1 white Spirit creature token with flying onto the battlefield. @@ -93352,6 +94279,16 @@ mana={3}{U} type=Enchantment [/card] [card] +name=Statute of Denial +target=*|stack +auto=fizzle +auto=if type(creature[blue]|mybattlefield)~morethan~0 then draw:1 controller +auto=if type(creature[blue]|mybattlefield)~morethan~0 then ability$!reject notatarget(*|myhand)!$ controller +text=Counter target spell. If you control a blue creature, draw a card, then discard a card. +mana={2}{U}{U} +type=Instant +[/card] +[card] name=Staunch Defenders auto=life:4 text=When Staunch Defenders enters the battlefield, you gain 4 life. @@ -95424,6 +96361,17 @@ mana={1} type=Artifact [/card] [card] +name=Sunblade Elf +auto=aslongas(Plains|myBattlefield) 1/1 +auto={4}{W}:all(creature|myBattlefield) 1/1 ueot +text=Sunblade Elf gets +1/+1 as long as you control a Plains. -- {4}{W}: Creatures you control get +1/+1 until end of turn. +mana={G} +type=Creature +subtype=Elf Warrior +power=1 +toughness=1 +[/card] +[card] name=Sunblast Angel abilities=flying auto=destroy all(creature[tapped]) @@ -95524,6 +96472,16 @@ mana={3} type=Artifact [/card] [card] +name=Sungrace Pegasus +abilities=flying,lifelink +text=Flying (This creature can't be blocked except by creatures with flying or reach.) -- Lifelink (Damage dealt by this creature also causes you to gain that much life.) +mana={1}{W} +type=Creature +subtype=Pegasus +power=1 +toughness=2 +[/card] +[card] name=Sungrass Egg auto={2}{T}{S}:Add{G}{W} && draw:1 text={2}, {T}, Sacrifice Sungrass Egg: Add {G}{W} to your mana pool. Draw a card. @@ -103406,6 +104364,13 @@ mana={3}{BR}{BR} type=Sorcery [/card] [card] +name=Tyrant's Machine +auto={4}{T}:tap target(creature) +text={4}, {T}: Tap target creature. +mana={2} +type=Artifact +[/card] +[card] name=Ubul Sar Gatekeepers auto=if type(land[Gate]|mybattlefield)~morethan~1 then -2/-2 target(creature|opponentbattlefield)ueot text=When Ubul Sar Gatekeepers enters the battlefield, if you control two or more Gates, target creature an opponent controls gets -2/-2 until end of turn. @@ -103557,6 +104522,15 @@ power=0 toughness=0 [/card] [card] +name=Ulcerate +target=creature +auto=-3/-3 +auto=life:-3 controller +text=Target creature gets -3/-3 until end of turn. -- You lose 3 life. +mana={B} +type=Instant +[/card] +[card] name=Ultimate Price target=creature[-multicolor] auto=destroy @@ -103842,6 +104816,16 @@ mana={G} type=Instant [/card] [card] +name=Undergrowth Scavenger +auto=counter(1/1,type:creature:graveyard) +text=Undergrowth Scavenger enters the battlefield with a number of +1/+1 counters on it equal to the number of creature cards in all graveyards. +mana={3}{G} +type=Creature +subtype=Fungus Horror +power=0 +toughness=0 +[/card] +[card] name=Undermine target=*|stack auto=fizzle @@ -105755,6 +106739,16 @@ type=Enchantment subtype=Aura [/card] [card] +name=Venom Sliver +auto=lord(sliver|myBattlefield) deathtouch +text=Sliver creatures you control have deathtouch. (Any amount of damage a creature with deathtouch deals to a creature is enough to destroy it.) +mana={1}{G} +type=Creature +subtype=Sliver +power=1 +toughness=1 +[/card] +[card] name=Venomous Dragonfly abilities=flying auto=@combat(blocking,blocked) source(this) from(creature):all(trigger[from]) phaseaction[combatends once] destroy @@ -106144,17 +107138,16 @@ text=Counter target spell. That spell's controller may draw a card. mana={2}{U} type=Instant [/card] -# P/T modified to make auto rule possible [card] name=Vexing Beetle abilities=nofizzle -auto=aslongas(creature|opponentBattlefield) -3/-3 +auto=this(variable{type:creature:opponentbattlefield}<1) 3/3 text=Vexing Beetle can't be countered. -- Vexing Beetle gets +3/+3 as long as no opponent controls a creature. mana={4}{G} type=Creature subtype=Insect -power=6 -toughness=6 +power=3 +toughness=3 [/card] [card] name=Vexing Sphinx @@ -106773,6 +107766,16 @@ mana={G} type=Instant [/card] [card] +name=Vineweft +target=Creature +auto=teach(creature) 1/1 +autograveyard={4}{G}:moveTo(ownerhand) +text=Enchant creature -- Enchanted creature gets +1/+1. -- {4}{G}: Return Vineweft from your graveyard to hand. +mana={G} +type=Enchantment +subtype=Aura +[/card] +[card] name=Vintara Snapper auto=aslongas(land[-tapped]|myBattlefield) shroud <1 text=Vintara Snapper has shroud as long as you control no untapped lands. (It can't be the target of spells or abilities.) @@ -107528,6 +108531,14 @@ mana={3}{B}{R} type=Sorcery [/card] [card] +name=Void Snare +target=*[-land]|battlefield +auto=moveTo(ownerHand) +text=Return target nonland permanent to its owner's hand. +mana={U} +type=Sorcery +[/card] +[card] name=Void Stalker auto={2}{U}{T}:name(shuffle target) moveTo(ownerLibrary) all(this) && shuffle controller && target(creature|battlefield) transforms((,newability[moveTo(ownerLibrary) all(this)],newability[shuffle controller])) ueot text={2}{U}, {T}: Put Void Stalker and target creature on top of their owners' libraries, then those players shuffle their libraries. @@ -108541,6 +109552,18 @@ power=1 toughness=5 [/card] [card] +name=Wall of Limbs +abilities=defender +auto=@lifed(controller):counter(1/1,1) +auto={5}{B}{B}{S}:name(Lose Life) target(player) life:-storedpower +text=Defender (This creature can't attack.) -- Whenever you gain life, put a +1/+1 counter on Wall of Limbs. -- {5}{B}{B}, Sacrifice Wall of Limbs: Target player loses X life, where X is Wall of Limbs's power. +mana={2}{B} +type=Creature +subtype=Zombie Wall +power=0 +toughness=3 +[/card] +[card] name=Wall of Mulch abilities=defender auto={G}{S(wall|myBattlefield)}:draw:1 @@ -109402,6 +110425,15 @@ mana={4}{B}{discard(*|myhand)} type=Instant [/card] [card] +name=Waste Not +auto=@discarded(creature|opponenthand):token(Zombie,Creature Zombie,2/2,black) controller +auto=@discarded(land|opponenthand):add{B}{B} controller +auto=@discarded(*[-creature;-land]|opponenthand):draw:1 controller +text=Whenever an opponent discards a creature card, put a 2/2 black Zombie creature token onto the battlefield. -- Whenever an opponent discards a land card, add {B}{B} to your mana pool. -- Whenever an opponent discards a noncreature, nonland card, draw a card. +mana={1}{B} +type=Enchantment +[/card] +[card] name=Wasteland auto={T}:Add{1} auto={T}{S}:destroy target(land[-basic]) @@ -111441,13 +112473,6 @@ power=4 toughness=4 [/card] [card] -name=Witch's Mist -auto={2}{b}{t}:destroy target(creature[damaged]) -text={2}{B}, {T}: Destroy target creature that was dealt damage this turn. -mana={2}{B} -type=Enchantment -[/card] -[card] name=Witch Hunter auto={T}:damage:1 target(player) auto={1}{W}{W}{T}:moveto(ownerHand) target(creature|opponentBattlefield) @@ -111459,6 +112484,22 @@ power=1 toughness=1 [/card] [card] +name=Witch's Familiar +text= +mana={2}{B} +type=Creature +subtype=Zombie Minotaur +power=2 +toughness=3 +[/card] +[card] +name=Witch's Mist +auto={2}{b}{t}:destroy target(creature[damaged]) +text={2}{B}, {T}: Destroy target creature that was dealt damage this turn. +mana={2}{B} +type=Enchantment +[/card] +[card] name=Witchbane Orb abilities=playershroud auto=destroy all(mycurses) @@ -112588,6 +113629,17 @@ toughness=2 color=black [/card] [card] +name=Xathrid Slyblade +abilities=opponentshroud +auto={3}{B}:-name(lose Hexproof for First Strike/Deathtouch) transforms((,newability[-opponentshroud],newability[first strike],newability[deathtouch])) ueot +text=Hexproof. -- {3}{B}: Until end of turn, Xathrid Slyblade loses hexproof and gains first strike and deathtouch. +mana={2}{B} +type=Creature +subtype=Human Assassin +power=2 +toughness=1 +[/card] +[card] name=Xenagos, God of Revels abilities=indestructible auto=@each my combatbegins:name(haste and +x/+x) target(other creature|mybattlefield) transforms((,newability[haste],newability[power/power])) ueot diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index fc4e7db8c..9356af839 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -546,6 +546,16 @@ private: { intValue = target->controller()->life; } + else if (s == "startinglife") + { + intValue = target->controller()->initLife; + } + else if (s == "abundantlife")//current life is morethan or equal to starting life + { + intValue = 0; + if (target->controller()->life >= target->controller()->initLife) + intValue = 1; + } else if (s == "highestlifetotal") { intValue = target->controller()->life <= target->controller()->opponent()->life? target->controller()->opponent()->life:target->controller()->life; diff --git a/projects/mtg/include/Player.h b/projects/mtg/include/Player.h index 938f6d80a..800ef7db8 100644 --- a/projects/mtg/include/Player.h +++ b/projects/mtg/include/Player.h @@ -43,6 +43,7 @@ public: int extraTurn; int drawCounter; int epic; + int initLife; vector prowledTypes; vectorcurses; Player(GameObserver *observer, string deckFile, string deckFileSmall, MTGDeck * deck = NULL); diff --git a/projects/mtg/src/Rules.cpp b/projects/mtg/src/Rules.cpp index b6e5e4d56..adf7ff8a3 100644 --- a/projects/mtg/src/Rules.cpp +++ b/projects/mtg/src/Rules.cpp @@ -404,6 +404,7 @@ void Rules::initGame(GameObserver *g, bool currentPlayerSet) { Player * p = g->players[i]; p->life = initState.playerData[i].player->life; + p->initLife = initState.playerData[i].player->life; p->poisonCount = initState.playerData[i].player->poisonCount; p->damageCount = initState.playerData[i].player->damageCount; p->preventable = initState.playerData[i].player->preventable; From 28f758e421daad6a2eb051b06fcac795752a7d8a Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 21 Sep 2015 15:22:28 +0800 Subject: [PATCH 132/249] Removed Workarounds, Added support for Can't Gain life... spellmastery - can play as though had flash used in conjunction for alternative cost. nolifegain, nolifegainopponent - cannot gain life. --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 330 ++++++++++++++++++- projects/mtg/include/MTGDefinitions.h | 5 +- projects/mtg/src/MTGDefinitions.cpp | 5 +- projects/mtg/src/MTGRules.cpp | 2 +- projects/mtg/src/Player.cpp | 2 + 5 files changed, 328 insertions(+), 16 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index fe9ec137f..da2dfd09a 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -1662,10 +1662,11 @@ subtype=Human Soldier power=1 toughness=1 [/card] +#can target opponents creatures only [card] name=Akroan Conscriptor auto=@targeted(this) from(*[instant;sorcery;enchantment]|myhand,mygraveyard):name(gain control of target creature until end of turn) target(creature|opponentbattlefield) transforms((,newability[moveTo(opponentbattlefield)],newability[phaseaction[endofturn sourceinplay] moveTo(ownerbattlefield)],newability[untap],haste)) ueot -text=Heroic — Whenever you cast a spell that targets Akroan Conscriptor, gain control of another target creature until end of turn. Untap that creature. It gains haste until end of turn. (WORKAROUND Only can target opponents creatures) +text=Heroic — Whenever you cast a spell that targets Akroan Conscriptor, gain control of another target creature until end of turn. Untap that creature. It gains haste until end of turn. mana={4}{R} type=Creature subtype=Human Shaman @@ -25768,11 +25769,13 @@ type=Sorcery [/card] [card] name=Dragon Grip +other={2}{R} (cast anytime) +otherrestriction=type(creature[power>=4]|mybattlefield)~morethan~0 +abilities=spellmastery target=creature -autohand={2}{R}: activate castcard(normal) restriction{type(creature[power>=4]|mybattlefield)~morethan~0} auto=2/0 auto=first strike -text=Ferocious. -- If you control a creature with power 4 or greater, you may cast Dragon Grip as though it had flash. (You may cast it any time you could cast an instant.) (WORKAROUND USES HAND ABILITY CODE) -- Enchant creature. -- Enchanted creature gets +2/+0 and has first strike. +text=Ferocious. -- If you control a creature with power 4 or greater, you may cast Dragon Grip as though it had flash. (You may cast it any time you could cast an instant.) -- Enchant creature. -- Enchanted creature gets +2/+0 and has first strike. mana={2}{R} type=Enchantment subtype=Aura @@ -30392,11 +30395,10 @@ type=Legendary Enchantment ###The 2 cards above should stay together (Flip Card)### [card] name=Erebos, God of the Dead -abilities=indestructible -auto=@lifed(opponent):life:-thatmuch opponent +abilities=indestructible,nolifegainopponent auto={1}{B}{L:2}:Draw:1 controller auto=this(variable{type:manab}>4) transforms((Creature,setpower=5,settoughness=7)) -text=Indestructible -- As long as your devotion to black is less than five, Erebos isn't a creature. (Each {B} in the mana costs of permanents you control counts toward your devotion to black.) -- Whenver your opponent gains life, he loses that much (WORKAROUND). -- {1}{B}, Pay 2 life: Draw a card. +text=Indestructible -- As long as your devotion to black is less than five, Erebos isn't a creature. (Each {B} in the mana costs of permanents you control counts toward your devotion to black.) -- Your opponents can't gain life. -- {1}{B}, Pay 2 life: Draw a card. mana={3}{B} type=Legendary Enchantment subtype=God @@ -34774,8 +34776,8 @@ type=Land [card] name=Floodtide Serpent abilities=cantattack -auto={H(enchantment|myBattlefield)}:-cantattack myturnonly -text=Floodtide Serpent can't attack unless you return an enchantment you control to its owner's hand. (WORKAROUND cost can be payed anytime on your turn) (This cost is paid as attackers are declared.) +auto={H(enchantment|myBattlefield)}:-cantattack restriction{myattackersonly} +text=Floodtide Serpent can't attack unless you return an enchantment you control to its owner's hand. (This cost is paid as attackers are declared.) mana={4}{U} type=Creature subtype=Serpent @@ -58877,8 +58879,8 @@ toughness=4 name=Mardu Charm auto=choice name(4 Damage) damage:4 target(creature) auto=choice name(2 Warrior tokens) token(-386593)*2 -auto=choice name(Duress opponent) transforms((,newability[if type(*[-creature;-land]|opponenthand)~lessthan~1 then name(look) donothing notatarget(*|opponenthand) else reject notatarget(*[-creature;-land]|opponenthand)])) forever -text=Choose one: -- Mardu Charm deals 4 damage to target creature. -- Put two 1/1 white Warrior creature tokens onto the battlefield. They gain first strike until end of turn. -- Target opponent (WORKAROUND DOES NOT TARGET OPPONENT) reveals his or her hand. You choose a noncreature, nonland card from it. That player discards that card. +auto=choice name(Duress opponent) target(opponent) donothing && all(this) transforms((,newability[if type(*[-creature;-land]|targetedpersonshand)~lessthan~1 then name(look) donothing notatarget(*|targetedpersonshand) else reject notatarget(*[-creature;-land]|targetedpersonshand)])) oneshot +text=Choose one: -- Mardu Charm deals 4 damage to target creature. -- Put two 1/1 white Warrior creature tokens onto the battlefield. They gain first strike until end of turn. -- Target opponent reveals his or her hand. You choose a noncreature, nonland card from it. That player discards that card. mana={R}{W}{B} type=Instant [/card] @@ -84334,12 +84336,13 @@ subtype=Spirit power=2 toughness=1 [/card] +#creature deals secondary damage not Searing Blood [card] name=Searing Blood target=creature auto=damage:2 auto=transforms((newability[@movedto(this|graveyard) from(battlefield):damage:3 controller])) ueot -text=Searing Blood deals 2 damage to target creature. When that creature dies this turn, Searing Blood deals 3 damage to the creature's controller. (WORKAROUND creature deals secondary damage not Searing Blood) +text=Searing Blood deals 2 damage to target creature. When that creature dies this turn, Searing Blood deals 3 damage to the creature's controller. mana={R}{R} type=Instant [/card] @@ -87806,8 +87809,8 @@ type=Sorcery [card] name=Silent Sentinel abilities=flying -auto=@combat(attacking) source(this):may moveTo(myBattlefield) target(*[enchantment]|mygraveyard) && transforms((,newability[if cantargetcard(aura) then activate name(cast from graveyard) castcard(normal)])) oneshot -text=Flying -- Whenever Silent Sentinel attacks, you may return target enchantment card from your graveyard to the battlefield.(WORKAROUND uses a small workaround that recasts aura enchantments so that they can retarget as they should) +auto=@combat(attacking) source(this):may moveto(mybattlefield) target(enchantment|mygraveyard) and!( transforms((,newability[if cantargetcard(aura) then retarget target(creature|mybattlefield)])) )! +text=Flying -- Whenever Silent Sentinel attacks, you may return target enchantment card from your graveyard to the battlefield. mana={5}{W}{W} type=Creature subtype=Archon @@ -89415,6 +89418,16 @@ power=2 toughness=2 [/card] [card] +name=Skyraker Giant +abilities=reach +text=Reach (This creature can block creatures with flying.) +mana={2}{R}{R} +type=Creature +subtype=Giant +power=4 +toughness=3 +[/card] +[card] name=Skyreach Manta abilities=flying,sunburst auto=counter(1/1,sunburst) @@ -89660,6 +89673,16 @@ power=* toughness=* [/card] [card] +name=Skysnare Spider +abilities=vigilance, reach +text=Vigilance (Attacking doesn't cause this creature to tap.) -- Reach (This creature can block creatures with flying.) +mana={4}{G}{G} +type=Creature +subtype=Spider +power=6 +toughness=6 +[/card] +[card] name=Skyspear Cavalry abilities=flying,double strike text=Flying -- Double strike (This creature deals both first-strike and regular combat damage.) @@ -91073,6 +91096,17 @@ power=3 toughness=2 [/card] [card] +name=Somberwald Alpha +auto=lord(creature|mybattlefield) rampage(1/1,1) +auto={1}{G}:trample target(creature|mybattlefield) +text=Whenever a creature you control becomes blocked, it gets +1/+1 until end of turn. -- {1}{G}: Target creature you control gains trample until end of turn. (It can deal excess combat damage to defending player or planeswalker while attacking.) +mana={3}{G} +type=Creature +subtype=Wolf +power=3 +toughness=2 +[/card] +[card] name=Somberwald Dryad abilities=forestwalk text=Forestwalk @@ -91740,6 +91774,17 @@ mana={4}{G} type=Sorcery [/card] [card] +name=Soulblade Djinn +abilities=flying +auto=@movedTo(*[-creature]|mystack):all(creature|mybattlefield) 1/1 ueot +text=Flying -- Whenever you cast a noncreature spell, creatures you control get +1/+1 until end of turn. +mana={3}{U}{U} +type=Creature +subtype=Djinn +power=4 +toughness=3 +[/card] +[card] name=Soulblast target=creature,player alias=130369 @@ -94019,6 +94064,17 @@ power=5 toughness=5 [/card] [card] +name=Stalwart Aven +abilities=flying +auto=@combatdamaged(player) from(this):this(cantargetcard(*[-renown]) && becomes(renown) forever && counter(1/1) +text=Flying (This creature can't be blocked except by creatures with flying or reach.) -- Renown 1 (When this creature deals combat damage to a player, if it isn't renowned, put a +1/+1 counter on it and it becomes renowned.) +mana={2}{W} +type=Creature +subtype=Bird Soldier +power=1 +toughness=3 +[/card] +[card] name=Stalwart Shield-Bearers abilities=defender auto=lord(creature[defender]|myBattlefield) 0/2 other @@ -94177,6 +94233,28 @@ mana={4}{R} type=Instant [/card] [card] +name=Starfield of Nyx +auto=@each my upkeep:may moveto(mybattlefield) target(enchantment|mygraveyard) and!( transforms((,newability[if cantargetcard(aura) then retarget target(creature|mybattlefield)])) )! +auto=aslongas(enchantment|mybattlefield) lord(other enchantment[-aura;manacost=1]) transforms((,newability[becomes(Creature)],setpower=1,settoughness=1)) >4 +auto=aslongas(enchantment|mybattlefield) lord(other enchantment[-aura;manacost=2]) transforms((,newability[becomes(Creature)],setpower=2,settoughness=2)) >4 +auto=aslongas(enchantment|mybattlefield) lord(other enchantment[-aura;manacost=3]) transforms((,newability[becomes(Creature)],setpower=3,settoughness=3)) >4 +auto=aslongas(enchantment|mybattlefield) lord(other enchantment[-aura;manacost=4]) transforms((,newability[becomes(Creature)],setpower=4,settoughness=4)) >4 +auto=aslongas(enchantment|mybattlefield) lord(other enchantment[-aura;manacost=5]) transforms((,newability[becomes(Creature)],setpower=5,settoughness=5)) >4 +auto=aslongas(enchantment|mybattlefield) lord(other enchantment[-aura;manacost=6]) transforms((,newability[becomes(Creature)],setpower=6,settoughness=6)) >4 +auto=aslongas(enchantment|mybattlefield) lord(other enchantment[-aura;manacost=7]) transforms((,newability[becomes(Creature)],setpower=7,settoughness=7)) >4 +auto=aslongas(enchantment|mybattlefield) lord(other enchantment[-aura;manacost=8]) transforms((,newability[becomes(Creature)],setpower=8,settoughness=8)) >4 +auto=aslongas(enchantment|mybattlefield) lord(other enchantment[-aura;manacost=9]) transforms((,newability[becomes(Creature)],setpower=9,settoughness=9)) >4 +auto=aslongas(enchantment|mybattlefield) lord(other enchantment[-aura;manacost=10]) transforms((,newability[becomes(Creature)],setpower=10,settoughness=10)) >4 +auto=aslongas(enchantment|mybattlefield) lord(other enchantment[-aura;manacost=11]) transforms((,newability[becomes(Creature)],setpower=11,settoughness=11)) >4 +auto=aslongas(enchantment|mybattlefield) lord(other enchantment[-aura;manacost=12]) transforms((,newability[becomes(Creature)],setpower=12,settoughness=12)) >4 +auto=aslongas(enchantment|mybattlefield) lord(other enchantment[-aura;manacost=13]) transforms((,newability[becomes(Creature)],setpower=13,settoughness=13)) >4 +auto=aslongas(enchantment|mybattlefield) lord(other enchantment[-aura;manacost=14]) transforms((,newability[becomes(Creature)],setpower=14,settoughness=14)) >4 +auto=aslongas(enchantment|mybattlefield) lord(other enchantment[-aura;manacost=15]) transforms((,newability[becomes(Creature)],setpower=15,settoughness=15)) >4 +text=At the beginning of your upkeep, you may return target enchantment card from your graveyard to the battlefield. As long as you control five or more enchantments, each other non-Aura enchantment you control is a creature in addition to its other types and has base power and base toughness each equal to its converted mana cost. +mana={4}{W} +type=Enchantment +[/card] +[card] name=Starke of Rath auto={T}:destroy target(artifact,creature) && moveTo(opponentbattlefield) all(this) text={T}: Destroy target artifact or creature. That permanent's controller gains control of Starke of Rath. (This effect lasts indefinitely.) @@ -96043,6 +96121,16 @@ text=Subterranean Hangar enters the battlefield tapped. -- {T}: Put a storage co type=Land [/card] [card] +name=Subterranean Scout +auto=target(creature[power<=2]|battlefield) unblockable ueot +text=When Subterranean Scout enters the battlefield, target creature with power 2 or less can't be blocked this turn. +mana={1}{R} +type=Creature +subtype=Goblin Scout +power=2 +toughness=1 +[/card] +[card] name=Subterranean Shambler auto=damage:1 all(creature[-flying]) && damage:1 all(player) auto=@movedTo(this|nonbattlezone) from(battlefield):damage:1 all(creature[-flying]) && damage:1 all(player) @@ -96765,6 +96853,17 @@ power=2 toughness=4 [/card] [card] +name=Suppression Bonds +target=*[-land]|battlefield +auto=teach(*) cantattack +auto=teach(*) cantblock +auto=teach(*) noactivatedability +text=Enchant nonland permanent -- Enchanted permanent can't attack or block, and its activated abilities can't be activated. +mana={3}{W} +type=Enchantment +subtype=Aura +[/card] +[card] name=Supreme Exemplar abilities=flying auto=aslongas(other elemental|mybattlefield) choice notatarget(other elemental|mybattlefield) (blink)forsrc oneshot @@ -97217,6 +97316,17 @@ mana={1}{W} type=Instant [/card] [card] +name=Swift Reckoning +abilities=spellmastery +other={1}{W} name(Spell Mastery) +otherrestriction=type(*[instant;sorcery]|mygraveyard)~morethan~1 +target=creature[tapped]|battlefield +auto=destroy +text=Spell mastery — If there are two or more instant and/or sorcery cards in your graveyard, you may cast Swift Reckoning as though it had flash. (You may cast it any time you could cast an instant.) Destroy target tapped creature. +mana={1}{W} +type=Sorcery +[/card] +[card] name=Swift Silence auto=foreach(other *|stack) draw:1 auto=fizzle all(other *|stack) @@ -97373,6 +97483,16 @@ type=Artifact subtype=Equipment [/card] [card] +name=Sword of the Animist +auto={2}:equip +auto=teach(creature) 1/1 +auto=@combat(attacking) source(mytgt):may notatarget(land[basic]|mylibrary) moveto(mybattlefield) and!(tap)! +text=Equipped creature gets +1/+1. -- Whenever equipped creature attacks, you may search your library for a basic land card, put it onto the battlefield tapped, then shuffle your library. -- Equip {2} +mana={2} +type=Legendary Artifact +subtype=Equipment +[/card] +[card] name=Sword of the Chosen auto={T}:2/2 target(creature[legendary]) text={T}: Target legendary creature gets +2/+2 until end of turn. @@ -100163,6 +100283,17 @@ power=5 toughness=5 [/card] [card] +name=Thopter Engineer +auto=lord(creature[artifact]|mybattlefield) haste +auto=choice token(Thopter,Artifact Creature Thopter,1/1,flying) controller +text=When Thopter Engineer enters the battlefield, put a 1/1 colorless Thopter artifact creature token with flying onto the battlefield. -- Artifact creatures you control have haste. (They can attack and {T} as soon as they come under your control.) +mana={2}{R} +type=Creature +subtype=Human Artificer +power=1 +toughness=3 +[/card] +[card] name=Thopter Foundry auto={1}{S(artifact[-token]|myinplay)}:token(Thopter,artifact creature thopter,1/1,blue flying) && life:1 text={1}, Sacrifice a nontoken artifact: Put a 1/1 blue Thopter artifact creature token with flying onto the battlefield. You gain 1 life. @@ -100222,6 +100353,16 @@ type=Tribal Artifact subtype=Shaman Equipment [/card] [card] +name=Thornbow Archer +auto=@combat(attacking) source(this) restriction{type(elf|opponentbattlefield)~lessthan~1}:life:-1 opponent +text=Whenever Thornbow Archer attacks, each opponent who doesn't control an Elf loses 1 life. +mana={B} +type=Creature +subtype=Elf Archer +power=1 +toughness=2 +[/card] +[card] name=Thorncaster Sliver auto=lord(sliver|mybattlefield) transforms((,newability[@combat(attacking) source(this):damage:1 target(creature,player)])) text=Sliver creatures you control have "Whenever this creature attacks, it deals 1 damage to target creature or player." @@ -100988,6 +101129,17 @@ mana={2}{R} type=Instant [/card] [card] +name=Thunderclap Wyvern +abilities=flash, flying +auto=lord(other creature[flying]|mybattlefield) 1/1 +text=Flash (You may cast this spell any time you could cast an instant.) -- Flying -- Other creatures you control with flying get +1/+1. +mana={2}{W}{U} +type=Creature +subtype=Drake +power=2 +toughness=3 +[/card] +[card] name=Thundercloud Elemental abilities=flying auto={3}{U}:tap all(creature[toughness<=2]) @@ -101963,6 +102115,17 @@ power=2 toughness=2 [/card] [card] +name=Topan Freeblade +abilities=vigilance +auto=@combatdamaged(player) from(this):this(cantargetcard(*[-renown]) && becomes(renown) forever && counter(1/1) +text=Vigilance (Attacking doesn't cause this creature to tap.) -- Renown 1 (When this creature deals combat damage to a player, if it isn't renowned, put a +1/+1 counter on it and it becomes renowned.) +mana={1}{W} +type=Creature +subtype=Human Soldier +power=2 +toughness=2 +[/card] +[card] name=Topple target=creature[power=power:highest:creature:battlefield] auto=moveTo(exile) @@ -104762,6 +104925,16 @@ power=2 toughness=3 [/card] [card] +name=Undead Servant +auto=choice foreach(Undead Servant|mygraveyard) token(Zombie,Creature Zombie,2/2,black) controller +text=When Undead Servant enters the battlefield, put a 2/2 black Zombie creature token onto the battlefield for each card named Undead Servant in your graveyard. +mana={3}{B} +type=Creature +subtype=Zombie +power=3 +toughness=2 +[/card] +[card] name=Undead Slayer auto={W}{T}:moveTo(Exile) target(Skeleton,Vampire,Zombie) text={W}, {T}: Exile target Skeleton, Vampire, or Zombie. @@ -104794,6 +104967,17 @@ power=1 toughness=1 [/card] [card] +name=Undercity Troll +auto=@combatdamaged(player) from(this):this(cantargetcard(*[-renown]) && becomes(renown) forever && counter(1/1) +auto={2}{G}:regenerate +text=Renown 1 (When this creature deals combat damage to a player, if it isn't renowned, put a +1/+1 counter on it and it becomes renowned.) -- {2}{G}: Regenerate Undercity Troll. (The next time this creature would be destroyed this turn, it isn't. Instead tap it, remove all damage from it, and remove it from combat.) +mana={1}{G} +type=Creature +subtype=Troll +power=2 +toughness=2 +[/card] +[card] name=Underground River auto={T}:Add{1} auto={T}:Add{U} && Damage:1 controller @@ -105003,6 +105187,15 @@ text={T}: Add {1} to your mana pool. -- {B}, {T}: Put target Zombie card from yo type=Land [/card] [card] +name=Unholy Hunger +target=creature +auto=destroy +auto=if type(*[instant;sorcery]|mygraveyard)~morethan~1 then life:2 srccontroller +text=Destroy target creature. -- Spell mastery — If there are two or more instant and/or sorcery cards in your graveyard, you gain 2 life. +mana={3}{B}{B} +type=Instant +[/card] +[card] name=Unholy Strength target=creature auto=2/1 @@ -105893,6 +106086,13 @@ power=2 toughness=2 [/card] [card] +name=Valor in Akros +auto=@movedto(creature|mybattlefield):all(creature|mybattlefield) 1/1 ueot +text=Whenever a creature enters the battlefield under your control, creatures you control get +1/+1 until end of turn. +mana={3}{W} +type=Enchantment +[/card] +[card] name=Valorous Charge auto=lord(creature[white]) 2/0 text=White creatures get +2/+0 until end of turn. @@ -107121,6 +107321,15 @@ mana={W} type=Instant [/card] [card] +name=Veteran's Sidearm +auto={1}:equip +auto=teach(creature) 1/1 +text=Equipped creature gets +1/+1. -- Equip {1} ({1}: Attach to target creature you control. Equip only as a sorcery.) +mana={2} +type=Artifact +subtype=Equipment +[/card] +[card] name=Veteran's Voice target=creature|mybattlefield auto=teach(creature) {T}:target(other creature) 2/1 ueot @@ -107735,6 +107944,13 @@ power=1 toughness=3 [/card] [card] +name=Vine Snare +auto=preventAllCombatDamage from(creature[power<=4]) ueot +text=Prevent all combat damage that would be dealt this turn by creatures with power 4 or less. +mana={2}{G} +type=Instant +[/card] +[card] name=Vine Trellis abilities=defender auto={T}:Add{G} @@ -108650,6 +108866,16 @@ type=Land subtype=Island Mountain [/card] [card] +name=Volcanic Rambler +auto={2}{R}:damage:1 target(player) +text={2}{R}: Volcanic Rambler deals 1 damage to target player. +mana={5}{R} +type=Creature +subtype=Elemental +power=6 +toughness=4 +[/card] +[card] name=Volcanic Rush auto=all(creature[attacking]) 2/0 ueot auto=all(creature[attacking]) trample ueot @@ -108971,6 +109197,18 @@ toughness=1 color=black [/card] [card] +name=Vryn Wingmare +abilities=flying +auto=lord(*[-creature]|myhand) altercost(colorless,+1) +auto=lord(*[-creature]|opponenthand) altercost(colorless, +1) +text=Flying -- Noncreature spells cost {1} more to cast. +mana={2}{W} +type=Creature +subtype=Pegasus +power=2 +toughness=1 +[/card] +[card] name=Vug Lizard abilities=mountainwalk auto=upcost[{1}{R}{R};next upkeep] sacrifice @@ -110036,6 +110274,13 @@ mana={2}{R}{W} type=Instant [/card] [card] +name=War Horn +auto=lord(creature[attacking]|mybattlefield) 1/0 +text=Attacking creatures you control get +1/+0. +mana={3} +type=Artifact +[/card] +[card] name=War Mammoth abilities=trample text=Trample @@ -110046,6 +110291,17 @@ power=3 toughness=3 [/card] [card] +name=War Oracle +abilities=lifelink +auto=@combatdamaged(player) from(this):this(cantargetcard(*[-renown]) && becomes(renown) forever && counter(1/1) +text=Lifelink (Damage dealt by this creature also causes you to gain that much life.) -- Renown 1 (When this creature deals combat damage to a player, if it isn't renowned, put a +1/+1 counter on it and it becomes renowned.) +mana={2}{W}{W} +type=Creature +subtype=Human Cleric +power=3 +toughness=3 +[/card] +[card] name=War Priest of Thune auto=may destroy target(enchantment) text=When Warpriest of Thune enters the battlefield, you may destroy target enchantment. @@ -111241,6 +111497,17 @@ power=3 toughness=3 [/card] [card] +name=Whirler Rogue +auto=choice token(Thopter,Artifact Creature Thopter,1/1,flying)*2 controller +auto={T(artifact[-tapped]|mybattlefield)}{T(artifact[-tapped]|mybattlefield)}:target(creature) unblockable ueot +text=When Whirler Rogue enters the battlefield, put two 1/1 colorless Thopter artifact creature tokens with flying onto the battlefield. -- Tap two untapped artifacts you control: Target creature can't be blocked this turn. +mana={2}{U}{U} +type=Creature +subtype=Human Rogue Artificer +power=2 +toughness=2 +[/card] +[card] name=Whirling Catapult auto={2}{l2e}{l2e}:damage:1 all(creature[flying]) && damage:1 all(player) text={2}, Exile the top two cards of your library: Whirling Catapult deals 1 damage to each creature with flying and each player. @@ -111649,6 +111916,16 @@ mana={2}{G} type=Instant [/card] [card] +name=Wild Instincts +target=creature|mybattlefield +auto=2/2 ueot +auto=transforms((,newability[target(creature|opponentbattlefield) dynamicability])) ueot +restriction=type(creature|opponentbattlefield)~morethan~0 +text=Target creature you control gets +2/+2 until end of turn. It fights target creature an opponent controls. (Each deals damage equal to its power to the other.) +mana={3}{G} +type=Sorcery +[/card] +[card] name=Wild Jhovall mana={3}{R} type=Creature @@ -112899,6 +113176,16 @@ type=Artifact subtype=Equipment [/card] [card] +name=Woodland Bellower +auto=may moveto(mybattlefield) notatarget(creature[green;manacost<=3;-legendary]|mylibrary) +text=When Woodland Bellower enters the battlefield, you may search your library for a nonlegendary green creature card with converted mana cost 3 or less, put it onto the battlefield, then shuffle your library. +mana={4}{G}{G} +type=Creature +subtype=Beast +power=6 +toughness=5 +[/card] +[card] name=Woodland Cemetery auto=aslongas(swamp,forest|myBattlefield) tap <1 oneshot auto={T}:Add{B} @@ -114232,6 +114519,23 @@ power=3 toughness=3 [/card] [card] +name=Zendikar Incarnate +auto=type:land:mybattlefield/4 cdaactive +text=Zendikar Incarnate's power is equal to the number of lands you control. +mana={2}{R}{G} +type=Creature +subtype=Elemental +power=* +toughness=4 +[/card] +[card] +name=Zendikar's Roil +auto=@movedto(land|mybattlefield):token(Elemental,Creature Elemental,2/2,green) controller +text=Whenever a land enters the battlefield under your control, put a 2/2 green Elemental creature token onto the battlefield. +mana={3}{G}{G} +type=Enchantment +[/card] +[card] name=Zephid abilities=flying,shroud text=Flying; shroud (This permanent can't be the target of spells or abilities.) diff --git a/projects/mtg/include/MTGDefinitions.h b/projects/mtg/include/MTGDefinitions.h index 867a315d9..a04139580 100644 --- a/projects/mtg/include/MTGDefinitions.h +++ b/projects/mtg/include/MTGDefinitions.h @@ -226,7 +226,10 @@ class Constants SHUFFLELIBRARYDEATH = 108, OFFERING = 109, EVADEBIGGER = 110, - NB_BASIC_ABILITIES = 111, + SPELLMASTERY = 111, + NOLIFEGAIN = 112, + NOLIFEGAINOPPONENT = 113, + NB_BASIC_ABILITIES = 114, RARITY_S = 'S', //Special Rarity diff --git a/projects/mtg/src/MTGDefinitions.cpp b/projects/mtg/src/MTGDefinitions.cpp index 77b162f5e..1b7d602d2 100644 --- a/projects/mtg/src/MTGDefinitions.cpp +++ b/projects/mtg/src/MTGDefinitions.cpp @@ -139,7 +139,10 @@ const char* Constants::MTGBasicAbilities[] = { "librarydeath", "shufflelibrarydeath", "offering", - "evadebigger" + "evadebigger", + "spellmastery", + "nolifegain", + "nolifegainopponent" }; map Constants::MTGBasicAbilitiesMap; diff --git a/projects/mtg/src/MTGRules.cpp b/projects/mtg/src/MTGRules.cpp index c85bff344..b58090b21 100644 --- a/projects/mtg/src/MTGRules.cpp +++ b/projects/mtg/src/MTGRules.cpp @@ -651,7 +651,7 @@ int MTGAlternativeCostRule::isReactingToClick(MTGCardInstance * card, ManaCost * ) return 1; } - else if ((card->hasType(Subtypes::TYPE_INSTANT)) || card->has(Constants::FLASH) || card->has(Constants::OFFERING) + else if ((card->hasType(Subtypes::TYPE_INSTANT)) || card->has(Constants::FLASH) || card->has(Constants::SPELLMASTERY) || card->has(Constants::OFFERING) || (player == card->controller() && !game->isInterrupting && (game->getCurrentGamePhase() == MTG_PHASE_FIRSTMAIN || game->getCurrentGamePhase() == MTG_PHASE_SECONDMAIN)) diff --git a/projects/mtg/src/Player.cpp b/projects/mtg/src/Player.cpp index c55d7b9c3..52d0e311b 100644 --- a/projects/mtg/src/Player.cpp +++ b/projects/mtg/src/Player.cpp @@ -147,6 +147,8 @@ int Player::gainOrLoseLife(int value) { if (!value) return 0; //Don't do anything if there's no actual life change + if (value>0 && (opponent()->game->battlefield->hasAbility(Constants::NOLIFEGAINOPPONENT)||game->battlefield->hasAbility(Constants::NOLIFEGAIN)))//nolifegain + return 0; thatmuch = abs(value); //the value that much is a variable to be used with triggered abilities. //ie:when ever you gain life, draw that many cards. when used in a trigger draw:thatmuch, will return the value From f757dcab744d690213495e5c28badd3f1d48dd2e Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 21 Sep 2015 21:25:41 +0800 Subject: [PATCH 133/249] update invigorate and wall of shards if players can't gain life, you cannot pay costs that have an opponent gain life also... --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index da2dfd09a..fa91f95e1 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -48642,7 +48642,7 @@ name=Invigorate target=creature auto=4/4 auto=alternative life:3 opponent -otherrestriction=type(forest|mybattlefield)~morethan~0 +otherrestriction=type(forest|mybattlefield)~morethan~0,type(*[nolifegain]|opponentbattlefield)~lessthan~1,type(*[nolifegainopponent]|mybattlefield)~lessthan~1 other={0} name(Have Opponent Gain 3 Life) text=If you control a Forest, you may have an opponent gain 3 life rather than pay Invigorate's mana cost. -- Target creature gets +4/+4 until end of turn. mana={2}{G} @@ -109913,7 +109913,10 @@ toughness=5 [card] name=Wall of Shards abilities=defender,flying -auto=@each my upkeep:counter(0/0,1,Age) && all(this) transforms((,newability[choice sacrifice],newability[choice life:counter{0%0.1.Age} opponent])) +auto=@each my upkeep restriction{type(*[nolifegain]|mybattlefield)~lessthan~1,type(*[nolifegainopponent]|opponentbattlefield)~lessthan~1}:counter(0/0,1,Age) && all(this) transforms((,newability[choice sacrifice],newability[choice life:counter{0%0.1.Age} opponent])) +auto=@each my upkeep restriction{type(*[nolifegain]|opponentbattlefield)~morethan~0,type(*[nolifegainopponent]|mybattlefield)~lessthan~1}:sacrifice +auto=@each my upkeep restriction{type(*[nolifegain]|opponentbattlefield)~lessthan~1,type(*[nolifegainopponent]|mybattlefield)~morethan~0}:sacrifice +auto=@each my upkeep restriction{type(*[nolifegain]|opponentbattlefield)~morethan~0,type(*[nolifegainopponent]|mybattlefield)~morethan~0}:sacrifice text=Defender, flying -- Cumulative upkeep - An opponent gains 1 life. (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) mana={1}{W} type=Snow Creature From 0abd368ccc91f175cd249c4ef9d07d28d460a80f Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 21 Sep 2015 21:38:23 +0800 Subject: [PATCH 134/249] I think Akroan Conscriptor is supported --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index fa91f95e1..228763337 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -1662,10 +1662,9 @@ subtype=Human Soldier power=1 toughness=1 [/card] -#can target opponents creatures only [card] name=Akroan Conscriptor -auto=@targeted(this) from(*[instant;sorcery;enchantment]|myhand,mygraveyard):name(gain control of target creature until end of turn) target(creature|opponentbattlefield) transforms((,newability[moveTo(opponentbattlefield)],newability[phaseaction[endofturn sourceinplay] moveTo(ownerbattlefield)],newability[untap],haste)) ueot +auto=@targeted(this) from(*[instant;sorcery;enchantment]|myhand,mygraveyard):name(gain control of target creature until end of turn) target(other creature|battlefield) moveTo(mybattlefield) and!( transforms((,newability[phaseaction[endofturn sourceinplay] moveTo(ownerbattlefield)],newability[untap],haste)) ueot )! text=Heroic — Whenever you cast a spell that targets Akroan Conscriptor, gain control of another target creature until end of turn. Untap that creature. It gains haste until end of turn. mana={4}{R} type=Creature From 227a262e0149a8a532064971636eae6c44133682 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Tue, 22 Sep 2015 06:53:55 +0800 Subject: [PATCH 135/249] added ORI cards :) revised the keyword: myname -> returns the number for each instance of the card name you control. allmyname -> returns the number for each instance of the card name in play. --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 1169 +++++++++++++++++- projects/mtg/include/AllAbilities.h | 17 +- 2 files changed, 1151 insertions(+), 35 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 228763337..b56b44c5f 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -794,6 +794,17 @@ mana={2}{R} type=Sorcery [/card] [card] +name=Acolyte of the Inferno +auto=this(cantargetcard(*[-renown]) transforms((,newability[@combatdamaged(player) from(this):counter(1/1) && becomes(renown) forever])) +auto=@combat(blocked) source(this) from(creature):all(trigger[from]) damage:2 +text=Renown 1 (When this creature deals combat damage to a player, if it isn't renowned, put a +1/+1 counter on it and it becomes renowned.) -- Whenever Acolyte of the Inferno becomes blocked by a creature, it deals 2 damage to that creature. +mana={2}{R} +type=Creature +subtype=Human Monk +power=3 +toughness=1 +[/card] +[card] name=Acolyte of Xathrid auto={1}{B}{T}:life:-1 target(player) text={1}{B}, {T}: Target player loses 1 life. @@ -1705,6 +1716,16 @@ power=0 toughness=4 [/card] [card] +name=Akroan Jailer +auto={2}{W}{T}:target(creature) tap +text=2W, Tap: Tap target creature. +mana={W} +type=Creature +subtype=Human Soldier +power=1 +toughness=1 +[/card] +[card] name=Akroan Line Breaker auto=@targeted(this) from(*[instant;sorcery;enchantment]|myhand,mygraveyard):2/0 ueot auto=@targeted(this) from(*[instant;sorcery;enchantment]|myhand,mygraveyard):intimidate ueot @@ -1737,6 +1758,17 @@ power=3 toughness=3 [/card] [card] +name=Akroan Sergeant +abilities=first strike +auto=this(cantargetcard(*[-renown]) transforms((,newability[@combatdamaged(player) from(this):counter(1/1) && becomes(renown) forever])) +text=First strike (This creature deals combat damage before creatures without first strike.) -- Renown 1 (When this creature deals combat damage to a player, if it isn't renowned, put a +1/+1 counter on it and it becomes renowned.) +mana={2}{R} +type=Creature +subtype=Human Soldier +power=2 +toughness=2 +[/card] +[card] name=Akroan Skyguard abilities=flying auto=@targeted(this) from(*[instant;sorcery;enchantment]|myhand,mygraveyard):counter(1/1,1) @@ -2022,6 +2054,14 @@ text={T}: Add {1} to your mana pool. -- {G}{U}, {T}: You may cast nonland cards type=Land [/card] [card] +name=Alchemist's Vial +auto=choice draw:1 controller +auto={1}{T}{S}:target(creature) transforms((,newability[cantattack ueot],newability[cantblock ueot])) ueot +text=When Alchemist's Vial enters the battlefield, draw a card. -- 1, Tap, Sacrifice Alchemist's Vial: Target creature can't attack or block this turn. +mana={2} +type=Artifact +[/card] +[card] name=Alchor's Tomb auto={2}{T}:activatechooseacolor target(*|mybattlefield) becomes(,chosencolor) activatechooseend text={2}, {T}: Target permanent you control becomes the color of your choice. (This effect lasts indefinitely.) @@ -2506,6 +2546,16 @@ power=3 toughness=2 [/card] [card] +name=Ampryn Tactician +auto=choice all(creature|mybattlefield) 1/1 ueot +text=When Ampryn Tactician enters the battlefield, creatures you control get +1/+1 until end of turn. +mana={2}{W}{W} +type=Creature +subtype=Human Soldier +power=3 +toughness=3 +[/card] +[card] name=Amoeboid Changeling abilities=changeling auto={T}:transforms((allsubtypes)) target(creature) ueot @@ -3440,6 +3490,16 @@ mana={W} type=Instant [/card] [card] +name=Anointer of Champions +auto={T}:target(creature[attacking]) 1/1 ueot +text=Tap: Target attacking creature gets +1/+1 until end of turn. +mana={W} +type=Creature +subtype=Human Cleric +power=1 +toughness=1 +[/card] +[card] name=Ant Queen auto={1}{G}:token(Insect,Creature Insect, 1/1,green) text={1}{G}: Put a 1/1 green Insect creature token onto the battlefield. @@ -4203,6 +4263,18 @@ power=3 toughness=4 [/card] [card] +name=Archangel of Tithes +abilities=flying +auto=this(untapped) lord(creature|opponentbattlefield) transforms((,newability[@each mycombatbegins:pay[[{1}]] name(pay 1 mana) donothing?cantattack all(this)])) +auto=@combat(attacking) source(this):all(creature|opponentbattlefield) transforms((,newability[pay[[{1}]] name(pay 1 mana) donothing?cantblock all(this)])) +text=Flying -- As long as Archangel of Tithes is untapped, creatures can't attack you or a planeswalker you control unless their controller pays {1} for each of those creatures. -- As long as Archangel of Tithes is attacking, creatures can't block unless their controller pays {1} for each of those creatures. +mana={1}{W}{W}{W} +type=Creature +subtype=Angel +power=3 +toughness=5 +[/card] +[card] name=Archangel's Light auto=life:twicetype:*:mygraveyard auto=moveto(myLibrary) all(*|myGraveyard) && shuffle @@ -5061,6 +5133,14 @@ type=Enchantment subtype=Aura [/card] [card] +name=Artificer's Epiphany +auto=draw:2 +auto=if type(artifact|mybattlefield)~lessthan~1 then reject notatarget(*|myhand) +text=Draw two cards. If you control no artifacts, discard a card. +mana={2}{U} +type=Instant +[/card] +[card] name=Artificer's Hex target=equipment auto=@each my upkeep:transforms((,newability[destroy all(parents)])) ueot @@ -5389,6 +5469,17 @@ mana={1}{B}{B} type=Sorcery [/card] [card] +name=Aspiring Aeronaut +abilities=flying +auto=choice token(Thopter,Artifact Creature Thopter,1/1,flying) +text=Flying (This creature can't be blocked except by creatures with flying or reach.) -- When Aspiring Aeronaut enters the battlefield, put a 1/1 colorless Thopter artifact creature token with flying onto the battlefield. +mana={3}{U} +type=Creature +subtype=Human Artificer +power=1 +toughness=2 +[/card] +[card] name=Assassinate target=creature[tapped] auto=destroy @@ -6147,6 +6238,18 @@ mana={1} type=Artifact [/card] [card] +name=Avaricious Dragon +abilities=flying +auto=@each my draw:draw:1 controller +auto=@each my cleanup:reject all(*|myhand) +text=Flying -- At the beginning of your draw step, draw an additional card. -- At the beginning of your end step, discard your hand. +mana={2}{R}{R} +type=Creature +subtype=Dragon +power=4 +toughness=4 +[/card] +[card] name=Aven Archer abilities=flying auto={2}{W}{T}:damage:2 target(creature[attacking;blocking]) @@ -6169,6 +6272,17 @@ power=2 toughness=2 [/card] [card] +name=Aven Battle Priest +abilities=flying +auto=choice life:3 controller +text=Flying (This creature can't be blocked except by creatures with flying or reach.) -- When Aven Battle Priest enters the battlefield, you gain 3 life. +mana={5}{W} +type=Creature +subtype=Bird Cleric +power=3 +toughness=3 +[/card] +[card] name=Aven Brigadier abilities=flying auto=lord(other soldier) 1/1 @@ -9423,6 +9537,16 @@ power=2 toughness=2 [/card] [card] +name=Blazing Hellhound +auto={1}{S(other creature|mybattlefield)}:damage:1 target(creature,player) +text={1}, Sacrifice another creature: Blazing Hellhound deals 1 damage to target creature or player. +mana={2}{B}{R} +type=Creature +subtype=Elemental Hound +power=4 +toughness=3 +[/card] +[card] name=Blazing Shoal other={E(other *[red]|myhand)} name(Exile Red Card from Hand) target=creature @@ -9472,6 +9596,17 @@ mana={1}{W} type=Instant [/card] [card] +name=Blessed Spirits +abilities=flying +auto=@movedto(enchantment|mystack):choice counter(1/1) +text=Flying -- Whenever you cast an enchantment spell, put a +1/+1 counter on Blessed Spirits. +mana={2}{W} +type=Creature +subtype=Spirit +power=2 +toughness=2 +[/card] +[card] name=Blessed Wind target=player auto=lifeset:20 @@ -10202,6 +10337,17 @@ power=3 toughness=3 [/card] [card] +name=Blood-Cursed Knight +auto=aslongas(enchantment|mybattlefield) 1/1 +auto=aslongas(enchantment|mybattlefield) lifelink +text=As long as you control an enchantment, Blood-Cursed Knight gets +1/+1 and has lifelink. (Damage dealt by this creature also causes you to gain that much life.) +mana={1}{W}{B} +type=Creature +subtype=Vampire Knight +power=3 +toughness=2 +[/card] +[card] name=Bloodbond March auto=lord(creature) transforms((,newability[if casted(this) then all(*[share!name!]|targetcontrollergraveyard) moveto(battlefield)])) forever text=Whenever a player casts a creature spell, each player returns all cards with the same name as that spell from his or her graveyard to the battlefield. @@ -11265,6 +11411,16 @@ power=0 toughness=1 [/card] [card] +name=Bonded Construct +auto=@combat(attacking) source(this) restriction{type(creature[attacking]|myBattlefield)~equalto~1}:all(this) removefromcombat && untap +text=Bonded Construct can't attack alone. +mana={1} +type=Artifact Creature +subtype=Construct +power=2 +toughness=1 +[/card] +[card] name=Bonded Fetch abilities=defender,haste auto={T}:draw:1 && transforms((,newability[target(*|myhand) reject])) forever @@ -11796,6 +11952,18 @@ type=Tribal Enchantment subtype=Rebel Aura [/card] [card] +name=Bounding Krasis +abilities=flash +auto=may target(creature) tap +auto=may target(creature) untap +text=Flash (You may cast this spell any time you could cast an instant.) -- When Bounding Krasis enters the battlefield, you may tap or untap target creature. +mana={1}{G}{U} +type=Creature +subtype=Fish Lizard +power=3 +toughness=3 +[/card] +[card] name=Boundless Realms auto=moveTo(mybattlefield) and!(tap)! notatarget(land|mylibrary) text=Search your library for up to X basic land cards, where X is the number of lands you control, and put them onto the battlefield tapped. Then shuffle your library. @@ -13679,6 +13847,17 @@ mana={G}{W} type=Sorcery [/card] [card] +name=Call of the Full Moon +target=creature +auto=teach(creature) 3/2 +auto=teach(creature) trample +auto=@each upkeep restriction{lastturn(*|stack)~morethan~1}:sacrifice all(this) +text=Enchant creature -- Enchanted creature gets +3/+2 and has trample. (It can deal excess combat damage to defending player or planeswalker while attacking.) -- At the beginning of each upkeep, if a player cast two or more spells last turn, sacrifice Call of the Full Moon. +mana={1}{R} +type=Enchantment +subtype=Aura +[/card] +[card] name=Call of the Herd auto=token(Elephant,creature elephant, 3/3,green) flashback={3}{G} @@ -14736,6 +14915,16 @@ mana={5} type=Artifact [/card] [card] +name=Caustic Caterpillar +auto={1}{G}{S}:target(artifact,enchantment) destroy +text={1}{G}, Sacrifice Caustic Caterpillar: Destroy target artifact or enchantment. +mana={G} +type=Creature +subtype=Insect +power=1 +toughness=1 +[/card] +[card] name=Caustic Crawler auto=@movedTo(land|myBattlefield):may -1/-1 target(creature) ueot text=Landfall - Whenever a land enters the battlefield under your control, you may have target creature get -1/-1 until end of turn. @@ -15669,6 +15858,15 @@ mana={4}{R} type=Instant [/card] [card] +name=Chandra's Ignition +target=creature|mybattlefield +auto=transforms((,newability[all(other creature) dynamicability])) forever +auto=transforms((,newability[all(opponent) dynamicability])) forever +text=Target creature you control deals damage equal to its power to each other creature and each opponent. +mana={3}{R}{R} +type=Sorcery +[/card] +[card] name=Chandra's Outrage target=creature auto=damage:4 @@ -16059,6 +16257,16 @@ power=3 toughness=2 [/card] [card] +name=Chief of the Foundry +auto=lord(other creature[artifact]|mybattlefield) 1/1 +text=Other artifact creatures you control get +1/+1. +mana={3} +type=Artifact Creature +subtype=Construct +power=2 +toughness=3 +[/card] +[card] name=Chief of the Scale auto=lord(other warrior|myBattlefield) 0/1 text=Other Warrior creatures you control get +0/+1. @@ -16700,6 +16908,17 @@ mana={3}{W} type=Enchantment [/card] [card] +name=Citadel Castellan +abilities=vigilance +auto=this(cantargetcard(*[-renown]) transforms((,newability[@combatdamaged(player) from(this):counter(1/1.2) && becomes(renown) forever])) +text=Vigilance (Attacking doesn't cause this creature to tap.) -- Renown 2 (When this creature deals combat damage to a player, if it isn't renowned, put two +1/+1 counters on it and it becomes renowned.) +mana={1}{G}{W} +type=Creature +subtype=Human Knight +power=2 +toughness=3 +[/card] +[card] name=Citadel of Pain auto=@each my end:damage:type:land[-tapped]:mybattlefield controller auto=@each opponent end:damage:type:land[-tapped]:opponentbattlefield opponent @@ -16870,6 +17089,14 @@ mana={3}{R} type=Enchantment [/card] [card] +name=Clash of Wills +target=*|stack +auto=transforms((,newability[pay[[{value:storedx}]] name(pay {value} mana) donothing?fizzle])) forever +text=Counter target spell unless its controller pays {X}. +mana={X}{U} +type=Instant +[/card] +[card] name=Claustrophobia target=creature auto=tap @@ -16982,6 +17209,16 @@ power=1 toughness=1 [/card] [card] +name=Cleric of the Forward Order +auto=choice life:twicemyname controller +text=When Cleric of the Forward Order enters the battlefield, you gain 2 life for each creature you control named Cleric of the Forward Order. +mana={1}{W} +type=Creature +subtype=Human Cleric +power=2 +toughness=2 +[/card] +[card] name=Clever Impersonator auto=may copy NotATarget(*[-land]) text=You may have Clever Impersonator enter the battlefield as a copy of any nonland permanent on the battlefield. @@ -18168,6 +18405,16 @@ mana={2} type=Artifact [/card] [card] +name=Conclave Naturalists +auto=may destroy target(artifact,enchantment) +text=When Conclave Naturalists enters the battlefield, you may destroy target artifact or enchantment. +mana={4}{G} +type=Creature +subtype=Dryad +power=4 +toughness=4 +[/card] +[card] name=Concordant Crossroads auto=lord(creature) haste auto=@movedTo(enchantment[world]|battlefield):sacrifice all(this) @@ -18301,6 +18548,17 @@ type=Enchantment subtype=Aura [/card] [card] +name=Consecrated by Blood +target=creature +auto=teach(creature) 2/2 +auto=teach(creature) flying +auto=teach(creature) {S(other creature|mybattlefield)}{S(other creature|mybattlefield)}:regenerate +text=Enchant creature -- Enchanted creature gets +2/+2 and has flying and "Sacrifice two other creatures: Regenerate this creature." (The next time the creature would be destroyed this turn, it isn't. Instead tap it, remove all damage from it, and remove it from combat.) +mana={2}{B}{B} +type=Enchantment +subtype=Aura +[/card] +[card] name=Consecrated Sphinx abilities=flying auto=@drawn(opponent):may draw:2 controller @@ -18364,6 +18622,18 @@ mana={1}{U}{B} type=Sorcery [/card] [card] +name=Consul's Lieutenant +abilities=first strike +auto=this(cantargetcard(*[-renown]) transforms((,newability[@combatdamaged(player) from(this):counter(1/1) && becomes(renown) forever])) +auto=this(cantargetcard(*[renown]) transforms((,newability[@combat(attacking) source(this):all(other creature[attacking]|mybattlefield) 1/1 ueot])) +text=First strike -- Renown 1 (When this creature deals combat damage to a player, if it isn't renowned, put a +1/+1 counter on it and it becomes renowned.) -- Whenever Consul's Lieutenant attacks, if it's renowned, other attacking creatures you control get +1/+1 until end of turn. +mana={W}{W} +type=Creature +subtype=Human Soldier +power=2 +toughness=1 +[/card] +[card] name=Consume Spirit target=creature,player auto=damage:castx @@ -21429,6 +21699,24 @@ mana={4}{B}{B} type=Sorcery [/card] [card] +name=Dark Dabbling +target=creature +auto=regenerate +auto=draw:1 controller +auto=if type(*[instant;sorcery]|mygraveyard)~morethan~1 then regenerate all(other creature|mybattlefield) +text=Regenerate target creature. Draw a card. (The next time the creature would be destroyed this turn, it isn't. Instead tap it, remove all damage from it, and remove it from combat.) -- Spell mastery — If there are two or more instant and/or sorcery cards in your graveyard, also regenerate each other creature you control. +mana={2}{B} +type=Instant +[/card] +[card] +name=Dark Petition +auto=moveto(myhand) notatarget(*|mylibrary) +auto=if type(*[instant;sorcery]|mygraveyard)~morethan~1 then add{B}{B}{B} +text=Search your library for a card and put that card into your hand. Then shuffle your library. -- Spell mastery — If there are two or more instant and/or sorcery cards in your graveyard, add {B}{B}{B} to your mana pool. +mana={3}{B}{B} +type=Sorcery +[/card] +[card] name=Dark Privilege target=creature auto=1/1 @@ -22233,6 +22521,16 @@ power=5 toughness=5 [/card] [card] +name=Deadbridge Shaman +auto=@movedto(mygraveyard) from(this|mybattlefield):choice target(opponent) ability$!name(discard) notatarget(*|myhand) reject !$ targetedplayer +text=When Deadbridge Shaman dies, target opponent discards a card. +mana={2}{B} +type=Creature +subtype=Elf Shaman +power=3 +toughness=1 +[/card] +[card] name=Deadeye Navigator auto=soulbond {1}{U}:(blink) abilities=soulbond @@ -23041,6 +23339,16 @@ power=5 toughness=5 [/card] [card] +name=Deep-Sea Terror +auto=aslongas(*|mygraveyard) cantattack <7 +text=Deep-Sea Terror can't attack unless there are seven or more cards in your graveyard. +mana={4}{U}{U} +type=Creature +subtype=Serpent +power=6 +toughness=6 +[/card] +[card] name=Deep-Slumber Titan abilities=doesnotuntap auto=tap @@ -23965,6 +24273,17 @@ mana={3}{B} type=Sorcery [/card] [card] +name=Despoiler of Souls +abilities=cantblock +autograveyard={B}{B}{E(other creature|mygraveyard)}{E(other creature|mygraveyard)}:moveto(mybattlefield) +text=Despoiler of Souls can't block. -- {B}{B}, Exile two other creature cards from your graveyard: Return Despoiler of Souls from your graveyard to the battlefield. +mana={B}{B} +type=Creature +subtype=Horror +power=3 +toughness=1 +[/card] +[card] name=Despondency target=creature autograveyard=@movedTo(this|graveyard) from(battlefield):moveTo(ownerhand) @@ -24732,6 +25051,19 @@ power=2 toughness=2 [/card] [card] +name=Disciple of the Ring +auto={1}{E(*[instant;sorcery]|mygraveyard)}:name(counter noncreature unless pay 2) target(*[-creature]|stack) transforms((,newability[pay[[{2}]] name(pay 2 mana) donothing?fizzle])) forever +auto={1}{E(*[instant;sorcery]|mygraveyard)}:1/1 ueot +auto={1}{E(*[instant;sorcery]|mygraveyard)}:tap target(creature) +auto={1}{E(*[instant;sorcery]|mygraveyard)}:untap target(creature) +text={1}, Exile an instant or sorcery card from your graveyard: Choose one — -- • Counter target noncreature spell unless its controller pays {2}. -- • Disciple of the Ring gets +1/+1 until end of turn. -- • Tap target creature. -- • Untap target creature. +mana={3}{U}{U} +type=Creature +subtype=Human Wizard +power=3 +toughness=4 +[/card] +[card] name=Disciple of the Vault auto=@movedTo(graveyard) from(artifact|battlefield):may target(opponent) life:-1 text=Whenever an artifact is put into a graveyard from the battlefield, you may have target opponent lose 1 life. @@ -24986,6 +25318,13 @@ mana={3}{U}{U} type=Enchantment [/card] [card] +name=Displacement Wave +auto=moveto(ownerhand) all(*[manacost<=X;-land]|battlefield) +text=Return all nonland permanents with converted mana cost X or less to their owners' hands. +mana={X}{U}{U} +type=Sorcery +[/card] +[card] name=Dissipation Field mana={2}{U}{U} auto=@damaged(controller) from(*|battlefield):all(trigger[from]) moveto(ownerhand) @@ -27844,6 +28183,28 @@ mana={G} type=Sorcery [/card] [card] +name=Dwynen's Elite +auto=if type(other elf|mybattlefield)~morethan~0 then choice token(Elf Warrior,Creature Elf Warrior,1/1,green) controller +text=When Dwynen's Elite enters the battlefield, if you control another Elf, put a 1/1 green Elf Warrior creature token onto the battlefield. +mana={1}{G} +type=Creature +subtype=Elf Warrior +power=2 +toughness=2 +[/card] +[card] +name=Dwynen, Gilt-Leaf Daen +abilities=reach +auto=lord(other creature[elf]|mybattlefield) 1/1 +auto=@combat(attacking) source(this):life:type:elf[attacking]:mybattlefield controller +text=Reach -- Other Elf creatures you control get +1/+1. -- Whenever Dwynen, Gilt-Leaf Daen attacks, you gain 1 life for each attacking Elf you control. +mana={2}{G}{G} +type=Legendary Creature +subtype=Elf Warrior +power=3 +toughness=4 +[/card] +[card] name=Dying Wail target=creature auto=@movedTo(mytgt|graveyard) from(battlefield):target(player) ability$!name(discard 2 cards) target(<2>*|myhand) reject!$ targetedplayer @@ -28638,6 +28999,13 @@ power=3 toughness=3 [/card] [card] +name=Elemental Bond +auto=@movedto(creature[power>=3]|mybattlefield):draw:1 controller +text=Whenever a creature with power 3 or greater enters the battlefield under your control, draw a card. +mana={2}{G} +type=Enchantment +[/card] +[card] name=Elemental Mastery target=creature auto=teach(creature) {T}:token(Elemental,Creature Elemental,1/1,red,haste,unearth)*power @@ -30071,6 +30439,16 @@ mana={4}{U} type=Instant [/card] [card] +name=Enlightened Ascetic +auto=may destroy target(enchantment) +text=When Enlightened Ascetic enters the battlefield, you may destroy target enchantment. +mana={1}{W} +type=Creature +subtype=Cat Monk +power=1 +toughness=1 +[/card] +[card] name=Enlightened Tutor auto=moveTo(ownerlibrary) notatarget(artifact,enchantment|mylibrary) text=Search your library for an artifact or enchantment card and reveal that card. Shuffle your library, then put the card on top of it. @@ -30094,6 +30472,16 @@ mana={X}{R} type=Instant [/card] [card] +name=Enshrouding Mist +target=creature +auto=1/1 ueot +auto=prevent:9999 +auto=teach(creature[renown]) untap +text=Target creature gets +1/+1 until end of turn. Prevent all damage that would be dealt to it this turn. If it's renowned, untap it. +mana={W} +type=Instant +[/card] +[card] name=Enslave target=creature auto=teach(creature) transforms((,newability[@each my upkeep:damage:1 owner])) @@ -30194,6 +30582,16 @@ mana={8}{U}{U}{U}{U} type=Sorcery [/card] [card] +name=Enthralling Victor +auto=target(creature[power<=2]|opponentbattlefield) transforms((,newability[moveTo(opponentbattlefield)],newability[phaseaction[endofturn sourceinplay] moveTo(ownerbattlefield)],newability[untap],haste)) ueot once +text=When Enthralling Victor enters the battlefield, gain control of target creature an opponent controls with power 2 or less until end of turn. Untap that creature. It gains haste until end of turn. (It can attack and {T} this turn.) +mana={3}{R} +type=Creature +subtype=Human Warrior +power=3 +toughness=2 +[/card] +[card] name=Entomb auto=moveTo(myGraveyard) notatarget(*|myLibrary) text=Search your library for a card and put that card into your graveyard. Then shuffle your library. @@ -31443,6 +31841,15 @@ mana={4}{B} type=Enchantment [/card] [card] +name=Exquisite Firecraft +target=creature,player +auto=damage:4 +auto=aslongas(*[instant;sorcery]|mygraveyard) nofizzle >1 +text=Exquisite Firecraft deals 4 damage to target creature or player. -- Spell mastery — If there are two or more instant and/or sorcery cards in your graveyard, Exquisite Firecraft can't be countered by spells or abilities. +mana={1}{R}{R} +type=Sorcery +[/card] +[card] name=Exsanguinate auto=life:-X opponent auto=life:X controller @@ -31604,6 +32011,23 @@ text=Colorless Eldrazi spells you cast cost {2} less to cast. -- {7}, {T}: Searc type=Legendary Land [/card] [card] +name=Eyeblight Assassin +auto=target(creature|opponentbattlefield) -1/-1 ueot +text=When Eyeblight Assassin enters the battlefield, target creature an opponent controls gets -1/-1 until end of turn. +mana={2}{B} +type=Creature +subtype=Elf Assassin +power=2 +toughness=2 +[/card] +[card] +name=Eyeblight Massacre +auto=all(creature[-elf]|battlefield) -2/-2 ueot +text=Non-Elf creatures get -2/-2 until end of turn. +mana={2}{B}{B} +type=Sorcery +[/card] +[card] name=Eyeblight's Ending target=creature[-elf] auto=destroy @@ -31807,6 +32231,17 @@ power=2 toughness=2 [/card] [card] +name=Faerie Miscreant +abilities=flying +auto=if type(Faerie Miscreant|mybattlefield)~morethan~1 then choice draw:1 controller +text=Flying (This creature can't be blocked except by creatures with flying or reach.) -- When Faerie Miscreant enters the battlefield, if you control another creature named Faerie Miscreant, draw a card. +mana={U} +type=Creature +subtype=Faerie Rogue +power=1 +toughness=1 +[/card] +[card] name=Faerie Noble abilities=flying auto=lord(other faerie|myBattlefield) 0/1 @@ -33159,6 +33594,17 @@ power=1 toughness=2 [/card] [card] +name=Fetid Imp +abilities=flying +auto={B}:deathtouch ueot +text=Flying (This creature can't be blocked except by creatures with flying or reach.) -- {B}: Fetid Imp gains deathtouch until end of turn. (Any amount of damage it deals to a creature is enough to destroy it.) +mana={1}{B} +type=Creature +subtype=Imp +power=1 +toughness=2 +[/card] +[card] name=Fettergeist abilities=flying auto=foreach(other creature|mybattlefield) upcost[{1}] sacrifice @@ -33318,6 +33764,14 @@ power=2 toughness=2 [/card] [card] +name=Fiery Impulse +target=creature +auto=if type(*[instant;sorcery]|mygraveyard)~morethan~1 then damage:3 else damage:2 +text=Fiery Impulse deals 2 damage to target creature. -- Spell mastery — If there are two or more instant and/or sorcery cards in your graveyard, Fiery Impulse deals 3 damage to that creature instead. +mana={R} +type=Instant +[/card] +[card] name=Fiery Mantle target=creature autograveyard=@movedTo(this|graveyard) from(battlefield):moveTo(ownerhand) @@ -33686,6 +34140,17 @@ power=2 toughness=1 [/card] [card] +name=Firefiend Elemental +abilities=haste +auto=this(cantargetcard(*[-renown]) transforms((,newability[@combatdamaged(player) from(this):counter(1/1) && becomes(renown) forever])) +text=Haste (This creature can attack and {T} as soon as it comes under your control.) -- Renown 1 (When this creature deals combat damage to a player, if it isn't renowned, put a +1/+1 counter on it and it becomes renowned.) +mana={3}{R} +type=Creature +subtype=Elemental +power=3 +toughness=2 +[/card] +[card] name=Firefist Striker auto=@combat(attacking) source(this) restriction{type(other creature[attacking]|myBattlefield)~morethan~1}:cantblock target(creature) ueot text=Battalion — Whenever Firefist Striker and at least two other creatures attack, target creature can't block this turn. @@ -34147,6 +34612,13 @@ mana={2}{R} type=Sorcery [/card] [card] +name=Flameshadow Conjuring +auto=@movedto(creature[-token]|mybattlefield):all(trigger[to]) pay[[{R}]] clone with(unearth,haste) +text=Whenever a nontoken creature enters the battlefield under your control, you may pay {R}. If you do, put a token onto the battlefield that's a copy of that creature. That token gains haste. Exile it at the beginning of the next end step. +mana={3}{R} +type=Enchantment +[/card] +[card] name=Flamespeaker's Will target=creature|mybattlefield auto=1/1 @@ -35765,6 +36237,13 @@ power=4 toughness=4 [/card] [card] +name=Foundry of the Consuls +auto={T}:add{1} +auto={5}{T}{S}:token(Thopter,Artifact Creature Thopter,1/1,flying)*2 controller +text={T}: Add {1} to your mana pool. -- {5}, {T}, Sacrifice Foundry of the Consuls: Put two 1/1 colorless Thopter artifact creature tokens with flying onto the battlefield. +type=Land +[/card] +[card] name=Foundry Street Denizen auto=@movedTo(other creature[red]|mybattlefield):1/0 ueot text=Whenever another red creature enters the battlefield under your control, Foundry Street Denizen gets +1/+0 until end of turn. @@ -37721,6 +38200,23 @@ power=2 toughness=2 [/card] [card] +name=Ghirapur AEther Grid +auto={T(artifact[-tapped]|mybattlefield)}{T(artifact[-tapped]|mybattlefield)}:damage:1 target(creature,player) +text=Tap two untapped artifacts you control: Ghirapur AEther Grid deals 1 damage to target creature or player. +mana={2}{R} +type=Enchantment +[/card] +[card] +name=Ghirapur Gearcrafter +auto=token(Thopter,Artifact Creature Thopter,1/1,flying) controller +text=When Ghirapur Gearcrafter enters the battlefield, put a 1/1 colorless Thopter artifact creature token with flying onto the battlefield. (A creature with flying can't be blocked except by creatures with flying or reach.) +mana={2}{R} +type=Creature +subtype=Human Artificer +power=2 +toughness=1 +[/card] +[card] name=Ghitu Encampment auto=tap auto={T}:Add{R} @@ -38331,6 +38827,13 @@ power=1 toughness=1 [/card] [card] +name=Gideon's Phalanx +auto=if type(*[instant;sorcery]|mygraveyard)~lessthan~1 then token(Knight,Creature Knight,2/2,white,vigilance)*4 controller else token(Knight,Creature Knight,2/2,white,vigilance)*4 && all(creature|mybattlefield) indestructible ueot +text=Put four 2/2 white Knight creature tokens with vigilance onto the battlefield. -- Spell mastery — If there are two or more instant and/or sorcery cards in your graveyard, creatures you control gain indestructible until end of turn. +mana={5}{W}{W} +type=Instant +[/card] +[card] name=Gift of Estates auto=if type(land|opponentbattlefield)~morethan~type(land|mybattlefield) then target(plains|mylibrary) moveto(myhand) text=If an opponent controls more lands than you, search your library for up to three Plains cards, reveal them, and put them into your hand. Then shuffle your library. @@ -40952,6 +41455,16 @@ mana={3}{U} type=Sorcery [/card] [card] +name=Grasp of the Hieromancer +target=creature +auto=teach(creature) 1/1 +auto=@combat(attacking) source(mytgt):tap target(creature|opponentbattlefield) +text=Enchant creature -- Enchanted creature gets +1/+1 and has "Whenever this creature attacks, tap target creature defending player controls." +mana={1}{W} +type=Enchantment +subtype=Aura +[/card] +[card] name=Grassland Crusader auto={T}:2/2 target(elf,soldier) text={T}: Target Elf or Soldier creature gets +2/+2 until end of turn. @@ -41053,6 +41566,18 @@ mana={B} type=Instant [/card] [card] +name=Graveblade Marauder +abilities=deathtouch +auto=@combatdamaged(opponent) from(this):life:-type:creature:mygraveyard opponent +auto=@combatdamaged(controller) from(this):life:-type:creature:mygraveyard controller +text=Deathtouch (Any amount of damage this deals to a creature is enough to destroy it.) -- Whenever Graveblade Marauder deals combat damage to a player, that player loses life equal to the number of creature cards in your graveyard. +mana={2}{B} +type=Creature +subtype=Human Warrior +power=1 +toughness=4 +[/card] +[card] name=Graveborn Muse auto=@each my upkeep:foreach(zombie|myBattlefield) draw:1 auto=@each my upkeep:foreach(zombie|myBattlefield) life:-1 @@ -42391,6 +42916,16 @@ power=1 toughness=3 [/card] [card] +name=Guardian Automaton +auto=@movedto(this|graveyard) from(battlefield):life:3 controller +text=When Guardian Automaton dies, you gain 3 life. +mana={4} +type=Artifact Creature +subtype=Construct +power=3 +toughness=3 +[/card] +[card] name=Guardian Idol auto=tap auto={T}:Add{1} @@ -43258,6 +43793,18 @@ power=3 toughness=2 [/card] [card] +name=Hangarback Walker +auto=counter(1/1,XX) +auto=@movedTo(this|mygraveyard) from(myBattlefield):thisforeach(counter{1/1.1}) token(Thopter,Artifact Creature Thopter,1/1,flying) controller +auto={1}{T}:counter(1/1) +text=Hangarback Walker enters the battlefield with X +1/+1 counters on it. -- When Hangarback Walker dies, put a 1/1 colorless Thopter artifact creature token with flying onto the battlefield for each +1/+1 counter on Hangarback Walker. -- {1}, {T}: Put a +1/+1 counter on Hangarback Walker. +mana={X}{X} +type=Artifact Creature +subtype=Construct +power=0 +toughness=0 +[/card] +[card] name=Hanna's Custody auto=lord(artifact) shroud text=All artifacts have shroud. (They can't be the targets of spells or abilities.) @@ -43937,6 +44484,15 @@ power=2 toughness=3 [/card] [card] +name=Healing Hands +target=player +auto=life:4 targetedplayer +auto=draw:1 controller +text=Target player gains 4 life. -- Draw a card. +mana={2}{W} +type=Sorcery +[/card] +[card] name=Healing Leaves auto=choice life:3 target(player) auto=choice prevent:3 target(creature,player) @@ -44260,6 +44816,16 @@ mana={1}{G} type=Instant [/card] [card] +name=Heavy Infantry +auto=tap target(creature|opponentbattlefield) +text=When Heavy Infantry enters the battlefield, tap target creature an opponent controls. +mana={4}{W} +type=Creature +subtype=Human Soldier +power=3 +toughness=4 +[/card] +[card] name=Heavy Mattock auto={2}:equip auto=1/1 @@ -44681,6 +45247,15 @@ type=Enchantment subtype=Aura [/card] [card] +name=Helm of the Gods +auto={1}:equip +auto=teach(creature) type:enchantment:mybattlefield/type:enchantment:mybattlefield nonstatic +text=Equipped creature gets +1/+1 for each enchantment you control. -- Equip {1} ({1}: Attach to target creature you control. Equip only as a sorcery.) +mana={1} +type=Artifact +subtype=Equipment +[/card] +[card] name=Hematite Golem auto={1}{R}:2/0 text={1}{R}: Hematite Golem gets +2/+0 until end of turn. @@ -44792,6 +45367,17 @@ power=2 toughness=2 [/card] [card] +name=Herald of the Pantheon +auto=lord(enchantment|myhand) altercost(colorless, -1) +auto=@movedto(enchantment|mystack):choice life:1 controller +text=Enchantment spells you cast cost {1} less to cast. -- Whenever you cast an enchantment spell, you gain 1 life. +mana={1}{G} +type=Creature +subtype=Centaur Shaman +power=2 +toughness=2 +[/card] +[card] name=Herdchaser Dragon abilities=flying,trample facedown={3} @@ -45330,6 +45916,16 @@ mana={1}{B}{B} type=Enchantment [/card] [card] +name=Hitchclaw Recluse +abilities=reach +text=Reach (This creature can block creatures with flying.) +mana={2}{G} +type=Creature +subtype=Spider +power=1 +toughness=4 +[/card] +[card] name=Hive Stirrings auto=token(Sliver,Artifact Creature Sliver,1/1)*2 text=Put two 1/1 colorless Sliver creature tokens onto the battlefield. @@ -45724,6 +46320,17 @@ power=1 toughness=1 [/card] [card] +name=Honored Hierarch +auto=this(cantargetcard(*[-renown]) transforms((,newability[@combatdamaged(player) from(this):counter(1/1) && becomes(renown) forever])) +auto=this(cantargetcard(*[renown]) transforms((,newability[{t}:add{g}],newability[{t}:add{r}],newability[{t}:add{u}],newability[{t}:add{b}],newability[{t}:add{w}],newability[vigilance])) +text=Renown 1 (When this creature deals combat damage to a player, if it isn't renowned, put a +1/+1 counter on it and it becomes renowned.) -- As long as Honored Hierarch is renowned, it has vigilance and "{T}: Add one mana of any color to your mana pool." +mana={G} +type=Creature +subtype=Human Druid +power=1 +toughness=1 +[/card] +[card] name=Honor's Reward auto=life:4 controller auto=ability$!name(Bolster) notatarget(creature[toughness=toughness:lowest:creature:mybattlefield]|mybattlefield) counter(1/1,2)!$ controller @@ -46812,6 +47419,14 @@ mana={G}{U} type=Instant [/card] [card] +name=Hydrolash +auto=all(creature[attacking]) -2/0 ueot +auto=draw:1 controller +text=Attacking creatures get -2/-0 until end of turn. -- Draw a card. +mana={2}{U} +type=Instant +[/card] +[card] name=Hydrosurge target=creature auto=-5/0 @@ -47964,6 +48579,17 @@ power=1 toughness=1 [/card] [card] +name=Infectious Bloodlust +target=creature +auto=teach(creature) 2/1 +auto=teach(creature) haste +auto=@movedto(mytgt|graveyard) from(Battlefield):may moveto(myhand) notatarget(Infectious Bloodlust|mylibrary) +text=Enchant creature -- Enchanted creature gets +2/+1, has haste, and attacks each turn if able. -- When enchanted creature dies, you may search your library for a card named Infectious Bloodlust, reveal it, put it into your hand, then shuffle your library. +mana={1}{R} +type=Enchantment +subtype=Aura +[/card] +[card] name=Infectious Horror auto=@combat(attacking) source(this):life:-2 opponent text=Whenever Infectious Horror attacks, each opponent loses 2 life. @@ -48023,6 +48649,16 @@ mana={R}{S(creature|myBattlefield)} type=Sorcery [/card] [card] +name=Infernal Scarring +target=creature +auto=teach(creature) 2/0 +auto=@movedto(mytgt|graveyard) from(Battlefield):draw:1 targetcontroller +text=Enchant creature -- Enchanted creature gets +2/+0 and has "When this creature dies, draw a card." +mana={1}{B} +type=Enchantment +subtype=Aura +[/card] +[card] name=Infernal Tribute auto={2}{S(*[-token]|myBattlefield)}:draw:1 text={2}, Sacrifice a nontoken permanent: Draw a card. @@ -48780,6 +49416,16 @@ power=2 toughness=2 [/card] [card] +name=Iroas's Champion +abilities=double strike +text=Double strike (This creature deals both first-strike and regular combat damage.) +mana={1}{R}{W} +type=Creature +subtype=Human Soldier +power=2 +toughness=2 +[/card] +[card] name=Iron Lance auto={3}{T}:first strike target(creature) text={3}, {T}: Target creature gains first strike until end of turn. @@ -49779,6 +50425,17 @@ power=2 toughness=1 [/card] [card] +name=Jhessian Thief +auto=@combatdamaged(player) from(this):draw:1 controller +auto=@movedTo(*[-creature]|mystack):1/1 ueot +text=Prowess (Whenever you cast a noncreature spell, this creature gets +1/+1 until end of turn.) -- Whenever Jhessian Thief deals combat damage to a player, draw a card. +mana={2}{U} +type=Creature +subtype=Human Rogue +power=1 +toughness=3 +[/card] +[card] name=Jhessian Zombies abilities=fear autohand={2}{cycle}:name(islandcycling or swampcycling) moveTo(myhand) target(island,swamp|mylibrary) @@ -52820,6 +53477,16 @@ power=2 toughness=2 [/card] [card] +name=Knight of the Pilgrim's Road +auto=this(cantargetcard(*[-renown]) transforms((,newability[@combatdamaged(player) from(this):counter(1/1) && becomes(renown) forever])) +text=Renown 1 (When this creature deals combat damage to a player, if it isn't renowned, put a +1/+1 counter on it and it becomes renowned.) +mana={2}{W} +type=Creature +subtype=Human Knight +power=3 +toughness=2 +[/card] +[card] name=Knight of the Reliquary auto=foreach(land|mygraveyard) 1/1 auto={T}{S(forest,plains|myBattlefield)}:moveTo(myBattlefield) target(land|mylibrary) @@ -53373,6 +54040,17 @@ type=Planeswalker subtype=Koth [/card] [card] +name=Kothophed, Soul Hoarder +abilities=flying +auto=@movedto(*|opponentgraveyard) from(battlefield):draw:1 controller && life:-1 controller +text=Flying -- Whenever a permanent owned by another player is put into a graveyard from the battlefield, you draw a card and you lose 1 life. +mana={4}{B}{B} +type=Legendary Creature +subtype=Demon +power=6 +toughness=6 +[/card] +[card] name=Koth's Courier abilities=forestwalk text=Forestwalk @@ -54075,6 +54753,25 @@ power=2 toughness=2 [/card] [card] +name=Kytheon's Irregulars +auto=auto={W}{W}:tap target(creature) +auto=this(cantargetcard(*[-renown]) transforms((,newability[@combatdamaged(player) from(this):counter(1/1) && becomes(renown) forever])) +text=Renown 1 (When this creature deals combat damage to a player, if it isn't renowned, put a +1/+1 counter on it and it becomes renowned.) -- {W}{W}: Tap target creature. +mana={2}{W}{W} +type=Creature +subtype=Human Soldier +power=4 +toughness=3 +[/card] +[card] +name=Kytheon's Tactics +auto=all(creature|mybattlefield) 2/1 ueot +auto=if type(*[instant;sorcery]|mygraveyard)~morethan~1 then all(creature|mybattlefield) vigilance ueot +text=Creatures you control get +2/+1 until end of turn. -- Spell mastery — If there are two or more instant and/or sorcery cards in your graveyard, those creatures also gain vigilance until end of turn. (Attacking doesn't cause them to tap.) +mana={1}{W}{W} +type=Sorcery +[/card] +[card] name=Lab Rats auto=token(Rat,Creature Rat,1/1,black) buyback={B}{4} @@ -54339,6 +55036,13 @@ mana={R} type=Sorcery [/card] [card] +name=Languish +auto=all(creature|battlefield) -4/-4 ueot +text=All creatures get -4/-4 until end of turn. +mana={2}{B}{B} +type=Sorcery +[/card] +[card] name=Lantern Kami abilities=flying text=Flying @@ -55955,6 +56659,49 @@ mana={2}{B}{B} type=Planeswalker subtype=Liliana [/card] +###The 2 cards below should stay together (Flip Card)### +[card] +name=Liliana, Heretical Healer +abilities=lifelink +auto=@movedto(other creature[-token]|graveyard) from(mybattlefield):if this cantargetcard(*[-planeswalker]|mybattlefield) then moveto(exile) and!( transforms((,newability[moveto(ownerbattlefield)],newability[counter(0/0.1.loyalty)])) forever )! +auto=this(counter{0/0.1.loyalty}) flip(Liliana, Defiant Necromancer) +auto=this(counter{0/0.1.loyalty}) choice token(Zombie,Creature Zombie,2/2,black) controller +text=Lifelink -- Whenever another nontoken creature you control dies, exile Liliana, Heretical Healer, then return her to the battlefield transformed under her owner's control. If you do, put a 2/2 black Zombie creature token onto the battlefield. +mana={1}{B}{B} +type=Legendary Creature +subtype=Human Cleric +power=2 +toughness=3 +[/card] +[card] +name=Liliana, Defiant Necromancer +auto=counter(0/0,3,loyalty) +auto=if cantargetcard(planeswalker[counter{0/0.4.loyalty}]) then counter(0/0,-1,loyalty) +auto={C(0/0,2,Loyalty)}:name(+2: Each Player Discard) transforms((,newability[ability$!name(discard) notatarget(*|myhand) reject!$ controller],newability[ability$!name(discard) notatarget(*|myhand) reject!$ opponent])) ueot +auto={C(0/0,-0,Loyalty)}:name(X=0) moveto(mybattlefield) target(creature[-legendary&manacost=0]|mygraveyard) restriction{type(creature[-legendary&manacost=0]|mygraveyard)~morethan~0} +auto={C(0/0,-1,Loyalty)}:name(X=1) moveto(mybattlefield) target(creature[-legendary&manacost=1]|mygraveyard) restriction{type(creature[-legendary&manacost=1]|mygraveyard)~morethan~0} +auto={C(0/0,-2,Loyalty)}:name(X=2) moveto(mybattlefield) target(creature[-legendary&manacost=2]|mygraveyard) restriction{type(creature[-legendary&manacost=2]|mygraveyard)~morethan~0} +auto={C(0/0,-3,Loyalty)}:name(X=3) moveto(mybattlefield) target(creature[-legendary&manacost=3]|mygraveyard) restriction{type(creature[-legendary&manacost=3]|mygraveyard)~morethan~0} +auto={C(0/0,-4,Loyalty)}:name(X=4) moveto(mybattlefield) target(creature[-legendary&manacost=4]|mygraveyard) restriction{type(creature[-legendary&manacost=4]|mygraveyard)~morethan~0} +auto={C(0/0,-5,Loyalty)}:name(X=5) moveto(mybattlefield) target(creature[-legendary&manacost=5]|mygraveyard) restriction{type(creature[-legendary&manacost=5]|mygraveyard)~morethan~0} +auto={C(0/0,-6,Loyalty)}:name(X=6) moveto(mybattlefield) target(creature[-legendary&manacost=6]|mygraveyard) restriction{type(creature[-legendary&manacost=6]|mygraveyard)~morethan~0} +auto={C(0/0,-7,Loyalty)}:name(X=7) moveto(mybattlefield) target(creature[-legendary&manacost=7]|mygraveyard) restriction{type(creature[-legendary&manacost=7]|mygraveyard)~morethan~0} +auto={C(0/0,-8,Loyalty)}:name(X=8) moveto(mybattlefield) target(creature[-legendary&manacost=8]|mygraveyard) restriction{type(creature[-legendary&manacost=8]|mygraveyard)~morethan~0} +auto={C(0/0,-9,Loyalty)}:name(X=9) moveto(mybattlefield) target(creature[-legendary&manacost=9]|mygraveyard) restriction{type(creature[-legendary&manacost=9]|mygraveyard)~morethan~0} +auto={C(0/0,-10,Loyalty)}:name(X=10) moveto(mybattlefield) target(creature[-legendary&manacost=10]|mygraveyard) restriction{type(creature[-legendary&manacost=10]|mygraveyard)~morethan~0} +auto={C(0/0,-11,Loyalty)}:name(X=11) moveto(mybattlefield) target(creature[-legendary&manacost=11]|mygraveyard) restriction{type(creature[-legendary&manacost=11]|mygraveyard)~morethan~0} +auto={C(0/0,-12,Loyalty)}:name(X=12) moveto(mybattlefield) target(creature[-legendary&manacost=12]|mygraveyard) restriction{type(creature[-legendary&manacost=12]|mygraveyard)~morethan~0} +auto={C(0/0,-13,Loyalty)}:name(X=13) moveto(mybattlefield) target(creature[-legendary&manacost=13]|mygraveyard) restriction{type(creature[-legendary&manacost=13]|mygraveyard)~morethan~0} +auto={C(0/0,-14,Loyalty)}:name(X=14) moveto(mybattlefield) target(creature[-legendary&manacost=14]|mygraveyard) restriction{type(creature[-legendary&manacost=14]|mygraveyard)~morethan~0} +auto={C(0/0,-15,Loyalty)}:name(X=15) moveto(mybattlefield) target(creature[-legendary&manacost=15]|mygraveyard) restriction{type(creature[-legendary&manacost=15]|mygraveyard)~morethan~0} +auto={C(0/0,-16,Loyalty)}:name(X=16) moveto(mybattlefield) target(creature[-legendary&manacost=16]|mygraveyard) restriction{type(creature[-legendary&manacost=16]|mygraveyard)~morethan~0} +auto={C(0/0,-8,Loyalty)}:name(-8: emblem) emblem transforms((,newability[@movedTo(creature|mygraveyard) from(battlefield):all(trigger[to]) phaseaction[endofturn once] moveTo(mybattlefield)],newability[@movedTo(creature|opponentgraveyard) from(battlefield):all(trigger[to]) phaseaction[endofturn once] moveTo(opponentbattlefield)])) forever dontremove +text=+2: Each player discards a card. -- -X: Return target nonlegendary creature card with converted mana cost X from your graveyard to the battlefield. -- -8: You get an emblem with "Whenever a creature dies, return it to the battlefield under your control at the beginning of the next end step." +color=black +type=Planeswalker +subtype=Liliana +[/card] +###The 2 cards above should stay together (Flip Card)### [card] name=Liliana's Caress auto=@discarded(*|opponenthand):life:-2 opponent @@ -57776,6 +58523,51 @@ type=Enchantment subtype=Aura [/card] [card] +name=Mage-Ring Bully +abilities=mustattack +auto=@movedTo(*[-creature]|mystack):1/1 ueot +text=Prowess (Whenever you cast a noncreature spell, this creature gets +1/+1 until end of turn.) -- Mage-Ring Bully attacks each turn if able. +mana={1}{R} +type=Creature +subtype=Human Warrior +power=2 +toughness=2 +[/card] +[card] +name=Mage-Ring Network +auto={T}:add{1} +auto={1}{T}:counter(0/0,1,Storage) +auto={T}{C(0/0,-1,Storage)}:name(Remove 1 Counters) add{B} +auto={T}{C(0/0,-2,Storage)}:name(Remove 2 Counters) add{B}{B} +auto={T}{C(0/0,-3,Storage)}:name(Remove 3 Counters) add{B}{B}{B} +auto={T}{C(0/0,-4,Storage)}:name(Remove 4 Counters) add{B}{B}{B}{B} +auto={T}{C(0/0,-5,Storage)}:name(Remove 5 Counters) add{B}{B}{B}{B}{B} +auto={T}{C(0/0,-6,Storage)}:name(Remove 6 Counters) add{B}{B}{B}{B}{B}{B} +auto={T}{C(0/0,-7,Storage)}:name(Remove 7 Counters) add{B}{B}{B}{B}{B}{B}{B} +auto={T}{C(0/0,-8,Storage)}:name(Remove 8 Counters) add{B}{B}{B}{B}{B}{B}{B}{B} +auto={T}{C(0/0,-9,Storage)}:name(Remove 9 Counters) add{B}{B}{B}{B}{B}{B}{B}{B}{B} +auto={T}{C(0/0,-10,Storage)}:name(Remove 10 Counters) add{B}{B}{B}{B}{B}{B}{B}{B}{B}{B} +auto={T}{C(0/0,-11,Storage)}:name(Remove 11 Counters) add{B}{B}{B}{B}{B}{B}{B}{B}{B}{B}{B} +auto={T}{C(0/0,-12,Storage)}:name(Remove 12 Counters) add{B}{B}{B}{B}{B}{B}{B}{B}{B}{B}{B}{B} +auto={T}{C(0/0,-13,Storage)}:name(Remove 13 Counters) add{B}{B}{B}{B}{B}{B}{B}{B}{B}{B}{B}{B}{B} +auto={T}{C(0/0,-14,Storage)}:name(Remove 14 Counters) add{B}{B}{B}{B}{B}{B}{B}{B}{B}{B}{B}{B}{B}{B} +auto={T}{C(0/0,-15,Storage)}:name(Remove 15 Counters) add{B}{B}{B}{B}{B}{B}{B}{B}{B}{B}{B}{B}{B}{B}{B} +text={T}: Add {1} to your mana pool. -- {1}, {T}: Put a storage counter on Mage-Ring Network. -- {T}, Remove X storage counters from Mage-Ring Network: Add {X} to your mana pool. +type=Land +[/card] +[card] +name=Mage-Ring Responder +abilities=doesnotuntap +auto={7}:untap +auto=@combat(attacking) source(this):damage:7 target(creature|opponentbattlefield) +text=Mage-Ring Responder doesn't untap during your untap step. -- {7}: Untap Mage-Ring Responder. -- Whenever Mage-Ring Responder attacks, it deals 7 damage to target creature defending player controls. +mana={7} +type=Artifact Creature +subtype=Golem +power=7 +toughness=7 +[/card] +[card] name=Maggot Carrier auto=life:-1 controller auto=life:-1 opponent @@ -57914,16 +58706,6 @@ mana={1}{R} type=Sorcery [/card] [card] -name=Magmaw -auto={1}{S(*[-land]|myBattlefield)}:damage:1 target(creature,player) -text={1}, Sacrifice a nonland permanent: Magmaw deals 1 damage to target creature or player. -mana={3}{R}{R} -type=Creature -subtype=Elemental -power=4 -toughness=4 -[/card] -[card] name=Magmatic Force auto=@each upkeep:damage:3 target(creature,player) text=At the beginning of each upkeep, Magmatic Force deals 3 damage to target creature or player. @@ -57934,6 +58716,23 @@ power=7 toughness=7 [/card] [card] +name=Magmatic Insight +auto=draw:2 controller +text=As an additional cost to cast Magmatic Insight, discard a land card. -- Draw two cards. +mana={R}{discard(land|myhand)} +type=Sorcery +[/card] +[card] +name=Magmaw +auto={1}{S(*[-land]|myBattlefield)}:damage:1 target(creature,player) +text={1}, Sacrifice a nonland permanent: Magmaw deals 1 damage to target creature or player. +mana={3}{R}{R} +type=Creature +subtype=Elemental +power=4 +toughness=4 +[/card] +[card] name=Magmaquake auto=damage:X all(creature[-flying]) auto=damage:X all(planeswalker) @@ -58273,6 +59072,16 @@ power=4 toughness=4 [/card] [card] +name=Malakir Cullblade +auto=@movedto(creature|graveyard) from(opponentbattlefield):choice counter(1/1) +text=Whenever a creature an opponent controls dies, put a +1/+1 counter on Malakir Cullblade. +mana={1}{B} +type=Creature +subtype=Vampire Warrior +power=1 +toughness=1 +[/card] +[card] name=Malevolent Awakening auto={1}{B}{B}{S(creature|myBattlefield)}:moveTo(myhand) target(creature|mygraveyard) text={1}{B}{B}, Sacrifice a creature: Return target creature card from your graveyard to your hand. @@ -58514,25 +59323,6 @@ mana={G} type=Enchantment [/card] [card] -name=Manalith -auto={T}:Add{W} -auto={T}:Add{U} -auto={T}:Add{B} -auto={T}:Add{R} -auto={T}:Add{G} -text={T}: Add one mana of any color to your mana pool. -mana={3} -type=Artifact -[/card] -[card] -name=Manamorphose -auto=name(add mana) ability$! choice add{G} _ choice add{R} _ choice add{U} _ choice add{B} _ choice add{W} !$ controller && ability$! choice add{G} _ choice add{R} _ choice add{U} _ choice add{B} _ choice add{W} !$ controller -auto=draw:1 controller -text=Add two mana in any combination of colors to your mana pool. -- Draw a card. -mana={1}{RG} -type=Instant -[/card] -[card] name=Manacles of Decay target=creature auto=cantattack @@ -58567,6 +59357,17 @@ power=1 toughness=1 [/card] [card] +name=Managorger Hydra +abilities=trample +auto=@movedto(*|stack):choice counter(1/1) +text=Trample (This creature can deal excess combat damage to defending player or planeswalker while attacking.) -- Whenever a player casts a spell, put a +1/+1 counter on Managorger Hydra. +mana={2}{G} +type=Creature +subtype=Hydra +power=1 +toughness=1 +[/card] +[card] name=Manakin auto={T}:Add{1} text={T}: Add {1} to your mana pool. @@ -58577,6 +59378,25 @@ power=1 toughness=1 [/card] [card] +name=Manalith +auto={T}:Add{W} +auto={T}:Add{U} +auto={T}:Add{B} +auto={T}:Add{R} +auto={T}:Add{G} +text={T}: Add one mana of any color to your mana pool. +mana={3} +type=Artifact +[/card] +[card] +name=Manamorphose +auto=name(add mana) ability$! choice add{G} _ choice add{R} _ choice add{U} _ choice add{B} _ choice add{W} !$ controller && ability$! choice add{G} _ choice add{R} _ choice add{U} _ choice add{B} _ choice add{W} !$ controller +auto=draw:1 controller +text=Add two mana in any combination of colors to your mana pool. -- Draw a card. +mana={1}{RG} +type=Instant +[/card] +[card] name=Manaplasm auto=@movedTo(*[manacost=1]|mystack):1/1 ueot auto=@movedTo(*[manacost=2]|mystack):2/2 ueot @@ -58742,6 +59562,16 @@ type=Enchantment subtype=Aura [/card] [card] +name=Mantle of Webs +target=creature +auto=teach(creature) 1/3 +auto=teach(creature) reach +text=Enchant creature -- Enchanted creature gets +1/+3 and has reach. (It can block creatures with flying.) +mana={1}{G} +type=Enchantment +subtype=Aura +[/card] +[card] name=Map the Wastes auto=moveTo(myBattlefield) and!(tap)! notatarget(land[basic]|myLibrary) auto=ability$!name(Bolster) notatarget(creature[toughness=toughness:lowest:creature:mybattlefield]|mybattlefield) counter(1/1,1)!$ controller @@ -62904,6 +63734,13 @@ power=0 toughness=4 [/card] [card] +name=Molten Vortex +auto={R}{discard(land|myhand)}:damage:2 target(creature,player) +text={R}, Discard a land card: Molten Vortex deals 2 damage to target creature or player. +mana={R} +type=Enchantment +[/card] +[card] name=Moltensteel Dragon abilities=flying auto={p(R)}:1/0 @@ -65482,6 +66319,14 @@ mana={1}{B} type=Enchantment [/card] [card] +name=Necromantic Summons +target=creature|graveyard +auto=if type(*[instant;sorcery]|mygraveyard)~morethan~1 then transforms((,newability[moveto(mybattlefield)],newability[counter(1/1.2)])) forever else moveto(mybattlefield) +text=Put target creature card from a graveyard onto the battlefield under your control. -- Spell mastery — If there are two or more instant and/or sorcery cards in your graveyard, that creature enters the battlefield with two additional +1/+1 counters on it. +mana={4}{B} +type=Sorcery +[/card] +[card] name=Necromantic Thirst target=creature auto=@combatdamaged(player) from(mytgt):may moveTo(myhand) target(creature|mygraveyard) @@ -66778,6 +67623,13 @@ power=2 toughness=3 [/card] [card] +name=Nissa's Pilgrimage +auto=if type(*[instant;sorcery]|mygraveyard)~morethan~1 then name(fetch to play) notatarget(forest[basic]|mylibrary) transforms((,newability[name(move to hand) notatarget(forest[basic]|mylibrary) moveTo(myhand)],newability[moveTo(myBattlefield) and!(tap)!])) oneshot else name(fetch to play) notatarget(forest[basic]|mylibrary) transforms((,newability[name(move to hand) notatarget(forest[basic]|mylibrary) moveTo(myhand)],newability[moveTo(myBattlefield) and!(tap)!])) oneshot +text=Search your library for up to two basic Forest cards, reveal those cards, and put one onto the battlefield tapped and the rest into your hand. Then shuffle your library. -- Spell mastery — If there are two or more instant and/or sorcery cards in your graveyard, search your library for up to three basic Forest cards instead of two. +mana={2}{G} +type=Sorcery +[/card] +[card] name=Niveous Wisps target=creature auto=transforms((,white)) ueot @@ -66788,6 +67640,17 @@ mana={W} type=Instant [/card] [card] +name=Nivix Barrier +abilities=flash, defender +auto=target(creature[attacking]) -4/-0 ueot +text=Flash (You may cast this spell any time you could cast an instant.) -- Defender (This creature can't attack.) -- When Nivix Barrier enters the battlefield, target attacking creature gets -4/-0 until end of turn. +mana={3}{U} +type=Creature +subtype=Illusion Wall +power=0 +toughness=4 +[/card] +[card] name=Niv-Mizzet, Dracogenius auto=@damaged(player) from(this):may draw:1 controller auto={U}{R}:damage:1 target(creature,player) @@ -69258,6 +70121,17 @@ mana={3}{B} type=Sorcery [/card] [card] +name=Outland Colossus +abilities=oneblocker +auto=this(cantargetcard(*[-renown]) transforms((,newability[@combatdamaged(player) from(this):counter(1/1.6) && becomes(renown) forever])) +text=Renown 6 (When this creature deals combat damage to a player, if it isn't renowned, put six +1/+1 counters on it and it becomes renowned.) -- Outland Colossus can't be blocked by more than one creature. +mana={3}{G}{G} +type=Creature +subtype=Giant +power=6 +toughness=6 +[/card] +[card] name=Outrage Shaman auto=damage:type:manar target(creature) text=Chroma - When Outrage Shaman enters the battlefield, it deals damage to target creature equal to the number of red mana symbols in the mana costs of permanents you control. @@ -70358,6 +71232,17 @@ power=7 toughness=7 [/card] [card] +name=Patron of the Valiant +abilities=flying +auto=choice all(creature[counter{1/1}|mybattlefield) counter(1/1) +text=Flying -- When Patron of the Valiant enters the battlefield, put a +1/+1 counter on each creature you control with a +1/+1 counter on it. +mana={3}{W}{W} +type=Creature +subtype=Angel +power=4 +toughness=4 +[/card] +[card] name=Patron of the Wild facedown={3} autofacedown={2}{G}:morph @@ -71367,6 +72252,17 @@ mana={B}{B} type=Instant [/card] [card] +name=Pharika's Disciple +abilities=deathtouch +auto=this(cantargetcard(*[-renown]) transforms((,newability[@combatdamaged(player) from(this):counter(1/1) && becomes(renown) forever])) +text=Deathtouch (Any amount of damage this deals to a creature is enough to destroy it.) -- Renown 1 (When this creature deals combat damage to a player, if it isn't renowned, put a +1/+1 counter on it and it becomes renowned.) +mana={3}{G} +type=Creature +subtype=Centaur Warrior +power=2 +toughness=3 +[/card] +[card] name=Pharika's Mender auto=may moveTo(myhand) target(creature,enchantment|mygraveyard) text=When Pharika's Mender enters the battlefield, you may return target creature or enchantment card from your graveyard to your hand. @@ -71966,6 +72862,17 @@ power=7 toughness=2 [/card] [card] +name=Pia and Kiran Nalaar +auto=choice token(Thopter,Artifact Creature Thopter,1/1,flying)*2 +auto={2}{R}{S(artifact|mybattlefield)}:damage:2 target(creature,player) +text=When Pia and Kiran Nalaar enters the battlefield, put two 1/1 colorless Thopter artifact creature tokens with flying onto the battlefield. -- {2}{R}, Sacrifice an artifact: Pia and Kiran Nalaar deals 2 damage to target creature or player. +mana={2}{R}{R} +type=Legendary Creature +subtype=Human Artificer +power=2 +toughness=2 +[/card] +[card] name=Pianna, Nomad Captain auto=@combat(attacking) source(this):all(creature[attacking]) 1/1 ueot text=Whenever Pianna, Nomad Captain attacks, attacking creatures get +1/+1 until end of turn. @@ -72450,7 +73357,7 @@ toughness=1 [/card] [card] name=Plague Rats -auto=myname/myname cdaactive +auto=allmyname/allmyname cdaactive text=Plague Rats's power and toughness are each equal to the number of creatures named Plague Rats on the battlefield. mana={2}{B} type=Creature @@ -73068,6 +73975,17 @@ mana={8} type=Artifact [/card] [card] +name=Possessed Skaab +auto=moveto(myhand) target(*[instant;sorcery]|mygraveyard) +auto=@movedto(this|graveyard) from(battlefield):moveto(exile) +text=When Possessed Skaab enters the battlefield, return target instant, sorcery, or creature card from your graveyard to your hand. -- If Possessed Skaab would die, exile it instead. +mana={3}{U}{B} +type=Creature +subtype=Zombie +power=3 +toughness=2 +[/card] +[card] name=Poultice Sliver auto=lord(sliver) {2}{T}:regenerate target(sliver) text=All Slivers have "{2}, {T}: Regenerate target Sliver." @@ -73430,6 +74348,17 @@ mana={1}{R} type=Instant [/card] [card] +name=Prickleboar +auto=this(variable{controllerturn}) 2/0 +auto=this(variable{controllerturn}) first strike +text=As long as it's your turn, Prickleboar gets +2/+0 and has first strike. (It deals combat damage before creatures without first strike.) +mana={4}{R} +type=Creature +subtype=Boar +power=3 +toughness=3 +[/card] +[card] name=Prickly Boggart abilities=fear text=Fear (This creature can't be blocked except by artifact creatures and/or black creatures.) @@ -73493,6 +74422,17 @@ power=1 toughness=1 [/card] [card] +name=Priest of the Blood Rite +auto=choice token(Demon,Creature Demon,5/5,flying,black) controller +auto=@each my upkeep:life:-2 controller +text=When Priest of the Blood Rite enters the battlefield, put a 5/5 black Demon creature token with flying onto the battlefield. -- At the beginning of your upkeep, you lose 2 life. +mana={3}{B}{B} +type=Creature +subtype=Human Cleric +power=2 +toughness=2 +[/card] +[card] name=Priest of Titania auto={T}:foreach(elf) add{G} text={T}: Add {G} to your mana pool for each Elf on the battlefield. @@ -73763,6 +74703,13 @@ power=5 toughness=4 [/card] [card] +name=Prism Ring +auto=auto=activatechooseacolor transforms((,newability[@movedto(*[chosencolor]|mystack):life:1 controller])) forever activatechooseend +text=As Prism Ring enters the battlefield, choose a color. -- Whenever you cast a spell of the chosen color, you gain 1 life. +mana={1} +type=Artifact +[/card] +[card] name=Prismatic Boon target=creature auto=choice name(white) protection from white @@ -75377,6 +76324,17 @@ power=1 toughness=1 [/card] [card] +name=Rabid Bloodsucker +abilities=flying +auto=choice all(player) life:-2 +text=Flying (This creature can't be blocked except by creatures with flying or reach.) -- When Rabid Bloodsucker enters the battlefield, each player loses 2 life. +mana={4}{B} +type=Creature +subtype=Vampire +power=3 +toughness=2 +[/card] +[card] name=Rabid Elephant auto=rampage(2/2,0) text=Whenever Rabid Elephant becomes blocked, it gets +2/+2 until end of turn for each creature blocking it. @@ -76320,6 +77278,17 @@ power=1 toughness=1 [/card] [card] +name=Ramroller +abilities=mustattack +auto=aslongas(other artifact|mybattlefield) 2/0 +text=Ramroller attacks each turn if able. -- Ramroller gets +2/+0 as long as you control another artifact. +mana={3} +type=Artifact Creature +subtype=Juggernaut +power=2 +toughness=3 +[/card] +[card] name=Ramses Overdark auto={T}:destroy target(creature[enchanted]) text={T}: Destroy target enchanted creature. @@ -76636,6 +77605,15 @@ mana={3}{W} type=Sorcery [/card] [card] +name=Ravaging Blaze +target=creature +auto=damage:X +auto=if type(*[instant;sorcery]|mygraveyard)~morethan~1 then damage:x targetcontroller +text=Ravaging Blaze deals X damage to target creature. -- Spell mastery — If there are two or more instant and/or sorcery cards in your graveyard, Ravaging Blaze also deals X damage to that creature's controller. +mana={X}{R}{R} +type=Instant +[/card] +[card] name=Ravaging Horde auto=destroy target(land) text=When Ravaging Horde enters the battlefield, destroy target land. @@ -77205,6 +78183,14 @@ power=1 toughness=1 [/card] [card] +name=Reave Soul +target=creature[power<=3]|battlefield +auto=destroy +text=Destroy target creature with power 3 or less. +mana={1}{B} +type=Sorcery +[/card] +[card] name=Rebel Informer auto=cantbetargetof(*[white]) auto={3}:bottomoflibrary target(rebel[-token]|battlefield) @@ -77422,6 +78408,17 @@ power=2 toughness=1 [/card] [card] +name=Reclusive Artificer +abilities=haste +auto=may damage:type:artifact:mybattlefield target(creature) +text=Haste (This creature can attack and {T} as soon as it comes under your control.) -- When Reclusive Artificer enters the battlefield, you may have it deal damage to target creature equal to the number of artifacts you control. +mana={2}{U}{R} +type=Creature +subtype=Human Artificer +power=2 +toughness=3 +[/card] +[card] name=Reclusive Wight auto=@each my upkeep restriction{type(*[-land]|myBattlefield)~morethan~1}:sacrifice text=At the beginning of your upkeep, if you control another nonland permanent, sacrifice Reclusive Wight. @@ -77928,6 +78925,16 @@ type=Enchantment subtype=Aura [/card] [card] +name=Relic Seeker +auto=this(cantargetcard(*[-renown]) transforms((,newability[@combatdamaged(player) from(this):counter(1/1) && becomes(renown) forever],newability[may moveto(myhand) notatarget(equipment|mylibrary)])) +text=Renown 1 (When this creature deals combat damage to a player, if it isn't renowned, put a +1/+1 counter on it and it becomes renowned.) -- When Relic Seeker becomes renowned, you may search your library for an Equipment card, reveal it, put it into your hand, then shuffle your library. +mana={1}{W} +type=Creature +subtype=Human Soldier +power=2 +toughness=2 +[/card] +[card] name=Reliquary Monk auto=@movedTo(this|mygraveyard) from(battlefield):destroy target(artifact,enchantment) text=When Reliquary Monk dies, destroy target artifact or enchantment. @@ -78939,6 +79946,17 @@ power=3 toughness=3 [/card] [card] +name=Rhox Maulers +abilities=trample +auto=this(cantargetcard(*[-renown]) transforms((,newability[@combatdamaged(player) from(this):counter(1/1.2) && becomes(renown) forever])) +text=Trample (This creature can deal excess combat damage to defending player or planeswalker while attacking.) -- Renown 2 (When this creature deals combat damage to a player, if it isn't renowned, put two +1/+1 counters on it and it becomes renowned.) +mana={4}{G} +type=Creature +subtype=Rhino Soldier +power=4 +toughness=4 +[/card] +[card] name=Rhox Meditant auto=aslongas(*[green]|myBattlefield) draw:1 controller oneshot text=When Rhox Meditant enters the battlefield, if you control a green permanent, draw a card. @@ -79357,6 +80375,17 @@ type=Artifact subtype=Equipment [/card] [card] +name=Ringwarden Owl +abilities=flying +auto=@movedTo(*[-creature]|mystack):1/1 ueot +text=Flying (This creature can't be blocked except by creatures with flying or reach.) -- Prowess (Whenever you cast a noncreature spell, this creature gets +1/+1 until end of turn.) +mana={3}{U}{U} +type=Creature +subtype=Bird +power=3 +toughness=3 +[/card] +[card] name=Riot Control auto=life:type:creature:opponentbattlefield controller auto=preventalldamage to(controller) ueot @@ -82882,6 +83911,18 @@ text=Scabland enters the battlefield tapped. -- {T}: Add {1} to your mana pool. type=Land [/card] [card] +name=Scab-Clan Berserker +abilities=haste +auto=this(cantargetcard(*[-renown]) transforms((,newability[@combatdamaged(player) from(this):counter(1/1) && becomes(renown) forever])) +auto=this(cantargetcard(*[renown]) transforms((,newability[@movedto(*[-creature]|opponentstack):damage:2 opponent])) +text=Haste -- Renown 1 (When this creature deals combat damage to a player, if it isn't renowned, put a +1/+1 counter on it and it becomes renowned.) -- Whenever an opponent casts a noncreature spell, if Scab-Clan Berserker is renowned, Scab-Clan Berserker deals 2 damage to that player. +mana={1}{R}{R} +type=Creature +subtype=Human Berserker +power=2 +toughness=2 +[/card] +[card] name=Scab-Clan Charger autohand={1}{G}{discard}:name(bloodrush) target(creature[attacking]) 2/4 ueot text=Bloodrush — {1}{G}, Discard Scab-Clan Charger: Target attacking creature gets +2/+4 until end of turn. @@ -84803,6 +85844,16 @@ mana={R}{R}{R} type=Enchantment [/card] [card] +name=Seismic Elemental +auto=choice all(creature[-flying]) cantblock ueot +text=When Seismic Elemental enters the battlefield, creatures without flying can't block this turn. +mana={3}{R}{R} +type=Creature +subtype=Elemental +power=4 +toughness=4 +[/card] +[card] name=Seismic Mage auto={2}{R}{T}{discard(*|myhand)}:destroy target(land) text={2}{R}, {T}, Discard a card: Destroy target land. @@ -85116,6 +86167,15 @@ mana={3} type=Artifact [/card] [card] +name=Send to Sleep +target=creature|battlefield +auto=tap +auto=if type(*[instant;sorcery]|mygraveyard)~morethan~1 then frozen +text=Tap up to two target creatures. -- Spell mastery — If there are two or more instant and/or sorcery cards in your graveyard, those creatures don't untap during their controllers' next untap steps. +mana={1}{U} +type=Instant +[/card] +[card] name=Sengir Autocrat auto=token(Serf,creature serf,0/1,black)*3 auto=@movedTo(this|nonbattlezone) from(battlefield):moveTo(exile) all(serf) @@ -85214,6 +86274,17 @@ power=4 toughness=4 [/card] [card] +name=Sentinel of the Eternal Watch +abilities=vigilance +auto=@each opponent combatbegins:tap target(creature|opponentbattlefield) +text=Vigilance (Attacking doesn't cause this creature to tap.) -- At the beginning of combat on each opponent's turn, tap target creature that player controls. +mana={5}{W} +type=Creature +subtype=Giant Soldier +power=4 +toughness=6 +[/card] +[card] name=Sentinels of Glen Elendra abilities=flash,flying text=Flash -- Flying @@ -85235,6 +86306,16 @@ power=3 toughness=3 [/card] [card] +name=Separatist Voidmage +auto=may moveto(ownerhand) target(creature|battlefield) +text=When Separatist Voidmage enters the battlefield, you may return target creature to its owner's hand. +mana={3}{U} +type=Creature +subtype=Human Wizard +power=2 +toughness=2 +[/card] +[card] name=Septic Rats abilities=infect auto=@combat(attacking) source(this) opponentpoisoned:1/1 ueot @@ -86065,6 +87146,16 @@ power=4 toughness=2 [/card] [card] +name=Shaman of the Pack +auto=life:-type:elf:mybattlefield target(opponent) +text=When Shaman of the Pack enters the battlefield, target opponent loses life equal to the number of Elves you control. +mana={1}{B}{G} +type=Creature +subtype=Elf Shaman +power=3 +toughness=2 +[/card] +[card] name=Shamanic Revelation auto=draw:type:creature:mybattlefield auto=foreach(creature[power>=4]|mybattlefield) life:4 @@ -86084,6 +87175,16 @@ power=2 toughness=1 [/card] [card] +name=Shambling Ghoul +auto=tap +text=Shambling Ghoul enters the battlefield tapped. +mana={1}{B} +type=Creature +subtype=Zombie +power=2 +toughness=3 +[/card] +[card] name=Shambling Goblin auto=@movedTo(this|graveyard) from(battlefield):-1/-1 target(creature|opponentbattlefield) ueot text=When Shambling Goblin dies, target creature an opponent controls gets -1/-1 until end of turn. @@ -94065,7 +95166,7 @@ toughness=5 [card] name=Stalwart Aven abilities=flying -auto=@combatdamaged(player) from(this):this(cantargetcard(*[-renown]) && becomes(renown) forever && counter(1/1) +auto=this(cantargetcard(*[-renown]) transforms((,newability[@combatdamaged(player) from(this):counter(1/1) && becomes(renown) forever])) text=Flying (This creature can't be blocked except by creatures with flying or reach.) -- Renown 1 (When this creature deals combat damage to a player, if it isn't renowned, put a +1/+1 counter on it and it becomes renowned.) mana={2}{W} type=Creature @@ -102116,7 +103217,7 @@ toughness=2 [card] name=Topan Freeblade abilities=vigilance -auto=@combatdamaged(player) from(this):this(cantargetcard(*[-renown]) && becomes(renown) forever && counter(1/1) +auto=this(cantargetcard(*[-renown]) transforms((,newability[@combatdamaged(player) from(this):counter(1/1) && becomes(renown) forever])) text=Vigilance (Attacking doesn't cause this creature to tap.) -- Renown 1 (When this creature deals combat damage to a player, if it isn't renowned, put a +1/+1 counter on it and it becomes renowned.) mana={1}{W} type=Creature @@ -104967,7 +106068,7 @@ toughness=1 [/card] [card] name=Undercity Troll -auto=@combatdamaged(player) from(this):this(cantargetcard(*[-renown]) && becomes(renown) forever && counter(1/1) +auto=this(cantargetcard(*[-renown]) transforms((,newability[@combatdamaged(player) from(this):counter(1/1) && becomes(renown) forever])) auto={2}{G}:regenerate text=Renown 1 (When this creature deals combat damage to a player, if it isn't renowned, put a +1/+1 counter on it and it becomes renowned.) -- {2}{G}: Regenerate Undercity Troll. (The next time this creature would be destroyed this turn, it isn't. Instead tap it, remove all damage from it, and remove it from combat.) mana={1}{G} @@ -110295,7 +111396,7 @@ toughness=3 [card] name=War Oracle abilities=lifelink -auto=@combatdamaged(player) from(this):this(cantargetcard(*[-renown]) && becomes(renown) forever && counter(1/1) +auto=this(cantargetcard(*[-renown]) transforms((,newability[@combatdamaged(player) from(this):counter(1/1) && becomes(renown) forever])) text=Lifelink (Damage dealt by this creature also causes you to gain that much life.) -- Renown 1 (When this creature deals combat damage to a player, if it isn't renowned, put a +1/+1 counter on it and it becomes renowned.) mana={2}{W}{W} type=Creature diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index 9356af839..6ca3a9cad 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -715,7 +715,22 @@ private: } intValue = mountain + island + forest + swamp + plains; } - else if (s == "myname")//Plague Rats and others + else if (s == "myname")//Name of the card you control + { + intValue = 0; + for (int i = 0; i < 2; i++) + { + Player * p = card->getObserver()->players[i]; + for (int j = p->game->battlefield->nb_cards - 1; j >= 0; --j) + { + if (p->game->battlefield->cards[j]->name == card->name && p == card->controller()) + { + intValue += 1; + } + } + } + } + else if (s == "allmyname")//Plague Rats and others { intValue = 0; for (int i = 0; i < 2; i++) From 1eeb42a88d9441e449a3d6c15619d768b96a199d Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Tue, 22 Sep 2015 07:08:27 +0800 Subject: [PATCH 136/249] fixed lavinia of the tenth --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index b56b44c5f..619247009 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -55289,7 +55289,7 @@ type=Instant [card] name=Lavinia of the Tenth abilities=protection from red -auto=name(detain) all(*[manacost<=4;-land]|opponentBattlefield) transforms((Detained,newability[cantattack],newability[cantblock],newability[noactivatedability])) uynt +auto=name(detain) transforms((,newability[lord(detained) cantattack],newability[lord(detained) cantblock],newability[lord(detained) noactivatedability],newability[lord(*[manacost<=4]|opponentBattlefield) becomes(detained)])) uynt text=Protection from red. -- When Lavinia of the Tenth enters the battlefield, detain each nonland permanent your opponents control with converted mana cost 4 or less. mana={3}{W}{U} type=Legendary Creature From 33868eef88845bd293074d63156cec899fb39489 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Tue, 22 Sep 2015 08:18:24 +0800 Subject: [PATCH 137/249] fix typo --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 619247009..f35888d06 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -26107,7 +26107,7 @@ type=Sorcery [/card] [card] name=Dragon Grip -other={2}{R} (cast anytime) +other={2}{R} Name(cast anytime) otherrestriction=type(creature[power>=4]|mybattlefield)~morethan~0 abilities=spellmastery target=creature From 4b9f94c9ae1232164535750998e0b8efdf4e99cb Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Tue, 22 Sep 2015 17:11:40 +0800 Subject: [PATCH 138/249] added auraward, added event for unattach, added statebased check for protection from quality MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit auraward -> an exception for protection from quality used for aura, like flickering ward added event for unattach added state based check for protection from quality. 702.16c A permanent or player with protection can’t be enchanted by Auras that have the stated quality. Such Auras attached to the permanent or player with protection will be put into their owners’ graveyards as a state-based action. 702.16d A permanent with protection can’t be equipped by Equipment that have the stated quality or fortified by Fortifications that have the stated quality. Such Equipment or Fortifications become unattached from that permanent as a state-based action, but remain on the battlefield. --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 11 +++++++++++ projects/mtg/include/MTGDefinitions.h | 3 ++- projects/mtg/include/WEvent.h | 6 ++++++ projects/mtg/src/AllAbilities.cpp | 2 ++ projects/mtg/src/GameObserver.cpp | 20 ++++++++++++++++++++ projects/mtg/src/GuiPlay.cpp | 2 ++ projects/mtg/src/MTGDefinitions.cpp | 3 ++- projects/mtg/src/WEvent.cpp | 11 +++++++++++ 8 files changed, 56 insertions(+), 2 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 619247009..d8d7777d0 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -9246,6 +9246,7 @@ type=Artifact [/card] [card] name=Black Ward +abilities=auraward target=creature auto=protection from black text=Enchant creature -- Enchanted creature has protection from black. This effect doesn't remove Black Ward. @@ -10887,6 +10888,7 @@ type=Instant [/card] [card] name=Blue Ward +abilities=auraward target=creature auto=protection from blue text=Enchant creature -- Enchanted creature has protection from blue. This effect doesn't remove Blue Ward. @@ -16532,6 +16534,7 @@ toughness=2 [/card] [card] name=Cho-Manno's Blessing +abilities=auraward target=creature abilities=flash auto=chooseacolor teach(creature) protection from(*[chosencolor]) chooseend @@ -35073,6 +35076,7 @@ toughness=2 [/card] [card] name=Flickering Ward +abilities=auraward target=creature auto=chooseacolor teach(creature) protection from(*[chosencolor]) chooseend auto={W}:moveTo(ownerhand) @@ -35150,6 +35154,7 @@ toughness=2 [/card] [card] name=Floating Shield +abilities=auraward target=creature auto=chooseacolor teach(creature) protection from(*[chosencolor]) chooseend auto={S}:protection from white target(creature) @@ -42027,6 +42032,7 @@ subtype=Aura [/card] [card] name=Green Ward +abilities=auraward target=creature auto=protection from green text=Enchant creature -- Enchanted creature has protection from green. This effect doesn't remove Green Ward. @@ -71570,6 +71576,7 @@ toughness=3 [/card] [card] name=Pentarch Ward +abilities=auraward target=creature auto=chooseacolor teach(creature) protection from(*[chosencolor]) chooseend auto=draw:1 @@ -73677,6 +73684,7 @@ type=Sorcery [/card] [card] name=Pledge of Loyalty +abilities=auraward target=creature auto=aslongas(*[red]|mybattlefield) protection from red auto=aslongas(*[green]|mybattlefield) protection from green @@ -78553,6 +78561,7 @@ type=Sorcery [/card] [card] name=Red Ward +abilities=auraward target=creature auto=protection from red text=Enchant creature -- Enchanted creature has protection from red. This effect doesn't remove Red Ward. @@ -99792,6 +99801,7 @@ toughness=1 [/card] [card] name=Tattoo Ward +abilities=auraward target=creature auto=1/1 auto=protection from(enchantment) @@ -112787,6 +112797,7 @@ type=Instant [/card] [card] name=White Ward +abilities=auraward target=creature auto=protection from white text=Enchant creature -- Enchanted creature has protection from white. This effect doesn't remove White Ward. diff --git a/projects/mtg/include/MTGDefinitions.h b/projects/mtg/include/MTGDefinitions.h index a04139580..a070722a1 100644 --- a/projects/mtg/include/MTGDefinitions.h +++ b/projects/mtg/include/MTGDefinitions.h @@ -229,7 +229,8 @@ class Constants SPELLMASTERY = 111, NOLIFEGAIN = 112, NOLIFEGAINOPPONENT = 113, - NB_BASIC_ABILITIES = 114, + AURAWARD = 114, + NB_BASIC_ABILITIES = 115, RARITY_S = 'S', //Special Rarity diff --git a/projects/mtg/include/WEvent.h b/projects/mtg/include/WEvent.h index 0430190ad..890762796 100644 --- a/projects/mtg/include/WEvent.h +++ b/projects/mtg/include/WEvent.h @@ -273,6 +273,12 @@ struct WEventEmptyManaPool : public WEvent { WEventEmptyManaPool(ManaPool * source); }; +//event when card-equipment unattached +struct WEventCardUnattached : public WEventCardUpdate { + WEventCardUnattached(MTGCardInstance * card); + virtual Targetable * getTarget(int target); +}; + std::ostream& operator<<(std::ostream&, const WEvent&); #endif diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index 327970347..047608339 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -5428,6 +5428,8 @@ int AEquip::unequip() game->removeObserver(currentAbilities[i]); } currentAbilities.clear(); + WEvent * e = NEW WEventCardUnattached(source); + game->receiveEvent(e); return 1; } diff --git a/projects/mtg/src/GameObserver.cpp b/projects/mtg/src/GameObserver.cpp index b82960119..a87f85dd7 100644 --- a/projects/mtg/src/GameObserver.cpp +++ b/projects/mtg/src/GameObserver.cpp @@ -617,6 +617,24 @@ void GameObserver::gameStateBasedEffects() card->myPair->myPair = NULL; card->myPair = NULL; } + //////////////////////////////////////////////////// + //Unattach Equipments that dont have valid targets// + //////////////////////////////////////////////////// + if ((card->target) && card->hasType(Subtypes::TYPE_EQUIPMENT)) + { + if(card->target && isInPlay(card->target) && (card->target)->protectedAgainst(card))//protection from quality + { + for (size_t i = 1; i < mLayers->actionLayer()->mObjects.size(); i++) + { + MTGAbility * a = ((MTGAbility *) mLayers->actionLayer()->mObjects[i]); + AEquip * eq = dynamic_cast (a); + if (eq && eq->source == card) + { + ((AEquip*)a)->unequip(); + } + } + } + } /////////////////////////////////////////////////////// //Remove auras that don't have a valid target anymore// /////////////////////////////////////////////////////// @@ -624,6 +642,8 @@ void GameObserver::gameStateBasedEffects() { if(card->target && !isInPlay(card->target)) players[i]->game->putInGraveyard(card); + if(card->target && isInPlay(card->target) && (card->target)->protectedAgainst(card) && !card->has(Constants::AURAWARD))//protection from quality except aura cards like flickering ward + players[i]->game->putInGraveyard(card); } card->enchanted = false; if (card->target && isInPlay(card->target) && !card->hasType(Subtypes::TYPE_EQUIPMENT) && card->hasSubtype(Subtypes::TYPE_AURA)) diff --git a/projects/mtg/src/GuiPlay.cpp b/projects/mtg/src/GuiPlay.cpp index 0ab99501d..4fdc1fde4 100644 --- a/projects/mtg/src/GuiPlay.cpp +++ b/projects/mtg/src/GuiPlay.cpp @@ -406,6 +406,8 @@ int GuiPlay::receiveEventPlus(WEvent * e) } else if (dynamic_cast (e)) Replace(); + else if (dynamic_cast (e)) + Replace(); Replace(); return 0; } diff --git a/projects/mtg/src/MTGDefinitions.cpp b/projects/mtg/src/MTGDefinitions.cpp index 1b7d602d2..ba7362fbb 100644 --- a/projects/mtg/src/MTGDefinitions.cpp +++ b/projects/mtg/src/MTGDefinitions.cpp @@ -142,7 +142,8 @@ const char* Constants::MTGBasicAbilities[] = { "evadebigger", "spellmastery", "nolifegain", - "nolifegainopponent" + "nolifegainopponent", + "auraward" }; map Constants::MTGBasicAbilitiesMap; diff --git a/projects/mtg/src/WEvent.cpp b/projects/mtg/src/WEvent.cpp index b125dc1ee..df09f764c 100644 --- a/projects/mtg/src/WEvent.cpp +++ b/projects/mtg/src/WEvent.cpp @@ -157,6 +157,11 @@ WEventEmptyManaPool::WEventEmptyManaPool(ManaPool * source) : { } +WEventCardUnattached::WEventCardUnattached(MTGCardInstance * card) : + WEventCardUpdate(card) +{ +} + WEventCombatStepChange::WEventCombatStepChange(CombatStep step) : WEvent(), step(step) { @@ -305,6 +310,12 @@ Targetable * WEventcardDraw::getTarget(Player * player) return NULL; } +Targetable * WEventCardUnattached::getTarget(int target) +{ + if (target) return card; + return NULL; +} + std::ostream& WEvent::toString(std::ostream& out) const { return out << "EVENT"; From ae59e75be1c9cb688467237c9be89bac6012f194 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Tue, 22 Sep 2015 19:46:18 +0800 Subject: [PATCH 139/249] Create pledge_protection.txt --- .../mtg/bin/Res/test/pledge_protection.txt | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 projects/mtg/bin/Res/test/pledge_protection.txt diff --git a/projects/mtg/bin/Res/test/pledge_protection.txt b/projects/mtg/bin/Res/test/pledge_protection.txt new file mode 100644 index 000000000..364af6a76 --- /dev/null +++ b/projects/mtg/bin/Res/test/pledge_protection.txt @@ -0,0 +1,46 @@ +#Testing Protection +#702.16c A permanent or player with protection can’t be enchanted by Auras that have the stated +#quality. Such Auras attached to the permanent or player with protection will be put into their +#owners’ graveyards as a state-based action. +# +#702.16d A permanent with protection can’t be equipped by Equipment that have the stated quality +#or fortified by Fortifications that have the stated quality. Such Equipment or Fortifications +#become unattached from that permanent as a state-based action, but remain on the battlefield. +[INIT] +FIRSTMAIN +[PLAYER1] +hand:Pledge of Loyalty, Shuko, Holy Strength, Shifting Sky +inplay:Crimson Acolyte +manapool:{W}{W}{W}{W}{U}{U}{U} +[PLAYER2] +[DO] +Holy Strength +Crimson Acolyte +#crimson acolyte becomes 2/3 +Shuko +Shuko +Crimson Acolyte +#crimson acolyte becomes 3/3 +Pledge of Loyalty +Crimson Acolyte +#crimson acolyte becomes 2/1 since you have white permanents, pledge of loyalty grants protection from white +#holy strength is put into the graveyard as state based action :) +Shifting Sky +choice 0 +choice 2 +#after casting shifting sky, choose the color red, and all nonland permanents becomes red +#since shuko becomes red and crimson has protection from red, it will be unattached +#as state based action, pledge of loyalty stays on the creature :) +next +next +Crimson Acolyte +next +eot +[ASSERT] +UNTAP +[PLAYER1] +inplay:Crimson Acolyte, Pledge of Loyalty, Shuko, Shifting Sky +graveyard:Holy Strength +[PLAYER2] +life:19 +[END] From 2fbfdbcb03c546111a02a95f930ff2d756f3ee44 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Tue, 22 Sep 2015 19:48:02 +0800 Subject: [PATCH 140/249] lowercase --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index d8e200a16..53d678a78 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -26110,7 +26110,7 @@ type=Sorcery [/card] [card] name=Dragon Grip -other={2}{R} Name(cast anytime) +other={2}{R} name(cast anytime) otherrestriction=type(creature[power>=4]|mybattlefield)~morethan~0 abilities=spellmastery target=creature From 800172f93ec5479be96c7cd789719c0bba9e5c9b Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Tue, 22 Sep 2015 19:49:20 +0800 Subject: [PATCH 141/249] Update _tests.txt --- projects/mtg/bin/Res/test/_tests.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/projects/mtg/bin/Res/test/_tests.txt b/projects/mtg/bin/Res/test/_tests.txt index 0b94c47ff..c55f155e7 100644 --- a/projects/mtg/bin/Res/test/_tests.txt +++ b/projects/mtg/bin/Res/test/_tests.txt @@ -526,6 +526,7 @@ pillory_of_the_sleepless2_i188.txt pillory_of_the_sleepless3_i188.txt pillory_of_the_sleepless4_i188.txt plague_rats.txt +pledge_protection.txt plumes_of_peace_i260.txt pouncing_jaguar_i425.txt power_armor.txt From 7db5345f9acd93fe9ce914b295a51ec07d627d15 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Wed, 23 Sep 2015 12:14:47 +0800 Subject: [PATCH 142/249] attempt to fix "notatarget" notatarget must be allowed to target untargettable cards. --- projects/mtg/include/MTGCardInstance.h | 1 + projects/mtg/src/MTGAbility.cpp | 5 +++++ projects/mtg/src/MTGCardInstance.cpp | 1 + projects/mtg/src/TargetChooser.cpp | 8 ++++---- 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/projects/mtg/include/MTGCardInstance.h b/projects/mtg/include/MTGCardInstance.h index 78414efff..3d460bfdd 100644 --- a/projects/mtg/include/MTGCardInstance.h +++ b/projects/mtg/include/MTGCardInstance.h @@ -240,6 +240,7 @@ public: int swapT; bool isSwitchedPT; bool isACopier; + bool bypassTC; void eventattacked(); void eventattackedAlone(); diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index 653104756..2c097b8ac 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -1330,7 +1330,12 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG tcString = splitTarget[1]; if (!isTarget) + { + tc->targetter->bypassTC = true; tc->targetter = NULL; + } + else + tc->targetter->bypassTC = false; sWithoutTc = splitTarget[0]; sWithoutTc.append(splitTarget[2]); } diff --git a/projects/mtg/src/MTGCardInstance.cpp b/projects/mtg/src/MTGCardInstance.cpp index 1744a8d56..b40c368e4 100644 --- a/projects/mtg/src/MTGCardInstance.cpp +++ b/projects/mtg/src/MTGCardInstance.cpp @@ -57,6 +57,7 @@ MTGCardInstance::MTGCardInstance(MTGCard * card, MTGPlayerCards * arg_belongs_to isCDA = false; isSwitchedPT = false; isACopier = false; + bypassTC = false; } MTGCardInstance * MTGCardInstance::createSnapShot() diff --git a/projects/mtg/src/TargetChooser.cpp b/projects/mtg/src/TargetChooser.cpp index ca085a98e..2c91e7bc5 100644 --- a/projects/mtg/src/TargetChooser.cpp +++ b/projects/mtg/src/TargetChooser.cpp @@ -855,10 +855,10 @@ bool TargetChooser::canTarget(Targetable * target, bool withoutProtections) if (source && targetter && card->isInPlay(observer) && !withoutProtections) { - if (card->has(Constants::SHROUD)) return false; - if (card->protectedAgainst(targetter)) return false; - if (card->CantBeTargetby(targetter)) return false; - if ((targetter->controller() != card->controller()) && card->has(Constants::OPPONENTSHROUD)) return false; + if (card->has(Constants::SHROUD)) return targetter->bypassTC; + if (card->protectedAgainst(targetter)) return targetter->bypassTC; + if (card->CantBeTargetby(targetter)) return targetter->bypassTC; + if ((targetter->controller() != card->controller()) && card->has(Constants::OPPONENTSHROUD)) return targetter->bypassTC; } return true; } From 2223cd4f308a8f6a24a5aa6f5917083b637a820c Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Wed, 23 Sep 2015 21:36:05 +0800 Subject: [PATCH 143/249] modified castcard to support put into play for reanimated aura --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 6 +++--- projects/mtg/include/AllAbilities.h | 3 ++- projects/mtg/src/AllAbilities.cpp | 16 ++++++++++++---- projects/mtg/src/MTGAbility.cpp | 3 ++- 4 files changed, 19 insertions(+), 9 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 53d678a78..44096afbf 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -30262,7 +30262,7 @@ type=Instant [/card] [card] name=Enduring Ideal -auto=moveto(mybattlefield) notatarget(enchantment|mylibrary) and!( transforms((,newability[if cantargetcard(aura) then retarget target(creature|mybattlefield)])) )! +auto=moveto(mybattlefield) notatarget(enchantment|mylibrary) and!(castcard(putinplay))! auto=if compare(epicactivated)~lessthan~1 then emblem transforms((,newability[epic controller],newability[@each my upkeep:castcard(copied named!:Enduring Ideal:!)])) forever dontremove text=Search your library for an enchantment card and put it onto the battlefield. Then shuffle your library. -- Epic (For the rest of the game, you can't cast spells. At the beginning of each of your upkeeps, copy this spell except for its epic ability.) mana={5}{W}{W} @@ -88918,7 +88918,7 @@ type=Sorcery [card] name=Silent Sentinel abilities=flying -auto=@combat(attacking) source(this):may moveto(mybattlefield) target(enchantment|mygraveyard) and!( transforms((,newability[if cantargetcard(aura) then retarget target(creature|mybattlefield)])) )! +auto=@combat(attacking) source(this):may moveto(mybattlefield) target(enchantment|mygraveyard) and!(castcard(putinplay))! text=Flying -- Whenever Silent Sentinel attacks, you may return target enchantment card from your graveyard to the battlefield. mana={5}{W}{W} type=Creature @@ -95343,7 +95343,7 @@ type=Instant [/card] [card] name=Starfield of Nyx -auto=@each my upkeep:may moveto(mybattlefield) target(enchantment|mygraveyard) and!( transforms((,newability[if cantargetcard(aura) then retarget target(creature|mybattlefield)])) )! +auto=@each my upkeep:may moveto(mybattlefield) target(enchantment|mygraveyard) and!(castcard(putinplay))! auto=aslongas(enchantment|mybattlefield) lord(other enchantment[-aura;manacost=1]) transforms((,newability[becomes(Creature)],setpower=1,settoughness=1)) >4 auto=aslongas(enchantment|mybattlefield) lord(other enchantment[-aura;manacost=2]) transforms((,newability[becomes(Creature)],setpower=2,settoughness=2)) >4 auto=aslongas(enchantment|mybattlefield) lord(other enchantment[-aura;manacost=3]) transforms((,newability[becomes(Creature)],setpower=3,settoughness=3)) >4 diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index 6ca3a9cad..e3ee2a9d6 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -6025,7 +6025,8 @@ public: string nameThis; MTGCardInstance * theNamedCard; bool noEvent; - AACastCard(GameObserver* observer, int _id, MTGCardInstance * _source, MTGCardInstance * _target,bool restricted,bool copied,bool _asNormal,string nameCard,string abilityName,bool _noEvent); + bool putinplay; + AACastCard(GameObserver* observer, int _id, MTGCardInstance * _source, MTGCardInstance * _target,bool restricted,bool copied,bool _asNormal,string nameCard,string abilityName,bool _noEvent, bool putinplay); int testDestroy(){return 0;}; void Update(float dt); diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index 047608339..d773b6a3b 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -5507,8 +5507,8 @@ AEquip * AEquip::clone() const } // casting a card for free, or casting a copy of a card. -AACastCard::AACastCard(GameObserver* observer, int _id, MTGCardInstance * _source, MTGCardInstance * _target,bool _restricted,bool _copied,bool asNormal,string _namedCard,string _name,bool _noEvent) : - MTGAbility(observer, _id, _source),restricted(_restricted),asCopy(_copied),normal(asNormal),cardNamed(_namedCard),nameThis(_name),noEvent(_noEvent) +AACastCard::AACastCard(GameObserver* observer, int _id, MTGCardInstance * _source, MTGCardInstance * _target,bool _restricted,bool _copied,bool asNormal,string _namedCard,string _name,bool _noEvent,bool putinplay) : + MTGAbility(observer, _id, _source),restricted(_restricted),asCopy(_copied),normal(asNormal),cardNamed(_namedCard),nameThis(_name),noEvent(_noEvent),putinplay(putinplay) { target = _target; andAbility = NULL; @@ -5633,12 +5633,18 @@ int AACastCard::resolveSpell() MTGCardInstance * copy = NULL; if (normal ||(!_target->hasType(Subtypes::TYPE_INSTANT) && !_target->hasType(Subtypes::TYPE_SORCERY))) { - copy =_target->controller()->game->putInZone(_target, _target->currentZone, source->controller()->game->stack,noEvent); + if (putinplay && (_target->hasType(Subtypes::TYPE_ARTIFACT)||_target->hasType(Subtypes::TYPE_CREATURE)||_target->hasType(Subtypes::TYPE_ENCHANTMENT)||_target->hasType(Subtypes::TYPE_PLANESWALKER))) + copy =_target->controller()->game->putInZone(_target, _target->currentZone, source->controller()->game->battlefield,noEvent); + else + copy =_target->controller()->game->putInZone(_target, _target->currentZone, source->controller()->game->stack,noEvent); copy->changeController(source->controller(),true); } else { - copy =_target->controller()->game->putInZone(_target, _target->currentZone, _target->controller()->game->stack,noEvent); + if (putinplay && (_target->hasType(Subtypes::TYPE_ARTIFACT)||_target->hasType(Subtypes::TYPE_CREATURE)||_target->hasType(Subtypes::TYPE_ENCHANTMENT)||_target->hasType(Subtypes::TYPE_PLANESWALKER))) + copy =_target->controller()->game->putInZone(_target, _target->currentZone, source->controller()->game->battlefield,noEvent); + else + copy =_target->controller()->game->putInZone(_target, _target->currentZone, _target->controller()->game->stack,noEvent); copy->changeController(source->controller(),true); } if (game->targetChooser) @@ -5693,6 +5699,8 @@ const string AACastCard::getMenuText() { if(nameThis.size()) return nameThis.c_str(); + if(putinplay) + return "Put Into Play"; return "Cast For Free"; } diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index 2c097b8ac..7d07d4dad 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -2331,6 +2331,7 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG bool asCopy = splitCastCard[1].find("copied") != string::npos; bool asNormal = splitCastCard[1].find("normal") != string::npos; bool sendNoEvent = splitCastCard[1].find("noevent") != string::npos; + bool putinplay = splitCastCard[1].find("putinplay") != string::npos; string nameCard = ""; if(splitCastCard[1].find("named!:") != string::npos) { @@ -2340,7 +2341,7 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG nameCard = splitCastName[1]; } } - MTGAbility *a = NEW AACastCard(observer, id, card, target,withRestrictions,asCopy,asNormal,nameCard,newName,sendNoEvent); + MTGAbility *a = NEW AACastCard(observer, id, card, target,withRestrictions,asCopy,asNormal,nameCard,newName,sendNoEvent,putinplay); a->oneShot = false; if(splitCastCard[1].find("trigger[to]") != string::npos) { From 179e973b4e0f47bf2e800952f6e4e8bf296ee96e Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Wed, 23 Sep 2015 21:44:29 +0800 Subject: [PATCH 144/249] typo --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 44096afbf..84b0ed8b3 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -30262,7 +30262,7 @@ type=Instant [/card] [card] name=Enduring Ideal -auto=moveto(mybattlefield) notatarget(enchantment|mylibrary) and!(castcard(putinplay))! +auto=notatarget(enchantment|mylibrary) castcard(putinplay) auto=if compare(epicactivated)~lessthan~1 then emblem transforms((,newability[epic controller],newability[@each my upkeep:castcard(copied named!:Enduring Ideal:!)])) forever dontremove text=Search your library for an enchantment card and put it onto the battlefield. Then shuffle your library. -- Epic (For the rest of the game, you can't cast spells. At the beginning of each of your upkeeps, copy this spell except for its epic ability.) mana={5}{W}{W} @@ -88918,7 +88918,7 @@ type=Sorcery [card] name=Silent Sentinel abilities=flying -auto=@combat(attacking) source(this):may moveto(mybattlefield) target(enchantment|mygraveyard) and!(castcard(putinplay))! +auto=@combat(attacking) source(this):may target(enchantment|mygraveyard) castcard(putinplay) text=Flying -- Whenever Silent Sentinel attacks, you may return target enchantment card from your graveyard to the battlefield. mana={5}{W}{W} type=Creature @@ -95343,7 +95343,7 @@ type=Instant [/card] [card] name=Starfield of Nyx -auto=@each my upkeep:may moveto(mybattlefield) target(enchantment|mygraveyard) and!(castcard(putinplay))! +auto=@each my upkeep:may target(enchantment|mygraveyard) castcard(putinplay) auto=aslongas(enchantment|mybattlefield) lord(other enchantment[-aura;manacost=1]) transforms((,newability[becomes(Creature)],setpower=1,settoughness=1)) >4 auto=aslongas(enchantment|mybattlefield) lord(other enchantment[-aura;manacost=2]) transforms((,newability[becomes(Creature)],setpower=2,settoughness=2)) >4 auto=aslongas(enchantment|mybattlefield) lord(other enchantment[-aura;manacost=3]) transforms((,newability[becomes(Creature)],setpower=3,settoughness=3)) >4 From 106bcec7cfc9f290746f9cdf80b435bc35bcf45a Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 24 Sep 2015 06:02:46 +0800 Subject: [PATCH 145/249] bypass targetchooser --- projects/mtg/src/AllAbilities.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index d773b6a3b..080918a46 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -5551,6 +5551,8 @@ void AACastCard::Update(float dt) } } MTGCardInstance * toCheck = (MTGCardInstance*)target; + if(putinplay) + toCheck->bypassTC = true; if(theNamedCard) toCheck = theNamedCard; if (Spell * checkSpell = dynamic_cast(target)) From 606d18aa6e7b3eeaecb73bce1766598c21074e45 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 24 Sep 2015 06:24:17 +0800 Subject: [PATCH 146/249] bypassTC on playertarget --- projects/mtg/src/TargetChooser.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/projects/mtg/src/TargetChooser.cpp b/projects/mtg/src/TargetChooser.cpp index 2c91e7bc5..4191f1f7b 100644 --- a/projects/mtg/src/TargetChooser.cpp +++ b/projects/mtg/src/TargetChooser.cpp @@ -1337,13 +1337,13 @@ bool PlayerTargetChooser::canTarget(Targetable * target, bool) if ((targetter->controller() != targetter->controller()->opponent()) && (targetter->controller()->opponent()->game->inPlay->hasAbility(Constants::CONTROLLERSHROUD)) && targetter->controller() != target) - return false; + return targetter->bypassTC; if ((targetter->controller()->opponent()->game->inPlay->hasAbility(Constants::PLAYERSHROUD)) && targetter->controller()->opponent() == target) - return false; + return targetter->bypassTC; if ((targetter->controller()->game->inPlay->hasAbility(Constants::PLAYERSHROUD)) && targetter->controller() == target) - return false; + return targetter->bypassTC; } Player * pTarget = dynamic_cast(target); From d068388e7fa253d4a23dc74ea038ff8b767e458d Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 24 Sep 2015 09:53:10 +0800 Subject: [PATCH 147/249] added aura targets for castcard putinplay MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit the special putinplay keyword for castcard is used for aura so we can "retarget" their intended targets but without casting them instead they are put onto the battlefield and the ability is not targetted :+1: 303.4c If an Aura is enchanting an illegal object or player as defined by its enchant ability and other applicable effects, the object it was attached to no longer exists, or the player it was attached to has left the game, the Aura is put into its owner’s graveyard. (This is a state-based action. See rule 704.) 303.4f If an Aura is entering the battlefield under a player’s control by any means other than by resolving as an Aura spell, and the effect putting it onto the battlefield doesn’t specify the object or player the Aura will enchant, that player chooses what it will enchant as the Aura enters the battlefield. The player must choose a legal object or player according to the Aura’s enchant ability and any other applicable effects. --- projects/mtg/src/AllAbilities.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index 080918a46..f02f76ef3 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -5526,6 +5526,20 @@ void AACastCard::Update(float dt) { theNamedCard = makeCard(); } + if(putinplay) + { + MTGCardInstance * toCheck = (MTGCardInstance*)target; + toCheck->bypassTC = true; + TargetChooserFactory tcf(game); + TargetChooser * atc = tcf.createTargetChooser(toCheck->spellTargetType,toCheck); + if (toCheck->hasType(Subtypes::TYPE_AURA) && !atc->validTargetsExist()) + { + processed = true; + this->forceDestroy = 1; + return ; + } + SAFE_DELETE(atc); + } if (restricted) { MTGCardInstance * toCheck = (MTGCardInstance*)target; @@ -5551,8 +5565,6 @@ void AACastCard::Update(float dt) } } MTGCardInstance * toCheck = (MTGCardInstance*)target; - if(putinplay) - toCheck->bypassTC = true; if(theNamedCard) toCheck = theNamedCard; if (Spell * checkSpell = dynamic_cast(target)) From 64578787a0ad8a52992b5ea0308ac49f88f196b8 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 24 Sep 2015 12:14:58 +0800 Subject: [PATCH 148/249] NULL check --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 4 ++-- projects/mtg/src/AllAbilities.cpp | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 84b0ed8b3..ae57c2fce 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -39276,7 +39276,7 @@ toughness=2 [card] name=Glimmerpoint Stag abilities=vigilance -auto=(blink)ueot target(*) +auto=(blink)ueot target(other *) text=Vigilance -- When Glimmerpoint Stag enters the battlefield, exile another target permanent. Return that card to the battlefield under its owner's control at the beginning of the next end step. mana={2}{W}{W} type=Creature @@ -70865,7 +70865,7 @@ type=Artifact [card] name=Parallax Nexus auto=fading:5 -auto={C(0/0,-1,Fade)}:target(opponent) ability$!name(exile card from hand) (blink)forsrc target(*|myhand)!$ targetedplayer +auto={C(0/0,-1,Fade)}:target(opponent) ability$!name(exile card from hand) hand(blink)forsrc target(*|myhand)!$ targetedplayer text=Fading 5 (This enchantment enters the battlefield with five fade counters on it. At the beginning of your upkeep, remove a fade counter from it. If you can't, sacrifice it.) -- Remove a fade counter from Parallax Nexus: Target opponent exiles a card from his or her hand. Activate this ability only any time you could cast a sorcery. -- When Parallax Nexus leaves the battlefield, each player returns to his or her hand all cards he or she owns exiled with Parallax Nexus. mana={2}{B} type=Enchantment diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index f02f76ef3..38acabbb1 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -5529,6 +5529,8 @@ void AACastCard::Update(float dt) if(putinplay) { MTGCardInstance * toCheck = (MTGCardInstance*)target; + toCheck->target = NULL; + toCheck->playerTarget = NULL; toCheck->bypassTC = true; TargetChooserFactory tcf(game); TargetChooser * atc = tcf.createTargetChooser(toCheck->spellTargetType,toCheck); From a6ec3e0a68309ef00079720a1918f81b50b93bc8 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 24 Sep 2015 14:14:00 +0800 Subject: [PATCH 149/249] added type check on aura if the card it enchant is legal --- projects/mtg/src/GameObserver.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/projects/mtg/src/GameObserver.cpp b/projects/mtg/src/GameObserver.cpp index a87f85dd7..584586723 100644 --- a/projects/mtg/src/GameObserver.cpp +++ b/projects/mtg/src/GameObserver.cpp @@ -642,6 +642,19 @@ void GameObserver::gameStateBasedEffects() { if(card->target && !isInPlay(card->target)) players[i]->game->putInGraveyard(card); + if(card->target && isInPlay(card->target)) + { + if(card->spellTargetType.find("creature") != string::npos && !card->target->hasType("creature")) + players[i]->game->putInGraveyard(card); + if(card->spellTargetType.find("artifact") != string::npos && !card->target->hasType("artifact")) + players[i]->game->putInGraveyard(card); + if(card->spellTargetType.find("enchantment") != string::npos && !card->target->hasType("enchantment")) + players[i]->game->putInGraveyard(card); + if(card->spellTargetType.find("land") != string::npos && !card->target->hasType("land")) + players[i]->game->putInGraveyard(card); + if(card->spellTargetType.find("planeswalker") != string::npos && !card->target->hasType("planeswalker")) + players[i]->game->putInGraveyard(card); + } if(card->target && isInPlay(card->target) && (card->target)->protectedAgainst(card) && !card->has(Constants::AURAWARD))//protection from quality except aura cards like flickering ward players[i]->game->putInGraveyard(card); } From 201b6d9cfa6cb3cc778b34417c40f0fb00d1ab67 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 24 Sep 2015 14:45:26 +0800 Subject: [PATCH 150/249] bypassTC turn off --- projects/mtg/src/GameObserver.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/projects/mtg/src/GameObserver.cpp b/projects/mtg/src/GameObserver.cpp index 584586723..95d0311fe 100644 --- a/projects/mtg/src/GameObserver.cpp +++ b/projects/mtg/src/GameObserver.cpp @@ -617,6 +617,7 @@ void GameObserver::gameStateBasedEffects() card->myPair->myPair = NULL; card->myPair = NULL; } + card->bypassTC = false; //turn off bypass //////////////////////////////////////////////////// //Unattach Equipments that dont have valid targets// //////////////////////////////////////////////////// From b8b5362ba550456ec26c617e8b5d77b9f0f41525 Mon Sep 17 00:00:00 2001 From: xawotihs Date: Thu, 24 Sep 2015 23:20:52 +0200 Subject: [PATCH 151/249] Removed dependency on boost when Qt is used. --- JGE/include/Threading.h | 21 ++++++++++----------- projects/mtg/include/ObjectAnalytics.h | 2 -- projects/mtg/include/PrecompiledHeader.h | 3 ++- projects/mtg/include/WResource_Fwd.h | 9 +++++++++ projects/mtg/src/ExtraCost.cpp | 16 +++++++++++++++- projects/mtg/src/WResourceManager.cpp | 2 ++ projects/mtg/wagic.pri | 1 - 7 files changed, 38 insertions(+), 16 deletions(-) diff --git a/JGE/include/Threading.h b/JGE/include/Threading.h index 73036a27d..a57899318 100644 --- a/JGE/include/Threading.h +++ b/JGE/include/Threading.h @@ -312,9 +312,6 @@ namespace boost #include #include -#include -#include - #include "../include/JLogger.h" namespace boost @@ -420,23 +417,25 @@ namespace boost virtual void run() = 0; }; - typedef boost::shared_ptr thread_data_ptr; - template + typedef QSharedPointer thread_data_ptr; + + template class thread_data : public detail::thread_data_base { public: - thread_data(F f_) : f(f_) + thread_data(F f_, A1 a1_) : f(f_), a1(a1_) { } void run() { - f(); + f(a1); } private: F f; + A1 a1; void operator=(thread_data&); thread_data(thread_data&); @@ -493,7 +492,7 @@ namespace boost } template - thread(F f, A1 a1) : mThreadInfo(make_thread_info(boost::bind(boost::type(), f, a1))) + thread(F f, A1 a1) : mThreadInfo(make_thread_info(f, a1)) { mpThread = new threadImpl(mThreadInfo); LOG("Calling start func"); @@ -510,10 +509,10 @@ namespace boost } private: - template - static inline detail::thread_data_ptr make_thread_info(F f) + template + static inline detail::thread_data_ptr make_thread_info(F f, A1 a1) { - return detail::thread_data_ptr(new detail::thread_data(f)); + return detail::thread_data_ptr(new detail::thread_data(f, a1)); } detail::thread_data_ptr mThreadInfo; diff --git a/projects/mtg/include/ObjectAnalytics.h b/projects/mtg/include/ObjectAnalytics.h index 43306f801..db610a54c 100644 --- a/projects/mtg/include/ObjectAnalytics.h +++ b/projects/mtg/include/ObjectAnalytics.h @@ -1,8 +1,6 @@ #ifndef OBJECTANALYTICS_H #define OBJECTANALYTICS_H -#include - #ifdef _DEBUG #define TRACK_OBJECT_USAGE #endif diff --git a/projects/mtg/include/PrecompiledHeader.h b/projects/mtg/include/PrecompiledHeader.h index 3b7cc0ffa..97df7a34b 100644 --- a/projects/mtg/include/PrecompiledHeader.h +++ b/projects/mtg/include/PrecompiledHeader.h @@ -21,8 +21,9 @@ #include "GameOptions.h" -#ifndef WP8 +#if !defined(WP8) && !defined(QT_CONFIG) #include +#include #endif #if defined (WP8) || defined (IOS) || defined (ANDROID) || defined (QT_CONFIG) || defined (SDL_CONFIG) diff --git a/projects/mtg/include/WResource_Fwd.h b/projects/mtg/include/WResource_Fwd.h index c03b0b752..096f4df97 100644 --- a/projects/mtg/include/WResource_Fwd.h +++ b/projects/mtg/include/WResource_Fwd.h @@ -4,6 +4,15 @@ #if (__cplusplus > 199711L) #include typedef std::shared_ptr JQuadPtr; +#elif defined(QT_CONFIG) +#include +class JQuadPtr : public QSharedPointer +{ +public: + JQuadPtr() : QSharedPointer(){}; + JQuadPtr(JQuad*ptr) : QSharedPointer(ptr){}; + JQuad* get() const {return data();}; +}; #else #include typedef boost::shared_ptr JQuadPtr; diff --git a/projects/mtg/src/ExtraCost.cpp b/projects/mtg/src/ExtraCost.cpp index efa341ba6..ead4c22c4 100644 --- a/projects/mtg/src/ExtraCost.cpp +++ b/projects/mtg/src/ExtraCost.cpp @@ -7,7 +7,21 @@ #include "Player.h" #include "Counters.h" #include "AllAbilities.h" + +#if !defined(QT_CONFIG) #include +typedef ManaCostPtr boost::scoped_ptr +#else +#include +class ManaCostPtr : public QScopedPointer +{ +public: + ManaCostPtr(ManaCost*m) : QScopedPointer(m){ + }; + ManaCost* get() const {return data();}; + +}; +#endif SUPPORT_OBJECT_ANALYTICS(ExtraCost) @@ -209,7 +223,7 @@ LifeorManaCost::LifeorManaCost(TargetChooser *_tc, string manaType) string buildType ="{"; buildType.append(manaType); buildType.append("}"); - boost::scoped_ptr cost(ManaCost::parseManaCost(buildType)); + ManaCostPtr cost(ManaCost::parseManaCost(buildType)); manaCost.copy(cost.get()); } diff --git a/projects/mtg/src/WResourceManager.cpp b/projects/mtg/src/WResourceManager.cpp index 80e3c72ae..bfd4570df 100644 --- a/projects/mtg/src/WResourceManager.cpp +++ b/projects/mtg/src/WResourceManager.cpp @@ -11,6 +11,8 @@ #endif #include "WFont.h" +#include + #ifdef FORCE_LOW_CACHE_MEMORY //#define FORCE_LOW_CACHE_MEMORY const unsigned int kConstrainedCacheLimit = 8 * 1024 * 1024; diff --git a/projects/mtg/wagic.pri b/projects/mtg/wagic.pri index 7360f681e..62ab32ed9 100644 --- a/projects/mtg/wagic.pri +++ b/projects/mtg/wagic.pri @@ -39,7 +39,6 @@ windows{ macx:INCLUDEPATH += /opt/include INCLUDEPATH += ../../JGE/include INCLUDEPATH += ../../JGE/src/zipFS -INCLUDEPATH += ../../Boost INCLUDEPATH += include unix:!symbian:LIBS += -lz From 0f168922d8a927989a42f11ca03d28f926b25ef4 Mon Sep 17 00:00:00 2001 From: xawotihs Date: Thu, 24 Sep 2015 23:47:16 +0200 Subject: [PATCH 152/249] Fixed compilation issue of config without Qt --- projects/mtg/src/ExtraCost.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/mtg/src/ExtraCost.cpp b/projects/mtg/src/ExtraCost.cpp index ead4c22c4..4437bd0f8 100644 --- a/projects/mtg/src/ExtraCost.cpp +++ b/projects/mtg/src/ExtraCost.cpp @@ -10,7 +10,7 @@ #if !defined(QT_CONFIG) #include -typedef ManaCostPtr boost::scoped_ptr +typedef boost::scoped_ptr ManaCostPtr; #else #include class ManaCostPtr : public QScopedPointer From 2869460a7f60c34050295a21a4fa423ee56ba164 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Fri, 25 Sep 2015 17:39:35 +0800 Subject: [PATCH 153/249] Fixed some card primitives, added support for "other" parsing power, toughness and converted cost, added Ingest Ingest -> topcard of library to exile Usage ingest:value ingest:20 will send the top 20 cards of library to exile --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 67 +++++++++++--------- projects/mtg/include/AllAbilities.h | 23 ++++++- projects/mtg/src/AllAbilities.cpp | 13 +++- projects/mtg/src/MTGAbility.cpp | 14 +++- 4 files changed, 82 insertions(+), 35 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index ae57c2fce..04a60659b 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -223,7 +223,7 @@ type=Land [card] name=Abattoir Ghoul abilities=first strike -auto=@vampired(creature) from(this):all(trigger[to]) life:toughness controller +auto=@vampired(creature) from(this):all(trigger[to]) dynamicability text=First strike -- Whenever a creature dealt damage by Abattoir Ghoul this turn dies, you gain life equal to that creature's toughness. mana={3}{B} type=Creature @@ -7937,8 +7937,9 @@ toughness=1 [/card] [card] name=Battering Krasis +abilities=trample auto=evolve -text=Evolve (Whenever a creature enters the battlefield under your control, if that creature has greater power or toughness than this creature, put a +1/+1 counter on this creature.) +text=Trample -- Evolve (Whenever a creature enters the battlefield under your control, if that creature has greater power or toughness than this creature, put a +1/+1 counter on this creature.) mana={2}{G} type=Creature subtype=Fish Beast @@ -17915,7 +17916,7 @@ type=Artifact [/card] [card] name=Coalition Victory -auto=aslongas(plains|myBattlefield)aslongas(island|myBattlefield)aslongas(swamp|myBattlefield)aslongas(mountain|myBattlefield)aslongas(forest|myBattlefield)aslongas(creature[white]|myBattlefield)aslongas(creature[blue]|myBattlefield)aslongas(creature[black]|myBattlefield)aslongas(creature[red]|myBattlefield)aslongas(creature[green]|myBattlefield) winGame +auto=if type(plains|mybattlefield)~morethan~0 then if type(island|mybattlefield)~morethan~0 then if type(swamp|mybattlefield)~morethan~0 then if type(mountain|mybattlefield)~morethan~0 then if type(forest|mybattlefield)~morethan~0 then if type(creature[white]|mybattlefield)~morethan~0 then if type(creature[blue]|mybattlefield)~morethan~0 then if type(creature[black]|mybattlefield)~morethan~0 then if type(creature[red]|mybattlefield)~morethan~0 then if type(creature[green]|mybattlefield)~morethan~0 then wingame controller else nothing text=You win the game if you control a land of each basic land type and a creature of each color. mana={3}{W}{U}{B}{R}{G} type=Sorcery @@ -21115,9 +21116,11 @@ subtype=Golem power=2 toughness=5 [/card] +#opponent not targetted [card] name=Custody Battle target=creature +auto=teach(creature) transforms((,newability[@each my upkeep:ability$!name(sacrifice or exchange) if type(land|mybattlefield)~morethan~0 then choice sacrifice notatarget(land|mybattlefield) _ choice name(exchange controller) moveto(opponentbattlefield) all(mystored)!$ controller])) text=Enchant creature -- Enchanted creature has "At the beginning of your upkeep, target opponent gains control of this creature unless you sacrifice a land." mana={1}{R} type=Enchantment @@ -26294,6 +26297,7 @@ toughness=1 [/card] [card] name=Dragonlair Spider +abilities=reach auto=@movedTo(*|opponentstack):token(Insect,Creature Insect, 1/1,green) text=Reach -- Whenever an opponent casts a spell, put a 1/1 green Insect creature token onto the battlefield. mana={2}{R}{R}{G}{G} @@ -33160,7 +33164,7 @@ type=Instant [/card] [card] name=Feed the Pack -auto=@each my endofturn:may name(sacrifice a non-token creature) target(creature[-token]|mybattlefield) transforms((,newability[token(-262857)*p],newability[sacrifice])) forever +auto=@each my endofturn:may name(sacrifice a non-token creature) target(creature[-token]|mybattlefield) transforms((,newability[token(-262857)*t],newability[sacrifice])) forever text=At the beginning of your end step, you may sacrifice a nontoken creature. If you do, put X 2/2 green Wolf creature tokens onto the battlefield where X is the sacrificed creature's toughness. mana={5}{G} type=Enchantment @@ -34396,6 +34400,7 @@ type=Sorcery [card] name=Five-Alarm Fire auto=@combatdamaged(player) from(creature|mybattlefield):all(this) counter(0/0,1,Blaze) +auto=@combatdamaged(creature) from(creature|mybattlefield):all(this) counter(0/0,1,Blaze) auto={C(0/0,-5,Blaze)}:damage:5 target(creature,player) text=Whenever a creature you control deals combat damage, put a blaze counter on Five-Alarm Fire. -- Remove five blaze counters from Five-Alarm Fire: Five-Alarm Fire deals 5 damage to target creature or player. mana={1}{R}{R} @@ -37681,8 +37686,8 @@ text=Intimidate (This creature can't be blocked except by artifact creatures and color=green type=Creature subtype=Werewolf -power=4 -toughness=4 +power=3 +toughness=3 [/card] ###The 2 cards above should stay together (Flip Card)### [card] @@ -38106,7 +38111,7 @@ type=Artifact name=Geth's Verdict target=player auto=life:-1 -auto=ability$!name(sacrifice) target(creature|mybattlefield) sacrifice!$ targetedplayer +auto=ability$!name(sacrifice) notatarget(creature|mybattlefield) sacrifice!$ targetedplayer text=Target player sacrifices a creature and loses 1 life. mana={B}{B} type=Instant @@ -40905,7 +40910,7 @@ toughness=2 [card] name=Goldnight Redeemer abilities=flying -auto=life:twicetype:other creature:mybattlefield controller +auto=life:twiceothertype:creature:mybattlefield controller text=Flying -- When Goldnight Redeemer enters the battlefield, you gain 2 life for each other creature you control. mana={4}{W}{W} type=Creature @@ -67100,23 +67105,27 @@ subtype=Bolas name=Night Dealings auto=@damaged(opponent) from(*|mybattlefield):counter(0/0,thatmuch,Theft) auto=@damaged(opponent) from(*|mystack):counter(0/0,thatmuch,Theft) -auto=this(counter{0/0.1.Theft}<1) {2}{B}{B}:name(X = 0) (*[-land;manacost=0]) -auto=this(counter{0/0.1.Theft}=) {2}{B}{B}{C(0/0,-1,Theft)}:name(X = 1) moveTo(myhand) target(*[-land;manacost=1]|mylibrary) -auto=this(counter{0/0.2.Theft}=) {2}{B}{B}{C(0/0,-2,Theft)}:name(X = 2) moveTo(myhand) target(*[-land;manacost=2]|mylibrary) -auto=this(counter{0/0.3.Theft}=) {2}{B}{B}{C(0/0,-3,Theft)}:name(X = 3) moveTo(myhand) target(*[-land;manacost=3]|mylibrary) -auto=this(counter{0/0.4.Theft}=) {2}{B}{B}{C(0/0,-4,Theft)}:name(X = 4) moveTo(myhand) target(*[-land;manacost=4]|mylibrary) -auto=this(counter{0/0.5.Theft}=) {2}{B}{B}{C(0/0,-5,Theft)}:name(X = 5) moveTo(myhand) target(*[-land;manacost=5]|mylibrary) -auto=this(counter{0/0.6.Theft}=) {2}{B}{B}{C(0/0,-6,Theft)}:name(X = 6) moveTo(myhand) target(*[-land;manacost=6]|mylibrary) -auto=this(counter{0/0.7.Theft}=) {2}{B}{B}{C(0/0,-7,Theft)}:name(X = 7) moveTo(myhand) target(*[-land;manacost=7]|mylibrary) -auto=this(counter{0/0.8.Theft}=) {2}{B}{B}{C(0/0,-8,Theft)}:name(X = 8) moveTo(myhand) target(*[-land;manacost=8]|mylibrary) -auto=this(counter{0/0.9.Theft}=) {2}{B}{B}{C(0/0,-9,Theft)}:name(X = 9) moveTo(myhand) target(*[-land;manacost=9]|mylibrary) -auto=this(counter{0/0.10.Theft}=) {2}{B}{B}{C(0/0,-10,Theft)}:name(X = 10) moveTo(myhand) target(*[-land;manacost=10]|mylibrary) -auto=this(counter{0/0.11.Theft}=) {2}{B}{B}{C(0/0,-11,Theft)}:name(X = 11) moveTo(myhand) target(*[-land;manacost=11]|mylibrary) -auto=this(counter{0/0.12.Theft}=) {2}{B}{B}{C(0/0,-12,Theft)}:name(X = 12) moveTo(myhand) target(*[-land;manacost=12]|mylibrary) -auto=this(counter{0/0.13.Theft}=) {2}{B}{B}{C(0/0,-13,Theft)}:name(X = 13) moveTo(myhand) target(*[-land;manacost=13]|mylibrary) -auto=this(counter{0/0.14.Theft}=) {2}{B}{B}{C(0/0,-14,Theft)}:name(X = 14) moveTo(myhand) target(*[-land;manacost=14]|mylibrary) -auto=this(counter{0/0.15.Theft}=) {2}{B}{B}{C(0/0,-15,Theft)}:name(X = 15) moveTo(myhand) target(*[-land;manacost=15]|mylibrary) -auto=this(counter{0/0.16.Theft}=) {2}{B}{B}{C(0/0,-16,Theft)}:name(X = 16) moveTo(myhand) target(*[-land;manacost=16]|mylibrary) +auto={2}{B}{B}:name(X = 0) && moveto(myhand) target(*[-land;manacost=0]|mylibrary) +auto=this(counter{0/0.1.Theft}=>) {2}{B}{B}{C(0/0,-1,Theft)}:name(X = 1) && moveTo(myhand) target(*[-land;manacost=1]|mylibrary) +auto=this(counter{0/0.2.Theft}=>) {2}{B}{B}{C(0/0,-2,Theft)}:name(X = 2) && moveTo(myhand) target(*[-land;manacost=2]|mylibrary) +auto=this(counter{0/0.3.Theft}=>) {2}{B}{B}{C(0/0,-3,Theft)}:name(X = 3) && moveTo(myhand) target(*[-land;manacost=3]|mylibrary) +auto=this(counter{0/0.4.Theft}=>) {2}{B}{B}{C(0/0,-4,Theft)}:name(X = 4) && moveTo(myhand) target(*[-land;manacost=4]|mylibrary) +auto=this(counter{0/0.5.Theft}=>) {2}{B}{B}{C(0/0,-5,Theft)}:name(X = 5) && moveTo(myhand) target(*[-land;manacost=5]|mylibrary) +auto=this(counter{0/0.6.Theft}=>) {2}{B}{B}{C(0/0,-6,Theft)}:name(X = 6) && moveTo(myhand) target(*[-land;manacost=6]|mylibrary) +auto=this(counter{0/0.7.Theft}=>) {2}{B}{B}{C(0/0,-7,Theft)}:name(X = 7) && moveTo(myhand) target(*[-land;manacost=7]|mylibrary) +auto=this(counter{0/0.8.Theft}=>) {2}{B}{B}{C(0/0,-8,Theft)}:name(X = 8) && moveTo(myhand) target(*[-land;manacost=8]|mylibrary) +auto=this(counter{0/0.9.Theft}=>) {2}{B}{B}{C(0/0,-9,Theft)}:name(X = 9) && moveTo(myhand) target(*[-land;manacost=9]|mylibrary) +auto=this(counter{0/0.10.Theft}=>) {2}{B}{B}{C(0/0,-10,Theft)}:name(X = 10) && moveTo(myhand) target(*[-land;manacost=10]|mylibrary) +auto=this(counter{0/0.11.Theft}=>) {2}{B}{B}{C(0/0,-11,Theft)}:name(X = 11) && moveTo(myhand) target(*[-land;manacost=11]|mylibrary) +auto=this(counter{0/0.12.Theft}=>) {2}{B}{B}{C(0/0,-12,Theft)}:name(X = 12) && moveTo(myhand) target(*[-land;manacost=12]|mylibrary) +auto=this(counter{0/0.13.Theft}=>) {2}{B}{B}{C(0/0,-13,Theft)}:name(X = 13) && moveTo(myhand) target(*[-land;manacost=13]|mylibrary) +auto=this(counter{0/0.14.Theft}=>) {2}{B}{B}{C(0/0,-14,Theft)}:name(X = 14) && moveTo(myhand) target(*[-land;manacost=14]|mylibrary) +auto=this(counter{0/0.15.Theft}=>) {2}{B}{B}{C(0/0,-15,Theft)}:name(X = 15) && moveTo(myhand) target(*[-land;manacost=15]|mylibrary) +auto=this(counter{0/0.16.Theft}=>) {2}{B}{B}{C(0/0,-16,Theft)}:name(X = 16) && moveTo(myhand) target(*[-land;manacost=16]|mylibrary) +auto=this(counter{0/0.17.Theft}=>) {2}{B}{B}{C(0/0,-17,Theft)}:name(X = 17) && moveTo(myhand) target(*[-land;manacost=17]|mylibrary) +auto=this(counter{0/0.18.Theft}=>) {2}{B}{B}{C(0/0,-18,Theft)}:name(X = 18) && moveTo(myhand) target(*[-land;manacost=18]|mylibrary) +auto=this(counter{0/0.19.Theft}=>) {2}{B}{B}{C(0/0,-19,Theft)}:name(X = 19) && moveTo(myhand) target(*[-land;manacost=19]|mylibrary) +auto=this(counter{0/0.20.Theft}=>) {2}{B}{B}{C(0/0,-20,Theft)}:name(X = 20) && moveTo(myhand) target(*[-land;manacost=20]|mylibrary) text=Whenever a source you control deals damage to another player, put that many theft counters on Night Dealings. -- {2}{B}{B}, Remove X theft counters from Night Dealings: Search your library for a nonland card with converted mana cost X, reveal it, and put it into your hand. Then shuffle your library. mana={2}{B}{B} type=Enchantment @@ -70304,7 +70313,7 @@ type=Instant [/card] [card] name=Overwhelming Stampede -auto=all(creature|mybattlefield) power:highest:creature:mybattlefield/power:highest:creature:mybattlefield +auto=lord(creature|mybattlefield) power:highest:creature:mybattlefield/power:highest:creature:mybattlefield auto=all(creature|mybattlefield) trample text=Until end of turn, creatures you control gain trample and get +X/+X, where X is the greatest power among creatures you control. (If a creature you control would assign enough damage to its blockers to destroy them, you may have it assign the rest of its damage to defending player or planeswalker.) mana={3}{G}{G} @@ -74609,7 +74618,7 @@ toughness=* [/card] [card] name=Prime Speaker Zegana -auto=counter(1/1,power:highest:creature:mybattlefield) && draw:power +auto=counter(1/1,otherpower:highest:creature:mybattlefield) && draw:power text=Prime Speaker Zegana enters the battlefield with X +1/+1 counters on it, where X is the greatest power among other creatures you control. -- When Prime Speaker Zegana enters the battlefield, draw cards equal to its power. mana={2}{G}{G}{U}{U} type=Legendary Creature @@ -82108,7 +82117,7 @@ target=creature auto=teach(creature[red]) 1/1 auto=teach(creature[red]) double strike auto=teach(creature[green]) 1/1 -auto=teach(creature[green]) flying +auto=teach(creature[green]) trample text=Enchant creature -- As long as enchanted creature is red, it gets +1/+1 and has double strike. (It deals both first-strike and regular combat damage.) -- As long as enchanted creature is green, it gets +1/+1 and has trample. mana={4}{RG} type=Enchantment @@ -112923,7 +112932,7 @@ toughness=1 [/card] [card] name=Wild Beastmaster -auto=@combat(attacking) source(this):all(other creature|myBattlefield) dynamicability ueot +auto=@combat(attacking) source(this):lord(other creature|myBattlefield) dynamicability ueot text=Whenever Wild Beastmaster attacks, each other creature you control gets +X/+X until end of turn, where X is Wild Beastmaster's power. mana={2}{G} type=Creature diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index e3ee2a9d6..cf8706933 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -141,6 +141,24 @@ private: size_t oth = s.find("othertype"); s.erase(oth,oth + 5); } + if(s.find("otherpower") != string::npos) + { + other = true; + size_t otp = s.find("otherpower"); + s.erase(otp,otp + 5); + } + if(s.find("othertoughness") != string::npos) + { + other = true; + size_t ott = s.find("othertoughness"); + s.erase(ott,ott + 5); + } + if(s.find("otherconvertedcost") != string::npos) + { + other = true; + size_t otc = s.find("otherconvertedcost"); + s.erase(otc,otc + 5); + } if(s == "prex") { ManaCost * cX = card->controller()->getManaPool()->Diff(card->getManaCost()); @@ -493,6 +511,7 @@ private: } TargetChooserFactory tf(card->getObserver()); TargetChooser * tc = tf.createTargetChooser(theType.c_str(),NULL); + tc->other = other; int check = 0; for (int i = 0; i < 2; i++) { @@ -5777,9 +5796,9 @@ class AADepleter: public ActivatedAbilityTP { public: string nbcardsStr; - + bool toexile; AADepleter(GameObserver* observer, int _id, MTGCardInstance * card, Targetable * _target,string nbcardsStr, ManaCost * _cost = NULL, - int who = TargetChooser::UNSET); + int who = TargetChooser::UNSET, bool toexile = false); int resolve(); const string getMenuText(); AADepleter * clone() const; diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index 38acabbb1..622d20af1 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -261,8 +261,8 @@ AADamager * AADamager::clone() const //AADepleter -AADepleter::AADepleter(GameObserver* observer, int _id, MTGCardInstance * card, Targetable * _target,string nbcardsStr, ManaCost * _cost, int who) : - ActivatedAbilityTP(observer, _id, card, _target, _cost, who),nbcardsStr(nbcardsStr) +AADepleter::AADepleter(GameObserver* observer, int _id, MTGCardInstance * card, Targetable * _target,string nbcardsStr, ManaCost * _cost, int who, bool toexile) : + ActivatedAbilityTP(observer, _id, card, _target, _cost, who),nbcardsStr(nbcardsStr),toexile(toexile) { } @@ -277,7 +277,12 @@ AADepleter::AADepleter(GameObserver* observer, int _id, MTGCardInstance * card, for (int i = 0; i < numCards.getValue(); i++) { if (library->nb_cards) - player->game->putInZone(library->cards[library->nb_cards - 1], library, player->game->graveyard); + { + if(toexile) + player->game->putInZone(library->cards[library->nb_cards - 1], library, player->game->exile); + else + player->game->putInZone(library->cards[library->nb_cards - 1], library, player->game->graveyard); + } } } return 1; @@ -285,6 +290,8 @@ AADepleter::AADepleter(GameObserver* observer, int _id, MTGCardInstance * card, const string AADepleter::getMenuText() { + if(toexile) + return "Ingest"; return "Deplete"; } diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index 7d07d4dad..122553f4e 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -2529,7 +2529,17 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG if (splitDeplete.size()) { Targetable * t = spell ? spell->getNextTarget() : NULL; - MTGAbility * a = NEW AADepleter(observer, id, card, t , splitDeplete[1], NULL, who); + MTGAbility * a = NEW AADepleter(observer, id, card, t , splitDeplete[1], NULL, who, false); + a->oneShot = 1; + return a; + } + + //Ingest + vector splitIngest = parseBetween(s, "ingest:", " ", false); + if (splitIngest.size()) + { + Targetable * t = spell ? spell->getNextTarget() : NULL; + MTGAbility * a = NEW AADepleter(observer, id, card, t , splitIngest[1], NULL, who, true); a->oneShot = 1; return a; } @@ -3530,6 +3540,8 @@ int AbilityFactory::abilityEfficiency(MTGAbility * a, Player * p, int mode, Targ badAbilities[(int)Constants::ONLYMANA] = true; badAbilities[(int)Constants::EXILEDEATH] = true; badAbilities[(int)Constants::WEAK] = true; + badAbilities[(int)Constants::NOLIFEGAIN] = true; + badAbilities[(int)Constants::NOLIFEGAINOPPONENT] = true; if (AInstantBasicAbilityModifierUntilEOT * abi = dynamic_cast(a)) { From 5ae9d4248091fdc627b0095ba3f848a92344f163 Mon Sep 17 00:00:00 2001 From: xawotihs Date: Fri, 25 Sep 2015 20:21:10 +0200 Subject: [PATCH 154/249] Fixed compilation issue with clang --- JGE/include/Threading.h | 1 + 1 file changed, 1 insertion(+) diff --git a/JGE/include/Threading.h b/JGE/include/Threading.h index a57899318..adfe4084e 100644 --- a/JGE/include/Threading.h +++ b/JGE/include/Threading.h @@ -311,6 +311,7 @@ namespace boost #include #include +#include #include "../include/JLogger.h" From a19ccb6b498210de7f15724cbfc6db0fd14e5d24 Mon Sep 17 00:00:00 2001 From: Xawotihs Date: Fri, 25 Sep 2015 21:01:09 +0200 Subject: [PATCH 155/249] Should fix g++ compilation issue --- projects/mtg/include/ObjectAnalytics.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/projects/mtg/include/ObjectAnalytics.h b/projects/mtg/include/ObjectAnalytics.h index db610a54c..892c865d5 100644 --- a/projects/mtg/include/ObjectAnalytics.h +++ b/projects/mtg/include/ObjectAnalytics.h @@ -1,6 +1,8 @@ #ifndef OBJECTANALYTICS_H #define OBJECTANALYTICS_H +#include + #ifdef _DEBUG #define TRACK_OBJECT_USAGE #endif From 4185923d0415c4ba948dadefa705d34dde2344b5 Mon Sep 17 00:00:00 2001 From: Xawotihs Date: Fri, 25 Sep 2015 21:46:37 +0200 Subject: [PATCH 156/249] Replaced C++ types by C ones --- projects/mtg/include/ObjectAnalytics.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/mtg/include/ObjectAnalytics.h b/projects/mtg/include/ObjectAnalytics.h index 892c865d5..92cd8cbd9 100644 --- a/projects/mtg/include/ObjectAnalytics.h +++ b/projects/mtg/include/ObjectAnalytics.h @@ -1,7 +1,7 @@ #ifndef OBJECTANALYTICS_H #define OBJECTANALYTICS_H -#include +#include #ifdef _DEBUG #define TRACK_OBJECT_USAGE From 9e778995355b05ebebf99dfc5955c8b77ed2228f Mon Sep 17 00:00:00 2001 From: xawotihs Date: Sat, 26 Sep 2015 09:44:11 +0200 Subject: [PATCH 157/249] Adds missing breaking macosx compilation without boost --- JGE/src/pc/JSocket.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/JGE/src/pc/JSocket.cpp b/JGE/src/pc/JSocket.cpp index 49eb7165a..f04d36913 100644 --- a/JGE/src/pc/JSocket.cpp +++ b/JGE/src/pc/JSocket.cpp @@ -7,6 +7,7 @@ #include #include #elif LINUX +#include #include #include #include From 04e53f20020951eaf608cf4f82eebca01c811f2f Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sun, 27 Sep 2015 09:52:35 +0800 Subject: [PATCH 158/249] increase the players life indicator(scale to 1.3f), fix init vars increase the life indicator for players to 1.3f, life indicator for players changes color according to its value. fix init for vars(should fix gravecardtypes for tarmogoyf and pbasiclandtypes ) --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 2 +- projects/mtg/include/AllAbilities.h | 4 ++-- projects/mtg/src/GuiStatic.cpp | 17 ++++++++++++++--- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 04a60659b..5bd8fc22c 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -85760,7 +85760,7 @@ auto=@movedTo(*[-creature]|mystack):lifelink ueot text=Prowess (Whenever you cast a noncreature spell, this creature gets +1/+1 until end of turn.) -- Whenever you cast a noncreature spell, Seeker of the Way gains lifelink until end of turn. mana={1}{W} type=Creature -subtype=Human Monk +subtype=Human Warrior power=2 toughness=2 [/card] diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index cf8706933..1f1b519f3 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -708,7 +708,7 @@ private: else if (s == "pbasiclandtypes")//Basic Land types { intValue = 0; - int forest, plains, swamp, island, mountain = 0; + int forest = 0, plains = 0, swamp = 0, island = 0, mountain = 0; for (int j = card->controller()->game->battlefield->nb_cards - 1; j >= 0; --j) { if (card->controller()->game->battlefield->cards[j]->hasType("forest")) @@ -801,7 +801,7 @@ private: else if (s == "gravecardtypes")//Tarmogoyf { intValue = 0; - int art, cre, enc, ins, lnd, sor, trb, pwk = 0; + int art = 0, cre = 0, enc = 0, ins = 0, lnd = 0, sor = 0, trb = 0, pwk = 0; for (int i = 0; i < 2; i++) { Player * p = card->getObserver()->players[i]; diff --git a/projects/mtg/src/GuiStatic.cpp b/projects/mtg/src/GuiStatic.cpp index 4269577c9..a087d2186 100644 --- a/projects/mtg/src/GuiStatic.cpp +++ b/projects/mtg/src/GuiStatic.cpp @@ -96,18 +96,29 @@ void GuiAvatar::Render() //Life char buffer[10]; + int lx = 255, ly = 255, lz = 255; + if(life > 24) { lx = 127; ly = 255; lz = 212; } + if(life > 16 && life < 24) { lx = 255; ly = 255; lz = 255; } + if(life > 12 && life < 17) { lx = 255; ly = 255; lz = 105; } + if(life > 8 && life < 13) { lx = 255; ly = 255; lz = 13; } + if(life > 4 && life < 9) { lx = 255; ly = 166; lz = 0; } + if(life < 5) { lx = 255; ly = 40; lz = 0; } sprintf(buffer, "%i", life); switch (corner) { case TOP_LEFT: mFont->SetColor(ARGB((int)actA / 4, 0, 0, 0)); mFont->DrawString(buffer, actX + 2, actY + 2); - mFont->SetColor(ARGB((int)actA, 255, 255, 255)); + mFont->SetScale(1.3f); + mFont->SetColor(ARGB((int)actA, lx, ly, lz)); mFont->DrawString(buffer, actX + 1, actY + 1); + mFont->SetScale(1); break; case BOTTOM_RIGHT: - mFont->SetColor(ARGB((int)actA, 255, 255, 255)); - mFont->DrawString(buffer, actX, actY - 10, JGETEXT_RIGHT); + mFont->SetScale(1.3f); + mFont->SetColor(ARGB((int)actA, lx, ly, lz)); + mFont->DrawString(buffer, actX, actY - 14, JGETEXT_RIGHT); + mFont->SetScale(1); break; } //poison From 021343ca02e9b07292c45c7ddeda04974604ff84 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 28 Sep 2015 21:27:27 +0800 Subject: [PATCH 159/249] fix for recover cards, preliminary support for madness --- .../bin/Res/sets/primitives/borderline.txt | 151 ++++++++++++++++++ projects/mtg/bin/Res/sets/primitives/mtg.txt | 47 +++--- .../bin/Res/sets/primitives/unsupported.txt | 107 +------------ projects/mtg/include/MTGCardInstance.h | 1 + projects/mtg/include/MTGDefinitions.h | 3 +- projects/mtg/include/MTGRules.h | 16 +- projects/mtg/src/AllAbilities.cpp | 6 +- projects/mtg/src/MTGAbility.cpp | 10 ++ projects/mtg/src/MTGCardInstance.cpp | 1 + projects/mtg/src/MTGDefinitions.cpp | 3 +- projects/mtg/src/MTGGameZones.cpp | 16 ++ projects/mtg/src/WEvent.cpp | 1 + 12 files changed, 226 insertions(+), 136 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/borderline.txt b/projects/mtg/bin/Res/sets/primitives/borderline.txt index 37f37ddf5..a9f5903f0 100644 --- a/projects/mtg/bin/Res/sets/primitives/borderline.txt +++ b/projects/mtg/bin/Res/sets/primitives/borderline.txt @@ -1,5 +1,16 @@ grade=borderline [card] +name=Arrogant Wurm +abilities=trample,madness +autoexile=restriction{discarded} pay({2}{G}) name(pay 2G to cast) activate name(pay 2G to cast) castcard(normal)?name(put in graveyard) moveto(ownergraveyard) +text=Trample -- Madness {2}{G} (If you discard this card, you may cast it for its madness cost instead of putting it into your graveyard.) +mana={3}{G}{G} +type=Creature +subtype=Wurm +power=4 +toughness=4 +[/card] +[card] name=Autumn Willow abilities=opponentshroud,shroud auto={G}:-shroud @@ -24,6 +35,40 @@ power=2 toughness=2 [/card] [card] +name=Basking Rootwalla +abilities=madness +autoexile=restriction{discarded} pay({0}) name(pay 0 to cast) activate name(pay 0 to cast) castcard(normal)?name(put in graveyard) moveto(ownergraveyard) +auto={1}{G}:2/2 limit:1 +text={1}{G}: Basking Rootwalla gets +2/+2 until end of turn. Activate this ability only once each turn. -- Madness {0} (If you discard this card, you may cast it for its madness cost instead of putting it into your graveyard.) +mana={G} +type=Creature +subtype=Lizard +power=1 +toughness=1 +[/card] +[card] +name=Big Game Hunter +abilities=madness +autoexile=restriction{discarded} pay({B}) name(pay B to cast) activate name(pay B to cast) castcard(normal)?name(put in graveyard) moveto(ownergraveyard) +auto=bury target(creature[power>=4]) +text=When Big Game Hunter enters the battlefield, destroy target creature with power 4 or greater. It can't be regenerated. -- Madness {B} (If you discard this card, you may cast it for its madness cost instead of putting it into your graveyard.) +mana={1}{B}{B} +type=Creature +subtype=Human Rebel Assassin +power=1 +toughness=1 +[/card] +[card] +name=Call to the Netherworld +abilities=madness +autoexile=restriction{discarded} pay({0}) name(pay 0 to cast) activate name(pay 0 to cast) castcard(normal)?name(put in graveyard) moveto(ownergraveyard) +target=creature[black]|myGraveyard +auto=moveTo(myHand) +text=Return target black creature card from your graveyard to your hand. -- Madness {0} (If you discard this card, you may cast it for its madness cost instead of putting it into your graveyard.) +mana={B} +type=Sorcery +[/card] +[card] name=Cinder Seer auto={2}{r}{t}:target(creature,Player) damage:type:*[red]:myhand text={2}{R}, {T}: Reveal any number of red cards in your hand. Cinder Seer deals X damage to target creature or player, where X is the number of cards revealed this way. @@ -44,6 +89,16 @@ mana={1}{B}{G} type=Instant [/card] [card] +name=Dark Withering +abilities=madness +autoexile=restriction{discarded} pay({B}) name(pay B to cast) activate name(pay B to cast) castcard(normal)?name(put in graveyard) moveto(ownergraveyard) +target=creature[-black] +auto=destroy +text=Destroy target nonblack creature. -- Madness {B} (If you discard this card, you may cast it for its madness cost instead of putting it into your graveyard.) +mana={4}{B}{B} +type=Instant +[/card] +[card] name=Feral Hydra type=Creature subtype=Hydra Beast @@ -56,6 +111,26 @@ auto={3}:counter(1/1) #Not all player can use ability [/card] [card] +name=Fiery Temper +abilities=madness +autoexile=restriction{discarded} pay({R}) name(pay R to cast) activate name(pay R to cast) castcard(normal)?name(put in graveyard) moveto(ownergraveyard) +target=creature,player +auto=damage:3 +text=Fiery Temper deals 3 damage to target creature or player. -- Madness {R} (If you discard this card, you may cast it for its madness cost instead of putting it into your graveyard.) +mana={1}{R}{R} +type=Instant +[/card] +[card] +name=Frantic Purification +abilities=madness +autoexile=restriction{discarded} pay({W}) name(pay W to cast) activate name(pay W to cast) castcard(normal)?name(put in graveyard) moveto(ownergraveyard) +target=enchantment +auto=destroy +text=Destroy target enchantment. -- Madness {W} (If you discard this card, you may cast it for its madness cost instead of putting it into your graveyard.) +mana={2}{W} +type=Instant +[/card] +[card] name=Ghastly Remains auto=foreach(zombie|myhand) counter(1/1,1) autograveyard={B}{B}{B}:moveTo(myhand) myUpkeepOnly @@ -77,6 +152,18 @@ power=4 toughness=4 [/card] [card] +name=Gorgon Recluse +abilities=madness +autoexile=restriction{discarded} pay({B}{B}) name(pay BB to cast) activate name(pay BB to cast) castcard(normal)?name(put in graveyard) moveto(ownergraveyard) +auto=@combat(blocked,blocking) source(this) from(creature):all(trigger[from]) phaseaction[combatends once] destroy +text=Whenever Gorgon Recluse blocks or becomes blocked by a nonblack creature, destroy that creature at end of combat. -- Madness {B}{B} (If you discard this card, you may cast it for its madness cost instead of putting it into your graveyard.) +mana={3}{B}{B} +type=Creature +subtype=Gorgon +power=2 +toughness=4 +[/card] +[card] name=Govern the Guildless target=creature[-multicolor] auto=moveto(mybattlefield) @@ -86,6 +173,17 @@ mana={5}{U} type=Sorcery [/card] [card] +name=Ichor Slick +abilities=madness +autoexile=restriction{discarded} pay({3}{B}) name(pay 3B to cast) activate name(pay 3B to cast) castcard(normal)?name(put in graveyard) moveto(ownergraveyard) +target=creature +auto=-3/-3 +autohand=__CYCLING__({2}) +text=Target creature gets -3/-3 until end of turn. -- Cycling {2} ({2}, Discard this card: Draw a card.) -- Madness {3}{B} (If you discard this card, you may cast it for its madness cost instead of putting it into your graveyard.) +mana={2}{B} +type=Sorcery +[/card] +[card] name=Ivy Seer auto={2}{G}{T}:foreach(*[green]|myhand) 1/1 target(creature) text={2}{G}, {T}: Reveal any number of green cards in your hand. Target creature gets +X/+X until end of turn, where X is the number of cards revealed this way. @@ -149,6 +247,15 @@ power=1 toughness=1 [/card] [card] +name=Obsessive Search +abilities=madness +autoexile=restriction{discarded} pay({U}) name(pay U to cast) activate name(pay U to cast) castcard(normal)?name(put in graveyard) moveto(ownergraveyard) +auto=draw:1 controller +text=Draw a card. -- Madness {U} (If you discard this card, you may cast it for its madness cost instead of putting it into your graveyard.) +mana={U} +type=Instant +[/card] +[card] name=Ogre Marauder text=Whenever Ogre Marauder attacks, it gains "Ogre Marauder can't be blocked" until end of turn unless defending player sacrifices a creature. auto=@combat(attacking) source(this):ability$!name(choose one) if type(creature|mybattlefield)~morethan~0 then choice sacrifice notatarget(creature|mybattlefield) _ choice all(mystored) unblockable ueot!$ opponent @@ -159,6 +266,15 @@ power=3 toughness=1 [/card] [card] +name=Psychotic Haze +abilities=madness +autoexile=restriction{discarded} pay({1}{B}) name(pay 1B to cast) activate name(pay 1B to cast) castcard(normal)?name(put in graveyard) moveto(ownergraveyard) +auto=damage:1 all(creature,player) +text=Psychotic Haze deals 1 damage to each creature and each player. -- Madness {1}{B} (If you discard this card, you may cast it for its madness cost instead of putting it into your graveyard.) +mana={2}{B}{B} +type=Instant +[/card] +[card] name=Rakdos Augermage abilities=first strike auto={T}:name(target opponent) target(opponent) donothing && all(this) transforms((,newability[ability$!name(discard) reject notatarget(*|opponenthand)!$ targetedplayer && ability$!name(discard) reject notatarget(*|opponenthand)!$ controller])) assorcery @@ -178,6 +294,17 @@ mana={X}{X}{U} type=Sorcery [/card] [card] +name=Reckless Wurm +abilities=trample,madness +autoexile=restriction{discarded} pay({2}{R}) name(pay 2R to cast) activate name(pay 2R to cast) castcard(normal)?name(put in graveyard) moveto(ownergraveyard) +text=Trample -- Madness {2}{R} (If you discard this card, you may cast it for its madness cost instead of putting it into your graveyard.) +mana={3}{R}{R} +type=Creature +subtype=Wurm +power=4 +toughness=4 +[/card] +[card] name=Sacellum Godspeaker auto={T}:foreach(creaure[power>4]|myhand) add{G} text={T}: Reveal any number of creature cards with power 5 or greater from your hand. Add {G} to your mana pool for each card revealed this way. @@ -236,6 +363,30 @@ mana={G}{W} type=Instant [/card] [card] +name=Strength of Isolation +abilities=madness +autoexile=restriction{discarded} pay({W}) name(pay W to cast) activate name(pay W to cast) castcard(normal)?name(put in graveyard) moveto(ownergraveyard) +target=creature +auto=1/2 +auto=protection from black +text=Enchant creature -- Enchanted creature gets +1/+2 and has protection from black. -- Madness {W} (If you discard this card, you may cast it for its madness cost instead of putting it into your graveyard.) +mana={1}{W} +type=Enchantment +subtype=Aura +[/card] +[card] +name=Strength of Lunacy +abilities=madness +autoexile=restriction{discarded} pay({B}) name(pay B to cast) activate name(pay B to cast) castcard(normal)?name(put in graveyard) moveto(ownergraveyard) +target=creature +auto=2/1 +auto=protection from white +text=Enchant creature -- Enchanted creature gets +2/+1 and has protection from white. -- Madness {B} (If you discard this card, you may cast it for its madness cost instead of putting it into your graveyard.) +mana={1}{B} +type=Enchantment +subtype=Aura +[/card] +[card] name=Zombie Brute abilities=trample auto=foreach(zombie|myhand) counter(1/1,1) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 5bd8fc22c..898605725 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -22294,6 +22294,7 @@ text=At the beginning of your upkeep, you lose 1 life. -- At the beginning of yo mana={2}{B}{B}{B} type=Enchantment [/card] +#tappedformana stack... [card] name=Dawn's Reflection target=land @@ -33438,6 +33439,7 @@ subtype=Beast power=2 toughness=2 [/card] +#tappedformana stack... [card] name=Fertile Ground target=land @@ -37927,13 +37929,16 @@ type=Artifact [card] name=Gemstone Mine auto=counter(0/0,3,Mining) -auto={T}{C(0/0,-1,Mining)}:Add{W} -auto={T}{C(0/0,-1,Mining)}:Add{U} -auto={T}{C(0/0,-1,Mining)}:Add{B} -auto={T}{C(0/0,-1,Mining)}:Add{R} -auto={T}{C(0/0,-1,Mining)}:Add{G} -auto=@tapped(this):bury all(gemstone mine[-counter{0/0.1.Mining}]) -auto=this(counter{0/0.1.Mining}<1) {0}:sacrifice all(this) +auto=this(counter{0/0,1,Mining}>1) {T}{C(0/0,-1,Mining)}:Add{G} +auto=this(counter{0/0,1,Mining}>1) {T}{C(0/0,-1,Mining)}:Add{R} +auto=this(counter{0/0,1,Mining}>1) {T}{C(0/0,-1,Mining)}:Add{U} +auto=this(counter{0/0,1,Mining}>1) {T}{C(0/0,-1,Mining)}:Add{B} +auto=this(counter{0/0,1,Mining}>1) {T}{C(0/0,-1,Mining)}:Add{W} +auto=this(counter{0/0,1,Mining}=1) {T}{C(0/0,-1,Mining)}:Add{G} && sacrifice +auto=this(counter{0/0,1,Mining}=1) {T}{C(0/0,-1,Mining)}:Add{R} && sacrifice +auto=this(counter{0/0,1,Mining}=1) {T}{C(0/0,-1,Mining)}:Add{U} && sacrifice +auto=this(counter{0/0,1,Mining}=1) {T}{C(0/0,-1,Mining)}:Add{B} && sacrifice +auto=this(counter{0/0,1,Mining}=1) {T}{C(0/0,-1,Mining)}:Add{W} && sacrifice text=Gemstone Mine enters the battlefield with three mining counters on it. -- {T}, Remove a mining counter from Gemstone Mine: Add one mana of any color to your mana pool. If there are no mining counters on Gemstone Mine, sacrifice it. type=Land [/card] @@ -45571,9 +45576,8 @@ toughness=2 name=Hickory Woodlot auto=tap auto=counter(0/0,2,Depletion) -auto={T}{C(0/0,-1,Depletion)}:Add{G}{G} -auto=@tapped(this):bury all(hickory woodlot[-counter{0/0.1.Depletion}]) -auto=this(counter{0/0.1.Depletion}<1) {0}:sacrifice all(this) +auto=this(counter{0/0,1,Depletion}>1) {T}{C(0/0,-1,Depletion)}:Add{G}{G} +auto=this(counter{0/0,1,Depletion}=1) {T}{C(0/0,-1,Depletion)}:Add{G}{G} && sacrifice text=Hickory Woodlot enters the battlefield tapped with two depletion counters on it. -- {T}, Remove a depletion counter from Hickory Woodlot: Add {G}{G} to your mana pool. If there are no depletion counters on Hickory Woodlot, sacrifice it. type=Land [/card] @@ -59969,6 +59973,7 @@ subtype=Insect power=2 toughness=3 [/card] +#tappedformana stack... [card] name=Market Festival target=land @@ -71418,9 +71423,8 @@ toughness=2 name=Peat Bog auto=tap auto=counter(0/0,2,Depletion) -auto={T}{C(0/0,-1,Depletion)}:Add{B}{B} -auto=@tapped(this):bury all(peat bog[-counter{0/0.1.Depletion}]|myBattlefield) -auto=this(counter{0/0.1.Depletion}<1) {0}:sacrifice all(this) +auto=this(counter{0/0,1,Depletion}>1) {T}{C(0/0,-1,Depletion)}:Add{B}{B} +auto=this(counter{0/0,1,Depletion}=1) {T}{C(0/0,-1,Depletion)}:Add{B}{B} && sacrifice text=Peat Bog enters the battlefield tapped with two depletion counters on it. -- {T}, Remove a depletion counter from Peat Bog: Add {B}{B} to your mana pool. If there are no depletion counters on Peat Bog, sacrifice it. type=Land [/card] @@ -78998,9 +79002,8 @@ type=Sorcery name=Remote Farm auto=tap auto=counter(0/0,2,Depletion) -auto={T}{C(0/0,-1,Depletion)}:Add{W}{W} -auto=@tapped(this):bury all(remote farm[-counter{0/0.1.Depletion}]|myBattlefield) -auto=this(counter{0/0.1.Depletion}<1) {0}:sacrifice all(this) +auto=this(counter{0/0,1,Depletion}>1) {T}{C(0/0,-1,Depletion)}:Add{W}{W} +auto=this(counter{0/0,1,Depletion}=1) {T}{C(0/0,-1,Depletion)}:Add{W}{W} && sacrifice text=Remote Farm enters the battlefield tapped with two depletion counters on it. -- {T}, Remove a depletion counter from Remote Farm: Add {W}{W} to your mana pool. If there are no depletion counters on Remote Farm, sacrifice it. type=Land [/card] @@ -83233,9 +83236,8 @@ type=Artifact name=Sandstone Needle auto=tap auto=counter(0/0,2,Depletion) -auto={T}{C(0/0,-1,Depletion)}:Add{R}{R} -auto=@tapped(this):bury all(sandstone needle[-counter{0/0.1.Depletion}]|myBattlefield) -auto=this(counter{0/0.1.Depletion}<1) {0}:sacrifice all(this) +auto=this(counter{0/0,1,Depletion}>1) {T}{C(0/0,-1,Depletion)}:Add{R}{R} +auto=this(counter{0/0,1,Depletion}=1) {T}{C(0/0,-1,Depletion)}:Add{R}{R} && sacrifice text=Sandstone Needle enters the battlefield tapped with two depletion counters on it. -- {T}, Remove a depletion counter from Sandstone Needle: Add {R}{R} to your mana pool. If there are no depletion counters on Sandstone Needle, sacrifice it. type=Land [/card] @@ -83471,9 +83473,8 @@ toughness=2 name=Saprazzan Skerry auto=tap auto=counter(0/0,2,Depletion) -auto={T}{C(0/0,-1,Depletion)}:Add{U}{U} -auto=@tapped(this):bury all(saprazzan skerry[-counter{0/0.1.Depletion}]|myBattlefield) -auto=this(counter{0/0.1.Depletion}<1) {0}:sacrifice all(this) +auto=this(counter{0/0,1,Depletion}>1) {T}{C(0/0,-1,Depletion)}:Add{U}{U} +auto=this(counter{0/0,1,Depletion}=1) {T}{C(0/0,-1,Depletion)}:Add{U}{U} && sacrifice text=Saprazzan Skerry enters the battlefield tapped with two depletion counters on it. -- {T}, Remove a depletion counter from Saprazzan Skerry: Add {U}{U} to your mana pool. If there are no depletion counters on Saprazzan Skerry, sacrifice it. type=Land [/card] @@ -103853,6 +103854,7 @@ subtype=Spellshaper power=1 toughness=1 [/card] +#tappedformana stack... [card] name=Trace of Abundance target=land @@ -108211,6 +108213,7 @@ subtype=Elemental power=7 toughness=7 [/card] +#tappedformana stack... [card] name=Verdant Haven target=land diff --git a/projects/mtg/bin/Res/sets/primitives/unsupported.txt b/projects/mtg/bin/Res/sets/primitives/unsupported.txt index f1608d66b..0f27c9015 100644 --- a/projects/mtg/bin/Res/sets/primitives/unsupported.txt +++ b/projects/mtg/bin/Res/sets/primitives/unsupported.txt @@ -470,15 +470,6 @@ type=Enchantment subtype=Aura [/card] [card] -name=Arrogant Wurm -text=Trample -- Madness {2}{G} (If you discard this card, you may cast it for its madness cost instead of putting it into your graveyard.) -mana={3}{G}{G} -type=Creature -subtype=Wurm -power=4 -toughness=4 -[/card] -[card] name=Arrow Volley Trap text=If four or more creatures are attacking, you may pay {1}{W} rather than pay Arrow Volley Trap's mana cost. -- Arrow Volley Trap deals 5 damage divided as you choose among any number of target attacking creatures. mana={3}{W}{W} @@ -993,15 +984,6 @@ toughness=4 text=Flying -- Players can't cast spells during combat. {R}: Target creature attacks this turn if able. [/card] [card] -name=Basking Rootwalla -text={1}{G}: Basking Rootwalla gets +2/+2 until end of turn. Activate this ability only once each turn. -- Madness {0} (If you discard this card, you may cast it for its madness cost instead of putting it into your graveyard.) -mana={G} -type=Creature -subtype=Lizard -power=1 -toughness=1 -[/card] -[card] name=Baton of Morale text={2}: Target creature gains banding until end of turn. (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding a player controls are blocking or being blocked by a creature, that player divides that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) mana={2} @@ -1162,15 +1144,6 @@ mana={5}{B} type=Instant [/card] [card] -name=Big Game Hunter -text=When Big Game Hunter enters the battlefield, destroy target creature with power 4 or greater. It can't be regenerated. -- Madness {B} (If you discard this card, you may cast it for its madness cost instead of putting it into your graveyard.) -mana={1}{B}{B} -type=Creature -subtype=Human Rebel Assassin -power=1 -toughness=1 -[/card] -[card] name=Bind text=Counter target activated ability. (Mana abilities can't be targeted.) -- Draw a card. mana={1}{G} @@ -1875,12 +1848,6 @@ mana={1}{W} type=Enchantment [/card] [card] -name=Call to the Netherworld -text=Return target black creature card from your graveyard to your hand. -- Madness {0} (If you discard this card, you may cast it for its madness cost instead of putting it into your graveyard.) -mana={B} -type=Sorcery -[/card] -[card] name=Callous Deceiver text={1}: Look at the top card of your library. -- {2}: Reveal the top card of your library. If it's a land card, Callous Deceiver gets +1/+0 and gains flying until end of turn. Activate this ability only once each turn. mana={2}{U} @@ -3422,12 +3389,6 @@ mana={2}{B} type=Enchantment [/card] [card] -name=Dark Withering -text=Destroy target nonblack creature. -- Madness {B} (If you discard this card, you may cast it for its madness cost instead of putting it into your graveyard.) -mana={4}{B}{B} -type=Instant -[/card] -[card] name=Darkpact text=Remove Darkpact from your deck before playing if you're not playing for ante. -- You own target card in the ante. Exchange that card with the top card of your library. mana={B}{B}{B} @@ -5116,12 +5077,6 @@ mana={R}{G}{W} type=Sorcery [/card] [card] -name=Fiery Temper -text=Fiery Temper deals 3 damage to target creature or player. -- Madness {R} (If you discard this card, you may cast it for its madness cost instead of putting it into your graveyard.) -mana={1}{R}{R} -type=Instant -[/card] -[card] name=Fight or Flight text=At the beginning of each opponent's combat phase, separate all creatures that player controls into two piles. Only creatures in the pile of his or her choice can attack this turn. mana={3}{W} @@ -5555,12 +5510,6 @@ toughness=3 text=At the beginning of your upkeep, you may ask target player a yes-or-no question. If you do, that player answers the question truthfully and abides by that answer if able until end of turn. [/card] [card] -name=Frantic Purification -text=Destroy target enchantment. -- Madness {W} (If you discard this card, you may cast it for its madness cost instead of putting it into your graveyard.) -mana={2}{W} -type=Instant -[/card] -[card] name=Frazzled Editor mana={1}{R} type=Creature — Human Bureaucrat @@ -5928,8 +5877,14 @@ subtype=Turtle power=2 toughness=4 [/card] +#bug phasealter not turning off [card] name=Gibbering Descent +abilities=madness +autoexile=restriction{discarded} pay({2}{B}{B}) name(pay 2BB to cast) activate name(pay 2BB to cast) castcard(normal)?name(put in graveyard) moveto(ownergraveyard) +auto=@each my upkeep:life:-1 controller && reject target(*|myhand) +auto=@each opponentupkeep:life:-1 opponent && ability$!name(discard) target(*|myhand) reject!$ opponent +auto=this(variable{phandcount} <1) phasealter(remove,upkeep,controller) text=At the beginning of each player's upkeep, that player loses 1 life and discards a card. -- Hellbent - Skip your upkeep step if you have no cards in hand. -- Madness {2}{B}{B} (If you discard this card, you may cast it for its madness cost instead of putting it into your graveyard.) mana={4}{B}{B} type=Enchantment @@ -6429,15 +6384,6 @@ power=0 toughness=3 [/card] [card] -name=Gorgon Recluse -text=Whenever Gorgon Recluse blocks or becomes blocked by a nonblack creature, destroy that creature at end of combat. -- Madness {B}{B} (If you discard this card, you may cast it for its madness cost instead of putting it into your graveyard.) -mana={3}{B}{B} -type=Creature -subtype=Gorgon -power=2 -toughness=4 -[/card] -[card] name=Gorilla Berserkers text=Trample; rampage 2 (Whenever this creature becomes blocked, it gets +2/+2 until end of turn for each creature blocking it beyond the first.) -- Gorilla Berserkers can't be blocked except by three or more creatures. mana={3}{G}{G} @@ -7441,12 +7387,6 @@ power=1 toughness=1 [/card] [card] -name=Ichor Slick -text=Target creature gets -3/-3 until end of turn. -- Cycling {2} ({2}, Discard this card: Draw a card.) -- Madness {3}{B} (If you discard this card, you may cast it for its madness cost instead of putting it into your graveyard.) -mana={2}{B} -type=Sorcery -[/card] -[card] name=Icy Prison text=When Icy Prison enters the battlefield, exile target creature. -- At the beginning of your upkeep, sacrifice Icy Prison unless any player pays {3}. -- When Icy Prison leaves the battlefield, return the exiled creature to the battlefield under its owner's control. mana={U}{U} @@ -11068,12 +11008,6 @@ type=Legendary Artifact subtype=Equipment [/card] [card] -name=Obsessive Search -text=Draw a card. -- Madness {U} (If you discard this card, you may cast it for its madness cost instead of putting it into your graveyard.) -mana={U} -type=Instant -[/card] -[card] name=Obstinate Baloth auto=life:4 text=When Obstinate Baloth enters the battlefield, you gain 4 life. -- If a spell or ability an opponent controls causes you to discard Hardheaded Baloth, put it onto the battlefield instead of putting it into your graveyard. @@ -12425,12 +12359,6 @@ mana={1}{B}{B} type=Sorcery [/card] [card] -name=Psychotic Haze -text=Psychotic Haze deals 1 damage to each creature and each player. -- Madness {1}{B} (If you discard this card, you may cast it for its madness cost instead of putting it into your graveyard.) -mana={2}{B}{B} -type=Instant -[/card] -[card] name=Puca's Mischief text=At the beginning of your upkeep, you may exchange control of target nonland permanent you control and target nonland permanent an opponent controls with an equal or lesser converted mana cost. mana={3}{U} @@ -12983,15 +12911,6 @@ mana={W} type=Instant [/card] [card] -name=Reckless Wurm -text=Trample -- Madness {2}{R} (If you discard this card, you may cast it for its madness cost instead of putting it into your graveyard.) -mana={3}{R}{R} -type=Creature -subtype=Wurm -power=4 -toughness=4 -[/card] -[card] name=Reclamation auto=lord(creature[black]) cantattack auto=lord(creature[black]) {S(land|myinplay)}:-cantattack @@ -16054,20 +15973,6 @@ mana={X}{R} type=Instant [/card] [card] -name=Strength of Isolation -text=Enchant creature -- Enchanted creature gets +1/+2 and has protection from black. -- Madness {W} (If you discard this card, you may cast it for its madness cost instead of putting it into your graveyard.) -mana={1}{W} -type=Enchantment -subtype=Aura -[/card] -[card] -name=Strength of Lunacy -text=Enchant creature -- Enchanted creature gets +2/+1 and has protection from white. -- Madness {B} (If you discard this card, you may cast it for its madness cost instead of putting it into your graveyard.) -mana={1}{B} -type=Enchantment -subtype=Aura -[/card] -[card] name=Strength of the Tajuru text=Multikicker {1} (You may pay an additional {1} any number of times as you cast this spell.) -- Choose target creature, then choose another target creature for each time Strength of the Tajuru was kicked. Put X +1/+1 counters on each of them. mana={X}{G}{G} diff --git a/projects/mtg/include/MTGCardInstance.h b/projects/mtg/include/MTGCardInstance.h index 3d460bfdd..2ba30835d 100644 --- a/projects/mtg/include/MTGCardInstance.h +++ b/projects/mtg/include/MTGCardInstance.h @@ -241,6 +241,7 @@ public: bool isSwitchedPT; bool isACopier; bool bypassTC; + bool discarded; void eventattacked(); void eventattackedAlone(); diff --git a/projects/mtg/include/MTGDefinitions.h b/projects/mtg/include/MTGDefinitions.h index a070722a1..8614ec853 100644 --- a/projects/mtg/include/MTGDefinitions.h +++ b/projects/mtg/include/MTGDefinitions.h @@ -230,7 +230,8 @@ class Constants NOLIFEGAIN = 112, NOLIFEGAINOPPONENT = 113, AURAWARD = 114, - NB_BASIC_ABILITIES = 115, + MADNESS = 115, + NB_BASIC_ABILITIES = 116, RARITY_S = 'S', //Special Rarity diff --git a/projects/mtg/include/MTGRules.h b/projects/mtg/include/MTGRules.h index 5a5fbf2cb..bd31cfc83 100644 --- a/projects/mtg/include/MTGRules.h +++ b/projects/mtg/include/MTGRules.h @@ -76,7 +76,7 @@ public: MTGPutInPlayRule(GameObserver* observer, int _id); const string getMenuText() { - return "cast card normally"; + return "Cast Card Normally"; } virtual MTGPutInPlayRule * clone() const; }; @@ -90,7 +90,7 @@ public: MTGKickerRule(GameObserver* observer, int _id); const string getMenuText() { - return "pay kicker"; + return "Pay Kicker"; } virtual MTGKickerRule * clone() const; }; @@ -110,7 +110,7 @@ public: { if(alternativeName.size()) return alternativeName.c_str(); - return "pay alternative cost"; + return "Pay Alternative Cost"; } virtual MTGAlternativeCostRule * clone() const; }; @@ -124,7 +124,7 @@ public: MTGBuyBackRule(GameObserver* observer, int _id); const string getMenuText() { - return "cast and buy back"; + return "Cast and Buyback"; } virtual MTGBuyBackRule * clone() const; }; @@ -139,7 +139,7 @@ public: MTGFlashBackRule(GameObserver* observer, int _id); const string getMenuText() { - return "flash back"; + return "Flashback"; } virtual MTGFlashBackRule * clone() const; }; @@ -153,7 +153,7 @@ public: MTGRetraceRule(GameObserver* observer, int _id); const string getMenuText() { - return "retrace"; + return "Retrace"; } virtual MTGRetraceRule * clone() const; }; @@ -168,7 +168,7 @@ public: MTGMorphCostRule(GameObserver* observer, int _id); const string getMenuText() { - return "play morphed"; + return "Play Morphed"; } virtual MTGMorphCostRule * clone() const; }; @@ -182,7 +182,7 @@ public: MTGPlayFromGraveyardRule(GameObserver* observer, int _id); const string getMenuText() { - return "cast card from graveyard"; + return "Cast Card From Graveyard"; } virtual MTGPlayFromGraveyardRule * clone() const; }; diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index 622d20af1..6efa07997 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -1160,14 +1160,14 @@ int GenericPaidAbility::resolve() baseAbility->target = target; optionalCost = ManaCost::parseManaCost(baseCost, NULL, source); - // hacky way to produce better MenuText + /*// hacky way to produce better MenuText AAFakeAbility* isFake = dynamic_cast< AAFakeAbility* >( baseAbility ); size_t findPayN = isFake->named.find(" {value} mana"); if (isFake && findPayN != string::npos) { stringstream parseN; parseN << optionalCost->getCost(Constants::MTG_COLOR_ARTIFACT); isFake->named.replace(findPayN + 1, 7, parseN.str()); - } + }//commented out, it crashes cards with recover ability*/ MTGAbility * set = baseAbility->clone(); set->oneShot = true; @@ -5724,7 +5724,7 @@ const string AACastCard::getMenuText() return nameThis.c_str(); if(putinplay) return "Put Into Play"; - return "Cast For Free"; + return "Cast Card"; } AACastCard * AACastCard::clone() const diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index 122553f4e..eca1ae89a 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -411,6 +411,13 @@ int AbilityFactory::parseCastRestrictions(MTGCardInstance * card, Player * playe } } + check = restriction[i].find("discarded"); + if(check != string::npos) + { + if(!card->discarded) + return 0; + } + check = restriction[i].find("ownerscontrol"); if(check != string::npos) { @@ -3542,6 +3549,9 @@ int AbilityFactory::abilityEfficiency(MTGAbility * a, Player * p, int mode, Targ badAbilities[(int)Constants::WEAK] = true; badAbilities[(int)Constants::NOLIFEGAIN] = true; badAbilities[(int)Constants::NOLIFEGAINOPPONENT] = true; + badAbilities[(int)Constants::CANTLOSE] = false; + badAbilities[(int)Constants::CANTLIFELOSE] = false; + badAbilities[(int)Constants::CANTMILLLOSE] = false; if (AInstantBasicAbilityModifierUntilEOT * abi = dynamic_cast(a)) { diff --git a/projects/mtg/src/MTGCardInstance.cpp b/projects/mtg/src/MTGCardInstance.cpp index b40c368e4..a1851ba9c 100644 --- a/projects/mtg/src/MTGCardInstance.cpp +++ b/projects/mtg/src/MTGCardInstance.cpp @@ -58,6 +58,7 @@ MTGCardInstance::MTGCardInstance(MTGCard * card, MTGPlayerCards * arg_belongs_to isSwitchedPT = false; isACopier = false; bypassTC = false; + discarded = false; } MTGCardInstance * MTGCardInstance::createSnapShot() diff --git a/projects/mtg/src/MTGDefinitions.cpp b/projects/mtg/src/MTGDefinitions.cpp index ba7362fbb..5ae7b685a 100644 --- a/projects/mtg/src/MTGDefinitions.cpp +++ b/projects/mtg/src/MTGDefinitions.cpp @@ -143,7 +143,8 @@ const char* Constants::MTGBasicAbilities[] = { "spellmastery", "nolifegain", "nolifegainopponent", - "auraward" + "auraward", + "madness" }; map Constants::MTGBasicAbilitiesMap; diff --git a/projects/mtg/src/MTGGameZones.cpp b/projects/mtg/src/MTGGameZones.cpp index 04dd8d629..24203ed99 100644 --- a/projects/mtg/src/MTGGameZones.cpp +++ b/projects/mtg/src/MTGGameZones.cpp @@ -325,6 +325,15 @@ MTGCardInstance * MTGPlayerCards::putInZone(MTGCardInstance * card, MTGGameZone bool ripToken = false; if (g->players[0]->game->battlefield->hasName("Rest in Peace")||g->players[1]->game->battlefield->hasName("Rest in Peace")) ripToken = true; + //Madness or Put in Play... + for(int i = 0; i < 2; ++i) + { + if (card->discarded && (to == g->players[i]->game->graveyard) && (from == g->players[i]->game->hand)) + { + if(card->basicAbilities[(int)Constants::MADNESS]) + to = g->players[i]->game->exile; + } + } //Darksteel Colossus, Legacy Weapon ... top priority since we replace destination directly automatically... for(int i = 0; i < 2; ++i) { @@ -361,6 +370,13 @@ MTGCardInstance * MTGPlayerCards::putInZone(MTGCardInstance * card, MTGGameZone { copy->miracle = true; } + if (card->discarded) + {//set discarded for madness... + if(from == g->players[0]->game->hand || from == g->players[1]->game->hand) + copy->discarded = true; + else//turn off discarded if its previous zone is not in hand... + copy->discarded = false; + } if (options[Options::SFXVOLUME].number > 0) { if (to == g->players[0]->game->graveyard || to == g->players[1]->game->graveyard) diff --git a/projects/mtg/src/WEvent.cpp b/projects/mtg/src/WEvent.cpp index df09f764c..de8165422 100644 --- a/projects/mtg/src/WEvent.cpp +++ b/projects/mtg/src/WEvent.cpp @@ -106,6 +106,7 @@ WEventCardSacrifice::WEventCardSacrifice(MTGCardInstance * card, MTGCardInstance WEventCardDiscard::WEventCardDiscard(MTGCardInstance * card) : WEventCardUpdate(card) { + card->discarded = true; } WEventCardCycle::WEventCardCycle(MTGCardInstance * card) : From 0bab560e894f30e01066348a96346420684bdb69 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Tue, 29 Sep 2015 10:42:29 +0800 Subject: [PATCH 160/249] Fix Cloner and Copier abilities --- projects/mtg/include/AllAbilities.h | 4 ++++ projects/mtg/include/CardPrimitive.h | 1 + projects/mtg/include/MTGCardInstance.h | 2 ++ projects/mtg/src/AllAbilities.cpp | 24 ++++++++++++++++++++++-- projects/mtg/src/CardPrimitive.cpp | 2 ++ projects/mtg/src/GameObserver.cpp | 5 +++++ projects/mtg/src/MTGCardInstance.cpp | 4 ++++ 7 files changed, 40 insertions(+), 2 deletions(-) diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index 1f1b519f3..038c16962 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -2068,6 +2068,7 @@ public: assert(value < 2); _target->basicAbilities.set(ability, value > 0); + _target->modifiedbAbi += 1; return InstantAbility::addToGame(); } @@ -2080,7 +2081,10 @@ public: { MTGCardInstance * _target = (MTGCardInstance *) target; if (_target) + { _target->basicAbilities.set(ability, stateBeforeActivation); + _target->modifiedbAbi -= 1; + } return 1; } diff --git a/projects/mtg/include/CardPrimitive.h b/projects/mtg/include/CardPrimitive.h index f02cd7d16..057698922 100644 --- a/projects/mtg/include/CardPrimitive.h +++ b/projects/mtg/include/CardPrimitive.h @@ -58,6 +58,7 @@ public: uint8_t colors; typedef std::bitset BasicAbilitiesSet; BasicAbilitiesSet basicAbilities; + BasicAbilitiesSet origbasicAbilities; map magicTexts; string magicText; diff --git a/projects/mtg/include/MTGCardInstance.h b/projects/mtg/include/MTGCardInstance.h index 2ba30835d..635eaab23 100644 --- a/projects/mtg/include/MTGCardInstance.h +++ b/projects/mtg/include/MTGCardInstance.h @@ -242,6 +242,8 @@ public: bool isACopier; bool bypassTC; bool discarded; + int copiedID; + int modifiedbAbi; void eventattacked(); void eventattackedAlone(); diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index 6efa07997..4eaff7a7f 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -390,8 +390,20 @@ int AACopier::resolve() MTGCardInstance * _target = (MTGCardInstance *) target; if (_target) { - source->copy(_target); - source->isACopier = true; + if(_target->isACopier) + { + MTGCard* clone = MTGCollection()->getCardById(_target->copiedID); + MTGCardInstance * myClone = NEW MTGCardInstance(clone, source->controller()->game); + source->copy(myClone); + source->isACopier = true; + source->copiedID = _target->copiedID; + } + else + { + source->copy(_target); + source->isACopier = true; + source->copiedID = _target->getId(); + } return 1; } return 0; @@ -2520,6 +2532,10 @@ int AACloner::resolve() // Use id of the card to have the same image as the original MTGCard* clone = (_target->isToken ? _target: MTGCollection()->getCardById(_target->getId())); + // If its a copier then copy what it is + if(_target->isACopier) + clone = _target; + Player * targetPlayer = who == 1 ? source->controller()->opponent() : source->controller(); int tokenize = 1;//tokenizer support for cloning @@ -2575,6 +2591,8 @@ int AACloner::resolve() { spell->source->addType(*it); } + spell->source->modifiedbAbi = _target->modifiedbAbi; + spell->source->origbasicAbilities = _target->origbasicAbilities; delete spell; } return 1; @@ -4157,6 +4175,7 @@ for (it = types.begin(); it != types.end(); it++) for (it = abilities.begin(); it != abilities.end(); it++) { _target->basicAbilities.set(*it); + _target->modifiedbAbi += 1; } if(newAbilityFound) @@ -4305,6 +4324,7 @@ int ATransformer::destroy() for (it = abilities.begin(); it != abilities.end(); it++) { _target->basicAbilities.reset(*it); + _target->modifiedbAbi -= 1; } for (it = oldcolors.begin(); it != oldcolors.end(); it++) diff --git a/projects/mtg/src/CardPrimitive.cpp b/projects/mtg/src/CardPrimitive.cpp index 462457492..566b1c03e 100644 --- a/projects/mtg/src/CardPrimitive.cpp +++ b/projects/mtg/src/CardPrimitive.cpp @@ -41,6 +41,7 @@ CardPrimitive::CardPrimitive(CardPrimitive * source) if(!source) return; basicAbilities = source->basicAbilities; + origbasicAbilities = source->basicAbilities; for (size_t i = 0; i < source->types.size(); ++i) types.push_back(source->types[i]); @@ -76,6 +77,7 @@ CardPrimitive::~CardPrimitive() int CardPrimitive::init() { basicAbilities.reset(); + origbasicAbilities.reset(); types.clear(); diff --git a/projects/mtg/src/GameObserver.cpp b/projects/mtg/src/GameObserver.cpp index 95d0311fe..640bbc2c0 100644 --- a/projects/mtg/src/GameObserver.cpp +++ b/projects/mtg/src/GameObserver.cpp @@ -804,6 +804,11 @@ void GameObserver::gameStateBasedEffects() c->damageToOpponent = false; c->damageToCreature = false; c->isAttacking = NULL; + if(c->modifiedbAbi > 0) + { + c->modifiedbAbi = 0; + c->basicAbilities = c->origbasicAbilities; + } } for (int t = 0; t < nbcards; t++) { diff --git a/projects/mtg/src/MTGCardInstance.cpp b/projects/mtg/src/MTGCardInstance.cpp index a1851ba9c..abe1ea1be 100644 --- a/projects/mtg/src/MTGCardInstance.cpp +++ b/projects/mtg/src/MTGCardInstance.cpp @@ -59,6 +59,8 @@ MTGCardInstance::MTGCardInstance(MTGCard * card, MTGPlayerCards * arg_belongs_to isACopier = false; bypassTC = false; discarded = false; + copiedID = getId(); + modifiedbAbi = 0; } MTGCardInstance * MTGCardInstance::createSnapShot() @@ -76,6 +78,8 @@ void MTGCardInstance::copy(MTGCardInstance * card) CardPrimitive * data = source->data; basicAbilities = card->basicAbilities; + origbasicAbilities = card->origbasicAbilities; + modifiedbAbi = card->modifiedbAbi; for (size_t i = 0; i < data->types.size(); i++) { types.push_back(data->types[i]); From 9b7960213422446f3cf45f00dd2efbe40f232680 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Tue, 29 Sep 2015 14:31:31 +0800 Subject: [PATCH 161/249] Moved modifiedbAbi block --- projects/mtg/src/GameObserver.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/projects/mtg/src/GameObserver.cpp b/projects/mtg/src/GameObserver.cpp index 640bbc2c0..342e2db97 100644 --- a/projects/mtg/src/GameObserver.cpp +++ b/projects/mtg/src/GameObserver.cpp @@ -804,11 +804,6 @@ void GameObserver::gameStateBasedEffects() c->damageToOpponent = false; c->damageToCreature = false; c->isAttacking = NULL; - if(c->modifiedbAbi > 0) - { - c->modifiedbAbi = 0; - c->basicAbilities = c->origbasicAbilities; - } } for (int t = 0; t < nbcards; t++) { @@ -829,6 +824,11 @@ void GameObserver::gameStateBasedEffects() } } + if(c->modifiedbAbi > 0) + { + c->modifiedbAbi = 0; + c->basicAbilities = c->origbasicAbilities; + } if(nbcards > z->nb_cards) { t = 0; From 8eddcfb6392155f27794e39e446fa06d8000ffa4 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Tue, 29 Sep 2015 15:09:29 +0800 Subject: [PATCH 162/249] added converge keyword converge returns the number of colors spent when casting the spell. example you pay {2}{W}{W}{R}{B}, converge returns 3, white, black and red colors spent with... --- projects/mtg/include/AllAbilities.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index 038c16962..e553a284b 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -556,6 +556,15 @@ private: intValue = card->previous->previous->sunburst; } } + else if (s == "converge") + { + intValue = 0; + for (int i = Constants::MTG_COLOR_GREEN; i <= Constants::MTG_COLOR_WHITE; ++i) + { + if(card->getManaCost()->getManaUsedToCast()->hasColor(i)) + intValue +=1; + } + } else if (s == "targetedcurses") { if(card->playerTarget) From e1c02c8bf5ef1dc5840dbbcaa2c507f88385e871 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Wed, 30 Sep 2015 23:45:54 +0800 Subject: [PATCH 163/249] produceextra, lki(last known information) for power, toughness and basic abilities --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 16 ++++----- projects/mtg/include/AllAbilities.h | 35 ++++++++++++++++++-- projects/mtg/include/CardPrimitive.h | 1 + projects/mtg/include/MTGCardInstance.h | 4 +++ projects/mtg/src/AllAbilities.cpp | 12 +++---- projects/mtg/src/CardPrimitive.cpp | 1 + projects/mtg/src/GameObserver.cpp | 3 ++ projects/mtg/src/MTGAbility.cpp | 8 ++++- projects/mtg/src/MTGCardInstance.cpp | 16 +++++++++ projects/mtg/src/MTGRules.cpp | 4 +-- 10 files changed, 80 insertions(+), 20 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 898605725..e39702b49 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -20600,7 +20600,7 @@ toughness=1 [card] name=Crypt Ghast auto=@movedto(*|mystack):pay({WB}) life:-1 opponent && life:1 controller -auto=@tappedformana(swamp|mybattlefield):Add{B} +auto=lord(swamp|mybattlefield) transforms((,newability[produceextra:{B}])) text=Extort (Whenever you cast a spell, you may pay {WB}. If you do, each opponent loses 1 life and you gain that much life.) -- Whenever you tap a Swamp for mana, add {B} to your mana pool (in addition to the mana the land produces). mana={3}{B} type=Creature @@ -37695,8 +37695,7 @@ toughness=3 [card] name=Gauntlet of Might auto=lord(creature[red]) 1/1 -auto=@tappedformana(mountain|mybattlefield):Add{R} controller -auto=@tappedformana(mountain|opponentbattlefield):Add{R} opponent +auto=lord(mountain|battlefield) transforms((,newability[produceextra:{R}])) text=Red creatures get +1/+1. -- Whenever a Mountain is tapped for mana, its controller adds {R} to his or her mana pool (in addition to the mana the land produces). mana={4} type=Artifact @@ -45724,7 +45723,7 @@ toughness=4 [/card] [card] name=High Tide -auto=all(island) transforms((,newability[@tappedformana(this):add{U}])) ueot +auto=all(island) transforms((,newability[produceextra:{U}])) ueot text=Until end of turn, whenever a player taps an Island for mana, that player adds {U} to his or her mana pool (in addition to the mana the land produces). mana={U} type=Instant @@ -67601,7 +67600,7 @@ toughness=2 [/card] [card] name=Nirkana Revenant -auto=@tappedformana(swamp|mybattlefield):Add{B} +auto=lord(swamp|mybattlefield) transforms((,newability[produceextra:{B}])) auto={B}:1/1 text=Whenever you tap a Swamp for mana, add {B} to your mana pool (in addition to the mana the land produces). -- {B}:Nirkana Revenant gets +1/+1 until end of turn. type=Creature @@ -70229,7 +70228,7 @@ subtype=Swamp Forest [card] name=Overgrowth target=land -auto=@tappedformana(mytgt):Add{G}{G} targetcontroller +auto=teach(land) transforms((,newability[produceextra:{G}{G}])) text=Enchant land (Target a land as you cast this. This card enters the battlefield attached to that land.) -- Whenever enchanted land is tapped for mana, its controller adds {G}{G} to his or her mana pool (in addition to the mana the land produces). mana={2}{G} type=Enchantment @@ -108293,8 +108292,7 @@ toughness=1 [/card] [card] name=Vernal Bloom -auto=@tappedformana(forest|mybattlefield):Add{G} controller -auto=@tappedformana(forest|opponentbattlefield):Add{G} opponent +auto=lord(forest|battlefield) transforms((,newability[produceextra:{G}])) text=Whenever a Forest is tapped for mana, its controller adds {G} to his or her mana pool (in addition to the mana the land produces). mana={3}{G} type=Enchantment @@ -113018,7 +113016,7 @@ toughness=2 [card] name=Wild Growth target=land -auto=@tappedformana(mytgt):add{g} targetcontroller +auto=teach(land) transforms((,newability[produceextra:{G}])) text=Enchant land -- Whenever enchanted land is tapped for mana, its controller adds {G} to his or her mana pool (in addition to the mana the land produces). mana={G} type=Enchantment diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index e553a284b..eadb8ee5c 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -654,11 +654,11 @@ private: } else if (s == "p" || s == "power") { - intValue = target->getPower(); + intValue = target->getCurrentPower(); } else if (s == "t" || s == "toughness") { - intValue = target->getToughness(); + intValue = target->getCurrentToughness(); } else if (s == "kicked") { @@ -5966,6 +5966,37 @@ public: } }; +//ProduceExtra Mana when tapped for mana +class AProduceExtraAbility: public MTGAbility +{ +public: + string ManaDescription; + + AProduceExtraAbility(GameObserver* observer, int _id, MTGCardInstance * _source, string _ManaDescription) : + MTGAbility(observer, _id, _source) + { + ManaDescription = _ManaDescription; + } + int receiveEvent(WEvent * event) + { + if(WEventCardTappedForMana * isTappedForMana = dynamic_cast (event)) + { + if ((isTappedForMana->card == source) && (isTappedForMana->card->controller() == source->controller())) + { + AManaProducer *amp = NEW AManaProducer(game, game->mLayers->actionLayer()->getMaxId(), source, source->controller(), ManaCost::parseManaCost(ManaDescription,NULL,source), NULL, 0,"",false); + amp->resolve(); + SAFE_DELETE(amp); + } + } + return 1; + } + + AProduceExtraAbility * clone() const + { + return NEW AProduceExtraAbility(*this); + } +}; + //flanking ability class AFlankerAbility: public MTGAbility { diff --git a/projects/mtg/include/CardPrimitive.h b/projects/mtg/include/CardPrimitive.h index 057698922..8f6041baf 100644 --- a/projects/mtg/include/CardPrimitive.h +++ b/projects/mtg/include/CardPrimitive.h @@ -59,6 +59,7 @@ public: typedef std::bitset BasicAbilitiesSet; BasicAbilitiesSet basicAbilities; BasicAbilitiesSet origbasicAbilities; + BasicAbilitiesSet LKIbasicAbilities; map magicTexts; string magicText; diff --git a/projects/mtg/include/MTGCardInstance.h b/projects/mtg/include/MTGCardInstance.h index 635eaab23..fe5d78c5d 100644 --- a/projects/mtg/include/MTGCardInstance.h +++ b/projects/mtg/include/MTGCardInstance.h @@ -233,6 +233,10 @@ public: void addbaseT(int t = 0); void revertbaseP(); void revertbaseT(); + int getCurrentPower(); + int LKIpower; + int LKItoughness; + int getCurrentToughness(); void cdaPT(int p = 0, int t = 0); bool isCDA; void switchPT(bool apply = false); diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index 4eaff7a7f..901b631cb 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -2081,16 +2081,16 @@ int AADynamic::resolve() switch(type) { case DYNAMIC_ABILITY_TYPE_POWER: - sourceamount = ((MTGCardInstance *) source)->power; - targetamount = ((MTGCardInstance *) _target)->power; + sourceamount = ((MTGCardInstance *) source)->getCurrentPower(); + targetamount = ((MTGCardInstance *) _target)->getCurrentPower(); if(eachother ) - sourceamount = ((MTGCardInstance *) source)->power; + sourceamount = ((MTGCardInstance *) source)->getCurrentPower(); break; case DYNAMIC_ABILITY_TYPE_TOUGHNESS: - sourceamount = ((MTGCardInstance *) source)->toughness; - targetamount = ((MTGCardInstance *) _target)->toughness; + sourceamount = ((MTGCardInstance *) source)->getCurrentToughness(); + targetamount = ((MTGCardInstance *) _target)->getCurrentToughness(); if(eachother ) - sourceamount = ((MTGCardInstance *) source)->toughness; + sourceamount = ((MTGCardInstance *) source)->getCurrentToughness(); break; case DYNAMIC_ABILITY_TYPE_MANACOST: if(amountsource == 1) diff --git a/projects/mtg/src/CardPrimitive.cpp b/projects/mtg/src/CardPrimitive.cpp index 566b1c03e..0ed61cd68 100644 --- a/projects/mtg/src/CardPrimitive.cpp +++ b/projects/mtg/src/CardPrimitive.cpp @@ -42,6 +42,7 @@ CardPrimitive::CardPrimitive(CardPrimitive * source) return; basicAbilities = source->basicAbilities; origbasicAbilities = source->basicAbilities; + LKIbasicAbilities = source->basicAbilities; for (size_t i = 0; i < source->types.size(); ++i) types.push_back(source->types[i]); diff --git a/projects/mtg/src/GameObserver.cpp b/projects/mtg/src/GameObserver.cpp index 342e2db97..ee226cdb8 100644 --- a/projects/mtg/src/GameObserver.cpp +++ b/projects/mtg/src/GameObserver.cpp @@ -608,6 +608,9 @@ void GameObserver::gameStateBasedEffects() for (int j = zone->nb_cards - 1; j >= 0; j--) { MTGCardInstance * card = zone->cards[j]; + card->LKIpower = card->power; + card->LKItoughness = card->toughness; + card->LKIbasicAbilities = card->basicAbilities; card->afterDamage(); card->mPropertiesChangedSinceLastUpdate = false; if(card->hasType(Subtypes::TYPE_PLANESWALKER) && (!card->counters||!card->counters->hasCounter("loyalty",0,0))) diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index eca1ae89a..f543c950b 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -2659,6 +2659,12 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG return NEW AEvolveAbility(observer, id, card); } + //produce additional mana when tapped for mana + if (s.find("produceextra:") != string::npos) + { + return NEW AProduceExtraAbility(observer, id, card,s.substr(13)); + } + //flanking if (s.find("flanker") != string::npos) { @@ -4259,7 +4265,7 @@ void AbilityFactory::addAbilities(int _id, Spell * spell) if (current->hasType(Subtypes::TYPE_CREATURE)) { card->controller()->game->putInGraveyard(current); - damage += current->power; + damage += current->getCurrentPower(); } } observer->mLayers->stackLayer()->addDamage(card, target, damage); diff --git a/projects/mtg/src/MTGCardInstance.cpp b/projects/mtg/src/MTGCardInstance.cpp index abe1ea1be..e4ff9beb1 100644 --- a/projects/mtg/src/MTGCardInstance.cpp +++ b/projects/mtg/src/MTGCardInstance.cpp @@ -61,6 +61,8 @@ MTGCardInstance::MTGCardInstance(MTGCard * card, MTGPlayerCards * arg_belongs_to discarded = false; copiedID = getId(); modifiedbAbi = 0; + LKIpower = power; + LKItoughness = toughness; } MTGCardInstance * MTGCardInstance::createSnapShot() @@ -723,6 +725,20 @@ void MTGCardInstance::switchPT(bool apply) } } +int MTGCardInstance::getCurrentPower() +{ + if(!isInPlay(observer)) + return LKIpower; + return power; +} + +int MTGCardInstance::getCurrentToughness() +{ + if(!isInPlay(observer)) + return LKItoughness; + return toughness; +} + int MTGCardInstance::canBlock() { if (tapped) diff --git a/projects/mtg/src/MTGRules.cpp b/projects/mtg/src/MTGRules.cpp index b58090b21..a935992db 100644 --- a/projects/mtg/src/MTGRules.cpp +++ b/projects/mtg/src/MTGRules.cpp @@ -2707,7 +2707,7 @@ int MTGLifelinkRule::receiveEvent(WEvent * event) WEventDamage * e = (WEventDamage *) event; Damage * d = e->damage; MTGCardInstance * card = d->source; - if (d->damage > 0 && card && card->basicAbilities[(int)Constants::LIFELINK]) + if (d->damage > 0 && card && (card->basicAbilities[(int)Constants::LIFELINK]||card->LKIbasicAbilities[(int)Constants::LIFELINK])) { card->controller()->gainLife(d->damage); return 1; @@ -2751,7 +2751,7 @@ int MTGDeathtouchRule::receiveEvent(WEvent * event) return 0; MTGCardInstance * _target = (MTGCardInstance *) (d->target); - if (card->basicAbilities[(int)Constants::DEATHTOUCH]) + if (card->basicAbilities[(int)Constants::DEATHTOUCH]||card->LKIbasicAbilities[(int)Constants::DEATHTOUCH]) { _target->destroy(); return 1; From ddee2c08e28c43feb7977e7fe9759b2f3790567a Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 1 Oct 2015 22:25:26 +0800 Subject: [PATCH 164/249] added stack check, modified life check if activating ability, playing a land or casting sorcery spell at sorcery level(timing restriction), if the stack is not empty, don't allow it. Modified the life state check, if any of the players would lose the game, allow the gamestateeffects to check... added reduceto:value for ali from cairo... --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 24 ++++++++++-- .../bin/Res/sets/primitives/unsupported.txt | 15 -------- projects/mtg/include/AllAbilities.h | 38 +++++++++++++++++++ projects/mtg/include/MTGCardInstance.h | 3 +- projects/mtg/include/Player.h | 2 +- projects/mtg/src/GameObserver.cpp | 4 +- projects/mtg/src/MTGAbility.cpp | 32 ++++------------ projects/mtg/src/MTGCardInstance.cpp | 14 +++++++ projects/mtg/src/MTGRules.cpp | 33 +++++----------- projects/mtg/src/Player.cpp | 18 ++++++++- 10 files changed, 112 insertions(+), 71 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index e39702b49..4fa87979f 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -2168,7 +2168,7 @@ toughness=1 [/card] [card] name=Ali from Cairo -auto=@damaged(controller) restriction{compare(lifetotal)~lessthan~1}:this(controllerlife < 1) lifeset:1 controller +auto=this(controllerlife >= 1) transforms((,newability[reduceto:1])) text=Damage that would reduce your life total to less than 1 reduces it to 1 instead. mana={2}{R}{R} type=Creature @@ -28928,7 +28928,7 @@ toughness=6 name=Elderscale Wurm abilities=trample auto=if compare(lifetotal)~lessthan~7 then lifeset:7 controller -auto=this(controllerlife > 6) transforms((,newability[@damaged(controller):if compare(lifetotal)~lessthan~7 then lifeset:7 controller])) +auto=this(controllerlife >= 7) transforms((,newability[reduceto:7])) text=Trample. -- When Elderscale Wurm enters the battlefield, if your life total is less than 7, your life total becomes 7. -- As long as you have 7 or more life, damage that would reduce your life total to less than 7 reduces it to 7 instead. mana={4}{G}{G}{G} type=Creature @@ -36160,7 +36160,7 @@ toughness=3 name=Fortune Thief facedown={3} autofacedown={R}{R}:morph -auto=@damaged(controller) restriction{compare(lifetotal)~lessthan~1}:this(controllerlife < 1) lifeset:1 controller +auto=this(controllerlife >= 1) transforms((,newability[reduceto:1])) text=Damage that would reduce your life total to less than 1 reduces it to 1 instead. -- Morph {R}{R} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) mana={4}{R} type=Creature @@ -98227,6 +98227,17 @@ power=2 toughness=3 [/card] [card] +name=Sustaining Spirit +auto=cumulativeupcost[{1}{W}] sacrifice +auto=this(controllerlife >= 1) transforms((,newability[reduceto:1])) +text=Cumulative upkeep {1}{W} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -- Damage that would reduce your life total to less than 1 reduces it to 1 instead. +mana={1}{W} +type=Creature +subtype=Angel Spirit +power=0 +toughness=3 +[/card] +[card] name=Sustenance auto={1}{S(land|myBattlefield)}:1/1 target(creature) text={1}, Sacrifice a land: Target creature gets +1/+1 until end of turn. @@ -114654,6 +114665,13 @@ mana={3} type=Artifact [/card] [card] +name=Worship +auto=this(variable{worshipped} >= 1) transforms((,newability[reduceto:1])) +text=If you control a creature, damage that would reduce your life total to less than 1 reduces it to 1 instead. +mana={3}{W} +type=Enchantment +[/card] +[card] name=Worthy Cause auto=life:storedtoughness controller buyback={W}{2} diff --git a/projects/mtg/bin/Res/sets/primitives/unsupported.txt b/projects/mtg/bin/Res/sets/primitives/unsupported.txt index 0f27c9015..1e5340bf6 100644 --- a/projects/mtg/bin/Res/sets/primitives/unsupported.txt +++ b/projects/mtg/bin/Res/sets/primitives/unsupported.txt @@ -16201,15 +16201,6 @@ type=Sorcery text=You gain 2 life. Then if you have more life than an opponent, draw a card. Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) [/card] [card] -name=Sustaining Spirit -text=Cumulative upkeep {1}{W} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -- Damage that would reduce your life total to less than 1 reduces it to 1 instead. -mana={1}{W} -type=Creature -subtype=Angel Spirit -power=0 -toughness=3 -[/card] -[card] name=Sutured Ghoul text=Trample -- As Sutured Ghoul enters the battlefield, exile any number of creature cards from your graveyard. -- Sutured Ghoul's power is equal to the total power of the exiled cards and its toughness is equal to their total toughness. mana={4}{B}{B}{B} @@ -18718,12 +18709,6 @@ mana={2}{B}{B}{B} type=Enchantment [/card] [card] -name=Worship -text=If you control a creature, damage that would reduce your life total to less than 1 reduces it to 1 instead. -mana={3}{W} -type=Enchantment -[/card] -[card] name=Wort, the Raidmother text=When Wort, the Raidmother enters the battlefield, put two 1/1 red and green Goblin Warrior creature tokens onto the battlefield. -- Each red or green instant or sorcery spell you cast has conspire. (As you cast the spell, you may tap two untapped creatures you control that share a color with it. When you do, copy it and you may choose new targets for the copy.) mana={4}{RG}{RG} diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index eadb8ee5c..eebdd4de0 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -688,6 +688,13 @@ private: { intValue = target->controller()->opponent()->game->hand->nb_cards; } + else if (s == "worshipped")//Worship + { + if(card->controller()->game->battlefield->hasType("creature")) + intValue = card->controller()->life; + else + intValue = 0; + } else if (s == "pancientooze")//Ancient Ooze { intValue = 0; @@ -5997,6 +6004,37 @@ public: } }; +//Reduce to .. Ali from Cairo... +class AReduceToAbility: public MTGAbility +{ +public: + string life_s; + + AReduceToAbility(GameObserver* observer, int _id, MTGCardInstance * _source, string _life_s) : + MTGAbility(observer, _id, _source) + { + life_s = _life_s; + } + int receiveEvent(WEvent * event) + { + if(WEventDamage * isDamaged = dynamic_cast (event)) + { + if (isDamaged->damage->target->type_as_damageable == Damageable::DAMAGEABLE_PLAYER) + { + Player * p = (Player *) isDamaged->damage->target; + WParsedInt lifetoset(life_s, NULL, source); + if(p && p == source->controller() && p->life <= lifetoset.getValue()) + p->life = lifetoset.getValue(); + } + } + return 1; + } + AReduceToAbility * clone() const + { + return NEW AReduceToAbility(*this); + } +}; + //flanking ability class AFlankerAbility: public MTGAbility { diff --git a/projects/mtg/include/MTGCardInstance.h b/projects/mtg/include/MTGCardInstance.h index fe5d78c5d..27faf0c1c 100644 --- a/projects/mtg/include/MTGCardInstance.h +++ b/projects/mtg/include/MTGCardInstance.h @@ -234,9 +234,9 @@ public: void revertbaseP(); void revertbaseT(); int getCurrentPower(); + int getCurrentToughness(); int LKIpower; int LKItoughness; - int getCurrentToughness(); void cdaPT(int p = 0, int t = 0); bool isCDA; void switchPT(bool apply = false); @@ -248,6 +248,7 @@ public: bool discarded; int copiedID; int modifiedbAbi; + bool StackIsEmptyandSorcerySpeed(); void eventattacked(); void eventattackedAlone(); diff --git a/projects/mtg/include/Player.h b/projects/mtg/include/Player.h index 800ef7db8..ae3e46007 100644 --- a/projects/mtg/include/Player.h +++ b/projects/mtg/include/Player.h @@ -71,7 +71,7 @@ public: ManaPool * getManaPool(); void takeMulligan(); void serumMulligan(); - bool DeadLifeState(); + bool DeadLifeState(bool check = false); ManaCost * doesntEmpty; ManaCost * poolDoesntEmpty; void cleanupPhase(); diff --git a/projects/mtg/src/GameObserver.cpp b/projects/mtg/src/GameObserver.cpp index ee226cdb8..0b2ac2b4e 100644 --- a/projects/mtg/src/GameObserver.cpp +++ b/projects/mtg/src/GameObserver.cpp @@ -578,6 +578,8 @@ void GameObserver::Update(float dt) { mLayers->actionLayer()->Update(0); } + players[0]->DeadLifeState(); + players[1]->DeadLifeState(); gameStateBasedEffects(); } oldGamePhase = mCurrentGamePhase; @@ -764,7 +766,7 @@ void GameObserver::gameStateBasedEffects() /////////////////////////////////////////////////////////// //life checks/poison checks also checks cant win or lose.// /////////////////////////////////////////////////////////// - players[i]->DeadLifeState();//refactored + players[i]->DeadLifeState(true);//refactored } ////////////////////////////////////////////////////// //-------------card based states effects------------// diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index f543c950b..b660a30fe 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -2665,6 +2665,12 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG return NEW AProduceExtraAbility(observer, id, card,s.substr(13)); } + //reducelife to specific value + if (s.find("reduceto:") != string::npos) + { + return NEW AReduceToAbility(observer, id, card,s.substr(9)); + } + //flanking if (s.find("flanker") != string::npos) { @@ -4594,6 +4600,8 @@ int ActivatedAbility::isReactingToClick(MTGCardInstance * card, ManaCost * mana) return 0; if (cPhase != MTG_PHASE_FIRSTMAIN && cPhase != MTG_PHASE_SECONDMAIN) return 0; + if (player->opponent()->getObserver()->mLayers->stackLayer()->count(0, NOT_RESOLVED) != 0||game->mLayers->stackLayer()->count(0, NOT_RESOLVED) != 0||player->getObserver()->mLayers->stackLayer()->count(0, NOT_RESOLVED) != 0) + return 0; break; } if (restrictions >= MY_BEFORE_BEGIN && restrictions <= MY_AFTER_EOT) @@ -5016,30 +5024,6 @@ int TriggeredAbility::receiveEvent(WEvent * e) resolve(); return 1; } - if(dynamic_cast(e)) - { - //check life state on life triger - WEventLife * lifecheck = dynamic_cast(e); - if (lifecheck->player->DeadLifeState()) - { - return 0; - } - fireAbility(); - return 1; - } - if(dynamic_cast(e)) - { - //check life state on damage trigger - WEventDamage * lifecheck = dynamic_cast(e); - if (lifecheck->damage->target->type_as_damageable == Damageable::DAMAGEABLE_PLAYER) - { - Player * triggerPlayer = (Player *) lifecheck->damage->target; - if(triggerPlayer->DeadLifeState()) - return 0; - } - fireAbility(); - return 1; - } WEventZoneChange * stackCheck = dynamic_cast(e); if(stackCheck && (stackCheck->to == game->currentPlayer->game->stack||stackCheck->to == game->currentPlayer->opponent()->game->stack)) { diff --git a/projects/mtg/src/MTGCardInstance.cpp b/projects/mtg/src/MTGCardInstance.cpp index e4ff9beb1..08236b48c 100644 --- a/projects/mtg/src/MTGCardInstance.cpp +++ b/projects/mtg/src/MTGCardInstance.cpp @@ -739,6 +739,20 @@ int MTGCardInstance::getCurrentToughness() return toughness; } +//check stack +bool MTGCardInstance::StackIsEmptyandSorcerySpeed() +{ + if((getObserver()->mLayers->stackLayer()->count(0, NOT_RESOLVED) == 0) && + (getObserver()->getCurrentGamePhase() == MTG_PHASE_FIRSTMAIN || + getObserver()->getCurrentGamePhase() == MTG_PHASE_SECONDMAIN) && + controller() == getObserver()->currentPlayer && + !getObserver()->isInterrupting) + { + return true; + } + return false; +} + int MTGCardInstance::canBlock() { if (tapped) diff --git a/projects/mtg/src/MTGRules.cpp b/projects/mtg/src/MTGRules.cpp index a935992db..e7fffab29 100644 --- a/projects/mtg/src/MTGRules.cpp +++ b/projects/mtg/src/MTGRules.cpp @@ -310,18 +310,12 @@ int MTGPutInPlayRule::isReactingToClick(MTGCardInstance * card, ManaCost *) { if (game->currentActionPlayer->game->playRestrictions->canPutIntoZone(card, game->currentActionPlayer->game->inPlay) == PlayRestriction::CANT_PLAY) return 0; - if (player == currentPlayer - && (game->getCurrentGamePhase() == MTG_PHASE_FIRSTMAIN || game->getCurrentGamePhase() == MTG_PHASE_SECONDMAIN) - ) - { + if (card->StackIsEmptyandSorcerySpeed()) return 1; - } + else + return 0; } - else if ((card->hasType(Subtypes::TYPE_INSTANT)) || card->has(Constants::FLASH) - || (player == card->controller() && !game->isInterrupting - && (game->getCurrentGamePhase() == MTG_PHASE_FIRSTMAIN - || game->getCurrentGamePhase() == MTG_PHASE_SECONDMAIN)) - ) + else if ((card->hasType(Subtypes::TYPE_INSTANT)) || card->has(Constants::FLASH) || (card->StackIsEmptyandSorcerySpeed())) { if(card->controller()->epic) return 0; @@ -645,17 +639,12 @@ int MTGAlternativeCostRule::isReactingToClick(MTGCardInstance * card, ManaCost * { if (game->currentActionPlayer->game->playRestrictions->canPutIntoZone(card, game->currentActionPlayer->game->inPlay) == PlayRestriction::CANT_PLAY) return 0; - if (player == currentPlayer - && (game->getCurrentGamePhase() == MTG_PHASE_FIRSTMAIN - || game->getCurrentGamePhase() == MTG_PHASE_SECONDMAIN) - ) + if (card->StackIsEmptyandSorcerySpeed()) return 1; + else + return 0; } - else if ((card->hasType(Subtypes::TYPE_INSTANT)) || card->has(Constants::FLASH) || card->has(Constants::SPELLMASTERY) || card->has(Constants::OFFERING) - || (player == card->controller() && !game->isInterrupting - && (game->getCurrentGamePhase() == MTG_PHASE_FIRSTMAIN - || game->getCurrentGamePhase() == MTG_PHASE_SECONDMAIN)) - ) + else if ((card->hasType(Subtypes::TYPE_INSTANT)) || card->has(Constants::FLASH) || card->has(Constants::SPELLMASTERY) || card->has(Constants::OFFERING) || (card->StackIsEmptyandSorcerySpeed())) { if(card->controller()->epic) return 0; @@ -1042,11 +1031,7 @@ int MTGMorphCostRule::isReactingToClick(MTGCardInstance * card, ManaCost *) if(card->controller()->epic)//zoetic cavern... morph is casted for a cost... return 0; //note lands can morph too, this is different from other cost types. - if ((card->hasType(Subtypes::TYPE_INSTANT)) || card->has(Constants::FLASH) || (player == card->controller() - && !game->isInterrupting - && (game->getCurrentGamePhase() == MTG_PHASE_FIRSTMAIN - || game->getCurrentGamePhase() == MTG_PHASE_SECONDMAIN)) - ) + if ((card->hasType(Subtypes::TYPE_INSTANT)) || card->has(Constants::FLASH) || (card->StackIsEmptyandSorcerySpeed())) { if (card->controller()->game->playRestrictions->canPutIntoZone(card, card->controller()->game->stack) == PlayRestriction::CANT_PLAY) return 0; diff --git a/projects/mtg/src/Player.cpp b/projects/mtg/src/Player.cpp index 52d0e311b..445375166 100644 --- a/projects/mtg/src/Player.cpp +++ b/projects/mtg/src/Player.cpp @@ -236,7 +236,7 @@ void Player::serumMulligan() //Draw hand no penalty } -bool Player::DeadLifeState() +bool Player::DeadLifeState(bool check) { if ((life <= 0)||(poisonCount >= 10)) { @@ -263,7 +263,21 @@ bool Player::DeadLifeState() } if (cantlosers < 1) { - getObserver()->setLoser(this); + if(!check) + { + ActionStack * stack = getObserver()->mLayers->stackLayer(); + for (int i = stack->mObjects.size() - 1; i >= 0; i--) + { + Interruptible * current = ((Interruptible *) stack->mObjects[i]); + Spell * spell = (Spell *) current; + if (current->type == ACTION_SPELL) + spell->source->controller()->game->putInGraveyard(spell->source); + + current->state = RESOLVED_NOK; + } + } + if(check) + game->owner->getObserver()->setLoser(this); return true; } } From 4098c306e2594dbfb6a1b61aa05c4f46e08f6bc2 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 1 Oct 2015 22:56:42 +0800 Subject: [PATCH 165/249] removed unused variable. --- projects/mtg/src/MTGRules.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/projects/mtg/src/MTGRules.cpp b/projects/mtg/src/MTGRules.cpp index e7fffab29..6b982ce95 100644 --- a/projects/mtg/src/MTGRules.cpp +++ b/projects/mtg/src/MTGRules.cpp @@ -284,7 +284,6 @@ int MTGPutInPlayRule::isReactingToClick(MTGCardInstance * card, ManaCost *) { int cardsinhand = game->players[0]->game->hand->nb_cards; Player * player = game->currentlyActing(); - Player * currentPlayer = game->currentPlayer; if (!player->game->hand->hasCard(card)) return 0; if ((game->turn < 1) && (cardsinhand != 0) && (card->basicAbilities[(int)Constants::LEYLINE]) @@ -625,7 +624,6 @@ int MTGAlternativeCostRule::isReactingToClick(MTGCardInstance * card, ManaCost * int MTGAlternativeCostRule::isReactingToClick(MTGCardInstance * card, ManaCost *, ManaCost *alternateManaCost) { Player * player = game->currentlyActing(); - Player * currentPlayer = game->currentPlayer; if (!alternateManaCost) return 0; From ec4a9ead74db897f40fdf38739b21cc3083f31cc Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sat, 3 Oct 2015 07:36:52 +0800 Subject: [PATCH 166/249] revised produceextra, added producecolor producecolor:color look for the mana color when engaged produceextra:selectmana acts like tappedformana(mytgt) so the ability must be on the source produceextra:{color} ability on the otherhand, the ability must be on the target --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 39 ++++++----- projects/mtg/include/AllAbilities.h | 74 ++++++++++++-------- projects/mtg/src/AllAbilities.cpp | 72 +++++++++++++++++++ projects/mtg/src/MTGAbility.cpp | 8 ++- 4 files changed, 144 insertions(+), 49 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 4fa87979f..ccff4a50a 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -22294,7 +22294,7 @@ text=At the beginning of your upkeep, you lose 1 life. -- At the beginning of yo mana={2}{B}{B}{B} type=Enchantment [/card] -#tappedformana stack... +#tappedformana stack...produceextra:selectmana don't support combination of mana at the moment since it a mayability not a menuability [card] name=Dawn's Reflection target=land @@ -29463,7 +29463,7 @@ type=Instant [card] name=Elvish Guidance target=land -auto=@tappedformana(mytgt):foreach(elf|myBattlefield) Add{G} targetcontroller +auto=transforms((,newability[foreach(elf|battlefield) produceextra:{G}])) text=Enchant land -- Whenever enchanted land is tapped for mana, its controller adds {G} to his or her mana pool for each Elf on the battlefield (in addition to the mana the land produces). mana={2}{G} type=Enchantment @@ -33016,7 +33016,7 @@ auto=@targeted(this) from(*[instant;sorcery;enchantment]|myhand,mygraveyard):cou text=Heroic - Whenever you cast a spell that targets Favored Hoplite, put a +1/+1 counter on Favored Hoplite and prevent all damage that would be dealt to it this turn. mana={W} type=Creature -subtype=Human Warrior +subtype=Human Soldier power=1 toughness=2 [/card] @@ -33439,11 +33439,11 @@ subtype=Beast power=2 toughness=2 [/card] -#tappedformana stack... +#produceextra:selectmana when used acts as an observer so the ability must be on the source since its a mayability of mana not a menuability [card] name=Fertile Ground target=land -auto=teach(land) transforms((,newability[@tappedformana(this):chooseacolor add{chosencolor} chooseend])) +auto=all(this) transforms((,newability[produceextra:selectmana])) forever text=Enchant land -- Whenever enchanted land is tapped for mana, its controller adds one mana of any color to his or her mana pool (in addition to the mana the land produces). mana={1}{G} type=Enchantment @@ -37700,13 +37700,14 @@ text=Red creatures get +1/+1. -- Whenever a Mountain is tapped for mana, its con mana={4} type=Artifact [/card] +#producecolor looks for the color... maybe needs restriction... [card] name=Gauntlet of Power -auto=choice name(choose white) all(this) transforms((,newability[lord(creature[white]|battlefield) 1/1],newability[@tappedformana(plains[basic]|mybattlefield):add{W}],newability[@tappedformana(plains[basic]|opponentbattlefield):add{W} opponent])) forever -auto=choice name(choose blue) all(this) transforms((,newability[lord(creature[blue]|battlefield) 1/1],newability[@tappedformana(island[basic]|mybattlefield):add{U}],newability[@tappedformana(island[basic]|opponentbattlefield):add{U} opponent])) forever -auto=choice name(choose black) all(this) transforms((,newability[lord(creature[black]|battlefield) 1/1],newability[@tappedformana(swamp[basic]|mybattlefield):add{B}],newability[@tappedformana(swamp[basic]|opponentbattlefield):add{B} opponent])) forever -auto=choice name(choose red) all(this) transforms((,newability[lord(creature[red]|battlefield) 1/1],newability[@tappedformana(mountain[basic]|mybattlefield):add{R}],newability[@tappedformana(mountain[basic]|opponentbattlefield):add{R} opponent])) forever -auto=choice name(choose green) all(this) transforms((,newability[lord(creature[green]|battlefield) 1/1],newability[@tappedformana(forest[basic]|mybattlefield):add{G}],newability[@tappedformana(forest[basic]|opponentbattlefield):add{G} opponent])) forever +auto=choice name(green) all(this) transforms((,newability[lord(creature[green]|battlefield) 1/1],newability[lord(forest[basic]|battlefield) producecolor:green])) forever +auto=choice name(blue) all(this) transforms((,newability[lord(creature[blue]|battlefield) 1/1],newability[lord(island[basic]|battlefield) producecolor:blue])) forever +auto=choice name(red) all(this) transforms((,newability[lord(creature[red]|battlefield) 1/1],newability[lord(mountain[basic]|battlefield) producecolor:red])) forever +auto=choice name(black) all(this) transforms((,newability[lord(creature[black]|battlefield) 1/1],newability[lord(swamp[basic]|battlefield) producecolor:black])) forever +auto=choice name(white) all(this) transforms((,newability[lord(creature[white]|battlefield) 1/1],newability[lord(plains[basic]|battlefield) producecolor:white])) forever text=As Gauntlet of Power enters the battlefield, choose a color. -- Creatures of the chosen color get +1/+1. -- Whenever a basic land is tapped for mana of the chosen color, its controller adds one mana of that color to his or her mana pool (in addition to the mana the land produces). mana={5} type=Artifact @@ -59972,7 +59973,7 @@ subtype=Insect power=2 toughness=3 [/card] -#tappedformana stack... +#tappedformana stack...produceextra:selectmana don't support combination of mana at the moment since it a mayability not a menuability [card] name=Market Festival target=land @@ -61210,7 +61211,7 @@ auto=@movedTo(other creature[power<=2]|myBattlefield):pay({1}) draw:1 text=Whenever another creature with power 2 or less enters the battlefield under your control, you may pay {1}. If you do, draw a card. mana={2}{W} type=Creature -subtype=Human Solider +subtype=Human Soldier power=2 toughness=2 [/card] @@ -103864,12 +103865,12 @@ subtype=Spellshaper power=1 toughness=1 [/card] -#tappedformana stack... +#produceextra:selectmana when used acts as an observer so the ability must be on the source since its a mayability of mana not a menuability [card] name=Trace of Abundance target=land auto=shroud -auto=teach(land) transforms((,newability[@tappedformana(this):chooseacolor add{chosencolor} chooseend])) +auto=all(this) transforms((,newability[produceextra:selectmana])) forever text=Enchant land -- Enchanted land has shroud. (It can't be the target of spells or abilities.) -- Whenever enchanted land is tapped for mana, its controller adds one mana of any color to his or her mana pool (in addition to the mana the land produces). mana={RW}{G} type=Enchantment @@ -107039,7 +107040,11 @@ toughness=2 [card] name=Utopia Sprawl target=forest -auto=chooseacolor transforms((,newability[@tappedformana(mytgt):add{chosencolor}])) forever chooseend +auto=choice name(green) transforms((,newability[produceextra:{g}])) forever +auto=choice name(blue) transforms((,newability[produceextra:{u}])) forever +auto=choice name(red) transforms((,newability[produceextra:{r}])) forever +auto=choice name(black) transforms((,newability[produceextra:{b}])) forever +auto=choice name(white) transforms((,newability[produceextra:{w}])) forever text=Enchant Forest -- As Utopia Sprawl enters the battlefield, choose a color. -- Whenever enchanted Forest is tapped for mana, its controller adds one mana of the chosen color to his or her mana pool (in addition to the mana the land produces). mana={G} type=Enchantment @@ -108223,12 +108228,12 @@ subtype=Elemental power=7 toughness=7 [/card] -#tappedformana stack... +#produceextra:selectmana when used acts as an observer so the ability must be on the source since its a mayability of mana not a menuability [card] name=Verdant Haven target=land auto=life:2 controller -auto=teach(land) transforms((,newability[@tappedformana(this):chooseacolor add{chosencolor} chooseend])) +auto=all(this) transforms((,newability[produceextra:selectmana])) forever text=Enchant land -- When Verdant Haven enters the battlefield, you gain 2 life. -- Whenever enchanted land is tapped for mana, its controller adds one mana of any color to his or her mana pool (in addition to the mana the land produces). mana={2}{G} type=Enchantment diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index eebdd4de0..538dbf4da 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -4800,6 +4800,49 @@ public: ~AVanishing(); }; +//Produce Mana when tapped for mana... +class AProduceMana: public MTGAbility +{ +public: + string ManaDescription; + string mana[5]; + + AProduceMana(GameObserver* observer, int _id, MTGCardInstance * _source, string _ManaDescription); + int receiveEvent(WEvent * event); + int produce(); + const string getMenuText(); + //virtual ostream& toString(ostream& out) const; + AProduceMana * clone() const; + ~AProduceMana(); +}; + +//Produce Mana when a mana is engaged... +class AEngagedManaAbility: public MTGAbility +{ +public: + string colorname; + AEngagedManaAbility(GameObserver* observer, int _id, MTGCardInstance * _source, string _colorname) : + MTGAbility(observer, _id, _source) + { + colorname = _colorname; + } + int receiveEvent(WEvent * event) + { + if(WEventEngageMana * isManaProduced = dynamic_cast (event)) + { + if ((isManaProduced->card == source) && isManaProduced->color == Constants::GetColorStringIndex(colorname)) + { + source->controller()->getManaPool()->add(Constants::GetColorStringIndex(colorname),1); + } + } + return 1; + } + AEngagedManaAbility * clone() const + { + return NEW AEngagedManaAbility(*this); + } +}; + //Upkeep Cost class AUpkeep: public ActivatedAbility, public NestedAbility { @@ -5973,37 +6016,6 @@ public: } }; -//ProduceExtra Mana when tapped for mana -class AProduceExtraAbility: public MTGAbility -{ -public: - string ManaDescription; - - AProduceExtraAbility(GameObserver* observer, int _id, MTGCardInstance * _source, string _ManaDescription) : - MTGAbility(observer, _id, _source) - { - ManaDescription = _ManaDescription; - } - int receiveEvent(WEvent * event) - { - if(WEventCardTappedForMana * isTappedForMana = dynamic_cast (event)) - { - if ((isTappedForMana->card == source) && (isTappedForMana->card->controller() == source->controller())) - { - AManaProducer *amp = NEW AManaProducer(game, game->mLayers->actionLayer()->getMaxId(), source, source->controller(), ManaCost::parseManaCost(ManaDescription,NULL,source), NULL, 0,"",false); - amp->resolve(); - SAFE_DELETE(amp); - } - } - return 1; - } - - AProduceExtraAbility * clone() const - { - return NEW AProduceExtraAbility(*this); - } -}; - //Reduce to .. Ali from Cairo... class AReduceToAbility: public MTGAbility { diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index 901b631cb..6083f5cf2 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -4871,6 +4871,78 @@ AVanishing::~AVanishing() { } +//Produce Mana +AProduceMana::AProduceMana(GameObserver* observer, int _id, MTGCardInstance * _source, string ManaDescription) : +MTGAbility(observer, _id, source),ManaDescription(ManaDescription) +{ + source = _source; + mana[0] = "{g}"; mana[1] = "{u}"; mana[2] = "{r}"; mana[3] = "{b}"; mana[4] = "{w}"; +} + +int AProduceMana::receiveEvent(WEvent * event) +{ + if(WEventCardTappedForMana * isTappedForMana = dynamic_cast (event)) + { + if ((isTappedForMana->card == source)||(isTappedForMana->card == source->target && ManaDescription == "selectmana")) + produce(); + } + return 1; +} + +int AProduceMana::produce() +{ + if(ManaDescription == "selectmana") + {//I tried menu ability and vector to have a shorter code but it crashes wagic at end of turn... + //The may ability on otherhand works but the ability is cumulative... + //This must be wrapped on menuability so we can use it on successions... + AManaProducer *ap0 = NEW AManaProducer(game, game->mLayers->actionLayer()->getMaxId(), source, source->controller(), ManaCost::parseManaCost(mana[0],NULL,source), NULL, 0,"",false); + MayAbility *mw0 = NEW MayAbility(game, game->mLayers->actionLayer()->getMaxId(), ap0, source,true); + MTGAbility *ga0 = NEW GenericAddToGame(game, game->mLayers->actionLayer()->getMaxId(), source,NULL,mw0); + + AManaProducer *ap1 = NEW AManaProducer(game, game->mLayers->actionLayer()->getMaxId(), source, source->controller(), ManaCost::parseManaCost(mana[1],NULL,source), NULL, 0,"",false); + MayAbility *mw1 = NEW MayAbility(game, game->mLayers->actionLayer()->getMaxId(), ap1, source,true); + MTGAbility *ga1 = NEW GenericAddToGame(game, game->mLayers->actionLayer()->getMaxId(), source,NULL,mw1); + + AManaProducer *ap2 = NEW AManaProducer(game, game->mLayers->actionLayer()->getMaxId(), source, source->controller(), ManaCost::parseManaCost(mana[2],NULL,source), NULL, 0,"",false); + MayAbility *mw2 = NEW MayAbility(game, game->mLayers->actionLayer()->getMaxId(), ap2, source,true); + MTGAbility *ga2 = NEW GenericAddToGame(game, game->mLayers->actionLayer()->getMaxId(), source,NULL,mw2); + + AManaProducer *ap3 = NEW AManaProducer(game, game->mLayers->actionLayer()->getMaxId(), source, source->controller(), ManaCost::parseManaCost(mana[3],NULL,source), NULL, 0,"",false); + MayAbility *mw3 = NEW MayAbility(game, game->mLayers->actionLayer()->getMaxId(), ap3, source,true); + MTGAbility *ga3 = NEW GenericAddToGame(game, game->mLayers->actionLayer()->getMaxId(), source,NULL,mw3); + + AManaProducer *ap4 = NEW AManaProducer(game, game->mLayers->actionLayer()->getMaxId(), source, source->controller(), ManaCost::parseManaCost(mana[4],NULL,source), NULL, 0,"",false); + MayAbility *mw4 = NEW MayAbility(game, game->mLayers->actionLayer()->getMaxId(), ap4, source,true); + MTGAbility *ga4 = NEW GenericAddToGame(game, game->mLayers->actionLayer()->getMaxId(), source,NULL,mw4); + + ga0->resolve(); + ga1->resolve(); + ga2->resolve(); + ga3->resolve(); + ga4->resolve(); + } + else + { + AManaProducer *amp = NEW AManaProducer(game, game->mLayers->actionLayer()->getMaxId(), source, source->controller(), ManaCost::parseManaCost(ManaDescription,NULL,source), NULL, 0,"",false); + amp->resolve(); + } + return 1; +} + +const string AProduceMana::getMenuText() +{ + return "Produce Mana"; +} + +AProduceMana * AProduceMana::clone() const +{ + return NEW AProduceMana(*this); +} + +AProduceMana::~AProduceMana() +{ +} + //AUpkeep AUpkeep::AUpkeep(GameObserver* observer, int _id, MTGCardInstance * card, MTGAbility * a, ManaCost * _cost, int restrictions, int _phase, int _once,bool Cumulative) : diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index b660a30fe..34f142492 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -2662,7 +2662,13 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG //produce additional mana when tapped for mana if (s.find("produceextra:") != string::npos) { - return NEW AProduceExtraAbility(observer, id, card,s.substr(13)); + return NEW AProduceMana(observer, id, card,s.substr(13)); + } + + //produce additional mana when a mana is engaged + if (s.find("producecolor:") != string::npos) + { + return NEW AEngagedManaAbility(observer, id, card,s.substr(13)); } //reducelife to specific value From 0c30a4ba5389a57bf22a40287d61a58345518803 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sat, 3 Oct 2015 08:15:05 +0800 Subject: [PATCH 167/249] High Tide fix --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index ccff4a50a..0f7f8133b 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -45724,7 +45724,7 @@ toughness=4 [/card] [card] name=High Tide -auto=all(island) transforms((,newability[produceextra:{U}])) ueot +auto=emblem transforms((,newability[lord(island) produceextra:{U}])) ueot text=Until end of turn, whenever a player taps an Island for mana, that player adds {U} to his or her mana pool (in addition to the mana the land produces). mana={U} type=Instant From f39d4a688ad7391734e19f18080b7f1a07e23146 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sat, 3 Oct 2015 08:54:18 +0800 Subject: [PATCH 168/249] build number --- projects/mtg/Android/AndroidManifest.xml | 2 +- projects/mtg/Android/res/values/strings.xml | 4 ++-- projects/mtg/build.number.properties | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/projects/mtg/Android/AndroidManifest.xml b/projects/mtg/Android/AndroidManifest.xml index 8fd0e2815..a51c2a6e2 100644 --- a/projects/mtg/Android/AndroidManifest.xml +++ b/projects/mtg/Android/AndroidManifest.xml @@ -1,5 +1,5 @@ - + diff --git a/projects/mtg/Android/res/values/strings.xml b/projects/mtg/Android/res/values/strings.xml index bdcff8685..a6bed85a3 100644 --- a/projects/mtg/Android/res/values/strings.xml +++ b/projects/mtg/Android/res/values/strings.xml @@ -1,6 +1,6 @@ Wagic - 0.19.2 - Wagic v0.19.2\\nAll Rights Reserved. + 0.20.1 + Wagic v0.20.1\\nAll Rights Reserved. diff --git a/projects/mtg/build.number.properties b/projects/mtg/build.number.properties index e7ac65b05..2eb721c07 100644 --- a/projects/mtg/build.number.properties +++ b/projects/mtg/build.number.properties @@ -1,6 +1,6 @@ #build.number.properties (normally this file is maintained by build.xml) #Sun, 06 May 2012 11:56:35 -0700 build.major=0 -build.minor=19 -build.point=2 +build.minor=20 +build.point=1 From a5a0aa859aefe52ee3c80b1cc77ee1652ac40e95 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sat, 3 Oct 2015 21:39:54 +0800 Subject: [PATCH 169/249] reverted build --- projects/mtg/Android/AndroidManifest.xml | 2 +- projects/mtg/Android/res/values/strings.xml | 4 ++-- projects/mtg/build.number.properties | 4 ++-- projects/mtg/include/Wagic_Version.h | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/projects/mtg/Android/AndroidManifest.xml b/projects/mtg/Android/AndroidManifest.xml index a51c2a6e2..8fd0e2815 100644 --- a/projects/mtg/Android/AndroidManifest.xml +++ b/projects/mtg/Android/AndroidManifest.xml @@ -1,5 +1,5 @@ - + diff --git a/projects/mtg/Android/res/values/strings.xml b/projects/mtg/Android/res/values/strings.xml index a6bed85a3..bdcff8685 100644 --- a/projects/mtg/Android/res/values/strings.xml +++ b/projects/mtg/Android/res/values/strings.xml @@ -1,6 +1,6 @@ Wagic - 0.20.1 - Wagic v0.20.1\\nAll Rights Reserved. + 0.19.2 + Wagic v0.19.2\\nAll Rights Reserved. diff --git a/projects/mtg/build.number.properties b/projects/mtg/build.number.properties index 2eb721c07..e7ac65b05 100644 --- a/projects/mtg/build.number.properties +++ b/projects/mtg/build.number.properties @@ -1,6 +1,6 @@ #build.number.properties (normally this file is maintained by build.xml) #Sun, 06 May 2012 11:56:35 -0700 build.major=0 -build.minor=20 -build.point=1 +build.minor=19 +build.point=2 diff --git a/projects/mtg/include/Wagic_Version.h b/projects/mtg/include/Wagic_Version.h index 58f7175d4..82d9d8d4b 100644 --- a/projects/mtg/include/Wagic_Version.h +++ b/projects/mtg/include/Wagic_Version.h @@ -12,8 +12,8 @@ Author: Michael Nguyen /* Wagic versions */ #define WAGIC_VERSION_MAJOR 0 -#define WAGIC_VERSION_MEDIUM 20 -#define WAGIC_VERSION_MINOR 1 +#define WAGIC_VERSION_MEDIUM 19 +#define WAGIC_VERSION_MINOR 2 #define VERSION_DOT(a, b, c) a ##.## b ##.## c #define VERSION_WITHOUT_DOT(a, b, c) a ## b ## c From 664589c6420fdf411c0895d75e1b979001b7174d Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 5 Oct 2015 22:03:30 +0800 Subject: [PATCH 170/249] Visual Targeting Indicator, Borders --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 18 ++-- projects/mtg/include/CardGui.h | 6 +- projects/mtg/include/MTGCardInstance.h | 4 + projects/mtg/src/ActionStack.cpp | 9 +- projects/mtg/src/CardDisplay.cpp | 2 +- projects/mtg/src/CardGui.cpp | 93 ++++++++++++++++++-- projects/mtg/src/CardSelector.cpp | 4 +- projects/mtg/src/DeckView.cpp | 9 +- projects/mtg/src/GameObserver.cpp | 17 +++- projects/mtg/src/MTGCardInstance.cpp | 52 +++++++++++ projects/mtg/src/WEvent.cpp | 2 + 11 files changed, 184 insertions(+), 32 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 0f7f8133b..9bd88df8e 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -1493,7 +1493,7 @@ subtype=Ajani [/card] [card] name=Avatar Token -auto=controllerlife/controllerlife cdaactive +auto=lifetotal/lifetotal cdaactive type=Creature subtype=Avatar power=* @@ -86572,7 +86572,7 @@ toughness=1 [/card] [card] name=Serra Avatar -auto=controllerlife/controllerlife cdaactive +auto=lifetotal/lifetotal cdaactive autograveyard=moveTo(ownerlibrary) && shuffle text=Serra Avatar's power and toughness are each equal to your life total. -- When Serra Avatar is put into a graveyard from anywhere, shuffle it into its owner's library. mana={4}{W}{W}{W} @@ -101404,8 +101404,7 @@ toughness=3 [card] name=Thopter Assembly abilities=flying -auto=@each my upkeep restriction{type(other thopter|myBattlefield)~lessthan~1}:token(Thopter,Artifact Creature,1/1,flying)*5 -auto=@each my upkeep restriction{type(other thopter|myBattlefield)~lessthan~1}:moveTo(ownerhand) +auto=@each my upkeep restriction{type(other thopter|myBattlefield)~lessthan~1}:moveTo(ownerhand) and!(token(Thopter,Artifact Creature,1/1,flying)*5)! text=Flying -- At the beginning of your upkeep, if you control no Thopters other than Thopter Assembly, return Thopter Assembly to its owner's hand and put five 1/1 colorless Thopter artifact creature tokens with flying onto the battlefield. mana={6} type=Artifact Creature @@ -102240,9 +102239,7 @@ type=Instant [card] name=Thunderbreak Regent abilities=flying -auto=@targeted(dragon|mybattlefield) from(*|opponentbattlefield):damage:3 opponent -auto=@targeted(dragon|mybattlefield) from(*|opponenthand):damage:3 opponent -auto=@targeted(dragon|mybattlefield) from(*|graveyard):damage:3 opponent +auto=@targeted(dragon|mybattlefield) from(*|opponentbattlefield,opponenthand,opponentstack,opponentgraveyard,opponentexile,opponentlibrary):damage:3 opponent text=Flying -- Whenever a Dragon you control becomes the target of a spell or ability an opponent controls, Thunderbreak Regent deals 3 damage to that player. mana={2}{R}{R} type=Creature @@ -103406,11 +103403,11 @@ power=6 toughness=4 [/card] ###The 2 cards above should stay together (Flip Card)### +#need parser from stack [card] name=Tormented Hero auto=tap -auto=@targeted(this) from(*[instant;sorcery;enchantment]|myhand,mygraveyard):life:-1 opponent -auto=@targeted(this) from(*[instant;sorcery;enchantment]|myhand,mygraveyard):life:1 controller +auto=@targeted(this) from(*|nonbattlezone):life:-1 opponent && life:1 controller text=Tormented Hero enters the battlefield tapped. -- Heroic - Whenever you cast a spell that targets Tormented Hero, each opponent loses 1 life. You gain life equal to the life lost this way. mana={B} type=Creature @@ -104162,8 +104159,7 @@ type=Land [card] name=Transcendence abilities=cantlifelose -auto=this(controllerlife > 19) winGame opponent -auto=@lifed(controller):this(controllerlife > 19) winGame opponent +auto=this(controllerlife > 19)while winGame opponent auto=@damaged(controller):life:twicethatmuch controller auto=@lifeloss(controller):life:twicethatmuch controller text=You don't lose the game for having 0 or less life. -- When you have 20 or more life, you lose the game. -- Whenever you lose life, you gain 2 life for each 1 life you lost. (Damage dealt to you causes you to lose life.) diff --git a/projects/mtg/include/CardGui.h b/projects/mtg/include/CardGui.h index 1957a5505..4ef10700b 100644 --- a/projects/mtg/include/CardGui.h +++ b/projects/mtg/include/CardGui.h @@ -33,7 +33,7 @@ protected: /* ** Tries to render the Big version of a card picture, backups to text version in case of failure */ - static void RenderBig(MTGCard * card, const Pos& pos, bool thumb = false); + static void RenderBig(MTGCard * card, const Pos& pos, bool thumb = false, bool noborder = false); static void RenderCountersBig(MTGCard * card, const Pos& pos, int drawMode = DrawMode::kNormal); static void AlternateRender(MTGCard * card, const Pos& pos); @@ -55,8 +55,8 @@ public: virtual void Render(); virtual void Update(float dt); - void DrawCard(const Pos& inPosition, int inMode = DrawMode::kNormal, bool thumb = false); - static void DrawCard(MTGCard* inCard, const Pos& inPosition, int inMode = DrawMode::kNormal, bool thumb = false); + void DrawCard(const Pos& inPosition, int inMode = DrawMode::kNormal, bool thumb = false, bool noborder = false); + static void DrawCard(MTGCard* inCard, const Pos& inPosition, int inMode = DrawMode::kNormal, bool thumb = false, bool noborder = false); static JQuadPtr AlternateThumbQuad(MTGCard * card); virtual ostream& toString(ostream&) const; diff --git a/projects/mtg/include/MTGCardInstance.h b/projects/mtg/include/MTGCardInstance.h index 27faf0c1c..5146b4940 100644 --- a/projects/mtg/include/MTGCardInstance.h +++ b/projects/mtg/include/MTGCardInstance.h @@ -249,6 +249,10 @@ public: int copiedID; int modifiedbAbi; bool StackIsEmptyandSorcerySpeed(); + bool isTargetted(); + int cardistargetted; + bool isTargetter(); + int cardistargetter; void eventattacked(); void eventattackedAlone(); diff --git a/projects/mtg/src/ActionStack.cpp b/projects/mtg/src/ActionStack.cpp index 24b15752a..7093c2271 100644 --- a/projects/mtg/src/ActionStack.cpp +++ b/projects/mtg/src/ActionStack.cpp @@ -1219,9 +1219,12 @@ void ActionStack::Render() mFont->SetColor(ARGB(255,255,255,255)); JRenderer * renderer = JRenderer::GetInstance(); - renderer->FillRoundRect(x0 + 16, y0 + 16, width + 2, height + 2, 10, ARGB(128,0,0,0)); - renderer->FillRoundRect(x0 - 5, y0, width + 2, height + 2, 10, ARGB(200,0,0,0)); - renderer->DrawRoundRect(x0 - 5, y0, width + 2, height + 2, 10, ARGB(255,255,255,255)); + //stack shadow + renderer->FillRoundRect(x0 - 7, y0+2, width + 17, height + 2, 9.0f, ARGB(128,0,0,0)); + //stack fill + renderer->FillRoundRect(x0 - 7, y0+2, width + 17, height + 2, 9.0f, ARGB(200,10,10,10)); + //stack border + renderer->DrawRoundRect(x0 - 7, y0+2, width + 17, height + 2, 9.0f, ARGB(160,240,240,240)); std::ostringstream stream; // WALDORF - changed "interrupt ?" to "Interrupt?". Don't display count down diff --git a/projects/mtg/src/CardDisplay.cpp b/projects/mtg/src/CardDisplay.cpp index 38cf35913..13c9f2fcd 100644 --- a/projects/mtg/src/CardDisplay.cpp +++ b/projects/mtg/src/CardDisplay.cpp @@ -267,7 +267,7 @@ void CardDisplay::Render() int drawMode = DrawMode::kNormal; if (observer) { - pos.actY = 150; + pos.actY = 145; if (x < (CardGui::BigWidth / 2)) pos.actX = SCREEN_WIDTH - 10 - CardGui::BigWidth / 2; drawMode = observer->getCardSelector()->GetDrawMode(); } diff --git a/projects/mtg/src/CardGui.cpp b/projects/mtg/src/CardGui.cpp index a114df329..2b57a7746 100644 --- a/projects/mtg/src/CardGui.cpp +++ b/projects/mtg/src/CardGui.cpp @@ -111,17 +111,17 @@ void CardGui::Update(float dt) PlayGuiObject::Update(dt); } -void CardGui::DrawCard(const Pos& inPosition, int inMode, bool thumb) +void CardGui::DrawCard(const Pos& inPosition, int inMode, bool thumb, bool noborder) { - DrawCard(card, inPosition, inMode, thumb); + DrawCard(card, inPosition, inMode, thumb, noborder); } -void CardGui::DrawCard(MTGCard* inCard, const Pos& inPosition, int inMode, bool thumb) +void CardGui::DrawCard(MTGCard* inCard, const Pos& inPosition, int inMode, bool thumb, bool noborder) { switch (inMode) { case DrawMode::kNormal: - RenderBig(inCard, inPosition, thumb); + RenderBig(inCard, inPosition, thumb, noborder); break; case DrawMode::kText: AlternateRender(inCard, inPosition); @@ -237,6 +237,30 @@ void CardGui::Render() if (quad) { quad->SetColor(ARGB(static_cast(actA),255,255,255)); + //static border + /*if(card->isTapped()) + { + //focus? + CardView* cv = dynamic_cast(card->view); + if(cv->mHasFocus) + renderer->FillRoundRect(actX - (scale * quad->mWidth / 2)-9.0f,actY - (scale * quad->mHeight / 2)+7, (scale * quad->mHeight)-0.02f, (scale * quad->mWidth)-0.02f, 1.0f,ARGB(250,20,20,20)); + else + renderer->FillRoundRect(actX - (scale * quad->mWidth / 2)-7,actY - (scale * quad->mHeight / 2)+5.5f, (scale * quad->mHeight)-0.02f, (scale * quad->mWidth)-0.02f, 1.0f,ARGB(250,20,20,20)); + } + else + { + renderer->FillRoundRect(actX - (scale * quad->mWidth / 2)-1,actY - (scale * quad->mHeight / 2)-1, (scale * quad->mWidth)-0.02f, (scale * quad->mHeight)-0.02f, 1.0f,ARGB(250,20,20,20)); + }*///the border needs animation when the card rotates...but how? + + //fake border... + JQuadPtr fakeborder; + fakeborder = game? game->getResourceManager()->GetQuad("white"):WResourceManager::Instance()->GetQuad("white"); + if(fakeborder) + { + fakeborder->SetColor(ARGB(255,15,15,15)); + renderer->RenderQuad(fakeborder.get(), actX, actY, actT, (29 * actZ + 1) / 16, 42 * actZ / 16); + } + //draw the card image renderer->RenderQuad(quad.get(), actX, actY, actT, scale, scale); } @@ -277,6 +301,40 @@ void CardGui::Render() } } + //draw border?line + if (card && card->isTargetted()) + { + if(card->isTapped()) + { + //focus? + CardView* cv = dynamic_cast(card->view); + if(cv->mHasFocus) + renderer->DrawRoundRect(actX - (scale * quad->mWidth / 2)-10,actY - (scale * quad->mHeight / 2)+6.5f, (scale * quad->mHeight)-0.02f, (scale * quad->mWidth)-0.02f, 1.8f,ARGB(250,255,0,0)); + else + renderer->DrawRoundRect(actX - (scale * quad->mWidth / 2)-8,actY - (scale * quad->mHeight / 2)+4, (scale * quad->mHeight)-0.02f, (scale * quad->mWidth)-0.02f, 1.8f,ARGB(250,255,0,0)); + } + else + { + renderer->DrawRoundRect(actX - (scale * quad->mWidth / 2)-2,actY - (scale * quad->mHeight / 2)-2, (scale * quad->mWidth)-0.02f, (scale * quad->mHeight)-0.02f, 1.8f,ARGB(250,255,0,0)); + } + } + if (card && card->isTargetter()) + { + if(card->isTapped()) + { + //focus? + CardView* cv = dynamic_cast(card->view); + if(cv->mHasFocus) + renderer->DrawRoundRect(actX - (scale * quad->mWidth / 2)-10,actY - (scale * quad->mHeight / 2)+6.5f, (scale * quad->mHeight)-0.02f, (scale * quad->mWidth)-0.02f, 1.8f,ARGB(250,0,255,0)); + else + renderer->DrawRoundRect(actX - (scale * quad->mWidth / 2)-8,actY - (scale * quad->mHeight / 2)+4, (scale * quad->mHeight)-0.02f, (scale * quad->mWidth)-0.02f, 1.8f,ARGB(250,0,255,0)); + } + else + { + renderer->DrawRoundRect(actX - (scale * quad->mWidth / 2)-2,actY - (scale * quad->mHeight / 2)-2, (scale * quad->mWidth)-0.02f, (scale * quad->mHeight)-0.02f, 1.8f,ARGB(250,0,255,0)); + } + } + //draws the numbers power/toughness if (card->isCreature()) { @@ -988,7 +1046,7 @@ void CardGui::TinyCropRender(MTGCard * card, const Pos& pos, JQuad * quad) } //Renders a big card on screen. Defaults to the "alternate" rendering if no image is found -void CardGui::RenderBig(MTGCard* card, const Pos& pos, bool thumb) +void CardGui::RenderBig(MTGCard* card, const Pos& pos, bool thumb, bool noborder) { JRenderer * renderer = JRenderer::GetInstance(); //GameObserver * game = GameObserver::GetInstance(); @@ -1013,7 +1071,30 @@ void CardGui::RenderBig(MTGCard* card, const Pos& pos, bool thumb) } quad->SetColor(ARGB(255,255,255,255)); float scale = pos.actZ * 250.f / quad->mHeight; - renderer->RenderQuad(quad.get(), x, pos.actY, pos.actT, scale, scale); + //init setname + string cardsetname = setlist[card->setId].c_str(); + if(!noborder) + { + if(cardsetname == "2ED"||cardsetname == "RV"||cardsetname == "4ED"||cardsetname == "5ED"||cardsetname == "6ED"||cardsetname == "7ED"||cardsetname == "8ED"||cardsetname == "9ED"||cardsetname == "CHR") + { + //like white border + renderer->FillRoundRect(x-92,pos.actY-128, (scale * quad->mWidth)-10, (scale * quad->mHeight)-11, 9.0f,ARGB(255,248,248,255)); + //black thin line to simulate card edge + renderer->DrawRoundRect(x-92,pos.actY-128, (scale * quad->mWidth)-10, (scale * quad->mHeight)-11, 9.0f,ARGB(150,20,20,20)); + } + else + { + //like black border + renderer->FillRoundRect(x-92,pos.actY-128, (scale * quad->mWidth)-10, (scale * quad->mHeight)-11, 9.0f,ARGB(255,10,10,10)); + //white thin line to simulate card edge + renderer->DrawRoundRect(x-92,pos.actY-128, (scale * quad->mWidth)-10, (scale * quad->mHeight)-11, 9.0f,ARGB(50,240,240,240)); + } + //render card image + renderer->RenderQuad(quad.get(), x, pos.actY, pos.actT, scale-0.02f, scale-0.02f); + } + else + renderer->RenderQuad(quad.get(), x, pos.actY, pos.actT, scale, scale); + RenderCountersBig(card, pos); return; } diff --git a/projects/mtg/src/CardSelector.cpp b/projects/mtg/src/CardSelector.cpp index ce94a404c..3a7de16a7 100644 --- a/projects/mtg/src/CardSelector.cpp +++ b/projects/mtg/src/CardSelector.cpp @@ -176,7 +176,7 @@ bool CardSelector::CheckUserInput(JButton key) return true; } Target* oldactive = active; - timer = 250; + timer = 800; int x,y; JGE* jge = observer->getInput(); if(!jge) return false; @@ -306,7 +306,7 @@ switch_active: } else { - timer = 250; + timer = 800; } return true; } diff --git a/projects/mtg/src/DeckView.cpp b/projects/mtg/src/DeckView.cpp index 682b75957..394a9322c 100644 --- a/projects/mtg/src/DeckView.cpp +++ b/projects/mtg/src/DeckView.cpp @@ -133,13 +133,13 @@ void DeckView::renderCard(int index, int alpha, bool asThumbnail) else { Pos pos = Pos(cardPosition.x, cardPosition.y, cardPosition.scale * 285 / 250, 0.0, 255); - CardGui::DrawCard(cardPosition.card, pos, asThumbnail); + CardGui::DrawCard(cardPosition.card, pos, asThumbnail, true); } } else { Pos pos = Pos(cardPosition.x, cardPosition.y, cardPosition.scale * 285 / 250, 0.0, 255); - CardGui::DrawCard(cardPosition.card, pos, DrawMode::kText, asThumbnail); + CardGui::DrawCard(cardPosition.card, pos, DrawMode::kText, asThumbnail, true); } } else @@ -147,9 +147,10 @@ void DeckView::renderCard(int index, int alpha, bool asThumbnail) int mode = !options[Options::DISABLECARDS].number ? DrawMode::kNormal : DrawMode::kText; Pos pos = Pos(cardPosition.x, cardPosition.y, cardPosition.scale * 285 / 250, 0.0, 255); - CardGui::DrawCard(cardPosition.card, pos, mode, asThumbnail); + CardGui::DrawCard(cardPosition.card, pos, mode, asThumbnail, true); } - + //the three DrawCard function above, I intentionally disabled the rendered border when in Deck Editor since the border must be dynamically resized + //we can pass variables so the DrawCard method knows what to do to the border but... there must be a better way to do it... int quadAlpha = alpha; if (!deck()->count(cardPosition.card)) quadAlpha /= 2; quadAlpha = 255 - quadAlpha; diff --git a/projects/mtg/src/GameObserver.cpp b/projects/mtg/src/GameObserver.cpp index 0b2ac2b4e..72fcb8aca 100644 --- a/projects/mtg/src/GameObserver.cpp +++ b/projects/mtg/src/GameObserver.cpp @@ -578,8 +578,6 @@ void GameObserver::Update(float dt) { mLayers->actionLayer()->Update(0); } - players[0]->DeadLifeState(); - players[1]->DeadLifeState(); gameStateBasedEffects(); } oldGamePhase = mCurrentGamePhase; @@ -592,6 +590,21 @@ void GameObserver::gameStateBasedEffects() { if(getCurrentTargetChooser() && int(getCurrentTargetChooser()->getNbTargets()) == getCurrentTargetChooser()->maxtargets) getCurrentTargetChooser()->done = true; + ///////////////////////////////////// + for (int d = 0; d < 2; d++) + { + MTGGameZone * zone = players[d]->game->inPlay; + if (mLayers->stackLayer()->count(0, NOT_RESOLVED) == 0) + { + for (int c = zone->nb_cards - 1; c >= 0; c--) + { + zone->cards[c]->cardistargetted = 0; + zone->cards[c]->cardistargetter = 0; + } + } + players[d]->DeadLifeState(); + } + //////////////////////////////////// if (mLayers->stackLayer()->count(0, NOT_RESOLVED) != 0) return; diff --git a/projects/mtg/src/MTGCardInstance.cpp b/projects/mtg/src/MTGCardInstance.cpp index 08236b48c..b1f8318f0 100644 --- a/projects/mtg/src/MTGCardInstance.cpp +++ b/projects/mtg/src/MTGCardInstance.cpp @@ -63,6 +63,8 @@ MTGCardInstance::MTGCardInstance(MTGCard * card, MTGPlayerCards * arg_belongs_to modifiedbAbi = 0; LKIpower = power; LKItoughness = toughness; + cardistargetted = 0; + cardistargetter = 0; } MTGCardInstance * MTGCardInstance::createSnapShot() @@ -753,6 +755,56 @@ bool MTGCardInstance::StackIsEmptyandSorcerySpeed() return false; } +//check targetted? +bool MTGCardInstance::isTargetted() +{ + if(getObserver()->mLayers->stackLayer()->count(0, NOT_RESOLVED) != 0) + { + ActionStack * stack = observer->mLayers->stackLayer(); + for (int i = stack->mObjects.size() - 1; i >= 0; i--) + { + Interruptible * current = ((Interruptible *) stack->mObjects[i]); + if ((current->type == ACTION_SPELL || current->type == ACTION_ABILITY) && current->state == NOT_RESOLVED) + { + if(current->type == ACTION_SPELL) + { + Spell * spell = (Spell *) current; + if(spell->getNextTarget() && spell->getNextTarget() == (Targetable*)this) + return true; + } + } + } + } + if(cardistargetted) + return true; + return false; +} + +//check targetter? +bool MTGCardInstance::isTargetter() +{ + if(getObserver()->mLayers->stackLayer()->count(0, NOT_RESOLVED) != 0) + { + ActionStack * stack = observer->mLayers->stackLayer(); + for (int i = stack->mObjects.size() - 1; i >= 0; i--) + { + Interruptible * current = ((Interruptible *) stack->mObjects[i]); + if ((current->type == ACTION_SPELL || current->type == ACTION_ABILITY) && current->state == NOT_RESOLVED) + { + if(current->type == ACTION_SPELL) + { + Spell * spell = (Spell *) current; + if(spell && spell->source == this) + return true; + } + } + } + } + if(cardistargetter) + return true; + return false; +} + int MTGCardInstance::canBlock() { if (tapped) diff --git a/projects/mtg/src/WEvent.cpp b/projects/mtg/src/WEvent.cpp index de8165422..bba4fa8ef 100644 --- a/projects/mtg/src/WEvent.cpp +++ b/projects/mtg/src/WEvent.cpp @@ -122,6 +122,8 @@ WEventVampire::WEventVampire(MTGCardInstance * card,MTGCardInstance * source,MTG WEventTarget::WEventTarget(MTGCardInstance * card,MTGCardInstance * source) : WEventCardUpdate(card),card(card),source(source) { + card->cardistargetted = 1; + source->cardistargetter = 1; } WEventCardChangeType::WEventCardChangeType(MTGCardInstance * card, int type, bool before, bool after) : From b750cf1f33a7c1067949bda7afa61637ed921c98 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Tue, 6 Oct 2015 10:47:08 +0800 Subject: [PATCH 171/249] fix alpha/transparency on rendered border --- projects/mtg/src/CardGui.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/mtg/src/CardGui.cpp b/projects/mtg/src/CardGui.cpp index 2b57a7746..0851fa42e 100644 --- a/projects/mtg/src/CardGui.cpp +++ b/projects/mtg/src/CardGui.cpp @@ -257,7 +257,7 @@ void CardGui::Render() fakeborder = game? game->getResourceManager()->GetQuad("white"):WResourceManager::Instance()->GetQuad("white"); if(fakeborder) { - fakeborder->SetColor(ARGB(255,15,15,15)); + fakeborder->SetColor(ARGB((int)(actA),15,15,15)); renderer->RenderQuad(fakeborder.get(), actX, actY, actT, (29 * actZ + 1) / 16, 42 * actZ / 16); } //draw the card image From 45b570b6f7c24c16a03da3a63542a679b47821f4 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Wed, 7 Oct 2015 10:53:11 +0800 Subject: [PATCH 172/249] border highlighter --- projects/mtg/src/CardGui.cpp | 53 ++++++++++++++++++++++++++++++++++-- 1 file changed, 51 insertions(+), 2 deletions(-) diff --git a/projects/mtg/src/CardGui.cpp b/projects/mtg/src/CardGui.cpp index 0851fa42e..28628774f 100644 --- a/projects/mtg/src/CardGui.cpp +++ b/projects/mtg/src/CardGui.cpp @@ -260,6 +260,47 @@ void CardGui::Render() fakeborder->SetColor(ARGB((int)(actA),15,15,15)); renderer->RenderQuad(fakeborder.get(), actX, actY, actT, (29 * actZ + 1) / 16, 42 * actZ / 16); } + //draw border for highlighting + if (card && card->isTargetted()) + { + if(card->isTapped()) + { + //focus? + CardView* cv = dynamic_cast(card->view); + if(cv->mHasFocus) + { + renderer->FillRoundRect(actX - (scale * quad->mWidth / 2)-10,actY - (scale * quad->mHeight / 2)+6.5f, (scale * quad->mHeight)-0.02f, (scale * quad->mWidth)-0.02f, 1.8f,ARGB(95,255,0,0)); + } + else + { + renderer->FillRoundRect(actX - (scale * quad->mWidth / 2)-8,actY - (scale * quad->mHeight / 2)+4, (scale * quad->mHeight)-0.02f, (scale * quad->mWidth)-0.02f, 1.8f,ARGB(95,255,0,0)); + } + } + else + { + renderer->FillRoundRect(actX - (scale * quad->mWidth / 2)-2,actY - (scale * quad->mHeight / 2)-2, (scale * quad->mWidth)-0.02f, (scale * quad->mHeight)-0.02f, 1.8f,ARGB(95,255,0,0)); + } + } + if (card && card->isTargetter()) + { + if(card->isTapped()) + { + //focus? + CardView* cv = dynamic_cast(card->view); + if(cv->mHasFocus) + { + renderer->FillRoundRect(actX - (scale * quad->mWidth / 2)-10,actY - (scale * quad->mHeight / 2)+6.5f, (scale * quad->mHeight)-0.02f, (scale * quad->mWidth)-0.02f, 1.8f,ARGB(95,0,245,0)); + } + else + { + renderer->FillRoundRect(actX - (scale * quad->mWidth / 2)-8,actY - (scale * quad->mHeight / 2)+4, (scale * quad->mHeight)-0.02f, (scale * quad->mWidth)-0.02f, 1.8f,ARGB(95,0,245,0)); + } + } + else + { + renderer->FillRoundRect(actX - (scale * quad->mWidth / 2)-2,actY - (scale * quad->mHeight / 2)-2, (scale * quad->mWidth)-0.02f, (scale * quad->mHeight)-0.02f, 1.8f,ARGB(95,0,245,0)); + } + } //draw the card image renderer->RenderQuad(quad.get(), actX, actY, actT, scale, scale); } @@ -301,7 +342,7 @@ void CardGui::Render() } } - //draw border?line + //draw line if (card && card->isTargetted()) { if(card->isTapped()) @@ -309,9 +350,13 @@ void CardGui::Render() //focus? CardView* cv = dynamic_cast(card->view); if(cv->mHasFocus) + { renderer->DrawRoundRect(actX - (scale * quad->mWidth / 2)-10,actY - (scale * quad->mHeight / 2)+6.5f, (scale * quad->mHeight)-0.02f, (scale * quad->mWidth)-0.02f, 1.8f,ARGB(250,255,0,0)); + } else + { renderer->DrawRoundRect(actX - (scale * quad->mWidth / 2)-8,actY - (scale * quad->mHeight / 2)+4, (scale * quad->mHeight)-0.02f, (scale * quad->mWidth)-0.02f, 1.8f,ARGB(250,255,0,0)); + } } else { @@ -320,14 +365,18 @@ void CardGui::Render() } if (card && card->isTargetter()) { - if(card->isTapped()) + if(card->isTapped()) { //focus? CardView* cv = dynamic_cast(card->view); if(cv->mHasFocus) + { renderer->DrawRoundRect(actX - (scale * quad->mWidth / 2)-10,actY - (scale * quad->mHeight / 2)+6.5f, (scale * quad->mHeight)-0.02f, (scale * quad->mWidth)-0.02f, 1.8f,ARGB(250,0,255,0)); + } else + { renderer->DrawRoundRect(actX - (scale * quad->mWidth / 2)-8,actY - (scale * quad->mHeight / 2)+4, (scale * quad->mHeight)-0.02f, (scale * quad->mWidth)-0.02f, 1.8f,ARGB(250,0,255,0)); + } } else { From fb891837672fb3f1e931f293f0022b7d3baf9d7c Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Wed, 7 Oct 2015 10:57:08 +0800 Subject: [PATCH 173/249] support scaling of avatar texture - multiples of 35x50 default was 35x50 avatar texture, if using 3x (105x150), it will scale it :) --- projects/mtg/src/GuiStatic.cpp | 10 +++++----- projects/mtg/src/Player.cpp | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/projects/mtg/src/GuiStatic.cpp b/projects/mtg/src/GuiStatic.cpp index a087d2186..28e00ec2d 100644 --- a/projects/mtg/src/GuiStatic.cpp +++ b/projects/mtg/src/GuiStatic.cpp @@ -60,8 +60,8 @@ void GuiAvatar::Render() { if (corner == BOTTOM_RIGHT) { - x0 -= player->getIcon()->mWidth * actZ; - y0 -= player->getIcon()->mHeight * actZ; + x0 -= Width * actZ; + y0 -= Height * actZ; } switch (corner) { @@ -69,14 +69,14 @@ void GuiAvatar::Render() player->getIcon()->SetHotSpot(0, 0); break; case BOTTOM_RIGHT: - player->getIcon()->SetHotSpot(35, 50); + player->getIcon()->SetHotSpot(player->getIcon()->mWidth, player->getIcon()->mHeight); break; } player->getIcon()->SetColor(ARGB((int)actA, 255, avatarRed, avatarRed)); - r->RenderQuad(player->getIcon().get(), actX, actY, actT, actZ, actZ); + r->RenderQuad(player->getIcon().get(), actX, actY, actT, Width/player->getIcon()->mWidth*actZ, Height/player->getIcon()->mHeight*actZ); if (mHasFocus) { - r->FillRect(x0, x0, player->getIcon()->mWidth * actZ, player->getIcon()->mHeight * actZ, ARGB(abs(128 - wave),255,255,255)); + r->FillRect(x0, x0, Width/player->getIcon()->mWidth * actZ, Height/player->getIcon()->mHeight * actZ, ARGB(abs(128 - wave),255,255,255)); } } diff --git a/projects/mtg/src/Player.cpp b/projects/mtg/src/Player.cpp index 445375166..1efcc0b89 100644 --- a/projects/mtg/src/Player.cpp +++ b/projects/mtg/src/Player.cpp @@ -89,7 +89,7 @@ bool Player::loadAvatar(string file, string resName) } mAvatarTex = rm->RetrieveTexture(file, RETRIEVE_LOCK, TEXTURE_SUB_AVATAR); if (mAvatarTex) { - mAvatar = rm->RetrieveQuad(file, 0, 0, 35, 50, resName, RETRIEVE_NORMAL, TEXTURE_SUB_AVATAR); + mAvatar = rm->RetrieveQuad(file, 0, 0, 0, 0, resName, RETRIEVE_NORMAL, TEXTURE_SUB_AVATAR); return true; } From c2c9e180ea93789cd3fd215b20025eb15074abe1 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Wed, 7 Oct 2015 11:06:59 +0800 Subject: [PATCH 174/249] code cleanup --- projects/mtg/src/CardGui.cpp | 55 +++--------------------------------- 1 file changed, 4 insertions(+), 51 deletions(-) diff --git a/projects/mtg/src/CardGui.cpp b/projects/mtg/src/CardGui.cpp index 28628774f..15ae389f5 100644 --- a/projects/mtg/src/CardGui.cpp +++ b/projects/mtg/src/CardGui.cpp @@ -237,21 +237,6 @@ void CardGui::Render() if (quad) { quad->SetColor(ARGB(static_cast(actA),255,255,255)); - //static border - /*if(card->isTapped()) - { - //focus? - CardView* cv = dynamic_cast(card->view); - if(cv->mHasFocus) - renderer->FillRoundRect(actX - (scale * quad->mWidth / 2)-9.0f,actY - (scale * quad->mHeight / 2)+7, (scale * quad->mHeight)-0.02f, (scale * quad->mWidth)-0.02f, 1.0f,ARGB(250,20,20,20)); - else - renderer->FillRoundRect(actX - (scale * quad->mWidth / 2)-7,actY - (scale * quad->mHeight / 2)+5.5f, (scale * quad->mHeight)-0.02f, (scale * quad->mWidth)-0.02f, 1.0f,ARGB(250,20,20,20)); - } - else - { - renderer->FillRoundRect(actX - (scale * quad->mWidth / 2)-1,actY - (scale * quad->mHeight / 2)-1, (scale * quad->mWidth)-0.02f, (scale * quad->mHeight)-0.02f, 1.0f,ARGB(250,20,20,20)); - }*///the border needs animation when the card rotates...but how? - //fake border... JQuadPtr fakeborder; fakeborder = game? game->getResourceManager()->GetQuad("white"):WResourceManager::Instance()->GetQuad("white"); @@ -265,41 +250,25 @@ void CardGui::Render() { if(card->isTapped()) { - //focus? - CardView* cv = dynamic_cast(card->view); - if(cv->mHasFocus) - { + if(mHasFocus) renderer->FillRoundRect(actX - (scale * quad->mWidth / 2)-10,actY - (scale * quad->mHeight / 2)+6.5f, (scale * quad->mHeight)-0.02f, (scale * quad->mWidth)-0.02f, 1.8f,ARGB(95,255,0,0)); - } else - { renderer->FillRoundRect(actX - (scale * quad->mWidth / 2)-8,actY - (scale * quad->mHeight / 2)+4, (scale * quad->mHeight)-0.02f, (scale * quad->mWidth)-0.02f, 1.8f,ARGB(95,255,0,0)); - } } else - { renderer->FillRoundRect(actX - (scale * quad->mWidth / 2)-2,actY - (scale * quad->mHeight / 2)-2, (scale * quad->mWidth)-0.02f, (scale * quad->mHeight)-0.02f, 1.8f,ARGB(95,255,0,0)); - } } if (card && card->isTargetter()) { if(card->isTapped()) { - //focus? - CardView* cv = dynamic_cast(card->view); - if(cv->mHasFocus) - { + if(mHasFocus) renderer->FillRoundRect(actX - (scale * quad->mWidth / 2)-10,actY - (scale * quad->mHeight / 2)+6.5f, (scale * quad->mHeight)-0.02f, (scale * quad->mWidth)-0.02f, 1.8f,ARGB(95,0,245,0)); - } else - { renderer->FillRoundRect(actX - (scale * quad->mWidth / 2)-8,actY - (scale * quad->mHeight / 2)+4, (scale * quad->mHeight)-0.02f, (scale * quad->mWidth)-0.02f, 1.8f,ARGB(95,0,245,0)); - } } else - { renderer->FillRoundRect(actX - (scale * quad->mWidth / 2)-2,actY - (scale * quad->mHeight / 2)-2, (scale * quad->mWidth)-0.02f, (scale * quad->mHeight)-0.02f, 1.8f,ARGB(95,0,245,0)); - } } //draw the card image renderer->RenderQuad(quad.get(), actX, actY, actT, scale, scale); @@ -347,41 +316,25 @@ void CardGui::Render() { if(card->isTapped()) { - //focus? - CardView* cv = dynamic_cast(card->view); - if(cv->mHasFocus) - { + if(mHasFocus) renderer->DrawRoundRect(actX - (scale * quad->mWidth / 2)-10,actY - (scale * quad->mHeight / 2)+6.5f, (scale * quad->mHeight)-0.02f, (scale * quad->mWidth)-0.02f, 1.8f,ARGB(250,255,0,0)); - } else - { renderer->DrawRoundRect(actX - (scale * quad->mWidth / 2)-8,actY - (scale * quad->mHeight / 2)+4, (scale * quad->mHeight)-0.02f, (scale * quad->mWidth)-0.02f, 1.8f,ARGB(250,255,0,0)); - } } else - { renderer->DrawRoundRect(actX - (scale * quad->mWidth / 2)-2,actY - (scale * quad->mHeight / 2)-2, (scale * quad->mWidth)-0.02f, (scale * quad->mHeight)-0.02f, 1.8f,ARGB(250,255,0,0)); - } } if (card && card->isTargetter()) { if(card->isTapped()) { - //focus? - CardView* cv = dynamic_cast(card->view); - if(cv->mHasFocus) - { + if(mHasFocus) renderer->DrawRoundRect(actX - (scale * quad->mWidth / 2)-10,actY - (scale * quad->mHeight / 2)+6.5f, (scale * quad->mHeight)-0.02f, (scale * quad->mWidth)-0.02f, 1.8f,ARGB(250,0,255,0)); - } else - { renderer->DrawRoundRect(actX - (scale * quad->mWidth / 2)-8,actY - (scale * quad->mHeight / 2)+4, (scale * quad->mHeight)-0.02f, (scale * quad->mWidth)-0.02f, 1.8f,ARGB(250,0,255,0)); - } } else - { renderer->DrawRoundRect(actX - (scale * quad->mWidth / 2)-2,actY - (scale * quad->mHeight / 2)-2, (scale * quad->mWidth)-0.02f, (scale * quad->mHeight)-0.02f, 1.8f,ARGB(250,0,255,0)); - } } //draws the numbers power/toughness From 6a64b094522bbb52b6e1cd0a31bec95d5953adff Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Wed, 7 Oct 2015 18:08:00 +0800 Subject: [PATCH 175/249] replaced fillroundrect border --- projects/mtg/src/CardGui.cpp | 28 ++++++++-------------------- 1 file changed, 8 insertions(+), 20 deletions(-) diff --git a/projects/mtg/src/CardGui.cpp b/projects/mtg/src/CardGui.cpp index 15ae389f5..c7a8c79e9 100644 --- a/projects/mtg/src/CardGui.cpp +++ b/projects/mtg/src/CardGui.cpp @@ -239,36 +239,24 @@ void CardGui::Render() quad->SetColor(ARGB(static_cast(actA),255,255,255)); //fake border... JQuadPtr fakeborder; + JQuadPtr highlightborder; fakeborder = game? game->getResourceManager()->GetQuad("white"):WResourceManager::Instance()->GetQuad("white"); + highlightborder = game? game->getResourceManager()->GetQuad("white"):WResourceManager::Instance()->GetQuad("white"); if(fakeborder) { fakeborder->SetColor(ARGB((int)(actA),15,15,15)); renderer->RenderQuad(fakeborder.get(), actX, actY, actT, (29 * actZ + 1) / 16, 42 * actZ / 16); } //draw border for highlighting - if (card && card->isTargetted()) + if (card && card->isTargetted() && highlightborder) { - if(card->isTapped()) - { - if(mHasFocus) - renderer->FillRoundRect(actX - (scale * quad->mWidth / 2)-10,actY - (scale * quad->mHeight / 2)+6.5f, (scale * quad->mHeight)-0.02f, (scale * quad->mWidth)-0.02f, 1.8f,ARGB(95,255,0,0)); - else - renderer->FillRoundRect(actX - (scale * quad->mWidth / 2)-8,actY - (scale * quad->mHeight / 2)+4, (scale * quad->mHeight)-0.02f, (scale * quad->mWidth)-0.02f, 1.8f,ARGB(95,255,0,0)); - } - else - renderer->FillRoundRect(actX - (scale * quad->mWidth / 2)-2,actY - (scale * quad->mHeight / 2)-2, (scale * quad->mWidth)-0.02f, (scale * quad->mHeight)-0.02f, 1.8f,ARGB(95,255,0,0)); + highlightborder->SetColor(ARGB(95,255,0,0)); + renderer->RenderQuad(highlightborder.get(), actX, actY, actT, (30 * actZ + 1) / 16, 43 * actZ / 16); } - if (card && card->isTargetter()) + if (card && card->isTargetter() && highlightborder) { - if(card->isTapped()) - { - if(mHasFocus) - renderer->FillRoundRect(actX - (scale * quad->mWidth / 2)-10,actY - (scale * quad->mHeight / 2)+6.5f, (scale * quad->mHeight)-0.02f, (scale * quad->mWidth)-0.02f, 1.8f,ARGB(95,0,245,0)); - else - renderer->FillRoundRect(actX - (scale * quad->mWidth / 2)-8,actY - (scale * quad->mHeight / 2)+4, (scale * quad->mHeight)-0.02f, (scale * quad->mWidth)-0.02f, 1.8f,ARGB(95,0,245,0)); - } - else - renderer->FillRoundRect(actX - (scale * quad->mWidth / 2)-2,actY - (scale * quad->mHeight / 2)-2, (scale * quad->mWidth)-0.02f, (scale * quad->mHeight)-0.02f, 1.8f,ARGB(95,0,245,0)); + highlightborder->SetColor(ARGB(95,0,245,0)); + renderer->RenderQuad(highlightborder.get(), actX, actY, actT, (30 * actZ + 1) / 16, 43 * actZ / 16); } //draw the card image renderer->RenderQuad(quad.get(), actX, actY, actT, scale, scale); From 1d1b663f55864bee9cee62805d6baf4c6ad10c36 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Wed, 7 Oct 2015 18:10:00 +0800 Subject: [PATCH 176/249] menutitle scaling can load 2x res... --- projects/mtg/src/GameStateMenu.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/projects/mtg/src/GameStateMenu.cpp b/projects/mtg/src/GameStateMenu.cpp index b6df5f2f8..1306f5f8b 100644 --- a/projects/mtg/src/GameStateMenu.cpp +++ b/projects/mtg/src/GameStateMenu.cpp @@ -141,10 +141,10 @@ void GameStateMenu::Start() WResourceManager::Instance()->ClearUnlocked(); bgTexture = WResourceManager::Instance()->RetrieveTexture("menutitle.png", RETRIEVE_LOCK); - mBg = WResourceManager::Instance()->RetrieveQuad("menutitle.png", 0, 0, 256, 166); // Create background quad for rendering. + mBg = WResourceManager::Instance()->RetrieveQuad("menutitle.png", 0, 0, 0, 0); // Create background quad for rendering. if (mBg) - mBg->SetHotSpot(128, 50); + mBg->SetHotSpot(0, 0); if (MENU_STATE_MAJOR_MAINMENU == currentState) currentState = currentState | MENU_STATE_MINOR_FADEIN; @@ -790,7 +790,7 @@ void GameStateMenu::Render() scroller->Render(); if (mBg.get()) - renderer->RenderQuad(mBg.get(), SCREEN_WIDTH / 2, 50); + renderer->RenderQuad(mBg.get(), (SCREEN_WIDTH/4)-6, 2, 0, 256 / mBg->mWidth, 166 / mBg->mHeight); RenderTopMenu(); From 3ca8aefad70683d17ddf3b4f3206ddc503d189f0 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Wed, 7 Oct 2015 20:59:17 +0800 Subject: [PATCH 177/249] fix bug where walls that can attack activated vs moat in play --- projects/mtg/src/MTGCardInstance.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/projects/mtg/src/MTGCardInstance.cpp b/projects/mtg/src/MTGCardInstance.cpp index b1f8318f0..140c4f5cf 100644 --- a/projects/mtg/src/MTGCardInstance.cpp +++ b/projects/mtg/src/MTGCardInstance.cpp @@ -583,11 +583,13 @@ Player * MTGCardInstance::controller() int MTGCardInstance::canAttack() { + if (basicAbilities[(int)Constants::CANTATTACK]) + return 0; if (tapped) return 0; if (hasSummoningSickness()) return 0; - if ((basicAbilities[(int)Constants::DEFENSER] || basicAbilities[(int)Constants::CANTATTACK]) && !basicAbilities[(int)Constants::CANATTACK]) + if (basicAbilities[(int)Constants::DEFENSER] && !basicAbilities[(int)Constants::CANATTACK]) return 0; if (!isCreature()) return 0; From 5cc2f5b645320c42c36f41adb19c7332c47bbbb7 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 8 Oct 2015 09:51:52 +0800 Subject: [PATCH 178/249] border p/t --- projects/mtg/src/CardGui.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/projects/mtg/src/CardGui.cpp b/projects/mtg/src/CardGui.cpp index c7a8c79e9..0e0c186f2 100644 --- a/projects/mtg/src/CardGui.cpp +++ b/projects/mtg/src/CardGui.cpp @@ -331,8 +331,10 @@ void CardGui::Render() mFont->SetScale(DEFAULT_MAIN_FONT_SCALE); char buffer[200]; sprintf(buffer, "%i/%i", card->power, card->life); - renderer->FillRect(actX - (12 * actZ), actY + 6 * actZ, 25 * actZ, 12 * actZ, + renderer->FillRect(actX - (13 * actZ), actY + 4 * actZ, 25.5f * actZ, 14 * actZ, ARGB(((static_cast(actA))/2),0,0,0)); + renderer->DrawRect(actX - (13 * actZ), actY + 4 * actZ, 25.5f * actZ, 14 * actZ, + ARGB(((static_cast(actA))),20,20,20)); //damaged or buffed or powered down if(card->wasDealtDamage && card->life <= 2) mFont->SetColor(ARGB(static_cast(actA),255,0,0));//red critical and damaged @@ -346,7 +348,7 @@ void CardGui::Render() mFont->SetColor(ARGB(static_cast(actA),255,255,255));//white default mFont->SetScale(actZ); mFont->SetScale(actZ); - mFont->DrawString(buffer, actX - 10 * actZ, actY + 8 * actZ); + mFont->DrawString(buffer, actX - 10 * actZ, actY + 7 * actZ); mFont->SetScale(1); } From 674f4d506294cec8bc20f1a679261e3a9fd97717 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 8 Oct 2015 11:24:04 +0800 Subject: [PATCH 179/249] transformed Planeswalker When a Planeswalker transforms into a creature, it should be inline on the battlefield positions along with other creatures. --- projects/mtg/src/GuiPlay.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/mtg/src/GuiPlay.cpp b/projects/mtg/src/GuiPlay.cpp index 4fdc1fde4..43403d5ab 100644 --- a/projects/mtg/src/GuiPlay.cpp +++ b/projects/mtg/src/GuiPlay.cpp @@ -270,7 +270,7 @@ void GuiPlay::Replace() //rerun the iter reattaching planes walkers to the back of the lands. for (iterator it = end_spells; it != cards.end(); ++it) { - if ((*it)->card->hasType(Subtypes::TYPE_PLANESWALKER)) + if ((*it)->card->hasType(Subtypes::TYPE_PLANESWALKER) && !(*it)->card->isCreature()) { if (mpDuelLayers->getRenderedPlayer() == (*it)->card->controller()) selfLands.Enstack(*it); From a0b4d0f3484b23674d45fadc3907c38e9823fa1e Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Fri, 9 Oct 2015 21:06:58 +0800 Subject: [PATCH 180/249] added scaling of background --- projects/mtg/src/DeckMenu.cpp | 2 ++ projects/mtg/src/GameApp.cpp | 1 + projects/mtg/src/GameStateMenu.cpp | 8 ++++++-- projects/mtg/src/GuiBackground.cpp | 2 ++ projects/mtg/src/GuiFrame.cpp | 6 +++++- 5 files changed, 16 insertions(+), 3 deletions(-) diff --git a/projects/mtg/src/DeckMenu.cpp b/projects/mtg/src/DeckMenu.cpp index d1c0adef2..6a9f7fa5a 100644 --- a/projects/mtg/src/DeckMenu.cpp +++ b/projects/mtg/src/DeckMenu.cpp @@ -276,6 +276,8 @@ void DeckMenu::Render() JQuadPtr quad = WResourceManager::Instance()->RetrieveTempQuad(currentAvatarImageName, TEXTURE_SUB_AVATAR); if(quad.get()) { + quad->mWidth = 35.f; + quad->mHeight = 50.f; if (currentMenuItem->getText() == "Evil Twin") { JQuad * evil = quad.get(); diff --git a/projects/mtg/src/GameApp.cpp b/projects/mtg/src/GameApp.cpp index 5648b778b..7dc82def3 100644 --- a/projects/mtg/src/GameApp.cpp +++ b/projects/mtg/src/GameApp.cpp @@ -173,6 +173,7 @@ void GameApp::Create() LOG("Loading Textures"); LOG("--Loading menuicons.png"); WResourceManager::Instance()->RetrieveTexture("menuicons.png", RETRIEVE_MANAGE); + WResourceManager::Instance()->RetrieveTexture("miconslarge.png", RETRIEVE_MANAGE); LOG("---Gettings menuicons.png quads"); //Load all icons from gModRules and save in manaIcons -> todo. Change the icons positions on menuicons.png to avoid use item->mColorId diff --git a/projects/mtg/src/GameStateMenu.cpp b/projects/mtg/src/GameStateMenu.cpp index 1306f5f8b..d10fcaa2d 100644 --- a/projects/mtg/src/GameStateMenu.cpp +++ b/projects/mtg/src/GameStateMenu.cpp @@ -85,10 +85,14 @@ void GameStateMenu::Create() { for (int j = 0; j < 2; j++) { - sprintf(buf, "menuicons%d%d", i, j); - mIcons[n] = WResourceManager::Instance()->RetrieveQuad("menuicons.png", 2 + i * 36.0f, 2.0f + j * 36.0f, 32.0f, 32.0f, buf); + sprintf(buf, "miconslarge%d%d", i, j); + mIcons[n] = WResourceManager::Instance()->RetrieveQuad("miconslarge.png", 4 + i * 72.0f, 4.0f + j * 72.0f, 72.0f, 72.0f, buf); if (mIcons[n]) + { + mIcons[n]->mHeight = 36.f; + mIcons[n]->mWidth = 36.f; mIcons[n]->SetHotSpot(16, 16); + } n++; } } diff --git a/projects/mtg/src/GuiBackground.cpp b/projects/mtg/src/GuiBackground.cpp index dfcbfe232..20bd3fdfa 100644 --- a/projects/mtg/src/GuiBackground.cpp +++ b/projects/mtg/src/GuiBackground.cpp @@ -30,6 +30,8 @@ void GuiBackground::Render() } if (quad.get()) { + quad->mWidth = 480.f; + quad->mHeight = 255.f; renderer->RenderQuad(quad.get(), 0, 18); } } diff --git a/projects/mtg/src/GuiFrame.cpp b/projects/mtg/src/GuiFrame.cpp index e4f764fe9..276fefffa 100644 --- a/projects/mtg/src/GuiFrame.cpp +++ b/projects/mtg/src/GuiFrame.cpp @@ -9,7 +9,11 @@ GuiFrame::GuiFrame(GameObserver* observer) if (observer->getResourceManager()) { if (observer->getResourceManager()->GetTexture("wood.png")) - wood = observer->getResourceManager()->RetrieveQuad("wood.png", 0, 0, SCREEN_WIDTH, 28); + { + wood = observer->getResourceManager()->RetrieveQuad("wood.png", 0, 0, 0, 0); + wood->mHeight =32.f; + wood->mWidth = 480.f; + } else { GameApp::systemError += "Can't load wood texture : " __FILE__ "\n"; From 91e317a49768e8ce55e883f48b6b6b31447c74cc Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Fri, 9 Oct 2015 21:17:46 +0800 Subject: [PATCH 181/249] added placeholder for large icons --- projects/mtg/bin/Res/graphics/miconslarge.png | Bin 0 -> 34234 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 projects/mtg/bin/Res/graphics/miconslarge.png diff --git a/projects/mtg/bin/Res/graphics/miconslarge.png b/projects/mtg/bin/Res/graphics/miconslarge.png new file mode 100644 index 0000000000000000000000000000000000000000..e95ea6d2d7e79ce781ff1ca3a00f0843ced6fa58 GIT binary patch literal 34234 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 m|9Sl9@t?>4p9ds-?*9be5Pyu7;2{tI0000 Date: Fri, 9 Oct 2015 21:46:25 +0800 Subject: [PATCH 182/249] resized doubled res... you need to replace this with a higher detailed icons... --- projects/mtg/bin/Res/graphics/miconslarge.png | Bin 34234 -> 149877 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/projects/mtg/bin/Res/graphics/miconslarge.png b/projects/mtg/bin/Res/graphics/miconslarge.png index e95ea6d2d7e79ce781ff1ca3a00f0843ced6fa58..0bc690c76423b654f1e6bb326c8f6eb0a67b6a2b 100644 GIT binary patch literal 149877 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

8}{jbH(>U$f;#!3 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 literal 34234 zcmV*3Kz6^0P)lFWfi2b1yU4#u%`H0f9V#Kp-KIP|mR>bt`nvImgO%&Rf5I z_AVV--9j>WX8!Q`w7)7TMq`-9h@0h-#GPM;XiN8m9FJh-k~U>Op4yzCD{A0r-z zz!XIo>@>{c@0c?W)9EAe;QxVd3XkzKrt?Xdz!SstISUtf@TDNV_X-?x&fEge@6GY@ z`X-ZUGCYy&7EedeunIh?0ne});3xm@i^X{TJIEODNcu$5u&`S)=9>i1SJLM;fj0uc z0DfNF$R*8jWNcPB1hvvlSCYLlqYuqxWE*9vW>lT4{6&koUw$li&eSAms4^ zPdbehfd>q2qptuHK~q5-m%!6Yqn$XfE*M z=<|)@5ub-mfG3XW3}lA_0v@4&y!47|_c48*S_GX2n68ZOTF}PhF$@S01S&<~0j?y0 zC)|KX6?jI)^?|2VVCrYO@ZS@j@wmjCSth`fz;q=YL3p?kqgU{=&w!^xU}-hrxhG{k z2@gTxLCB3VCV4tS$e2mehv_mlDCh$oYG(TUjok^)mjr%12r(c$$utUROrx(AL`H;V zq^Bip$Vg9WnlU{)VMjOV9rPfl*8rFjWamzyr(nl^)0>c+B*FCygvgACpPROG$Pn z(TK}Pi=UO9naJYe9Na<;4Y_*i8@r}dR=3{h=p5+j>K^P21cJa*P2)O^My50NS2FcP zcohAJrjbGa2c9AtIkB;hwDi=t4LR9KT3&Xt5+5Js4+ewE(9qauLsOTtp{e^?Yin;> zd*{F*pD)lT=yOxd9T@v7E$n2lWx3hOEITVHkd_)BMtr3V z42}-Acl7(JYTEki>f2MATYC-?o+kQDEsYxj4-~iWZtxg!8RjgU{+~jlNb*obcvx{( zX40zMoRq-ysaY!Vwv|3JcXjs-*4DLwr`;rDDNV#f9*?g@%opfWL!+DNUfOL(NZ<_w zF#?G)o6TADI)^@=AM13iS-h~gc-i6-)3oArH90xHI3gl~Su7St8i=`EE^~i>zhh)% zL>nFR5L36WKYy{tbM9h|x3#Tr4_)R0jq_sihVFK<2!q69r}vrkI*UGENCcR*U|wPF z>XkF%7tb$>ij9qmAsh-Z4#NN@8g_cG5mD5d`i@1XPG4Vf@W_<`BGwlI4+aDcOg*WP zO@hZt?=vKxC`b5$sl}Pe%a=|onN^y_rldIeZ%NLbz~l9LiB>sm-I|#ux7(vtR=2IZ zaH+<2;>^uKQb@panZ`w?Gg9~6;sF+c$x0)I#&jABY*x#n;-a(-OBNOnEu2^2Oiqg7 z1_G887DF&#s^9NtB;?b&dxo{LEA`5e6BU(}Rjr+FkMD$-uW}k)Ot&m|g-2k5V*}+p z6?iNb^Mc&$l(kD2m&DAUlkY3YOCcqzDS<$Me-6c&;$r%1+4Cli{HOVRzCf0v?Qv^o0ADEiR6nGczYRtt8WIvwnCQ?2I8Ox{FdGz^$q(tZH zWlN^UELm8RuxLTC8g94QWbBUD;o)KDg1LDNG#eNg(Jq%aZoFF2*n9NkwOUe^Hw<{7 zv`5C{u-t)pV(7J)#!?z9X3fam^2}4~yt8KHn5EA8jESH zB(1mo;cZJth*AH+NgJZa!bPKs7Gt)In+q4LjOtSx?f=aFm@I)nmI zf|0<~w^_2uln=co)0j!`S4Bld-1peSD`st4H~`C-ZJQUB()pcP z83~vxC`*lg0~`wBVUROTKR8c^+s&3WE2l@7PD_g{yIh<4yIrSNk<$Kv>9O`Hrdxg2 zcsxd29S~)PQRnK(*AkImj5o2d6e95$>fBhE^`tx$rq98mt^m$<*qC%f(;&+0HR4(wCP`uB{PPRS&{S8`v zZtA?3f3q*KyJyfQ@IYhtF@qAC1P_EghwwldZY-Ua^YGvQ?UTN=DNYCOAJ>SCjN}Rk zG%}fVZ$sDA8tA6c;0g(UC)d{U^y8~oZgx`6Yj1qJRT39C*3=-;4|gKiQ~jDPL`9C!%qj=029ucnwnsF;?Ybt zwKyyLmDfM}!KKT!P(X+=G4U;Tfd|JF!ZVj%*C!^#tRZ^mKDcEm@q?L39umLNz`$i? zW$gIzUd8Iizq4{N4O2#X3JVJhW4hNB;Km9vggF#^3>oA6 z3I2l8B$}EQ%`c27$eWV6^Zn!LyFNZc$}}i>8gBk*NZ^gc5koTbatdNL{ov`1Q-ApE zx15oY5!_;d0JyNw%mAWiqJjZfcWrcZlv@uR00-g$l+9)_J@)Xja3c2fU;lQ$o#G(B zAPnNfvGD{l2p4yo!OY?Iu#H>pUpVLKC)PUB(-JMjC?P`1$-*m$Rb5@p91aIdNJs$j z_-A;J@C6fF90|7ANX zEXcIs?{Z?gy1H0pWhJYvtz~0lV=62@=nx$pZOY2ZQj(IABsM;=xQ*2-N=-y3%dcMh z{27WHfzvO9zDFvd2^0`aS0dq=Lu1|SnR!qA*Z=&ee`;|yEEdNizb}N07&^c{_}~L& z!GZ;>u&|I@SMt6UFq#k$Vmcd}Kev!#{iwkI{SQ00U#)16)eg|8^A310?@q!p9e9e1 z(x3g|_csRDuAXBtx~4MZ0-s#HdX>HW^4khUhZ=>5io`1M;sZ=?&Sw2-dT!KE{iIn0v8H=Rr71A|UM@L8APs%WF`y;DN z;o)|U0dxT#nh!y&0ttrT56){htF&z58Se1=X=LBGOTWa zsYWUx%Q)gdGpE2Ugf)HQ(NzncdVGxqK=5~R-MQ7&1=z-fz(JTaVtz%&w|LL%Pr4_d z7&ZF(H8UIogCp6$`{2|{zds0Tip(bxAL=B`6Hi!X(pb6vzS%SX^tt;JC{{OtIbltq z?Vtf+)deB6GiS~y@4fdPd+f2tl$4YduBbo|p%E3h`2dD%kXvW*c)Y1E{_5jRZnqCu z;BizNwe$qc17=>ea9-h(|MS0WPfANo-~`9tM@B~2C!c)6&YnH1QM|=z1fj$P!6k!E z@_0^=GBPQ%XV2DFu3X6#6ENXE=FQHtKli^E4JmH8*5elZI#y|d(Kie9dJG+3p?>BGWWTmC0 zoL2Y^@PQ^oE20x4{t8o0pFYhtZrmspg9f&cRu|YZ(-YZG{%o`QzkdG7qvTGH2>uxo zuM^>c0n0|{MSQcFgx$Px-8?&Z88in52tEzahVv=@Pr{@C8~6)htIIXUKKtx5ZPTVr zP}+#vMTVxhc3)o~R|>$692!Uk?3k~}$Z+M!$5xuipw52p!;|3UKEczdE~u6XT<0QK zulaKeN-0KWQH}_HatJlzJp!Z(BAJ9m(})lXF)p;T2FnknKm;{G1A%DzeJlL;aOoc2 zx;VO{b8z*+BjvIr)gwTSpDZNl@@UL2EJ*v#_nx?qtfG^N>vOlAGbv39Niz2~-hcmn z<yC=;s!kA+4W;hB?= z5VP(_KiC|cJ~h`0`oLAb#sB*6aNl4YTr)8-N+Cs~ojiF`dE}8tIK3eB;`>}tKskVk za&wX_&wlql%l~?D_kE*d9$8|ol~&Ba&=7TE4nuC%gKR?Y2gkD>` zcro{Ih)1}kjERY1F)`ts(SfI=q=dqXRDS)#hmR26dh*D^OvS||+U(i0SVnq+^-rE% zul>UdA3faJH3<5&2_YMg2Xu%dJf(Jf*wXJjxU6v1@)?@QU2uZ}T7`v&!=y4R=@%Fh zVO3@Bhv#G7efM2~w>+2Ns84=cgymd!z zY%0-X;RBl%7C-Q<1@IU{$zWWU=fntympntrlQ@S7hCy0*p#ZtU0u906A%$f%vqv6U z>bQQhnLMFp%vY;49F}pDg*azwa*}hyQ`=W%rA~>5HsO;M6%|b`pN$79q>i|o0fA|2 zYh(NN?PC=c*Oc#k=MgP7HkJg^W+Jzd!1}nfKue-pB!!`faM*uk*6uu?Gn8r5rUF!mE_!k=2zQk$#<{a{v{lQerSJXxQmMexLEj%5rw}3BIW%T2 zSy;Sm>*fV^C_cf+@P4%OmoBmLiV7{Bt`F~P*|KF?Vq&5qlmZEtTcdeXkXzWX;~j1H z?s5e(NIF5CJ9i%Dk5?Ls3)7U<%csZg{NUsarYEOb2t)rkJg`cr>P(wHHEYw>&5Huj z(GJe@2tS2ar7??@7|Nu|+?4*R@HvC*6Mw6fl})CM469mSU(Y`Oe81`b`|qduQ{ei; z&1WS=nYL}47mmF2>b_a@8_=hjKJOfF-D#xKn4X!DbpKP^S38|Cj*#GDaGoYb$jo+9 zIJ(O&jTNlBaNlK)ipd-n&6!Hd*(CAux$k-So{A}UEg`8+eSmC#b zVI@OD5kW}u^U^Gv*3TQQtZpqNBIgPvG&tUR(a6imN?yHw?QDlkQi53z95}$^c6%&( zNzfDI*X2{Cn4UZx;6{=R*QS`BUtit_c?PVdrG?F!HH%L$JfrBS2)6b9g^sc-_4#B~ zfd?fQ&p15sz>}Aoy8gijmf4*#(afwTO~GBHX>H8!4r==kUr?&*N7xU4_$2cxV{B+> zh?yeM=tcq_bg_><`iLbbCzHDv1-GB$BOzqM@^A@)yS?GQ+0H8!jT^{{T^4wT$9Wy7 z|K~+TMdWYZG~Z5&+9bm+2tKZXD8<99tgU~Hwe?icc_Y|-QbvV^Mg02J)in%BGSKt0 z&&oA2YGfc7TfKT7BhP^2^ZQkv^Vqy;u1X5=zP65jBwLXH9vFuwl16q|n6(HBnnEu# z2|C9Em!1ouFc?h4!ZMG6BpuGPXU`taLuqO8JgN$mL6?uiX3D`3k1zrrL}G58|XbBJI;CHccXzjNc3doX0EH zFtu~Y%{qtbS=mh}3%@BYCX)Hb#xy-n4Qjo;JzVg<{q1k7q!mpS6%||)T1+_o_0XY1G+AkIA$d50#GS{(lXqO$L~O*9Bb(OGckbDDZf#9n zJ4#Rq!VQwisW3%v*2rA7qSQmo;}pN=crIVQteG7#3YxbNG0;3?T4`ZH*KY0vzP=?FQ%bD`6#S2S#_$QRKLXxjtq-&BAQZh1g zxhH1P<6&k+WyRxBVdy^ma2GE%Q%InK9&oYIHgMp;e)3R~xe@|>pun9@hnd2$ViNc) zrg!gE6OIvs$AQdz23g=m43Q zm#4(X$7}s=pQ3kblGHLVluhd&3WD$oVlfbd{%!*E{PwrMr8u@%LlX4Dg$v4>HER%i zD0((pk)<+)Zk*+2Cnu4>qxKxjL}EeU0reBo)8Z3KiZgLTQWz9b;!dcx6bCD_XXQId;9;iGhFWhBc%+Y0 zBErM+XV1t>K{i=hFS5?$CX+X5i)MPY2qhi>K;k6`Q>=yZ0p#si^z5)A+%XmR zf|B00ZJY9=AN_#+@|VBiEsYy44JDWazIy-*;0#X!$k?=EUTC$|tt*$m9$lT2! zo+cm~cNg({p~>V;a-xHQ^7B$+&R(dFCmDs*yw^P5mKz_~D27Z^7WQ0p?aCj0tLj&7V`yyL->+D4#D7 zH4YCJRKyk*q^>S3NarpXcmKrsxlA#*U!W240ybCzhIJR3s8FDzgeNh?{Y!0(Ndv>c zT|{h+_t4^Cw7Ij3C~h^!1_D8+QNZZ8VZamXbcCf&i3{WPSXg*|Ub9esDyyxnWO^IB ziM6%0Qm8db|F;Pm>7EdB2cQA0YI%7%%^PFq&YdHnT+K7T((Ayy#yTUy$qS4nfd}(~ zLtO$7P8wsin3MBzQX+6qx_hmJR)usnH?v9#0l&3=5sOWXXD|Hh?^%C$H;ajlr3lQ& z&o8_m&Noj!`6OA;Ipm?Ga*U)@Lp&hqmz9}hBBQaa;(F6ArpHoD;KAHQTdn38@>u&- zH4q2B#cvRPzClLGyvcy2`AGky!cBsWkP z4MoTqJT?pLD;oQ`93kW~h98n9m?zAaRBV{jnCNiOsF?&F{1a_45C{w%k)9fFk{Nk4 z6VS=j<;$0&R;mn<%cUz$Xd&VX-zW>}iLX#oi(q0!PagT2buzN7*c9bC{0>dQ2auJ(3bDAyfo0-AzRP|Eap^sF#4`6Td)h>2y_B1=hj5)GW@zWxy?M4N1o0Up8~ z866!S?{L^d}u-rX;eN3@KXZe+i ziZbo3x6I0OPi}*^#$I^g1%)i87ERdnmgs;GbU171;Xrnt3q4s@5BuHkey2SD{PSE{ z<4ZBok*Q*?jBT-4h!bwHm?AUM;(-<344R$9xk=y=QiPd9^A#FufILO%0QUwVsQT_>)A;>}vlR%Tc)Ef&7 z6J{X-S)4JE;beRH4Ipd~F+9J=6DLlJS}lbZL7%1th;hOkywsx#Er{t_lXU7Ac!Wb#S{l>;rBQ%6eHYk#bV>w7cH90 zzW2SS85T1IM@Ptq3Xog+5>2+3MTbYQ?{44Drc9Zlk(O36GBPys4wR~@s!**QE~3=< zxCSW~PjXT$BY_74S;jLoF}yP}B21B8Sad^5H(Byi=gX9z{N%6cGrbu}7epZA*#H0_ z07*naRCq7ZYD|$l$hngy4m6NuIFtpw-cUCseTMEkMfN%{nhz^o6Yi=_;t?Ja-rJlp z5iWa}u8=D#uCc?150j-F(gp?wc=;_XCYeP=r?JL{4_J6q6mkwoLvy7m%A_G>*Vx#^ zlf7@fwTE62`Y@B-Uaj`^^_#YB+sZLv&ced12|_uWBpwkmk#}TDB3?9s=fFR($WUgE z#B>H74lflU;OWz6wYWIDvSR*RP473cn2_Y9`v(+$i{!m=XHCc`a(!?h8Qq%(_x|ap zpGK*ZB_=u}q+J9%+Glg^O&9*=MeK{Gcpi}Wr~QfId%736?Iws&8)3jwNe=z9MDc) zD%XT{!1=gqgGL2i2=)3V1Ojz>QBt7z-UXbh&&SUGzlL@y4Z@ILm)5J zYO3*iJy=D=EfEnH?j3|wy>a6@?+0L{gn|_Rnt98ip8|ECjHxue^-yQlv9VG0$dSXQ ztgK8$ltL8r2+>y**%*YLE>b`df`JsH%g=QSuUzp&8)rCZRCGkKATf^F$1*b!O1dfL z^6+z}rlum%q@i0YA|jl(jgrOV+8y_ax+)kQWg_GSBvu@vZPH@5TUXM5-!-Pf%n76=YDl zio~&W-zKxfVlWt-p-EY;MVBryw6(CXfGqnl#FsozfH+T8eRSV$#Y;@7*dhdDdzgU_ zg?9i4&BK#radA+990#)V?9!zxYH@Lqskpe9|DHTD8RkeV91r-JutuN@6rZ0ub&4U8 z%uAArUpEw-?ZQ>)#65eyU~%DL8eH@jUwlzRgA1+)1%QMvgjAmsCV7{i*Y6J~2osP8 zAx{=qD`{RVNZt!NX_Bu|-luc+(LE;UoqmjWK8A>-v>=>Voiu&)AcgsO*J9b z(uDUXIy9N+`a?LN2#e2YjeHPXe|*nsHKBUK<=d!%f)JwNVHY~7Qbn^3kB^ZMK*EGH z2l>KdBoQPbUN`ENyzF8@0|hAu(Oa*eqYH^VMI0cojJp+?B@>#QgeQRr6J)ZnD#Sk; z2}&^N_V|kQ9(jewQ6f>MBEI563L)pNmWjuK7Tq=G$_hdNqJRMOp4VAvQqbnApr$E^ z1%cDJ_2#j35MB-3X7x5e$WORE77s78@h(g5f+N;Oa?l*9u!_s4wUrA>xz&f&L>C#9 z6l%^WVUlaBOq({1PY~{btUJdFr2!XG?-$^WL7YA=m)A1p@_f$pjUhAxL-XDOvJRe+ zkuffOm~eP!=r$xk6px=_N??qUre$I!nkHR7Fa)lndpQBPy2{81+Df@lDaeYqwzl!C z{j6CtxpvoiBB1#EL62beFW~_sitSI+ScJtWm~%80AqhwBxZ-d+S-8WYgqwqU9>v|N z==bQ-MBB6I1JJl7C7N-~N1i-iP?MMEWLvgu;X)-{SXf|U6X^%Dar328obH0B3h#oH zYiJ>gIyTDhhqS4R@+DkqVq)dpUAweLw{7FNUw!pe9*)RE&sFgh4Dj(n5O5(a<#bwj z*%7?z8uJvxaS~cq3OmnffTzdCT=B5X@^7;G#LNi!kxAnD6@?4D#x)=FdA+zDlZ?$F zYp~?Px-;R1aGB%hf_q`HXgZD5eobFTuNp19ADczAw)gsEcMsN{z$(A<&O7Y#<*Ur$ zh+y0;v+D~ohyZFBStX_~ya>hDqoZCrp9@x=UvSo}S(V(DJv2O~p-v8u2Fi{slQPuXOCAI7-&dupER-AnJ-#cm#Bkw>WJC*8K$tRPMuu=x zf2}QBwiJrQB$Ogq4X;K<0a6g!HAvt=Anxn!8yY3W5uTJ7Ba*i^lxexJ!J9!f;^wt$ z%FLNF*@X)iph!YE#L{Mt0Ux10@AdlF)Ts$<-n@AX)gI9zEZem?t>`-gVy;5-h11ap zdc3}FTwf|v@mr0%5~dL@y#Wd<$i-p1cI{%{|Ni&U48`7f;|)nKCKBM>tHltd zaPHcJ@6o$J`j-uly5$Z%0fX0pBk1+{&BG&OKDvGw=p*zX#utb|SZGwBl z-B?VDmrjfmLSv~|^+hUKWR`iEDva;%Vv;pno|Mw#Lkq7z3*qBQ!TQFoVY1?2AlEnn zLmklD-#^^p@p$v$ioyb-bOc2LA%j48NXv=l7bg3_nP_>G#1{2#-pvF8$Ubu%xK}Jp zz<2R^Z|{iLAK-lK8;1v7ciz^v-pu}i5tb0IFX+$}qgla%n3|dzo`k=0izFOh z0R}H;&QVy;qHSg1+in=)kzXJp;m)K?mUhXw{lS!-Kg zx=@II10Ki_UE1fVZ)nwu3sZ3pe!t)cnHUYgD;14UFc6?S1n12+-$YEVZQs5f?b=LV z{KWfnG+n^;f(YmZOJ7t}#Fg6c@TfX8PZ_X)qu9`fszgXwjlj+|=}NVuYcO(n#Epd^1I(}ig-}3)O0UiI>c^ORG8qUVRGqv ztEyZ3(Kq09Mk&JU;wc%-zo-~-91wn90TMYKA@rK8e9%ZeO)cHsBw+o8 z`KfWZc?gdr0_yu<6ixIS4=ySiFrf4(E@!)U@8;J--2RXM_>ZI<0wD_;5n&~Z z?_`fZzLDdBQotGn#EUYt!2Hs+)I&$Fpuq);iy&k{10D!}x7+P)I)18rbl#kt1ha{W z7Ty@{5rW22xMjV6>(;Go@7}#+DaXj;Sj2^B=FAyH$0K~jnkLd{c!kx9jC2sL0e%i* zQg-2Db%WS)3N-Q=@L&RZXas?ZHE7mN8`byA|3L&kj>j;uk z>=yJfF8hYS4**Y9O3MZg1o1b5$Kn7M5f=9O0qlk!;k5tJvJ!9IA^;hL;uu zFDP5Ul0E+Tt9(>-sZ~yteIkU2z zak0@R5S@N&A~#=!z@yI@8B$3wIT6N&5xFn{T5$dP^-QiMmdvQ|HR3_#*okX{4Ncug znBLdlHx7^Q7M=@(k36_ECORtIEQLv|U*`9X>+IO^o(R8mqZ}TtCoN%R@O=n47~P^T zMB<*4jJafk$B9$d$Q^4r$@EPgddA@iiqBff3$RpGHM6NDnVc!$O~uDMNT^3cO(NKY z10K<;RjW9|q9zWn0<@SjXD-{f?+DT4*7?Z^f(16oS~2L`($>eWSGE9fo49t+fQLyu zWKj-ZDyvzsXhD%(Bnvscv9P``@?k6w$-PH@lcRwS*NE6!7n$tPSjN zpP}T%b!4)XktZ5Fdg9uMm@i=Rjl+XEY$B`s#nBTL>$0;_oTxlN$;psT3bpJ-khGVd zOQjwc7tgCKxGv^UdOesg&=A7b(>uWSA1uQO8kxQd)IAOlytEdIsasB+x!Fx#D^?bA zZ&-FC$~7Lc84A~yf(*kXg&)_1LYF+l6UVwoYZBfedD|{_^307kkJm5h<1%*IA^ri# zn)4T{o5+eKFPv8p0e1m$v)hfh-LE1Mg$v?hq8z8_8i{8IRlD6w7Awc}&_fTZa0fAp zi;KxMJEzQ>H<#B65hJy>_p{x5&p`uXaejl5IO2eN53OB$?qXHL(c={b-`=)Ny6zBA zvalw$ZrwU<$BrFJZ|^V|gNWwgM7$$;Tc3!JRm1Jy;dpxGdNIOjo zI`LFg3lx!y;31GuIx;5H*VT`@)ZKeeH@n?FEPQ|k8@~r2E(eCLBMpA=)BP8>l@w>h z=w&0TY0H+aT$o%g9@g^OI|Ln7h=PJbGyq{`BVSvMa$rhIj87X9|l7Q?nhBdRODAQ>Qh|ds>>E zFMWkEz;!b-p`=a`Q^U1pyuz?#$x=3Z_H3HdK5QVOT)%!z#XbXK6{aR>ec({JrMqVc zc(Bl^djdS*uLh!b^`WCzH?LY=iZ)Xz+&s6S^ODMo5JoFYVV%j~P4Go26!NJMdau{V zwE~57s?2TRICr6XV;}53wPNk6(m+vRmPI#E`l2dSYaryf zKZJh3qVI)h5sg14MP%PYJKl)um2~Gr{6uoBp1n}z7V`z!_8SEr#OkFJRSpfiuJ7J^ zK6`3WdKQv)B5RMv3=_FTDi$|%baa?{dV2V#3LqX712iYxQ;NfQ$qs-40CCftIdeE5 zxUEQfz4F^nNh1!ydSO*j$9Uq11LcGpUa$YkJO6t0zNsY{N@0GwqOT&tq8Ag7`6$lP z4j(?Ol$TeKz+ufk&ut;wOR%u+ci5=(?BAtr1gRn3^-`)v*1JdP^3KJ6q zMJSeQ^2z%2^Yg(o=WaF#JdJGPT~V=BF_`Q6p`+!CmMkiG)jHjoEfu0OCZYVA&PIN?^JadyBKY6`P;K4N~ z+OQFX2iA&9m+PhnPKvrLmftHiQ%! zde?c&30)T(bEKp!)$qIH$B&z!u&@yYXmsgvt@6d;tAoT|*ozQK`nC-lnVuzwS9Yzk zx^@2tAD!I#?9=NshlBS!FtOnW_*<17Z$dEP8L9e)pP^4xo6Rc1MZYR?EhgC-+uYjC zc71#XE!o(F6w6}=ZbPFRF(`uTBx5Jv|LDx-|MVAA&^U#2g3hv%qKHi|RD-+En}@K6 zf!;r2<({(K$q7ku*|3Gb_4N<4-|aflJUBRp9(pVv=3BRo-dmP9`+sg~sOYe|_zZ{SW@gwvS%@)^^ zz&3U2RJe$oFhfH_Cb>ZeCR$|cmEC*J_}~BV)HPzBvjWfHBzWM;G}Co2_4SWryuI`A z57MT@vfLbf8L8e^z;g!*m=_kEo^EA%gnmpX|u-tL_(H`lyM* zE3A^kvPQ)3w{7;xbS2paJY-c<|M{g)end>^S+#s7Z?#1`GsV5y`Sa(onvX)U9_^)< zUP9Fcf8)L}XmR@VX@w#+ZOfLq*a3%!B_bP+_GhK+NiD--+8DI#R#@-RB;4Zi%^XMVEodjx$Z++0%}2wiW`IWs=}{6cy` ze%hP|w=9m98GE_qnFxgxnKu9k$Pdj8H^8zPOeXSV0urB*($W6s3m^DTpS=m*0Z+q= z<_dbez~fHgwwBTPV?RGwX19e|=KsmF8=NuG4%r2z$Qn2Rkc-cS2MIp1QkqOEnDvbV zL&-DUjS6VHK0d8}wC8L&%`;+UEJJN$lka&BN<%Y2i^oyC784N>Ht#2Ywlx6_dm^K% zh`5WFT+kr~1tb&=k7ZzaMXupCp*ecIoc-e0d)mfaUML_4SmPZgOEM6wTx|KZrnnbh z-n;g{{vVIT#>Ga3k}VMKzxt~m^JWi01HMNZav1Q+plBdevh)U~hvxzMp1V-V{_&sR zw~;~teXtWMtm*i0$9P~Op~0glHjH}lrB9xYazy%OmS)><&u|fuD?tA_6k%gyBidYf z*Z~Cu%Ro4_zyJH^6>L9+kOb@HWm2fJx{bZ|=0UO;BS`$fT2!$+KUcslFrVz{9gZdX z-2b0`yd`_)^sLZ=4rA6C^MoXBR1~jhXb(U9a44+Nmz@UretR;h*4{bbfA#gxM+w&f z`r2`JXM@4ST*6~J($8=;OnaPv@@7rZ`y{I6c!n~M8-^r$IrRhho@%<{>n=M_!W<~+51 zRdiBfOsG*ufRW1@HFRL9s_s?c2B2}k;Jj8&;Cgxo*_%5KDiph1Ar~E*@F>$Y&!pS> ziUU#vw+sXg-?#q~N+D|=|IV_o%=84=xEE^46wNeTJInRYyxo+D0$lh^)VJAZ2QGSE zedF^^vRu3A?}!EYrVd|$M->DFA)_d6Gym_O@80;(mPOX00&LW(C+ARimx>X6*?QI& z9cE!XNdw@pa-!U&c)UJ#=tvp+-#`DTk>XM?Gps2T-JO_6;(=Ag1Y7DGJK2B#A3L7> z@tiLyg+sr)(X}PFoc;E#L#&~x`wjZ<0db8U z_SFxifIExaLs(b$kokZ9)9#Hw{*!MdEts1hfv`p<#>Bj7Sg^Bh-Fil@JI8~rKgnm( zbHb===wv^Cd9Rfe?Lk2w7>vonLF0ir#qO;UgF|Ds7k;rjt$$!NY~y{iZD=Y|#ip#f zaSHNILp}YhgxZPa)>m@j3g+!*Ra4;29fy6#Pu(~x@IXONxQp(%L*}mRBcpEXZ~x`M zgXDTgfA@*CEXomX+(&?uNO(D%2S6JnQf0r1TrG!tXz%C?y!p<-f!%w~UKjHPg$U&v zO2V+Zhi291p#7eM|5-~|5EVQsw<6& zrV|k_OU=wRXMID5|DE@a^&LEXrPbs0!*U&Ey6b#fB5INY6N=0y?#EBs-PPLOx9!2r z3(RCWXrfHaz_3hTNr=WCD_;j-(lXJ6nrn1VBkzB7 zy05oy1dMY~oV$zN-81=u?3Pl*`MfXw>eG$u*Uro%Av0%ZB`Z=vV@@27NM0J$8JXu; z4CPcab9;R1;bRrPk3T(cuW#u37p7Y-2-)2T7Y?4EV!HKJJG%zlzj*nR_0_el84qt; z8efo?#zQ-~rd?K>tyW8D!&4m6J8`+Z6n2%5zP0m^qoJ`I`_dm}x_9_h-k1>&cnwN1 zNCwA4;o%xmM#T?pT^d_dkQyd=2f{90cqknaDs!PT?uc{z)HV0pI}deTxKwjh-~n$| zkH<5az~dMbKR`Ftz?Jfb_PYAc!b2WLXV)M*bnHs+-hF2*we=kbiFTk3tQI_t zFO|LS;(*F;7x&|C@96J->D7G;4jj6?Vf~s}%FG$rzSNWiTSSCaG1PhGoT27Vf;kGS z9z1lc!e8Imb=L0>o?%~p^31(FKv60o+|TI1;AqFc?m9L5)Y;1QYgW#PS-zyipAhE= zqY%wl3Ja~XKpaXTLEw62i*^6O%dDoh<18s>@DB!<8eZSs2)jItp3oTaL)V8NpP5JZ zyJ7Y68Ikv`naz@uqHWkYM!5B|y_p*~ABC&~-9zYFV_zJ;(s=sZ&3d=n2L*Cg;Q3M+ z?k*1SzVw7VfuP#^(VjC4&R(e6v}k^j_N@(blXJ4Bs7`03S%wj^;YgI`H1Y(4HMQ;T zPxoK2Tr8_;A{s-+&Wn3Q9$|F+Meii=I3V<}tca1?$o;6=``Lv;y5XYi%%s%|<`sJ5 zawE|k@Ek#}%`{tqnj*>adWDCghj>8-#6OAlp@ zP^q!0x%(Qq!FjtrK9xCpW*#Z(Y$x%KX0w^G<0SD=putPZr>&zu`|SCfT_j|uMdK0X z47r?Ic9+k(o8Z74BPS#i#VsA3{WnPP^Y$MsD=I0@h$0@E8xtK_Zx6%rX=@JAr_ty2 z2g#tOoiD2~HIa;Yef~;z>sfczg4Pp07VN78o{1l}2|&2fa$?xbs+zU~G_b1&-zb9O z9CI+pGYvs;^AJi{DKHF}7!yCrzQ$vk#es8!siB0RRV%#Sz@?Vf-p^>rU19h`%|z@T z6l2tYr-l8VPqUo_5AJPHockIHT6S}5@3Ceb58siH=wn6MU(;7D0S}Z+pTL6O$*0GD zt;Y~E{eF7Hxp3}lG%s1beZwcoyTMK&SdwK%H4uAWs9F$;2Hz>ao*@f#1j0Kh;$zxA}% z2Ju_qyQinwPH^D2;7tf@=Pf+$Omd48XkhI)Tp!R#G4Qlk;K5uYl#tCw_w+Q|Ne=J= zlq>`l0-Nb_dowRxu1%zY5YI9W4+iFCSlmM+(`5|GEVL$N+`+f1x*LJVfg2hXz;I$D z1t9F0EH3b9UJ&1t0*?z12~a-v^@%bb56%z5gAr~DJaVDGS@aVd1>T59F7Ny%@!*_b z0y$|hMm$6x8D2;RGCm{zo*y}U7Y7&=%mAjW5qQux%r{Qc*J_7aP$ff4JTCV274!H5 ziUoO$z=E58xSKw>Mt=d*J~ijj-Djr2k%cz^wAIOr8G$@JQqF9|?~~jBdl{ zUl$JqKKEV)ezN1=nkaX3{71v|M?7~v{)p$!$JfOJk0I@j0&iSWInn>MTYZO2_JMx` z!2XEm-vAF2on(I~EE8e43q1VeKjQg=;6bR+Hle`ZTKRTsDWd!n(;IRS3nIS2PBhro zhHoIq^d*3N^ECG5nE7iZTD}4gk`aiNp~0}F32K;T@i)zoBy+J_G3wWf;qQP42WX1i zMvTB?GvJXu0-%qZeL1J_d&lr!fd|))5O_c%P9LKJ()5*gz#wDhuN}jW$6~+)J_$GA zLEEiG;NdZMlt|t`u4rDo{zmD=8+;jxwp z@IVoLrNy5F4@yc{wwq03D)11e)8=-m{9G1w+9Y0k#>CQfm(n|QM?*}QFU z-{#w76YpCmn>cY|8{4=W447&-- z7hXa5;~6yhH= z@1FhVth@J~>923-KrZ%00S^$nF>F8mSkll ztX{r!TA*}xUVMC5$=~Qr;us)Ku>AxmCA-?`#-ugwW_A2X>`}vh7cJH&c0S zENpCyi_I!7u+ypEyLz_m-5n>_>^V?gG&16Y3KhX_r;mP&2~9*?CS!IzX2s8=b9sJV z+UGZKDD~g7VkV1@jzo^LMYhgDL67Wpr;2vZF)@+!y$E|jUK(4rs3_+Bon;U2Jy2fU z(>s(b;6ZvMi0orTe;0T_?3filo6ePq2{CKF@Yss%)hkQ%IJYY_KODm|0839thcYrW ztY_xsDxycB5*g{RrX=SSo=7YKCXw+Cje=j3k zSi5#raqj9BGtD{K$+B~-Dyu2+yUI(a_4uT8B{nXROJYKJmXaJBLpT>xcBU%#{hep$ z5F`7jk*kiXI8i~z_sl4p z4JsI)o|%zkFPfB|bNJZh#CP5=n^#@avYi>G6Vi}Bu^4O|^T9o0=yfu^E}?Vj%4IVb z(VjUc7iJ)lEi^qw3NTSB8|v;$+O?T9NptaZPsYM|lhfaN??lA;@)~Knf%qZq?;v{f zU5Lv`C#k09<+L#OZoId2%I6zT zCc(3SUf0boDcJIt-`u1T6XGMS!TgLa(h6&8ZeyLDJqoF*NIzz7ceI|8oFF%mPp?Uc zk5oSUnMJft=^4-ceCMXF?m@d)zq=N!jDrV962SvvzqcSi?MqKTv5qZTFqKyairjgQ z$f)`R!EgKS548wSx|;u;A{|zMoD_shqttiPeWkASG`H*3H;%3-zg!D{fJ}yIVRvDQ zVeo*sl0fW$hnUamZ+>Nc=DfKDD#nJXe7Y^CX?{=d=m=}8J+IH2lBu>2*?5&B_ausj zoGzC`S$j{3l98TZduMyu{YOt!%E>NxunB9=#}gM_(@n6Y@9O9KXuPZV9{r(T|RY zWda7|f8vk*agB<#7Xu+>ff}kmLnE+>_ArTAmrN3PhVtR%OQtKt zD6)RH^b53q&o9;Tjt3K>d6Fw4cqH?q-i{p2rC*X!J1()eqAm ztDEneZ%>Ge_WbvsyuGTgf7mY;h8M$p0`h>kPzO5)@GM<4ZRK~q_25{JC&ePB(JHrU z8w0>)o=f}@& zU)$L=AhWw-Ma+)RalVzrN8?2gKXLqk1?E(g}T)8&atT2>u79Z?g1|w zt!vg$!i*mDqA>_Y5{CwOl+4UU4M5t@p5O8L>($LZfyjU-#1tn|Q|UT!1j`Jp4>7@~ zzWMY9My4POjQJUFL+(mdA4b7DN0kd=5y#m98U-yvlOMbLcQu~D0T@a!WVA`q^n;*bMLWaXLA6!Cn3 z5ih*ogBTdXXD{M=WDY2Q`OS@1yUj9t??G5&9G_*q#~sesaX928c=92@NUPfX^phK= ze(CdTK)4}hC}0RRQI$OTrduD-{g_LA+SOxmIHMO-ccT@}qOjd=7QA&JfmSVJU zS5V2e`M!Bkc&J~#xOXYpX>h*u2!JNqFo`@f>Hf<}k{x( zu`sC-t^v^*4deksB%*rw>tERr$j?nTqs14#`*;8NbAA8eD*Ay#cR1Y4=CFo3z35?0 z5zDU*YhQWhc~)AI#I`(ek8F*l%r4Gj&pf>$nI!#sB6^wnIn2VO#yEx;Axy8O$w}^e zzV-C|tawJA910TZ>;vS%eerkM_Fc?rwJ|3tWFNlpJGSuQ2c&NSjXKou^5RJaX|^wa z@gDC#{rK(0y}d*I>~<>f;9cNx2-9m}d|dRpr~Yh>ckZl0J3cEf+oxwwDppd{viP3K z^5yiDSl%=Qe`h3EnIG;c-OTY}WZ294`?~3KCv&+X8EFg3x4*VA_8*7dc(9_f0c+DM z)~9FuehIiBFg!2?W1?NFzVpmO>FZX{Wx@_-LX*&SF>C_A!5WEUw5>*uz|EUC zYstyUs_chI8iM-tQ}-r<2^}IkTEKxd>KG4;xRyznUUNv>S+QmF;;CCUFETqEd;q6z zjGy8ajGFYZNZ$`mFlclPk}-PSIAq&uS|=;}i?45r^7#TQ_v}CKrO$c=Je(<-CqN!> zo_R|aPM!XpXCAPi|Ccem!KOGPoO(bs)x)4Y{O0nttLi`e>Sx-LX>-)iZQi08?Vx!c zJCH{aW1fg3853VnW4vZ%v8%43W6}q^&(39rvjdCMH^Jgyv$A2A&X|_7<-6Z{h^3|` zFgc1CLjXlr8%i{pDLd^wcv{xbNEgqnOR^3=N_HT;SMf{vZhu=YrBn+Jl=G z%y{k1BX#s0ggBr^cStzGHV$@a2H?reNZj(RuWe#eCTE*1d;q0Y`Sy2zq#rG7Vi6Is zq3*S!g_SBcF+_NyqoeB3kWD*rrknoW$sT)nEx!-ebndJ?+rtkoO#J0<_AMF<1Z7CG zL8`#v$U|o;U4K@bJ8I1{Pv7U6Upko?6Mw{1YQl+u&MqZ3ISFl?c#p&3+9np`a6scx zdyk#dnoDM=8HM?p(GA!u{T?C7v2b3I{h6=cm-#Qxy|-$3*xM@B=cbfmVK6~ki6?lb zljNHJ#N+p*Et+3sk#*Yz*@-N|+{><&*Xkx)l#<~oBq89?M!f-Jo$1F@3O)M!`_8fS zoastSQ=Jy?)YX~!2^yNHUMxS#vI}Q3*!GWpW{JP)x%XER6TvOFZjOPwwW=VS?7a|IyySEmtWpWs%nI)j&8mO(7hCkc{-J4Qr?12B(j*wsuzB2O#X(vS@+{r5 zd0{5KD*y4yi+cA!ui{D1(vuUD^z`Hu=1I?F332h<;d1EIaXnyD)k9V1_5Q5`?3u^^ zoCw?xqgg$D;T&5ycb;x=N*09Eay z?BV5u`FR;G*~VFT;YruADx@arJN8^qfARLHZg&-^Xtf2kba23#JD9* zOuOX{J=quo1o^=I3)tE7H`ZRSZo0y5*T)COZI%ljUbERW{l0rk^~DRPbAJXl>h-rj z)Q_ENB#j~({p!%kRuy((Xao{hsYv621i_|Z^KktO72RxBaXl-ZIaxlNvSw9@^X!G2 zp3`TmrwWY&MCKg_k91^CUA25>+KQ#q!+kM4#2)bb)mNVVuX^DGaS!bxuis_NwJGOmfN(zUFY)m?tAy&&f)~cqrD{eM`T5xm`trnWolGhMtj;5jG_; z)YhZqS~{zc4+E*b*`Vi5p3Pj*Zax5H+2ZMrhNdp}uYb3{gb4PAV2C~AgocG+ z$;A3hpOU?iq^U+)rYaeb34I!||F8o^TXQK@v3^jo2L}iEsI@>KO7nOue46Zz9osdM z^u{1lW<)(Q)8ow#Kd?w6&1|lJEP(Z?r~8jiz@XvCoSKpxxA=+2*Anwe;A<^fsl!Mo z#5VDcJ0>llImG%$x!o$Wz%*BMx&RuGaxGdF?cJmXD{;de>rx(maA{)YwT3DE10$7! zL63xouf z-#AFBvy-=xLi=S9ll&dK(+S8`FlYq$Kb&P)kN0<$vHA0g70J0{q9fU+^>dT2R5s+3 zRLx~ZjNUsA9yf<4Eq>+3_48s(M*lor+I%*fnRRvzGizs`a`WvytaI&Zy|u2Mx%AMq z5)MpaZ!bIc*86P11NSKxj~-`L=gZm3&p#UKlMW`0PCaW@&5S8KeQi}sTQ9;ssF*~H z*^ont&S*Mw9Cqt8(&93sToI~a2AOrJtT%dwl$dw?$i>lEXTWpRm_dfUJNZK*}6 z>*!~i#m#(ub;|MuGq{-p&Q;UUrQ}S`<88PgnF0Hz4fCT&OI+66(hcV(jObnokF=G+ zfZ%|>ckSGPq{Nt*kZA_f6I)|KM;i`26Ao9tUmzy5W_#_m*H}*v2AH_fT!lMdTUvVA z`|odOTedtD8Z(Z6=9d<#M~+`jJ#+p>J`+(Nx?eDC&m05~G}inFH!XB#XC>*zT38Ld zw##9X@V7-1;RjW-Ymh~`Fy@;~bLOJY{EFgKSVDrvdo?122s(w}L5puW2?{t>JR`?G zf9~Y0JqOMM9wZmFh7-J#&NSMrtc44vq{YX@azGXo&(T{>?dM%rg<26B<8-~ZSvNb) zN{lUnKk%q+RIl!DQU3ka7grjGwRQFF2tgsV(I2)x zFs=}D&)TrAG$xZI72d`=)Zc2*+uMCgRFs>qnNY_<%@`Hq2swld8(HUb*RfF`hOXWL zh9oK(g26G9HjE_4s%uqE@W8|iDKFtcf=vQlKW+LHParEZfxi!CM}h>;NleAYE*$ts zcarG?wEp0yzf_#=DCVN~HQy0ydozI^WW|wRUol~@sU975L)AN&9TlX*)YE%XaVH&F;PT-jK?koD|1aESnxr1TW#aE`?Z_ zI-j1L7DFIAN;RY>RKes>Ms$&NGKO zp#wl66{LN^JhgQ_=;T<%OSW@GT{Zh6adH48C6Ao?k(?N<<>#d)5W(}b zSaxT~2l`7Q*=q>}d8sDpnZ)9_5FT*=h3)Jwe(;Lo)smSzCQ5-S4_||HyhKDeIU!dz zXDY9~Th2bSaT*AXp2e()(bgPp5e8y$?nq@)ej4WM0Uo4%*0bBrL@>l;yUm(CyCk25 znFDOkfs>?tSVM#%!hi^ajtoULFbGYe&}HyvG0mM@t$ zKm?y42uy~eBm+uBVoynNZnjw<>}?y6PK#N&b>f^7MGTfBLVGt0boc5ak3x~ta?s!0 zHRxBW&YWjTV+V^fTiA)W-)Hk5eteG`Du@n8=!%?qOcI!TRT&{WO~DL1o6VBz^Nq=T0iS>e=8_vsaZ+J=Oq|=r zwK^U}qIEiO@DMvuc2>D?v5CdS<>&+0_R@r77PBCB z9wt)8r;)z_;U(MvKaoZykH zA4{rsV`4(gBuUg6sp)!QQYO37S$_hOz zC7nMUR9*QU3}nsANpc@OuEqy74fj_ifzkDlV;!C2Ny^GdkK=86v8aFvaY!;=m3_x9 zv+H#>-4z`vh@B61;0TI)*-1rmxr|P>yUK=HX6j94dQl2zULbOVFbv=g=ZHyJFmH0y z!6TQV#>RpZ!4pdiY8j-d7)!(>7j=zo2sLr3gJ*^+NcJjeLSwu!WMpKdDyE&FXFlz& z4*?$~pjmWypA9c8W~#L)rE{jr@yUFFCl{t82_u#eEIORPzz^tjM@2aj(o^H$rH+u= zLuYe~5>13-BQ-qO)y+*D(K1`^6W<3g9K7<+g8{wbjqOTyL=+n%#ObJO;v=omB~>Qo za8oQjemEvNBC(^h9~uy_Q_gb(Y%$1jDw>qeRR;qeKJ<}rp`V>Twp(#IXkQ$0%sbM_ zW*4Pm{+Q035#myW&{iLxXt`kS6n5}LrGBAlL~%GH*_4@y`pudfB;3t%1_FPUtjt7K zke9Zs;%Xg+h#)@SBj7=_A5MdrEFyT> zyh3VhSbX4AOkrM{;;>s}i);gDIY9+Eb404VA=w>lfjr%6F02{R!+ zTFvn!cM!p&`;seswj7EEoSw`CyPT#0LID^0%O}64Kk@g^%27B>wtrSc>s(3n_{SuA zzsndrGVwk*w2yu7sc$kN*+O1mTstQ_CC=`!Mv$F~q7F3-9=MuqPNy|Z(*mkYxs)pM zC=t#pubouP);zAp2yUs%1p)l%c#6*qXH2T{i#ICtzx%pFiEvsJX|E}_Gncr@lAe}; zq&*vJq|45teq(&Gkscakn>Vjwn>MXgIy>9gfBSF$PE24( zm$SW3(iuZqiX$d5A=*g@B)bbq0z=iC zi|kS)q&Ok91!rgbx4uClFu=a@qkm+UAjX)`mk|H}AOJ~3K~!wnWyC-U_W?-BgU@1+ zn}CcmLSEiJ+cyM?m41%UcxAeuli)!EMHG72q*G5fil`#ou@O#(!y1G2Y-?>~cEXq5 zu2zlqjXe9<8hXPNlE$97}Xq zSZzZq>-Sq&dS(s>9vyj!;WZG!W4|n6@F4BmW}bj+>RZZJzIZ<$WxZ|NHV6<-$TI%TNlf??uxwaUHi*gCpii@hcRP9!(t}nwQwy#7B}9uwkM)`S>$Jmj3&l4 zDkc*1#2`uhp{!RTcqT6D3@3O_VDWL0Q8La4BEkkmMY@y?bC$3j=Z`8_IN6F?VoVs( zhu#B%OBKJbe*lg>46O)_XBMh1QcSHDvneQ^R0-QKR4iGdTy`fsqqwgmO56f{@N1fB zv7&*@w$SXYJC;N-`iGNhFIo^!Ql5YLH2aGuriW5-g{0@O;DkL*040tvAK+2L-~rQ7 zEoLx!jEMIn=b($RQ%amWN{@|+v=hMtfz0C&+Cp}0LYzBVkwY}G zzFyKY{O7K+!#nmcv(urNbW>=m?zkli#hvjP_7%v2wMJ_>Gc>BvQ90k8f8Xh_C{Zp4 z)K!aI9}y=8Y&L>58l#hNbhI{+${w#5%}nDyAmXwp9^wwFXqVlX63KlrKtojkW;Xa5 zeU_ZyX05$FiYFt5)+~_^W6#b?P%0{GS@%#si*&_s%r#p~Zo!=Pmw&@yF66-P=+tc?lVARK{Is9!dl$szi4a}`;7)gM~FiCwL&W^I9?J1!;`Sr2=? z1DWuk0g<*TkxfpF;i{$C+^ra;fuYS3X{n$BlhtCXBDe~nTFN00@SxT=bt{@0tIKgw zuvv|3=!VzTSVrLywsN}_@%YZ3RK0ItjKxMQqo;daG}6(scsSXI?^PDIG5 zP*n>va*_zRW-5KUw@Nr z*|3atb#$>G{@4E?uItkh+-BC^HO9X8{eM&b{)bN}&`MrkIcG~@QjXnY0pMOswej}(*>>ctWl()Ijy#k^baG>P@z#+7FUSa zM``coJhX}J`j6kR=DK=4`@7GC%oo3(*te)zmun~22O!b29vT`RT^b!7!M#|MW-ifB zl$R@ZQnpnS5s1~s(mj({Ywbh4=)K*&%Hguh zdQ?I#i_a)gV$w8jPa5W$7Ots=@0Ui};RtFf@SIT5We$fKF>6}@g%-Nir0K*LS&%d> zlI+|RUAuOT4#wQl(!!8s>vTpEG1>Sibb-Fizz&(?&iEK=Xl7ntARCEza*e`h4E_f# zATkU=kRltE5BOvbXgP2}j3P8gSC0}-IyR2pKzSR>h@L*^iJ*yf@7?wXJD9KBc+#KUMDgFYF6M5uKr1|g<`WN z;(o(E&TORVB4hDFb<_M~0a=}||uj}RJLThZTofR zPE2RnMGN`8`uh5KVik8DqiAX@Acu&Aa?b_52S>fW4uoT|HnFj>{4=P${e6ARYUHCc zso|K#be9t+PVmUd{r7KVFTeZ>X=MFO$}*qN%xBjlY_5xHI!vNL4i2u55!bXvUa?n! z@j{H4kJ{Ha6eYE287f2!-Nse?0nWs%v|dbwDY{Q1>!H4S_I=o_LI)8Xlx!E(H{j&b!*M2R-O1dcXR7Lq`xH_*%#6syK zCvLMzFS}ZAZz%t=HDIjrx3JGFM!ah%Ny14GfL8kQB=^!^_2Zyqw$5 znQ3mK%xbzu0_-y#NgFcyahvlbgS(OpQevYc6yrCcQ9@inz(RNT3?kJsw4z}) z>KMIx$(HsE4taUVkBJ|mMj$!CsyDWdDTcOT*2jV-1rp5_>C^t^dynwqn8&s(V%y%m zq?pXNO#H~O?si2n8R!pbyacWKW&UotoGy z>|JM9f1s;-5LuB!HL?je1tHgON?HlwE3OXRZwE zGl_5$k`oY9v9j_y38a;c#Iuz29KENf*T@wXOd4lz?+|Nm@5`19 zF$^B;9f1(=b$0ck+J)QLaIV3BA|$I~FeRp;iVrvd{01KE*s+6c+;|_`ym=Gbx^*k- z=;$F3N8wr$Dm~)@Ef7GO^sqX2Zn0#l%FvKk4uS~PV+aOBbnP9!QPbS9c)^qmn9zpS z=nJJXo8@NQi3! ze@4u5f#?{doA)<1b$JE`QL;WDX&LN?PduakV%zVup1yvWcdv=qBW!IL5~@@= z5o<=NENmJ$H8q!2+j;qf`tI>V+WI*Qv^C3CVq`F>90BF(wT2#|L)bKTG{k^;L)RL( zRomXu($-gy>)^>Ey5Z?paBtOVY9_?Zz%W9Q*~Y!lnphzb;xNi%fqZ~V33RaqrIX3H z@&g8*5TxrInYoH~>_ml|kVLk14u@xiuG3q6qv=CpQXA6K68ZB=wduZlOO;o)9iwf6 z69`jAt-RWbY-#qwZ+EIc{U6&nf<#8rCMq_Rqbgd^OB*(#o0ykv-nap9hKe$TO{~|} zcUTD?B;53mLm)5U>Fpcrxp}L3xOC2Bhwy#qW~W09bPY?Dorg35=fL2gHsJTFHjOh* ztu5$N*Ztk!XzxAycdAV_=GBXoU#{X0=t1q?_3KoN(=O(=E3C6?&`T0b4rTC#!2^Qt zC+(-V@_M~CwJ1Zxv_oMct+lycT|GaW`&8!5NN4+xUs0|#M(I~>T-M`bA~>RU_YLWa zH5#Lxltm@E8j@?$Q~I@cb{}S*f@1hAU{WBG!r^Ub>ej1jnhyzhWCVjhH};TBu)zx# zZ^g}>mB)*3=FXj~U%q@9S_@xaDp`Hwb(lmGB7RF+kdE*X1j>`iF)_GN7U2e$cLv z&rc>W-z)3^2;UYY8a1`bCDshTo2IfrpB^CXOq$24F?>>&X~805#)T`oE7do4qzZV3 z%wYfx(rZUUQ|F#b6}L96SUMxbA+SMd$tl`DJo7!;q{D1)`AO#E1vOUAxeTt0B)9<2 zH69uo0h z;(&=@13O8Dt+-l;o$L?@6b=vXTi!n~+;--CRr}(F(^F){Ahd*y8&>F_ee{0T+SbMP z?mx!1zHvdfJ0ghnI9W#zXd&7NMcS>r35DO+&mMoYRL{%JU@0ky{4U}1h?-8I*3sh@aTpK=4#Nd_q5mP@MrXo zy11_+s9D)?M+3We#VlPU5ot&>UNEbGwGZo>;rwN?c3;0#QQJmZ5UMTP*qzNMz>j+f zo(}p>Usv~l8xfeIq9UcZxR@s!>9?gF*W|c4BNDPO;+ub=1OJ91NmlBH$YjOlS zm?Q89-vf>{H1)9N=59H+Asik}z|(%Ms-dg4zKu;T%wQtY113v*ukld0VkEgSjfdAp zLgUuWu4r1bF>R1kc$g*FD>$q{@NgD(c6M@lm8Kj1K69>0y;av%CUE+Wo_5eznudl( z8;=~nqLUO1kDTtEwr!AX_?jekhc4?!t{8Qjt-~gNmm+YS49~sbV92uYT`=^VgRwC@OHd9K6^> z#v32mJcpgSd{`M6m?Kp3fG$FYs^EB>kcWpypz>&e;T!Bb-<{9B^)jX^A_jcpkC$Cl z>gqdoGb69RYaBdsGHu+W(6Gv}(k)io_ht8EfQ9}bV4lh%Cc$}P*a>ve2WK{}rs zUbLW;?b&-ok1&t|$c^kiQsDwx>B^-nA~}(r+WIEj{P1QKOr~V@N_Oe$3yO1elsj1= z&Fg(5?B4G`%ZZ)Vj<0V+V;8%0rM8RRp0E=PgNF$in{L&$?=Qc6Yjx@DLc`HV(&}b) zg}QKNPN+orXxU{}Fk`85qvDvdVt$bZ;Q%+&RH8yoN96olL z%_=UGGwQj6O_+E*v_?3i!8V7t9ruDCC6QO62BAG;Pk3p#7|V`a3QZ)YsS;jd%-YG* z*Sd#?y_I5phQqy^kQj~hT79Cd^2nL6(vUFD*`^MAXRAY!EJ@v>J^t$E-W!K>YN=eBymg~vk+zH6@!G~u- zxTtihV;}Da273%ZR+V46Rr|q*r_(oWm>UUc8eSpvmroQa|MZJ;y(c)06F2M`nHdJo zDHxCv9IjTMe#EWC#X6Pd=4LM0vDi?Z@SC3Ap}@X_THe05_edkt#?yBN#_i8ewT;U-47ha6g$5ut+W9>iv=GGr<8s=1m*o22d7eMS?T zg+iXb3E%-j*N_=@;ElJBto`O!*C#`&nrP!EKXSiP``UKSjPQ(Has{C_2KB_O47T}) z&muNXc5#ntvY7Otu>d!5KnM-qVK)0~U(}=H+zLqz-GI%+4jrvPFTi~Qo{!C~r+WdR zZw?NQ+}N?}?1HI9p2)}uy9gl$*@Y`L`i;6~HZ&Sgawg5@YiF{@DT6~JYFwN#+%hiK zrKGqgD_vcQdVesW?mbbXYu+9`GcBG)x;(^44L>3N*}eDN5Slm&cseG42Y!ZI^vu-< z4`1F;I=di{?MdcUS3(Wudj#`F^otXOX+)W@g_3xr!fi%qKnOKT z1Ql8W*F21H&6xiF&NBnY%PP_I6Ac^DL1m%_lEd^nZ04mMyH8D;JSok!c2x;7CY8*h zNi6bfG3?B5U)NKB5OiJV*qFZO*Dou}AAgLi=!8HV@o!$brntOg`XH(79T66``uoqY zg!D8x|CmU>#faq5eFrb1wxB{F&_tbw;c)`2S5BR+IzwEB`v{`a>ZoCpbAcs# zJc#11P;Cak7b*-z>NQUq3k%WmbrUMS($w4$`1SAhHg;C0m{OqzAyUik1l2F$ctI5Jv%v;1nem!3t+4Tj5GEmRtcZH{xI{_hmckMkN z{BZvTR1%#Q!1S|;4b64-Bymp&gq~=#a6pf1pnIPq zwd}2b{>ht9{OBLP9LUT_u*e1kxL#zWQ#Y#vWMh!}=o{2T?uAqj)gU2RR0O!Nk*TMM zT4tOeh#NQCeA{=OA;}X!*(VU_W710^5S=Y_?F;nXjNiU|U}jc&f^K}6$CJbl1{oaY$u1LFO>7uD7t5xTw9<)1z z=U@+u?n#O}IhQpyw=;K4q+V6mrA(S$5Go_atb;&cSV>OLXCggT>FOQ~{Q9MR?X(B` z1Uz6wcWV<3&FCuKC-Z~dXR|$7Nz)(LxWFRuSw^04FG%{^UVhG;ndre6>U9T6iZ6q? zi@hU_Zd7~a^^e+b*0!N>Bq}W@Y_2H|Fs5sCiPO9Ho=HndiYfWb0}D`tAge67a1~mG zCL3A8+!GqCE<5o^Qxt0=^78rF-#?_0KsA#|h~5qm8qiufgC0-tP$9qx&@nact@n-- zAZ+Pp9+;1eFRl*C$};H~01=DMwVYeZt{or%o&_a{%JA%)+3Rl|8T`%5`)?9wJ}iJ~ zVxQde92*9}-B&8>qhEdF=;p6{c@1e1E+)c7w}B@Dn?5-)^x*Qol6!(KjdCKYjiKOMOG<>vX-N;$GtiQ-&X-0_NlOjh)fI`t80iTP&ur zWs9fVg`Li?i@#-6q1j?(*Kb^7LnPE^magE80iPR8&?sL9b0Ce0nE4?4+4H;FNOgv9 z&(A1!@of`G}V}JRZJ+XAX%m+52MWQ)mw+jMOg?FDB^EpBxKG_&U4f{W* z12P4JTeltQK6vOd7&8*2@cJ=xC+xuW!7$GflaBk%%lq68hb3>*hEmifFqusX?NH$@ z4^&MMHyp3Lv|O&6!0C|50sMpi;kR4&4G;smD&T?82z5W6Xw(!I2psbS5vAkJcTb=j z?4rlEEMac9OEnfl6Z!08QjG}p-V*V3MgA?@1|i@0)i;l5uWmbB5!5u;T{u71Mt6b( zk_1cv8|*l8{Hl%AzTz)_c0~gEc87KO;3bQ)s0B<%W|83l0wFXfVI3M8(cXCHMBv4j z_g9XL`Tz^0*C%Nk@(79z1GBQ7FRw8@_x$!XUwv{tT25QSojiz*V$#tad+ez%-7_|AN|r@d zHo{y0qQqxsDJcbc{6|nnQjMxflKYy=*WL$vg!GJna}vN;X7AKX};x z(8_MswzHr9`vu5qoeqZ6o{ugMylE?;jYk{q~iEo9#BcXXUc#JR4LpA7LsY zS6M^4GVn>R2ktL36R}@-ud%r+@T(X151l$&eO9aw;DQP9`-V~g=YjhOxmuok{sXiQ zoAKDg%TbJ^N~z9$9LQr9F?#HyOs*0>h)~}>JVSkBJ9}yC{@yp=J$i{?hq-*5jWY-D zHcS#y18M+NsYntO&5IJ}%r3Cot*R_45e^*#ktMg0nLb={(O0itYgFEO zzijBx(aTVIa2^#KFy0Y$w?lI2lh}lPA6*)0Z0>&W3y&@zEyz!{x?`hEvUFB-8*JnTX z=<>n&b0P2zbI4)e{`} z4s1gZ0J~PzSbT!4NG_Al(KzFt zsCi@aXl48ITX`6M%@;(V&9O3V-} zkirTHK(e>@kF<646>V5MH*w13OjY`qU;@i1kjOSwWTZ-Fk0P9TuKb4o7ccCzm0!Af zRKNr6@MGH8Cryv#wg#O(B*u_EF!y?O)8b`|r^U`L$xAGmkz+>xF-hcMP4$fY-4U-w z($8CVx@zFWscXX>oqdp6a`H^gctAeIF(Q5kVnb7i=70Xzcc#vqo|8>T9Y1YKrZXnm z!HaNYR}*3T@WmoYp_8QYo<3J?K632pP(xEE5cxE_ZR30zNg94gqUTvm)iuqn|NN7; zO6JZg$XvQ;TF$(=g&GmQ*@zG-(n%F6D1w*%>a_;nv6EM=$IB}F>*_lW5*?mpxBVL3 z><=3-DVZXOZHTVd_N%sXaeM#(1w2VaK~xv_EjW6jGI{ZW$&+Zm^z^iN-d%?YrxQ$^ z5QC;Sn_GL?sWaF6PMoTWxn9+DW-JgqCDsR;2GqhoWT0a}{07g247~OiU)ewNSXt#g zB+-)V0-17fp#Ro{{a#%}KV}tmd%hBx(qM5XvK4T{(ZLcJO%F zweE8lYU)Nu{m^($i)&)-?`F48bYRJm>j6#3M?~Mfedp@HZ<&IXU2M(39qbDkE_4W;YB-R^n0XIKJW4~`cJbq9m0Ba)7 zR!LH^VE@7L^vukJby*pSZFxD#ky)8Zkv6NzP6(oPbPo6{uQ#Z-YTK>#jUA^+Vu5LZ zP~~hnAi*cuq@Q$vd)^dqHIaID{mAhvd1a@sXQidats+j{lbf9sm6Gf>$HzqnNR@Vz zCNSF2*k!A^)yi7idQXwMd`rM{UBCp%_^D>gO>kg?>jXS4^sLo~k5v?wow=Tso*KV0 zBR#%3FE_=No1GFB<#I*^0))hUBWOmDN(|y+eM3hF!P6?9sY<{DL>~Af;Q`S@3WGVe zlg(O92vksUwJs+iJ~}xiDJF69q>Q5MtfUq)&k}4_o6_FV+d;6T-n`X%skybMr>(uW zgBXvTb$3lXADH1EGffu1ffH|3yw=>PX|A9%@2z)_rsQO&B<5x(&qT>mAMNS#cN$dQ`ePOwjIgYz3+TZYD(NP zPiDdxPWs!4nRkOjqkZ*_og*addfPktJx$Hs2Snl#;E^HIZZ>gL=hGZg(qoMq8X7yV z(3!jMV0mU*YW#{EPm+?Glj0*jVd`-!85Nu6l(K zBK>A<>rpymi2=x|Bv@-Xx*BULdzX)g=T91o%#7#h6xYIauLJ^G1`$pQo$d>lYWc`$ zCd#nF;KBEy_JRQcfxrl{W`EH1*a?mxyWLwK*96gKc6AS=(wTVXTop7eSwAk}#~u%k zgGb`vA1f^6A?lYygaJmI(cLqYO6Q)6tMynPWJ&?2VTO%`!Gq^$W4Cd-oBa{fV<$MU zHeh7H2iW!*#Q0L_JV=BcBjDlv2bi&*atMc{v1WFg#(1UY-EQ=02%d=x$byL$0YH>E zc_$X#=vE_V!{Y(uEOuV>!T$6`84u5}IDrtA?Djluz$0hGhZDS<#g5*XM!kPHJQ5}e&;LrC z20VS@`gLLONCpIg2RswahL;n8J_#Q5jC6lmf|my_=o4q}ANbq!K@A?jK6< m|9Sl9@t?>4p9ds-?*9be5Pyu7;2{tI0000 Date: Sat, 10 Oct 2015 04:59:22 +0800 Subject: [PATCH 183/249] fix crash bug when buying a card pack This fixes the shop crashing the game when you buy a card packs in the shop. The targeting indicator looks at the stack so it needs to be enabled only when you're in the "game"... --- projects/mtg/src/CardGui.cpp | 56 ++++++++++++++++++++---------------- 1 file changed, 31 insertions(+), 25 deletions(-) diff --git a/projects/mtg/src/CardGui.cpp b/projects/mtg/src/CardGui.cpp index 0e0c186f2..511483a5e 100644 --- a/projects/mtg/src/CardGui.cpp +++ b/projects/mtg/src/CardGui.cpp @@ -248,15 +248,18 @@ void CardGui::Render() renderer->RenderQuad(fakeborder.get(), actX, actY, actT, (29 * actZ + 1) / 16, 42 * actZ / 16); } //draw border for highlighting - if (card && card->isTargetted() && highlightborder) + if (game) { - highlightborder->SetColor(ARGB(95,255,0,0)); - renderer->RenderQuad(highlightborder.get(), actX, actY, actT, (30 * actZ + 1) / 16, 43 * actZ / 16); - } - if (card && card->isTargetter() && highlightborder) - { - highlightborder->SetColor(ARGB(95,0,245,0)); - renderer->RenderQuad(highlightborder.get(), actX, actY, actT, (30 * actZ + 1) / 16, 43 * actZ / 16); + if (card && card->isTargetted() && highlightborder) + { + highlightborder->SetColor(ARGB(95,255,0,0)); + renderer->RenderQuad(highlightborder.get(), actX, actY, actT, (30 * actZ + 1) / 16, 43 * actZ / 16); + } + if (card && card->isTargetter() && highlightborder) + { + highlightborder->SetColor(ARGB(95,0,245,0)); + renderer->RenderQuad(highlightborder.get(), actX, actY, actT, (30 * actZ + 1) / 16, 43 * actZ / 16); + } } //draw the card image renderer->RenderQuad(quad.get(), actX, actY, actT, scale, scale); @@ -300,29 +303,32 @@ void CardGui::Render() } //draw line - if (card && card->isTargetted()) + if (game) { - if(card->isTapped()) + if (card && card->isTargetted()) { - if(mHasFocus) - renderer->DrawRoundRect(actX - (scale * quad->mWidth / 2)-10,actY - (scale * quad->mHeight / 2)+6.5f, (scale * quad->mHeight)-0.02f, (scale * quad->mWidth)-0.02f, 1.8f,ARGB(250,255,0,0)); + if(card->isTapped()) + { + if(mHasFocus) + renderer->DrawRoundRect(actX - (scale * quad->mWidth / 2)-10,actY - (scale * quad->mHeight / 2)+6.5f, (scale * quad->mHeight)-0.02f, (scale * quad->mWidth)-0.02f, 1.8f,ARGB(250,255,0,0)); + else + renderer->DrawRoundRect(actX - (scale * quad->mWidth / 2)-8,actY - (scale * quad->mHeight / 2)+4, (scale * quad->mHeight)-0.02f, (scale * quad->mWidth)-0.02f, 1.8f,ARGB(250,255,0,0)); + } else - renderer->DrawRoundRect(actX - (scale * quad->mWidth / 2)-8,actY - (scale * quad->mHeight / 2)+4, (scale * quad->mHeight)-0.02f, (scale * quad->mWidth)-0.02f, 1.8f,ARGB(250,255,0,0)); + renderer->DrawRoundRect(actX - (scale * quad->mWidth / 2)-2,actY - (scale * quad->mHeight / 2)-2, (scale * quad->mWidth)-0.02f, (scale * quad->mHeight)-0.02f, 1.8f,ARGB(250,255,0,0)); } - else - renderer->DrawRoundRect(actX - (scale * quad->mWidth / 2)-2,actY - (scale * quad->mHeight / 2)-2, (scale * quad->mWidth)-0.02f, (scale * quad->mHeight)-0.02f, 1.8f,ARGB(250,255,0,0)); - } - if (card && card->isTargetter()) - { - if(card->isTapped()) + if (card && card->isTargetter()) { - if(mHasFocus) - renderer->DrawRoundRect(actX - (scale * quad->mWidth / 2)-10,actY - (scale * quad->mHeight / 2)+6.5f, (scale * quad->mHeight)-0.02f, (scale * quad->mWidth)-0.02f, 1.8f,ARGB(250,0,255,0)); + if(card->isTapped()) + { + if(mHasFocus) + renderer->DrawRoundRect(actX - (scale * quad->mWidth / 2)-10,actY - (scale * quad->mHeight / 2)+6.5f, (scale * quad->mHeight)-0.02f, (scale * quad->mWidth)-0.02f, 1.8f,ARGB(250,0,255,0)); + else + renderer->DrawRoundRect(actX - (scale * quad->mWidth / 2)-8,actY - (scale * quad->mHeight / 2)+4, (scale * quad->mHeight)-0.02f, (scale * quad->mWidth)-0.02f, 1.8f,ARGB(250,0,255,0)); + } else - renderer->DrawRoundRect(actX - (scale * quad->mWidth / 2)-8,actY - (scale * quad->mHeight / 2)+4, (scale * quad->mHeight)-0.02f, (scale * quad->mWidth)-0.02f, 1.8f,ARGB(250,0,255,0)); - } - else - renderer->DrawRoundRect(actX - (scale * quad->mWidth / 2)-2,actY - (scale * quad->mHeight / 2)-2, (scale * quad->mWidth)-0.02f, (scale * quad->mHeight)-0.02f, 1.8f,ARGB(250,0,255,0)); + renderer->DrawRoundRect(actX - (scale * quad->mWidth / 2)-2,actY - (scale * quad->mHeight / 2)-2, (scale * quad->mWidth)-0.02f, (scale * quad->mHeight)-0.02f, 1.8f,ARGB(250,0,255,0)); + } } //draws the numbers power/toughness From 6c41ae8e8e9b510c0fa38eb1fcb78ae3a8666200 Mon Sep 17 00:00:00 2001 From: Xawotihs Date: Sat, 10 Oct 2015 14:19:22 +0200 Subject: [PATCH 184/249] Update android build tools to 23.0.1 to try fixing travis --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 7c3c5011d..c64d863f5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -39,7 +39,7 @@ install: tar --absolute-names -jxf android-ndk-r9-linux-x86_64.tar.bz2 && tar -zxf android-sdk_r24.3.3-linux.tgz && $ANDROID list sdk --extended -a && - echo yes | $ANDROID update sdk -a -t tools,platform-tools,build-tools-22.0.1,android-10 --no-ui --force --no-https; + echo yes | $ANDROID update sdk -a -t tools,platform-tools,build-tools-23.0.1,android-10 --no-ui --force --no-https; fi - sudo pip install pyjavaproperties - sudo pip install github3.py From 2461b39fb7ee1a034d26b3b3bf7294d1c9b6a699 Mon Sep 17 00:00:00 2001 From: Xawotihs Date: Sat, 10 Oct 2015 14:35:22 +0200 Subject: [PATCH 185/249] Update android SDK to 24.3.4 to try fixing travis --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index c64d863f5..feb5ab876 100644 --- a/.travis.yml +++ b/.travis.yml @@ -21,7 +21,7 @@ before_install: export ANDROID="android-sdk-linux/tools/android" && if [ `uname -m` = x86_64 ]; then sudo apt-get install -qq --force-yes libgd2-xpm ia32-libs ia32-libs-multiarch jq; fi && wget http://dl.google.com/android/ndk/android-ndk-r9-linux-x86_64.tar.bz2 -nv && - wget http://dl.google.com/android/android-sdk_r24.3.3-linux.tgz -nv; + wget http://dl.google.com/android/android-sdk_r24.3.4-linux.tgz -nv; fi # Building for Qt here - if [ "$BUILD_Qt" == "YES" ]; then From 4f9ee17ff9508ddd008bb52d0e313fd372ce6545 Mon Sep 17 00:00:00 2001 From: Xawotihs Date: Sat, 10 Oct 2015 14:35:53 +0200 Subject: [PATCH 186/249] Everywhere --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index feb5ab876..9b360a1ba 100644 --- a/.travis.yml +++ b/.travis.yml @@ -37,7 +37,7 @@ install: fi - if [ "$BUILD_ANDROID" == "YES" ]; then tar --absolute-names -jxf android-ndk-r9-linux-x86_64.tar.bz2 && - tar -zxf android-sdk_r24.3.3-linux.tgz && + tar -zxf android-sdk_r24.3.4-linux.tgz && $ANDROID list sdk --extended -a && echo yes | $ANDROID update sdk -a -t tools,platform-tools,build-tools-23.0.1,android-10 --no-ui --force --no-https; fi From 6376596e49956668d498538e8a46642e471681b2 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sat, 10 Oct 2015 20:54:41 +0800 Subject: [PATCH 187/249] increase battlefield "hot area" size, opponent phase ring uses darker glyph vs human --- projects/mtg/include/GuiPhaseBar.h | 2 +- projects/mtg/src/GuiFrame.cpp | 2 +- projects/mtg/src/GuiPhaseBar.cpp | 9 ++++++--- projects/mtg/src/GuiPlay.cpp | 7 +++++-- 4 files changed, 13 insertions(+), 7 deletions(-) diff --git a/projects/mtg/include/GuiPhaseBar.h b/projects/mtg/include/GuiPhaseBar.h index 78cec2677..4b78f7d7c 100644 --- a/projects/mtg/include/GuiPhaseBar.h +++ b/projects/mtg/include/GuiPhaseBar.h @@ -22,7 +22,7 @@ private: InOutQuadEasing zoomFactorEasing; DuelLayers* mpDuelLayers; - void DrawGlyph(JQuad *inQuad, int phaseId, float x, float y, float scale); + void DrawGlyph(JQuad *inQuad, int phaseId, float x, float y, float scale, float z); public: GuiPhaseBar(DuelLayers* duelLayers); ~GuiPhaseBar(); diff --git a/projects/mtg/src/GuiFrame.cpp b/projects/mtg/src/GuiFrame.cpp index 276fefffa..39d1ac33a 100644 --- a/projects/mtg/src/GuiFrame.cpp +++ b/projects/mtg/src/GuiFrame.cpp @@ -11,7 +11,7 @@ GuiFrame::GuiFrame(GameObserver* observer) if (observer->getResourceManager()->GetTexture("wood.png")) { wood = observer->getResourceManager()->RetrieveQuad("wood.png", 0, 0, 0, 0); - wood->mHeight =32.f; + wood->mHeight = 32.f; wood->mWidth = 480.f; } else diff --git a/projects/mtg/src/GuiPhaseBar.cpp b/projects/mtg/src/GuiPhaseBar.cpp index f782c6518..ffb541c3f 100644 --- a/projects/mtg/src/GuiPhaseBar.cpp +++ b/projects/mtg/src/GuiPhaseBar.cpp @@ -36,9 +36,9 @@ namespace const unsigned kPhases = NB_MTG_PHASES - 2; //there are two phases we do not show } -void GuiPhaseBar::DrawGlyph(JQuad *inQuad, int phaseId, float x, float y, float scale) +void GuiPhaseBar::DrawGlyph(JQuad *inQuad, int phaseId, float x, float y, float scale, float z) { - inQuad->SetTextureRect(phaseId * (kWidth + 1), 0, kWidth, kHeight); + inQuad->SetTextureRect(phaseId * (kWidth + 1), z, kWidth, kHeight); JRenderer::GetInstance()->RenderQuad(inQuad, x, y - scale * kWidth/2, 0.0f, scale, scale); } @@ -110,7 +110,10 @@ void GuiPhaseBar::Render() //hint: sin(circPos + PI/2) = cos(circPos) const float glyphScale = float(zoomFactor * cosf(circPos) * 0.5f); - DrawGlyph(quad.get(), (displayedPhaseId - 2 + i + kPhases) % kPhases, 0, glyphY, glyphScale); + if (observer->currentPlayer && observer->currentPlayer->isAI() && !observer->currentPlayer->opponent()->isAI()) + DrawGlyph(quad.get(), (displayedPhaseId - 2 + i + kPhases) % kPhases, 0, glyphY, glyphScale, 29); + else + DrawGlyph(quad.get(), (displayedPhaseId - 2 + i + kPhases) % kPhases, 0, glyphY, glyphScale, 0); } //print phase name diff --git a/projects/mtg/src/GuiPlay.cpp b/projects/mtg/src/GuiPlay.cpp index 43403d5ab..d9ebce42f 100644 --- a/projects/mtg/src/GuiPlay.cpp +++ b/projects/mtg/src/GuiPlay.cpp @@ -106,7 +106,7 @@ GuiPlay::BattleField::BattleField() : attackers(0), height(0.0), red(0), colorFlow(0) { } -const float GuiPlay::BattleField::HEIGHT = 80.0f; +const float GuiPlay::BattleField::HEIGHT = 146.0f; void GuiPlay::BattleField::addAttacker(MTGCardInstance*) { ++attackers; @@ -160,7 +160,10 @@ void GuiPlay::BattleField::Update(float dt) void GuiPlay::BattleField::Render() { if (height > 3) - JRenderer::GetInstance()->FillRect(44, SCREEN_HEIGHT / 2 + 10 - height / 2, 318, height, ARGB(127, red, 0, 0)); + JRenderer::GetInstance()->FillRect(0, SCREEN_HEIGHT / 2 + 10 - height / 2, 480, height, ARGB(127, red, 0, 0)); + //JQuadPtr fillblack = WResourceManager::Instance()->RetrieveTempQuad("fillblack.png", TEXTURE_SUB_5551); + //if (fillblack.get() && height > 3)//mask + //JRenderer::GetInstance()->RenderQuad(fillblack.get(), 0, 70.f, 0, 0.5f, 0.5f); } GuiPlay::GuiPlay(DuelLayers* view) : From 4c86cae7fe630e026d17ed23c8f29e4c62ebdfc0 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sun, 11 Oct 2015 14:29:36 +0800 Subject: [PATCH 188/249] disabled wood & gold texture, backdrop size 480x272 blending of wood and/or gold texture on some resolutions(mobile, tablets, etc) draws line which can be distracting. The backdrop is now full size of PSP resolution (480x272, 2x res can be loaded like 960x544) --- projects/mtg/bin/Res/graphics/backdrop.jpg | Bin 33851 -> 46802 bytes .../mtg/bin/Res/themes/Christmas/backdrop.jpg | Bin 127074 -> 128338 bytes .../mtg/bin/Res/themes/Classic/backdrop.jpg | Bin 14198 -> 28847 bytes .../Res/themes/Gemstones/backdrop_black.jpg | Bin 40668 -> 47443 bytes .../Res/themes/Gemstones/backdrop_blue.jpg | Bin 70246 -> 78327 bytes .../Res/themes/Gemstones/backdrop_green.jpg | Bin 36794 -> 52328 bytes .../bin/Res/themes/Gemstones/backdrop_red.jpg | Bin 55087 -> 55474 bytes .../Res/themes/Gemstones/backdrop_white.jpg | Bin 48213 -> 50279 bytes .../mtg/bin/Res/themes/Green/backdrop.jpg | Bin 13348 -> 37299 bytes .../bin/Res/themes/White Shrine/backdrop.JPG | Bin 21649 -> 25075 bytes projects/mtg/src/ActionStack.cpp | 6 ++-- projects/mtg/src/GuiBackground.cpp | 4 +-- projects/mtg/src/GuiFrame.cpp | 28 +++++++++--------- projects/mtg/src/GuiPhaseBar.cpp | 2 +- projects/mtg/src/GuiPlay.cpp | 8 ++--- 15 files changed, 24 insertions(+), 24 deletions(-) diff --git a/projects/mtg/bin/Res/graphics/backdrop.jpg b/projects/mtg/bin/Res/graphics/backdrop.jpg index c421d570d63c8f9082cc45ccb65ae2e9fdf5a92d..ac5fbf9c3a8aa93953cbd3fd6bf0b87df9286614 100644 GIT binary patch literal 46802 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 b6=Z8P01!{F6#!*F%~L>0?}P*r{{a8l8)yT~ delta 30941 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 diff --git a/projects/mtg/bin/Res/themes/Christmas/backdrop.jpg b/projects/mtg/bin/Res/themes/Christmas/backdrop.jpg index 96df925ad82f9ae51a1e2726a4dd1e0b93f9f372..269d2c2c357b069ed51d718fc0229f69a6c0779a 100644 GIT binary patch literal 128338 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 QL0dyoxEKfi;QH790gn>ETL1t6 literal 127074 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 z zC<_&&cZn!#8y8-Y8=0V+QnxBS;BC*{519FDdbQm-E8Lsys#qgP)I|cWrH_H1!g%Ak zW5J8WHU1)c#hst-+il4EocG*|%(q)-iKkMcEgwe)lqp4($ip)(rvPeWPN~DXDz?^A zyC+$Kpj=)$d8U$!9MvYRsNiB*U^Pyt^LYM%kPW@(ueI=RmKL@a+qK!A^%Mt_PJr#^ z+66+_(!FITE+ym;!4=%zB;WweO*)UQJge!^BB+9(&s9+jGQ2d>sgh-h-YAP3r;8pD6-IJS8c;fMFj`(dU{wW z0F~XFRmP=zt)R(e zp)`h@4j`7QDe5AQSr%CWD#HUvvd#(pK|vsUsbC0P)b;9g`+@t7%Uf5raa(g0Q<&Yk z8XA0429^iLPSp%npC0nnEHTGWWC~2BtN`cTUWfy;ohmc)>wIxelbO6WLvLmB7(A>Z zpCgN@l8&+wByx!7h}qCd6FhHk>Iok1tQ|uy1J=50_rAT?z5B0qHfgO(Pfrb9Opy>~ zsHJktPZdtN6d03RBa;n|s{?XJHh$2dwX}Sb+lLVH2!y6bK-%({7(5&sZa6iFH~uEpJx96mt-gF9Og#0qERm6r+F%+ z8$P7eq%Acv1)xaK$r*$hY4Ka$KV#Zej4Cio*5CRK#!mAe!iJRIXIdH@4jUN4B@t$i(k`m$>jd!)@-2 zMK*5%xOUB59%pZ5ad|3rs-ehYva}OVO_8IX2^G>jTD z(ngXvqXq$$l;MK_K?D)d&cl5DT{Iwlzt7T#%c}GEo$<$QQ*Q13x4Q!vu?Q zw~l4Gx7#fa+Vn=^N3WsurwVjUKbmjHe!i=%!eF+{6q05jg0`}*I0SD!4Gi%j#RW^C zIy}`2sZjIiCcqv`BoBBQi{|WBvyyibt2f6+b525AX{eyF(!awp#IABXP+D-#?xSOblD9s z)dx)YHafJ-)` zfS_cPg(_zsM$z^6mxtLc-`wkHM)?zM+arpTBL1@} z{s@o4esWTrbhi$Gaql*p1dri3p6q!kssrau2neEW0Nt zY>5g=KU!uw?k7I7%6o|7RToTYQ=t~8pw{!uJFfdW&$wJ_3-F-AC;CqCGLUelmLYE1n%7O|ETwT-yHtTYfM8HumpY>#u(6-8*8da#$+d zetL>Fids6Qo{pwkeoRMBXDbtkz=IzqX;ah63#pQJB>H`q?DXr=$&j zCZdWsYSJpHag`wjE=lOBsi`Vu@heXZ63-eWtxqnbHYWOS^!D&zarnJD*G*&*!2}=i zRl>$L@lRTpL;06!#~0sh4M_g?7XY??|Quj{w3#cqA!vpf5C<>>HxcAAsy zsqi)1J3HgY)_vYWXj$MhtxSsEwOuElWzv&8)MQq)QB&(t)y4)7cR=R)>K)IqavR2r zbkx%}XKU2r{{V;#VL7S_nKMxeu>SzYafYKA1ER$lRFT3;DyVa){e9KhVmjT)2k_foCJdbYmuDJX6 zUhBfw7y4hH^}YMAbvC+Hc|=gv)Ya0!h?LD!saX`Nv!cXgkz!SlkN`Y^e|jHgdiP)d z)6wDzcVy!B0Fr+e`umUMkwbNr*6K`Sq0_AP7?P4*n2+V3wf$y;Eg3LQF) zJ$$~}8VvLl@450Dr*YTkQa5;IDHS}XFB?fuPKyLG1PZ1!F{h<}vbGwo%XLtjJsm}wC%ydyL zzLqH}Q1oc`?)~Y_p|l%eY{NG5&X>gJD7z{tq@j9QDq;Tsa{G3>7JTv4!B3E>OnyQ*oT#g!l6at%>E;6HSrM)E1KX-gC}N}&OhEb2gdI>X8^d{!acNR|>mfbrm1CCkh`crI8j)yf-krUTR;>2z&o7X_}e{Vz- znS#t&xUlx2eytYWSyi0;X0-grTJ1H@+0l9Sud4O$e(T*m)NVZ8RvwoDK1QZoMI5a) zH48|_2&8LWl?kvW-s%xU7X!HU>Yg2OqTE^RbF`E>oSiGZ6u9PSE2?8Af^Y=XcUcGd zG=OrSr2ha8y`{%WyJn{)CMqnBrO_p9DvvA*x7Da5gZ;m~ zc!*>%1K&#Z>SDfKGE~I`)ia!2HEl?Wt^}$cWKfDEX-q(MAzZ!8tGbmy7dh!<ZVAc>)k?vd8wt2qMB)G=Y`ftriMm} zSlvz4s@=_y7yl9?!DK&`>%EHe(T+P-@5l#8T`8c0GvO~-{rG{iaxI2 z_-@1Kn(WlE=6*Q#l|_Ew+1^>oNn4cKX%$sIYp=4EI@yf)x`?T#n$J~DQ=~7jH#G7d z!_8hd)Iwq08Gp8n08S`1f;7obpLH-84wl;APij=FRRQ3C$?5(Nms=)vNBk*U;Ky}A zOE-1x4$1i8y{epl5Y>;Du=Y(YOyNX_5xRDjGHy1cE_pRrYCQw$&23)rkK8Z2SGd-< zH&?v9X>Yq*F)RcUrM%OO971Nkb2XHLEwLw3%dUoxP<|+KW z_ndIh$(w!nhN(`OS4BZXh<9FZpyTAMI;c(8J zdiL6T?Y-7Uj%xs0TkVpFLkI)q+=O~HE06Vv5bAVCV^**ul|A1o$EN{JJ!|$p3FD+# zQ}(XsFIqZ=f>TAuZ?{W?LJ2?EX}74X=OFrEf{4)5(4Dv*qo8lx?BPJbqHk(?48+EA z91@JL!SG`nJ}Z0q`L_DB0y#AAEOZ;|#8zIGWf?fHUt6tE1RJ+y!^8V(hWScQ5;ZQr z9h!4LGGFQLbs-vK&Xf3(OJ0&lHR7El-J1v~oxE?pa9tE$P0=`^CD8t^O2<=5R>{ z@4FN+?^gVb@Kc7un{&ebh3nyYO;%^?_TO*SK9qfo=szbypczz<8a3)DR?kF4!*70N}@zcd^T+=&V1jk8v za8$09+=>J>VX<2wDfy}SnAO&h&%=dnvlH@n;T_u+Xgx4OoO+bhfRIG=TI<#RJWg~F zMOKQ)(nO$sgdS50Ss;sxn!HHD#K%$HT(+U^g#^E-08ZTZZSo}I8{4S?eW-^0_v!m1 z7mfYQ?who<3A!cLgA)Tb$2>K1M3n92G#Ms@EKWm2(d|J?I|IoMKPZj;?88wh&FMC! z_DthN*;Tf7aORYX_@Sga#ix}dup)O&>%dRVadDXH0+*ld9zlgJ)%HPq9)k?;KKC_C7=f@_ zR5U|n>?^xf!>9>7g=1NEb+z61rCfniPh%@v#L8dhdLW6;0aDlbRV@1Q;Xw@S*WiRv zR^TG}Jk}XvP^|27xs-E0Uq!=ia^CvmLb+h`(sWeHm<-T?~@RrHnSL z7694!^-zN}u51|RLeT`Ywp`0DG0q}%?(N;bx7R*x)D*X(PHI(_R(Fys5W z2K42Eu61q!c&i`fI^s?JtNc73*#ra@Jc3q7$$2MCOIqdk0Z9y~hzD*;5$_;1byTp5*_* z5>P5jXNYChdv`AO13oAD75CBJg=oTB0Gx+8`7xB5DJ;w%LE=5U4mgASv{Q?8yd z8%H`WF0LPZp9Vfye)7*f5k1qG&vtg)Fhl<^Nm)n5LZwo5`(4n_{gly?$(vn?t;f$n zuC3gM3UzhK7o>`#)&Rf{=M3N*g!m=WGM!jw> zNmFi#+$U(VRh!hLyKWlYjOZSW|Uvq|$8>C=C|hmqsBr8yE-(Qu^8% z$>aOS)ut`h3NxCvZHtrD^^*#|lEU?Q`JcBJ-Qa-ZBMP`8;sn4e2&nsJ=Zg1kHFpby zQ96Dh&4I!aOsF5&b9hB8_KDJjyhwI^W(|wzt^vHz1d5qrF>E)9pqa-plpe z_onEF#a(MhT7#_@d$-Osvt<@uub~C7czUnnUKx|xvS(~`CaRQk8H?B<2F;xEL&23a3*7PX`n9id!k4U)p(?uuo6lK4?23&U7kKLADO`< z^gZc`fLNOkQdIcd!(`Gu<`xh(i{uTOpA-(MRg+FzNItt7Vt+yCaWXxvIf(sE%A#)e zYe)0QyFkXIlDDs(FqQ|XW9YTeTAJ}u8hz#wZlP$dc5~EG%ofP-k`bqfFD%W-DnW5E z$TL^}kbh%OGmOb3WpI3`Ixt>QL#idhx^?XZUS*CrLo~zq>Yk|x@)dcPiYxQc1QyVW z8gm#LsBLU~8m|EL)Z$+ODl4z71sHHR3+eU$)-*Jqk%fEVZF14J0#|Z zc-T0IF7+&^L^5ahARco)sdcwl<=Ly}yH;OS-GWe}$r2rx2mH=f`6Cbys~Fo$BKP@j zP3x1ZGU<1EcCLgIgncLPL%O%NA8pMyaHZv2>)W4{jrUA>?!0+YE_asWlxLRvgQ!?v6c{J|zjtp>HxBa$o#EUC zRibHs1JKD>1A3$O`}n6oNx0k#q2A-tKn$4dTl^PPJDi6QG z?xU+BQ!naA{U^^y$U-p|fB7PecZKDn9$phFDr<6eSLkGvP4wC={`uTQHFmsjNv-EC1s@<&P1%=adUVnG)K$r`P9|#s%x{7e08hk$oGVo0J^UoiJHG zpVv(gY1TF=coy0K07Fegp2$#b0IDdX`k2&$U$X~JzT4J!@T`cGgS_~|*- zs%YC(v)VyF%yLMnv2|1G^P0I_`#fzzQ9=xKPHsv+iKlw-eHgt)BZf}txr>ia;iupO zRh-;iL>@-5kX=oqU4xb=$KITevU~Py*}}QTL0KIGI~U=Ey40H_fhsLE&}BOF(`mUx zjk@U2dM798#;CN}I^K7zxBfL-XM)HDwwe5H+q%L&V= zmL`6MXFcr5LbdJbyW%RTOq@dE5HN&1b9cwau5RTUxBkYGAGKaXP>zNEk@PMJJvPtQ za%F-wIP3Pr97{UP!rEIW&Q-OF^&ZqhZ3Z{8c`&b}N>y3{nnnJ18TvapUeQv6+KpL8 zFfhsxV5ShAYoeEDh`_$`;MPVH68<7l=VrO_6Y9UoyiI5lpUb2KrG9C>87To&;Tgj; z6raJY)D|YRKVhP62DS>}p1u|{{z6h0zH;PP5Lf?ok|+;Lg}9LUExt(q={9ICtNnB4 z6vbp6uA>#SkKLb=qzI@>hg9=5YFWm~?U~a?F3&lcZE(UH61bY-+>;m4r(KrxB`W1F zpyFw%9{Wnf&g7g{oA&OTRyw50O=2oqF?pq0!5`zs=l7MIlxK);9{jV9xEBwbL3CfB zGYgq!F)ud^1(J!AKiQFfU6mGysbQQQX)RjoYq)Sd6c&xStnER=UCectK8sM3C)g_& zl_1$^e^7GTbKlQ=pM(Iip}4GK+_xWy<^43s8FSHn5mGBU( zsH~Tw3Lzo+a59gV%)zqhJqp827?QLCbO1a%RFYGdHQtuor-Tokr|hQMYiX%j+tK!{ zeNom3^s+~p6%45TGQvpFjIy;^NeAPjVa&f%sX>%IekM0ESROAmYDsrG5QktJ?@QV? z3!sZnH;roPGY{8|CnKfE=wfIGA5j(t4o7E0dWxbw7j) z8r|JNetQf0n!^lBJv!eVjbzj$`M8{$@Vh^%sx+9w3|;m!`?gXR*BavJLWi~}{T$`c z3(X6czc`moTU|IEE?-|+6;~{JMSRZS7M7){mW$FF3((engDbI)w=YXsH%;}QYM3O% ztV2r?eKNIdWnrQQ@(3F1uHnRAm;~`uTM(3NNHOgC`jWG)bSAjRiPK~)CW=yM!q-G3%4?px1vh`(It4%0aU<_syF8kn<0WX z;ia+)@mvw$0z9Es^c)0i2#MQu{*_R__mXVbbFC6g0FW*J%5@VN0_L#NqT&p2QH1Sk zghJ@kLQGmXfX(`KyPANkbtycTA- zO!$gf5D39O>Zz9JVa^p_7=Q<>XRmYQL)0#-JKt$cH#_{d4d7p$(^cEz(*Tg?Ln_2! zH~$_r>FeF!)qb&cKIE)3C8@*KEY*|3HI;nzq$`7eY+;3Q61U5?lq?Y{K=6rCzincP<9N%<&6{YP#AKST!bXjG#BNGAyAZx}LByk@Rl(VZB9tDEN zg0C*u+4`VU(WvQIbynELf{!zij&wpv=I0SLA&cWfTwUgpX`K+c^_wbtoQsFE7rUQy zY6dIKa>TNQMywi4o!_Vo1m?%YbhxNA-hrJY3&%&tC;Ob=By&A8Q$>wGYhqlqPV9aLzBoFh%>1@KLI&vbUFg@~=p^LHTOoLrDL&TjnFAJnNZOAI3xOXlE#i&T zLReTqVztsjpb<4u&2mwt@d>4iX|{2ZYQAKw=Bz<(y$_GKwnZ1v-k}R!>i#Rkb?l0! z#w^cQWI9>$`(v1ojmVm4-Uhkys+;}s7P8J3vL%bjfV=P-aD?3xPe}J&Oq`^db5y19 z{t*B$l8v$ukpD67*fCFOW_`-m)%L7hOOvL3n;S=-yQM*UQ`rEU2+6OW1 zDALRJtw9Ihip_o5u0iFA^Z~Z-XFNVSqG|+P916`?-f&x%vyWRJUf1YfzVYGgsLxpc z7|Eo|y2RWAcKcMvGa?-%-*@E02|G4Ejn7c>S@jc@;=C%@vtNlD?#sKr43s6*1vj}8np||?9uyAWf zGR7;v5*&YZ-{z3uV)!a>1jy3_ z&mTqTv!J44wbUNYxETswBnK@| zTVeq-{94)*p!_Ku^6M$Qrw4O;a~_-`q;`|s&Q(feC5wlyAW|;MR!OK;g=?Or6F}qY z$$yb)H%nWa#UOWfwtujB`L5Psa+~Uce_QZh+mahU__dEyc6O?la&Yhd9`eu;8aI1Q zyf6d%!Y&`%M?r5=<~m%5;*+-&^{auGF0}aFg~c&+`^V{eBYYbsi^#gqw?Jgnu@Qg z*JQFpZ}7or7?g9-h30SFaxtj>#W%`?bnIj+70rxl4YsgAUdE$>ZSkp#KdP-l(`qF< z4A2ag2rn|`6&E^n>KfY0v80FRm(`C5MT9QZ&A@%@`Mz1^J;})~89SR&+yE$fdQSgH zgO(;?smpxg(y@;Np@}teEMu zlD4)QVI>&$bJ87wHA+7R^`@24FRIjfTl((S0akGz_IPT#DZV-U%;csIr(7b+t)#4* z`Y(#mqYlvzHxGQiWLpG|VJc8Rk=t{Ch2_?8Q{__L$vrL(HAa~P3~gNyySr8z1od@S zk59?cb3+ZWpRh{Pi$uRD2>BBzK{*eW*O&nRkVA2r7^uaU!OG!rgK8SAgKVKYLp=$8 z3uw8II>8mm>G~9j#J@YW%}!>qqLrfV>7XLNm2;LQ1Xi^6F!a?Y+ee?Mnx``t0Gglx}(5IvfBT9~#CMN)9GS}nH> z2%D&p@9tJl)lR5VW!@P(GgLUTTRy3Gg@9g%h}H575tV&Z9{vvvH3K!PV+pFs=;+Yq z78@ByI%FTfOo)EyAFB|iHHp=S+fC+`!wdB11Vw6-?UjYQS!^wToM`+eQ0L!}6T5i% zfd?vUyaTpWd8Ne1kP%C+1t zIIr&964JOz&R052m>E6vPE^m;*0|8o7`A)o{OQ0ke(rXlk_=d}vmIFX7QP%PM6|8Q z@|?~1b!gy=3P>5S@q0w|!D9+d;&|zM%CQumf=h@>ibO_?(X_vv8MBtq=as?=vq}FX zU>b81eN@KYAqq30Q+Yy5bQ83%`}V8EP8;)u@j~x`{?345wkzP<#QRLzP-D{Iv)*GA(|dBOV&_A{3;xd*HN1`9-qFJ# zooI!g7@;?VOGO#kCaq@MMMEDLQTwd=vh=`(? z3?7k3z~{R1k0epFS#55vF+ZHUpKm-BXgiDzqMRqdk&4m(?rxW_XGw%gDC4Fs zkfYIJk*w>#=mC%`HQ5uqtJq=#!n~3Z3Fn5J>Hlp5-~$X|1}4fWxgy~0<&%rdus;d; z?z$7LQMBQD1NqE!^Itg+r2`|Xa(5TJ0pAKFE#;JBK|m&vRF+X+U0s~@u3Z%8w{$s9 zX><`;l4KTbt{0)^E@zY{$-W@GbG-bt^X(u)$~L9`Eq?SX1&c+45b;ZtV_(&bZZ&S< ztHzyYAECdH?7SkDneu0;P2!1%3ME8tj6Gi-{2LJAD0EEpKXH(s^KJGO{yO67pqq6- zU!ddW0hQ+)YB1rclShs@b=zEHk7(1eo6y;JsL-nq;eTgmUQ`(SMeF%59{r(yFB+~O z>qpN;a@=eSa8^8%;;`aRb|*w^kxu)wr8WL*fCH*z%TMxjSg#e|85WCqZlI7H3r(qE zIrp%H)<%jssoX*`>qr}dFStsTr5D=AqaK0k3$q0xLhbNfraBoz<-Z$CvhiwJFRn6i6)6Djkmyne zJnF+dj?c?N_lpABHu6NpA*sTubm|%qCUm@%WWPypR8HR}WT`-xyzfxqQ4%yvH+6DoH$G10 zG`&g+FV0sKwt&Y|tBGr|yYdS}ugxb^G9FT-HO6*UN{!o3GwW6Z4JW#56&4AA_t6VniFCi{R*Q zYs^ph2{LLrD-0u&7d7vj&<*f28DC3*O4^N>c-{wbw7XX?UjkeidQleue=jr#gak$7bW z6&=8Q52+}Puhy>;%%3DUm*FA{DhWRl0iyXlRND!&avxaKC%)Xm1hDi^0S}1b<0`ZCdy&e(TK_a)xUbH zk7-9=jKsF*Xs)D6?B{|dNZgurg*U9t#pS*??Kw9N#u7{0BVC!R<*c;`to#9s@v&at zbtQD;nVivoZsmP#?wtWE(PqFd)0Zsc(e(q>zZ`no=c~lE>1wb{Yx12lG6V?jGRL+Ny%dbZdhd%ZBT*6ik8};%&uSmb2|G(LV zJG+bjvup8D02u5zNn**dV5v^XYbmMo$*+g!vHf}!FZtv3^YzFFzioUOX&mDnoc|2D zl;CM8V-sl}C*f%W>J&El?yT7P7GtypB6LD0swK2R2+I2pa$si-V7<|V*RyM z?DttQFXEcU=cQU*#mgqjI{**R)-r1W*$d%Wj8fc7}7OG4HHZDCk&uYiLl$ z(c8HyDQ&!#r!%ai0(q%^;00o0arAW4ZiBy-!;%aZnO(_hAVVaT{7a&D`kpCttWUAR zNRyp_;`lDv^JzJTEYFNBD93)qE?HJy6?1*aYvI@>%_Lsij%q=cV~yy6Xi(X&K^{mP(MPY;Y&w-(Np4?)}AZKTAMYfKMHS$%9AGaWH7u5Qgu!kM2 zu$Iu=>9;x-{`7^$Cs9+d%lV}dW~p&}MN*}4rAj8m(%J98zG&{&+U20hW+~aeBhc)G z6b{=cPy8uYEiL_0T1sAxX*{r}igM@V7ZJb<$qpeaRkNSu1z{W=Zv5WF%W62bUUyo- zNBZr_VvJK{rr?k5NZ&RNqtC#mmEl^H65y6sUX)0&t$M_L(aPidY9>ILSR1eDPw0gk zr)fv>)+zl+MXPhCb6PoGAWPZ~tG|HzCPRiN1KKZoc5MS&HH}G3q97b{!ExuatvRdZ z3!bZnNR#V<&^wG$Pp+IZzWdNTvYcyP2+v$vZn_wjZ8k(rCgutIr zn5Ib||8>2E%j9)LPN-2(?5&<*zoJ3hTy%Vi7(-Sev@m~Ua!|mG=WBcZ`U{_`%>$#S zObeqAbC94)Kc3}I@296G{kPWze_m^ObV8C6D?{}DqAhT$9hCRFNph^oEaeRdq<2(N zv?f3-L3N5lnNN-u_y3~tKe^-CX@9zWSaU0c@ug#MZL59y)qLs-#^7QzE%bKwmB*US zm({0k5`|LQTh!I4?(xuIMBEKWp-Irbg0t|)oY{l=;R}V(2mhTSW(<<~3(BB5v5I|; z?+a;*gLBJNKKN|Jlr9=c-OlBSt?ns8_2|%SQzA<&$86 zEZ2ZURCNj#1bTh3^HJ4~L;r&S00XDOD^rAQ_OMk(yMerkBDT@agYOaZ_7Zlv5iVkw z?qvKYy{61}WdXHkid;`h;~Fk)^kqI+Ds!TyqFH0&#Q^=2f8DPNFRRcg8w8^e2TJ8u zRL)x3-A#5kWD;>D&|=lgY%*e4kwSXPg{l!mXL^y24KIR;Qwiwq5E1fNP+d9p5{X$Z zRzQY9D@!v;Q%ifHe0CMlarZ$JW34x)@&hHG=m5)>*L7`^yj-OTyc#r(yVl4;S)efX zzv%nFO}Glf@geiG_ro#2oU#Tf$GQM}9wh;R=KcmGK|=?o1Yc*{}f7)uph9 ztW{fs`Emjmg3a@DuQ&%`pm&Myc_{lTaTCwaB;ND@3LB^u+@0t`vY~ zcA~wKX9Qx1iYDIJ_{Mg@h=g`6?zBc!xyX}W1{d~Resfam}*o-Lmq%0N{DS(U(t z4aF~ifx>fG(<A50{LLQ%(&4qAD>!v{Ujx_8}jOx>Kcz3lSPVxTgk0}*=_SzB=1I|M#K88 z8M){F9q3itutvsKc?!G2*)oo<(@jh(Z2!4UZlbM*l?=LFa*337I=b9C^5TP+uLRxG z4&-9garn2V4^UQst_IkI65+!q^`EaC!?gmItDLchDwgcNFR=*eq2{f%%fSj2uVj;F z8Q7vXC%$qXPz~SjFuL1H{VIGCw0pYSn?#DD&msx6V~Jv?tJSPlmrRsU)4TkVF%w6x z*}GFtsG)!y7@!8n{knU(Y*}A~APv{Lj&89VO`Pto}@OwOV1iIlF8GJ21Z%ji%4V zvoN<&3L%kwcqieVlOobQ3w8OKJLN5up;?sRnZZ-`RTKHX4*Ip9PExu`#EZssM8wAz z*Iw#px!Z$((@Ansa2ZF5=|LVYF|{;^ zD#y4|b)(mUCO3$covlB%6qb^aU7mVTlue|Q!s9$h^Mi5eoLwO(e!4l}KLy_%X*On& zV`(;&B4IQXPLFLKrJJRkrx(_EhvU!iH3JyqKDw|vE1aD)f}pz=Ix0lOiZuRmCp=MT zP-BP;=BH8-t^3n!fuDSMz6%DbyLzlQ^W0IhSLM3~@m ztN0qa+{LmUqerw$-v-8cB$QAh88LDOd6Bn{_z8*ijQhOjcMFsnmce$(qWhqel2m19L z5m~ERqy_>6P5v06ZR+^(ojUn%?-`qX@{(wrmDt$9)=Ch2;gX%Wv+QdJNcRVSokP33 zPY0FB5OTg(uVTDI3?b?c!t_`T=509dDf?a(1s@n@t;mE5Fyz;le%@#4og#Vb#yph8FoUp0Xq6{QYtvnN$t zKhn6Y3X_h#rh8h|w#TNy-xPhtXL>#O0K&OzbKdr|d@$KNqZx;EzrRrsveBVF&8%Z# zef&sGluE^sjK$WXsYObj@3c?xG2VSjhSY=Dtk}k)Cekh@2Q_m4Sg2vN^7iQAcY(!U zv=x#?etN#|;=g|n=au5Kl2-dM*16Vh;*uMhrKCbkq4-sALr-zhXyw~_rx#i>E*;h4 zPh7>fkkjqKkYxaKBvkxG`)20o5w0F|9dbZuV_NcFD(-4nLgUHMw$gLT%(fD;1a5II zzI1tv07z-jLPMqdZ*gYGZjSy9-oyRBt9X1!btTL1UG_W^v>B>mNmmf^+%|`I(qPc; zeumXM+&)Iw#pxnKZh1VwHv>Uea(1gl)x?*4uUxHWBCGL$+on0wkQ8*`2IB9yqszQb zcg*8yG57aX-4h@rcuFERuzaOdn4#sAsB!R6+-Xi7|2?kR-a;LXKIH=ay-#?R=+n3b z>T7uX-S?c0$(Kn50U8gLHTfnp9YThFFhML+&U!!Pwn;d|yzO4+=3khjDx7RsWH zO)TygJ+r4h^av3x(b$Ad_?yygqiGv`m8gx>2$HT35zFL5#&%6YE@C^yzh^O1D9bwB ziCuF}&)i5ZIZSP#IDYl+j}y-o2DvIWbbOucfqvyAQp^=Ge)!FP84ceFTy_nZxyDe3 zSlZt;J0NK8I{LU1*Vcw$1eIqh!)X9A}-Tz_o?UXO&3D z8u1$|!0rOQJyJUIf$_=pU$o3ptoh}mc&dnVLArkTjscFn1#H`rJXqe2W8UU9tr^(u&dYu~x|pW@42c zzbfo0lD#LO?(v@mxtmDK&6rOa&6i%GH`>U*XcWaN @l%?p%kADHe8cUSNoKv6kV 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 F_+Rh%j@JMH diff --git a/projects/mtg/bin/Res/themes/Gemstones/backdrop_black.jpg b/projects/mtg/bin/Res/themes/Gemstones/backdrop_black.jpg index 35d77fa27b6213ca95e1e23ff6dc60f01e68fead..b3c01c72e17eacc21deb16fa8cca84628184ed42 100644 GIT binary patch delta 32831 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 delta 30258 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 diff --git a/projects/mtg/bin/Res/themes/Gemstones/backdrop_blue.jpg b/projects/mtg/bin/Res/themes/Gemstones/backdrop_blue.jpg index 4ca776b0de38733b813d5b52915ea98b902b95b3..a8e129f0c706f62f2d1e6612888d42320054e7d2 100644 GIT binary patch delta 63935 zcmeFYXIKh z2_i{F5q9tn|L1z&cdy<3u-~3;x~uA>I(6!FQ$MQND#QK0feT#CUwvdE)d)ekfIxbB zAU+TXL)T&-&=sbR{ilA-E5O44n~sg4Q~zDZC}Pq5UB^gaF@f-| z?O?7lEardfwOBlV%K+EPq9Dv2#D=+=vBdt=X)*Q5coYa1Q(i0YU$0Y3h2KE7ZzV@WWNIm+AFC)l4CBqky%AuB2(D=G>W6_*v4k`)ob zm;>RagFpn=C9a5=m}o{n1RIMoV~1VK`+uCo3i{VcjCa^r|M-Fxj*b0Kogwbp80OH% zT-Sd7DX-?URHaR^K+kif@kp~Au&S`EpOauaU;!^zpFa+g-*h68Y{vgt`}MNzw}e$+ zbGrASoMwgx=OJF`QGL4d>C!+acJhd5vUKCKsRV4|^y9(rukc=ONAFBGrq!i3U1+|D z(AAh3c%^ib#Z&{mY`o7}vNy<{ccVa#ofdw&Ao#IC?jpP98NKVI56!98rrP{v+uAe# z*QcC--krR|X2)+Bh*nh` zJj?kKqOdx@#Uv)G6?(RCWE3Pc0l6@s*#2Aqv`#+jY_nNU?Z} z0u-}u9UZV|QtJAxD@bZ36U_)a{k#H2b-&;1&gxWH>IjB~+fRS+FMqvb9za?lt2h+_Km1m` zaSXOS^XIMi`OLr_aFqR4vR-=5q{k_I?O}zX^SH`4FIY_d?7Iz z)Jz%ptr;b{_BhUqT+pXuirIQ_IUhwPYA={s^b1#6VKzd5=D;ITseR!hp?P}Jwj%|M zh2x?1`;31=Rwj7}=T$ojTG{zg2%I41;AU%Vv5sS9aAsXz4SnwM+KEV!jQ#Xp<%dXH zo9`A2DM~N6_N0P24LaOy7J+5fmK1!9sQ?zaCbpqRPPYKA&Pzf(yA=0Bycp>S{fOe9 zYpAY*5BH+lw+XSvJh3VlR{%W0mWMFP*@m5MPf7wW$&$MWmJRO+8uBlXmkgh|;rLOB zbJ;c4dbSkTd%&@lG+!+&mdrj6^&W^E<|uJ$a~{2*@xlt90wt^!1No7M3L~8-9bdjR z;TNi7ozt09hbQ2gsy}NVZc`JcrWs=RS*QmY$Nks3W}L^yg5 zD!uN`D173^Oi2?f&7u_LZTKg=F>Xqk`bU0Khk97x#X<9y5*R)(_lxf>xUp-X)Uf{w zRR78J`5t^62yU^g@bwt`W#G_17=`OrVs!|9vKhR20UTBV2`+;YW!QH@sd&!GmeLwP z(*7Yw7c;iS?*!+TojZ-o_|>Dsp8LFP9rSj}tZ1ep$iUf<^}YhhXm;*b%EVBAO9!*F z?-h6U+84k-@$5&9Yo_i$yufPn^b!nBr zJ9g>}`=(237S_!kqFqDPvqbI3ldua8XC(d;dB7c`Ix91icaK8;KzUnKuA8G2a@aLidhUY`d=1oMA)>`p#o*^z%u z#l&IM*RfQJfT^L21=+7AH(0H4CDjVHCF(fGVvBXx-65OO_nsIZs|j>1t!;kql!Lgbk_`@{JHC)d`LxyscldN?`V zQX|QgL)?P5WwFljEN0gOrqR!wr@yPLjrG<8{7c4#kN|e5tPq~7``h>krKI{>l-wyQ zMie+94pI6AVPzIJD;o$V_zzIrN3hrc_*V!n)<)0qrIFk-NGtW~rZnm|(wK3~qyGnk zqCFjlgD`k+&f_G8K6kO9@pqHfN4jpfyPSe(xvghtdzY)p%`5{@5Tft10^4j=0iQ}4K!?`?kBRv}oUtTUXrn%d&^ z&(}_YO|`wQnzuQIZKz$&?K8)uAbh>R+peU9c1$w5HaiHS>SGzDS)1(i6M-4uS zdl6`fSo@+M-CqUTYIPn<{X}QnG_FQ^BBv~0X#o-hvvLB3c|*Pd$A>S%+u=wor$`-tRIBw)3N{zTwjKa; zHw6!}QyQ>Tc(9OuWh;pnI_f6Fxr+013*Y)yv<&V4zbCvGA=! zu*c;arCaHWyyh35Urk?3 z@&33(a)OnrF@JO;x9|;1JigqRuN>9osl3lNAQycuS0eY~lIKaf_XJa6b0#!Jzd$?4 zTqvV2XC|!yI7*7QvtY@MN!9Sl1Gi*OluQ zh{P9-@(wTv4DbyMz%;Ly<{*TBfU%>GkLMo=xOV^&=^f~G&A6^#mujA9F91_g{82VW zg-#K@3F=!_mN$ z#vlWbJ_roD1rh~`VR&E+1qnifP?)>_wcWovM4)|qTmWNaK%lRIqq`G^PKwb+gM2Wj z%imf7pg@rCA01-fYw40LuH1O$?vtkF=VerS4zxl)JWp zEr_}OPt2&VhYkE4Gy~rNl#lnddpE8{)qDfI{|N&oPLAk*8%D1FdjB@m(B5kQ)9?=X zpT;dmPyc^8`mO;%|28zdJk|egzya@o|FNy=! zPoSf+&)RkK&!L6({@-Y-p8va?D%#n^)H^_v)5!BWKmI*b0Z(V}|A}Gb?-}rijtKEo zHUecu{G~!1gmen5gKi;R{xb8w^lO5_bAQYO z{|m#|$@4D;0_~)1d2Qm)LFt6{@ilitVkQ`q=O}O2eVA_F;s z96(MW50LYp%=HD`#!x&lS&Pi_qqsr!_cUH>{z2T7S)_-y7e{t!5ap`|? z>3?zQe{t!5ap`|?>3?zQe{tzGF4g+~j!XY6IXN(kOc2Nvb78iKFmNsFJsUd)g3w?} zE;h+)@?T5UzgENqe^$mA$*Yg#MOl>Wf&k>O>lFlya#nztOX!K{`Klq^P}*T=q;Z(O ziBp(|lZ-P&Nf9g`A{*l6>xB$(0Ec*adi%?UC_o&p_k3hA^=q;)1pG%Nz(WD@*JhA~ z9s;c9gGPcSgv14%L@;|ll9EEAFbPRXQ2{V!M@URq1oOiyDJTk)m5`JblLG&JKrr2* zon2&&)HVO^4AWA8WDT+NV?z|PUU9I{LNLAkal`kY9VZN*lASh72trQw4-ez;A1VvQ ze^B)F{-RNPd0o5w$B2J`5%RhNN_Lj41}^G<#r*>`f&%`flT&L1A-w}Q|Iu=G!mzry z!8HF6F#Y|3DgJ+{0O)JX;*aU&Unga6AzdAuLg5G#HFcCL(jQ|SCMlw(DJCr=CaEed zA*rsSDk7sMBB~;)DxxAKBO)dBpW13Zo<3+jA7`WjMEpPLa5XgymUcmTVi^7y6bgoG zs7Z=4%1BBIiV2BcyXPybhDJIBATd}FBa@{BWkmi(##lqSg#Jao-lY>16%iB_HTknk z$1fs{*{J(l4l~8h7$EuoEcvG+AG8SuaVkJE(wS)g7|_#`RrhfU^uh!Xu8#2lms{52 z9|qjpKfuA;33<)HxGID~Im=4Rh^ncos7b5KNNQ?Gh>EI6sKV4_U}EBuVj2<}8q)vh z8eoEq@^8Wn_e)3wMD*ky?|8Mqf|8dI6&B5FCI#R-a#wUFJaQ-zQ;lD!m&seiKIA|Ea@_z&{PcLS~ z!vDTE6tg%4oU=p(O#gqmlz9xOp(S|wEdhs8kxkA0!C{NO6HVWt3tsixl3v^7P8&hby?ao58A_rm2bI>d zbJ8;H2PW9rtv`bbJ>;0>tiy?z2lE(ORc0}FGa_Ep5En@MIAK&XK z4ZzX1Cf))8-=o-M!&+E|oYk3=g3o3AS+;LBO6qiBuCR zU{=;Er4-zp_=WLyOr*;EKJPfq1Dsowh8DXq8Uq6>MzkDH=2AC0pjfSxRX#KOWf|&{ zh=eDPtg7DRW=scsULv5f&AO9s4QnHY{qXQ(Sbwd7|6B1fbw*hP_5B(T?X9XQns~0Q ziRvTn3}&X_-Arl~qWULKcMJidda`B%W}Y*;bW=DTh-yxlrOiIJySa()U0wi)whBwd zU0APkj!#^hi0e~Id$MYtqd=wvl&^?Vk4Ng6$|{YMbCU9Hw>*vJ$nYxA4MGFT7T*;T z*0)%4cQ%oHER*;bnb{5Tr-`wSaUz@~qU%K7I3;-@(=-R^5Sz~D3zWdDm5t#DxVi0z zS;fcYkiznAbTsFXI2Dn);Zij3g8}>$mfBl2cFqA;AkpX~cu`(oxrNQr8)%SU<+Gc3 z%8HwF4WkeudpAhQ)M-fyRMIamuPP8ryH1iZFzY!nR#%;zUUOsmFzbud9^cGJ?N8&z zFXyF`rpP)v8snM<9hd<@5`o%goTmmlb7xNdnxA_!UdzMfCkCBZviw}^P~Z65CAh=B zG2W(fRZ*dSZ9e^g=R;7s-;WzkI#g5aG{`j#1J*3x`+I~>7he%a4Z4E}Hqxm0dv7q4 zDZG3RGo$Rk%p++d=@&()HnP%34{{9{_EJ~XPOhnYd2;YX;OcV&VVC0spQ00TJ`yD_ zD&{*e!Tkuc2jbwBc=S&cm4l9kS2ZPOz?mZ-z6k4iIvRf41cBUtWoed=BBZ|VMhrE9 zpg-##%Od;5G+b`BxM^oX>DC#D8;V#ef#+1>Gx)qYaXICCl-4k`iWH#-t$Q(o8u0Xl ze;dVLrDvIX)chMzoFVcE8B6B}8)5sAN--P7jN5N;JS5cha+vzmZr|E^RK!l@HQzNE zGuzBAkiZ4S^YG9Oy>)!EfQ6{+lq#wcX{_9X@Z?R*u)AT63PVx9<$5eyhI=8e0awJ1 ztGJsk*&oBT(vrPzS_etAB_Xs#ae|F%jP*BuJPtWrE?@#oe#SNvlg@t4O(3ieXVWZn zz>{Q85wWyVgX0zBSc#Y)%KA)23CYlwAAPe``}=xN1G!#STKCq`O^PPu@# zPUBt3i~$|zy{^rV=~0QwH?GF>&xxSZFfy!XTn=7dNERX8^vB^dsCI4;X zy%r_0p`8Pq8mKatQe9r!RkTWl?XP`xpXDsR@5P6KHA~VnUWry_Vq9#cVg>vC2m0lY z0Q>qa{9h9TmK{i^0J>${`A-Gt9t`1}@NMshRM(rrobBDRm@7XOo^*`_9>|P3r;`Zsz5I^1iqkpIp{5Dk*J`-Yi!_s9>D2k zlquhyDo&WKMK_F?YV9}vWv;MsGoc^f#Bo1MwJu>n6m)sOkDqPp< z(TrbO$+=Y0AF!-^Ps_H2V_;`XVGc#|;(08dk5t-)hXU~jZd6q9s z2~Bz8ngxrCH^k98B9VAGsBSne)7s4iEI50eYtSfEfL8V6d;@FjjRv}Na-f6S*w$EA z*Pb);LhR=hvHCuqspbk$ar=R`5oMb>m8B&t`g@@zt{fBg?@Ih>f|n#D+GGk)q;X)T;b|s+ zS=lYO*q`Y|vo8|melyZm_X8Qr#SgZ0G*rfhG^`&k;I|C>uEK0ZtrM)?U4b4H9!Zrm z?NU|th(fBTp9a^1=OiHKvOmwrABrz1J9i32$caLwIIP$y@eE>pi^U8DpVs9)d&*>& zld1Yft$kz4$#{;mm6#6lBHe(S{>&ZZpiCQ*#&#(~DdnsKu`XpaaRo#LfR+9fjiMdx zr>NNuh>r`8Zr3b#qK5XT4O7l_CHkHNyP2ON7DR@w#^7znICxel7W8Njdpb&zfh_yj zJRm@22i6FQ?7^!s$)lG$T$2}>LsNJ4Yn_e55{Gc(BWfCTu&3+r^v`-@8B2|DxG1ZL zdy8VrS3C^nlH)#{0fbtjecs9(`8gpSb-GLsykDi_sAYzBQs`-CWzxg!yv9MOuc;Lk zx0K7MbNdLxjX3xr2-q?250fm-8i4dARrjb(iYIkdj@?SZgk=;BIIEO$$=llBaO4q@ z&M26dMzHrqWMzb(nUMxxH3&E5J8Xz`l#3xkD`QdBFl3q>c$%=})TZ}!1~Og|kyD^H zI%B#{zSRPynxD@4>{V?uIDQjctfTB!sN(Q*dT@;jLU5D#m_`sH9`yyvgczRrY%y46`7<& zn$&7UD36%{RdqqjlX3Z2NkwBGu*{08U3G0xjUV)f$))sU^Z0S~5gX=r71c;Jnbi4u ztvMp4Zm1IHd*uw~W$ypo**(iGfa+xtm;6iEdd)96K_Z3kGE6Hu`&Xc=3D|Mk#irKg zyR=d_dfoHr604gJ-4X>8^Bmz;lS)ZSY~>wkLhq*mMjxEpcSH+7_f$XJSGxGLy%|Gq zm(3PFvE6Pzlj7`~QNPKGuzR0#T&3d0F2dAu|&)LxfK?`u6rCOfL z4`%CP6|nADKRX{X7~vJ%NC>yzHLA>5w1>J6O^UcW-V@WX?wMM;31jT}sdMRg~#g(nZLK$$o9UjUD+J+~96S6+s3sp7=QDP| z_Q4IxZeH6YIzMgv-4>s!cuZ=IN9N;)N~LW9B~E&5=ZnD!t{2!DBfxw9S$*XbzKL|H zgRBQx3SQI*G1c?N(ZcJD2n}y7JZ^@W-pHiS{h4_TJ-Y%0PM?kW7f;i?&}$8uA4CkS zVZ6(@$nq!?4|mvg{4kBz96y~|8_aSa=IR|^Zx&z`yRrd8=20^8hIAkH_BgTB4W z{b{q2jm*~BEE&8go&0|Eb?6Gj?XHw-8Scs+_Urxm$l>s8Qyd8}_Cylw&f5PRt%03X zMEC~Is!vli4Tv;e3@B|2$6un;j#XVI%R4V#PcrGrKS%_uf`7S_F%+etu@*b17CI9F zEQ771v~@S&oprde9@qD(^TemtmepzcZ0H999^KO8GuvnGLr53TiP=?e&8s2De+fG`sQ8sUHd5!eoD4qRo%Z=qzE+6nBZ_0Yn7bBK*+DvfMmdY7 zwfw02_e8Tg$lEa!{OIDr%V}6wx7s@^d2?A4U9#qeZ%%emr^Y(re^TUKE9{p^Y;&@0Zn0^C6(6{_dd9m;ctYb8+Lbp63@^Lds1fKIbEaL(GP=&?>J9s!#x<~dl@h<7t?SRYx$QCx9si<&zek4p>V{Tll7E>c$&e8J9Ak3zqPcV zOiEb1H*9)Pfr*00xgeCP4|N`2He{Hyk)&iAl`t<%y(Wx+e_Oiy_*6D>1P@4jY>K2VP1^}t#Tq%$DbmRmlx+f8fjB>i0g1Hp*HYuJws`=~ z{ST9vFXT^dYqV!`OQi-qQIKJ(RpUvFF)cmRs!XS%g!M8urVOu;p)l@;p5r)Ge2_@n z3QA})fQ9G51)5LO1BjiLsw6(YG?5cGH0`l`VkY-9eHbGgf6hr$TXABpTp&^A+cSBq zj7t$rn2a#l51aB#z9VO7-BY&bcbcx5c0PJI6tDZNF5K%ph>#6{GYXbw`oB*vISEe7 zP~iV=%ym&%cpl6CC_W_M)yczG8IlwC!skwc)w?^|u%$~h(LwWmH>n1l8Wlvy-%qoz z@m{}>F#KX&>N#esPZ zT!FxruBo@jx~b&=xc#a3CcK{BC}X@D%|9g0elVOmHtoO0b1|#1r|qMNc`!t$K)qh*xf z$n(edc3IzFd|KVK-jjSted)eKAz-*XFj+H_2+E4SE0K)e)hW1K;3#?r#1!pud?>I2 z-rdG{AhR?m!=Bek_F^hyckD!a8~x%*4H=K>X+6!t`M?F9W+^+r&FV>R;Yk|FT^FT% zS&9n2p8yJ5kIPbnP)wmAw}c$na}E?TOO1;HzzRABPSv{u2t-X-0_X zqI%}71Z2A3X8)iLuY6|!Bj>_-dw6DKWy%R0^Bd`L(M3$W!IUHLmJH`JePi`ovF0eV z>WS(QY%DO7Gjd@8FATFLQaHStJl8-~3<|s~0aB7q>?o^BXDc%z^x zAmwWr%Of4Ff4h%Q`g2}Lowzj*c1@V4m9li4(sO0PrSkJzjW|axM1%#Rnyj(SXdT)j zEjtzdal^Jsx-rXj(Ebp1Xm+P9mk?Peo@hL6<_nZj5Z)_WKL*C5N!J@W-kf%NgwAVl zI^c)0-Bab|?_*hMVJwUC_V;b+oOnuPD><@q@U)z!&OW_lBHai3z|eC%jlIhZ@tKlV zzs#P*Ic>ht%EZ^}D4EhoA}4h6_O!G}%Fu+Z>l?`&42RTmdIv}|K8;a6CQLwPx$_#d zN*)-naL4W7_UCnJ2xY%6)-4NpeLGb!9S=#&RcR58NmFhu$Vf+q6Os6 zR+Nc^O$&FOOi#0~_sJX4kKF!mZ>p6(9Q}r(eVxI{MFgTmL<8Ny z^;=!eca^xrd2#c!BvXud#^DyfRW(oLXyyiQiexSfRKrw1YXBD5XQs;!Y+KE691d2Y zzSM&82{a6+7LfMe?~dw#7duSZ-fCxLUk6!PbB`ctIUA8Ix*~Dnn#z%n!om8zUFNOx zqjY57yzo53kd>kp#jmRo#|tmhWr4uuP4zIN%x8-E$k3r1hJx+2P7y3QTB^#6Pnt}y zRp5oXNz&a^tV}JMoa+L-hPSaPzJ0QeDv-0r&qA@7Q%H2=bjC6lltdgf)I->`vr|W{ z^%^K^I^~1G1SzC1@2O)N*r1|Vv^j_#V)FBvbhBm)pKfz+Yg zfEv_|?~}N(2K^w8h0byER|cNxgRMKe>&plJ@4mj`VO5wb1sUMmk*^igdO zQMIQUNjHFvfx=dG)pRbeCDhP6S9KJpCf0lntw1n|5f2fo*wCQY10=g-KHaN+2lUJb zsWfz#AF<@oY99reD0Q==8{lh;&c(}=NKrd9YFRe#HfYsWrswAJd>|Ch{2r`Pq_sLd zf5dFwwvj2F`y*j>Lcf2IMLtHIp4?p-hL^aje6RI&Ul$FZnqrdITs*=0>J7*=!M$M| zfHVz{03!a<%_9Yr>yTZe86*}@OG+_suX(!oME0YoGS5coeG=`>c7V(5RA79dM|^xL z5z3SrGahNv1Ts4aC29$n^iqQ`=4`tlXsaq$AF^%uH{xz-5enL%znFB6Z-j7VsBF#{ z82FB;(X{^pPrjTN+rXtI%|<~ys2K%0DLHFXkGeSM@N)>zigxGP5ww!7+nw&P9i!y| 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 F|JhXFKNJ7} literal 70246 zcmeFZcT`l%vN*hFhMcoxhMXkloWmeFi>Sab@Cp z0Pg@3c%dQUCol~NC&st}I6rxd!RHWofi)gW{qaCeCQwYA#?e#KVabKgc1PoAh4gb zc)zv-!unS`AUwae1GLFceIdfoKV=hd{FL`M-H-m6E!P2(lQvz{FaRJ&8vxl!4sZ+y zB|wg*fhd54fPjFIfP|2cgp!zun39&9goK=yo|>ALnwp-HOiD&d zK}JSFLq{iUnrY^aTF;6w(x*l&7Es&w zquNLP7I(CH(~GawXLO7$eY(@|{N?hlrIUYjW=Uh`_{wJ)9V_R6m>Z=Jx+Ye?Py$dW zs4dQkPWX7ZQYR{~i&5c#8eHO_#udMsN^`8iQ`6xs2`-0ubOctzj27uD`H>s%SOI(< zsb?dg5=EyRwJfADsD(dO_}3cn{-wgvD}V%cQYR�<7qaU#x;uJFhcICowWzRBC(5 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 VGlN<^D0}U&_sUIf<$`)Y|Jiy+{Q3X@ diff --git a/projects/mtg/bin/Res/themes/Gemstones/backdrop_green.jpg b/projects/mtg/bin/Res/themes/Gemstones/backdrop_green.jpg index f4ae6edca48da5bdf04eaae517334c297c5126e1..663901da472cd8a08a3d06e0456abf0880f827c8 100644 GIT binary patch literal 52328 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 literal 36794 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 F|JklZz6JmQ diff --git a/projects/mtg/bin/Res/themes/Gemstones/backdrop_red.jpg b/projects/mtg/bin/Res/themes/Gemstones/backdrop_red.jpg index f79bd5bc91a428430ea65b639facd9b8d6cb83fe..52d3d66c313172789c31dc6eb8be99f82879615c 100644 GIT binary patch delta 47652 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 NM!JhzD>Rye|Jm3E8!7+* delta 45304 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 Z<7MUTSp0XGW|!{ z5ylNz+J zste9|Eu3>~D2` zzrUE{1|;KiIu)1QwD?(kScm%1`Q6}YD9OCyR;C~Y+(7Ss<;h82YnpXT&d;jrp>qU% zjC>BjmzQam%tc>qP(>(I0^d74olmzu01dP!rcwQR9Ri()qi5q!pOKn&B@9NFRr3sf znUOmGAoAt@!DvEs!%gBZie0?CW%Ycr*{F}X8b;hl&qiJJo8|E1wN!30`*P$ze~F|B zdV)F7ezKqj_B?OgSEj!u$1e6Qg+TUdZ0Zc@HPC#%d|Vd0`2F(*YI)Z{NsV1D>Vp*6 z|HdeZP7G;1{N4F->w_AD`(G_4^Z=!{uDa2 zjil-g@#glj89%uh(h4=3zg+U94sdIpGqy+YM5ofCan$K)qMp6~Bl&R<3tLk( z=~A0UzsM)ynP4Dc-g_?eOriuxNo%5IoxJjpHaW^oosC_EIIMVVRso#HXY%vjbKVs< z>d)KEWnyok;cJVxTJ0pAf8+~f;l(UId`i{Ep-7wKM>2Gn3{{Z|+Om7Vd@I~F_*J0p z^?Q30$s?0lDC;(~5HWZBr3$AL^SWZTx9SwfgT%L&q<26E?UZk=6B!4*w5|YG9~S*? zWqCho2>f*g$d8>FcxP|~aCetD{z2m3{eZ@0Sw}g?!(|Zjnu;g?I49bhC$h^c8QDcz z;OtyR9zuLA1@?UYd1`oG)A7#-vmdqCXfY6yYcdZA-=L&QCH6=W(JK#B?9e<^wQqfF zqO`8#VXR)M$bN`m8>DUx38alwcrZmU{oGzB;IqS9g`;^jo(v`)-lR+`Ocq>b z>+@q{VcQu*dU`3}prYIDbulYa0NGZeUD!wKx~O-qQi*ePvR4xePc*PsfQTzV!Q~Wa z!s7Df-W3YqIQd*BB%2=Zb9Rp1sl}U%vVL&?>zYrOQ-$lkJgN5CqgyGt(L|6Vo|cQ8J)b((3H9NUWmge$eE*>H5H*h`eg4FTbWq_K2fqT0W( z)|uni@~P~ufkJdlCIVWV9^Vttc=U(QebkO9s`!sU?gd?C)LQz&k#sqmf7SVM2P~~B1xeX+_p1+hnIZizPe!+5_7c2P)^;cu= zv}130KB2Xvo!xv9!m z&NAm18-lI?zoL`WYrFpN&{1J2kNFN*kW~zPcLjJ`YUF$|{xj!1dap2vl*NQ-P5eDvn#;tE5xm2oDuNY$h-dTk`x#{Tlg8Ag>ax zk?>z}{`cz&mv2^ZZ(@KI00FQDI00+`9spN>TT%@r*Y89!LmBb=WlnX8d)1p$2Lpk? zq$Qf`(p7&tBmd2WC2GcW|05QApe^|{y&gG z{z?&SxHt^}=;Cf%F#o{73A~nc!oZot!pMlnAe@xP%$#J%NQ2`3-rmX0>R=n?_sO!uc2q{?_@1*!!0XAD&;HT>*D5O>xE$Tb#Z>|Dd8*4jrhHDk-(LI zgYR&&{z36_lIAv2*JAZ@b#-=f@M6WKFF_$O0am03!o~K9tA`US?6xR3j-iJQQbI>j znfzb;a8+sUBx)vpavY;SJvbQQ0C~)`WDZ7mV7H-na73g@(oD=?Zf|b~8wqQ1E4Yx5 zwXmSIh%Gcpn&mn*H!17CNNsVOxxa`}zl(p9v$9J4u1YAlI=g!4x*@D>WnfZw{xb;2 z`u8(De#i0Mf{?9G{CyDXDNrdi*i2Rf0A5EmJQg?pqK+)FI z+QY%k>vs?T&jY0T_W<4gXbYztR$K`;Josgs=K`Js!;pULw_(dz2B`RL)`V{4=A z;p)Qrdw#khJUngn{M>A%xqn;P+r!%Sk6l=${&XSX@YvG}@z~l{MNuY+pM{rK>dt?G z<23O%wvDT`H!hxd{l>Ouk&yix`ycS%di!n4|5KK~UEw$MA3V}-O5l3@7xus5|8obV z{I_y!tZ|xo%*?9ym;c#VOCVi6To7I|4lW2g+dGbKwsul?{tf-_`}!-m;Q~A^)Zh7! z=SzlbbakBMdwSA1sv`@I}S9nM%1OZpT6%ddHfJXxa(EzV{ z0sXig9tgMh0{-4-{rSNszylEi0YtC<2ok<#}Ej@!^Z~^;C_g3N0&f68UPyzcI}=vJ3hi4Oc0tVlvgXyLD)U6 zLrb^!Y2OO&@j>AhXV{DUI(jbA9$il_k!!zs;QtopZ%JS@)Iby)tDKgl+dXIqLObzl z9zc$3$D;w!;BYSAo^Kl!Sx8Lp6vuWie7(J3Svgor3a7GZ!q`r$3p127>Y5ZbI$J1s zV-s3M%E<8O5X#W5yD(3q0r6isGR2rMZzCz^JWv}`?TrVNN^(AgM%m@j{w1b_RZk#c zX%#G74Eq2S`TH#AII6M0@2*kGnico;99@+^FN;6JR(^!iX#zch-L0j7TTJ`lz=AHH*z57rx zWB2q!IH#+nIJLMF;`s-r(|h|tDIE1w0f@N;(HF=#lqCL)s$SCJXTIU*vDA15(GDrB zQ48)}@s2K}x0=ej8U{hEbG z1K6BAjA;Yij+&V$-Ol={4z6JLe4txVI`?RaxDZ8ia9H&19N9V#SxR3g!u!RoD?)A@ zX=QN6CqSoT&{k0z3dwskJ0+yVQy>h1`(a=TwxA2cb+OOoj!*Y^QrAR>`yWqDzqV>) z5Z*g~4=!xMnjU^`rt>1~aJb!=^XP4zWU>F??YU&<)0AyJ5C2a}RzqovAU^D`2uis1 zx&?}%%9{Ft)z`NJ4;l2^b>(W4OVl2|wt1CCTSZOCmsE2@S0k~?K>y&?xbKTvX)Eo(zZqWBKsO(LsC=D%+(gS19l&L9U!pQ&f=r1S zzw@ag25J82pdjT%ZuCc&)naXzccNNGW9!j;D4)3qZ@G|P8SI>PO1k4FtMci9%Rs*o znW$6pIYIDq)k%kB*QRofXD`AP>oe{sXFuUgn|q2S?6#eZPsvdn`ubq$PM|H|R`m!Z zH!VEnS)6O!t(qx!;3pY=gpn=vr;v_GI+>w2EuRh8Tg>WqtN0jbic1)kpCUmIKCfIX z44?+@OU}ft`;h$b5a(>6IVH3`ACZ-Q95X(AID#FXdw0aye!FRK3gMljcqnc4L`Q(E znhr~Th(!AqJrGE)JG4J-5~Ycp_hmXSw(&NVTi5ZHPLPM#NI0AY&SN0cFTlxtLAiS z=|_hBgrTRdl*)RMgQ-qY&(ogVr<~T4Z==&lEujzhjuq;N8h_0oP1Nzr@TdwD+hQKm zUCWBFvv+I9zt@CUBO#_o%nzpUThvVMi;oVR*T45EkBsH|liRKQ_jr+>o>-q-$#%C; zoQPrj5kAA$W@EO7agbs^yH#x~gGWDQoY}R!304;?=ZJ{Kx*amLi>PNz4t$w=^aBTH zSZ@T7NR%UMC*bnkiS=xusT}NIzs`E?C7A1iv-{R`W&GlUu6c?~6vNwG^Rm1WvG7)Y zhb$6;TJAg+ zc{ilI&K{V#Sb1Nj`F5!K14E_B!D;29q5R%FaQ$;vdYuMLL2(tYE!Uf^uW1Wg^i?#@ zC(h^gDgLZC9EN^G30*4<<#kw2i9}%{9t@su-6N*${_z1DYpUZgmr%}8J=CJ9(ClaT zwVL$8sdG|kX;j}&_^2H*O^)PCZtg*NqJy9oeCB0LVy034~A5# zGULMtTucjZfU0I+1~(?P^i*&v!HW$|a(mm#l-|A@8WuxZ+03^sLqYtVDmd@o?0j0kM^SohTkW@o*o&h zBIZC!RXk4WtbSlsq{}w(_1NbI7pId(>h^Te<9B>+uLjiSpPNKiqNk9>L3i;#HObRG zh{@(V)0FoFB#R~L^t8M!6b-TvKrt90)zrL)CxuIUXYDfePCSGagX4~+nXdqkH*+w$Z*KQLUhB>_B@!t}C!-t6M4#}>2^fT{yO*%dP@1>>I$iCE`!sFSrjb?o z(p`R<(c4ue@KY|Oj#@E3=%s?~gn<6B+4%K3fqZeZVh6<#Wo6zhDmigsMikR`n3;{f znyRxc;5I48VNUb-K}PON%8Zv^h106u=T-{uzHQiB`$^*Z-hKlh@0l`BK|YLlNXEq> z%0-tW`+(+a^^G=-#|OV8x!+GOWYk#~Ds7H7-X1B?=V*C)%Rm8&wONS}0dtKBJ8+3G z)`||NeHaQcx&gR`9OAK=jl72P#8mL*+vNbYR%&LY3l1);7Pxjds+)YjUbN<(Tg$RX zu5Ei7whB-mu4>14-jL`&N|7_k_|T_XtCwlyE%|xdVQ3D;Qua|Jz4a{2JXzJb^ed2; zT_>8$h2#^62RPi=ZA4>cn9Nwfove1|JiLi-+ZSS+TgpMc1*oa4D6c>neQ^~{Xue#& z=~}lsZ=qV(SRm^5>vIp*V9_ywpMJe`|EK4iSY4qH$?$veS%H)MBGck2&JYt*LjLq! z@wWESMLQNp4fD+(KY>i^cH23otP02uZz(4`4|eeYZRMU}Hkc z`(VQg%f{vPxq*qxx=LPsktNZp_1j%pmFI0AgLC~Pdq3}zy)0nO62Ixhb6;KZu83px zCti^^b(xqZV;XSE)N1!_Hs^pHNsV&SuXsq-PjFtV%lcofhQemc&8QX23&F$3rw7GT zCLR92x_dN?Z+1#)-lbw*$Y{^%-|%JcL;ezfpR5`?_)v>4QD?4U&4kM_=^FTMg(njMg05z$(#@~W)TJL-N z>5#hWK2tE#isWiDXO40v8(|R|cC5>r8mygR3e4}*XF$nsm?8U23+wTJ!S8&{@%(g6 zf7~=zCOf@N!oINz^|i{d(F^$*GnB`-+q(1kF{OKgwAWMWngW@J&MSn; zcd4n{a5QWS?_Ohu7j|Ek`!D0aZn&9BxkPJG9iJZKMD{q*1?59wy1=;UGq~fN>Kvwj65pzSae&(XeN}_&viBfQSXfFAN$%{qvnA9)#%e>kEDcoG; z8ZU%}_{Gz?lfzyLt<@h6+1q~|buL@B;_22R_b@cz?|hxTv60-wutVpswAr$B!_s?E z!Yg!Yg72`ag$^~P!-<~t69{%(PEHy%Ian6U8X?^n_EVAC)#O+jniA7@=KcD4Gr}0M zPrPOL=q8y7-Aa~_sr(b8rfM$qlwy?oyWF1M0u#YUutA;*KGRv5y0xv@LFer+Uiu}p zcaNVgpMT6(8YXZdGfml|Dk-wN|1db_^unzuNq+#@_|pqTZ*Z%bfjfR_6q$0qe>dxq zr<3@zmOCTnFMd4?ejJU^+e#aIPf8CQioloJeosK_O%M6N_BCTcNFXh6L7bbONG3i9 z6ltfO?QCY?BR0cl!NV%A*o)UWqgid#pX@=Th7?oeQ8qxhl-;*l}$!vsvYL`oZ67cI2+ zxhrQm#0{|`pVhE*j%2@f^~+{T>00PYQ@2b5SWA=?W4Ui(%HE@-a{388*_aC!W0!O8 zJeP~h&Om`BXg~FvF$@UG>Et!tS}C4}GwO%DZ(5&uQRJcjcr8m;YZ^hmJ(r55xvxKg zh0rP%fevNI&a;Y0m3@nnziJSs;(yU#pAGvg;%BHDz+a*w+-!dGvu$VBmhT#($AtHw zX(NY~_bDBZ8keKj!{j{shK(*sTk9yxGV63@9W|6*x=0mzHq)8FeTa5(&MF;mfTs2v z2X(_;x=04FZ3!_EZc|E(+ZY200AgRP*GWCps5hwOl>YD-krN7oeaUxow}#Rp4PY% zJvun~`K;Pk;wQ}^Byu~0{NP*Wc~H_$=*FDP+hd5iXT*k>xo6m00o-rqitkM_?m2?z zQdFQ{2BE7B8$dABdM%mIBQ2tYchDo+6M#w!??SLJ#1Xv($8u9+`t7KN36WrNBzSKu zQ+|RAEY5%-|3bIg+z$g;QNd|c!n^Ev2RSs%6_i}1a-k3tPaLBma3&E{c=$70$nePp zTZ9@k5Kjh%v1YlYrbJB@tFZUE2a(qG1sIxVPZG_J&c~0@J6(CC{Gb9NX9-5ZETM9N zglRN+@MJ=W5gON7ECpRL5&=)<5@x_aH9rum*+keu=miE+snO#FfiTR;Fd5$9G=9vZ zhbz^jdF70V8t`_U8b8%mF&K1j-3kdJ$+m<;g^5;#4WcLD(B|%EN4?bYmQb_-L8jdd z9+*@fTgl7dPMokxZO4pK0KgRW(RB?eGZ<=wj(aHL!8@6jsh-zjt8`DHatI8ZkokO- z{N5fGLQbs!go{UlKyonhee%;0U(NC$_;zHeV~%mAl&K!?4Q>!A!%^4sTYBiawp9WB zP)j3vw@kJNQ=`Q}u<{7*8N4p+ZEl7hcXk4JED21Abzjyv6oub)0tUwpbUj-GqcLDG zI-I0S1CGYfB;Ut#r(V4YCj)3-2VYo4#GotLp)qKf>@+?&B-6m%xZ9e&zf!>{lb+7F z51|j`8)0`h(o-Xez<}`ptazwOAc72vCBPWr4GXMd`MS!vX^4%kk*++rMjOFqq(jZ| zl(<*GIt`T&5pC6g^9`x{=sjV>&|K%??maboMK1cxTwg{cOYAuq4hM#e=)z&{R5@Wt zWU$mZ>Ao1lQP1_Tv=W z_foA$;p*ciNJ5-n*VT%RmNR~Oq(N=Sz+p(CT|Vq+H_2A1@Q7{%yp6MmSXavl3XgYx zkZ6CVjg(4MNVrkm2Dsp(HeF3gU{ce4fBaFzw*B7%wq|gu*X^ zO{Ir6vc)M*&(YeD!mV%(27{4~z*%k$uYlla4eNx+6E2q6H+GrB=Y+jfWEhj{aZEIn z2pLaw$tTT_U@3V{RC!cXY(L64mJ*gq&5Gj|_sH>6xrpc1FdsgzSidnEe+`Du1zf?X z;TgmCxFPquUExRJatLY+RYJVmN%Uu>eQ`Ov6GHNpd%%=R1$-ky!~;bVnO8k6nRX04 zI3t%cuH6#BnWCZ#*Fi!?rK`4ig3$>p`N}hX?ofVqkkzee!%= zQn!q_;9{Zsy=gr-&s8~kgA=K=znXE)kT}wch8)@ehKeF!D78S3NGRs%+PU4@P2w;s zx(GHJaz6HZAhm9i@WBsvLI~xN#Ijm!Dg#|c25y)L%LhF{ZiOPs+V-?ZZ{(cxrbNFVX(fH*BY>e4C!5@rQnQP@*dN#I`x z5uwRha${(bJbQ$!GzL7GcEt1qxQL>xNzy|DL&3xbZW_ZWeB-oW+X-rp1>7%^z@U|e z4RJL!wN?5b?`4hHHME4~g_zzz)VjiisrxRJ+0%0Pfj{bM@qXz?SXHixjc@?%Ah|tQ z0TKo^UOf5waK}#yj4e1P7P?<9O;Z;4=o9Jc-GtbFhY=)hR)wI+x%eT)5EC$*_8f@X zAOsS_?qQ+>NgmZ4DuuE>xaKyjy+YDYfC;r!(}3dULr*oq_iNSsFe*Ow>^7WZ#E zQK$Pq=-p2SLb!j);VYoyXliM@@j>9DaHM+-Ac7kV+(#QQt`+vPQTGHhS_$<;(xu+= ziqrGwm|)E8uK|U#ThS6S78r^_6t&6mK=cCI_`UjXdwW;eOEX!cZCy}w`H;d=vm zCA6y^5{D0h7TVIJO7w8ZvkgNpF(=&6N(9D0#BGK#k+IY+zs|Wk^Uw-C)H*L&>4M59z^W6+v;J zxIB{0xL5g6PwfjvRDmI>GS0#E?4}V9bZ~A;hSx_!&l5ur#2Z#4?&?wl^yw1u7nu4rxhb3>zyw)*z@g zh!|SdJuDtOo=wj#66py~%W(+nvBZ9P)MtgX_E)LS<3wbMrVVtAtDu2YymT>M2MXcFEKYL7Cx|^(n3NLYxuP=qqk@v9Wxw9=Qz-i?fEAh(iAT*L;KrG2)x{Ymc3`c5VdRZi zLqQmkU>F(k05p(>LD41xQS-(S7lyfWs;y}ZpWVgkF>J>l*)jfdSi@>lU-fK_#uHj zp)y2CXafc`Zq&z0*ime^dyZ>F8%hxCe2rk=IW*T@9Bob*+jBj^<_XP5$tY|2p1b{a zcNnr|JonSkR>M7T3b%x?e7a0Kl71RmC2EKwXrp(P4UY!)qe@)K9b^?0Ciq8e6 zPtfyMXB>|>Oc{Cu2pPU4kepa?*`>WzqV6WgV+pYYQ$y771Kq(Pv6xKqPbe{BFg3B= zrV#lWEFoUmL+mrcUL`a3vmIAxx(Bpg2^qc4-#{(b&Q$UgAtiufJmLpu$mV|zpCIoOoH)w%oS#DW4 zZNq7LkUGH~nbaIz&Ahy#jj@B{?-UxAMI|5B8F4Lt!E^J5FWN`*J{4_znAmbS64nKr z=o00Gxib_ntU|_LllQKX4hLGVoQqnr5UoK;PzedLtZEu?c+@*;l7W>TR_e5b2jhQ&e?&PlSl6T*;iMq&e!OBlTs5P%8s#brOzE}XAW zg-KygplT!u5f}_64f8{aA#H?-)nUXVGY|Ue3^y+@!6sHTSAa-GE@IT4MTiUxwL+}8 zwt-s#0lERh&>l9-2@y034TF>8vZoR_`3^`!OG;F;jxaP2A@0Y$CJVvf)QeF`JHf4C zL%J+ER!GpS&_H)gcp6%UB(peB9-9yWMYC!XhxoBGpvlD}VmClr6G?(g7B&3kof$x=zJP9J}&W7_qf9;SrH^GxIdD`!mjtix#*v* zD90j(#WQmqjv0=-ZOFNB6Bjpa_B6Z0d+d1Bz5p}xGv%x>RrI&ndV7r%$>hga#Bu8h zH7nK-`TPBv0|IJMqeRJH*4V*tArAI_{aAcf1>8Jf1EC=(4SCPdUJ4LNqSQS~E_~=J zl4Vi>7)E{%-SU*i9bcc?3Zd8qM!&O+*X%?RRg-mUDL>CI7WIez)dW{UmhbF|TohRWF zk`Jdvq0-U@nY)7FAU`Mr=KGCT!pK-_Fj>#U?mNR6XL=q_the3~LEAsbF zdVBYAlTV2S1P6zAQAhP#j=;iYSi?yAsTB_r;Dppja)wB%*g&Hf-MA%M{7L*?!xQL; zn=!gc3B`hwM{Z2&i@1hvs%7}_Z+{{0La|p8tC66kx?!~anD9Wj8j>L=kB zld@t!k3S$1dS@A5yFjznWS#U9#aT<2=Xb1B$NAit{_RcA&|G`V%;I4DeoGKQ$p{;G zYmJbcU#uU~ZE5Yt(Tn)O>ac3%{;QV+bC0_8jZ&o0fc7&;DtenZp5y)n6`F|}1$$e^ z*%G$cZJA?30g^jNrT{+uWQFEp?*_)4#@hI0vVmhc-ciT)V9{eyXe<@mE41vR(P=Ap znn=xGt}|e*U% z1GMM$UL&H|dnEgpu>DNX-u-SkH3qT2*BbhY@P`J{HVz*uhh&W?fGp=-8@~}KqiY9$DU z8t3e4nvhs7HZT~q6Y+zjX9cn{0TLC>Yi7(r0-fsj=r4gvQY*64Sbp&QmDXxupu0bDGk&x76gi%W{d z7uP6fQ$!Kx_1pvshY0KBu`U{RZY;fvf|gFqQ`-X*l8fJ=s0bztH1qMvO=+lzS|82Dhpu z^{utejeR~v;g%O2Nek2J!rl_;D`xzp$>}EMD+3fNj@}pSy^kI@;T@*F7lpy^w_`w0 z#D3ZcC-lICx{D2~Dd1s%(d-Z`2$zpEz~PQ-lh*n-Tc#9LaGSKq7XBO+C>Q$_hW~f1 z?C6bw-4v-!^u`Pw3Px+i3S;DrW?u&av$^oeqI&N|t!=;w-NC(INW#02c1!f*^s}kx zrcnAWt0qerD>YhA*~mbmha46ayDox>?6HG`x^1X{Cme9ZUfyMatT`HAMS%faO>oKhFrfvfp?g+r@b^rebyF)BfJQXj{5Ev=uiV1}{us3-9S z45--rQiyYL?N=+5QX1`ntB^k7PN6oC(gK)rLUm)O6$Qzg<9v!qS8hh&# zDZ~&8A<2w241HCV7GtA8x0=~gEY$yCr6*Dd=NBXl`?Lw6fM3RGX*sdO!{?~jE_WDg zkC9nz7=8LB(0i%tVXV{+! zmdj4kopZtS7vC2gYfv*+03n|?2@_PdkI2v!03n)q+=(@tI$roSG3(57QQt9Zcs}|u z`uq9lj;Q*b_rU`*6J@`?*Upp%2Q8`ImBmUoMla{w&BlEuCUGp!z0on4*okE_(2>QO zs_I+h_`KEJA?$fQdaP>otN!9yOHt<>S9RV+n&rmXz1dfqJ5{LGsmr&QBi}~P?zX$l zov(G)Eub=*MYpz5vQH|!J7+1Dvf>hU%#OxTby+DTrf0lbELVX0E(}kO)yH;GcE{B< z)@Q)R`kK67%gEoD-0sMcnq%E3hU&7|i$0H<9rJey7xA+*x)(2Ym#Qu&zvqEI(NkuU+3(KHsJm?fF_c~Fob~sw zyIZu*U7T0j!JmxMxF@^XBbc3*XjioFxmo_;&|A0uD{9ec{;;{cPDCHvH!D z+=s$t-D9N%hlk>q?2S6o_wB0K`TS33nF^*WvrF_S;?v~j zHoH;}*(Y3$O4q7zA9!gVMN7QrI~p}Cf9ZUbUc-b^t^*g%@S0=ry$&VJJ`|~Cx9cA} z`FAiUwLOxq_f@21yt?}xHa_7hNHjQa-{g0B;jP!fyjpG`1Rh`WyllGiV zJ6?Bm9S`RP4eiE1csI1A&IM((zOGM|8sWjVOjK3Hhw5pESMBK6Xuo%9ay>G&v^Q+M=X81|g7U5^H25h!6&LiZx$cfe67Xl!h=uv3 zwy0Q#;kvzRe)BiIM(66IAf&15bgBu%9SXB2;)bGzN7S_S*oQvfXsR~^7HyJu+3r~K zm_3|bb;|XgDG|BApXn$zmv*kV)x1%jqTELi#@RS+Pq?LkW$dnMnX68XF|;sAQ9*vm z-$kibG)$ODinuat-4+Hshr57MJKeH=d}6J@m*W{ z%AKl(JMH}yB#t7FuK;sFPfThmnyt+`b(Srxby+^+(Jm_pAHRG3acFCy0!v}_-N1IC z^x&t{8#~8F)fx@ut-;%U&IUh7g?M8e? zA?DtYRhkrKlums2dVNOoM%U=RWlT|1l=;jzQh2#)JL%h*rIK$Ik1L#KX7k(bnq=xW zA5jDi-I&3uQu~nhETtf9(PTzpGFzPA+cjtAeduD&OqGYXT*eSs7LT>ZZ^}sCsZOVp zq8y8>M~+PIR-EN5`8T&pzbVt#^xg`c{&}+~>Su6uo<+ye?d|UuM#%vK8phHSW&NYC zj!3E6y^dp~JIimso|_i7aNeA{0&Gh>qYJoeWKiRif?S_z{Me9*S(&DMN>*=@j3f(1t52Dt? zbt?bOx1CE8wz9_;5?MK3o3zdW1DbCx-^jmT%5m7*uI_Z+@)j29$jD=CyL>lgI?Ii! z^S?0ocJ@TAz;yAHb3)T~lix9DxvJj(>>|Vbze4*fp`HRu0EM= zftpz(93AFV`sMSIISS2!k94#FgjhzI0VT^bR*}soF0!%Tzg@TgnKENu<9!$954YCe zb~V-A{&tk`==ANTBFcP2MB3Z9YN`DiRKev4a*z#BYa!!Dht*OuX zm7bU}Gd-Ybw)%ZrpTlhIIm^r#iudTHpJ8Pa(=?sJX_ug3g$L0Tp6ogH_GQ6)-AS}d zf(|KF)or56$d~?|3{R?*jw0R%x9Vm{tFm42HD$~Y>c%}e)^)8A&`m8iyg7Y~>hpb~3}qznsh zQRak~6s_}Z>XUl26^~Z0S9JIm+h$bUMt1Srl9IYIS8Y?lB|cPSec}Cwr}C_uH%l*AOLx6eAQFmv5~&n5)6<1VB9hBf z^>jO6pS4Nd$ua)|m-Z|Z1`G8h!-sUbaxW*hE49xIXd^pB+vx2^uxa8WfS#$7UGI6a3lb|Gx-jH~*R z1&^pN!K(Y4InPhpvEaT}o^12+s8Rnll`p<99Y#PF7heT!NCc~i_+Pm32?L|1qO*7D z>N>J3U=s8D&69kRN4?b>%D6SW@EaZN3 zvL|Ra^RH>5Y&I$L4!nuNqUY(U>iV6)nHmO^?WW%Xcxb205NY0S-J65KjnPv?(~or3 zE0^>&ByZLyf0(}3b{tVQ(pMM%AbEDo@wHB*rBZ`v2jN`pjEHx2U51Mq-G|R$rA>kL zGSd{h`b0aP;ZJFU7s;(E`U9!CpGD{JU}mN8ucOk{c{46T=hlyi>{#8F>_~4cGNt27woJ9xNoCDX|H#1_RS+JK{nvRWp-Ahc&~2oCvT^=PgT>>(Ac8@_M>Cz=cZe`5e4SU zi#M`I+L|C)(I{Q@s`|F#I{%8%AEFjk&dzkl{*s&3NV|3`@}qux=Fh3~zy%0ZW^oyy6u zicl)E%BIyHvE`FsXj7G}JfvLaDW*s_{M5@*~WS6kFus;i&T z4~m*sh@`(XrL0m9QngecsM=~4rDaiC6v$}Iy4POPh{$gb?l57Bz&Omg)Wv7FB}&J6 zD{MROdY{c78~PNFypHZ5DVcS4t~ag?vf(HVZl3U=+MyfcS_(I;jzzfhSkgGJzVEc)+98q-epgks>;AZDh(D-t zKKL}#@JWWiIulzngLV~(t>J~E;}WTBOYN?xAic9Q)^t&%?TJVF)V_i0O_A8iiINzR zLu@-8HrF8ZEGV+9Ip9XKYEvSMX@f#_`uyp3qsvP(lxmClhl=RNW0N*RGTWu#kNxY- z-@F=|gFnyD?mz_>t^fxYOpm80D(q>SdWL5B1pQC(hguA)8vT4KC}~_aumYs?Yqq9j zMg{@t(PgVY^ItA%R=2l?re?;ex(rvCO-oIQMiK+f?D&#puIne-?;Y1Zx&7$-g0AGX zin?4T3Y6E-&zo&Kc)j!VxEWcNekPJM{V}#?cE;=q(0W_gWZuHKJLrv;PesU%vw?Q` z&28Z=!49Ric9ZBewXN-CQ!_KK#`GzRmQ79Eo=4x#I=FmUNz}Eo_M?dC^is2NXY-+# zO!Q!fLEBx%mfFdgM==Hs^R<=bEB%xHJ;jp&v#4$lsluWf9i8%5+AewNhNbceO~qyA zYiG~_JKc*-0w#5-;4$@J)u2q*lnaO3uK5;C%Ra>y0(YHN8L9;tKf?ovZ&zgv?Kov& zdv9oCMcQUuI!v05iso-4i@3_S9BDbd8zsGi?wm!tl(p*j-k$OJVw#$JE67-b z&DvAjr98jusCbX7qw3kT_Q#uoowhEWuewo{JMUv2PnCCsxU|)K4wji5;qma>ulT+y zv5u;46ghfX$~HsfS6$JU_NJQ^RTc|bPb`742)xGa0OxHgu*{Kgd6)aN8-mtd&W5A$F#vuDDyje08tg zq)PL;1!rG0|19%|DeoG-QLB{o?oPMzW}_zfvWupL&AZ3bU-NzLn3Z^xS6&x1;6wdt zuAwgqU$m%EDtE~+(k~WB88=gMBz>>ZBij0~a-oAaAb@aI@;V{QrG4^3b+T!z_w9Mr zBd0Aor@?x!_a--g={nB)Khy4Ts4#WayXataa?lt$KD01fxcPqG(8G!2FHAEUU~1FPA`a|NGtI=%<5Py+@`MpuL-=`8J#RX#ux(~j(A=g z(1;tQb}Z@#5ZtSszhyol^sy_*=bMM_TnyiisM4Lr`T862Q?ZhqMmzkEdQFA3cZ-kkHh=y+*ra>M0$|K#88_yF|zS2#%b5+jtgn@ohQoQpUgX1XjB>c@DUx@KKHrz{1~m}Y9P1E z|D|e?%S*Cc`#Lr+wd086XTy5cVCK~9^uEt?-fzVI0R(hT$BjhOyGyyd)C0S;&lYCh z%opvnnmjU^I~EdLSTy_u+?P#+mB+G_+2Icr54KoMp3ZiCxltD;l)>4$6Z5HpMb_j$qersp0&lRBLfe8 zvbLLsd{nD~vf`Q~1BiCFr@zmdJ@K>^w5#WQ;(QEro!iMEYJNgg4?S+C&KfF1-RL4+ zDnBS`b(`w-3mS}QpC#pd-9;lDaMZ~Ejg0Z^i*e0zs$=_$ z(I-!I3B}VN zcdIUESP2^kW zZ;L6r%!v!nYnJk>JA=($&fW%_&YF#s_~O@e;3e(=N{?wC%^lM^4%F7%khMnD#CNvv z!O!BIZ+@&x@O-FnW-Hm)+~h`gmjBeX&ERu@BaK}Hf84T7_1MQZCNkgsD*V4a(Ps<( z)_^*d2(OuwtIn~n{rK_1DIh3{!sq9asrtvBWTWim2mHI~kmh+U&C@NQg&UdiPf~$< z--t)scf$%S+W1PGb{iL{8YZtTqwJMbgYqsrYOEz`JL@(-EM!kTC_R&xXl`-1T(+Le z`AK``y}p#N{q?N!veP}`1n;%r31w#IiiF?Y6_aq+ZtsenV4{jR*|74miM?n@PI%d8 zS<>kki%%;fInVf;oP!ywID#Qc%I9~@2Ce{c?4T2OK+WEmZN=V){|kUXf4{2L_+=b_ zQ}|oLeiTLx_*o-<7DanM3RbG0hAYLtg+*b%3)W4agll!b@I_^;{0@Q-z{*em00vi$ z_#Y?#0EMxAkHJ}5e+i(Yd+<6EpM#Z+e}X`>XYgYaci|PWwf_JF;Sb>TvF`jTXnw=+ zzGD6vP`h7+Y$IpzvLsK!mDy1I8W_KS;CB@6{s~=bwto$)3qK7ZM*KTjJ3oc)srA1P zE7N9%ZG8}`diwDFeJrP|t;L;Pir01ZhP$mspU3bcKo)&MhSYRgiE5Ox1?KYdm!__u zc+_zVsKtn0b#b+7z-sPpU+sghcqvVmi)(HGj9Vay@tM zw6^t7ziHNMUu)=_EVD|>ZP@CCcBYQi)v^O&Qo_w*1={b#(}W1+uhS%1MPYa{*vPD2 zj4t-Qr0Qzy(E(5z(Nz~45^L;#+_84-cm2(;5lC(eHR^LKqkvoKVSdg{8^jZ|wpLQN zI|nP+I{g}iAfs%dOUA=-L0yX3`yRHlc$OPB^4Dyp$0n6m{{XhFaxeX`bG4<)%lf>n z+LjA8k?9*ju15OVsso1Jg-@*AX9urZ&$nQ2iuW}cTHd8=U9B5!TDq@)rryU*Dm7}{ zs9%+s6YEkwn*nNAs;SFX%r(x`|;%Hr9qM zICctyVxUj$*1IiA)a=zm%V`O4xYuXy4#@q@RoHeZCX4?7*jf~SYq14Nkjco_!wXWB z*r*}eC;=&c-nHtIq_1Jvi(ssltytG>6nb}CJ_w^=G`cB-Lj z+M>s`5uVq%9Bk|@m2c!G_b59TQBJ{juJA_9tDT!!kl1UL?VdDu2VFF~F|@UAQN&%Y zqnd{7Ey8TFv0Ft+R_L%M-Ac6fV>NbFRKLAUzS041{Yo}}H*7*~Vm5ZgcOJmCY1r5G z+u5|UXt?{@%X!wVYf-R_*6T}qYHY5}ib?wr?l-k}#`^uU*kXHcu!h$5?_yM|+xy_v z`+t20xA&oK_a5Li{^#8bKkPfADfb@eO8v{W2LAwX?hLowJ1$mxmvW+?aqRhR`)=c= z&$jj{b9--pW%fU|ZI!p%cSv7n-Lj28Y28}KwOt$9djP5K9i}SxF5`~Rx%S+4J;$|E zceZvc_Iqz_!24f(Y}NN3_NwalF8R$~pk7WyYvilbcy_ea3pZb4)XDes2ckd5>>;hfv9qUUw&tv9$ z?_vSF&i$1;zU&J-&h*s1=df2n?Y)+?e(%^AuV>jEpa0qb2mt~D20sAGFl79%=7_ET z07(r@r!gAS_1`=k+r2cspe=!{p;twpK}T0W;|dbO&mAqYa$sDvR=2tp8r zRq>&J2vkBBOI&_?#By2tK^-d|aLC3njAI=b#xaaz7{)Q`V;x@Yax2C7>5EdPMN}bN zR~5x^TvrvuE75SD|Jncu0RsXCKLDqyD+u-e_Gsvl-EqXnRe@Ctj#XSvJQ@4XM-w}l z<@3bjZzcO44D7FdzZ+=NAI|MJ-_Lu+Gr69BoVQPFJj`rY4WBuG|Jncu0RaI9KLC9A zyEW~yZgYngJVYdyI>CeRrp4KI*xR^az4CV$u#ndCV|D8+@nENAl9DiSVao}y-o=ftSZAT~bS!tm2@noL-_aIEfjz~PDE_>PpQ zm`+@BUGwBkq|M+9+C=M47u%KcWd|64atr`}6my}ECv3_{2P0#|#{N<*_tP@=?U58l zBzz=aj~Y);vm+idGBG&X>@5+>jz8p|7GpbeE)xsJL>k=vyBv)l@Q)1*F8<#m~HopRR)Yrm_%Ql$&1nqeV$GX&FN%PK)egvT2S4lO}C%Pemo?$m4%zL$-f+& zY?vHJ#Gml2o~|5?h7YHOFtx85&)HeBX6$n0b^$S|#6SwNdGRKXb~{XunAUi(9KE(-fw5*s z0ym~qA(W2|bke(V?mdX^$6}#-F8Jaq%B0B!1pOr1EPOPs%~u0t!U5dJ0b9A;YzX7d zy*}HqB@80tZrzkXweN5bg&a@XW%T4KgNdTYU+$uwj(ynJD}jOuj!<}iolP=h?J~9? zUn$>!!Q;gK%E`a9&PLD`Qwv1Q$%EteSMuxGXCa7Xb?xD0S^$GHB5zrC_L;M>1~;Q6 z?VuAJhYG>nVod9k8i4rwj4az)F9t^)D--uUwpQ)19r*Afej%jH%-49h`wW%A_@oDqFvedK66`=16JbZU%iHB0xBxyi?Tj6Q0O^ZNQsUd0a$6qP z?V3wTCg7V*6n@htT+1u#91YU|odM8!)+hd1mB;74MZnU;17Zh%+j{NsuWg<36?`uF zFqjI_b%J<`$%8*(l@4ej`##$xfQd3ruq!T1y`FYCilU(HTm)4bT#{sxO?S!c9i!s! znHvvm{oVpGrv8U`8eW2&SBa20Rj~b)2LSkr z3+RGP$Q2EQG+5i6Z5X00!jwK69XJqtsedlQ=0^%;7=+9L8dQuz$EXqe>OC>IczkFn z#0L>=Xs@I!(J*w-*5$&cEEI#J{qz^o3R=e0z~WtiS`7Vv^|e$0=XHS7=S7Y^*NqLS zryP%}NV%eRZURg&Cj2RnrmTajZN=#jW8AJfcNyVs6u@@kP!PcvXg+imaQ^_eI$wuS zrpvJO-G)J`pD!9*%Y|}>jl>3kWBWx7*q3(Z$00=wLlUyV#^i=x6HAXLYO9!ysRT@L zGHca10XD{e3>YJhlR+N}g<=lp=_H#-qH$nTV9x;Fcvxy_yN2vkhA=>#zya{IP%DX) z_Y6Xev-AVPvX%=C5`(Bjj&ySDR9~qvM+wwG)}e49+E#32gXKgoY`GX*D+#c-8VQ%R z2P+-yKrlxNCmO~t!VK$9$jd7hn6E_QEab=wA9WmmqaN&#RLC57ML(s8dVrJy02P5U z_T?@@n2k(Hy=U)HdU2hYOUw+P9$MBznJ>5?Y%|eVT@^NpHIqsD1Kb? zy&jp-1o>2|M}esr<7-KsXdRwfQpy?BPxnzJNeg9wEkaC8L1S|?NC3`+M9l!${8ZQF zl01hRRtiaLi}9XSB?%*e14>o`;Ki+7N%^OLsDcKR5TOy&9BF=Z#e;4Ur-zLIE)%V% zSol^_6qBXI#i)oYHy{dS7aHT-4<9Nc`EqZyPU2^j13dC9nM$#L zUZ8{t1c4%EhAg;2#s=V4Ie1e@IWl7+S$528spVN!aqeWg6$&m+wmc@Wje~pNX&T9m z4IF-uZM`_gKt_Xs6_K%_U?EM!>NLL!%5&qe=*C2gctNeWFo45H$tK2wu-&WyHlh?L zv`Y(uNv6e%X@Cq7)qPCUsFmTng+LND94sgo{5F=JRHIKG7oei#bdfgu zYBp}%Ob|~xUBH};AY*+DYep1*M!Q8Vq>HZ7X<1X2zqY4nWdt!i1bNo|um=J)28i1V zb-%)t0k{(&p)x)+A8df9cZ}(AStlTyj-p2nMu}U1C6LU5e`NsYsFI>DBf^~rS#nq^ z#h_>jy)na=tQm&ZG$QoqF@uXELLEpmYGhC)2d9cj1VQoEO?pq;s}Og8vN?eS&Y;%B zU`i-EwFk?ba;1FOwqp<#P(XzMk|O*oE2vP431IW4yhkfj2Ewg!8zPv2I$oFzdq6uD zG;T+osf*@sS0OvhSQBwkmm=laa99n&RBn;+r)D-)+NDfwJp5`&4(tKiw=8}fYGY)7 zsI&5*i-@-daiHQUn188%JERW{DH{>l!P$h3-UF2#tP8XdetJ-6Dumo2nkX0?Z+1A^ zz=7kXX3Agk)k}wVI-Z!dH>r|)jJ+sS3vRGKwxg$a&~mhIA}t!+*JprXT#tw|cN06e zzLB?pA8lsEpAg5DrMHGLw;kk&w2DEE3b0{~-FF?$;3G@dbKI_fJ+Iogql{&M8*fO~ zEyjq%6bF#Zq=LN9hP99!AcWoPK}*4qMPtJ7P9eAeJS6UqIs+)&qyn4Sg52Ks*0X}a z31`}%-1QnOyeN%F6I*>r0@1^j9mF6P9wLS&VFX?{(PhXCpQP(sy-*3Y=$lH|=^D~9 zR&1nL0wOel|r~}@hiq@M*fxuX%Iw9uuJy2H^wgBD%=x`fqAnVS<*`ffGO} z*|b<8kA*voo8*?4i^uM#X;UBx9u%8VUAbCh)3E_u0>S`)5P0cKk{xGrG{i{zCY>5f zB$XtKa0E{ny=6sa^_K6K8R2`{cu@6O-9?7sF(T&l$gYJCTsV!QCx;rt{L7(MZj4E| z?M(ro_?#S>i3)`1CQsW+GO$*7W?`+hGs?24B%;8@j~FHwi6_djft2Pc(%BtAQ9MO% z^@HSq9GjbenY}PoRSMGWBXoJu9-^x`CNcs@yu}^)hSmoo7B?KI1aSrq=Yu~gk5DvR zcu(!4^vLQmOqZDd&_pAQJql)I}djerxSys3RQ3YtQ<4;nbKHqc1U;b7S`7w1DR zQdBhL$e5IHvM7Renmx`|*tp>0e3CajZZ-pl3K`CScFbj(16-Bs3ANJrU)8LhcYHj_8wL%8kp1V#v~Edjm;hopDo z#0$ODkVgYN%{o48V2f>kDK`}AzMDbxmlk3=tuZ=r6_om)jmbCuBS0=dN#sAeldKmv zB-dMi4adSFDFGo6Sf7n5h8qbXw&*DSVvVp=#i%c;yR1m8L)05U-w`60^8gEDBEGO> zm>_=2lEO6vkJ&{-i(ClOww$4I52nVC=7PE#HyvqDtPyR}2ByBCT}MeaCbzMXa#jtG zDp+YHsw)(Fu`2)Pgk; zrDRocxkN#>x=^Gf$(NJ=%YD_^iA=HcAh51oalmNO3 zx7k6r4PeI)8Valx9k;L%J9LWc%%xa=5cYsZzY0`GP2jF(^%esY(t0Urs>Rao^&~fHFE^*w7d>M8xtHzb|*worX6=(Nx%3K>D?$ z?S^zXyK5?C1PM25n?d7D262v9uvsB@lg4!w>f~iFkjrd8P*vSA9O-xE3_Fc~%wUrP zPqbDHSg~Qvy=C!dwb;P(F#JcMU~fzfHhNmlO%_kPoCwL;*^}+!2g_5TFlxjx0-V8d0Bc#-X4BtSbKC zftQmCB>RF9tZy38j{PL*4zwA6yYvNY4)xZzA8=Cw6RBfb>hCe`5glUUn5TM%b=>+> zmG4qN+FF+Hv4pgB3fg<*fFjH&M|_G#okFAe++fAJhs4lt=ds4ScMdd9^QZySsck`9 z+!6r1xU2h)I|!ZPO$KiL0US3AiYNKpeL68=e+p7P!9y(ExR^XGP~Gx>F_Hk@E_9?L z+!SO7aV3<34=ELlw|<1*@rdx&h&}EmILS~kI>_V3#+UwaAQI(+ER~6fi(ZSre~e=Q zI))=t!{9GRw>|bOf0ZXHHxf>##$4(vAdxiXe+>lw#&hu)7_iXCMz#N7T*-5+JJAzN+^$c3vsQ&=fv#}#?GBR84 zpvT?&fdb!{Xk|X}++R=3ynLy5d$({&xnEGk(ldLXaVJ0={nWGWSdXt}ISSi&oY5e&CV;KbUHNt7kUUxwi_Op5>f{xMg#3N7MIC;cvN4 z^GrXf_XL}NZ8-?|*Qnm<+>k6)Us^(a&$)qeyUg6tVeY-bnF-c(<469h+yTOJQ2zj_ z_Xd8sd&iw^Pjl`8SdqNx@uQ8s!#>#FVU7OE>Gv$>aK7f&hw~oemw(gs83W@=gTBmF zga-_Hcu`jO4BG&?4tdl!x#v4spg|^VcBTWF_>zq#z=A5s)cM1-J zc{3Em`^Ryp*aH$~B7n*6IoOhVnT!%R#|l~Z9N~Y~+8lxpIP*2>x4GvkPU$%e$>Vy> znLWdQxb-rT)L&U?C+wk&clpC)ZK}CjNzzA!40*lJJ78i?=XbakrBUvE!ehx6T&BQy zS96p4hjQEcF68v`wPHs1PUjeC&fvKat6)EEcQ}(A?#Ym-Jog#_v2{$}m%@UaQU%D3 zJZNplx2AOI`)C7RqCL z3~`#4#xko2xZ$NX>_mcLByp|YfGwi!5o2Dbrb%C@MQu0&P2_896mHy{WcH)H<}pN7}|O_5jy-U)x->-*v$7Frlcfy0IRf{Olv@d^#CwMU4PjNN7Gm)=G^WMu z?J&Iy#1_&;J~B3zg>VE&Jcy=$8)Z~zyahR#UDrB_Wn`GSC2ANz5d;aWq+=NhkIM}r zgFYd+iP|~Gg)kW5fwsIk(|-`upV>qe6CFbOMK7mw9V$V%^E5XgB~8#0c=%Cd$1FdC zPbx11qV5chMFEv|NsXXhkO(-*nG#}`YJmfD6`g5GU-HfE#+kJ(ZLng0l*G0$R)qb0 zBB4`uJzi^Y8*QfxQsN2}fg@cjrsQ2ox6Y^2lVDWZK{P_H(X2%Apvr-PF|dL@RM>XR z!M#S!q!=xzA1W$f#fSq~p(%gj6nb|9sp0og0V6>q7^PoLRfU%z25Eo*?&+4SNK_Ee zF~{PHML4G$g2yUI+C{m4Q{ll1(+6-eM>_P^9PTH31EPyak>ObM+Yk(X9XQrgfJ&g1 zX1&Pe6d2z#x<0$&$(I*w$~R?JS0D?0OZQi$pCEqkI0qvnL6P`RD&H`q z9m7+~iO2!iND8+y1kLDl`0(RP18H8OW+YPMLouY0ddGNa5E}A-Y0Dk1PNdJkR_tmw zf*=~W8>U<1KoC3`Xmsmx+-sy<*$2Xz4j@YiSD1q!%|H-d)5_EVg$veza3X}?aSnGx z2&X`9bzT$usqw0SOvxfajSWZqNru~VM3N*(MDU`m0gaMaYd4B~IS@M&4{=bbv>qlj z`^tLZJs6EwlGhKVZ60Fgr;&7}10(ks$8Zh;K@<~ld0oD*+%x%9RQ%EL^nu|W~HEi#K!AMpd#Y!tv5=TzV0+( zXB(0fMfp=g7|`D0lrBCn>R3f9Z43VZ-v)*?$I#MFOF*Q_kUOiERP@L&G??(CxkBJ! z(h8kT_*1qFo6IZj$6!=(5=NxZ#SxbvRTkWCD3ZaH9jzAH1llRaGN;wH;vj7iN{fw7 z(E-(qSP1ifpW9vTLcw?D%{)K@DY>T3gVo8~%OVq^jYsXTPa6Q@;1jIV9IPFIu!sY~ zn|FfkTd@;(Cc-Jo*dc`t%4u??--77|u^f?pv&XA|piw~d?#u_>Lu!C$?V|!=0*J4W_~k;(<203~R*(|_cUKAL_ zi3|zU=}mYrSxsz#Z}@}Cjw7!YGfY%$7|r>|4QOvrKsIj!dJI68kV9L_n6Mkpjt|*e zvLJqUrU;u>+tBDJs6ed7$BhtUtZhCtSRjM-N!Dlry9w0&^b)|K1fPrw%e$nxnVxl* z)c~M>=@VnFw3v}ZooDRQgPecm8>AavgKq^Kg$fAQl?DkQlO{p7m359IlvIE`i4;%? zf(n9l`PH$*2;MjwaHM7+9YH#4S^{LjwD{3=F)_JkT4!aF@;51f4+~aQCqh|R8(Yeo z(#9KY-uIK|Ojv;Lpxi74sg5uw5DS}e)anI)dW38BZ8IctrbI9Z-FX^-Z8hp;A(ujg z1_qND*wgvMZ6e&FhjS~Ddtm;URv%n!1BcsN(3V`?ZjQ>^NU;(RoiTV!SpNV!CgtEQ z!{HU=bi*&Ecr4fWpjhkb-~iHm zVuY=Zgx5)!v5rQWr*9ikA&kYM)h{Yeo-}xFiM;~i3j)w|`#I9wNSI+oY}+j7{5)tr z(FA=o`$z$xNIK67B~6yfx19(wU@-#skV8AC|wzn1B;9QFn^P+LKCPfKiWR)9~926$j#2qq`OpF}3|d<7{Buo#i9w!IPuR7%Nz20*JZ zD**}+IZVweZroVtCV^%lWP(_Wc+|5LaR3$4n+8TO4&cmgM};!tVyllyokyJpH1nwh-0ru38$}~DuM>Z= zlha+PrS58XZkUnEiW`A$cA$vRW9qF-Ig-S1uB?y_iZ!4cM$$M^sBV&MVC&&UoyY)4 z2qc;cT)cn@iv!AwO8`xX^QToZN!_|NrUgI>Le96KO_CZ`Z@B45gl$}4AW{$CN$Dp_ z=@bhHQFV=?M9 z5Efu0k)e}HI*!hk06-#jrN-H!B}+NH5&J1a_X(K=mq63R5;;+9fR9Yx_W*fNDx|JW z6lw|5=G4leoG603r$)Avr55RZhUPfQA3Ab~V;I_P5N3!|*2E2egb3C?+HlRW5*%bw zAp9wtAyRAtk;CCZ3W0@wnVBF~%}StftzbBvY13rH%Y)P>!rIL!laCp&ET>gB0O>_p zkPynMrqeeEsyS9ga=3jpmtxT;gkOyeOiviy!^6&yp5c3U1Jnm24GilXYdSU~ox5Up z9CqBQB;3{{?)#R1?6KhoA;xz@9z((jm$R#rkc?7&gRv(0WwD#$i9#{ZwrtcjZMco zXvVv;0;(FoG{vM)cE;!&ZpuUe41uNTJBK@)LyB#G_E0M-ivh9R0!(o5pvcS=?rw=K zZ2*%&(Z4VK5E)>Bpps|5(K~ zQyR>F*KdmwPj8h%?UFBMI$Uc=s?Ch&KBhsRC}K8=H!*7NeOx8ZW@C#m*m;pR(@JKB z#-sDGV*!H|T}5W^a+f{cPs@NprtE?a(0J=udyM%qjD4miLzfXdS1WZH09?t6>@ng$ zm4O5ICpy6_#!0x=JS)0zHj|Se7QAmX?~L?+kt#Tw&3DSy-HGPfLX#DdOGGdsPlyz^ zh~O!h882X`#??G@AXoW`(B7vc04@g#*^bD!-TX(1sNH|3jR34qHP&hYf_U<-uA&a> z8jzcyN}5)4Y2i`-0A!vt86<(oaHX9Ax{0Mb;I+VS-Ag1NDT6>y8_y4wY(dgBzNg}U zDYhNHn;qqE)CQF5*(Y_N+gd26Zu?t6IMSmg`1~T)7ot(N`RYD(>9M;10H)G)HGGAb z2qbt@HsS)=LD0>(*HJqV0u#=mbejn}@}?z-W(RX0Jt>_YBKn*2qYb5n>2hw`H3INr zmBA>iWlpvpcA$j|kUup| zsTUjZIZHSu4N0hn6uVFJ0~nH~>nB5PCMhz%Zifrm;DG~EGp%C&S06&aETGtbopd#e z4mNJwv0%?6%;_ZfR&1Ti7DfzlcLDVfEIHGWfF>kAkmu?*;(T5SH~z+%7SABI?q`(HV$x2NS$_(uo$bVt!le8G zQdUocvj)`3-umW<5=KA+{E}z>Oeg|P#k~4 znRv{}{@T&n@wgcW$69lLW)Lm=X`TX*HWrwnjOE;+&=J%e+O^Ne~6@1q{8)DpujlelYf0<&WD0xL;V z0_HWhop$}!T-)=1Z9NJGu^;fjio=bRCLBPr4f07kZjmr4GZ4yf4^>rw+R8qV7;xuZ z-*n*q_R?gDEp8N8JrIy0t}FQNKWQ<7wV0k;@2_tBXfW@eE<=}{9j z$~u(5Ys`68!8?Z%Xa$gbHSwucK1A@PZ%)iV7bvgGOPN?vKeD!!AdAJdrYv>Tc~KaT zLjM45D`rL758^z0>Nh|lZ+WF)E}GGDND6kS1L936Z9%)Cy%p4huLDk0ZdU3fMTZ(J zNeT|U#W+lVfsE~wt#1Gi!Y!#6qDYb~BDYBDfy0$F$EI~yn|vw6?N+`ZCJ7>$vg9n! zFcgcy@$s)wnEqvo?GZD5D|YjbP)?#wfZDx3R2-8M2Trr`iXonJM&!x~+Z?`B%-dMy zmcj@#7TinFaRlG{sg6UtDuMuW zr~{19$}sK9jk%Q!$>C_BzqfUM;#L@ubA3e&1zJ9Xh&72H?9Dc2>rg{&VpIY&xUWwj z*x7$DA(8+bK{H*}EEbKp1Eso}N8L1x^0^vN0%Q`aGGJ2V$J{1SWl*aFPB1N4yI zY>l~xP$I^<96F5w)|ni_sJDr%h#SO}ovgfqrj-0c>F7Nr*_7js`?vOr<19H)_K-4jyBy`Y9cFgL6AcU3+1I`Qu0>7gIjUrGO-9& zenywM#gHga70`$?ON_8UI+TMqG_1%S$t1Aa1OouYsWJsn-$@aun(FINV#7fbd8ce^ zd~%>K5m@C$(PU%y8ue1;VVDDWHlSI5cB9II29jvy451W~6qp2!G@?#F&nIjKk>wRR zl@K!%>8Kx1jCj(VQo$@l^$CMZvNy3Cou)?;R!2H$a=6JV&Z|1!^TW!M6Xgz_y}@ND zZO_J`Htr4sHsG>Omg8#1q!MJh4OULIKA>!30{|{h9u%vOwwH8Gu0S@{Bttn_uyTOpoCe4)XU;h9j4RjWzP>i9E z)u685vcwxFZSBBdF$8WMPDc(xfQUtfgAvP*8fkH~T>;kgstDRXqsEjdGowzGJ7K@g z_frKhG%M#z0zfhkhm9H|bl zk*STu=nVjFvuM(cnFfzY0(S;HqH5+_l?|!@9||*nDg=-Tka%mxw*py4mW?e%cR?p` zBU%SR9C^?rXn63ejf8PLs3{VyV$)+Lf+I)*0M?~?n3>wTU!7&oxD-x*t+CF)+K%BF z5QqYN=qSum0}}^G=QP;{SW{x6IYe890*@wog3ajUBdQ7jNY+2TvSTZ_WD>DAiVKMb zHd(rfu{W)|fnW*RV8Eg>5Tp&U;r-MEqi?ZLWc{?*-yZe=f=C{Eia(atVqb8GNi@Y~~S{q34rs;+P(naQ*A;syaf?0)(QsiB^G2{YxkbEm~?b~@L z7=S?papPGr1S;YNHFyPvx{W!}Y>Vp!G6D#XmbBSBk^@fBk-AK2ONU_HY?yMJFyU+S zr0vUq=_$0sf=0F=(&2D}BL;lFlq@K@Hv1_Fcgc;|1;!#0EG^T2Si6)x4ECp;+B;F6*TUSex4zy9)(b9N-(N@YfkqaE=ppudFk!a;b zG8JKvl`MGE;sQ6p+zqzVT9`Ia*wpKvrYKLs29cRrbZ=O9oTE-BK3o~Id^0wmnH$ebhK+(_p!)NK{BO8 z^;^rGWxC(~+4ln_(rN-Wo`kW8} zJV(Zpx7+Hu#(g!Oks=Hk6fnQ#1~Gey19h~hIaRYTC^v=x$%wCU@BPy-#oA!*G7Zco zNplJZ6X8qTW(T$Q{?z(?rUEUn864!DO(rvpdP`(03%Ck9NOgJXNw6H~nH&b|jRf(b zkzaX#9VoxF%@X+53^nGN!GJ*oshRMKk`cGfmF7q#!{Op-3Qk(cSr$1R6sRp)X8b2_oY313CSVwfVls8D#p!_^Tz7fVafk(IECIAr>_EPujd*gV1Slv7 zCUuP_k((Z{OcBq7Q6j;HfQbXnm@}!y(CF?6Ve+QLSTit!!&3s6W?%B3P>(y;r@MTA zo*XShAx(iq5iJ{kvXC02!t%;nWSKFQB!nF~funhp3j* zm8fN4RaAp(&zRJ6PWbX8kkQn$$ zpp0EHoz5Bhf#7wd+mUlNLP#tGg*51YxCTE^hFpoLzOl?xC#bz;Qd)QkCh=Ik4AYmS zWEqJ7meEa&8hmE~4cpEV+l9*rF+}Bp$uW+_wvjwJMP=?i%OPwDlOtp8ut-G(iGVco zG%$AR5CRoI5022|WR_-T1xJXDD`Ti2NgDtJ`NeJ}xwKf==}{X=vG~+~Jjjt_ z$As3>Nt;FD*Mk+cgct%rVd14JF+FzFoA^Zlg4ZfF}w63^xJ} zq)}vG2Z4w_GQ1T1dIFvtW}6$ZRyIbwQ!A_$8$doZP)RF2MregF zqvvplAXv&X4^iPOeuvLc2FXl-xChDhqj4T1Pj9-hJoxHA!0 zN;o2PCOF=YPz%k80D03hWf;md01muqn6Ib}iW}%=YjBKY!hyhe)Dd=nkj;)}I9iN? z$OHv~OilRK@UZIv0+XP;)-yXC$hN$%Lm$;LcaCE8_+@uwKZsoU*5(0Gx?x*FFM7(V zqy@MnNdjg8rO0vZWdMgH@uh5w)WdPw+im7)FuO2ZXL=BHgFGf_6cVixR>VX_tyv!t zOz!vE2hvUGXKe5+T~|SWN;`tM+0WA;mQ80^thoXqcepYj5+FdH8q}9uuLJ7QNxu#> zh;jn?4Z@Q*v63%Y&i1}X(Ek9K%@tBe*KY1LwVO_XdA}-ctOnbdF>2|_r_;Nal_`AE zM2{omMT^GcGkBwrW!h&|F*G+ZdHO1H9-<@0m>i^&!48y;G7`ssQX~OIeN7FCnkkX? z@wXB@=oHOk)X^8CE=U$q4K6^}*IGtw#FXkFu-Amr70Py=0MQEPP9}(FAqCOr_t7IM zA#4JjO&$4)#pInRKI3yFhOex(q{Yo{9Wkk$XtQJ@EqaaQulc_ssoSBIn05WNra#=VXL|$k?+!|#^F-x}~5Om2Fql?t~ zZqxfIe>{Swb@B10#&UG91exMTjcpk>D#uVanjf0L8JRYySAq{%Cgyp3t0_6maYj0D z08@s{RSmZ(0!E(-QZj%h7&A%v#dQ*`{9C5fNXXL1k1Fba%2j|nPVsX^@?>qG$UDXS zBaLQ50ahOj5+v!$vMx-{kO*jRrab6lIlXPea%3h%X#@%pk--KI!_fkfS11I4PDTwO zc^dq_^+SLQS{7z_nn55VeNLu#5Ii)cKA<3-#T5M_C*eb`=wo^qCN!9z8rU+DKn>Ld z7~%beVa?lrX4pc8+??WXHQWWr3_eYy4LZ$Pg9w7u#2vmPj~*4N0PyET5ex)${^~o) z=13;4#?}&bqGs)73}a6!8(EIurh3%Up&53*KBor2@*g@Q)}94?>IQ2qikYsQ&;WoBjS0ySU}l;#M!t2pWRfLvZRgI_ zBOz$~AK^&JlVkvLE1$*3hdN=6ivmb#P)ItD8c?}`Hkqts=G;sUn7=)1Dth5qbu(*C zySeB$S8Mr9)GlEeF2#VknpQo+fJ_*IVkb|9Grn00dPuhl{Jh&%Hh`u?{AqS(1+rO* z)E}J@mn4C36p$nz4mFQ2^B$aystNGaR!!Z1$SrV0o6eD~WMPzJaS8*0%14E689@h% zn+_JNYn8WcPfyj7XU>XcQu7$giP|`6G;t2(V=@>97EokPx|+m;DzuR-vLr8z)<+Bs z2soK_BZTmZe3(Eu=WoMzdsQx2Redj&=MG^g9F(Xlb zGzaxu)5i1rD7g1rzc~Gs{{Z!J-u5EjWkL6BjAC^kvajxW2{CEs@S+E}Wl)_%X&-d~ z{Z}tIkq75OJ=-Yb1d3K3?U;^1g>3$K`2_uk~D$Fr<-tc~t)ZR?Q;B1|Pbl zd&Y1^pttu>Z|fPv@ZJ5?#eMTIWwz4ayiq^avq-dV@t_a9W*eXgKQ0tU^^Es}GA&FS z-m`)%Z%j|T<`ON{@}`e?%^*&{-9!&~&L#^L2w?$jvfAAG(2mKIxg3 zHIO3J3-0-h7%RE}BJ~H}GbtJg)9j_)?>XKrX4CATjqiEGPvsJRH?<<>_l)7=YMJH6 zukU&9a8U61R^RKn$w2{kT#$UJoBGdiRfd6xzPzZB@14O5a-`etuT4GQF*ek}`>Gq? zGgx(X{UVndd*5&X7dx$bJAL>@*Az=jR za46+}f5Nb(B9hkQPZ8fdUi(nlx!;KTVV00K3I&h(4NU2sV|_ z5o(29%;$J#lRzr&nYlK9ldWzbl*VPq^U{lByDh^10CgOo^?fo$0QU_s_s_zM8%%Kg zD{wwKnk7=p2EcOG)e2&7dr}o*6?I|8cv0L)n+P8Y8>e=lkM6C_^lH{MxyhRdAOLwq zF(j5-i&Hhn6C#&zAjR!^Oo@+fHdWlbObD6rpaTM0dU!zdt&uE$KZXdJk_iCBMHUQI zMZ)<}v4hM|JpTZTjXX4fXKv9JsA9lQ>k0-7LdC$=m6c3C5hPQx;~)tnfF_7QO9>l( z%hMFb-lOy=Bj-x$-ADc$3yyI`_fACslAsNIsh<#n!UJeeoK@aSYT$TN1j=1Z23Ctj z=z$A2Y1dey!SxY;(X0z_rgDU<7-J*LjWm5R3)K;6*PS*{T~lo3Rw209iwaf7{{YLx zKhrZBZre^WOnMBfFSBY(u{!PlT9+RjBOCp#wa%Nuvj4ZUPb6Mg;6_LdHvK`V1shU@2!~N@38UV zR$_@8V_4v7ExCySqT`vbPZLK|ry0Hj69s9PYABZ;lfZ5v>Y6Z>cY-&Ug0 zS6emNl-`7YI1F?LiJ`ngi?evryW{}?m^%5;$~2fzZE-_wg7q*OTZMH1cUqrzAP)vl z3f#G3^KtmAYmxji0gtkv0nudxoK0nS$U~9&VL{?!S_)V+eCP)PGz@vrAOU_9SOBI7 zCiDvd&!fiGksx1P+SbzGKn13^KxJV7#s11p0NUn%)ph|1ms`wnipa?uP4qlXGd?iF zAsq>{bD-cZ=+N@zUZx-d>O$}_Ss>lNfLI@mJ}2nP0C|8LURCPhF_RS7kEnRo?2Zxg zfD~Wqrbf&+Df-uu(#Dku9;021O#G>LW!$Sfv8W)E!%3paoT?Zuu%=^%mAAF-R4EWd zbrJD@tg12$nZBzFN!FFKCsPn-9nG(3<4Ty1rU{2pDq~o-rOtJ zC#)kN+o1SX_Q%%bVZ(&lVBb-#Wic_4;BfklGZ7?FU88pyrBb_;Tn9pisid%5b!imrS97riqzH)fr9{UgARsKn z050A_e~vlmSZT2)JZRVe*CCIGofR29BRh^Gppj^bx~nX10U!~e;%T<2k@U&dZ)&jg z%WA0?BJ)8RO{|ParU{PYQg8QHP})VoHWM0DvTSV>jSm_uRyOK*#WvNI0?c*2>l&1m z0$L*GnU#77=?%}7WC2XMlckBMDQ27kNETxNX}lGg}ucZP~_?T}!FBpiu}-#GIZ3g)R_Cw7b~Anfqv*ivfnz z1Pdw9Q*KSrWH8jwP>@GE>;2V`w@M@{DK|ROg1gad6=Grxee^QoevKeRNIo^vf4ySI zg}{m=ug*DB0eKQs*3!F3>TiWPR%Qvp*7?y4E-ZM8X<~7(+6w_RH!&yHl ztK?Y7t6^?5zn1AYETic$7LOVzf3LaP0g)5N^gTt~>UT1&!2oiiLW~V#4ZzO`qPS1e zIYq#u7{iF#`-Sz0zO|1SP^Jl(AoJ%~6+3a2R$p`zAhpaP*gohL)&yo!?9w&^YoK)QpC2 z@uy`#q!0kmHrsHfB}gNrG@b@^pcE8s2|hNb$C@7|5=wF+gc5`fE%(!^=iMd{sfe|S z`BpvKTVy`#M2|W~5*t?&e;g|2G?+RA^R294f;>g-;Zn~m##ql8n)>dsw^Ke5TV0x1 zl8tx=;ZMEHrGZA_N~q+FmMr93jTYWzbp-v>P6I|pGmuDu@$sO@(~wz`ZSbHR#!Vt< z6nn6^y&ka~>nt$R4y+{PcMxr$af5e!A_nu;fB>ej8EDtAS8oj45mel z&FWm31dHBiFtMGi)5e6f?)*|_vh|S0V1uOFh@zww3wH4n&h#H}g(q-mjb~A` zRGr34HNHZzp)KjEf5Wn|JZFbGj7a!)NR(n5lv65}cFKR%VhazRl)bskayc-eToAlJ z#=DX~O81}~j%U$sEOilTkNqj%z_j`e`>SaEDc|*I%iF!a$^d?o_XCVrenv>2l@dQn zdykBE`8D}bpVGeLbAS14zwXfA`di#%{{Yp?{_PMyN_&YBeF0FsX1f74z2FVesAna{`Rq&UA$ck7V1R?g2kfyTjULw=q25c=-^OFYlTX@~xu z_YgpkM`fNr@_m&b(7XJ3SnhL^w9NwZ#d%VM{XO3hV9NHn$o~M#PRsgtzZnR)Ue`1N zJPOct{XgIC0?GWQQV*1^0KcX^#^mYQ=HcVEhyK?0e=Wpt?DI%p`?U@FSKOrZ-?Poj zU#7B8>2GjkZ>#=OF$4bq4Q~Gc(>?fRx~c85h(9WX{W0JF0Gy83FUN&{@t*Xiggg3GxPzWc?-XE17Od?Q(#A${>D{_Zc*I{s={ie3B>7L_kT%Cu{ zLr4?!&vL3DNeOfCG)etC+}_HkWxi&H-_w1`@NZA|(cSuQxmlUoaeODLoBsf9=h#fF zwjw9u)D-@k%rWrV*rI$0ZEG$(U#9c6_zja8#L;i|zEtt-8L}x7#hVWw`*jEO&QKcC a7II+`X#Oh3Q`j750vLL|zT$olHUHVTI%V7d diff --git a/projects/mtg/bin/Res/themes/Green/backdrop.jpg b/projects/mtg/bin/Res/themes/Green/backdrop.jpg index b2c8b8dc0825ea5b9dbb73fd5b24c6db7dfc30c6..427da75400cbf7ee19528a27315a48f23afe4dc3 100644 GIT binary patch literal 37299 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

Ufrb0ztH+oOU9X-yv#|dj-$C- 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 literal 13348 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 I&mU|51IRn(umAu6 diff --git a/projects/mtg/bin/Res/themes/White Shrine/backdrop.JPG b/projects/mtg/bin/Res/themes/White Shrine/backdrop.JPG index b881729aa21e4ef7ee1f0629e0bed81fdeb80747..aa16211a25dece903d9c86aee507593365873562 100644 GIT binary patch literal 25075 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 literal 21649 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 kNE$*`B04J^%m! diff --git a/projects/mtg/src/ActionStack.cpp b/projects/mtg/src/ActionStack.cpp index 7093c2271..8d5664f2f 100644 --- a/projects/mtg/src/ActionStack.cpp +++ b/projects/mtg/src/ActionStack.cpp @@ -1220,11 +1220,11 @@ void ActionStack::Render() JRenderer * renderer = JRenderer::GetInstance(); //stack shadow - renderer->FillRoundRect(x0 - 7, y0+2, width + 17, height + 2, 9.0f, ARGB(128,0,0,0)); + //renderer->FillRoundRect(x0 - 7, y0+2, width + 17, height + 2, 9.0f, ARGB(128,0,0,0)); //stack fill - renderer->FillRoundRect(x0 - 7, y0+2, width + 17, height + 2, 9.0f, ARGB(200,10,10,10)); + renderer->FillRect(x0 - 7, y0+2, width + 17, height + 2, ARGB(245,10,10,10)); //stack border - renderer->DrawRoundRect(x0 - 7, y0+2, width + 17, height + 2, 9.0f, ARGB(160,240,240,240)); + renderer->DrawRect(x0 - 7, y0+2, width + 17, height + 2, ARGB(160,240,240,240)); std::ostringstream stream; // WALDORF - changed "interrupt ?" to "Interrupt?". Don't display count down diff --git a/projects/mtg/src/GuiBackground.cpp b/projects/mtg/src/GuiBackground.cpp index 20bd3fdfa..fba1877d6 100644 --- a/projects/mtg/src/GuiBackground.cpp +++ b/projects/mtg/src/GuiBackground.cpp @@ -31,7 +31,7 @@ void GuiBackground::Render() if (quad.get()) { quad->mWidth = 480.f; - quad->mHeight = 255.f; - renderer->RenderQuad(quad.get(), 0, 18); + quad->mHeight = 272.f; + renderer->RenderQuad(quad.get(), 0, 0); } } diff --git a/projects/mtg/src/GuiFrame.cpp b/projects/mtg/src/GuiFrame.cpp index 39d1ac33a..89f49b64f 100644 --- a/projects/mtg/src/GuiFrame.cpp +++ b/projects/mtg/src/GuiFrame.cpp @@ -6,9 +6,9 @@ GuiFrame::GuiFrame(GameObserver* observer) : GuiLayer(observer) { - if (observer->getResourceManager()) - { - if (observer->getResourceManager()->GetTexture("wood.png")) + //if (observer->getResourceManager()) + //{ + /*if (observer->getResourceManager()->GetTexture("wood.png")) { wood = observer->getResourceManager()->RetrieveQuad("wood.png", 0, 0, 0, 0); wood->mHeight = 32.f; @@ -17,9 +17,9 @@ GuiFrame::GuiFrame(GameObserver* observer) else { GameApp::systemError += "Can't load wood texture : " __FILE__ "\n"; - } + }*/ - if (observer->getResourceManager()->GetTexture("gold.png")) + /*if (observer->getResourceManager()->GetTexture("gold.png")) { gold1 = observer->getResourceManager()->RetrieveQuad("gold.png", 0, 0, SCREEN_WIDTH, 6, "gold1"); gold2 = observer->getResourceManager()->RetrieveQuad("gold.png", 0, 6, SCREEN_WIDTH, 6, "gold2"); @@ -30,9 +30,9 @@ GuiFrame::GuiFrame(GameObserver* observer) gold2->SetColor(ARGB(127, 255, 255, 255)); gold2->SetHFlip(true); } - } - } - step = 0.0; + }*/ + //} + //step = 0.0; } @@ -42,12 +42,12 @@ GuiFrame::~GuiFrame() void GuiFrame::Render() { - JRenderer* renderer = JRenderer::GetInstance(); + /*JRenderer* renderer = JRenderer::GetInstance(); float sized = step / 4; if (sized > SCREEN_WIDTH) sized -= SCREEN_WIDTH; - renderer->RenderQuad(wood.get(), 0, 0); - if (gold1.get()) + renderer->RenderQuad(wood.get(), 0, 0);*/ + /*if (gold1.get()) { renderer->RenderQuad(gold1.get(), -sized, 16); renderer->RenderQuad(gold1.get(), -sized + 479, 16); @@ -64,12 +64,12 @@ void GuiFrame::Render() renderer->RenderQuad(gold2.get(), step / 2, 16); renderer->RenderQuad(gold2.get(), step / 2 - 479, 16); } - } + }*/ } void GuiFrame::Update(float dt) { - step += dt * 5; + /*step += dt * 5; if (step > 2 * SCREEN_WIDTH) - step -= 2 * SCREEN_WIDTH; + step -= 2 * SCREEN_WIDTH;*/ } diff --git a/projects/mtg/src/GuiPhaseBar.cpp b/projects/mtg/src/GuiPhaseBar.cpp index ffb541c3f..87e73ca81 100644 --- a/projects/mtg/src/GuiPhaseBar.cpp +++ b/projects/mtg/src/GuiPhaseBar.cpp @@ -24,7 +24,7 @@ }; */ -const float GuiPhaseBar::zoom_big = (float)(1.5 * 1.4); +const float GuiPhaseBar::zoom_big = (float)(1.5 * 1.2); const float GuiPhaseBar::zoom_small = 1.5; const float GuiPhaseBar::step = M_PI/6.0f; diff --git a/projects/mtg/src/GuiPlay.cpp b/projects/mtg/src/GuiPlay.cpp index d9ebce42f..97076821a 100644 --- a/projects/mtg/src/GuiPlay.cpp +++ b/projects/mtg/src/GuiPlay.cpp @@ -160,10 +160,10 @@ void GuiPlay::BattleField::Update(float dt) void GuiPlay::BattleField::Render() { if (height > 3) - JRenderer::GetInstance()->FillRect(0, SCREEN_HEIGHT / 2 + 10 - height / 2, 480, height, ARGB(127, red, 0, 0)); - //JQuadPtr fillblack = WResourceManager::Instance()->RetrieveTempQuad("fillblack.png", TEXTURE_SUB_5551); - //if (fillblack.get() && height > 3)//mask - //JRenderer::GetInstance()->RenderQuad(fillblack.get(), 0, 70.f, 0, 0.5f, 0.5f); + { + JRenderer::GetInstance()->FillRect(0, SCREEN_HEIGHT / 2 + 8.5f - height / 2, 480, height, ARGB(127, red, 0, 0)); + JRenderer::GetInstance()->DrawRect(0, SCREEN_HEIGHT / 2 + 8.5f - height / 2, 480, height, ARGB(255, 255, 165, 0)); + } } GuiPlay::GuiPlay(DuelLayers* view) : From c7b9e6f9b8edd7a1e07e868c29877aec0bbb502d Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sun, 11 Oct 2015 23:04:28 +0800 Subject: [PATCH 189/249] fix avatar scaling on guicombat, border on combat --- projects/mtg/src/ActionStack.cpp | 4 ++-- projects/mtg/src/CardGui.cpp | 10 +++++----- projects/mtg/src/GuiCombat.cpp | 2 ++ projects/mtg/src/GuiPhaseBar.cpp | 2 +- projects/mtg/src/GuiPlay.cpp | 3 ++- 5 files changed, 12 insertions(+), 9 deletions(-) diff --git a/projects/mtg/src/ActionStack.cpp b/projects/mtg/src/ActionStack.cpp index 8d5664f2f..2bf4c5d0b 100644 --- a/projects/mtg/src/ActionStack.cpp +++ b/projects/mtg/src/ActionStack.cpp @@ -1222,9 +1222,9 @@ void ActionStack::Render() //stack shadow //renderer->FillRoundRect(x0 - 7, y0+2, width + 17, height + 2, 9.0f, ARGB(128,0,0,0)); //stack fill - renderer->FillRect(x0 - 7, y0+2, width + 17, height + 2, ARGB(245,10,10,10)); + renderer->FillRect(x0 - 7, y0+2, width + 17, height + 14, ARGB(215,10,10,10)); //stack border - renderer->DrawRect(x0 - 7, y0+2, width + 17, height + 2, ARGB(160,240,240,240)); + renderer->DrawRect(x0 - 7, y0+2, width + 17, height + 14, ARGB(180,240,240,240)); std::ostringstream stream; // WALDORF - changed "interrupt ?" to "Interrupt?". Don't display count down diff --git a/projects/mtg/src/CardGui.cpp b/projects/mtg/src/CardGui.cpp index 511483a5e..bd5c83733 100644 --- a/projects/mtg/src/CardGui.cpp +++ b/projects/mtg/src/CardGui.cpp @@ -1076,19 +1076,19 @@ void CardGui::RenderBig(MTGCard* card, const Pos& pos, bool thumb, bool noborder if(cardsetname == "2ED"||cardsetname == "RV"||cardsetname == "4ED"||cardsetname == "5ED"||cardsetname == "6ED"||cardsetname == "7ED"||cardsetname == "8ED"||cardsetname == "9ED"||cardsetname == "CHR") { //like white border - renderer->FillRoundRect(x-92,pos.actY-128, (scale * quad->mWidth)-10, (scale * quad->mHeight)-11, 9.0f,ARGB(255,248,248,255)); + renderer->FillRoundRect(x-92,pos.actY-130, (scale * quad->mWidth)-10, (scale * quad->mHeight)-11, 9.0f,ARGB(255,248,248,255)); //black thin line to simulate card edge - renderer->DrawRoundRect(x-92,pos.actY-128, (scale * quad->mWidth)-10, (scale * quad->mHeight)-11, 9.0f,ARGB(150,20,20,20)); + renderer->DrawRoundRect(x-92,pos.actY-130, (scale * quad->mWidth)-10, (scale * quad->mHeight)-11, 9.0f,ARGB(150,20,20,20)); } else { //like black border - renderer->FillRoundRect(x-92,pos.actY-128, (scale * quad->mWidth)-10, (scale * quad->mHeight)-11, 9.0f,ARGB(255,10,10,10)); + renderer->FillRoundRect(x-92,pos.actY-130, (scale * quad->mWidth)-10, (scale * quad->mHeight)-11, 9.0f,ARGB(255,10,10,10)); //white thin line to simulate card edge - renderer->DrawRoundRect(x-92,pos.actY-128, (scale * quad->mWidth)-10, (scale * quad->mHeight)-11, 9.0f,ARGB(50,240,240,240)); + renderer->DrawRoundRect(x-92,pos.actY-130, (scale * quad->mWidth)-10, (scale * quad->mHeight)-11, 9.0f,ARGB(50,240,240,240)); } //render card image - renderer->RenderQuad(quad.get(), x, pos.actY, pos.actT, scale-0.02f, scale-0.02f); + renderer->RenderQuad(quad.get(), x, pos.actY-2, pos.actT, scale-0.02f, scale-0.02f); } else renderer->RenderQuad(quad.get(), x, pos.actY, pos.actT, scale, scale); diff --git a/projects/mtg/src/GuiCombat.cpp b/projects/mtg/src/GuiCombat.cpp index 129352d59..2e367ce28 100644 --- a/projects/mtg/src/GuiCombat.cpp +++ b/projects/mtg/src/GuiCombat.cpp @@ -483,6 +483,8 @@ void GuiCombat::Render() } else { + observer->opponent()->getIcon()->mHeight = 50.f; + observer->opponent()->getIcon()->mWidth = 35.f; observer->opponent()->getIcon()->SetHotSpot(18, 25); enemy_avatar.Render(observer->opponent()->getIcon().get()); } diff --git a/projects/mtg/src/GuiPhaseBar.cpp b/projects/mtg/src/GuiPhaseBar.cpp index 87e73ca81..7d774f44a 100644 --- a/projects/mtg/src/GuiPhaseBar.cpp +++ b/projects/mtg/src/GuiPhaseBar.cpp @@ -24,7 +24,7 @@ }; */ -const float GuiPhaseBar::zoom_big = (float)(1.5 * 1.2); +const float GuiPhaseBar::zoom_big = (float)(1.5 * 1.25); const float GuiPhaseBar::zoom_small = 1.5; const float GuiPhaseBar::step = M_PI/6.0f; diff --git a/projects/mtg/src/GuiPlay.cpp b/projects/mtg/src/GuiPlay.cpp index 97076821a..59a5a138c 100644 --- a/projects/mtg/src/GuiPlay.cpp +++ b/projects/mtg/src/GuiPlay.cpp @@ -162,7 +162,8 @@ void GuiPlay::BattleField::Render() if (height > 3) { JRenderer::GetInstance()->FillRect(0, SCREEN_HEIGHT / 2 + 8.5f - height / 2, 480, height, ARGB(127, red, 0, 0)); - JRenderer::GetInstance()->DrawRect(0, SCREEN_HEIGHT / 2 + 8.5f - height / 2, 480, height, ARGB(255, 255, 165, 0)); + if(red > 1) + JRenderer::GetInstance()->DrawRect(-2, SCREEN_HEIGHT / 2 + 8.5f - height / 2, 484, height, ARGB(255, 255, 165, 0)); } } From 94620504da4e98ae21aa7de4c8fa332e280225c2 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 12 Oct 2015 13:00:05 +0800 Subject: [PATCH 190/249] fix urza lands the alias is used for checking of "urzatron". revised this because when using if then else in the activation makes the mana ability goes to the stack --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 15 +++++++++++---- projects/mtg/include/AllAbilities.h | 7 +++++++ projects/mtg/include/MTGGameZones.h | 2 ++ projects/mtg/src/MTGGameZones.cpp | 12 ++++++++++++ 4 files changed, 32 insertions(+), 4 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 9bd88df8e..d5701472c 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -80872,7 +80872,8 @@ toughness=1 [/card] [card] name=River of Tears -auto={t}:name(Add Mana) if type(land[fresh]|mybattlefield)~morethan~0 then add{B} else add{U} +auto=aslongas(land[fresh]|mybattlefield) {T}:add{B} >0 +auto=aslongas(land[fresh]|mybattlefield) {T}:add{U} <1 text={T}: Add {U} to your mana pool. If you played a land this turn, add {B} to your mana pool instead. type=Land [/card] @@ -106988,21 +106989,27 @@ type=Artifact [/card] [card] name=Urza's Mine -auto={t}:name(Add Mana) if type(Urza's Tower|mybattlefield)~morethan~0,type(Urza's Power Plant|mybattlefield)~morethan~0 then add{2} else add{1} +alias=4192 +auto=this(variable{urzatron} >0) produceextra:{1} +auto={T}:add{1} text={T}: Add {1} to your mana pool. If you control an Urza's Power-Plant and an Urza's Tower, add {2} to your mana pool instead. type=Land subtype=Urza's Mine [/card] [card] name=Urza's Power Plant -auto={t}:name(Add Mana) if type(Urza's Tower|mybattlefield)~morethan~0,type(Urza's Mine|mybattlefield)~morethan~0 then add{2} else add{1} +alias=4193 +auto=this(variable{urzatron} >0) produceextra:{1} +auto={T}:add{1} text={T}: Add {1} to your mana pool. If you control an Urza's Mine and an Urza's Tower, add {2} to your mana pool instead. type=Land subtype=Urza's Power-Plant [/card] [card] name=Urza's Tower -auto={t}:name(Add Mana) if type(Urza's Power Plant|mybattlefield)~morethan~0,type(Urza's Mine|mybattlefield)~morethan~0 then add{3} else add{1} +alias=4194 +auto=this(variable{urzatron} >0) produceextra:{2} +auto={T}:add{1} text={T}: Add {1} to your mana pool. If you control an Urza's Mine and an Urza's Power-Plant, add {3} to your mana pool instead. type=Land subtype=Urza's Tower diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index 538dbf4da..c9fe5e22c 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -688,6 +688,13 @@ private: { intValue = target->controller()->opponent()->game->hand->nb_cards; } + else if (s == "urzatron")//Urza lands + { + if(card->controller()->game->battlefield->hasAlias(4192) && card->controller()->game->battlefield->hasAlias(4193) && card->controller()->game->battlefield->hasAlias(4194)) + intValue = 1; + else + intValue = 0; + } else if (s == "worshipped")//Worship { if(card->controller()->game->battlefield->hasType("creature")) diff --git a/projects/mtg/include/MTGGameZones.h b/projects/mtg/include/MTGGameZones.h index 97687d006..7662311d0 100644 --- a/projects/mtg/include/MTGGameZones.h +++ b/projects/mtg/include/MTGGameZones.h @@ -103,6 +103,8 @@ class MTGGameZone { //returns true if one of the cards in the zone has the ability bool hasAbility(int ability); + //returns true if one of the cards in the zone has the alias + bool hasAlias(int alias); //returns true if one of the cards in the zone has the type bool hasType(const char * value); diff --git a/projects/mtg/src/MTGGameZones.cpp b/projects/mtg/src/MTGGameZones.cpp index 24203ed99..bcae61f0c 100644 --- a/projects/mtg/src/MTGGameZones.cpp +++ b/projects/mtg/src/MTGGameZones.cpp @@ -764,6 +764,18 @@ bool MTGGameZone::hasAbility(int ability) return false; } +bool MTGGameZone::hasAlias(int alias) +{ + for (int i = 0; i < (nb_cards); i++) + { + if (cards[i]->alias == alias) + { + return true; + } + } + return false; +} + int MTGGameZone::seenThisTurn(TargetChooser * tc, int castMethod, bool lastTurn) { //The following 2 lines modify the passed TargetChooser. Call this function with care :/ From 8fe5000ce13fc64dd5d493b742b1ce2514c28ea4 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 12 Oct 2015 19:54:03 +0800 Subject: [PATCH 191/249] polished action stack --- projects/mtg/src/ActionStack.cpp | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/projects/mtg/src/ActionStack.cpp b/projects/mtg/src/ActionStack.cpp index 2bf4c5d0b..d6e59cf9a 100644 --- a/projects/mtg/src/ActionStack.cpp +++ b/projects/mtg/src/ActionStack.cpp @@ -93,8 +93,21 @@ void Interruptible::Render(MTGCardInstance * source, JQuad * targetQuad, string WFont * mFont = observer->getResourceManager()->GetWFont(Fonts::MAIN_FONT); mFont->SetColor(ARGB(255,255,255,255)); mFont->SetScale(DEFAULT_MAIN_FONT_SCALE); - - mFont->DrawString(_(action).c_str(), x + 35, y + GetVerticalTextOffset(), JGETEXT_LEFT); + + if (!targetQuad) + { + if(source->controller()->isHuman() && source->controller()->opponent()->isAI() && !alt2.size() && _(action).c_str() == source->name) + mFont->DrawString("You play:", x + 35, y-15 + GetVerticalTextOffset(), JGETEXT_LEFT); + else if(source->controller()->isAI() && source->controller()->opponent()->isHuman() && !alt2.size() && _(action).c_str() == source->name) + mFont->DrawString("Opponent plays:", x + 35, y-15 + GetVerticalTextOffset(), JGETEXT_LEFT); + mFont->DrawString(_(action).c_str(), x + 35, y + GetVerticalTextOffset(), JGETEXT_LEFT); + //mFont->DrawString(">>>", x + 35, y+5 + GetVerticalTextOffset(), JGETEXT_LEFT); + } + else + { + mFont->DrawString(">", x + 32, y + GetVerticalTextOffset(), JGETEXT_LEFT); + mFont->DrawString(_(action).c_str(), x + 75, y + GetVerticalTextOffset(), JGETEXT_LEFT); + } JRenderer * renderer = JRenderer::GetInstance(); JQuadPtr quad = observer->getResourceManager()->RetrieveCard(source, CACHE_THUMB); if (!quad.get()) @@ -123,12 +136,12 @@ void Interruptible::Render(MTGCardInstance * source, JQuad * targetQuad, string targetQuad->SetColor(ARGB(255,255,255,255)); targetQuad->SetHotSpot(targetQuad->mWidth / 2, targetQuad->mHeight / 2); float scale = mHeight / targetQuad->mHeight; - renderer->RenderQuad(targetQuad, x + 150, y + ((mHeight - targetQuad->mHeight) / 2) + targetQuad->mHotSpotY, 0, scale, scale); + renderer->RenderQuad(targetQuad, x + 55, y + ((mHeight - targetQuad->mHeight) / 2) + targetQuad->mHotSpotY, 0, scale, scale); targetQuad->SetHotSpot(backupX, backupY); } else if (alt2.size()) { - mFont->DrawString(_(alt2).c_str(), x + 120, y + GetVerticalTextOffset()); + mFont->DrawString(_(alt2).c_str(), x + 35, y+15 + GetVerticalTextOffset()); } } @@ -1241,7 +1254,7 @@ void ActionStack::Render() mFont->DrawString(stream.str(), x0 + 5, currenty); // static const float kIconVerticalOffset = 24; - static const float kIconHorizontalOffset = 9; + static const float kIconHorizontalOffset = 10; static const float kBeforeIconSpace = 10; //Render "interrupt?" text + possible actions From 9a66b0c6e4dfc7ced5c194cdd95f6e5b8317854f Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Tue, 13 Oct 2015 19:27:25 +0800 Subject: [PATCH 192/249] some fix and polished static mana and action stack I moved the target quad near the source card and moved the action string forward so there is no overlapping of action string and the target quad if the action string is too long... --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 5 ++- projects/mtg/src/ActionStack.cpp | 41 ++++++++++++-------- projects/mtg/src/GuiCombat.cpp | 2 +- projects/mtg/src/GuiMana.cpp | 8 ++-- 4 files changed, 33 insertions(+), 23 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index d5701472c..9531c0e06 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -8140,7 +8140,7 @@ toughness=2 [/card] [card] name=Battleflight Eagle -auto=target(creature|battlefield) 2/2 ueot && flying ueot +auto=target(creature|battlefield) transforms((,newability[2/2],newability[flying])) ueot abilities=flying text=Flying -- When Battleflight Eagle enters the battlefield, target creature gets +2/+2 and gains flying until end of turn. mana={4}{W} @@ -37095,6 +37095,7 @@ toughness=3 [/card] [card] name=Fylgja +target=creature auto=all(this) counter(0/0,4,Healing) auto={C(0/0,-1,Healing)}:prevent:1 auto={2}{W}:all(this) counter(0/0,1,Healing) @@ -45155,7 +45156,7 @@ toughness=5 [/card] [card] name=Hellkite Hatchling -auto=may target(other creature|mybattlefield) sacrifice && counter(1/1,1) all(this) && all(this) transforms((,flying,trample)) forever +auto=may target(other creature|mybattlefield) sacrifice && counter(1/1,1) all(this) && all(this) transforms((,newability[flying],newability[trample])) forever text=Devour 1 (As this enters the battlefield, you may sacrifice any number of creatures. This creature enters the battlefield with that many +1/+1 counters on it.) -- Hellkite Hatchling has flying and trample if it devoured a creature. mana={2}{R}{G} type=Creature diff --git a/projects/mtg/src/ActionStack.cpp b/projects/mtg/src/ActionStack.cpp index d6e59cf9a..5fd4c6f3c 100644 --- a/projects/mtg/src/ActionStack.cpp +++ b/projects/mtg/src/ActionStack.cpp @@ -93,22 +93,27 @@ void Interruptible::Render(MTGCardInstance * source, JQuad * targetQuad, string WFont * mFont = observer->getResourceManager()->GetWFont(Fonts::MAIN_FONT); mFont->SetColor(ARGB(255,255,255,255)); mFont->SetScale(DEFAULT_MAIN_FONT_SCALE); + JRenderer * renderer = JRenderer::GetInstance(); if (!targetQuad) { - if(source->controller()->isHuman() && source->controller()->opponent()->isAI() && !alt2.size() && _(action).c_str() == source->name) - mFont->DrawString("You play:", x + 35, y-15 + GetVerticalTextOffset(), JGETEXT_LEFT); + /*if(source->controller()->isHuman() && source->controller()->opponent()->isAI() && !alt2.size() && _(action).c_str() == source->name) + mFont->DrawString("You play ", x + 35, y-15 + GetVerticalTextOffset(), JGETEXT_LEFT); else if(source->controller()->isAI() && source->controller()->opponent()->isHuman() && !alt2.size() && _(action).c_str() == source->name) - mFont->DrawString("Opponent plays:", x + 35, y-15 + GetVerticalTextOffset(), JGETEXT_LEFT); + mFont->DrawString("Opponent plays ", x + 35, y-15 + GetVerticalTextOffset(), JGETEXT_LEFT);*/ mFont->DrawString(_(action).c_str(), x + 35, y + GetVerticalTextOffset(), JGETEXT_LEFT); - //mFont->DrawString(">>>", x + 35, y+5 + GetVerticalTextOffset(), JGETEXT_LEFT); } else { + renderer->FillRect(x-2,y-16 + GetVerticalTextOffset(), 73, 43, ARGB(235,10,10,10)); + /*if(source->controller()->isHuman() && source->controller()->opponent()->isAI()) + renderer->DrawRect(x-2,y-16 + GetVerticalTextOffset(), 73, 43, ARGB(245,0,255,0)); + else + renderer->DrawRect(x-2,y-16 + GetVerticalTextOffset(), 73, 43, ARGB(245,255,0,0));*/ mFont->DrawString(">", x + 32, y + GetVerticalTextOffset(), JGETEXT_LEFT); mFont->DrawString(_(action).c_str(), x + 75, y + GetVerticalTextOffset(), JGETEXT_LEFT); } - JRenderer * renderer = JRenderer::GetInstance(); + JQuadPtr quad = observer->getResourceManager()->RetrieveCard(source, CACHE_THUMB); if (!quad.get()) quad = CardGui::AlternateThumbQuad(source); @@ -1235,10 +1240,14 @@ void ActionStack::Render() //stack shadow //renderer->FillRoundRect(x0 - 7, y0+2, width + 17, height + 2, 9.0f, ARGB(128,0,0,0)); //stack fill - renderer->FillRect(x0 - 7, y0+2, width + 17, height + 14, ARGB(215,10,10,10)); + renderer->FillRect(x0 - 7, y0+2, width + 17, height + 14, ARGB(225,5,5,5)); + //stack highlight + renderer->FillRect(x0 - 6, y0+3, width + 15, 30, ARGB(255,89,89,89)); + //another border + renderer->DrawRect(x0 - 6, y0+33, width + 15, height - 18, ARGB(255,89,89,89)); //stack border - renderer->DrawRect(x0 - 7, y0+2, width + 17, height + 14, ARGB(180,240,240,240)); - + renderer->DrawRect(x0 - 7, y0+2, width + 17, height + 14, ARGB(255,240,240,240)); + std::ostringstream stream; // WALDORF - changed "interrupt ?" to "Interrupt?". Don't display count down // seconds if the user disables auto progressing interrupts by setting the seconds @@ -1251,11 +1260,11 @@ void ActionStack::Render() else stream << _(kInterruptMessageString) << " " << static_cast(timer); - mFont->DrawString(stream.str(), x0 + 5, currenty); + mFont->DrawString(stream.str(), x0 + 5, currenty - 2); // static const float kIconVerticalOffset = 24; static const float kIconHorizontalOffset = 10; - static const float kBeforeIconSpace = 10; + static const float kBeforeIconSpace = 12; //Render "interrupt?" text + possible actions { @@ -1264,25 +1273,25 @@ void ActionStack::Render() if (gModRules.game.canInterrupt()) { - renderer->RenderQuad(pspIcons[7].get(), currentx, kIconVerticalOffset, 0, kGamepadIconSize, kGamepadIconSize); + renderer->RenderQuad(pspIcons[7].get(), currentx, kIconVerticalOffset - 2, 0, kGamepadIconSize, kGamepadIconSize); currentx+= kIconHorizontalOffset; - mFont->DrawString(_(kInterruptString), currentx, kIconVerticalOffset - 6); + mFont->DrawString(_(kInterruptString), currentx, kIconVerticalOffset - 8); currentx+= mFont->GetStringWidth(_(kInterruptString).c_str()) + kBeforeIconSpace; } noBtnXOffset = static_cast(currentx); - renderer->RenderQuad(pspIcons[4].get(), currentx, kIconVerticalOffset, 0, kGamepadIconSize, kGamepadIconSize); + renderer->RenderQuad(pspIcons[4].get(), currentx, kIconVerticalOffset - 2, 0, kGamepadIconSize, kGamepadIconSize); currentx+= kIconHorizontalOffset; - mFont->DrawString(_(kNoString), currentx, kIconVerticalOffset - 6); + mFont->DrawString(_(kNoString), currentx, kIconVerticalOffset - 8); currentx+= mFont->GetStringWidth(_(kNoString).c_str()) + kBeforeIconSpace; noToAllBtnXOffset = static_cast(currentx); if (mObjects.size() > 1) { - renderer->RenderQuad(pspIcons[6].get(), currentx, kIconVerticalOffset, 0, kGamepadIconSize, kGamepadIconSize); + renderer->RenderQuad(pspIcons[6].get(), currentx, kIconVerticalOffset - 2, 0, kGamepadIconSize, kGamepadIconSize); currentx+= kIconHorizontalOffset; - mFont->DrawString(_(kNoToAllString), currentx, kIconVerticalOffset - 6); + mFont->DrawString(_(kNoToAllString), currentx, kIconVerticalOffset - 8); currentx+= mFont->GetStringWidth(_(kNoToAllString).c_str()) + kBeforeIconSpace; } diff --git a/projects/mtg/src/GuiCombat.cpp b/projects/mtg/src/GuiCombat.cpp index 2e367ce28..ad9a05a98 100644 --- a/projects/mtg/src/GuiCombat.cpp +++ b/projects/mtg/src/GuiCombat.cpp @@ -504,7 +504,7 @@ void GuiCombat::Render() ok_quad->SetHotSpot(28, 22); ok.Render(ok_quad.get()); } - renderer->DrawLine(0, SCREEN_HEIGHT / 2 + 10, SCREEN_WIDTH, SCREEN_HEIGHT / 2 + 10, ARGB(255, 255, 64, 0)); + renderer->DrawLine(0, SCREEN_HEIGHT / 2, SCREEN_WIDTH, SCREEN_HEIGHT / 2, ARGB(255, 255, 64, 0)); if (FIRST_STRIKE == step) { WFont * mFont = WResourceManager::Instance()->GetWFont(Fonts::MAIN_FONT); diff --git a/projects/mtg/src/GuiMana.cpp b/projects/mtg/src/GuiMana.cpp index c4ca3d257..e5ab1145c 100644 --- a/projects/mtg/src/GuiMana.cpp +++ b/projects/mtg/src/GuiMana.cpp @@ -262,7 +262,7 @@ void GuiMana::RenderStatic() float x0 = x - 20 * totalColors; x0 = max(40.f, x0); float xEnd = x0 + 20 * totalColors; - r->FillRoundRect(x0, y - 5, static_cast (20 * totalColors + 5), 20, 2, ARGB(128,0,0,0)); + r->FillRoundRect(x0, y - 8, static_cast (20 * totalColors + 5), 20, 2, ARGB(128,0,0,0)); int offset = 0; for (int i = 0; i < Constants::NB_Colors; ++i) @@ -270,10 +270,10 @@ void GuiMana::RenderStatic() if (values[i]) { offset -= 20; - r->RenderQuad(manaIcons[i].get(), xEnd + 15 + offset, y + 5, 0, 0.7f, 0.7f); + r->RenderQuad(manaIcons[i].get(), xEnd + 15 + offset, y + 3, 0, 0.65f, 0.65f); } } - r->FillRoundRect(x0, y, static_cast (20 * totalColors + 5), 8, 2, ARGB(100,0,0,0)); + //r->DrawRoundRect(x0, y - 8, static_cast (20 * totalColors + 5), 20, 2, ARGB(128,255,255,255)); offset = 0; for (int i = 0; i < Constants::NB_Colors; ++i) { @@ -283,7 +283,7 @@ void GuiMana::RenderStatic() char buf[4]; sprintf(buf, "%i", values[i]); mFont->SetColor(ARGB(255,255,255,255)); - mFont->DrawString(buf, xEnd + offset + 9, y); + mFont->DrawString(buf, xEnd + offset + 18, y + 5); } } } From 3635137906794eab05a0645157c0cd9846fe64d2 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Wed, 14 Oct 2015 20:04:29 +0800 Subject: [PATCH 193/249] fix legend rule MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 704.5k If a player controls two or more legendary permanents with the same name, that player chooses one of them, and the rest are put into their owners’ graveyards. This is called the “legend rule.†bury is destroy without regenerate, so when two legends of the same name has indestructible, bury will have no effect... I changed it to put into owners graveyard instead using mover... --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 2 +- projects/mtg/src/MTGRules.cpp | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 9531c0e06..9581a0030 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -90850,7 +90850,7 @@ toughness=1 [/card] [card] name=Skywise Teachings -auto=@movedto(*[-creature]|mystack):pay[{1}{U}] name(Pay 1U mana) token(Djinn Monk,Creature Djinn Monk,2/2,flying,blue) controller +auto=@movedto(*[-creature]|mystack):pay({1}{U}) name(Pay 1U mana) token(Djinn Monk,Creature Djinn Monk,2/2,flying,blue) controller text=Whenever you cast a noncreature spell, you may pay {1}{U}. If you do, put a 2/2 blue Djinn Monk creature token with flying onto the battlefield. mana={3}{U} type=Enchantment diff --git a/projects/mtg/src/MTGRules.cpp b/projects/mtg/src/MTGRules.cpp index 6b982ce95..0fccefa61 100644 --- a/projects/mtg/src/MTGRules.cpp +++ b/projects/mtg/src/MTGRules.cpp @@ -2518,16 +2518,14 @@ int MTGLegendRule::added(MTGCardInstance * card) MultiAbility * multi = NEW MultiAbility(game, game->mLayers->actionLayer()->getMaxId(), card, card, NULL); for(unsigned int i = 0;i < oldCards.size();i++) { - AABuryCard *a = NEW AABuryCard(game, game->mLayers->actionLayer()->getMaxId(), card, oldCards[i]); - a->menu = "Keep New"; + AAMover *a = NEW AAMover(game, game->mLayers->actionLayer()->getMaxId(), card, oldCards[i],"ownergraveyard","Keep New"); a->oneShot = true; multi->Add(a); } multi->oneShot = 1; MTGAbility * a1 = multi; selection.push_back(a1); - AABuryCard *b = NEW AABuryCard(game, game->mLayers->actionLayer()->getMaxId(), card, card); - b->menu = "Keep Old"; + AAMover *b = NEW AAMover(game, game->mLayers->actionLayer()->getMaxId(), card, card,"ownergraveyard","Keep Old"); b->oneShot = true; MTGAbility * b1 = b; selection.push_back(b1); From 626f0677f798edfe60763d2df2d1bd9ade450c9e Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Wed, 14 Oct 2015 21:26:22 +0800 Subject: [PATCH 194/249] Fix profile status on upper left of main menu The profile status on the upper left of main menu should update now when changing user profiles...:) --- projects/mtg/include/GameApp.h | 1 + projects/mtg/include/GameStateMenu.h | 3 +-- projects/mtg/src/GameApp.cpp | 1 + projects/mtg/src/GameStateMenu.cpp | 13 ++++++------- projects/mtg/src/GameStateOptions.cpp | 2 ++ 5 files changed, 11 insertions(+), 9 deletions(-) diff --git a/projects/mtg/include/GameApp.h b/projects/mtg/include/GameApp.h index eeb1c8141..d672e45bf 100644 --- a/projects/mtg/include/GameApp.h +++ b/projects/mtg/include/GameApp.h @@ -73,6 +73,7 @@ public: static hgeParticleSystem * Particles[6]; static bool HasMusic; static string systemError; + static char mynbcardsStr[512]; static JMusic* music; static string currentMusicFile; static void playMusic(string filename = "", bool loop = true); diff --git a/projects/mtg/include/GameStateMenu.h b/projects/mtg/include/GameStateMenu.h index d8fb9106a..6b4b3f205 100644 --- a/projects/mtg/include/GameStateMenu.h +++ b/projects/mtg/include/GameStateMenu.h @@ -24,7 +24,6 @@ private: float mCreditsYPos; int currentState; int mVolume; - char nbcardsStr[400]; vector langs; vector primitives; @@ -46,7 +45,6 @@ private: bool langChoices; void runTest(); //!! void listPrimitives(); - void genNbCardsStr(); //computes the contents of nbCardsStr void ensureMGuiController(); //creates the MGuiController if it doesn't exist string loadRandomWallpaper(); //loads a list of string of textures that can be randolmy shown on the loading screen @@ -66,6 +64,7 @@ public: int nextSetFolder(const string & root, const string & file); // Retrieves the next directory to have matching file void createUsersFirstDeck(int setId); + static void genNbCardsStr(); //computes the contents of nbCardsStr virtual ostream& toString(ostream& out) const; enum diff --git a/projects/mtg/src/GameApp.cpp b/projects/mtg/src/GameApp.cpp index 7dc82def3..c207594c2 100644 --- a/projects/mtg/src/GameApp.cpp +++ b/projects/mtg/src/GameApp.cpp @@ -39,6 +39,7 @@ bool GameApp::HasMusic = true; JMusic * GameApp::music = NULL; string GameApp::currentMusicFile = ""; string GameApp::systemError = ""; +char GameApp::mynbcardsStr[512] = {0}; vector manaIcons; diff --git a/projects/mtg/src/GameStateMenu.cpp b/projects/mtg/src/GameStateMenu.cpp index d10fcaa2d..9845c291e 100644 --- a/projects/mtg/src/GameStateMenu.cpp +++ b/projects/mtg/src/GameStateMenu.cpp @@ -164,22 +164,22 @@ void GameStateMenu::genNbCardsStr() PlayerData * playerdata = NEW PlayerData(MTGCollection()); size_t totalUnique = MTGCollection()->primitives.size(); size_t totalPrints = MTGCollection()->totalCards(); - + if (totalUnique != totalPrints) { if (playerdata && !options[Options::ACTIVE_PROFILE].isDefault()) - sprintf(nbcardsStr, _("%s: %i cards (%i) (%i unique)").c_str(), options[Options::ACTIVE_PROFILE].str.c_str(), + sprintf(GameApp::mynbcardsStr, _("%s: %i cards (%i) (%i unique)").c_str(), options[Options::ACTIVE_PROFILE].str.c_str(), playerdata->collection->totalCards(), totalPrints,totalUnique); else - sprintf(nbcardsStr, _("%i cards (%i unique)").c_str(),totalPrints,totalUnique); + sprintf(GameApp::mynbcardsStr, _("%i cards (%i unique)").c_str(),totalPrints,totalUnique); } else { if (playerdata && !options[Options::ACTIVE_PROFILE].isDefault()) - sprintf(nbcardsStr, _("%s: %i cards (%i)").c_str(), options[Options::ACTIVE_PROFILE].str.c_str(), + sprintf(GameApp::mynbcardsStr, _("%s: %i cards (%i)").c_str(), options[Options::ACTIVE_PROFILE].str.c_str(), playerdata->collection->totalCards(), totalPrints); else - sprintf(nbcardsStr, _("%i cards").c_str(),totalPrints); + sprintf(GameApp::mynbcardsStr, _("%i cards").c_str(),totalPrints); } SAFE_DELETE(playerdata); @@ -730,7 +730,7 @@ void GameStateMenu::RenderTopMenu() mFont->SetScale(DEFAULT_MAIN_FONT_SCALE); mFont->SetColor(ARGB(128,255,255,255)); mFont->DrawString(GAME_VERSION, rightTextPos, 5, JGETEXT_RIGHT); - mFont->DrawString(nbcardsStr, leftTextPos, 5); + mFont->DrawString(GameApp::mynbcardsStr, leftTextPos, 5); renderer->FillRect(leftTextPos, 26, 104, 8, ARGB(255, 100, 90, 60)); renderer->FillRect(leftTextPos + 2, 28, (float)(gamePercentComplete()), 4, ARGB(255,220,200, 125)); char buf[512]; @@ -964,7 +964,6 @@ ostream& GameStateMenu::toString(ostream& out) const << " ; mCreditsYPos : " << mCreditsYPos << " ; currentState : " << currentState << " ; mVolume : " << mVolume - << " ; nbcardsStr : " << nbcardsStr << " ; mCurrentSetName : " << mCurrentSetName << " ; mCurrentSetFileName : " << mCurrentSetFileName << " ; mReadConf : " << mReadConf diff --git a/projects/mtg/src/GameStateOptions.cpp b/projects/mtg/src/GameStateOptions.cpp index 5817744fe..95d4856c9 100644 --- a/projects/mtg/src/GameStateOptions.cpp +++ b/projects/mtg/src/GameStateOptions.cpp @@ -1,6 +1,7 @@ #include "PrecompiledHeader.h" #include "GameStateOptions.h" +#include "GameStateMenu.h" #include "GameApp.h" #include "OptionItem.h" #include "SimpleMenu.h" @@ -167,6 +168,7 @@ void GameStateOptions::Update(float dt) JSoundSystem::GetInstance()->SetMusicVolume(options[Options::MUSICVOLUME].number); mParent->DoTransition(TRANSITION_FADE, GAME_STATE_MENU); mState = SHOW_OPTIONS; + GameStateMenu::genNbCardsStr(); break; case WGuiBase::CONFIRM_NEED: optionsTabs->yieldFocus(); From 297206b054d7cbff9f8874aa3f384373148bf8bc Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Wed, 14 Oct 2015 21:33:12 +0800 Subject: [PATCH 195/249] Fix update profile stat after buying cards profile stats on the upper left of main menu should update after buying some cards :) --- projects/mtg/src/GameStateShop.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/projects/mtg/src/GameStateShop.cpp b/projects/mtg/src/GameStateShop.cpp index 84ca3f6e4..d7f6f76b5 100644 --- a/projects/mtg/src/GameStateShop.cpp +++ b/projects/mtg/src/GameStateShop.cpp @@ -5,6 +5,7 @@ #include #include "GameStateShop.h" +#include "GameStateMenu.h" #include "GameApp.h" #include "MTGDeck.h" #include "MTGPack.h" @@ -840,6 +841,7 @@ void GameStateShop::ButtonPressed(int controllerId, int controlId) mStage = STAGE_SHOP_SHOP; mParent->DoTransition(TRANSITION_FADE, GAME_STATE_MENU); save(); + GameStateMenu::genNbCardsStr(); break; case 14: mStage = STAGE_SHOP_TASKS; From 0f0bdd7d13b247602fe85ec4eb18f6d60c620cb4 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Wed, 14 Oct 2015 22:14:13 +0800 Subject: [PATCH 196/249] Fix Aura Curse Aura Curse that targets a player should update its position after casting. --- projects/mtg/src/GuiPlay.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/projects/mtg/src/GuiPlay.cpp b/projects/mtg/src/GuiPlay.cpp index 59a5a138c..437ff4945 100644 --- a/projects/mtg/src/GuiPlay.cpp +++ b/projects/mtg/src/GuiPlay.cpp @@ -195,7 +195,7 @@ void GuiPlay::Replace() for (iterator it = cards.begin(); it != end_spells; ++it) if (!(*it)->card->target) { - if((!(*it)->card->hasSubtype(Subtypes::TYPE_AURA)|| ((*it)->card->hasSubtype(Subtypes::TYPE_AURA) && (*it)->card->playerTarget)) && !(*it)->card->hasType(Subtypes::TYPE_PLANESWALKER)) + if((!(*it)->card->hasSubtype(Subtypes::TYPE_AURA)|| ((*it)->card->hasSubtype(Subtypes::TYPE_AURA) && !(*it)->card->playerTarget)) && !(*it)->card->hasType(Subtypes::TYPE_PLANESWALKER)) { if (mpDuelLayers->getRenderedPlayer() == (*it)->card->controller()) ++selfSpellsN; @@ -231,7 +231,7 @@ void GuiPlay::Replace() for (iterator it = cards.begin(); it != end_spells; ++it) if (!(*it)->card->target) { - if((!(*it)->card->hasSubtype(Subtypes::TYPE_AURA)|| ((*it)->card->hasSubtype(Subtypes::TYPE_AURA) && (*it)->card->playerTarget)) && !(*it)->card->hasType(Subtypes::TYPE_PLANESWALKER)) + if((!(*it)->card->hasSubtype(Subtypes::TYPE_AURA)|| ((*it)->card->hasSubtype(Subtypes::TYPE_AURA) && !(*it)->card->playerTarget)) && !(*it)->card->hasType(Subtypes::TYPE_PLANESWALKER)) { if (mpDuelLayers->getRenderedPlayer() == (*it)->card->controller()) selfSpells.Enstack(*it); From 851bd88de6ebfa45fa99fee1911867daebdcb3bb Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 15 Oct 2015 12:23:32 +0800 Subject: [PATCH 197/249] Fix Planeswalker Rule & ABlink --- projects/mtg/src/AllAbilities.cpp | 13 +++++++++++-- projects/mtg/src/MTGRules.cpp | 10 ++++------ 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index 6083f5cf2..938370dfb 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -5271,7 +5271,7 @@ void ABlink::returnCardIntoPlay(MTGCardInstance* _target) { return; } - MTGGameZone * inplay = spell->source->owner->game->inPlay; + /*MTGGameZone * inplay = spell->source->owner->game->inPlay; spell->source->target = NULL; for (int i = game->getRandomGenerator()->random()%inplay->nb_cards;;i = game->getRandomGenerator()->random()%inplay->nb_cards) { @@ -5285,7 +5285,16 @@ void ABlink::returnCardIntoPlay(MTGCardInstance* _target) { this->forceDestroy = 1; return; } - } + }*/ + //replaced with castcard(putinplay) + MTGAbility *a = NEW AACastCard(game, game->mLayers->actionLayer()->getMaxId(), Blinker, Blinker,false,false,false,"","Return to Play",false,true); + a->oneShot = false; + a->canBeInterrupted = false; + a->addToGame(); + SAFE_DELETE(spell); + SAFE_DELETE(tc); + this->forceDestroy = 1; + return; } spell->source->power = spell->source->origpower; spell->source->toughness = spell->source->origtoughness; diff --git a/projects/mtg/src/MTGRules.cpp b/projects/mtg/src/MTGRules.cpp index 0fccefa61..d9628cf8b 100644 --- a/projects/mtg/src/MTGRules.cpp +++ b/projects/mtg/src/MTGRules.cpp @@ -2529,7 +2529,7 @@ int MTGLegendRule::added(MTGCardInstance * card) b->oneShot = true; MTGAbility * b1 = b; selection.push_back(b1); - MTGAbility * menuChoice = NEW MenuAbility(game, game->mLayers->actionLayer()->getMaxId(), card, card,true,selection,card->controller(),"Choose Legend"); + MTGAbility * menuChoice = NEW MenuAbility(game, game->mLayers->actionLayer()->getMaxId(), card, card,true,selection,card->controller(),"Legendary Rule"); menuChoice->addToGame(); } return 1; @@ -2593,20 +2593,18 @@ int MTGPlaneWalkerRule::added(MTGCardInstance * card) MultiAbility * multi = NEW MultiAbility(game,game->mLayers->actionLayer()->getMaxId(), card, card, NULL); for(unsigned int i = 0;i < oldCards.size();i++) { - AABuryCard *a = NEW AABuryCard(game, game->mLayers->actionLayer()->getMaxId(), card, oldCards[i]); - a->menu = "Keep New"; + AAMover *a = NEW AAMover(game, game->mLayers->actionLayer()->getMaxId(), card, oldCards[i],"ownergraveyard","Keep New"); a->oneShot = true; multi->Add(a); } multi->oneShot = 1; MTGAbility * a1 = multi; selection.push_back(a1); - AABuryCard *b = NEW AABuryCard(game, game->mLayers->actionLayer()->getMaxId(), card, card); - b->menu = "Keep Old"; + AAMover *b = NEW AAMover(game, game->mLayers->actionLayer()->getMaxId(), card, card,"ownergraveyard","Keep Old"); b->oneShot = true; MTGAbility * b1 = b; selection.push_back(b1); - MTGAbility * menuChoice = NEW MenuAbility(game, game->mLayers->actionLayer()->getMaxId(), card, card,true,selection,card->controller(),"Choose Planeswalker"); + MTGAbility * menuChoice = NEW MenuAbility(game, game->mLayers->actionLayer()->getMaxId(), card, card,true,selection,card->controller(),"Planeswalker Rule"); menuChoice->addToGame(); } return 1; From 15725c0302194a09d7349cf8c57bb600465bea92 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 15 Oct 2015 18:03:26 +0800 Subject: [PATCH 198/249] bug fix populate absolute value forgot to add abs when adding negative bonuses... --- projects/mtg/src/AllAbilities.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index 938370dfb..188c16eac 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -2566,7 +2566,7 @@ int AACloner::resolve() if(_target->pbonus > 0) spell->source->power = _target->power - _target->pbonus; else - spell->source->power = _target->power + _target->pbonus; + spell->source->power = _target->power + abs(_target->pbonus); if(_target->tbonus > 0) { spell->source->toughness = _target->toughness - _target->tbonus; @@ -2574,8 +2574,8 @@ int AACloner::resolve() } else { - spell->source->toughness = _target->toughness + _target->tbonus; - spell->source->life = _target->toughness + _target->tbonus; + spell->source->toughness = _target->toughness + abs(_target->tbonus); + spell->source->life = _target->toughness + abs(_target->tbonus); } } list::iterator it; From 2819ec01af331b72b9e53ca63c6b5c9aa34fea49 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Fri, 16 Oct 2015 17:02:37 +0800 Subject: [PATCH 199/249] token is excluded... for ABlink --- projects/mtg/include/AllAbilities.h | 2 +- projects/mtg/src/AllAbilities.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index c9fe5e22c..8465cb5d3 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -1440,7 +1440,7 @@ public: } }; -//targetted trigger +//counter trigger class TrCounter: public Trigger { public: diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index 188c16eac..d59749dd9 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -5642,7 +5642,7 @@ void AACastCard::Update(float dt) toCheck->bypassTC = true; TargetChooserFactory tcf(game); TargetChooser * atc = tcf.createTargetChooser(toCheck->spellTargetType,toCheck); - if (toCheck->hasType(Subtypes::TYPE_AURA) && !atc->validTargetsExist()) + if ((toCheck->hasType(Subtypes::TYPE_AURA) && !atc->validTargetsExist())||toCheck->isToken) { processed = true; this->forceDestroy = 1; From 5ede956e7f311102451c2ed31b8b41e647cb5fed Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Fri, 16 Oct 2015 18:19:42 +0800 Subject: [PATCH 200/249] Reverted GuiPlay reverted stacking issue --- projects/mtg/src/GuiPlay.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/projects/mtg/src/GuiPlay.cpp b/projects/mtg/src/GuiPlay.cpp index 437ff4945..59a5a138c 100644 --- a/projects/mtg/src/GuiPlay.cpp +++ b/projects/mtg/src/GuiPlay.cpp @@ -195,7 +195,7 @@ void GuiPlay::Replace() for (iterator it = cards.begin(); it != end_spells; ++it) if (!(*it)->card->target) { - if((!(*it)->card->hasSubtype(Subtypes::TYPE_AURA)|| ((*it)->card->hasSubtype(Subtypes::TYPE_AURA) && !(*it)->card->playerTarget)) && !(*it)->card->hasType(Subtypes::TYPE_PLANESWALKER)) + if((!(*it)->card->hasSubtype(Subtypes::TYPE_AURA)|| ((*it)->card->hasSubtype(Subtypes::TYPE_AURA) && (*it)->card->playerTarget)) && !(*it)->card->hasType(Subtypes::TYPE_PLANESWALKER)) { if (mpDuelLayers->getRenderedPlayer() == (*it)->card->controller()) ++selfSpellsN; @@ -231,7 +231,7 @@ void GuiPlay::Replace() for (iterator it = cards.begin(); it != end_spells; ++it) if (!(*it)->card->target) { - if((!(*it)->card->hasSubtype(Subtypes::TYPE_AURA)|| ((*it)->card->hasSubtype(Subtypes::TYPE_AURA) && !(*it)->card->playerTarget)) && !(*it)->card->hasType(Subtypes::TYPE_PLANESWALKER)) + if((!(*it)->card->hasSubtype(Subtypes::TYPE_AURA)|| ((*it)->card->hasSubtype(Subtypes::TYPE_AURA) && (*it)->card->playerTarget)) && !(*it)->card->hasType(Subtypes::TYPE_PLANESWALKER)) { if (mpDuelLayers->getRenderedPlayer() == (*it)->card->controller()) selfSpells.Enstack(*it); From f4bdfa43ca45b77d175880b668d548aff7f06fbe Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Fri, 16 Oct 2015 18:50:05 +0800 Subject: [PATCH 201/249] Copied Morphed card --- projects/mtg/src/AllAbilities.cpp | 30 ++++++++++++++++++------------ projects/mtg/src/CardGui.cpp | 2 +- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index d59749dd9..628db6888 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -390,19 +390,25 @@ int AACopier::resolve() MTGCardInstance * _target = (MTGCardInstance *) target; if (_target) { - if(_target->isACopier) + MTGCard* clone = MTGCollection()->getCardById(_target->copiedID); + MTGCardInstance * myClone = NEW MTGCardInstance(clone, source->controller()->game); + source->copy(myClone); + source->isACopier = true; + source->copiedID = _target->copiedID; + source->modifiedbAbi = _target->modifiedbAbi; + source->origbasicAbilities = _target->origbasicAbilities; + if(_target->isMorphed) { - MTGCard* clone = MTGCollection()->getCardById(_target->copiedID); - MTGCardInstance * myClone = NEW MTGCardInstance(clone, source->controller()->game); - source->copy(myClone); - source->isACopier = true; - source->copiedID = _target->copiedID; - } - else - { - source->copy(_target); - source->isACopier = true; - source->copiedID = _target->getId(); + source->power = 2; + source->life = 2; + source->toughness = 2; + source->setColor(0,1); + source->name = "Morph"; + source->types.clear(); + string cre = "Creature"; + source->setType(cre.c_str()); + source->basicAbilities.reset(); + source->getManaCost()->resetCosts(); } return 1; } diff --git a/projects/mtg/src/CardGui.cpp b/projects/mtg/src/CardGui.cpp index bd5c83733..a9454f183 100644 --- a/projects/mtg/src/CardGui.cpp +++ b/projects/mtg/src/CardGui.cpp @@ -292,7 +292,7 @@ void CardGui::Render() } JQuadPtr mor; - if(card->isMorphed && !alternate) + if((card->isMorphed||(card->name == "Morph" && card->isACopier)) && !alternate) { mor = card->getObserver()->getResourceManager()->RetrieveTempQuad("morph.jpg"); if (mor && mor->mTex) { From 61881ad6565e441d79559aeb117ced404af18160 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sat, 17 Oct 2015 19:44:21 +0800 Subject: [PATCH 202/249] Fix issue #473 and #784 It seems when a zonechange event from inplay to inplay (player or opponent), the card->view item values is recalculated... so it destroys the GUI like missing card image, or moving it far off the screen... To reproduce, cast Splinter Twin to Conquering Manticore and gain control the same creature about 2 or 3 times... --- projects/mtg/include/WEvent.h | 6 ++++++ projects/mtg/src/GuiPlay.cpp | 2 ++ projects/mtg/src/MTGGameZones.cpp | 8 ++++++++ projects/mtg/src/WEvent.cpp | 11 +++++++++++ 4 files changed, 27 insertions(+) diff --git a/projects/mtg/include/WEvent.h b/projects/mtg/include/WEvent.h index 890762796..94043218e 100644 --- a/projects/mtg/include/WEvent.h +++ b/projects/mtg/include/WEvent.h @@ -279,6 +279,12 @@ struct WEventCardUnattached : public WEventCardUpdate { virtual Targetable * getTarget(int target); }; +//event when card moves from player/opponent battlefield to player/opponent battlefield +struct WEventCardControllerChange : public WEventCardUpdate { + WEventCardControllerChange(MTGCardInstance * card); + virtual Targetable * getTarget(int target); +}; + std::ostream& operator<<(std::ostream&, const WEvent&); #endif diff --git a/projects/mtg/src/GuiPlay.cpp b/projects/mtg/src/GuiPlay.cpp index 59a5a138c..eee380023 100644 --- a/projects/mtg/src/GuiPlay.cpp +++ b/projects/mtg/src/GuiPlay.cpp @@ -412,6 +412,8 @@ int GuiPlay::receiveEventPlus(WEvent * e) Replace(); else if (dynamic_cast (e)) Replace(); + else if (dynamic_cast (e)) + Replace(); Replace(); return 0; } diff --git a/projects/mtg/src/MTGGameZones.cpp b/projects/mtg/src/MTGGameZones.cpp index bcae61f0c..2f0b7027c 100644 --- a/projects/mtg/src/MTGGameZones.cpp +++ b/projects/mtg/src/MTGGameZones.cpp @@ -322,6 +322,7 @@ MTGCardInstance * MTGPlayerCards::putInZone(MTGCardInstance * card, MTGGameZone int doCopy = 1; bool shufflelibrary = card->basicAbilities[(int)Constants::SHUFFLELIBRARYDEATH]; + bool inplaytoinplay = false; bool ripToken = false; if (g->players[0]->game->battlefield->hasName("Rest in Peace")||g->players[1]->game->battlefield->hasName("Rest in Peace")) ripToken = true; @@ -362,6 +363,8 @@ MTGCardInstance * MTGPlayerCards::putInZone(MTGCardInstance * card, MTGGameZone == g->players[1]->game->inPlay)) { doCopy = 0; + asCopy = true;//don't send zone change event so it will not destroy the GUI when multiple switching of control... + inplaytoinplay = true;//try sending different event... } if (!(copy = from->removeCard(card, doCopy))) @@ -433,6 +436,11 @@ MTGCardInstance * MTGPlayerCards::putInZone(MTGCardInstance * card, MTGGameZone WEvent * e = NEW WEventZoneChange(copy, from, to); g->receiveEvent(e); } + if(inplaytoinplay) + { + WEvent * ep = NEW WEventCardControllerChange(copy); + g->receiveEvent(ep); + } return ret; } diff --git a/projects/mtg/src/WEvent.cpp b/projects/mtg/src/WEvent.cpp index bba4fa8ef..4b1db1029 100644 --- a/projects/mtg/src/WEvent.cpp +++ b/projects/mtg/src/WEvent.cpp @@ -165,6 +165,11 @@ WEventCardUnattached::WEventCardUnattached(MTGCardInstance * card) : { } +WEventCardControllerChange::WEventCardControllerChange(MTGCardInstance * card) : + WEventCardUpdate(card) +{ +} + WEventCombatStepChange::WEventCombatStepChange(CombatStep step) : WEvent(), step(step) { @@ -319,6 +324,12 @@ Targetable * WEventCardUnattached::getTarget(int target) return NULL; } +Targetable * WEventCardControllerChange::getTarget(int target) +{ + if (target) return card; + return NULL; +} + std::ostream& WEvent::toString(std::ostream& out) const { return out << "EVENT"; From 1ad1bf7942acff2ffbc2fef36aed55ce7ca71b40 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sun, 18 Oct 2015 00:20:32 +0800 Subject: [PATCH 203/249] protection from colored spells --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 16 ++++++---------- projects/mtg/include/MTGDefinitions.h | 3 ++- projects/mtg/src/Damage.cpp | 5 +++++ projects/mtg/src/MTGDefinitions.cpp | 3 ++- projects/mtg/src/TargetChooser.cpp | 5 +++++ 5 files changed, 20 insertions(+), 12 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 9581a0030..a7e28c751 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -18524,7 +18524,7 @@ subtype=Aura [card] name=Conquering Manticore abilities=flying -auto=target(creature|opponentbattlefield) transforms((,newability[moveTo(opponentbattlefield)],newability[phaseaction[endofturn sourceinplay] moveTo(ownerbattlefield)],newability[untap],haste)) ueot once +auto=name(gain control) target(creature|opponentbattlefield) transforms((,newability[moveTo(opponentbattlefield)],newability[phaseaction[endofturn sourceinplay] moveTo(ownerbattlefield)],newability[untap],haste)) ueot once text=Flying -- When Conquering Manticore enters the battlefield, gain control of target creature an opponent controls until end of turn. Untap that creature. It gains haste until end of turn. mana={4}{R}{R} type=Creature @@ -29970,15 +29970,10 @@ toughness=3 [/card] [card] name=Emrakul, the Aeons Torn -abilities=nofizzle,flying +abilities=nofizzle,flying,protectionfromcoloredspells auto=if casted(this) then turns:+1 controller autograveyard=moveTo(ownerlibrary) all(*|ownergraveyard) && shuffle auto=@combat(attacking) source(this):name(Annihilate) ability$!name(sacrifice 6 permanents) notatarget(<6>*|mybattlefield) sacrifice!$ opponent -auto=protection from(*[white]|stack) -auto=protection from(*[blue]|stack) -auto=protection from(*[black]|stack) -auto=protection from(*[red]|stack) -auto=protection from(*[green]|stack) text=Emrakul, the Aeons Torn can't be countered. -- When you cast Emrakul, take an extra turn after this one. -- Flying, protection from colored spells, annihilator 6 -- When Emrakul is put into a graveyard from anywhere, its owner shuffles his or her graveyard into his or her library. mana={15} type=Legendary Creature @@ -50645,6 +50640,7 @@ toughness=3 [card] name=Jokulmorder abilities=trample,doesnotuntap +auto=tap auto=aslongas(land|mybattlefield) choice target(<5>land|mybattlefield) sacrifice oneshot >4 auto=choice sacrifice all(this) auto=@movedTo(island|mybattlefield):untap @@ -74514,8 +74510,8 @@ type=Instant [card] name=Primal Clay auto=choice name(enter as 3/3) transforms((,setpower=3,settoughness=3)) forever -auto=choice name(enter as 2/2 fly) transforms((,flying,setpower=2,settoughness=2)) forever -auto=choice name(enter as a wall) transforms((Wall,defender,setpower=1,settoughness=6)) forever +auto=choice name(enter as 2/2 fly) transforms((,newability[flying],setpower=2,settoughness=2)) forever +auto=choice name(enter as a wall) transforms((Wall,newability[defender],setpower=1,settoughness=6)) forever text=As Primal Clay enters the battlefield, it becomes your choice of a 3/3 artifact creature, a 2/2 artifact creature with flying, or a 1/6 Shapeshifter Wall artifact creature with defender. mana={4} type=Artifact Creature @@ -111749,7 +111745,7 @@ type=Instant [card] name=Warrior's Lesson target=creature|mybattlefield -auto=transforms((,newability[@combatdamaged(opponent) from(this):draw:1 controller])) ueot +auto=transforms((,newability[@combatdamaged(player) from(this):draw:1 controller])) ueot text=Until end of turn, up to two target creatures you control each gain "Whenever this creature deals combat damage to a player, draw a card." mana={G} type=Instant diff --git a/projects/mtg/include/MTGDefinitions.h b/projects/mtg/include/MTGDefinitions.h index 8614ec853..385dcc69b 100644 --- a/projects/mtg/include/MTGDefinitions.h +++ b/projects/mtg/include/MTGDefinitions.h @@ -231,7 +231,8 @@ class Constants NOLIFEGAINOPPONENT = 113, AURAWARD = 114, MADNESS = 115, - NB_BASIC_ABILITIES = 116, + PROTECTIONFROMCOLOREDSPELLS = 116, + NB_BASIC_ABILITIES = 117, RARITY_S = 'S', //Special Rarity diff --git a/projects/mtg/src/Damage.cpp b/projects/mtg/src/Damage.cpp index 6626c4df8..3f6a329c9 100644 --- a/projects/mtg/src/Damage.cpp +++ b/projects/mtg/src/Damage.cpp @@ -78,6 +78,11 @@ int Damage::resolve() damage = 0; //rulings = 10/4/2004 The damage prevention ability works even if it has no counters, as long as some effect keeps its toughness above zero. //these creature are essentially immune to damage. however 0/-1 effects applied through lords or counters can kill them. + if ((_target)->has(Constants::PROTECTIONFROMCOLOREDSPELLS)) + {//damage is prevented as long as the damage source is a spell on the stack... + if((source->currentZone == source->controller()->opponent()->game->stack||source->currentZone == source->controller()->game->stack) && (source->hasColor(1)||source->hasColor(2)||source->hasColor(3)||source->hasColor(4)||source->hasColor(5))) + damage = 0; + } if ((_target)->has(Constants::PHANTOM)) { damage = 0; diff --git a/projects/mtg/src/MTGDefinitions.cpp b/projects/mtg/src/MTGDefinitions.cpp index 5ae7b685a..51ffc01d2 100644 --- a/projects/mtg/src/MTGDefinitions.cpp +++ b/projects/mtg/src/MTGDefinitions.cpp @@ -144,7 +144,8 @@ const char* Constants::MTGBasicAbilities[] = { "nolifegain", "nolifegainopponent", "auraward", - "madness" + "madness", + "protectionfromcoloredspells" }; map Constants::MTGBasicAbilitiesMap; diff --git a/projects/mtg/src/TargetChooser.cpp b/projects/mtg/src/TargetChooser.cpp index 4191f1f7b..10499dc3b 100644 --- a/projects/mtg/src/TargetChooser.cpp +++ b/projects/mtg/src/TargetChooser.cpp @@ -859,6 +859,11 @@ bool TargetChooser::canTarget(Targetable * target, bool withoutProtections) if (card->protectedAgainst(targetter)) return targetter->bypassTC; if (card->CantBeTargetby(targetter)) return targetter->bypassTC; if ((targetter->controller() != card->controller()) && card->has(Constants::OPPONENTSHROUD)) return targetter->bypassTC; + if (card->has(Constants::PROTECTIONFROMCOLOREDSPELLS)) + {//a spell that has no target=criteria means it's not targetted unless its a workaround card... + if((targetter->spellTargetType.size()) && (targetter->hasColor(1)||targetter->hasColor(2)||targetter->hasColor(3)||targetter->hasColor(4)||targetter->hasColor(5))) + return targetter->bypassTC; + } } return true; } From 8c4fabb89aafce9c142096f1d151caa3f5c9ccba Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sun, 18 Oct 2015 15:55:10 +0800 Subject: [PATCH 204/249] menuicons forced for PSP build --- projects/mtg/src/GameApp.cpp | 2 ++ projects/mtg/src/GameStateMenu.cpp | 5 +++++ projects/mtg/src/TargetChooser.cpp | 2 +- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/projects/mtg/src/GameApp.cpp b/projects/mtg/src/GameApp.cpp index c207594c2..bdc8fbe05 100644 --- a/projects/mtg/src/GameApp.cpp +++ b/projects/mtg/src/GameApp.cpp @@ -174,7 +174,9 @@ void GameApp::Create() LOG("Loading Textures"); LOG("--Loading menuicons.png"); WResourceManager::Instance()->RetrieveTexture("menuicons.png", RETRIEVE_MANAGE); +#if !defined (PSP) WResourceManager::Instance()->RetrieveTexture("miconslarge.png", RETRIEVE_MANAGE); +#endif LOG("---Gettings menuicons.png quads"); //Load all icons from gModRules and save in manaIcons -> todo. Change the icons positions on menuicons.png to avoid use item->mColorId diff --git a/projects/mtg/src/GameStateMenu.cpp b/projects/mtg/src/GameStateMenu.cpp index 9845c291e..0fa693f16 100644 --- a/projects/mtg/src/GameStateMenu.cpp +++ b/projects/mtg/src/GameStateMenu.cpp @@ -85,8 +85,13 @@ void GameStateMenu::Create() { for (int j = 0; j < 2; j++) { +#if defined (PSP) + sprintf(buf, "menuicons%d%d", i, j); + mIcons[n] = WResourceManager::Instance()->RetrieveQuad("menuicons.png", 2 + i * 36.0f, 2.0f + j * 36.0f, 32.0f, 32.0f, buf); +#else sprintf(buf, "miconslarge%d%d", i, j); mIcons[n] = WResourceManager::Instance()->RetrieveQuad("miconslarge.png", 4 + i * 72.0f, 4.0f + j * 72.0f, 72.0f, 72.0f, buf); +#endif if (mIcons[n]) { mIcons[n]->mHeight = 36.f; diff --git a/projects/mtg/src/TargetChooser.cpp b/projects/mtg/src/TargetChooser.cpp index 10499dc3b..9d58f058d 100644 --- a/projects/mtg/src/TargetChooser.cpp +++ b/projects/mtg/src/TargetChooser.cpp @@ -859,7 +859,7 @@ bool TargetChooser::canTarget(Targetable * target, bool withoutProtections) if (card->protectedAgainst(targetter)) return targetter->bypassTC; if (card->CantBeTargetby(targetter)) return targetter->bypassTC; if ((targetter->controller() != card->controller()) && card->has(Constants::OPPONENTSHROUD)) return targetter->bypassTC; - if (card->has(Constants::PROTECTIONFROMCOLOREDSPELLS)) + if (card->has(Constants::PROTECTIONFROMCOLOREDSPELLS)) {//a spell that has no target=criteria means it's not targetted unless its a workaround card... if((targetter->spellTargetType.size()) && (targetter->hasColor(1)||targetter->hasColor(2)||targetter->hasColor(3)||targetter->hasColor(4)||targetter->hasColor(5))) return targetter->bypassTC; From c7535e38dc1d5c4ed9cc066be2a7c4e3a4c35b10 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sun, 18 Oct 2015 22:38:41 +0800 Subject: [PATCH 205/249] TrcardDrawn, TrDamaged, TrLifeGained Added trigger restriction for "@trigger(player) restriction{opponenttrigger/controllertrigger}" Restriction for: @drawn @damaged(combat and noncombat) @lifed/lifeloss Why? When using @drawn trigger like Underworld Dreams auto=@drawn(opponent):life:-1 opponent If you take control of Underworld Dreams from an opponent, the targetchooser for "opponent" is not updated and you are still the opponent of Underworld Dreams even you take control of it(It is right if you are the chosen opponent from cards like Black Vise, The Rack, etc... The chosen opponent never changes. But cards that don't define a chosen player an "opponent" like Underworld Dreams when an exchanged control happens, the opponent of the card is the opponent of the one who controls the card). :P The new correct code for Underworld Dreams: auto=@drawn(player) restriction{opponenttrigger}:life:-1 opponent --- projects/mtg/include/AllAbilities.h | 21 ++++++++++++++++++++- projects/mtg/include/MTGCardInstance.h | 2 ++ projects/mtg/src/GameObserver.cpp | 24 +++++++++++++++++------- projects/mtg/src/MTGAbility.cpp | 14 ++++++++++++++ projects/mtg/src/MTGCardInstance.cpp | 2 ++ 5 files changed, 55 insertions(+), 8 deletions(-) diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index 8465cb5d3..d4d1a6059 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -1207,7 +1207,10 @@ public: WEventcardDraw * e = dynamic_cast (event); if (!e) return 0; if (!tc->canTarget(e->player)) return 0; - + if(source->controller() == e->player) + source->controllerTrigger = 1; + else + source->opponentTrigger = 1; return 1; } @@ -1315,6 +1318,18 @@ public: if (type == 2 && e->damage->typeOfDamage == Damage::DAMAGE_COMBAT) return 0; e->damage->target->thatmuch = e->damage->damage; e->damage->source->thatmuch = e->damage->damage; + if (e->damage->target->type_as_damageable == Damageable::DAMAGEABLE_PLAYER) + { + Player * p = (Player *) e->damage->target; + if(p && p == source->controller()->opponent()) + { + source->opponentTrigger = 1; + } + else + { + source->controllerTrigger = 1; + } + } this->source->thatmuch = e->damage->damage; triggeredTurn = game->turn; @@ -1354,6 +1369,10 @@ public: if (type == 1 && (e->amount > 0)) return 0; if (type == 0 && (e->amount < 0)) return 0; e->player->thatmuch = abs(e->amount); + if(source->controller() == e->player) + source->controllerTrigger = 1; + else + source->opponentTrigger = 1; this->source->thatmuch = abs(e->amount); return 1; diff --git a/projects/mtg/include/MTGCardInstance.h b/projects/mtg/include/MTGCardInstance.h index 5146b4940..d14270c99 100644 --- a/projects/mtg/include/MTGCardInstance.h +++ b/projects/mtg/include/MTGCardInstance.h @@ -253,6 +253,8 @@ public: int cardistargetted; bool isTargetter(); int cardistargetter; + int opponentTrigger; + int controllerTrigger; void eventattacked(); void eventattackedAlone(); diff --git a/projects/mtg/src/GameObserver.cpp b/projects/mtg/src/GameObserver.cpp index 72fcb8aca..e018016c1 100644 --- a/projects/mtg/src/GameObserver.cpp +++ b/projects/mtg/src/GameObserver.cpp @@ -593,15 +593,25 @@ void GameObserver::gameStateBasedEffects() ///////////////////////////////////// for (int d = 0; d < 2; d++) { - MTGGameZone * zone = players[d]->game->inPlay; - if (mLayers->stackLayer()->count(0, NOT_RESOLVED) == 0) - { - for (int c = zone->nb_cards - 1; c >= 0; c--) + MTGGameZone * dzones[] = { players[d]->game->inPlay, players[d]->game->graveyard, players[d]->game->hand, players[d]->game->library }; + for (int k = 0; k < 4; k++) + { + MTGGameZone * zone = dzones[k]; + if (mLayers->stackLayer()->count(0, NOT_RESOLVED) == 0) { - zone->cards[c]->cardistargetted = 0; - zone->cards[c]->cardistargetter = 0; + for (int c = zone->nb_cards - 1; c >= 0; c--) + { + zone->cards[c]->cardistargetted = 0; + zone->cards[c]->cardistargetter = 0; + } } - } + //clear trigger + for (int b = zone->nb_cards - 1; b >= 0; b--) + { + zone->cards[b]->controllerTrigger = 0; + zone->cards[b]->opponentTrigger = 0; + } + }//check for losers if its gameover call the statebased action players[d]->DeadLifeState(); } //////////////////////////////////// diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index 34f142492..dcb775d84 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -411,6 +411,20 @@ int AbilityFactory::parseCastRestrictions(MTGCardInstance * card, Player * playe } } + check = restriction[i].find("opponenttrigger"); + if(check != string::npos) + { + if(!card->opponentTrigger) + return 0; + } + + check = restriction[i].find("controllertrigger"); + if(check != string::npos) + { + if(!card->controllerTrigger) + return 0; + } + check = restriction[i].find("discarded"); if(check != string::npos) { diff --git a/projects/mtg/src/MTGCardInstance.cpp b/projects/mtg/src/MTGCardInstance.cpp index 140c4f5cf..5b12d88a1 100644 --- a/projects/mtg/src/MTGCardInstance.cpp +++ b/projects/mtg/src/MTGCardInstance.cpp @@ -65,6 +65,8 @@ MTGCardInstance::MTGCardInstance(MTGCard * card, MTGPlayerCards * arg_belongs_to LKItoughness = toughness; cardistargetted = 0; cardistargetter = 0; + opponentTrigger = 0; + controllerTrigger = 0; } MTGCardInstance * MTGCardInstance::createSnapShot() From f90775153c1203bb85fa129a3b7245c424afceaf Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 19 Oct 2015 10:19:14 +0800 Subject: [PATCH 206/249] Revert "TrcardDrawn, TrDamaged, TrLifeGained" This reverts commit c7535e38dc1d5c4ed9cc066be2a7c4e3a4c35b10. --- projects/mtg/include/AllAbilities.h | 21 +-------------------- projects/mtg/include/MTGCardInstance.h | 2 -- projects/mtg/src/GameObserver.cpp | 24 +++++++----------------- projects/mtg/src/MTGAbility.cpp | 14 -------------- projects/mtg/src/MTGCardInstance.cpp | 2 -- 5 files changed, 8 insertions(+), 55 deletions(-) diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index d4d1a6059..8465cb5d3 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -1207,10 +1207,7 @@ public: WEventcardDraw * e = dynamic_cast (event); if (!e) return 0; if (!tc->canTarget(e->player)) return 0; - if(source->controller() == e->player) - source->controllerTrigger = 1; - else - source->opponentTrigger = 1; + return 1; } @@ -1318,18 +1315,6 @@ public: if (type == 2 && e->damage->typeOfDamage == Damage::DAMAGE_COMBAT) return 0; e->damage->target->thatmuch = e->damage->damage; e->damage->source->thatmuch = e->damage->damage; - if (e->damage->target->type_as_damageable == Damageable::DAMAGEABLE_PLAYER) - { - Player * p = (Player *) e->damage->target; - if(p && p == source->controller()->opponent()) - { - source->opponentTrigger = 1; - } - else - { - source->controllerTrigger = 1; - } - } this->source->thatmuch = e->damage->damage; triggeredTurn = game->turn; @@ -1369,10 +1354,6 @@ public: if (type == 1 && (e->amount > 0)) return 0; if (type == 0 && (e->amount < 0)) return 0; e->player->thatmuch = abs(e->amount); - if(source->controller() == e->player) - source->controllerTrigger = 1; - else - source->opponentTrigger = 1; this->source->thatmuch = abs(e->amount); return 1; diff --git a/projects/mtg/include/MTGCardInstance.h b/projects/mtg/include/MTGCardInstance.h index d14270c99..5146b4940 100644 --- a/projects/mtg/include/MTGCardInstance.h +++ b/projects/mtg/include/MTGCardInstance.h @@ -253,8 +253,6 @@ public: int cardistargetted; bool isTargetter(); int cardistargetter; - int opponentTrigger; - int controllerTrigger; void eventattacked(); void eventattackedAlone(); diff --git a/projects/mtg/src/GameObserver.cpp b/projects/mtg/src/GameObserver.cpp index e018016c1..72fcb8aca 100644 --- a/projects/mtg/src/GameObserver.cpp +++ b/projects/mtg/src/GameObserver.cpp @@ -593,25 +593,15 @@ void GameObserver::gameStateBasedEffects() ///////////////////////////////////// for (int d = 0; d < 2; d++) { - MTGGameZone * dzones[] = { players[d]->game->inPlay, players[d]->game->graveyard, players[d]->game->hand, players[d]->game->library }; - for (int k = 0; k < 4; k++) - { - MTGGameZone * zone = dzones[k]; - if (mLayers->stackLayer()->count(0, NOT_RESOLVED) == 0) + MTGGameZone * zone = players[d]->game->inPlay; + if (mLayers->stackLayer()->count(0, NOT_RESOLVED) == 0) + { + for (int c = zone->nb_cards - 1; c >= 0; c--) { - for (int c = zone->nb_cards - 1; c >= 0; c--) - { - zone->cards[c]->cardistargetted = 0; - zone->cards[c]->cardistargetter = 0; - } + zone->cards[c]->cardistargetted = 0; + zone->cards[c]->cardistargetter = 0; } - //clear trigger - for (int b = zone->nb_cards - 1; b >= 0; b--) - { - zone->cards[b]->controllerTrigger = 0; - zone->cards[b]->opponentTrigger = 0; - } - }//check for losers if its gameover call the statebased action + } players[d]->DeadLifeState(); } //////////////////////////////////// diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index dcb775d84..34f142492 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -411,20 +411,6 @@ int AbilityFactory::parseCastRestrictions(MTGCardInstance * card, Player * playe } } - check = restriction[i].find("opponenttrigger"); - if(check != string::npos) - { - if(!card->opponentTrigger) - return 0; - } - - check = restriction[i].find("controllertrigger"); - if(check != string::npos) - { - if(!card->controllerTrigger) - return 0; - } - check = restriction[i].find("discarded"); if(check != string::npos) { diff --git a/projects/mtg/src/MTGCardInstance.cpp b/projects/mtg/src/MTGCardInstance.cpp index 5b12d88a1..140c4f5cf 100644 --- a/projects/mtg/src/MTGCardInstance.cpp +++ b/projects/mtg/src/MTGCardInstance.cpp @@ -65,8 +65,6 @@ MTGCardInstance::MTGCardInstance(MTGCard * card, MTGPlayerCards * arg_belongs_to LKItoughness = toughness; cardistargetted = 0; cardistargetter = 0; - opponentTrigger = 0; - controllerTrigger = 0; } MTGCardInstance * MTGCardInstance::createSnapShot() From b060c4205cb1f5fcd8ce82992a4daf4989296e6c Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 19 Oct 2015 11:10:49 +0800 Subject: [PATCH 207/249] targetter, targetted reset --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 2 +- projects/mtg/src/GameObserver.cpp | 18 +++++++++++------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index a7e28c751..77548df4c 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -69828,7 +69828,7 @@ toughness=1 name=Orgg abilities=trample auto=cantbeblockerof(creature[white;power>=3]) -auto=aslongas(creature[power>=3;-tapped]|opponentbattlefield]) cantattack +auto=aslongas(creature[power>=3;-tapped]|opponentbattlefield) cantattack text=Trample -- Orgg can't attack if defending player controls an untapped creature with power 3 or greater. -- Orgg can't block creatures with power 3 or greater. mana={3}{R}{R} type=Creature diff --git a/projects/mtg/src/GameObserver.cpp b/projects/mtg/src/GameObserver.cpp index 72fcb8aca..22a90802a 100644 --- a/projects/mtg/src/GameObserver.cpp +++ b/projects/mtg/src/GameObserver.cpp @@ -593,15 +593,19 @@ void GameObserver::gameStateBasedEffects() ///////////////////////////////////// for (int d = 0; d < 2; d++) { - MTGGameZone * zone = players[d]->game->inPlay; - if (mLayers->stackLayer()->count(0, NOT_RESOLVED) == 0) - { - for (int c = zone->nb_cards - 1; c >= 0; c--) + MTGGameZone * dzones[] = { players[d]->game->inPlay, players[d]->game->graveyard, players[d]->game->hand, players[d]->game->library }; + for (int k = 0; k < 4; k++) + { + MTGGameZone * zone = dzones[k]; + if (mLayers->stackLayer()->count(0, NOT_RESOLVED) == 0) { - zone->cards[c]->cardistargetted = 0; - zone->cards[c]->cardistargetter = 0; + for (int c = zone->nb_cards - 1; c >= 0; c--) + { + zone->cards[c]->cardistargetted = 0; + zone->cards[c]->cardistargetter = 0; + } } - } + }//check for losers if its GAMEOVER clear the stack to allow gamestateeffects to continue players[d]->DeadLifeState(); } //////////////////////////////////// From 0d8b2f4a01b7e90cc65cc9fb4a1922661d15359d Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 19 Oct 2015 19:43:07 +0800 Subject: [PATCH 208/249] persist/undying fix persist/undying wont trigger when there is a replacement effect for cards that goes to graveyard like leyline of the void. support for anafenza the foremost. --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 2 +- projects/mtg/include/MTGDefinitions.h | 4 +++- projects/mtg/src/MTGDefinitions.cpp | 4 +++- projects/mtg/src/MTGGameZones.cpp | 2 ++ projects/mtg/src/MTGRules.cpp | 2 ++ 5 files changed, 11 insertions(+), 3 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 77548df4c..442522f77 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -2744,8 +2744,8 @@ toughness=2 [/card] [card] name=Anafenza, the Foremost +abilities=oppgcreatureexiler auto=@combat(attacking) source(this):counter(1/1,1) target(other creature[tapped]|mybattlefield) -auto=@movedTo(creature|opponentGraveyard):all(trigger[to]) moveTo(exile) text=When Anafenza, the Foremost attacks, put a +1/+1 counter on another target tapped creature you control. -- If a creature card would be put into an opponent's graveyard from anywhere, exile it instead. mana={W}{B}{G} type=Legendary Creature diff --git a/projects/mtg/include/MTGDefinitions.h b/projects/mtg/include/MTGDefinitions.h index 385dcc69b..6a0d398fe 100644 --- a/projects/mtg/include/MTGDefinitions.h +++ b/projects/mtg/include/MTGDefinitions.h @@ -232,7 +232,9 @@ class Constants AURAWARD = 114, MADNESS = 115, PROTECTIONFROMCOLOREDSPELLS = 116, - NB_BASIC_ABILITIES = 117, + MYGCREATUREEXILER = 117, + OPPGCREATUREEXILER = 118, + NB_BASIC_ABILITIES = 119, RARITY_S = 'S', //Special Rarity diff --git a/projects/mtg/src/MTGDefinitions.cpp b/projects/mtg/src/MTGDefinitions.cpp index 51ffc01d2..0dd76ef59 100644 --- a/projects/mtg/src/MTGDefinitions.cpp +++ b/projects/mtg/src/MTGDefinitions.cpp @@ -145,7 +145,9 @@ const char* Constants::MTGBasicAbilities[] = { "nolifegainopponent", "auraward", "madness", - "protectionfromcoloredspells" + "protectionfromcoloredspells", + "mygcreatureexiler", + "oppgcreatureexiler" }; map Constants::MTGBasicAbilitiesMap; diff --git a/projects/mtg/src/MTGGameZones.cpp b/projects/mtg/src/MTGGameZones.cpp index 2f0b7027c..4cea41c66 100644 --- a/projects/mtg/src/MTGGameZones.cpp +++ b/projects/mtg/src/MTGGameZones.cpp @@ -349,6 +349,8 @@ MTGCardInstance * MTGPlayerCards::putInZone(MTGCardInstance * card, MTGGameZone for(int i = 0; i < 2; ++i) { if ((to == g->players[i]->game->graveyard) && ( + (g->players[i]->game->battlefield->hasAbility(Constants::MYGCREATUREEXILER) && card->isCreature()) || + (g->players[i]->opponent()->game->battlefield->hasAbility(Constants::OPPGCREATUREEXILER) && card->isCreature())|| g->players[i]->game->battlefield->hasAbility(Constants::MYGRAVEEXILER) || g->players[i]->opponent()->game->battlefield->hasAbility(Constants::OPPGRAVEEXILER))) { diff --git a/projects/mtg/src/MTGRules.cpp b/projects/mtg/src/MTGRules.cpp index d9628cf8b..362963ad0 100644 --- a/projects/mtg/src/MTGRules.cpp +++ b/projects/mtg/src/MTGRules.cpp @@ -2276,6 +2276,8 @@ int MTGPersistRule::receiveEvent(WEvent * event) if (e->from == p->game->inPlay) ok = 1; } + if ((card->owner->game->battlefield->hasAbility(Constants::MYGRAVEEXILER)||card->owner->opponent()->game->battlefield->hasAbility(Constants::OPPGRAVEEXILER)) || ((card->owner->game->battlefield->hasAbility(Constants::MYGCREATUREEXILER)||card->owner->opponent()->game->battlefield->hasAbility(Constants::OPPGCREATUREEXILER) && card->isCreature()))) + ok = 0; if (!ok) return 0; From 3bcb2985f9cffba7fad20ed3a291c9e5689fd5b2 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 19 Oct 2015 20:15:51 +0800 Subject: [PATCH 209/249] try to fix compile error on psp --- projects/mtg/src/MTGRules.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/mtg/src/MTGRules.cpp b/projects/mtg/src/MTGRules.cpp index 362963ad0..210c9bcbc 100644 --- a/projects/mtg/src/MTGRules.cpp +++ b/projects/mtg/src/MTGRules.cpp @@ -2276,7 +2276,7 @@ int MTGPersistRule::receiveEvent(WEvent * event) if (e->from == p->game->inPlay) ok = 1; } - if ((card->owner->game->battlefield->hasAbility(Constants::MYGRAVEEXILER)||card->owner->opponent()->game->battlefield->hasAbility(Constants::OPPGRAVEEXILER)) || ((card->owner->game->battlefield->hasAbility(Constants::MYGCREATUREEXILER)||card->owner->opponent()->game->battlefield->hasAbility(Constants::OPPGCREATUREEXILER) && card->isCreature()))) + if ((card->owner->game->battlefield->hasAbility(Constants::MYGRAVEEXILER)||card->owner->opponent()->game->battlefield->hasAbility(Constants::OPPGRAVEEXILER)) || (card->owner->game->battlefield->hasAbility(Constants::MYGCREATUREEXILER)||card->owner->opponent()->game->battlefield->hasAbility(Constants::OPPGCREATUREEXILER) && (card->isCreature()))) ok = 0; if (!ok) return 0; From 9f8d2b2d46b2d0d6b985d916f291b678e15b6d98 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 19 Oct 2015 21:48:59 +0800 Subject: [PATCH 210/249] take 2 --- projects/mtg/src/MTGRules.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/projects/mtg/src/MTGRules.cpp b/projects/mtg/src/MTGRules.cpp index 210c9bcbc..9a9abbd00 100644 --- a/projects/mtg/src/MTGRules.cpp +++ b/projects/mtg/src/MTGRules.cpp @@ -2276,7 +2276,9 @@ int MTGPersistRule::receiveEvent(WEvent * event) if (e->from == p->game->inPlay) ok = 1; } - if ((card->owner->game->battlefield->hasAbility(Constants::MYGRAVEEXILER)||card->owner->opponent()->game->battlefield->hasAbility(Constants::OPPGRAVEEXILER)) || (card->owner->game->battlefield->hasAbility(Constants::MYGCREATUREEXILER)||card->owner->opponent()->game->battlefield->hasAbility(Constants::OPPGCREATUREEXILER) && (card->isCreature()))) + if (card->owner->game->battlefield->hasAbility(Constants::MYGRAVEEXILER)||card->owner->opponent()->game->battlefield->hasAbility(Constants::OPPGRAVEEXILER)) + ok = 0; + if ((card->owner->game->battlefield->hasAbility(Constants::MYGCREATUREEXILER)||card->owner->opponent()->game->battlefield->hasAbility(Constants::OPPGCREATUREEXILER))&&(card->isCreature())) ok = 0; if (!ok) return 0; From 7810c65862ca5f5a20fafb3ac3b83a637dff3c22 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Tue, 20 Oct 2015 11:09:57 +0800 Subject: [PATCH 211/249] added Raid support thisturn(creature[attacking]|mybattlefield)~morethan~0 only triggers once... use raid keyword... if raid then blah... --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 18 +++++++++--------- projects/mtg/include/Player.h | 1 + projects/mtg/src/GameObserver.cpp | 2 ++ projects/mtg/src/MTGAbility.cpp | 7 +++++++ projects/mtg/src/MTGRules.cpp | 1 + projects/mtg/src/Player.cpp | 1 + 6 files changed, 21 insertions(+), 9 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 442522f77..fd906ded1 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -8586,7 +8586,7 @@ toughness=3 [/card] [card] name=Bellowing Saddlebrute -auto=ifnot thisturn(creature[attacking]|mybattlefield)~morethan~0 then life:-4 controller +auto=ifnot raid then life:-4 controller text=Raid — When Bellowing Saddlebrute enters the battlefield, you lose 4 life unless you attacked with a creature this turn. mana={3}{B} type=Creature @@ -10685,7 +10685,7 @@ toughness=3 [card] name=Bloodsoaked Champion abilities=cantblock -autograveyard={1}{B}:moveTo(mybattlefield) restriction{thisturn(creature[attacking]|mybattlefield)~morethan~0} +autograveyard={1}{B}:moveTo(mybattlefield) restriction{raid} text=Bloodsoaked Champion can't block. -- Raid — {1}{B}: Return Bloodsoaked Champion from your graveyard to the battlefield. Activate this ability only if you attacked with a creature this turn. mana={B} type=Creature @@ -59747,7 +59747,7 @@ toughness=1 [/card] [card] name=Mardu Heart-Piercer -auto=if thisturn(creature[attacking]|mybattlefield)~morethan~0 then damage:2 target(creature,player) +auto=if raid then damage:2 target(creature,player) text=Raid -- When Mardu Heart-Piercer enters the battlefield, if you attacked with a creature this turn, Mardu Heart-Piercer deals 2 damage to target creature or player. mana={3}{R} type=Creature @@ -59757,7 +59757,7 @@ toughness=3 [/card] [card] name=Mardu Hordechief -auto=if thisturn(creature[attacking]|mybattlefield)~morethan~0 then token(Warrior,Creature Warrior,1/1,white) +auto=if raid then token(Warrior,Creature Warrior,1/1,white) text=Raid - When Mardu Hordechief enters the battlefield, if you attacked with a creature this turn, put a 1/1 white Warrior creature token onto the battlefield. mana={2}{W} type=Creature @@ -59811,7 +59811,7 @@ toughness=1 [card] name=Mardu Skullhunter auto=tap -auto=if thisturn(creature[attacking]|mybattlefield)~morethan~0 then target(opponent) ability$!name(discard) target(*|myhand) reject!$ targetedplayer +auto=if raid then target(opponent) ability$!name(discard) target(*|myhand) reject!$ targetedplayer text=Mardu Skullhunter enters the battlefield tapped. -- Raid - When Mardu Skullhunter enters the battlefield, if you attacked with a creature this turn, target opponent discards a card. mana={1}{B} type=Creature @@ -59833,7 +59833,7 @@ toughness=2 [/card] [card] name=Mardu Warshrieker -auto=if thisturn(creature[attacking]|mybattlefield)~morethan~0 then Add{R}{W}{B} +auto=if raid then Add{R}{W}{B} text=Raid - When Mardu Warshrieker enters the battlefield, if you attacked with a creature this turn, add {R}{W}{B} to your mana pool. mana={3}{R} type=Creature @@ -102844,7 +102844,7 @@ type=Sorcery [/card] [card] name=Timely Hordemate -auto=if thisturn(creature[attacking]|mybattlefield)~morethan~0 then moveTo(mybattlefield) target(creature[manacost<=2]|mygraveyard) +auto=if raid then moveTo(mybattlefield) target(creature[manacost<=2]|mygraveyard) text=Raid - When Timely Hordemate enters the battlefield, if you attacked with a creature this turn, return target creature card with converted mana cost 2 or less from your graveyard to the battlefield. mana={3}{W} type=Creature @@ -111460,7 +111460,7 @@ type=Instant [/card] [card] name=War-Name Aspirant -auto=if thisturn(creature[attacking]|mybattlefield)~morethan~0 then counter(1/1,1) +auto=if raid then counter(1/1,1) auto=cantbeblockedby(creature[power<=1]) text=Raid - War-Name Aspirant enters the battlefield with a +1/+1 counter on it if you attacked with a creature this turn. -- War-Name Aspirant can't be blocked by creatures with power 1 or less. mana={1}{R} @@ -113628,7 +113628,7 @@ toughness=1 [card] name=Wingmate Roc abilities=flying -auto=if thisturn(creature[attacking]|mybattlefield)~morethan~0 then token(Bird,Creature Bird,3/4,white,flying) +auto=if raid then token(Bird,Creature Bird,3/4,white,flying) auto=@combat(attacking) source(this):life:type:creature[attacking]:battlefield controller text=Flying. -- Raid - When Wingmate Roc enters the battlefield, if you attacked with a creature this turn, put a 3/4 white Bird creature token with flying onto the battlefield. -- Whenever Wingmate Roc attacks, you gain 1 life for each attacking creature. mana={3}{W}{W} diff --git a/projects/mtg/include/Player.h b/projects/mtg/include/Player.h index ae3e46007..eac30a20e 100644 --- a/projects/mtg/include/Player.h +++ b/projects/mtg/include/Player.h @@ -44,6 +44,7 @@ public: int drawCounter; int epic; int initLife; + int raidcount; vector prowledTypes; vectorcurses; Player(GameObserver *observer, string deckFile, string deckFileSmall, MTGDeck * deck = NULL); diff --git a/projects/mtg/src/GameObserver.cpp b/projects/mtg/src/GameObserver.cpp index 22a90802a..4a0d6300b 100644 --- a/projects/mtg/src/GameObserver.cpp +++ b/projects/mtg/src/GameObserver.cpp @@ -204,6 +204,8 @@ void GameObserver::nextGamePhase() cleanupPhase(); currentPlayer->damageCount = 0; currentPlayer->drawCounter = 0; + currentPlayer->raidcount = 0; + currentPlayer->opponent()->raidcount = 0; currentPlayer->prowledTypes.clear(); currentPlayer->opponent()->damageCount = 0; //added to clear odcount currentPlayer->preventable = 0; diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index 34f142492..cbb1afe01 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -418,6 +418,13 @@ int AbilityFactory::parseCastRestrictions(MTGCardInstance * card, Player * playe return 0; } + check = restriction[i].find("raid"); + if(check != string::npos) + { + if(card->controller()->raidcount < 1) + return 0; + } + check = restriction[i].find("ownerscontrol"); if(check != string::npos) { diff --git a/projects/mtg/src/MTGRules.cpp b/projects/mtg/src/MTGRules.cpp index 9a9abbd00..3cb7ede58 100644 --- a/projects/mtg/src/MTGRules.cpp +++ b/projects/mtg/src/MTGRules.cpp @@ -1398,6 +1398,7 @@ int MTGCombatTriggersRule::receiveEvent(WEvent *e) if (card && card->isAttacker()) { card->eventattacked(); + card->controller()->raidcount += 1; } } } diff --git a/projects/mtg/src/Player.cpp b/projects/mtg/src/Player.cpp index 1efcc0b89..cd1a2c77a 100644 --- a/projects/mtg/src/Player.cpp +++ b/projects/mtg/src/Player.cpp @@ -34,6 +34,7 @@ Player::Player(GameObserver *observer, string file, string fileSmall, MTGDeck * extraTurn = 0; drawCounter = 0; epic = 0; + raidcount = 0; prowledTypes.clear(); doesntEmpty = NEW ManaCost(); poolDoesntEmpty = NEW ManaCost(); From 2178018b1849b2f1296a07e33be243f39c6847da Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Tue, 20 Oct 2015 21:56:49 +0800 Subject: [PATCH 212/249] Persist and Undying goes to the stack --- projects/mtg/include/AllAbilities.h | 4 +++- projects/mtg/src/AllAbilities.cpp | 8 ++++++-- projects/mtg/src/MTGRules.cpp | 21 +++++++++++++++------ 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index 8465cb5d3..f91b70da7 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -1772,7 +1772,9 @@ public: string destination; MTGAbility * andAbility; string named; - AAMover(GameObserver* observer, int _id, MTGCardInstance * _source, MTGCardInstance * _target, string dest,string _name, ManaCost * _cost = NULL); + bool undying; + bool persist; + AAMover(GameObserver* observer, int _id, MTGCardInstance * _source, MTGCardInstance * _target, string dest,string _name, ManaCost * _cost = NULL, bool undying = false, bool persist = false); MTGGameZone * destinationZone(Targetable * target = NULL); int resolve(); const string getMenuText(); diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index 628db6888..dad26cbaf 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -2734,8 +2734,8 @@ AInstantCastRestrictionUEOT::~AInstantCastRestrictionUEOT() //AAMover -AAMover::AAMover(GameObserver* observer, int _id, MTGCardInstance * _source, MTGCardInstance * _target, string dest,string newName, ManaCost * _cost) : - ActivatedAbility(observer, _id, _source, _cost, 0), destination(dest),named(newName) +AAMover::AAMover(GameObserver* observer, int _id, MTGCardInstance * _source, MTGCardInstance * _target, string dest,string newName, ManaCost * _cost, bool undying, bool persist) : + ActivatedAbility(observer, _id, _source, _cost, 0), destination(dest),named(newName),undying(undying),persist(persist) { if (_target) target = _target; @@ -2782,6 +2782,10 @@ int AAMover::resolve() andAbilityClone->addToGame(); } } + if(persist) + spell->source->counters->addCounter(-1,-1); + if(undying) + spell->source->counters->addCounter(1,1); delete spell; return 1; } diff --git a/projects/mtg/src/MTGRules.cpp b/projects/mtg/src/MTGRules.cpp index 3cb7ede58..458e63789 100644 --- a/projects/mtg/src/MTGRules.cpp +++ b/projects/mtg/src/MTGRules.cpp @@ -2289,19 +2289,28 @@ int MTGPersistRule::receiveEvent(WEvent * event) Player * p = game->players[i]; if (e->to == p->game->graveyard) { - MTGCardInstance * copy = p->game->putInZone(e->card, p->game->graveyard, e->card->owner->game->temp); + MTGCardInstance * copy = e->card; if (!copy) { DebugTrace("MTGRULES: couldn't move card for persist/undying"); return 0; } - Spell * spell = NEW Spell(game, copy); - spell->resolve(); + string code = ""; + bool persist = false; + bool undying = false; if(card->basicAbilities[(int)Constants::PERSIST]) - spell->source->counters->addCounter(-1, -1); + { + code = "Persist"; + persist = true; + } else - spell->source->counters->addCounter(1,1); - delete spell; + { + code = "Undying"; + undying = true; + } + AAMover *putinplay = NEW AAMover(game, game->mLayers->actionLayer()->getMaxId(), copy, copy,"ownerbattlefield",code,NULL,undying,persist); + putinplay->oneShot = true; + putinplay->fireAbility(); return 1; } } From abcb511a577819678e247a85a84387fab40a1abd Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Wed, 21 Oct 2015 10:07:31 +0800 Subject: [PATCH 213/249] Create ExchangeController.txt the current trigger check is static... fix is on the way :) --- .../mtg/bin/Res/test/ExchangeController.txt | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 projects/mtg/bin/Res/test/ExchangeController.txt diff --git a/projects/mtg/bin/Res/test/ExchangeController.txt b/projects/mtg/bin/Res/test/ExchangeController.txt new file mode 100644 index 000000000..887ddb4b5 --- /dev/null +++ b/projects/mtg/bin/Res/test/ExchangeController.txt @@ -0,0 +1,28 @@ +#Hypnotic Specter vs Control Magic +#The opponent of the current controller of Hypnotic Specter +#Must discard at random when combat damage is dealt... +[INIT] +FIRSTMAIN +[PLAYER1] +hand:Control Magic +inplay:Concordant Crossroads +manapool:{B}{B}{U}{U} +[PLAYER2] +inplay:Hypnotic Specter +hand:Forest +[DO] +Control Magic +Hypnotic Specter +next +next +Hypnotic Specter +next +eot +[ASSERT] +UNTAP +[PLAYER1] +inplay:Control Magic, Hypnotic Specter, Concordant Crossroads +[PLAYER2] +graveyard:Forest +life:18 +[END] From 743c2a6a5e780f3ec092b6fca9860fc80c18fcd4 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Wed, 21 Oct 2015 10:08:55 +0800 Subject: [PATCH 214/249] Update _tests.txt --- projects/mtg/bin/Res/test/_tests.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/projects/mtg/bin/Res/test/_tests.txt b/projects/mtg/bin/Res/test/_tests.txt index c55f155e7..5ef04fa98 100644 --- a/projects/mtg/bin/Res/test/_tests.txt +++ b/projects/mtg/bin/Res/test/_tests.txt @@ -311,6 +311,7 @@ evil_presence3.txt evil_presence_i647.txt evil_presence_i647_2.txt exaltedsourcekilled.txt +ExchangeController.txt executioners_swing.txt executioners_swing2.txt executioners_swing3.txt From 21eea225afcfe9d44e90e23677dbba0ca7665e38 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Wed, 21 Oct 2015 10:16:01 +0800 Subject: [PATCH 215/249] TrcardDrawn changes @drawn(who) -> static version @drawof(player) -> current controller of the card @drawfoeof(player) -> current opponent of the card --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 48 ++++++++----------- .../bin/Res/sets/primitives/unsupported.txt | 7 +++ projects/mtg/include/AllAbilities.h | 13 +++-- projects/mtg/src/MTGAbility.cpp | 11 ++++- 4 files changed, 47 insertions(+), 32 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index fd906ded1..bd3164b7f 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -2003,13 +2003,6 @@ power=1 toughness=1 [/card] [card] -name=Aladdin's Lamp -alias=1092 -text={X}, {T}: The next time you would draw a card this turn, instead look at the top X cards of your library, put all but one of them on the bottom of your library in a random order, then draw a card. X can't be 0. -mana={10} -type=Artifact -[/card] -[card] name=Aladdin's Ring auto={8}{T}:damage:4 target(creature,player) text={8}, {T}: Aladdin's Ring deals 4 damage to target creature or player. @@ -16223,7 +16216,7 @@ toughness=3 [/card] [card] name=Chasm Skulker -auto=@drawn(controller):counter(1/1,1) +auto=@drawof(player):counter(1/1,1) auto=@movedTo(this|Graveyard) from(myBattlefield):thisforeach(counter{1/1.1}):token(Squid,Creature Squid,1/1,islandwalk,blue) text=Whenever you draw a card, put a +1/+1 counter on Chasm Skulker. -- When Chasm Skulker dies, put X 1/1 blue Squid creature tokens with islandwalk onto the battlefield, where X is the number of +1/+1 counters on Chasm Skulker. mana={2}{U} @@ -18565,7 +18558,7 @@ subtype=Aura [card] name=Consecrated Sphinx abilities=flying -auto=@drawn(opponent):may draw:2 controller +auto=@drawfoeof(player):may draw:2 controller text=Flying -- Whenever an opponent draws a card, you may draw two cards. mana={4}{U}{U} type=Creature @@ -25550,8 +25543,8 @@ type=Instant [card] name=Diviner's Wand auto={3}:equip -auto=@drawn(controller):1/1 ueot -auto=@drawn(controller):flying ueot +auto=@drawof(player):1/1 ueot +auto=@drawof(player):flying ueot auto=teach(creature) {4}:draw:1 controller auto=@movedto(creature[wizard]|battlefield):may all(trigger[to]) retarget text=Equipped creature has "Whenever you draw a card, this creature gets +1/+1 and gains flying until end of turn" and "{4}: Draw a card." -- Whenever a Wizard creature enters the battlefield, you may attach Diviner's Wand to it. -- Equip {3} @@ -32875,7 +32868,7 @@ subtype=Aura [/card] [card] name=Fate Unraveler -auto=@drawn(opponent):damage:1 opponent +auto=@drawfoeof(player):damage:1 opponent text=Whenever an opponent draws a card, Fate Unraveler deals 1 damage to that player. mana={3}{B} type=Enchantment Creature @@ -46413,7 +46406,7 @@ toughness=2 [/card] [card] name=Hoofprints of the Stag -auto=@drawn(controller):may counter(0/0,1,Hoofprint) +auto=@drawof(player):may counter(0/0,1,Hoofprint) auto={C(0/0,-4,Hoofprint)}{2}{W}:token(Elemental,Creature Elemental,4/4,flying,white) myTurnOnly text=Whenever you draw a card, you may put a hoofprint counter on Hoofprints of the Stag. -- {2}{W}, Remove four hoofprint counters from Hoofprints of the Stag: Put a 4/4 white Elemental creature token with flying onto the battlefield. Activate this ability only during your turn. mana={1}{W} @@ -46477,7 +46470,7 @@ type=Land [card] name=Horizon Chimera abilities=flash,flying,trample -auto=@drawn(controller):life:1 controller +auto=@drawof(player):life:1 controller text=Flash. -- Flying. -- Trample. -- Whenever you draw a card, you gain 1 life. mana={2}{G}{U} type=Creature @@ -49936,7 +49929,7 @@ toughness=2 [/card] [card] name=Jace's Erasure -auto=@drawn(controller):may deplete:1 target(player) +auto=@drawof(player):may deplete:1 target(player) text=Whenever you draw a card, you may have target player put the top card of his or her library into his or her graveyard. mana={1}{U} type=Enchantment @@ -52160,7 +52153,7 @@ toughness=5 [/card] [card] name=Kederekt Parasite -auto=@drawn(opponent) restriction{type(*[red]|myBattlefield)~morethan~0}:may damage:1 opponent +auto=@drawfoeof(player) restriction{type(*[red]|myBattlefield)~morethan~0}:may damage:1 opponent text=Whenever an opponent draws a card, if you control a red permanent, you may have Kederekt Parasite deal 1 damage to that player. mana={B} type=Creature @@ -54794,7 +54787,7 @@ type=Sorcery [card] name=Laboratory Maniac abilities=cantmilllose -auto=@drawn(controller) restriction{type(*|mylibrary)~equalto~0}:wingame +auto=@drawof(player) restriction{type(*|mylibrary)~equalto~0}:wingame text=If you would draw a card while your library has no cards in it, you win the game instead. mana={2}{U} type=Creature @@ -57521,7 +57514,7 @@ toughness=2 [/card] [card] name=Lorescale Coatl -auto=@drawn(controller):may counter(1/1,1) +auto=@drawof(player):may counter(1/1,1) text=Whenever you draw a card, you may put a +1/+1 counter on Lorescale Coatl. mana={1}{G}{U} type=Creature @@ -62123,7 +62116,7 @@ type=Legendary Land [/card] [card] name=Mind's Eye -auto=@drawn(opponent):pay({1}) draw:1 +auto=@drawfoeof(player):pay({1}) draw:1 text=Whenever an opponent draws a card, you may pay {1}. If you do, draw a card. mana={5} type=Artifact @@ -67682,7 +67675,7 @@ toughness=5 [card] name=Niv-Mizzet, the Firemind abilities=flying -auto=@drawn(controller):damage:1 target(creature,player) +auto=@drawof(player):damage:1 target(creature,player) auto={T}:draw:1 text=Flying -- Whenever you draw a card, Niv-Mizzet, the Firemind deals 1 damage to target creature or player. -- {T}: Draw a card. mana={2}{U}{U}{R}{R} @@ -72799,8 +72792,8 @@ type=Sorcery [/card] [card] name=Phyrexian Tyranny -auto=@drawn(opponent):name(pay or lifeloss) ability$!name(pay or lifeloss) pay[[{2}]] name(pay 2 mana) donothing?life:-2!$ opponent -auto=@drawn(controller):name(pay or lifeloss) ability$!name(pay or lifeloss) pay[[{2}]] name(pay 2 mana) donothing?life:-2!$ controller +auto=@drawfoeof(player):name(pay or lifeloss) ability$!name(pay or lifeloss) pay[[{2}]] name(pay 2 mana) donothing?life:-2!$ opponent +auto=@drawof(player):name(pay or lifeloss) ability$!name(pay or lifeloss) pay[[{2}]] name(pay 2 mana) donothing?life:-2!$ controller text=Whenever a player draws a card, that player loses 2 life unless he or she pays {2}. mana={U}{B}{R} type=Enchantment @@ -75239,8 +75232,9 @@ subtype=Aura [/card] [card] name=Psychic Possession +target=opponent auto=phasealter(remove,draw,controller) -auto=@drawn(opponent):may draw:1 controller +auto=@drawn(targetedplayer):may draw:1 controller text=Enchant opponent -- Skip your draw step. -- Whenever enchanted opponent draws a card, you may draw a card. mana={2}{U}{U} type=Enchantment @@ -75297,7 +75291,7 @@ type=Enchantment [card] name=Psychosis Crawler auto=type:*:myhand/type:*:myhand cdaactive -auto=@drawn(controller):life:-1 opponent +auto=@drawof(player):life:-1 opponent text=Psychosis Crawler's power and toughness are each equal to the number of cards in your hand. - Whenever you draw a card, each opponent loses 1 life. mana={5} type=Artifact Creature @@ -94421,8 +94415,8 @@ subtype=Aura name=Spiteful Visions auto=@each my draw:draw:1 controller auto=@each opponent draw:draw:1 opponent -auto=@drawn(controller):damage:1 controller -auto=@drawn(opponent):damage:1 opponent +auto=@drawof(player):damage:1 controller +auto=@drawfoeof(player):damage:1 opponent text=At the beginning of each player's draw step, that player draws an additional card. -- Whenever a player draws a card, Spiteful Visions deals 1 damage to that player. mana={2}{BR}{BR} type=Enchantment @@ -106184,7 +106178,7 @@ subtype=Aura [/card] [card] name=Underworld Dreams -auto=@drawn(opponent):damage:1 opponent +auto=@drawfoeof(player):damage:1 opponent text=Whenever an opponent draws a card, Underworld Dreams deals 1 damage to him or her. mana={B}{B}{B} type=Enchantment diff --git a/projects/mtg/bin/Res/sets/primitives/unsupported.txt b/projects/mtg/bin/Res/sets/primitives/unsupported.txt index 1e5340bf6..75cbbd0c0 100644 --- a/projects/mtg/bin/Res/sets/primitives/unsupported.txt +++ b/projects/mtg/bin/Res/sets/primitives/unsupported.txt @@ -187,6 +187,13 @@ power=1 toughness=1 [/card] [card] +name=Aladdin's Lamp +alias=1092 +text={X}, {T}: The next time you would draw a card this turn, instead look at the top X cards of your library, put all but one of them on the bottom of your library in a random order, then draw a card. X can't be 0. +mana={10} +type=Artifact +[/card] +[card] name=Alive // Well text=Put a 3/3 green Centaur creature token onto the battlefield. -- // -- You gain 2 life for each creature you control. -- -- Fuse (You may cast one or both halves of this card from your hand.) mana={3}{G} // {W} diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index f91b70da7..21842845d 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -1196,9 +1196,9 @@ public: class TrcardDrawn: public Trigger { public: - - TrcardDrawn(GameObserver* observer, int id, MTGCardInstance * source, TargetChooser * tc,bool once = false) : - Trigger(observer, id, source,once, tc) + bool thiscontroller, thisopponent; + TrcardDrawn(GameObserver* observer, int id, MTGCardInstance * source, TargetChooser * tc,bool once = false, bool thiscontroller = false, bool thisopponent = false) : + Trigger(observer, id, source,once, tc),thiscontroller(thiscontroller),thisopponent(thisopponent) { } @@ -1207,7 +1207,12 @@ public: WEventcardDraw * e = dynamic_cast (event); if (!e) return 0; if (!tc->canTarget(e->player)) return 0; - + if(thiscontroller) + if(e->player != source->controller()) + return 0; + if(thisopponent) + if(e->player == source->controller()) + return 0; return 1; } diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index cbb1afe01..063d74f7c 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -825,7 +825,16 @@ TriggeredAbility * AbilityFactory::parseTrigger(string s, string, int id, Spell attackingTrigger,attackedAloneTrigger,notBlockedTrigger,attackBlockedTrigger,blockingTrigger); } - //Card card is drawn + + //drawn player - controller of card - dynamic version drawof(player) -> returns current controller even with exchange of card controller + if (TargetChooser * tc = parseSimpleTC(s, "drawof", card)) + return NEW TrcardDrawn(observer, id, card, tc,once,true,false); + + //drawn player - opponent of card controller - dynamic version drawfoeof(player) -> returns current opponent even with exchange of card controller + if (TargetChooser * tc = parseSimpleTC(s, "drawfoeof", card)) + return NEW TrcardDrawn(observer, id, card, tc,once,false,true); + + //Card card is drawn - static version - drawn(player) - any player; drawn(controller) - owner forever; drawn(opponent) - opponent forever if (TargetChooser * tc = parseSimpleTC(s, "drawn", card)) return NEW TrcardDrawn(observer, id, card, tc,once); From 3b0cd389e5c2066d072c030db7547bf3d9e57f13 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Wed, 21 Oct 2015 12:25:08 +0800 Subject: [PATCH 216/249] TrLifeGained changes @lifed/lifeloss(who) -> static version @lifeof/lifelostof(player) -> current controller of the card @lifefoeof/lifelostfoeof(player) -> current opponent of the card --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 36 ++++++++++---------- projects/mtg/include/AllAbilities.h | 12 +++++-- projects/mtg/src/MTGAbility.cpp | 32 +++++++++++++++-- 3 files changed, 57 insertions(+), 23 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index bd3164b7f..978f3d61c 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -1189,7 +1189,7 @@ toughness=2 [/card] [card] name=Ageless Entity -auto=@lifed(controller):all(trigger[to]) dynamicability +auto=@lifeof(player):all(trigger[to]) dynamicability text=Whenever you gain life, put that many +1/+1 counters on Ageless Entity. mana={3}{G}{G} type=Creature @@ -1531,7 +1531,7 @@ type=Enchantment [/card] [card] name=Ajani's Pridemate -auto=@lifed(controller):may counter(1/1,1) +auto=@lifeof(player):may counter(1/1,1) text=Whenever you gain life, you may put a +1/+1 counter on Ajani's Pridemate. mana={1}{W} type=Creature @@ -4247,7 +4247,7 @@ toughness=5 [card] name=Archangel of Thune abilities=flying,lifelink -auto=@lifed(controller):all(creature|mybattlefield) counter(1/1,1) +auto=@lifeof(player):all(creature|mybattlefield) counter(1/1,1) text=Flying. -- Lifelink. -- Whenever you gain life, put a +1/+1 counter on each creature you control. mana={3}{W}{W} type=Creature @@ -19564,7 +19564,7 @@ toughness=4 [/card] [card] name=Cradle of Vitality -auto=@lifed(controller):pay({1}{W}) counter(1/1,thatmuch) target(creature) +auto=@lifeof(player):pay({1}{W}) counter(1/1,thatmuch) target(creature) text=Whenever you gain life, you may pay {1}{W}. If you do, put a +1/+1 counter on target creature for each 1 life you gained. mana={3}{W} type=Enchantment @@ -23118,7 +23118,7 @@ subtype=Aura [/card] [card] name=Debt to the Deathless -auto=@lifeloss(opponent):life:thatmuch controller +auto=@lifelostfoeof(player):life:thatmuch controller auto=life:-twiceX opponent text=Each opponent loses two times X life. You gain life equal to the life lost this way. mana={X}{W}{W}{B}{B} @@ -27105,7 +27105,7 @@ toughness=2 [card] name=Drogskol Reaver abilities=flying,double strike,lifelink -auto=@lifed(controller):draw:1 controller +auto=@lifeof(player):draw:1 controller text=Flying, doublestrike, lifelink -- Whenever you gain life, draw a card. mana={5}{W}{U} type=Creature @@ -31831,7 +31831,7 @@ type=Instant [/card] [card] name=Exquisite Blood -auto=@lifeloss(opponent):life:thatmuch controller +auto=@lifelostfoeof(player):life:thatmuch controller text=Whenever an opponent loses life, you gain that much life. mana={4}{B} type=Enchantment @@ -32502,7 +32502,7 @@ toughness=2 #emblem ueot removes the effect, the ability acts an observer [card] name=False Cure -auto=emblem transforms((,newability[@lifed(opponent):life:-twicethatmuch opponent],newability[@lifed(controller):life:-twicethatmuch controller])) ueot +auto=emblem transforms((,newability[@lifefoeof(player):life:-twicethatmuch opponent],newability[@lifeof(player):life:-twicethatmuch controller])) ueot text=Until end of turn, whenever a player gains life, that player loses 2 life for each 1 life he or she gained. mana={B}{B} type=Instant @@ -52009,7 +52009,7 @@ toughness=3 [card] name=Kavu Predator abilities=trample -auto=@lifed(opponent):all(trigger[to]) dynamicability +auto=@lifefoeof(player):all(trigger[to]) dynamicability text=Trample -- Whenever an opponent gains life, put that many +1/+1 counters on Kavu Predator. mana={1}{G} type=Creature @@ -56111,7 +56111,7 @@ toughness=2 [card] name=Lich's Tomb abilities=cantlifelose -auto=@lifeloss(controller):ability$!sacrifice notatarget(*|mybattlefield)!$ controller +auto=@lifelostof(player):ability$!sacrifice notatarget(*|mybattlefield)!$ controller text=You don't lose the game for having 0 or less life. -- Whenever you lose life, sacrifice a permanent for each 1 life you lost. (Damage causes loss of life.) mana={4} type=Artifact @@ -62319,7 +62319,7 @@ toughness=2 [/card] [card] name=Mindcrank -auto=@lifeloss(opponent):deplete:thatmuch opponent +auto=@lifelostfoeof(player):deplete:thatmuch opponent text=Whenever an opponent loses life, that player puts that many cards from the top of his or her library into his or her graveyard. (Damage dealt by sources without infect causes loss of life.) mana={2} type=Artifact @@ -75488,7 +75488,7 @@ type=Instant name=Punishing Fire target=creature,player auto=damage:2 -autograveyard=@lifed(opponent):pay({R}) moveto(ownerhand) +autograveyard=@lifefoeof(player):pay({R}) moveto(ownerhand) text=Punishing Fire deals 2 damage to target creature or player. -- Whenever an opponent gains life, you may pay {R}. If you do, return Punishing Fire from your graveyard to your hand. mana={1}{R} type=Instant @@ -83325,7 +83325,7 @@ type=Sorcery [/card] [card] name=Sanguine Bond -auto=@lifed(controller):dynamicability +auto=@lifeof(player):dynamicability text=Whenever you gain life, target opponent loses that much life. mana={3}{B}{B} type=Enchantment @@ -85406,7 +85406,7 @@ type=Sorcery [/card] [card] name=Searing Meditation -auto=@lifed(controller):pay({2}) target(creature,player) damage:2 +auto=@lifeof(player):pay({2}) target(creature,player) damage:2 text=Whenever you gain life, you may pay {2}. If you do, Searing Meditation deals 2 damage to target creature or player. mana={1}{R}{W} type=Enchantment @@ -97584,7 +97584,7 @@ toughness=5 [card] name=Sunbond target=creature -auto=teach(creature) transforms((,newability[@lifed(controller):dynamicability])) +auto=teach(creature) transforms((,newability[@lifeof(player):dynamicability])) text=Enchant creature -- Enchanted creature has "Whenever you gain life, put that many +1/+1 counters on this creature." mana={3}{W} type=Enchantment @@ -104153,7 +104153,7 @@ name=Transcendence abilities=cantlifelose auto=this(controllerlife > 19)while winGame opponent auto=@damaged(controller):life:twicethatmuch controller -auto=@lifeloss(controller):life:twicethatmuch controller +auto=@lifelostof(player):life:twicethatmuch controller text=You don't lose the game for having 0 or less life. -- When you have 20 or more life, you lose the game. -- Whenever you lose life, you gain 2 life for each 1 life you lost. (Damage dealt to you causes you to lose life.) mana={3}{W}{W}{W} type=Enchantment @@ -109620,7 +109620,7 @@ type=Sorcery [card] name=Vizkopa Guildmage auto={1}{W}{B}:target(creature) lifelink ueot -auto={1}{W}{B}:name(lifeleech) emblem transforms((,newability[@lifed(controller):life:-thatmuch opponent])) ueot +auto={1}{W}{B}:name(lifeleech) emblem transforms((,newability[@lifeof(player):life:-thatmuch opponent])) ueot text={1}{W}{B}: Target creature gains lifelink until end of turn. -- {1}{W}{B}: Whenever you gain life this turn, each opponent loses that much life. mana={W}{B} type=Creature @@ -110922,7 +110922,7 @@ toughness=5 [card] name=Wall of Limbs abilities=defender -auto=@lifed(controller):counter(1/1,1) +auto=@lifeof(player):counter(1/1,1) auto={5}{B}{B}{S}:name(Lose Life) target(player) life:-storedpower text=Defender (This creature can't attack.) -- Whenever you gain life, put a +1/+1 counter on Wall of Limbs. -- {5}{B}{B}, Sacrifice Wall of Limbs: Target player loses X life, where X is Wall of Limbs's power. mana={2}{B} diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index 21842845d..f11a8a099 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -1342,9 +1342,9 @@ class TrLifeGained: public Trigger public: TargetChooser * fromTc; int type;//this allows damagenoncombat and combatdamage to share this trigger - bool sourceUntapped; - TrLifeGained(GameObserver* observer, int id, MTGCardInstance * source, TargetChooser * tc, TargetChooser * fromTc = NULL, int type = 0,bool sourceUntapped = false,bool once = false) : - Trigger(observer, id, source, once , tc), fromTc(fromTc), type(type) , sourceUntapped(sourceUntapped) + bool sourceUntapped, thiscontroller, thisopponent; + TrLifeGained(GameObserver* observer, int id, MTGCardInstance * source, TargetChooser * tc, TargetChooser * fromTc = NULL, int type = 0,bool sourceUntapped = false,bool once = false, bool thiscontroller = false, bool thisopponent = false) : + Trigger(observer, id, source, once , tc), fromTc(fromTc), type(type) , sourceUntapped(sourceUntapped) , thiscontroller(thiscontroller) , thisopponent(thisopponent) { } @@ -1358,6 +1358,12 @@ public: if (fromTc && !fromTc->canTarget(e->player)) return 0; if (type == 1 && (e->amount > 0)) return 0; if (type == 0 && (e->amount < 0)) return 0; + if(thiscontroller) + if(e->player != source->controller()) + return 0; + if(thisopponent) + if(e->player == source->controller()) + return 0; e->player->thatmuch = abs(e->amount); this->source->thatmuch = abs(e->amount); diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index 063d74f7c..67f724ac7 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -871,14 +871,42 @@ TriggeredAbility * AbilityFactory::parseTrigger(string s, string, int id, Spell return NEW TrDamaged(observer, id, card, tc, fromTc, 0,sourceUntapped,limitOnceATurn,once); } - //Lifed + //Lifed current controller + if (TargetChooser * tc = parseSimpleTC(s, "lifeof", card)) + { + TargetChooser *fromTc = parseSimpleTC(s, "from", card); + return NEW TrLifeGained(observer, id, card, tc, fromTc, 0,sourceUntapped,once,true,false); + } + + //Lifed current opponent + if (TargetChooser * tc = parseSimpleTC(s, "lifefoeof", card)) + { + TargetChooser *fromTc = parseSimpleTC(s, "from", card); + return NEW TrLifeGained(observer, id, card, tc, fromTc, 0,sourceUntapped,once,false,true); + } + + //Lifed static if (TargetChooser * tc = parseSimpleTC(s, "lifed", card)) { TargetChooser *fromTc = parseSimpleTC(s, "from", card); return NEW TrLifeGained(observer, id, card, tc, fromTc, 0,sourceUntapped,once); } - //Life Loss + //Life Loss current player + if (TargetChooser * tc = parseSimpleTC(s, "lifelostof", card)) + { + TargetChooser *fromTc = parseSimpleTC(s, "from", card); + return NEW TrLifeGained(observer, id, card, tc, fromTc,1,sourceUntapped,once,true,false); + } + + //Life Loss current opponent + if (TargetChooser * tc = parseSimpleTC(s, "lifelostfoeof", card)) + { + TargetChooser *fromTc = parseSimpleTC(s, "from", card); + return NEW TrLifeGained(observer, id, card, tc, fromTc,1,sourceUntapped,once,false,true); + } + + //Life Loss static if (TargetChooser * tc = parseSimpleTC(s, "lifeloss", card)) { TargetChooser *fromTc = parseSimpleTC(s, "from", card); From 704f7f4494d99f55ad7f6c50654b635ee4639754 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Wed, 21 Oct 2015 22:03:21 +0800 Subject: [PATCH 217/249] TrDamaged changes @damaged/combatdamaged/noncombatdamaged(who) -> static version @damageof/combatdamageof/noncombatdamageof(player) -> current controller of the card @damagefoeof/combatdamagefoeof/noncombatdamagefoeof(player) -> current opponent of the card combat/noncombat damaged - done... TODO: @damaged cards --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 251 +++++++++++-------- projects/mtg/include/AllAbilities.h | 15 +- projects/mtg/src/MTGAbility.cpp | 48 +++- 3 files changed, 211 insertions(+), 103 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 978f3d61c..edeeeeac8 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -1624,7 +1624,8 @@ toughness=1 [/card] [card] name=Akki Underminer -auto=@combatdamaged(player) from(this):choice name(player sacrifices) ability$!name(sacrifice) notatarget(*|mybattlefield) sacrifice!$ opponent +auto=@combatdamagefoeof(player) from(this):ability$!name(sacrifice) notatarget(*|mybattlefield) sacrifice!$ opponent +auto=@combatdamageof(player) from(this):ability$!name(sacrifice) notatarget(*|mybattlefield) sacrifice!$ controller text=Whenever Akki Underminer deals combat damage to a player, that player sacrifices a permanent. mana={3}{R} type=Creature @@ -4169,7 +4170,7 @@ toughness=0 [card] name=Arcbound Slith auto=counter(1/1,1) -auto=@combatdamaged(opponent) from(this):counter(1/1,1) +auto=@combatdamaged(player) from(this):counter(1/1,1) auto=@movedTo(this|mygraveyard) from(myBattlefield):may thisforeach(counter{1/1.1}) counter(1/1,1) target(creature[artifact]) text=Whenever Arcbound Slith deals combat damage to a player, put a +1/+1 counter on it. -- Modular 1 (This enters the battlefield with a +1/+1 counter on it. When it's put into a graveyard, you may put its +1/+1 counters on target artifact creature.) mana={2} @@ -5353,7 +5354,8 @@ toughness=3 [/card] [card] name=Ashling, the Extinguisher -auto=@combatdamaged(opponent) from(this):target(creature|opponentbattlefield) sacrifice +auto=@combatdamagefoeof(player) from(this):target(creature|opponentbattlefield) sacrifice +auto=@combatdamageof(player) from(this):target(creature|mybattlefield) sacrifice text=Whenever Ashling, the Extinguisher deals combat damage to a player, choose target creature that player controls. He or she sacrifices that creature. mana={2}{B}{B} type=Legendary Creature @@ -7054,7 +7056,8 @@ toughness=3 [card] name=Balefire Dragon abilities=flying -auto=@combatdamaged(opponent) from(this):all(creature|opponentbattlefield) damage:thatmuch +auto=@combatdamagefoeof(player) from(this):all(creature|opponentbattlefield) damage:thatmuch +auto=@combatdamageof(player) from(this):all(creature|mybattlefield) damage:thatmuch text=Flying -- Whenever Balefire Dragon deals combat damage to a player, it deals that much damage to each creature that player controls. mana={5}{R}{R} type=Creature @@ -9555,7 +9558,8 @@ subtype=Arcane [card] name=Blazing Specter abilities=flying,haste -auto=@combatdamaged(opponent) from(this):ability$!name(discard) target(*|myhand) reject!$ opponent +auto=@combatdamagefoeof(player) from(this):ability$!name(discard) target(*|myhand) reject!$ opponent +auto=@combatdamageof(player) from(this):ability$!name(discard) target(*|myhand) reject!$ controller text=Flying, haste -- Whenever Blazing Specter deals combat damage to a player, that player discards a card. mana={2}{B}{R} type=Creature @@ -9842,7 +9846,8 @@ toughness=3 [card] name=Blinding Angel abilities=flying -auto=@combatdamaged(opponent) from(this):nextphasealter(remove,combatbegins,opponent) && nextphasealter(remove,combatattackers,opponent) && nextphasealter(remove,combatblockers,opponent) && nextphasealter(remove,combatdamage,opponent) && nextphasealter(remove,combatends,opponent) +auto=@combatdamagefoeof(player) from(this):nextphasealter(remove,combatbegins,opponent) && nextphasealter(remove,combatattackers,opponent) && nextphasealter(remove,combatblockers,opponent) && nextphasealter(remove,combatdamage,opponent) && nextphasealter(remove,combatends,opponent) +auto=@combatdamageof(player) from(this):nextphasealter(remove,combatbegins,controller) && nextphasealter(remove,combatattackers,controller) && nextphasealter(remove,combatblockers,controller) && nextphasealter(remove,combatdamage,controller) && nextphasealter(remove,combatends,controller) text=Flying (This creature can't be blocked except by creatures with flying or reach.) -- Whenever Blinding Angel deals combat damage to a player, that player skips his or her next combat phase. mana={3}{W}{W} type=Creature @@ -10043,7 +10048,8 @@ toughness=5 [card] name=Blizzard Specter abilities=flying -auto=@combatdamaged(player) from(this):all(this) transforms((,newability[choice name(bounce) ability$! target(*|mybattlefield) moveTo(ownerhand) !$opponent],newability[choice name(discard) ability$! target(*|myhand) reject !$opponent])) ueot +auto=@combatdamagefoeof(player) from(this):all(this) transforms((,newability[choice name(bounce) ability$! target(*|mybattlefield) moveTo(ownerhand) !$opponent],newability[choice name(discard) ability$! target(*|myhand) reject !$opponent])) ueot +auto=@combatdamageof(player) from(this):all(this) transforms((,newability[choice name(bounce) ability$! target(*|mybattlefield) moveTo(ownerhand) !$controller],newability[choice name(discard) ability$! target(*|myhand) reject !$controller])) ueot text=Flying -- Whenever Blizzard Specter deals combat damage to a player, choose one - That player returns a permanent he or she controls to its owner's hand; or that player discards a card. mana={2}{U}{B} type=Snow Creature @@ -12874,8 +12880,8 @@ toughness=1 [/card] [card] name=Brood Sliver -auto=@combatdamaged(opponent) from(sliver):may token(Sliver,Creature Sliver,1/1) -auto=@combatdamaged(controller) from(sliver):may token(Sliver,Creature Sliver,1/1) +auto=@combatdamagefoeof(player) from(sliver|mybattlefield):token(Sliver,Creature Sliver,1/1) controller +auto=@combatdamageof(player) from(sliver|opponentbattlefield):token(Sliver,Creature Sliver,1/1) opponent text=Whenever a Sliver deals combat damage to a player, its controller may put a 1/1 colorless Sliver creature token onto the battlefield. mana={4}{G} type=Creature @@ -13549,7 +13555,8 @@ type=Land [/card] [card] name=Cabal Executioner -auto=@combatdamaged(player) from(this):ability$!name(sacrifice) notatarget(creature|mybattlefield) sacrifice!$ opponent +auto=@combatdamagefoeof(player) from(this):ability$!name(sacrifice) notatarget(creature|mybattlefield) sacrifice!$ opponent +auto=@combatdamageof(player) from(this):ability$!name(sacrifice) notatarget(creature|mybattlefield) sacrifice!$ controller facedown={3} autofacedown={3}{B}{B}:morph text=Whenever Cabal Executioner deals combat damage to a player, that player sacrifices a creature. -- Morph {3}{B}{B} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) @@ -13597,7 +13604,8 @@ type=Instant [/card] [card] name=Cabal Slaver -auto=@combatdamaged(opponent) from(goblin|mybattlefield):ability$!name(discard) target(*|mybattefield) sacrifice !$ opponent +auto=@combatdamagefoeof(player) from(goblin|mybattlefield):ability$!name(discard) notatarget(*|myhand) reject!$ opponent +auto=@combatdamageof(player) from(goblin|opponentbattlefield):ability$!name(discard) notatarget(*|myhand) reject!$ controller text=Whenever a Goblin deals combat damage to a player, that player discards a card. mana={2}{B} type=Creature @@ -14960,7 +14968,8 @@ subtype=Aura [card] name=Caustic Wasps abilities=flying -auto=@combatdamaged(player) from(this):may destroy target(artifact|opponentbattlefield) +auto=@combatdamagefoeof(player) from(this):may destroy target(artifact|opponentbattlefield) +auto=@combatdamageof(player) from(this):may destroy target(artifact|mybattlefield) text=Flying -- Whenever Caustic Wasps deals combat damage to a player, you may destroy target artifact that player controls. mana={2}{G} type=Creature @@ -15167,7 +15176,7 @@ toughness=3 name=Celestial Mantle target=creature auto=3/3 -auto=@combatdamaged(player) from(mytgt):life:lifetotal owner +auto=teach(creature) transforms((,newability[@combatdamaged(player) from(this):life:lifetotal controller])) text=Enchant creature -- Enchanted creature gets +3/+3. -- Whenever enchanted creature deals combat damage to a player, double its controller's life total. mana={3}{W}{W}{W} type=Enchantment @@ -15393,7 +15402,8 @@ type=Land [/card] [card] name=Cephalid Constable -auto=@combatdamaged(opponent) from(this):name(bounce) ability$!name(bounce) target(*|opponentbattlefield) moveto(ownerhand) !$ controller +auto=@combatdamagefoeof(player) from(this):name(bounce) ability$!name(bounce) target(*|opponentbattlefield) moveto(ownerhand) !$ controller +auto=@combatdamageof(player) from(this):name(bounce) ability$!name(bounce) target(*|mybattlefield) moveto(ownerhand) !$ controller text=Whenever Cephalid Constable deals combat damage to a player, return up to that many target permanents that player controls to their owners' hands. mana={1}{U}{U} type=Creature @@ -15886,7 +15896,7 @@ toughness=2 [card] name=Chandra's Spitfire abilities=flying -auto=@noncombatdamaged(opponent):3/0 ueot +auto=@noncombatdamagefoeof(player):3/0 ueot text=Flying -- Whenever an opponent is dealt noncombat damage, Chandra's Spitfire gets +3/+0 until end of turn. mana={2}{R} type=Creature @@ -16375,7 +16385,8 @@ type=Instant [card] name=Chilling Apparition auto={B}:regenerate -auto=@combatdamaged(opponent) from(this):ability$!name(discard) target(*|myhand) reject!$ opponent +auto=@combatdamagefoeof(player) from(this):ability$!name(discard) target(*|myhand) reject!$ opponent +auto=@combatdamageof(player) from(this):ability$!name(discard) target(*|myhand) reject!$ controller text={B}: Regenerate Chilling Apparition. -- Whenever Chilling Apparition deals combat damage to a player, that player discards a card. mana={2}{B} type=Creature @@ -17947,7 +17958,7 @@ toughness=3 [/card] [card] name=Coastal Piracy -auto=@combatdamaged(opponent) from(creature|myBattlefield):may draw:1 controller +auto=@combatdamagefoeof(player) from(creature|myBattlefield):may draw:1 controller text=Whenever a creature you control deals combat damage to an opponent, you may draw a card. mana={2}{U}{U} type=Enchantment @@ -18308,7 +18319,7 @@ color=white [card] name=Commando Raid target=creature|mybattlefield -auto=transforms((,newability[@combatdamaged(opponent) from(this):may dynamicability target(creature|opponentbattlefield)])) ueot +auto=transforms((,newability[@combatdamageof(player) from(this):may dynamicability target(creature|mybattlefield)],newability[@combatdamagefoeof(player) from(this):may dynamicability target(creature|opponentbattlefield)])) ueot text=Until end of turn, target creature you control gains "When this creature deals combat damage to a player, you may have it deal damage equal to its power to target creature that player controls." mana={2}{R} type=Instant @@ -20094,7 +20105,8 @@ type=Instant [card] name=Crosis, the Purger abilities=flying -auto=@combatdamaged(player) from(this):pay({2}{B}) activatechooseacolor all(*[chosencolor]|opponenthand) reject activatechooseend +auto=@combatdamagefoeof(player) from(this):pay({2}{B}) activatechooseacolor all(*[chosencolor]|opponenthand) reject activatechooseend +auto=@combatdamageof(player) from(this):pay({2}{B}) activatechooseacolor all(*[chosencolor]|myhand) reject activatechooseend text=Flying -- Whenever Crosis, the Purger deals combat damage to a player, you may pay {2}{B}. If you do, choose a color, then that player reveals his or her hand and discards all cards of that color. mana={3}{U}{B}{R} type=Legendary Creature @@ -20151,7 +20163,8 @@ toughness=1 [/card] [card] name=Crosstown Courier -auto=@combatdamaged(player) from(this):deplete:thatmuch opponent +auto=@combatdamagefoeof(player) from(this):deplete:thatmuch opponent +auto=@combatdamageof(player) from(this):deplete:thatmuch controller text=Whenever Crosstown Courier deals combat damage to a player, that player puts that many cards from the top of his or her library into his or her graveyard. mana={1}{U} type=Creature @@ -22345,7 +22358,8 @@ type=Sorcery name=Dawning Purist facedown={3} autofacedown={1}{W}:morph -auto=@combatdamaged(opponent) from(this):may destroy target(enchantment|opponentbattlefield) +auto=@combatdamagefoeof(player) from(this):may destroy target(enchantment|opponentbattlefield) +auto=@combatdamageof(player) from(this):may destroy target(enchantment|mybattlefield) text=Whenever Dawning Purist deals combat damage to a player, you may destroy target enchantment that player controls. -- Morph {1}{W} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) mana={2}{W} type=Creature @@ -24731,7 +24745,8 @@ type=Artifact [/card] [card] name=Dimir Cutpurse -auto=@combatdamaged(opponent) from(this):ability$!name(discard) target(*|myhand) reject!$ opponent && draw:1 controller +auto=@combatdamagefoeof(player) from(this):ability$!name(discard) target(*|myhand) reject!$ opponent && draw:1 controller +auto=@combatdamageof(player) from(this):ability$!name(discard) target(*|myhand) reject!$ controller && draw:1 controller text=Whenever Dimir Cutpurse deals combat damage to a player, that player discards a card and you draw a card. mana={1}{U}{B} type=Creature @@ -25730,7 +25745,8 @@ toughness=1 [card] name=Doomsday Specter abilities=flying -auto=@combatdamaged(player) from(this|mybattlefield):reject target(*|opponenthand) +auto=@combatdamagefoeof(player) from(this):reject target(*|opponenthand) +auto=@combatdamageof(player) from(this):reject target(*|myhand) auto=moveTo(ownerhand) notatarget(creature[blue;black]|myBattlefield) text=Flying -- When Doomsday Specter enters the battlefield, return a blue or black creature you control to its owner's hand. -- Whenever Doomsday Specter deals combat damage to a player, look at that player's hand and choose a card from it. The player discards that card. mana={2}{U}{B} @@ -27050,8 +27066,7 @@ toughness=1 [card] name=Drinker of Sorrow abilities=cantblock -auto=@combatdamaged(player) from(this):moveto(graveyard) notatarget(*|myBattlefield) -auto=@combatdamaged(creature) from(this):moveto(graveyard) notatarget(*|myBattlefield) +auto=@combatdamaged(creature,player) from(this):sacrifice notatarget(*|myBattlefield) text=Drinker of Sorrow can't block. -- Whenever Drinker of Sorrow deals combat damage, sacrifice a permanent. mana={2}{B} type=Creature @@ -28470,7 +28485,8 @@ toughness=4 [card] name=Ebonblade Reaper auto=@combat(attacking) source(this):life:-halfuplifetotal controller -auto=@combatdamaged(opponent) from(this):life:-halfupopponentlifetotal opponent +auto=@combatdamagefoeof(player) from(this):life:-halfupopponentlifetotal opponent +auto=@combatdamageof(player) from(this):life:-halfuplifetotal controller facedown={3} autofacedown={3}{b}{b}:morph text=Whenever Ebonblade Reaper attacks, you lose half your life, rounded up. -- Whenever Ebonblade Reaper deals combat damage to a player, that player loses half his or her life, rounded up. -- Morph {3}{B}{B} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) @@ -28664,7 +28680,7 @@ subtype=Aura [/card] [card] name=Edric, Spymaster of Trest -auto=@combatdamaged(opponent) from(creature|mybattlefield):may draw:1 controller +auto=@combatdamagefoeof(player) from(creature|mybattlefield):may draw:1 controller text=Whenever a creature deals combat damage to one of your opponents, that creature's controller may draw a card. mana={1}{G}{U} type=Legendary Creature @@ -28991,7 +29007,7 @@ type=Instant [/card] [card] name=Electryte -auto=@combatdamaged(player) from(this):all(creature[blocking]) dynamicability +auto=@combatdamagefoeof(player) from(this):all(creature[blocking]) dynamicability text=Whenever Electryte deals combat damage to defending player, it deals damage equal to its power to each blocking creature. mana={3}{R}{R} type=Creature @@ -29922,7 +29938,8 @@ type=Artifact [card] name=Emissary of Despair abilities=flying -auto=@combatdamaged(player) from(this):life:-type:artifact:opponentbattlefield opponent +auto=@combatdamagefoeof(player) from(this):life:-type:artifact:opponentbattlefield opponent +auto=@combatdamageof(player) from(this):life:-type:artifact:mybattlefield controller text=Flying -- Whenever Emissary of Despair deals combat damage to a player, that player loses 1 life for each artifact he or she controls. mana={1}{B}{B} type=Creature @@ -29933,7 +29950,8 @@ toughness=1 [card] name=Emissary of Hope abilities=flying -auto=@combatdamaged(player) from(this):life:type:artifact:opponentbattlefield controller +auto=@combatdamagefoeof(player) from(this):life:type:artifact:opponentbattlefield controller +auto=@combatdamageof(player) from(this):life:type:artifact:mybattlefield controller text=Flying -- Whenever Emissary of Hope deals combat damage to a player, you gain 1 life for each artifact that player controls. mana={1}{W}{W} type=Creature @@ -30799,7 +30817,7 @@ subtype=God [card] name=Erdwal Ripper abilities=haste -auto=@combatdamaged(opponent) from(this):counter(1/1,1) +auto=@combatdamaged(player) from(this):counter(1/1,1) text=Haste -- Whenever Erdwal Ripper deals combat damage to a player, put a +1/+1 counter on it. mana={1}{R}{R} type=Creature @@ -38155,7 +38173,8 @@ toughness=4 [card] name=Ghastlord of Fugue auto=unblockable -auto=@combatdamaged(player) from(this):moveTo(myexile) target(*|opponenthand) +auto=@combatdamagefoeof(player) from(this):may moveTo(myexile) target(*|opponenthand) +auto=@combatdamageof(player) from(this):may moveTo(myexile) target(*|myhand) text=Ghastlord of Fugue is unblockable. -- Whenever Ghastlord of Fugue deals combat damage to a player, that player reveals his or her hand. You choose a card from it. That player exiles that card. mana={UB}{UB}{UB}{UB}{UB} type=Creature @@ -41572,8 +41591,8 @@ type=Instant [card] name=Graveblade Marauder abilities=deathtouch -auto=@combatdamaged(opponent) from(this):life:-type:creature:mygraveyard opponent -auto=@combatdamaged(controller) from(this):life:-type:creature:mygraveyard controller +auto=@combatdamagefoeof(player) from(this):life:-type:creature:mygraveyard opponent +auto=@combatdamageof(player) from(this):life:-type:creature:mygraveyard controller text=Deathtouch (Any amount of damage this deals to a creature is enough to destroy it.) -- Whenever Graveblade Marauder deals combat damage to a player, that player loses life equal to the number of creature cards in your graveyard. mana={2}{B} type=Creature @@ -41918,7 +41937,8 @@ type=Enchantment [card] name=Greater Harvester auto=@each my upkeep:sacrifice notatarget(creature|mybattlefield) -auto=@combatdamaged(opponent) from(this):ability$!name(sacrifice 2 permanents) target(<2>*|mybattlefield) sacrifice!$ opponent +auto=@combatdamagefoeof(player) from(this):ability$!name(sacrifice 2 permanents) target(<2>*|mybattlefield) sacrifice!$ opponent +auto=@combatdamageof(player) from(this):ability$!name(sacrifice 2 permanents) target(<2>*|mybattlefield) sacrifice!$ controller text=At the beginning of your upkeep, sacrifice a permanent. -- Whenever Greater Harvester deals combat damage to a player, that player sacrifices two permanents. mana={2}{B}{B}{B} type=Creature @@ -43117,7 +43137,8 @@ subtype=Aura name=Guul Draz Specter abilities=flying auto=aslongas(*|opponenthand) 3/3 while <1 -auto=@combatdamaged(opponent) from(this):ability$!name(discard) target(*|myhand) reject!$ opponent +auto=@combatdamagefoeof(player) from(this):ability$!name(discard) target(*|myhand) reject!$ opponent +auto=@combatdamageof(player) from(this):ability$!name(discard) target(*|myhand) reject!$ controller text=Flying -- Guul Draz Specter gets +3/+3 as long as an opponent has no cards in hand. -- Whenever Guul Draz Specter deals combat damage to a player, that player discards a card. mana={2}{B}{B} type=Creature @@ -43655,8 +43676,8 @@ type=Legendary Enchantment Artifact name=Hammer of Ruin auto={2}:equip auto=2/0 -auto=@combatdamaged(controller) from(this):may destroy target(equipment|myBattlefield) -auto=@combatdamaged(opponent) from(this):may destroy target(equipment|opponentBattlefield) +auto=teach(creature) transforms((,newability[@combatdamageof(player) from(this):may destroy target(equipment|myBattlefield)])) +auto=teach(creature) transforms((,newability[@combatdamagefoeof(player) from(this):may destroy target(equipment|opponentBattlefield)])) text=Equipped creature gets +2/+0. -- Whenever equipped creature deals combat damage to a player, you may destroy target Equipment that player controls. -- Equip {2} mana={2} type=Artifact @@ -44191,7 +44212,8 @@ toughness=3 [/card] [card] name=Haunted Cadaver -auto=@combatdamaged(player) from(this):may ability$!name(discard 3 cards) target(<3>*|myhand) reject!$ opponent && sacrifice all(this) +auto=@combatdamagefoeof(player) from(this):may ability$!name(discard 3 cards) target(<3>*|myhand) reject!$ opponent && sacrifice all(this) +auto=@combatdamageof(player) from(this):may ability$!name(discard 3 cards) target(<3>*|myhand) reject!$ controller && sacrifice all(this) facedown={3} autofacedown={1}{B}:morph text=Whenever Haunted Cadaver deals combat damage to a player, you may sacrifice it. If you do, that player discards three cards. -- Morph {1}{B} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) @@ -44405,7 +44427,8 @@ toughness=2 [/card] [card] name=Headhunter -auto=@combatdamaged(opponent) from(this):ability$!name(discard) target(*|myhand) reject!$ opponent +auto=@combatdamagefoeof(player) from(this):ability$!name(discard) target(*|myhand) reject!$ opponent +auto=@combatdamageof(player) from(this):ability$!name(discard) target(*|myhand) reject!$ controller autofacedown={B}:morph facedown={3} text=Whenever Headhunter deals combat damage to a player, that player discards a card. -- Morph {B} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) @@ -45178,7 +45201,7 @@ toughness=8 [card] name=Hellkite Tyrant abilities=flying,trample -auto=@combatdamaged(player) from(this):all(artifact|opponentbattlefield) transforms((,newability[moveTo(opponentBattlefield)])) +auto=@combatdamagefoeof(player) from(this):moveTo(myBattlefield) all(artifact|opponentbattlefield) auto=@each my upkeep restriction{type(artifact|myBattlefield)~morethan~19}:winGame text=Flying, trample -- Whenever Hellkite Tyrant deals combat damage to a player, gain control of all artifacts that player controls. -- At the beginning of your upkeep, if you control twenty or more artifacts, you win the game. mana={4}{R}{R} @@ -47499,7 +47522,7 @@ type=Sorcery [card] name=Hypnotic Specter abilities=flying -auto=@damaged(opponent) from(this):discard:1 opponent +auto=@damagefoeof(player) from(this):discard:1 opponent text=Flying -- Whenever Hypnotic Specter deals damage to an opponent, that player discards a card at random. mana={1}{B}{B} type=Creature @@ -48865,7 +48888,8 @@ toughness=11 [card] name=Ink-Eyes, Servant of Oni autohand={3}{B}{B}{N}:ninjutsu -auto=@combatdamaged(player) from(this):may moveTo(myBattlefield) target(creature|opponentgraveyard) +auto=@combatdamagefoeof(player) from(this):may moveTo(myBattlefield) target(creature|opponentgraveyard) +auto=@combatdamageof(player) from(this):may moveTo(myBattlefield) target(creature|mygraveyard) auto={1}{B}:all(this) regenerate text=Ninjutsu {3}{B}{B} ({3}{B}{B}, Return an unblocked attacker you control to hand: Put this card onto the battlefield from your hand tapped and attacking.) -- Whenever Ink-Eyes, Servant of Oni deals combat damage to a player, you may put target creature card from that player's graveyard onto the battlefield under your control. -- {1}{B}: Regenerate Ink-Eyes. mana={4}{B}{B} @@ -50041,7 +50065,7 @@ type=Sorcery [card] name=Jagged Poppet auto=@damaged(this):ability$!name(discard) target(*|myhand) reject!$ controller -auto=@combatdamaged(opponent) from(this) restriction{type(*|myhand)~lessthan~1}:ability$!name(discard) target(*|myhand) reject!$ opponent +auto=@combatdamagefoeof(player) from(this) restriction{type(*|myhand)~lessthan~1}:ability$!name(discard) target(*|myhand) reject!$ opponent text=Whenever Jagged Poppet is dealt damage, discard that many cards. -- Hellbent - Whenever Jagged Poppet deals combat damage to a player, if you have no cards in hand, that player discards cards equal to the damage. mana={1}{B}{R} type=Creature @@ -54961,7 +54985,7 @@ toughness=2 [/card] [card] name=Silverpelt Werewolf -auto=@combatdamaged(opponent) from(this):draw:1 controller +auto=@combatdamaged(player) from(this):draw:1 controller auto=@each upkeep restriction{lastturn(*|stack)~morethan~1}:flip(Lambholt Elder) text=Whenever Silverpelt Werewolf deals combat damage to a player, draw a card. -- At the beginning of each upkeep, if a player cast two or more spells last turn, transform Silverpelt Werewolf. color=green @@ -55104,7 +55128,8 @@ type=Sorcery [/card] [card] name=Larceny -auto=@combatdamaged(player) from(creature|mybattlefield):all(trigger[to]) ability$!name(discard) target(*|myhand) reject!$ opponent +auto=@combatdamagefoeof(player) from(creature|mybattlefield):all(trigger[to]) ability$!name(discard) target(*|myhand) reject!$ opponent +auto=@combatdamageof(player) from(creature|mybattlefield):all(trigger[to]) ability$!name(discard) target(*|myhand) reject!$ controller text=Whenever a creature you control deals combat damage to a player, that player discards a card. mana={3}{B}{B} type=Enchantment @@ -56634,7 +56659,8 @@ toughness=1 [card] name=Lightwielder Paladin abilities=first strike -auto=@combatdamaged(player) from(this):may moveTo(exile) target(*[black;red]|opponentBattlefield) +auto=@combatdamagefoeof(player) from(this):may moveTo(exile) target(*[black;red]|opponentBattlefield) +auto=@combatdamageof(player) from(this):may moveTo(exile) target(*[black;red]|myBattlefield) text=First strike (This creature deals combat damage before creatures without first strike.) -- Whenever Lightwielder Paladin deals combat damage to a player, you may exile target black or red permanent that player controls. mana={3}{W}{W} type=Creature @@ -56717,8 +56743,9 @@ type=Enchantment [card] name=Liliana's Reaver abilities=deathtouch -auto=@combatdamaged(opponent) from(this):token(-370740) -auto=@combatdamaged(opponent) from(this):ability$!name(discard) notatarget(*|myhand) reject!$ opponent +auto=@combatdamaged(player) from(this):token(-370740) +auto=@combatdamagefoeof(player) from(this):ability$!name(discard) notatarget(*|myhand) reject!$ opponent +auto=@combatdamageof(player) from(this):ability$!name(discard) notatarget(*|myhand) reject!$ controller text=Deathtouch. -- Whenever Liliana's Reaver deals combat damage to a player, that player discards a card and you put a 2/2 black Zombie creature token onto the battlefield tapped. mana={2}{B}{B} type=Creature @@ -59976,7 +60003,7 @@ subtype=Aura [card] name=Markov Blademaster abilities=double strike -auto=@combatdamaged(opponent) from(this):counter(1/1,1) +auto=@combatdamaged(player) from(this):counter(1/1,1) text=Double strike -- Whenever Markov Blademaster deals combat damage to a player, put a +1/+1 counter on it. mana={1}{R}{R} type=Creature @@ -61809,7 +61836,7 @@ toughness=2 [/card] [card] name=Michiko Konda, Truth Seeker -auto=@combatdamaged(controller) from(creature|opponentbattlefield):ability$!name(sacrifice permanent) notatarget(*|mybattlefield) sacrifice!$ opponent +auto=@damageof(player) from(*|opponentstack,opponentbattlefield,opponentgraveyard,opponenthand,opponentexile):ability$!name(sacrifice permanent) notatarget(*|mybattlefield) sacrifice!$ opponent text=Whenever a source an opponent controls deals damage to you, that player sacrifices a permanent. mana={3}{W} type=Legendary Creature @@ -62358,7 +62385,8 @@ toughness=1 [card] name=Mindleech Mass abilities=trample -auto=@combatdamaged(player) from(this):may target(*[-land]|opponenthand) castcard(normal) +auto=@combatdamagefoeof(player) from(this):may target(*[-land]|opponenthand) castcard(normal) +auto=@combatdamageof(player) from(this):may target(*[-land]|myhand) castcard(normal) text=Trample -- Whenever Mindleech Mass deals combat damage to a player, you may look at that player's hand. If you do, you may cast a nonland card in it without paying that card's mana cost. mana={5}{U}{B}{B} type=Creature @@ -62399,7 +62427,7 @@ type=Enchantment [card] name=Mindscour Dragon abilities=flying -auto=@combatdamaged(opponent) from(this):deplete:4 target(player) +auto=@combatdamagefoeof(player) from(this):deplete:4 target(player) text=Flying -- Whenever Mindscour Dragon deals combat damage to an opponent, target player puts the top 4 cards of his or her library into his or her graveyard. mana={4}{U}{U} type=Creature @@ -63057,7 +63085,8 @@ toughness=4 [card] name=Mistblade Shinobi autohand={U}{N}:ninjutsu -auto=@combatdamaged(player) from(this):may moveTo(ownerhand) target(creature|opponentBattlefield) +auto=@combatdamagefoeof(player) from(this):may moveTo(ownerhand) target(creature|opponentBattlefield) +auto=@combatdamageof(player) from(this):may moveTo(ownerhand) target(creature|myBattlefield) 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 Mistblade Shinobi deals combat damage to a player, you may return target creature that player controls to its owner's hand. mana={2}{U} type=Creature @@ -64283,7 +64312,8 @@ type=Sorcery name=Mordant Dragon abilities=flying auto={1}{R}:1/0 -auto=@combatdamaged(opponent) from(this):may name(same amount of damage to opponent's creature) damage:thatmuch target(creature|opponentbattlefield) +auto=@combatdamagefoeof(player) from(this):may name(same amount of damage to opponent's creature) damage:thatmuch target(creature|opponentbattlefield) +auto=@combatdamageof(player) from(this):may name(same amount of damage to controller creature) damage:thatmuch target(creature|mybattlefield) text=Flying -- {1}{R}: Mordant Dragon gets +1/+0 until end of turn. -- Whenever Mordant Dragon deals combat damage to a player, you may have it deal that much damage to target creature that player controls. mana={3}{R}{R}{R} type=Creature @@ -66465,7 +66495,8 @@ type=Enchantment [card] name=Needle Specter abilities=flying,wither -auto=@combatdamaged(opponent) from(this):ability$!name(discard) target(*|myhand) reject!$ opponent +auto=@combatdamagefoeof(player) from(this):ability$!name(discard) target(*|myhand) reject!$ opponent +auto=@combatdamageof(player) from(this):ability$!name(discard) target(*|myhand) reject!$ controller text=Flying -- Wither (This deals damage to creatures in the form of -1/-1 counters.) -- Whenever Needle Specter deals combat damage to a player, that player discards that many cards. mana={1}{B}{B} type=Creature @@ -68951,7 +68982,8 @@ type=Artifact [/card] [card] name=Okiba-Gang Shinobi -auto=@combatdamaged(opponent) from(this):ability$!name(discard 2 cards) target(<2>*|myhand) reject!$ opponent +auto=@combatdamagefoeof(player) from(this):ability$!name(discard 2 cards) target(<2>*|myhand) reject!$ opponent +auto=@combatdamageof(player) from(this):ability$!name(discard 2 cards) target(<2>*|myhand) reject!$ controller autohand={3}{B}{N}:ninjutsu 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 Okiba-Gang Shinobi deals combat damage to a player, that player discards two cards. mana={3}{B}{B} @@ -69158,7 +69190,8 @@ type=Artifact name=Oona's Blackguard abilities=flying auto=@movedto(other rogue|myBattlefield):all(trigger[to]) counter(1/1,1) -auto=@combatdamaged(opponent) from(creature[counter{1/1.1}]|mybattlefield):ability$!name(discard) target(*|myhand) reject!$ opponent +auto=@combatdamagefoeof(player) from(creature[counter{1/1.1}]|mybattlefield):ability$!name(discard) target(*|myhand) reject!$ opponent +auto=@combatdamageof(player) from(creature[counter{1/1.1}]|mybattlefield):ability$!name(discard) target(*|myhand) reject!$ controller text=Flying -- Each other Rogue creature you control enters the battlefield with an additional +1/+1 counter on it. -- Whenever a creature you control with a +1/+1 counter on it deals combat damage to a player, that player discards a card. mana={1}{B} type=Creature @@ -71952,12 +71985,12 @@ subtype=Golem power=4 toughness=2 [/card] -##the cantlose on phage only last until the ability checks if she was played from hand enjoy :) [card] name=Phage the Untouchable auto=ifnot casted(this) then wingame opponent auto=@combatdamaged(creature) from(this):all(trigger[to]) bury -auto=@combatdamaged(player) from(this):winGame controller +auto=@combatdamagefoeof(player) from(this):winGame controller +auto=@combatdamageof(player) from(this):winGame opponent text=When Phage the Untouchable enters the battlefield, if you didn't cast it from your hand, you lose the game. Whenever Phage deals combat damage to a creature, destroy that creature. It can't be regenerated. -- Whenever Phage deals combat damage to a player, that player loses the game. mana={3}{B}{B}{B}{B} type=Legendary Creature @@ -76184,8 +76217,7 @@ name=Quietus Spike text=Equipped creature has deathtouch. -- Whenever equipped creature deals combat damage to a player, that player loses half his or her life, rounded up. -- Equip {3} mana={3} auto={3}:equip -auto=teach(creature) deathtouch -auto=@combatdamaged(opponent) from(mytgt):life:-halfupopponentlifetotal opponent +auto=teach(creature) transforms((,newability[deathtouch],newability[@combatdamagefoeof(player) from(this):life:-halfupopponentlifetotal opponent],newability[@combatdamageof(player) from(this):life:-halfuplifetotal controller])) type=Artifact subtype=Equipment [/card] @@ -76982,8 +77014,8 @@ toughness=3 [/card] [card] name=Rakdos Ringleader -auto=@combatdamaged(opponent) from(this):discard:1 opponent -auto=@combatdamaged(controller) from(this):discard:1 controller +auto=@combatdamagefoeof(player) from(this):discard:1 opponent +auto=@combatdamageof(player) from(this):discard:1 controller auto={B}:regenerate abilities=first strike text=First strike -- Whenever Rakdos Ringleader deals combat damage to a player, that player discards a card at random. -- {B}: Regenerate Rakdos Ringleader. @@ -77014,8 +77046,8 @@ type=Artifact name=Rakdos the Defiler abilities=flying,trample auto=@combat(attacking) source(this):choice target(*|mybattlefield) sacrifice -auto=@combatdamaged(opponent) from(this):ability$!name(sacrifice) target(*|mybattlefield) sacrifice!$ opponent -auto=@combatdamaged(controller) from(this):ability$!name(sacrifice) target(*|mybattlefield) sacrifice!$ controller +auto=@combatdamagefoeof(player) from(this):ability$!name(sacrifice) target(*|mybattlefield) sacrifice!$ opponent +auto=@combatdamageof(player) from(this):ability$!name(sacrifice) target(*|mybattlefield) sacrifice!$ controller text=Flying, trample -- Whenever Rakdos the Defiler attacks, sacrifice half the non-Demon permanents you control, rounded up. -- Whenever Rakdos deals combat damage to a player, that player sacrifices half the non-Demon permanents he or she controls, rounded up. mana={2}{B}{B}{R}{R} type=Legendary Creature @@ -77662,7 +77694,8 @@ toughness=4 name=Raven Guild Master facedown={3} autofacedown={2}{U}{U}:morph -auto=@combatdamaged(player) from(this):deplete:10 opponent +auto=@combatdamagefoeof(player) from(this):deplete:10 opponent +auto=@combatdamageof(player) from(this):deplete:10 controller text=Whenever Raven Guild Master deals combat damage to a player, that player exiles the top ten cards of his or her library. -- Morph {2}{U}{U} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) mana={1}{U}{U} type=Creature @@ -80526,7 +80559,7 @@ toughness=3 name=Riptide Entrancer facedown={3} autofacedown={U}{U}:morph -auto=@combatdamaged(player) from(this):may moveTo(mybattlefield) target(creature|myBattlefield) && sacrifice all(this) +auto=@combatdamagefoeof(player) from(this):may moveTo(mybattlefield) target(creature|opponentBattlefield) && sacrifice all(this) text=Whenever Riptide Entrancer deals combat damage to a player, you may sacrifice it. If you do, gain control of target creature that player controls. (This effect lasts indefinitely.) -- Morph {U}{U} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) mana={1}{U}{U} type=Creature @@ -80543,7 +80576,8 @@ type=Land [/card] [card] name=Riptide Pilferer -auto=@combatdamaged(opponent) from(this):ability$!name(discard) target(*|myhand) reject!$ opponent +auto=@combatdamagefoeof(player) from(this):ability$!name(discard) target(*|myhand) reject!$ opponent +auto=@combatdamageof(player) from(this):ability$!name(discard) target(*|myhand) reject!$ controller autofacedown={U}:morph facedown={3} text=Whenever Riptide Pilferer deals combat damage to a player, that player discards a card. -- Morph {U} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) @@ -81530,7 +81564,8 @@ toughness=1 [card] name=Rootwater Thief auto={U}:flying -auto=@combatdamaged(player) from(this):pay({2}) moveto(exile) and!(shuffle)! notatarget(*|opponentlibrary) +auto=@combatdamagefoeof(player) from(this):pay({2}) moveto(exile) and!(shuffle)! notatarget(*|opponentlibrary) +auto=@combatdamageof(player) from(this):pay({2}) moveto(exile) and!(shuffle)! notatarget(*|mylibrary) text={U}: Rootwater Thief gains flying until end of turn. -- Whenever Rootwater Thief deals combat damage to a player, you may pay {2}. If you do, search that player's library for a card and exile it, then the player shuffles his or her library. mana={1}{U} type=Creature @@ -82321,7 +82356,8 @@ toughness=* [/card] [card] name=Rustmouth Ogre -auto=@combatdamaged(player) from(this):may destroy target(artifact|opponentBattlefield) +auto=@combatdamagefoeof(player) from(this):may destroy target(artifact|opponentBattlefield) +auto=@combatdamageof(player) from(this):may destroy target(artifact|myBattlefield) text=Whenever Rustmouth Ogre deals combat damage to a player, you may destroy target artifact that player controls. mana={4}{R}{R} type=Creature @@ -84343,7 +84379,8 @@ type=Land [card] name=Scion of Darkness abilities=trample -auto=@combatdamaged(player) from(this):may moveTo(myBattlefield) target(creature|opponentgraveyard) +auto=@combatdamagefoeof(player) from(this):may moveTo(myBattlefield) target(creature|opponentgraveyard) +auto=@combatdamageof(player) from(this):may moveTo(myBattlefield) target(creature|mygraveyard) autohand=__CYCLING__({3}) text=Trample -- Whenever Scion of Darkness deals combat damage to a player, you may put target creature card from that player's graveyard onto the battlefield under your control. -- Cycling {3} ({3}, Discard this card: Draw a card.) mana={5}{B}{B}{B} @@ -84906,7 +84943,8 @@ toughness=2 [card] name=Screeching Silcaw abilities=flying -auto=@combatdamaged(player) from(this) restriction{type(artifact|myBattlefield)~morethan~2}:deplete:4 opponent +auto=@combatdamagefoeof(player) from(this) restriction{type(artifact|myBattlefield)~morethan~2}:deplete:4 opponent +auto=@combatdamageof(player) from(this) restriction{type(artifact|myBattlefield)~morethan~2}:deplete:4 controller text=Flying -- Metalcraft - Whenever Screeching Silcaw deals combat damage to a player, if you control three or more artifacts, that player puts the top four cards of his or her library into his or her graveyard. mana={1}{U} type=Creature @@ -85647,7 +85685,8 @@ toughness=2 [card] name=Sedraxis Specter abilities=flying -auto=@combatdamaged(opponent) from(this):ability$!name(discard) target(*|myhand) reject!$ opponent +auto=@combatdamagefoeof(player) from(this):ability$!name(discard) target(*|myhand) reject!$ opponent +auto=@combatdamageof(player) from(this):ability$!name(discard) target(*|myhand) reject!$ controller autograveyard={1}{B}:moveto(mybattlefield) && transforms((,unearth,haste)) asSorcery forever text=Flying -- Whenever Sedraxis Specter deals combat damage to a player, that player discards a card. -- Unearth {1}{B} ({1}{B}: Return this card from your graveyard to the battlefield. It gains haste. Exile it at the beginning of the next end step or if it would leave the battlefield. Unearth only as a sorcery.) mana={U}{B}{R} @@ -87727,8 +87766,9 @@ toughness=0 [card] name=Shimian Specter abilities=flying -auto=@combatdamaged(opponent) from(this) restriction{type(*[-land]|opponenthand)~morethan~0}:name(exile a nonland) notatarget(*[-land]|opponenthand) transforms((,newability[all(*[share!name!]|mylibrary) moveto(exile) and!(shuffle)!],newability[all(*[share!name!]|mygraveyard) moveto(exile)],newability[all(*[share!name!]|myhand) moveto(exile)])) -auto=@combatdamaged(opponent) from(this) restriction{type(*[-land]|opponenthand)~lessthan~1}:name(look) notatarget(*|opponenthand) donothing +auto=@combatdamagefoeof(player) from(this) restriction{type(*[-land]|opponenthand)~morethan~0}:name(exile a nonland) notatarget(*[-land]|opponenthand) transforms((,newability[all(*[share!name!]|mylibrary) moveto(exile) and!(shuffle)!],newability[all(*[share!name!]|mygraveyard) moveto(exile)],newability[all(*[share!name!]|myhand) moveto(exile)])) +auto=@combatdamageof(player) from(this) restriction{type(*[-land]|myhand)~morethan~0}:name(exile a nonland) notatarget(*[-land]|myhand) transforms((,newability[all(*[share!name!]|mylibrary) moveto(exile) and!(shuffle)!],newability[all(*[share!name!]|mygraveyard) moveto(exile)],newability[all(*[share!name!]|myhand) moveto(exile)])) +auto=@combatdamagefoeof(player) from(this) restriction{type(*[-land]|opponenthand)~lessthan~1}:name(look) notatarget(*|opponenthand) donothing text=Flying -- Whenever Shimian Specter deals combat damage to a player, that player reveals his or her hand. You choose a nonland card from it. Search that player's graveyard, hand, and library for all cards with the same name as that card and exile them. Then that player shuffles his or her library. mana={2}{B}{B} type=Creature @@ -87919,7 +87959,8 @@ toughness=2 [card] name=Shisato, Whispering Hunter auto=@each my upkeep:target(snake|mybattlefield) sacrifice -auto=@combatdamaged(opponent) from(this):nextphasealter(remove,untap,opponent) +auto=@combatdamagefoeof(player) from(this):nextphasealter(remove,untap,opponent) +auto=@combatdamageof(player) from(this):nextphasealter(remove,untap,controller) text=At the beginning of your upkeep, sacrifice a Snake. -- Whenever Shisato, Whispering Hunter deals combat damage to a player, that player skips his or her next untap step. mana={3}{G} type=Legendary Creature @@ -88113,7 +88154,8 @@ toughness=1 [card] name=Shockmaw Dragon abilities=flying -auto=@combatdamaged(opponent) from(this):all(creature|opponentbattlefield) damage:1 +auto=@combatdamagefoeof(player) from(this):all(creature|opponentbattlefield) damage:1 +auto=@combatdamageof(player) from(this):all(creature|mybattlefield) damage:1 text=Flying -- Whenever Shockmaw Dragon deals combat damage to a player, it deals 1 damage to each creature that player controls. mana={4}{R}{R} type=Creature @@ -88279,7 +88321,8 @@ toughness=3 [card] name=Shriekgeist abilities=flying -auto=@combatdamaged(player) from(this):deplete:2 opponent +auto=@combatdamagefoeof(player) from(this):deplete:2 opponent +auto=@combatdamageof(player) from(this):deplete:2 controller text=Flying -- Whenever Shriekgeist deals combat damage to a player, that player puts the top two cards of his or her library into his or her graveyard. mana={1}{U} type=Creature @@ -88931,7 +88974,8 @@ toughness=6 [card] name=Silent Specter abilities=flying -auto=@combatdamaged(player) from(this):ability$!name(discard 2 cards) target(<2>*|myhand) reject!$ opponent +auto=@combatdamagefoeof(player) from(this):ability$!name(discard 2 cards) target(<2>*|myhand) reject!$ opponent +auto=@combatdamageof(player) from(this):ability$!name(discard 2 cards) target(<2>*|myhand) reject!$ controller facedown={3} autofacedown={3}{B}{B}:morph text=Flying -- Whenever Silent Specter deals combat damage to a player, that player discards two cards. -- Morph {3}{B}{B} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) @@ -88944,7 +88988,8 @@ toughness=4 [card] name=Silent-Blade Oni autohand={4}{U}{B}{N}:ninjutsu -auto=@combatdamaged(player) from(this):may target(*[-land]|opponenthand) castcard(normal) +auto=@combatdamagefoeof(player) from(this):may target(*[-land]|opponenthand) castcard(normal) +auto=@combatdamageof(player) from(this):may target(*[-land]|myhand) castcard(normal) text=Ninjutsu {4}{U}{B} ({4}{U}{B}, Return an unblocked attacker you control to hand: Put this card onto the battlefield from your hand tapped and attacking.) -- Whenever Silent-Blade Oni deals combat damage to a player, look at that player's hand. You may cast a nonland card in it without paying that card's mana cost. mana={3}{U}{U}{B}{B} type=Creature @@ -89952,7 +89997,8 @@ toughness=2 name=Skirk Commando facedown={3} autofacedown={2}{R}:morph -auto=@combatdamaged(opponent) from(this):may damage:2 target(creature|opponentbattlefield) +auto=@combatdamagefoeof(player) from(this):may damage:2 target(creature|opponentbattlefield) +auto=@combatdamageof(player) from(this):may damage:2 target(creature|mybattlefield) text=Whenever Skirk Commando deals combat damage to a player, you may have it deal 2 damage to target creature that player controls. -- Morph {2}{R} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) mana={1}{R}{R} type=Creature @@ -90298,7 +90344,8 @@ toughness=3 [card] name=Skullsnatcher autohand={B}{N}:ninjutsu -auto=@combatdamaged(player) from(this):may target(*|opponentgraveyard) moveTo(exile) +auto=@combatdamagefoeof(player) from(this):may target(*|opponentgraveyard) moveTo(exile) +auto=@combatdamageof(player) from(this):may target(*|mygraveyard) moveTo(exile) text=Ninjutsu {B} ({B}, Return an unblocked attacker you control to hand: Put this card onto the battlefield from your hand tapped and attacking.) -- Whenever Skullsnatcher deals combat damage to a player, exile up to two target cards from that player's graveyard. mana={1}{B} type=Creature @@ -90983,7 +91030,8 @@ type=Sorcery [/card] [card] name=Slavering Nulls -auto=@combatdamaged(opponent) from(this) restriction{type(swamp|mybattlefield)~morethan~0}:may name(opponent discard) ability$!name(discard) target(*|myhand) reject!$ opponent +auto=@combatdamagefoeof(player) from(this) restriction{type(swamp|mybattlefield)~morethan~0}:may name(opponent discard) ability$!name(discard) target(*|myhand) reject!$ opponent +auto=@combatdamageof(player) from(this) restriction{type(swamp|mybattlefield)~morethan~0}:may name(discard) ability$!name(discard) target(*|myhand) reject!$ controller text=Whenever Slavering Nulls deals combat damage to a player, if you control a Swamp, you may have that player discard a card. mana={1}{R} type=Creature @@ -91050,7 +91098,7 @@ subtype=Aura name=Sleeper's Robe target=creature auto=fear -auto=@combatdamaged(opponent) from(mytgt):may draw:1 controller +auto=@combatdamagefoeof(player) from(mytgt):may draw:1 controller text=Enchant creature -- Enchanted creature has fear. (It can't be blocked except by artifact creatures and/or black creatures.) -- Whenever enchanted creature deals combat damage to an opponent, you may draw a card. mana={U}{B} type=Enchantment @@ -91683,7 +91731,8 @@ toughness=2 name=Snapping Thragg facedown={3} autofacedown={4}{R}{R}:morph -auto=@combatdamaged(opponent) from(this):may damage:3 target(creature|opponentbattlefield) +auto=@combatdamagefoeof(player) from(this):may damage:3 target(creature|opponentbattlefield) +auto=@combatdamageof(player) from(this):may damage:3 target(creature|mybattlefield) text=Whenever Snapping Thragg deals combat damage to a player, you may have it deal 3 damage to target creature that player controls. -- Morph {4}{R}{R} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) mana={4}{R} type=Creature @@ -93117,7 +93166,8 @@ toughness=1 [/card] [card] name=Spark Mage -auto=@combatdamaged(player) from(this):may damage:1 target(creature|opponentBattlefield) +auto=@combatdamagefoeof(player) from(this):may damage:1 target(creature|opponentBattlefield) +auto=@combatdamageof(player) from(this):may damage:1 target(creature|myBattlefield) text=Whenever Spark Mage deals combat damage to a player, you may have Spark Mage deal 1 damage to target creature that player controls. mana={R} type=Creature @@ -98344,7 +98394,7 @@ toughness=1 [/card] [card] name=Swarmborn Giant -auto=@combatdamaged(controller):sacrifice all(this) +auto=@combatdamageof(player):sacrifice all(this) auto=this(cantargetcard(*[-monstrous]) {4}{G}{G}:becomes(monstrous) forever && counter(1/1,2) && transforms((,newAbility[reach])) forever text=When you're dealt combat damage, sacrifice Swarmborn Giant. -- {3}{G}{G}: Monstrosity 2. (If this creature isn't monstrous, put two +1/+1 counters on it and it becomes monstrous.) -- As long as Swarmborn Giant is monstrous, it has reach. mana={2}{G}{G} @@ -98907,8 +98957,8 @@ type=Sorcery [/card] [card] name=Synapse Sliver -auto=@combatdamaged(player) from(sliver|myBattlefield):may draw:1 controller -auto=@combatdamaged(player) from(sliver|opponentBattlefield):draw:1 opponent +auto=@combatdamagefoeof(player) from(sliver):ability$!name(Draw) may draw:1!$ opponent +auto=@combatdamageof(player) from(sliver):ability$!name(Draw) may draw:1!$ controller text=Whenever a Sliver deals combat damage to a player, its controller may draw a card. mana={4}{U} type=Creature @@ -99015,6 +99065,7 @@ text=Syphon Soul deals 2 damage to each other player. You gain life equal to the mana={2}{B} type=Sorcery [/card] +#workaround szadek. [card] name=Szadek, Lord of Secrets abilities=flying @@ -102037,7 +102088,8 @@ type=Sorcery [card] name=Throat Slitter autohand={2}{B}{N}:ninjutsu -auto=@combatdamaged(player) from(this):destroy target(creature[-black]|opponentbattlefield) +auto=@combatdamagefoeof(player) from(this):destroy target(creature[-black]|opponentbattlefield) +auto=@combatdamageof(player) from(this):destroy target(creature[-black]|mybattlefield) text=Ninjutsu {2}{B} ({2}{B}, Return an unblocked attacker you control to hand: Put this card onto the battlefield from your hand tapped and attacking.) -- Whenever Throat Slitter deals combat damage to a player, destroy target nonblack creature that player controls. mana={4}{B} type=Creature @@ -105195,7 +105247,8 @@ subtype=Equipment [card] name=Trygon Predator abilities=flying -auto=@combatdamaged(player) from(this):may destroy target(artifact,enchantment|opponentBattlefield) +auto=@combatdamagefoeof(player) from(this):may destroy target(artifact,enchantment|opponentBattlefield) +auto=@combatdamageof(player) from(this):may destroy target(artifact,enchantment|myBattlefield) text=Flying -- Whenever Trygon Predator deals combat damage to a player, you may destroy target artifact or enchantment that player controls. mana={1}{G}{U} type=Creature @@ -108029,8 +108082,7 @@ toughness=2 [card] name=Vengeful Pharaoh abilities=deathtouch -autograveyard=@combatdamaged(controller):moveTo(ownerlibrary) -autograveyard=@combatdamaged(controller):destroy target(creature[attacking]) +autograveyard=@combatdamaged(player,planeswalker) from(*|opponentbattlefield):and!(destroy target(creature[attacking]))! moveTo(ownerlibrary) text=Deathtouch -- Whenever combat damage is dealt to your or a planeswalker you control, if Vengeful Pharaoh is in your graveyard, destroy target attacking creature, then put Vengeful Pharaoh on top of your library. mana={2}{B}{B}{B} type=Creature @@ -110319,7 +110371,8 @@ subtype=Vraska [/card] [card] name=Assassin Token -auto=@combatdamaged(player) from(this):winGame controller +auto=@combatdamagefoeof(player) from(this):winGame controller +auto=@combatdamageof(player) from(this):winGame opponent type=Creature subtype=Assassin power=1 @@ -110578,7 +110631,7 @@ type=Sorcery [card] name=Walker of Secret Ways autohand={1}{U}{N}:ninjutsu -auto=@combatdamaged(player) from(this):name(look at opponents hand) target(*|opponenthand) donothing ueot +auto=@combatdamagefoeof(player) from(this):name(look at opponents hand) target(*|opponenthand) donothing ueot auto={1}{U}:moveTo(myhand) target(ninja|myBattlefield) myTurnOnly 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 Walker of Secret Ways deals combat damage to a player, look at that player's hand. -- {1}{U}: Return target Ninja you control to its owner's hand. Activate this ability only during your turn. mana={2}{U} @@ -114814,7 +114867,8 @@ type=Sorcery [card] name=Wrexial, the Risen Deep abilities=islandwalk,swampwalk -auto=@combatdamaged(player) from(this):may target(*[instant;sorcery]|opponentgraveyard) castcard(normal) and!(transforms((,newability[exiledeath])) forever)! +auto=@combatdamagefoeof(player) from(this):may target(*[instant;sorcery]|opponentgraveyard) castcard(normal) and!(transforms((,newability[exiledeath])) forever)! +auto=@combatdamageof(player) from(this):may target(*[instant;sorcery]|mygraveyard) castcard(normal) and!(transforms((,newability[exiledeath])) forever)! text=Islandwalk, swampwalk -- Whenever Wrexial, the Risen Deep deals combat damage to a player, you may cast target instant or sorcery card from that player's graveyard without paying its mana cost. If that card would be put into a graveyard this turn, exile it instead. mana={3}{U}{U}{B} type=Legendary Creature @@ -116050,7 +116104,8 @@ toughness=3 [/card] [card] name=Zombie Cannibal -auto=@combatdamaged(player) from(this):may moveto(exile) target(*|opponentgraveyard) +auto=@combatdamagefoeof(player) from(this):may moveto(exile) target(*|opponentgraveyard) +auto=@combatdamageof(player) from(this):may moveto(exile) target(*|mygraveyard) text=Whenever Zombie Cannibal deals combat damage to a player, you may exile target card from that player's graveyard. mana={B} type=Creature diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index f11a8a099..c2620a56e 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -1300,8 +1300,9 @@ public: bool sourceUntapped; bool limitOnceATurn; int triggeredTurn; - TrDamaged(GameObserver* observer, int id, MTGCardInstance * source, TargetChooser * tc, TargetChooser * fromTc = NULL, int type = 0,bool sourceUntapped = false,bool limitOnceATurn = false,bool once = false) : - Trigger(observer, id, source, once, tc), fromTc(fromTc), type(type) , sourceUntapped(sourceUntapped),limitOnceATurn(limitOnceATurn) + bool thiscontroller, thisopponent; + TrDamaged(GameObserver* observer, int id, MTGCardInstance * source, TargetChooser * tc, TargetChooser * fromTc = NULL, int type = 0,bool sourceUntapped = false,bool limitOnceATurn = false,bool once = false, bool thiscontroller = false, bool thisopponent = false) : + Trigger(observer, id, source, once, tc), fromTc(fromTc), type(type) , sourceUntapped(sourceUntapped),limitOnceATurn(limitOnceATurn),thiscontroller(thiscontroller),thisopponent(thisopponent) { triggeredTurn = -1; } @@ -1318,6 +1319,16 @@ public: if (fromTc && !fromTc->canTarget(e->damage->source)) return 0; if (type == 1 && e->damage->typeOfDamage != Damage::DAMAGE_COMBAT) return 0; if (type == 2 && e->damage->typeOfDamage == Damage::DAMAGE_COMBAT) return 0; + if (e->damage->target->type_as_damageable == Damageable::DAMAGEABLE_PLAYER) + { + Player * p = (Player *) e->damage->target; + if(thiscontroller) + if(p != source->controller()) + return 0; + if(thisopponent) + if(p == source->controller()) + return 0; + } e->damage->target->thatmuch = e->damage->damage; e->damage->source->thatmuch = e->damage->damage; this->source->thatmuch = e->damage->damage; diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index 67f724ac7..c9a49617f 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -850,21 +850,63 @@ TriggeredAbility * AbilityFactory::parseTrigger(string s, string, int id, Spell if (TargetChooser * tc = parseSimpleTC(s, "cycled", card)) return NEW TrCardDiscarded(observer, id, card, tc,once,true); - //Card Damaging non combat + //Card Damaging non combat current controller + if (TargetChooser * tc = parseSimpleTC(s, "noncombatdamageof", card)) + { + TargetChooser *fromTc = parseSimpleTC(s, "from", card); + return NEW TrDamaged(observer, id, card, tc, fromTc, 2,false,false,once,true,false); + } + + //Card Damaging non combat current opponent + if (TargetChooser * tc = parseSimpleTC(s, "noncombatdamagefoeof", card)) + { + TargetChooser *fromTc = parseSimpleTC(s, "from", card); + return NEW TrDamaged(observer, id, card, tc, fromTc, 2,false,false,once,false,true); + } + + //Card Damaging non combat static if (TargetChooser * tc = parseSimpleTC(s, "noncombatdamaged", card)) { TargetChooser *fromTc = parseSimpleTC(s, "from", card); return NEW TrDamaged(observer, id, card, tc, fromTc, 2,once); } - //Card Damaging combat + //Card Damaging combat current controller + if (TargetChooser * tc = parseSimpleTC(s, "combatdamageof", card)) + { + TargetChooser *fromTc = parseSimpleTC(s, "from", card); + return NEW TrDamaged(observer, id, card, tc, fromTc, 1,sourceUntapped,limitOnceATurn,once,true,false); + } + + //Card Damaging combat current opponent + if (TargetChooser * tc = parseSimpleTC(s, "combatdamagefoeof", card)) + { + TargetChooser *fromTc = parseSimpleTC(s, "from", card); + return NEW TrDamaged(observer, id, card, tc, fromTc, 1,sourceUntapped,limitOnceATurn,once,false,true); + } + + //Card Damaging combat static if (TargetChooser * tc = parseSimpleTC(s, "combatdamaged", card)) { TargetChooser *fromTc = parseSimpleTC(s, "from", card); return NEW TrDamaged(observer, id, card, tc, fromTc, 1,sourceUntapped,limitOnceATurn,once); } - //Card Damaging + //Card Damaging current controller + if (TargetChooser * tc = parseSimpleTC(s, "damageof", card)) + { + TargetChooser *fromTc = parseSimpleTC(s, "from", card); + return NEW TrDamaged(observer, id, card, tc, fromTc, 0,sourceUntapped,limitOnceATurn,once,true,false); + } + + //Card Damaging current opponent + if (TargetChooser * tc = parseSimpleTC(s, "damagefoeof", card)) + { + TargetChooser *fromTc = parseSimpleTC(s, "from", card); + return NEW TrDamaged(observer, id, card, tc, fromTc, 0,sourceUntapped,limitOnceATurn,once,false,true); + } + + //Card Damaging static if (TargetChooser * tc = parseSimpleTC(s, "damaged", card)) { TargetChooser *fromTc = parseSimpleTC(s, "from", card); From fe86514fb88fdbe7fe6f6612759fc96e6e29f7b2 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 22 Oct 2015 14:20:52 +0800 Subject: [PATCH 218/249] updated primitives @damageof/@damagefoeof --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 168 +++++++++---------- projects/mtg/include/AllAbilities.h | 2 +- 2 files changed, 82 insertions(+), 88 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index edeeeeac8..972281e2b 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -500,8 +500,8 @@ toughness=6 [card] name=Abyssal Specter abilities=flying -auto=@damaged(controller) from(this):ability$!name(discard) target(*|myhand) reject!$ controller -auto=@damaged(opponent) from(this):ability$!name(discard) target(*|myhand) reject!$ opponent +auto=@damageof(player) from(this):ability$!name(discard) target(*|myhand) reject!$ controller +auto=@damagefoeof(player) from(this):ability$!name(discard) target(*|myhand) reject!$ opponent text=Flying -- Whenever Abyssal Specter deals damage to a player, that player discards a card. mana={2}{B}{B} type=Creature @@ -3127,7 +3127,7 @@ toughness=3 [/card] [card] name=Angelheart Vial -auto=@damaged(controller):may counter(0/0,thatmuch,Charge) +auto=@damageof(player):may counter(0/0,thatmuch,Charge) auto={2}{T}{C(0/0,-4,Charge)}:life:2 && draw:1 controller text=Whenever you're dealt damage, you may put that many charge counters on Angelheart Vial. -- {2}, {T}, Remove four charge counters from Angelheart Vial: You gain 2 life and draw a card. mana={5} @@ -4735,7 +4735,7 @@ type=Artifact [card] name=Arm with AEther text=Until end of turn, creatures you control gain "Whenever this creature deals damage to an opponent, you may return target creature that player controls to its owner's hand." -auto=all(creature|mybattlefield) transforms((,newability[@damaged(opponent) from(this) once:may moveto(ownerhand) target(creature|opponentbattlefield)])) ueot +auto=all(creature|mybattlefield) transforms((,newability[@damagefoeof(player) from(this) once:may moveto(ownerhand) target(creature|opponentbattlefield)])) ueot mana={2}{U} type=Sorcery [/card] @@ -5877,7 +5877,7 @@ toughness=4 [/card] [card] name=Aurification -auto=@damaged(controller) from(creature):all(trigger[from]) counter(0/0,1,Gold) +auto=@damageof(player) from(creature):all(trigger[from]) counter(0/0,1,Gold) auto=lord(creature[counter{0/0.1.Gold}]) defender auto=@movedTo(this|nonbattlezone) from(myBattlefield):all(creature) removeallcounters(0/0,1,Gold) text=Whenever a creature deals damage to you, put a gold counter on it. -- Each creature with a gold counter on it is a Wall in addition to its other creature types and has defender. (Those creatures can't attack.) -- When Aurification leaves the battlefield, remove all gold counters from all creatures. @@ -6835,7 +6835,7 @@ type=Artifact [card] name=Azor's Elocutors auto=@each my upkeep:counter(0/0,1,Filibuster) all(this) && this(counter{0/0.5.Filibuster})>=wingame -auto=@damaged(controller):counter(0/0,-1,Filibuster) +auto=@damageof(player):counter(0/0,-1,Filibuster) text=At the beginning of your upkeep, put a filibuster counter on Azor's Elocutors. Then if Azor's Elocutors has five or more filibuster counters on it, you win the game. -- Whenever a source deals damage to you, remove a filibuster counter from Azor's Elocutors. mana={3}{WU}{WU} type=Creature @@ -6890,7 +6890,7 @@ type=Instant [card] name=Backfire target=creature -auto=@damaged(controller) from(mytgt):damage:thatmuch targetcontroller +auto=@damageof(player) from(mytgt):damage:thatmuch targetcontroller text=Enchant creature -- Whenever enchanted creature deals damage to you, Backfire deals that much damage to that creature's controller. mana={U} type=Enchantment @@ -7532,8 +7532,8 @@ type=Artifact [card] name=Barbed Shocker abilities=trample,haste -auto=@damaged(opponent) from(this):all(*|opponenthand) transforms((,newability[reject],newability[draw:1])) ueot -auto=@damaged(controller) from(this):all(*|myhand) transforms((,newability[reject],newability[draw:1])) ueot +auto=@damagefoeof(player) from(this):all(*|opponenthand) transforms((,newability[reject],newability[draw:1])) ueot +auto=@damageof(player) from(this):all(*|myhand) transforms((,newability[reject],newability[draw:1])) ueot text=Trample, haste -- Whenever Barbed Shocker deals damage to a player, that player discards all the cards in his or her hand, then draws that many cards. mana={3}{R} type=Creature @@ -10181,7 +10181,7 @@ toughness=3 [/card] [card] name=Blood Hound -auto=@damaged(controller):may counter(1/1,thatmuch) +auto=@damageof(player):may counter(1/1,thatmuch) auto=@each my endofturn:removeallcounters(1/1) text=Whenever you're dealt damage, you may put that many +1/+1 counters on Blood Hound. -- At the beginning of your end step, remove all +1/+1 counters from Blood Hound. mana={2}{R} @@ -15884,8 +15884,9 @@ type=Instant [card] name=Chandra's Phoenix abilities=flying,haste -autograveyard=@damaged(opponent) from(instant[red]|mystack):moveTo(ownerhand) -autograveyard=@damaged(opponent) from(sorcery[red]|mystack):moveTo(ownerhand) +autograveyard=@damagefoeof(player) from(instant[red]|mystack):moveTo(ownerhand) +autograveyard=@damagefoeof(player) from(sorcery[red]|mystack):moveTo(ownerhand) +autograveyard=@damagefoeof(player) from(planeswalker[red]|mybattlefield):moveTo(ownerhand) text=Flying -- Haste -- Whenever an opponent is dealt damage by a red instant or sorcery spell you control or by a red planeswalker you control, return Chandra's Phoenix from your graveyard to your hand. mana={1}{R}{R} type=Creature @@ -16194,7 +16195,7 @@ toughness=4 [card] name=Charnelhoard Wurm abilities=trample -auto=@damaged(opponent) from(this):may moveTo(myhand) target(*|mygraveyard) +auto=@damagefoeof(player) from(this):may moveTo(myhand) target(*|mygraveyard) text=Trample -- Whenever Charnelhoard Wurm deals damage to an opponent, you may return target card from your graveyard to your hand. mana={4}{B}{R}{G} type=Creature @@ -20925,7 +20926,7 @@ type=Instant [card] name=Curiosity target=creature -auto=@damaged(player) from(mytgt):may draw:1 controller +auto=@damagefoeof(player) from(mytgt):may draw:1 controller text=Enchant creature -- Whenever enchanted creature deals damage to an opponent, you may draw a card. mana={U} type=Enchantment @@ -21549,7 +21550,7 @@ toughness=4 [/card] [card] name=Darien, King of Kjeldor -auto=@damaged(controller):may token(Soldier,Creature Soldier,1/1,white)*thatmuch +auto=@damageof(player):may token(Soldier,Creature Soldier,1/1,white)*thatmuch text=Whenever you're dealt damage, you may put that many 1/1 white Soldier creature tokens onto the battlefield. mana={4}{W}{W} type=Legendary Creature @@ -24400,7 +24401,7 @@ toughness=* [card] name=Deus of Calamity abilities=trample -auto=@damaged(opponent) from(this) restriction{compare(thatmuch)~morethan~5}:destroy target(land|opponent) +auto=@damagefoeof(player) from(this) restriction{compare(thatmuch)~morethan~5}:destroy target(land|opponent) text=Trample -- Whenever Deus of Calamity deals 6 or more damage to an opponent, destroy target land that player controls. mana={RG}{RG}{RG}{RG}{RG} type=Creature @@ -25342,7 +25343,7 @@ type=Sorcery [card] name=Dissipation Field mana={2}{U}{U} -auto=@damaged(controller) from(*|battlefield):all(trigger[from]) moveto(ownerhand) +auto=@damageof(player) from(*|battlefield):all(trigger[from]) moveto(ownerhand) type=Enchantment text=Whenever a permanent deals damage to you, return it to its owner's hand. [/card] @@ -26586,7 +26587,7 @@ type=Sorcery [card] name=Dread abilities=fear -auto=@damaged(controller) from(creature):all(trigger[from]) destroy +auto=@damageof(player) from(creature):all(trigger[from]) destroy autograveyard=moveTo(ownerlibrary) && shuffle text=Fear (This creature can't be blocked except by artifact creatures and/or black creatures.) -- Whenever a creature deals damage to you, destroy it. -- When Dread is put into a graveyard from anywhere, shuffle it into its owner's library. mana={3}{B}{B}{B} @@ -27679,7 +27680,7 @@ toughness=3 [card] name=Dunerider Outlaw abilities=protection from green -auto=@damaged(opponent) from(this):all(trigger[from]) phaseaction[endofturn once] counter(1/1,1) +auto=@damagefoeof(player) from(this):all(trigger[from]) phaseaction[endofturn once] counter(1/1,1) text=Protection from green -- At the beginning of each end step, if Dunerider Outlaw dealt damage to an opponent this turn, put a +1/+1 counter on it. mana={B}{B} type=Creature @@ -28906,7 +28907,8 @@ name=Elder Mastery target=creature auto=3/3 auto=flying -auto=@damaged(player) from(mytgt):ability$!name(discard 2 cards) target(<2>*|myhand) reject!$ opponent +auto=@damagefoeof(player) from(mytgt):ability$!name(discard 2 cards) target(<2>*|myhand) reject!$ opponent +auto=@damageof(player) from(mytgt):ability$!name(discard 2 cards) target(<2>*|myhand) reject!$ controller text=Enchant creature -- Enchanted creature gets +3/+3 and has flying. -- Whenever enchanted creature deals damage to a player, that player discards two cards. mana={3}{U}{B}{R} type=Enchantment @@ -29824,8 +29826,7 @@ toughness=1 [card] name=Emberwilde Caliph abilities=flying,trample,mustattack -auto=@damaged(creature) from(this):life:-thatmuch controller -auto=@damaged(opponent) from(this):life:-thatmuch controller +auto=@damaged(creature,player) from(this):life:-thatmuch controller text=Flying, trample -- Emberwilde Caliph attacks each turn if able. -- Whenever Emberwilde Caliph deals damage, you lose that much life. mana={2}{U}{R} type=Creature @@ -30647,8 +30648,8 @@ toughness=2 [card] name=Entropic Specter auto=type:*:opponenthand/type:*:opponenthand cdaactive -auto=@damaged(controller) from(this):ability$!name(discard) target(*|myhand) reject!$ controller -auto=@damaged(opponent) from(this):ability$!name(discard) target(*|myhand) reject!$ opponent +auto=@damageof(player) from(this):ability$!name(discard) target(*|myhand) reject!$ controller +auto=@damagefoeof(player) from(this):ability$!name(discard) target(*|myhand) reject!$ opponent text=Flying -- As Entropic Specter enters the battlefield, choose an opponent. -- Entropic Specter's power and toughness are each equal to the number of cards in the chosen player's hand. -- Whenever Entropic Specter deals damage to a player, that player discards a card. mana={3}{B}{B} type=Creature @@ -32809,8 +32810,7 @@ type=Sorcery [/card] [card] name=Farsight Mask -auto=@damaged(controller) from(*|opponentbattlefield) sourcenottap:may draw:1 controller -auto=@damaged(controller) from(*|opponentstack) sourcenottap:may draw:1 controller +auto=@damageof(player) from(*|opponentbattlefield,opponentstack,opponentgraveyard,opponentlibrary,opponentexile) sourcenottap:may draw:1 controller text=Whenever a source an opponent controls deals damage to you, if Farsight Mask is untapped, you may draw a card. mana={5} type=Artifact @@ -34980,7 +34980,7 @@ toughness=1 [card] name=Flesh Reaver auto=@damaged(creature) from(this):damage:thatmuch controller -auto=@damaged(opponent) from(this):damage:thatmuch controller +auto=@damagefoeof(player) from(this):damage:thatmuch controller text=Whenever Flesh Reaver deals damage to a creature or opponent, Flesh Reaver deals that much damage to you. mana={1}{B} type=Creature @@ -36898,7 +36898,7 @@ auto={G}{G}:counter(0/0,1,Spore) target(fungus) [card] name=Fungal Shambler abilities=trample -auto=@damaged(opponent) from(this):draw:1 controller && ability$!name(discard) target(*|myhand) reject!$ opponent +auto=@damagefoeof(player) from(this):draw:1 controller && ability$!name(discard) target(*|myhand) reject!$ opponent text=Trample -- Whenever Fungal Shambler deals damage to an opponent, you draw a card and that opponent discards a card. mana={4}{G}{U}{B} type=Creature @@ -45266,9 +45266,9 @@ subtype=Equipment name=Helm of the Ghastlord target=creature auto=teach(creature[blue]) 1/1 -auto=teach(creature[blue]) transforms((,newability[@damaged(opponent) from(this):draw:1 controller])) +auto=teach(creature[blue]) transforms((,newability[@damagefoeof(player) from(this):draw:1 controller])) auto=teach(creature[black]) 1/1 -auto=teach(creature[black]) transforms((,newability[@damaged(opponent) from(this):ability$!name(discard) target(*|myhand) reject!$ opponent])) +auto=teach(creature[black]) transforms((,newability[@damagefoeof(player) from(this):ability$!name(discard) target(*|myhand) reject!$ opponent])) text=Enchant creature -- As long as enchanted creature is blue, it gets +1/+1 and has "Whenever this creature deals damage to an opponent, draw a card." -- As long as enchanted creature is black, it gets +1/+1 and has "Whenever this creature deals damage to an opponent, that player discards a card." mana={3}{UB} type=Enchantment @@ -47229,7 +47229,7 @@ type=Instant [/card] [card] name=Hunting Cheetah -auto=@damaged(opponent) from(this):may moveTo(myHand) target(forest|mylibrary) +auto=@damagefoeof(player) from(this):may moveTo(myHand) target(forest|mylibrary) text=Whenever Hunting Cheetah deals damage to an opponent, you may search your library for a Forest card, reveal that card, put it into your hand, then shuffle your library. mana={2}{G} type=Creature @@ -52188,7 +52188,7 @@ toughness=1 [card] name=Keen Sense target=creature -auto=@damaged(opponent) from(mytgt):may draw:1 controller +auto=@damagefoeof(player) from(mytgt):may draw:1 controller text=Enchant creature -- Whenever enchanted creature deals damage to an opponent, you may draw a card. mana={G} type=Enchantment @@ -53263,8 +53263,7 @@ toughness=1 name=Kiyomaro, First to Stand auto=type:*:myhand/type:*:myhand cdaactive auto=aslongas(*|myhand) vigilance >3 -auto=@damaged(player) from(this) restriction{type(*|myhand)~morethan~6}:life:7 controller >6 -auto=@damaged(creature) from(this) restriction{type(*|myhand)~morethan~6}:life:7 controller >6 +auto=@damaged(creature,player) from(this) restriction{type(*|myhand)~morethan~6}:if type(*|myhand)~morethan~6 then life:7 controller text=Kiyomaro, First to Stand's power and toughness are each equal to the number of cards in your hand. -- As long as you have four or more cards in hand, Kiyomaro has vigilance. -- Whenever Kiyomaro deals damage, if you have seven or more cards in hand, you gain 7 life. mana={3}{W}{W} type=Legendary Creature @@ -56978,7 +56977,7 @@ type=Artifact [card] name=Living Artifact target=artifact -auto=@damaged(controller):all(this) counter(0/0,thatmuch,vitality) +auto=@damageof(player):all(this) counter(0/0,thatmuch,vitality) auto={c(0/0,-1,vitality)}:life:1 controller limit:1 myupkeeponly text=Enchant artifact -- Whenever you're dealt damage, put that many vitality counters on Living Artifact. -- At the beginning of your upkeep, you may remove a vitality counter from Living Artifact. If you do, you gain 1 life. mana={g} @@ -57428,8 +57427,7 @@ toughness=1 [card] name=Looter il-Kor abilities=shadow -auto=@damaged(opponent) from(this):reject target(*|myHand) -auto=@damaged(opponent) from(this):draw:1 controller +auto=@damagefoeof(player) from(this):draw:1 && transforms((,newability[target(*|myhand) reject])) ueot text=Shadow (This creature can block or be blocked by only creatures with shadow.) -- Whenever Looter il-Kor deals damage to an opponent, draw a card, then discard a card. mana={1}{U} type=Creature @@ -57961,7 +57959,7 @@ toughness=2 [card] name=Lu Xun, Scholar General abilities=horsemanship -auto=@damaged(opponent) from(this):may draw:1 controller +auto=@damagefoeof(player) from(this):may draw:1 controller text=Horsemanship (This creature can't be blocked except by creatures with horsemanship.) -- Whenever Lu Xun, Scholar General deals damage to an opponent, you may draw a card. mana={2}{U}{U} type=Legendary Creature @@ -59304,8 +59302,8 @@ type=Instant [card] name=Mana Skimmer abilities=flying -auto=@damaged(opponent) from(this):frozen target(land|opponentbattlefield) -auto=@damaged(controller) from(this):frozen target(land|mybattlefield) +auto=@damagefoeof(player) from(this):frozen target(land|opponentbattlefield) +auto=@damageof(player) from(this):frozen target(land|mybattlefield) text=Flying -- Whenever Mana Skimmer deals damage to a player, tap target land that player controls. That land doesn't untap during its controller's next untap step. mana={3}{B} type=Creature @@ -59476,8 +59474,8 @@ toughness=1 [card] name=Mangara's Equity auto=upcost[{1}{W}] sacrifice -auto=choice name(choose black) transforms((,newability[@damaged(controller) from(creature[black]|*):damage:thatmuch all(trigger[from])],newability[@damaged(creature[white]|mybattlefield) from(creature[black]|*):damage:thatmuch all(trigger[from])])) forever -auto=choice name(choose red) transforms((,newability[@damaged(controller) from(creature[red]|*):damage:thatmuch all(trigger[from])],newability[@damaged(creature[white]|mybattlefield) from(creature[red]|*):damage:thatmuch all(trigger[from])])) forever +auto=choice name(choose black) transforms((,newability[@damageof(player) from(creature[black]|*):damage:thatmuch all(trigger[from])],newability[@damaged(creature[white]|mybattlefield) from(creature[black]|*):damage:thatmuch all(trigger[from])])) forever +auto=choice name(choose red) transforms((,newability[@damageof(player) from(creature[red]|*):damage:thatmuch all(trigger[from])],newability[@damaged(creature[white]|mybattlefield) from(creature[red]|*):damage:thatmuch all(trigger[from])])) forever text=As Mangara's Equity enters the battlefield, choose black or red. -- At the beginning of your upkeep, sacrifice Mangara's Equity unless you pay {1}{W}. -- Whenever a creature of the chosen color deals damage to you or a white creature you control, Mangara's Equity deals that much damage to that creature. mana={1}{W}{W} type=Enchantment @@ -60387,7 +60385,7 @@ subtype=Aura [/card] [card] name=Mask of Memory -auto=@damaged(opponent) from(mytgt):may draw:2 controller && reject target(*|myhand) +auto=@damaged(player) from(mytgt):may draw:2 controller && reject target(*|myhand) text=Whenever equipped creature deals combat damage to a player, you may draw two cards. If you do, discard a card. -- Equip {1} ({1}: Attach to target creature you control. Equip only as a sorcery. This card enters the battlefield unattached and stays on the battlefield if the creature leaves.) auto={1}:equip mana={2} @@ -62049,7 +62047,7 @@ name=Mikaeus, the Unhallowed abilities=intimidate auto=lord(other creature[-human]|mybattlefield) 1/1 auto=lord(other creature[-human]|mybattlefield) undying -auto=@damaged(controller) from(human):all(trigger[from]) destroy +auto=@damageof(player) from(human):all(trigger[from]) destroy text=Intimidate -- Whenever a Human deals damage to you, destroy it. -- Other non-Human creatures you control get +1/+1 and have undying. (When a creature with undying dies, if it had no +1/+1 counters on it, return it to the battlefield under its owner's control with a +1/+1 counter on it.) mana={3}{B}{B}{B} type=Legendary Creature @@ -67107,7 +67105,7 @@ toughness=2 name=Nicol Bolas auto=flying auto=upcost[{U}{B}{R}] sacrifice -auto=@damaged(opponent) from(this):reject all(*|opponenthand) +auto=@damagefoeof(player) from(this):reject all(*|opponenthand) text=Flying -- At the beginning of your upkeep, sacrifice Nicol Bolas unless you pay {U}{B}{R}. -- Whenever Nicol Bolas deals damage to an opponent, that player discards his or her hand. mana={2}{U}{U}{B}{B}{R}{R} type=Legendary Creature @@ -67129,8 +67127,7 @@ subtype=Bolas [/card] [card] name=Night Dealings -auto=@damaged(opponent) from(*|mybattlefield):counter(0/0,thatmuch,Theft) -auto=@damaged(opponent) from(*|mystack):counter(0/0,thatmuch,Theft) +auto=@damagefoeof(player) from(*|mybattlefield,mystack,mygraveyard,mylibrary,myexile):counter(0/0,thatmuch,Theft) auto={2}{B}{B}:name(X = 0) && moveto(myhand) target(*[-land;manacost=0]|mylibrary) auto=this(counter{0/0.1.Theft}=>) {2}{B}{B}{C(0/0,-1,Theft)}:name(X = 1) && moveTo(myhand) target(*[-land;manacost=1]|mylibrary) auto=this(counter{0/0.2.Theft}=>) {2}{B}{B}{C(0/0,-2,Theft)}:name(X = 2) && moveTo(myhand) target(*[-land;manacost=2]|mylibrary) @@ -67717,7 +67714,7 @@ toughness=4 [/card] [card] name=No Mercy -auto=@damaged(controller) from(creature):all(trigger[from]) destroy +auto=@damageof(player) from(creature):all(trigger[from]) destroy text=Whenever a creature deals damage to you, destroy it. mana={2}{B}{B} type=Enchantment @@ -68725,8 +68722,8 @@ toughness=2 [card] name=Odylic Wraith abilities=swampwalk -auto=@damaged(opponent) from(this):ability$!name(discard) target(*|myhand) reject!$ opponent -auto=@damaged(controller) from(this):reject target(*|myhand) +auto=@damagefoeof(player) from(this):ability$!name(discard) target(*|myhand) reject!$ opponent +auto=@damageof(player) from(this):ability$!name(discard) target(*|myhand) reject!$ controller text=Swampwalk -- Whenever Odylic Wraith deals damage to a player, that player discards a card. mana={3}{B} type=Creature @@ -69373,7 +69370,7 @@ toughness=3 name=Ophidian Eye abilities=flash target=creature -auto=@damaged(opponent) from(mytgt):may draw:1 controller +auto=@damagefoeof(player) from(mytgt):may draw:1 controller text=Flash (You may cast this spell any time you could cast an instant.) -- Enchant creature -- Whenever enchanted creature deals damage to an opponent, you may draw a card. mana={2}{U} type=Enchantment @@ -69772,8 +69769,8 @@ toughness=4 [card] name=Order of Yawgmoth abilities=fear -auto=@damaged(opponent) from(this):ability$!name(discard) target(*|myhand) reject!$ opponent -auto=@damaged(controller) from(this):reject target(*|myhand) +auto=@damagefoeof(player) from(this):ability$!name(discard) target(*|myhand) reject!$ opponent +auto=@damageof(player) from(this):ability$!name(discard) target(*|myhand) reject!$ controller text=Fear (This creature can't be blocked except by artifact creatures and/or black creatures.) -- Whenever Order of Yawgmoth deals damage to a player, that player discards a card. mana={2}{B}{B} type=Creature @@ -70497,7 +70494,7 @@ toughness=2 [/card] [card] name=Pain Magnification -auto=@damaged(opponent) restriction{compare(thatmuch)~morethan~2}:ability$!reject notatarget(*|myhand)!$ opponent +auto=@damagefoeof(player) restriction{compare(thatmuch)~morethan~2}:ability$!reject notatarget(*|myhand)!$ opponent text=Whenever an opponent is dealt 3 or more damage by a single source, that player discards a card. mana={1}{B}{R} type=Enchantment @@ -75732,8 +75729,7 @@ toughness=4 [/card] [card] name=Putrid Warrior -auto=@damaged(creature) from(this):all(this) transforms((,newability[chocie all(player) life:-1],newability[choice all(player) life:1])) ueot -auto=@damaged(opponent) from(this):all(this) transforms((,newability[choice all(player) life:-1],newability[choice all(player) life:1])) ueot +auto=@damaged(creature,player) from(this):all(this) transforms((,newability[chocie all(player) life:-1],newability[choice all(player) life:1])) ueot text=Whenever Putrid Warrior deals damage, choose one - each player loses 1 life; or each player gains 1 life. mana={W}{B} type=Creature @@ -78640,7 +78636,7 @@ toughness=6 [/card] [card] name=Reef Pirates -auto=@damaged(opponent) from(this):deplete:1 opponent +auto=@damagefoeof(player) from(this):deplete:1 opponent text=Whenever Reef Pirates deals damage to an opponent, that player puts the top card of his or her library into his or her graveyard. mana={1}{U}{U} type=Creature @@ -79598,8 +79594,7 @@ type=Instant [card] name=Retaliator Griffin abilities=flying -auto=@damaged(controller) from(*|opponentbattlefield):may all(trigger[to]) dynamicability -auto=@damaged(controller) from(*|opponentstack):may all(trigger[to]) dynamicability +auto=@damageof(player) from(*|opponentbattlefield,opponentstack,opponentgraveyard,opponentlibrary,opponentexile):may all(trigger[to]) dynamicability text=Flying -- Whenever a source an opponent controls deals damage to you, you may put that many +1/+1 counters on Retaliator Griffin. mana={1}{R}{G}{W} type=Creature @@ -81219,7 +81214,7 @@ toughness=4 [card] name=Rogue's Gloves auto={2}:equip -auto=@damaged(opponent) from(mytgt):may draw:1 controller +auto=@damaged(player) from(mytgt):may draw:1 controller text=Whenever equipped creature deals combat damage to a player, you may draw a card. -- Equip: 2 mana={2} type=Artifact @@ -81903,7 +81898,7 @@ toughness=6 [/card] [card] name=Ruinous Minotaur -auto=@damaged(opponent) from(this):moveto(graveyard) notatarget(land|mybattlefield) +auto=@damagefoeof(player) from(this):moveto(graveyard) notatarget(land|mybattlefield) text=Whenever Ruinous Minotaur deals damage to an opponent, sacrifice a land. mana={1}{R}{R} type=Creature @@ -83691,8 +83686,8 @@ toughness=1 [/card] [card] name=Satyr Firedancer -auto=@damaged(opponent) from(instant|mystack):damage:thatmuch target(creature|opponentbattlefield) -auto=@damaged(opponent) from(sorcery|mystack):damage:thatmuch target(creature|opponentbattlefield) +auto=@damagefoeof(player) from(instant|mystack):damage:thatmuch target(creature|opponentbattlefield) +auto=@damagefoeof(player) from(sorcery|mystack):damage:thatmuch target(creature|opponentbattlefield) text=Whenever an instant or sorcery spell you control deals damage to an opponent, Satyr Firedancer deals that much damage to target creature that player controls. mana={1}{R} type=Enchantment Creature @@ -88142,8 +88137,8 @@ toughness=2 [/card] [card] name=Shocker -auto=@damaged(opponent) from(this):all(*|opponenthand) transforms((,newability[reject],newability[draw:1])) ueot -auto=@damaged(controller) from(this):all(*|myhand) transforms((,newability[reject],newability[draw:1])) ueot +auto=@damagefoeof(player) from(this):all(*|opponenthand) transforms((,newability[reject],newability[draw:1])) ueot +auto=@damageof(player) from(this):all(*|myhand) transforms((,newability[reject],newability[draw:1])) ueot text=Whenever Shocker deals damage to a player, that player discards all the cards in his or her hand, then draws that many cards. mana={1}{R} type=Creature @@ -88835,7 +88830,8 @@ subtype=Equipment [card] name=Sigil of Sleep target=creature -auto=@damaged(player) from(mytgt):moveto(ownerhand) target(creature|opponentbattlefield) +auto=@damagefoeof(player) from(mytgt):moveto(ownerhand) target(creature|opponentbattlefield) +auto=@damageof(player) from(mytgt):moveto(ownerhand) target(creature|mybattlefield) text=Enchant creature -- Whenever enchanted creature deals damage to a player, return target creature that player controls to its owner's hand. mana={U} type=Enchantment @@ -92237,7 +92233,8 @@ toughness=1 [card] name=Soltari Visionary abilities=shadow -auto=@damaged(player) from(this):destroy target(enchantment|opponentBattlefield) +auto=@damagefoeof(player) from(this):destroy target(enchantment|opponentBattlefield) +auto=@damageof(player) from(this):destroy target(enchantment|myBattlefield) text=Shadow (This creature can block or be blocked by only creatures with shadow.) -- Whenever Soltari Visionary deals damage to a player, destroy target enchantment that player controls. mana={1}{W}{W} type=Creature @@ -92310,8 +92307,8 @@ toughness=1 [card] name=Somnophore abilities=flying -auto=@damaged(opponent) from(this):name(tap target creature) target(creature|opponentbattlefield) transforms((,newability[tap],newability[doesnotuntap])) -auto=@damaged(controller) from(this):name(tap target creature) target(creature|mybattlefield) transforms((,newability[tap],newability[doesnotuntap])) +auto=@damagefoeof(player) from(this):name(tap target creature) target(creature|opponentbattlefield) transforms((,newability[tap],newability[doesnotuntap])) +auto=@damageof(player) from(this):name(tap target creature) target(creature|mybattlefield) transforms((,newability[tap],newability[doesnotuntap])) text=Flying -- Whenever Somnophore deals damage to a player, tap target creature that player controls. That creature doesn't untap during its controller's untap step for as long as Somnophore remains on the battlefield. mana={2}{U}{U} type=Creature @@ -97563,7 +97560,7 @@ subtype=Aura [/card] [card] name=Sun Droplet -auto=@damaged(controller):counter(0/0,thatmuch,Charge) +auto=@damageof(player):counter(0/0,thatmuch,Charge) auto=@each my upkeep:may name(Gain Life) transforms((,[newability[counter(0/0,-1,Charge)],newability[life:1 controller])) text=Whenever you're dealt damage, put that many charge counters on Sun Droplet. -- At the beginning of each upkeep, you may remove a charge counter from Sun Droplet. If you do, you gain 1 life. mana={2} @@ -99371,7 +99368,7 @@ toughness=3 [/card] [card] name=Talon of Pain -auto=@damaged(opponent) from(other *|mybattlefield,mystack):counter(0/0,1,charge) +auto=@damagefoeof(player) from(other *|mybattlefield,mystack,mygraveyard,mylibrary,myexile):counter(0/0,1,charge) auto={1}{C(0/0,-1,charge)}{T}:name(remove 1 counter) damage:1 target(creature,player) auto={2}{C(0/0,-2,charge)}{T}:name(Remove 2 Counters) damage:2 target(creature,player) auto={3}{C(0/0,-3,charge)}{T}:name(Remove 3 Counters) damage:3 target(creature,player) @@ -99509,10 +99506,7 @@ toughness=4 [/card] [card] name=Tamanoa -auto=@damaged(creature) from(*[-creature]|mybattlefield):may life:thatmuch controller -auto=@damaged(player) from(*[-creature]|mybattlefield):may life:thatmuch controller -auto=@damaged(creature) from(*[-creature]|mystack):may life:thatmuch controller -auto=@damaged(player) from(*[-creature]|mystack):may life:thatmuch controller +auto=@damaged(creature,player) from(*[-creature]|mybattlefield,mystack,mygraveyard,mylibrary,myexile):life:thatmuch controller text=Whenever a noncreature source you control deals damage, you gain that much life. mana={R}{G}{W} type=Creature @@ -99533,7 +99527,7 @@ subtype=Tamiyo [/card] [card] name=Tandem Lookout -auto=soulbond @damaged(opponent) from(this):draw:1 controller +auto=soulbond @damagefoeof(player) from(this):draw:1 controller abilities=soulbond text=Soulbond (You may pair this creature with another unpaired creature when either enters the battlefield. They remain paired for as long as you control both of them.) -- As long as Tandem Lookout is paired with another creature, each of those creatures has "Whenever this creature deals damage to an opponent, draw a card." mana={2}{U} @@ -100913,7 +100907,7 @@ toughness=3 name=Teysa, Envoy of Ghosts abilities=Vigilance auto=protection from(creature) -auto=@damaged(controller) from(creature):all(trigger[from]) destroy && token(Spirit,Creature Spirit,1/1,white,black, flying) +auto=@damageof(player) from(creature):all(trigger[from]) destroy && token(Spirit,Creature Spirit,1/1,white,black, flying) text=Vigilance. -- Protection from creatures. -- Whenever a creature deals damage to you, destroy that creature. Put a 1/1 white and black spirit token with flying onto the battlefield. mana={5}{W}{B} type=Legendary Creature @@ -101172,7 +101166,7 @@ subtype=Aura [/card] [card] name=The Fallen -auto=@damaged(opponent) from(this) once:transforms((,newability[@each my upkeep:damage:1 opponent])) forever +auto=@damagefoeof(player) from(this) once:transforms((,newability[@each my upkeep:damage:1 opponent])) forever text=At the beginning of your upkeep, The Fallen deals 1 damage to each opponent it has dealt damage to this game. mana={1}{B}{B}{B} type=Creature @@ -101375,7 +101369,7 @@ toughness=2 [card] name=Thieving Magpie abilities=flying -auto=@damaged(opponent) from(this):draw:1 controller +auto=@damagefoeof(player) from(this):draw:1 controller text=Flying (This creature can't be blocked except by creatures with flying or reach.) -- Whenever Thieving Magpie deals damage to an opponent, you draw a card. mana={2}{U}{U} type=Creature @@ -104204,7 +104198,7 @@ type=Land name=Transcendence abilities=cantlifelose auto=this(controllerlife > 19)while winGame opponent -auto=@damaged(controller):life:twicethatmuch controller +auto=@damageof(player):life:twicethatmuch controller auto=@lifelostof(player):life:twicethatmuch controller text=You don't lose the game for having 0 or less life. -- When you have 20 or more life, you lose the game. -- Whenever you lose life, you gain 2 life for each 1 life you lost. (Damage dealt to you causes you to lose life.) mana={3}{W}{W}{W} @@ -107828,7 +107822,7 @@ toughness=1 [/card] [card] name=Vedalken Heretic -auto=@damaged(opponent) from(this):may draw:1 controller +auto=@damagefoeof(player) from(this):may draw:1 controller text=Whenever Vedalken Heretic deals damage to an opponent, you may draw a card. mana={G}{U} type=Creature @@ -111432,7 +111426,7 @@ type=Artifact [card] name=War Elemental auto=this(opponentdamagecount < 1) aslongas(War Elemental|mybattlefield) sacrifice oneshot -auto=@damaged(opponent):may all(trigger[to]) dynamicability +auto=@damagefoeof(player):may all(trigger[to]) dynamicability text=When War Elemental enters the battlefield, sacrifice it unless an opponent was dealt damage this turn. -- Whenever an opponent is dealt damage, put that many +1/+1 counters on War Elemental. mana={R}{R}{R} type=Creature @@ -111746,7 +111740,7 @@ type=Instant [card] name=Warren Instigator abilities=double strike -auto=@damaged(player) from(this):may moveto(myBattlefield) target(creature[goblin]|myHand) +auto=@damagefoeof(player) from(this):may moveto(myBattlefield) target(creature[goblin]|myHand) text=Double strike -- Whenever Warren Instigator deals damage to an opponent, you may put a Goblin creature card from your hand onto the battlefield. mana={R}{R} type=Creature @@ -112309,7 +112303,7 @@ toughness=1 [card] name=Wei Night Raiders abilities=horsemanship -auto=@damaged(opponent) from(this):ability$!name(discard) target(*|myhand) reject!$ opponent +auto=@damagefoeof(player) from(this):ability$!name(discard) target(*|myhand) reject!$ opponent text=Horsemanship (This creature can't be blocked except by creatures with horsemanship.) -- Whenever Wei Night Raiders deals damage to an opponent, that player discards a card. mana={2}{B}{B} type=Creature @@ -112703,7 +112697,7 @@ type=Artifact [card] name=Whirling Dervish abilities=protection from black -auto=@damaged(opponent) from(this):all(trigger[from]) phaseaction[endofturn once] counter(1/1,1) +auto=@damagefoeof(player) from(this):all(trigger[from]) phaseaction[endofturn once] counter(1/1,1) text=Protection from black -- At the beginning of each end step, if Whirling Dervish dealt damage to an opponent this turn, put a +1/+1 counter on it. mana={G}{G} type=Creature @@ -114039,7 +114033,7 @@ type=Instant [card] name=Witherscale Wurm auto=@combat(blocking,blocked) source(this) from(creature):all(trigger[from]) wither ueot -auto=@damaged(player) from(this):thisforeach(counter{-1/-1.1}) counter(-1/-1,-1) +auto=@damagefoeof(player) from(this):thisforeach(counter{-1/-1.1}) counter(-1/-1,-1) text=Whenever Witherscale Wurm blocks or becomes blocked by a creature, that creature gains wither until end of turn. (It deals damage to creatures in the form of -1/-1 counters.) -- Whenever Witherscale Wurm deals damage to an opponent, remove all -1/-1 counters from it. mana={4}{G}{G} type=Creature @@ -115854,7 +115848,7 @@ toughness=2 [/card] [card] name=Zhang Liao, Hero of Hefei -auto=@damaged(opponent) from(this):ability$!name(discard) target(*|myhand) reject!$ opponent +auto=@damagefoeof(player) from(this):ability$!name(discard) target(*|myhand) reject!$ opponent text=Whenever Zhang Liao, Hero of Hefei deals damage to an opponent, that opponent discards a card. mana={4}{B}{B} type=Legendary Creature diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index c2620a56e..8d14242ff 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -1319,7 +1319,7 @@ public: if (fromTc && !fromTc->canTarget(e->damage->source)) return 0; if (type == 1 && e->damage->typeOfDamage != Damage::DAMAGE_COMBAT) return 0; if (type == 2 && e->damage->typeOfDamage == Damage::DAMAGE_COMBAT) return 0; - if (e->damage->target->type_as_damageable == Damageable::DAMAGEABLE_PLAYER) + if (e->damage->target->type_as_damageable == Damageable::DAMAGEABLE_PLAYER) { Player * p = (Player *) e->damage->target; if(thiscontroller) From f464623d17d89a5ffb6aa35a94e6b588c08121e3 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 22 Oct 2015 17:33:45 +0800 Subject: [PATCH 219/249] curiosity... 2/1/2007 You draw one card each time the enchanted creature damages the opponent. This is not one card per point of damage. 2/1/2007 If put on your opponent's creature, you do not draw a card when that creature damages you. The creature has to damage your opponent in order to have this work. 2/1/2007 Drawing a card is optional. If you forget, you can't go back later and do it, even if it is something you normally do. 9/22/2011 "You" refers to the controller of Curiosity, which may be different from the controller of the enchanted creature."An opponent" refers to an opponent of Curiosity's controller. 9/22/2011 Any damage dealt by the enchanted creature to an opponent will cause Curiosity to trigger, not just combat damage. 9/22/2011 Curiosity doesn't trigger if the enchanted creature deals damage to a planeswalker controlled by an opponent. --- projects/mtg/bin/Res/test/curiosity2_i217.txt | 11 ++++++++++- projects/mtg/include/AllAbilities.h | 8 ++++---- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/projects/mtg/bin/Res/test/curiosity2_i217.txt b/projects/mtg/bin/Res/test/curiosity2_i217.txt index efc1f4a99..8f36e109a 100644 --- a/projects/mtg/bin/Res/test/curiosity2_i217.txt +++ b/projects/mtg/bin/Res/test/curiosity2_i217.txt @@ -2,6 +2,15 @@ #DESC: Tests whether Curiosity works correctly #DESC: when cast on an opponent's creature #DESC: http://code.google.com/p/wagic/issues/detail?id=217 +# +#revised...10-22-2015...kevlahnota +#2/1/2007 You draw one card each time the enchanted creature damages the opponent. This is not one card per point of damage. +#2/1/2007 If put on your opponent's creature, you do not draw a card when that creature damages you. The creature has to damage your opponent in order to have this work. +#2/1/2007 Drawing a card is optional. If you forget, you can't go back later and do it, even if it is something you normally do. +#9/22/2011 "You" refers to the controller of Curiosity, which may be different from the controller of the enchanted creature."An opponent" refers to an opponent of Curiosity's controller. +#9/22/2011 Any damage dealt by the enchanted creature to an opponent will cause Curiosity to trigger, not just combat damage. +#9/22/2011 Curiosity doesn't trigger if the enchanted creature deals damage to a planeswalker controlled by an opponent. +# [INIT] firstmain [PLAYER1] @@ -29,7 +38,7 @@ next combatend [PLAYER1] inplay:Curiosity -hand:Island +library:Island life:14 [PLAYER2] inplay:Craw Wurm diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index 8d14242ff..4b971469a 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -1300,7 +1300,8 @@ public: bool sourceUntapped; bool limitOnceATurn; int triggeredTurn; - bool thiscontroller, thisopponent; + bool thiscontroller; + bool thisopponent; TrDamaged(GameObserver* observer, int id, MTGCardInstance * source, TargetChooser * tc, TargetChooser * fromTc = NULL, int type = 0,bool sourceUntapped = false,bool limitOnceATurn = false,bool once = false, bool thiscontroller = false, bool thisopponent = false) : Trigger(observer, id, source, once, tc), fromTc(fromTc), type(type) , sourceUntapped(sourceUntapped),limitOnceATurn(limitOnceATurn),thiscontroller(thiscontroller),thisopponent(thisopponent) { @@ -1321,12 +1322,11 @@ public: if (type == 2 && e->damage->typeOfDamage == Damage::DAMAGE_COMBAT) return 0; if (e->damage->target->type_as_damageable == Damageable::DAMAGEABLE_PLAYER) { - Player * p = (Player *) e->damage->target; if(thiscontroller) - if(p != source->controller()) + if(e->damage->target != (Damageable *)source->controller()) return 0; if(thisopponent) - if(p == source->controller()) + if(e->damage->target == (Damageable *)source->controller()) return 0; } e->damage->target->thatmuch = e->damage->damage; From 378a54fb623b7b06b749db268cdf0667c288ec55 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Fri, 23 Oct 2015 15:25:30 +0800 Subject: [PATCH 220/249] puresteel paladin support rehook and newhook for equipments inplay... retarget and newtarget don't support stonehewer basic because the card is refreshed and stone hewer basic creates equipment/s as tokens... --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 71 +++++++++++-------- .../bin/Res/sets/primitives/unsupported.txt | 12 ---- projects/mtg/include/AllAbilities.h | 4 +- projects/mtg/src/AllAbilities.cpp | 37 +++++++++- projects/mtg/src/MTGAbility.cpp | 10 ++- 5 files changed, 87 insertions(+), 47 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 972281e2b..9ab640264 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -5959,7 +5959,7 @@ toughness=1 [/card] [card] name=Auriok Survivors -auto=may name(move and attach) moveto(mybattlefield) target(equipment|mygraveyard) && newtarget +auto=may name(move and attach) moveto(mybattlefield) target(equipment|mygraveyard) and!(newhook)! text=When Auriok Survivors enters the battlefield, you may return target Equipment card from your graveyard to the battlefield. If you do, you may attach it to Auriok Survivors. mana={5}{W} type=Creature @@ -5980,7 +5980,7 @@ toughness=1 [card] name=Auriok Windwalker abilities=flying -auto={T}:target(equipment|mybattlefield) transforms((,newability[retarget target(creature|mybattlefield)])) forever +auto={T}:target(equipment|mybattlefield) transforms((,newability[rehook target(creature|mybattlefield)])) forever text=Flying -- {T}: Attach target Equipment you control to target creature you control. mana={3}{W} type=Creature @@ -12283,7 +12283,7 @@ toughness=1 [/card] [card] name=Brass Squire -auto={T}:target(equipment|mybattlefield) transforms((,newability[retarget target(creature|mybattlefield)])) forever +auto={T}:target(equipment|mybattlefield) transforms((,newability[rehook target(creature|mybattlefield)])) forever text={T}: Attach target Equipment you control to target creature you control. mana={3} type=Artifact Creature @@ -17311,7 +17311,7 @@ name=Cloak and Dagger auto={3}:equip auto=2/0 auto=shroud -auto=@movedto(creature[rogue]|battlefield):may all(trigger[to]) retarget +auto=@movedto(creature[rogue]|battlefield):may all(trigger[to]) rehook text=Equipped creature gets +2/+0 and has shroud. (It can't be the target of spells or abilities.) -- Whenever a Rogue creature enters the battlefield, you may attach Cloak and Dagger to it. -- Equip {3} mana={2} type=Tribal Artifact @@ -19630,7 +19630,7 @@ type=Artifact [card] name=Cranial Plating auto=foreach(artifact|mybattlefield) 1/0 -auto={B}{B}:name(attach) retarget target(creature|mybattlefield) +auto={B}{B}:name(attach) rehook target(creature|mybattlefield) auto={1}:equip text=Equipped creature gets +1/+0 for each artifact you control. -- {B}{B}: Attach Cranial Plating to target creature you control. -- Equip {1} ({1}: Attach to target creature you control. Equip only as a sorcery.) mana={2} @@ -23084,7 +23084,7 @@ toughness=5 [card] name=Deathrender auto=+2/+2 -auto=@movedto(mytgt|graveyard):may moveto(mybattlefield) target(creature|myhand) && all(this) retarget +auto=@movedto(mytgt|graveyard):may moveto(mybattlefield) target(creature|myhand) and!(rehook)! auto={2}:equip text=Equipped creature gets +2/+2. -- Whenever equipped creature is put into a graveyard, you may put a creature card from your hand onto the battlefield and attach Deathrender to it. -- Equip {2} mana={4} @@ -25562,7 +25562,7 @@ auto={3}:equip auto=@drawof(player):1/1 ueot auto=@drawof(player):flying ueot auto=teach(creature) {4}:draw:1 controller -auto=@movedto(creature[wizard]|battlefield):may all(trigger[to]) retarget +auto=@movedto(creature[wizard]|battlefield):may all(trigger[to]) rehook text=Equipped creature has "Whenever you draw a card, this creature gets +1/+1 and gains flying until end of turn" and "{4}: Draw a card." -- Whenever a Wizard creature enters the battlefield, you may attach Diviner's Wand to it. -- Equip {3} mana={3} type=Tribal Artifact @@ -42210,7 +42210,7 @@ name=Grifter's Blade abilities=flash auto={1}:equip auto=1/1 -auto=aslongas(parents) retarget target(creature|mybattlefield) <1 +auto=aslongas(parents) rehook target(creature|mybattlefield) <1 text=Flash -- As Grifter's Blade enters the battlefield, choose a creature you control it could be attached to. If you do, it enters the battlefield attached to that creature. -- Equipped creature gets +1/+1. -- Equip {1} mana={3} type=Artifact @@ -44495,7 +44495,7 @@ name=Healer's Headdress auto={1}:equip auto=0/2 auto=teach(creature) {T}:prevent:1 target(creature,player) -auto={W}{W}:name(attach) retarget target(creature|mybattlefield) +auto={W}{W}:name(attach) rehook target(creature|mybattlefield) text=Equipped creature gets +0/+2 and has "{T}: Prevent the next 1 damage that would be dealt to target creature or player this turn." -- {W}{W}: Attach Healer's Headdress to target creature you control. -- Equip {1} ({1}: Attach to target creature you control. Equip only as a sorcery.) mana={2} type=Artifact @@ -45476,7 +45476,7 @@ toughness=2 name=Hero's Blade auto={4}:equip auto=3/2 -auto=@movedto(creature[legendary]|mybattlefield):may all(trigger[to]) retarget +auto=@movedto(creature[legendary]|mybattlefield):may all(trigger[to]) rehook text=Equipped creature gets +3/+2. -- Whenever a legendary creature enters the battlefield under your control, you may attach Hero's Blade to it. mana={2} type=Artifact @@ -46574,7 +46574,7 @@ toughness=2 name=Horned Helm auto=1/1 auto=trample -auto={G}{G}:name(attach) retarget target(creature|mybattlefield) +auto={G}{G}:name(attach) rehook target(creature|mybattlefield) auto={1}:equip text=Equipped creature gets +1/+1 and has trample. -- {G}{G}: Attach Horned Helm to target creature you control. -- Equip {1} ({1}: Attach to target creature you control. Equip only as a sorcery.) mana={2} @@ -51376,9 +51376,9 @@ toughness=2 [/card] [card] name=Kaldra -auto=all(helm of kaldra) newtarget -auto=all(shield of kaldra) newtarget -auto=all(sword of kaldra) newtarget +auto=all(helm of kaldra) newhook +auto=all(shield of kaldra) newhook +auto=all(sword of kaldra) newhook type=Legendary Creature subtype=Avatar power=4 @@ -53945,7 +53945,7 @@ toughness=1 [/card] [card] name=Kor Outfitter -auto=target(equipment|mybattlefield) transforms((,newability[retarget target(creature|mybattlefield)])) forever +auto=target(equipment|mybattlefield) transforms((,newability[rehook target(creature|mybattlefield)])) forever text=When Kor Outfitter enters the battlefield, you may attach target Equipment you control to target creature you control. mana={W}{W} type=Creature @@ -58795,7 +58795,7 @@ type=Enchantment [card] name=Magnetic Theft target=equipment -auto=transforms((,newability[retarget target(creature)])) forever +auto=transforms((,newability[rehook target(creature)])) forever text=Attach target Equipment to target creature. (Control of the Equipment doesn't change.) mana={R} type=Instant @@ -66890,7 +66890,7 @@ toughness=2 [card] name=Neurok Stealthsuit auto=teach(creature) shroud -auto={U}{U}:name(attach) retarget target(creature|mybattlefield) +auto={U}{U}:name(attach) rehook target(creature|mybattlefield) auto={1}:equip text=Equipped creature has shroud. (It can't be the target of spells or abilities.) -- {U}{U}: Attach Neurok Stealthsuit to target creature you control. -- Equip {1} ({1}: Attach to target creature you control. Equip only as a sorcery.) mana={2} @@ -68625,7 +68625,7 @@ name=Obsidian Battle-Axe auto={3}:equip auto=2/1 auto=haste -auto=@movedto(creature[warrior]|battlefield):may all(trigger[to]) retarget +auto=@movedto(creature[warrior]|battlefield):may all(trigger[to]) rehook text=Equipped creature gets +2/+1 and has haste. -- Whenever a Warrior creature enters the battlefield, you may attach Obsidian Battle-Axe to it. -- Equip {3} mana={3} type=Tribal Artifact @@ -73194,7 +73194,7 @@ toughness=3 [/card] [card] name=Piston Sledge -auto=aslongas(parents) retarget target(creature|mybattlefield) <1 +auto=aslongas(parents) rehook target(creature|mybattlefield) <1 auto=teach(creature) 3/1 auto={S(artifact|mybattlefield)}:equip text=When Piston Sledge enters the battlefield, attach it to target creature you control. -- Equipped creature gets +3/+1. -- Equip - Sacrifice an artifact. @@ -75579,6 +75579,17 @@ mana={W} type=Instant [/card] [card] +name=Puresteel Paladin +auto=@movedTo(equipment|mybattlefield):may draw:1 controller +auto=lord(equipment|mybattlefield) transforms((,newability[{0}:name(Equip Zero) rehook target(creature|mybattlefield) assorcery restriction{type(artifact|mybattlefield)~morethan~2}])) +text=Whenever an Equipment enters the battlefield under your control, you may draw a card. -- Metalcraft - As long as you control 3 or more artifacts, each Equipment you control has equip {0}. +mana={W}{W} +type=Creature +subtype=Human Knight +power=2 +toughness=2 +[/card] +[card] name=Purge target=creature[black;artifact] auto=bury @@ -76052,7 +76063,7 @@ type=Enchantment [card] name=Quest for the Holy Relic auto=@movedTo(creature|mystack):may counter(0/0,1,Quest) all(this) -auto={C(0/0,-5,Quest)}{S}:name(move and attach) target(equipment|mylibrary) transforms((,newability[retarget target(creature|mybattlefield)],newability[moveto(mybattlefield)])) +auto={C(0/0,-5,Quest)}{S}:name(move and attach) target(equipment|mylibrary) moveto(mybattlefield) and!(transforms((,newability[rehook target(creature|mybattlefield)])))! text=Whenever you cast a creature spell, you may put a quest counter on Quest for the Holy Relic. -- Remove five quest counters from Quest for the Holy Relic and sacrifice it: Search your library for an Equipment card, put it onto the battlefield, and attach it to a creature you control. Then shuffle your library. mana={W} type=Enchantment @@ -81320,7 +81331,7 @@ toughness=2 [/card] [card] name=Ronin Warclub -auto=@movedto(creature|myBattlefield):choice all(trigger[to]) retarget +auto=@movedto(creature|myBattlefield):all(trigger[to]) rehook auto=+2/+1 text=Equipped creature gets +2/+1. -- Whenever a creature enters the battlefield under your control, attach Ronin Warclub to that creature. -- Equip {5} ({5}: Attach to target creature you control. Equip only as a sorcery.) mana={3} @@ -82815,7 +82826,7 @@ toughness=6 name=Sai of the Shinobi auto={2}:equip auto=1/1 -auto=@movedto(creature|mybattlefield):may all(trigger[to]) retarget +auto=@movedto(creature|mybattlefield):may all(trigger[to]) rehook text=Equipped creature gets +1/+1. -- Whenever a creature enters the battlefield under your control, you may attach Sai of the Shinobi to it. -- Equip {2} mana={1} type=Artifact @@ -85159,7 +85170,7 @@ toughness=2 name=Scythe of the Wretched auto=teach(creature) +2/+2 auto={4}:equip -auto=@vampired(creature) from(mytgt):all(trigger[to]) moveto(mybattlefield) and!(retarget)! +auto=@vampired(creature) from(mytgt):all(trigger[to]) moveto(mybattlefield) and!(rehook)! text=Equipped creature gets +2/+2. -- Whenever a creature dealt damage by equipped creature this turn is put into a graveyard, return that card to the battlefield under your control. Attach Scythe of the Wretched to that creature. -- Equip {4} mana={2} type=Artifact @@ -93235,7 +93246,7 @@ toughness=3 [card] name=Sparring Collar auto=first strike -auto={R}{R}:name(attach) retarget target(creature|mybattlefield) +auto={R}{R}:name(attach) rehook target(creature|mybattlefield) auto={1}:equip text=Equipped creature has first strike. -- {R}{R}: Attach Sparring Collar to target creature you control. -- Equip {1} ({1}: Attach to target creature you control. Equip only as a sorcery.) mana={2} @@ -96290,7 +96301,7 @@ subtype=Aura [card] name=Stonehewer Giant abilities=vigilance -auto={1}{W}{T}:name(move and attach) target(equipment|mylibrary) transforms((,newability[retarget target(creature|mybattlefield)],newability[moveto(mybattlefield)])) +auto={1}{W}{T}:name(move and attach) target(equipment|mylibrary) moveto(mybattlefield) and!(transforms((,newability[rehook target(creature|mybattlefield)])))! text=Vigilance -- {1}{W}, {T}: Search your library for an Equipment card and put it onto the battlefield. Attach it to a creature you control. Then shuffle your library. mana={3}{W}{W} type=Creature @@ -96570,7 +96581,7 @@ toughness=3 name=Stormrider Rig auto={2}:equip auto=1/1 -auto=@movedto(creature|mybattlefield):may all(trigger[to]) retarget +auto=@movedto(creature|mybattlefield):may all(trigger[to]) rehook text=Equipped creature gets +1/+1. -- Whenever a creature enters the battlefield under your control, you may attach Stormrider Rig to it. -- Equip {2} mana={2} type=Artifact @@ -98684,7 +98695,7 @@ subtype=Equipment name=Sword of the Meek auto={2}:equip auto=1/2 -autograveyard=@movedto(creature[power=1;toughness=1]|mybattlefield):may all(trigger[to]) retarget +autograveyard=@movedto(creature[power=1;toughness=1]|mybattlefield):may all(trigger[to]) rehook text=Equipped creature gets +1/+2. -- Equip {2} -- Whenever a 1/1 creature enters the battlefield under your control, you may return Sword of the Meek from your graveyard to the battlefield, then attach it to that creature. mana={2} type=Artifact @@ -101512,7 +101523,7 @@ toughness=2 name=Thornbite Staff auto=teach(creature) transforms((,newability[{2}{T}:damage:1 target(creature,player)])) auto=@movedto(creature|graveyard) from(creature|battlefield):teach(creature) untap -auto=@movedto(creature[shaman]|battlefield):may all(trigger[to]) retarget +auto=@movedto(creature[shaman]|battlefield):may all(trigger[to]) rehook auto={4}:equip text=Equipped creature has "{2}, {T}: This creature deals 1 damage to target creature or player" and "Whenever a creature dies, untap this creature." -- Whenever a Shaman creature enters the battlefield, you may attach Thornbite Staff to it. -- Equip {4} mana={2} @@ -108420,7 +108431,7 @@ type=Land name=Veteran's Armaments auto={2}:equip auto=@combat(attacking,blocking) source(mytgt) :all(trigger[to]) foreach(creature[attacking]|battlefield) 1/1 ueot -auto=@movedto(creature[soldier]|battlefield):may all(trigger[to]) retarget +auto=@movedto(creature[soldier]|battlefield):may all(trigger[to]) rehook text=Equipped creature has "Whenever this creature attacks or blocks, it gets +1/+1 until end of turn for each attacking creature." -- Whenever a Soldier creature enters the battlefield, you may attach Veteran's Armaments to it. -- Equip {2} mana={2} type=Tribal Artifact @@ -110418,7 +110429,7 @@ subtype=Equipment [card] name=Vulshok Battlemaster abilities=haste -auto=all(equipment|battlefield) newtarget +auto=all(equipment|battlefield) newhook text=Haste -- When Vulshok Battlemaster enters the battlefield, attach all Equipment on the battlefield to it. (Control of the Equipment doesn't change.) mana={4}{R} type=Creature diff --git a/projects/mtg/bin/Res/sets/primitives/unsupported.txt b/projects/mtg/bin/Res/sets/primitives/unsupported.txt index 75cbbd0c0..4be2a582b 100644 --- a/projects/mtg/bin/Res/sets/primitives/unsupported.txt +++ b/projects/mtg/bin/Res/sets/primitives/unsupported.txt @@ -12409,18 +12409,6 @@ type=Enchantment subtype=Aura [/card] [card] -#to be tested.... -name=Puresteel Paladin -auto=@movedTo(equipment|mybattlefield):may draw:1 controller -auto=lord(equipment|mybattlefield) transforms((,newability[{0}:name(equip 0) retarget target(creature|mybattlefield) assorcery restriction{type(artifact|mybattlefield)~morethan~2}])) -text=Whenever an Equipment enters the battlefield under your control, you may draw a card. -- Metalcraft - As long as you control 3 or more artifacts, each Equipment you control has equip {0}. -mana={W}{W} -type=Creature -subtype=Human Knight -power=2 -toughness=2 -[/card] -[card] name=Pure // Simple (Pure) text=Destroy target multicolored permanent. mana={1}{R}{G} diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index 4b971469a..cbc9fb7fd 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -4221,7 +4221,9 @@ class AANewTarget: public ActivatedAbility { public: bool retarget; - AANewTarget(GameObserver* observer, int id, MTGCardInstance * card, MTGCardInstance * _target,bool retarget = false, ManaCost * _cost = NULL); +bool reequip; +bool newhook; + AANewTarget(GameObserver* observer, int id, MTGCardInstance * card, MTGCardInstance * _target,bool retarget = false, ManaCost * _cost = NULL, bool reequip = false, bool newhook = false); int resolve(); const string getMenuText(); AANewTarget * clone() const; diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index dad26cbaf..a02bc3912 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -1739,8 +1739,8 @@ AAFrozen * AAFrozen::clone() const } // chose a new target for an aura or enchantment and equip it note: VERY basic right now. -AANewTarget::AANewTarget(GameObserver* observer, int id, MTGCardInstance * card, MTGCardInstance * _target,bool retarget, ManaCost * _cost) : -ActivatedAbility(observer, id, card, _cost, 0),retarget(retarget) +AANewTarget::AANewTarget(GameObserver* observer, int id, MTGCardInstance * card, MTGCardInstance * _target,bool retarget, ManaCost * _cost, bool reequip, bool newhook) : +ActivatedAbility(observer, id, card, _cost, 0),retarget(retarget),reequip(reequip),newhook(newhook) { target = _target; } @@ -1753,7 +1753,7 @@ int AANewTarget::resolve() _target = source; source = (MTGCardInstance *) target; } - if (_target) + if (_target && !reequip) { while (_target->next) _target = _target->next; @@ -1790,6 +1790,37 @@ int AANewTarget::resolve() } } + if (_target && _target->currentZone == _target->controller()->game->battlefield && reequip) + { + if(!newhook) + { + _target = source; + source = (MTGCardInstance *) target; + } + else + { + while (_target->next) + _target = _target->next; + } + if(_target->hasSubtype(Subtypes::TYPE_EQUIPMENT)) + { + for (size_t i = 1; i < game->mLayers->actionLayer()->mObjects.size(); i++) + { + MTGAbility * a = ((MTGAbility *) game->mLayers->actionLayer()->mObjects[i]); + AEquip * eq = dynamic_cast (a); + if (eq && eq->source == _target) + { + ((AEquip*)a)->unequip(); + ((AEquip*)a)->equip(source); + } + } + } + if(!newhook) + { + target = source; + source = _target; + } + } return 1; } diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index c9a49617f..92007d42a 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -3194,7 +3194,7 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG return a; } - //get a new target + //get a new target - retarget and newtarget makes the card refreshed - from exile to play... if ((s.find("retarget") != string::npos) || s.find("newtarget") != string::npos) { MTGAbility * a = NEW AANewTarget(observer, id, card,target, (s.find("retarget") != string::npos)); @@ -3202,6 +3202,14 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG return a; } + //get a new target for puresteel paladin...etc for equipments inplay only.. newhook & rehook supports stone hewer basic... the card is reequipped + if ((s.find("rehook") != string::npos) || s.find("newhook") != string::npos) + { + MTGAbility * a = NEW AANewTarget(observer, id, card,target, false,NULL,true,(s.find("newhook") != string::npos)); + a->oneShot = 1; + return a; + } + //morph found = s.find("morph"); if (found != string::npos) From 0594822872017c719204c4c9f615c70eb950d0cc Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sun, 25 Oct 2015 17:55:45 +0800 Subject: [PATCH 221/249] added card equipped event --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 3 +-- projects/mtg/include/WEvent.h | 6 ++++++ projects/mtg/src/AllAbilities.cpp | 2 ++ projects/mtg/src/GuiPlay.cpp | 2 ++ projects/mtg/src/WEvent.cpp | 11 +++++++++++ 5 files changed, 22 insertions(+), 2 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 9ab640264..936610a2d 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -73407,8 +73407,7 @@ toughness=* [/card] [card] name=Plague Sliver -auto=@each my upkeep:life:-type:sliver:mybattlefield controller -auto=@each opponent upkeep:life:-type:sliver:opponentbattlefield opponent +auto=lord(sliver) transforms((,newabililty[@each my upkeep:damage:1 controller])) text=All Slivers have "At the beginning of your upkeep, this permanent deals 1 damage to you." mana={2}{B}{B} type=Creature diff --git a/projects/mtg/include/WEvent.h b/projects/mtg/include/WEvent.h index 94043218e..0f9b546ec 100644 --- a/projects/mtg/include/WEvent.h +++ b/projects/mtg/include/WEvent.h @@ -279,6 +279,12 @@ struct WEventCardUnattached : public WEventCardUpdate { virtual Targetable * getTarget(int target); }; +//event when card-equipment attached/equipped +struct WEventCardEquipped : public WEventCardUpdate { + WEventCardEquipped(MTGCardInstance * card); + virtual Targetable * getTarget(int target); +}; + //event when card moves from player/opponent battlefield to player/opponent battlefield struct WEventCardControllerChange : public WEventCardUpdate { WEventCardControllerChange(MTGCardInstance * card); diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index a02bc3912..aad2664fb 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -5611,6 +5611,8 @@ int AEquip::equip(MTGCardInstance * equipped) //we equip... a->addToGame(); } + WEvent * e = NEW WEventCardEquipped(source); + game->receiveEvent(e); return 1; } diff --git a/projects/mtg/src/GuiPlay.cpp b/projects/mtg/src/GuiPlay.cpp index eee380023..e4fc0bd7c 100644 --- a/projects/mtg/src/GuiPlay.cpp +++ b/projects/mtg/src/GuiPlay.cpp @@ -412,6 +412,8 @@ int GuiPlay::receiveEventPlus(WEvent * e) Replace(); else if (dynamic_cast (e)) Replace(); + else if (dynamic_cast (e)) + Replace(); else if (dynamic_cast (e)) Replace(); Replace(); diff --git a/projects/mtg/src/WEvent.cpp b/projects/mtg/src/WEvent.cpp index 4b1db1029..09f4b4214 100644 --- a/projects/mtg/src/WEvent.cpp +++ b/projects/mtg/src/WEvent.cpp @@ -165,6 +165,11 @@ WEventCardUnattached::WEventCardUnattached(MTGCardInstance * card) : { } +WEventCardEquipped::WEventCardEquipped(MTGCardInstance * card) : + WEventCardUpdate(card) +{ +} + WEventCardControllerChange::WEventCardControllerChange(MTGCardInstance * card) : WEventCardUpdate(card) { @@ -324,6 +329,12 @@ Targetable * WEventCardUnattached::getTarget(int target) return NULL; } +Targetable * WEventCardEquipped::getTarget(int target) +{ + if (target) return card; + return NULL; +} + Targetable * WEventCardControllerChange::getTarget(int target) { if (target) return card; From cf0f9d43fa1ac48e5c89c4d44c416cae6fe1ae78 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 26 Oct 2015 06:50:19 +0800 Subject: [PATCH 222/249] exile zone player only, todo opponent and ability activation for exile --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 5 ++- projects/mtg/include/GuiAvatars.h | 2 + projects/mtg/include/GuiStatic.h | 10 +++++ projects/mtg/include/PlayGuiObject.h | 1 + projects/mtg/src/GameObserver.cpp | 2 + projects/mtg/src/GuiAvatars.cpp | 18 +++++--- projects/mtg/src/GuiStatic.cpp | 46 ++++++++++++++++++++ 7 files changed, 76 insertions(+), 8 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 936610a2d..4489f959d 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -19622,8 +19622,8 @@ toughness=4 [/card] [card] name=Cranial Archive -auto={2}{E}:name(shuffle graveyard) target(player) donothing && moveto(ownerlibrary) and!(shuffle)! all(*|targetedpersonsgraveyard) -text={2}, Exile Cranial Archive: Target player shuffles his or her graveyard into his or her library. +auto={2}{E}:name(shuffle graveyard) target(player) donothing && moveto(ownerlibrary) and!(shuffle && draw:1 controller)! all(*|targetedpersonsgraveyard) +text={2}, Exile Cranial Archive: Target player shuffles his or her graveyard into his or her library. Draw a card. mana={2} type=Artifact [/card] @@ -74363,6 +74363,7 @@ type=Sorcery [/card] [card] name=Preyseizer Dragon +abilities=flying auto=may target(other creature|mybattlefield) sacrifice && counter(1/1,2) all(this) auto=@combat(attacking) source(this)::target(creature,player) dynamicability text=Flying -- Devour 2 (As this enters the battlefield, you may sacrifice any number of creatures. This creature enters the battlefield with twice that many +1/+1 counters on it.) -- Whenever Preyseizer Dragon attacks, it deals damage to target creature or player equal to the number of +1/+1 counters on Preyseizer Dragon. diff --git a/projects/mtg/include/GuiAvatars.h b/projects/mtg/include/GuiAvatars.h index 2baf6822c..36622051b 100644 --- a/projects/mtg/include/GuiAvatars.h +++ b/projects/mtg/include/GuiAvatars.h @@ -7,6 +7,7 @@ struct GuiAvatar; class GuiGraveyard; class GuiLibrary; class GuiOpponentHand; +class GuiExile; class GuiAvatars: public GuiLayer { protected: @@ -14,6 +15,7 @@ protected: GuiGraveyard* selfGraveyard, *opponentGraveyard; GuiLibrary* selfLibrary, *opponentLibrary; GuiOpponentHand *opponentHand; + GuiExile* selfExile, *opponentExile; GuiAvatar* active; public: diff --git a/projects/mtg/include/GuiStatic.h b/projects/mtg/include/GuiStatic.h index 9fb352a7a..513d7848b 100644 --- a/projects/mtg/include/GuiStatic.h +++ b/projects/mtg/include/GuiStatic.h @@ -88,4 +88,14 @@ public: virtual ostream& toString(ostream& out) const; }; +class GuiExile: public GuiGameZone +{ +public: + Player * player; + GuiExile(float _x, float _y, bool hasFocus, Player * player, GuiAvatars* parent); + int receiveEventPlus(WEvent*); + int receiveEventMinus(WEvent*); + virtual ostream& toString(ostream& out) const; +}; + #endif // _GUISTATIC_H_ diff --git a/projects/mtg/include/PlayGuiObject.h b/projects/mtg/include/PlayGuiObject.h index c09d1a4c8..2f4dbcf67 100644 --- a/projects/mtg/include/PlayGuiObject.h +++ b/projects/mtg/include/PlayGuiObject.h @@ -10,6 +10,7 @@ #define GUI_GRAVEYARD 3 #define GUI_LIBRARY 4 #define GUI_OPPONENTHAND 5 +#define GUI_EXILE 6 #include #include "WEvent.h" diff --git a/projects/mtg/src/GameObserver.cpp b/projects/mtg/src/GameObserver.cpp index 4a0d6300b..3aba8dd97 100644 --- a/projects/mtg/src/GameObserver.cpp +++ b/projects/mtg/src/GameObserver.cpp @@ -1134,6 +1134,8 @@ void GameObserver::ButtonPressed(PlayGuiObject * target) } else if (GuiGraveyard* graveyard = dynamic_cast(target)) graveyard->toggleDisplay(); + else if (GuiExile* exile = dynamic_cast(target)) + exile->toggleDisplay(); //opponenthand else if (GuiOpponentHand* opponentHand = dynamic_cast(target)) if (opponentHand->showCards) diff --git a/projects/mtg/src/GuiAvatars.cpp b/projects/mtg/src/GuiAvatars.cpp index e364bae3c..6b5e922a7 100644 --- a/projects/mtg/src/GuiAvatars.cpp +++ b/projects/mtg/src/GuiAvatars.cpp @@ -14,6 +14,7 @@ GuiAvatars::GuiAvatars(DuelLayers* duelLayers) : self->zoom = 0.9f; Add(selfGraveyard = NEW GuiGraveyard(SCREEN_WIDTH - GuiAvatar::Width - GuiGameZone::Width / 2 - 11, SCREEN_HEIGHT - GuiAvatar::Height - 1, false, mpDuelLayers->getRenderedPlayer(), this)); Add(selfLibrary = NEW GuiLibrary(SCREEN_WIDTH - GuiAvatar::Width - GuiGameZone::Width / 2 - 11, SCREEN_HEIGHT - GuiAvatar::Height - 5 + GuiGameZone::Height + 5, false, mpDuelLayers->getRenderedPlayer(), this)); + Add(selfExile = NEW GuiExile(SCREEN_WIDTH - GuiAvatar::Width - GuiGameZone::Width / 2 + 20, SCREEN_HEIGHT - GuiAvatar::Height, false, mpDuelLayers->getRenderedPlayer(), this)); Add(opponent = NEW GuiAvatar(0, 0, false, mpDuelLayers->getRenderedPlayerOpponent(), GuiAvatar::TOP_LEFT, this)); opponent->zoom = 0.9f; @@ -28,12 +29,13 @@ GuiAvatars::GuiAvatars(DuelLayers* duelLayers) : observer->getCardSelector()->Add(self); observer->getCardSelector()->Add(selfGraveyard); + observer->getCardSelector()->Add(selfExile); observer->getCardSelector()->Add(selfLibrary); observer->getCardSelector()->Add(opponent); observer->getCardSelector()->Add(opponentGraveyard); observer->getCardSelector()->Add(opponentLibrary); observer->getCardSelector()->Add(opponentHand); - selfGraveyard->alpha = selfLibrary->alpha = opponentGraveyard->alpha = opponentLibrary->alpha = opponentHand->alpha = 0; + selfGraveyard->alpha = selfExile->alpha = selfLibrary->alpha = opponentGraveyard->alpha = opponentLibrary->alpha = opponentHand->alpha = 0; } float GuiAvatars::LeftBoundarySelf() @@ -56,9 +58,9 @@ void GuiAvatars::Activate(PlayGuiObject* c) active = opponent; opponent->zoom = 1.2f; } - else if ((selfGraveyard == c) || (selfLibrary == c) || (self == c)) + else if ((selfGraveyard == c) || (selfExile == c) || (selfLibrary == c) || (self == c)) { - selfGraveyard->alpha = selfLibrary->alpha = 128.0f; + selfGraveyard->alpha = selfExile->alpha = selfLibrary->alpha = 128.0f; self->zoom = 1.0f; active = self; } @@ -75,9 +77,9 @@ void GuiAvatars::Deactivate(PlayGuiObject* c) opponent->zoom = 0.9f; active = NULL; } - else if ((selfGraveyard == c) || (selfLibrary == c) || (self == c)) + else if ((selfGraveyard == c) || (selfExile == c) || (selfLibrary == c) || (self == c)) { - selfGraveyard->alpha = selfLibrary->alpha = 0; + selfGraveyard->alpha = selfExile->alpha = selfLibrary->alpha = 0; self->zoom = 0.5f; active = NULL; } @@ -85,12 +87,13 @@ void GuiAvatars::Deactivate(PlayGuiObject* c) int GuiAvatars::receiveEventPlus(WEvent* e) { - return selfGraveyard->receiveEventPlus(e) | opponentGraveyard->receiveEventPlus(e) | opponentHand->receiveEventPlus(e); + return selfGraveyard->receiveEventPlus(e) | selfExile->receiveEventPlus(e) | opponentGraveyard->receiveEventPlus(e) | opponentHand->receiveEventPlus(e); } int GuiAvatars::receiveEventMinus(WEvent* e) { selfGraveyard->receiveEventMinus(e); + selfExile->receiveEventMinus(e); opponentGraveyard->receiveEventMinus(e); opponentHand->receiveEventMinus(e); return 1; @@ -104,6 +107,8 @@ bool GuiAvatars::CheckUserInput(JButton key) return true; if (selfGraveyard->CheckUserInput(key)) return true; + if (selfExile->CheckUserInput(key)) + return true; if (opponentGraveyard->CheckUserInput(key)) return true; if (opponentHand->CheckUserInput(key)) @@ -120,6 +125,7 @@ void GuiAvatars::Update(float dt) self->Update(dt); opponent->Update(dt); selfGraveyard->Update(dt); + selfExile->Update(dt); opponentHand->Update(dt); opponentGraveyard->Update(dt); selfLibrary->Update(dt); diff --git a/projects/mtg/src/GuiStatic.cpp b/projects/mtg/src/GuiStatic.cpp index 28e00ec2d..c7eb7e795 100644 --- a/projects/mtg/src/GuiStatic.cpp +++ b/projects/mtg/src/GuiStatic.cpp @@ -298,6 +298,52 @@ ostream& GuiGraveyard::toString(ostream& out) const return out << "GuiGraveyard :::"; } +GuiExile::GuiExile(float x, float y, bool hasFocus, Player * player, GuiAvatars* parent) : + GuiGameZone(x, y, hasFocus, player->game->exile, parent), player(player) +{ + type = GUI_EXILE; +} + +int GuiExile::receiveEventPlus(WEvent* e) +{ + if (WEventZoneChange* event = dynamic_cast(e)) + if (event->to == zone) + { + CardView* t; + if (event->card->view) + t = NEW CardView(CardView::nullZone, event->card, *(event->card->view)); + else + t = NEW CardView(CardView::nullZone, event->card, x, y); + t->x = x + Width / 2; + t->y = y + Height / 2; + t->zoom = 0.6f; + t->alpha = 0; + cards.push_back(t); + return 1; + } + return 0; +} + +int GuiExile::receiveEventMinus(WEvent* e) +{ + if (WEventZoneChange* event = dynamic_cast(e)) + if (event->from == zone) + for (vector::iterator it = cards.begin(); it != cards.end(); ++it) + if (event->card->previous == (*it)->card) + { + CardView* cv = *it; + cards.erase(it); + zone->owner->getObserver()->mTrash->trash(cv); + return 1; + } + return 0; +} + +ostream& GuiExile::toString(ostream& out) const +{ + return out << "GuiExile :::"; +} + //opponenthand begins GuiOpponentHand::GuiOpponentHand(float x, float y, bool hasFocus, Player * player, GuiAvatars* parent) : GuiGameZone(x, y, hasFocus, player->game->hand, parent), player(player) From cdf94b281f384d4c465e561ed126ec527ac61156 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 26 Oct 2015 19:14:50 +0800 Subject: [PATCH 223/249] exile zone enabled exile zones for both players --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 2 +- projects/mtg/include/AllAbilities.h | 57 ++++++++++---------- projects/mtg/src/AIPlayerBaka.cpp | 12 ++--- projects/mtg/src/AllAbilities.cpp | 24 +++++++-- projects/mtg/src/GameObserver.cpp | 11 ++-- projects/mtg/src/GuiAvatars.cpp | 32 +++++++---- projects/mtg/src/GuiStatic.cpp | 16 +++++- projects/mtg/src/MTGAbility.cpp | 15 +++--- projects/mtg/src/Rules.cpp | 16 +++--- projects/mtg/src/TestSuiteAI.cpp | 21 ++++---- 10 files changed, 125 insertions(+), 81 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 4489f959d..eaed73793 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -68670,7 +68670,7 @@ type=Sorcery [card] name=Obzedat, Ghost Council auto=ability$!choice life:-2 target(opponent) && life:2 controller!$ controller -auto=@each my end:may name(exile) all(this) transforms((,newability[moveto(exile)],newability[phaseactionmulti[my upkeep once] moveto(ownerbattlefield) && all(this) haste])) +auto=@each my end:may name(exile) all(this) transforms((,newability[moveto(exile)],newability[phaseactionmulti[my upkeep once checkex] moveto(ownerbattlefield) && all(this) haste])) text=When Obzedat, Ghost Council enters the battlefield, target opponent loses 2 life and you gain 2 life. -- At the beginning of your end step, you may exile Obzedat. If you do, return it to the battlefield under its owner's control at the beginning of your next upkeep. It gains haste. mana={1}{W}{W}{B}{B} type=Legendary Creature diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index cbc9fb7fd..2f6d40e6c 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -207,8 +207,8 @@ private: for (int i = 0; i < 2; i++) { Player * dp = card->getObserver()->players[i]; - MTGGameZone * dzones[] = { dp->game->inPlay, dp->game->graveyard, dp->game->hand, dp->game->library }; - for (int k = 0; k < 4; k++) + MTGGameZone * dzones[] = { dp->game->inPlay, dp->game->graveyard, dp->game->hand, dp->game->library, dp->game->exile }; + for (int k = 0; k < 5; k++) { MTGGameZone * zone = dzones[k]; if (dtc->targetsZone(zone, card)&&dp == card->controller()) @@ -227,8 +227,8 @@ private: for (int i = 0; i < 2; i++) { Player * dp = card->getObserver()->players[i]; - MTGGameZone * dzones[] = { dp->game->inPlay, dp->game->graveyard, dp->game->hand, dp->game->library }; - for (int k = 0; k < 4; k++) + MTGGameZone * dzones[] = { dp->game->inPlay, dp->game->graveyard, dp->game->hand, dp->game->library, dp->game->exile }; + for (int k = 0; k < 5; k++) { MTGGameZone * zone = dzones[k]; if (dtc->targetsZone(zone, card)&&dp == card->controller()) @@ -247,8 +247,8 @@ private: for (int i = 0; i < 2; i++) { Player * dp = card->getObserver()->players[i]; - MTGGameZone * dzones[] = { dp->game->inPlay, dp->game->graveyard, dp->game->hand, dp->game->library }; - for (int k = 0; k < 4; k++) + MTGGameZone * dzones[] = { dp->game->inPlay, dp->game->graveyard, dp->game->hand, dp->game->library, dp->game->exile }; + for (int k = 0; k < 5; k++) { MTGGameZone * zone = dzones[k]; if (dtc->targetsZone(zone, card)&&dp == card->controller()) @@ -267,8 +267,8 @@ private: for (int i = 0; i < 2; i++) { Player * dp = card->getObserver()->players[i]; - MTGGameZone * dzones[] = { dp->game->inPlay, dp->game->graveyard, dp->game->hand, dp->game->library }; - for (int k = 0; k < 4; k++) + MTGGameZone * dzones[] = { dp->game->inPlay, dp->game->graveyard, dp->game->hand, dp->game->library, dp->game->exile }; + for (int k = 0; k < 5; k++) { MTGGameZone * zone = dzones[k]; if (dtc->targetsZone(zone, card)&&dp == card->controller()) @@ -287,8 +287,8 @@ private: for (int i = 0; i < 2; i++) { Player * dp = card->getObserver()->players[i]; - MTGGameZone * dzones[] = { dp->game->inPlay, dp->game->graveyard, dp->game->hand, dp->game->library }; - for (int k = 0; k < 4; k++) + MTGGameZone * dzones[] = { dp->game->inPlay, dp->game->graveyard, dp->game->hand, dp->game->library, dp->game->exile }; + for (int k = 0; k < 5; k++) { MTGGameZone * zone = dzones[k]; if (dtc->targetsZone(zone, card)&&dp == card->controller()) @@ -307,8 +307,8 @@ private: for (int i = 0; i < 2; i++) { Player * dp = card->getObserver()->players[i]; - MTGGameZone * dzones[] = { dp->game->inPlay, dp->game->graveyard, dp->game->hand, dp->game->library }; - for (int k = 0; k < 4; k++) + MTGGameZone * dzones[] = { dp->game->inPlay, dp->game->graveyard, dp->game->hand, dp->game->library, dp->game->exile }; + for (int k = 0; k < 5; k++) { MTGGameZone * zone = dzones[k]; if (dtc->targetsZone(zone, card)&&dp == card->controller()) @@ -327,8 +327,8 @@ private: for (int i = 0; i < 2; i++) { Player * dp = card->getObserver()->players[i]; - MTGGameZone * dzones[] = { dp->game->inPlay, dp->game->graveyard, dp->game->hand, dp->game->library }; - for (int k = 0; k < 4; k++) + MTGGameZone * dzones[] = { dp->game->inPlay, dp->game->graveyard, dp->game->hand, dp->game->library, dp->game->exile }; + for (int k = 0; k < 5; k++) { MTGGameZone * zone = dzones[k]; if (dtc->targetsZone(zone, card)&&dp == card->controller()) @@ -347,8 +347,8 @@ private: for (int i = 0; i < 2; i++) { Player * dp = card->getObserver()->players[i]; - MTGGameZone * dzones[] = { dp->game->inPlay, dp->game->graveyard, dp->game->hand, dp->game->library }; - for (int k = 0; k < 4; k++) + MTGGameZone * dzones[] = { dp->game->inPlay, dp->game->graveyard, dp->game->hand, dp->game->library, dp->game->exile }; + for (int k = 0; k < 5; k++) { MTGGameZone * zone = dzones[k]; if (dtc->targetsZone(zone, card)&&dp == card->controller()) @@ -367,8 +367,8 @@ private: for (int i = 0; i < 2; i++) { Player * dp = card->getObserver()->players[i]; - MTGGameZone * dzones[] = { dp->game->inPlay, dp->game->graveyard, dp->game->hand, dp->game->library }; - for (int k = 0; k < 4; k++) + MTGGameZone * dzones[] = { dp->game->inPlay, dp->game->graveyard, dp->game->hand, dp->game->library, dp->game->exile }; + for (int k = 0; k < 5; k++) { MTGGameZone * zone = dzones[k]; if (dtc->targetsZone(zone, card)&&dp == card->controller()) @@ -387,8 +387,8 @@ private: for (int i = 0; i < 2; i++) { Player * dp = card->getObserver()->players[i]; - MTGGameZone * dzones[] = { dp->game->inPlay, dp->game->graveyard, dp->game->hand, dp->game->library }; - for (int k = 0; k < 4; k++) + MTGGameZone * dzones[] = { dp->game->inPlay, dp->game->graveyard, dp->game->hand, dp->game->library, dp->game->exile }; + for (int k = 0; k < 5; k++) { MTGGameZone * zone = dzones[k]; if (dtc->targetsZone(zone, card)&&dp == card->controller()) @@ -424,8 +424,8 @@ private: for (int i = 0; i < 2; i++) { Player * p = card->getObserver()->players[i]; - MTGGameZone * zones[] = { p->game->inPlay, p->game->graveyard, p->game->hand, p->game->library }; - for (int k = 0; k < 4; k++) + MTGGameZone * zones[] = { p->game->inPlay, p->game->graveyard, p->game->hand, p->game->library, p->game->exile }; + for (int k = 0; k < 5; k++) { MTGGameZone * zone = zones[k]; if (tc->targetsZone(zone, card)) @@ -516,8 +516,8 @@ private: for (int i = 0; i < 2; i++) { Player * p = card->getObserver()->players[i]; - MTGGameZone * zones[] = { p->game->battlefield, p->game->graveyard, p->game->hand, p->game->library }; - for (int k = 0; k < 4; k++) + MTGGameZone * zones[] = { p->game->battlefield, p->game->graveyard, p->game->hand, p->game->library, p->game->exile }; + for (int k = 0; k < 5; k++) { MTGGameZone * zone = zones[k]; if(tc->targetsZone(zone,target)) @@ -2916,8 +2916,8 @@ public: for (int i = 0; i < 2; i++) { Player * p = game->players[i]; - MTGGameZone * zones[] = { p->game->inPlay, p->game->graveyard, p->game->hand, p->game->library }; - for (int k = 0; k < 4; k++) + MTGGameZone * zones[] = { p->game->inPlay, p->game->graveyard, p->game->hand, p->game->library, p->game->exile }; + for (int k = 0; k < 5; k++) { MTGGameZone * zone = zones[k]; Value = zone->countByCanTarget(tc); @@ -4913,10 +4913,11 @@ public: bool myturn; bool opponentturn; bool once; + bool checkexile; Player * abilityOwner; APhaseAction(GameObserver* observer, int _id, MTGCardInstance * card, MTGCardInstance * target, string sAbility, int restrictions = 0, int _phase = - MTG_PHASE_UPKEEP,bool forcedestroy = false,bool next = true,bool myturn = true,bool opponentturn = true,bool once = false); + MTG_PHASE_UPKEEP,bool forcedestroy = false,bool next = true,bool myturn = true,bool opponentturn = true,bool once = false, bool checkexile = false); void Update(float dt); int resolve(); const string getMenuText(); @@ -4931,7 +4932,7 @@ public: string sAbility; APhaseAction * ability; APhaseActionGeneric(GameObserver* observer, int _id, MTGCardInstance * card, MTGCardInstance * target, string sAbility, int restrictions = 0, int _phase = - MTG_PHASE_UPKEEP,bool forcedestroy = false,bool next = true,bool myturn = false,bool opponentturn = false,bool once = false); + MTG_PHASE_UPKEEP,bool forcedestroy = false,bool next = true,bool myturn = false,bool opponentturn = false,bool once = false,bool checkexile = false); int resolve(); const string getMenuText(); APhaseActionGeneric * clone() const; diff --git a/projects/mtg/src/AIPlayerBaka.cpp b/projects/mtg/src/AIPlayerBaka.cpp index b126eb040..d75616eaf 100644 --- a/projects/mtg/src/AIPlayerBaka.cpp +++ b/projects/mtg/src/AIPlayerBaka.cpp @@ -650,8 +650,8 @@ MTGCardInstance * AIPlayerBaka::chooseCard(TargetChooser * tc, MTGCardInstance * } for(int players = 0; players < 2;++players) { - MTGGameZone * zones[] = { playerZones->hand, playerZones->library, playerZones->inPlay, playerZones->graveyard,playerZones->stack }; - for (int j = 0; j < 5; j++) + MTGGameZone * zones[] = { playerZones->hand, playerZones->library, playerZones->inPlay, playerZones->graveyard,playerZones->stack,playerZones->exile }; + for (int j = 0; j < 6; j++) { MTGGameZone * zone = zones[j]; for (int k = 0; k < zone->nb_cards; k++) @@ -1214,7 +1214,7 @@ int AIPlayerBaka::createAbilityTargets(MTGAbility * a, MTGCardInstance * c, Rank for (int i = 0; i < 2; i++) { Player * p = observer->players[i]; - MTGGameZone * playerZones[] = { p->game->graveyard, p->game->library, p->game->hand, p->game->inPlay,p->game->stack }; + MTGGameZone * playerZones[] = { p->game->graveyard, p->game->library, p->game->hand, p->game->inPlay,p->game->stack,p->game->exile }; if(a->getActionTc()->canTarget((Targetable*)p)) { if(a->getActionTc()->maxtargets == 1) @@ -1225,7 +1225,7 @@ int AIPlayerBaka::createAbilityTargets(MTGAbility * a, MTGCardInstance * c, Rank else potentialTargets.push_back(p); } - for (int j = 0; j < 5; j++) + for (int j = 0; j < 6; j++) { MTGGameZone * zone = playerZones[j]; for (int k = 0; k < zone->nb_cards; k++) @@ -1553,8 +1553,8 @@ int AIPlayerBaka::chooseTarget(TargetChooser * _tc, Player * forceTarget,MTGCard } } MTGPlayerCards * playerZones = target->game; - MTGGameZone * zones[] = { playerZones->hand, playerZones->library, playerZones->inPlay, playerZones->graveyard,playerZones->stack }; - for (int j = 0; j < 5; j++) + MTGGameZone * zones[] = { playerZones->hand, playerZones->library, playerZones->inPlay, playerZones->graveyard,playerZones->stack,playerZones->exile }; + for (int j = 0; j < 6; j++) { MTGGameZone * zone = zones[j]; for (int k = 0; k < zone->nb_cards; k++) diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index aad2664fb..1a48ccc74 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -5092,8 +5092,8 @@ AUpkeep::~AUpkeep() } //A Phase based Action -APhaseAction::APhaseAction(GameObserver* observer, int _id, MTGCardInstance * card, MTGCardInstance *, string sAbility, int, int _phase,bool forcedestroy,bool next,bool myturn,bool opponentturn,bool once) : -MTGAbility(observer, _id, card),sAbility(sAbility), phase(_phase),forcedestroy(forcedestroy),next(next),myturn(myturn),opponentturn(opponentturn),once(once) +APhaseAction::APhaseAction(GameObserver* observer, int _id, MTGCardInstance * card, MTGCardInstance *, string sAbility, int, int _phase,bool forcedestroy,bool next,bool myturn,bool opponentturn,bool once, bool checkexile) : +MTGAbility(observer, _id, card),sAbility(sAbility), phase(_phase),forcedestroy(forcedestroy),next(next),myturn(myturn),opponentturn(opponentturn),once(once),checkexile(checkexile) { abilityId = _id; abilityOwner = card->controller(); @@ -5110,6 +5110,14 @@ MTGAbility(observer, _id, card),sAbility(sAbility), phase(_phase),forcedestroy(f void APhaseAction::Update(float dt) { + if(checkexile) + { + if(((MTGCardInstance *)target)->next->getCurrentZone() != ((MTGCardInstance *)target)->owner->game->exile) + { + this->forceDestroy = 1; + return; + } + } if (newPhase != currentPhase) { if((myturn && game->currentPlayer == source->controller())|| @@ -5186,11 +5194,11 @@ APhaseAction::~APhaseAction() } // the main ability -APhaseActionGeneric::APhaseActionGeneric(GameObserver* observer, int _id, MTGCardInstance * card, MTGCardInstance * target, string sAbility, int restrictions, int _phase,bool forcedestroy,bool next,bool myturn,bool opponentturn,bool once) : +APhaseActionGeneric::APhaseActionGeneric(GameObserver* observer, int _id, MTGCardInstance * card, MTGCardInstance * target, string sAbility, int restrictions, int _phase,bool forcedestroy,bool next,bool myturn,bool opponentturn,bool once, bool checkexile) : InstantAbility(observer, _id, card, target) { MTGCardInstance * _target = target; - ability = NEW APhaseAction(game, _id, card,_target, sAbility, restrictions, _phase,forcedestroy,next,myturn,opponentturn,once); + ability = NEW APhaseAction(game, _id, card,_target, sAbility, restrictions, _phase,forcedestroy,next,myturn,opponentturn,once,checkexile); } int APhaseActionGeneric::resolve() @@ -5236,7 +5244,7 @@ void ABlink::Update(float dt) resolveBlink(); } - if ((blinkueot && currentPhase == MTG_PHASE_ENDOFTURN) || (blinkForSource && !source->isInPlay(game))) + if ((blinkueot && currentPhase == MTG_PHASE_ENDOFTURN) || (blinkForSource && !source->isInPlay(game)) && Blinked->blinked) { if (Blinked == NULL) MTGAbility::Update(dt); @@ -5272,6 +5280,7 @@ void ABlink::resolveBlink() return; } _target = _target->next; + _target->blinked = true; Blinked = _target; if(!blinkueot && !blinkForSource) { @@ -5282,6 +5291,11 @@ void ABlink::resolveBlink() void ABlink::returnCardIntoPlay(MTGCardInstance* _target) { MTGCardInstance * Blinker = NULL; + if(!_target->blinked) + { + this->forceDestroy = 1; + return; + } if (!blinkhand) Blinker = _target->controller()->game->putInZone( _target, diff --git a/projects/mtg/src/GameObserver.cpp b/projects/mtg/src/GameObserver.cpp index 3aba8dd97..933ec20cf 100644 --- a/projects/mtg/src/GameObserver.cpp +++ b/projects/mtg/src/GameObserver.cpp @@ -518,12 +518,13 @@ bool GameObserver::operator==(const GameObserver& aGame) { error++; } - MTGGameZone * aZones[] = { p->game->graveyard, p->game->library, p->game->hand, p->game->inPlay }; + MTGGameZone * aZones[] = { p->game->graveyard, p->game->library, p->game->hand, p->game->inPlay, p->game->exile }; MTGGameZone * thisZones[] = { players[i]->game->graveyard, players[i]->game->library, players[i]->game->hand, - players[i]->game->inPlay }; - for (int j = 0; j < 4; j++) + players[i]->game->inPlay, + players[i]->game->exile }; + for (int j = 0; j < 5; j++) { MTGGameZone * zone = aZones[j]; if (zone->nb_cards != thisZones[j]->nb_cards) @@ -595,8 +596,8 @@ void GameObserver::gameStateBasedEffects() ///////////////////////////////////// for (int d = 0; d < 2; d++) { - MTGGameZone * dzones[] = { players[d]->game->inPlay, players[d]->game->graveyard, players[d]->game->hand, players[d]->game->library }; - for (int k = 0; k < 4; k++) + MTGGameZone * dzones[] = { players[d]->game->inPlay, players[d]->game->graveyard, players[d]->game->hand, players[d]->game->library, players[d]->game->exile }; + for (int k = 0; k < 5; k++) { MTGGameZone * zone = dzones[k]; if (mLayers->stackLayer()->count(0, NOT_RESOLVED) == 0) diff --git a/projects/mtg/src/GuiAvatars.cpp b/projects/mtg/src/GuiAvatars.cpp index 6b5e922a7..7db23774d 100644 --- a/projects/mtg/src/GuiAvatars.cpp +++ b/projects/mtg/src/GuiAvatars.cpp @@ -14,16 +14,21 @@ GuiAvatars::GuiAvatars(DuelLayers* duelLayers) : self->zoom = 0.9f; Add(selfGraveyard = NEW GuiGraveyard(SCREEN_WIDTH - GuiAvatar::Width - GuiGameZone::Width / 2 - 11, SCREEN_HEIGHT - GuiAvatar::Height - 1, false, mpDuelLayers->getRenderedPlayer(), this)); Add(selfLibrary = NEW GuiLibrary(SCREEN_WIDTH - GuiAvatar::Width - GuiGameZone::Width / 2 - 11, SCREEN_HEIGHT - GuiAvatar::Height - 5 + GuiGameZone::Height + 5, false, mpDuelLayers->getRenderedPlayer(), this)); - Add(selfExile = NEW GuiExile(SCREEN_WIDTH - GuiAvatar::Width - GuiGameZone::Width / 2 + 20, SCREEN_HEIGHT - GuiAvatar::Height, false, mpDuelLayers->getRenderedPlayer(), this)); + //myexile + Add(selfExile = NEW GuiExile(SCREEN_WIDTH - GuiAvatar::Width - GuiGameZone::Width / 2 + 10, SCREEN_HEIGHT - GuiAvatar::Height, false, mpDuelLayers->getRenderedPlayer(), this)); Add(opponent = NEW GuiAvatar(0, 0, false, mpDuelLayers->getRenderedPlayerOpponent(), GuiAvatar::TOP_LEFT, this)); opponent->zoom = 0.9f; - //opponenthandveiw button - Add(opponentHand = NEW GuiOpponentHand(-30 + GuiAvatar::Width * 1.2 - GuiGameZone::Width / 2, 35 + GuiGameZone::Height - 10, + //opponentExile + Add(opponentExile = NEW GuiExile(-30 + GuiAvatar::Width * 1.2 - GuiGameZone::Width / 2, 35 + GuiGameZone::Height - 10, false, mpDuelLayers->getRenderedPlayerOpponent(), this)); - //opponenthandveiwends - Add(opponentGraveyard = NEW GuiGraveyard(5 + GuiAvatar::Width * 1.4 - GuiGameZone::Width / 2, 5, false, + //opponentHand + Add(opponentHand = NEW GuiOpponentHand(5 + GuiAvatar::Width * 1.4 - GuiGameZone::Width / 2, 5, false, mpDuelLayers->getRenderedPlayerOpponent(), this)); + //opponentGraveyard + Add(opponentGraveyard = NEW GuiGraveyard(-15 + GuiAvatar::Width * 1.4 - GuiGameZone::Width / 2, 35 + GuiGameZone::Height - 10, false, + mpDuelLayers->getRenderedPlayerOpponent(), this)); + //opponentLibrary Add(opponentLibrary = NEW GuiLibrary(5 + GuiAvatar::Width * 1.4 - GuiGameZone::Width / 2, 5 + GuiGameZone::Height + 5, false, mpDuelLayers->getRenderedPlayerOpponent(), this)); @@ -33,9 +38,10 @@ GuiAvatars::GuiAvatars(DuelLayers* duelLayers) : observer->getCardSelector()->Add(selfLibrary); observer->getCardSelector()->Add(opponent); observer->getCardSelector()->Add(opponentGraveyard); + observer->getCardSelector()->Add(opponentExile); observer->getCardSelector()->Add(opponentLibrary); observer->getCardSelector()->Add(opponentHand); - selfGraveyard->alpha = selfExile->alpha = selfLibrary->alpha = opponentGraveyard->alpha = opponentLibrary->alpha = opponentHand->alpha = 0; + selfGraveyard->alpha = selfExile->alpha = opponentExile->alpha = selfLibrary->alpha = opponentGraveyard->alpha = opponentLibrary->alpha = opponentHand->alpha = 0; } float GuiAvatars::LeftBoundarySelf() @@ -52,9 +58,9 @@ void GuiAvatars::Activate(PlayGuiObject* c) c->zoom = 1.2f; c->mHasFocus = true; - if ((opponentGraveyard == c) || (opponentLibrary == c) || (opponent == c) || (opponentHand == c)) + if ((opponentGraveyard == c) || (opponentExile == c) || (opponentLibrary == c) || (opponent == c) || (opponentHand == c)) { - opponentGraveyard->alpha = opponentLibrary->alpha = opponentHand->alpha = 128.0f; + opponentGraveyard->alpha = opponentExile->alpha = opponentLibrary->alpha = opponentHand->alpha = 128.0f; active = opponent; opponent->zoom = 1.2f; } @@ -71,9 +77,9 @@ void GuiAvatars::Deactivate(PlayGuiObject* c) { c->zoom = 1.0; c->mHasFocus = false; - if ((opponentGraveyard == c) || (opponentLibrary == c) || (opponentHand == c) || (opponent == c)) + if ((opponentGraveyard == c) || (opponentExile == c) || (opponentLibrary == c) || (opponentHand == c) || (opponent == c)) { - opponentGraveyard->alpha = opponentLibrary->alpha = opponentHand->alpha = 0; + opponentGraveyard->alpha = opponentExile->alpha = opponentLibrary->alpha = opponentHand->alpha = 0; opponent->zoom = 0.9f; active = NULL; } @@ -87,7 +93,7 @@ void GuiAvatars::Deactivate(PlayGuiObject* c) int GuiAvatars::receiveEventPlus(WEvent* e) { - return selfGraveyard->receiveEventPlus(e) | selfExile->receiveEventPlus(e) | opponentGraveyard->receiveEventPlus(e) | opponentHand->receiveEventPlus(e); + return selfGraveyard->receiveEventPlus(e) | selfExile->receiveEventPlus(e) | opponentExile->receiveEventPlus(e) | opponentGraveyard->receiveEventPlus(e) | opponentHand->receiveEventPlus(e); } int GuiAvatars::receiveEventMinus(WEvent* e) @@ -95,6 +101,7 @@ int GuiAvatars::receiveEventMinus(WEvent* e) selfGraveyard->receiveEventMinus(e); selfExile->receiveEventMinus(e); opponentGraveyard->receiveEventMinus(e); + opponentExile->receiveEventMinus(e); opponentHand->receiveEventMinus(e); return 1; } @@ -111,6 +118,8 @@ bool GuiAvatars::CheckUserInput(JButton key) return true; if (opponentGraveyard->CheckUserInput(key)) return true; + if (opponentExile->CheckUserInput(key)) + return true; if (opponentHand->CheckUserInput(key)) return true; if (selfLibrary->CheckUserInput(key)) @@ -128,6 +137,7 @@ void GuiAvatars::Update(float dt) selfExile->Update(dt); opponentHand->Update(dt); opponentGraveyard->Update(dt); + opponentExile->Update(dt); selfLibrary->Update(dt); opponentLibrary->Update(dt); } diff --git a/projects/mtg/src/GuiStatic.cpp b/projects/mtg/src/GuiStatic.cpp index c7eb7e795..04506ead0 100644 --- a/projects/mtg/src/GuiStatic.cpp +++ b/projects/mtg/src/GuiStatic.cpp @@ -164,7 +164,10 @@ void GuiGameZone::Render() JQuadPtr quad = WResourceManager::Instance()->GetQuad(kGenericCardThumbnailID); float scale = defaultHeight / quad->mHeight; quad->SetColor(ARGB((int)(actA),255,255,255)); - + if(type == GUI_EXILE) + { + quad->SetColor(ARGB((int)(actA),150,150,150)); + } JRenderer::GetInstance()->RenderQuad(quad.get(), actX, actY, 0.0, scale * actZ, scale * actZ); float x0 = actX; @@ -182,7 +185,16 @@ void GuiGameZone::Render() mFont->SetScale(DEFAULT_MAIN_FONT_SCALE); char buffer[11]; int mAlpha = (int) (actA); - sprintf(buffer, "%i", zone->nb_cards); + /*if(type == GUI_GRAVEYARD) + sprintf(buffer, "%i\ng", zone->nb_cards); + else if(type == GUI_LIBRARY) + sprintf(buffer, "%i\nl", zone->nb_cards); + else if(type == GUI_OPPONENTHAND) + sprintf(buffer, "%i\nh", zone->nb_cards); + else if(type == GUI_EXILE) + sprintf(buffer, "%i\ne", zone->nb_cards); + else*/ + sprintf(buffer, "%i", zone->nb_cards); mFont->SetColor(ARGB(mAlpha,0,0,0)); mFont->DrawString(buffer, x0 + 1, actY + 1); if (actA > 120) diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index 92007d42a..af7a2b667 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -558,8 +558,8 @@ int AbilityFactory::countCards(TargetChooser * tc, Player * player, int option) { if (player && player != observer->players[i]) continue; - MTGGameZone * zones[] = { observer->players[i]->game->inPlay, observer->players[i]->game->graveyard, observer->players[i]->game->hand }; - for (int k = 0; k < 3; k++) + MTGGameZone * zones[] = { observer->players[i]->game->inPlay, observer->players[i]->game->graveyard, observer->players[i]->game->hand, observer->players[i]->game->exile }; + for (int k = 0; k < 4; k++) { for (int j = zones[k]->nb_cards - 1; j >= 0; j--) { @@ -3412,6 +3412,7 @@ MTGAbility * AbilityFactory::parsePhaseActionAbility(string s,MTGCardInstance * bool opponentturn = (s1.find("my") == string::npos); bool myturn = (s1.find("opponent") == string::npos); bool sourceinPlay = (s1.find("sourceinplay") != string::npos); + bool checkexile = (s1.find("checkex") != string::npos); bool next = (s1.find("next") == string::npos); //Why is this one the opposite of the two others? That's completely inconsistent bool once = (s1.find("once") != string::npos); @@ -3420,7 +3421,7 @@ MTGAbility * AbilityFactory::parsePhaseActionAbility(string s,MTGCardInstance * _target = spell->getNextCardTarget(); if(!_target) _target = target; - return NEW APhaseActionGeneric(observer, id, card,_target, trim(splitActions[2]), restrictions, phase,sourceinPlay,next,myturn,opponentturn,once); + return NEW APhaseActionGeneric(observer, id, card,_target, trim(splitActions[2]), restrictions, phase,sourceinPlay,next,myturn,opponentturn,once,checkexile); } MTGAbility * AbilityFactory::parseChooseActionAbility(string s,MTGCardInstance * card,Spell *,MTGCardInstance * target, int, int id) @@ -5257,8 +5258,8 @@ void ListMaintainerAbility::updateTargets() for (int i = 0; i < 2; i++) { Player * p = game->players[i]; - MTGGameZone * zones[] = { p->game->inPlay, p->game->graveyard, p->game->hand, p->game->library, p->game->stack }; - for (int k = 0; k < 5; k++) + MTGGameZone * zones[] = { p->game->inPlay, p->game->graveyard, p->game->hand, p->game->library, p->game->stack, p->game->exile }; + for (int k = 0; k < 6; k++) { MTGGameZone * zone = zones[k]; if (canTarget(zone)) @@ -5329,8 +5330,8 @@ void ListMaintainerAbility::checkTargets() for (int i = 0; i < 2; i++) { Player * p = game->players[i]; - MTGGameZone * zones[] = { p->game->inPlay, p->game->graveyard, p->game->hand, p->game->library, p->game->stack }; - for (int k = 0; k < 5; k++) + MTGGameZone * zones[] = { p->game->inPlay, p->game->graveyard, p->game->hand, p->game->library, p->game->stack, p->game->exile }; + for (int k = 0; k < 6; k++) { MTGGameZone * zone = zones[k]; if (canTarget(zone)) diff --git a/projects/mtg/src/Rules.cpp b/projects/mtg/src/Rules.cpp index adf7ff8a3..e5f095454 100644 --- a/projects/mtg/src/Rules.cpp +++ b/projects/mtg/src/Rules.cpp @@ -79,8 +79,8 @@ MTGCardInstance * Rules::getCardByMTGId(GameObserver* g, int mtgid) for (int i = 0; i < 2; i++) { Player * p = g->players[i]; - MTGGameZone * zones[] = { p->game->library, p->game->hand, p->game->inPlay, p->game->graveyard }; - for (int j = 0; j < 4; j++) + MTGGameZone * zones[] = { p->game->library, p->game->hand, p->game->inPlay, p->game->graveyard, p->game->exile }; + for (int j = 0; j < 5; j++) { MTGGameZone * zone = zones[j]; for (int k = 0; k < zone->nb_cards; k++) @@ -340,9 +340,10 @@ MTGDeck * Rules::buildDeck(int playerId) MTGGameZone * loadedPlayerZones[] = { initState.playerData[playerId].player->game->graveyard, initState.playerData[playerId].player->game->library, initState.playerData[playerId].player->game->hand, - initState.playerData[playerId].player->game->inPlay }; + initState.playerData[playerId].player->game->inPlay, + initState.playerData[playerId].player->game->exile }; - for (int j = 0; j < 4; j++) + for (int j = 0; j < 5; j++) { for (size_t k = 0; k < loadedPlayerZones[j]->cards.size(); k++) { @@ -412,12 +413,13 @@ void Rules::initGame(GameObserver *g, bool currentPlayerSet) { p->mAvatarName = initState.playerData[i].player->mAvatarName; } - MTGGameZone * playerZones[] = { p->game->graveyard, p->game->library, p->game->hand, p->game->inPlay }; + MTGGameZone * playerZones[] = { p->game->graveyard, p->game->library, p->game->hand, p->game->inPlay, p->game->exile }; MTGGameZone * loadedPlayerZones[] = { initState.playerData[i].player->game->graveyard, initState.playerData[i].player->game->library, initState.playerData[i].player->game->hand, - initState.playerData[i].player->game->inPlay }; - for (int j = 0; j < 4; j++) + initState.playerData[i].player->game->inPlay, + initState.playerData[i].player->game->exile }; + for (int j = 0; j < 5; j++) { MTGGameZone * zone = playerZones[j]; for (size_t k = 0; k < loadedPlayerZones[j]->cards.size(); k++) diff --git a/projects/mtg/src/TestSuiteAI.cpp b/projects/mtg/src/TestSuiteAI.cpp index bb7e236ce..beab3ded7 100644 --- a/projects/mtg/src/TestSuiteAI.cpp +++ b/projects/mtg/src/TestSuiteAI.cpp @@ -46,8 +46,8 @@ MTGCardInstance * TestSuiteAI::getCard(string action) for (int i = 0; i < 2; i++) { Player * p = observer->players[i]; - MTGGameZone * zones[] = { p->game->library, p->game->hand, p->game->inPlay, p->game->graveyard }; - for (int j = 0; j < 4; j++) + MTGGameZone * zones[] = { p->game->library, p->game->hand, p->game->inPlay, p->game->graveyard, p->game->exile }; + for (int j = 0; j < 5; j++) { MTGGameZone * zone = zones[j]; for (int k = 0; k < zone->nb_cards; k++) @@ -394,12 +394,13 @@ void TestSuiteGame::assertGame() error++; } - MTGGameZone * playerZones[] = { p->game->graveyard, p->game->library, p->game->hand, p->game->inPlay }; + MTGGameZone * playerZones[] = { p->game->graveyard, p->game->library, p->game->hand, p->game->inPlay, p->game->exile }; MTGGameZone * endstateZones[] = { endState.players[i]->game->graveyard, endState.players[i]->game->library, endState.players[i]->game->hand, - endState.players[i]->game->inPlay }; - for (int j = 0; j < 4; j++) + endState.players[i]->game->inPlay, + endState.players[i]->game->exile }; + for (int j = 0; j < 5; j++) { MTGGameZone * zone = playerZones[j]; if (zone->nb_cards != endstateZones[j]->nb_cards) @@ -853,12 +854,13 @@ void TestSuiteGame::initGame() stringstream stream; stream << initState.players[i]->getRandomGenerator()->saveLoadedRandValues(stream); p->getRandomGenerator()->loadRandValues(stream.str()); - MTGGameZone * playerZones[] = { p->game->graveyard, p->game->library, p->game->hand, p->game->inPlay }; + MTGGameZone * playerZones[] = { p->game->graveyard, p->game->library, p->game->hand, p->game->inPlay, p->game->exile }; MTGGameZone * loadedPlayerZones[] = { initState.players[i]->game->graveyard, initState.players[i]->game->library, initState.players[i]->game->hand, - initState.players[i]->game->inPlay }; - for (int j = 0; j < 4; j++) + initState.players[i]->game->inPlay, + initState.players[i]->game->exile }; + for (int j = 0; j < 5; j++) { MTGGameZone * zone = playerZones[j]; for (size_t k = 0; k < loadedPlayerZones[j]->cards.size(); k++) @@ -910,9 +912,10 @@ MTGPlayerCards * TestSuiteGame::buildDeck(Player* player, int playerId) MTGGameZone * loadedPlayerZones[] = { initState.players[playerId]->game->graveyard, initState.players[playerId]->game->library, initState.players[playerId]->game->hand, + initState.players[playerId]->game->exile, initState.players[playerId]->game->inPlay }; - for (int j = 0; j < 4; j++) + for (int j = 0; j < 5; j++) { for (size_t k = 0; k < loadedPlayerZones[j]->cards.size(); k++) { From 4853c8d314439271737ae4302c4d003a66d7290a Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Tue, 27 Oct 2015 01:03:24 +0800 Subject: [PATCH 224/249] Exile Corrections Todo: Update tests to include exile card count... --- projects/mtg/src/GuiAvatars.cpp | 12 +++++++----- projects/mtg/src/GuiStatic.cpp | 2 +- projects/mtg/src/MTGGameZones.cpp | 9 +++++++++ projects/mtg/src/TestSuiteAI.cpp | 12 ++++++------ 4 files changed, 23 insertions(+), 12 deletions(-) diff --git a/projects/mtg/src/GuiAvatars.cpp b/projects/mtg/src/GuiAvatars.cpp index 7db23774d..173604e05 100644 --- a/projects/mtg/src/GuiAvatars.cpp +++ b/projects/mtg/src/GuiAvatars.cpp @@ -15,18 +15,18 @@ GuiAvatars::GuiAvatars(DuelLayers* duelLayers) : Add(selfGraveyard = NEW GuiGraveyard(SCREEN_WIDTH - GuiAvatar::Width - GuiGameZone::Width / 2 - 11, SCREEN_HEIGHT - GuiAvatar::Height - 1, false, mpDuelLayers->getRenderedPlayer(), this)); Add(selfLibrary = NEW GuiLibrary(SCREEN_WIDTH - GuiAvatar::Width - GuiGameZone::Width / 2 - 11, SCREEN_HEIGHT - GuiAvatar::Height - 5 + GuiGameZone::Height + 5, false, mpDuelLayers->getRenderedPlayer(), this)); //myexile - Add(selfExile = NEW GuiExile(SCREEN_WIDTH - GuiAvatar::Width - GuiGameZone::Width / 2 + 10, SCREEN_HEIGHT - GuiAvatar::Height, false, mpDuelLayers->getRenderedPlayer(), this)); + Add(selfExile = NEW GuiExile(SCREEN_WIDTH - GuiAvatar::Width - GuiGameZone::Width / 2 - 11, SCREEN_HEIGHT - GuiAvatar::Height - 30, false, mpDuelLayers->getRenderedPlayer(), this)); Add(opponent = NEW GuiAvatar(0, 0, false, mpDuelLayers->getRenderedPlayerOpponent(), GuiAvatar::TOP_LEFT, this)); opponent->zoom = 0.9f; //opponentExile Add(opponentExile = NEW GuiExile(-30 + GuiAvatar::Width * 1.2 - GuiGameZone::Width / 2, 35 + GuiGameZone::Height - 10, false, mpDuelLayers->getRenderedPlayerOpponent(), this)); - //opponentHand - Add(opponentHand = NEW GuiOpponentHand(5 + GuiAvatar::Width * 1.4 - GuiGameZone::Width / 2, 5, false, - mpDuelLayers->getRenderedPlayerOpponent(), this)); //opponentGraveyard - Add(opponentGraveyard = NEW GuiGraveyard(-15 + GuiAvatar::Width * 1.4 - GuiGameZone::Width / 2, 35 + GuiGameZone::Height - 10, false, + Add(opponentGraveyard = NEW GuiGraveyard(5 + GuiAvatar::Width * 1.4 - GuiGameZone::Width / 2, 5, false, + mpDuelLayers->getRenderedPlayerOpponent(), this)); + //opponentHand + Add(opponentHand = NEW GuiOpponentHand(-15 + GuiAvatar::Width * 1.4 - GuiGameZone::Width / 2, 35 + GuiGameZone::Height - 10, false, mpDuelLayers->getRenderedPlayerOpponent(), this)); //opponentLibrary Add(opponentLibrary = NEW GuiLibrary(5 + GuiAvatar::Width * 1.4 - GuiGameZone::Width / 2, 5 + GuiGameZone::Height + 5, false, @@ -149,10 +149,12 @@ void GuiAvatars::Render() float h = 54; if (opponent == active) { + r->FillRect(opponent->actX, opponent->actY, 40 * opponent->actZ, h+20 * opponent->actZ, ARGB(200,0,0,0)); r->FillRect(opponent->actX, opponent->actY, w * opponent->actZ, h * opponent->actZ, ARGB(200,0,0,0)); } else if (self == active) { + r->FillRect(self->actX - w * self->actZ - 4.5f, self->actY - h-28 * self->actZ, 24 * self->actZ, h+28 * self->actZ, ARGB(200,0,0,0)); r->FillRect(self->actX - w * self->actZ - 4.5f, self->actY - h * self->actZ, w * self->actZ, h * self->actZ, ARGB(200,0,0,0)); } GuiLayer::Render(); diff --git a/projects/mtg/src/GuiStatic.cpp b/projects/mtg/src/GuiStatic.cpp index 04506ead0..2b7c6c93d 100644 --- a/projects/mtg/src/GuiStatic.cpp +++ b/projects/mtg/src/GuiStatic.cpp @@ -166,7 +166,7 @@ void GuiGameZone::Render() quad->SetColor(ARGB((int)(actA),255,255,255)); if(type == GUI_EXILE) { - quad->SetColor(ARGB((int)(actA),150,150,150)); + quad->SetColor(ARGB((int)(actA),255,240,255)); } JRenderer::GetInstance()->RenderQuad(quad.get(), actX, actY, 0.0, scale * actZ, scale * actZ); diff --git a/projects/mtg/src/MTGGameZones.cpp b/projects/mtg/src/MTGGameZones.cpp index 4cea41c66..f74227a18 100644 --- a/projects/mtg/src/MTGGameZones.cpp +++ b/projects/mtg/src/MTGGameZones.cpp @@ -1289,6 +1289,10 @@ ostream& operator<<(ostream& out, const MTGPlayerCards& z) out << "hand="; out << *(z.hand) << endl; } + if(z.removedFromGame->cards.size()) { + out << "exile="; + out << *(z.hand) << endl; + } return out; } @@ -1321,6 +1325,11 @@ bool MTGPlayerCards::parseLine(const string& s) battlefield->parseLine(s.substr(limiter+1)); return true; } + else if (areaS.compare("removedfromgame") == 0 || areaS.compare("exile") == 0) + { + removedFromGame->parseLine(s.substr(limiter+1)); + return true; + } } return false; diff --git a/projects/mtg/src/TestSuiteAI.cpp b/projects/mtg/src/TestSuiteAI.cpp index beab3ded7..35bb7e60f 100644 --- a/projects/mtg/src/TestSuiteAI.cpp +++ b/projects/mtg/src/TestSuiteAI.cpp @@ -46,7 +46,7 @@ MTGCardInstance * TestSuiteAI::getCard(string action) for (int i = 0; i < 2; i++) { Player * p = observer->players[i]; - MTGGameZone * zones[] = { p->game->library, p->game->hand, p->game->inPlay, p->game->graveyard, p->game->exile }; + MTGGameZone * zones[] = { p->game->library, p->game->hand, p->game->inPlay, p->game->graveyard, p->game->removedFromGame }; for (int j = 0; j < 5; j++) { MTGGameZone * zone = zones[j]; @@ -394,12 +394,12 @@ void TestSuiteGame::assertGame() error++; } - MTGGameZone * playerZones[] = { p->game->graveyard, p->game->library, p->game->hand, p->game->inPlay, p->game->exile }; + MTGGameZone * playerZones[] = { p->game->graveyard, p->game->library, p->game->hand, p->game->inPlay, p->game->removedFromGame }; MTGGameZone * endstateZones[] = { endState.players[i]->game->graveyard, endState.players[i]->game->library, endState.players[i]->game->hand, endState.players[i]->game->inPlay, - endState.players[i]->game->exile }; + endState.players[i]->game->removedFromGame }; for (int j = 0; j < 5; j++) { MTGGameZone * zone = playerZones[j]; @@ -854,12 +854,12 @@ void TestSuiteGame::initGame() stringstream stream; stream << initState.players[i]->getRandomGenerator()->saveLoadedRandValues(stream); p->getRandomGenerator()->loadRandValues(stream.str()); - MTGGameZone * playerZones[] = { p->game->graveyard, p->game->library, p->game->hand, p->game->inPlay, p->game->exile }; + MTGGameZone * playerZones[] = { p->game->graveyard, p->game->library, p->game->hand, p->game->inPlay, p->game->removedFromGame }; MTGGameZone * loadedPlayerZones[] = { initState.players[i]->game->graveyard, initState.players[i]->game->library, initState.players[i]->game->hand, initState.players[i]->game->inPlay, - initState.players[i]->game->exile }; + initState.players[i]->game->removedFromGame }; for (int j = 0; j < 5; j++) { MTGGameZone * zone = playerZones[j]; @@ -912,7 +912,7 @@ MTGPlayerCards * TestSuiteGame::buildDeck(Player* player, int playerId) MTGGameZone * loadedPlayerZones[] = { initState.players[playerId]->game->graveyard, initState.players[playerId]->game->library, initState.players[playerId]->game->hand, - initState.players[playerId]->game->exile, + initState.players[playerId]->game->removedFromGame, initState.players[playerId]->game->inPlay }; for (int j = 0; j < 5; j++) From bd5449a9a2a3ec0714c2c9c6c15a348a08a16cdd Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Tue, 27 Oct 2015 06:35:22 +0800 Subject: [PATCH 225/249] updated old tests the new exile zone is utilized in comparing the number of cards it has(since its enabled and viewable, the value is now counted) --- projects/mtg/bin/Res/test/aegis_of_the_meek.txt | 1 + projects/mtg/bin/Res/test/angry_mob1.txt | 1 + projects/mtg/bin/Res/test/angry_mob2.txt | 1 + projects/mtg/bin/Res/test/angry_mob3.txt | 1 + projects/mtg/bin/Res/test/angry_mob4.txt | 1 + projects/mtg/bin/Res/test/angry_mob4b.txt | 1 + projects/mtg/bin/Res/test/angry_mob5.txt | 1 + projects/mtg/bin/Res/test/angry_mob7.txt | 1 + projects/mtg/bin/Res/test/celestial_purge.txt | 1 + projects/mtg/bin/Res/test/control_magic2.txt | 1 + projects/mtg/bin/Res/test/cranial_plating.txt | 1 + projects/mtg/bin/Res/test/fists_of_ironwood.txt | 1 + projects/mtg/bin/Res/test/fizzleto_exile.txt | 1 + projects/mtg/bin/Res/test/generic/rampage3.txt | 1 + projects/mtg/bin/Res/test/karns_touch_i233.txt | 1 + projects/mtg/bin/Res/test/leveler.txt | 1 + projects/mtg/bin/Res/test/necrogenesis.txt | 1 + projects/mtg/bin/Res/test/sword_to_plowshares.txt | 1 + projects/mtg/bin/Res/test/thelon_of_havenwood.txt | 1 + projects/mtg/bin/Res/test/unearth3.txt | 1 + 20 files changed, 20 insertions(+) diff --git a/projects/mtg/bin/Res/test/aegis_of_the_meek.txt b/projects/mtg/bin/Res/test/aegis_of_the_meek.txt index 114710b9d..8104e890c 100644 --- a/projects/mtg/bin/Res/test/aegis_of_the_meek.txt +++ b/projects/mtg/bin/Res/test/aegis_of_the_meek.txt @@ -23,6 +23,7 @@ firstmain [PLAYER1] inplay:Aegis of the Meek,Steppe Lynx,Savannah Lions,Courier Hawk graveyard:Swords to Plowshares +exile:Raging Goblin life:22 [PLAYER2] [END] diff --git a/projects/mtg/bin/Res/test/angry_mob1.txt b/projects/mtg/bin/Res/test/angry_mob1.txt index b67b42e3b..63d7dbde4 100644 --- a/projects/mtg/bin/Res/test/angry_mob1.txt +++ b/projects/mtg/bin/Res/test/angry_mob1.txt @@ -16,6 +16,7 @@ Angry Mob firstmain [PLAYER1] graveyard:Swords to Plowshares +exile:Angry Mob life:25 [PLAYER2] inplay:1373,1374,1375 diff --git a/projects/mtg/bin/Res/test/angry_mob2.txt b/projects/mtg/bin/Res/test/angry_mob2.txt index eba0817f5..7ccb6de6f 100644 --- a/projects/mtg/bin/Res/test/angry_mob2.txt +++ b/projects/mtg/bin/Res/test/angry_mob2.txt @@ -19,6 +19,7 @@ Angry Mob [ASSERT] firstmain [PLAYER1] +exile:Angry Mob graveyard:Swords to Plowshares,Boomerang life:24 [PLAYER2] diff --git a/projects/mtg/bin/Res/test/angry_mob3.txt b/projects/mtg/bin/Res/test/angry_mob3.txt index 00a84e8d6..936a7a8e1 100644 --- a/projects/mtg/bin/Res/test/angry_mob3.txt +++ b/projects/mtg/bin/Res/test/angry_mob3.txt @@ -22,6 +22,7 @@ Angry Mob [ASSERT] firstmain [PLAYER1] +exile:Angry Mob life:22 [PLAYER2] inplay:1373,1374,1375,Plains diff --git a/projects/mtg/bin/Res/test/angry_mob4.txt b/projects/mtg/bin/Res/test/angry_mob4.txt index e2a08256a..0077db594 100644 --- a/projects/mtg/bin/Res/test/angry_mob4.txt +++ b/projects/mtg/bin/Res/test/angry_mob4.txt @@ -25,6 +25,7 @@ Angry Mob [ASSERT] firstmain [PLAYER1] +exile:Angry Mob life:22 [PLAYER2] inplay:1373,1374,1375,Plains diff --git a/projects/mtg/bin/Res/test/angry_mob4b.txt b/projects/mtg/bin/Res/test/angry_mob4b.txt index 76be465d0..38a33177a 100644 --- a/projects/mtg/bin/Res/test/angry_mob4b.txt +++ b/projects/mtg/bin/Res/test/angry_mob4b.txt @@ -29,6 +29,7 @@ Angry Mob [ASSERT] firstmain [PLAYER1] +exile:Angry Mob life:22 [PLAYER2] inplay:1373,1374,Plains diff --git a/projects/mtg/bin/Res/test/angry_mob5.txt b/projects/mtg/bin/Res/test/angry_mob5.txt index 12d26b0be..85e812dd1 100644 --- a/projects/mtg/bin/Res/test/angry_mob5.txt +++ b/projects/mtg/bin/Res/test/angry_mob5.txt @@ -23,6 +23,7 @@ Angry Mob [ASSERT] firstmain [PLAYER1] +exile:Angry Mob inplay:Plains graveyard:Swords to Plowshares life:25 diff --git a/projects/mtg/bin/Res/test/angry_mob7.txt b/projects/mtg/bin/Res/test/angry_mob7.txt index d82073fa7..2ca2eb106 100644 --- a/projects/mtg/bin/Res/test/angry_mob7.txt +++ b/projects/mtg/bin/Res/test/angry_mob7.txt @@ -22,6 +22,7 @@ Angry Mob firstmain [PLAYER1] graveyard:Swords to Plowshares,Annex,Demystify +exile:Angry Mob life:25 [PLAYER2] inplay:1373,1374,1375 diff --git a/projects/mtg/bin/Res/test/celestial_purge.txt b/projects/mtg/bin/Res/test/celestial_purge.txt index 69492a32e..fccdd052c 100644 --- a/projects/mtg/bin/Res/test/celestial_purge.txt +++ b/projects/mtg/bin/Res/test/celestial_purge.txt @@ -15,4 +15,5 @@ FIRSTMAIN graveyard:183055 manapool:{0} [PLAYER2] +exile:184994 [END] \ No newline at end of file diff --git a/projects/mtg/bin/Res/test/control_magic2.txt b/projects/mtg/bin/Res/test/control_magic2.txt index a64751632..67e6f0099 100644 --- a/projects/mtg/bin/Res/test/control_magic2.txt +++ b/projects/mtg/bin/Res/test/control_magic2.txt @@ -28,6 +28,7 @@ graveyard:1194 manapool:{0} life:24 [PLAYER2] +exile:1366 graveyard:1367 inplay:1397 manapool:{0} diff --git a/projects/mtg/bin/Res/test/cranial_plating.txt b/projects/mtg/bin/Res/test/cranial_plating.txt index 3de1d04f2..184321939 100644 --- a/projects/mtg/bin/Res/test/cranial_plating.txt +++ b/projects/mtg/bin/Res/test/cranial_plating.txt @@ -19,6 +19,7 @@ Grizzly Bears [ASSERT] combatattackers [PLAYER1] +exile:Grizzly Bears inplay:Cranial Plating,Rod of Ruin graveyard:Swords to Plowshares life:24 diff --git a/projects/mtg/bin/Res/test/fists_of_ironwood.txt b/projects/mtg/bin/Res/test/fists_of_ironwood.txt index 7e852fa3b..8cfb9a324 100644 --- a/projects/mtg/bin/Res/test/fists_of_ironwood.txt +++ b/projects/mtg/bin/Res/test/fists_of_ironwood.txt @@ -19,6 +19,7 @@ endinterruption [ASSERT] FIRSTMAIN [PLAYER1] +exile:grizzly bears graveyard:fists of ironwood life:22 [PLAYER2] diff --git a/projects/mtg/bin/Res/test/fizzleto_exile.txt b/projects/mtg/bin/Res/test/fizzleto_exile.txt index cb9e4fe7a..3ca6532a3 100644 --- a/projects/mtg/bin/Res/test/fizzleto_exile.txt +++ b/projects/mtg/bin/Res/test/fizzleto_exile.txt @@ -17,6 +17,7 @@ endinterruption [ASSERT] FIRSTMAIN [PLAYER1] +exile:bad moon manapool:{0} life:20 [PLAYER2] diff --git a/projects/mtg/bin/Res/test/generic/rampage3.txt b/projects/mtg/bin/Res/test/generic/rampage3.txt index 04ff5c715..8e598e1f0 100644 --- a/projects/mtg/bin/Res/test/generic/rampage3.txt +++ b/projects/mtg/bin/Res/test/generic/rampage3.txt @@ -26,6 +26,7 @@ secondmain [PLAYER1] inplay:Plains graveyard:Swords to Plowshares +exile:Frost Giant life:28 [PLAYER2] graveyard:Suntail Hawk,Scryb Sprites,Raging Goblin diff --git a/projects/mtg/bin/Res/test/karns_touch_i233.txt b/projects/mtg/bin/Res/test/karns_touch_i233.txt index 7c0b36aab..aa9ac8c17 100644 --- a/projects/mtg/bin/Res/test/karns_touch_i233.txt +++ b/projects/mtg/bin/Res/test/karns_touch_i233.txt @@ -18,6 +18,7 @@ Jayemdae Tome [ASSERT] firstmain [PLAYER1] +exile:Jayemdae Tome graveyard:Karn's Touch,Swords to Plowshares life:24 [PLAYER2] diff --git a/projects/mtg/bin/Res/test/leveler.txt b/projects/mtg/bin/Res/test/leveler.txt index a00f1860a..a58558a75 100644 --- a/projects/mtg/bin/Res/test/leveler.txt +++ b/projects/mtg/bin/Res/test/leveler.txt @@ -11,6 +11,7 @@ leveler [ASSERT] FIRSTMAIN [PLAYER1] +exile:swamp,mountain inplay:leveler [PLAYER2] [END] \ No newline at end of file diff --git a/projects/mtg/bin/Res/test/necrogenesis.txt b/projects/mtg/bin/Res/test/necrogenesis.txt index a330a02d0..fbe6bbcb4 100644 --- a/projects/mtg/bin/Res/test/necrogenesis.txt +++ b/projects/mtg/bin/Res/test/necrogenesis.txt @@ -16,4 +16,5 @@ FIRSTMAIN inplay:necrogenesis,* manapool:{0} [PLAYER2] +exile:1250 [END] \ No newline at end of file diff --git a/projects/mtg/bin/Res/test/sword_to_plowshares.txt b/projects/mtg/bin/Res/test/sword_to_plowshares.txt index 16fda5125..5ca45d047 100644 --- a/projects/mtg/bin/Res/test/sword_to_plowshares.txt +++ b/projects/mtg/bin/Res/test/sword_to_plowshares.txt @@ -16,5 +16,6 @@ FIRSTMAIN graveyard:1367 manapool:{0} [PLAYER2] +exile:141935 life:23 [END] \ No newline at end of file diff --git a/projects/mtg/bin/Res/test/thelon_of_havenwood.txt b/projects/mtg/bin/Res/test/thelon_of_havenwood.txt index 5d1853199..6a697f9a4 100644 --- a/projects/mtg/bin/Res/test/thelon_of_havenwood.txt +++ b/projects/mtg/bin/Res/test/thelon_of_havenwood.txt @@ -25,6 +25,7 @@ next [assert] secondmain [player1] +exile:fungusaur inplay:Thelon Of Havenwood,Thallid,Deathspore Thallid,forest,swamp [player2] life:14 diff --git a/projects/mtg/bin/Res/test/unearth3.txt b/projects/mtg/bin/Res/test/unearth3.txt index 7c6e8af54..2344bb1f5 100644 --- a/projects/mtg/bin/Res/test/unearth3.txt +++ b/projects/mtg/bin/Res/test/unearth3.txt @@ -24,6 +24,7 @@ next [ASSERT] CLEANUP [PLAYER1] +exile:Dregscape Zombie inplay:129754 [PLAYER2] graveyard:Grizzly Bears From 56fc735b3652629a1081ac10e7091f680bce79d1 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Tue, 27 Oct 2015 07:05:57 +0800 Subject: [PATCH 226/249] Parenthesis Try to fix PSP compilation --- projects/mtg/src/AllAbilities.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index 1a48ccc74..4a796159c 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -5244,7 +5244,7 @@ void ABlink::Update(float dt) resolveBlink(); } - if ((blinkueot && currentPhase == MTG_PHASE_ENDOFTURN) || (blinkForSource && !source->isInPlay(game)) && Blinked->blinked) + if ((blinkueot && currentPhase == MTG_PHASE_ENDOFTURN) || (blinkForSource && !source->isInPlay(game)) && (Blinked->blinked)) { if (Blinked == NULL) MTGAbility::Update(dt); From d2f3e2cd60c183ab668bfd6840fc537002fdd1c3 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Tue, 27 Oct 2015 19:44:22 +0800 Subject: [PATCH 227/249] Castcard, Rebound and other fixes --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 174 +++++++++++++----- .../bin/Res/sets/primitives/unsupported.txt | 56 ------ projects/mtg/src/AllAbilities.cpp | 33 +++- projects/mtg/src/MTGAbility.cpp | 15 ++ projects/mtg/src/TargetChooser.cpp | 4 + 5 files changed, 175 insertions(+), 107 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index eaed73793..4f595bec7 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -7313,7 +7313,7 @@ type=Enchantment name=Banishing Stroke target=*[artifact;creature;enchantment] auto=bottomoflibrary -autohand=restriction{miracle} pay[[{W}]] name(Miracle) activate name(Miracle) castcard(normal) +autohand=restriction{miracle} pay[[{W}]] name(Miracle) activate name(Miracle) castcard(restricted) text=Put target artifact, creature, or enchantment on the bottom of its owner's library. -- Miracle {W} (You may cast this card for its miracle cost when you draw it if it's the first card you drew this turn.) mana={5}{W} type=Instant @@ -9657,7 +9657,7 @@ subtype=Aura [card] name=Blessings of Nature auto=ability$!counter(1/1,1) target(creature)!$ controller && ability$!counter(1/1,1) target(creature)!$ controller && ability$!counter(1/1,1) target(creature)!$ controller && ability$!counter(1/1,1) target(creature)!$ controller -autohand=restriction{miracle} pay[[{G}]] name(Miracle) activate name(Miracle) castcard(normal) +autohand=restriction{miracle} pay[[{G}]] name(Miracle) activate name(Miracle) castcard(restricted) text=Distribute four +1/+1 counters among any number of target creatures. -- Miracle {G} (You may cast this card for its miracle cost when you draw it if it's the first card you drew this turn.) mana={4}{G} type=Sorcery @@ -12231,7 +12231,7 @@ type=Instant [card] name=Brand of Ill Omen target=creature -auto=cumulativeupcost[{R}] sacrifice +auto=cumulativeupcostmulti[{R}] sacrifice all(this) auto=transforms((,newability[maxCast(creature)0 controller])) text=Enchant creature -- Cumulative upkeep {R} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -- Enchanted creature's controller can't cast creature spells. mana={3}{R} @@ -15829,7 +15829,7 @@ name=Chandra Ablaze auto=counter(0/0,5,loyalty) auto={C(0/0,1,Loyalty)}:name(discard a card) all(this) transforms((,newability[reject notatarget(*|myhand)],newability[@discarded(*[red]|myhand) once:damage:4 target(*[creature;player])])) ueot auto={C(0/0,-2,Loyalty)}:name(discard hand) reject all(*|hand) && draw:3 all(player) -auto={C(0/0,-7,Loyalty)}:name(cast cards) castcard(normal) target(*[instant;sorcery]|mygraveyard) +auto={C(0/0,-7,Loyalty)}:name(cast cards) castcard(restricted) target(*[instant;sorcery]|mygraveyard) text=+1: Discard a card. If a red card is discarded this way, Chandra Ablaze deals 4 damage to target creature or player. -- -2: Each player discards his or her hand, then draws three cards. -- -7: Cast any number of red instant and/or sorcery cards from your graveyard without paying their mana costs. mana={4}{R}{R} type=Planeswalker @@ -24428,7 +24428,7 @@ type=Sorcery [card] name=Devastation Tide auto=moveTo(ownerhand) all(*[-land]) -autohand=restriction{miracle} pay[[{1}{U}]] name(Miracle) activate name(Miracle) castcard(normal) +autohand=restriction{miracle} pay[[{1}{U}]] name(Miracle) activate name(Miracle) castcard(restricted) text=Return all nonland permanents to their owners' hands. -- Miracle {1}{U} (You may cast this card for its miracle cost when you draw it if it's the first card you drew this turn.) mana={3}{U}{U} type=Sorcery @@ -24711,7 +24711,7 @@ toughness=1 [card] name=Diluvian Primordial abilities=flying -auto=may target(*[instant;sorcery]|opponentgraveyard) castcard(normal) and!(transforms((,newability[exiledeath])) forever)! +auto=may target(*[instant;sorcery]|opponentgraveyard) castcard(restricted) and!(transforms((,newability[exiledeath])) forever)! text=Flying -- When Diluvian Primordial enters the battlefield, for each opponent, you may cast up to one target instant or sorcery card from that player's graveyard without paying its mana cost. If a card cast this way would be put into a graveyard this turn, exile it instead. mana={5}{U}{U} type=Creature @@ -25416,6 +25416,16 @@ mana={X}{U}{U}{U} type=Sorcery [/card] [card] +name=Distortion Strike +target=creature +auto=1/0 +auto=unblockable +auto=if rebound then transforms((,newability[moveto(exile)],newability[phaseaction[endofturn once checkex] activate may activate castcard(restricted)])) +mana={U} +type=Sorcery +text=Target creature gets +1/+0 until end of turn and is unblockable this turn. Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) +[/card] +[card] name=Distress target=player auto=if type(*[-land]|targetedpersonshand)~lessthan~1 then name(look) donothing notatarget(*|targetedpersonshand) else reject notatarget(*[-land]|targetedpersonshand) @@ -29901,6 +29911,19 @@ power=2 toughness=3 [/card] [card] +name=Emerge Unscathed +target=creature|mybattlefield +auto=choice name(green) transforms((,newability[protection from green])) ueot +auto=choice name(red) transforms((,newability[protection from red])) ueot +auto=choice name(blue) transforms((,newability[protection from blue])) ueot +auto=choice name(black) transforms((,newability[protection from black])) ueot +auto=choice name(white) transforms((,newability[protection from white])) ueot +auto=if rebound then transforms((,newability[moveto(exile)],newability[phaseaction[endofturn once checkex] activate may activate castcard(restricted)])) +mana={W} +type=Instant +text=Target creature you control gains protection from the color of your choice until end of turn. Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) +[/card] +[card] name=Emeria, the Sky Ruin auto=tap auto={T}:add{W} @@ -33113,8 +33136,12 @@ type=Instant [card] name=Feat of Resistance target=creature|mybattlefield +auto=choice name(green) transforms((,newability[protection from green])) ueot +auto=choice name(red) transforms((,newability[protection from red])) ueot +auto=choice name(blue) transforms((,newability[protection from blue])) ueot +auto=choice name(black) transforms((,newability[protection from black])) ueot +auto=choice name(white) transforms((,newability[protection from white])) ueot auto=counter(1/1) -auto=activatechooseacolor protection from(*[chosencolor]) ueot activatechooseend text=Put a +1/+1 counter on target creature you control. It gains protection from the color of your choice until end of turn. mana={1}{W} type=Instant @@ -53638,7 +53665,7 @@ toughness=2 [card] name=Knowledge Exploitation target=opponent -auto=target(*[instant;sorcery]|targetedpersonslibrary) castcard(normal) +auto=target(*[instant;sorcery]|targetedpersonslibrary) castcard(restricted) other={3}{U} name(Prowl) otherrestriction=prowl text=Prowl {3}{U} (You may cast this for its prowl cost if you dealt combat damage to a player this turn with a Rogue.) -- Search target opponent's library for an instant or sorcery card. You may cast that card without paying its mana cost. Then that player shuffles his or her library. @@ -54502,7 +54529,7 @@ toughness=1 name=Krovikan Whispers alias=1194 target=creature -auto=cumulativeupcost[{U}{B}] sacrifice +auto=cumulativeupcostmulti[{U}{B}] sacrifice all(this) auto=@movedTo(this|graveyard) from(battlefield):thisforeach(counter{0/0.1.Age}) life:-2 controller text=Enchant creature -- Cumulative upkeep {U} or {B} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -- You control enchanted creature. -- When Krovikan Whispers is put into a graveyard from the battlefield, you lose 2 life for each age counter on it. mana={3}{U} @@ -58425,7 +58452,7 @@ subtype=Mountain name=Maddening Wind target=creature auto=@each targetcontroller upkeep:damage:2 targetController -auto=cumulativeupcost[{G}] sacrifice +auto=cumulativeupcostmulti[{G}] sacrifice all(this) text=Enchant creature -- Cumulative upkeep {G} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -- At the beginning of the upkeep of enchanted creature's controller, Maddening Wind deals 2 damage to that player. mana={2}{G} type=Enchantment @@ -58444,7 +58471,7 @@ toughness=4 [card] name=Maelstrom Archangel abilities=flying -auto=@combatdamaged(player) from(this):may target(*[-land]|myhand) castcard(normal) +auto=@combatdamaged(player) from(this):may target(*[-land]|myhand) castcard(restricted) text=Flying -- Whenever Maelstrom Archangel deals combat damage to a player, you may cast a nonland card from your hand without paying its mana cost. mana={W}{U}{B}{R}{G} type=Creature @@ -58911,7 +58938,7 @@ toughness=4 [/card] [card] name=Magus of the Jar -auto={T}{S}:name(hand blink) all(*|hand) transforms((,newability[moveto(exile)],newability[phaseaction[endofturn once] reject all(*|hand)],newability[phaseaction[endofturn once] moveTo(ownerhand)])) && draw:7 all(player) +auto={T}{S}:name(hand blink) all(*|hand) transforms((,newability[moveto(exile)],newability[phaseaction[endofturn once checkex] moveto(ownerhand)])) && ability$!draw:7 all(player) _ phaseaction[endofturn once] reject all(*|hand)!$ controller text={T}, Sacrifice Magus of the Jar: Each player exiles all cards from his or her hand face down and draws seven cards. At the beginning of the next end step, each player discards his or her hand and returns to his or her hand each card he or she exiled this way. mana={3}{U}{U} type=Creature @@ -61113,7 +61140,7 @@ type=Enchantment [/card] [card] name=Memory Jar -auto={T}{S}:name(hand blink) all(*|hand) transforms((,newability[moveto(exile)],newability[phaseaction[endofturn once] reject all(*|hand)],newability[phaseaction[endofturn once] moveTo(ownerhand)])) && draw:7 all(player) +auto={T}{S}:name(hand blink) all(*|hand) transforms((,newability[moveto(exile)],newability[phaseaction[endofturn once checkex] moveto(ownerhand)])) && ability$!draw:7 all(player) _ phaseaction[endofturn once] reject all(*|hand)!$ controller text={T}, Sacrifice Memory Jar: Each player exiles all cards from his or her hand face down and draws seven cards. At the beginning of the next end step, each player discards his or her hand and returns to his or her hand each card he or she exiled this way. mana={5} type=Artifact @@ -61129,7 +61156,7 @@ type=Instant [card] name=Memory Plunder target=*[instant;sorcery]|opponentgraveyard -auto=castcard(normal) +auto=castcard(restricted) text=You may cast target instant or sorcery card from an opponent's graveyard without paying its mana cost. mana={UB}{UB}{UB}{UB} type=Instant @@ -62175,7 +62202,7 @@ type=Instant [card] name=Mind Harness target=creature(red;green) -auto=cumulativeupcost[{1}] sacrifice +auto=cumulativeupcostmulti[{1}] sacrifice all(this) text=Enchant red or green creature -- Cumulative upkeep {1} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -- You control enchanted creature. mana={U} type=Enchantment @@ -62334,7 +62361,7 @@ toughness=1 [/card] [card] name=Mindclaw Shaman -auto=choice name(target opponent) target(opponent) donothing && all(this) transforms((,newability[if type(*[instant;sorcery]|targetedpersonshand)~lessthan~1 then name(look) donothing notatarget(*|targetedpersonshand) else may castcard(normal) notatarget(*[instant;sorcery]|targetedpersonshand)])) forever +auto=choice name(target opponent) target(opponent) donothing && all(this) transforms((,newability[if type(*[instant;sorcery]|targetedpersonshand)~lessthan~1 then name(look) donothing notatarget(*|targetedpersonshand) else may castcard(restricted) notatarget(*[instant;sorcery]|targetedpersonshand)])) forever text=When Mindclaw Shaman enters the battlefield, target opponent reveals his or her hand. You may cast an instant or sorcery card from it without paying its mana cost. mana={4}{R} type=Creature @@ -62383,8 +62410,8 @@ toughness=1 [card] name=Mindleech Mass abilities=trample -auto=@combatdamagefoeof(player) from(this):may target(*[-land]|opponenthand) castcard(normal) -auto=@combatdamageof(player) from(this):may target(*[-land]|myhand) castcard(normal) +auto=@combatdamagefoeof(player) from(this):may target(*[-land]|opponenthand) castcard(restricted) +auto=@combatdamageof(player) from(this):may target(*[-land]|myhand) castcard(restricted) text=Trample -- Whenever Mindleech Mass deals combat damage to a player, you may look at that player's hand. If you do, you may cast a nonland card in it without paying that card's mana cost. mana={5}{U}{B}{B} type=Creature @@ -65603,7 +65630,7 @@ type=Instant [card] name=Mystic Might target=land|myBattlefield -auto=cumulativeupcost[{1}{U}] sacrifice +auto=cumulativeupcostmulti[{1}{U}] sacrifice all(this) auto=teach(land) {T}:2/2 target(creature) text=Enchant land you control -- Cumulative upkeep {1}{U} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -- Enchanted land has "{T}: Target creature gets +2/+2 until end of turn." mana={U} @@ -67876,6 +67903,14 @@ power=2 toughness=1 [/card] [card] +name=Nomads' Assembly +auto=token(Kor Soldier,Creature Kor Soldier,1/1,white)*type:creature:mybattlefield +auto=if rebound then transforms((,newability[moveto(exile)],newability[phaseaction[endofturn once checkex] activate may activate castcard(restricted)])) +mana={4}{W}{W} +type=Sorcery +text=Put a 1/1 white Kor Soldier creature token onto the battlefield for each creature you control. Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) +[/card] +[card] name=Nomad Decoy auto={W}{T}:tap target(creature) auto=aslongas(*|mygraveyard) {W}{W}{T}:target(<2>creature) tap >6 @@ -74374,6 +74409,15 @@ power=4 toughness=4 [/card] [card] +name=Prey's Vengeance +target=creature +auto=2/2 +auto=if rebound then transforms((,newability[moveto(exile)],newability[phaseaction[endofturn once checkex] activate may activate castcard(restricted)])) +mana={G} +type=Instant +text=Target creature gets +2/+2 until end of turn. Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) +[/card] +[card] name=Price of Glory auto=lord(land) transforms((,newability[@tappedformana(this) restriction{opponentturnonly}:destroy])) text=Whenever a player taps a land for mana, if it's not that player's turn, destroy that land. @@ -78541,6 +78585,15 @@ mana={3}{W} type=Instant [/card] [card] +name=Recurring Insight +target=opponent +auto=draw:type:*:targetedpersonshand controller +auto=if rebound then transforms((,newability[moveto(exile)],newability[phaseaction[endofturn once checkex] activate may activate castcard(restricted)])) +mana={4}{U}{U} +type=Sorcery +text=Draw cards equal to the number of cards in target opponent's hand. Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) +[/card] +[card] name=Recurring Nightmare auto={S(creature|myBattlefield)}{H}:moveto(mybattlefield) target(creature|mygraveyard) asSorcery text=Sacrifice a creature, Return Recurring Nightmare to its owner's hand: Return target creature card from your graveyard to the battlefield. Activate this ability only any time you could cast a sorcery. @@ -78702,7 +78755,7 @@ name=Reforge the Soul auto=reject all(*|hand) auto=draw:7 opponent auto=draw:7 controller -autohand=restriction{miracle} pay[[{1}{R}]] name(Miracle) activate name(Miracle) castcard(normal) +autohand=restriction{miracle} pay[[{1}{R}]] name(Miracle) activate name(Miracle) castcard(restricted) text=Each player discards his or her hand and draws seven cards. -- Miracle {1}{R} (You may cast this card for its miracle cost when you draw it if it's the first card you drew this turn.) mana={3}{R}{R} type=Sorcery @@ -79802,7 +79855,7 @@ target=creature auto=6/6 auto=trample auto=lure -autohand=restriction{miracle} pay[[{G}]] name(Miracle) activate name(Miracle) castcard(normal) +autohand=restriction{miracle} pay[[{G}]] name(Miracle) activate name(Miracle) castcard(restricted) text=Until end of turn, target creature gets +6/+6 and gains trample, and all creatures able to block it this turn do so. -- Miracle {G} (You may cast this card for its miracle cost when you draw it if it's the first card you drew this turn.) mana={4}{G}{G} type=Sorcery @@ -87501,11 +87554,12 @@ toughness=2 [/card] [card] name=Shelter -auto=choice protection from white target(creature|myBattlefield) ueot -auto=choice protection from blue target(creature|myBattlefield) ueot -auto=choice protection from black target(creature|myBattlefield) ueot -auto=choice protection from red target(creature|myBattlefield) ueot -auto=choice protection from green target(creature|myBattlefield) ueot +target=creature|mybattlefield +auto=choice name(green) transforms((,newability[protection from green])) ueot +auto=choice name(red) transforms((,newability[protection from red])) ueot +auto=choice name(blue) transforms((,newability[protection from blue])) ueot +auto=choice name(black) transforms((,newability[protection from black])) ueot +auto=choice name(white) transforms((,newability[protection from white])) ueot auto=draw:1 controller text=Target creature you control gains protection from the color of your choice until end of turn. -- Draw a card. mana={1}{W} @@ -88995,8 +89049,8 @@ toughness=4 [card] name=Silent-Blade Oni autohand={4}{U}{B}{N}:ninjutsu -auto=@combatdamagefoeof(player) from(this):may target(*[-land]|opponenthand) castcard(normal) -auto=@combatdamageof(player) from(this):may target(*[-land]|myhand) castcard(normal) +auto=@combatdamagefoeof(player) from(this):may target(*[-land]|opponenthand) castcard(restricted) +auto=@combatdamageof(player) from(this):may target(*[-land]|myhand) castcard(restricted) text=Ninjutsu {4}{U}{B} ({4}{U}{B}, Return an unblocked attacker you control to hand: Put this card onto the battlefield from your hand tapped and attacking.) -- Whenever Silent-Blade Oni deals combat damage to a player, look at that player's hand. You may cast a nonland card in it without paying that card's mana cost. mana={3}{U}{U}{B}{B} type=Creature @@ -95173,6 +95227,15 @@ power=0 toughness=0 [/card] [card] +name=Staggershock +target=creature,player +auto=damage:2 +auto=if rebound then transforms((,newability[moveto(exile)],newability[phaseaction[endofturn once checkex] activate may activate castcard(restricted)])) +mana={2}{R} +type=Instant +text=Staggershock deals 2 damage to target creature or player. Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) +[/card] +[card] name=Stalker Hag abilities=swampwalk,forestwalk text=Swampwalk, forestwalk @@ -95558,11 +95621,11 @@ toughness=2 [card] name=Stave Off target=creature -auto=choice name(protection from white) target(creature) protection from white -auto=choice name(protection from blue) target(creature) protection from blue -auto=choice name(protection from black) target(creature) protection from black -auto=choice name(protection from red) target(creature) protection from red -auto=choice name(protection from green) target(creature) protection from green +auto=choice name(green) transforms((,newability[protection from green])) ueot +auto=choice name(red) transforms((,newability[protection from red])) ueot +auto=choice name(blue) transforms((,newability[protection from blue])) ueot +auto=choice name(black) transforms((,newability[protection from black])) ueot +auto=choice name(white) transforms((,newability[protection from white])) ueot text=Target creature gains protection from the color of your choice until end of turn. mana={W} type=Instant @@ -97715,7 +97778,7 @@ toughness=1 name=Sunforger auto={3}:equip auto=4/0 -auto=teach(creature) {unattach}{R}{W}:castcard(normal) notatarget(instant[red;white;manacost<=4]|mylibrary) +auto=teach(creature) {unattach}{R}{W}:castcard(restricted) notatarget(instant[red;white;manacost<=4]|mylibrary) text=Equipped creature gets +4/+0. -- {R}{W}, Unattach Sunforger: Search your library for a red or white instant card with converted mana cost 4 or less and cast that card without paying its mana cost. Then shuffle your library. -- Equip {3} mana={3} type=Artifact @@ -98223,6 +98286,14 @@ power=2 toughness=1 [/card] [card] +name=Surreal Memoir +auto=moverandom(instant) from(mygraveyard) to(myhand) +auto=if rebound then transforms((,newability[moveto(exile)],newability[phaseaction[endofturn once checkex] activate may activate castcard(restricted)])) +mana={3}{R} +type=Sorcery +text=Return an instant card at random from your graveyard to your hand. Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) +[/card] +[card] name=Surveilling Sprite abilities=flying auto=@movedto(this|graveyard) from(battlefield):may draw:1 @@ -98242,6 +98313,15 @@ mana={4}{R} type=Sorcery [/card] [card] +name=Survival Cache +auto=life:2 controller +auto=if compare(lifetotal)~morethan~compare(opponentlifetotal) then draw:1 controller +auto=if rebound then transforms((,newability[moveto(exile)],newability[phaseaction[endofturn once checkex] activate may activate castcard(restricted)])) +mana={2}{W} +type=Sorcery +text=You gain 2 life. Then if you have more life than an opponent, draw a card. Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) +[/card] +[card] name=Survival of the Fittest auto={G}{discard(creature|myhand)}:moveTo(myhand) target(creature|myLibrary) text={G}, Discard a creature card: Search your library for a creature card, reveal that card, and put it into your hand. Then shuffle your library. @@ -100425,7 +100505,7 @@ type=Sorcery name=Temporal Mastery auto=turns:+1 controller auto=exiledeath -autohand=restriction{miracle} pay[[{1}{U}]] name(Miracle) activate name(Miracle) castcard(normal) +autohand=restriction{miracle} pay[[{1}{U}]] name(Miracle) activate name(Miracle) castcard(restricted) text=Take an extra turn after this one. Exile Temporal Mastery. -- Miracle {1}{U} (You may cast this card for its miracle cost when you draw it if it's the first card you drew this turn.) mana={5}{U}{U} type=Sorcery @@ -100678,7 +100758,7 @@ type=Instant [card] name=Terminus auto=all(creature) bottomoflibrary -autohand=restriction{miracle} pay[[{W}]] name(Miracle) activate name(Miracle) castcard(normal) +autohand=restriction{miracle} pay[[{W}]] name(Miracle) activate name(Miracle) castcard(restricted) text=Put all creatures on the bottom of their owners' libraries. -- Miracle {W} (You may cast this card for its miracle cost when you draw it if it's the first card you drew this turn.) mana={4}{W}{W} type=Sorcery @@ -102261,7 +102341,7 @@ type=Sorcery name=Thunderblade Charge target=creature,player auto=damage:3 -autograveyard=@combatdamaged(player) from(creature|mybattlefield):pay({2}{R}{R}{R}) name(pay to cast) activate name(pay to cast) castcard(normal) +autograveyard=@combatdamaged(player) from(creature|mybattlefield):pay({2}{R}{R}{R}) name(pay to cast) activate name(pay to cast) castcard(restricted) text=Thunderblade Charge deals 3 damage to target creature or player. -- Whenever one or more creatures you control deal combat damage to a player, if Thunderblade Charge is in your graveyard, you may pay {2}{R}{R}{R}. If you do, you may cast it without paying its mana cost. mana={1}{R}{R} type=Sorcery @@ -102405,7 +102485,7 @@ subtype=Aura name=Thunderous Wrath target=creature,player auto=damage:5 -autohand=restriction{miracle} pay[[{R}]] name(Miracle) activate name(Miracle) castcard(normal) +autohand=restriction{miracle} pay[[{R}]] name(Miracle) activate name(Miracle) castcard(restricted) text=Thunderous Wrath deals 5 damage to target creature or player. -- Miracle {R} (You may cast this card for its miracle cost when you draw it if it's the first card you drew this turn.) mana={4}{R}{R} type=Instant @@ -103628,7 +103708,7 @@ type=Enchantment [/card] [card] name=Toshiro Umezawa -auto=@movedto(graveyard) from(creature|opponentBattlefield):may target(*[instant]|mygraveyard) castcard(normal) and!(transforms((,newability[exiledeath])) forever)! +auto=@movedto(graveyard) from(creature|opponentBattlefield):may target(*[instant]|mygraveyard) castcard(restricted) and!(transforms((,newability[exiledeath])) forever)! auto=bushido(1/1) text=Bushido 1 (When this blocks or becomes blocked, it gets +1/+1 until end of turn.) -- Whenever a creature an opponent controls is put into a graveyard from the battlefield, you may cast target instant card from your graveyard. If that card would be put into a graveyard this turn, exile it instead. mana={1}{B}{B} @@ -107520,7 +107600,7 @@ subtype=Aura name=Vanishment target=*[-land] auto=moveTo(ownerlibrary) -autohand=restriction{miracle} pay[[{U}]] name(Miracle) activate name(Miracle) castcard(normal) +autohand=restriction{miracle} pay[[{U}]] name(Miracle) activate name(Miracle) castcard(restricted) text=Put target nonland permanent on top of its owner's library. -- Miracle {U} (You may cast this card for its miracle cost when you draw it if it's the first card you drew this turn.) mana={4}{U} type=Instant @@ -109399,6 +109479,16 @@ power=1 toughness=1 [/card] [card] +name=Virulent Swipe +target=creature +auto=2/0 +auto=deathtouch +auto=if rebound then transforms((,newability[moveto(exile)],newability[phaseaction[endofturn once checkex] activate may activate castcard(restricted)])) +mana={B} +type=Instant +text=Target creature gets +2/+0 and gains deathtouch until end of turn. Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) +[/card] +[card] name=Visara the Dreadful abilities=flying auto={T}:bury target(creature) @@ -114872,8 +114962,8 @@ type=Sorcery [card] name=Wrexial, the Risen Deep abilities=islandwalk,swampwalk -auto=@combatdamagefoeof(player) from(this):may target(*[instant;sorcery]|opponentgraveyard) castcard(normal) and!(transforms((,newability[exiledeath])) forever)! -auto=@combatdamageof(player) from(this):may target(*[instant;sorcery]|mygraveyard) castcard(normal) and!(transforms((,newability[exiledeath])) forever)! +auto=@combatdamagefoeof(player) from(this):may target(*[instant;sorcery]|opponentgraveyard) castcard(restricted) and!(transforms((,newability[exiledeath])) forever)! +auto=@combatdamageof(player) from(this):may target(*[instant;sorcery]|mygraveyard) castcard(restricted) and!(transforms((,newability[exiledeath])) forever)! text=Islandwalk, swampwalk -- Whenever Wrexial, the Risen Deep deals combat damage to a player, you may cast target instant or sorcery card from that player's graveyard without paying its mana cost. If that card would be put into a graveyard this turn, exile it instead. mana={3}{U}{U}{B} type=Legendary Creature diff --git a/projects/mtg/bin/Res/sets/primitives/unsupported.txt b/projects/mtg/bin/Res/sets/primitives/unsupported.txt index 4be2a582b..98c44b964 100644 --- a/projects/mtg/bin/Res/sets/primitives/unsupported.txt +++ b/projects/mtg/bin/Res/sets/primitives/unsupported.txt @@ -3912,12 +3912,6 @@ mana={2}{U}{U} type=Sorcery [/card] [card] -name=Distortion Strike -mana={U} -type=Sorcery -text=Target creature gets +1/+0 until end of turn and is unblockable this turn. Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) -[/card] -[card] name=Divert text=Change the target of target spell with a single target unless that spell's controller pays {2}. mana={U} @@ -4444,12 +4438,6 @@ toughness=1 text=Whenever another creature comes into play, you may stand up and say in a deep, booming voice "Presenting . . . " and that creature's name. If you do, put a +1/+1 counter on that creature. [/card] [card] -name=Emerge Unscathed -mana={W} -type=Instant -text=Target creature you control gains protection from the color of your choice until end of turn. Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) -[/card] -[card] name=Empyrial Archangel text=Flying, shroud -- All damage that would be dealt to you is dealt to Empyrial Archangel instead. mana={4}{G}{W}{W}{U} @@ -10865,14 +10853,6 @@ power=1 toughness=1 [/card] [card] -name=Nomads' Assembly -auto=token(Kor Soldier,Creature Kor Soldier,1/1,white)*type:creature:mybattlefield -auto=@movedto(this|stack) from(myhand) restriction{casted(this)}:moveto(exile) and!( transforms((,newability[@each my upkeep once:may activate castcard(restricted)])) )! forever -mana={4}{W}{W} -type=Sorcery -text=Put a 1/1 white Kor Soldier creature token onto the battlefield for each creature you control. Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) -[/card] -[card] name=Norn's Annex #cant choose mana or life mana={3}{p(W)}{p(W)} @@ -12141,12 +12121,6 @@ mana={U} type=Sorcery [/card] [card] -name=Prey's Vengeance -mana={G} -type=Instant -text=Target creature gets +2/+2 until end of turn. Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) -[/card] -[card] name=Primal Beyond text=As Primal Beyond enters the battlefield, you may reveal an Elemental card from your hand. If you don't, Primal Beyond enters the battlefield tapped. -- {T}: Add {1} to your mana pool. -- {T}: Add one mana of any color to your mana pool. Spend this mana only to cast Elemental spells or activate abilities of Elementals. type=Land @@ -12929,12 +12903,6 @@ mana={2}{G} type=Sorcery [/card] [card] -name=Recurring Insight -mana={4}{U}{U} -type=Sorcery -text=Draw cards equal to the number of cards in target opponent's hand. Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) -[/card] -[card] name=Recycle text=Skip your draw step. -- Whenever you play a card, draw a card. -- Your maximum hand size is two. mana={4}{G}{G} @@ -15679,12 +15647,6 @@ mana={3} type=Artifact [/card] [card] -name=Staggershock -mana={2}{R} -type=Instant -text=Staggershock deals 2 damage to target creature or player. Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) -[/card] -[card] name=Stalking Yeti text=When Stalking Yeti enters the battlefield, if it's on the battlefield, it deals damage equal to its power to target creature an opponent controls and that creature deals damage equal to its power to Stalking Yeti. -- {2}{S}i}: Return Stalking Yeti to its owner's hand. Activate this ability only any time you could cast a sorcery. ({S}i} can be paid with one mana from a snow permanent.) mana={2}{R}{R} @@ -16184,18 +16146,6 @@ power=2 toughness=1 [/card] [card] -name=Surreal Memoir -mana={3}{R} -type=Sorcery -text=Return an instant card at random from your graveyard to your hand. Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) -[/card] -[card] -name=Survival Cache -mana={2}{W} -type=Sorcery -text=You gain 2 life. Then if you have more life than an opponent, draw a card. Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) -[/card] -[card] name=Sutured Ghoul text=Trample -- As Sutured Ghoul enters the battlefield, exile any number of creature cards from your graveyard. -- Sutured Ghoul's power is equal to the total power of the exiled cards and its toughness is equal to their total toughness. mana={4}{B}{B}{B} @@ -17808,12 +17758,6 @@ mana={1}{R}{G} type=Instant [/card] [card] -name=Virulent Swipe -mana={B} -type=Instant -text=Target creature gets +2/+0 and gains deathtouch until end of turn. Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) -[/card] -[card] name=Virulent Wound mana={B} type=Instant diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index 4a796159c..7fe81b1c3 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -5244,12 +5244,15 @@ void ABlink::Update(float dt) resolveBlink(); } - if ((blinkueot && currentPhase == MTG_PHASE_ENDOFTURN) || (blinkForSource && !source->isInPlay(game)) && (Blinked->blinked)) + if ((blinkueot && currentPhase == MTG_PHASE_ENDOFTURN) || (blinkForSource && !source->isInPlay(game))) { - if (Blinked == NULL) - MTGAbility::Update(dt); - MTGCardInstance * _target = Blinked; - returnCardIntoPlay(_target); + if(Blinked->blinked) + { + if (Blinked == NULL) + MTGAbility::Update(dt); + MTGCardInstance * _target = Blinked; + returnCardIntoPlay(_target); + } } MTGAbility::Update(dt); } @@ -5724,16 +5727,28 @@ void AACastCard::Update(float dt) this->forceDestroy = 1; return; } - if(!toCheck->hasType(Subtypes::TYPE_INSTANT) && !(game->getCurrentGamePhase() == MTG_PHASE_FIRSTMAIN || game->getCurrentGamePhase() == MTG_PHASE_SECONDMAIN)) + /*if(!toCheck->hasType(Subtypes::TYPE_INSTANT) && !(game->getCurrentGamePhase() == MTG_PHASE_FIRSTMAIN || game->getCurrentGamePhase() == MTG_PHASE_SECONDMAIN)) + { + processed = true; + this->forceDestroy = 1; + return; + }*/ + } + MTGCardInstance * toCheck = (MTGCardInstance*)target; + if(theNamedCard) + toCheck = theNamedCard; + if(toCheck && toCheck->spellTargetType.size()) + { + TargetChooserFactory tcf(game); + TargetChooser * stc = tcf.createTargetChooser(toCheck->spellTargetType,toCheck); + if (!stc->validTargetsExist()||toCheck->isToken) { processed = true; this->forceDestroy = 1; return; } + SAFE_DELETE(stc); } - MTGCardInstance * toCheck = (MTGCardInstance*)target; - if(theNamedCard) - toCheck = theNamedCard; if (Spell * checkSpell = dynamic_cast(target)) { toCheck = checkSpell->source; diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index af7a2b667..c08e6288c 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -310,6 +310,21 @@ int AbilityFactory::parseCastRestrictions(MTGCardInstance * card, Player * playe return 0; } } + check = restriction[i].find("rebound"); + if(check != string::npos) + { + int count = 0; + for(unsigned int k = 0; k < player->game->stack->cardsSeenThisTurn.size(); k++) + { + MTGCardInstance * stackCard = player->game->stack->cardsSeenThisTurn[k]; + if(stackCard->next && stackCard->next == card && card->previousZone == card->controller()->game->hand) + count++; + if(stackCard == card && card->previousZone == card->controller()->game->hand) + count++; + } + if(!count) + return 0; + } check = restriction[i].find("morbid"); if(check != string::npos) { diff --git a/projects/mtg/src/TargetChooser.cpp b/projects/mtg/src/TargetChooser.cpp index 9d58f058d..0b361ef2a 100644 --- a/projects/mtg/src/TargetChooser.cpp +++ b/projects/mtg/src/TargetChooser.cpp @@ -739,6 +739,10 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta { return NEW CardTargetChooser(observer, card->storedSourceCard, card, zones, nbzones); } + else if (typeName.compare("abilitycontroller") == 0) + { + return NEW PlayerTargetChooser(observer, card, 1, card->storedSourceCard->controller()); + } else { tc = NEW TypeTargetChooser(observer, typeName.c_str(), zones, nbzones, card, maxtargets, other, targetMin); From 40db1180dfff7fa6d4947d8c4fd75f5168a8fb4d Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 29 Oct 2015 06:38:59 +0800 Subject: [PATCH 228/249] pay zero todo: all zones --- projects/mtg/include/MTGDefinitions.h | 3 ++- projects/mtg/src/MTGDefinitions.cpp | 3 ++- projects/mtg/src/MTGRules.cpp | 5 ++++- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/projects/mtg/include/MTGDefinitions.h b/projects/mtg/include/MTGDefinitions.h index 6a0d398fe..b321943e7 100644 --- a/projects/mtg/include/MTGDefinitions.h +++ b/projects/mtg/include/MTGDefinitions.h @@ -234,7 +234,8 @@ class Constants PROTECTIONFROMCOLOREDSPELLS = 116, MYGCREATUREEXILER = 117, OPPGCREATUREEXILER = 118, - NB_BASIC_ABILITIES = 119, + PAYZERO = 119, + NB_BASIC_ABILITIES = 120, RARITY_S = 'S', //Special Rarity diff --git a/projects/mtg/src/MTGDefinitions.cpp b/projects/mtg/src/MTGDefinitions.cpp index 0dd76ef59..91bbc8148 100644 --- a/projects/mtg/src/MTGDefinitions.cpp +++ b/projects/mtg/src/MTGDefinitions.cpp @@ -147,7 +147,8 @@ const char* Constants::MTGBasicAbilities[] = { "madness", "protectionfromcoloredspells", "mygcreatureexiler", - "oppgcreatureexiler" + "oppgcreatureexiler", + "payzero" }; map Constants::MTGBasicAbilitiesMap; diff --git a/projects/mtg/src/MTGRules.cpp b/projects/mtg/src/MTGRules.cpp index 458e63789..396b46c70 100644 --- a/projects/mtg/src/MTGRules.cpp +++ b/projects/mtg/src/MTGRules.cpp @@ -1139,6 +1139,8 @@ int MTGPlayFromGraveyardRule::isReactingToClick(MTGCardInstance * card, ManaCost { Player * player = game->currentlyActing(); ManaCost * cost = card->getManaCost(); + if (card->has(Constants::PAYZERO)) + cost = ManaCost::parseManaCost("{0}",NULL,NULL); if (!player->game->graveyard->hasCard(card)) return 0; @@ -1154,7 +1156,8 @@ int MTGPlayFromGraveyardRule::reactToClick(MTGCardInstance * card) return 0; ManaCost * cost = card->getManaCost(); - + if (card->has(Constants::PAYZERO)) + cost = ManaCost::parseManaCost("{0}",NULL,NULL); card->paymenttype = MTGAbility::PUT_INTO_PLAY; return MTGAlternativeCostRule::reactToClick(card, cost, ManaCost::MANA_PAID); From 8793feb9baa5d6779cd496dda027ead634184d9b Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Fri, 30 Oct 2015 07:11:16 +0800 Subject: [PATCH 229/249] Altercost Altercost alter cards to be cast... Removed Trinisphere temporarily... --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 11 +- .../bin/Res/sets/primitives/unsupported.txt | 9 + projects/mtg/include/AllAbilities.h | 7 +- projects/mtg/include/MTGCardInstance.h | 2 + projects/mtg/include/MTGDefinitions.h | 3 +- projects/mtg/src/AllAbilities.cpp | 43 ++- projects/mtg/src/CardDescriptor.cpp | 7 +- projects/mtg/src/GameObserver.cpp | 345 ++++++++++++------ projects/mtg/src/MTGAbility.cpp | 9 +- projects/mtg/src/MTGCardInstance.cpp | 2 + projects/mtg/src/MTGDefinitions.cpp | 3 +- projects/mtg/src/MTGRules.cpp | 5 +- 12 files changed, 297 insertions(+), 149 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 4f595bec7..82dc987c7 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -104963,15 +104963,6 @@ mana={5} type=Artifact [/card] [card] -name=Trinisphere -auto=this(untapped) lord(*[manacost=0]|hand) altercost(colorless, +3) -auto=this(untapped) lord(*[manacost=1]|hand) altercost(colorless, +2) -auto=this(untapped) lord(*[manacost=2]|hand) altercost(colorless, +1) -text=As long as Trinisphere is untapped, each spell that would cost less than three mana to cast costs three mana to cast. (Additional mana in the cost may be paid with any color of mana or colorless mana. For example, a spell that would cost {1}{B} to cast costs {2}{B} to cast instead.) -mana={3} -type=Artifact -[/card] -[card] name=Trinket Mage auto=may moveTo(myhand) target(artifact[manacost<=1]|mylibrary) text=When Trinket Mage enters the battlefield, you may search your library for an artifact card with converted mana cost 1 or less, reveal that card, and put it into your hand. If you do, shuffle your library. @@ -111696,7 +111687,7 @@ toughness=2 [card] name=Warden of Evos Isle abilities=flying -auto=lord(creature[flying]|myhand) altercost(colorless, -1) +auto=lord(creature[flying]|myhand,mylibrary,mygraveyard,myexile) altercost(colorless, -1) text=Flying. -- Creature spells with flying you cast cost 1 less to cast. mana={2}{U} type=Creature diff --git a/projects/mtg/bin/Res/sets/primitives/unsupported.txt b/projects/mtg/bin/Res/sets/primitives/unsupported.txt index 98c44b964..1432ba3ff 100644 --- a/projects/mtg/bin/Res/sets/primitives/unsupported.txt +++ b/projects/mtg/bin/Res/sets/primitives/unsupported.txt @@ -17156,6 +17156,15 @@ mana={U} type=Instant [/card] [card] +name=Trinisphere +auto=this(untapped) lord(*[manacost=0]|hand) altercost(colorless, +3) +auto=this(untapped) lord(*[manacost=1]|hand) altercost(colorless, +2) +auto=this(untapped) lord(*[manacost=2]|hand) altercost(colorless, +1) +text=As long as Trinisphere is untapped, each spell that would cost less than three mana to cast costs three mana to cast. (Additional mana in the cost may be paid with any color of mana or colorless mana. For example, a spell that would cost {1}{B} to cast costs {2}{B} to cast instead.) +mana={3} +type=Artifact +[/card] +[card] name=Trumpeting Armodon text={1}{G}: Target creature blocks Trumpeting Armodon this turn if able. mana={3}{G} diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index 2f6d40e6c..88b6a4d78 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -195,10 +195,11 @@ private: } else if (s == "manacost") { + int convertedvalue = card->currentZone == card->controller()->game->battlefield ? card->getManaCost()->getConvertedCost():card->model->data->getManaCost()->getConvertedCost(); if (target->currentZone == target->controller()->game->stack)//X is 0 except if it's on the stack intValue = target->getManaCost()->getConvertedCost() + target->castX; else - intValue = target->getManaCost()->getConvertedCost(); + intValue = convertedvalue; } else if (s == "azorius")//devotion blue white { @@ -6360,13 +6361,13 @@ class GenericPaidAbility: public ActivatedAbility public: MTGAbility * baseAbility; ManaCost * optionalCost; - + bool asAlternate; string newName; string restrictions; string baseCost; string baseAbilityStr; - GenericPaidAbility(GameObserver* observer, int id, MTGCardInstance * source, Targetable * target,string _newName,string _castRestriction,string _mayCost, string toAdd, ManaCost * cost = NULL); + GenericPaidAbility(GameObserver* observer, int id, MTGCardInstance * source, Targetable * target,string _newName,string _castRestriction,string _mayCost, string toAdd, bool asAlternate = false, ManaCost * cost = NULL); int resolve(); const string getMenuText(); GenericPaidAbility * clone() const; diff --git a/projects/mtg/include/MTGCardInstance.h b/projects/mtg/include/MTGCardInstance.h index 5146b4940..6600e7a1e 100644 --- a/projects/mtg/include/MTGCardInstance.h +++ b/projects/mtg/include/MTGCardInstance.h @@ -253,6 +253,8 @@ public: int cardistargetted; bool isTargetter(); int cardistargetter; + int tmodifier; + int tmodifierb; void eventattacked(); void eventattackedAlone(); diff --git a/projects/mtg/include/MTGDefinitions.h b/projects/mtg/include/MTGDefinitions.h index b321943e7..cc45e19b2 100644 --- a/projects/mtg/include/MTGDefinitions.h +++ b/projects/mtg/include/MTGDefinitions.h @@ -235,7 +235,8 @@ class Constants MYGCREATUREEXILER = 117, OPPGCREATUREEXILER = 118, PAYZERO = 119, - NB_BASIC_ABILITIES = 120, + TRINISPHERE = 120, + NB_BASIC_ABILITIES = 121, RARITY_S = 'S', //Special Rarity diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index 7fe81b1c3..ccf0e714d 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -1146,9 +1146,9 @@ AASetCoin::~AASetCoin() //paying for an ability as an effect but as a cost GenericPaidAbility::GenericPaidAbility(GameObserver* observer, int id, MTGCardInstance * source, - Targetable * target, string _newName, string _castRestriction, string mayCost, string _toAdd, ManaCost * cost) : + Targetable * target, string _newName, string _castRestriction, string mayCost, string _toAdd, bool asAlternate, ManaCost * cost) : ActivatedAbility(observer, id, source, cost, 0), - newName(_newName), restrictions(_castRestriction), baseCost(mayCost), baseAbilityStr(_toAdd) + newName(_newName), restrictions(_castRestriction), baseCost(mayCost), baseAbilityStr(_toAdd), asAlternate(asAlternate) { this->GetId(); baseAbility = NULL; @@ -1172,6 +1172,8 @@ int GenericPaidAbility::resolve() AbilityFactory Af(game); vector baseAbilityStrSplit = split(baseAbilityStr,'?'); vector selection; + MTGAbility * nomenuAbility = NULL; + bool nomenu = false; if (baseAbilityStrSplit.size() > 1) { baseAbility = Af.parseMagicLine(baseAbilityStrSplit[0], this->GetId(), NULL, source); @@ -1200,10 +1202,12 @@ int GenericPaidAbility::resolve() } else { + nomenu = true; baseAbility = Af.parseMagicLine(baseAbilityStrSplit[0], this->GetId(), NULL, source); baseAbility->target = target; optionalCost = ManaCost::parseManaCost(baseCost, NULL, source); MTGAbility * set = baseAbility->clone(); + nomenuAbility = baseAbility->clone(); set->oneShot = true; selection.push_back(set); } @@ -1211,10 +1215,37 @@ int GenericPaidAbility::resolve() if (selection.size()) { bool must = baseAbilityStrSplit.size() > 1 ? true : false; - MenuAbility * a1 = NEW MenuAbility(game, this->GetId(), target, source, must, selection, NULL, newName); - a1->optionalCosts.push_back(NEW ManaCost(optionalCost)); - game->mLayers->actionLayer()->currentActionCard = (MTGCardInstance *)target; - a1->resolve(); + //todo get increased - reduced cost if asAlternate cost to cast using castcard + if(asAlternate) + { + must = true; + //cost increase - reduce + trinisphere effect ability todo... + if(((MTGCardInstance *)target)->getIncreasedManaCost()->getConvertedCost()) + optionalCost->add(((MTGCardInstance *)target)->getIncreasedManaCost()); + if(((MTGCardInstance *)target)->getReducedManaCost()->getConvertedCost()) + optionalCost->remove(((MTGCardInstance *)target)->getReducedManaCost()); + //trinisphere effect must be hardcoded...here.. + /*if(((MTGCardInstance *)target)->has(Constants::TRINISPHERE)) + { + if(optionalCost->getConvertedCost() == 2) + optionalCost->add(Constants::MTG_COLOR_ARTIFACT, 1); + else if(optionalCost->getConvertedCost() == 1) + optionalCost->add(Constants::MTG_COLOR_ARTIFACT, 2); + else if(optionalCost->getConvertedCost() < 1) + optionalCost->add(Constants::MTG_COLOR_ARTIFACT, 3); + }*/ + } + if(nomenu && optionalCost->getConvertedCost() < 1) + { + nomenuAbility->resolve(); + } + else + { + MenuAbility * a1 = NEW MenuAbility(game, this->GetId(), target, source, must, selection, NULL, newName); + a1->optionalCosts.push_back(NEW ManaCost(optionalCost)); + game->mLayers->actionLayer()->currentActionCard = (MTGCardInstance *)target; + a1->resolve(); + } } return 1; } diff --git a/projects/mtg/src/CardDescriptor.cpp b/projects/mtg/src/CardDescriptor.cpp index c6ae1e7a7..a3bc1c773 100644 --- a/projects/mtg/src/CardDescriptor.cpp +++ b/projects/mtg/src/CardDescriptor.cpp @@ -125,11 +125,12 @@ MTGCardInstance * CardDescriptor::match_or(MTGCardInstance * card) } // Quantified restrictions are always AND-ed: + int convertedvalue = card->currentZone == card->controller()->game->battlefield ? card->getManaCost()->getConvertedCost():card->model->data->getManaCost()->getConvertedCost(); if (powerComparisonMode && !valueInRange(powerComparisonMode, card->getPower(), power)) return NULL; if (toughnessComparisonMode && !valueInRange(toughnessComparisonMode, card->getToughness(), toughness)) return NULL; - if (manacostComparisonMode && !valueInRange(manacostComparisonMode, card->getManaCost()->getConvertedCost(), convertedManacost)) + if (manacostComparisonMode && !valueInRange(manacostComparisonMode, convertedvalue, convertedManacost)) return NULL; if (nameComparisonMode && compareName != card->name) return NULL; @@ -165,12 +166,12 @@ MTGCardInstance * CardDescriptor::match_and(MTGCardInstance * card) if ((mColorExclusions & card->colors) != 0) match = NULL; } - + int convertedvalue = card->currentZone == card->controller()->game->battlefield ? card->getManaCost()->getConvertedCost():card->model->data->getManaCost()->getConvertedCost(); if (powerComparisonMode && !valueInRange(powerComparisonMode, card->getPower(), power)) match = NULL; if (toughnessComparisonMode && !valueInRange(toughnessComparisonMode, card->getToughness(), toughness)) match = NULL; - if (manacostComparisonMode && !valueInRange(manacostComparisonMode, card->getManaCost()->getConvertedCost(), convertedManacost)) + if (manacostComparisonMode && !valueInRange(manacostComparisonMode, convertedvalue, convertedManacost)) match = NULL; if(nameComparisonMode && compareName != card->name) match = NULL; diff --git a/projects/mtg/src/GameObserver.cpp b/projects/mtg/src/GameObserver.cpp index 933ec20cf..01a1fc1ab 100644 --- a/projects/mtg/src/GameObserver.cpp +++ b/projects/mtg/src/GameObserver.cpp @@ -604,8 +604,8 @@ void GameObserver::gameStateBasedEffects() { for (int c = zone->nb_cards - 1; c >= 0; c--) { - zone->cards[c]->cardistargetted = 0; - zone->cards[c]->cardistargetter = 0; + zone->cards[c]->cardistargetted = 0; + zone->cards[c]->cardistargetter = 0; } } }//check for losers if its GAMEOVER clear the stack to allow gamestateeffects to continue @@ -878,8 +878,90 @@ void GameObserver::gameStateBasedEffects() enchantmentStatus(); ///////////////////////////// // Check affinity on a card// + // plus modify costs // ///////////////////////////// Affinity(); + //trinisphere? + /*for (int td = 0; td < 2; td++) + { + MTGGameZone * dzones[] = { players[td]->game->graveyard, players[td]->game->hand, players[td]->game->library, players[td]->game->exile }; + for (int tk = 0; tk < 4; tk++) + { + MTGGameZone * zone = dzones[tk]; + for (int ct = zone->nb_cards - 1; ct >= 0; ct--) + { + if(zone->cards[ct]->has(Constants::TRINISPHERE)) + { + if(zone->cards[ct]->getManaCost()->getConvertedCost() == 2) + { + zone->cards[ct]->getManaCost()->add(Constants::MTG_COLOR_ARTIFACT, 1); + zone->cards[ct]->tmodifier = 1; + } + else if(zone->cards[ct]->getManaCost()->getConvertedCost() == 1) + { + zone->cards[ct]->getManaCost()->add(Constants::MTG_COLOR_ARTIFACT, 2); + zone->cards[ct]->tmodifier = 2; + } + else if(zone->cards[ct]->getManaCost()->getConvertedCost() < 1) + { + zone->cards[ct]->getManaCost()->add(Constants::MTG_COLOR_ARTIFACT, 3); + zone->cards[ct]->tmodifier = 3; + } + //alternate + if(zone->cards[ct]->getManaCost()->getAlternative() && zone->cards[ct]->getManaCost()->getAlternative()->getConvertedCost() == 2) + { + zone->cards[ct]->getManaCost()->getAlternative()->add(Constants::MTG_COLOR_ARTIFACT, 1); + zone->cards[ct]->tmodifierb = 1; + } + else if(zone->cards[ct]->getManaCost()->getAlternative() && zone->cards[ct]->getManaCost()->getAlternative()->getConvertedCost() == 1) + { + zone->cards[ct]->getManaCost()->getAlternative()->add(Constants::MTG_COLOR_ARTIFACT, 2); + zone->cards[ct]->tmodifierb = 2; + } + else if(zone->cards[ct]->getManaCost()->getAlternative() && zone->cards[ct]->getManaCost()->getAlternative()->getConvertedCost() < 1) + { + zone->cards[ct]->getManaCost()->getAlternative()->add(Constants::MTG_COLOR_ARTIFACT, 3); + zone->cards[ct]->tmodifierb = 3; + } + } + else + { + if(zone->cards[ct]->tmodifier == 1) + { + zone->cards[ct]->getManaCost()->remove(Constants::MTG_COLOR_ARTIFACT, 1); + zone->cards[ct]->tmodifier = 0; + } + else if(zone->cards[ct]->tmodifier == 2) + { + zone->cards[ct]->getManaCost()->remove(Constants::MTG_COLOR_ARTIFACT, 2); + zone->cards[ct]->tmodifier = 0; + } + else if(zone->cards[ct]->tmodifier == 3) + { + zone->cards[ct]->getManaCost()->remove(Constants::MTG_COLOR_ARTIFACT, 3); + zone->cards[ct]->tmodifier = 0; + } + //alternate + if(zone->cards[ct]->tmodifierb == 1) + { + zone->cards[ct]->getManaCost()->getAlternative()->remove(Constants::MTG_COLOR_ARTIFACT, 1); + zone->cards[ct]->tmodifierb = 0; + } + else if(zone->cards[ct]->tmodifierb == 2) + { + zone->cards[ct]->getManaCost()->getAlternative()->remove(Constants::MTG_COLOR_ARTIFACT, 2); + zone->cards[ct]->tmodifierb = 0; + } + else if(zone->cards[ct]->tmodifierb == 3) + { + zone->cards[ct]->getManaCost()->getAlternative()->remove(Constants::MTG_COLOR_ARTIFACT, 3); + zone->cards[ct]->tmodifierb = 0; + } + } + } + } + }*/ + //end trinisphere ///////////////////////////////////// // Check colored statuses on cards // ///////////////////////////////////// @@ -954,46 +1036,140 @@ void GameObserver::enchantmentStatus() void GameObserver::Affinity() { - for (int i = 0; i < 2; i++) + for (int dd = 0; dd < 2; dd++) { - MTGGameZone * zone = players[i]->game->hand; - for (int k = zone->nb_cards - 1; k >= 0; k--) + MTGGameZone * dzones[] = { players[dd]->game->graveyard, players[dd]->game->hand, players[dd]->game->library, players[dd]->game->exile }; + for (int kk = 0; kk < 4; kk++) { - MTGCardInstance * card = zone->cards[k]; - if (!card) - continue; + MTGGameZone * zone = dzones[kk]; + for (int cc = zone->nb_cards - 1; cc >= 0; cc--) + {//start + MTGCardInstance * card = zone->cards[cc]; + if (!card) + continue; - int color = 0; - string type = ""; - //only do any of the following if a card with the stated ability is in your hand. - ManaCost * original = NEW ManaCost(); - original->copy(card->model->data->getManaCost()); - //have to run alter cost before affinity or the 2 cancel each other out. - if(card->getIncreasedManaCost()->getConvertedCost()||card->getReducedManaCost()->getConvertedCost()) - { - if(card->getIncreasedManaCost()->getConvertedCost()) - original->add(card->getIncreasedManaCost()); - if(card->getReducedManaCost()->getConvertedCost()) - original->remove(card->getReducedManaCost()); - card->getManaCost()->copy(original); - if(card->getManaCost()->extraCosts) + int color = 0; + string type = ""; + //only do any of the following if a card with the stated ability is in your hand. + ManaCost * original = NEW ManaCost(); + ManaCost * alternate = NEW ManaCost(); + original->copy(card->model->data->getManaCost()); + alternate->copy(card->model->data->getManaCost()->getAlternative()); + if (card->has(Constants::PAYZERO)) + original = ManaCost::parseManaCost("{0}",NULL,card);//can't figure out 2 or more alternative... + //have to run alter cost before affinity or the 2 cancel each other out. + if(card->getIncreasedManaCost()->getConvertedCost()||card->getReducedManaCost()->getConvertedCost()) { - for(unsigned int i = 0; i < card->getManaCost()->extraCosts->costs.size();i++) + if(card->getIncreasedManaCost()->getConvertedCost()) { - card->getManaCost()->extraCosts->costs[i]->setSource(card); + original->add(card->getIncreasedManaCost()); + for(int kc = Constants::MTG_COLOR_ARTIFACT; kc < Constants::NB_Colors;kc++) + { + if (card->getManaCost()->getAlternative()) + { + alternate->add(kc,card->getIncreasedManaCost()->getCost(kc)); + } + } + } + if(card->getReducedManaCost()->getConvertedCost()) + { + original->remove(card->getReducedManaCost()); + for(int kc = Constants::MTG_COLOR_ARTIFACT; kc < Constants::NB_Colors;kc++) + { + if (card->getManaCost()->getAlternative()) + { + alternate->remove(kc,card->getReducedManaCost()->getCost(kc)); + } + } + } + card->getManaCost()->copy(original); + card->getManaCost()->setAlternative(alternate); + if(card->getManaCost()->extraCosts) + { + for(unsigned int i = 0; i < card->getManaCost()->extraCosts->costs.size();i++) + { + card->getManaCost()->extraCosts->costs[i]->setSource(card); + } } } - } - int reducem = 0; - bool resetCost = false; - for(unsigned int na = 0; na < card->cardsAbilities.size();na++) - { - ANewAffinity * newAff = dynamic_cast(card->cardsAbilities[na]); - if(newAff) + int reducem = 0; + bool resetCost = false; + for(unsigned int na = 0; na < card->cardsAbilities.size();na++) { - if(!resetCost) + ANewAffinity * newAff = dynamic_cast(card->cardsAbilities[na]); + if(newAff) { - resetCost = true; + if(!resetCost) + { + resetCost = true; + card->getManaCost()->copy(original); + if(card->getManaCost()->extraCosts) + { + for(unsigned int i = 0; i < card->getManaCost()->extraCosts->costs.size();i++) + { + card->getManaCost()->extraCosts->costs[i]->setSource(card); + } + } + } + TargetChooserFactory tf(this); + TargetChooser * tcn = tf.createTargetChooser(newAff->tcString,card,NULL); + + for (int w = 0; w < 2; ++w) + { + Player *p = this->players[w]; + MTGGameZone * zones[] = { p->game->inPlay, p->game->graveyard, p->game->hand, p->game->library, p->game->stack, p->game->exile }; + for (int k = 0; k < 6; k++) + { + MTGGameZone * z = zones[k]; + if (tcn->targetsZone(z)) + { + reducem += z->countByCanTarget(tcn); + } + } + } + SAFE_DELETE(tcn); + ManaCost * removingCost = ManaCost::parseManaCost(newAff->manaString); + for(int j = 0; j < reducem; j++) + card->getManaCost()->remove(removingCost); + SAFE_DELETE(removingCost); + } + } + if(card->has(Constants::AFFINITYARTIFACTS)|| + card->has(Constants::AFFINITYFOREST)|| + card->has(Constants::AFFINITYGREENCREATURES)|| + card->has(Constants::AFFINITYISLAND)|| + card->has(Constants::AFFINITYMOUNTAIN)|| + card->has(Constants::AFFINITYPLAINS)|| + card->has(Constants::AFFINITYSWAMP)){ + if (card->has(Constants::AFFINITYARTIFACTS)) + { + type = "artifact"; + } + else if (card->has(Constants::AFFINITYSWAMP)) + { + type = "swamp"; + } + else if (card->has(Constants::AFFINITYMOUNTAIN)) + { + type = "mountain"; + } + else if (card->has(Constants::AFFINITYPLAINS)) + { + type = "plains"; + } + else if (card->has(Constants::AFFINITYISLAND)) + { + type = "island"; + } + else if (card->has(Constants::AFFINITYFOREST)) + { + type = "forest"; + } + else if (card->has(Constants::AFFINITYGREENCREATURES)) + { + color = 1; + type = "creature"; + } card->getManaCost()->copy(original); if(card->getManaCost()->extraCosts) { @@ -1002,94 +1178,27 @@ void GameObserver::Affinity() card->getManaCost()->extraCosts->costs[i]->setSource(card); } } - } - TargetChooserFactory tf(this); - TargetChooser * tcn = tf.createTargetChooser(newAff->tcString,card,NULL); - - for (int w = 0; w < 2; ++w) - { - Player *p = this->players[w]; - MTGGameZone * zones[] = { p->game->inPlay, p->game->graveyard, p->game->hand, p->game->library, p->game->stack, p->game->exile }; - for (int k = 0; k < 6; k++) + int reduce = 0; + if(card->has(Constants::AFFINITYGREENCREATURES)) { - MTGGameZone * z = zones[k]; - if (tcn->targetsZone(z)) - { - reducem += z->countByCanTarget(tcn); - } + TargetChooserFactory tf(this); + TargetChooser * tc = tf.createTargetChooser("creature[green]",NULL); + reduce = card->controller()->game->battlefield->countByCanTarget(tc); + SAFE_DELETE(tc); } - } - SAFE_DELETE(tcn); - ManaCost * removingCost = ManaCost::parseManaCost(newAff->manaString); - for(int j = 0; j < reducem; j++) - card->getManaCost()->remove(removingCost); - SAFE_DELETE(removingCost); + else + { + reduce = card->controller()->game->battlefield->countByType(type); + } + for(int i = 0; i < reduce;i++) + { + if(card->getManaCost()->getCost(color) > 0) + card->getManaCost()->remove(color,1); + } + } - } - if(card->has(Constants::AFFINITYARTIFACTS)|| - card->has(Constants::AFFINITYFOREST)|| - card->has(Constants::AFFINITYGREENCREATURES)|| - card->has(Constants::AFFINITYISLAND)|| - card->has(Constants::AFFINITYMOUNTAIN)|| - card->has(Constants::AFFINITYPLAINS)|| - card->has(Constants::AFFINITYSWAMP)){ - if (card->has(Constants::AFFINITYARTIFACTS)) - { - type = "artifact"; - } - else if (card->has(Constants::AFFINITYSWAMP)) - { - type = "swamp"; - } - else if (card->has(Constants::AFFINITYMOUNTAIN)) - { - type = "mountain"; - } - else if (card->has(Constants::AFFINITYPLAINS)) - { - type = "plains"; - } - else if (card->has(Constants::AFFINITYISLAND)) - { - type = "island"; - } - else if (card->has(Constants::AFFINITYFOREST)) - { - type = "forest"; - } - else if (card->has(Constants::AFFINITYGREENCREATURES)) - { - color = 1; - type = "creature"; - } - card->getManaCost()->copy(original); - if(card->getManaCost()->extraCosts) - { - for(unsigned int i = 0; i < card->getManaCost()->extraCosts->costs.size();i++) - { - card->getManaCost()->extraCosts->costs[i]->setSource(card); - } - } - int reduce = 0; - if(card->has(Constants::AFFINITYGREENCREATURES)) - { - TargetChooserFactory tf(this); - TargetChooser * tc = tf.createTargetChooser("creature[green]",NULL); - reduce = card->controller()->game->battlefield->countByCanTarget(tc); - SAFE_DELETE(tc); - } - else - { - reduce = card->controller()->game->battlefield->countByType(type); - } - for(int i = 0; i < reduce;i++) - { - if(card->getManaCost()->getCost(color) > 0) - card->getManaCost()->remove(color,1); - } - - } - SAFE_DELETE(original); + SAFE_DELETE(original); + }//end } } } diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index c08e6288c..870927178 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -1079,6 +1079,7 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG MTGGameZone * dest) { size_t found; + bool asAlternate = false; trim(s); //TODO This block redundant with calling function if (!card && spell) @@ -1088,7 +1089,9 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG MTGCardInstance * target = card->target; if (!target) target = card; - + //pay and castcard? + if(s.find("pay(") != string::npos || s.find("pay[[") != string::npos && s.find("castcard(restricted") != string::npos) + asAlternate = true; //MTG Specific rules //adds the bonus credit system found = s.find("bonusrule"); @@ -1586,7 +1589,7 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG vector splitMayPay = parseBetween(s, "pay(", ")", true); if(splitMayPay.size()) { - GenericPaidAbility * a = NEW GenericPaidAbility(observer, id, card, target,newName,castRestriction,splitMayPay[1],storedPayString); + GenericPaidAbility * a = NEW GenericPaidAbility(observer, id, card, target,newName,castRestriction,splitMayPay[1],storedPayString,asAlternate); a->oneShot = 1; a->canBeInterrupted = false; return a; @@ -2091,7 +2094,7 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG vector splitMayPaysub = parseBetween(s, "pay[[","]]", true); if (splitMayPaysub.size()) { - GenericPaidAbility * a = NEW GenericPaidAbility(observer, id, card, target,newName,castRestriction,splitMayPaysub[1],storedPayString); + GenericPaidAbility * a = NEW GenericPaidAbility(observer, id, card, target,newName,castRestriction,splitMayPaysub[1],storedPayString,asAlternate); a->oneShot = 1; a->canBeInterrupted = false; return a; diff --git a/projects/mtg/src/MTGCardInstance.cpp b/projects/mtg/src/MTGCardInstance.cpp index 140c4f5cf..287acfdb7 100644 --- a/projects/mtg/src/MTGCardInstance.cpp +++ b/projects/mtg/src/MTGCardInstance.cpp @@ -65,6 +65,8 @@ MTGCardInstance::MTGCardInstance(MTGCard * card, MTGPlayerCards * arg_belongs_to LKItoughness = toughness; cardistargetted = 0; cardistargetter = 0; + tmodifier = 0; + tmodifierb = 0; } MTGCardInstance * MTGCardInstance::createSnapShot() diff --git a/projects/mtg/src/MTGDefinitions.cpp b/projects/mtg/src/MTGDefinitions.cpp index 91bbc8148..a2530cdb4 100644 --- a/projects/mtg/src/MTGDefinitions.cpp +++ b/projects/mtg/src/MTGDefinitions.cpp @@ -148,7 +148,8 @@ const char* Constants::MTGBasicAbilities[] = { "protectionfromcoloredspells", "mygcreatureexiler", "oppgcreatureexiler", - "payzero" + "payzero", + "trinisphere" }; map Constants::MTGBasicAbilitiesMap; diff --git a/projects/mtg/src/MTGRules.cpp b/projects/mtg/src/MTGRules.cpp index 396b46c70..458e63789 100644 --- a/projects/mtg/src/MTGRules.cpp +++ b/projects/mtg/src/MTGRules.cpp @@ -1139,8 +1139,6 @@ int MTGPlayFromGraveyardRule::isReactingToClick(MTGCardInstance * card, ManaCost { Player * player = game->currentlyActing(); ManaCost * cost = card->getManaCost(); - if (card->has(Constants::PAYZERO)) - cost = ManaCost::parseManaCost("{0}",NULL,NULL); if (!player->game->graveyard->hasCard(card)) return 0; @@ -1156,8 +1154,7 @@ int MTGPlayFromGraveyardRule::reactToClick(MTGCardInstance * card) return 0; ManaCost * cost = card->getManaCost(); - if (card->has(Constants::PAYZERO)) - cost = ManaCost::parseManaCost("{0}",NULL,NULL); + card->paymenttype = MTGAbility::PUT_INTO_PLAY; return MTGAlternativeCostRule::reactToClick(card, cost, ManaCost::MANA_PAID); From c580d89c9412a853ee0576a6f3c2521a6ae0e426 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sat, 31 Oct 2015 10:59:37 +0800 Subject: [PATCH 230/249] Altercost, Exile Zone & Handsize Modifier --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 252 +++++++++++------- .../bin/Res/sets/primitives/unsupported.txt | 54 ---- projects/mtg/include/AllAbilities.h | 19 +- projects/mtg/include/GameObserver.h | 2 + projects/mtg/include/MTGCardInstance.h | 1 + projects/mtg/include/Player.h | 1 + projects/mtg/src/AllAbilities.cpp | 43 +++ projects/mtg/src/CardDescriptor.cpp | 7 +- projects/mtg/src/GameObserver.cpp | 173 ++++++------ projects/mtg/src/MTGAbility.cpp | 9 + projects/mtg/src/MTGCardInstance.cpp | 1 + projects/mtg/src/Player.cpp | 1 + 12 files changed, 324 insertions(+), 239 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 82dc987c7..fc838d55b 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -1908,7 +1908,7 @@ toughness=3 [/card] [card] name=Alabaster Leech -auto=lord(*[white]|myhand) altercost(white, +1) +auto=lord(*[white]|myhand,mylibrary,mygraveyard,myexile) altercost(white, +1) text=White spells you cast cost {W} more to cast. mana={W} type=Creature @@ -2989,7 +2989,7 @@ type=Land [/card] [card] name=Andradite Leech -auto=lord(*[black]|myhand) altercost(black,+1) +auto=lord(*[black]|myhand,mylibrary,mygraveyard,myexile) altercost(black,+1) auto={B}:1/1 text=Black spells you cast cost {B} more to cast. -- {B}: Andradite Leech gets +1/+1 until end of turn. mana={2}{B} @@ -3367,7 +3367,7 @@ subtype=Aura name=Animar, Soul of Elements abilities=protection from white,protection from black auto=@movedTo(creature|mystack):counter(1/1,1) -auto=thisforeach(counter{1/1,1}) lord(creature|myhand) altercost(colorless, -1) +auto=thisforeach(counter{1/1,1}) lord(creature|myhand,mylibrary,mygraveyard,myexile) altercost(colorless, -1) text=Protection from white and from black -- Whenever you cast a creature spell, put a +1/+1 counter on Animar, Soul of Elements. -- Creature spells you cast cost 1 less to cast for each +1/+1 counter on Animar. mana={U}{R}{G} type=Legendary Creature @@ -4030,8 +4030,8 @@ type=Enchantment [/card] [card] name=Arcane Melee -auto=lord(instant|hand) altercost(colorless,-2) -auto=lord(sorcery|hand) altercost(colorless,-2) +auto=lord(instant|hand,library,graveyard,exile) altercost(colorless,-2) +auto=lord(sorcery|hand,library,graveyard,exile) altercost(colorless,-2) text=Instant and sorcery spells cost {2} less to cast. mana={4}{U} type=Enchantment @@ -5809,8 +5809,8 @@ subtype=Aura [/card] [card] name=Aura of Silence -auto=lord(artifact|opponenthand) altercost(colorless, +2) -auto=lord(enchantment|opponenthand) altercost(colorless, +2) +auto=lord(artifact|opponenthand,opponentlibrary,opponentgraveyard,opponentexile) altercost(colorless, +2) +auto=lord(enchantment|opponenthand,opponentlibrary,opponentgraveyard,opponentexile) altercost(colorless, +2) auto={S}:destroy target(artifact,enchantment) text=Artifact and enchantment spells your opponents cast cost {2} more to cast. -- Sacrifice Aura of Silence: Destroy target artifact or enchantment. mana={1}{W}{W} @@ -7153,7 +7153,7 @@ toughness=2 [/card] [card] name=Ballyrush Banneret -auto=lord(*[soldier;kithkin]|myhand) altercost(colorless, -1) +auto=lord(*[soldier;kithkin]|myhand,mylibrary,mygraveyard,myexile) altercost(colorless, -1) text=Kithkin spells and Soldier spells you cast cost {1} less to cast. mana={1}{W} type=Creature @@ -11869,7 +11869,7 @@ toughness=7 [/card] [card] name=Bosk Banneret -auto=lord(*[treefolk;shaman]|myhand) altercost(colorless, -1) +auto=lord(*[treefolk;shaman]|myhand,mylibrary,mygraveyard,myexile) altercost(colorless, -1) text=Treefolk spells and Shaman spells you cast cost {1} less to cast. mana={1}{G} type=Creature @@ -12583,7 +12583,7 @@ type=Enchantment [/card] [card] name=Brighthearth Banneret -auto=lord(*[elemental;warrior]|myhand) altercost(colorless, -1) +auto=lord(*[elemental;warrior]|myhand,mylibrary,mygraveyard,myexile) altercost(colorless, -1) autohand={1}{R}{discard}:counter(1/1,1) target(creature) text=Elemental spells and Warrior spells you cast cost {1} less to cast. -- Reinforce 1 - {1}{R} ({1}{R}, Discard this card: Put a +1/+1 counter on target creature.) mana={1}{R} @@ -15323,7 +15323,7 @@ toughness=3 [/card] [card] name=Centaur Omenreader -auto=this(tapped) lord(*|myhand) altercost(colorless, -2) ueot +auto=this(tapped) lord(*|myhand,mylibrary,mygraveyard,myexile) altercost(colorless, -2) ueot auto=@untapped(this):all(*|myhand) moveto(myhand) text=As long as Centaur Omenreader is tapped, creature spells you cast cost {2} less to cast. mana={3}{G} @@ -16360,8 +16360,8 @@ toughness=1 [/card] [card] name=Chill -auto=lord(*[red]|myhand) altercost(colorless, +2) -auto=lord(*[red]|opponenthand) altercost(colorless, +2) +auto=lord(*[red]|myhand,mylibrary,mygraveyard,myexile) altercost(colorless, +2) +auto=lord(*[red]|opponenthand,opponentlibrary,opponentgraveyard,opponentexile) altercost(colorless, +2) text=Red spells cost {2} more to cast. mana={1}{U} type=Enchantment @@ -17636,11 +17636,11 @@ auto=choice name(Creature) counter(0/0,1,CloudKeyC) all(this) auto=choice name(Enchantment) counter(0/0,1,CloudKeyE) all(this) auto=choice name(Instant) counter(0/0,1,CloudKeyI) all(this) auto=choice name(Sorcery) counter(0/0,1,CloudKeyS) all(this) -auto=this(counter{0/0.1.CloudKeyA}) lord(Artifact|myhand) altercost(colorless,-1) -auto=this(counter{0/0.1.CloudKeyC}) lord(Creature|myhand) altercost(colorless,-1) -auto=this(counter{0/0.1.CloudKeyE}) lord(Enchantment|myhand) altercost(colorless,-1) -auto=this(counter{0/0.1.CloudKeyI}) lord(Instant|myhand) altercost(colorless,-1) -auto=this(counter{0/0.1.CloudKeyS}) lord(Sorcery|myhand) altercost(colorless,-1) +auto=this(counter{0/0.1.CloudKeyA}) lord(Artifact|myhand,mylibrary,mygraveyard,myexile) altercost(colorless,-1) +auto=this(counter{0/0.1.CloudKeyC}) lord(Creature|myhand,mylibrary,mygraveyard,myexile) altercost(colorless,-1) +auto=this(counter{0/0.1.CloudKeyE}) lord(Enchantment|myhand,mylibrary,mygraveyard,myexile) altercost(colorless,-1) +auto=this(counter{0/0.1.CloudKeyI}) lord(Instant|myhand,mylibrary,mygraveyard,myexile) altercost(colorless,-1) +auto=this(counter{0/0.1.CloudKeyS}) lord(Sorcery|myhand,mylibrary,mygraveyard,myexile) altercost(colorless,-1) text=As Cloud Key enters the battlefield, choose artifact, creature, enchantment, instant, or sorcery. -- Spells you cast of the chosen type cost {1} less to cast. mana={3} type=Artifact @@ -22109,7 +22109,7 @@ toughness=1 [/card] [card] name=Daru Warchief -auto=lord(soldier|myhand) altercost(colorless, -1) +auto=lord(soldier|myhand,mylibrary,mygraveyard,myexile) altercost(colorless, -1) auto=lord(soldier|myBattlefield) 1/2 text=Soldier spells you cast cost {1} less to cast. -- Soldier creatures you control get +1/+2. mana={2}{W}{W} @@ -24106,7 +24106,7 @@ toughness=1 [/card] [card] name=Derelor -auto=lord(*[black]|myhand) altercost(black, +1) +auto=lord(*[black]|myhand,mylibrary,mygraveyard,myexile) altercost(black, +1) text=Black spells you cast cost {B} more to cast. mana={3}{B} type=Creature @@ -26364,7 +26364,7 @@ toughness=5 [/card] [card] name=Dragonlord's Servant -auto=lord(dragon|myhand) altercost(colorless, -1) +auto=lord(dragon|myhand,mylibrary,mygraveyard,myexile) altercost(colorless, -1) text=Dragon spells you cast cost {1} less to cast. mana={1}{R} type=Creature @@ -26431,7 +26431,7 @@ toughness=2 [/card] [card] name=Dragonspeaker Shaman -auto=lord(dragon|myhand) altercost(colorless,-2) +auto=lord(dragon|myhand,mylibrary,mygraveyard,myexile) altercost(colorless,-2) text=Dragon spells you cast cost {2} less to cast. mana={1}{R}{R} type=Creature @@ -28662,8 +28662,8 @@ type=Instant [/card] [card] name=Edgewalker -auto=lord(cleric|myhand) altercost(white,-1) -auto=lord(cleric|myhand) altercost(black, -1) +auto=lord(cleric|myhand,mylibrary,mygraveyard,myexile) altercost(white,-1) +auto=lord(cleric|myhand,mylibrary,mygraveyard,myexile) altercost(black, -1) text=Cleric spells you cast cost {W}{B} less to cast. This effect reduces only the amount of colored mana you pay. (For example, if you cast a Cleric spell with mana cost {1}{W}, it costs {1} to cast.) mana={1}{W}{B} type=Creature @@ -29895,7 +29895,7 @@ toughness=1 [/card] [card] name=Emerald Medallion -auto=lord(*[green]|myhand) altercost(colorless,-1) +auto=lord(*[green]|myhand,mylibrary,mygraveyard,myexile) altercost(colorless,-1) text=Green spells you cast cost {1} less to cast. mana={2} type=Artifact @@ -31394,7 +31394,7 @@ type=Artifact [/card] [card] name=Etherium Sculptor -auto=lord(artifact|myhand) altercost(colorless,-1) +auto=lord(artifact|myhand,mylibrary,mygraveyard,myexile) altercost(colorless,-1) text=Artifact spells you cast cost {1} less to cast. mana={1}{U} type=Artifact Creature @@ -32043,7 +32043,7 @@ mana={3}{W} [/card] [card] name=Eye of Ugin -auto=lord(eldrazi[iscolorless]|myhand) altercost(colorless,-2) +auto=lord(eldrazi[iscolorless]|myhand,mylibrary,mygraveyard,myexile) altercost(colorless,-2) auto={7}{T}:moveTo(myhand) target(creature[iscolorless]|myLibrary) text=Colorless Eldrazi spells you cast cost {2} less to cast. -- {7}, {T}: Search your library for a colorless creature card, reveal it, and put it into your hand. Then shuffle your library. type=Legendary Land @@ -33457,7 +33457,7 @@ subtype=Aura [/card] [card] name=Feroz's Ban -auto=lord(creature|hand) altercost(colorless,+2) +auto=lord(creature|hand,library,graveyard,exile) altercost(colorless,+2) text=Creature spells cost {2} more to cast. mana={6} type=Artifact @@ -36592,7 +36592,7 @@ toughness=2 [card] name=Frogtosser Banneret abilities=haste -auto=lord(*[goblin;rogue]|myhand) altercost(colorless, -1) +auto=lord(*[goblin;rogue]|myhand,mylibrary,mygraveyard,myexile) altercost(colorless, -1) text=Haste -- Goblin spells and Rogue spells you cast cost {1} less to cast. mana={1}{B} type=Creature @@ -39588,8 +39588,8 @@ toughness=3 [/card] [card] name=Glowrider -auto=lord(*[-creature]|myhand) altercost(colorless,+1) -auto=lord(*[-creature]|opponenthand) altercost(colorless, +1) +auto=lord(*[-creature]|myhand,mylibrary,mygraveyard,myexile) altercost(colorless,+1) +auto=lord(*[-creature]|opponenthand,opponentlibrary,opponentgraveyard,opponentexile) altercost(colorless, +1) text=Noncreature spells cost {1} more to cast. mana={2}{W} type=Creature @@ -39665,6 +39665,16 @@ power=3 toughness=1 [/card] [card] +name=Gnat Miser +auto=hmodifer:-1 opponent +text=Each opponent's maximum hand size is reduced by one. +mana={B} +type=Creature +subtype=Rat Shaman +power=1 +toughness=1 +[/card] +[card] name=Gnathosaur auto={S(artifact|mybattlefield)}:trample text=Sacrifice an artifact: Gnathosaur gains trample until end of turn. @@ -40023,7 +40033,7 @@ toughness=4 [/card] [card] name=Goblin Electromancer -auto=lord(*[instant;sorcery]|myhand) altercost(colorless,-1) +auto=lord(*[instant;sorcery]|myhand,mylibrary,mygraveyard,myexile) altercost(colorless,-1) text=Instant and sorcery spells you cast cost {1} less to cast. mana={U}{R} type=Creature @@ -40694,7 +40704,7 @@ toughness=3 [/card] [card] name=Goblin Warchief -auto=lord(goblin|myhand) altercost(colorless,-1) +auto=lord(goblin|myhand,mylibrary,mygraveyard,myexile) altercost(colorless,-1) auto=lord(goblin|myBattlefield) haste text=Goblin spells you cast cost {1} less to cast. -- Goblin creatures you control have haste. mana={1}{R}{R} @@ -41381,9 +41391,9 @@ toughness=2 [/card] [card] name=Grand Arbiter Augustin IV -auto=lord(*[white]|myhand) altercost(colorless,-1) -auto=lord(*[blue]|myhand) altercost(colorless,-1) -auto=lord(*|opponenthand) altercost( colorless,+1) +auto=lord(*[white]|myhand,mylibrary,mygraveyard,myexile) altercost(colorless,-1) +auto=lord(*[blue]|myhand,mylibrary,mygraveyard,myexile) altercost(colorless,-1) +auto=lord(*|opponenthand,opponentlibrary,opponentgraveyard,opponentexile) altercost( colorless,+1) text=White spells you cast cost {1} less to cast. -- Blue spells you cast cost {1} less to cast. -- Spells your opponents cast cost {1} more to cast. mana={2}{W}{U} type=Legendary Creature @@ -44707,7 +44717,7 @@ toughness=3 [card] name=Heartless Summoning auto=lord(creature|myBattlefield) -1/-1 -auto=lord(creature|myhand) altercost( colorless,-2) +auto=lord(creature|myhand,mylibrary,mygraveyard,myexile) altercost( colorless,-2) text=Creature spells you cast cost {2} less to cast. -- Creatures you control get -1/-1 mana={1}{B} type=Enchantment @@ -45272,7 +45282,7 @@ toughness=1 [/card] [card] name=Helm of Awakening -auto=lord(*|hand) altercost(colorless,-1) +auto=lord(*|hand,library,graveyard,exile) altercost(colorless,-1) text=Spells cost {1} less to cast. mana={2} type=Artifact @@ -45385,7 +45395,7 @@ toughness=4 name=Herald of War abilities=flying auto=@combat(attacking) source(this):counter(1/1,1) -auto=thisforeach(counter{1/1,1}) lord(*[angel;human]|myhand) altercost(colorless, -1) +auto=thisforeach(counter{1/1,1}) lord(*[angel;human]|myhand,mylibrary,mygraveyard,myexile) altercost(colorless, -1) text=Flying -- Whenever Herald of War attacks, put a +1/+1 counter on it. -- Angel spells and Human spells you cast cost {1} less to cast for each +1/+1 counter on Herald of War. mana={3}{W}{W} type=Creature @@ -45423,7 +45433,7 @@ toughness=2 [/card] [card] name=Herald of the Pantheon -auto=lord(enchantment|myhand) altercost(colorless, -1) +auto=lord(enchantment|myhand,mylibrary,mygraveyard,myexile) altercost(colorless, -1) auto=@movedto(enchantment|mystack):choice life:1 controller text=Enchantment spells you cast cost {1} less to cast. -- Whenever you cast an enchantment spell, you gain 1 life. mana={1}{G} @@ -45478,7 +45488,7 @@ toughness=4 [/card] [card] name=Hero of Iroas -auto=lord(aura|myhand) altercost(colorless,-1) +auto=lord(aura|myhand,mylibrary,mygraveyard,myexile) altercost(colorless,-1) auto=@targeted(this) from(*[instant;sorcery;enchantment]|myhand,mygraveyard):counter(1/1,1) text=Aura spells you cast cost 1 less to cast. -- Heroic -- Whenever you cast a spell that targets Hero of Iroas, put a +1/+1 counter on Hero of Iroas. mana={1}{W} @@ -45744,7 +45754,7 @@ toughness=1 [/card] [card] name=High Seas -auto=lord(creature[red;green]|hand) altercost(colorless,+1) +auto=lord(creature[red;green]|hand,library,graveyard,exile) altercost(colorless,+1) text=Red creature spells and green creature spells cost {1} more to cast. mana={2}{U} type=Enchantment @@ -49462,7 +49472,7 @@ toughness=2 [/card] [card] name=Irini Sengir -auto=lord(enchantment[white;green]|hand) altercost(colorless,+1) +auto=lord(enchantment[white;green]|hand,library,graveyard,exile) altercost(colorless,+1) text=White enchantment spells and green enchantment spells cost {2} more to cast. mana={2}{B}{B} type=Legendary Creature @@ -50063,7 +50073,7 @@ toughness=8 [/card] [card] name=Jade Leech -auto=lord(*[green]|myhand) altercost(green,+1) +auto=lord(*[green]|myhand,mylibrary,mygraveyard,myexile) altercost(green,+1) text=Green spells you cast cost {G} more to cast. mana={2}{G}{G} type=Creature @@ -50418,7 +50428,7 @@ type=Artifact [/card] [card] name=Jet Medallion -auto=lord(*[black]|myhand) altercost(colorless,-1) +auto=lord(*[black]|myhand,mylibrary,mygraveyard,myexile) altercost(colorless,-1) text=Black spells you cast cost {1} less to cast. mana={2} type=Artifact @@ -50552,7 +50562,7 @@ type=Instant name=Jin-Gitaxias, Core Augur abilities=flash auto=@each my end:draw:7 -auto=@each opponent cleanup:name(check handsize) ability$!choice name(reduce handsize) reject notatarget(<7>*|myhand)!$ opponent +auto=hmodifer:-7 opponent mana={8}{U}{U} type=Legendary Creature subtype=Praetor @@ -54377,7 +54387,7 @@ toughness=2 [/card] [card] name=Krosan Drover -auto=lord(creature[manacost>=6]|myhand) altercost(colorless,-2) +auto=lord(creature[manacost>=6]|myhand,mylibrary,mygraveyard,myexile) altercost(colorless,-2) text=Creature spells you cast with converted mana cost 6 or more cost {2} less to cast. mana={3}{G} type=Creature @@ -54437,7 +54447,7 @@ toughness=5 [card] name=Krosan Warchief auto={1}{G}:regenerate target(beast) -auto=lord(beast|myhand) altercost(colorless,-1) +auto=lord(beast|myhand,mylibrary,mygraveyard,myexile) altercost(colorless,-1) text=Beast spells you cast cost {1} less to cast. -- {1}{G}: Regenerate target Beast. mana={2}{G} type=Creature @@ -57324,7 +57334,7 @@ toughness=2 [/card] [card] name=Locust Miser -auto=@each opponent cleanup:name(check handsize) ability$!choice name(reduce handsize) reject notatarget(<2>*|myhand)!$ opponent +auto=hmodifer:-2 opponent text=Each opponent's maximum hand size is reduced by two. mana={2}{B}{B} type=Creature @@ -57354,7 +57364,7 @@ type=Artifact [/card] [card] name=Lodestone Golem -auto=lord(*[-artifact]|hand) altercost(colorless,+1) +auto=lord(*[-artifact]|hand,library,graveyard,exile) altercost(colorless,+1) text=Nonartifact spells cost {1} more to cast. mana={4} type=Artifact Creature @@ -57413,7 +57423,7 @@ toughness=2 [/card] [card] name=Long-Forgotten Gohei -auto=lord(arcane|myhand) altercost(colorless,-1) +auto=lord(arcane|myhand,mylibrary,mygraveyard,myexile) altercost(colorless,-1) auto=lord(spirit|myBattlefield) 1/1 text=Arcane spells you cast cost {1} less to cast. -- Spirit creatures you control get +1/+1. mana={3} @@ -59285,8 +59295,8 @@ type=Instant [/card] [card] name=Mana Matrix -auto=lord(instant|myhand) altercost(colorless,-2) -auto=lord(enchantment|myhand) altercost(colorless,-2) +auto=lord(instant|myhand,mylibrary,mygraveyard,myexile) altercost(colorless,-2) +auto=lord(enchantment|myhand,mylibrary,mygraveyard,myexile) altercost(colorless,-2) text=Instant and enchantment spells you cast cost up to {2} less to cast. mana={6} type=Artifact @@ -62150,6 +62160,17 @@ mana={2}{G} type=Sorcery [/card] [card] +name=Minamo Scrollkeeper +abilities=defender +auto=hmodifer:1 controller +text=Defender (This creature can't attack.) -- Your maximum hand size is increased by one. +mana={1}{U} +type=Creature +subtype=Human Wizard +power=2 +toughness=3 +[/card] +[card] name=Minamo Sightbender auto={X}{T}:target(creature[power <=X]) unblockable text={X}, {T}: Target creature with power X or less is unblockable this turn. @@ -63277,7 +63298,7 @@ toughness=4 [/card] [card] name=Mistform Warchief -auto=lord(creature[share!types!]|myhand) altercost(colorless,-1) chooseend +auto=lord(creature[share!types!]|myhand,mylibrary,mygraveyard,myexile) altercost(colorless,-1) chooseend auto={T}:activatechooseatype all(this) becomes(removecreaturesubtypes) && becomes(chosentype) ueot activatechooseend text=Creature spells you cast that share a creature type with Mistform Warchief cost {1} less to cast. -- {T}: Mistform Warchief becomes the creature type of your choice until end of turn. mana={2}{U} @@ -67326,7 +67347,7 @@ toughness=1 [/card] [card] name=Nightscape Familiar -auto=lord(*[blue;red]|myhand) altercost(colorless,-1) +auto=lord(*[blue;red]|myhand,mylibrary,mygraveyard,myexile) altercost(colorless,-1) auto={1}{B}:regenerate text=Blue spells and red spells you cast cost {1} less to cast. -- {1}{B}: Regenerate Nightscape Familiar. mana={1}{B} @@ -71453,7 +71474,7 @@ toughness=7 [/card] [card] name=Pearl Medallion -auto=lord(*[white]|myhand) altercost(colorless,-1) +auto=lord(*[white]|myhand,mylibrary,mygraveyard,myexile) altercost(colorless,-1) text=White spells you cast cost {1} less to cast. mana={2} type=Artifact @@ -73586,7 +73607,7 @@ type=Sorcery [/card] [card] name=Planar Gate -auto=lord(creature|myhand) altercost(colorless,-2) +auto=lord(creature|myhand,mylibrary,mygraveyard,myexile) altercost(colorless,-2) text=Creature spells you cast cost up to {2} less to cast. mana={6} type=Artifact @@ -76774,8 +76795,8 @@ toughness=3 [/card] [card] name=Ragemonger -auto=lord(minotaur|myhand) altercost(black,-1) -auto=lord(minotaur|myhand) altercost(red,-1) +auto=lord(minotaur|myhand,mylibrary,mygraveyard,myexile) altercost(black,-1) +auto=lord(minotaur|myhand,mylibrary,mygraveyard,myexile) altercost(red,-1) text=Minotaur spells you cast cost BlackRed less to cast. This effect reduces only the amount of colored mana you pay. (For example, if you cast a Minotaur spell with mana cost 2Red, it costs 2 to cast.) mana={1}{B}{R} type=Creature @@ -81893,7 +81914,7 @@ toughness=* [card] name=Ruby Leech abilities=first strike -auto=lord(*[red]|myhand) altercost(red,+1) +auto=lord(*[red]|myhand,mylibrary,mygraveyard,myexile) altercost(red,+1) text=First strike -- Red spells you cast cost {R} more to cast. mana={1}{R} type=Creature @@ -81903,7 +81924,7 @@ toughness=2 [/card] [card] name=Ruby Medallion -auto=lord(*[red]|myhand) altercost(colorless,-1) +auto=lord(*[red]|myhand,mylibrary,mygraveyard,myexile) altercost(colorless,-1) text=Red spells you cast cost {1} less to cast. mana={2} type=Artifact @@ -83470,7 +83491,7 @@ toughness=4 [card] name=Sapphire Leech abilities=flying -auto=lord(*[blue]|myhand) altercost(blue,+1) +auto=lord(*[blue]|myhand,mylibrary,mygraveyard,myexile) altercost(blue,+1) text=Flying -- Blue spells you cast cost {U} more to cast. mana={1}{U} type=Creature @@ -83480,7 +83501,7 @@ toughness=2 [/card] [card] name=Sapphire Medallion -auto=lord(*[blue]|myhand) altercost(colorless,-1) +auto=lord(*[blue]|myhand,mylibrary,mygraveyard,myexile) altercost(colorless,-1) text=Blue spells you cast cost {1} less to cast. mana={2} type=Artifact @@ -86257,20 +86278,20 @@ auto=choice name(Sorcery) moveTo(myexile) notatarget(sorcery|myhand) && counter( auto=choice name(Tribal Instant) moveTo(myexile) notatarget(instant[tribal]|myhand) && counter(0/0,1,TribalInstant) all(this) auto=choice name(Tribal Sorcery) moveTo(myexile) notatarget(sorcery[tribal]|myhand) && counter(0/0,1,TribalSorcery) all(this) auto=choice name(cancel) donothing -auto=this(counter{0/0.1.Artifact}) lord(artifact|myhand) altercost(colorless,-2) -auto=this(counter{0/0.1.ArtifactCreature}) lord(artifact[-creature]|myhand) altercost(colorless,-2) -auto=this(counter{0/0.1.ArtifactCreature}) lord(creature[-artifact]|myhand) altercost(colorless,-2) -auto=this(counter{0/0.1.ArtifactCreature}) lord(creature[artifact]|myhand) altercost(colorless,-2 ) -auto=this(counter{0/0.1.Creature}) lord(creature|myhand) altercost(colorless,-2) -auto=this(counter{0/0.1.Enchantment}) lord(enchantment|myhand) altercost(colorless,-2) -auto=this(counter{0/0.1.Instant}) lord(instant|myhand) altercost(colorless,-2) -auto=this(counter{0/0.1.Sorcery}) lord(sorcery|myhand) altercost( colorless, -2 ) -auto=this(counter{0/0.1.TribalInstant}) lord(tribal[-instant]|myhand) altercost(colorless,-2) -auto=this(counter{0/0.1.TribalInstant}) lord(instant[-tribal]|myhand) altercost(colorless,-2) -auto=this(counter{0/0.1.TribalInstant}) lord(instant[tribal]|myhand) altercost(colorless,-2 ) -auto=this(counter{0/0.1.TribalSorcery}) lord(tribal[-sorcery]|myhand) altercost(colorless,-2) -auto=this(counter{0/0.1.TribalSorcery}) lord(sorcery[-tribal]|myhand) altercost(colorless,-2) -auto=this(counter{0/0.1.TribalSorcery}) lord(sorcery[tribal]|myhand) altercost(colorless,-2) +auto=this(counter{0/0.1.Artifact}) lord(artifact|myhand,mylibrary,mygraveyard,myexile) altercost(colorless,-2) +auto=this(counter{0/0.1.ArtifactCreature}) lord(artifact[-creature]|myhand,mylibrary,mygraveyard,myexile) altercost(colorless,-2) +auto=this(counter{0/0.1.ArtifactCreature}) lord(creature[-artifact]|myhand,mylibrary,mygraveyard,myexile) altercost(colorless,-2) +auto=this(counter{0/0.1.ArtifactCreature}) lord(creature[artifact]|myhand,mylibrary,mygraveyard,myexile) altercost(colorless,-2 ) +auto=this(counter{0/0.1.Creature}) lord(creature|myhand,mylibrary,mygraveyard,myexile) altercost(colorless,-2) +auto=this(counter{0/0.1.Enchantment}) lord(enchantment|myhand,mylibrary,mygraveyard,myexile) altercost(colorless,-2) +auto=this(counter{0/0.1.Instant}) lord(instant|myhand,mylibrary,mygraveyard,myexile) altercost(colorless,-2) +auto=this(counter{0/0.1.Sorcery}) lord(sorcery|myhand,mylibrary,mygraveyard,myexile) altercost( colorless, -2 ) +auto=this(counter{0/0.1.TribalInstant}) lord(tribal[-instant]|myhand,mylibrary,mygraveyard,myexile) altercost(colorless,-2) +auto=this(counter{0/0.1.TribalInstant}) lord(instant[-tribal]|myhand,mylibrary,mygraveyard,myexile) altercost(colorless,-2) +auto=this(counter{0/0.1.TribalInstant}) lord(instant[tribal]|myhand,mylibrary,mygraveyard,myexile) altercost(colorless,-2 ) +auto=this(counter{0/0.1.TribalSorcery}) lord(tribal[-sorcery]|myhand,mylibrary,mygraveyard,myexile) altercost(colorless,-2) +auto=this(counter{0/0.1.TribalSorcery}) lord(sorcery[-tribal]|myhand,mylibrary,mygraveyard,myexile) altercost(colorless,-2) +auto=this(counter{0/0.1.TribalSorcery}) lord(sorcery[tribal]|myhand,mylibrary,mygraveyard,myexile) altercost(colorless,-2) text=Imprint - When Semblance Anvil enters the battlefield, you may exile a nonland card from your hand. -- Spells you cast that share a card type with the exiled card cost {2} less to cast. mana={3} type=Artifact @@ -93716,7 +93737,7 @@ toughness=3 [/card] [card] name=Sphere of Resistance -auto=lord(*|hand) altercost(colorless,+1) +auto=lord(*|hand,library,graveyard,exile) altercost(colorless,+1) text=Spells cost {1} more to cast. mana={2} type=Artifact @@ -95069,7 +95090,7 @@ type=Artifact [card] name=Squeeze text=Sorcery spells cost {3} more to cast. -auto=lord(sorcery|hand) altercost(colorless,+3) +auto=lord(sorcery|hand,library,graveyard,exile) altercost(colorless,+3) mana={3}{U} type=Enchantment [/card] @@ -96065,7 +96086,7 @@ toughness=1 [/card] [card] name=Stinkdrinker Daredevil -auto=lord(giant|myhand) altercost(colorless,-2) +auto=lord(giant|myhand,mylibrary,mygraveyard,myexile) altercost(colorless,-2) text=Giant spells you cast cost {2} less to cast. mana={2}{R} type=Creature @@ -96206,7 +96227,7 @@ subtype=Mountain Forest [/card] [card] name=Stone Calendar -auto=lord(*|myhand) altercost(colorless,-1) +auto=lord(*|myhand,mylibrary,mygraveyard,myexile) altercost(colorless,-1) text=Spells you cast cost up to {1} less to cast. mana={5} type=Artifact @@ -96477,7 +96498,7 @@ toughness=2 [card] name=Stonybrook Banneret abilities=islandwalk -auto=lord(*[merfolk;wizard]|myhand) altercost(colorless, -1) +auto=lord(*[merfolk;wizard]|myhand,mylibrary,mygraveyard,myexile) altercost(colorless, -1) text=Islandwalk -- Merfolk spells and Wizard spells you cast cost {1} less to cast. mana={1}{U} type=Creature @@ -96664,7 +96685,7 @@ toughness=1 [card] name=Stormscape Familiar abilities=flying -auto=lord(*[white;black]|myhand) altercost(colorless,-1) +auto=lord(*[white;black]|myhand,mylibrary,mygraveyard,myexile) altercost(colorless,-1) text=Flying -- White spells and black spells you cast cost {1} less to cast. mana={1}{U} type=Creature @@ -97918,7 +97939,7 @@ toughness=1 [card] name=Sunscape Familiar abilities=defender -auto=lord(*[green;blue]|myhand) altercost(colorless,-1) +auto=lord(*[green;blue]|myhand,mylibrary,mygraveyard,myexile) altercost(colorless,-1) text=Defender (This creature can't attack.) -- Green spells and blue spells you cast cost {1} less to cast. mana={1}{W} type=Creature @@ -101111,8 +101132,8 @@ toughness=2 [card] name=Thalia, Guardian of Thraben abilities=first strike -auto=lord(*[-creature]|myhand) altercost(colorless,+1) -auto=lord(*[-creature]|opponenthand) altercost(colorless, +1) +auto=lord(*[-creature]|myhand,mylibrary,mygraveyard,myexile) altercost(colorless,+1) +auto=lord(*[-creature]|opponenthand,opponentlibrary,opponentgraveyard,opponentexile) altercost(colorless, +1) text=First Strike -- Noncreature spells cost {1} more to cast. mana={1}{W} type=Legendary Creature @@ -101583,7 +101604,7 @@ toughness=7 [/card] [card] name=Thorn of Amethyst -auto=lord(*[-creature]|hand) altercost(colorless,+1) +auto=lord(*[-creature]|hand,library,graveyard,exile) altercost(colorless,+1) text=Noncreature spells cost {1} more to cast. mana={2} type=Artifact @@ -101657,7 +101678,7 @@ toughness=1 [/card] [card] name=Thornscape Familiar -auto=lord(*[red;white]|myhand) altercost(colorless,-1) +auto=lord(*[red;white]|myhand,mylibrary,mygraveyard,myexile) altercost(colorless,-1) text=Red spells and white spells you cast cost {1} less to cast. mana={1}{G} type=Creature @@ -101753,6 +101774,28 @@ power=1 toughness=1 [/card] [card] +name=Thought Devourer +abilities=flying +auto=hmodifer:-4 controller +text=Flying -- Your maximum hand size is reduced by four. +mana={2}{U}{U} +type=Creature +subtype=Beast +power=4 +toughness=4 +[/card] +[card] +name=Thought Eater +abilities=flying +auto=hmodifer:-3 controller +text=Flying -- Your maximum hand size is reduced by three. +mana={1}{U} +type=Creature +subtype=Beast +power=2 +toughness=2 +[/card] +[card] name=Thought Gorger abilities=trample auto=foreach(*|myhand) counter(1/1,1) && reject all(*|myhand) @@ -101773,6 +101816,17 @@ mana={2}{U}{U} type=Enchantment [/card] [card] +name=Thought Nibbler +abilities=flying +auto=hmodifer:-2 controller +text=Flying -- Your maximum hand size is reduced by two. +mana={U} +type=Creature +subtype=Beast +power=1 +toughness=1 +[/card] +[card] name=Thought Reflection auto=replacedraw draw:2 noreplace text=If you would draw a card, draw two cards instead. @@ -102504,7 +102558,7 @@ toughness=1 [card] name=Thunderscape Familiar abilities=first strike -auto=lord(*[black;green]|myhand) altercost(colorless,-1) +auto=lord(*[black;green]|myhand,mylibrary,mygraveyard,myexile) altercost(colorless,-1) text=First strike -- Black spells and green spells you cast cost {1} less to cast. mana={1}{R} type=Creature @@ -105301,6 +105355,17 @@ mana={2}{R} type=Instant [/card] [card] +name=Trusted Advisor +auto=hmodifer:2 controller +auto=@each my upkeep:moveTo(ownerhand) notatarget(creature[blue]|myBattlefield) +text=Your maximum hand size is increased by two. -- At the beginning of your upkeep, return a blue creature you control to its owner's hand. +mana={U} +type=Creature +subtype=Human Advisor +power=1 +toughness=2 +[/card] +[card] name=Trusted Forcemage auto=soulbond 1/1 abilities=soulbond @@ -106196,7 +106261,7 @@ toughness=2 [card] name=Undead Warchief auto=lord(zombie|myBattlefield) 2/1 -auto=lord(zombie|myhand) altercost( colorless,-1) +auto=lord(zombie|myhand,mylibrary,mygraveyard,myexile) altercost( colorless,-1) text=Zombie spells you cast cost {1} less to cast. -- Zombie creatures you control get +2/+1. mana={2}{B}{B} type=Creature @@ -107088,7 +107153,7 @@ subtype=Urza's [/card] [card] name=Urza's Filter -auto=lord(*[multicolor]|hand) altercost(colorless,-2) +auto=lord(*[multicolor]|hand,library,graveyard,exile) altercost(colorless,-2) text=Multicolored spells cost up to {2} less to cast. mana={4} type=Artifact @@ -107102,7 +107167,7 @@ type=Sorcery [/card] [card] name=Urza's Incubator -auto=chooseatype lord(creature[chosentype]|myhand) altercost(colorless,-2) chooseend +auto=chooseatype lord(creature[chosentype]|myhand,mylibrary,mygraveyard,myexile) altercost(colorless,-2) chooseend text=As Urza's Incubator enters the battlefield, choose a creature type. -- Creature spells of the chosen type cost {2} less to cast. mana={3} type=Artifact @@ -110468,8 +110533,7 @@ color=black [card] name=Vryn Wingmare abilities=flying -auto=lord(*[-creature]|myhand) altercost(colorless,+1) -auto=lord(*[-creature]|opponenthand) altercost(colorless, +1) +auto=lord(*[-creature]|hand,library,graveyard,exile) altercost(colorless, +1) text=Flying -- Noncreature spells cost {1} more to cast. mana={2}{W} type=Creature diff --git a/projects/mtg/bin/Res/sets/primitives/unsupported.txt b/projects/mtg/bin/Res/sets/primitives/unsupported.txt index 1432ba3ff..77ec526d5 100644 --- a/projects/mtg/bin/Res/sets/primitives/unsupported.txt +++ b/projects/mtg/bin/Res/sets/primitives/unsupported.txt @@ -6120,15 +6120,6 @@ mana={G} type=Instant [/card] [card] -name=Gnat Miser -text=Each opponent's maximum hand size is reduced by one. -mana={B} -type=Creature -subtype=Rat Shaman -power=1 -toughness=1 -[/card] -[card] name=Goblin Artisans text={T}: Flip a coin. If you win the flip, draw a card. If you lose the flip, counter target artifact spell you control that isn't the target of an ability from another creature named Goblin Artisans. mana={R} @@ -9837,15 +9828,6 @@ type=Artifact text=Imprint — Whenever a nontoken creature dies, you may exile that card. If you do, return each other card exiled with Mimic Vat to its owner's graveyard. {3}, {T}: Put a token onto the battlefield that's a copy of the exiled card. It gains haste. Exile it at the beginning of the next end step. [/card] [card] -name=Minamo Scrollkeeper -text=Defender (This creature can't attack.) -- Your maximum hand size is increased by one. -mana={1}{U} -type=Creature -subtype=Human Wizard -power=2 -toughness=3 -[/card] -[card] name=Minamo's Meddling text=Counter target spell. That spell's controller reveals his or her hand, then discards each card with the same name as a card spliced onto that spell. mana={2}{U}{U} @@ -16641,45 +16623,18 @@ power=2 toughness=2 [/card] [card] -name=Thought Devourer -text=Flying -- Your maximum hand size is reduced by four. -mana={2}{U}{U} -type=Creature -subtype=Beast -power=4 -toughness=4 -[/card] -[card] name=Thought Dissector text={X}, {T}: Target opponent reveals cards from the top of his or her library until an artifact card or X cards are revealed, whichever comes first. If an artifact card is revealed this way, put it onto the battlefield under your control and sacrifice Thought Dissector. Put the rest of the revealed cards into that player's graveyard. mana={4} type=Artifact [/card] [card] -name=Thought Eater -text=Flying -- Your maximum hand size is reduced by three. -mana={1}{U} -type=Creature -subtype=Beast -power=2 -toughness=2 -[/card] -[card] name=Thought Hemorrhage text=Name a nonland card. Target player reveals his or her hand. Thought Hemorrhage deals 3 damage to that player for each card with that name revealed this way. Search that player's graveyard, hand, and library for all cards with that name and exile them. Then that player shuffles his or her library. mana={2}{B}{R} type=Sorcery [/card] [card] -name=Thought Nibbler -text=Flying -- Your maximum hand size is reduced by two. -mana={U} -type=Creature -subtype=Beast -power=1 -toughness=1 -[/card] -[card] name=Thought Prison text=Imprint - When Thought Prison enters the battlefield, you may have target player reveal his or her hand. If you do, choose a nonland card from it and exile that card. -- Whenever a player casts a spell that shares a color or converted mana cost with the exiled card, Thought Prison deals 2 damage to that player. mana={5} @@ -17174,15 +17129,6 @@ power=3 toughness=3 [/card] [card] -name=Trusted Advisor -text=Your maximum hand size is increased by two. -- At the beginning of your upkeep, return a blue creature you control to its owner's hand. -mana={U} -type=Creature -subtype=Human Advisor -power=1 -toughness=2 -[/card] -[card] name=Truth or Tale text=Reveal the top five cards of your library and separate them into two piles. An opponent chooses one of those piles. Put a card from the chosen pile into your hand, then put all other cards revealed this way on the bottom of your library in any order. mana={1}{U} diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index 88b6a4d78..dbf7edf41 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -195,11 +195,10 @@ private: } else if (s == "manacost") { - int convertedvalue = card->currentZone == card->controller()->game->battlefield ? card->getManaCost()->getConvertedCost():card->model->data->getManaCost()->getConvertedCost(); if (target->currentZone == target->controller()->game->stack)//X is 0 except if it's on the stack - intValue = target->getManaCost()->getConvertedCost() + target->castX; + intValue = target->myconvertedcost + target->castX; else - intValue = convertedvalue; + intValue = target->myconvertedcost; } else if (s == "azorius")//devotion blue white { @@ -4087,6 +4086,20 @@ public: } }; +//Modify Hand +class AModifyHand: public AbilityTP +{ +public: + string hand; + AModifyHand(GameObserver* observer, int _id, MTGCardInstance * _source, Targetable * _target, string hand, int who = TargetChooser::UNSET); + int addToGame(); + int destroy(); + const string getMenuText(); + AModifyHand * clone() const; + //~AModifyHand(); + +}; + //set a players hand size class AASetHand: public ActivatedAbilityTP { diff --git a/projects/mtg/include/GameObserver.h b/projects/mtg/include/GameObserver.h index 25fcf745b..3771a3c27 100644 --- a/projects/mtg/include/GameObserver.h +++ b/projects/mtg/include/GameObserver.h @@ -122,6 +122,8 @@ class GameObserver{ void gameStateBasedEffects(); void enchantmentStatus(); void Affinity(); + void ComputeTrinisphere(); + void RemoveTrinisphere(MTGCardInstance * card); void addObserver(MTGAbility * observer); bool removeObserver(ActionElement * observer); void startGame(GameType, Rules * rules); diff --git a/projects/mtg/include/MTGCardInstance.h b/projects/mtg/include/MTGCardInstance.h index 6600e7a1e..56c887459 100644 --- a/projects/mtg/include/MTGCardInstance.h +++ b/projects/mtg/include/MTGCardInstance.h @@ -255,6 +255,7 @@ public: int cardistargetter; int tmodifier; int tmodifierb; + int myconvertedcost; void eventattacked(); void eventattackedAlone(); diff --git a/projects/mtg/include/Player.h b/projects/mtg/include/Player.h index eac30a20e..2d356e24f 100644 --- a/projects/mtg/include/Player.h +++ b/projects/mtg/include/Player.h @@ -45,6 +45,7 @@ public: int epic; int initLife; int raidcount; + int handmodifier; vector prowledTypes; vectorcurses; Player(GameObserver *observer, string deckFile, string deckFileSmall, MTGDeck * deck = NULL); diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index ccf0e714d..81f7d33d8 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -2501,6 +2501,49 @@ AALifer * AALifer::clone() const return NEW AALifer(*this); } +//players modify hand size +AModifyHand::AModifyHand(GameObserver* observer, int _id, MTGCardInstance * _source, Targetable * _target, string hand, int who) : + AbilityTP(observer, _id, _source, _target, who), hand(hand) +{ +} + +int AModifyHand::addToGame() +{ + Damageable * _target = (Damageable *) getTarget(); + Player * p = getPlayerFromDamageable(_target); + + if (!p) + return 0; + + WParsedInt handmodifier(hand, NULL, source); + p->handmodifier += handmodifier.getValue(); + + return MTGAbility::addToGame(); +} + +int AModifyHand::destroy() +{ + Damageable * _target = (Damageable *) getTarget(); + Player * p = getPlayerFromDamageable(_target); + + if (!p) + return 0; + + WParsedInt handmodifier(hand, NULL, source); + p->handmodifier -= handmodifier.getValue(); + + return 1; +} + +const string AModifyHand::getMenuText() +{ + return "Modify Hand Size"; +} + +AModifyHand * AModifyHand::clone() const +{ + return NEW AModifyHand(*this); +} //players max hand size AASetHand::AASetHand(GameObserver* observer, int _id, MTGCardInstance * _source, Targetable * _target, int hand, ManaCost * _cost, diff --git a/projects/mtg/src/CardDescriptor.cpp b/projects/mtg/src/CardDescriptor.cpp index a3bc1c773..64951c818 100644 --- a/projects/mtg/src/CardDescriptor.cpp +++ b/projects/mtg/src/CardDescriptor.cpp @@ -125,12 +125,11 @@ MTGCardInstance * CardDescriptor::match_or(MTGCardInstance * card) } // Quantified restrictions are always AND-ed: - int convertedvalue = card->currentZone == card->controller()->game->battlefield ? card->getManaCost()->getConvertedCost():card->model->data->getManaCost()->getConvertedCost(); if (powerComparisonMode && !valueInRange(powerComparisonMode, card->getPower(), power)) return NULL; if (toughnessComparisonMode && !valueInRange(toughnessComparisonMode, card->getToughness(), toughness)) return NULL; - if (manacostComparisonMode && !valueInRange(manacostComparisonMode, convertedvalue, convertedManacost)) + if (manacostComparisonMode && !valueInRange(manacostComparisonMode, card->myconvertedcost, convertedManacost)) return NULL; if (nameComparisonMode && compareName != card->name) return NULL; @@ -166,12 +165,12 @@ MTGCardInstance * CardDescriptor::match_and(MTGCardInstance * card) if ((mColorExclusions & card->colors) != 0) match = NULL; } - int convertedvalue = card->currentZone == card->controller()->game->battlefield ? card->getManaCost()->getConvertedCost():card->model->data->getManaCost()->getConvertedCost(); + if (powerComparisonMode && !valueInRange(powerComparisonMode, card->getPower(), power)) match = NULL; if (toughnessComparisonMode && !valueInRange(toughnessComparisonMode, card->getToughness(), toughness)) match = NULL; - if (manacostComparisonMode && !valueInRange(manacostComparisonMode, convertedvalue, convertedManacost)) + if (manacostComparisonMode && !valueInRange(manacostComparisonMode, card->myconvertedcost, convertedManacost)) match = NULL; if(nameComparisonMode && compareName != card->name) match = NULL; diff --git a/projects/mtg/src/GameObserver.cpp b/projects/mtg/src/GameObserver.cpp index 01a1fc1ab..a84429bd1 100644 --- a/projects/mtg/src/GameObserver.cpp +++ b/projects/mtg/src/GameObserver.cpp @@ -225,8 +225,12 @@ void GameObserver::nextGamePhase() if (mCurrentGamePhase == MTG_PHASE_AFTER_EOT) { + int handmodified = 0; + handmodified = currentPlayer->handsize+currentPlayer->handmodifier; //Auto Hand cleaning, in case the player didn't do it himself - while (currentPlayer->game->hand->nb_cards > currentPlayer->handsize && currentPlayer->nomaxhandsize == false) + if(handmodified < 0) + handmodified = 0; + while (currentPlayer->game->hand->nb_cards > handmodified && currentPlayer->nomaxhandsize == false) { WEvent * e = NEW WEventCardDiscard(currentPlayer->game->hand->cards[0]); receiveEvent(e); @@ -881,86 +885,8 @@ void GameObserver::gameStateBasedEffects() // plus modify costs // ///////////////////////////// Affinity(); - //trinisphere? - /*for (int td = 0; td < 2; td++) - { - MTGGameZone * dzones[] = { players[td]->game->graveyard, players[td]->game->hand, players[td]->game->library, players[td]->game->exile }; - for (int tk = 0; tk < 4; tk++) - { - MTGGameZone * zone = dzones[tk]; - for (int ct = zone->nb_cards - 1; ct >= 0; ct--) - { - if(zone->cards[ct]->has(Constants::TRINISPHERE)) - { - if(zone->cards[ct]->getManaCost()->getConvertedCost() == 2) - { - zone->cards[ct]->getManaCost()->add(Constants::MTG_COLOR_ARTIFACT, 1); - zone->cards[ct]->tmodifier = 1; - } - else if(zone->cards[ct]->getManaCost()->getConvertedCost() == 1) - { - zone->cards[ct]->getManaCost()->add(Constants::MTG_COLOR_ARTIFACT, 2); - zone->cards[ct]->tmodifier = 2; - } - else if(zone->cards[ct]->getManaCost()->getConvertedCost() < 1) - { - zone->cards[ct]->getManaCost()->add(Constants::MTG_COLOR_ARTIFACT, 3); - zone->cards[ct]->tmodifier = 3; - } - //alternate - if(zone->cards[ct]->getManaCost()->getAlternative() && zone->cards[ct]->getManaCost()->getAlternative()->getConvertedCost() == 2) - { - zone->cards[ct]->getManaCost()->getAlternative()->add(Constants::MTG_COLOR_ARTIFACT, 1); - zone->cards[ct]->tmodifierb = 1; - } - else if(zone->cards[ct]->getManaCost()->getAlternative() && zone->cards[ct]->getManaCost()->getAlternative()->getConvertedCost() == 1) - { - zone->cards[ct]->getManaCost()->getAlternative()->add(Constants::MTG_COLOR_ARTIFACT, 2); - zone->cards[ct]->tmodifierb = 2; - } - else if(zone->cards[ct]->getManaCost()->getAlternative() && zone->cards[ct]->getManaCost()->getAlternative()->getConvertedCost() < 1) - { - zone->cards[ct]->getManaCost()->getAlternative()->add(Constants::MTG_COLOR_ARTIFACT, 3); - zone->cards[ct]->tmodifierb = 3; - } - } - else - { - if(zone->cards[ct]->tmodifier == 1) - { - zone->cards[ct]->getManaCost()->remove(Constants::MTG_COLOR_ARTIFACT, 1); - zone->cards[ct]->tmodifier = 0; - } - else if(zone->cards[ct]->tmodifier == 2) - { - zone->cards[ct]->getManaCost()->remove(Constants::MTG_COLOR_ARTIFACT, 2); - zone->cards[ct]->tmodifier = 0; - } - else if(zone->cards[ct]->tmodifier == 3) - { - zone->cards[ct]->getManaCost()->remove(Constants::MTG_COLOR_ARTIFACT, 3); - zone->cards[ct]->tmodifier = 0; - } - //alternate - if(zone->cards[ct]->tmodifierb == 1) - { - zone->cards[ct]->getManaCost()->getAlternative()->remove(Constants::MTG_COLOR_ARTIFACT, 1); - zone->cards[ct]->tmodifierb = 0; - } - else if(zone->cards[ct]->tmodifierb == 2) - { - zone->cards[ct]->getManaCost()->getAlternative()->remove(Constants::MTG_COLOR_ARTIFACT, 2); - zone->cards[ct]->tmodifierb = 0; - } - else if(zone->cards[ct]->tmodifierb == 3) - { - zone->cards[ct]->getManaCost()->getAlternative()->remove(Constants::MTG_COLOR_ARTIFACT, 3); - zone->cards[ct]->tmodifierb = 0; - } - } - } - } - }*/ + //trinisphere? buggy... + //ComputeTrinisphere(); //end trinisphere ///////////////////////////////////// // Check colored statuses on cards // @@ -1082,8 +1008,10 @@ void GameObserver::Affinity() } } } - card->getManaCost()->copy(original); - card->getManaCost()->setAlternative(alternate); + if(card->getManaCost()) + card->getManaCost()->copy(original); + if(card->getManaCost()->getAlternative()) + card->getManaCost()->setAlternative(alternate); if(card->getManaCost()->extraCosts) { for(unsigned int i = 0; i < card->getManaCost()->extraCosts->costs.size();i++) @@ -1202,6 +1130,79 @@ void GameObserver::Affinity() } } } + +void GameObserver::ComputeTrinisphere() +{ + for (int td = 0; td < 2; td++) + { + MTGGameZone * dzones[] = { players[td]->game->graveyard, players[td]->game->hand, players[td]->game->library, players[td]->game->exile }; + for (int tk = 0; tk < 4; tk++) + { + MTGGameZone * zone = dzones[tk]; + for (int ct = zone->nb_cards - 1; ct >= 0; ct--) + { + if(zone->cards[ct]->has(Constants::TRINISPHERE)) + { + if(zone->cards[ct]->getManaCost()->getConvertedCost() == 2) + { + zone->cards[ct]->getManaCost()->add(Constants::MTG_COLOR_ARTIFACT, 1); + zone->cards[ct]->tmodifier = 1; + } + else if(zone->cards[ct]->getManaCost()->getConvertedCost() == 1) + { + zone->cards[ct]->getManaCost()->add(Constants::MTG_COLOR_ARTIFACT, 2); + zone->cards[ct]->tmodifier = 2; + } + else if(zone->cards[ct]->getManaCost()->getConvertedCost() < 1) + { + zone->cards[ct]->getManaCost()->add(Constants::MTG_COLOR_ARTIFACT, 3); + zone->cards[ct]->tmodifier = 3; + } + if(zone->cards[ct]->getManaCost()->getAlternative()) + { + ManaCost * currentAlternate = NEW ManaCost(); + currentAlternate->copy(zone->cards[ct]->getManaCost()->getAlternative()); + if(zone->cards[ct]->getManaCost()->getAlternative()->getConvertedCost() == 2) + zone->cards[ct]->tmodifierb = 1; + else if(zone->cards[ct]->getManaCost()->getAlternative()->getConvertedCost() == 1) + zone->cards[ct]->tmodifierb = 2; + else if(zone->cards[ct]->getManaCost()->getAlternative()->getConvertedCost() < 1) + zone->cards[ct]->tmodifierb = 3; + currentAlternate->add(Constants::MTG_COLOR_ARTIFACT, zone->cards[ct]->tmodifierb); + zone->cards[ct]->getManaCost()->setAlternative(currentAlternate); + } + } + else + RemoveTrinisphere(zone->cards[ct]); + if(zone->cards[ct]->getManaCost()->extraCosts) + { + for(unsigned int i = 0; i < zone->cards[ct]->getManaCost()->extraCosts->costs.size();i++) + { + zone->cards[ct]->getManaCost()->extraCosts->costs[i]->setSource(zone->cards[ct]); + } + } + } + } + } +} +void GameObserver::RemoveTrinisphere(MTGCardInstance * card) +{ + if(card->has(Constants::TRINISPHERE)) + return; + if(card->tmodifier) + { + card->getManaCost()->remove(Constants::MTG_COLOR_ARTIFACT, card->tmodifier); + card->tmodifier = 0; + } + if(card->getManaCost()->getAlternative() && card->tmodifierb) + { + ManaCost * newalternate = NEW ManaCost(); + newalternate->copy(card->getManaCost()->getAlternative()); + newalternate->remove(Constants::MTG_COLOR_ARTIFACT, card->tmodifierb); + card->getManaCost()->setAlternative(newalternate); + card->tmodifierb = 0; + } +} void GameObserver::Render() { if(mLayers) @@ -1367,6 +1368,7 @@ int GameObserver::cardClick(MTGCardInstance * card, Targetable * object, bool lo { Player * clickedPlayer = NULL; int toReturn = 0; + int handmodified = 0; MTGGameZone* zone = NULL; size_t index = 0; MTGCardInstance* backup = NULL; @@ -1484,8 +1486,11 @@ int GameObserver::cardClick(MTGCardInstance * card, Targetable * object, bool lo } //Current player's hand + handmodified = currentPlayer->handsize+currentPlayer->handmodifier; + if(handmodified < 0) + handmodified = 0; if (currentPlayer->game->hand->hasCard(card) && mCurrentGamePhase == MTG_PHASE_CLEANUP - && currentPlayer->game->hand->nb_cards > currentPlayer->handsize && currentPlayer->nomaxhandsize == false) + && currentPlayer->game->hand->nb_cards > handmodified && currentPlayer->nomaxhandsize == false) { WEvent * e = NEW WEventCardDiscard(currentPlayer->game->hand->cards[0]); receiveEvent(e); diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index 870927178..475d8e68f 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -2583,6 +2583,15 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG return a; } + //modify hand size - reduce maximum or increase + vector splitHandMod = parseBetween(s, "hmodifer:", " ", false); + if (splitHandMod.size()) + { + Damageable * t = spell ? spell->getNextDamageableTarget() : NULL; + MTGAbility * a = NEW AModifyHand(observer, id, card, t, splitHandMod[1], who); + return a; + } + //set hand size vector splitSetHand = parseBetween(s, "sethand:", " ", false); if (splitSetHand.size()) diff --git a/projects/mtg/src/MTGCardInstance.cpp b/projects/mtg/src/MTGCardInstance.cpp index 287acfdb7..02d5086fa 100644 --- a/projects/mtg/src/MTGCardInstance.cpp +++ b/projects/mtg/src/MTGCardInstance.cpp @@ -67,6 +67,7 @@ MTGCardInstance::MTGCardInstance(MTGCard * card, MTGPlayerCards * arg_belongs_to cardistargetter = 0; tmodifier = 0; tmodifierb = 0; + myconvertedcost = getManaCost()->getConvertedCost(); } MTGCardInstance * MTGCardInstance::createSnapShot() diff --git a/projects/mtg/src/Player.cpp b/projects/mtg/src/Player.cpp index cd1a2c77a..fe5c07931 100644 --- a/projects/mtg/src/Player.cpp +++ b/projects/mtg/src/Player.cpp @@ -35,6 +35,7 @@ Player::Player(GameObserver *observer, string file, string fileSmall, MTGDeck * drawCounter = 0; epic = 0; raidcount = 0; + handmodifier = 0; prowledTypes.clear(); doesntEmpty = NEW ManaCost(); poolDoesntEmpty = NEW ManaCost(); From ba7355a831b7b2c1436f54e52bc143d4df6d565d Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sat, 31 Oct 2015 11:38:35 +0800 Subject: [PATCH 231/249] moved rebound cards to borderline until castcard supports increased cost due to altercost... --- .../bin/Res/sets/primitives/borderline.txt | 85 +++++++++++++++++++ projects/mtg/bin/Res/sets/primitives/mtg.txt | 85 ------------------- 2 files changed, 85 insertions(+), 85 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/borderline.txt b/projects/mtg/bin/Res/sets/primitives/borderline.txt index a9f5903f0..aca91e968 100644 --- a/projects/mtg/bin/Res/sets/primitives/borderline.txt +++ b/projects/mtg/bin/Res/sets/primitives/borderline.txt @@ -99,6 +99,29 @@ mana={4}{B}{B} type=Instant [/card] [card] +name=Distortion Strike +target=creature +auto=1/0 +auto=unblockable +auto=if rebound then transforms((,newability[moveto(exile)],newability[phaseaction[endofturn once checkex] activate may activate castcard(restricted)])) +mana={U} +type=Sorcery +text=Target creature gets +1/+0 until end of turn and is unblockable this turn. Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) +[/card] +[card] +name=Emerge Unscathed +target=creature|mybattlefield +auto=choice name(green) transforms((,newability[protection from green])) ueot +auto=choice name(red) transforms((,newability[protection from red])) ueot +auto=choice name(blue) transforms((,newability[protection from blue])) ueot +auto=choice name(black) transforms((,newability[protection from black])) ueot +auto=choice name(white) transforms((,newability[protection from white])) ueot +auto=if rebound then transforms((,newability[moveto(exile)],newability[phaseaction[endofturn once checkex] activate may activate castcard(restricted)])) +mana={W} +type=Instant +text=Target creature you control gains protection from the color of your choice until end of turn. Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) +[/card] +[card] name=Feral Hydra type=Creature subtype=Hydra Beast @@ -247,6 +270,14 @@ power=1 toughness=1 [/card] [card] +name=Nomads' Assembly +auto=token(Kor Soldier,Creature Kor Soldier,1/1,white)*type:creature:mybattlefield +auto=if rebound then transforms((,newability[moveto(exile)],newability[phaseaction[endofturn once checkex] activate may activate castcard(restricted)])) +mana={4}{W}{W} +type=Sorcery +text=Put a 1/1 white Kor Soldier creature token onto the battlefield for each creature you control. Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) +[/card] +[card] name=Obsessive Search abilities=madness autoexile=restriction{discarded} pay({U}) name(pay U to cast) activate name(pay U to cast) castcard(normal)?name(put in graveyard) moveto(ownergraveyard) @@ -266,6 +297,15 @@ power=3 toughness=1 [/card] [card] +name=Prey's Vengeance +target=creature +auto=2/2 +auto=if rebound then transforms((,newability[moveto(exile)],newability[phaseaction[endofturn once checkex] activate may activate castcard(restricted)])) +mana={G} +type=Instant +text=Target creature gets +2/+2 until end of turn. Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) +[/card] +[card] name=Psychotic Haze abilities=madness autoexile=restriction{discarded} pay({1}{B}) name(pay 1B to cast) activate name(pay 1B to cast) castcard(normal)?name(put in graveyard) moveto(ownergraveyard) @@ -305,6 +345,15 @@ power=4 toughness=4 [/card] [card] +name=Recurring Insight +target=opponent +auto=draw:type:*:targetedpersonshand controller +auto=if rebound then transforms((,newability[moveto(exile)],newability[phaseaction[endofturn once checkex] activate may activate castcard(restricted)])) +mana={4}{U}{U} +type=Sorcery +text=Draw cards equal to the number of cards in target opponent's hand. Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) +[/card] +[card] name=Sacellum Godspeaker auto={T}:foreach(creaure[power>4]|myhand) add{G} text={T}: Reveal any number of creature cards with power 5 or greater from your hand. Add {G} to your mana pool for each card revealed this way. @@ -363,6 +412,15 @@ mana={G}{W} type=Instant [/card] [card] +name=Staggershock +target=creature,player +auto=damage:2 +auto=if rebound then transforms((,newability[moveto(exile)],newability[phaseaction[endofturn once checkex] activate may activate castcard(restricted)])) +mana={2}{R} +type=Instant +text=Staggershock deals 2 damage to target creature or player. Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) +[/card] +[card] name=Strength of Isolation abilities=madness autoexile=restriction{discarded} pay({W}) name(pay W to cast) activate name(pay W to cast) castcard(normal)?name(put in graveyard) moveto(ownergraveyard) @@ -387,6 +445,33 @@ type=Enchantment subtype=Aura [/card] [card] +name=Surreal Memoir +auto=moverandom(instant) from(mygraveyard) to(myhand) +auto=if rebound then transforms((,newability[moveto(exile)],newability[phaseaction[endofturn once checkex] activate may activate castcard(restricted)])) +mana={3}{R} +type=Sorcery +text=Return an instant card at random from your graveyard to your hand. Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) +[/card] +[card] +name=Survival Cache +auto=life:2 controller +auto=if compare(lifetotal)~morethan~compare(opponentlifetotal) then draw:1 controller +auto=if rebound then transforms((,newability[moveto(exile)],newability[phaseaction[endofturn once checkex] activate may activate castcard(restricted)])) +mana={2}{W} +type=Sorcery +text=You gain 2 life. Then if you have more life than an opponent, draw a card. Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) +[/card] +[card] +name=Virulent Swipe +target=creature +auto=2/0 +auto=deathtouch +auto=if rebound then transforms((,newability[moveto(exile)],newability[phaseaction[endofturn once checkex] activate may activate castcard(restricted)])) +mana={B} +type=Instant +text=Target creature gets +2/+0 and gains deathtouch until end of turn. Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) +[/card] +[card] name=Zombie Brute abilities=trample auto=foreach(zombie|myhand) counter(1/1,1) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index fc838d55b..5f633d64b 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -25416,16 +25416,6 @@ mana={X}{U}{U}{U} type=Sorcery [/card] [card] -name=Distortion Strike -target=creature -auto=1/0 -auto=unblockable -auto=if rebound then transforms((,newability[moveto(exile)],newability[phaseaction[endofturn once checkex] activate may activate castcard(restricted)])) -mana={U} -type=Sorcery -text=Target creature gets +1/+0 until end of turn and is unblockable this turn. Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) -[/card] -[card] name=Distress target=player auto=if type(*[-land]|targetedpersonshand)~lessthan~1 then name(look) donothing notatarget(*|targetedpersonshand) else reject notatarget(*[-land]|targetedpersonshand) @@ -29911,19 +29901,6 @@ power=2 toughness=3 [/card] [card] -name=Emerge Unscathed -target=creature|mybattlefield -auto=choice name(green) transforms((,newability[protection from green])) ueot -auto=choice name(red) transforms((,newability[protection from red])) ueot -auto=choice name(blue) transforms((,newability[protection from blue])) ueot -auto=choice name(black) transforms((,newability[protection from black])) ueot -auto=choice name(white) transforms((,newability[protection from white])) ueot -auto=if rebound then transforms((,newability[moveto(exile)],newability[phaseaction[endofturn once checkex] activate may activate castcard(restricted)])) -mana={W} -type=Instant -text=Target creature you control gains protection from the color of your choice until end of turn. Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) -[/card] -[card] name=Emeria, the Sky Ruin auto=tap auto={T}:add{W} @@ -67924,14 +67901,6 @@ power=2 toughness=1 [/card] [card] -name=Nomads' Assembly -auto=token(Kor Soldier,Creature Kor Soldier,1/1,white)*type:creature:mybattlefield -auto=if rebound then transforms((,newability[moveto(exile)],newability[phaseaction[endofturn once checkex] activate may activate castcard(restricted)])) -mana={4}{W}{W} -type=Sorcery -text=Put a 1/1 white Kor Soldier creature token onto the battlefield for each creature you control. Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) -[/card] -[card] name=Nomad Decoy auto={W}{T}:tap target(creature) auto=aslongas(*|mygraveyard) {W}{W}{T}:target(<2>creature) tap >6 @@ -74430,15 +74399,6 @@ power=4 toughness=4 [/card] [card] -name=Prey's Vengeance -target=creature -auto=2/2 -auto=if rebound then transforms((,newability[moveto(exile)],newability[phaseaction[endofturn once checkex] activate may activate castcard(restricted)])) -mana={G} -type=Instant -text=Target creature gets +2/+2 until end of turn. Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) -[/card] -[card] name=Price of Glory auto=lord(land) transforms((,newability[@tappedformana(this) restriction{opponentturnonly}:destroy])) text=Whenever a player taps a land for mana, if it's not that player's turn, destroy that land. @@ -78606,15 +78566,6 @@ mana={3}{W} type=Instant [/card] [card] -name=Recurring Insight -target=opponent -auto=draw:type:*:targetedpersonshand controller -auto=if rebound then transforms((,newability[moveto(exile)],newability[phaseaction[endofturn once checkex] activate may activate castcard(restricted)])) -mana={4}{U}{U} -type=Sorcery -text=Draw cards equal to the number of cards in target opponent's hand. Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) -[/card] -[card] name=Recurring Nightmare auto={S(creature|myBattlefield)}{H}:moveto(mybattlefield) target(creature|mygraveyard) asSorcery text=Sacrifice a creature, Return Recurring Nightmare to its owner's hand: Return target creature card from your graveyard to the battlefield. Activate this ability only any time you could cast a sorcery. @@ -95248,15 +95199,6 @@ power=0 toughness=0 [/card] [card] -name=Staggershock -target=creature,player -auto=damage:2 -auto=if rebound then transforms((,newability[moveto(exile)],newability[phaseaction[endofturn once checkex] activate may activate castcard(restricted)])) -mana={2}{R} -type=Instant -text=Staggershock deals 2 damage to target creature or player. Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) -[/card] -[card] name=Stalker Hag abilities=swampwalk,forestwalk text=Swampwalk, forestwalk @@ -98307,14 +98249,6 @@ power=2 toughness=1 [/card] [card] -name=Surreal Memoir -auto=moverandom(instant) from(mygraveyard) to(myhand) -auto=if rebound then transforms((,newability[moveto(exile)],newability[phaseaction[endofturn once checkex] activate may activate castcard(restricted)])) -mana={3}{R} -type=Sorcery -text=Return an instant card at random from your graveyard to your hand. Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) -[/card] -[card] name=Surveilling Sprite abilities=flying auto=@movedto(this|graveyard) from(battlefield):may draw:1 @@ -98334,15 +98268,6 @@ mana={4}{R} type=Sorcery [/card] [card] -name=Survival Cache -auto=life:2 controller -auto=if compare(lifetotal)~morethan~compare(opponentlifetotal) then draw:1 controller -auto=if rebound then transforms((,newability[moveto(exile)],newability[phaseaction[endofturn once checkex] activate may activate castcard(restricted)])) -mana={2}{W} -type=Sorcery -text=You gain 2 life. Then if you have more life than an opponent, draw a card. Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) -[/card] -[card] name=Survival of the Fittest auto={G}{discard(creature|myhand)}:moveTo(myhand) target(creature|myLibrary) text={G}, Discard a creature card: Search your library for a creature card, reveal that card, and put it into your hand. Then shuffle your library. @@ -109535,16 +109460,6 @@ power=1 toughness=1 [/card] [card] -name=Virulent Swipe -target=creature -auto=2/0 -auto=deathtouch -auto=if rebound then transforms((,newability[moveto(exile)],newability[phaseaction[endofturn once checkex] activate may activate castcard(restricted)])) -mana={B} -type=Instant -text=Target creature gets +2/+0 and gains deathtouch until end of turn. Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) -[/card] -[card] name=Visara the Dreadful abilities=flying auto={T}:bury target(creature) From 896b12c16b46da6ccf46ebdd06b0421f7c4f9fbc Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sat, 31 Oct 2015 15:01:29 +0800 Subject: [PATCH 232/249] werror init on psp compilation --- projects/mtg/include/AllAbilities.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index dbf7edf41..66b33ff29 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -6374,11 +6374,11 @@ class GenericPaidAbility: public ActivatedAbility public: MTGAbility * baseAbility; ManaCost * optionalCost; - bool asAlternate; string newName; string restrictions; string baseCost; string baseAbilityStr; + bool asAlternate; GenericPaidAbility(GameObserver* observer, int id, MTGCardInstance * source, Targetable * target,string _newName,string _castRestriction,string _mayCost, string toAdd, bool asAlternate = false, ManaCost * cost = NULL); int resolve(); From 3a9b4f3491b7ac9b1d064ccc1bbeb0561dbe150d Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sat, 31 Oct 2015 15:23:39 +0800 Subject: [PATCH 233/249] parenthesis... --- projects/mtg/src/MTGAbility.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index 475d8e68f..44c40898d 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -1090,7 +1090,7 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG if (!target) target = card; //pay and castcard? - if(s.find("pay(") != string::npos || s.find("pay[[") != string::npos && s.find("castcard(restricted") != string::npos) + if(s.find("castcard(restricted") != string::npos && (s.find("pay(") != string::npos || s.find("pay[[") != string::npos)) asAlternate = true; //MTG Specific rules //adds the bonus credit system From 1bd3b7743b280e13d2b6382c90701c8dc228e0a8 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sun, 1 Nov 2015 21:59:54 +0800 Subject: [PATCH 234/249] bug fix --- .../mtg/bin/Res/sets/primitives/borderline.txt | 18 +++++++++--------- projects/mtg/src/AllAbilities.cpp | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/borderline.txt b/projects/mtg/bin/Res/sets/primitives/borderline.txt index aca91e968..017a69c27 100644 --- a/projects/mtg/bin/Res/sets/primitives/borderline.txt +++ b/projects/mtg/bin/Res/sets/primitives/borderline.txt @@ -103,7 +103,7 @@ name=Distortion Strike target=creature auto=1/0 auto=unblockable -auto=if rebound then transforms((,newability[moveto(exile)],newability[phaseaction[endofturn once checkex] activate may activate castcard(restricted)])) +auto=if rebound then transforms((,newability[moveto(exile)],newability[phaseaction[my upkeep once checkex] activate may activate castcard(restricted)])) mana={U} type=Sorcery text=Target creature gets +1/+0 until end of turn and is unblockable this turn. Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) @@ -116,7 +116,7 @@ auto=choice name(red) transforms((,newability[protection from red])) ueot auto=choice name(blue) transforms((,newability[protection from blue])) ueot auto=choice name(black) transforms((,newability[protection from black])) ueot auto=choice name(white) transforms((,newability[protection from white])) ueot -auto=if rebound then transforms((,newability[moveto(exile)],newability[phaseaction[endofturn once checkex] activate may activate castcard(restricted)])) +auto=if rebound then transforms((,newability[moveto(exile)],newability[phaseaction[my upkeep once checkex] activate may activate castcard(restricted)])) mana={W} type=Instant text=Target creature you control gains protection from the color of your choice until end of turn. Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) @@ -272,7 +272,7 @@ toughness=1 [card] name=Nomads' Assembly auto=token(Kor Soldier,Creature Kor Soldier,1/1,white)*type:creature:mybattlefield -auto=if rebound then transforms((,newability[moveto(exile)],newability[phaseaction[endofturn once checkex] activate may activate castcard(restricted)])) +auto=if rebound then transforms((,newability[moveto(exile)],newability[phaseaction[my upkeep once checkex] activate may activate castcard(restricted)])) mana={4}{W}{W} type=Sorcery text=Put a 1/1 white Kor Soldier creature token onto the battlefield for each creature you control. Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) @@ -300,7 +300,7 @@ toughness=1 name=Prey's Vengeance target=creature auto=2/2 -auto=if rebound then transforms((,newability[moveto(exile)],newability[phaseaction[endofturn once checkex] activate may activate castcard(restricted)])) +auto=if rebound then transforms((,newability[moveto(exile)],newability[phaseaction[my upkeep once checkex] activate may activate castcard(restricted)])) mana={G} type=Instant text=Target creature gets +2/+2 until end of turn. Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) @@ -348,7 +348,7 @@ toughness=4 name=Recurring Insight target=opponent auto=draw:type:*:targetedpersonshand controller -auto=if rebound then transforms((,newability[moveto(exile)],newability[phaseaction[endofturn once checkex] activate may activate castcard(restricted)])) +auto=if rebound then transforms((,newability[moveto(exile)],newability[phaseaction[my upkeep once checkex] activate may activate castcard(restricted)])) mana={4}{U}{U} type=Sorcery text=Draw cards equal to the number of cards in target opponent's hand. Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) @@ -415,7 +415,7 @@ type=Instant name=Staggershock target=creature,player auto=damage:2 -auto=if rebound then transforms((,newability[moveto(exile)],newability[phaseaction[endofturn once checkex] activate may activate castcard(restricted)])) +auto=if rebound then transforms((,newability[moveto(exile)],newability[phaseaction[my upkeep once checkex] activate may activate castcard(restricted)])) mana={2}{R} type=Instant text=Staggershock deals 2 damage to target creature or player. Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) @@ -447,7 +447,7 @@ subtype=Aura [card] name=Surreal Memoir auto=moverandom(instant) from(mygraveyard) to(myhand) -auto=if rebound then transforms((,newability[moveto(exile)],newability[phaseaction[endofturn once checkex] activate may activate castcard(restricted)])) +auto=if rebound then transforms((,newability[moveto(exile)],newability[phaseaction[my upkeep once checkex] activate may activate castcard(restricted)])) mana={3}{R} type=Sorcery text=Return an instant card at random from your graveyard to your hand. Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) @@ -456,7 +456,7 @@ text=Return an instant card at random from your graveyard to your hand. Rebound name=Survival Cache auto=life:2 controller auto=if compare(lifetotal)~morethan~compare(opponentlifetotal) then draw:1 controller -auto=if rebound then transforms((,newability[moveto(exile)],newability[phaseaction[endofturn once checkex] activate may activate castcard(restricted)])) +auto=if rebound then transforms((,newability[moveto(exile)],newability[phaseaction[my upkeep once checkex] activate may activate castcard(restricted)])) mana={2}{W} type=Sorcery text=You gain 2 life. Then if you have more life than an opponent, draw a card. Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) @@ -466,7 +466,7 @@ name=Virulent Swipe target=creature auto=2/0 auto=deathtouch -auto=if rebound then transforms((,newability[moveto(exile)],newability[phaseaction[endofturn once checkex] activate may activate castcard(restricted)])) +auto=if rebound then transforms((,newability[moveto(exile)],newability[phaseaction[my upkeep once checkex] activate may activate castcard(restricted)])) mana={B} type=Instant text=Target creature gets +2/+0 and gains deathtouch until end of turn. Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index 81f7d33d8..b681dfc36 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -1235,7 +1235,7 @@ int GenericPaidAbility::resolve() optionalCost->add(Constants::MTG_COLOR_ARTIFACT, 3); }*/ } - if(nomenu && optionalCost->getConvertedCost() < 1) + if(asAlternate && nomenu && optionalCost->getConvertedCost() < 1) { nomenuAbility->resolve(); } From 7303c7c2538b3f5731a0c7f9a364464d14e18dbd Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 2 Nov 2015 00:15:58 +0800 Subject: [PATCH 235/249] chooseacolor indicator on some cards alias = 0000 plus chooseacolor ability... --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 25 ++++++++++++++++++-- projects/mtg/src/CardGui.cpp | 16 +++++++++++-- 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 5f633d64b..bfe4741ba 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -16540,6 +16540,7 @@ toughness=2 [/card] [card] name=Cho-Manno's Blessing +alias=0000 abilities=auraward target=creature abilities=flash @@ -18133,6 +18134,7 @@ type=Artifact [/card] [card] name=Coldsteel Heart +alias=0000 auto=tap auto=chooseacolor {T}:add{chosencolor} chooseend text=Coldsteel Heart enters the battlefield tapped. -- As Coldsteel Heart enters the battlefield, choose a color. -- {T}: Add one mana of the chosen color to your mana pool. @@ -21040,6 +21042,7 @@ subtype=Aura Curse [/card] [card] name=Curse of Wizardry +alias=0000 auto=chooseacolor transforms((,newability[@movedto(*[chosencolor]|mystack):life:-1 controller],newability[@movedto(*[chosencolor]|opponentstack):life:-1 opponent])) chooseend text=As Curse of Wizardry enters the battlefield, choose a color. -- Whenever a player casts a spell of the chosen color, that player loses 1 life. mana={2}{B}{B} @@ -35093,6 +35096,7 @@ toughness=2 [/card] [card] name=Flickering Ward +alias=0000 abilities=auraward target=creature auto=chooseacolor teach(creature) protection from(*[chosencolor]) chooseend @@ -35171,6 +35175,7 @@ toughness=2 [/card] [card] name=Floating Shield +alias=0000 abilities=auraward target=creature auto=chooseacolor teach(creature) protection from(*[chosencolor]) chooseend @@ -43565,6 +43570,7 @@ toughness=3 [/card] [card] name=Hall of Triumph +alias=0000 auto=activatechooseacolor transforms((,newability[lord(creature[chosencolor]|mybattlefield) 1/1])) forever activatechooseend text=As Hall of Triumph enters the battlefield, choose a color. -- Creatures you control of the chosen color get +1/+1. mana={3} @@ -49384,6 +49390,7 @@ type=Sorcery [/card] [card] name=Iona, Shield of Emeria +alias=0000 abilities=flying auto=chooseacolor maxCast(*[chosencolor])0 opponent chooseend text=Flying -- As Iona, Shield of Emeria enters the battlefield, choose a color. -- Your opponents can't cast spells of the chosen color. @@ -50520,6 +50527,7 @@ toughness=3 [/card] [card] name=Jihad +alias=0000 auto=chooseacolor transforms((,newability[aslongas(*[chosencolor]|opponentbattlefield) lord(creature[white]|mybattlefield) 2/1],newability[aslongas(*[chosencolor]|opponentbattlefield) sacrifice <1])) chooseend text=As Jihad enters the battlefield, choose a color and an opponent. -- White creatures get +2/+1 as long as the chosen player controls a nontoken permanent of the chosen color. -- When the chosen player controls no nontoken permanents of the chosen color, sacrifice Jihad. mana={W}{W}{W} @@ -54796,7 +54804,7 @@ toughness=2 [/card] [card] name=Kytheon's Irregulars -auto=auto={W}{W}:tap target(creature) +auto={W}{W}:tap target(creature) auto=this(cantargetcard(*[-renown]) transforms((,newability[@combatdamaged(player) from(this):counter(1/1) && becomes(renown) forever])) text=Renown 1 (When this creature deals combat damage to a player, if it isn't renowned, put a +1/+1 counter on it and it becomes renowned.) -- {W}{W}: Tap target creature. mana={2}{W}{W} @@ -58209,6 +58217,7 @@ type=Instant [/card] [card] name=Lurebound Scarecrow +alias=0000 auto=chooseacolor aslongas(*[chosencolor]|myBattlefield) sacrifice <1 chooseend text=As Lurebound Scarecrow enters the battlefield, choose a color. -- When you control no permanents of the chosen color, sacrifice Lurebound Scarecrow. mana={3} @@ -70832,6 +70841,7 @@ subtype=Equipment [/card] [card] name=Paradise Plume +alias=0000 auto=chooseacolor transforms((,newability[{T}:add{chosencolor}],newability[@movedto(*[chosencolor]|stack):life:1 controller])) forever chooseend text=As Paradise Plume enters the battlefield, choose a color. -- Whenever a player casts a spell of the chosen color, you may gain 1 life. -- {T}: Add one mana of the chosen color to your mana pool. mana={4} @@ -71623,6 +71633,7 @@ type=Artifact [/card] [card] name=Pentarch Paladin +alias=0000 abilities=flanking auto=chooseacolor {W}{W}{T}:destroy target(*[chosencolor]) chooseend text=Flanking (Whenever a creature without flanking blocks this creature, the blocking creature gets -1/-1 until end of turn.) -- As Pentarch Paladin enters the battlefield, choose a color. -- {W}{W}, {T}: Destroy target permanent of the chosen color. @@ -71634,6 +71645,7 @@ toughness=3 [/card] [card] name=Pentarch Ward +alias=0000 abilities=auraward target=creature auto=chooseacolor teach(creature) protection from(*[chosencolor]) chooseend @@ -74770,7 +74782,8 @@ toughness=4 [/card] [card] name=Prism Ring -auto=auto=activatechooseacolor transforms((,newability[@movedto(*[chosencolor]|mystack):life:1 controller])) forever activatechooseend +alias=0000 +auto=activatechooseacolor transforms((,newability[@movedto(*[chosencolor]|mystack):life:1 controller])) forever activatechooseend text=As Prism Ring enters the battlefield, choose a color. -- Whenever you cast a spell of the chosen color, you gain 1 life. mana={1} type=Artifact @@ -75240,6 +75253,7 @@ toughness=2 [/card] [card] name=Psychic Allergy +alias=0000 auto=upcost[{S(island|mybattlefield)}{S(island|mybattlefield)}] sacrifice auto=chooseacolor transforms((,newability[@each opponent upkeep:damage:type:*[-token&chosencolor]:opponentbattlefield opponent])) chooseend text=As Psychic Allergy enters the battlefield, choose a color. -- At the beginning of each opponent's upkeep, Psychic Allergy deals X damage to that player, where X is the number of nontoken permanents of the chosen color he or she controls. -- At the beginning of your upkeep, destroy Psychic Allergy unless you sacrifice two Islands. @@ -76335,6 +76349,7 @@ toughness=1 [/card] [card] name=Quirion Elves +alias=0000 auto={T}:Add{G} auto=chooseacolor {T}:add{chosencolor} chooseend text=As Quirion Elves enters the battlefield, choose a color. -- {T}: Add {G} to your mana pool. -- {T}: Add one mana of the chosen color to your mana pool. @@ -87769,6 +87784,7 @@ toughness=2 [/card] [card] name=Shifting Sky +alias=0000 auto=chooseacolor lord(*[-land]) becomes(,chosencolor) chooseend text=As Shifting Sky enters the battlefield, choose a color. -- All nonland permanents are the chosen color. mana={2}{U} @@ -89053,6 +89069,7 @@ toughness=1 [/card] [card] name=Silhana Starfletcher +alias=0000 abilities=reach auto=activatechooseacolor {T}:add{chosencolor} activatechooseend text=Reach (This creature can block creatures with flying.) -- As Silhana Starfletcher enters the battlefield, choose a color. -- {T}: Add one mana of the chosen color to your mana pool. @@ -91990,6 +92007,7 @@ toughness=3 [/card] [card] name=Sol Grail +alias=0000 auto=chooseacolor transforms((,newability[{T}:add{chosencolor}])) forever chooseend text=As Sol Grail enters the battlefield, choose a color. -- {T}: Add one mana of the chosen color to your mana pool. mana={3} @@ -100081,6 +100099,7 @@ type=Legendary Land [/card] [card] name=Teferi's Moat +alias=0000 auto=chooseacolor lord(creature[chosencolor&-flying]|opponentBattlefield) cantattack chooseend text=As Teferi's Moat enters the battlefield, choose a color. -- Creatures of the chosen color without flying can't attack you. mana={3}{W}{U} @@ -109849,6 +109868,7 @@ toughness=2 [/card] [card] name=Voice of All +alias=0000 abilities=flying auto=chooseacolor transforms((,newability[protection from(*[chosencolor])],newability[0/0])) forever chooseend text=Flying (This creature can't be blocked except by creatures with flying or reach.) -- As Voice of All enters the battlefield, choose a color. -- Voice of All has protection from the chosen color. (It can't be blocked, targeted, dealt damage, or enchanted by anything of the chosen color.) @@ -111655,6 +111675,7 @@ toughness=1 [/card] [card] name=Ward Sliver +alias=0000 auto=chooseacolor transforms((,newability[lord(sliver) protection from(*[chosencolor])])) forever chooseend text=As Ward Sliver enters the battlefield, choose a color. -- All Slivers have protection from the chosen color. mana={4}{W} diff --git a/projects/mtg/src/CardGui.cpp b/projects/mtg/src/CardGui.cpp index a9454f183..00fec3c32 100644 --- a/projects/mtg/src/CardGui.cpp +++ b/projects/mtg/src/CardGui.cpp @@ -364,8 +364,20 @@ void CardGui::Render() if(card->isToken && card->isACopier) buff = "CT"; if(!card->isToken && card->isACopier) - buff = "C"; - + buff = "C"; + if(card->alias == 0000) + { + if(card->chooseacolor == 1) + buff += "\n-Green"; + else if(card->chooseacolor == 2) + buff += "\n-Blue"; + else if(card->chooseacolor == 3) + buff += "\n-Red"; + else if(card->chooseacolor == 4) + buff += "\n-Black"; + else if(card->chooseacolor == 5) + buff += "\n-White"; + } if(!alternate && buff != "" && game->gameType() == GAME_TYPE_CLASSIC)//it seems that other game modes makes cards as tokens!!! hmmm... { mFont->SetScale(DEFAULT_MAIN_FONT_SCALE); From 7ffab1a8212e1cd835d0d5a1debbf402dbb35838 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 2 Nov 2015 12:21:35 +0800 Subject: [PATCH 236/249] moved activated copy cards to borderline the default function of copy function triggers abilities as it comes onto the battlefield, but these cards are already inplay with their copy abilities and the enters the battlefield abilities of the copied cards must not trigger. --- .../bin/Res/sets/primitives/borderline.txt | 47 +++++++++++++++++++ projects/mtg/bin/Res/sets/primitives/mtg.txt | 47 ------------------- 2 files changed, 47 insertions(+), 47 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/borderline.txt b/projects/mtg/bin/Res/sets/primitives/borderline.txt index 017a69c27..9d8f5a066 100644 --- a/projects/mtg/bin/Res/sets/primitives/borderline.txt +++ b/projects/mtg/bin/Res/sets/primitives/borderline.txt @@ -69,6 +69,16 @@ mana={B} type=Sorcery [/card] [card] +name=Cemetery Puca +text=Whenever a creature is put into a graveyard from the battlefield, you may pay {1}. If you do, Cemetery Puca becomes a copy of that creature and gains this ability. +auto=@movedto(creature|graveyard) from(battlefield):all(trigger[from]) pay[[{1}]] copy +mana={1}{UB}{UB} +type=Creature +subtype=Shapeshifter +power=1 +toughness=2 +[/card] +[card] name=Cinder Seer auto={2}{r}{t}:target(creature,Player) damage:type:*[red]:myhand text={2}{R}, {T}: Reveal any number of red cards in your hand. Cinder Seer deals X damage to target creature or player, where X is the number of cards revealed this way. @@ -89,6 +99,16 @@ mana={1}{B}{G} type=Instant [/card] [card] +name=Cryptoplasm +auto=@each my upkeep:may copy target(other creature|battlefield) +text=At the beginning of your upkeep, you may have Cryptoplasm become a copy of another target creature. If you do, Cryptoplasm gains this ability. +mana={1}{U}{U} +type=Creature +subtype=Shapeshifter +power=2 +toughness=2 +[/card] +[card] name=Dark Withering abilities=madness autoexile=restriction{discarded} pay({B}) name(pay B to cast) activate name(pay B to cast) castcard(normal)?name(put in graveyard) moveto(ownergraveyard) @@ -99,6 +119,16 @@ mana={4}{B}{B} type=Instant [/card] [card] +name=Dimir Doppelganger +auto={1}{U}{B}:target(creature|graveyard) moveto(exile) and!(copy)! +text={1}{U}{B}: Exile target creature card from a graveyard. Dimir Doppelganger becomes a copy of that card and gains this ability. +mana={1}{U}{B} +type=Creature +subtype=Shapeshifter +power=0 +toughness=2 +[/card] +[card] name=Distortion Strike target=creature auto=1/0 @@ -462,6 +492,23 @@ type=Sorcery text=You gain 2 life. Then if you have more life than an opponent, draw a card. Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) [/card] [card] +name=Thespian's Stage +auto={T}:Add{1} +auto={2}{T}:copy target(land|battlefield) +text={T}: Add {1} to your mana pool. -- {2}, {T}: Thespian's Stage becomes a copy of target land and gains this ability. +type=Land +[/card] +[card] +name=Unstable Shapeshifter +auto=@movedto(other creature|battlefield):all(trigger[from]) copy +text=Whenever another creature enters the battlefield, Unstable Shapeshifter becomes a copy of that creature and gains this ability. +mana={3}{U} +type=Creature +subtype=Shapeshifter +power=0 +toughness=1 +[/card] +[card] name=Virulent Swipe target=creature auto=2/0 diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index bfe4741ba..2cd71814f 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -15219,16 +15219,6 @@ power=0 toughness=5 [/card] [card] -name=Cemetery Puca -text=Whenever a creature is put into a graveyard from the battlefield, you may pay {1}. If you do, Cemetery Puca becomes a copy of that creature and gains this ability. -auto=@movedto(creature|graveyard) from(battlefield):all(trigger[from]) pay[[{1}]] copy -mana={1}{UB}{UB} -type=Creature -subtype=Shapeshifter -power=1 -toughness=2 -[/card] -[card] name=Cemetery Reaper auto=lord(other zombie|myBattlefield) 1/1 auto={2}{B}{T}:moveTo(Exile) target(creature|graveyard) && token(Zombie,Creature Zombie,2/2,black) @@ -20677,16 +20667,6 @@ power=0 toughness=0 [/card] [card] -name=Cryptoplasm -auto=@each my upkeep:may copy target(other creature|battlefield) -text=At the beginning of your upkeep, you may have Cryptoplasm become a copy of another target creature. If you do, Cryptoplasm gains this ability. -mana={1}{U}{U} -type=Creature -subtype=Shapeshifter -power=2 -toughness=2 -[/card] -[card] name=Cryptwailing auto={1}{E(creature|mygraveyard)}{E(creature|mygraveyard)}:target(player) ability$!name(discard) target(*|myhand) reject!$ targetedplayer asSorcery text={1}, Exile two creature cards from your graveyard: Target player discards a card. Activate this ability only any time you could cast a sorcery. @@ -24759,16 +24739,6 @@ power=2 toughness=2 [/card] [card] -name=Dimir Doppelganger -auto={1}{U}{B}:target(creature|graveyard) moveto(exile) and!(copy)! -text={1}{U}{B}: Exile target creature card from a graveyard. Dimir Doppelganger becomes a copy of that card and gains this ability. -mana={1}{U}{B} -type=Creature -subtype=Shapeshifter -power=0 -toughness=2 -[/card] -[card] name=Dimir Guildgate auto=tap auto={T}:add{U} @@ -101395,13 +101365,6 @@ mana={1}{G}{G} type=Sorcery [/card] [card] -name=Thespian's Stage -auto={T}:Add{1} -auto={2}{T}:copy target(land|battlefield) -text={T}: Add {1} to your mana pool. -- {2}, {T}: Thespian's Stage becomes a copy of target land and gains this ability. -type=Land -[/card] -[card] name=Thicket Basilisk auto=@combat(blocking,blocked) source(this) from(creature[-wall]):all(trigger[from]) phaseaction[combatends once] destroy text=Whenever Thicket Basilisk blocks or becomes blocked by a non-Wall creature, destroy that creature at end of combat. @@ -106654,16 +106617,6 @@ type=Enchantment subtype=Aura [/card] [card] -name=Unstable Shapeshifter -auto=@movedto(other creature|battlefield):all(trigger[from]) copy -text=Whenever another creature enters the battlefield, Unstable Shapeshifter becomes a copy of that creature and gains this ability. -mana={3}{U} -type=Creature -subtype=Shapeshifter -power=0 -toughness=1 -[/card] -[card] name=Unstoppable Ash abilities=trample auto=aslongas(other treefolk|mybattlefield) choice notatarget(other treefolk|mybattlefield) (blink)forsrc oneshot From 60ba4e3eebd67b1d1da35243edf9d23c0089a8dd Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Wed, 4 Nov 2015 06:41:59 +0800 Subject: [PATCH 237/249] altercost should affect retrace, flashback, buyback costs --- projects/mtg/include/GameObserver.h | 2 - projects/mtg/include/MTGAbility.h | 1 + projects/mtg/include/MTGCardInstance.h | 20 +++- projects/mtg/include/MTGDefinitions.h | 3 +- projects/mtg/include/MTGRules.h | 2 + projects/mtg/include/ManaCost.h | 3 +- projects/mtg/src/ActionStack.cpp | 2 +- projects/mtg/src/GameObserver.cpp | 125 +++++++++---------------- projects/mtg/src/MTGCardInstance.cpp | 2 - projects/mtg/src/MTGDefinitions.cpp | 3 +- projects/mtg/src/MTGRules.cpp | 6 +- 11 files changed, 73 insertions(+), 96 deletions(-) diff --git a/projects/mtg/include/GameObserver.h b/projects/mtg/include/GameObserver.h index 3771a3c27..25fcf745b 100644 --- a/projects/mtg/include/GameObserver.h +++ b/projects/mtg/include/GameObserver.h @@ -122,8 +122,6 @@ class GameObserver{ void gameStateBasedEffects(); void enchantmentStatus(); void Affinity(); - void ComputeTrinisphere(); - void RemoveTrinisphere(MTGCardInstance * card); void addObserver(MTGAbility * observer); bool removeObserver(ActionElement * observer); void startGame(GameType, Rules * rules); diff --git a/projects/mtg/include/MTGAbility.h b/projects/mtg/include/MTGAbility.h index b9ecfa8cf..876bb97e2 100644 --- a/projects/mtg/include/MTGAbility.h +++ b/projects/mtg/include/MTGAbility.h @@ -213,6 +213,7 @@ public: COUNTERS = 30, PUT_INTO_PLAY_WITH_KICKER = 31, STANDARD_FIZZLER = 32, + CASTINGRAVEYARD_COST = 33, }; }; diff --git a/projects/mtg/include/MTGCardInstance.h b/projects/mtg/include/MTGCardInstance.h index 56c887459..9eb7a64da 100644 --- a/projects/mtg/include/MTGCardInstance.h +++ b/projects/mtg/include/MTGCardInstance.h @@ -253,9 +253,25 @@ public: int cardistargetted; bool isTargetter(); int cardistargetter; - int tmodifier; - int tmodifierb; int myconvertedcost; + ManaCost * computeNewCost(MTGCardInstance * card,ManaCost * oldCost) + { + if(card->isLand()) + return oldCost; + + if(!card) + return NULL; + //i don't know why this method doesn't affect cards in hand, but is working on other zones....// + //pay zero costs// + //kicker???...// + //morph cost todo// + //trinisphere must be here below// + if(card->has(Constants::TRINISPHERE)) + for(int jj = oldCost->getConvertedCost(); jj < 3; jj++) + oldCost->add(Constants::MTG_COLOR_ARTIFACT, 1); + + return oldCost; + }; void eventattacked(); void eventattackedAlone(); diff --git a/projects/mtg/include/MTGDefinitions.h b/projects/mtg/include/MTGDefinitions.h index cc45e19b2..a3df629bc 100644 --- a/projects/mtg/include/MTGDefinitions.h +++ b/projects/mtg/include/MTGDefinitions.h @@ -236,7 +236,8 @@ class Constants OPPGCREATUREEXILER = 118, PAYZERO = 119, TRINISPHERE = 120, - NB_BASIC_ABILITIES = 121, + CANPLAYFROMEXILE = 121, + NB_BASIC_ABILITIES = 122, RARITY_S = 'S', //Special Rarity diff --git a/projects/mtg/include/MTGRules.h b/projects/mtg/include/MTGRules.h index bd31cfc83..13be1c5b3 100644 --- a/projects/mtg/include/MTGRules.h +++ b/projects/mtg/include/MTGRules.h @@ -76,6 +76,8 @@ public: MTGPutInPlayRule(GameObserver* observer, int _id); const string getMenuText() { + if(game && game->gameType() == GAME_TYPE_MOMIR) + return "Play Land"; return "Cast Card Normally"; } virtual MTGPutInPlayRule * clone() const; diff --git a/projects/mtg/include/ManaCost.h b/projects/mtg/include/ManaCost.h index 9faea5806..bdc3868ab 100644 --- a/projects/mtg/include/ManaCost.h +++ b/projects/mtg/include/ManaCost.h @@ -47,7 +47,8 @@ public: MANA_PAID_WITH_FLASHBACK = 5, MANA_PAID_WITH_RETRACE = 6, MANA_PAID_WITH_MORPH = 7, - MANA_PAID_WITH_SUSPEND = 8 + MANA_PAID_WITH_SUSPEND = 8, + MANA_PAID_WITH_OTHERCOST = 9 }; ExtraCosts * extraCosts; diff --git a/projects/mtg/src/ActionStack.cpp b/projects/mtg/src/ActionStack.cpp index 5fd4c6f3c..88de3027b 100644 --- a/projects/mtg/src/ActionStack.cpp +++ b/projects/mtg/src/ActionStack.cpp @@ -301,7 +301,7 @@ bool Spell::FullfilledAlternateCost(const int &costType) hasFullfilledAlternateCost = (payResult == ManaCost::MANA_PAID_WITH_RETRACE); break; case ManaCost::MANA_PAID_WITH_SUSPEND: - hasFullfilledAlternateCost = (payResult == ManaCost::MANA_PAID_WITH_RETRACE); + hasFullfilledAlternateCost = (payResult == ManaCost::MANA_PAID_WITH_SUSPEND); break; } diff --git a/projects/mtg/src/GameObserver.cpp b/projects/mtg/src/GameObserver.cpp index a84429bd1..03bf15211 100644 --- a/projects/mtg/src/GameObserver.cpp +++ b/projects/mtg/src/GameObserver.cpp @@ -885,9 +885,6 @@ void GameObserver::gameStateBasedEffects() // plus modify costs // ///////////////////////////// Affinity(); - //trinisphere? buggy... - //ComputeTrinisphere(); - //end trinisphere ///////////////////////////////////// // Check colored statuses on cards // ///////////////////////////////////// @@ -979,10 +976,14 @@ void GameObserver::Affinity() //only do any of the following if a card with the stated ability is in your hand. ManaCost * original = NEW ManaCost(); ManaCost * alternate = NEW ManaCost(); + ManaCost * buyback = NEW ManaCost(); + ManaCost * flashback = NEW ManaCost(); + ManaCost * retrace = NEW ManaCost(); original->copy(card->model->data->getManaCost()); alternate->copy(card->model->data->getManaCost()->getAlternative()); - if (card->has(Constants::PAYZERO)) - original = ManaCost::parseManaCost("{0}",NULL,card);//can't figure out 2 or more alternative... + buyback->copy(card->model->data->getManaCost()->getBuyback()); + flashback->copy(card->model->data->getManaCost()->getFlashback()); + retrace->copy(card->model->data->getManaCost()->getRetrace()); //have to run alter cost before affinity or the 2 cancel each other out. if(card->getIncreasedManaCost()->getConvertedCost()||card->getReducedManaCost()->getConvertedCost()) { @@ -995,10 +996,22 @@ void GameObserver::Affinity() { alternate->add(kc,card->getIncreasedManaCost()->getCost(kc)); } + if (card->getManaCost()->getBuyback()) + { + buyback->add(kc,card->getIncreasedManaCost()->getCost(kc)); + } + if (card->getManaCost()->getFlashback()) + { + flashback->add(kc,card->getIncreasedManaCost()->getCost(kc)); + } + if (card->getManaCost()->getRetrace()) + { + retrace->add(kc,card->getIncreasedManaCost()->getCost(kc)); + } } } if(card->getReducedManaCost()->getConvertedCost()) - { + { original->remove(card->getReducedManaCost()); for(int kc = Constants::MTG_COLOR_ARTIFACT; kc < Constants::NB_Colors;kc++) { @@ -1006,12 +1019,30 @@ void GameObserver::Affinity() { alternate->remove(kc,card->getReducedManaCost()->getCost(kc)); } + if (card->getManaCost()->getBuyback()) + { + buyback->remove(kc,card->getIncreasedManaCost()->getCost(kc)); + } + if (card->getManaCost()->getFlashback()) + { + flashback->remove(kc,card->getIncreasedManaCost()->getCost(kc)); + } + if (card->getManaCost()->getRetrace()) + { + retrace->remove(kc,card->getIncreasedManaCost()->getCost(kc)); + } } } if(card->getManaCost()) card->getManaCost()->copy(original); if(card->getManaCost()->getAlternative()) - card->getManaCost()->setAlternative(alternate); + card->getManaCost()->setAlternative(alternate); + if(card->getManaCost()->getBuyback()) + card->getManaCost()->setBuyback(buyback); + if(card->getManaCost()->getFlashback()) + card->getManaCost()->setFlashback(flashback); + if(card->getManaCost()->getRetrace()) + card->getManaCost()->setRetrace(retrace); if(card->getManaCost()->extraCosts) { for(unsigned int i = 0; i < card->getManaCost()->extraCosts->costs.size();i++) @@ -1068,7 +1099,8 @@ void GameObserver::Affinity() card->has(Constants::AFFINITYISLAND)|| card->has(Constants::AFFINITYMOUNTAIN)|| card->has(Constants::AFFINITYPLAINS)|| - card->has(Constants::AFFINITYSWAMP)){ + card->has(Constants::AFFINITYSWAMP)) + { if (card->has(Constants::AFFINITYARTIFACTS)) { type = "artifact"; @@ -1123,86 +1155,13 @@ void GameObserver::Affinity() if(card->getManaCost()->getCost(color) > 0) card->getManaCost()->remove(color,1); } - - } - SAFE_DELETE(original); + } + //SAFE_DELETE(original); }//end } } } -void GameObserver::ComputeTrinisphere() -{ - for (int td = 0; td < 2; td++) - { - MTGGameZone * dzones[] = { players[td]->game->graveyard, players[td]->game->hand, players[td]->game->library, players[td]->game->exile }; - for (int tk = 0; tk < 4; tk++) - { - MTGGameZone * zone = dzones[tk]; - for (int ct = zone->nb_cards - 1; ct >= 0; ct--) - { - if(zone->cards[ct]->has(Constants::TRINISPHERE)) - { - if(zone->cards[ct]->getManaCost()->getConvertedCost() == 2) - { - zone->cards[ct]->getManaCost()->add(Constants::MTG_COLOR_ARTIFACT, 1); - zone->cards[ct]->tmodifier = 1; - } - else if(zone->cards[ct]->getManaCost()->getConvertedCost() == 1) - { - zone->cards[ct]->getManaCost()->add(Constants::MTG_COLOR_ARTIFACT, 2); - zone->cards[ct]->tmodifier = 2; - } - else if(zone->cards[ct]->getManaCost()->getConvertedCost() < 1) - { - zone->cards[ct]->getManaCost()->add(Constants::MTG_COLOR_ARTIFACT, 3); - zone->cards[ct]->tmodifier = 3; - } - if(zone->cards[ct]->getManaCost()->getAlternative()) - { - ManaCost * currentAlternate = NEW ManaCost(); - currentAlternate->copy(zone->cards[ct]->getManaCost()->getAlternative()); - if(zone->cards[ct]->getManaCost()->getAlternative()->getConvertedCost() == 2) - zone->cards[ct]->tmodifierb = 1; - else if(zone->cards[ct]->getManaCost()->getAlternative()->getConvertedCost() == 1) - zone->cards[ct]->tmodifierb = 2; - else if(zone->cards[ct]->getManaCost()->getAlternative()->getConvertedCost() < 1) - zone->cards[ct]->tmodifierb = 3; - currentAlternate->add(Constants::MTG_COLOR_ARTIFACT, zone->cards[ct]->tmodifierb); - zone->cards[ct]->getManaCost()->setAlternative(currentAlternate); - } - } - else - RemoveTrinisphere(zone->cards[ct]); - if(zone->cards[ct]->getManaCost()->extraCosts) - { - for(unsigned int i = 0; i < zone->cards[ct]->getManaCost()->extraCosts->costs.size();i++) - { - zone->cards[ct]->getManaCost()->extraCosts->costs[i]->setSource(zone->cards[ct]); - } - } - } - } - } -} -void GameObserver::RemoveTrinisphere(MTGCardInstance * card) -{ - if(card->has(Constants::TRINISPHERE)) - return; - if(card->tmodifier) - { - card->getManaCost()->remove(Constants::MTG_COLOR_ARTIFACT, card->tmodifier); - card->tmodifier = 0; - } - if(card->getManaCost()->getAlternative() && card->tmodifierb) - { - ManaCost * newalternate = NEW ManaCost(); - newalternate->copy(card->getManaCost()->getAlternative()); - newalternate->remove(Constants::MTG_COLOR_ARTIFACT, card->tmodifierb); - card->getManaCost()->setAlternative(newalternate); - card->tmodifierb = 0; - } -} void GameObserver::Render() { if(mLayers) diff --git a/projects/mtg/src/MTGCardInstance.cpp b/projects/mtg/src/MTGCardInstance.cpp index 02d5086fa..a70ef93b6 100644 --- a/projects/mtg/src/MTGCardInstance.cpp +++ b/projects/mtg/src/MTGCardInstance.cpp @@ -65,8 +65,6 @@ MTGCardInstance::MTGCardInstance(MTGCard * card, MTGPlayerCards * arg_belongs_to LKItoughness = toughness; cardistargetted = 0; cardistargetter = 0; - tmodifier = 0; - tmodifierb = 0; myconvertedcost = getManaCost()->getConvertedCost(); } diff --git a/projects/mtg/src/MTGDefinitions.cpp b/projects/mtg/src/MTGDefinitions.cpp index a2530cdb4..dbeaca32d 100644 --- a/projects/mtg/src/MTGDefinitions.cpp +++ b/projects/mtg/src/MTGDefinitions.cpp @@ -149,7 +149,8 @@ const char* Constants::MTGBasicAbilities[] = { "mygcreatureexiler", "oppgcreatureexiler", "payzero", - "trinisphere" + "trinisphere", + "canplayfromexile" }; map Constants::MTGBasicAbilitiesMap; diff --git a/projects/mtg/src/MTGRules.cpp b/projects/mtg/src/MTGRules.cpp index 458e63789..f1b14a941 100644 --- a/projects/mtg/src/MTGRules.cpp +++ b/projects/mtg/src/MTGRules.cpp @@ -1132,7 +1132,7 @@ MTGMorphCostRule * MTGMorphCostRule::clone() const MTGPlayFromGraveyardRule::MTGPlayFromGraveyardRule(GameObserver* observer, int _id) : MTGAlternativeCostRule(observer, _id) { - aType = MTGAbility::PUT_INTO_PLAY; + aType = MTGAbility::CASTINGRAVEYARD_COST; } int MTGPlayFromGraveyardRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana) @@ -1155,9 +1155,9 @@ int MTGPlayFromGraveyardRule::reactToClick(MTGCardInstance * card) ManaCost * cost = card->getManaCost(); - card->paymenttype = MTGAbility::PUT_INTO_PLAY; + card->paymenttype = MTGAbility::CASTINGRAVEYARD_COST; - return MTGAlternativeCostRule::reactToClick(card, cost, ManaCost::MANA_PAID); + return MTGAlternativeCostRule::reactToClick(card, cost, ManaCost::MANA_PAID_WITH_OTHERCOST); } ostream& MTGPlayFromGraveyardRule::toString(ostream& out) const From 4f54e30e0ea97a77afac729132941b509bb8783d Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 5 Nov 2015 07:16:49 +0800 Subject: [PATCH 238/249] Libraryeater and Canplayfromexile extend canplayfromgraveyard with canplayfromexile libraryeater for undead alchemist --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 26 ++++++++++++++-- .../bin/Res/sets/primitives/unsupported.txt | 31 +++---------------- projects/mtg/include/MTGAbility.h | 2 +- projects/mtg/include/MTGDefinitions.h | 3 +- projects/mtg/include/MTGRules.h | 2 +- projects/mtg/src/Damage.cpp | 28 +++++++++++++++++ projects/mtg/src/MTGDefinitions.cpp | 3 +- projects/mtg/src/MTGRules.cpp | 8 ++--- 8 files changed, 67 insertions(+), 36 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 2cd71814f..257c81f05 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -99087,11 +99087,10 @@ text=Syphon Soul deals 2 damage to each other player. You gain life equal to the mana={2}{B} type=Sorcery [/card] -#workaround szadek. [card] name=Szadek, Lord of Secrets +alias=89092 abilities=flying -auto=@combatdamaged(player) from(this):deplete:thatmuch opponent && life:thatmuch opponent && counter(1/1,thatmuch) text=Flying -- If Szadek, Lord of Secrets would deal combat damage to a player, instead put that many +1/+1 counters on Szadek and that player puts that many cards from the top of his or her library into his or her graveyard. mana={3}{U}{U}{B}{B} type=Legendary Creature @@ -100972,6 +100971,18 @@ mana={3}{p(U)} type=Sorcery [/card] [card] +name=Thada Adel, Acquisitor +abilities=islandwalk +auto=@combatdamagefoeof(player) from(this):name(exile artifact) notatarget(artifact|opponentlibrary) moveto(myexile) and!( transforms((,newability[canplayfromexile],newability[phaseactionmulti[endofturn once] moveto(ownerexile) all(this|exile)])) ueot)! +auto=@combatdamageof(player) from(this):name(exile artifact) notatarget(artifact|mylibrary) moveto(myexile) and!( transforms((,newability[canplayfromexile],newability[phaseactionmulti[endofturn once] moveto(ownerexile) all(this|exile)])) ueot)! +text=Islandwalk -- Whenever Thada Adel, Acquisitor deals combat damage to a player, search that player's library for an artifact card and exile it. Then that player shuffles his or her library. Until end of turn, you may play that card. +mana={1}{U}{U} +type=Legendary Creature +subtype=Merfolk Rogue +power=2 +toughness=2 +[/card] +[card] name=Thalakos Deceiver abilities=shadow auto=@combat(notblocked) source(this):may moveTo(myBattlefield) target(creature|opponentBattlefield) && sacrifice all(this) @@ -106105,6 +106116,17 @@ type=Enchantment subtype=Aura [/card] [card] +name=Undead Alchemist +auto=lord(zombie|mybattlefield) libraryeater +auto=@movedTo(creature|opponentgraveyard) from(opponentlibrary):all(trigger[to]) moveto(exile) and!(token(Zombie,Creature Zombie,2/2,black) controller)! +text=If a Zombie you control would deal combat damage to a player, instead that player puts that many cards from the top of his or her library into his or her graveyard. -- Whenever a creature card is put into an opponent's graveyard from his or her library, exile that card and put a 2/2 black Zombie creature token onto the battlefield. +mana={3}{U} +type=Creature +subtype=Zombie +power=4 +toughness=2 +[/card] +[card] name=Undead Executioner auto=@movedto(this|graveyard) from(battlefield):may target(creature) -2/-2 ueot text=When Undead Executioner dies, you may have target creature get -2/-2 until end of turn. diff --git a/projects/mtg/bin/Res/sets/primitives/unsupported.txt b/projects/mtg/bin/Res/sets/primitives/unsupported.txt index 77ec526d5..6338488fa 100644 --- a/projects/mtg/bin/Res/sets/primitives/unsupported.txt +++ b/projects/mtg/bin/Res/sets/primitives/unsupported.txt @@ -13490,6 +13490,7 @@ subtype=Elemental power=3 toughness=2 [/card] +#seems possible [card] name=Roiling Horror text=Roiling Horror's power and toughness are each equal to your life total minus the life total of an opponent with the most life. -- Suspend X - {X}{B}{B}{B}. X can't be 0. (Rather than cast this card from your hand, you may pay {X}{B}{B}{B} and exile it with X time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost. It has haste.) -- Whenever a time counter is removed from Roiling Horror while it's exiled, target player loses 1 life and you gain 1 life. @@ -13939,6 +13940,7 @@ subtype=Giant Warrior power=4 toughness=5 [/card] +#modded ingest [card] name=Scalpelexis text=Flying (This creature can't be blocked except by creatures with flying or reach.) -- Whenever Scalpelexis deals combat damage to a player, that player exiles the top four cards of his or her library. If two or more of those cards have the same name, repeat this process. @@ -14093,6 +14095,7 @@ text=Look at the top X cards of target opponent's library. Exile one of those ca mana={X}{U}{B} type=Sorcery [/card] +#moverandom? [card] name=Search for Survivors text=Reorder your graveyard at random. An opponent chooses a card at random in your graveyard. If it's a creature card, put it onto the battlefield. Otherwise, exile it. @@ -14480,6 +14483,7 @@ mana={3}{U} type=Instant subtype=Arcane [/card] +#phaseactionmulti? [card] name=Shifty Doppelganger text={3}{U}, Exile Shifty Doppelganger: You may put a creature card from your hand onto the battlefield. If you do, that creature gains haste until end of turn. At the beginning of the next end step, sacrifice that creature. If you do, return Shifty Doppelganger to the battlefield. @@ -14944,6 +14948,7 @@ type=Enchantment subtype=Aura text=Enchant creature Enchanted creature gets +1/+1 and has "Whenever this creature deals damage to an opponent, you may draw a card." Totem armor (If enchanted creature would be destroyed, instead remove all damage from it and destroy this Aura.) [/card] +#manaflashback rule [card] name=Snapcaster Mage abilities=flash @@ -16224,12 +16229,6 @@ type=Sorcery text=Put a 1/1 colorless Expansion-Symbol creature token into play for each different expansion symbol among permanents you control. [/card] [card] -name=Syncopate -text=Counter target spell unless its controller pays {X}. If that spell is countered this way, exile it instead of putting it into its owner's graveyard. -mana={X}{U} -type=Instant -[/card] -[card] name=Synod Artificer text={X}, {T}: Tap X target noncreature artifacts. -- {X}, {T}: Untap X target noncreature artifacts. mana={2}{U} @@ -16490,15 +16489,6 @@ type=Planeswalker subtype=Tezzeret [/card] [card] -name=Thada Adel, Acquisitor -text=Islandwalk -- Whenever Thada Adel, Acquisitor deals combat damage to a player, search that player's library for an artifact card and exile it. Then that player shuffles his or her library. Until end of turn, you may play that card. -mana={1}{U}{U} -type=Legendary Creature -subtype=Merfolk Rogue -power=2 -toughness=2 -[/card] -[card] name=Thalakos Dreamsower text=Shadow (This creature can block or be blocked by only creatures with shadow.) -- You may choose not to untap Thalakos Dreamsower during your untap step. -- Whenever Thalakos Dreamsower deals damage to an opponent, tap target creature. That creature doesn't untap during its controller's untap step for as long as Thalakos Dreamsower remains tapped. mana={2}{U} @@ -17284,17 +17274,6 @@ mana={2}{U} type=Sorcery [/card] [card] -name=Undead Alchemist -auto=@combatdamaged(player) from(zombie|mybattlefield):deplete:thatmuch opponent && life:thatmuch opponent -auto=@movedTo(creature|opponentgraveyard) from(opponentlibrary):token(Zombie,Creature Zombie,2/2,black) -text=If a Zombie you control would deal combat damage to a player, instead that player puts that many cards from the top of his or her library into his or her graveyard. -- Whenever a creature card is put into an opponent's graveyard from his or her library, exile that card and put a 2/2 black Zombie creature token onto the battlefield. -mana={3}{U} -type=Creature -subtype=Zombie -power=4 -toughness=2 -[/card] -[card] name=Undercity Informer text={1}, Sacrifice a creature: Target player reveals cards from the top of his or her library until he or she reveals a land card, then puts those cards into his or her graveyard. mana={2}{B} diff --git a/projects/mtg/include/MTGAbility.h b/projects/mtg/include/MTGAbility.h index 876bb97e2..af8cbbeee 100644 --- a/projects/mtg/include/MTGAbility.h +++ b/projects/mtg/include/MTGAbility.h @@ -213,7 +213,7 @@ public: COUNTERS = 30, PUT_INTO_PLAY_WITH_KICKER = 31, STANDARD_FIZZLER = 32, - CASTINGRAVEYARD_COST = 33, + CASTINGRAVEEXILE_COST = 33, }; }; diff --git a/projects/mtg/include/MTGDefinitions.h b/projects/mtg/include/MTGDefinitions.h index a3df629bc..c201679e4 100644 --- a/projects/mtg/include/MTGDefinitions.h +++ b/projects/mtg/include/MTGDefinitions.h @@ -237,7 +237,8 @@ class Constants PAYZERO = 119, TRINISPHERE = 120, CANPLAYFROMEXILE = 121, - NB_BASIC_ABILITIES = 122, + LIBRARYEATER = 122, + NB_BASIC_ABILITIES = 123, RARITY_S = 'S', //Special Rarity diff --git a/projects/mtg/include/MTGRules.h b/projects/mtg/include/MTGRules.h index 13be1c5b3..f99bdb7d4 100644 --- a/projects/mtg/include/MTGRules.h +++ b/projects/mtg/include/MTGRules.h @@ -184,7 +184,7 @@ public: MTGPlayFromGraveyardRule(GameObserver* observer, int _id); const string getMenuText() { - return "Cast Card From Graveyard"; + return "Cast Card From This Zone"; } virtual MTGPlayFromGraveyardRule * clone() const; }; diff --git a/projects/mtg/src/Damage.cpp b/projects/mtg/src/Damage.cpp index 3f6a329c9..3b677ff18 100644 --- a/projects/mtg/src/Damage.cpp +++ b/projects/mtg/src/Damage.cpp @@ -126,7 +126,35 @@ int Damage::resolve() } _target->doDamageTest = 1; } + if (target->type_as_damageable == Damageable::DAMAGEABLE_PLAYER) + { + if(source->has(Constants::LIBRARYEATER) && typeOfDamage == 1) + { + for (int j = damage; j > 0; j--) + { + if(((Player*)target)->game->library->nb_cards) + ((Player*)target)->game->putInZone(((Player*)target)->game->library->cards[((Player*)target)->game->library->nb_cards - 1], ((Player*)target)->game->library, ((Player*)target)->game->graveyard); + } + damage = 0; + } + if(source->alias == 89092 && typeOfDamage == 1)//Szadek Lord of Secrets + { + for (int j = damage; j > 0; j--) + { + if(((Player*)target)->game->library->nb_cards) + ((Player*)target)->game->putInZone(((Player*)target)->game->library->cards[((Player*)target)->game->library->nb_cards - 1], ((Player*)target)->game->library, ((Player*)target)->game->graveyard); + source->counters->addCounter(1, 1); + } + damage = 0; + } + if (!damage) + { + state = RESOLVED_NOK; + delete (e); + return 0; + } + } int a = damage; if (target->type_as_damageable == Damageable::DAMAGEABLE_MTGCARDINSTANCE && (source->has(Constants::WITHER) || source->has( diff --git a/projects/mtg/src/MTGDefinitions.cpp b/projects/mtg/src/MTGDefinitions.cpp index dbeaca32d..a1645eb0a 100644 --- a/projects/mtg/src/MTGDefinitions.cpp +++ b/projects/mtg/src/MTGDefinitions.cpp @@ -150,7 +150,8 @@ const char* Constants::MTGBasicAbilities[] = { "oppgcreatureexiler", "payzero", "trinisphere", - "canplayfromexile" + "canplayfromexile", + "libraryeater" }; map Constants::MTGBasicAbilitiesMap; diff --git a/projects/mtg/src/MTGRules.cpp b/projects/mtg/src/MTGRules.cpp index f1b14a941..bb62985fd 100644 --- a/projects/mtg/src/MTGRules.cpp +++ b/projects/mtg/src/MTGRules.cpp @@ -1132,7 +1132,7 @@ MTGMorphCostRule * MTGMorphCostRule::clone() const MTGPlayFromGraveyardRule::MTGPlayFromGraveyardRule(GameObserver* observer, int _id) : MTGAlternativeCostRule(observer, _id) { - aType = MTGAbility::CASTINGRAVEYARD_COST; + aType = MTGAbility::CASTINGRAVEEXILE_COST; } int MTGPlayFromGraveyardRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana) @@ -1140,9 +1140,9 @@ int MTGPlayFromGraveyardRule::isReactingToClick(MTGCardInstance * card, ManaCost Player * player = game->currentlyActing(); ManaCost * cost = card->getManaCost(); - if (!player->game->graveyard->hasCard(card)) + if (!player->game->graveyard->hasCard(card) && !player->game->exile->hasCard(card)) return 0; - if (!card->has(Constants::CANPLAYFROMGRAVEYARD)) + if ((!card->has(Constants::CANPLAYFROMGRAVEYARD) && player->game->graveyard->hasCard(card))||(!card->has(Constants::CANPLAYFROMEXILE) && player->game->exile->hasCard(card))) return 0; return MTGAlternativeCostRule::isReactingToClick(card, mana, cost); @@ -1155,7 +1155,7 @@ int MTGPlayFromGraveyardRule::reactToClick(MTGCardInstance * card) ManaCost * cost = card->getManaCost(); - card->paymenttype = MTGAbility::CASTINGRAVEYARD_COST; + card->paymenttype = MTGAbility::CASTINGRAVEEXILE_COST; return MTGAlternativeCostRule::reactToClick(card, cost, ManaCost::MANA_PAID_WITH_OTHERCOST); } From 536a0e429a887afbdbb22b0d8e63fdafedfb152d Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 5 Nov 2015 07:17:58 +0800 Subject: [PATCH 239/249] AI considers playing from exile and graveyard --- projects/mtg/src/AIPlayerBaka.cpp | 304 ++++++++++++++++++++++++++++++ projects/mtg/src/GameObserver.cpp | 2 +- projects/mtg/src/MTGAbility.cpp | 3 - 3 files changed, 305 insertions(+), 4 deletions(-) diff --git a/projects/mtg/src/AIPlayerBaka.cpp b/projects/mtg/src/AIPlayerBaka.cpp index d75616eaf..4c54c565d 100644 --- a/projects/mtg/src/AIPlayerBaka.cpp +++ b/projects/mtg/src/AIPlayerBaka.cpp @@ -627,6 +627,14 @@ int OrderedAIAction::getEfficiency() { efficiency += 65; } + else if (dynamic_cast(a)) + { + efficiency += 55; + } + else if (dynamic_cast(a)) + { + efficiency += 45; + } SAFE_DELETE(transAbility); return efficiency; } @@ -1726,6 +1734,302 @@ MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * pMana, const char * ty cd.setType(type); card = NULL; gotPayments = vector(); + //canplayfromgraveyard + while ((card = cd.nextmatch(game->graveyard, card))&& card->has(Constants::CANPLAYFROMGRAVEYARD)) + { + if (!CanHandleCost(card->getManaCost(),card)) + continue; + + if (card->hasType(Subtypes::TYPE_LAND)) + { + if (game->playRestrictions->canPutIntoZone(card, game->inPlay) == PlayRestriction::CANT_PLAY) + continue; + } + else + { + if (game->playRestrictions->canPutIntoZone(card, game->stack) == PlayRestriction::CANT_PLAY) + continue; + } + + if (card->hasType(Subtypes::TYPE_LEGENDARY) && game->inPlay->findByName(card->name)) + continue; + + if (card->hasType(Subtypes::TYPE_PLANESWALKER) && card->types.size() > 0 && game->inPlay->hasTypeSpecificInt(Subtypes::TYPE_PLANESWALKER,card->types[1])) + continue; + + if(hints && hints->HintSaysItsForCombo(observer,card)) + { + if(hints->canWeCombo(observer,card,this)) + { + AbilityFactory af(observer); + int canPlay = af.parseCastRestrictions(card,card->controller(),card->getRestrictions()); + if(!canPlay) + continue; + nextCardToPlay = card; + gotPayments.clear(); + if((!pMana->canAfford(nextCardToPlay->getManaCost()) || nextCardToPlay->getManaCost()->getKicker())) + gotPayments = canPayMana(nextCardToPlay,nextCardToPlay->getManaCost()); + return activateCombo(); + } + else + { + nextCardToPlay = NULL; + continue; + } + } + int currentCost = card->getManaCost()->getConvertedCost(); + int hasX = card->getManaCost()->hasX(); + gotPayments.clear(); + if((!pMana->canAfford(card->getManaCost()) || card->getManaCost()->getKicker())) + gotPayments = canPayMana(card,card->getManaCost()); + //for preformence reason we only look for specific mana if the payment couldn't be made with pmana. + if ((currentCost > maxCost || hasX) && (gotPayments.size() || pMana->canAfford(card->getManaCost()))) + { + TargetChooserFactory tcf(observer); + TargetChooser * tc = tcf.createTargetChooser(card); + int shouldPlayPercentage = 0; + if (tc) + { + int hasTarget = chooseTarget(tc,NULL,NULL,true); + if( + (tc->maxtargets > hasTarget && tc->maxtargets > 1 && !tc->targetMin && tc->maxtargets != TargetChooser::UNLITMITED_TARGETS) ||//target=<3>creature + (tc->maxtargets == TargetChooser::UNLITMITED_TARGETS && hasTarget < 1)//target=creatures + ) + hasTarget = 0; + if (!hasTarget)//single target covered here. + { + SAFE_DELETE(tc); + continue; + } + shouldPlayPercentage = 90; + if(tc->targetMin && hasTarget < tc->maxtargets) + shouldPlayPercentage = 0; + if(tc->maxtargets > 1 && tc->maxtargets != TargetChooser::UNLITMITED_TARGETS && hasTarget <= tc->maxtargets) + { + int maxA = hasTarget-tc->maxtargets; + shouldPlayPercentage += (10*maxA);//reduce the chances of playing multitarget if we are not above max targets. + } + if(tc->maxtargets == TargetChooser::UNLITMITED_TARGETS) + { + shouldPlayPercentage = 40 + (10*hasTarget); + int totalCost = pMana->getConvertedCost()-currentCost; + int totalTargets = hasTarget+hasTarget; + if(hasX && totalCost <= totalTargets)// {x} spell with unlimited targeting tend to divide damage, we want atleast 1 damage per target before casting. + { + shouldPlayPercentage = 0; + } + } + SAFE_DELETE(tc); + } + else + { + int shouldPlay = effectBadOrGood(card); + if (shouldPlay == BAKA_EFFECT_GOOD) + { + shouldPlayPercentage = 90; + } + else if (BAKA_EFFECT_DONTKNOW == shouldPlay) + { + //previously shouldPlayPercentage = 80;, I found this a little to high + //for cards which AI had no idea how to use. + shouldPlayPercentage = 60; + } + else if (card->isLand()) + { + shouldPlayPercentage = 90; + } + else + { + // shouldPlay == baka_effect_bad giving it a 1 for odd ball lottery chance. + shouldPlayPercentage = 1; + } + + } + //Reduce the chances of playing a spell with X cost if available mana is low + if (hasX) + { + int xDiff = pMana->getConvertedCost() - currentCost; + if (xDiff < 0) + xDiff = 0; + shouldPlayPercentage = shouldPlayPercentage - static_cast ((shouldPlayPercentage * 1.9f) / (1 + xDiff)); + } + if(card->getManaCost() && card->getManaCost()->getKicker() && card->getManaCost()->getKicker()->isMulti) + { + shouldPlayPercentage = 10* size_t(gotPayments.size())/int(1+(card->getManaCost()->getConvertedCost()+card->getManaCost()->getKicker()->getConvertedCost())); + if(shouldPlayPercentage <= 10) + shouldPlayPercentage = shouldPlayPercentage/3; + } + DebugTrace("Should I play " << (card ? card->name : "Nothing" ) << "?" << endl + <<"shouldPlayPercentage = "<< shouldPlayPercentage); + if(card->getRestrictions().size()) + { + AbilityFactory af(observer); + int canPlay = af.parseCastRestrictions(card,card->controller(),card->getRestrictions()); + if(!canPlay) + continue; + } + int randomChance = randomGenerator.random(); + int chance = randomChance % 100; + if (chance > shouldPlayPercentage) + continue; + if(shouldPlayPercentage <= 10) + { + DebugTrace("shouldPlayPercentage was less than 10 this was a lottery roll on RNG"); + } + nextCardToPlay = card; + maxCost = currentCost; + if (hasX) + maxCost = pMana->getConvertedCost(); + } + } + //canplayfromexile + while ((card = cd.nextmatch(game->exile, card))&& card->has(Constants::CANPLAYFROMEXILE)) + { + if (!CanHandleCost(card->getManaCost(),card)) + continue; + + if (card->hasType(Subtypes::TYPE_LAND)) + { + if (game->playRestrictions->canPutIntoZone(card, game->inPlay) == PlayRestriction::CANT_PLAY) + continue; + } + else + { + if (game->playRestrictions->canPutIntoZone(card, game->stack) == PlayRestriction::CANT_PLAY) + continue; + } + + if (card->hasType(Subtypes::TYPE_LEGENDARY) && game->inPlay->findByName(card->name)) + continue; + + if (card->hasType(Subtypes::TYPE_PLANESWALKER) && card->types.size() > 0 && game->inPlay->hasTypeSpecificInt(Subtypes::TYPE_PLANESWALKER,card->types[1])) + continue; + + if(hints && hints->HintSaysItsForCombo(observer,card)) + { + if(hints->canWeCombo(observer,card,this)) + { + AbilityFactory af(observer); + int canPlay = af.parseCastRestrictions(card,card->controller(),card->getRestrictions()); + if(!canPlay) + continue; + nextCardToPlay = card; + gotPayments.clear(); + if((!pMana->canAfford(nextCardToPlay->getManaCost()) || nextCardToPlay->getManaCost()->getKicker())) + gotPayments = canPayMana(nextCardToPlay,nextCardToPlay->getManaCost()); + return activateCombo(); + } + else + { + nextCardToPlay = NULL; + continue; + } + } + int currentCost = card->getManaCost()->getConvertedCost(); + int hasX = card->getManaCost()->hasX(); + gotPayments.clear(); + if((!pMana->canAfford(card->getManaCost()) || card->getManaCost()->getKicker())) + gotPayments = canPayMana(card,card->getManaCost()); + //for preformence reason we only look for specific mana if the payment couldn't be made with pmana. + if ((currentCost > maxCost || hasX) && (gotPayments.size() || pMana->canAfford(card->getManaCost()))) + { + TargetChooserFactory tcf(observer); + TargetChooser * tc = tcf.createTargetChooser(card); + int shouldPlayPercentage = 0; + if (tc) + { + int hasTarget = chooseTarget(tc,NULL,NULL,true); + if( + (tc->maxtargets > hasTarget && tc->maxtargets > 1 && !tc->targetMin && tc->maxtargets != TargetChooser::UNLITMITED_TARGETS) ||//target=<3>creature + (tc->maxtargets == TargetChooser::UNLITMITED_TARGETS && hasTarget < 1)//target=creatures + ) + hasTarget = 0; + if (!hasTarget)//single target covered here. + { + SAFE_DELETE(tc); + continue; + } + shouldPlayPercentage = 90; + if(tc->targetMin && hasTarget < tc->maxtargets) + shouldPlayPercentage = 0; + if(tc->maxtargets > 1 && tc->maxtargets != TargetChooser::UNLITMITED_TARGETS && hasTarget <= tc->maxtargets) + { + int maxA = hasTarget-tc->maxtargets; + shouldPlayPercentage += (10*maxA);//reduce the chances of playing multitarget if we are not above max targets. + } + if(tc->maxtargets == TargetChooser::UNLITMITED_TARGETS) + { + shouldPlayPercentage = 40 + (10*hasTarget); + int totalCost = pMana->getConvertedCost()-currentCost; + int totalTargets = hasTarget+hasTarget; + if(hasX && totalCost <= totalTargets)// {x} spell with unlimited targeting tend to divide damage, we want atleast 1 damage per target before casting. + { + shouldPlayPercentage = 0; + } + } + SAFE_DELETE(tc); + } + else + { + int shouldPlay = effectBadOrGood(card); + if (shouldPlay == BAKA_EFFECT_GOOD) + { + shouldPlayPercentage = 90; + } + else if (BAKA_EFFECT_DONTKNOW == shouldPlay) + { + //previously shouldPlayPercentage = 80;, I found this a little to high + //for cards which AI had no idea how to use. + shouldPlayPercentage = 60; + } + else if (card->isLand()) + { + shouldPlayPercentage = 90; + } + else + { + // shouldPlay == baka_effect_bad giving it a 1 for odd ball lottery chance. + shouldPlayPercentage = 1; + } + + } + //Reduce the chances of playing a spell with X cost if available mana is low + if (hasX) + { + int xDiff = pMana->getConvertedCost() - currentCost; + if (xDiff < 0) + xDiff = 0; + shouldPlayPercentage = shouldPlayPercentage - static_cast ((shouldPlayPercentage * 1.9f) / (1 + xDiff)); + } + if(card->getManaCost() && card->getManaCost()->getKicker() && card->getManaCost()->getKicker()->isMulti) + { + shouldPlayPercentage = 10* size_t(gotPayments.size())/int(1+(card->getManaCost()->getConvertedCost()+card->getManaCost()->getKicker()->getConvertedCost())); + if(shouldPlayPercentage <= 10) + shouldPlayPercentage = shouldPlayPercentage/3; + } + DebugTrace("Should I play " << (card ? card->name : "Nothing" ) << "?" << endl + <<"shouldPlayPercentage = "<< shouldPlayPercentage); + if(card->getRestrictions().size()) + { + AbilityFactory af(observer); + int canPlay = af.parseCastRestrictions(card,card->controller(),card->getRestrictions()); + if(!canPlay) + continue; + } + int randomChance = randomGenerator.random(); + int chance = randomChance % 100; + if (chance > shouldPlayPercentage) + continue; + if(shouldPlayPercentage <= 10) + { + DebugTrace("shouldPlayPercentage was less than 10 this was a lottery roll on RNG"); + } + nextCardToPlay = card; + maxCost = currentCost; + if (hasX) + maxCost = pMana->getConvertedCost(); + } + } while ((card = cd.nextmatch(game->hand, card))) { if (!CanHandleCost(card->getManaCost(),card)) diff --git a/projects/mtg/src/GameObserver.cpp b/projects/mtg/src/GameObserver.cpp index 03bf15211..2731b2429 100644 --- a/projects/mtg/src/GameObserver.cpp +++ b/projects/mtg/src/GameObserver.cpp @@ -1156,7 +1156,7 @@ void GameObserver::Affinity() card->getManaCost()->remove(color,1); } } - //SAFE_DELETE(original); + SAFE_DELETE(original); }//end } } diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index 44c40898d..6b157fb32 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -3689,9 +3689,6 @@ int AbilityFactory::abilityEfficiency(MTGAbility * a, Player * p, int mode, Targ badAbilities[(int)Constants::WEAK] = true; badAbilities[(int)Constants::NOLIFEGAIN] = true; badAbilities[(int)Constants::NOLIFEGAINOPPONENT] = true; - badAbilities[(int)Constants::CANTLOSE] = false; - badAbilities[(int)Constants::CANTLIFELOSE] = false; - badAbilities[(int)Constants::CANTMILLLOSE] = false; if (AInstantBasicAbilityModifierUntilEOT * abi = dynamic_cast(a)) { From 1c8852a7a255eb7667a83e287f62b563e6be01de Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 5 Nov 2015 23:25:39 +0800 Subject: [PATCH 240/249] Manacost Changes todo: kicker (other possible additional costs?) and change rule keyword to payzerorule... --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 2 +- projects/mtg/include/MTGCardInstance.h | 19 +---- projects/mtg/include/MTGRules.h | 11 ++- projects/mtg/src/AIPlayerBaka.cpp | 2 +- projects/mtg/src/MTGAbility.cpp | 2 +- projects/mtg/src/MTGCardInstance.cpp | 19 +++++ projects/mtg/src/MTGDefinitions.cpp | 2 +- projects/mtg/src/MTGRules.cpp | 83 +++++++++++++------- 8 files changed, 86 insertions(+), 54 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 257c81f05..16080c3b0 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -41603,7 +41603,7 @@ toughness=3 [card] name=Gravecrawler abilities=cantblock -autograveyard=aslongas(zombie|myBattlefield) transforms((,newability[CanPlayFromGraveyard])) +autograveyard=aslongas(zombie|myBattlefield) CanPlayFromGraveyard text=Gravecrawler can't block. -- You may cast Gravecrawler from your graveyard as long as you control a Zombie. mana={B} type=Creature diff --git a/projects/mtg/include/MTGCardInstance.h b/projects/mtg/include/MTGCardInstance.h index 9eb7a64da..8c1882e91 100644 --- a/projects/mtg/include/MTGCardInstance.h +++ b/projects/mtg/include/MTGCardInstance.h @@ -254,24 +254,7 @@ public: bool isTargetter(); int cardistargetter; int myconvertedcost; - ManaCost * computeNewCost(MTGCardInstance * card,ManaCost * oldCost) - { - if(card->isLand()) - return oldCost; - - if(!card) - return NULL; - //i don't know why this method doesn't affect cards in hand, but is working on other zones....// - //pay zero costs// - //kicker???...// - //morph cost todo// - //trinisphere must be here below// - if(card->has(Constants::TRINISPHERE)) - for(int jj = oldCost->getConvertedCost(); jj < 3; jj++) - oldCost->add(Constants::MTG_COLOR_ARTIFACT, 1); - - return oldCost; - }; + ManaCost * computeNewCost(MTGCardInstance * card,ManaCost * oldCost); void eventattacked(); void eventattackedAlone(); diff --git a/projects/mtg/include/MTGRules.h b/projects/mtg/include/MTGRules.h index f99bdb7d4..f617f556a 100644 --- a/projects/mtg/include/MTGRules.h +++ b/projects/mtg/include/MTGRules.h @@ -175,18 +175,21 @@ public: virtual MTGMorphCostRule * clone() const; }; -class MTGPlayFromGraveyardRule: public MTGAlternativeCostRule +class MTGPayZeroRule: public MTGAlternativeCostRule { public: int isReactingToClick(MTGCardInstance * card, ManaCost * mana = NULL); int reactToClick(MTGCardInstance * card); + string CustomName; virtual ostream& toString(ostream& out) const; - MTGPlayFromGraveyardRule(GameObserver* observer, int _id); + MTGPayZeroRule(GameObserver* observer, int _id); const string getMenuText() { - return "Cast Card From This Zone"; + if(CustomName.size()) + return CustomName.c_str(); + return "Pay Zero To Cast"; } - virtual MTGPlayFromGraveyardRule * clone() const; + virtual MTGPayZeroRule * clone() const; }; diff --git a/projects/mtg/src/AIPlayerBaka.cpp b/projects/mtg/src/AIPlayerBaka.cpp index 4c54c565d..e0d269e69 100644 --- a/projects/mtg/src/AIPlayerBaka.cpp +++ b/projects/mtg/src/AIPlayerBaka.cpp @@ -631,7 +631,7 @@ int OrderedAIAction::getEfficiency() { efficiency += 55; } - else if (dynamic_cast(a)) + else if (dynamic_cast(a)) { efficiency += 45; } diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index 6b157fb32..10e9d30cc 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -1159,7 +1159,7 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG found = s.find("playfromgraveyardrule"); if(found != string::npos) { - observer->addObserver(NEW MTGPlayFromGraveyardRule(observer, -1)); + observer->addObserver(NEW MTGPayZeroRule(observer, -1)); return NULL; } //this rule handles attacking ability during attacker phase diff --git a/projects/mtg/src/MTGCardInstance.cpp b/projects/mtg/src/MTGCardInstance.cpp index a70ef93b6..a56247912 100644 --- a/projects/mtg/src/MTGCardInstance.cpp +++ b/projects/mtg/src/MTGCardInstance.cpp @@ -918,6 +918,25 @@ JQuadPtr MTGCardInstance::getIcon() return WResourceManager::Instance()->RetrieveCard(this, CACHE_THUMB); } +ManaCost * MTGCardInstance::computeNewCost(MTGCardInstance * card,ManaCost * oldCost) +{ + if(card->isLand()) + return oldCost; + + if(!card) + return oldCost; + //use forcedalive// + //pay zero costs// + //kicker???...// + //morph cost todo// + //trinisphere must be here below// + if(card->has(Constants::TRINISPHERE)) + for(int jj = oldCost->getConvertedCost(); jj < 3; jj++) + oldCost->add(Constants::MTG_COLOR_ARTIFACT, 1); + + return oldCost; +} + MTGCardInstance * MTGCardInstance::getNextPartner() { MTGInPlay * inplay = controller()->game->inPlay; diff --git a/projects/mtg/src/MTGDefinitions.cpp b/projects/mtg/src/MTGDefinitions.cpp index a1645eb0a..7728bd1d2 100644 --- a/projects/mtg/src/MTGDefinitions.cpp +++ b/projects/mtg/src/MTGDefinitions.cpp @@ -148,7 +148,7 @@ const char* Constants::MTGBasicAbilities[] = { "protectionfromcoloredspells", "mygcreatureexiler", "oppgcreatureexiler", - "payzero", + "zerocast", "trinisphere", "canplayfromexile", "libraryeater" diff --git a/projects/mtg/src/MTGRules.cpp b/projects/mtg/src/MTGRules.cpp index bb62985fd..03b6dc136 100644 --- a/projects/mtg/src/MTGRules.cpp +++ b/projects/mtg/src/MTGRules.cpp @@ -284,8 +284,10 @@ int MTGPutInPlayRule::isReactingToClick(MTGCardInstance * card, ManaCost *) { int cardsinhand = game->players[0]->game->hand->nb_cards; Player * player = game->currentlyActing(); - if (!player->game->hand->hasCard(card)) - return 0; + if (!player->game->hand->hasCard(card) && !player->game->graveyard->hasCard(card) && !player->game->exile->hasCard(card)) + return 0; + if ((player->game->graveyard->hasCard(card) && !card->has(Constants::CANPLAYFROMGRAVEYARD)) || (player->game->exile->hasCard(card) && !card->has(Constants::CANPLAYFROMEXILE))) + return 0; if ((game->turn < 1) && (cardsinhand != 0) && (card->basicAbilities[(int)Constants::LEYLINE]) && game->getCurrentGamePhase() == MTG_PHASE_FIRSTMAIN && game->players[0]->game->graveyard->nb_cards == 0 @@ -295,7 +297,7 @@ int MTGPutInPlayRule::isReactingToClick(MTGCardInstance * card, ManaCost *) if (card->basicAbilities[(int)Constants::LEYLINE]) { - MTGCardInstance * copy = player->game->putInZone(card, player->game->hand, player->game->temp); + MTGCardInstance * copy = player->game->putInZone(card, card->currentZone, player->game->temp); Spell * spell = NEW Spell(game, copy); spell->resolve(); delete spell; @@ -412,7 +414,7 @@ int MTGPutInPlayRule::reactToClick(MTGCardInstance * card) delete previousManaPool; if (card->isLand()) { - MTGCardInstance * copy = player->game->putInZone(card, player->game->hand, player->game->temp); + MTGCardInstance * copy = player->game->putInZone(card, card->currentZone, player->game->temp); Spell * spell = NEW Spell(game, 0,copy,NULL,NULL, payResult); spell->resolve(); delete spellCost; @@ -421,7 +423,7 @@ int MTGPutInPlayRule::reactToClick(MTGCardInstance * card) else { Spell * spell = NULL; - MTGCardInstance * copy = player->game->putInZone(card, player->game->hand, player->game->stack); + MTGCardInstance * copy = player->game->putInZone(card, card->currentZone, player->game->stack); if (game->targetChooser) { spell = game->mLayers->stackLayer()->addSpell(copy, game->targetChooser, spellCost, payResult, 0); @@ -475,8 +477,10 @@ int MTGKickerRule::isReactingToClick(MTGCardInstance * card, ManaCost *) if(OptionKicker::KICKER_ALWAYS == options[Options::KICKERPAYMENT].number) return 0; Player * player = game->currentlyActing(); - if(!player->game->hand->hasCard(card)) - return 0; + if (!player->game->hand->hasCard(card) && !player->game->graveyard->hasCard(card) && !player->game->exile->hasCard(card)) + return 0; + if ((player->game->graveyard->hasCard(card) && !card->has(Constants::CANPLAYFROMGRAVEYARD)) || (player->game->exile->hasCard(card) && !card->has(Constants::CANPLAYFROMEXILE))) + return 0; ManaCost * kicker = card->getManaCost()->getKicker(); if(!kicker) { @@ -484,7 +488,7 @@ int MTGKickerRule::isReactingToClick(MTGCardInstance * card, ManaCost *) return 0; } ManaCost * playerMana = player->getManaPool(); - ManaCost * withKickerCost= NEW ManaCost(card->getManaCost()); + ManaCost * withKickerCost= NEW ManaCost(card->model->data->getManaCost()); withKickerCost->add(withKickerCost->getKicker()); if(!playerMana->canAfford(withKickerCost)) { @@ -503,7 +507,7 @@ int MTGKickerRule::reactToClick(MTGCardInstance * card) return 0; Player * player = game->currentlyActing(); - ManaCost * withKickerCost= NEW ManaCost(card->getManaCost());//using pointers here alters the real cost of the card. + ManaCost * withKickerCost= NEW ManaCost(card->model->data->getManaCost());//using pointers here alters the real cost of the card. if (card->getManaCost()->getKicker()->isMulti) { while(player->getManaPool()->canAfford(withKickerCost)) @@ -545,7 +549,7 @@ int MTGKickerRule::reactToClick(MTGCardInstance * card) delete previousManaPool; if (card->isLand()) { - MTGCardInstance * copy = player->game->putInZone(card, player->game->hand, player->game->temp); + MTGCardInstance * copy = player->game->putInZone(card, card->currentZone, player->game->temp); Spell * spell = NEW Spell(game, 0,copy,NULL,NULL, ManaCost::MANA_PAID_WITH_KICKER); spell->resolve(); delete spellCost; @@ -554,7 +558,7 @@ int MTGKickerRule::reactToClick(MTGCardInstance * card) else { Spell * spell = NULL; - MTGCardInstance * copy = player->game->putInZone(card, player->game->hand, player->game->stack); + MTGCardInstance * copy = player->game->putInZone(card, card->currentZone, player->game->stack); if (game->targetChooser) { spell = game->mLayers->stackLayer()->addSpell(copy, game->targetChooser, spellCost, ManaCost::MANA_PAID_WITH_KICKER, 0); @@ -616,7 +620,9 @@ PermanentAbility(observer, _id) int MTGAlternativeCostRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana) { ManaCost * alternateCost = card->getManaCost()->getAlternative(); - if (!game->currentlyActing()->game->hand->hasCard(card)) + if (!game->currentlyActing()->game->hand->hasCard(card) && !game->currentlyActing()->game->graveyard->hasCard(card) && !game->currentlyActing()->game->exile->hasCard(card)) + return 0; + if ((game->currentlyActing()->game->graveyard->hasCard(card) && !card->has(Constants::CANPLAYFROMGRAVEYARD)) || (game->currentlyActing()->game->exile->hasCard(card) && !card->has(Constants::CANPLAYFROMEXILE))) return 0; return isReactingToClick( card, mana, alternateCost ); } @@ -630,7 +636,12 @@ int MTGAlternativeCostRule::isReactingToClick(MTGCardInstance * card, ManaCost * if(!allowedToAltCast(card,player)) return 0; - if(card->model->data->getManaCost()->getAlternative() && card->model->data->getManaCost()->getAlternative()->alternativeName.size()) + + if(card->has(Constants::CANPLAYFROMGRAVEYARD)) + alternativeName = "Alternate Cast Card From Graveyard"; + else if(card->has(Constants::CANPLAYFROMEXILE)) + alternativeName = "Alternate Cast Card From Exile"; + else if(card->model->data->getManaCost()->getAlternative() && card->model->data->getManaCost()->getAlternative()->alternativeName.size()) alternativeName = card->model->data->getManaCost()->getAlternative()->alternativeName; if (card->isLand()) @@ -763,8 +774,10 @@ MTGAlternativeCostRule(observer, _id) int MTGBuyBackRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana) { Player * player = game->currentlyActing(); - if (!player->game->hand->hasCard(card)) - return 0; + if (!player->game->hand->hasCard(card) && !player->game->graveyard->hasCard(card) && !player->game->exile->hasCard(card)) + return 0; + if ((player->game->graveyard->hasCard(card) && !card->has(Constants::CANPLAYFROMGRAVEYARD)) || (player->game->exile->hasCard(card) && !card->has(Constants::CANPLAYFROMEXILE))) + return 0; if(!allowedToCast(card,player)) return 0; return MTGAlternativeCostRule::isReactingToClick( card, mana, card->getManaCost()->getBuyback() ); @@ -1129,46 +1142,60 @@ MTGMorphCostRule * MTGMorphCostRule::clone() const //------------------------------------------------------------------------- //------------------------------------------------------------------------- -MTGPlayFromGraveyardRule::MTGPlayFromGraveyardRule(GameObserver* observer, int _id) : +MTGPayZeroRule::MTGPayZeroRule(GameObserver* observer, int _id) : MTGAlternativeCostRule(observer, _id) { aType = MTGAbility::CASTINGRAVEEXILE_COST; } -int MTGPlayFromGraveyardRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana) +int MTGPayZeroRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana) { Player * player = game->currentlyActing(); - ManaCost * cost = card->getManaCost(); + ManaCost * cost = NEW ManaCost(ManaCost::parseManaCost("{0}",NULL,NULL)); + if(card->getIncreasedManaCost()->getConvertedCost()) + cost->add(card->getIncreasedManaCost()); + if(card->getReducedManaCost()->getConvertedCost()) + cost->remove(card->getReducedManaCost()); - if (!player->game->graveyard->hasCard(card) && !player->game->exile->hasCard(card)) + if(card->isLand()) + return 0; + if(!card->has(Constants::PAYZERO)) + return 0; + if (!player->game->graveyard->hasCard(card) && !player->game->exile->hasCard(card) && !player->game->hand->hasCard(card)) return 0; if ((!card->has(Constants::CANPLAYFROMGRAVEYARD) && player->game->graveyard->hasCard(card))||(!card->has(Constants::CANPLAYFROMEXILE) && player->game->exile->hasCard(card))) return 0; - + if(card->has(Constants::CANPLAYFROMGRAVEYARD)) + CustomName = "Pay Zero To Cast From Graveyard"; + else if(card->has(Constants::CANPLAYFROMEXILE)) + CustomName = "Pay Zero To Cast From Exile"; + else + CustomName = "Pay Zero To Cast"; + return MTGAlternativeCostRule::isReactingToClick(card, mana, cost); } -int MTGPlayFromGraveyardRule::reactToClick(MTGCardInstance * card) +int MTGPayZeroRule::reactToClick(MTGCardInstance * card) { if (!isReactingToClick(card)) return 0; - ManaCost * cost = card->getManaCost(); + ManaCost * cost = NEW ManaCost(ManaCost::parseManaCost("{0}",NULL,NULL)); card->paymenttype = MTGAbility::CASTINGRAVEEXILE_COST; - return MTGAlternativeCostRule::reactToClick(card, cost, ManaCost::MANA_PAID_WITH_OTHERCOST); + return MTGAlternativeCostRule::reactToClick(card, cost, ManaCost::MANA_PAID); } -ostream& MTGPlayFromGraveyardRule::toString(ostream& out) const +ostream& MTGPayZeroRule::toString(ostream& out) const { - out << "MTGPlayFromGraveyardRule ::: ("; + out << "MTGPayZeroRule ::: ("; return MTGAbility::toString(out) << ")"; } -MTGPlayFromGraveyardRule * MTGPlayFromGraveyardRule::clone() const +MTGPayZeroRule * MTGPayZeroRule::clone() const { - return NEW MTGPlayFromGraveyardRule(*this); + return NEW MTGPayZeroRule(*this); } /////////////////////////////////////////////////////////////////////////////////////////////////// @@ -1718,7 +1745,7 @@ int MTGMomirRule::reactToClick(MTGCardInstance * card_to_discard, int cardId) ManaCost * cost = player->getManaPool(); player->getManaPool()->pay(cost); MTGCardInstance * card = genCreature(cardId); - player->game->putInZone(card_to_discard, player->game->hand, player->game->graveyard); + player->game->putInZone(card_to_discard, card_to_discard->currentZone, player->game->graveyard); player->game->stack->addCard(card); Spell * spell = NEW Spell(game, card); From 71390046f5aea64f667284b03dd2b997f528184a Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Fri, 6 Nov 2015 19:47:30 +0800 Subject: [PATCH 241/249] anyzone for cdaactive should handle most of them except sewer nemesis, chameleon colossus --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 180 +++++++++---------- projects/mtg/src/MTGAbility.cpp | 8 +- projects/mtg/src/MTGDeck.cpp | 10 ++ 3 files changed, 106 insertions(+), 92 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 16080c3b0..e33f7dbf8 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -2,7 +2,7 @@ #Please keep these card alphabetized, and try to have the "name=" line at the top of each card [card] name=Aeon Chronicler -auto=phandcount/phandcount cdaactive +anyzone=phandcount/phandcount cdaactive autoexile=@counterremoved(0/0,1,Time) from(sourcecard) suspended:draw:1 suspend(0)={X}{3}{U} text=Aeon Chronicler's power and toughness are each equal to the number of cards in your hand. -- Suspend X - {X}{3}{U}. X can't be 0. (Rather than cast this card from your hand, you may pay {X}{3}{U} and exile it with X time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost. It has haste.) -- Whenever a time counter is removed from Aeon Chronicler while it's exiled, draw a card. @@ -878,7 +878,7 @@ type=Instant [/card] [card] name=Adamaro, First to Desire -auto=type:*:opponenthand/type:*:opponenthand cdaactive +anyzone=type:*:opponenthand/type:*:opponenthand cdaactive text=Adamaro, First to Desire's power and toughness are each equal to the number of cards in the hand of the opponent with the most cards in hand. mana={1}{R}{R} type=Legendary Creature @@ -1493,7 +1493,7 @@ subtype=Ajani [/card] [card] name=Avatar Token -auto=lifetotal/lifetotal cdaactive +anyzone=lifetotal/lifetotal cdaactive type=Creature subtype=Avatar power=* @@ -2351,7 +2351,7 @@ toughness=1 [card] name=Altar Golem abilities=trample,doesnotuntap -auto=type:creature:battlefield/type:creature:battlefield cdaactive +anyzone=type:creature:battlefield/type:creature:battlefield cdaactive auto={T(creature|myBattlefield)}{T(creature|myBattlefield)}{T(creature|myBattlefield)}{T(creature|myBattlefield)}{T(creature|myBattlefield)}:untap text=Trample -- Altar Golem's power and toughness are each equal to the number of creatures on the battlefield. -- Altar Golem doesn't untap during your untap step. -- Tap five untapped creatures you control: Untap Altar Golem. mana={7} @@ -2937,7 +2937,7 @@ toughness=3 [/card] [card] name=Ancient Ooze -auto=pancientooze/pancientooze cdaactive +anyzone=pancientooze/pancientooze cdaactive text=Ancient Ooze's power and toughness are each equal to the total converted mana cost of other creatures you control. mana={5}{G}{G} type=Creature @@ -8068,7 +8068,7 @@ toughness=2 [card] name=Battle Squadron abilities=flying -auto=type:creature:myBattlefield/type:creature:myBattlefield cdaactive +anyzone=type:creature:myBattlefield/type:creature:myBattlefield cdaactive text=Flying -- Battle Squadron's power and toughness are each equal to the number of creatures you control. mana={3}{R}{R} type=Creature @@ -8381,7 +8381,7 @@ type=Enchantment [/card] [card] name=Beast of Burden -auto=type:creature:Battlefield/type:creature:Battlefield cdaactive +anyzone=type:creature:Battlefield/type:creature:Battlefield cdaactive text=Beast of Burden's power and toughness are each equal to the number of creatures on the battlefield. mana={6} type=Artifact Creature @@ -8671,7 +8671,7 @@ toughness=2 [/card] [card] name=Benalish Commander -auto=type:soldier:mybattlefield/type:soldier:mybattlefield cdaactive +anyzone=type:soldier:mybattlefield/type:soldier:mybattlefield cdaactive autoexile=@counterremoved(0/0,1,Time) from(sourcecard) suspended:token(Soldier,Creature Soldier,1/1,white) suspend(0)={X}{W}{W} text=Benalish Commander's power and toughness are each equal to the number of Soldiers you control. -- Suspend X - {X}{W}{W}. X can't be 0. (Rather than cast this card from your hand, you may pay {X}{W}{W} and exile it with X time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost. It has haste.) -- Whenever a time counter is removed from Benalish Commander while it's exiled, put a 1/1 white Soldier creature token onto the battlefield. @@ -11580,7 +11580,7 @@ toughness=2 [/card] [card] name=Boneyard Wurm -auto=type:creature:mygraveyard/type:creature:mygraveyard cdaactive +anyzone=type:creature:mygraveyard/type:creature:mygraveyard cdaactive text=Boneyard Wurm's power and toughness are each equal to the number of creature cards in your graveyard. mana={1}{G} type=Creature @@ -12926,7 +12926,7 @@ toughness=4 [card] name=Broodstar abilities=affinityartifacts,flying -auto=type:artifact:mybattlefield/type:artifact:mybattlefield cdaactive +anyzone=type:artifact:mybattlefield/type:artifact:mybattlefield cdaactive text=Affinity for artifacts (This spell costs {1} less to cast for each artifact you control.) -- Flying -- Broodstar's power and toughness are each equal to the number of artifacts you control. mana={8}{U}{U} type=Creature @@ -14098,7 +14098,7 @@ type=Sorcery [card] name=Cantivore abilities=vigilance -auto=type:enchantment:graveyard/type:enchantment:graveyard cdaactive +anyzone=type:enchantment:graveyard/type:enchantment:graveyard cdaactive text=Vigilance -- Cantivore's power and toughness are each equal to the number of enchantment cards in all graveyards. mana={1}{W}{W} type=Creature @@ -18066,7 +18066,7 @@ type=Instant [card] name=Cognivore abilities=flying -auto=type:instant:graveyard/type:instant:graveyard cdaactive +anyzone=type:instant:graveyard/type:instant:graveyard cdaactive text=Flying -- Cognivore's power and toughness are each equal to the number of instant cards in all graveyards. mana={6}{U}{U} type=Creature @@ -18086,7 +18086,7 @@ toughness=1 [/card] [card] name=Coiling Woodworm -auto=type:forest:battlefield/1 cdaactive +anyzone=type:forest:battlefield/1 cdaactive text=Coiling Woodworm's power is equal to the number of Forests on the battlefield. mana={2}{G} type=Creature @@ -20220,7 +20220,7 @@ toughness=4 [card] name=Crowd of Cinders abilities=fear -auto=type:*[black]:myBattlefield/type:*[black]:myBattlefield cdaactive +anyzone=type:*[black]:myBattlefield/type:*[black]:myBattlefield cdaactive text=Fear (This creature can't be blocked except by artifact creatures and/or black creatures.) -- Crowd of Cinders's power and toughness are each equal to the number of black permanents you control. mana={3}{B} type=Creature @@ -20455,7 +20455,7 @@ type=Enchantment [/card] [card] name=Crusader of Odric -auto=type:creature:mybattlefield/type:creature:mybattlefield cdaactive +anyzone=type:creature:mybattlefield/type:creature:mybattlefield cdaactive text=Crusader of Odric's power and toughness are each equal to the number of creatures you control. mana={2}{W} type=Creature @@ -21338,7 +21338,7 @@ subtype=Aura [/card] [card] name=Dakkon Blackblade -auto=type:land:myBattlefield/type:land:myBattlefield cdaactive +anyzone=type:land:myBattlefield/type:land:myBattlefield cdaactive text=Dakkon Blackblade's power and toughness are each equal to the number of lands you control. mana={2}{W}{U}{U}{B} type=Legendary Creature @@ -21401,7 +21401,7 @@ toughness=1 [/card] [card] name=Dakmor Sorceress -auto=type:swamp:myBattlefield/4 cdaactive +anyzone=type:swamp:myBattlefield/4 cdaactive text=Dakmor Sorceress's power is equal to the number of Swamps you control. mana={5}{B} type=Creature @@ -21917,7 +21917,7 @@ type=Artifact [card] name=Darksteel Juggernaut abilities=mustattack,indestructible -auto=type:artifact:mybattlefield/type:artifact:mybattlefield cdaactive +anyzone=type:artifact:mybattlefield/type:artifact:mybattlefield cdaactive text=Darksteel Juggernaut's power and toughness are equal to the number of artifacts you control. -- Darksteel Juggernaut is indestructible and attacks each turn if able. mana={5} type=Artifact Creature @@ -22113,7 +22113,7 @@ toughness=3 [/card] [card] name=Dauntless Dourbark -auto=pdauntless/pdauntless cdaactive +anyzone=pdauntless/pdauntless cdaactive auto=aslongas(other treefolk|myBattlefield) trample text=Dauntless Dourbark's power and toughness are each equal to the number of Forests you control plus the number of Treefolk you control. -- Dauntless Dourbark has trample as long as you control another Treefolk. mana={3}{G} @@ -22257,7 +22257,7 @@ toughness=1 [card] name=Dauthi Warlord abilities=shadow -auto=type:creature[shadow]:battlefield/1 cdaactive +anyzone=type:creature[shadow]:battlefield/1 cdaactive text=Shadow (This creature can block or be blocked by only creatures with shadow.) -- Dauthi Warlord's power is equal to the number of creatures with shadow on the battlefield. mana={1}{B} type=Creature @@ -24371,7 +24371,7 @@ text=Destroy target artifact with converted mana cost X. It can't be regenerated [/card] [card] name=Detritivore -auto=type:land[-basic]:opponentgraveyard/type:land[-basic]:opponentgraveyard cdaactive +anyzone=type:land[-basic]:opponentgraveyard/type:land[-basic]:opponentgraveyard cdaactive autoexile=@counterremoved(0/0,1,Time) from(sourcecard) suspended:destroy target(land[-basic]) suspend(0)={X}{3}{R} text=Detritivore's power and toughness are each equal to the number of nonbasic land cards in your opponents' graveyards. -- Suspend X - {X}{3}{R}. X can't be 0. (Rather than cast this card from your hand, you may pay {X}{3}{R} and exile it with X time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost. It has haste.) -- Whenever a time counter is removed from Detritivore while it's exiled, destroy target nonbasic land. @@ -25844,7 +25844,7 @@ type=Artifact [card] name=Doubtless One auto=spiritlink -auto=type:cleric:battlefield/type:cleric:battlefield cdaactive +anyzone=type:cleric:battlefield/type:cleric:battlefield cdaactive text=Doubtless One's power and toughness are each equal to the number of Clerics on the battlefield. -- Whenever Doubtless One deals damage, you gain that much life. mana={3}{W} type=Creature @@ -26976,7 +26976,7 @@ toughness=5 [card] name=Drift of the Dead abilities=defender -auto=type:land[snow]:myBattlefield/type:land[snow]:myBattlefield cdaactive +anyzone=type:land[snow]:myBattlefield/type:land[snow]:myBattlefield cdaactive text=Defender (This creature can't attack.) -- Drift of the Dead's power and toughness are each equal to the number of snow lands you control. mana={3}{B} type=Creature @@ -27335,7 +27335,7 @@ toughness=1 [card] name=Drove of Elves abilities=opponentshroud -auto=type:*[green]:myBattlefield/type:*[green]:myBattlefield cdaactive +anyzone=type:*[green]:myBattlefield/type:*[green]:myBattlefield cdaactive text=Drove of Elves's power and toughness are each equal to the number of green permanents you control. -- Drove of Elves can't be the target of spells or abilities your opponents control. mana={3}{G} type=Creature @@ -27686,7 +27686,7 @@ toughness=1 [card] name=Dungrove Elder abilities=opponentshroud -auto=type:forest:mybattlefield/type:forest:mybattlefield cdaactive +anyzone=type:forest:mybattlefield/type:forest:mybattlefield cdaactive text=Hexproof (This creature can't be the target of spells or abilities your opponents control.) -- Dungrove Elder's power and toughness are each equal to the number of Forests you control. mana={2}{G} type=Creature @@ -29051,7 +29051,7 @@ type=Sorcery name=Elephant T1 type=Creature subtype=Elephant -auto=type:creature:mygraveyard/type:creature:mygraveyard cdaactive +anyzone=type:creature:mygraveyard/type:creature:mygraveyard cdaactive text=This creature's power and toughness are each equal to the number of creature cards in its controller's graveyard. power=* toughness=* @@ -30620,7 +30620,7 @@ toughness=2 [/card] [card] name=Entropic Specter -auto=type:*:opponenthand/type:*:opponenthand cdaactive +anyzone=type:*:opponenthand/type:*:opponenthand cdaactive auto=@damageof(player) from(this):ability$!name(discard) target(*|myhand) reject!$ controller auto=@damagefoeof(player) from(this):ability$!name(discard) target(*|myhand) reject!$ opponent text=Flying -- As Entropic Specter enters the battlefield, choose an opponent. -- Entropic Specter's power and toughness are each equal to the number of cards in the chosen player's hand. -- Whenever Entropic Specter deals damage to a player, that player discards a card. @@ -32256,7 +32256,7 @@ toughness=1 [card] name=Faerie Swarm abilities=flying -auto=type:*[blue]:myBattlefield/type:*[blue]:myBattlefield cdaactive +anyzone=type:*[blue]:myBattlefield/type:*[blue]:myBattlefield cdaactive text=Flying -- Faerie Swarm's power and toughness are each equal to the number of blue permanents you control. mana={3}{U} type=Creature @@ -37804,7 +37804,7 @@ type=Instant name=Geist-Honored Monk abilities=vigilance auto=token(Spirit,Creature Spirit,1/1,white,flying)*2 -auto=type:creature:mybattlefield/type:creature:mybattlefield cdaactive +anyzone=type:creature:mybattlefield/type:creature:mybattlefield cdaactive text=Vigilance -- Geist-Honored Monk's power and toughness are each equal to the number of creatures you control. -- When Geist-Honored Monk enters the battlefield, put two 1/1 white Spirit creature tokens with flying onto the battlefield. mana={3}{W}{W} type=Creature @@ -44933,7 +44933,7 @@ subtype=Arcane [card] name=Heedless One abilities=trample -auto=type:elf:battlefield/type:elf:battlefield cdaactive +anyzone=type:elf:battlefield/type:elf:battlefield cdaactive text=Trample -- Heedless One's power and toughness are each equal to the number of Elves on the battlefield. mana={3}{G} type=Creature @@ -50066,7 +50066,7 @@ toughness=4 [/card] [card] name=Jagged-Scar Archers -auto=type:elf:myBattlefield/type:elf:myBattlefield cdaactive +anyzone=type:elf:myBattlefield/type:elf:myBattlefield cdaactive auto={T}:target(creature[flying]) dynamicability text=Jagged-Scar Archers's power and toughness are each equal to the number of Elves you control. -- {T}: Jagged-Scar Archers deals damage equal to its power to target creature with flying. mana={1}{G}{G} @@ -51346,7 +51346,7 @@ abilities=defender [/card] [card] name=Kagemaro, First to Suffer -auto=type:*:myhand/type:*:myhand cdaactive +anyzone=type:*:myhand/type:*:myhand cdaactive auto={B}{S}:-type:*:myhand/-type:*:myhand all(creature) text=Kagemaro, First to Suffer's power and toughness are each equal to the number of cards in your hand. -- {B}, Sacrifice Kagemaro: All creatures get -X/-X until end of turn, where X is the number of cards in your hand. mana={3}{B}{B} @@ -51417,7 +51417,7 @@ toughness=3 [/card] [card] name=Kalonian Twingrove -auto=type:forest:mybattlefield/type:forest:mybattlefield cdaactive +anyzone=type:forest:mybattlefield/type:forest:mybattlefield cdaactive auto=token(-383290) text=Kalonian Twingrove's power and toughness are each equal to the number of Forests you control. -- When Kalonian Twingrove enters the battlefield, put a green Treefolk Warrior creature token onto the battlefield with "this creature's power and toughness are each equal to the number of forests you control." mana={5}{G} @@ -51428,7 +51428,7 @@ toughness=* [/card] [card] name=Treefolk Warrior -auto=type:forest:mybattlefield/type:forest:mybattlefield cdaactive +anyzone=type:forest:mybattlefield/type:forest:mybattlefield cdaactive text=This creature's power and toughness are each equal to the number of forests you control. color=green type=Creature @@ -52469,7 +52469,7 @@ toughness=1 [/card] [card] name=Keldon Warlord -auto=type:creature[-wall]:myBattlefield/type:creature[-wall]:myBattlefield cdaactive +anyzone=type:creature[-wall]:myBattlefield/type:creature[-wall]:myBattlefield cdaactive text=Keldon Warlord's power and toughness are each equal to the number of non-Wall creatures you control. mana={2}{R}{R} type=Creature @@ -53129,7 +53129,7 @@ toughness=2 [card] name=Kithkin Rabble abilities=vigilance -auto=type:*[white]:myBattlefield/type:*[white]:myBattlefield cdaactive +anyzone=type:*[white]:myBattlefield/type:*[white]:myBattlefield cdaactive text=Vigilance -- Kithkin Rabble's power and toughness are each equal to the number of white permanents you control. mana={3}{W} type=Creature @@ -53253,7 +53253,7 @@ toughness=1 [/card] [card] name=Kiyomaro, First to Stand -auto=type:*:myhand/type:*:myhand cdaactive +anyzone=type:*:myhand/type:*:myhand cdaactive auto=aslongas(*|myhand) vigilance >3 auto=@damaged(creature,player) from(this) restriction{type(*|myhand)~morethan~6}:if type(*|myhand)~morethan~6 then life:7 controller text=Kiyomaro, First to Stand's power and toughness are each equal to the number of cards in your hand. -- As long as you have four or more cards in hand, Kiyomaro has vigilance. -- Whenever Kiyomaro deals damage, if you have seven or more cards in hand, you gain 7 life. @@ -53756,7 +53756,7 @@ toughness=1 [card] name=Kolaghan Forerunners abilities=trample -auto=type:creature:mybattlefield/3 cdaactive +anyzone=type:creature:mybattlefield/3 cdaactive other={R}{2} name(Dash) auto=if paid(alternative) then transforms((,newability[haste],newability[phaseaction[endofturn sourceinplay] moveto(ownerhand) all(this)])) forever text=Trample -- Kolaghan Forerunners's power is equal to the number of creatures you control. -- Dash {2}{R} (You may cast this spell for its dash cost. If you do, it gains haste, and it's returned from the battlefield to its owner's hand at the beginning of the next end step.) @@ -53990,7 +53990,7 @@ toughness=1 [card] name=Korlash Heir to Blackblade auto={discard(korlash heir to blackblade|myhand)}:moveto(mybattlefield) and!(tap)! target(swamp|mylibrary) -auto=type:swamp:mybattlefield/type:swamp:mybattlefield cdaactive +anyzone=type:swamp:mybattlefield/type:swamp:mybattlefield cdaactive auto={1}{B}:regenerate text=Korlash, Heir to Blackblade's power and toughness are each equal to the number of Swamps you control. -- {1}{B}: Regenerate Korlash. -- Grandeur - Discard another card named Korlash, Heir to Blackblade: Search your library for up to two Swamp cards, put them onto the battlefield tapped, then shuffle your library. mana={2}{B}{B} @@ -54444,7 +54444,7 @@ subtype=Aura [card] name=Krovikan Mist abilities=flying -auto=type:illusion:battlefield/type:illusion:battlefield cdaactive +anyzone=type:illusion:battlefield/type:illusion:battlefield cdaactive text=Flying -- Krovikan Mist's power and toughness are each equal to the number of Illusions on the battlefield. mana={1}{U} type=Creature @@ -56072,7 +56072,7 @@ toughness=5 [/card] [card] name=Lhurgoyf -auto=type:creature:graveyard/plusonetype:creature:graveyard cdaactive +anyzone=type:creature:graveyard/plusonetype:creature:graveyard cdaactive text=Lhurgoyf's power is equal to the number of creature cards in all graveyards and its toughness is equal to that number plus 1. mana={2}{G}{G} type=Creature @@ -57452,7 +57452,7 @@ toughness=2 [/card] [card] name=Lord of Extinction -auto=type:*:graveyard/type:*:graveyard cdaactive +anyzone=type:*:graveyard/type:*:graveyard cdaactive text=Lord of Extinction's power and toughness are each equal to the number of cards in all graveyards. mana={3}{B}{G} type=Creature @@ -58817,7 +58817,7 @@ toughness=6 [card] name=Magnivore abilities=haste -auto=type:sorcery:graveyard/type:sorcery:graveyard cdaactive +anyzone=type:sorcery:graveyard/type:sorcery:graveyard cdaactive text=Haste (This creature can attack the turn it comes under your control.) -- Magnivore's power and toughness are each equal to the number of sorcery cards in all graveyards. mana={2}{R}{R} type=Creature @@ -59639,7 +59639,7 @@ toughness=3 [/card] [card] name=Maraxus of Keld -auto=type:*[-tapped&-enchantment;-tapped&-planeswalker]/type:*[-tapped&-enchantment;-tapped&-planeswalker] cdaactive +anyzone=type:*[-tapped&-enchantment;-tapped&-planeswalker]/type:*[-tapped&-enchantment;-tapped&-planeswalker] cdaactive text=Maraxus of Keld's power and toughness are each equal to the number of untapped artifacts, creatures, and lands you control. mana={4}{R}{R} type=Legendary Creature @@ -60025,7 +60025,7 @@ toughness=4 [/card] [card] name=Maro -auto=type:*:myhand/type:*:myhand cdaactive +anyzone=type:*:myhand/type:*:myhand cdaactive text=Maro's power and toughness are each equal to the number of cards in your hand. mana={2}{G}{G} type=Creature @@ -60558,7 +60558,7 @@ toughness=2 [card] name=Master of Etherium auto=lord(other creature[artifact]|mybattlefield) 1/1 -auto=type:artifact:mybattlefield/type:artifact:mybattlefield cdaactive +anyzone=type:artifact:mybattlefield/type:artifact:mybattlefield cdaactive text=Master of Etherium's power and toughness are each equal to the number of artifacts you control. -- Other artifact creatures you control get +1/+1. mana={2}{U} type=Artifact Creature @@ -60663,7 +60663,7 @@ toughness=4 [/card] [card] name=Masumaro, First to Live -auto=twicetype:*:myhand/twicetype:*:myhand cdaactive +anyzone=twicetype:*:myhand/twicetype:*:myhand cdaactive text=Masumaro, First to Live's power and toughness are each equal to twice the number of cards in your hand. mana={3}{G}{G}{G} type=Legendary Creature @@ -60673,7 +60673,7 @@ toughness=* [/card] [card] name=Matca Rioters -auto=pbasiclandtypes/pbasiclandtypes cdaactive +anyzone=pbasiclandtypes/pbasiclandtypes cdaactive text=Domain - Matca Rioters's power and toughness are each equal to the number of basic land types among lands you control. mana={2}{G} type=Creature @@ -63699,7 +63699,7 @@ toughness=8 [card] name=Molimo, Maro-Sorcerer abilities=trample -auto=type:land:myBattlefield/type:land:myBattlefield cdaactive +anyzone=type:land:myBattlefield/type:land:myBattlefield cdaactive text=Trample (If this creature would deal enough damage to its blockers to destroy them, you may have it deal the rest of its damage to defending player or planeswalker.) -- Molimo, Maro-Sorcerer's power and toughness are each equal to the number of lands you control. mana={4}{G}{G}{G} type=Legendary Creature @@ -64585,7 +64585,7 @@ toughness=2 [card] name=Mortivore auto={B}:regenerate -auto=type:creature:graveyard/type:creature:graveyard cdaactive +anyzone=type:creature:graveyard/type:creature:graveyard cdaactive text=Mortivore's power and toughness are each equal to the number of creature cards in all graveyards. -- {B}: Regenerate Mortivore. (The next time this creature would be destroyed this turn, it isn't. Instead tap it, remove all damage from it, and remove it from combat.) mana={2}{B}{B} type=Creature @@ -64980,7 +64980,7 @@ toughness=2 [card] name=Multani, Maro-Sorcerer abilities=shroud -auto=type:*:hand/type:*:hand cdaactive +anyzone=type:*:hand/type:*:hand cdaactive text=Shroud (This permanent can't be the target of spells or abilities.) -- Multani's power and toughness are each equal to the total number of cards in all players' hands. mana={4}{G}{G} type=Legendary Creature @@ -65793,7 +65793,7 @@ subtype=Shapeshifter name=Nameless One facedown={3} autofacedown={2}{U}:morph -auto=type:wizard:battlefield/type:wizard:battlefield cdaactive +anyzone=type:wizard:battlefield/type:wizard:battlefield cdaactive text=Nameless One's power and toughness are each equal to the number of Wizards on the battlefield. -- Morph {2}{U} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) mana={3}{U} type=Creature @@ -67248,7 +67248,7 @@ type=Sorcery [card] name=Nightmare abilities=flying -auto=type:swamp:mybattlefield/type:swamp:mybattlefield cdaactive +anyzone=type:swamp:mybattlefield/type:swamp:mybattlefield cdaactive text=Flying -- Nightmare's power and toughness are each equal to the number of Swamps you control. mana={5}{B} type=Creature @@ -67366,7 +67366,7 @@ toughness=4 [/card] [card] name=Nightstalker Engine -auto=type:creature:myGraveyard/3 cdaactive +anyzone=type:creature:myGraveyard/3 cdaactive text=Nightstalker Engine's power is equal to the number of creature cards in your graveyard. mana={4}{B} type=Creature @@ -70197,7 +70197,7 @@ toughness=2 [/card] [card] name=Overbeing of Myth -auto=type:*:myhand/type:*:myhand cdaactive +anyzone=type:*:myhand/type:*:myhand cdaactive auto=@each my draw:draw:1 text=Overbeing of Myth's power and toughness are each equal to the number of cards in your hand. -- At the beginning of your draw step, draw an additional card. mana={GU}{GU}{GU}{GU}{GU} @@ -70450,7 +70450,7 @@ type=Sorcery [/card] [card] name=Pack Rat -auto=type:rat:mybattlefield/type:rat:mybattlefield cdaactive +anyzone=type:rat:mybattlefield/type:rat:mybattlefield cdaactive auto={2}{B}{discard(*|myhand)}:token(253624) text=Pack Rat's power and toughness are each equal to the number of Rats you control. -- {2}{B}, Discard a card: Put a token onto the battlefield that's a copy of Pack Rat. mana={1}{B} @@ -70694,7 +70694,7 @@ toughness=4 [/card] [card] name=Pallimud -auto=type:land[tapped]:opponentbattlefield/3 cdaactive +anyzone=type:land[tapped]:opponentbattlefield/3 cdaactive text=As Pallimud enters the battlefield, choose an opponent. -- Pallimud's power is equal to the number of tapped lands the chosen player controls. mana={2}{R} type=Creature @@ -71900,7 +71900,7 @@ toughness=6 [/card] [card] name=Pestilence Rats -auto=othertype:rat:battlefield/3 cdaactive +anyzone=othertype:rat:battlefield/3 cdaactive text=Pestilence Rats's power is equal to the number of other Rats on the battlefield. (For example, as long as there are two other Rats on the battlefield, Pestilence Rats's power and toughness are 2/3.) mana={2}{B} type=Creature @@ -73404,7 +73404,7 @@ toughness=1 [/card] [card] name=Plague Rats -auto=allmyname/allmyname cdaactive +anyzone=allmyname/allmyname cdaactive text=Plague Rats's power and toughness are each equal to the number of creatures named Plague Rats on the battlefield. mana={2}{B} type=Creature @@ -74639,7 +74639,7 @@ subtype=Aura [card] name=Primalcrux abilities=trample -auto=type:manag:mybattlefield/type:manag:mybattlefield cdaactive +anyzone=type:manag:mybattlefield/type:manag:mybattlefield cdaactive text=Trample -- Chroma - Primalcrux's power and toughness are each equal to the number of green mana symbols in the mana costs of permanents you control. mana={G}{G}{G}{G}{G}{G} type=Creature @@ -75329,7 +75329,7 @@ type=Enchantment [/card] [card] name=Psychosis Crawler -auto=type:*:myhand/type:*:myhand cdaactive +anyzone=type:*:myhand/type:*:myhand cdaactive auto=@drawof(player):life:-1 opponent text=Psychosis Crawler's power and toughness are each equal to the number of cards in your hand. - Whenever you draw a card, each opponent loses 1 life. mana={5} @@ -78392,7 +78392,7 @@ toughness=2 [card] name=Reckless One abilities=haste -auto=type:goblin:battlefield/type:goblin:battlefield cdaactive +anyzone=type:goblin:battlefield/type:goblin:battlefield cdaactive text=Haste -- Reckless One's power and toughness are each equal to the number of Goblins on the battlefield. mana={3}{R} type=Creature @@ -79781,7 +79781,7 @@ type=Artifact [card] name=Revenant abilities=flying -auto=type:creature:mygraveyard/type:creature:mygraveyard cdaactive +anyzone=type:creature:mygraveyard/type:creature:mygraveyard cdaactive text=Flying -- Revenant's power and toughness are each equal to the number of creature cards in your graveyard. mana={4}{B} type=Creature @@ -81838,7 +81838,7 @@ toughness=3 [/card] [card] name=Rubblehulk -auto=type:land:mybattlefield/type:land:mybattlefield cdaactive +anyzone=type:land:mybattlefield/type:land:mybattlefield cdaactive autohand={1}{R}{G}{discard}:name(bloodrush) target(creature[attacking]) type:land:mybattlefield/type:land:mybattlefield ueot text=Rubblehulk's power and toughness are each equal to the number of lands you control. -- Bloodrush — {1}{R}{G}, Discard Rubblehulk: Target attacking creature gets +X/+X until end of turn, where X is the number of lands you control. mana={4}{R}{G} @@ -82362,7 +82362,7 @@ type=Artifact [card] name=Rusting Golem auto=fading:5 -auto=counter{0%0.1.Fade}/counter{0%0.1.Fade} cdaactive +anyzone=counter{0%0.1.Fade}/counter{0%0.1.Fade} cdaactive text=Fading 5 (This creature enters the battlefield with five fade counters on it. At the beginning of your upkeep, remove a fade counter from it. If you can't, sacrifice it.) -- Rusting Golem's power and toughness are each equal to the number of fade counters on it. mana={4} type=Artifact Creature @@ -84429,7 +84429,7 @@ toughness=1 [/card] [card] name=Scion of the Wild -auto=type:creature:myBattlefield/type:creature:myBattlefield cdaactive +anyzone=type:creature:myBattlefield/type:creature:myBattlefield cdaactive text=Scion of the Wild's power and toughness are each equal to the number of creatures you control. mana={1}{G}{G} type=Creature @@ -86546,7 +86546,7 @@ toughness=3 name=Serpent of the Endless Sea abilities=cantattack auto=aslongas(island|opponentBattlefield) -cantattack -auto=type:island:myBattlefield/type:island:myBattlefield cdaactive +anyzone=type:island:myBattlefield/type:island:myBattlefield cdaactive text=Serpent of the Endless Sea's power and toughness are each equal to the number of Islands you control. -- Serpent of the Endless Sea can't attack unless defending player controls an Island. mana={4}{U} type=Creature @@ -86619,7 +86619,7 @@ toughness=1 [/card] [card] name=Serra Avatar -auto=lifetotal/lifetotal cdaactive +anyzone=lifetotal/lifetotal cdaactive autograveyard=moveTo(ownerlibrary) && shuffle text=Serra Avatar's power and toughness are each equal to your life total. -- When Serra Avatar is put into a graveyard from anywhere, shuffle it into its owner's library. mana={4}{W}{W}{W} @@ -89377,7 +89377,7 @@ toughness=5 [/card] [card] name=Sima Yi, Wei Field Marshal -auto=type:swamp:myBattlefield/4 cdaactive +anyzone=type:swamp:myBattlefield/4 cdaactive text=Sima Yi, Wei Field Marshal's power is equal to the number of Swamps you control. mana={5}{B} type=Legendary Creature @@ -90842,7 +90842,7 @@ toughness=3 [card] name=Skyshroud War Beast abilities=trample -auto=type:land[-basic]:opponentBattlefield/type:land[-basic]:opponentBattlefield cdaactive +anyzone=type:land[-basic]:opponentBattlefield/type:land[-basic]:opponentBattlefield cdaactive text=Trample -- As Skyshroud War Beast enters the battlefield, choose an opponent. -- Skyshroud War Beast's power and toughness are each equal to the number of nonbasic lands the chosen player controls. mana={1}{G} type=Creature @@ -90926,7 +90926,7 @@ toughness=3 [/card] [card] name=Slag Fiend -auto=type:artifact:graveyard/type:artifact:graveyard cdaactive +anyzone=type:artifact:graveyard/type:artifact:graveyard cdaactive text=Slag Fiend's power and toughness are each equal to the number of artifact cards in all graveyards. mana={R} type=Creature @@ -92448,7 +92448,7 @@ toughness=1 [card] name=Soramaro, First to Dream abilities=flying -auto=type:*:myhand/type:*:myhand cdaactive +anyzone=type:*:myhand/type:*:myhand cdaactive auto={4}{H(land|myBattlefield)}:draw:1 text=Flying -- Soramaro, First to Dream's power and toughness are each equal to the number of cards in your hand. -- {4}, Return a land you control to its owner's hand: Draw a card. mana={4}{U}{U} @@ -93035,7 +93035,7 @@ toughness=2 [/card] [card] name=Soulless One -auto=pgbzombie/pgbzombie cdaactive +anyzone=pgbzombie/pgbzombie cdaactive text=Soulless One's power and toughness are each equal to the number of Zombies on the battlefield plus the number of Zombie cards in all graveyards. mana={3}{B} type=Creature @@ -93092,7 +93092,7 @@ type=Instant [card] name=Soulsurge Elemental abilities=first strike -auto=type:creature:myBattlefield/1 cdaactive +anyzone=type:creature:myBattlefield/1 cdaactive text=First strike -- Soulsurge Elemental's power is equal to the number of creatures you control. mana={3}{R} type=Creature @@ -93637,7 +93637,7 @@ toughness=1 [card] name=Spellheart Chimera abilities=flying,trample -auto=pginstantsorcery/3 cdaactive +anyzone=pginstantsorcery/3 cdaactive text=Flying. -- Trample. -- Spellheart Chimera's power is equal to the number of instant and sorcery cards in your graveyard. mana={1}{U}{R} type=Creature @@ -94632,7 +94632,7 @@ color=green [card] name=Splinterfright abilities=trample -auto=type:creature:mygraveyard/type:creature:mygraveyard cdaactive +anyzone=type:creature:mygraveyard/type:creature:mygraveyard cdaactive auto=@each my upkeep:deplete:2 controller text=Trample -- Splinterfright's power and toughness are each equal to the number of creature cards in your graveyard -- At the beginning of your upkeep, put the top two cards of your library into your graveyard. mana={2}{G} @@ -95035,7 +95035,7 @@ type=Enchantment [/card] [card] name=Squelching Leeches -auto=type:swamp:myBattlefield/type:swamp:myBattlefield cdaactive +anyzone=type:swamp:myBattlefield/type:swamp:myBattlefield cdaactive text=Squelching Leeches's power and toughness are each equal to the number of Swamps you control. mana={2}{B}{B} type=Creature @@ -97237,7 +97237,7 @@ toughness=6 [card] name=Sturmgeist abilities=flying -auto=type:*:myhand/type:*:myhand cdaactive +anyzone=type:*:myhand/type:*:myhand cdaactive auto=@combatdamaged(player) from(this):draw:1 controller text=Flying -- Sturmgeist's power and toughness are each equal to the number of cards in your hand. -- Whenever Sturmgeist deals combat damage to a player, draw a card. mana={3}{U}{U} @@ -98406,7 +98406,7 @@ toughness=0 [/card] [card] name=Swarm of Rats -auto=type:rat:mybattlefield/1 cdaactive +anyzone=type:rat:mybattlefield/1 cdaactive text=Swarm of Rats's power is equal to the number of Rats you control. mana={1}{B} type=Creature @@ -98894,7 +98894,7 @@ type=Sorcery [/card] [card] name=Sylvan Yeti -auto=type:*:myhand/4 cdaactive +anyzone=type:*:myhand/4 cdaactive text=Sylvan Yeti's power is equal to the number of cards in your hand. mana={2}{G}{G} type=Creature @@ -99740,7 +99740,7 @@ toughness=7 [/card] [card] name=Tarmogoyf -auto=gravecardtypes/plusonegravecardtypes cdaactive +anyzone=gravecardtypes/plusonegravecardtypes cdaactive text=Tarmogoyf's power is equal to the number of card types among cards in all graveyards and its toughness is equal to that number plus 1. (The card types are artifact, creature, enchantment, instant, land, planeswalker, sorcery, and tribal.) mana={1}{G} type=Creature @@ -100774,7 +100774,7 @@ type=Artifact [card] name=Terravore abilities=trample -auto=type:land:graveyard/type:land:graveyard cdaactive +anyzone=type:land:graveyard/type:land:graveyard cdaactive text=Trample -- Terravore's power and toughness are each equal to the number of land cards in all graveyards. mana={1}{G}{G} type=Creature @@ -102693,7 +102693,7 @@ toughness=5 [card] name=Tidewalker auto=foreach(island|myBattlefield) counter(0/0,1,Time) oneshot -auto=counter{0%0.1.Time}/counter{0%0.1.Time} cdaactive +anyzone=counter{0%0.1.Time}/counter{0%0.1.Time} cdaactive auto=vanishing:0 text=Tidewalker enters the battlefield with a time counter on it for each Island you control. -- Vanishing (At the beginning of your upkeep, remove a time counter from this permanent. When the last is removed, sacrifice it.) -- Tidewalker's power and toughness are each equal to the number of time counters on it. mana={2}{U} @@ -105860,7 +105860,7 @@ toughness=2 [/card] [card] name=Uktabi Wildcats -auto=type:forest:mybattlefield/type:forest:mybattlefield cdaactive +anyzone=type:forest:mybattlefield/type:forest:mybattlefield cdaactive auto={G}{S(forest|myBattlefield)}:regenerate text=Uktabi Wildcats's power and toughness are each equal to the number of Forests you control. -- {G}, Sacrifice a Forest: Regenerate Uktabi Wildcats. mana={4}{G} @@ -105998,7 +105998,7 @@ type=Artifact [/card] [card] name=Umbra Stalker -auto=type:manab:mygraveyard/type:manab:mygraveyard cdaactive +anyzone=type:manab:mygraveyard/type:manab:mygraveyard cdaactive text=Chroma - Umbra Stalker's power and toughness are each equal to the number of black mana symbols in the mana costs of cards in your graveyard. mana={4}{B}{B}{B} type=Creature @@ -109908,7 +109908,7 @@ toughness=2 name=Elemental type=Creature subtype=Elemental -auto=type:creature:mybattlefield/type:creature:mybattlefield cdaactive +anyzone=type:creature:mybattlefield/type:creature:mybattlefield cdaactive text=This creature's power and toughness are each equal to the number of creature cards in its controller's battlefield. power=* toughness=* @@ -112185,7 +112185,7 @@ toughness=3 [/card] [card] name=Wayfaring Temple -auto=type:creature:mybattlefield/type:creature:mybattlefield cdaactive +anyzone=type:creature:mybattlefield/type:creature:mybattlefield cdaactive auto=@combatdamaged(player) from(this) restriction{type(creature[token]|mybattlefield)~morethan~0}:name(populate) clone notatarget(creature[token]|mybattlefield) text=Wayfaring Temple's power and toughness are each equal to the number of creatures you control. -- Whenever Wayfaring Temple deals combat damage to a player, populate. (Put a token onto the battlefield that's a copy of a creature token you control.) mana={1}{G}{W} @@ -113257,7 +113257,7 @@ toughness=4 [card] name=Wilderness Elemental abilities=trample -auto=type:land[-basic]:opponentbattlefield/3 cdaactive +anyzone=type:land[-basic]:opponentbattlefield/3 cdaactive text=Trample -- Wilderness Elemental's power is equal to the number of nonbasic lands your opponents control. mana={1}{R}{G} type=Creature @@ -115354,7 +115354,7 @@ type=Legendary Land [/card] [card] name=Yavimaya Kavu -auto=type:creature[red]:battlefield/type:creature[green]:battlefield cdaactive +anyzone=type:creature[red]:battlefield/type:creature[green]:battlefield cdaactive text=Yavimaya Kavu's power is equal to the number of red creatures on the battlefield. -- Yavimaya Kavu's toughness is equal to the number of green creatures on the battlefield. mana={2}{R}{G} type=Creature @@ -115776,7 +115776,7 @@ toughness=3 [/card] [card] name=Zendikar Incarnate -auto=type:land:mybattlefield/4 cdaactive +anyzone=type:land:mybattlefield/4 cdaactive text=Zendikar Incarnate's power is equal to the number of lands you control. mana={2}{R}{G} type=Creature diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index 10e9d30cc..1cc5ecd0a 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -3080,7 +3080,11 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG } else if(s.find("cdaactive") != string::npos) { - return NEW APowerToughnessModifier(observer, id, card, target, wppt,s,true); + MTGAbility * a = NEW APowerToughnessModifier(observer, id, card, target, wppt,s,true); + a->forcedAlive = 1; + a->forceDestroy = -1; + return a; + //return NEW APowerToughnessModifier(observer, id, card, target, wppt,s,true); } else return NEW APowerToughnessModifier(observer, id, card, target, wppt,s,nonstatic); @@ -3751,7 +3755,7 @@ int AbilityFactory::getAbilities(vector * v, Spell * spell, MTGCar if (dest == zones->exile) { magicText = card->magicTexts["exile"]; - card->exileEffects = true; + card->exileEffects = true; break; } if (dest == zones->library) diff --git a/projects/mtg/src/MTGDeck.cpp b/projects/mtg/src/MTGDeck.cpp index 058c1d4c3..738d8289d 100644 --- a/projects/mtg/src/MTGDeck.cpp +++ b/projects/mtg/src/MTGDeck.cpp @@ -93,6 +93,16 @@ int MTGAllCards::processConfLine(string &s, MTGCard *card, CardPrimitive * primi } } } + if (key == "anyzone") + { + if (!primitive) primitive = NEW CardPrimitive(); + primitive->addMagicText(val,"hand"); + primitive->addMagicText(val,"library"); + primitive->addMagicText(val,"graveyard"); + primitive->addMagicText(val,"stack"); + primitive->addMagicText(val,"exile"); + primitive->addMagicText(val); + } break; case 'b': //buyback From e35c9f6087c7b40e1f0426279b9513835b014b1f Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sat, 7 Nov 2015 09:59:30 +0800 Subject: [PATCH 242/249] AI plays zerocast cards, Update Rules folder! Its basic pay zero for now... Omniscience is possible :) --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 13 ++++ projects/mtg/include/MTGAbility.h | 2 +- projects/mtg/src/AIPlayerBaka.cpp | 66 ++++++++++++++++++-- projects/mtg/src/MTGAbility.cpp | 2 +- projects/mtg/src/MTGRules.cpp | 30 +++++---- 5 files changed, 96 insertions(+), 17 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index e33f7dbf8..bb577a278 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -11580,6 +11580,7 @@ toughness=2 [/card] [card] name=Boneyard Wurm +alias=001100 anyzone=type:creature:mygraveyard/type:creature:mygraveyard cdaactive text=Boneyard Wurm's power and toughness are each equal to the number of creature cards in your graveyard. mana={1}{G} @@ -14097,6 +14098,7 @@ type=Sorcery [/card] [card] name=Cantivore +alias=001100 abilities=vigilance anyzone=type:enchantment:graveyard/type:enchantment:graveyard cdaactive text=Vigilance -- Cantivore's power and toughness are each equal to the number of enchantment cards in all graveyards. @@ -18065,6 +18067,7 @@ type=Instant [/card] [card] name=Cognivore +alias=001100 abilities=flying anyzone=type:instant:graveyard/type:instant:graveyard cdaactive text=Flying -- Cognivore's power and toughness are each equal to the number of instant cards in all graveyards. @@ -24371,6 +24374,7 @@ text=Destroy target artifact with converted mana cost X. It can't be regenerated [/card] [card] name=Detritivore +alias=001100 anyzone=type:land[-basic]:opponentgraveyard/type:land[-basic]:opponentgraveyard cdaactive autoexile=@counterremoved(0/0,1,Time) from(sourcecard) suspended:destroy target(land[-basic]) suspend(0)={X}{3}{R} @@ -56072,6 +56076,7 @@ toughness=5 [/card] [card] name=Lhurgoyf +alias=001100 anyzone=type:creature:graveyard/plusonetype:creature:graveyard cdaactive text=Lhurgoyf's power is equal to the number of creature cards in all graveyards and its toughness is equal to that number plus 1. mana={2}{G}{G} @@ -57452,6 +57457,7 @@ toughness=2 [/card] [card] name=Lord of Extinction +alias=001100 anyzone=type:*:graveyard/type:*:graveyard cdaactive text=Lord of Extinction's power and toughness are each equal to the number of cards in all graveyards. mana={3}{B}{G} @@ -58816,6 +58822,7 @@ toughness=6 [/card] [card] name=Magnivore +alias=001100 abilities=haste anyzone=type:sorcery:graveyard/type:sorcery:graveyard cdaactive text=Haste (This creature can attack the turn it comes under your control.) -- Magnivore's power and toughness are each equal to the number of sorcery cards in all graveyards. @@ -64584,6 +64591,7 @@ toughness=2 [/card] [card] name=Mortivore +alias=001100 auto={B}:regenerate anyzone=type:creature:graveyard/type:creature:graveyard cdaactive text=Mortivore's power and toughness are each equal to the number of creature cards in all graveyards. -- {B}: Regenerate Mortivore. (The next time this creature would be destroyed this turn, it isn't. Instead tap it, remove all damage from it, and remove it from combat.) @@ -79780,6 +79788,7 @@ type=Artifact [/card] [card] name=Revenant +alias=001100 abilities=flying anyzone=type:creature:mygraveyard/type:creature:mygraveyard cdaactive text=Flying -- Revenant's power and toughness are each equal to the number of creature cards in your graveyard. @@ -90926,6 +90935,7 @@ toughness=3 [/card] [card] name=Slag Fiend +alias=001100 anyzone=type:artifact:graveyard/type:artifact:graveyard cdaactive text=Slag Fiend's power and toughness are each equal to the number of artifact cards in all graveyards. mana={R} @@ -94631,6 +94641,7 @@ color=green [/card] [card] name=Splinterfright +alias=001100 abilities=trample anyzone=type:creature:mygraveyard/type:creature:mygraveyard cdaactive auto=@each my upkeep:deplete:2 controller @@ -100773,6 +100784,7 @@ type=Artifact [/card] [card] name=Terravore +alias=001100 abilities=trample anyzone=type:land:graveyard/type:land:graveyard cdaactive text=Trample -- Terravore's power and toughness are each equal to the number of land cards in all graveyards. @@ -105998,6 +106010,7 @@ type=Artifact [/card] [card] name=Umbra Stalker +alias=001100 anyzone=type:manab:mygraveyard/type:manab:mygraveyard cdaactive text=Chroma - Umbra Stalker's power and toughness are each equal to the number of black mana symbols in the mana costs of cards in your graveyard. mana={4}{B}{B}{B} diff --git a/projects/mtg/include/MTGAbility.h b/projects/mtg/include/MTGAbility.h index af8cbbeee..70d6344b9 100644 --- a/projects/mtg/include/MTGAbility.h +++ b/projects/mtg/include/MTGAbility.h @@ -213,7 +213,7 @@ public: COUNTERS = 30, PUT_INTO_PLAY_WITH_KICKER = 31, STANDARD_FIZZLER = 32, - CASTINGRAVEEXILE_COST = 33, + PAYZERO_COST = 33, }; }; diff --git a/projects/mtg/src/AIPlayerBaka.cpp b/projects/mtg/src/AIPlayerBaka.cpp index e0d269e69..634414632 100644 --- a/projects/mtg/src/AIPlayerBaka.cpp +++ b/projects/mtg/src/AIPlayerBaka.cpp @@ -631,10 +631,6 @@ int OrderedAIAction::getEfficiency() { efficiency += 55; } - else if (dynamic_cast(a)) - { - efficiency += 45; - } SAFE_DELETE(transAbility); return efficiency; } @@ -1838,6 +1834,10 @@ MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * pMana, const char * ty { shouldPlayPercentage = 90; } + else if (!card->isLand() && card->has(Constants::PAYZERO)) + { + shouldPlayPercentage = 70; + } else { // shouldPlay == baka_effect_bad giving it a 1 for odd ball lottery chance. @@ -1986,6 +1986,10 @@ MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * pMana, const char * ty { shouldPlayPercentage = 90; } + else if (!card->isLand() && card->has(Constants::PAYZERO)) + { + shouldPlayPercentage = 70; + } else { // shouldPlay == baka_effect_bad giving it a 1 for odd ball lottery chance. @@ -2133,6 +2137,10 @@ MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * pMana, const char * ty { shouldPlayPercentage = 90; } + else if (!card->isLand() && card->has(Constants::PAYZERO)) + { + shouldPlayPercentage = 70; + } else { // shouldPlay == baka_effect_bad giving it a 1 for odd ball lottery chance. @@ -2413,6 +2421,56 @@ int AIPlayerBaka::computeActions() nextCardToPlay = NULL; count++; } + + if(nextCardToPlay == NULL)//check if there is a free card to play, play it.... + {//TODO: add potential mana if we can pay if there is a cost increaser in play + CardDescriptor cd; + if (game->hand->hasAbility(Constants::PAYZERO)) + { + //Attempt to put free cards into play + cd.init(); + cd.SetExclusionColor(Constants::MTG_COLOR_LAND); + MTGCardInstance *freecard = cd.match(game->hand); + int canCastCard = game->playRestrictions->canPutIntoZone(freecard, game->inPlay); + if (freecard && (canCastCard == PlayRestriction::CAN_PLAY) && freecard->has(Constants::PAYZERO) && (freecard->getIncreasedManaCost()->getConvertedCost() < 1)) + { + MTGAbility * castFreeCard = observer->mLayers->actionLayer()->getAbility(MTGAbility::PAYZERO_COST); + AIAction * aa = NEW AIAction(this, castFreeCard, freecard); //TODO putinplay action + clickstream.push(aa); + break; + } + } + if (game->graveyard->hasAbility(Constants::PAYZERO) && game->graveyard->hasAbility(Constants::CANPLAYFROMGRAVEYARD)) + { + //Attempt to put free cards into play + cd.init(); + cd.SetExclusionColor(Constants::MTG_COLOR_LAND); + MTGCardInstance *freecard = cd.match(game->graveyard); + int canCastCard = game->playRestrictions->canPutIntoZone(freecard, game->inPlay); + if (freecard && (canCastCard == PlayRestriction::CAN_PLAY) && freecard->has(Constants::PAYZERO) && freecard->has(Constants::CANPLAYFROMGRAVEYARD) && (freecard->getIncreasedManaCost()->getConvertedCost() < 1) && (freecard->alias != 001100)) + { + MTGAbility * castFreeCard = observer->mLayers->actionLayer()->getAbility(MTGAbility::PAYZERO_COST); + AIAction * aa = NEW AIAction(this, castFreeCard, freecard); //TODO putinplay action + clickstream.push(aa); + break; + } + } + if (game->exile->hasAbility(Constants::PAYZERO) && game->exile->hasAbility(Constants::CANPLAYFROMEXILE)) + { + //Attempt to put free cards into play + cd.init(); + cd.SetExclusionColor(Constants::MTG_COLOR_LAND); + MTGCardInstance *freecard = cd.match(game->exile); + int canCastCard = game->playRestrictions->canPutIntoZone(freecard, game->inPlay); + if (freecard && (canCastCard == PlayRestriction::CAN_PLAY) && freecard->has(Constants::PAYZERO) && freecard->has(Constants::CANPLAYFROMEXILE) && (freecard->getIncreasedManaCost()->getConvertedCost() < 1) && (freecard->alias != 001100)) + { + MTGAbility * castFreeCard = observer->mLayers->actionLayer()->getAbility(MTGAbility::PAYZERO_COST); + AIAction * aa = NEW AIAction(this, castFreeCard, freecard); //TODO putinplay action + clickstream.push(aa); + break; + } + } + }//end } SAFE_DELETE(currentMana); diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index 1cc5ecd0a..bcb131764 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -1156,7 +1156,7 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG observer->addObserver(NEW MTGMorphCostRule(observer, -1)); return NULL; } - found = s.find("playfromgraveyardrule"); + found = s.find("payzerorule"); if(found != string::npos) { observer->addObserver(NEW MTGPayZeroRule(observer, -1)); diff --git a/projects/mtg/src/MTGRules.cpp b/projects/mtg/src/MTGRules.cpp index 03b6dc136..d43c870ac 100644 --- a/projects/mtg/src/MTGRules.cpp +++ b/projects/mtg/src/MTGRules.cpp @@ -489,7 +489,11 @@ int MTGKickerRule::isReactingToClick(MTGCardInstance * card, ManaCost *) } ManaCost * playerMana = player->getManaPool(); ManaCost * withKickerCost= NEW ManaCost(card->model->data->getManaCost()); - withKickerCost->add(withKickerCost->getKicker()); + if(card->getIncreasedManaCost()->getConvertedCost()) + withKickerCost->add(card->getIncreasedManaCost()); + if(card->getReducedManaCost()->getConvertedCost()) + withKickerCost->remove(card->getReducedManaCost()); + withKickerCost->add(card->model->data->getManaCost()->getKicker()); if(!playerMana->canAfford(withKickerCost)) { delete withKickerCost; @@ -508,11 +512,15 @@ int MTGKickerRule::reactToClick(MTGCardInstance * card) Player * player = game->currentlyActing(); ManaCost * withKickerCost= NEW ManaCost(card->model->data->getManaCost());//using pointers here alters the real cost of the card. - if (card->getManaCost()->getKicker()->isMulti) + if(card->getIncreasedManaCost()->getConvertedCost()) + withKickerCost->add(card->getIncreasedManaCost()); + if(card->getReducedManaCost()->getConvertedCost()) + withKickerCost->remove(card->getReducedManaCost()); + if (card->model->data->getManaCost()->getKicker()->isMulti) { while(player->getManaPool()->canAfford(withKickerCost)) { - withKickerCost->add(withKickerCost->getKicker()); + withKickerCost->add(card->model->data->getManaCost()->getKicker()); card->kicked += 1; } card->kicked -= 1; @@ -522,7 +530,7 @@ int MTGKickerRule::reactToClick(MTGCardInstance * card) } else { - withKickerCost->add(withKickerCost->getKicker()); + withKickerCost->add(card->model->data->getManaCost()->getKicker()); card->paymenttype = MTGAbility::PUT_INTO_PLAY_WITH_KICKER; } if (withKickerCost->isExtraPaymentSet()) @@ -638,9 +646,9 @@ int MTGAlternativeCostRule::isReactingToClick(MTGCardInstance * card, ManaCost * if(card->has(Constants::CANPLAYFROMGRAVEYARD)) - alternativeName = "Alternate Cast Card From Graveyard"; + alternativeName = "Alternate Cast From Graveyard"; else if(card->has(Constants::CANPLAYFROMEXILE)) - alternativeName = "Alternate Cast Card From Exile"; + alternativeName = "Alternate Cast From Exile"; else if(card->model->data->getManaCost()->getAlternative() && card->model->data->getManaCost()->getAlternative()->alternativeName.size()) alternativeName = card->model->data->getManaCost()->getAlternative()->alternativeName; @@ -1145,7 +1153,7 @@ MTGMorphCostRule * MTGMorphCostRule::clone() const MTGPayZeroRule::MTGPayZeroRule(GameObserver* observer, int _id) : MTGAlternativeCostRule(observer, _id) { - aType = MTGAbility::CASTINGRAVEEXILE_COST; + aType = MTGAbility::PAYZERO_COST; } int MTGPayZeroRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana) @@ -1166,11 +1174,11 @@ int MTGPayZeroRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana) if ((!card->has(Constants::CANPLAYFROMGRAVEYARD) && player->game->graveyard->hasCard(card))||(!card->has(Constants::CANPLAYFROMEXILE) && player->game->exile->hasCard(card))) return 0; if(card->has(Constants::CANPLAYFROMGRAVEYARD)) - CustomName = "Pay Zero To Cast From Graveyard"; + CustomName = "Zero Cast From Graveyard"; else if(card->has(Constants::CANPLAYFROMEXILE)) - CustomName = "Pay Zero To Cast From Exile"; + CustomName = "Zero Cast From Exile"; else - CustomName = "Pay Zero To Cast"; + CustomName = "Zero Cast From Anywhere"; return MTGAlternativeCostRule::isReactingToClick(card, mana, cost); } @@ -1182,7 +1190,7 @@ int MTGPayZeroRule::reactToClick(MTGCardInstance * card) ManaCost * cost = NEW ManaCost(ManaCost::parseManaCost("{0}",NULL,NULL)); - card->paymenttype = MTGAbility::CASTINGRAVEEXILE_COST; + card->paymenttype = MTGAbility::PAYZERO_COST; return MTGAlternativeCostRule::reactToClick(card, cost, ManaCost::MANA_PAID); } From efdc4071da960a1056a6b382e45aaa003abbfc2b Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sat, 7 Nov 2015 10:45:54 +0800 Subject: [PATCH 243/249] comment --- projects/mtg/bin/Res/sets/primitives/unsupported.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/projects/mtg/bin/Res/sets/primitives/unsupported.txt b/projects/mtg/bin/Res/sets/primitives/unsupported.txt index 6338488fa..be4eec13f 100644 --- a/projects/mtg/bin/Res/sets/primitives/unsupported.txt +++ b/projects/mtg/bin/Res/sets/primitives/unsupported.txt @@ -12498,6 +12498,7 @@ text=Pyrotechnics deals 4 damage divided as you choose among any number of targe mana={4}{R} type=Sorcery [/card] +#anyzone is basic for now and used for cdaactive [card] name=Qasali Ambusher text=Reach -- If a creature is attacking you and you control a Forest and a Plains, you may cast Qasali Ambusher without paying its mana cost and as though it had flash. @@ -12812,6 +12813,7 @@ mana={2}{U} type=Enchantment subtype=Aura [/card] +#needs suspend ability not suspend activated ability [card] name=Reality Strobe text=Return target permanent to its owner's hand. Exile Reality Strobe with three time counters on it. -- Suspend 3 - {2}{U} (Rather than cast this card from your hand, you may pay {2}{U} and exile it with three time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost.) From 6f4cf9e941b542a9aa147f363957809483b4694d Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sat, 7 Nov 2015 19:16:31 +0800 Subject: [PATCH 244/249] Aluren & Omniscience MayAbility + resolve instead of MenuAbility + addtogame for dredge??? --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 15 +++++++ .../bin/Res/sets/primitives/unsupported.txt | 10 ++--- projects/mtg/include/MTGRules.h | 16 +++---- projects/mtg/src/MTGRules.cpp | 42 ++++++++++--------- 4 files changed, 50 insertions(+), 33 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index bb577a278..31a52ec1f 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -2405,6 +2405,14 @@ mana={1}{B}{S(creature|mybattlefield)} type=Instant [/card] [card] +name=Aluren +auto=lord(creature[manacost<=3]|hand,exile,graveyard) zerocast forcedalive +auto=lord(creature[manacost<=3]|hand,exile,graveyard) spellmastery forcedalive +text=Any player may play creature cards with converted mana cost 3 or less without paying their mana cost and as though they had flash. +mana={2}{G}{G} +type=Enchantment +[/card] +[card] name=Amass the Components auto=draw:3 controller auto=bottomoflibrary notatarget(*|myhand) @@ -69047,6 +69055,13 @@ power=3 toughness=3 [/card] [card] +name=Omniscience +auto=lord(*[-land]|myhand) zerocast forcedalive +text=You may cast nonland cards from your hand without paying their mana costs. +mana={7}{U}{U}{U} +type=Enchantment +[/card] +[card] name=Ondu Cleric auto=may life:type:ally:mybattlefield controller auto=@movedTo(other ally|myBattlefield):may life:type:ally:mybattlefield controller diff --git a/projects/mtg/bin/Res/sets/primitives/unsupported.txt b/projects/mtg/bin/Res/sets/primitives/unsupported.txt index be4eec13f..be85531ce 100644 --- a/projects/mtg/bin/Res/sets/primitives/unsupported.txt +++ b/projects/mtg/bin/Res/sets/primitives/unsupported.txt @@ -224,12 +224,6 @@ mana={1}{U} type=Instant [/card] [card] -name=Aluren -text=Any player may play creature cards with converted mana cost 3 or less without paying their mana cost and as though they had flash. -mana={2}{G}{G} -type=Enchantment -[/card] -[card] name=Amber Prison text=You may choose not to untap Amber Prison during your untap step. -- {4}, {T}: Tap target artifact, creature, or land. That permanent doesn't untap during its controller's untap step for as long as Amber Prison remains tapped. mana={4} @@ -3954,6 +3948,7 @@ subtype=Djinn power=3 toughness=5 [/card] +#needs alias borderline [card] name=Djinn of Wishes text=Flying -- Djinn of Wishes enters the battlefield with three wish counters on it. -- {2}{U}{U}, Remove a wish counter from Djinn of Wishes: Reveal the top card of your library. You may play that card without paying its mana cost. If you don't, exile it. @@ -8742,6 +8737,7 @@ text=Look at the top five cards of your library. You may reveal any number of cr mana={2}{G} type=Sorcery [/card] +#needs alias borderline [card] name=Leaf-Crowned Elder text=Kinship - At the beginning of your upkeep, you may look at the top card of your library. If it shares a creature type with Leaf-Crowned Elder, you may reveal it. If you do, you may play that card without paying its mana cost. @@ -9863,6 +9859,7 @@ text=Each opponent reveals cards from the top of his or her library until he or mana={X}{U}{B} type=Sorcery [/card] +#needs alias [card] name=Mind's Desire text=Shuffle your library. Then exile the top card of your library. Until end of turn, you may play that card without paying its mana cost. (If it has X in its mana cost, X is 0.) -- Storm (When you cast this spell, copy it for each spell cast before it this turn.) @@ -11075,6 +11072,7 @@ text=Look at the top three cards of your library, then put them back in any orde mana={1}{U} type=Sorcery [/card] +#needs alias [card] name=Omen Machine mana={6} diff --git a/projects/mtg/include/MTGRules.h b/projects/mtg/include/MTGRules.h index f617f556a..19fc9775c 100644 --- a/projects/mtg/include/MTGRules.h +++ b/projects/mtg/include/MTGRules.h @@ -298,15 +298,15 @@ public: class MTGDredgeRule: public PermanentAbility, public ReplacementEffect { public: - vectorsoulbonders; + //vectorsoulbonders; TargetChooser * tcb; - MTGAbility * dredgeAbility; - MTGAbility * targetAbility; - MTGAbility * targetAbilityAdder; - MTGAbility * targetAbility1; - MTGAbility * mod; - MTGAbility * activateDredge; - vectorpairing; + //MTGAbility * dredgeAbility; + //MTGAbility * targetAbility; + //MTGAbility * targetAbilityAdder; + //MTGAbility * targetAbility1; + //MTGAbility * mod; + //MTGAbility * activateDredge; + //vectorpairing; MTGDredgeRule(GameObserver* observer, int _id); WEvent * replace(WEvent *e); virtual ostream& toString(ostream& out) const; diff --git a/projects/mtg/src/MTGRules.cpp b/projects/mtg/src/MTGRules.cpp index d43c870ac..d2bd12990 100644 --- a/projects/mtg/src/MTGRules.cpp +++ b/projects/mtg/src/MTGRules.cpp @@ -1189,6 +1189,10 @@ int MTGPayZeroRule::reactToClick(MTGCardInstance * card) return 0; ManaCost * cost = NEW ManaCost(ManaCost::parseManaCost("{0}",NULL,NULL)); + if(card->getIncreasedManaCost()->getConvertedCost()) + cost->add(card->getIncreasedManaCost()); + if(card->getReducedManaCost()->getConvertedCost()) + cost->remove(card->getReducedManaCost()); card->paymenttype = MTGAbility::PAYZERO_COST; @@ -2190,9 +2194,9 @@ MTGDredgeRule::MTGDredgeRule(GameObserver* observer, int _id) : PermanentAbility(observer, _id) { tcb = NULL; - dredgeAbility = NULL; - targetAbility = NULL; - mod = NULL; + //dredgeAbility = NULL; + //targetAbility = NULL; + //mod = NULL; } ; @@ -2249,26 +2253,26 @@ WEvent * MTGDredgeRule::replace(WEvent * event) } //there is a memleak here that i have no idea what causes it. - dredgeAbility = NEW dredgeCard(game, game->mLayers->actionLayer()->getMaxId(), card,NULL); - dredgeAbility->oneShot = true; - targetAbility = NEW GenericTargetAbility(game, "Dredge A Card","",game->mLayers->actionLayer()->getMaxId(), card,tcb->clone(),dredgeAbility->clone()); - targetAbility->oneShot = true; - SAFE_DELETE(dredgeAbility); + dredgeCard *dc = NEW dredgeCard(game, game->mLayers->actionLayer()->getMaxId(), card,NULL); + dc->oneShot = true; + GenericTargetAbility *gta = NEW GenericTargetAbility(game, "Dredge A Card","",game->mLayers->actionLayer()->getMaxId(), card,tcb->clone(),dc->clone()); + gta->oneShot = true; + //SAFE_DELETE(dredgeAbility); - targetAbilityAdder = NEW GenericAddToGame(game, game->mLayers->actionLayer()->getMaxId(), card,NULL,targetAbility->clone()); - targetAbilityAdder->oneShot = true; - SAFE_DELETE(targetAbility); - MTGAbility * setDredge = targetAbilityAdder->clone(); - SAFE_DELETE(targetAbilityAdder); - setDredge->oneShot = true; + GenericAddToGame *gatg = NEW GenericAddToGame(game, game->mLayers->actionLayer()->getMaxId(), card,NULL,gta->clone()); + gatg->oneShot = true; + //SAFE_DELETE(targetAbility); + //MTGAbility * setDredge = targetAbilityAdder->clone(); + //SAFE_DELETE(targetAbilityAdder); + //setDredge->oneShot = true; - selection.push_back(setDredge); - targetAbility1 = NEW AADrawer(game, this->GetId(), card,card,NULL, "1",TargetChooser::CONTROLLER,true); - selection.push_back(targetAbility1); - MTGAbility * menuChoice = NEW MenuAbility(game, this->GetId(), card, card,true,selection,card->controller(),"Dredge or Draw"); + selection.push_back(gatg); + AADrawer *ad = NEW AADrawer(game, game->mLayers->actionLayer()->getMaxId(), card,card,NULL, "1",TargetChooser::CONTROLLER,true); + selection.push_back(ad); + MenuAbility * menuChoice = NEW MenuAbility(game, game->mLayers->actionLayer()->getMaxId(), card, card,true,selection,card->controller(),"Dredge or Draw"); menuChoice->addToGame(); - SAFE_DELETE(tcb); + //SAFE_DELETE(tcb); } SAFE_DELETE(event); From a22991758f78cff20868cad3f4e89f22fa44dba4 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sun, 8 Nov 2015 18:18:33 +0800 Subject: [PATCH 245/249] mana producer for lands you/opponent could produce reflecting pool, exotic orchard... --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 84 ++++++++++++- .../bin/Res/sets/primitives/unsupported.txt | 44 +------ projects/mtg/include/AllAbilities.h | 110 ++++++++++++++++++ projects/mtg/src/CardGui.cpp | 2 + 4 files changed, 196 insertions(+), 44 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 31a52ec1f..fd72dec5b 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -31743,6 +31743,16 @@ mana={4}{B} type=Sorcery [/card] [card] +name=Exotic Orchard +auto=this(variable{olandg}>0) {t}:add{g} +auto=this(variable{olandu}>0) {t}:add{u} +auto=this(variable{olandr}>0) {t}:add{r} +auto=this(variable{olandb}>0) {t}:add{b} +auto=this(variable{olandw}>0) {t}:add{w} +text={T}: Add to your mana pool one mana of any color that a land an opponent controls could produce. +type=Land +[/card] +[card] name=Expedition Map auto={2}{T}{S}:moveTo(ownerhand) target(land|myLibrary) text={2}, {T}, Sacrifice Expedition Map: Search your library for a land card, reveal it, and put it into your hand. Then shuffle your library. @@ -33223,6 +33233,17 @@ power=4 toughness=6 [/card] [card] +name=Fellwar Stone +auto=this(variable{olandg}>0) {t}:add{g} +auto=this(variable{olandu}>0) {t}:add{u} +auto=this(variable{olandr}>0) {t}:add{r} +auto=this(variable{olandb}>0) {t}:add{b} +auto=this(variable{olandw}>0) {t}:add{w} +text={T}: Add to your mana pool one mana of any color that a land an opponent controls could produce. +mana={2} +type=Artifact +[/card] +[card] name=Femeref Archers auto={T}:damage:4 target(creature[attacking;flying]) text={T}: Femeref Archers deals 4 damage to target attacking creature with flying. @@ -34522,6 +34543,15 @@ power=2 toughness=3 [/card] [card] +name=Flame Wave +target=player +auto=damage:4 +auto=damage:4 all(creature|targetedpersonsbattlefield) +text=Flame Wave deals 4 damage to target player and each creature he or she controls. +mana={3}{R}{R}{R}{R} +type=Sorcery +[/card] +[card] name=Flameblast Dragon abilities=flying auto=this(attacking) {X}{R}:thisforeach(X) damage:1 target(creature,player) limit:1 @@ -36843,7 +36873,7 @@ type=Sorcery [/card] [card] name=Fumiko the Lowblood -auto=bushido(type:creature[attacking]:battlefield/type:creature[attacking]:battlefield) +auto=aslongas(creature[attacking]) bushido(type:creature[attacking]:battlefield/type:creature[attacking]:battlefield) auto=lord(creature|opponentBattlefield) mustattack text=Fumiko the Lowblood has bushido X, where X is the number of attacking creatures. (When this blocks or becomes blocked, it gets +X/+X until end of turn.) -- Creatures your opponents control attack each turn if able. mana={2}{R}{R} @@ -44122,6 +44152,20 @@ power=3 toughness=2 [/card] [card] +name=Harvester Druid +auto=this(variable{plandg}>0) {t}:add{g} +auto=this(variable{plandu}>0) {t}:add{u} +auto=this(variable{plandr}>0) {t}:add{r} +auto=this(variable{plandb}>0) {t}:add{b} +auto=this(variable{plandw}>0) {t}:add{w} +text={T}: Add to your mana pool one mana of any color that a land you control could produce. +mana={1}{G} +type=Creature +subtype=Human Druid +power=1 +toughness=1 +[/card] +[card] name=Harvester of Souls abilities=deathtouch auto=@movedTo(other creature[-token]|graveyard) from(battlefield):draw:1 controller @@ -76353,6 +76397,20 @@ power=1 toughness=1 [/card] [card] +name=Quirion Explorer +auto=this(variable{olandg}>0) {t}:add{g} +auto=this(variable{olandu}>0) {t}:add{u} +auto=this(variable{olandr}>0) {t}:add{r} +auto=this(variable{olandb}>0) {t}:add{b} +auto=this(variable{olandw}>0) {t}:add{w} +text={T}: Add to your mana pool one mana of any color that a land an opponent controls could produce. +mana={1}{G} +type=Creature +subtype=Elf Druid Scout +power=1 +toughness=1 +[/card] +[card] name=Quirion Ranger auto={H(forest|myBattlefield)}:untap target(creature) limit:1 text=Return a Forest you control to its owner's hand: Untap target creature. Activate this ability only once each turn. @@ -78703,6 +78761,16 @@ power=0 toughness=2 [/card] [card] +name=Reflecting Pool +auto=this(variable{plandg}>0) {t}:add{g} +auto=this(variable{plandu}>0) {t}:add{u} +auto=this(variable{plandr}>0) {t}:add{r} +auto=this(variable{plandb}>0) {t}:add{b} +auto=this(variable{plandw}>0) {t}:add{w} +text={T}: Add to your mana pool one mana of any type that a land you control could produce. +type=Land +[/card] +[card] name=Reflex Sliver auto=lord(sliver) haste text=All Sliver creatures have haste. @@ -98929,6 +98997,20 @@ power=* toughness=4 [/card] [card] +name=Sylvok Explorer +auto=this(variable{olandg}>0) {t}:add{g} +auto=this(variable{olandu}>0) {t}:add{u} +auto=this(variable{olandr}>0) {t}:add{r} +auto=this(variable{olandb}>0) {t}:add{b} +auto=this(variable{olandw}>0) {t}:add{w} +text={T}: Add to your mana pool one mana of any color that a land an opponent controls could produce. +mana={1}{G} +type=Creature +subtype=Human Druid +power=1 +toughness=1 +[/card] +[card] name=Sylvok Lifestaff auto=1/0 auto=@movedTo(mytgt|graveyard) from(battlefield):all(trigger[to]) life:3 controller diff --git a/projects/mtg/bin/Res/sets/primitives/unsupported.txt b/projects/mtg/bin/Res/sets/primitives/unsupported.txt index be85531ce..22d44537e 100644 --- a/projects/mtg/bin/Res/sets/primitives/unsupported.txt +++ b/projects/mtg/bin/Res/sets/primitives/unsupported.txt @@ -4763,11 +4763,6 @@ power=1 toughness=2 [/card] [card] -name=Exotic Orchard -text={T}: Add to your mana pool one mana of any color that a land an opponent controls could produce. -type=Land -[/card] -[card] name=Experiment Kraj text=Experiment Kraj has all activated abilities of each other creature with a +1/+1 counter on it. -- {T}: Put a +1/+1 counter on target creature. mana={2}{G}{G}{U}{U} @@ -4986,12 +4981,6 @@ type=Enchantment subtype=Aura [/card] [card] -name=Fellwar Stone -text={T}: Add to your mana pool one mana of any color that a land an opponent controls could produce. -mana={2} -type=Artifact -[/card] -[card] name=Feral Contest text=Put a +1/+1 counter on target creature you control. Another target creature blocks it this turn if able. mana={3}{G} @@ -6861,15 +6850,6 @@ power=1 toughness=1 [/card] [card] -name=Harvester Druid -text={T}: Add to your mana pool one mana of any color that a land you control could produce. -mana={1}{G} -type=Creature -subtype=Human Druid -power=1 -toughness=1 -[/card] -[card] name=Hatred text=As an additional cost to cast Hatred, pay X life. -- Target creature gets +X/+0 until end of turn. mana={3}{B}{B} @@ -12614,15 +12594,6 @@ mana={1}{U} type=Sorcery [/card] [card] -name=Quirion Explorer -text={T}: Add to your mana pool one mana of any color that a land an opponent controls could produce. -mana={1}{G} -type=Creature -subtype=Elf Druid Scout -power=1 -toughness=1 -[/card] -[card] name=R&D's Secret Lair mana= type=Legendary Land @@ -12923,11 +12894,6 @@ mana={4} type=Artifact [/card] [card] -name=Reflecting Pool -text={T}: Add to your mana pool one mana of any type that a land you control could produce. -type=Land -[/card] -[card] name=Refraction Trap text=If an opponent cast a red instant or sorcery spell this turn, you may pay {W} rather than pay Refraction Trap's mana cost. -- Prevent the next 3 damage that a source of your choice would deal to you and/or permanents you control this turn. If damage is prevented this way, Refraction Trap deals that much damage to target creature or player. mana={3}{W} @@ -15570,6 +15536,7 @@ subtype=Monger power=3 toughness=3 [/card] +#needs alias [card] name=Squandered Resources text=Sacrifice a land: Add to your mana pool one mana of any type the sacrificed land could produce. @@ -16214,15 +16181,6 @@ power=2 toughness=2 [/card] [card] -name=Sylvok Explorer -text={T}: Add to your mana pool one mana of any color that a land an opponent controls could produce. -mana={1}{G} -type=Creature -subtype=Human Druid -power=1 -toughness=1 -[/card] -[card] name=Symbol Status mana={2}{G}{G} type=Sorcery diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index 66b33ff29..015bd2176 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -668,6 +668,116 @@ private: { intValue = target->controller()->handsize; } + else if (s == "olandg") + { + intValue = 0; + for (size_t i = 0; i < target->getObserver()->mLayers->actionLayer()->manaObjects.size(); i++) + {//start + MTGAbility * a = ((MTGAbility *) target->getObserver()->mLayers->actionLayer()->manaObjects[i]); + AManaProducer * amp = dynamic_cast (a); + if (amp && amp->source->isLand() && amp->source->controller() == target->controller()->opponent() && amp->output->hasColor(1)) + intValue = 1; + }//end + } + else if (s == "olandu") + { + intValue = 0; + for (size_t i = 0; i < target->getObserver()->mLayers->actionLayer()->manaObjects.size(); i++) + {//start + MTGAbility * a = ((MTGAbility *) target->getObserver()->mLayers->actionLayer()->manaObjects[i]); + AManaProducer * amp = dynamic_cast (a); + if (amp && amp->source->isLand() && amp->source->controller() == target->controller()->opponent() && amp->output->hasColor(2)) + intValue = 1; + }//end + } + else if (s == "olandr") + { + intValue = 0; + for (size_t i = 0; i < target->getObserver()->mLayers->actionLayer()->manaObjects.size(); i++) + {//start + MTGAbility * a = ((MTGAbility *) target->getObserver()->mLayers->actionLayer()->manaObjects[i]); + AManaProducer * amp = dynamic_cast (a); + if (amp && amp->source->isLand() && amp->source->controller() == target->controller()->opponent() && amp->output->hasColor(3)) + intValue = 1; + }//end + } + else if (s == "olandb") + { + intValue = 0; + for (size_t i = 0; i < target->getObserver()->mLayers->actionLayer()->manaObjects.size(); i++) + {//start + MTGAbility * a = ((MTGAbility *) target->getObserver()->mLayers->actionLayer()->manaObjects[i]); + AManaProducer * amp = dynamic_cast (a); + if (amp && amp->source->isLand() && amp->source->controller() == target->controller()->opponent() && amp->output->hasColor(4)) + intValue = 1; + }//end + } + else if (s == "olandw") + { + intValue = 0; + for (size_t i = 0; i < target->getObserver()->mLayers->actionLayer()->manaObjects.size(); i++) + {//start + MTGAbility * a = ((MTGAbility *) target->getObserver()->mLayers->actionLayer()->manaObjects[i]); + AManaProducer * amp = dynamic_cast (a); + if (amp && amp->source->isLand() && amp->source->controller() == target->controller()->opponent() && amp->output->hasColor(5)) + intValue = 1; + }//end + } + else if (s == "plandg") + { + intValue = 0; + for (size_t i = 0; i < target->getObserver()->mLayers->actionLayer()->manaObjects.size(); i++) + {//start + MTGAbility * a = ((MTGAbility *) target->getObserver()->mLayers->actionLayer()->manaObjects[i]); + AManaProducer * amp = dynamic_cast (a); + if (amp && amp->source->isLand() && amp->source->controller() == target->controller() && amp->output->hasColor(1)) + intValue = 1; + }//end + } + else if (s == "plandu") + { + intValue = 0; + for (size_t i = 0; i < target->getObserver()->mLayers->actionLayer()->manaObjects.size(); i++) + {//start + MTGAbility * a = ((MTGAbility *) target->getObserver()->mLayers->actionLayer()->manaObjects[i]); + AManaProducer * amp = dynamic_cast (a); + if (amp && amp->source->isLand() && amp->source->controller() == target->controller() && amp->output->hasColor(2)) + intValue = 1; + }//end + } + else if (s == "plandr") + { + intValue = 0; + for (size_t i = 0; i < target->getObserver()->mLayers->actionLayer()->manaObjects.size(); i++) + {//start + MTGAbility * a = ((MTGAbility *) target->getObserver()->mLayers->actionLayer()->manaObjects[i]); + AManaProducer * amp = dynamic_cast (a); + if (amp && amp->source->isLand() && amp->source->controller() == target->controller() && amp->output->hasColor(3)) + intValue = 1; + }//end + } + else if (s == "plandb") + { + intValue = 0; + for (size_t i = 0; i < target->getObserver()->mLayers->actionLayer()->manaObjects.size(); i++) + {//start + MTGAbility * a = ((MTGAbility *) target->getObserver()->mLayers->actionLayer()->manaObjects[i]); + AManaProducer * amp = dynamic_cast (a); + if (amp && amp->source->isLand() && amp->source->controller() == target->controller() && amp->output->hasColor(4)) + intValue = 1; + }//end + } + else if (s == "plandw") + { + intValue = 0; + for (size_t i = 0; i < target->getObserver()->mLayers->actionLayer()->manaObjects.size(); i++) + {//start + MTGAbility * a = ((MTGAbility *) target->getObserver()->mLayers->actionLayer()->manaObjects[i]); + AManaProducer * amp = dynamic_cast (a); + if (amp && amp->source->isLand() && amp->source->controller() == target->controller() && amp->output->hasColor(5)) + intValue = 1; + }//end + } else if (s == "controllerturn")//intvalue = 1 if its your turn this(variable{controllerturn}) { intValue = 0; diff --git a/projects/mtg/src/CardGui.cpp b/projects/mtg/src/CardGui.cpp index 00fec3c32..9b53f9041 100644 --- a/projects/mtg/src/CardGui.cpp +++ b/projects/mtg/src/CardGui.cpp @@ -365,6 +365,8 @@ void CardGui::Render() buff = "CT"; if(!card->isToken && card->isACopier) buff = "C"; + if(game && card->has(Constants::PAYZERO) && ((card->currentZone == card->controller()->game->hand) || (card->has(Constants::CANPLAYFROMGRAVEYARD) && card->currentZone == card->controller()->game->graveyard) || (card->has(Constants::CANPLAYFROMEXILE) && card->currentZone == card->controller()->game->exile))) + buff += "Z"; if(card->alias == 0000) { if(card->chooseacolor == 1) From 4f9f84fc6ac056ec65a807a806318eaddfe62701 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sun, 8 Nov 2015 20:56:31 +0800 Subject: [PATCH 246/249] comment unsupported --- projects/mtg/bin/Res/sets/primitives/unsupported.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/projects/mtg/bin/Res/sets/primitives/unsupported.txt b/projects/mtg/bin/Res/sets/primitives/unsupported.txt index 22d44537e..2ad1ef6c6 100644 --- a/projects/mtg/bin/Res/sets/primitives/unsupported.txt +++ b/projects/mtg/bin/Res/sets/primitives/unsupported.txt @@ -1217,6 +1217,7 @@ text=Blazing Salvo deals 3 damage to target creature unless that creature's cont mana={R} type=Instant [/card] +#blazing torch is source of damage but the equipped creature has the activated ability... weird [card] name=Blazing Torch text=Equipped creature can't be blocked by Vampires or Zombies. -- Equipped creature has "{T}, Sacrifice Blazing Torch: Blazing Torch deals 2 damage to target creature or player." -- Equip {1} From 406f68ac5b040d7201b8808c4ce716b44f612c12 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 9 Nov 2015 19:04:31 +0800 Subject: [PATCH 247/249] Overload Cards the alias is for the Overload Check and Alternate Cost Restriction... ???Bestow??? --- projects/mtg/bin/Res/rules/Blitzkrieg.txt | 2 + projects/mtg/bin/Res/rules/hermit.txt | 2 + projects/mtg/bin/Res/rules/mtg.txt | 3 +- projects/mtg/bin/Res/sets/primitives/mtg.txt | 152 ++++++++++++++++++ .../bin/Res/sets/primitives/unsupported.txt | 72 --------- projects/mtg/include/MTGAbility.h | 2 + projects/mtg/include/MTGCardInstance.h | 2 +- projects/mtg/include/MTGRules.h | 15 +- projects/mtg/include/ManaCost.h | 4 +- projects/mtg/src/ActionStack.cpp | 6 + projects/mtg/src/MTGAbility.cpp | 14 +- projects/mtg/src/MTGGameZones.cpp | 2 +- projects/mtg/src/MTGRules.cpp | 63 +++++++- 13 files changed, 259 insertions(+), 80 deletions(-) diff --git a/projects/mtg/bin/Res/rules/Blitzkrieg.txt b/projects/mtg/bin/Res/rules/Blitzkrieg.txt index 7e534542e..38ac460df 100644 --- a/projects/mtg/bin/Res/rules/Blitzkrieg.txt +++ b/projects/mtg/bin/Res/rules/Blitzkrieg.txt @@ -13,6 +13,8 @@ auto=flashbackrule auto=retracerule auto=suspendrule auto=morphrule +auto=payzerorule +auto=overloadrule auto=attackrule auto=blockrule auto=combattriggerrule diff --git a/projects/mtg/bin/Res/rules/hermit.txt b/projects/mtg/bin/Res/rules/hermit.txt index ab454866d..6bd9d460a 100644 --- a/projects/mtg/bin/Res/rules/hermit.txt +++ b/projects/mtg/bin/Res/rules/hermit.txt @@ -12,6 +12,8 @@ auto=flashbackrule auto=retracerule auto=suspendrule auto=morphrule +auto=payzerorule +auto=overloadrule auto=attackrule auto=blockrule auto=combattriggerrule diff --git a/projects/mtg/bin/Res/rules/mtg.txt b/projects/mtg/bin/Res/rules/mtg.txt index 38f2f9b84..eec78cfb1 100644 --- a/projects/mtg/bin/Res/rules/mtg.txt +++ b/projects/mtg/bin/Res/rules/mtg.txt @@ -16,7 +16,8 @@ auto=flashbackrule auto=retracerule auto=suspendrule auto=morphrule -auto=playfromgraveyardrule +auto=payzerorule +auto=overloadrule auto=attackrule auto=blockrule auto=combattriggerrule diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index fd72dec5b..3dc75140d 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -10933,6 +10933,17 @@ power=2 toughness=1 [/card] [card] +name=Blustersquall +alias=110000 +other={3}{U} name(Overload) +target=creature|opponentbattlefield +auto=overload tap all(creature|opponentbattlefield) +auto=paidmana tap +text=Tap target creature you don't control. -- Overload {3}{U} (You may cast this spell for its overload cost. If you do, change its text by replacing all instances of "target" with "each.") +mana={U} +type=Instant +[/card] +[card] name=Boa Constrictor auto={T}:3/3 text={T}: Boa Constrictor gets +3/+3 until end of turn. @@ -16254,6 +16265,19 @@ mana={G} type=Sorcery [/card] [card] +name=Chemister's Trick +alias=110000 +other={3}{U}{R} name(Overload) +target=creature|opponentbattlefield +auto=paidmana -2/0 +auto=paidmana mustattack +auto=overload -2/0 all(creature|opponentbattlefield) +auto=overload mustattack all(creature|opponentbattlefield) +text=Target creature you don't control gets -2/-0 until end of turn and attacks this turn if able. -- Overload {3}{U}{R} (You may cast this spell for its overload cost. If you do, change its text by replacing all instances of "target" with "each.") +mana={U}{R} +type=Instant +[/card] +[card] name=Chief of the Edge auto=lord(other warrior|myBattlefield) 1/0 text=Other Warrior creatures you control get +1/+0. @@ -19374,6 +19398,18 @@ mana={3}{U}{U} type=Instant [/card] [card] +name=Counterflux +alias=110000 +other={1}{U}{U}{R} name(Overload) +abilities=nofizzle +target=*|opponentstack +auto=paidmana fizzle +auto=overload fizzle all(*|opponentstack) +text=Counterflux can't be countered by spells or abilities. -- Counter target spell you don't control. -- Overload {1}{U}{U}{R} (You may cast this spell for its overload cost. If you do, change its text by replacing all instances of "target" with "each.") +mana={U}{U}{R} +type=Instant +[/card] +[card] name=Counterintelligence target=creature auto=moveTo(ownerhand) @@ -21170,6 +21206,17 @@ mana={3}{B} type=Instant [/card] [card] +name=Cyclonic Rift +alias=110000 +other={6}{U} name(Overload) +target=*[-land]|opponentbattlefield +auto=overload moveto(ownerhand) all(*[-land]|opponentbattlefield) +auto=paidmana moveto(ownerhand) +text=Return target nonland permanent you don't control to its owner's hand. -- Overload {6}{U} (You may cast this spell for its overload cost. If you do, change its text by replacing all instances of "target" with "each.") +mana={1}{U} +type=Instant +[/card] +[card] name=Cyclopean Mummy auto=@movedTo(this|graveyard) from(battlefield):moveto(exile) text=When Cyclopean Mummy dies, exile Cyclopean Mummy. @@ -25946,6 +25993,17 @@ mana={1}{U} type=Instant [/card] [card] +name=Downsize +alias=110000 +other={2}{U} name(Overload) +target=creature|opponentbattlefield +auto=overload -4/0 all(creature|opponentbattlefield) +auto=paidmana -4/0 +text=Target creature you don't control gets -4/-0 until end of turn. -- Overload {2}{U} (You may cast this spell for its overload cost. If you do, change its text by replacing all instances of "target" with "each.") +mana={U} +type=Instant +[/card] +[card] name=Dowsing Shaman auto={2}{G}{T}:moveTo(myhand) target(enchantment|mygraveyard) text={2}{G}, {T}: Return target enchantment card from your graveyard to your hand. @@ -28225,6 +28283,17 @@ type=Enchantment subtype=Aura [/card] [card] +name=Dynacharge +alias=110000 +other={2}{R} name(Overload) +target=creature|mybattlefield +auto=paidmana 2/0 +auto=overload all(creature|mybattlefield) 2/0 +text=Target creature you control gets +2/+0 until end of turn. -- Overload {2}{R} (You may cast this spell for its overload cost. If you do, change its text by replacing all instances of "target" with "each.") +mana={R} +type=Instant +[/card] +[card] name=Dystopia auto=cumulativeupcost[{L}] sacrifice auto=@each opponent upkeep:ability$!name(sacrifice) notatarget(creature[green;white]|mybattlefield) sacrifice !$ opponent @@ -28974,6 +29043,17 @@ power=1 toughness=1 [/card] [card] +name=Electrickery +alias=110000 +other={1}{R} name(Overload) +target=creature|opponentbattlefield +auto=paidmana damage:1 +auto=overload damage:1 all(creature|opponentbattlefield) +text=Electrickery deals 1 damage to target creature you don't control. -- Overload {1}{R} (You may cast this spell for its overload cost. If you do, change its text by replacing all instances of "target" with "each.") +mana={R} +type=Instant +[/card] +[card] name=Electrolyze target=creature,player auto=damage:1 @@ -63401,6 +63481,30 @@ power=4 toughness=4 [/card] [card] +name=Mizzium Mortars +alias=110000 +other={3}{R}{R}{R} name(Overload) +target=creature|opponentbattlefield +auto=paidmana damage:4 +auto=overload damage:4 all(creature|opponentbattlefield) +text=Mizzium Mortars deals 4 damage to target creature you don't control. -- Overload {3}{R}{R}{R} (You may cast this spell for its overload cost. If you do, change its text by replacing all instances of "target" with "each.") +mana={1}{R} +type=Sorcery +[/card] +[card] +name=Mizzium Skin +alias=110000 +other={1}{U} name(Overload) +target=creature|mybattlefield +auto=paidmana 0/1 +auto=paidmana opponentshroud +auto=overload all(creature|mybattlefield) 0/1 +auto=overload all(creature|mybattlefield) opponentshroud +text=Target creature you control gets +0/+1 and gains hexproof until end of turn. -- Overload {1}{U} (You may cast this spell for its overload cost. If you do, change its text by replacing all instances of "target" with "each.") +mana={U} +type=Instant +[/card] +[card] name=Mnemonic Nexus auto=moveto(opponentlibrary) all(*|opponentgraveyard) && shuffle opponent auto=moveto(mylibrary) all(*|mygraveyard) && shuffle controller @@ -96955,6 +97059,17 @@ power=3 toughness=4 [/card] [card] +name=Street Spasm +alias=110000 +other={X}{X}{R}{R} name(Overload) +target=creature[-flying]|opponentbattlefield +auto=paidmana damage:X +auto=overload damage:XX all(creature[-flying]|opponentbattlefield) +text=Street Spasm deals X damage to target creature without flying you don't control. -- Overload {X}{X}{R}{R} (You may cast this spell for its overload cost. If you do, change its text by replacing all instances of "target" with "each.") +mana={X}{R} +type=Instant +[/card] +[card] name=Streetbreaker Wurm mana={3}{R}{G} type=Creature @@ -100365,6 +100480,19 @@ mana={U}{U}{U} type=Instant [/card] [card] +name=Teleportal +alias=110000 +other={3}{U}{R} name(Overload) +target=creature|mybattlefield +auto=paidmana 1/0 +auto=paidmana unblockable +auto=overload all(creature|mybattlefield) 1/0 +auto=overload all(creature|mybattlefield) unblockable +text=Target creature you control gets +1/+0 until end of turn and is unblockable this turn. -- Overload {3}{U}{R} (You may cast this spell for its overload cost. If you do, change its text by replacing all instances of "target" with "each.") +mana={U}{R} +type=Sorcery +[/card] +[card] name=Telethopter auto={T(creature|myBattlefield)}:flying text=Tap an untapped creature you control: Telethopter gains flying until end of turn. @@ -107662,6 +107790,17 @@ type=Enchantment subtype=Aura [/card] [card] +name=Vandalblast +alias=110000 +other={4}{R} name(Overload) +target=artifact|opponentbattlefield +auto=overload destroy all(artifact|opponentbattlefield) +auto=paidmana destroy +text=Destroy target artifact you don't control. -- Overload {4}{R} (You may cast this spell for its overload cost. If you do, change its text by replacing all instances of "target" with "each.") +mana={R} +type=Sorcery +[/card] +[card] name=Vanguard of Brimaz abilities=vigilance auto=@targeted(this) from(*[instant;sorcery;enchantment]|myhand,mygraveyard):token(Cat Soldier,Creature Cat Soldier,1/1,white,vigilance) controller @@ -112353,6 +112492,19 @@ mana={4} type=Artifact [/card] [card] +name=Weapon Surge +alias=110000 +other={1}{R} name(Overload) +target=creature|mybattlefield +auto=paidmana 1/0 +auto=paidmana first strike +auto=overload all(creature|mybattlefield) 1/0 +auto=overload all(creature|mybattlefield) first strike +text=Target creature you control gets +1/+0 and gains first strike until end of turn. -- Overload {1}{R} (You may cast this spell for its overload cost. If you do, change its text by replacing all instances of "target" with "each.") +mana={R} +type=Instant +[/card] +[card] name=Weathered Wayfarer auto={W}{T}:moveTo(myhand) target(land|mylibrary) restriction{type(land|opponentbattlefield)~morethan~type(land|mybattlefield)} text={W}, {T}: Search your library for a land card, reveal it, and put it into your hand. Then shuffle your library. Activate this ability only if an opponent controls more lands than you. diff --git a/projects/mtg/bin/Res/sets/primitives/unsupported.txt b/projects/mtg/bin/Res/sets/primitives/unsupported.txt index 2ad1ef6c6..565840ba0 100644 --- a/projects/mtg/bin/Res/sets/primitives/unsupported.txt +++ b/projects/mtg/bin/Res/sets/primitives/unsupported.txt @@ -1304,12 +1304,6 @@ type=Enchantment text=Each noncreature, non-Equipment artifact is an Equipment with equip {X} and "Equipped creature gets +X/+0," where X is that artifact's converted mana cost. [/card] [card] -name=Blustersquall -text=Tap target creature you don't control. -- Overload {3}{U} (You may cast this spell for its overload cost. If you do, change its text by replacing all instances of "target" with "each.") -mana={U} -type=Instant -[/card] -[card] name=Boar Umbra mana={2}{G} type=Enchantment @@ -2380,12 +2374,6 @@ type=Enchantment text=Whenever any spell is played, counter that spell if each player, other than the caster and his or her teammates, agrees to choose and discard a card. Those players must discard those cards after agreeing. Checks and Balances may be played only in a game with three or more players. [/card] [card] -name=Chemister's Trick -text=Target creature you don't control gets -2/-0 until end of turn and attacks this turn if able. -- Overload {3}{U}{R} (You may cast this spell for its overload cost. If you do, change its text by replacing all instances of "target" with "each.") -mana={U}{R} -type=Instant -[/card] -[card] name=Chicken Egg mana={1}{R} type=Summon — Egg @@ -2995,12 +2983,6 @@ mana={U}{U} type=Enchantment [/card] [card] -name=Counterflux -text=Counterflux can't be countered by spells or abilities. -- Counter target spell you don't control. -- Overload {1}{U}{U}{R} (You may cast this spell for its overload cost. If you do, change its text by replacing all instances of "target" with "each.") -mana={U}{U}{R} -type=Instant -[/card] -[card] name=Countryside Crusher text=At the beginning of your upkeep, reveal the top card of your library. If it's a land card, put it into your graveyard and repeat this process. -- Whenever a land card is put into your graveyard from anywhere, put a +1/+1 counter on Countryside Crusher. mana={1}{R}{R} @@ -3300,12 +3282,6 @@ mana={2}{G}{G} type=Enchantment [/card] [card] -name=Cyclonic Rift -text=Return target nonland permanent you don't control to its owner's hand. -- Overload {6}{U} (You may cast this spell for its overload cost. If you do, change its text by replacing all instances of "target" with "each.") -mana={1}{U} -type=Instant -[/card] -[card] name=Cyclopean Giant text=When Cyclopean Giant is put into a graveyard from the battlefield, target land becomes a Swamp. Exile Cyclopean Giant. mana={2}{B}{B} @@ -4071,12 +4047,6 @@ mana={3}{B} // {2}{G} type=Sorcery // Sorcery [/card] [card] -name=Downsize -text=Target creature you don't control gets -4/-0 until end of turn. -- Overload {2}{U} (You may cast this spell for its overload cost. If you do, change its text by replacing all instances of "target" with "each.") -mana={U} -type=Instant -[/card] -[card] name=Draco text=Domain - Draco costs {2} less to cast for each basic land type among lands you control. -- Flying -- Domain - At the beginning of your upkeep, sacrifice Draco unless you pay {1}0}. This cost is reduced by {2} for each basic land type among lands you control. mana={16} @@ -4278,12 +4248,6 @@ power=1 toughness=1 [/card] [card] -name=Dynacharge -text=Target creature you control gets +2/+0 until end of turn. -- Overload {2}{R} (You may cast this spell for its overload cost. If you do, change its text by replacing all instances of "target" with "each.") -mana={R} -type=Instant -[/card] -[card] name=Echo Chamber text={4}, {T}: An opponent chooses target creature he or she controls. Put a token that's a copy of that creature onto the battlefield. That token gains haste until end of turn. Exile the token at the beginning of the next end step. Activate this ability only any time you could cast a sorcery. mana={4} @@ -4334,12 +4298,6 @@ type=Land text={T}: Add {1} to your mana pool. {T}: Add {2} to your mana pool. Spend this mana only to cast colorless Eldrazi spells or activate abilities of colorless Eldrazi. [/card] [card] -name=Electrickery -text=Electrickery deals 1 damage to target creature you don't control. -- Overload {1}{R} (You may cast this spell for its overload cost. If you do, change its text by replacing all instances of "target" with "each.") -mana={R} -type=Instant -[/card] -[card] name=Electropotence text=Whenever a creature enters the battlefield under your control, you may pay {2}{R}. If you do, that creature deals damage equal to its power to target creature or player. mana={2}{R} @@ -10075,18 +10033,6 @@ mana={1}{U}{U} type=Sorcery [/card] [card] -name=Mizzium Mortars -text=Mizzium Mortars deals 4 damage to target creature you don't control. -- Overload {3}{R}{R}{R} (You may cast this spell for its overload cost. If you do, change its text by replacing all instances of "target" with "each.") -mana={1}{R} -type=Sorcery -[/card] -[card] -name=Mizzium Skin -text=Target creature you control gets +0/+1 and gains hexproof until end of turn. -- Overload {1}{U} (You may cast this spell for its overload cost. If you do, change its text by replacing all instances of "target" with "each.") -mana={U} -type=Instant -[/card] -[card] name=Mizzium Transreliquat text={3}: Mizzium Transreliquat becomes a copy of target artifact until end of turn. -- {1}{U}{R}: Mizzium Transreliquat becomes a copy of target artifact and gains this ability. mana={3} @@ -15879,12 +15825,6 @@ type=Enchantment subtype=Aura [/card] [card] -name=Street Spasm -text=Street Spasm deals X damage to target creature without flying you don't control. -- Overload {X}{X}{R}{R} (You may cast this spell for its overload cost. If you do, change its text by replacing all instances of "target" with "each.") -mana={X}{R} -type=Instant -[/card] -[card] name=Strength of the Tajuru text=Multikicker {1} (You may pay an additional {1} any number of times as you cast this spell.) -- Choose target creature, then choose another target creature for each time Strength of the Tajuru was kicked. Put X +1/+1 counters on each of them. mana={X}{G}{G} @@ -16368,12 +16308,6 @@ mana={U} type=Enchantment [/card] [card] -name=Teleportal -text=Target creature you control gets +1/+0 until end of turn and is unblockable this turn. -- Overload {3}{U}{R} (You may cast this spell for its overload cost. If you do, change its text by replacing all instances of "target" with "each.") -mana={U}{R} -type=Sorcery -[/card] -[card] name=Telling Time text=Look at the top three cards of your library. Put one of those cards into your hand, one on top of your library, and one on the bottom of your library. mana={1}{U} @@ -17394,12 +17328,6 @@ power=3 toughness=3 [/card] [card] -name=Vandalblast -text=Destroy target artifact you don't control. -- Overload {4}{R} (You may cast this spell for its overload cost. If you do, change its text by replacing all instances of "target" with "each.") -mana={R} -type=Sorcery -[/card] -[card] name=Vanguard's Shield text=Equipped creature gets +0/+3 and can block an additional creature. -- Equip {3} ({3}: Attach to target creature you control. Equip only as a sorcery.) mana={2} diff --git a/projects/mtg/include/MTGAbility.h b/projects/mtg/include/MTGAbility.h index 70d6344b9..d71d822f2 100644 --- a/projects/mtg/include/MTGAbility.h +++ b/projects/mtg/include/MTGAbility.h @@ -214,6 +214,8 @@ public: PUT_INTO_PLAY_WITH_KICKER = 31, STANDARD_FIZZLER = 32, PAYZERO_COST = 33, + OVERLOAD_COST = 34, + BESTOW_COST = 35, }; }; diff --git a/projects/mtg/include/MTGCardInstance.h b/projects/mtg/include/MTGCardInstance.h index 8c1882e91..f5b5cdc5e 100644 --- a/projects/mtg/include/MTGCardInstance.h +++ b/projects/mtg/include/MTGCardInstance.h @@ -55,7 +55,7 @@ public: Pos* view; int X; int castX; - int alternateCostPaid[ManaCost::MANA_PAID_WITH_SUSPEND + 1]; + int alternateCostPaid[ManaCost::MANA_PAID_WITH_BESTOW + 1]; int paymenttype; int castMethod; /* Tells if the card reached its current zone by being cast or not (brought into the zone by an effect). non 0 == cast, 0 == not cast */ int frozen; diff --git a/projects/mtg/include/MTGRules.h b/projects/mtg/include/MTGRules.h index 19fc9775c..7f95e8cb6 100644 --- a/projects/mtg/include/MTGRules.h +++ b/projects/mtg/include/MTGRules.h @@ -101,7 +101,7 @@ class MTGAlternativeCostRule: public PermanentAbility { protected: int isReactingToClick(MTGCardInstance * card, ManaCost * mana, ManaCost *alternateManaCost); - int reactToClick(MTGCardInstance * card, ManaCost * alternateManaCost, int paymentType = ManaCost::MANA_PAID); + int reactToClick(MTGCardInstance * card, ManaCost * alternateManaCost, int paymentType = ManaCost::MANA_PAID, bool overload = false); string alternativeName; public: int isReactingToClick(MTGCardInstance * card, ManaCost * mana = NULL); @@ -192,6 +192,19 @@ public: virtual MTGPayZeroRule * clone() const; }; +class MTGOverloadRule: public MTGAlternativeCostRule +{ +public: + int isReactingToClick(MTGCardInstance * card, ManaCost * mana = NULL); + int reactToClick(MTGCardInstance * card); + virtual ostream& toString(ostream& out) const; + MTGOverloadRule(GameObserver* observer, int _id); + const string getMenuText() + { + return "Overload"; + } + virtual MTGOverloadRule * clone() const; +}; class MTGSuspendRule: public MTGAlternativeCostRule { diff --git a/projects/mtg/include/ManaCost.h b/projects/mtg/include/ManaCost.h index bdc3868ab..21a6a2c99 100644 --- a/projects/mtg/include/ManaCost.h +++ b/projects/mtg/include/ManaCost.h @@ -48,7 +48,9 @@ public: MANA_PAID_WITH_RETRACE = 6, MANA_PAID_WITH_MORPH = 7, MANA_PAID_WITH_SUSPEND = 8, - MANA_PAID_WITH_OTHERCOST = 9 + MANA_PAID_WITH_OVERLOAD = 9, + MANA_PAID_WITH_BESTOW = 10, + MANA_PAID_WITH_OTHERCOST = 11 }; ExtraCosts * extraCosts; diff --git a/projects/mtg/src/ActionStack.cpp b/projects/mtg/src/ActionStack.cpp index 88de3027b..47bf7ae8a 100644 --- a/projects/mtg/src/ActionStack.cpp +++ b/projects/mtg/src/ActionStack.cpp @@ -303,6 +303,12 @@ bool Spell::FullfilledAlternateCost(const int &costType) case ManaCost::MANA_PAID_WITH_SUSPEND: hasFullfilledAlternateCost = (payResult == ManaCost::MANA_PAID_WITH_SUSPEND); break; + case ManaCost::MANA_PAID_WITH_OVERLOAD: + hasFullfilledAlternateCost = (payResult == ManaCost::MANA_PAID_WITH_OVERLOAD); + break; + case ManaCost::MANA_PAID_WITH_BESTOW: + hasFullfilledAlternateCost = (payResult == ManaCost::MANA_PAID_WITH_BESTOW); + break; } return hasFullfilledAlternateCost; diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index bcb131764..99cb4744b 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -39,7 +39,9 @@ const string kAlternateCostKeywords[] = "flashback", "retrace", "facedown", - "suspended" + "suspended", + "overload", + "bestow" }; const int kAlternateCostIds[] = { @@ -51,7 +53,9 @@ const int kAlternateCostIds[] = ManaCost::MANA_PAID_WITH_FLASHBACK, ManaCost::MANA_PAID_WITH_RETRACE, ManaCost::MANA_PAID_WITH_MORPH, - ManaCost::MANA_PAID_WITH_SUSPEND + ManaCost::MANA_PAID_WITH_SUSPEND, + ManaCost::MANA_PAID_WITH_OVERLOAD, + ManaCost::MANA_PAID_WITH_BESTOW }; //Used for "dynamic ability" parsing @@ -1162,6 +1166,12 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG observer->addObserver(NEW MTGPayZeroRule(observer, -1)); return NULL; } + found = s.find("overloadrule"); + if(found != string::npos) + { + observer->addObserver(NEW MTGOverloadRule(observer, -1)); + return NULL; + } //this rule handles attacking ability during attacker phase found = s.find("attackrule"); if(found != string::npos) diff --git a/projects/mtg/src/MTGGameZones.cpp b/projects/mtg/src/MTGGameZones.cpp index f74227a18..5fe7fcddd 100644 --- a/projects/mtg/src/MTGGameZones.cpp +++ b/projects/mtg/src/MTGGameZones.cpp @@ -546,7 +546,7 @@ MTGCardInstance * MTGGameZone::removeCard(MTGCardInstance * card, int createCopy copy->kicked = card->kicked; copy->storedCard = card->storedCard; copy->storedSourceCard = card->storedSourceCard; - for (int i = 0; i < ManaCost::MANA_PAID_WITH_SUSPEND +1; i++) + for (int i = 0; i < ManaCost::MANA_PAID_WITH_BESTOW +1; i++) copy->alternateCostPaid[i] = card->alternateCostPaid[i]; //stupid bug with tokens... diff --git a/projects/mtg/src/MTGRules.cpp b/projects/mtg/src/MTGRules.cpp index d2bd12990..88c31a78c 100644 --- a/projects/mtg/src/MTGRules.cpp +++ b/projects/mtg/src/MTGRules.cpp @@ -632,6 +632,8 @@ int MTGAlternativeCostRule::isReactingToClick(MTGCardInstance * card, ManaCost * return 0; if ((game->currentlyActing()->game->graveyard->hasCard(card) && !card->has(Constants::CANPLAYFROMGRAVEYARD)) || (game->currentlyActing()->game->exile->hasCard(card) && !card->has(Constants::CANPLAYFROMEXILE))) return 0; + if (card->alias == 110000) + return 0;//overload has its own rule return isReactingToClick( card, mana, alternateCost ); } @@ -693,12 +695,17 @@ int MTGAlternativeCostRule::reactToClick(MTGCardInstance * card) return reactToClick(card, alternateCost, ManaCost::MANA_PAID_WITH_ALTERNATIVE); } -int MTGAlternativeCostRule::reactToClick(MTGCardInstance * card, ManaCost *alternateCost, int alternateCostType){ +int MTGAlternativeCostRule::reactToClick(MTGCardInstance * card, ManaCost *alternateCost, int alternateCostType, bool overload){ Player * player = game->currentlyActing(); ManaPool * playerMana = player->getManaPool(); //this handles extra cost payments at the moment a card is played. + if(overload) + card->spellTargetType = ""; + else if(card->model->data->spellTargetType.size()) + card->spellTargetType = card->model->data->spellTargetType; + assert(alternateCost); if (alternateCost->isExtraPaymentSet() ) { @@ -1210,6 +1217,60 @@ MTGPayZeroRule * MTGPayZeroRule::clone() const return NEW MTGPayZeroRule(*this); } +MTGOverloadRule::MTGOverloadRule(GameObserver* observer, int _id) : +MTGAlternativeCostRule(observer, _id) +{ + aType = MTGAbility::OVERLOAD_COST; +} + +int MTGOverloadRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana) +{ + Player * player = game->currentlyActing(); + ManaCost * cost = NEW ManaCost(card->model->data->getManaCost()->getAlternative()); + if(card->getIncreasedManaCost()->getConvertedCost()) + cost->add(card->getIncreasedManaCost()); + if(card->getReducedManaCost()->getConvertedCost()) + cost->remove(card->getReducedManaCost()); + + if (card->isLand()) + return 0; + if (card->alias != 110000) + return 0; + if (!player->game->graveyard->hasCard(card) && !player->game->exile->hasCard(card) && !player->game->hand->hasCard(card)) + return 0; + if ((!card->has(Constants::CANPLAYFROMGRAVEYARD) && player->game->graveyard->hasCard(card))||(!card->has(Constants::CANPLAYFROMEXILE) && player->game->exile->hasCard(card))) + return 0; + + return MTGAlternativeCostRule::isReactingToClick(card, mana, cost); +} + +int MTGOverloadRule::reactToClick(MTGCardInstance * card) +{ + if (!isReactingToClick(card)) + return 0; + + ManaCost * cost = NEW ManaCost(card->model->data->getManaCost()->getAlternative()); + if(card->getIncreasedManaCost()->getConvertedCost()) + cost->add(card->getIncreasedManaCost()); + if(card->getReducedManaCost()->getConvertedCost()) + cost->remove(card->getReducedManaCost()); + + card->paymenttype = MTGAbility::OVERLOAD_COST; + + return MTGAlternativeCostRule::reactToClick(card, cost, ManaCost::MANA_PAID_WITH_OVERLOAD, true); +} + +ostream& MTGOverloadRule::toString(ostream& out) const +{ + out << "MTGOverloadRule ::: ("; + return MTGAbility::toString(out) << ")"; +} + +MTGOverloadRule * MTGOverloadRule::clone() const +{ + return NEW MTGOverloadRule(*this); +} + /////////////////////////////////////////////////////////////////////////////////////////////////// bool MTGAttackRule::select(Target* t) From cd1b629191be6c529268540e6cbf237bcf98dfe8 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Tue, 10 Nov 2015 11:58:36 +0800 Subject: [PATCH 248/249] Fix Segmentation Fault & Formatting --- projects/mtg/include/AllAbilities.h | 8 +- projects/mtg/include/DeckMenuItem.h | 52 +++--- projects/mtg/include/DuelLayers.h | 12 +- projects/mtg/include/ExtraCost.h | 2 +- projects/mtg/include/GameObserver.h | 30 ++-- projects/mtg/include/GameState.h | 2 +- projects/mtg/include/InteractiveButton.h | 4 +- projects/mtg/include/MTGAbility.h | 6 +- projects/mtg/include/MTGDefinitions.h | 24 +-- projects/mtg/include/MTGRules.h | 32 ++-- projects/mtg/include/ManaCost.h | 32 ++-- projects/mtg/include/MenuItem.h | 4 +- projects/mtg/include/ModRules.h | 8 +- projects/mtg/include/Player.h | 2 +- projects/mtg/include/Rules.h | 10 +- projects/mtg/include/SimpleButton.h | 10 +- projects/mtg/include/SimpleMenuItem.h | 4 +- projects/mtg/include/ThisDescriptor.h | 10 +- projects/mtg/include/WEvent.h | 26 +-- projects/mtg/include/WFont.h | 2 +- projects/mtg/include/WResourceManager.h | 30 ++-- projects/mtg/include/WResourceManagerImpl.h | 4 +- projects/mtg/include/utils.h | 2 +- projects/mtg/src/AIPlayerBaka.cpp | 14 +- projects/mtg/src/AIStats.cpp | 4 +- projects/mtg/src/ActionLayer.cpp | 4 +- projects/mtg/src/ActionStack.cpp | 24 +-- projects/mtg/src/AllAbilities.cpp | 100 ++++++------ projects/mtg/src/CardGui.cpp | 36 ++--- projects/mtg/src/Credits.cpp | 2 +- projects/mtg/src/Damage.cpp | 2 +- projects/mtg/src/DeckMenu.cpp | 30 ++-- projects/mtg/src/DeckMenuItem.cpp | 72 ++++----- projects/mtg/src/DeckStats.cpp | 4 +- projects/mtg/src/DuelLayers.cpp | 10 +- projects/mtg/src/GameApp.cpp | 4 +- projects/mtg/src/GameObserver.cpp | 170 ++++++++++---------- projects/mtg/src/GameOptions.cpp | 24 +-- projects/mtg/src/GameState.cpp | 4 +- projects/mtg/src/GameStateDuel.cpp | 2 +- projects/mtg/src/GameStateMenu.cpp | 30 ++-- projects/mtg/src/GameStateOptions.cpp | 4 +- projects/mtg/src/GameStateShop.cpp | 6 +- projects/mtg/src/GuiAvatars.cpp | 4 +- projects/mtg/src/GuiHand.cpp | 2 +- projects/mtg/src/GuiMana.cpp | 16 +- projects/mtg/src/GuiPlay.cpp | 6 +- projects/mtg/src/IconButton.cpp | 4 +- projects/mtg/src/InteractiveButton.cpp | 2 +- projects/mtg/src/MTGAbility.cpp | 86 +++++----- projects/mtg/src/MTGCardInstance.cpp | 12 +- projects/mtg/src/MTGDeck.cpp | 2 +- projects/mtg/src/MTGDefinitions.cpp | 62 +++---- projects/mtg/src/MTGGameZones.cpp | 16 +- projects/mtg/src/MTGPack.cpp | 2 +- projects/mtg/src/MTGRules.cpp | 144 ++++++++--------- projects/mtg/src/ManaCost.cpp | 6 +- projects/mtg/src/ModRules.cpp | 64 ++++---- projects/mtg/src/Player.cpp | 16 +- projects/mtg/src/Rules.cpp | 20 +-- projects/mtg/src/SimpleButton.cpp | 2 +- projects/mtg/src/SimpleMenu.cpp | 2 +- projects/mtg/src/SimplePopup.cpp | 90 +++++------ projects/mtg/src/TargetChooser.cpp | 6 +- projects/mtg/src/TestSuiteAI.cpp | 4 +- projects/mtg/src/TextScroller.cpp | 48 +++--- projects/mtg/src/WCachedResource.cpp | 24 +-- projects/mtg/src/WDataSrc.cpp | 6 +- projects/mtg/src/WFont.cpp | 4 +- projects/mtg/src/WResourceManager.cpp | 18 +-- projects/mtg/src/utils.cpp | 8 +- 71 files changed, 769 insertions(+), 769 deletions(-) diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index 015bd2176..0912bbe9c 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -960,12 +960,12 @@ private: else if (s == "morethanfourcards") { if(card->playerTarget) - {//blackvise + {//blackvise intValue = 0; if ((card->playerTarget->game->hand->nb_cards - 4)>0) intValue = (card->playerTarget->game->hand->nb_cards - 4); } - else + else {//viseling intValue = 0; if ((card->controller()->opponent()->game->hand->nb_cards - 4)>0) @@ -1306,7 +1306,7 @@ public: class TrcardDrawn: public Trigger { public: - bool thiscontroller, thisopponent; + bool thiscontroller, thisopponent; TrcardDrawn(GameObserver* observer, int id, MTGCardInstance * source, TargetChooser * tc,bool once = false, bool thiscontroller = false, bool thisopponent = false) : Trigger(observer, id, source,once, tc),thiscontroller(thiscontroller),thisopponent(thisopponent) { @@ -4721,7 +4721,7 @@ public: vector dontremove; bool addNewColors; bool remove; - bool removeCreatureSubtypes; + bool removeCreatureSubtypes; bool removeTypes; string menu; diff --git a/projects/mtg/include/DeckMenuItem.h b/projects/mtg/include/DeckMenuItem.h index 53ee35d5e..4375a7d99 100644 --- a/projects/mtg/include/DeckMenuItem.h +++ b/projects/mtg/include/DeckMenuItem.h @@ -21,18 +21,18 @@ private: string mText; float mX; float mY; - float mTitleResetWidth; + float mTitleResetWidth; string mDescription; static float mYOffset; float mScrollerOffset; DeckMetaData *mMetaData; - string mImageFilename; + string mImageFilename; void checkUserClick(); public: - DeckMenuItem(DeckMenu* _parent, int id, int fontId, string text, float x, float y, bool hasFocus = false, bool autoTranslate = false, DeckMetaData *meta = NULL); + DeckMenuItem(DeckMenu* _parent, int id, int fontId, string text, float x, float y, bool hasFocus = false, bool autoTranslate = false, DeckMetaData *meta = NULL); ~DeckMenuItem(); virtual void Relocate(float x, float y); @@ -44,39 +44,39 @@ public: virtual bool ButtonPressed(); virtual ostream& toString(ostream& out) const; - virtual bool getTopLeft(float& top, float& left) + virtual bool getTopLeft(float& top, float& left) { top = mY + mYOffset; left = mX; return true; } - // Accessors - - string getImageFilename() const { return mImageFilename; }; - float getY() const { return mY; }; - float getX() const { return mX; }; - string getDescription() const { return mDescription; }; - string getText() const { return mText; }; - bool hasFocus() const { return mHasFocus; }; - bool hasMetaData() const { return mMetaData == NULL ? false : true;}; + // Accessors + + string getImageFilename() const { return mImageFilename; }; + float getY() const { return mY; }; + float getX() const { return mX; }; + string getDescription() const { return mDescription; }; + string getText() const { return mText; }; + bool hasFocus() const { return mHasFocus; }; + bool hasMetaData() const { return mMetaData == NULL ? false : true;}; - float getWidth() const; - string getDeckName() const; + float getWidth() const; + string getDeckName() const; - string getDeckStatsSummary() const - { - if (mMetaData) - return mMetaData->getStatsSummary(); - return ""; - } + string getDeckStatsSummary() const + { + if (mMetaData) + return mMetaData->getStatsSummary(); + return ""; + } - DeckMetaData *getMetaData() const - { - return mMetaData; - } + DeckMetaData *getMetaData() const + { + return mMetaData; + } - // Setters + // Setters void setDescription( const string& description ) { mDescription = description; } }; diff --git a/projects/mtg/include/DuelLayers.h b/projects/mtg/include/DuelLayers.h index b4ef7a5a4..f6ac2da05 100644 --- a/projects/mtg/include/DuelLayers.h +++ b/projects/mtg/include/DuelLayers.h @@ -29,7 +29,7 @@ protected: GuiAvatars * avatars; GameObserver* observer; MTGGamePhase* phaseHandler; - int mPlayerViewIndex; + int mPlayerViewIndex; CardSelectorBase* mCardSelector; public: @@ -48,11 +48,11 @@ public: void Remove(); int receiveEvent(WEvent * e); float RightBoundary(); - int getPlayerViewIndex(){ return mPlayerViewIndex; }; - Player* getRenderedPlayer(); - Player* getRenderedPlayerOpponent(); - CardSelectorBase* getCardSelector() { return mCardSelector; }; - GameObserver* getObserver(){ return observer; }; + int getPlayerViewIndex(){ return mPlayerViewIndex; }; + Player* getRenderedPlayer(); + Player* getRenderedPlayerOpponent(); + CardSelectorBase* getCardSelector() { return mCardSelector; }; + GameObserver* getObserver(){ return observer; }; }; #include "ActionLayer.h" diff --git a/projects/mtg/include/ExtraCost.h b/projects/mtg/include/ExtraCost.h index 09cf9323a..caa8bf35a 100644 --- a/projects/mtg/include/ExtraCost.h +++ b/projects/mtg/include/ExtraCost.h @@ -169,7 +169,7 @@ public: class MillExileCost : public MillCost { public: - MillExileCost(TargetChooser *_tc = NULL); + MillExileCost(TargetChooser *_tc = NULL); virtual int doPay(); }; diff --git a/projects/mtg/include/GameObserver.h b/projects/mtg/include/GameObserver.h index 25fcf745b..72bbf687c 100644 --- a/projects/mtg/include/GameObserver.h +++ b/projects/mtg/include/GameObserver.h @@ -190,23 +190,23 @@ class GameObserver{ class NetworkGameObserver : public GameObserver { protected: - JNetwork* mpNetworkSession; - bool mSynchronized; - bool mForwardAction; - virtual void logAction(const string& s); + JNetwork* mpNetworkSession; + bool mSynchronized; + bool mForwardAction; + virtual void logAction(const string& s); public: - // no serverIp means a server is being instantiated, otherwise a client - NetworkGameObserver(JNetwork* pNetwork, WResourceManager* output = 0, JGE* input = 0); - virtual ~NetworkGameObserver(); - virtual void loadPlayer(int playerId, Player* player); - virtual void Update(float dt); - void synchronize(); - static void loadPlayer(void*pThis, stringstream& in, stringstream& out); - static void sendAction(void*pThis, stringstream& in, stringstream& out); - static void synchronize(void*pThis, stringstream& in, stringstream& out); - static void checkSynchro(void*pxThis, stringstream& in, stringstream& out); + // no serverIp means a server is being instantiated, otherwise a client + NetworkGameObserver(JNetwork* pNetwork, WResourceManager* output = 0, JGE* input = 0); + virtual ~NetworkGameObserver(); + virtual void loadPlayer(int playerId, Player* player); + virtual void Update(float dt); + void synchronize(); + static void loadPlayer(void*pThis, stringstream& in, stringstream& out); + static void sendAction(void*pThis, stringstream& in, stringstream& out); + static void synchronize(void*pThis, stringstream& in, stringstream& out); + static void checkSynchro(void*pxThis, stringstream& in, stringstream& out); static void ignoreResponse(void*, stringstream&, stringstream&){}; - static void disconnect(void*pxThis, stringstream& in, stringstream& out); + static void disconnect(void*pxThis, stringstream& in, stringstream& out); }; #endif diff --git a/projects/mtg/include/GameState.h b/projects/mtg/include/GameState.h index 93ef9ff75..aa21d870a 100644 --- a/projects/mtg/include/GameState.h +++ b/projects/mtg/include/GameState.h @@ -1,7 +1,7 @@ #ifndef _GAME_STATE_H_ #define _GAME_STATE_H_ -#define FADING_SPEED 350.0f +#define FADING_SPEED 350.0f class JGE; diff --git a/projects/mtg/include/InteractiveButton.h b/projects/mtg/include/InteractiveButton.h index d15e768bc..cf6412ab1 100644 --- a/projects/mtg/include/InteractiveButton.h +++ b/projects/mtg/include/InteractiveButton.h @@ -16,8 +16,8 @@ using std::string; -#define SCALE_SELECTED 1.2f -#define SCALE_NORMAL 1.0f +#define SCALE_SELECTED 1.2f +#define SCALE_NORMAL 1.0f const int kDismissButtonId = 10000; const int kToggleDeckActionId = 10001; diff --git a/projects/mtg/include/MTGAbility.h b/projects/mtg/include/MTGAbility.h index d71d822f2..01565899f 100644 --- a/projects/mtg/include/MTGAbility.h +++ b/projects/mtg/include/MTGAbility.h @@ -211,8 +211,8 @@ public: MORPH_COST = 28, SUSPEND_COST = 29, COUNTERS = 30, - PUT_INTO_PLAY_WITH_KICKER = 31, - STANDARD_FIZZLER = 32, + PUT_INTO_PLAY_WITH_KICKER = 31, + STANDARD_FIZZLER = 32, PAYZERO_COST = 33, OVERLOAD_COST = 34, BESTOW_COST = 35, @@ -463,7 +463,7 @@ public: int parseRestriction(string s); int parseCastRestrictions(MTGCardInstance * card, Player * player, string restrictions); Counter * parseCounter(string s, MTGCardInstance * target, Spell * spell = NULL); - int parsePowerToughness(string s, int *power, int *toughness); + int parsePowerToughness(string s, int *power, int *toughness); int getAbilities(vector * v, Spell * spell, MTGCardInstance * card = NULL, int id = 0, MTGGameZone * dest = NULL); MTGAbility* parseMagicLine(string s, int id, Spell * spell, MTGCardInstance *card, bool activated = false, bool forceUEOT = false, MTGGameZone * dest = NULL); int abilityEfficiency(MTGAbility * a, Player * p, int mode = MODE_ABILITY, TargetChooser * tc = NULL,Targetable * target = NULL); diff --git a/projects/mtg/include/MTGDefinitions.h b/projects/mtg/include/MTGDefinitions.h index c201679e4..23586eaad 100644 --- a/projects/mtg/include/MTGDefinitions.h +++ b/projects/mtg/include/MTGDefinitions.h @@ -276,21 +276,21 @@ class Constants GRADE_UNSUPPORTED = 4, GRADE_DANGEROUS = 5, - ASKIP_NONE=0, - ASKIP_SAFE=1, - ASKIP_FULL=2, - - WHO_P=0, - WHO_O=1, - WHO_R=2, - - KICKER_ALWAYS=0, - KICKER_CHOICE=1, - + ASKIP_NONE=0, + ASKIP_SAFE=1, + ASKIP_FULL=2, + + WHO_P=0, + WHO_O=1, + WHO_R=2, + + KICKER_ALWAYS=0, + KICKER_CHOICE=1, + }; enum - { + { NOT_CAST = 0, CAST_NORMALLY = 1, CAST_WITH_KICKER = 2, diff --git a/projects/mtg/include/MTGRules.h b/projects/mtg/include/MTGRules.h index 7f95e8cb6..fa8f59b63 100644 --- a/projects/mtg/include/MTGRules.h +++ b/projects/mtg/include/MTGRules.h @@ -180,7 +180,7 @@ class MTGPayZeroRule: public MTGAlternativeCostRule public: int isReactingToClick(MTGCardInstance * card, ManaCost * mana = NULL); int reactToClick(MTGCardInstance * card); - string CustomName; + string CustomName; virtual ostream& toString(ostream& out) const; MTGPayZeroRule(GameObserver* observer, int _id); const string getMenuText() @@ -436,28 +436,28 @@ private: vector pool[20]; int initialized; public: - MTGAllCards * collection; - MTGCardInstance * genEquip(int id); + MTGAllCards * collection; + MTGCardInstance * genEquip(int id); MTGStoneHewerRule(GameObserver* observer, int _id, MTGAllCards * _collection); - int receiveEvent(WEvent * event); - const string getMenuText() - { - return "Stone Hewer"; - } - virtual ostream& toString(ostream& out) const; - virtual MTGStoneHewerRule * clone() const; + int receiveEvent(WEvent * event); + const string getMenuText() + { + return "Stone Hewer"; + } + virtual ostream& toString(ostream& out) const; + virtual MTGStoneHewerRule * clone() const; }; //Hermit Druid avatar mode class MTGHermitRule: public PermanentAbility { public: MTGHermitRule(GameObserver* observer, int _id); - int receiveEvent(WEvent * event); - const string getMenuText() - { - return "Hermit"; - } - virtual MTGHermitRule * clone() const; + int receiveEvent(WEvent * event); + const string getMenuText() + { + return "Hermit"; + } + virtual MTGHermitRule * clone() const; }; // /* LifeLink */ diff --git a/projects/mtg/include/ManaCost.h b/projects/mtg/include/ManaCost.h index 21a6a2c99..85bfbfb0f 100644 --- a/projects/mtg/include/ManaCost.h +++ b/projects/mtg/include/ManaCost.h @@ -54,29 +54,29 @@ public: }; ExtraCosts * extraCosts; - ManaCost * getAlternative(){ return alternative; }; - void setAlternative(ManaCost * aMana){ SAFE_DELETE(alternative); alternative = aMana;}; + ManaCost * getAlternative(){ return alternative; }; + void setAlternative(ManaCost * aMana){ SAFE_DELETE(alternative); alternative = aMana;}; - ManaCost * getKicker(){ return kicker; }; - void setKicker(ManaCost * aMana){ SAFE_DELETE(kicker); kicker = aMana;}; + ManaCost * getKicker(){ return kicker; }; + void setKicker(ManaCost * aMana){ SAFE_DELETE(kicker); kicker = aMana;}; - ManaCost * getBuyback(){ return BuyBack; }; - void setBuyback(ManaCost * aMana){ SAFE_DELETE(BuyBack); BuyBack = aMana;}; + ManaCost * getBuyback(){ return BuyBack; }; + void setBuyback(ManaCost * aMana){ SAFE_DELETE(BuyBack); BuyBack = aMana;}; - ManaCost * getFlashback(){ return FlashBack; }; - void setFlashback(ManaCost * aMana){ SAFE_DELETE(FlashBack); FlashBack = aMana;}; + ManaCost * getFlashback(){ return FlashBack; }; + void setFlashback(ManaCost * aMana){ SAFE_DELETE(FlashBack); FlashBack = aMana;}; - ManaCost * getRetrace(){ return Retrace; }; - void setRetrace(ManaCost * aMana){ SAFE_DELETE(Retrace); Retrace = aMana;}; + ManaCost * getRetrace(){ return Retrace; }; + void setRetrace(ManaCost * aMana){ SAFE_DELETE(Retrace); Retrace = aMana;}; - ManaCost * getMorph(){ return morph; }; - void setMorph(ManaCost * aMana){ SAFE_DELETE(morph); morph = aMana;}; + ManaCost * getMorph(){ return morph; }; + void setMorph(ManaCost * aMana){ SAFE_DELETE(morph); morph = aMana;}; - ManaCost * getSuspend(){ return suspend; }; - void setSuspend(ManaCost * aMana){ SAFE_DELETE(suspend); suspend = aMana;}; + ManaCost * getSuspend(){ return suspend; }; + void setSuspend(ManaCost * aMana){ SAFE_DELETE(suspend); suspend = aMana;}; - ManaCost * getManaUsedToCast(){ return manaUsedToCast; }; - void setManaUsedToCast(ManaCost * aMana){ SAFE_DELETE(manaUsedToCast); manaUsedToCast = aMana;}; + ManaCost * getManaUsedToCast(){ return manaUsedToCast; }; + void setManaUsedToCast(ManaCost * aMana){ SAFE_DELETE(manaUsedToCast); manaUsedToCast = aMana;}; string alternativeName; bool isMulti; diff --git a/projects/mtg/include/MenuItem.h b/projects/mtg/include/MenuItem.h index 6a0df9eb4..8a308c8eb 100644 --- a/projects/mtg/include/MenuItem.h +++ b/projects/mtg/include/MenuItem.h @@ -7,8 +7,8 @@ #include using namespace std; -#define SCALE_SELECTED 1.2f -#define SCALE_NORMAL 1.0f +#define SCALE_SELECTED 1.2f +#define SCALE_NORMAL 1.0f class hgeParticleSystem; diff --git a/projects/mtg/include/ModRules.h b/projects/mtg/include/ModRules.h index fac6db85e..18c64a26c 100644 --- a/projects/mtg/include/ModRules.h +++ b/projects/mtg/include/ModRules.h @@ -109,11 +109,11 @@ public: int mFontSize; bool mFont; PIXEL_TYPE mFontColor; - /*Icons attributes*/ + /*Icons attributes*/ int mSizeIcon; - int mIconPosX; - int mIconPosY; - string mFileName; + int mIconPosX; + int mIconPosY; + string mFileName; ModRulesRenderCardGuiItem(string name, int posX, int posY, string formattedData, string filter, bool font, int fontSize, PIXEL_TYPE fontColor, int SizeIcon,int IconPosX,int IconPosY,string FileName); }; diff --git a/projects/mtg/include/Player.h b/projects/mtg/include/Player.h index 2d356e24f..316be5cbb 100644 --- a/projects/mtg/include/Player.h +++ b/projects/mtg/include/Player.h @@ -111,7 +111,7 @@ public: std::string GetCurrentDeckStatsFile(); virtual bool parseLine(const string& s); friend ostream& operator<<(ostream&, const Player&); - friend istream& operator>>(istream&, Player&); + friend istream& operator>>(istream&, Player&); bool operator<(Player& aPlayer); bool isDead(); }; diff --git a/projects/mtg/include/Rules.h b/projects/mtg/include/Rules.h index b38dc6e54..fa8cdbd77 100644 --- a/projects/mtg/include/Rules.h +++ b/projects/mtg/include/Rules.h @@ -57,17 +57,17 @@ public: }; string bg; - string filename; + string filename; GameType gamemode; bool hidden; - string displayName; - int unlockOption; + string displayName; + int unlockOption; string mUnlockOptionString; - static vector RulesList; + static vector RulesList; Rules(string bg = ""); int load(string _filename); - static int loadAllRules(); + static int loadAllRules(); static void unloadAllRules(); static Rules * getRulesByFilename(string _filename); void initPlayers(GameObserver *observer); diff --git a/projects/mtg/include/SimpleButton.h b/projects/mtg/include/SimpleButton.h index 960b5b7c3..39c890746 100644 --- a/projects/mtg/include/SimpleButton.h +++ b/projects/mtg/include/SimpleButton.h @@ -15,11 +15,11 @@ using std::string; -#define SCALE_SELECTED 1.2f -#define SCALE_NORMAL 1.0f -#define SCALE_SHRINK 0.75f -#define SCALE_SELECTED_LARGE 1.7F -#define SCALE_LARGE_NORMAL 1.5F +#define SCALE_SELECTED 1.2f +#define SCALE_NORMAL 1.0f +#define SCALE_SHRINK 0.75f +#define SCALE_SELECTED_LARGE 1.7f +#define SCALE_LARGE_NORMAL 1.5f class SimpleButton: public JGuiObject { diff --git a/projects/mtg/include/SimpleMenuItem.h b/projects/mtg/include/SimpleMenuItem.h index d535cf317..7f74e7874 100644 --- a/projects/mtg/include/SimpleMenuItem.h +++ b/projects/mtg/include/SimpleMenuItem.h @@ -9,8 +9,8 @@ using std::string; -#define SCALE_SELECTED 1.2f -#define SCALE_NORMAL 1.0f +#define SCALE_SELECTED 1.2f +#define SCALE_NORMAL 1.0f class SimpleMenuItem: public SimpleButton { diff --git a/projects/mtg/include/ThisDescriptor.h b/projects/mtg/include/ThisDescriptor.h index 12b5412b9..625f6c941 100644 --- a/projects/mtg/include/ThisDescriptor.h +++ b/projects/mtg/include/ThisDescriptor.h @@ -114,7 +114,7 @@ class ThisAttacked:public ThisDescriptor{ public: virtual int match(MTGCardInstance * card); - ThisAttacked(int attack); + ThisAttacked(int attack); ThisAttacked * clone() const; }; @@ -122,7 +122,7 @@ class ThisBlocked:public ThisDescriptor{ public: virtual int match(MTGCardInstance * card); - ThisBlocked(int block); + ThisBlocked(int block); ThisBlocked * clone() const; }; @@ -130,7 +130,7 @@ class ThisNotBlocked:public ThisDescriptor{ public: virtual int match(MTGCardInstance * card); - ThisNotBlocked(int unblocked); + ThisNotBlocked(int unblocked); ThisNotBlocked * clone() const; }; @@ -138,7 +138,7 @@ class ThisDamaged:public ThisDescriptor{ public: virtual int match(MTGCardInstance * card); - ThisDamaged(int wasDealtDamage); + ThisDamaged(int wasDealtDamage); ThisDamaged * clone() const; }; @@ -146,7 +146,7 @@ class ThisDualWield:public ThisDescriptor{ public: virtual int match(MTGCardInstance * card); - ThisDualWield(int dualWield); + ThisDualWield(int dualWield); ThisDualWield * clone() const; }; diff --git a/projects/mtg/include/WEvent.h b/projects/mtg/include/WEvent.h index 0f9b546ec..761662255 100644 --- a/projects/mtg/include/WEvent.h +++ b/projects/mtg/include/WEvent.h @@ -151,33 +151,33 @@ struct WEventCreatureAttacker : public WEventCardUpdate { //event when card attacks. struct WEventCardAttacked : public WEventCardUpdate { WEventCardAttacked(MTGCardInstance * card); - virtual Targetable * getTarget(int target); + virtual Targetable * getTarget(int target); }; //event when card attacks alone. struct WEventCardAttackedAlone : public WEventCardUpdate { WEventCardAttackedAlone(MTGCardInstance * card); - virtual Targetable * getTarget(int target); + virtual Targetable * getTarget(int target); }; //event when card attacks but is not blocked. struct WEventCardAttackedNotBlocked : public WEventCardUpdate { WEventCardAttackedNotBlocked(MTGCardInstance * card); - virtual Targetable * getTarget(int target); + virtual Targetable * getTarget(int target); }; //event when card attacks but is blocked. struct WEventCardAttackedBlocked : public WEventCardUpdate { WEventCardAttackedBlocked(MTGCardInstance * card,MTGCardInstance * opponent); MTGCardInstance * opponent; - virtual Targetable * getTarget(int target); + virtual Targetable * getTarget(int target); }; //event when card blocked. struct WEventCardBlocked : public WEventCardUpdate { WEventCardBlocked(MTGCardInstance * card,MTGCardInstance * opponent); MTGCardInstance * opponent; - virtual Targetable * getTarget(int target); + virtual Targetable * getTarget(int target); }; //event when card is sacrificed. @@ -190,13 +190,13 @@ struct WEventCardSacrifice : public WEventCardUpdate { //event when card is discarded. struct WEventCardDiscard : public WEventCardUpdate { WEventCardDiscard(MTGCardInstance * card); - virtual Targetable * getTarget(int target); + virtual Targetable * getTarget(int target); }; //event when card is cycled. struct WEventCardCycle : public WEventCardUpdate { WEventCardCycle(MTGCardInstance * card); - virtual Targetable * getTarget(int target); + virtual Targetable * getTarget(int target); }; //Event when a card's "defenser" status changes @@ -219,9 +219,9 @@ struct WEventBlockersChosen : public WEvent { }; struct WEventcardDraw : public WEvent { - WEventcardDraw(Player * player,int nb_cards); - Player * player; - int nb_cards; + WEventcardDraw(Player * player,int nb_cards); + Player * player; + int nb_cards; using WEvent::getTarget; virtual Targetable * getTarget(Player * player); }; @@ -276,19 +276,19 @@ struct WEventEmptyManaPool : public WEvent { //event when card-equipment unattached struct WEventCardUnattached : public WEventCardUpdate { WEventCardUnattached(MTGCardInstance * card); - virtual Targetable * getTarget(int target); + virtual Targetable * getTarget(int target); }; //event when card-equipment attached/equipped struct WEventCardEquipped : public WEventCardUpdate { WEventCardEquipped(MTGCardInstance * card); - virtual Targetable * getTarget(int target); + virtual Targetable * getTarget(int target); }; //event when card moves from player/opponent battlefield to player/opponent battlefield struct WEventCardControllerChange : public WEventCardUpdate { WEventCardControllerChange(MTGCardInstance * card); - virtual Targetable * getTarget(int target); + virtual Targetable * getTarget(int target); }; std::ostream& operator<<(std::ostream&, const WEvent&); diff --git a/projects/mtg/include/WFont.h b/projects/mtg/include/WFont.h index 84485b1ea..4645b360e 100644 --- a/projects/mtg/include/WFont.h +++ b/projects/mtg/include/WFont.h @@ -173,7 +173,7 @@ protected: int *mGBCode; int mCurr; - PIXEL_TYPE* mCharBuffer; + PIXEL_TYPE* mCharBuffer; virtual int PreCacheChar(const u8 *ch); }; diff --git a/projects/mtg/include/WResourceManager.h b/projects/mtg/include/WResourceManager.h index 9f650f52f..4abe05ed9 100644 --- a/projects/mtg/include/WResourceManager.h +++ b/projects/mtg/include/WResourceManager.h @@ -21,7 +21,7 @@ enum ENUM_WRES_INFO enum ENUM_RETRIEVE_STYLE { - RETRIEVE_EXISTING, //Only returns a resource if it already exists. Does not lock or unlock. + RETRIEVE_EXISTING, //Only returns a resource if it already exists. Does not lock or unlock. RETRIEVE_NORMAL, //Returns or creates a resource. Does not change lock status. RETRIEVE_LOCK, //As above, locks cached resource. Not for quads. RETRIEVE_UNLOCK, //As above, unlocks cached resource. Not for quads. @@ -33,7 +33,7 @@ enum ENUM_RETRIEVE_STYLE enum ENUM_CACHE_SUBTYPE { - CACHE_NORMAL = (1<<0), //Use default values. Not really a flag. + CACHE_NORMAL = (1<<0), //Use default values. Not really a flag. //CACHE_EXISTING = (1<<1), //Retrieve it only if it already exists //Because these bits only modify how a cached resource's Attempt() is called, @@ -51,8 +51,8 @@ enum ENUM_CACHE_ERROR CACHE_ERROR_NONE = 0, CACHE_ERROR_NOT_CACHED = CACHE_ERROR_NONE, CACHE_ERROR_404, - CACHE_ERROR_BAD, //Something went wrong with item->attempt() - CACHE_ERROR_BAD_ALLOC, //Couldn't allocate item + CACHE_ERROR_BAD, //Something went wrong with item->attempt() + CACHE_ERROR_BAD_ALLOC, //Couldn't allocate item CACHE_ERROR_LOST, CACHE_ERROR_NOT_MANAGED, }; @@ -69,16 +69,16 @@ public: static void Terminate(); virtual ~WResourceManager() - { - } + { + } virtual bool IsThreaded() = 0; - void PlaySample(const string& fileName) { - JSample*sample = RetrieveSample(fileName); - if(sample) { - JSoundSystem::GetInstance()->PlaySample(sample); - } - }; + void PlaySample(const string& fileName) { + JSample*sample = RetrieveSample(fileName); + if(sample) { + JSoundSystem::GetInstance()->PlaySample(sample); + } + }; virtual JQuadPtr RetrieveCard(MTGCard * card, int style = RETRIEVE_NORMAL,int submode = CACHE_NORMAL) = 0; virtual JSample * RetrieveSample(const string& filename, int style = RETRIEVE_NORMAL, int submode = CACHE_NORMAL) = 0; virtual JTexture * RetrieveTexture(const string& filename, int style = RETRIEVE_NORMAL, int submode = CACHE_NORMAL) = 0; @@ -90,7 +90,7 @@ public: virtual void Release(JTexture * tex) = 0; virtual void Release(JSample * sample) = 0; - //Refreshes all files in cache, for when mode/profile changes. + //Refreshes all files in cache, for when mode/profile changes. virtual void Refresh() = 0; //Manual clear of the cache @@ -132,8 +132,8 @@ protected: ** Singleton object only accessibly via Instance(), constructor is private */ WResourceManager() - { - } + { + } static WResourceManager* sInstance; }; diff --git a/projects/mtg/include/WResourceManagerImpl.h b/projects/mtg/include/WResourceManagerImpl.h index 471afc3ec..e9d9c8f4f 100644 --- a/projects/mtg/include/WResourceManagerImpl.h +++ b/projects/mtg/include/WResourceManagerImpl.h @@ -202,8 +202,8 @@ public: #endif private: - bool bThemedCards; //Does the theme have a "sets" directory for overwriting cards? - void FlattenTimes(); //To prevent bad cache timing on int overflow + bool bThemedCards; //Does the theme have a "sets" directory for overwriting cards? + void FlattenTimes(); //To prevent bad cache timing on int overflow //For cached stuff WCache textureWCache; diff --git a/projects/mtg/include/utils.h b/projects/mtg/include/utils.h index 41e21c7a7..612874c59 100644 --- a/projects/mtg/include/utils.h +++ b/projects/mtg/include/utils.h @@ -79,7 +79,7 @@ public: ostream& saveUsedRandValues(ostream& out) const; ostream& saveLoadedRandValues(ostream& out); int random(); - void setSeed(unsigned int seed) { srand(seed); }; + void setSeed(unsigned int seed) { srand(seed); }; template void random_shuffle(Iter first, Iter last) { ptrdiff_t i, n; diff --git a/projects/mtg/src/AIPlayerBaka.cpp b/projects/mtg/src/AIPlayerBaka.cpp index 634414632..84c294fe9 100644 --- a/projects/mtg/src/AIPlayerBaka.cpp +++ b/projects/mtg/src/AIPlayerBaka.cpp @@ -128,7 +128,7 @@ int OrderedAIAction::getEfficiency() break; } case MTGAbility::STANDARD_PREVENT: - { + { efficiency = 0;//starts out low to avoid spamming it when its not needed. if (!target) @@ -1521,12 +1521,12 @@ int AIPlayerBaka::chooseTarget(TargetChooser * _tc, Player * forceTarget,MTGCard if (tc->Owner != observer->currentlyActing()) { observer->currentActionPlayer = tc->Owner; - //this is a hack, but if we hit this condition we are locked in a infinate loop - //so lets give the tc to its owner - //todo:find the root cause of this. - DebugTrace("AIPLAYER: Error, was asked to chose targets but I don't own the source of the targetController\n"); - return 0; - } + //this is a hack, but if we hit this condition we are locked in a infinate loop + //so lets give the tc to its owner + //todo:find the root cause of this. + DebugTrace("AIPLAYER: Error, was asked to chose targets but I don't own the source of the targetController\n"); + return 0; + } Player * target = forceTarget; int playerTargetedZone = 1; if (!target) diff --git a/projects/mtg/src/AIStats.cpp b/projects/mtg/src/AIStats.cpp index b181e238b..c5003147d 100644 --- a/projects/mtg/src/AIStats.cpp +++ b/projects/mtg/src/AIStats.cpp @@ -107,8 +107,8 @@ int AIStats::receiveEvent(WEvent * event) //the following tells ai if a creature should be blocked or targeted bool AIStats::isInTop(MTGCardInstance * card, unsigned int max, bool tooSmallCountsForTrue) { - //return true; - //uncomment the above return to make Ai always multiblock your creatures. + //return true; + //uncomment the above return to make Ai always multiblock your creatures. if (stats.size() < max) return tooSmallCountsForTrue; unsigned int n = 0; diff --git a/projects/mtg/src/ActionLayer.cpp b/projects/mtg/src/ActionLayer.cpp index 5efec2e67..28f5453d9 100644 --- a/projects/mtg/src/ActionLayer.cpp +++ b/projects/mtg/src/ActionLayer.cpp @@ -361,8 +361,8 @@ int ActionLayer::reactToClick(MTGCardInstance * card) } #ifdef WIN32 - // if we hit this, then something strange has happened with the click logic - reactToClick() - // should never be called if isReactingToClick() previously didn't have an object return true + // if we hit this, then something strange has happened with the click logic - reactToClick() + // should never be called if isReactingToClick() previously didn't have an object return true assert(!mReactions.empty()); #endif diff --git a/projects/mtg/src/ActionStack.cpp b/projects/mtg/src/ActionStack.cpp index 47bf7ae8a..a0246881d 100644 --- a/projects/mtg/src/ActionStack.cpp +++ b/projects/mtg/src/ActionStack.cpp @@ -98,13 +98,13 @@ void Interruptible::Render(MTGCardInstance * source, JQuad * targetQuad, string if (!targetQuad) { /*if(source->controller()->isHuman() && source->controller()->opponent()->isAI() && !alt2.size() && _(action).c_str() == source->name) - mFont->DrawString("You play ", x + 35, y-15 + GetVerticalTextOffset(), JGETEXT_LEFT); + mFont->DrawString("You play ", x + 35, y-15 + GetVerticalTextOffset(), JGETEXT_LEFT); else if(source->controller()->isAI() && source->controller()->opponent()->isHuman() && !alt2.size() && _(action).c_str() == source->name) - mFont->DrawString("Opponent plays ", x + 35, y-15 + GetVerticalTextOffset(), JGETEXT_LEFT);*/ + mFont->DrawString("Opponent plays ", x + 35, y-15 + GetVerticalTextOffset(), JGETEXT_LEFT);*/ mFont->DrawString(_(action).c_str(), x + 35, y + GetVerticalTextOffset(), JGETEXT_LEFT); } else - { + { renderer->FillRect(x-2,y-16 + GetVerticalTextOffset(), 73, 43, ARGB(235,10,10,10)); /*if(source->controller()->isHuman() && source->controller()->opponent()->isAI()) renderer->DrawRect(x-2,y-16 + GetVerticalTextOffset(), 73, 43, ARGB(245,0,255,0)); @@ -351,13 +351,13 @@ int Spell::resolve() if (options[Options::SFXVOLUME].number > 0) { - if(observer->getResourceManager()) - observer->getResourceManager()->PlaySample(source->getSample()); + if(observer->getResourceManager()) + observer->getResourceManager()->PlaySample(source->getSample()); } if(this->cost) - { - source->getManaCost()->setManaUsedToCast(NEW ManaCost(this->cost)); - } + { + source->getManaCost()->setManaUsedToCast(NEW ManaCost(this->cost)); + } AbilityFactory af(observer); af.addAbilities(observer->mLayers->actionLayer()->getMaxId(), this); return 1; @@ -757,7 +757,7 @@ int ActionStack::resolve() { for (int i = 0; i < 2; i++) { - if (interruptDecision[i] != 2) + if (interruptDecision[i] != 2) interruptDecision[i] = NOT_DECIDED; } } @@ -821,7 +821,7 @@ int ActionStack::count(int type, int state, int display) Interruptible * ActionStack::getActionElementFromCard(MTGCardInstance * card) { - if(!card) + if(!card) return 0; for (size_t i = 0; i < mObjects.size(); i++) { @@ -1005,7 +1005,7 @@ void ActionStack::Update(float dt) //and set the timer to 4 secs. BUG FIX //http://code.google.com/p/wagic/issues/detail?id=464 extraTime = count(0, NOT_RESOLVED, 0); if (extraTime == 0) - extraTime = 1;//we never want this int to be 0. + extraTime = 1;//we never want this int to be 0. if (timer < 0) timer = static_cast(options[Options::INTERRUPT_SECONDS].number * extraTime); @@ -1253,7 +1253,7 @@ void ActionStack::Render() renderer->DrawRect(x0 - 6, y0+33, width + 15, height - 18, ARGB(255,89,89,89)); //stack border renderer->DrawRect(x0 - 7, y0+2, width + 17, height + 14, ARGB(255,240,240,240)); - + std::ostringstream stream; // WALDORF - changed "interrupt ?" to "Interrupt?". Don't display count down // seconds if the user disables auto progressing interrupts by setting the seconds diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index b681dfc36..2951f628d 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -1236,7 +1236,7 @@ int GenericPaidAbility::resolve() }*/ } if(asAlternate && nomenu && optionalCost->getConvertedCost() < 1) - { + { nomenuAbility->resolve(); } else @@ -1414,7 +1414,7 @@ AAEPIC * AAEPIC::clone() const AAFizzler::AAFizzler(GameObserver* observer, int _id, MTGCardInstance * card, Spell * _target, ManaCost * _cost) : ActivatedAbility(observer, _id, card, _cost, 0) { - aType = MTGAbility::STANDARD_FIZZLER; + aType = MTGAbility::STANDARD_FIZZLER; target = _target; // by default we put the spell to graveyard after fizzling @@ -1847,7 +1847,7 @@ int AANewTarget::resolve() } } if(!newhook) - { + { target = source; source = _target; } @@ -2528,7 +2528,7 @@ int AModifyHand::destroy() if (!p) return 0; - + WParsedInt handmodifier(hand, NULL, source); p->handmodifier -= handmodifier.getValue(); @@ -4175,12 +4175,12 @@ ATransformer::ATransformer(GameObserver* observer, int id, MTGCardInstance * sou myCurrentTurn = 1000; //this subkeyword adds a color without removing the existing colors. addNewColors = (sabilities.find("newcolors") != string::npos); - remove = (stypes.find("removealltypes") != string::npos); - removeCreatureSubtypes = (stypes.find("removecreaturesubtypes") != string::npos); + remove = (stypes.find("removealltypes") != string::npos); + removeCreatureSubtypes = (stypes.find("removecreaturesubtypes") != string::npos); removeTypes = (stypes.find("removetypes") != string::npos); - if (stypes.find("allsubtypes") != string::npos || stypes.find("removecreaturesubtypes") != string::npos) - { + if (stypes.find("allsubtypes") != string::npos || stypes.find("removecreaturesubtypes") != string::npos) + { const vector values = MTGAllCards::getValuesById(); for (size_t i = 0; i removeType(i,1); } - else if (remove) - { - for (it = oldtypes.begin(); it != oldtypes.end(); it++) - { - _target->removeType(*it); - } - } - else - { + else if (remove) + { + for (it = oldtypes.begin(); it != oldtypes.end(); it++) + { + _target->removeType(*it); + } + } + else + { for (it = types.begin(); it != types.end(); it++) - { + { if(removeCreatureSubtypes) { @@ -4280,8 +4280,8 @@ for (it = types.begin(); it != types.end(); it++) { _target->addType(*it); } - } - } + } + } for (it = colors.begin(); it != colors.end(); it++) { _target->setColor(*it); @@ -4361,7 +4361,7 @@ for (it = types.begin(); it != types.end(); it++) _target->switchPT(true); } else - _target->addbaseT(val->getValue()); + _target->addbaseT(val->getValue()); delete val; } @@ -4446,7 +4446,7 @@ int ATransformer::destroy() { _target->setColor(*it); } - + if(newpowerfound || newtoughnessfound) _target->isSettingBase -= 1; @@ -4473,22 +4473,22 @@ int ATransformer::destroy() newAbilities.erase(_target); } } - if (remove || removeCreatureSubtypes) - { - for (it = oldtypes.begin(); it != oldtypes.end(); it++) - { + if (remove || removeCreatureSubtypes) + { + for (it = oldtypes.begin(); it != oldtypes.end(); it++) + { if(!_target->hasSubtype(*it)) _target->addType(*it); - } - } - ////in the case that we removed or added types to a card, so that it retains its original name when the effect is removed. - //if(_target->model->data->name.size())//tokens don't have a model name. - // _target->setName(_target->model->data->name.c_str()); + } + } + ////in the case that we removed or added types to a card, so that it retains its original name when the effect is removed. + //if(_target->model->data->name.size())//tokens don't have a model name. + // _target->setName(_target->model->data->name.c_str()); //edit: this ability shouldn't have to reset the name on a card becuase removing a subtype changes the name of a land. //that should be handled in addType...not here. //im sure commenting this out will reintroduce a bug somewhere but it needs to be handled correctly. furthermore, why does adding and removing a type touch the name of a card? - } + } return 1; } @@ -4697,8 +4697,8 @@ int ALoseAbilities::addToGame() if (al->mObjects[i]) { MTGAbility * currentAction = (MTGAbility *) al->mObjects[i]; - ALord * l = dynamic_cast (currentAction); - if(l) + ALord * l = dynamic_cast (currentAction); + if(l) lordsInGame.push_back(l); } } @@ -4708,9 +4708,9 @@ int ALoseAbilities::addToGame() if (al->mObjects[i]) { MTGAbility * currentAction = (MTGAbility *) al->mObjects[i]; - ALoseAbilities * la = dynamic_cast (currentAction); - if(la) - continue; + ALoseAbilities * la = dynamic_cast (currentAction); + if(la) + continue; if (currentAction->source == _target) { bool canRemove = true; @@ -4751,20 +4751,20 @@ int ALoseAbilities::destroy() MTGAbility * a = storedAbilities[i]; //OneShot abilities are not supposed to stay in the game for long. // If we copied one, something wrong probably happened - if (a->oneShot) - { + if (a->oneShot) + { DebugTrace("ALLABILITIES: Ability should not be one shot"); - continue; + continue; } //Avoid inifinite loop of removing/putting back abilities if (dynamic_cast (a)) { - DebugTrace("ALLABILITIES: loseability won't be put in the loseability list"); - continue; - } + DebugTrace("ALLABILITIES: loseability won't be put in the loseability list"); + continue; + } - a->addToGame(); + a->addToGame(); } storedAbilities.clear(); return 1; @@ -5368,8 +5368,8 @@ void ABlink::resolveBlink() void ABlink::returnCardIntoPlay(MTGCardInstance* _target) { MTGCardInstance * Blinker = NULL; - if(!_target->blinked) - { + if(!_target->blinked) + { this->forceDestroy = 1; return; } @@ -5659,7 +5659,7 @@ int AEquip::unequip() { MTGAbility * a = currentAbilities[i]; if (dynamic_cast (a) || dynamic_cast (a) || dynamic_cast (a) - || dynamic_cast (AbilityFactory::getCoreAbility(a)) + || dynamic_cast (AbilityFactory::getCoreAbility(a)) || (a->aType == MTGAbility::STANDARD_TOKENCREATOR && a->oneShot)) { SAFE_DELETE(a); @@ -6013,7 +6013,7 @@ ATutorialMessage::ATutorialMessage(GameObserver* observer, MTGCardInstance * sou else { mMessage = _(message); //translate directly here, remove this and translate at rendering time if it bites us - ReplaceString(mMessage, "\\n", "\n"); + ReplaceString(mMessage, "\\n", "\n"); } } @@ -6143,7 +6143,7 @@ void ATutorialMessage::Render() if (options[Options::SFXVOLUME].number > 0) { - game->getResourceManager()->PlaySample("tutorial.wav"); + game->getResourceManager()->PlaySample("tutorial.wav"); } } else diff --git a/projects/mtg/src/CardGui.cpp b/projects/mtg/src/CardGui.cpp index 9b53f9041..1049cd41b 100644 --- a/projects/mtg/src/CardGui.cpp +++ b/projects/mtg/src/CardGui.cpp @@ -43,11 +43,11 @@ namespace } CardGui::CardGui(MTGCardInstance* card, float x, float y) - : PlayGuiObject(Height, x, y, 0, false), card(card) + : PlayGuiObject(Height, x, y, 0, false), card(card) { } CardGui::CardGui(MTGCardInstance* card, const Pos& ref) - : PlayGuiObject(Height, ref, 0, false), card(card) + : PlayGuiObject(Height, ref, 0, false), card(card) { } @@ -69,7 +69,7 @@ float CardView::GetCenterY() CardView::CardView(const SelectorZone owner, MTGCardInstance* card, float x, float y) - : CardGui(card, x, y), owner(owner) + : CardGui(card, x, y), owner(owner) { const Pos* ref = card->view; while (card) @@ -81,7 +81,7 @@ CardView::CardView(const SelectorZone owner, MTGCardInstance* card, float x, flo } CardView::CardView(const SelectorZone owner, MTGCardInstance* card, const Pos& ref) - : CardGui(card, ref), owner(owner) + : CardGui(card, ref), owner(owner) { const Pos* r = card->view; while (card) @@ -238,14 +238,14 @@ void CardGui::Render() { quad->SetColor(ARGB(static_cast(actA),255,255,255)); //fake border... - JQuadPtr fakeborder; - JQuadPtr highlightborder; + JQuadPtr fakeborder; + JQuadPtr highlightborder; fakeborder = game? game->getResourceManager()->GetQuad("white"):WResourceManager::Instance()->GetQuad("white"); highlightborder = game? game->getResourceManager()->GetQuad("white"):WResourceManager::Instance()->GetQuad("white"); - if(fakeborder) - { + if(fakeborder) + { fakeborder->SetColor(ARGB((int)(actA),15,15,15)); - renderer->RenderQuad(fakeborder.get(), actX, actY, actT, (29 * actZ + 1) / 16, 42 * actZ / 16); + renderer->RenderQuad(fakeborder.get(), actX, actY, actT, (29 * actZ + 1) / 16, 42 * actZ / 16); } //draw border for highlighting if (game) @@ -253,12 +253,12 @@ void CardGui::Render() if (card && card->isTargetted() && highlightborder) { highlightborder->SetColor(ARGB(95,255,0,0)); - renderer->RenderQuad(highlightborder.get(), actX, actY, actT, (30 * actZ + 1) / 16, 43 * actZ / 16); + renderer->RenderQuad(highlightborder.get(), actX, actY, actT, (30 * actZ + 1) / 16, 43 * actZ / 16); } if (card && card->isTargetter() && highlightborder) { highlightborder->SetColor(ARGB(95,0,245,0)); - renderer->RenderQuad(highlightborder.get(), actX, actY, actT, (30 * actZ + 1) / 16, 43 * actZ / 16); + renderer->RenderQuad(highlightborder.get(), actX, actY, actT, (30 * actZ + 1) / 16, 43 * actZ / 16); } } //draw the card image @@ -307,7 +307,7 @@ void CardGui::Render() { if (card && card->isTargetted()) { - if(card->isTapped()) + if(card->isTapped()) { if(mHasFocus) renderer->DrawRoundRect(actX - (scale * quad->mWidth / 2)-10,actY - (scale * quad->mHeight / 2)+6.5f, (scale * quad->mHeight)-0.02f, (scale * quad->mWidth)-0.02f, 1.8f,ARGB(250,255,0,0)); @@ -341,7 +341,7 @@ void CardGui::Render() ARGB(((static_cast(actA))/2),0,0,0)); renderer->DrawRect(actX - (13 * actZ), actY + 4 * actZ, 25.5f * actZ, 14 * actZ, ARGB(((static_cast(actA))),20,20,20)); - //damaged or buffed or powered down + //damaged or buffed or powered down if(card->wasDealtDamage && card->life <= 2) mFont->SetColor(ARGB(static_cast(actA),255,0,0));//red critical and damaged else if(!card->wasDealtDamage && card->pbonus < 0) @@ -350,7 +350,7 @@ void CardGui::Render() mFont->SetColor(ARGB(static_cast(actA),255,255,0));//yellow buff else if(card->hasType("legendary") && card->hasType("eldrazi")) mFont->SetColor(ARGB(static_cast(actA),238,130,238));//violet legendary eldrazi - else + else mFont->SetColor(ARGB(static_cast(actA),255,255,255));//white default mFont->SetScale(actZ); mFont->SetScale(actZ); @@ -366,7 +366,7 @@ void CardGui::Render() if(!card->isToken && card->isACopier) buff = "C"; if(game && card->has(Constants::PAYZERO) && ((card->currentZone == card->controller()->game->hand) || (card->has(Constants::CANPLAYFROMGRAVEYARD) && card->currentZone == card->controller()->game->graveyard) || (card->has(Constants::CANPLAYFROMEXILE) && card->currentZone == card->controller()->game->exile))) - buff += "Z"; + buff += "Z"; if(card->alias == 0000) { if(card->chooseacolor == 1) @@ -380,8 +380,8 @@ void CardGui::Render() else if(card->chooseacolor == 5) buff += "\n-White"; } - if(!alternate && buff != "" && game->gameType() == GAME_TYPE_CLASSIC)//it seems that other game modes makes cards as tokens!!! hmmm... - { + if(!alternate && buff != "" && game->gameType() == GAME_TYPE_CLASSIC)//it seems that other game modes makes cards as tokens!!! hmmm... + { mFont->SetScale(DEFAULT_MAIN_FONT_SCALE); char buffer[200]; sprintf(buffer, "%s", buff.c_str()); @@ -1101,7 +1101,7 @@ void CardGui::RenderBig(MTGCard* card, const Pos& pos, bool thumb, bool noborder //white thin line to simulate card edge renderer->DrawRoundRect(x-92,pos.actY-130, (scale * quad->mWidth)-10, (scale * quad->mHeight)-11, 9.0f,ARGB(50,240,240,240)); } - //render card image + //render card image renderer->RenderQuad(quad.get(), x, pos.actY-2, pos.actT, scale-0.02f, scale-0.02f); } else diff --git a/projects/mtg/src/Credits.cpp b/projects/mtg/src/Credits.cpp index 64c4a609e..3e920c178 100644 --- a/projects/mtg/src/Credits.cpp +++ b/projects/mtg/src/Credits.cpp @@ -69,7 +69,7 @@ bool Unlockable::tryToUnlock(GameObserver * game) { string id = getValue("id"); assert(id.size() > 0); - GameOptionAward* goa = (GameOptionAward*) &options[id]; + GameOptionAward* goa = (GameOptionAward*) &options[id]; goa->giveAward(); return true; } diff --git a/projects/mtg/src/Damage.cpp b/projects/mtg/src/Damage.cpp index 3b677ff18..5691eed5a 100644 --- a/projects/mtg/src/Damage.cpp +++ b/projects/mtg/src/Damage.cpp @@ -76,7 +76,7 @@ int Damage::resolve() MTGCardInstance * _target = (MTGCardInstance *) target; if ((_target)->protectedAgainst(source)) damage = 0; - //rulings = 10/4/2004 The damage prevention ability works even if it has no counters, as long as some effect keeps its toughness above zero. + //rulings = 10/4/2004 The damage prevention ability works even if it has no counters, as long as some effect keeps its toughness above zero. //these creature are essentially immune to damage. however 0/-1 effects applied through lords or counters can kill them. if ((_target)->has(Constants::PROTECTIONFROMCOLOREDSPELLS)) {//damage is prevented as long as the damage source is a spell on the stack... diff --git a/projects/mtg/src/DeckMenu.cpp b/projects/mtg/src/DeckMenu.cpp index 6a9f7fa5a..3b670e9f5 100644 --- a/projects/mtg/src/DeckMenu.cpp +++ b/projects/mtg/src/DeckMenu.cpp @@ -20,7 +20,7 @@ namespace DeckMenuConst const float kLineHeight = 25; const float kDescriptionVerticalBoxPadding = -5; const float kDescriptionHorizontalBoxPadding = 5; - + const float kVerticalScrollSpeed = 7.0f; const int DETAILED_INFO_THRESHOLD = 20; @@ -69,7 +69,7 @@ JGuiController(JGE::GetInstance(), id, listener), fontId(fontId), mShowDetailsSc menuInitialized = false; float scrollerWidth = 200.0f; - float scrollerHeight = 28.0f; + float scrollerHeight = 28.0f; mScroller = NEW VerticalTextScroller(Fonts::MAIN_FONT, 14, 235, scrollerWidth, scrollerHeight, DeckMenuConst::kVerticalScrollSpeed); mAutoTranslate = true; @@ -94,7 +94,7 @@ JGuiController(JGE::GetInstance(), id, listener), fontId(fontId), mShowDetailsSc mSelectionTargetY = selectionY = DeckMenuConst::kVerticalMargin; if (NULL == stars) - stars = NEW hgeParticleSystem(WResourceManager::Instance()->RetrievePSI("stars.psi", WResourceManager::Instance()->GetQuad("stars").get())); + stars = NEW hgeParticleSystem(WResourceManager::Instance()->RetrievePSI("stars.psi", WResourceManager::Instance()->GetQuad("stars").get())); stars->FireAt(mX, mY); const string detailedInfoString = _("Detailed Info"); @@ -248,11 +248,11 @@ void DeckMenu::Render() if (currentMenuItem->getY() - DeckMenuConst::kLineHeight * startId < mY + height - DeckMenuConst::kLineHeight + 7) { // only load stats for visible items in the list - DeckMetaData* metaData = currentMenuItem->getMetaData(); + DeckMetaData* metaData = currentMenuItem->getMetaData(); if (metaData && !metaData->mStatsLoaded) { metaData->LoadStats(); - } + } if (currentMenuItem->hasFocus()) { @@ -291,7 +291,7 @@ void DeckMenu::Render() } // fill in the description part of the screen - string text = wordWrap(_(currentMenuItem->getDescription()), descWidth, descriptionFont->mFontID ); + string text = wordWrap(_(currentMenuItem->getDescription()), descWidth, descriptionFont->mFontID ); descriptionFont->SetColor(ARGB(255,255,255,255)); descriptionFont->DrawString(text.c_str(), descX, descY); @@ -314,19 +314,19 @@ void DeckMenu::Render() } } - if (!title.empty()) + if (!title.empty()) { mFont->SetColor(ARGB(255,255,255,255)); mFont->DrawString(title.c_str(), titleX, titleY, JGETEXT_CENTER); } mScroller->Render(); - RenderBackground(); + RenderBackground(); RenderDeckManaColors(); renderer->SetTexBlend(BLEND_SRC_ALPHA, BLEND_ONE); - stars->Render(); - renderer->SetTexBlend(BLEND_SRC_ALPHA, BLEND_ONE_MINUS_SRC_ALPHA); + stars->Render(); + renderer->SetTexBlend(BLEND_SRC_ALPHA, BLEND_ONE_MINUS_SRC_ALPHA); } @@ -403,13 +403,13 @@ void DeckMenu::updateScroller() for (vector::iterator it = taskList.tasks.begin(); it != taskList.tasks.end(); it++) { - ostringstream taskDescription; - taskDescription << "Credits: " << setw(4) << (*it)->getReward() << " / " - << "Days Left: " << (*it)->getExpiration() << endl + ostringstream taskDescription; + taskDescription << "Credits: " << setw(4) << (*it)->getReward() << " / " + << "Days Left: " << (*it)->getExpiration() << endl << (*it)->getDesc() << endl << endl; - mScroller->Add(taskDescription.str()); + mScroller->Add(taskDescription.str()); } - + } void DeckMenu::Close() diff --git a/projects/mtg/src/DeckMenuItem.cpp b/projects/mtg/src/DeckMenuItem.cpp index ee5151ddd..d44e4725d 100644 --- a/projects/mtg/src/DeckMenuItem.cpp +++ b/projects/mtg/src/DeckMenuItem.cpp @@ -16,33 +16,33 @@ float DeckMenuItem::mYOffset = 0; DeckMenuItem::DeckMenuItem(DeckMenu* _parent, int id, int fontId, string text, float x, float y, bool hasFocus, bool autoTranslate, DeckMetaData *deckMetaData) : JGuiObject(id), parent(_parent), fontId(fontId), mX(x), mY(y) { - WFont * mFont = WResourceManager::Instance()->GetWFont(fontId); + WFont * mFont = WResourceManager::Instance()->GetWFont(fontId); mMetaData = deckMetaData; - mText = trim(text); + mText = trim(text); mIsValidSelection = false; - if (autoTranslate) - mText = _(mText); + if (autoTranslate) + mText = _(mText); mHasFocus = hasFocus; - float newImageWidth = 0.0f; + float newImageWidth = 0.0f; if (mMetaData && !mMetaData->getGamesPlayed()) { JTexture * tex = WResourceManager::Instance()->RetrieveTexture("new.png"); if (tex) { JQuadPtr quad = WResourceManager::Instance()->RetrieveQuad("new.png", 2.0f, 2.0f, tex->mWidth - 4.0f, tex->mHeight - 4.0f); //avoids weird rectangle around the texture because of bilinear filtering - newImageWidth = quad->mWidth; - } - } + newImageWidth = quad->mWidth; + } + } - float titleStringWidth = mFont->GetStringWidth( mText.c_str() ); - mTitleResetWidth = (titleStringWidth - newImageWidth )/ 2; - mScrollEnabled = titleStringWidth > ( ITEM_PX_WIDTH - newImageWidth ); - mScrollerOffset = 0.0f; + float titleStringWidth = mFont->GetStringWidth( mText.c_str() ); + mTitleResetWidth = (titleStringWidth - newImageWidth )/ 2; + mScrollEnabled = titleStringWidth > ( ITEM_PX_WIDTH - newImageWidth ); + mScrollerOffset = 0.0f; - if (hasFocus) + if (hasFocus) { mIsValidSelection = true; Entering(); @@ -67,7 +67,7 @@ DeckMenuItem::DeckMenuItem(DeckMenu* _parent, int id, int fontId, string text, f break; } default: - mImageFilename = "noavatar.jpg"; + mImageFilename = "noavatar.jpg"; // do nothing. break; } @@ -75,15 +75,15 @@ DeckMenuItem::DeckMenuItem(DeckMenu* _parent, int id, int fontId, string text, f } - mDisplayInitialized = false; + mDisplayInitialized = false; } void DeckMenuItem::Update(float dt) { - mScrollerOffset += kHorizontalScrollSpeed * dt; - if ( (mScrollerOffset) > mTitleResetWidth ) - mScrollerOffset = -ITEM_PX_WIDTH; + mScrollerOffset += kHorizontalScrollSpeed * dt; + if ( (mScrollerOffset) > mTitleResetWidth ) + mScrollerOffset = -ITEM_PX_WIDTH; } @@ -92,12 +92,12 @@ void DeckMenuItem::RenderWithOffset(float yOffset) mYOffset = yOffset; WFont * mFont = WResourceManager::Instance()->GetWFont(fontId); - - if (!( mHasFocus && mScrollEnabled )) - mScrollerOffset = 0; - if (!mHasFocus && mScrollEnabled) - mScrollerOffset = -1 * ( getWidth() - ITEM_PX_WIDTH )/2; - float offSet = mScrollerOffset; + + if (!( mHasFocus && mScrollEnabled )) + mScrollerOffset = 0; + if (!mHasFocus && mScrollEnabled) + mScrollerOffset = -1 * ( getWidth() - ITEM_PX_WIDTH )/2; + float offSet = mScrollerOffset; if (mHasFocus) mFont->SetScale(SCALE_SELECTED); @@ -105,8 +105,8 @@ void DeckMenuItem::RenderWithOffset(float yOffset) mFont->SetScale(SCALE_NORMAL); mFont->DrawString(mText.c_str(), mX, mY + yOffset, JGETEXT_CENTER, offSet, ITEM_PX_WIDTH); - mDisplayInitialized = true; - //Render a "new" icon for decks that have never been played yet + mDisplayInitialized = true; + //Render a "new" icon for decks that have never been played yet if (mMetaData && !mMetaData->getGamesPlayed()) { JTexture * tex = WResourceManager::Instance()->RetrieveTexture("new.png"); @@ -128,7 +128,7 @@ void DeckMenuItem::Render() void DeckMenuItem::checkUserClick() { - int x1 = -1, y1 = -1; + int x1 = -1, y1 = -1; if (mEngine->GetLeftClickCoordinates(x1, y1)) { mIsValidSelection = false; @@ -136,8 +136,8 @@ void DeckMenuItem::checkUserClick() if ( (x1 >= x2) && (x1 <= (x2 + ITEM_PX_WIDTH)) && (y1 >= y2) && (y1 < (y2 + kItemYHeight))) mIsValidSelection = true; } - else - mIsValidSelection = true; + else + mIsValidSelection = true; } @@ -175,14 +175,14 @@ float DeckMenuItem::getWidth() const string DeckMenuItem::getDeckName() const { - if (mMetaData) - return mMetaData->getName(); + if (mMetaData) + return mMetaData->getName(); - std::string s; - std::stringstream out; - out << mMetaData->getDeckId(); - s = out.str(); - return "[deck" + s + "]"; + std::string s; + std::stringstream out; + out << mMetaData->getDeckId(); + s = out.str(); + return "[deck" + s + "]"; } ostream& DeckMenuItem::toString(ostream& out) const diff --git a/projects/mtg/src/DeckStats.cpp b/projects/mtg/src/DeckStats.cpp index 677760bb6..8ba637293 100644 --- a/projects/mtg/src/DeckStats.cpp +++ b/projects/mtg/src/DeckStats.cpp @@ -394,9 +394,9 @@ void StatsWrapper::updateStats(string filename, MTGAllCards *collection) void StatsWrapper::updateStats(DeckDataWrapper *myDeck) { - if (!this->needUpdate || !myDeck) return; + if (!this->needUpdate || !myDeck) return; - this->needUpdate = false; + this->needUpdate = false; this->cardCount = myDeck->getCount(WSrcDeck::UNFILTERED_COPIES); this->countLands = myDeck->getCount(Constants::MTG_COLOR_LAND); this->totalPrice = myDeck->totalPrice(); diff --git a/projects/mtg/src/DuelLayers.cpp b/projects/mtg/src/DuelLayers.cpp index 2c1713849..b97112aa7 100644 --- a/projects/mtg/src/DuelLayers.cpp +++ b/projects/mtg/src/DuelLayers.cpp @@ -89,7 +89,7 @@ DuelLayers::DuelLayers(GameObserver* go, int playerViewIndex) : nbitems(0), mPlayerViewIndex(playerViewIndex) { observer = go; - observer->mLayers = this; + observer->mLayers = this; mCardSelector = NEW CardSelector(go, this); //1 Action Layer action = NEW ActionLayer(go); @@ -98,8 +98,8 @@ DuelLayers::DuelLayers(GameObserver* go, int playerViewIndex) : //Other display elements action->Add(NEW HUDDisplay(go, -1)); - Add(NEW GuiMana(20, 20, getRenderedPlayerOpponent())); - Add(NEW GuiMana(440, 20, getRenderedPlayer())); + Add(NEW GuiMana(20, 20, getRenderedPlayerOpponent())); + Add(NEW GuiMana(440, 20, getRenderedPlayer())); Add(stack = NEW ActionStack(go)); Add(combat = NEW GuiCombat(go)); Add(action); @@ -216,10 +216,10 @@ float DuelLayers::RightBoundary() Player* DuelLayers::getRenderedPlayer() { - return observer->players[mPlayerViewIndex]; + return observer->players[mPlayerViewIndex]; }; Player* DuelLayers::getRenderedPlayerOpponent() { - return observer->players[mPlayerViewIndex]->opponent(); + return observer->players[mPlayerViewIndex]->opponent(); }; diff --git a/projects/mtg/src/GameApp.cpp b/projects/mtg/src/GameApp.cpp index bdc8fbe05..60fcfd31a 100644 --- a/projects/mtg/src/GameApp.cpp +++ b/projects/mtg/src/GameApp.cpp @@ -77,7 +77,7 @@ GameApp::GameApp() : mCurrentState = NULL; mNextState = NULL; - rules = 0; + rules = 0; music = NULL; } @@ -156,7 +156,7 @@ void GameApp::Create() //Setup Cache before calling any gfx/sfx functions - WResourceManager::Instance()->ResetCacheLimits(); + WResourceManager::Instance()->ResetCacheLimits(); LOG("Checking for music files"); diff --git a/projects/mtg/src/GameObserver.cpp b/projects/mtg/src/GameObserver.cpp index 2731b2429..0b1705378 100644 --- a/projects/mtg/src/GameObserver.cpp +++ b/projects/mtg/src/GameObserver.cpp @@ -165,18 +165,18 @@ void GameObserver::nextGamePhase() { Phase * cPhaseOld = phaseRing->getCurrentPhase(); if (cPhaseOld->id == MTG_PHASE_COMBATDAMAGE) - if ((FIRST_STRIKE == combatStep) || (END_FIRST_STRIKE == combatStep) || (DAMAGE == combatStep)) - { - nextCombatStep(); - return; - } + if ((FIRST_STRIKE == combatStep) || (END_FIRST_STRIKE == combatStep) || (DAMAGE == combatStep)) + { + nextCombatStep(); + return; + } if (cPhaseOld->id == MTG_PHASE_COMBATBLOCKERS) - if (BLOCKERS == combatStep || TRIGGERS == combatStep) - { - nextCombatStep(); - return; - } + if (BLOCKERS == combatStep || TRIGGERS == combatStep) + { + nextCombatStep(); + return; + } phaseRing->forward(); @@ -191,12 +191,12 @@ void GameObserver::nextGamePhase() mCurrentGamePhase = cPhase->id; if (MTG_PHASE_COMBATDAMAGE == mCurrentGamePhase) - nextCombatStep(); + nextCombatStep(); if (MTG_PHASE_COMBATEND == mCurrentGamePhase) combatStep = BLOCKERS; //if (currentPlayer != cPhase->player) - // nextPlayer();//depreciated; we call this at EOT step now. unsure what the purpose of this was originally.fix for a bug? + // nextPlayer();//depreciated; we call this at EOT step now. unsure what the purpose of this was originally.fix for a bug? //init begin of turn if (mCurrentGamePhase == MTG_PHASE_BEFORE_BEGIN) @@ -229,8 +229,8 @@ void GameObserver::nextGamePhase() handmodified = currentPlayer->handsize+currentPlayer->handmodifier; //Auto Hand cleaning, in case the player didn't do it himself if(handmodified < 0) - handmodified = 0; - while (currentPlayer->game->hand->nb_cards > handmodified && currentPlayer->nomaxhandsize == false) + handmodified = 0; + while (currentPlayer->game->hand->nb_cards > handmodified && currentPlayer->nomaxhandsize == false) { WEvent * e = NEW WEventCardDiscard(currentPlayer->game->hand->cards[0]); receiveEvent(e); @@ -312,16 +312,16 @@ void GameObserver::userRequestNextGamePhase(bool allowInterrupt, bool log) cardClick(getCurrentTargetChooser()->source, 0, false); } if (allowInterrupt && mLayers->stackLayer()->getNext(NULL, 0, NOT_RESOLVED)) - return; + return; if (getCurrentTargetChooser()) - return; + return; //if (mLayers->actionLayer()->isWaitingForAnswer()) - // return; + // return; // Wil 12/5/10: additional check, not quite understanding why TargetChooser doesn't seem active at this point. // If we deem that an extra cost payment needs to be made, don't allow the next game phase to proceed. // Here's what I find weird - if the extra cost is something like a sacrifice, doesn't that imply a TargetChooser? if (WaitForExtraPayment(NULL)) - return; + return; Phase * cPhaseOld = phaseRing->getCurrentPhase(); if (allowInterrupt && ((cPhaseOld->id == MTG_PHASE_COMBATBLOCKERS && combatStep == ORDER) @@ -329,7 +329,7 @@ void GameObserver::userRequestNextGamePhase(bool allowInterrupt, bool log) || (cPhaseOld->id == MTG_PHASE_COMBATDAMAGE) || opponent()->isAI() || options[Options::optionInterrupt(mCurrentGamePhase)].number - || currentPlayer->offerInterruptOnPhase - 1 == mCurrentGamePhase + || currentPlayer->offerInterruptOnPhase - 1 == mCurrentGamePhase )) { mLayers->stackLayer()->AddNextGamePhase(); @@ -577,7 +577,7 @@ void GameObserver::Update(float dt) } currentActionPlayer = player; if (isInterrupting) - player = isInterrupting; + player = isInterrupting; if(mLayers) { mLayers->Update(dt, player); @@ -597,7 +597,7 @@ void GameObserver::gameStateBasedEffects() { if(getCurrentTargetChooser() && int(getCurrentTargetChooser()->getNbTargets()) == getCurrentTargetChooser()->maxtargets) getCurrentTargetChooser()->done = true; - ///////////////////////////////////// + ///////////////////////////////////// for (int d = 0; d < 2; d++) { MTGGameZone * dzones[] = { players[d]->game->inPlay, players[d]->game->graveyard, players[d]->game->hand, players[d]->game->library, players[d]->game->exile }; @@ -608,8 +608,8 @@ void GameObserver::gameStateBasedEffects() { for (int c = zone->nb_cards - 1; c >= 0; c--) { - zone->cards[c]->cardistargetted = 0; - zone->cards[c]->cardistargetter = 0; + zone->cards[c]->cardistargetted = 0; + zone->cards[c]->cardistargetter = 0; } } }//check for losers if its GAMEOVER clear the stack to allow gamestateeffects to continue @@ -1167,9 +1167,9 @@ void GameObserver::Render() if(mLayers) mLayers->Render(); if (targetChooser || (mLayers && mLayers->actionLayer()->isWaitingForAnswer())) - JRenderer::GetInstance()->DrawRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, ARGB(255,255,0,0)); + JRenderer::GetInstance()->DrawRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, ARGB(255,255,0,0)); if (mExtraPayment) - mExtraPayment->Render(); + mExtraPayment->Render(); for (size_t i = 0; i < players.size(); ++i) { @@ -1253,7 +1253,7 @@ void GameObserver::stackObjectClicked(Interruptible * action) { int reaction = mLayers->actionLayer()->isReactingToTargetClick(action); if (reaction == -1) - mLayers->actionLayer()->reactToTargetClick(action); + mLayers->actionLayer()->reactToTargetClick(action); } } @@ -1333,7 +1333,7 @@ int GameObserver::cardClick(MTGCardInstance * card, Targetable * object, bool lo MTGCardInstance* backup = NULL; if (!card) { - clickedPlayer = ((Player *) object); + clickedPlayer = ((Player *) object); } else { backup = card; zone = card->currentZone; @@ -1447,7 +1447,7 @@ int GameObserver::cardClick(MTGCardInstance * card, Targetable * object, bool lo //Current player's hand handmodified = currentPlayer->handsize+currentPlayer->handmodifier; if(handmodified < 0) - handmodified = 0; + handmodified = 0; if (currentPlayer->game->hand->hasCard(card) && mCurrentGamePhase == MTG_PHASE_CLEANUP && currentPlayer->game->hand->nb_cards > handmodified && currentPlayer->nomaxhandsize == false) { @@ -1487,9 +1487,9 @@ int GameObserver::untap(MTGCardInstance * card) return 0; } if (card->has(Constants::DOESNOTUNTAP)) - return 0; + return 0; if (card->frozen > 0) - return 0; + return 0; card->attemptUntap(); return 1; } @@ -1511,7 +1511,7 @@ int GameObserver::isInPlay(MTGCardInstance * card) for (int i = 0; i < 2; i++) { if (players[i]->game->isInPlay(card)) - return 1; + return 1; } return 0; } @@ -1552,10 +1552,10 @@ void GameObserver::untapPhase() int GameObserver::receiveEvent(WEvent * e) { if (!e) - return 0; + return 0; eventsQueue.push(e); if (eventsQueue.size() > 1) - return -1; //resolving events can generate more events + return -1; //resolving events can generate more events int result = 0; while (eventsQueue.size()) { @@ -1574,7 +1574,7 @@ int GameObserver::receiveEvent(WEvent * e) Player * GameObserver::currentlyActing() { if (isInterrupting) - return isInterrupting; + return isInterrupting; return currentActionPlayer; } @@ -1667,7 +1667,7 @@ bool GameObserver::load(const string& ss, bool undo, int controlledPlayerIndex ) { bool currentPlayerSet = false; - int state = -1; + int state = -1; string s; stringstream stream(ss); @@ -1686,7 +1686,7 @@ bool GameObserver::load(const string& ss, bool undo, int controlledPlayerIndex if (s.find("seed ") == 0) { mSeed = atoi(s.substr(5).c_str()); - randomGenerator.setSeed(mSeed); + randomGenerator.setSeed(mSeed); continue; } if (s.find("rvalues:") == 0) @@ -1755,7 +1755,7 @@ bool GameObserver::load(const string& ss, bool undo, int controlledPlayerIndex case 3: if (s.compare("[end]") == 0) { - turn = 0; + turn = 0; mLayers = NEW DuelLayers(this, controlledPlayerIndex); currentPlayer = players[currentPlayerId]; phaseRing = NEW PhaseRing(this); @@ -1844,7 +1844,7 @@ bool GameObserver::processAction(const string& s) DebugTrace("no clue about: " + s); } - return true; + return true; } bool GameObserver::processActions(bool undo @@ -1885,7 +1885,7 @@ bool GameObserver::processActions(bool undo for(loadingite = loadingList.begin(); loadingite != loadingList.end(); loadingite++, cmdIndex++) { - processAction(*loadingite); + processAction(*loadingite); size_t nb = actionsList.size(); @@ -1965,7 +1965,7 @@ Player* GameObserver::createPlayer(const string& playerMode ) { Player::Mode aMode = (Player::Mode)atoi(playerMode.c_str()); - Player* pPlayer = 0; + Player* pPlayer = 0; switch(aMode) { @@ -1989,12 +1989,12 @@ Player* GameObserver::createPlayer(const string& playerMode break; } - if(pPlayer) - { - players.push_back(pPlayer); - } + if(pPlayer) + { + players.push_back(pPlayer); + } - return pPlayer; + return pPlayer; } #ifdef TESTSUITE @@ -2040,7 +2040,7 @@ void GameObserver::loadPlayer(int playerId, PlayerType playerType, int decknb, b loadPlayer(playerId, NEW HumanPlayer(this, deckFile, deckFileSmall, premadeDeck)); } - } + } else { //AI Player, chooses deck AIPlayerFactory playerCreator; @@ -2076,43 +2076,43 @@ void GameObserver::loadPlayer(int playerId, PlayerType playerType, int decknb, b #ifdef NETWORK_SUPPORT NetworkGameObserver::NetworkGameObserver(JNetwork* pNetwork, WResourceManager* output, JGE* input) - : GameObserver(output, input), mpNetworkSession(pNetwork), mSynchronized(false) + : GameObserver(output, input), mpNetworkSession(pNetwork), mSynchronized(false) { - mpNetworkSession->registerCommand("loadPlayer", this, loadPlayer, ignoreResponse); - mpNetworkSession->registerCommand("synchronize", this, synchronize, checkSynchro); - mpNetworkSession->registerCommand("sendAction", this, sendAction, checkSynchro); - mpNetworkSession->registerCommand("disconnect", this, disconnect, ignoreResponse); + mpNetworkSession->registerCommand("loadPlayer", this, loadPlayer, ignoreResponse); + mpNetworkSession->registerCommand("synchronize", this, synchronize, checkSynchro); + mpNetworkSession->registerCommand("sendAction", this, sendAction, checkSynchro); + mpNetworkSession->registerCommand("disconnect", this, disconnect, ignoreResponse); } NetworkGameObserver::~NetworkGameObserver() { - mpNetworkSession->sendCommand("disconnect", ""); + mpNetworkSession->sendCommand("disconnect", ""); } void NetworkGameObserver::disconnect(void*pxThis, stringstream&, stringstream&) { - NetworkGameObserver* pThis = (NetworkGameObserver*)pxThis; - pThis->setLoser(pThis->getView()->getRenderedPlayerOpponent()); + NetworkGameObserver* pThis = (NetworkGameObserver*)pxThis; + pThis->setLoser(pThis->getView()->getRenderedPlayerOpponent()); } void NetworkGameObserver::Update(float dt) { - mpNetworkSession->Update(); - ::GameObserver::Update(dt); + mpNetworkSession->Update(); + ::GameObserver::Update(dt); } void NetworkGameObserver::loadPlayer(int playerId, Player* player) { - GameObserver::loadPlayer(playerId, player); - stringstream out; - out << *player; - mpNetworkSession->sendCommand("loadPlayer", out.str()); + GameObserver::loadPlayer(playerId, player); + stringstream out; + out << *player; + mpNetworkSession->sendCommand("loadPlayer", out.str()); } void NetworkGameObserver::loadPlayer(void*pxThis, stringstream& in, stringstream&) { - NetworkGameObserver* pThis = (NetworkGameObserver*)pxThis; - Player* pPlayer = 0; + NetworkGameObserver* pThis = (NetworkGameObserver*)pxThis; + Player* pPlayer = 0; string s; while(std::getline(in, s)) @@ -2135,50 +2135,50 @@ void NetworkGameObserver::loadPlayer(void*pxThis, stringstream& in, stringstream void NetworkGameObserver::synchronize() { - if(!mSynchronized && mpNetworkSession->isServer()) - { - stringstream out; - out << *this; - mpNetworkSession->sendCommand("synchronize", out.str()); - mSynchronized = true; - } + if(!mSynchronized && mpNetworkSession->isServer()) + { + stringstream out; + out << *this; + mpNetworkSession->sendCommand("synchronize", out.str()); + mSynchronized = true; + } } void NetworkGameObserver::synchronize(void*pxThis, stringstream& in, stringstream& out) { - NetworkGameObserver* pThis = (NetworkGameObserver*)pxThis; - // now, we need to load the game from player 2's perspective - pThis->load(in.str(), false, 1); - out << *pThis; + NetworkGameObserver* pThis = (NetworkGameObserver*)pxThis; + // now, we need to load the game from player 2's perspective + pThis->load(in.str(), false, 1); + out << *pThis; } void NetworkGameObserver::checkSynchro(void*pxThis, stringstream& in, stringstream&) { - NetworkGameObserver* pThis = (NetworkGameObserver*)pxThis; - - GameObserver aGame; - aGame.mRules = pThis->mRules; - aGame.load(in.str()); + NetworkGameObserver* pThis = (NetworkGameObserver*)pxThis; + + GameObserver aGame; + aGame.mRules = pThis->mRules; + aGame.load(in.str()); - assert(aGame == *pThis); + assert(aGame == *pThis); } void NetworkGameObserver::sendAction(void*pxThis, stringstream& in, stringstream&) { - NetworkGameObserver* pThis = (NetworkGameObserver*)pxThis; + NetworkGameObserver* pThis = (NetworkGameObserver*)pxThis; pThis->mForwardAction = false; - pThis->processAction(in.str()); + pThis->processAction(in.str()); pThis->mForwardAction = true; - //out << *pThis; + //out << *pThis; } void NetworkGameObserver::logAction(const string& s) { - GameObserver::logAction(s); - if(mForwardAction) - mpNetworkSession->sendCommand("sendAction", s); + GameObserver::logAction(s); + if(mForwardAction) + mpNetworkSession->sendCommand("sendAction", s); } #endif diff --git a/projects/mtg/src/GameOptions.cpp b/projects/mtg/src/GameOptions.cpp index 548029827..c10bf2435 100644 --- a/projects/mtg/src/GameOptions.cpp +++ b/projects/mtg/src/GameOptions.cpp @@ -18,8 +18,8 @@ const string Options::optionNames[] = { "sfxVolume", "difficulty", "cheatmode", - "optimizedhand", - "cheatmodedecks", + "optimizedhand", + "cheatmodedecks", "displayOSD", "closed_hand", "hand_direction", @@ -352,11 +352,11 @@ int GameOptions::load() } // (PSY) Make sure that cheatmode is switched off for ineligible profiles: if (options[Options::ACTIVE_PROFILE].str != SECRET_PROFILE) - { + { (*this)[Options::CHEATMODE].number = 0; - (*this)[Options::OPTIMIZE_HAND].number = 0; - (*this)[Options::CHEATMODEAIDECK].number = 0; - } + (*this)[Options::OPTIMIZE_HAND].number = 0; + (*this)[Options::CHEATMODEAIDECK].number = 0; + } //Default values. Anywhere else to put those ? if (!(*this)[Options::MAX_GRADE].number) @@ -371,11 +371,11 @@ int GameOptions::save() { // (PSY) Make sure that cheatmode is switched off for ineligible profiles: if (options[Options::ACTIVE_PROFILE].str != SECRET_PROFILE) - { + { (*this)[Options::CHEATMODE].number = 0; - (*this)[Options::OPTIMIZE_HAND].number = 0; - (*this)[Options::CHEATMODEAIDECK].number = 0; - } + (*this)[Options::OPTIMIZE_HAND].number = 0; + (*this)[Options::CHEATMODEAIDECK].number = 0; + } std::ofstream file; if (JFileSystem::GetInstance()->openForWrite(file, mFilename)) @@ -997,9 +997,9 @@ OptionManaDisplay::OptionManaDisplay() { mDef.values.push_back(EnumDefinition::assoc(DYNAMIC, "Eye candy")); mDef.values.push_back(EnumDefinition::assoc(STATIC, "Simple")); - mDef.values.push_back(EnumDefinition::assoc(NOSTARSDYNAMIC, "No Glitter")); + mDef.values.push_back(EnumDefinition::assoc(NOSTARSDYNAMIC, "No Glitter")); mDef.values.push_back(EnumDefinition::assoc(BOTH, "Both"));//no luck in getting this to show up as an option. - //Both should still work as always however the enum and this dont want to pair up, no "both" in options now. + //Both should still work as always however the enum and this dont want to pair up, no "both" in options now. } ; OptionVolume OptionVolume::mDef; diff --git a/projects/mtg/src/GameState.cpp b/projects/mtg/src/GameState.cpp index 30c4eabd1..ff26683fc 100644 --- a/projects/mtg/src/GameState.cpp +++ b/projects/mtg/src/GameState.cpp @@ -70,7 +70,7 @@ vector GameState::BuildDeckList(const string& path, const string { std::ostringstream aiStatsDeckName; aiStatsDeckName << smallDeckPrefix << "_deck" << nbDecks; - meta->mStatsFilename = aiStatsDeckName.str(); + meta->mStatsFilename = aiStatsDeckName.str(); meta->mIsAI = true; if (meta->mPlayerDeck != statsPlayer->GetCurrentDeckStatsFile()) { @@ -100,7 +100,7 @@ vector GameState::BuildDeckList(const string& path, const string meta = NULL; } - std::sort(retList.begin(), retList.end(), sortByName); + std::sort(retList.begin(), retList.end(), sortByName); return retList; } diff --git a/projects/mtg/src/GameStateDuel.cpp b/projects/mtg/src/GameStateDuel.cpp index 2af6be905..98baeddf1 100644 --- a/projects/mtg/src/GameStateDuel.cpp +++ b/projects/mtg/src/GameStateDuel.cpp @@ -1095,7 +1095,7 @@ void GameStateDuel::Render() char buf[4096]; mFont->SetColor(ARGB(255,255,255,255)); - int elapsedTime = testSuite->getElapsedTime(); + int elapsedTime = testSuite->getElapsedTime(); sprintf(buf, "Time to run the tests: %is", elapsedTime/1000); mFont->DrawString(buf,0,SCREEN_HEIGHT/2 - 20); diff --git a/projects/mtg/src/GameStateMenu.cpp b/projects/mtg/src/GameStateMenu.cpp index 0fa693f16..82dc9f005 100644 --- a/projects/mtg/src/GameStateMenu.cpp +++ b/projects/mtg/src/GameStateMenu.cpp @@ -169,7 +169,7 @@ void GameStateMenu::genNbCardsStr() PlayerData * playerdata = NEW PlayerData(MTGCollection()); size_t totalUnique = MTGCollection()->primitives.size(); size_t totalPrints = MTGCollection()->totalCards(); - + if (totalUnique != totalPrints) { if (playerdata && !options[Options::ACTIVE_PROFILE].isDefault()) @@ -481,7 +481,7 @@ void GameStateMenu::Update(float dt) mParent->mpNetwork->connect(mParent->mServerAddress); // we let the server choose the game mode mParent->gameType = GAME_TYPE_SLAVE; - // just to select one, the HOST is in control here. + // just to select one, the HOST is in control here. mParent->rules = Rules::getRulesByFilename("classic.txt"); hasChosenGameType = true; subMenuController->Close(); @@ -599,16 +599,16 @@ void GameStateMenu::Update(float dt) case MENU_STATE_NETWORK_DEFINE: if(MENU_STATE_MINOR_NONE == (currentState & MENU_STATE_MINOR)) { - currentState = MENU_STATE_MAJOR_SUBMENU; + currentState = MENU_STATE_MAJOR_SUBMENU; subMenuController = NEW SimpleMenu(JGE::GetInstance(), WResourceManager::Instance(), MENU_FIRST_DUEL_SUBMENU, this, Fonts::MENU_FONT, 150, 60); - if (subMenuController) - { - subMenuController->Add(SUBMENUITEM_HOST_GAME, "Host a game"); - subMenuController->Add(SUBMENUITEM_JOIN_GAME, "Join a game"); - subMenuController->Add(SUBMENUITEM_CANCEL, "Cancel"); - } - } - break; + if (subMenuController) + { + subMenuController->Add(SUBMENUITEM_HOST_GAME, "Host a game"); + subMenuController->Add(SUBMENUITEM_JOIN_GAME, "Join a game"); + subMenuController->Add(SUBMENUITEM_CANCEL, "Cancel"); + } + } + break; case MENU_STATE_NETWORK_WAIT: if(MENU_STATE_MINOR_NONE == (currentState & MENU_STATE_MINOR)) { @@ -619,9 +619,9 @@ void GameStateMenu::Update(float dt) } else if(!subMenuController) { - string aString; - mParent->mpNetwork->getServerIp(aString); - aString = "Waiting for connection to " + aString; + string aString; + mParent->mpNetwork->getServerIp(aString); + aString = "Waiting for connection to " + aString; subMenuController = NEW SimpleMenu(JGE::GetInstance(), WResourceManager::Instance(), MENU_FIRST_DUEL_SUBMENU, this, Fonts::MENU_FONT, 150, 60, aString.c_str()); if (subMenuController) @@ -918,7 +918,7 @@ void GameStateMenu::ButtonPressed(int controllerId, int controlId) subMenuController->Close(); } #ifdef NETWORK_SUPPORT - SAFE_DELETE(mParent->mpNetwork); + SAFE_DELETE(mParent->mpNetwork); #endif //NETWORK_SUPPORT currentState = MENU_STATE_MAJOR_MAINMENU | MENU_STATE_MINOR_SUBMENU_CLOSING; break; diff --git a/projects/mtg/src/GameStateOptions.cpp b/projects/mtg/src/GameStateOptions.cpp index 95d4856c9..57d983833 100644 --- a/projects/mtg/src/GameStateOptions.cpp +++ b/projects/mtg/src/GameStateOptions.cpp @@ -81,8 +81,8 @@ void GameStateOptions::Start() optionsList->Add(NEW WGuiButton(NEW WGuiHeader("New Profile"), -102, GameStateOptionsConst::kNewProfileID, this)); optionsList->Add(NEW WDecoCheat(NEW OptionInteger(Options::CHEATMODE, "Enable Cheat Mode"))); - optionsList->Add(NEW WDecoCheat(NEW OptionInteger(Options::OPTIMIZE_HAND, "Optimize Starting Hand"))); - optionsList->Add(NEW WDecoCheat(NEW OptionInteger(Options::CHEATMODEAIDECK, "Unlock All Ai Decks"))); + optionsList->Add(NEW WDecoCheat(NEW OptionInteger(Options::OPTIMIZE_HAND, "Optimize Starting Hand"))); + optionsList->Add(NEW WDecoCheat(NEW OptionInteger(Options::CHEATMODEAIDECK, "Unlock All Ai Decks"))); optionsTabs->Add(optionsList); diff --git a/projects/mtg/src/GameStateShop.cpp b/projects/mtg/src/GameStateShop.cpp index d7f6f76b5..47f300379 100644 --- a/projects/mtg/src/GameStateShop.cpp +++ b/projects/mtg/src/GameStateShop.cpp @@ -627,12 +627,12 @@ void GameStateShop::Update(float dt) else if (btn == JGE_BTN_CANCEL) options[Options::DISABLECARDS].number = !options[Options::DISABLECARDS].number; else if (btn == JGE_BTN_SEC) - { + { bListCards = !bListCards; disablePurchase = false; clearInput = true; return; - } + } else if (shopMenu) { #if defined (IOS) || defined (ANDROID) @@ -770,7 +770,7 @@ void GameStateShop::Render() #ifndef TOUCH_ENABLED float len = 4 + mFont->GetStringWidth(kOtherCardsString.c_str()); - r->RenderQuad(pspIcons[6].get(), SCREEN_WIDTH - len - 0.5 - 10, SCREEN_HEIGHT - 8, 0, kPspIconScaleFactor, kPspIconScaleFactor); + r->RenderQuad(pspIcons[6].get(), SCREEN_WIDTH - len - 0.5 - 10, SCREEN_HEIGHT - 8, 0, kPspIconScaleFactor, kPspIconScaleFactor); mFont->DrawString(kOtherCardsString, SCREEN_WIDTH - len, SCREEN_HEIGHT - 14); #else enableButtons(); diff --git a/projects/mtg/src/GuiAvatars.cpp b/projects/mtg/src/GuiAvatars.cpp index 173604e05..b12d2a8fd 100644 --- a/projects/mtg/src/GuiAvatars.cpp +++ b/projects/mtg/src/GuiAvatars.cpp @@ -10,11 +10,11 @@ GuiAvatars::GuiAvatars(DuelLayers* duelLayers) : GuiLayer(duelLayers), active(NULL) { - Add(self = NEW GuiAvatar(SCREEN_WIDTH, SCREEN_HEIGHT, false, mpDuelLayers->getRenderedPlayer(), GuiAvatar::BOTTOM_RIGHT, this)); + Add(self = NEW GuiAvatar(SCREEN_WIDTH, SCREEN_HEIGHT, false, mpDuelLayers->getRenderedPlayer(), GuiAvatar::BOTTOM_RIGHT, this)); self->zoom = 0.9f; Add(selfGraveyard = NEW GuiGraveyard(SCREEN_WIDTH - GuiAvatar::Width - GuiGameZone::Width / 2 - 11, SCREEN_HEIGHT - GuiAvatar::Height - 1, false, mpDuelLayers->getRenderedPlayer(), this)); Add(selfLibrary = NEW GuiLibrary(SCREEN_WIDTH - GuiAvatar::Width - GuiGameZone::Width / 2 - 11, SCREEN_HEIGHT - GuiAvatar::Height - 5 + GuiGameZone::Height + 5, false, mpDuelLayers->getRenderedPlayer(), this)); - //myexile + //myexile Add(selfExile = NEW GuiExile(SCREEN_WIDTH - GuiAvatar::Width - GuiGameZone::Width / 2 - 11, SCREEN_HEIGHT - GuiAvatar::Height - 30, false, mpDuelLayers->getRenderedPlayer(), this)); Add(opponent = NEW GuiAvatar(0, 0, false, mpDuelLayers->getRenderedPlayerOpponent(), GuiAvatar::TOP_LEFT, this)); diff --git a/projects/mtg/src/GuiHand.cpp b/projects/mtg/src/GuiHand.cpp index ef318c8c9..950585dd9 100644 --- a/projects/mtg/src/GuiHand.cpp +++ b/projects/mtg/src/GuiHand.cpp @@ -330,4 +330,4 @@ int GuiHandOpponent::receiveEventMinus(WEvent* e) // I wanna write it like that. GCC doesn't want me to without -O. // I'm submitting a bug report. -// it->x = (it->x + (flip ? RightRowX : LeftRowX)) / 2; +// it->x = (it->x + (flip ? RightRowX : LeftRowX)) / 2; diff --git a/projects/mtg/src/GuiMana.cpp b/projects/mtg/src/GuiMana.cpp index e5ab1145c..14c73d720 100644 --- a/projects/mtg/src/GuiMana.cpp +++ b/projects/mtg/src/GuiMana.cpp @@ -106,14 +106,14 @@ ManaIcon::ManaIcon(int color, float x, float y, float destx, float desty) : // if we want to throttle the amount of particles for mana, // here's where to do it - this is hardcoded to something like 114 in the psi file - if(OptionManaDisplay::NOSTARSDYNAMIC == options[Options::MANADISPLAY].number) - { + if(OptionManaDisplay::NOSTARSDYNAMIC == options[Options::MANADISPLAY].number) + { particleSys->info.nEmission = 0; - } - else - { + } + else + { particleSys->info.nEmission = 60; - } + } icon = manaIcons[color]; particleSys->FireAt(x, y); @@ -193,7 +193,7 @@ void ManaIcon::Update(float dt, float shift) if (particleSys && (fabs(destx - x) < 5) && (fabs(desty + shift - y) < 5)) { - if (OptionManaDisplay::STATIC == options[Options::MANADISPLAY].number) + if (OptionManaDisplay::STATIC == options[Options::MANADISPLAY].number) { SAFE_DELETE(particleSys); //Static Mana Only: avoid expensive particle processing } @@ -305,7 +305,7 @@ void GuiMana::Render() for (vector::iterator it = manas.begin(); it != manas.end(); ++it) (*it)->Render(); - if (OptionManaDisplay::DYNAMIC != options[Options::MANADISPLAY].number && OptionManaDisplay::NOSTARSDYNAMIC != options[Options::MANADISPLAY].number ) + if (OptionManaDisplay::DYNAMIC != options[Options::MANADISPLAY].number && OptionManaDisplay::NOSTARSDYNAMIC != options[Options::MANADISPLAY].number ) RenderStatic(); } diff --git a/projects/mtg/src/GuiPlay.cpp b/projects/mtg/src/GuiPlay.cpp index e4fc0bd7c..02bbe0939 100644 --- a/projects/mtg/src/GuiPlay.cpp +++ b/projects/mtg/src/GuiPlay.cpp @@ -124,7 +124,7 @@ void GuiPlay::BattleField::reset(float x, float y) void GuiPlay::BattleField::EnstackAttacker(CardView* card) { card->x = CARD_WIDTH + 20 + (currentAttacker * (HORZWIDTH) / (attackers+1)); - card->y = baseY + (card->card->getObserver()->getView()->getRenderedPlayer() == card->card->controller() ? 20 + y : -20 - y); + card->y = baseY + (card->card->getObserver()->getView()->getRenderedPlayer() == card->card->controller() ? 20 + y : -20 - y); ++currentAttacker; // JRenderer::GetInstance()->RenderQuad(WResourceManager::Instance()->GetQuad("BattleIcon"), card->actX, card->actY, 0, 0.5 + 0.1 * sinf(JGE::GetInstance()->GetTime()), 0.5 + 0.1 * sinf(JGE::GetInstance()->GetTime())); } @@ -197,7 +197,7 @@ void GuiPlay::Replace() { if((!(*it)->card->hasSubtype(Subtypes::TYPE_AURA)|| ((*it)->card->hasSubtype(Subtypes::TYPE_AURA) && (*it)->card->playerTarget)) && !(*it)->card->hasType(Subtypes::TYPE_PLANESWALKER)) { - if (mpDuelLayers->getRenderedPlayer() == (*it)->card->controller()) + if (mpDuelLayers->getRenderedPlayer() == (*it)->card->controller()) ++selfSpellsN; else ++opponentSpellsN; @@ -398,7 +398,7 @@ int GuiPlay::receiveEventPlus(WEvent * e) } else { - // this should never happen, if you have a consistent repro case, ping Wil please + // this should never happen, if you have a consistent repro case, ping Wil please assert(false); } return 1; diff --git a/projects/mtg/src/IconButton.cpp b/projects/mtg/src/IconButton.cpp index 75515b478..8644183b2 100644 --- a/projects/mtg/src/IconButton.cpp +++ b/projects/mtg/src/IconButton.cpp @@ -4,8 +4,8 @@ #include "WResourceManager.h" #include "WFont.h" -#define SCALE_SELECTED 1.2f -#define SCALE_NORMAL 1.0f +#define SCALE_SELECTED 1.2f +#define SCALE_NORMAL 1.0f IconButtonsController::IconButtonsController(JGE* jge, float x, float y): JGuiController(jge, 0, NULL), mX(x), mY(y) { diff --git a/projects/mtg/src/InteractiveButton.cpp b/projects/mtg/src/InteractiveButton.cpp index 91a41813b..b86524204 100644 --- a/projects/mtg/src/InteractiveButton.cpp +++ b/projects/mtg/src/InteractiveButton.cpp @@ -80,7 +80,7 @@ void InteractiveButton::Render() mYOffset += 2; #endif - float buttonXOffset = getX() - mXOffset; + float buttonXOffset = getX() - mXOffset; float buttonYOffset = getY() + mYOffset; if (buttonImage != NULL) { diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index 99cb4744b..16ffa9b41 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -730,8 +730,8 @@ TriggeredAbility * AbilityFactory::parseTrigger(string s, string, int id, Spell bool limitOnceATurn = (s.find("turnlimited") != string::npos); bool isSuspended = (s.find("suspended") != string::npos); bool opponentPoisoned = (s.find("opponentpoisoned") != string::npos); - bool lifelost = (s.find("foelost(") != string::npos); - int lifeamount = lifelost ? atoi(s.substr(s.find("foelost(") + 8,')').c_str()) : 0; + bool lifelost = (s.find("foelost(") != string::npos); + int lifeamount = lifelost ? atoi(s.substr(s.find("foelost(") + 8,')').c_str()) : 0; bool neverRemove = (s.find("dontremove") != string::npos); //Card Changed Zone @@ -1063,12 +1063,12 @@ MTGAbility * AbilityFactory::getCoreAbility(MTGAbility * a) if (MultiAbility * abi = dynamic_cast(a)) return getCoreAbility(abi->abilities[0]); - if (NestedAbility * na = dynamic_cast (a)) - { - if(na->ability) - //only atempt to return a nestedability if it contains a valid ability. example where this causes a bug otherwise. AEquip is considered nested, but contains no ability. - return getCoreAbility(na->ability); - } + if (NestedAbility * na = dynamic_cast (a)) + { + if(na->ability) + //only atempt to return a nestedability if it contains a valid ability. example where this causes a bug otherwise. AEquip is considered nested, but contains no ability. + return getCoreAbility(na->ability); + } if (MenuAbility * ma = dynamic_cast(a)) return getCoreAbility(ma->abilities[0]); @@ -1093,8 +1093,8 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG MTGCardInstance * target = card->target; if (!target) target = card; - //pay and castcard? - if(s.find("castcard(restricted") != string::npos && (s.find("pay(") != string::npos || s.find("pay[[") != string::npos)) + //pay and castcard? + if(s.find("castcard(restricted") != string::npos && (s.find("pay(") != string::npos || s.find("pay[[") != string::npos)) asAlternate = true; //MTG Specific rules //adds the bonus credit system @@ -1826,7 +1826,7 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG found = string::npos; i = -1; - for (size_t j = 0; j < kLordKeywordsCount; ++j) + for (size_t j = 0; j < kLordKeywordsCount; ++j) { size_t found2 = s.find(kLordKeywords[j]); if (found2 != string::npos && ((found == string::npos) || found2 < found)) @@ -2602,16 +2602,16 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG return a; } - //set hand size - vector splitSetHand = parseBetween(s, "sethand:", " ", false); - if (splitSetHand.size()) - { - int hand = atoi(splitSetHand[1].c_str()); - Damageable * t = spell ? spell->getNextDamageableTarget() : NULL; + //set hand size + vector splitSetHand = parseBetween(s, "sethand:", " ", false); + if (splitSetHand.size()) + { + int hand = atoi(splitSetHand[1].c_str()); + Damageable * t = spell ? spell->getNextDamageableTarget() : NULL; MTGAbility * a = NEW AASetHand(observer, id, card, t, hand, NULL, who); - a->oneShot = 1; - return a; - } + a->oneShot = 1; + return a; + } //set life total vector splitLifeset = parseBetween(s, "lifeset:", " ", false); @@ -2723,7 +2723,7 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG } //Cast/Play Restrictions - for (size_t i = 0; i < kMaxCastKeywordsCount; ++i) + for (size_t i = 0; i < kMaxCastKeywordsCount; ++i) { vector splitCast = parseBetween(s, kMaxCastKeywords[i], ")"); if (splitCast.size()) @@ -2939,9 +2939,9 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG { vector becomesParameters = split(splitBecomes[1], ','); string stypes = becomesParameters[0]; - string newPower = ""; + string newPower = ""; string newToughness = ""; - bool ptFound = false; + bool ptFound = false; if(becomesParameters.size() >1) { vector pt = split(becomesParameters[1], '/'); @@ -2952,17 +2952,17 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG ptFound = true; } } - string sabilities = ""; + string sabilities = ""; unsigned int becomesSize = ptFound?2:1; - if(becomesParameters.size() > becomesSize) - { - for(unsigned int i = becomesSize;i < becomesParameters.size();i++) - { - sabilities.append(becomesParameters[i].c_str()); - if(i+1 < becomesParameters.size()) - sabilities.append(","); - } - } + if(becomesParameters.size() > becomesSize) + { + for(unsigned int i = becomesSize;i < becomesParameters.size();i++) + { + sabilities.append(becomesParameters[i].c_str()); + if(i+1 < becomesParameters.size()) + sabilities.append(","); + } + } if (oneShot || forceUEOT || forceForever) return NEW ATransformerInstant(observer, id, card, target, stypes, sabilities,newPower,ptFound,newToughness,ptFound,vector(),false,forceForever,untilYourNextTurn); @@ -3044,14 +3044,14 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG newtoughnessfound = true; newtoughness = splitToughness[1]; } - if(abilities[j].find("newability[") != string::npos) - { - size_t NewSkill = abilities[j].find("newability["); - size_t NewSkillEnd = abilities[j].find_last_of("]"); - string newAbilities = abilities[j].substr(NewSkill + 11,NewSkillEnd - NewSkill - 11); - newAbilitiesList.push_back(newAbilities); - newAbilityFound = true; - } + if(abilities[j].find("newability[") != string::npos) + { + size_t NewSkill = abilities[j].find("newability["); + size_t NewSkillEnd = abilities[j].find_last_of("]"); + string newAbilities = abilities[j].substr(NewSkill + 11,NewSkillEnd - NewSkill - 11); + newAbilitiesList.push_back(newAbilities); + newAbilityFound = true; + } } if (oneShot || forceUEOT || forceForever) @@ -3088,7 +3088,7 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG { return NEW PTInstant(observer, id, card, target, wppt,s,nonstatic); } - else if(s.find("cdaactive") != string::npos) + else if(s.find("cdaactive") != string::npos) { MTGAbility * a = NEW APowerToughnessModifier(observer, id, card, target, wppt,s,true); a->forcedAlive = 1; @@ -3096,7 +3096,7 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG return a; //return NEW APowerToughnessModifier(observer, id, card, target, wppt,s,true); } - else + else return NEW APowerToughnessModifier(observer, id, card, target, wppt,s,nonstatic); } return NEW PTInstant(observer, id, card, target, wppt,s,nonstatic); diff --git a/projects/mtg/src/MTGCardInstance.cpp b/projects/mtg/src/MTGCardInstance.cpp index a56247912..6dfdb9add 100644 --- a/projects/mtg/src/MTGCardInstance.cpp +++ b/projects/mtg/src/MTGCardInstance.cpp @@ -753,7 +753,7 @@ bool MTGCardInstance::StackIsEmptyandSorcerySpeed() controller() == getObserver()->currentPlayer && !getObserver()->isInterrupting) { - return true; + return true; } return false; } @@ -777,10 +777,10 @@ bool MTGCardInstance::isTargetted() } } } - } + } if(cardistargetted) return true; - return false; + return false; } //check targetter? @@ -802,10 +802,10 @@ bool MTGCardInstance::isTargetter() } } } - } + } if(cardistargetter) return true; - return false; + return false; } int MTGCardInstance::canBlock() @@ -927,7 +927,7 @@ ManaCost * MTGCardInstance::computeNewCost(MTGCardInstance * card,ManaCost * old return oldCost; //use forcedalive// //pay zero costs// - //kicker???...// + //kicker???...// //morph cost todo// //trinisphere must be here below// if(card->has(Constants::TRINISPHERE)) diff --git a/projects/mtg/src/MTGDeck.cpp b/projects/mtg/src/MTGDeck.cpp index 738d8289d..0189b2208 100644 --- a/projects/mtg/src/MTGDeck.cpp +++ b/projects/mtg/src/MTGDeck.cpp @@ -281,7 +281,7 @@ int MTGAllCards::processConfLine(string &s, MTGCard *card, CardPrimitive * primi { string value = val; std::transform(value.begin(), value.end(), value.begin(), ::tolower); - cost->setSuspend(ManaCost::parseManaCost(value)); + cost->setSuspend(ManaCost::parseManaCost(value)); primitive->suspendedTime = suspendTime; } diff --git a/projects/mtg/src/MTGDefinitions.cpp b/projects/mtg/src/MTGDefinitions.cpp index 7728bd1d2..f01fbbd14 100644 --- a/projects/mtg/src/MTGDefinitions.cpp +++ b/projects/mtg/src/MTGDefinitions.cpp @@ -14,9 +14,9 @@ const string Constants::kManaRed = "red"; const string Constants::kManaBlack = "black"; const string Constants::kManaWhite = "white"; -int Constants::_r[7] = {75, 20, 20, 200,50,255,128}; -int Constants::_g[7] = {30, 140, 30, 15, 50,255,128}; -int Constants::_b[7] = {20, 0, 140,15, 50,255,128}; +int Constants::_r[7] = {75,20,20,200,50,255,128}; +int Constants::_g[7] = {30,140,30,15,50,255,128}; +int Constants::_b[7] = {20,0,140,15,50,255,128}; const string Constants::kAlternativeKeyword = "alternative"; @@ -184,36 +184,36 @@ int Constants::GetColorStringIndex(string mtgColor) const string Constants::MTGPhaseNames[] = { - "---", - "Untap", - "Upkeep", - "Draw", - "Main phase 1", - "Combat begins", - "Attackers", - "Blockers", - "Combat damage", - "Combat ends", - "Main phase 2", - "End", - "Cleanup", - "---" + "---", + "Untap", + "Upkeep", + "Draw", + "Main phase 1", + "Combat begins", + "Attackers", + "Blockers", + "Combat damage", + "Combat ends", + "Main phase 2", + "End", + "Cleanup", + "---" }; const char* Constants::MTGPhaseCodeNames[] = { - "beginofturn", - "untap", - "upkeep", - "draw", - "firstmain", - "combatbegins", - "attackers", - "blockers", - "combatdamage", - "combatends", - "secondmain", - "end", - "cleanup", - "beforenextturn" + "beginofturn", + "untap", + "upkeep", + "draw", + "firstmain", + "combatbegins", + "attackers", + "blockers", + "combatdamage", + "combatends", + "secondmain", + "end", + "cleanup", + "beforenextturn" }; diff --git a/projects/mtg/src/MTGGameZones.cpp b/projects/mtg/src/MTGGameZones.cpp index 5fe7fcddd..cfa757aa2 100644 --- a/projects/mtg/src/MTGGameZones.cpp +++ b/projects/mtg/src/MTGGameZones.cpp @@ -323,12 +323,12 @@ MTGCardInstance * MTGPlayerCards::putInZone(MTGCardInstance * card, MTGGameZone int doCopy = 1; bool shufflelibrary = card->basicAbilities[(int)Constants::SHUFFLELIBRARYDEATH]; bool inplaytoinplay = false; - bool ripToken = false; - if (g->players[0]->game->battlefield->hasName("Rest in Peace")||g->players[1]->game->battlefield->hasName("Rest in Peace")) + bool ripToken = false; + if (g->players[0]->game->battlefield->hasName("Rest in Peace")||g->players[1]->game->battlefield->hasName("Rest in Peace")) ripToken = true; //Madness or Put in Play... for(int i = 0; i < 2; ++i) - { + { if (card->discarded && (to == g->players[i]->game->graveyard) && (from == g->players[i]->game->hand)) { if(card->basicAbilities[(int)Constants::MADNESS]) @@ -337,7 +337,7 @@ MTGCardInstance * MTGPlayerCards::putInZone(MTGCardInstance * card, MTGGameZone } //Darksteel Colossus, Legacy Weapon ... top priority since we replace destination directly automatically... for(int i = 0; i < 2; ++i) - { + { if ((to == g->players[i]->game->graveyard) && ( card->basicAbilities[(int)Constants::LIBRARYDEATH]|| card->basicAbilities[(int)Constants::SHUFFLELIBRARYDEATH])) @@ -347,13 +347,13 @@ MTGCardInstance * MTGPlayerCards::putInZone(MTGCardInstance * card, MTGGameZone } //Leyline of the Void, Yawgmoth's Agenda... effect... for(int i = 0; i < 2; ++i) - { + { if ((to == g->players[i]->game->graveyard) && ( (g->players[i]->game->battlefield->hasAbility(Constants::MYGCREATUREEXILER) && card->isCreature()) || (g->players[i]->opponent()->game->battlefield->hasAbility(Constants::OPPGCREATUREEXILER) && card->isCreature())|| g->players[i]->game->battlefield->hasAbility(Constants::MYGRAVEEXILER) || g->players[i]->opponent()->game->battlefield->hasAbility(Constants::OPPGRAVEEXILER))) - { + { if ((card->isToken && ripToken)) to = g->players[i]->game->exile; if (!card->isToken) @@ -379,7 +379,7 @@ MTGCardInstance * MTGPlayerCards::putInZone(MTGCardInstance * card, MTGGameZone {//set discarded for madness... if(from == g->players[0]->game->hand || from == g->players[1]->game->hand) copy->discarded = true; - else//turn off discarded if its previous zone is not in hand... + else//turn off discarded if its previous zone is not in hand... copy->discarded = false; } if (options[Options::SFXVOLUME].number > 0) @@ -742,7 +742,7 @@ bool MTGGameZone::hasColor(int value) { for (int i = 0; i < (nb_cards); i++) { - if (cards[i]->getManaCost()->hasColor(value) && cards[i]->getManaCost()->getConvertedCost() > 0) + if (cards[i]->getManaCost()->hasColor(value) && cards[i]->getManaCost()->getConvertedCost() > 0) { return true; } diff --git a/projects/mtg/src/MTGPack.cpp b/projects/mtg/src/MTGPack.cpp index 5e8b53d34..67ed5e4e4 100644 --- a/projects/mtg/src/MTGPack.cpp +++ b/projects/mtg/src/MTGPack.cpp @@ -28,7 +28,7 @@ int MTGPackEntryRandom::addCard(WSrcCards *pool, MTGDeck *to) } int MTGPackEntrySpecific::addCard(WSrcCards *, MTGDeck *to) { - if (!card) + if (!card) return copies; for (int i = 0; i < copies; i++) to->add(card); diff --git a/projects/mtg/src/MTGRules.cpp b/projects/mtg/src/MTGRules.cpp index 88c31a78c..eeb228e53 100644 --- a/projects/mtg/src/MTGRules.cpp +++ b/projects/mtg/src/MTGRules.cpp @@ -58,8 +58,8 @@ int MTGEventBonus::receiveEvent(WEvent * event) //bonus for chain chain casting without tapping for mana or being interupted; //note gaining mana from other sources is still possible. //only spells going to the stack are counted. - if(game->turn <2)//this shouldnt trigger on first turn, chances are they are cheating. - return 0; + if(game->turn <2)//this shouldnt trigger on first turn, chances are they are cheating. + return 0; if (dynamic_cast(event)) { @@ -285,9 +285,9 @@ int MTGPutInPlayRule::isReactingToClick(MTGCardInstance * card, ManaCost *) int cardsinhand = game->players[0]->game->hand->nb_cards; Player * player = game->currentlyActing(); if (!player->game->hand->hasCard(card) && !player->game->graveyard->hasCard(card) && !player->game->exile->hasCard(card)) - return 0; - if ((player->game->graveyard->hasCard(card) && !card->has(Constants::CANPLAYFROMGRAVEYARD)) || (player->game->exile->hasCard(card) && !card->has(Constants::CANPLAYFROMEXILE))) - return 0; + return 0; + if ((player->game->graveyard->hasCard(card) && !card->has(Constants::CANPLAYFROMGRAVEYARD)) || (player->game->exile->hasCard(card) && !card->has(Constants::CANPLAYFROMEXILE))) + return 0; if ((game->turn < 1) && (cardsinhand != 0) && (card->basicAbilities[(int)Constants::LEYLINE]) && game->getCurrentGamePhase() == MTG_PHASE_FIRSTMAIN && game->players[0]->game->graveyard->nb_cards == 0 @@ -478,13 +478,13 @@ int MTGKickerRule::isReactingToClick(MTGCardInstance * card, ManaCost *) return 0; Player * player = game->currentlyActing(); if (!player->game->hand->hasCard(card) && !player->game->graveyard->hasCard(card) && !player->game->exile->hasCard(card)) - return 0; - if ((player->game->graveyard->hasCard(card) && !card->has(Constants::CANPLAYFROMGRAVEYARD)) || (player->game->exile->hasCard(card) && !card->has(Constants::CANPLAYFROMEXILE))) - return 0; + return 0; + if ((player->game->graveyard->hasCard(card) && !card->has(Constants::CANPLAYFROMGRAVEYARD)) || (player->game->exile->hasCard(card) && !card->has(Constants::CANPLAYFROMEXILE))) + return 0; ManaCost * kicker = card->getManaCost()->getKicker(); if(!kicker) { - SAFE_DELETE(kicker); + SAFE_DELETE(kicker); return 0; } ManaCost * playerMana = player->getManaPool(); @@ -627,13 +627,13 @@ PermanentAbility(observer, _id) int MTGAlternativeCostRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana) { - ManaCost * alternateCost = card->getManaCost()->getAlternative(); - if (!game->currentlyActing()->game->hand->hasCard(card) && !game->currentlyActing()->game->graveyard->hasCard(card) && !game->currentlyActing()->game->exile->hasCard(card)) - return 0; - if ((game->currentlyActing()->game->graveyard->hasCard(card) && !card->has(Constants::CANPLAYFROMGRAVEYARD)) || (game->currentlyActing()->game->exile->hasCard(card) && !card->has(Constants::CANPLAYFROMEXILE))) - return 0; if (card->alias == 110000) return 0;//overload has its own rule + ManaCost * alternateCost = card->getManaCost()->getAlternative(); + if (!game->currentlyActing()->game->hand->hasCard(card) && !game->currentlyActing()->game->graveyard->hasCard(card) && !game->currentlyActing()->game->exile->hasCard(card)) + return 0; + if ((game->currentlyActing()->game->graveyard->hasCard(card) && !card->has(Constants::CANPLAYFROMGRAVEYARD)) || (game->currentlyActing()->game->exile->hasCard(card) && !card->has(Constants::CANPLAYFROMEXILE))) + return 0; return isReactingToClick( card, mana, alternateCost ); } @@ -647,7 +647,7 @@ int MTGAlternativeCostRule::isReactingToClick(MTGCardInstance * card, ManaCost * return 0; - if(card->has(Constants::CANPLAYFROMGRAVEYARD)) + if(card->has(Constants::CANPLAYFROMGRAVEYARD)) alternativeName = "Alternate Cast From Graveyard"; else if(card->has(Constants::CANPLAYFROMEXILE)) alternativeName = "Alternate Cast From Exile"; @@ -686,11 +686,11 @@ int MTGAlternativeCostRule::isReactingToClick(MTGCardInstance * card, ManaCost * int MTGAlternativeCostRule::reactToClick(MTGCardInstance * card) { - if ( !isReactingToClick(card)) - return 0; + if ( !isReactingToClick(card)) + return 0; - ManaCost *alternateCost = card->getManaCost()->getAlternative(); - card->paymenttype = MTGAbility::ALTERNATIVE_COST; + ManaCost *alternateCost = card->getManaCost()->getAlternative(); + card->paymenttype = MTGAbility::ALTERNATIVE_COST; return reactToClick(card, alternateCost, ManaCost::MANA_PAID_WITH_ALTERNATIVE); } @@ -703,15 +703,15 @@ int MTGAlternativeCostRule::reactToClick(MTGCardInstance * card, ManaCost *alter if(overload) card->spellTargetType = ""; - else if(card->model->data->spellTargetType.size()) + else if(card->model->data->spellTargetType.size()) card->spellTargetType = card->model->data->spellTargetType; assert(alternateCost); if (alternateCost->isExtraPaymentSet() ) { if (!game->targetListIsSet(card)) - return 0; - } + return 0; + } else { alternateCost->setExtraCostsAction(this, card); @@ -790,9 +790,9 @@ int MTGBuyBackRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana) { Player * player = game->currentlyActing(); if (!player->game->hand->hasCard(card) && !player->game->graveyard->hasCard(card) && !player->game->exile->hasCard(card)) - return 0; - if ((player->game->graveyard->hasCard(card) && !card->has(Constants::CANPLAYFROMGRAVEYARD)) || (player->game->exile->hasCard(card) && !card->has(Constants::CANPLAYFROMEXILE))) - return 0; + return 0; + if ((player->game->graveyard->hasCard(card) && !card->has(Constants::CANPLAYFROMGRAVEYARD)) || (player->game->exile->hasCard(card) && !card->has(Constants::CANPLAYFROMEXILE))) + return 0; if(!allowedToCast(card,player)) return 0; return MTGAlternativeCostRule::isReactingToClick( card, mana, card->getManaCost()->getBuyback() ); @@ -1180,7 +1180,7 @@ int MTGPayZeroRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana) return 0; if ((!card->has(Constants::CANPLAYFROMGRAVEYARD) && player->game->graveyard->hasCard(card))||(!card->has(Constants::CANPLAYFROMEXILE) && player->game->exile->hasCard(card))) return 0; - if(card->has(Constants::CANPLAYFROMGRAVEYARD)) + if(card->has(Constants::CANPLAYFROMGRAVEYARD)) CustomName = "Zero Cast From Graveyard"; else if(card->has(Constants::CANPLAYFROMEXILE)) CustomName = "Zero Cast From Exile"; @@ -1225,6 +1225,8 @@ MTGAlternativeCostRule(observer, _id) int MTGOverloadRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana) { + if (card->alias != 110000) + return 0; Player * player = game->currentlyActing(); ManaCost * cost = NEW ManaCost(card->model->data->getManaCost()->getAlternative()); if(card->getIncreasedManaCost()->getConvertedCost()) @@ -1234,8 +1236,6 @@ int MTGOverloadRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana) if (card->isLand()) return 0; - if (card->alias != 110000) - return 0; if (!player->game->graveyard->hasCard(card) && !player->game->exile->hasCard(card) && !player->game->hand->hasCard(card)) return 0; if ((!card->has(Constants::CANPLAYFROMGRAVEYARD) && player->game->graveyard->hasCard(card))||(!card->has(Constants::CANPLAYFROMEXILE) && player->game->exile->hasCard(card))) @@ -1912,7 +1912,7 @@ MTGStoneHewerRule::MTGStoneHewerRule(GameObserver* observer, int _id, MTGAllCard for (size_t i = 0; i < collection->ids.size(); i++) { MTGCard * card = collection->collection[collection->ids[i]]; - if (card->data->hasSubtype("equipment") && (card->getRarity() != Constants::RARITY_T) && //remove tokens + if (card->data->hasSubtype("equipment") && (card->getRarity() != Constants::RARITY_T) && //remove tokens card->setId != MTGSets::INTERNAL_SET //remove cards that are defined in primitives. Those are workarounds (usually tokens) and should only be used internally ) { @@ -1928,32 +1928,32 @@ MTGStoneHewerRule::MTGStoneHewerRule(GameObserver* observer, int _id, MTGAllCard int MTGStoneHewerRule::receiveEvent(WEvent * event) { - WEventZoneChange * e = (WEventZoneChange *) event; - if (e->to == game->currentlyActing()->game->inPlay && e->card->isCreature()) - { - int eId = genRandomEquipId(e->card->getManaCost()->getConvertedCost()); - MTGCardInstance * card = genEquip(eId); - if(card) - { - game->currentlyActing()->game->temp->addCard(card); + WEventZoneChange * e = (WEventZoneChange *) event; + if (e->to == game->currentlyActing()->game->inPlay && e->card->isCreature()) + { + int eId = genRandomEquipId(e->card->getManaCost()->getConvertedCost()); + MTGCardInstance * card = genEquip(eId); + if(card) + { + game->currentlyActing()->game->temp->addCard(card); Spell * spell = NEW Spell(game, card); - spell->resolve(); - spell->source->isToken = 1; + spell->resolve(); + spell->source->isToken = 1; for (size_t i = 1; i < game->mLayers->actionLayer()->mObjects.size(); i++) - { + { MTGAbility * a = ((MTGAbility *) game->mLayers->actionLayer()->mObjects[i]); - AEquip * eq = dynamic_cast (a); - if (eq && eq->source == spell->source) - { - ((AEquip*)a)->unequip(); - ((AEquip*)a)->equip(e->card); - } - } - SAFE_DELETE(spell); - } - return 1; - } - return 0; + AEquip * eq = dynamic_cast (a); + if (eq && eq->source == spell->source) + { + ((AEquip*)a)->unequip(); + ((AEquip*)a)->equip(e->card); + } + } + SAFE_DELETE(spell); + } + return 1; + } + return 0; } MTGCardInstance * MTGStoneHewerRule::genEquip(int id) @@ -1967,8 +1967,8 @@ MTGCardInstance * MTGStoneHewerRule::genEquip(int id) int MTGStoneHewerRule::genRandomEquipId(int convertedCost) { - if (convertedCost >= 20) - convertedCost = 19; + if (convertedCost >= 20) + convertedCost = 19; int total_cards = 0; int i = (game->getRandomGenerator()->random() % int(convertedCost+1));//+1 becuase we want to generate a random "<=" the coverted. while (!total_cards && i >= 0) @@ -2004,29 +2004,29 @@ PermanentAbility(observer, _id) int MTGHermitRule::receiveEvent(WEvent * event) { - WEventPhaseChange * e = dynamic_cast(event); + WEventPhaseChange * e = dynamic_cast(event); if (e && e->from->id == MTG_PHASE_UNTAP) - { - MTGCardInstance * lcard = NULL; - vectorlands = vector(); - for(int i = 0; i < game->currentPlayer->game->library->nb_cards-1; i++) - { - MTGCardInstance * temp = game->currentPlayer->game->library->cards[i]; - if(temp && temp->isLand()) - lands.push_back(temp); - } - if(lands.size()) + { + MTGCardInstance * lcard = NULL; + vectorlands = vector(); + for(int i = 0; i < game->currentPlayer->game->library->nb_cards-1; i++) + { + MTGCardInstance * temp = game->currentPlayer->game->library->cards[i]; + if(temp && temp->isLand()) + lands.push_back(temp); + } + if(lands.size()) lcard = lands[game->getRandomGenerator()->random() % lands.size()]; - if(lcard) - { - MTGCardInstance * copy = game->currentPlayer->game->putInZone(lcard,game->currentPlayer->game->library, game->currentPlayer->game->temp); + if(lcard) + { + MTGCardInstance * copy = game->currentPlayer->game->putInZone(lcard,game->currentPlayer->game->library, game->currentPlayer->game->temp); Spell * spell = NEW Spell(game, copy); spell->resolve(); delete spell; - } - return 1; - } - return 0; + } + return 1; + } + return 0; } MTGHermitRule * MTGHermitRule::clone() const diff --git a/projects/mtg/src/ManaCost.cpp b/projects/mtg/src/ManaCost.cpp index 31a338161..df9446c67 100644 --- a/projects/mtg/src/ManaCost.cpp +++ b/projects/mtg/src/ManaCost.cpp @@ -94,7 +94,7 @@ ManaCost * ManaCost::parseManaCost(string s, ManaCost * _manaCost, MTGCardInstan } //switch on the first letter. If two costs share their first letter, add an "if" within the switch - std::transform(value.begin(), value.end(), value.begin(), ::tolower); + std::transform(value.begin(), value.end(), value.begin(), ::tolower); switch (value[0]) { case 'x': @@ -695,7 +695,7 @@ ManaCostHybrid * ManaCost::getHybridCost(unsigned int i) ExtraCost * ManaCost::getExtraCost(unsigned int i) { if(extraCosts && extraCosts->costs.size()) - { + { if (extraCosts->costs.size() <= i) return NULL; return extraCosts->costs[i]; @@ -1055,7 +1055,7 @@ ostream& operator<<(ostream& out, ManaCost m) void ManaPool::Empty() { - SAFE_DELETE(extraCosts); + SAFE_DELETE(extraCosts); SAFE_DELETE(kicker); SAFE_DELETE(alternative); SAFE_DELETE(BuyBack); diff --git a/projects/mtg/src/ModRules.cpp b/projects/mtg/src/ModRules.cpp index a39c99bc9..102f35b87 100644 --- a/projects/mtg/src/ModRules.cpp +++ b/projects/mtg/src/ModRules.cpp @@ -301,12 +301,12 @@ ModRulesRenderCardGuiItem::ModRulesRenderCardGuiItem(string name, int posX, int mFormattedData = formattedData; mFilter = filter; mFontSize = fontSize; - mFont = font; + mFont = font; mFontColor = fontColor; mSizeIcon = SizeIcon; - mIconPosX = IconPosX; - mIconPosY = IconPosY; - mFileName = FileName; + mIconPosX = IconPosX; + mIconPosY = IconPosY; + mFileName = FileName; } @@ -318,12 +318,12 @@ void ModRulesCardGui::parse(TiXmlElement* element) string _FormattedText; string _Filter; int _FontSize; - bool _Font; - PIXEL_TYPE _FontColor; - int _SizeIcon; - int _IconPosX; - int _IconPosY; - string _FileName; + bool _Font; + PIXEL_TYPE _FontColor; + int _SizeIcon; + int _IconPosX; + int _IconPosY; + string _FileName; @@ -353,12 +353,12 @@ void ModRulesCardGui::parse(TiXmlElement* element) _FormattedText = ""; _Filter = ""; _FontSize = 0; - _Font = false; + _Font = false; _FontColor = 0; _SizeIcon = 0; - _IconPosX = 0; - _IconPosY = 0 ; - _FileName = ""; + _IconPosX = 0; + _IconPosY = 0 ; + _FileName = ""; TiXmlElement* ItemElement = node->ToElement(); @@ -379,11 +379,11 @@ void ModRulesCardGui::parse(TiXmlElement* element) } ChildNode = ItemElement->FirstChild("font"); - if (ChildNode) { - _Font = true; - _FontSize = atoi(ChildNode->ToElement()->Attribute("size")); - vector argb = split( ChildNode->ToElement()->Attribute("color"), ','); - _FontColor = ARGB( + if (ChildNode) { + _Font = true; + _FontSize = atoi(ChildNode->ToElement()->Attribute("size")); + vector argb = split( ChildNode->ToElement()->Attribute("color"), ','); + _FontColor = ARGB( atoi(argb[0].c_str()), atoi(argb[1].c_str()), atoi(argb[2].c_str()), @@ -392,7 +392,7 @@ void ModRulesCardGui::parse(TiXmlElement* element) } ChildNode = ItemElement->FirstChild("iconposition"); - if (ChildNode) { + if (ChildNode) { _IconPosX = atoi(ChildNode->ToElement()->Attribute("x")); _IconPosY = atoi(ChildNode->ToElement()->Attribute("y")); } @@ -408,7 +408,7 @@ void ModRulesCardGui::parse(TiXmlElement* element) } - + renderbig.push_back(NEW ModRulesRenderCardGuiItem( _Name, _Posx, _Posy, _FormattedText, _Filter,_Font, _FontSize, _FontColor,_SizeIcon,_IconPosX,_IconPosY,_FileName )); } } @@ -423,12 +423,12 @@ void ModRulesCardGui::parse(TiXmlElement* element) _FormattedText = ""; _Filter = ""; _FontSize = 0; - _Font = false; + _Font = false; _FontColor = 0; _SizeIcon = 0; - _IconPosX = 0; - _IconPosY = 0 ; - _FileName = ""; + _IconPosX = 0; + _IconPosY = 0 ; + _FileName = ""; TiXmlElement* ItemElement = node->ToElement(); @@ -449,11 +449,11 @@ void ModRulesCardGui::parse(TiXmlElement* element) } ChildNode = ItemElement->FirstChild("font"); - if (ChildNode) { - _Font = true; - _FontSize = atoi(ChildNode->ToElement()->Attribute("size")); - vector argb = split( ChildNode->ToElement()->Attribute("color"), ','); - _FontColor = ARGB( + if (ChildNode) { + _Font = true; + _FontSize = atoi(ChildNode->ToElement()->Attribute("size")); + vector argb = split( ChildNode->ToElement()->Attribute("color"), ','); + _FontColor = ARGB( atoi(argb[0].c_str()), atoi(argb[1].c_str()), atoi(argb[2].c_str()), @@ -462,7 +462,7 @@ void ModRulesCardGui::parse(TiXmlElement* element) } ChildNode = ItemElement->FirstChild("iconposition"); - if (ChildNode) { + if (ChildNode) { _IconPosX = atoi(ChildNode->ToElement()->Attribute("x")); _IconPosY = atoi(ChildNode->ToElement()->Attribute("y")); } @@ -478,7 +478,7 @@ void ModRulesCardGui::parse(TiXmlElement* element) } - + rendertinycrop.push_back(NEW ModRulesRenderCardGuiItem( _Name, _Posx, _Posy, _FormattedText, _Filter,_Font, _FontSize, _FontColor,_SizeIcon,_IconPosX,_IconPosY,_FileName )); } } diff --git a/projects/mtg/src/Player.cpp b/projects/mtg/src/Player.cpp index fe5c07931..8c4b7ca30 100644 --- a/projects/mtg/src/Player.cpp +++ b/projects/mtg/src/Player.cpp @@ -266,7 +266,7 @@ bool Player::DeadLifeState(bool check) if (cantlosers < 1) { if(!check) - { + { ActionStack * stack = getObserver()->mLayers->stackLayer(); for (int i = stack->mObjects.size() - 1; i >= 0; i--) { @@ -320,7 +320,7 @@ bool Player::parseLine(const string& s) } else if (areaS.compare("mode") == 0) { - this->playMode = (Player::Mode)atoi(s.substr(limiter + 1).c_str()); + this->playMode = (Player::Mode)atoi(s.substr(limiter + 1).c_str()); return true; } else if (areaS.compare("avatar") == 0) @@ -406,12 +406,12 @@ ostream& operator<<(ostream& out, const Player& p) { out << "mode=" << p.playMode << endl; out << *(Damageable*)&p; - if(p.manaPool) - { - string manapoolstring = p.manaPool->toString(); - if(manapoolstring != "") - out << "manapool=" << manapoolstring << endl; - } + if(p.manaPool) + { + string manapoolstring = p.manaPool->toString(); + if(manapoolstring != "") + out << "manapool=" << manapoolstring << endl; + } if(p.mAvatarName != "") out << "avatar=" << p.mAvatarName << endl; if(p.phaseRing != "") diff --git a/projects/mtg/src/Rules.cpp b/projects/mtg/src/Rules.cpp index e5f095454..80bf52ab2 100644 --- a/projects/mtg/src/Rules.cpp +++ b/projects/mtg/src/Rules.cpp @@ -18,9 +18,9 @@ vector Rules::RulesList = vector(); //Sorting by displayName struct RulesMenuCmp{ - bool operator()(const Rules * a,const Rules * b) const{ + bool operator()(const Rules * a,const Rules * b) const{ return a->displayName < b->displayName; - } + } } RulesMenuCmp_; Rules * Rules::getRulesByFilename(string _filename) @@ -391,12 +391,12 @@ void Rules::initGame(GameObserver *g, bool currentPlayerSet) if(OptionWhosFirst::WHO_O == options[Options::FIRSTPLAYER].number) initState.player = 1; } - if(!currentPlayerSet) - { - g->currentPlayerId = initState.player; - } - g->currentPlayer = g->players[g->currentPlayerId]; - g->currentActionPlayer = g->currentPlayer; + if(!currentPlayerSet) + { + g->currentPlayerId = initState.player; + } + g->currentPlayer = g->players[g->currentPlayerId]; + g->currentActionPlayer = g->currentPlayer; g->phaseRing->goToPhase(0, g->currentPlayer, false); g->phaseRing->goToPhase(initState.phase, g->currentPlayer); g->setCurrentGamePhase(initState.phase); @@ -623,7 +623,7 @@ GameType Rules::strToGameMode(string s) if (s.compare("random1") == 0) return GAME_TYPE_RANDOM1; if (s.compare("random2") == 0) return GAME_TYPE_RANDOM2; if (s.compare("story") == 0) return GAME_TYPE_STORY; - if (s.compare("stonehewer") == 0) return GAME_TYPE_STONEHEWER; - if (s.compare("hermit") == 0) return GAME_TYPE_HERMIT; + if (s.compare("stonehewer") == 0) return GAME_TYPE_STONEHEWER; + if (s.compare("hermit") == 0) return GAME_TYPE_HERMIT; return GAME_TYPE_CLASSIC; } diff --git a/projects/mtg/src/SimpleButton.cpp b/projects/mtg/src/SimpleButton.cpp index 9fabd7eac..3e4bdd026 100644 --- a/projects/mtg/src/SimpleButton.cpp +++ b/projects/mtg/src/SimpleButton.cpp @@ -42,7 +42,7 @@ JGuiObject(id), mX(x), mY(y), parent(_parent), mFontId(fontId) mXOffset = mX; - if (hasFocus) + if (hasFocus) { setIsSelectionValid(true); Entering(); diff --git a/projects/mtg/src/SimpleMenu.cpp b/projects/mtg/src/SimpleMenu.cpp index 8fb514185..eef34a2f1 100644 --- a/projects/mtg/src/SimpleMenu.cpp +++ b/projects/mtg/src/SimpleMenu.cpp @@ -144,7 +144,7 @@ void SimpleMenu::Render() float scaleFactor = titleFont->GetScale(); titleFont->SetScale(SCALE_NORMAL); if ((!title.empty()) && (mWidth < titleFont->GetStringWidth(title.c_str()))) - mWidth = titleFont->GetStringWidth(title.c_str()); + mWidth = titleFont->GetStringWidth(title.c_str()); titleFont->SetScale(scaleFactor); mWidth += 2 * SimpleMenuConst::kHorizontalMargin; diff --git a/projects/mtg/src/SimplePopup.cpp b/projects/mtg/src/SimplePopup.cpp index e8cccf5e4..0640dce45 100644 --- a/projects/mtg/src/SimplePopup.cpp +++ b/projects/mtg/src/SimplePopup.cpp @@ -19,7 +19,7 @@ SimplePopup::SimplePopup(int id, JGuiListener* listener, const int fontId, const { mX = 19; mY = 66; - mWidth = 180.0f; + mWidth = 180.0f; mTitle = _title; mMaxLines = 12; @@ -41,11 +41,11 @@ void SimplePopup::Render() const float textHeight = mTextFont->GetHeight() * mMaxLines; r->FillRoundRect(mX, mY + 2, mWidth + 11, textHeight - 12, 2.0f, ARGB( 255, 0, 0, 0 ) ); - // currently causes a crash on the PSP when drawing the corners. - // TODO: clean up the image ot make it loook cleaner. Find solution to load gfx to not crash PSP + // currently causes a crash on the PSP when drawing the corners. + // TODO: clean up the image ot make it loook cleaner. Find solution to load gfx to not crash PSP #if 0 r->DrawRoundRect(mX, mY + 2, mWidth + 11, textHeight - 12, 2.0f, ARGB( 255, 125, 255, 0) ); - drawBoundingBox( mX-3, mY, mWidth + 3, textHeight ); + drawBoundingBox( mX-3, mY, mWidth + 3, textHeight ); #endif mTextFont->DrawString(detailedInformation.c_str(), mX + 9 , mY + 10); @@ -58,22 +58,22 @@ void SimplePopup::drawBoundingBox( float x, float y, float width, float height ) //draw the corners string topCornerImageName = "top_corner.png"; string bottomCornerImageName = "bottom_corner.png"; - string verticalBarImageName = "vert_bar.png"; + string verticalBarImageName = "vert_bar.png"; string horizontalBarImageName = "top_bar.png"; - const float boxWidth = ( width + 15 ) / 3.0f; - const float boxHeight = ( height + 15 ) / 3.0f; + const float boxWidth = ( width + 15 ) / 3.0f; + const float boxHeight = ( height + 15 ) / 3.0f; - drawHorzPole( horizontalBarImageName, false, false, x, y, boxWidth ); - drawHorzPole( horizontalBarImageName, false, true, x, y + height, boxWidth ); - - drawVertPole( verticalBarImageName, false, false, x, y, boxHeight ); - drawVertPole( verticalBarImageName, true, false, x + width, y, boxHeight ); + drawHorzPole( horizontalBarImageName, false, false, x, y, boxWidth ); + drawHorzPole( horizontalBarImageName, false, true, x, y + height, boxWidth ); + + drawVertPole( verticalBarImageName, false, false, x, y, boxHeight ); + drawVertPole( verticalBarImageName, true, false, x + width, y, boxHeight ); - drawCorner( topCornerImageName, false, false, x, y ); - drawCorner( topCornerImageName, true, false, x + width, y ); - drawCorner( bottomCornerImageName, false, false, x, y + height ); - drawCorner( bottomCornerImageName, true, false, x + width, y + height ); + drawCorner( topCornerImageName, false, false, x, y ); + drawCorner( topCornerImageName, true, false, x + width, y ); + drawCorner( bottomCornerImageName, false, false, x, y + height ); + drawCorner( bottomCornerImageName, true, false, x + width, y + height ); } void SimplePopup::Update(DeckMetaData* selectedDeck) @@ -130,52 +130,52 @@ void SimplePopup::Update(float) // drawing routines void SimplePopup::drawCorner(string imageName, bool flipX, bool flipY, float x, float y) { - LOG(" Drawing a Corner! "); + LOG(" Drawing a Corner! "); JRenderer* r = JRenderer::GetInstance(); JQuadPtr horizontalBarImage = WResourceManager::Instance()->RetrieveTempQuad( imageName, TEXTURE_SUB_5551); - horizontalBarImage->SetHFlip(flipX); - horizontalBarImage->SetVFlip(flipY); + horizontalBarImage->SetHFlip(flipX); + horizontalBarImage->SetVFlip(flipY); - r->RenderQuad(horizontalBarImage.get(), x, y); - LOG(" Done Drawing a Corner! "); + r->RenderQuad(horizontalBarImage.get(), x, y); + LOG(" Done Drawing a Corner! "); } void SimplePopup::drawHorzPole(string imageName, bool flipX = false, bool flipY = false, float x = 0, float y = 0, float width = SCREEN_WIDTH_F) { - LOG(" Drawing a horizontal border! "); + LOG(" Drawing a horizontal border! "); JRenderer* r = JRenderer::GetInstance(); JQuadPtr horizontalBarImage = WResourceManager::Instance()->RetrieveTempQuad( imageName, TEXTURE_SUB_5551); - if ( horizontalBarImage != NULL ) - { - horizontalBarImage->SetHFlip(flipX); - horizontalBarImage->SetVFlip(flipY); + if ( horizontalBarImage != NULL ) + { + horizontalBarImage->SetHFlip(flipX); + horizontalBarImage->SetVFlip(flipY); - r->RenderQuad(horizontalBarImage.get(), x, y, 0, width); - } - else - { - LOG ( "ERROR: Error trying to render horizontal edge! "); - } - LOG(" Done Drawing a horizontal border! "); + r->RenderQuad(horizontalBarImage.get(), x, y, 0, width); + } + else + { + LOG ( "ERROR: Error trying to render horizontal edge! "); + } + LOG(" Done Drawing a horizontal border! "); } void SimplePopup::drawVertPole(string imageName, bool flipX = false, bool flipY = false, float x = 0, float y = 0, float height = SCREEN_HEIGHT_F) { - LOG(" Drawing a Vertical border! "); + LOG(" Drawing a Vertical border! "); JRenderer* r = JRenderer::GetInstance(); JQuadPtr verticalBarImage = WResourceManager::Instance()->RetrieveTempQuad( imageName, TEXTURE_SUB_5551); - if ( verticalBarImage != NULL ) - { - verticalBarImage->SetHFlip(flipX); - verticalBarImage->SetVFlip(flipY); + if ( verticalBarImage != NULL ) + { + verticalBarImage->SetHFlip(flipX); + verticalBarImage->SetVFlip(flipY); - r->RenderQuad(verticalBarImage.get(), x, y, 0, 1.0f, height); - } - else - { - LOG ( "ERROR: Error trying to render vertical edge! "); - } - LOG(" DONE Drawing a horizontal border! "); + r->RenderQuad(verticalBarImage.get(), x, y, 0, 1.0f, height); + } + else + { + LOG ( "ERROR: Error trying to render vertical edge! "); + } + LOG(" DONE Drawing a horizontal border! "); } diff --git a/projects/mtg/src/TargetChooser.cpp b/projects/mtg/src/TargetChooser.cpp index 0b361ef2a..687834fdf 100644 --- a/projects/mtg/src/TargetChooser.cpp +++ b/projects/mtg/src/TargetChooser.cpp @@ -1094,13 +1094,13 @@ bool TypeTargetChooser::canTarget(Targetable * target,bool withoutProtections) return true; } - if(card->getLCName().size()) - { + if(card->getLCName().size()) + { if (MTGAllCards::findType(card->getLCName()) == types[i]) return true; if (MTGAllCards::findType(card->getName()) == types[i]) return true; - } + } } return false; } diff --git a/projects/mtg/src/TestSuiteAI.cpp b/projects/mtg/src/TestSuiteAI.cpp index 35bb7e60f..0a3df4796 100644 --- a/projects/mtg/src/TestSuiteAI.cpp +++ b/projects/mtg/src/TestSuiteAI.cpp @@ -347,7 +347,7 @@ void TestSuiteGame::assertGame() int error = 0; bool wasAI = false; - if (observer->getCurrentGamePhase() != endState.phase) + if (observer->getCurrentGamePhase() != endState.phase) { sprintf(result, "==phase problem. Expected [ %s ](%i), got [ %s ](%i)==
", Constants::MTGPhaseNames[endState.phase].c_str(),endState.phase, @@ -577,7 +577,7 @@ int TestSuite::loadNext() #elif defined(IOS) thread_count = 6; #else - thread_count = 4; + thread_count = 4; #endif for(size_t i = 0; i < (thread_count-1); i++) mWorkerThread.push_back(new boost::thread(ThreadProc, this)); diff --git a/projects/mtg/src/TextScroller.cpp b/projects/mtg/src/TextScroller.cpp index 17a984b27..1283f10a3 100644 --- a/projects/mtg/src/TextScroller.cpp +++ b/projects/mtg/src/TextScroller.cpp @@ -32,7 +32,7 @@ void TextScroller::setRandom(int mode) void TextScroller::Add(string text) { if (!strings.size()) - mText = text; + mText = text; strings.push_back(text); } @@ -67,21 +67,21 @@ void TextScroller::Update(float dt) void TextScroller::Render() { WFont * mFont = WResourceManager::Instance()->GetWFont(fontId); - mFont->DrawString(mText.c_str(), mX, mY, JGETEXT_LEFT, start, mWidth); + mFont->DrawString(mText.c_str(), mX, mY, JGETEXT_LEFT, start, mWidth); } ostream& TextScroller::toString(ostream& out) const { return out << "TextScroller ::: mText : " << mText - << " ; tempText : " << tempText - << " ; mWidth : " << mWidth + << " ; tempText : " << tempText + << " ; mWidth : " << mWidth << " ; mSpeed : " << mScrollSpeed - << " ; mX,mY : " << mX << "," << mY - << " ; start : " << start - << " ; timer : " << timer - << " ; strings : ?" - << " ; currentId : " << currentId - << " ; mRandom : " << mRandom; + << " ; mX,mY : " << mX << "," << mY + << " ; start : " << start + << " ; timer : " << timer + << " ; strings : ?" + << " ; currentId : " << currentId + << " ; mRandom : " << mRandom; } @@ -93,28 +93,28 @@ ostream& TextScroller::toString(ostream& out) const VerticalTextScroller::VerticalTextScroller(int fontId, float x, float y, float width, float height, float scrollSpeed, size_t numItemsShown) : TextScroller( fontId, x, y, width, scrollSpeed) { - mHeight = height; - mNbItemsShown = numItemsShown; - mMarginX = 0; - timer=0; - WFont *mFont = WResourceManager::Instance()->GetWFont(fontId); - mOriginalY = mY; - mMarginY = mY - mFont->GetHeight(); - Add("\n"); // initialize the scroller with a blank line + mHeight = height; + mNbItemsShown = numItemsShown; + mMarginX = 0; + timer=0; + WFont *mFont = WResourceManager::Instance()->GetWFont(fontId); + mOriginalY = mY; + mMarginY = mY - mFont->GetHeight(); + Add("\n"); // initialize the scroller with a blank line } void VerticalTextScroller::Add( string text ) { - strings.push_back( text ); - string wrappedText = wordWrap(text, mWidth, fontId); - mText.append(wrappedText); + strings.push_back( text ); + string wrappedText = wordWrap(text, mWidth, fontId); + mText.append(wrappedText); } /* - Updates happen everytime the top line disappears from view. - The top line is then moved to the end of the file and the scrolling resumes where it left off + Updates happen everytime the top line disappears from view. + The top line is then moved to the end of the file and the scrolling resumes where it left off */ void VerticalTextScroller::Update(float dt) @@ -145,5 +145,5 @@ void VerticalTextScroller::Update(float dt) void VerticalTextScroller::Render() { WFont * mFont = WResourceManager::Instance()->GetWFont(fontId); - mFont->DrawString(mText.c_str(), mX, mY); + mFont->DrawString(mText.c_str(), mX, mY); } diff --git a/projects/mtg/src/WCachedResource.cpp b/projects/mtg/src/WCachedResource.cpp index 849d5a119..45723f8d7 100644 --- a/projects/mtg/src/WCachedResource.cpp +++ b/projects/mtg/src/WCachedResource.cpp @@ -82,7 +82,7 @@ WCachedTexture::WCachedTexture() WCachedTexture::~WCachedTexture() { if (texture) - SAFE_DELETE(texture); + SAFE_DELETE(texture); } JTexture * WCachedTexture::Actual() @@ -113,27 +113,27 @@ JQuadPtr WCachedTexture::GetQuad(float offX, float offY, float width, float heig resource = kPlaceholderID; } - std::map::iterator iter = mTrackedQuads.find(resource); - if (iter != mTrackedQuads.end()) - return iter->second; + std::map::iterator iter = mTrackedQuads.find(resource); + if (iter != mTrackedQuads.end()) + return iter->second; - JQuadPtr quad(NEW JQuad(texture, offX, offY, width, height)); + JQuadPtr quad(NEW JQuad(texture, offX, offY, width, height)); //Update JQ's values to what we called this with. quad->SetTextureRect(offX, offY, width, height); - mTrackedQuads.insert(std::pair(resource, quad)); + mTrackedQuads.insert(std::pair(resource, quad)); return quad; } JQuadPtr WCachedTexture::GetQuad(const string& resname) { - JQuadPtr result; - std::map::iterator iter = mTrackedQuads.find(resname); - if (iter != mTrackedQuads.end()) - result = iter->second; + JQuadPtr result; + std::map::iterator iter = mTrackedQuads.find(resname); + if (iter != mTrackedQuads.end()) + result = iter->second; - return result; + return result; } JQuadPtr WCachedTexture::GetCard(float offX, float offY, float width, float height, const string& resname) @@ -192,7 +192,7 @@ bool WCachedTexture::Attempt(const string& filename, int submode, int & error) string realname = filename; //Form correct filename. - if (submode & TEXTURE_SUB_CARD) + if (submode & TEXTURE_SUB_CARD) { if (submode & TEXTURE_SUB_THUMB) { diff --git a/projects/mtg/src/WDataSrc.cpp b/projects/mtg/src/WDataSrc.cpp index 7b11e6d49..a29e13f34 100644 --- a/projects/mtg/src/WDataSrc.cpp +++ b/projects/mtg/src/WDataSrc.cpp @@ -56,13 +56,13 @@ WSrcCards::WSrcCards(float delay) JQuadPtr WSrcCards::getImage(int offset) { - if (!WResourceManager::Instance()->IsThreaded()) - { + if (!WResourceManager::Instance()->IsThreaded()) + { if (mDelay && mLastInput < mDelay) { return WResourceManager::Instance()->RetrieveCard(getCard(offset), RETRIEVE_EXISTING); } - } + } return WResourceManager::Instance()->RetrieveCard(getCard(offset)); } diff --git a/projects/mtg/src/WFont.cpp b/projects/mtg/src/WFont.cpp index 12ea2cd24..1de0133bd 100644 --- a/projects/mtg/src/WFont.cpp +++ b/projects/mtg/src/WFont.cpp @@ -359,7 +359,7 @@ int WFBFont::PreCacheChar(const u8 *ch) #else x = (int)mSprites[index]->mX; y = (int)mSprites[index]->mY; - mTexture->UpdateBits(x, y, mFontSize, mFontSize, mCharBuffer); + mTexture->UpdateBits(x, y, mFontSize, mFontSize, mCharBuffer); #endif return index; } @@ -758,7 +758,7 @@ int WGBKFont::PreCacheChar(const u8 *ch) #else x = (int)mSprites[index]->mX; y = (int)mSprites[index]->mY; - mTexture->UpdateBits(x, y, mFontSize, mFontSize, mCharBuffer); + mTexture->UpdateBits(x, y, mFontSize, mFontSize, mCharBuffer); #endif return index; } diff --git a/projects/mtg/src/WResourceManager.cpp b/projects/mtg/src/WResourceManager.cpp index bfd4570df..6f24c030b 100644 --- a/projects/mtg/src/WResourceManager.cpp +++ b/projects/mtg/src/WResourceManager.cpp @@ -37,18 +37,18 @@ WResourceManager* WResourceManager::sInstance = NULL; WResourceManager* WResourceManager::Instance() { - if (sInstance == NULL) - { - sInstance = NEW ResourceManagerImpl; - } + if (sInstance == NULL) + { + sInstance = NEW ResourceManagerImpl; + } - return sInstance; + return sInstance; } void WResourceManager::Terminate() { - if (sInstance) - SAFE_DELETE(sInstance); + if (sInstance) + SAFE_DELETE(sInstance); } @@ -1040,12 +1040,12 @@ cacheItem* WCache::AttemptNew(const string& filename, in SAFE_DELETE(item); return NULL; } - else + else { DebugTrace("AttemptNew failed to load (not a 404 error). Deleting cache item " << ToHex(item)); SAFE_DELETE(item); mError = CACHE_ERROR_BAD; - return NULL; + return NULL; } } diff --git a/projects/mtg/src/utils.cpp b/projects/mtg/src/utils.cpp index ce846d21c..544fb35ff 100644 --- a/projects/mtg/src/utils.cpp +++ b/projects/mtg/src/utils.cpp @@ -328,13 +328,13 @@ std::string wordWrap(const std::string& sentence, float width, int fontId) string currentSentence = sentence.substr(breakIdx, idx - breakIdx); float stringLength = mFont->GetStringWidth( currentSentence.c_str() ); if (stringLength >= width) - { + { if ( stringLength > width ) { while ( sentence[idx-1] != ' ' ) idx--; } - retVal[idx-1] = '\n'; + retVal[idx-1] = '\n'; breakIdx = idx; numLines++; } @@ -344,12 +344,12 @@ std::string wordWrap(const std::string& sentence, float width, int fontId) string currentSentence = sentence.substr(breakIdx, idx - breakIdx); float stringLength = mFont->GetStringWidth( currentSentence.c_str() ); if (stringLength >= width) - { + { if ( stringLength > width ) { while ( sentence[idx-1] != ' ' ) idx--; - retVal[idx-1] = '\n'; + retVal[idx-1] = '\n'; } numLines++; } From cccc21c035e1f2e79feb98264d7f3fd5d5945041 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Fri, 13 Nov 2015 05:45:17 +0800 Subject: [PATCH 249/249] changed alias --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 94 ++++++++++---------- projects/mtg/include/MTGRules.h | 10 +-- projects/mtg/src/AIPlayerBaka.cpp | 16 +--- projects/mtg/src/CardGui.cpp | 8 +- projects/mtg/src/MTGAbility.cpp | 2 +- projects/mtg/src/MTGGameZones.cpp | 2 +- projects/mtg/src/MTGRules.cpp | 46 +++++----- 7 files changed, 83 insertions(+), 95 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 3dc75140d..5b042f5fc 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -10934,7 +10934,7 @@ toughness=1 [/card] [card] name=Blustersquall -alias=110000 +alias=11000 other={3}{U} name(Overload) target=creature|opponentbattlefield auto=overload tap all(creature|opponentbattlefield) @@ -11599,7 +11599,7 @@ toughness=2 [/card] [card] name=Boneyard Wurm -alias=001100 +alias=1111 anyzone=type:creature:mygraveyard/type:creature:mygraveyard cdaactive text=Boneyard Wurm's power and toughness are each equal to the number of creature cards in your graveyard. mana={1}{G} @@ -14117,7 +14117,7 @@ type=Sorcery [/card] [card] name=Cantivore -alias=001100 +alias=1111 abilities=vigilance anyzone=type:enchantment:graveyard/type:enchantment:graveyard cdaactive text=Vigilance -- Cantivore's power and toughness are each equal to the number of enchantment cards in all graveyards. @@ -16266,7 +16266,7 @@ type=Sorcery [/card] [card] name=Chemister's Trick -alias=110000 +alias=11000 other={3}{U}{R} name(Overload) target=creature|opponentbattlefield auto=paidmana -2/0 @@ -16564,7 +16564,7 @@ toughness=2 [/card] [card] name=Cho-Manno's Blessing -alias=0000 +alias=1000 abilities=auraward target=creature abilities=flash @@ -18099,7 +18099,7 @@ type=Instant [/card] [card] name=Cognivore -alias=001100 +alias=1111 abilities=flying anyzone=type:instant:graveyard/type:instant:graveyard cdaactive text=Flying -- Cognivore's power and toughness are each equal to the number of instant cards in all graveyards. @@ -18159,7 +18159,7 @@ type=Artifact [/card] [card] name=Coldsteel Heart -alias=0000 +alias=1000 auto=tap auto=chooseacolor {T}:add{chosencolor} chooseend text=Coldsteel Heart enters the battlefield tapped. -- As Coldsteel Heart enters the battlefield, choose a color. -- {T}: Add one mana of the chosen color to your mana pool. @@ -19399,7 +19399,7 @@ type=Instant [/card] [card] name=Counterflux -alias=110000 +alias=11000 other={1}{U}{U}{R} name(Overload) abilities=nofizzle target=*|opponentstack @@ -21069,7 +21069,7 @@ subtype=Aura Curse [/card] [card] name=Curse of Wizardry -alias=0000 +alias=1000 auto=chooseacolor transforms((,newability[@movedto(*[chosencolor]|mystack):life:-1 controller],newability[@movedto(*[chosencolor]|opponentstack):life:-1 opponent])) chooseend text=As Curse of Wizardry enters the battlefield, choose a color. -- Whenever a player casts a spell of the chosen color, that player loses 1 life. mana={2}{B}{B} @@ -21207,7 +21207,7 @@ type=Instant [/card] [card] name=Cyclonic Rift -alias=110000 +alias=11000 other={6}{U} name(Overload) target=*[-land]|opponentbattlefield auto=overload moveto(ownerhand) all(*[-land]|opponentbattlefield) @@ -24429,7 +24429,7 @@ text=Destroy target artifact with converted mana cost X. It can't be regenerated [/card] [card] name=Detritivore -alias=001100 +alias=1111 anyzone=type:land[-basic]:opponentgraveyard/type:land[-basic]:opponentgraveyard cdaactive autoexile=@counterremoved(0/0,1,Time) from(sourcecard) suspended:destroy target(land[-basic]) suspend(0)={X}{3}{R} @@ -25994,7 +25994,7 @@ type=Instant [/card] [card] name=Downsize -alias=110000 +alias=11000 other={2}{U} name(Overload) target=creature|opponentbattlefield auto=overload -4/0 all(creature|opponentbattlefield) @@ -28284,7 +28284,7 @@ subtype=Aura [/card] [card] name=Dynacharge -alias=110000 +alias=11000 other={2}{R} name(Overload) target=creature|mybattlefield auto=paidmana 2/0 @@ -29044,7 +29044,7 @@ toughness=1 [/card] [card] name=Electrickery -alias=110000 +alias=11000 other={1}{R} name(Overload) target=creature|opponentbattlefield auto=paidmana damage:1 @@ -35188,7 +35188,7 @@ toughness=2 [/card] [card] name=Flickering Ward -alias=0000 +alias=1000 abilities=auraward target=creature auto=chooseacolor teach(creature) protection from(*[chosencolor]) chooseend @@ -35267,7 +35267,7 @@ toughness=2 [/card] [card] name=Floating Shield -alias=0000 +alias=1000 abilities=auraward target=creature auto=chooseacolor teach(creature) protection from(*[chosencolor]) chooseend @@ -43662,7 +43662,7 @@ toughness=3 [/card] [card] name=Hall of Triumph -alias=0000 +alias=1000 auto=activatechooseacolor transforms((,newability[lord(creature[chosencolor]|mybattlefield) 1/1])) forever activatechooseend text=As Hall of Triumph enters the battlefield, choose a color. -- Creatures you control of the chosen color get +1/+1. mana={3} @@ -49496,7 +49496,7 @@ type=Sorcery [/card] [card] name=Iona, Shield of Emeria -alias=0000 +alias=1000 abilities=flying auto=chooseacolor maxCast(*[chosencolor])0 opponent chooseend text=Flying -- As Iona, Shield of Emeria enters the battlefield, choose a color. -- Your opponents can't cast spells of the chosen color. @@ -50633,7 +50633,7 @@ toughness=3 [/card] [card] name=Jihad -alias=0000 +alias=1000 auto=chooseacolor transforms((,newability[aslongas(*[chosencolor]|opponentbattlefield) lord(creature[white]|mybattlefield) 2/1],newability[aslongas(*[chosencolor]|opponentbattlefield) sacrifice <1])) chooseend text=As Jihad enters the battlefield, choose a color and an opponent. -- White creatures get +2/+1 as long as the chosen player controls a nontoken permanent of the chosen color. -- When the chosen player controls no nontoken permanents of the chosen color, sacrifice Jihad. mana={W}{W}{W} @@ -56208,7 +56208,7 @@ toughness=5 [/card] [card] name=Lhurgoyf -alias=001100 +alias=1111 anyzone=type:creature:graveyard/plusonetype:creature:graveyard cdaactive text=Lhurgoyf's power is equal to the number of creature cards in all graveyards and its toughness is equal to that number plus 1. mana={2}{G}{G} @@ -57589,7 +57589,7 @@ toughness=2 [/card] [card] name=Lord of Extinction -alias=001100 +alias=1111 anyzone=type:*:graveyard/type:*:graveyard cdaactive text=Lord of Extinction's power and toughness are each equal to the number of cards in all graveyards. mana={3}{B}{G} @@ -58325,7 +58325,7 @@ type=Instant [/card] [card] name=Lurebound Scarecrow -alias=0000 +alias=1000 auto=chooseacolor aslongas(*[chosencolor]|myBattlefield) sacrifice <1 chooseend text=As Lurebound Scarecrow enters the battlefield, choose a color. -- When you control no permanents of the chosen color, sacrifice Lurebound Scarecrow. mana={3} @@ -58954,7 +58954,7 @@ toughness=6 [/card] [card] name=Magnivore -alias=001100 +alias=1111 abilities=haste anyzone=type:sorcery:graveyard/type:sorcery:graveyard cdaactive text=Haste (This creature can attack the turn it comes under your control.) -- Magnivore's power and toughness are each equal to the number of sorcery cards in all graveyards. @@ -63482,7 +63482,7 @@ toughness=4 [/card] [card] name=Mizzium Mortars -alias=110000 +alias=11000 other={3}{R}{R}{R} name(Overload) target=creature|opponentbattlefield auto=paidmana damage:4 @@ -63493,7 +63493,7 @@ type=Sorcery [/card] [card] name=Mizzium Skin -alias=110000 +alias=11000 other={1}{U} name(Overload) target=creature|mybattlefield auto=paidmana 0/1 @@ -64747,7 +64747,7 @@ toughness=2 [/card] [card] name=Mortivore -alias=001100 +alias=1111 auto={B}:regenerate anyzone=type:creature:graveyard/type:creature:graveyard cdaactive text=Mortivore's power and toughness are each equal to the number of creature cards in all graveyards. -- {B}: Regenerate Mortivore. (The next time this creature would be destroyed this turn, it isn't. Instead tap it, remove all damage from it, and remove it from combat.) @@ -70982,7 +70982,7 @@ subtype=Equipment [/card] [card] name=Paradise Plume -alias=0000 +alias=1000 auto=chooseacolor transforms((,newability[{T}:add{chosencolor}],newability[@movedto(*[chosencolor]|stack):life:1 controller])) forever chooseend text=As Paradise Plume enters the battlefield, choose a color. -- Whenever a player casts a spell of the chosen color, you may gain 1 life. -- {T}: Add one mana of the chosen color to your mana pool. mana={4} @@ -71774,7 +71774,7 @@ type=Artifact [/card] [card] name=Pentarch Paladin -alias=0000 +alias=1000 abilities=flanking auto=chooseacolor {W}{W}{T}:destroy target(*[chosencolor]) chooseend text=Flanking (Whenever a creature without flanking blocks this creature, the blocking creature gets -1/-1 until end of turn.) -- As Pentarch Paladin enters the battlefield, choose a color. -- {W}{W}, {T}: Destroy target permanent of the chosen color. @@ -71786,7 +71786,7 @@ toughness=3 [/card] [card] name=Pentarch Ward -alias=0000 +alias=1000 abilities=auraward target=creature auto=chooseacolor teach(creature) protection from(*[chosencolor]) chooseend @@ -74923,7 +74923,7 @@ toughness=4 [/card] [card] name=Prism Ring -alias=0000 +alias=1000 auto=activatechooseacolor transforms((,newability[@movedto(*[chosencolor]|mystack):life:1 controller])) forever activatechooseend text=As Prism Ring enters the battlefield, choose a color. -- Whenever you cast a spell of the chosen color, you gain 1 life. mana={1} @@ -75394,7 +75394,7 @@ toughness=2 [/card] [card] name=Psychic Allergy -alias=0000 +alias=1000 auto=upcost[{S(island|mybattlefield)}{S(island|mybattlefield)}] sacrifice auto=chooseacolor transforms((,newability[@each opponent upkeep:damage:type:*[-token&chosencolor]:opponentbattlefield opponent])) chooseend text=As Psychic Allergy enters the battlefield, choose a color. -- At the beginning of each opponent's upkeep, Psychic Allergy deals X damage to that player, where X is the number of nontoken permanents of the chosen color he or she controls. -- At the beginning of your upkeep, destroy Psychic Allergy unless you sacrifice two Islands. @@ -76490,7 +76490,7 @@ toughness=1 [/card] [card] name=Quirion Elves -alias=0000 +alias=1000 auto={T}:Add{G} auto=chooseacolor {T}:add{chosencolor} chooseend text=As Quirion Elves enters the battlefield, choose a color. -- {T}: Add {G} to your mana pool. -- {T}: Add one mana of the chosen color to your mana pool. @@ -79975,7 +79975,7 @@ type=Artifact [/card] [card] name=Revenant -alias=001100 +alias=1111 abilities=flying anyzone=type:creature:mygraveyard/type:creature:mygraveyard cdaactive text=Flying -- Revenant's power and toughness are each equal to the number of creature cards in your graveyard. @@ -87950,7 +87950,7 @@ toughness=2 [/card] [card] name=Shifting Sky -alias=0000 +alias=1000 auto=chooseacolor lord(*[-land]) becomes(,chosencolor) chooseend text=As Shifting Sky enters the battlefield, choose a color. -- All nonland permanents are the chosen color. mana={2}{U} @@ -89235,7 +89235,7 @@ toughness=1 [/card] [card] name=Silhana Starfletcher -alias=0000 +alias=1000 abilities=reach auto=activatechooseacolor {T}:add{chosencolor} activatechooseend text=Reach (This creature can block creatures with flying.) -- As Silhana Starfletcher enters the battlefield, choose a color. -- {T}: Add one mana of the chosen color to your mana pool. @@ -91122,7 +91122,7 @@ toughness=3 [/card] [card] name=Slag Fiend -alias=001100 +alias=1111 anyzone=type:artifact:graveyard/type:artifact:graveyard cdaactive text=Slag Fiend's power and toughness are each equal to the number of artifact cards in all graveyards. mana={R} @@ -92174,7 +92174,7 @@ toughness=3 [/card] [card] name=Sol Grail -alias=0000 +alias=1000 auto=chooseacolor transforms((,newability[{T}:add{chosencolor}])) forever chooseend text=As Sol Grail enters the battlefield, choose a color. -- {T}: Add one mana of the chosen color to your mana pool. mana={3} @@ -94828,7 +94828,7 @@ color=green [/card] [card] name=Splinterfright -alias=001100 +alias=1111 abilities=trample anyzone=type:creature:mygraveyard/type:creature:mygraveyard cdaactive auto=@each my upkeep:deplete:2 controller @@ -97060,7 +97060,7 @@ toughness=4 [/card] [card] name=Street Spasm -alias=110000 +alias=11000 other={X}{X}{R}{R} name(Overload) target=creature[-flying]|opponentbattlefield auto=paidmana damage:X @@ -100291,7 +100291,7 @@ type=Legendary Land [/card] [card] name=Teferi's Moat -alias=0000 +alias=1000 auto=chooseacolor lord(creature[chosencolor&-flying]|opponentBattlefield) cantattack chooseend text=As Teferi's Moat enters the battlefield, choose a color. -- Creatures of the chosen color without flying can't attack you. mana={3}{W}{U} @@ -100481,7 +100481,7 @@ type=Instant [/card] [card] name=Teleportal -alias=110000 +alias=11000 other={3}{U}{R} name(Overload) target=creature|mybattlefield auto=paidmana 1/0 @@ -101009,7 +101009,7 @@ type=Artifact [/card] [card] name=Terravore -alias=001100 +alias=1111 abilities=trample anyzone=type:land:graveyard/type:land:graveyard cdaactive text=Trample -- Terravore's power and toughness are each equal to the number of land cards in all graveyards. @@ -106235,7 +106235,7 @@ type=Artifact [/card] [card] name=Umbra Stalker -alias=001100 +alias=1111 anyzone=type:manab:mygraveyard/type:manab:mygraveyard cdaactive text=Chroma - Umbra Stalker's power and toughness are each equal to the number of black mana symbols in the mana costs of cards in your graveyard. mana={4}{B}{B}{B} @@ -107791,7 +107791,7 @@ subtype=Aura [/card] [card] name=Vandalblast -alias=110000 +alias=11000 other={4}{R} name(Overload) target=artifact|opponentbattlefield auto=overload destroy all(artifact|opponentbattlefield) @@ -110092,7 +110092,7 @@ toughness=2 [/card] [card] name=Voice of All -alias=0000 +alias=1000 abilities=flying auto=chooseacolor transforms((,newability[protection from(*[chosencolor])],newability[0/0])) forever chooseend text=Flying (This creature can't be blocked except by creatures with flying or reach.) -- As Voice of All enters the battlefield, choose a color. -- Voice of All has protection from the chosen color. (It can't be blocked, targeted, dealt damage, or enchanted by anything of the chosen color.) @@ -111899,7 +111899,7 @@ toughness=1 [/card] [card] name=Ward Sliver -alias=0000 +alias=1000 auto=chooseacolor transforms((,newability[lord(sliver) protection from(*[chosencolor])])) forever chooseend text=As Ward Sliver enters the battlefield, choose a color. -- All Slivers have protection from the chosen color. mana={4}{W} @@ -112493,7 +112493,7 @@ type=Artifact [/card] [card] name=Weapon Surge -alias=110000 +alias=11000 other={1}{R} name(Overload) target=creature|mybattlefield auto=paidmana 1/0 diff --git a/projects/mtg/include/MTGRules.h b/projects/mtg/include/MTGRules.h index fa8f59b63..f111efaf3 100644 --- a/projects/mtg/include/MTGRules.h +++ b/projects/mtg/include/MTGRules.h @@ -313,11 +313,11 @@ class MTGDredgeRule: public PermanentAbility, public ReplacementEffect public: //vectorsoulbonders; TargetChooser * tcb; - //MTGAbility * dredgeAbility; - //MTGAbility * targetAbility; - //MTGAbility * targetAbilityAdder; - //MTGAbility * targetAbility1; - //MTGAbility * mod; + MTGAbility * dredgeAbility; + MTGAbility * targetAbility; + MTGAbility * targetAbilityAdder; + MTGAbility * targetAbility1; + MTGAbility * mod; //MTGAbility * activateDredge; //vectorpairing; MTGDredgeRule(GameObserver* observer, int _id); diff --git a/projects/mtg/src/AIPlayerBaka.cpp b/projects/mtg/src/AIPlayerBaka.cpp index 84c294fe9..a2c237e6c 100644 --- a/projects/mtg/src/AIPlayerBaka.cpp +++ b/projects/mtg/src/AIPlayerBaka.cpp @@ -1834,10 +1834,6 @@ MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * pMana, const char * ty { shouldPlayPercentage = 90; } - else if (!card->isLand() && card->has(Constants::PAYZERO)) - { - shouldPlayPercentage = 70; - } else { // shouldPlay == baka_effect_bad giving it a 1 for odd ball lottery chance. @@ -1986,10 +1982,6 @@ MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * pMana, const char * ty { shouldPlayPercentage = 90; } - else if (!card->isLand() && card->has(Constants::PAYZERO)) - { - shouldPlayPercentage = 70; - } else { // shouldPlay == baka_effect_bad giving it a 1 for odd ball lottery chance. @@ -2137,10 +2129,6 @@ MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * pMana, const char * ty { shouldPlayPercentage = 90; } - else if (!card->isLand() && card->has(Constants::PAYZERO)) - { - shouldPlayPercentage = 70; - } else { // shouldPlay == baka_effect_bad giving it a 1 for odd ball lottery chance. @@ -2447,7 +2435,7 @@ int AIPlayerBaka::computeActions() cd.SetExclusionColor(Constants::MTG_COLOR_LAND); MTGCardInstance *freecard = cd.match(game->graveyard); int canCastCard = game->playRestrictions->canPutIntoZone(freecard, game->inPlay); - if (freecard && (canCastCard == PlayRestriction::CAN_PLAY) && freecard->has(Constants::PAYZERO) && freecard->has(Constants::CANPLAYFROMGRAVEYARD) && (freecard->getIncreasedManaCost()->getConvertedCost() < 1) && (freecard->alias != 001100)) + if (freecard && (canCastCard == PlayRestriction::CAN_PLAY) && freecard->has(Constants::PAYZERO) && freecard->has(Constants::CANPLAYFROMGRAVEYARD) && (freecard->getIncreasedManaCost()->getConvertedCost() < 1) && (freecard->alias != 1111)) { MTGAbility * castFreeCard = observer->mLayers->actionLayer()->getAbility(MTGAbility::PAYZERO_COST); AIAction * aa = NEW AIAction(this, castFreeCard, freecard); //TODO putinplay action @@ -2462,7 +2450,7 @@ int AIPlayerBaka::computeActions() cd.SetExclusionColor(Constants::MTG_COLOR_LAND); MTGCardInstance *freecard = cd.match(game->exile); int canCastCard = game->playRestrictions->canPutIntoZone(freecard, game->inPlay); - if (freecard && (canCastCard == PlayRestriction::CAN_PLAY) && freecard->has(Constants::PAYZERO) && freecard->has(Constants::CANPLAYFROMEXILE) && (freecard->getIncreasedManaCost()->getConvertedCost() < 1) && (freecard->alias != 001100)) + if (freecard && (canCastCard == PlayRestriction::CAN_PLAY) && freecard->has(Constants::PAYZERO) && freecard->has(Constants::CANPLAYFROMEXILE) && (freecard->getIncreasedManaCost()->getConvertedCost() < 1) && (freecard->alias != 1111)) { MTGAbility * castFreeCard = observer->mLayers->actionLayer()->getAbility(MTGAbility::PAYZERO_COST); AIAction * aa = NEW AIAction(this, castFreeCard, freecard); //TODO putinplay action diff --git a/projects/mtg/src/CardGui.cpp b/projects/mtg/src/CardGui.cpp index 1049cd41b..4cdfecb12 100644 --- a/projects/mtg/src/CardGui.cpp +++ b/projects/mtg/src/CardGui.cpp @@ -348,7 +348,7 @@ void CardGui::Render() mFont->SetColor(ARGB(static_cast(actA),216,191,216));//thistle powered down else if(!card->wasDealtDamage && card->pbonus >= 3) mFont->SetColor(ARGB(static_cast(actA),255,255,0));//yellow buff - else if(card->hasType("legendary") && card->hasType("eldrazi")) + else if(card->hasType("legendary") && card->hasType("eldrazi") && !card->has(Constants::CHANGELING)) mFont->SetColor(ARGB(static_cast(actA),238,130,238));//violet legendary eldrazi else mFont->SetColor(ARGB(static_cast(actA),255,255,255));//white default @@ -365,9 +365,9 @@ void CardGui::Render() buff = "CT"; if(!card->isToken && card->isACopier) buff = "C"; - if(game && card->has(Constants::PAYZERO) && ((card->currentZone == card->controller()->game->hand) || (card->has(Constants::CANPLAYFROMGRAVEYARD) && card->currentZone == card->controller()->game->graveyard) || (card->has(Constants::CANPLAYFROMEXILE) && card->currentZone == card->controller()->game->exile))) + if(card->has(Constants::PAYZERO)) buff += "Z"; - if(card->alias == 0000) + if(card->alias == 1000) { if(card->chooseacolor == 1) buff += "\n-Green"; @@ -385,7 +385,7 @@ void CardGui::Render() mFont->SetScale(DEFAULT_MAIN_FONT_SCALE); char buffer[200]; sprintf(buffer, "%s", buff.c_str()); - mFont->SetColor(ARGB(static_cast(actA),255,182,193));//Light Pink indicator + mFont->SetColor(ARGB(static_cast(actA),255,215,0));//Gold indicator mFont->SetScale(0.8f); mFont->DrawString(buffer, actX - 10 * actZ, actY - (16 * actZ)); mFont->SetScale(1); diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index 16ffa9b41..7d14d4615 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -3092,7 +3092,7 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG { MTGAbility * a = NEW APowerToughnessModifier(observer, id, card, target, wppt,s,true); a->forcedAlive = 1; - a->forceDestroy = -1; + //a->forceDestroy = -1; return a; //return NEW APowerToughnessModifier(observer, id, card, target, wppt,s,true); } diff --git a/projects/mtg/src/MTGGameZones.cpp b/projects/mtg/src/MTGGameZones.cpp index cfa757aa2..736c68e00 100644 --- a/projects/mtg/src/MTGGameZones.cpp +++ b/projects/mtg/src/MTGGameZones.cpp @@ -546,7 +546,7 @@ MTGCardInstance * MTGGameZone::removeCard(MTGCardInstance * card, int createCopy copy->kicked = card->kicked; copy->storedCard = card->storedCard; copy->storedSourceCard = card->storedSourceCard; - for (int i = 0; i < ManaCost::MANA_PAID_WITH_BESTOW +1; i++) + for (int i = 0; i < ManaCost::MANA_PAID_WITH_OVERLOAD +1; i++) copy->alternateCostPaid[i] = card->alternateCostPaid[i]; //stupid bug with tokens... diff --git a/projects/mtg/src/MTGRules.cpp b/projects/mtg/src/MTGRules.cpp index eeb228e53..5972c999d 100644 --- a/projects/mtg/src/MTGRules.cpp +++ b/projects/mtg/src/MTGRules.cpp @@ -627,7 +627,7 @@ PermanentAbility(observer, _id) int MTGAlternativeCostRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana) { - if (card->alias == 110000) + if (card->alias == 11000) return 0;//overload has its own rule ManaCost * alternateCost = card->getManaCost()->getAlternative(); if (!game->currentlyActing()->game->hand->hasCard(card) && !game->currentlyActing()->game->graveyard->hasCard(card) && !game->currentlyActing()->game->exile->hasCard(card)) @@ -1165,6 +1165,8 @@ MTGAlternativeCostRule(observer, _id) int MTGPayZeroRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana) { + if(!card->has(Constants::PAYZERO)) + return 0; Player * player = game->currentlyActing(); ManaCost * cost = NEW ManaCost(ManaCost::parseManaCost("{0}",NULL,NULL)); if(card->getIncreasedManaCost()->getConvertedCost()) @@ -1174,8 +1176,6 @@ int MTGPayZeroRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana) if(card->isLand()) return 0; - if(!card->has(Constants::PAYZERO)) - return 0; if (!player->game->graveyard->hasCard(card) && !player->game->exile->hasCard(card) && !player->game->hand->hasCard(card)) return 0; if ((!card->has(Constants::CANPLAYFROMGRAVEYARD) && player->game->graveyard->hasCard(card))||(!card->has(Constants::CANPLAYFROMEXILE) && player->game->exile->hasCard(card))) @@ -1225,7 +1225,7 @@ MTGAlternativeCostRule(observer, _id) int MTGOverloadRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana) { - if (card->alias != 110000) + if (card->alias != 11000) return 0; Player * player = game->currentlyActing(); ManaCost * cost = NEW ManaCost(card->model->data->getManaCost()->getAlternative()); @@ -2255,9 +2255,9 @@ MTGDredgeRule::MTGDredgeRule(GameObserver* observer, int _id) : PermanentAbility(observer, _id) { tcb = NULL; - //dredgeAbility = NULL; - //targetAbility = NULL; - //mod = NULL; + dredgeAbility = NULL; + targetAbility = NULL; + mod = NULL; } ; @@ -2314,26 +2314,26 @@ WEvent * MTGDredgeRule::replace(WEvent * event) } //there is a memleak here that i have no idea what causes it. - dredgeCard *dc = NEW dredgeCard(game, game->mLayers->actionLayer()->getMaxId(), card,NULL); - dc->oneShot = true; - GenericTargetAbility *gta = NEW GenericTargetAbility(game, "Dredge A Card","",game->mLayers->actionLayer()->getMaxId(), card,tcb->clone(),dc->clone()); - gta->oneShot = true; - //SAFE_DELETE(dredgeAbility); + dredgeAbility = NEW dredgeCard(game, game->mLayers->actionLayer()->getMaxId(), card,NULL); + dredgeAbility->oneShot = true; + targetAbility = NEW GenericTargetAbility(game, "Dredge A Card","",game->mLayers->actionLayer()->getMaxId(), card,tcb->clone(),dredgeAbility->clone()); + targetAbility->oneShot = true; + SAFE_DELETE(dredgeAbility); - GenericAddToGame *gatg = NEW GenericAddToGame(game, game->mLayers->actionLayer()->getMaxId(), card,NULL,gta->clone()); - gatg->oneShot = true; - //SAFE_DELETE(targetAbility); - //MTGAbility * setDredge = targetAbilityAdder->clone(); - //SAFE_DELETE(targetAbilityAdder); - //setDredge->oneShot = true; + targetAbilityAdder = NEW GenericAddToGame(game, game->mLayers->actionLayer()->getMaxId(), card,NULL,targetAbility->clone()); + targetAbilityAdder->oneShot = true; + SAFE_DELETE(targetAbility); + MTGAbility * setDredge = targetAbilityAdder->clone(); + SAFE_DELETE(targetAbilityAdder); + setDredge->oneShot = true; - selection.push_back(gatg); - AADrawer *ad = NEW AADrawer(game, game->mLayers->actionLayer()->getMaxId(), card,card,NULL, "1",TargetChooser::CONTROLLER,true); - selection.push_back(ad); - MenuAbility * menuChoice = NEW MenuAbility(game, game->mLayers->actionLayer()->getMaxId(), card, card,true,selection,card->controller(),"Dredge or Draw"); + selection.push_back(setDredge); + targetAbility1 = NEW AADrawer(game, this->GetId(), card,card,NULL, "1",TargetChooser::CONTROLLER,true); + selection.push_back(targetAbility1); + MTGAbility * menuChoice = NEW MenuAbility(game, this->GetId(), card, card,true,selection,card->controller(),"Dredge or Draw"); menuChoice->addToGame(); - //SAFE_DELETE(tcb); + SAFE_DELETE(tcb); } SAFE_DELETE(event);