Compare commits

...

35 Commits

Author SHA1 Message Date
Eduardo MG e6243342e2 _cards.dat Updates 2025-05-04 17:31:25 -06:00
Eduardo MG a9547e419d Exiledeath cards revision, version update
Exiledeath must come before damage or status reduction, also not necessary to specify ueot on instants and sorceries.
New Cards:
Marisi, Breaker of the Coil
Secret Plans
Updated version to 0.25.5
2025-05-04 16:34:56 -06:00
Eduardo MG 41f5aceac4 Tar Fiend rework. Sidisi, Regent of the Mire fix 2025-05-01 17:57:49 -06:00
Eduardo MG a394397dc0 Update AIPlayerBaka.cpp
Remove the unused variable
2025-04-29 23:10:37 -06:00
Eduardo MG f93bcb32ef Tarkir: Dragonstorm (TDM) update
Maccros for artifact tokens update
Added cards from TDM and TDC
Bug fixes on exert
Changelings have Every Creature Type but should esclude certain types present on creatures like Clue, Equipment, Food, and Treasure
Cards like Prized Unicorn with abilities=lure prevented the opponent from blocking even if Prized Unicorn was not attacking.
Fixed:
Lure stops from blocking even if the creature with lure is not attacking.
Exerted Creatures Can Be Untapped By Clicking On Them.
2025-04-29 22:05:54 -06:00
Eduardo MG 9cd1fa5757 Add Ugin's Fate (UGIN), Tarkir: Dragonstorm (TDM), and Tarkir: Dragonstorm Commander (TDC)
_cards.dat files for these sets.
2025-04-24 21:45:41 -06:00
Eduardo MG 9b2f59d64f AIPlayerBaka
Changing how the AI selects attackers, considering creatures with evasion
2025-04-24 14:13:25 -06:00
Eduardo MG c109b2118a Update AIPlayerBaka.h 2025-04-23 19:40:48 -06:00
Eduardo MG 06bd11b0be Revert "Revert "Revert "Update AIPlayerBaka.cpp"""
This reverts commit d892703902.
2025-04-23 19:25:24 -06:00
Eduardo MG d892703902 Revert "Revert "Update AIPlayerBaka.cpp""
This reverts commit c0e2a1fe40.
2025-04-23 19:23:50 -06:00
Eduardo MG c0e2a1fe40 Revert "Update AIPlayerBaka.cpp"
This reverts commit 3555ddba33.
2025-04-23 19:16:43 -06:00
Eduardo MG 3555ddba33 Update AIPlayerBaka.cpp
Changing how AI decides to attack with creatures that have some kind of evasion.
Experimenting with how AI decides to block
2025-04-23 18:51:05 -06:00
Eduardo MG e2b9429b45 Variants, new macros, old type changed to Kindred
Cleaned extra spaces and bugs in primitives
Macros for Crew 2
Removed old obsolete card type and changed it to Kindred
New zone mybattlefieldhand for "Behold a Dragon"
2025-04-23 18:20:32 -06:00
Eduardo MG c0c03eecc4 Merge pull request #1112 from BobCyril/master
Improvements to decks 1-10
2025-04-18 18:07:21 -06:00
BobCyril c9cef1567a Update deck10.txt
Reformatted deck 10
2025-04-16 20:56:32 +01:00
BobCyril 4286557026 Update deck9.txt
Reformatted deck 9
2025-04-16 20:54:52 +01:00
BobCyril 13cf8baf24 Update deck8.txt
Reformatted deck 8
2025-04-16 20:53:39 +01:00
BobCyril ff046cf9d6 Update deck7.txt
Reformated deck 7. Added hints to make deck slightly less self-destructive, but still retaining its strategy and flavor
2025-04-16 20:51:56 +01:00
BobCyril 13a48b5a14 Update deck6.txt
Reformatted deck 6. Replaced cards which hinder the deck's strategy. Added a hint to stablise AI use of one card.
2025-04-16 20:47:13 +01:00
BobCyril 61bf5bc95d Update deck5.txt
Reformatted deck 5
2025-04-16 20:43:58 +01:00
BobCyril 0679cfd076 Update deck4.txt
Reformatted deck 4
2025-04-16 20:42:17 +01:00
BobCyril 19e28f9dca Update deck3.txt
Reformatted deck 3
2025-04-16 20:40:20 +01:00
BobCyril ee6ad9609c Update deck2.txt
Reformatted deck 2.  Removed rogue W cards from this GR deck
2025-04-16 20:37:31 +01:00
BobCyril 266ae422f1 Update deck1.txt
Reformatted deck 1
2025-04-16 20:34:20 +01:00
Eduardo MG a89a352e22 "if paid(alternative) then" changed to "alternative" 2025-04-11 19:00:36 -06:00
Eduardo MG b21964dc46 Strixhaven variants, fix critical bug
Palladia-Mors, the Ruiner
Vanish into Memory
Dakmor Plague and Inferno. all(player,creature) not supported and crashes the game
color=colorless is redundant
Strixhaven: School of Mages (STX) (VARIANTS)
2025-04-10 18:53:41 -06:00
Eduardo MG 6904d6ffd3 Bug fixes on zones and correcting misspells
Summoner's Bond
Regent's Authority
Mind Burst
Thassa's Oracle
2025-04-08 22:09:47 -06:00
Eduardo MG 786a252cf5 Mana symbols to uppercase, bug fixes
Lands that enter tapped unless a player has 13 or less life
Courier Bat
Demon of Death's Gate
Caldaia Guardian
2025-04-04 22:24:18 -06:00
Eduardo MG 863c3f07bc Bad card line 2025-03-31 13:33:38 -06:00
Eduardo MG e0867dd737 CM2 update, notATarget on clones
Clones shouldn't target.
Cosmotronic Wave
Leyline of Hope
Regal Bloodlord
Protean Raider
Impetuous Devils
Camera Launcher

New cards in previous commit:
Abyssal Harvester
Boneyard Desecrator
Celestial Armor
Crystal Barricade
Dazzling Denial
Felling Blow
Fleeting Flight
Geralf, the Fleshwright
Hare Apparent
Infernal Vessel
Inspiring Paladin
Kaito, Cunning Infiltrator
Kellan, Planar Trailblazer
Kiora, the Rising Tide
Loot, Exuberant Explorer
Owen Grady, Raptor Trainer
Perforating Artist
Permission Denied
Ravenous Amulet
Reality Spasm
Savage Order
Skyknight Squire
Slick Sequence
Spinner of Souls
Spitting Dilophosaurus
Squad Rallier
Sun-Blessed Healer
Valkyrie's Call
2025-03-31 13:13:53 -06:00
Eduardo MG 671b3bae61 Improved riot, INR, MH3, macros. Bug fixes. New cards
Windbrisk Heights
Orchard Strider
Shefet Monitor
Merfolk Sovereign
Alibou, Ancient Witness
Flesh Allergy
Regal Sliver
name=Pilot token, condition to check if there's a vehicle in your battlefield
Painful Quandary needed a condition to check if the affected player has at least one card in hand
Serpentine Curve shouldn't count itself. Serpentine Curve itself is not yet in your graveyard when you determine the value of X.
Rowen was drawing with nonbasics
Thopter Spy Network
Teferi, Temporal Archmage -10 ability, create an emblem
Exert Influence
Dawnglade Regent effect persisted after dying
Molten Echoes
Undergrowth
Haze of Pollen
Oketra's Avenger
Heliod's Intervention
Aura Barbs
Gravestorm
Inspired Sphinx
Retrofitted Transmogrant
Echoing Assault
Citywide Bust
2025-03-28 17:12:41 -06:00
Eduardo MG 02a4726cbf Merge pull request #1110 from patrickbabb/master
Updates to target arm64-v8a Android devices
2025-03-21 22:08:19 -06:00
Patrick Babb 91d588c670 Update spinlock_gcc_arm.hpp
Added logic to use LSE as a primary instead of Swap.
2025-03-18 22:01:55 -05:00
Patrick Babb 4df4422d93 Update Application.mk
Updated ABI target to arm64-v8a.
Added CFLAG for arm8.1-a.
Added CPPFLAG for LSE
2025-03-18 21:58:59 -05:00
Patrick Babb 0b3b33f727 Update SDL_spinlock.c 2025-03-18 21:55:59 -05:00
44 changed files with 17759 additions and 7727 deletions
@@ -29,11 +29,30 @@ public:
{ {
int r; int r;
#if defined(__ARM_FEATURE_LSE)
// Use LSE atomic instructions if supported
#pragma message("LSE feature detected") // This will print a message in your build logs
__asm__ __volatile__( __asm__ __volatile__(
"swp %0, %1, [%2]": "ldaxr %0, [%1];" // Load-Exclusive instruction
"=&r"( r ): // outputs "cbnz %0, 1f;" // If the value is non-zero, the lock is already acquired
"r"( 1 ), "r"( &v_ ): // inputs "stlxr %w0, %2, [%1];" // Store-Exclusive instruction
"memory", "cc" ); "cbnz %w0, 1f;" // If the store failed, retry
"mov %0, #0;" // Success, zero indicates lock acquired
"1:"
: "=&r"(r)
: "r"(&v_), "r"(1)
: "memory", "cc"
);
#else
// Fallback for systems that don't support LSE
#pragma message("LSE feature not detected") // This will print a message in your build logs if LSE is not detected
__asm__ __volatile__(
"swp %0, %1, [%2];" // Swap instruction (used as a fallback)
: "=&r"(r) // output constraint
: "r"(1), "r"(&v_) // input constraints
: "memory", "cc" // clobbered registers
);
#endif
return r == 0; return r == 0;
} }
+23 -10
View File
@@ -14,10 +14,11 @@
claim that you wrote the original software. If you use this software claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be in a product, an acknowledgment in the product documentation would be
appreciated but is not required. appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be 2. Altered source versions must be plainly marked as such, and must not
misrepresented as being the original software. be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution. 3. This notice may not be removed or altered from any source distribution.
*/ */
#include "SDL_stdinc.h" #include "SDL_stdinc.h"
#include "SDL_atomic.h" #include "SDL_atomic.h"
@@ -30,8 +31,7 @@
#endif #endif
/* This function is where all the magic happens... */ /* This function is where all the magic happens... */
SDL_bool SDL_bool SDL_AtomicTryLock(SDL_SpinLock *lock)
SDL_AtomicTryLock(SDL_SpinLock *lock)
{ {
#if SDL_ATOMIC_DISABLED #if SDL_ATOMIC_DISABLED
/* Terrible terrible damage */ /* Terrible terrible damage */
@@ -85,13 +85,27 @@ SDL_AtomicTryLock(SDL_SpinLock *lock)
return (result == 0); return (result == 0);
#else #else
/* Need CPU instructions for spinlock here! */ /* Fallback implementation using a standard mutex */
__need_spinlock_implementation__ /* You can use SDL_mutex as a fallback if no atomic instructions are available */
static SDL_mutex *mutex;
if (!mutex) {
mutex = SDL_CreateMutex();
}
SDL_mutexP(mutex);
if (*lock == 0) {
*lock = 1;
SDL_mutexV(mutex);
return SDL_TRUE;
} else {
SDL_mutexV(mutex);
return SDL_FALSE;
}
#endif #endif
} }
void void SDL_AtomicLock(SDL_SpinLock *lock)
SDL_AtomicLock(SDL_SpinLock *lock)
{ {
/* FIXME: Should we have an eventual timeout? */ /* FIXME: Should we have an eventual timeout? */
while (!SDL_AtomicTryLock(lock)) { while (!SDL_AtomicTryLock(lock)) {
@@ -99,8 +113,7 @@ SDL_AtomicLock(SDL_SpinLock *lock)
} }
} }
void void SDL_AtomicUnlock(SDL_SpinLock *lock)
SDL_AtomicUnlock(SDL_SpinLock *lock)
{ {
#if defined(_MSC_VER) #if defined(_MSC_VER)
_ReadWriteBarrier(); _ReadWriteBarrier();
+4 -1
View File
@@ -1,6 +1,9 @@
APP_PROJECT_PATH := $(call my-dir)/.. APP_PROJECT_PATH := $(call my-dir)/..
APP_CPPFLAGS += -frtti -fexceptions APP_CPPFLAGS += -frtti -fexceptions
APP_ABI := armeabi-v7a APP_ABI := arm64-v8a
APP_PLATFORM := android-21
APP_CFLAGS += -march=armv8.1-a
APP_CPPFLAGS += -D__ARM_FEATURE_LSE=1
#APP_ABI := x86 # mainly for emulators #APP_ABI := x86 # mainly for emulators
APP_STL := c++_static APP_STL := c++_static
APP_MODULES := libpng libjpeg main SDL APP_MODULES := libpng libjpeg main SDL
File diff suppressed because it is too large Load Diff
+37 -72
View File
@@ -1,76 +1,18 @@
#NAME:Nightmare #NAME:Nightmare
#DESC:I had a terrible Nightmare once #DESC:'All evil is as a nightmare'
#DESC:and then a second #DESC:Thomas Carlyle
#DESC:and a third #DESC:
#DESC:and then I won. #DESC:Win matches to unlock more
#2x Obsianus Golem #DESC:opponents, sets and game modes
1129 Air Elemental (RV) (*) * 2
1129 Animate Dead (RV) (*) * 2
#2x animate dead Bad Moon (RV) (*) * 2
1143 Bog Wraith (RV) (*) * 2
1143 Cursed Land (RV) (*) * 1
#2x Bad Moon El-Hajjaj (RV) (*) * 2
1144 Fear (RV) (*) * 1
1144 Hypnotic Specter (RV) (*) * 2
#2x Bog Wraith # RV Islands
1146
1146
#1x Cursed Land
1148
#1x Fear
1161
#2x El-Hajjâj
1158
1158
#2x Hypnotic Specter
1165
1165
#4x Nightmare
1170
1170
1170
1170
#3x Scathe Zombie
1177
1177
1177
#1x Unholy Strength
1183
#1x Wall of Bone
1184
#1x Zombie Master
1188
#2x Air Elemental
1189
1189
#2x Lifetap
1205
1205
#2x Lord of Atlantis
1206
1206
#2x Mahamoti Djinn
1208
1208
#4x Merfolk of the Pearl Trident
1210
1210
1210
1210
# Swamp (RV)
1373
1373
1373
1373
1374
1374
1374
1374
1375
1375
1375
1375
# Island (RV)
1392 1392
1392 1392
1392 1392
@@ -83,3 +25,26 @@
1394 1394
1394 1394
1394 1394
Lifetap (RV) (*) * 2
Lord of Atlantis (RV) (*) * 2
Mahamoti Djinn (RV) (*) * 2
Merfolk of the Pearl Trident (RV) (*) * 4
Nightmare (RV) (*) * 4
Obsianus Golem (RV) (*) * 2
Scathe Zombies (RV) (*) * 3
# RV Islands
1373
1373
1373
1373
1374
1374
1374
1374
1375
1375
1375
1375
Unholy Strength (RV)(*) * 1
Wall of Bone (RV) (*) * 1
Zombie Master (RV) (*) * 1
+16 -22
View File
@@ -1,30 +1,24 @@
#NAME:Howlings #NAME:Howlings
#DESC:Supported by elemental rage #DESC:'What the howling deep down
#DESC:goblins descend from the mountains #DESC:there conceals, no blessed
#DESC:to conquer the lands below. #DESC:living soul can tell'
#DESC:Friedrich Schiller
# (PSY) added 2 Mountains, 1 Black Vise, 1 Howling Mine #DESC:
# (would've been better to add creatures, but all creatures in the #DESC:Win matches to unlock more
# deck were already at 4 pieces)) #DESC:opponents, sets and game modes
Black Vise (MPS) * 4
# Land(s)
Mountain (8ED) * 20
# Creature(s)
Goblin King (8ED) * 4 Goblin King (8ED) * 4
Goblin Mountaineer (9ED) * 4 Goblin Mountaineer (9ED) * 4
Goblin Piker (9ED) * 4 Goblin Piker (9ED) * 4
Goblin Striker (MRD) * 4 Goblin Striker (MRD) * 4
Hearthfire Hobgoblin (EVE) * 4 Hearthfire Hobgoblin (EVE) * 4
Howling Mine (8ED) * 3
Lightning Bolt (M10) * 4
Mountain (10E) * 4
Mountain (7ED) * 4
Mountain (8ED) * 4
Mountain (9ED) * 4
Mountain (M10) * 4
Raging Goblin (8ED) * 4 Raging Goblin (8ED) * 4
Spark Elemental (5DN) * 4 Spark Elemental (5DN) * 4
Wheel of Fortune (VMA) * 1
# Artifact(s)
Black Vise (V10) * 4
Howling Mine (8ED) * 3
# Instant(s)
Lightning Bolt (M10) * 4
# Sorcery(s)
Wheel of Fortune (VMA) * 1
+24 -62
View File
@@ -1,66 +1,17 @@
#NAME:Taiga #NAME:Taiga
#DESC:The forces of fire and nature unite. #DESC:Beware the fires deep in
#DESC:the boreal forest
#DESC: #DESC:
#DESC:Can you withstand #DESC:Win matches to unlock more
#DESC:their combined fervor? #DESC:opponents, sets and game modes
#2x Cockatrice Cockatrice (RV) (*) * 2
1238 Craw Wurm (RV) (*) * 3
1238 Earth Elemental (RV) (*) * 2
#3x Craw Wurm Elvish Archers (RV) (*) * 2
1239 Firebreathing (RV) (*) * 1
1239 Fire Elemental (RV) (*) * 2
1239 Flashfires (RV) (*) * 2
#2x Elvish Archers # RV Forests
1242
1242
#2x Giant Spider
1249
1249
#2x Grizzly Bears
1250
1250
#2x Scryb Sprites
1264
1264
#2x Shanodin Dryads
1265
1265
#1x Tranquility
1270
#1x Tsunami
1271
#2x Earth Elemental
1287
1287
#2x Fire Elemental
1290
1290
#1x Flashfires
1293
#3x Goblin King
1296
1296
1296
#2x Hill Giant
1299
1299
#4x Mons's Goblin Raiders
1308
1308
1308
1308
#2x Orcish Oriflamme
1310
1310
1310
# (PSY) Power Surge not available any more, replaced with a third Orcish Oriflamme
#1x Power Surge
#1311
#1x Wheel of Fortune
1326
#1x White Ward
1371
#Forest (RV)
1386 1386
1386 1386
1386 1386
@@ -73,7 +24,12 @@
1388 1388
1388 1388
1388 1388
#Mountain Giant Spider (RV) (*) * 2
Goblin King (RV) (*) * 3
Grizzly Bears (RV) (*) * 2
Hill Giant (RV) (*) * 2
Mons's Goblin Raiders (RV) (*) * 4
# RV Mountains
1389 1389
1389 1389
1389 1389
@@ -86,3 +42,9 @@
1391 1391
1391 1391
1391 1391
Orcish Oriflamme (RV) (*) * 2
Scryb Sprites (RV) (*) * 2
Shanodin Dryads (RV) (*) * 2
Tranquility (RV) (*) * 1
Tsunami (RV) (*) * 1
Wheel of Fortune (RV) (*) * 1
+22 -28
View File
@@ -1,39 +1,33 @@
#NAME:Savannah #NAME:Savannah
#DESC:United against the terrible #DESC:Beasts stalk their prey
#DESC:Phyrexian Fate, #DESC:among the tall grasses
#DESC:there is no time for dispute #DESC:
#DESC:or rivalries #DESC:
#DESC:in Eladamri and Gerrard's army #DESC:Win matches to unlock more
# (PSY) 2x Benalish Hero not available any more, removed (deck has still >60 cards) #DESC:opponents, sets and game modes
# (PSY) 2x Mesa Pegasus not available any more, removed (deck has still >60 cards) Armageddon (VMA) * 1
Black Vise (V10) * 2
# Land(s) Builder's Blessing (AVR) * 2
Forest (8ED) * 13
Plains (8ED) * 9
# Creature(s)
Cockatrice (TSB) * 2 Cockatrice (TSB) * 2
Craw Wurm (9ED) * 2 Craw Wurm (9ED) * 2
Crusade (DDF) * 2
Forest (8ED) * 4
Forest (9ED) * 4
Forest (MRD) * 1
Forest (ONS) * 4
Giant Spider (AKH) * 2 Giant Spider (AKH) * 2
Grizzly Bears (8ED) * 2 Grizzly Bears (8ED) * 2
Spitting Spider (8ED) * 2 Jukai Messenger (CHK) * 4
Kessig Recluse (DKA) * 2
Living Lands (ME4) * 1
Plains (8ED) * 4
Plains (9ED) * 1
Plains (ONS) * 4
Rhox Charger (ALA) * 1
Ronom Unicorn (CSP) * 2 Ronom Unicorn (CSP) * 2
Savannah Lions (A25) * 2 Savannah Lions (A25) * 2
Scute Mob (ZEN) * 3 Scute Mob (ZEN) * 3
Serra Angel (M13) * 2 Serra Angel (M13) * 2
Jukai Messenger (CHK) * 4 Spitting Spider (8ED) * 2
Kessig Recluse (DKA) * 2
Rhox Charger (ALA) * 1
# Artifact(s)
Black Vise (V10) * 2
The Rack (DPA) * 2 The Rack (DPA) * 2
# Enchantment(s)
Builder's Blessing (AVR) * 2
Crusade (DDF) * 2
Living Lands (ME4) * 1
# Sorcery(s)
Armageddon (VMA) * 1
Wrath of God (8ED) * 2 Wrath of God (8ED) * 2
+26 -61
View File
@@ -1,64 +1,23 @@
#NAME:Plateau #NAME:Plateau
#DESC:In the highland of Boros #DESC:There are no hiding places
#DESC:Angels, elementals and goblins #DESC:on the high steppes beyond
#DESC:are preparing for battle. #DESC:the mountain passes
#DESC:Beware, the crusade is coming... #DESC:
#4x Lightning Helix {W}{R} - does 3 damage and you gain 3 life replacement for #2x Black Vise (1097) and #2x The Rack (1139) #DESC:Win matches to unlock more
87908 #DESC:opponents, sets and game modes
87908 Boros Recruit (RAV) * 4
87908 Bull Cerodon (ALA) * 3
87908 Castle (RV) * 2
# (PSY) added a third Bull Cerodon to bring the deck to 60 cards Cerodon Yearling (ARB) * 2
#2x Bull Cerodon replacement for #3x Earth Elementat {3}{R}{R} -4/5 (1287) Crusade (RV) * 1
174952 Fire Elemental (RV) * 2
174952 Goblin King (10E) * 2
174952 Hearthfire Hobgoblin (EVE) * 2
#2x Fire Elemental {3}{R}{R} - 5/4 Hill Giant (RV) * 1
1290 Keldon Warlord (RV) * 1
1290 Lightning Helix (RAV) * 4
#2 x Nobilis of War {RW}{RW}{RW}{RW}{RW} replacement for 2x Fire elemental (1290) Mons's Goblin Raiders (RV) * 1
154258 # RV Mountains
154258
#2x Goblin king (replaced Rv version 1296 with 10E)
129578
129578
#4 x Boros Recruit - {WR} - Goblin 1/1 first strike - Replace 2x Goblin Baloon brigade (1295) and 2 x Benalish Hero {W} -1/1 banding (1330)
88992
88992
88992
88992
#1x Mons Goblin Raide (1308)
1308
#2x Skyknight Legionnaire replacement for #2x Granite Gargoyle {2}{R} - 2/2 flying {R}:0/1 1297
109082
109082
#1x Orcish Oriflame
1310
#2x Castle {3}{W} - untapped creature get 0/2
1334
1334
#1x Crusade White creature get +1/+1 {W}{W}
1341
#2x Cerodon Yearling {R}{W} vigilance haste 2/2 replacement for pearled Unicord 2/2 {2}{W} (1356)
180604
180604
#2x Serra Angel {3}{W}{W} - 4/4 flying,vigilance
1366
1366
#2x Wall of sword {3}{W} 3/5 flying defender
1369
1369
#2x White knight 2/2 first strike, protection from black
1370
1370
#1x Hill Giant {3}{R} - 3/3
1299
#2x Hearthfire Hobgoblin replacement for - 1x Hurloon Minotaur - {1}{R}{R} - 2/3 - 1300 and 1xEarth Elementat {3}{R}{R} -4/5 - 1287
157201
157201
#1x Keldon Warlord
1301
#Moutains
1389 1389
1389 1389
1389 1389
@@ -71,7 +30,9 @@
1391 1391
1391 1391
1391 1391
#Plains Nobilis of War (EVE) * 2
Orcish Oriflamme (RV) * 1
# RV Plains
1395 1395
1395 1395
1395 1395
@@ -84,3 +45,7 @@
1397 1397
1397 1397
1397 1397
Serra Angel (RV) * 2
Skyknight Legionnaire (RAV) * 2
Wall of Swords (RV) * 2
White knight (RV) * 2
+36 -74
View File
@@ -1,68 +1,37 @@
#NAME:Badlands #NAME:Badlands
#DESC:Dangerous foes await you. #DESC:The badlands are full of
#DESC:Both undead, goblins, and #DESC:treachery; even the paths
#DESC:other abominations will #DESC:through the marshes will
#DESC:fight you recklessly. #DESC:mislead and betray
#Ankh of Mishra #DESC:
1094 #DESC:Win matches to unlock more
1094 #DESC:opponents, sets and game modes
1094 Ankh of Mishra (RV) * 4
1094 Armageddon Clock (RV) * 1
#Armageddon Clock Bad Moon (RV) * 2
1095 Black Knight (RV) * 2
#Black Vise Black Vise (RV) * 2
1097 Dancing Scimitar (RV) * 2
1097 Drudge Skeletons (RV) * 4
#Dancing Scimitar El-Hajjaj (RV) * 2
1104 Goblin King (RV) * 2
1104 Howling Mine (RV) * 1
#Howling Mine Hypnotic Specter (RV) * 2
1112 Mons's Goblin Raiders (RV) * 4
#The Rack # RV Mountains
1139 1389
1139 1390
#Bad Moon 1391
1144 1389
1144 1390
#Black Knight 1391
1145 1389
1145 1390
#Drudge Skeletons 1391
1157 Orcish Oriflamme (RV) * 2
1157 Scathe Zombies (RV) * 4
1157 Sedge Troll (RV) * 3
1157 # RV Swamps
#El-Hajjaj
1158
1158
#Hypnotic Specter
1165
1165
#Scathe Zombies
1177
1177
1177
1177
#Zombie Master
1188
#Goblin King
1296
1296
#Orcish Oriflamme
1310
1310
#Wheel of Fortune
1326
#Sedge Troll
1315
1315
1315
#Mons's Goblin Raiders
1308
1308
1308
1308
#Swamp
1373 1373
1374 1374
1375 1375
@@ -73,13 +42,6 @@
1374 1374
1375 1375
1373 1373
#Mountain The Rack (RV) * 2
1389 Wheel of Fortune (RV) * 1
1390 Zombie Master (RV) * 1
1391
1389
1390
1391
1389
1390
1391
+28 -63
View File
@@ -1,66 +1,18 @@
#NAME:Yavimaya #NAME:Yavimaya
#DESC:Beasts of the woods and the #DESC:On the island of Yavimaya
#DESC:seas are gathering, preparing #DESC:the forest is not just
#DESC:for battle. #DESC:ancient and wild. It is
#Armageddon Clock #DESC:also sentient.
1095 #DESC:
#Obsianus Golem #DESC:Win matches to unlock more
1129 #DESC:opponents, sets and game modes
1129 #HINT:combo hold(Tranquility|myhand)^cast(Tranquility|myhand)^restriction{type(enchantment|opponentbattlefield)~morethan~0}^totalmananeeded({2}{G})
#Air Elemental Air Elemental (RV) * 4
1189 Armageddon Clock (RV) * 1
1189 Cockatrice (RV) * 1
1189 Craw Wurm (RV) * 1
1189 Elvish Archers (RV) * 2
#Lifetap # RV Forests
1205
1205
#Lord of Atlantis
1206
1206
#Merfolk of the Pearl Trident
1210
1210
1210
1210
#Phantom Monster
1213
1213
#Serendib Efreet
1221
1221
#Sea Serpent
1220
1220
#Cockatrice
1238
#Craw Wurm
1239
#Elvish Archers
1242
#Giant Spider
1249
1249
#Grizzly Bears
1250
1250
#Scryb Sprites
1264
1264
1264
#Thicket Basilisk
1267
# (PSY) Timber Wolves not available any more, replaced with Scryb Sprites
#Timber Wolves
#1268
#Tsunami
1271
#Wall of Ice
1274
#War Mammoth
1277
1277
#Forest
1386 1386
1387 1387
1388 1388
@@ -73,7 +25,9 @@
1386 1386
1387 1387
1388 1388
#Island Giant Spider (RV) * 2
Grizzly Bears (RV) * 2
# RV Islands
1392 1392
1393 1393
1394 1394
@@ -86,3 +40,14 @@
1392 1392
1393 1393
1394 1394
Lord of Atlantis (RV) * 3
Merfolk of the Pearl Trident (RV) * 4
Obsianus Golem (RV) * 2
Phantom Monster (RV) * 2
Scryb Sprites (RV) * 3
Sea Serpent (RV) * 2
Serendib Efreet (RV) * 2
Thicket Basilisk (RV) * 1
Tranquility (RV) * 1
Wall of Ice (RV) * 1
War Mammoth (RV) * 2
+18 -17
View File
@@ -1,25 +1,26 @@
#NAME:Wrath #NAME:Wrath
#DESC:O miserable of happy #DESC:The truly wrathful person
#DESC:Is this the end #DESC:harms themselves as much as
#DESC:Of this new glorious world #DESC:their enemies
# Land(s) #DESC:
Plains (8ED) * 21 #DESC:Win matches to unlock more
#DESC:opponents, sets and game modes
# Creature(s) #HINT:combo hold(Armageddon|myhand)^cast(Armageddon|myhand)^restriction{type(creature|mybattlefield)~morethan~1}^totalmananeeded({3}{W})
#HINT:combo hold(Wrath of God|myhand)^cast(Wrath of God|myhand)^restriction{type(creature|opponentbattlefield)~morethan~2}^totalmananeeded({2}{W}{W})
Armageddon (VMA) * 4
Crusade (DDF) * 4
Guardians of Akrasa (ALA) * 4 Guardians of Akrasa (ALA) * 4
Paladin en-Vec (9ED) * 1 Paladin en-Vec (9ED) * 1
Plains (8ED) * 4
Plains (9ED) * 4
Plains (M10) * 4
Plains (ALA) * 4
Plains (DDF) * 4
Plains (10E) * 1
Savannah Lions (8ED) * 4 Savannah Lions (8ED) * 4
Serra Angel (8ED) * 4 Serra Angel (8ED) * 4
Sigiled Paladin (ALA) * 4 Sigiled Paladin (ALA) * 4
Skyhunter Skirmisher (5DN) * 3 Skyhunter Skirmisher (5DN) * 3
White Knight (M10) * 4
# Enchantment(s)
Crusade (DDF) * 4
# Instant(s)
Swords to Plowshares (DDF) * 4 Swords to Plowshares (DDF) * 4
White Knight (M10) * 4
# Sorcery(s) Wrath of God (8ED) * 3
Armageddon (VMA) * 4
Wrath of God (8ED) * 3
+26 -63
View File
@@ -1,58 +1,16 @@
#Mill /Artifact Game for AI
#NAME:Inquisitor #NAME:Inquisitor
#DESC:Black vises in Ivory Towers #DESC:'The voice of nature is
#DESC:await you, when facing #DESC:worthless in front of
#DESC:this artificially created army, #DESC:the Inquisition'
#DESC:designed to completely stop #DESC:Friedrich Schiller
#DESC:your progress, and then #DESC:
#DESC:torture you to death. #DESC:Win matches to unlock more
#4x Howling Mine #DESC:opponents, sets and game modes
129598 Black Vise (RV) * 4
129598 Clockwork Beast (RV) * 4
129598 Dancing Scimitar (RV) * 4
129598 Howling Mine (10E) * 4
#4 x Black Vise # 10E Islands
1097
1097
1097
1097
#4x Ivory Tower
1115
1115
1115
1115
#4x Obsianus Golem
1129
1129
1129
1129
#4xTower Gargoyle
174924
174924
174924
174924
#4xLiving Wall
1123
1123
1123
1123
#4x Dancing Scimitar
1104
1104
1104
1104
#4x Clockwork Beast
1101
1101
1101
1101
#4x Master of Etherium
175114
175114
175114
175114
#Lands
#10islands
129606 129606
129606 129606
129606 129606
@@ -63,15 +21,11 @@
129607 129607
129608 129608
129609 129609
#7swamps Ivory Tower (RV) * 4
129755 Living Wall (RV) * 4
129756 Master of Etherium (ALA) * 4
129757 Obsianus Golem (RV) * 4
129754 # 10E Plains
129755
129756
129757
#7Plains
129681 129681
129682 129682
129683 129683
@@ -79,3 +33,12 @@
129681 129681
129682 129682
129683 129683
# 10E Swamps
129755
129756
129757
129754
129755
129756
129757
Tower Gargoyle (ALA) * 4
+16 -15
View File
@@ -1,22 +1,23 @@
#NAME:Shatter #NAME:Shatter
#DESC:See all your efforts shattered #DESC:See your efforts shattered
#DESC:by the all-consuming power #DESC:by righteous fury
#DESC:of righteous fury. #DESC:
# Land(s) #DESC:Win matches to unlock more
Mountain (8ED) * 12 #DESC:opponents, sets and game modes
Plains (8ED) * 12
# Creature(s)
Anaba Bodyguard (10E) * 4 Anaba Bodyguard (10E) * 4
Ancestor's Chosen (10E) * 4 Ancestor's Chosen (10E) * 4
Angelic Wall (10E) * 4 Angelic Wall (10E) * 4
Rock Badger (10E) * 4
Steadfast Guard (10E) * 4
Suntail Hawk (8ED) * 2
Thundering Giant (10E) * 4
# Instant(s)
Disenchant (M20) * 2 Disenchant (M20) * 2
Lightning Bolt (M10) * 4 Lightning Bolt (M10) * 4
Mountain (10E) * 4
Mountain (8ED) * 4
Mountain (M10) * 4
Plains (10E) * 4
Plains (8ED) * 4
Plains (M10) * 4
Rock Badger (10E) * 4
Shatter (8ED) * 2 Shatter (8ED) * 2
Tempest of Light (MRD) * 2 Steadfast Guard (10E) * 4
Suntail Hawk (8ED) * 2
Tempest of Light (MRD) * 2
Thundering Giant (10E) * 4
+404 -214
View File
@@ -3,219 +3,9 @@ author=Wagic Team
name=Commander 2021 name=Commander 2021
orderindex=COM-P.C21 orderindex=COM-P.C21
year=2021-04-23 year=2021-04-23
total=371 total=410
[/meta] [/meta]
[card] [card]
primitive=Myr
id=-519288
rarity=T
[/card]
[card]
primitive=Eldrazi
id=-519281
rarity=T
[/card]
[card]
primitive=Saproling
id=-519276
rarity=T
[/card]
[card]
primitive=Spirit
id=-519265
rarity=T
[/card]
[card]
primitive=Elemental
id=-519246
rarity=T
[/card]
[card]
primitive=Elephant
id=-519242
rarity=T
[/card]
[card]
primitive=Beast
id=-519238
rarity=T
[/card]
[card]
primitive=Elephant
id=-519231
rarity=T
[/card]
[card]
primitive=Hydra
id=-519229
rarity=T
[/card]
[card]
primitive=Insect
id=-519228
rarity=T
[/card]
[card]
primitive=Insect
id=-519227
rarity=T
[/card]
[card]
primitive=Wurm
id=-519225
rarity=T
[/card]
[card]
primitive=Beast
id=-519223
rarity=T
[/card]
[card]
primitive=Beast
id=-519221
rarity=T
[/card]
[card]
primitive=Thopter
id=-519216
rarity=T
[/card]
[card]
primitive=Thopter
id=-519212
rarity=T
[/card]
[card]
primitive=Zombie
id=-519173
rarity=T
[/card]
[card]
primitive=Drake
id=-519166
rarity=T
[/card]
[card]
primitive=Kraken
id=-519162
rarity=T
[/card]
[card]
primitive=Lizard
id=-519161
rarity=T
[/card]
[card]
primitive=Construct
id=-519157
rarity=T
[/card]
[card]
primitive=Boar
id=-519153
rarity=T
[/card]
[card]
primitive=Horror
id=-519129
rarity=T
[/card]
[card]
primitive=Eldrazi
id=-519117
rarity=T
[/card]
[card]
primitive=Golem
id=-518475
rarity=T
[/card]
[card]
primitive=Fractal
id=-518473
rarity=T
[/card]
[card]
primitive=Fractal
id=-518468
rarity=T
[/card]
[card]
primitive=Inkling
id=-518467
rarity=T
[/card]
[card]
primitive=Beast
id=-518465
rarity=T
[/card]
[card]
primitive=Fractal
id=-518463
rarity=T
[/card]
[card]
primitive=Pest
id=-518461
rarity=T
[/card]
[card]
primitive=Fractal
id=-518460
rarity=T
[/card]
[card]
primitive=Fractal
id=-518457
rarity=T
[/card]
[card]
primitive=Demon
id=-518441
rarity=T
[/card]
[card]
primitive=Inkling
id=-518436
rarity=T
[/card]
[card]
primitive=Pest
id=-518432
rarity=T
[/card]
[card]
primitive=Kraken
id=-518429
rarity=T
[/card]
[card]
primitive=Target
id=-518422
rarity=T
[/card]
[card]
primitive=Construct
id=-518411
rarity=T
[/card]
[card]
primitive=Inkling
id=-518410
rarity=T
[/card]
[card]
primitive=Elemental
id=-518310
rarity=T
[/card]
[card]
primitive=Inkling
id=-518308
rarity=T
[/card]
[card]
primitive=Breena, the Demagogue primitive=Breena, the Demagogue
id=518307 id=518307
rarity=M rarity=M
@@ -938,7 +728,7 @@ rarity=C
[card] [card]
primitive=Greed primitive=Greed
id=519180 id=519180
rarity=R rarity=U
[/card] [/card]
[card] [card]
primitive=Infernal Offering primitive=Infernal Offering
@@ -1703,7 +1493,7 @@ rarity=R
[card] [card]
primitive=Lonely Sandbar primitive=Lonely Sandbar
id=519333 id=519333
rarity=C rarity=U
[/card] [/card]
[card] [card]
primitive=Lumbering Falls primitive=Lumbering Falls
@@ -1788,7 +1578,7 @@ rarity=R
[card] [card]
primitive=Secluded Steppe primitive=Secluded Steppe
id=519350 id=519350
rarity=C rarity=U
[/card] [/card]
[card] [card]
primitive=Shivan Reef primitive=Shivan Reef
@@ -1851,6 +1641,406 @@ id=519362
rarity=R rarity=R
[/card] [/card]
[card] [card]
primitive=Breena, the Demagogue
id=521597
rarity=M
[/card]
[card]
primitive=Felisa, Fang of Silverquill
id=521598
rarity=M
[/card]
[card]
primitive=Veyran, Voice of Duality
id=521599
rarity=M
[/card]
[card]
primitive=Zaffai, Thunder Conductor
id=521600
rarity=M
[/card]
[card]
primitive=Gyome, Master Chef
id=521601
rarity=M
[/card]
[card]
primitive=Willowdusk, Essence Seer
id=521602
rarity=M
[/card]
[card]
primitive=Alibou, Ancient Witness
id=521603
rarity=M
[/card]
[card]
primitive=Osgir, the Reconstructor
id=521604
rarity=M
[/card]
[card]
primitive=Adrix and Nev, Twincasters
id=521605
rarity=M
[/card]
[card]
primitive=Esix, Fractal Bloom
id=521606
rarity=M
[/card]
[card]
primitive=Angel of the Ruins
id=521607
rarity=R
[/card]
[card]
primitive=Archaeomancer's Map
id=521608
rarity=R
[/card]
[card]
primitive=Bronze Guardian
id=521609
rarity=R
[/card]
[card]
primitive=Combat Calligrapher
id=521610
rarity=R
[/card]
[card]
primitive=Digsite Engineer
id=521611
rarity=R
[/card]
[card]
primitive=Excavation Technique
id=521612
rarity=R
[/card]
[card]
primitive=Guardian Archon
id=521613
rarity=R
[/card]
[card]
primitive=Losheel, Clockwork Scholar
id=521614
rarity=R
[/card]
[card]
primitive=Monologue Tax
id=521615
rarity=R
[/card]
[card]
primitive=Nils, Discipline Enforcer
id=521616
rarity=R
[/card]
[card]
primitive=Promise of Loyalty
id=521617
rarity=R
[/card]
[card]
primitive=Scholarship Sponsor
id=521618
rarity=R
[/card]
[card]
primitive=Commander's Insight
id=521619
rarity=R
[/card]
[card]
primitive=Curiosity Crafter
id=521620
rarity=R
[/card]
[card]
primitive=Dazzling Sphinx
id=521621
rarity=R
[/card]
[card]
primitive=Deekah, Fractal Theorist
id=521622
rarity=R
[/card]
[card]
primitive=Inspiring Refrain
id=521623
rarity=R
[/card]
[card]
primitive=Muse Vortex
id=521624
rarity=R
[/card]
[card]
primitive=Octavia, Living Thesis
id=521625
rarity=R
[/card]
[card]
primitive=Perplexing Test
id=521626
rarity=R
[/card]
[card]
primitive=Replication Technique
id=521627
rarity=R
[/card]
[card]
primitive=Sly Instigator
id=521628
rarity=R
[/card]
[card]
primitive=Spawning Kraken
id=521629
rarity=R
[/card]
[card]
primitive=Theoretical Duplication
id=521630
rarity=R
[/card]
[card]
primitive=Author of Shadows
id=521631
rarity=R
[/card]
[card]
primitive=Blight Mound
id=521632
rarity=R
[/card]
[card]
primitive=Bold Plagiarist
id=521633
rarity=R
[/card]
[card]
primitive=Cunning Rhetoric
id=521634
rarity=R
[/card]
[card]
primitive=Essence Pulse
id=521635
rarity=R
[/card]
[card]
primitive=Fain, the Broker
id=521636
rarity=R
[/card]
[card]
primitive=Incarnation Technique
id=521637
rarity=R
[/card]
[card]
primitive=Keen Duelist
id=521638
rarity=R
[/card]
[card]
primitive=Marshland Bloodcaster
id=521639
rarity=R
[/card]
[card]
primitive=Stinging Study
id=521640
rarity=R
[/card]
[card]
primitive=Tivash, Gloom Summoner
id=521641
rarity=R
[/card]
[card]
primitive=Veinwitch Coven
id=521642
rarity=R
[/card]
[card]
primitive=Audacious Reshapers
id=521643
rarity=R
[/card]
[card]
primitive=Battlemage's Bracers
id=521644
rarity=R
[/card]
[card]
primitive=Creative Technique
id=521645
rarity=R
[/card]
[card]
primitive=Cursed Mirror
id=521646
rarity=R
[/card]
[card]
primitive=Fiery Encore
id=521647
rarity=R
[/card]
[card]
primitive=Inferno Project
id=521648
rarity=R
[/card]
[card]
primitive=Laelia, the Blade Reforged
id=521649
rarity=R
[/card]
[card]
primitive=Radiant Performer
id=521650
rarity=R
[/card]
[card]
primitive=Rionya, Fire Dancer
id=521651
rarity=R
[/card]
[card]
primitive=Rousing Refrain
id=521652
rarity=R
[/card]
[card]
primitive=Ruin Grinder
id=521653
rarity=R
[/card]
[card]
primitive=Surge to Victory
id=521654
rarity=R
[/card]
[card]
primitive=Blossoming Bogbeast
id=521655
rarity=R
[/card]
[card]
primitive=Ezzaroot Channeler
id=521656
rarity=R
[/card]
[card]
primitive=Fractal Harness
id=521657
rarity=R
[/card]
[card]
primitive=Guardian Augmenter
id=521658
rarity=R
[/card]
[card]
primitive=Healing Technique
id=521659
rarity=R
[/card]
[card]
primitive=Paradox Zone
id=521660
rarity=R
[/card]
[card]
primitive=Pest Infestation
id=521661
rarity=R
[/card]
[card]
primitive=Ruxa, Patient Professor
id=521662
rarity=R
[/card]
[card]
primitive=Sequence Engine
id=521663
rarity=R
[/card]
[card]
primitive=Sproutback Trudge
id=521664
rarity=R
[/card]
[card]
primitive=Trudge Garden
id=521665
rarity=R
[/card]
[card]
primitive=Yedora, Grave Gardener
id=521666
rarity=R
[/card]
[card]
primitive=Inkshield
id=521667
rarity=R
[/card]
[card]
primitive=Oversimplify
id=521668
rarity=R
[/card]
[card]
primitive=Reinterpret
id=521669
rarity=R
[/card]
[card]
primitive=Revival Experiment
id=521670
rarity=R
[/card]
[card]
primitive=Wake the Past
id=521671
rarity=R
[/card]
[card]
primitive=Elementalist's Palette
id=521672
rarity=R
[/card]
[card]
primitive=Geometric Nexus
id=521673
rarity=R
[/card]
[card]
primitive=Tempting Contract
id=521674
rarity=R
[/card]
[card]
primitive=Triplicate Titan
id=521675
rarity=R
[/card]
[card]
primitive=Witch's Clinic
id=521676
rarity=R
[/card]
[card]
primitive=Tranquil Thicket primitive=Tranquil Thicket
id=519363 id=519363
rarity=C rarity=C
File diff suppressed because it is too large Load Diff
+6 -1
View File
@@ -2,7 +2,7 @@
author=Wagic Team author=Wagic Team
name=Dominaria United Commander name=Dominaria United Commander
year=2022-09-09 year=2022-09-09
total=219 total=241
[/meta] [/meta]
[card] [card]
primitive=Dihada, Binder of Wills primitive=Dihada, Binder of Wills
@@ -250,6 +250,11 @@ id=578711
rarity=M rarity=M
[/card] [/card]
[card] [card]
primitive=Jared Carthalion
id=578712
rarity=M
[/card]
[card]
primitive=Historian's Boon primitive=Historian's Boon
id=580393 id=580393
rarity=R rarity=R
+75 -75
View File
@@ -46,7 +46,7 @@ rarity=U
[/card] [/card]
[card] [card]
primitive=Seasoned Cathar primitive=Seasoned Cathar
id=685822 id=685823
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -66,7 +66,7 @@ rarity=M
[/card] [/card]
[card] [card]
primitive=Avacyn, the Purifier primitive=Avacyn, the Purifier
id=685826 id=685827
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -86,7 +86,7 @@ rarity=R
[/card] [/card]
[card] [card]
primitive=Brisela, Voice of Nightmares primitive=Brisela, Voice of Nightmares
id=686144 id=686145
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -181,7 +181,7 @@ rarity=C
[/card] [/card]
[card] [card]
primitive=Luminous Phantom primitive=Luminous Phantom
id=685848 id=685849
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -256,7 +256,7 @@ rarity=U
[/card] [/card]
[card] [card]
primitive=Incited Rabble primitive=Incited Rabble
id=685863 id=685864
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -266,7 +266,7 @@ rarity=U
[/card] [/card]
[card] [card]
primitive=Twinblade Invocation primitive=Twinblade Invocation
id=685865 id=685866
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -291,7 +291,7 @@ rarity=R
[/card] [/card]
[card] [card]
primitive=Wedding Festivity primitive=Wedding Festivity
id=685870 id=685871
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -301,7 +301,7 @@ rarity=U
[/card] [/card]
[card] [card]
primitive=Perfected Form primitive=Perfected Form
id=685872 id=685873
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -316,7 +316,7 @@ rarity=U
[/card] [/card]
[card] [card]
primitive=Biolume Serpent primitive=Biolume Serpent
id=685875 id=685876
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -341,7 +341,7 @@ rarity=U
[/card] [/card]
[card] [card]
primitive=Ghostly Castigator primitive=Ghostly Castigator
id=685880 id=685881
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -356,7 +356,7 @@ rarity=C
[/card] [/card]
[card] [card]
primitive=Insectile Aberration primitive=Insectile Aberration
id=685883 id=685884
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -371,7 +371,7 @@ rarity=R
[/card] [/card]
[card] [card]
primitive=Final Iteration primitive=Final Iteration
id=685886 id=685887
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -401,7 +401,7 @@ rarity=U
[/card] [/card]
[card] [card]
primitive=Grisly Anglerfish primitive=Grisly Anglerfish
id=685892 id=685893
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -431,7 +431,7 @@ rarity=C
[/card] [/card]
[card] [card]
primitive=Lanterns' Lift primitive=Lanterns' Lift
id=685898 id=685899
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -501,7 +501,7 @@ rarity=U
[/card] [/card]
[card] [card]
primitive=Cipherbound Spirit primitive=Cipherbound Spirit
id=685912 id=685913
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -536,7 +536,7 @@ rarity=R
[/card] [/card]
[card] [card]
primitive=Awoken Horror primitive=Awoken Horror
id=685919 id=685920
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -576,7 +576,7 @@ rarity=M
[/card] [/card]
[card] [card]
primitive=Lord of Lineage primitive=Lord of Lineage
id=685927 id=685928
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -616,7 +616,7 @@ rarity=C
[/card] [/card]
[card] [card]
primitive=Depraved Harvester primitive=Depraved Harvester
id=685935 id=685936
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -631,7 +631,7 @@ rarity=C
[/card] [/card]
[card] [card]
primitive=Awoken Demon primitive=Awoken Demon
id=685938 id=685939
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -701,7 +701,7 @@ rarity=R
[/card] [/card]
[card] [card]
primitive=Deluge of the Dead primitive=Deluge of the Dead
id=685952 id=685953
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -721,7 +721,7 @@ rarity=C
[/card] [/card]
[card] [card]
primitive=Chittering Host primitive=Chittering Host
id=686143 id=686144
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -751,7 +751,7 @@ rarity=U
[/card] [/card]
[card] [card]
primitive=Bloodsoaked Reveler primitive=Bloodsoaked Reveler
id=685961 id=685962
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -806,7 +806,7 @@ rarity=R
[/card] [/card]
[card] [card]
primitive=Bloodbat Summoner primitive=Bloodbat Summoner
id=685972 id=685973
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -871,7 +871,7 @@ rarity=C
[/card] [/card]
[card] [card]
primitive=Conduit of Emrakul primitive=Conduit of Emrakul
id=685985 id=685986
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -906,7 +906,7 @@ rarity=U
[/card] [/card]
[card] [card]
primitive=Vildin-Pack Alpha primitive=Vildin-Pack Alpha
id=685992 id=685993
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -916,7 +916,7 @@ rarity=R
[/card] [/card]
[card] [card]
primitive=Hanweir, the Writhing Township primitive=Hanweir, the Writhing Township
id=686145 id=686146
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -926,7 +926,7 @@ rarity=C
[/card] [/card]
[card] [card]
primitive=Bane of Hanweir primitive=Bane of Hanweir
id=685995 id=685996
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -946,7 +946,7 @@ rarity=R
[/card] [/card]
[card] [card]
primitive=Terror of Kruin Pass primitive=Terror of Kruin Pass
id=685999 id=686000
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -1001,7 +1001,7 @@ rarity=U
[/card] [/card]
[card] [card]
primitive=Erupting Dreadwolf primitive=Erupting Dreadwolf
id=686010 id=686011
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -1046,7 +1046,7 @@ rarity=C
[/card] [/card]
[card] [card]
primitive=Moonrise Intruder primitive=Moonrise Intruder
id=686019 id=686020
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -1121,7 +1121,7 @@ rarity=U
[/card] [/card]
[card] [card]
primitive=Krallenhorde Howler primitive=Krallenhorde Howler
id=686034 id=686035
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -1146,7 +1146,7 @@ rarity=M
[/card] [/card]
[card] [card]
primitive=Garruk, the Veil-Cursed primitive=Garruk, the Veil-Cursed
id=686039 id=686040
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -1181,7 +1181,7 @@ rarity=C
[/card] [/card]
[card] [card]
primitive=Timber Shredder primitive=Timber Shredder
id=686046 id=686047
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -1206,7 +1206,7 @@ rarity=R
[/card] [/card]
[card] [card]
primitive=Howlpack Alpha primitive=Howlpack Alpha
id=686051 id=686052
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -1236,7 +1236,7 @@ rarity=C
[/card] [/card]
[card] [card]
primitive=Moonscarred Werewolf primitive=Moonscarred Werewolf
id=686057 id=686058
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -1251,7 +1251,7 @@ rarity=U
[/card] [/card]
[card] [card]
primitive=Howling Chorus primitive=Howling Chorus
id=686060 id=686061
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -1306,7 +1306,7 @@ rarity=C
[/card] [/card]
[card] [card]
primitive=Howlpack of Estwald primitive=Howlpack of Estwald
id=686071 id=686072
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -1341,7 +1341,7 @@ rarity=M
[/card] [/card]
[card] [card]
primitive=Arlinn, Embraced by the Moon primitive=Arlinn, Embraced by the Moon
id=686078 id=686079
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -1401,7 +1401,7 @@ rarity=R
[/card] [/card]
[card] [card]
primitive=Ravager of the Fells primitive=Ravager of the Fells
id=686090 id=686091
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -1486,7 +1486,7 @@ rarity=U
[/card] [/card]
[card] [card]
primitive=Chalice of Death primitive=Chalice of Death
id=686107 id=686108
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -1506,7 +1506,7 @@ rarity=U
[/card] [/card]
[card] [card]
primitive=Aurora of Emrakul primitive=Aurora of Emrakul
id=686111 id=686112
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -1536,7 +1536,7 @@ rarity=C
[/card] [/card]
[card] [card]
primitive=Scrounged Scythe primitive=Scrounged Scythe
id=686117 id=686118
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -1561,7 +1561,7 @@ rarity=U
[/card] [/card]
[card] [card]
primitive=Ashmouth Blade primitive=Ashmouth Blade
id=686122 id=686123
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -1656,7 +1656,7 @@ rarity=R
[/card] [/card]
[card] [card]
primitive=Ormendahl, Profane Prince primitive=Ormendahl, Profane Prince
id=686141 id=686142
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -1841,7 +1841,7 @@ rarity=U
[/card] [/card]
[card] [card]
primitive=Krallenhorde Howler primitive=Krallenhorde Howler
id=688901 id=688902
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -1851,7 +1851,7 @@ rarity=M
[/card] [/card]
[card] [card]
primitive=Arlinn, Embraced by the Moon primitive=Arlinn, Embraced by the Moon
id=688903 id=688904
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -1861,7 +1861,7 @@ rarity=R
[/card] [/card]
[card] [card]
primitive=Ravager of the Fells primitive=Ravager of the Fells
id=688905 id=688906
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -1876,7 +1876,7 @@ rarity=M
[/card] [/card]
[card] [card]
primitive=Lord of Lineage primitive=Lord of Lineage
id=688878 id=688879
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -2486,7 +2486,7 @@ rarity=U
[/card] [/card]
[card] [card]
primitive=Seasoned Cathar primitive=Seasoned Cathar
id=687803 id=687804
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -2496,7 +2496,7 @@ rarity=M
[/card] [/card]
[card] [card]
primitive=Avacyn, the Purifier primitive=Avacyn, the Purifier
id=687805 id=687806
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -2506,7 +2506,7 @@ rarity=C
[/card] [/card]
[card] [card]
primitive=Luminous Phantom primitive=Luminous Phantom
id=687807 id=687808
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -2516,7 +2516,7 @@ rarity=U
[/card] [/card]
[card] [card]
primitive=Incited Rabble primitive=Incited Rabble
id=687809 id=687810
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -2526,7 +2526,7 @@ rarity=U
[/card] [/card]
[card] [card]
primitive=Twinblade Invocation primitive=Twinblade Invocation
id=687811 id=687812
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -2536,7 +2536,7 @@ rarity=R
[/card] [/card]
[card] [card]
primitive=Wedding Festivity primitive=Wedding Festivity
id=687813 id=687814
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -2546,7 +2546,7 @@ rarity=U
[/card] [/card]
[card] [card]
primitive=Perfected Form primitive=Perfected Form
id=687815 id=687816
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -2556,7 +2556,7 @@ rarity=U
[/card] [/card]
[card] [card]
primitive=Biolume Serpent primitive=Biolume Serpent
id=687817 id=687818
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -2566,7 +2566,7 @@ rarity=U
[/card] [/card]
[card] [card]
primitive=Ghostly Castigator primitive=Ghostly Castigator
id=687819 id=687820
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -2576,7 +2576,7 @@ rarity=C
[/card] [/card]
[card] [card]
primitive=Insectile Aberration primitive=Insectile Aberration
id=687821 id=687822
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -2586,7 +2586,7 @@ rarity=U
[/card] [/card]
[card] [card]
primitive=Grisly Anglerfish primitive=Grisly Anglerfish
id=687823 id=687824
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -2596,7 +2596,7 @@ rarity=U
[/card] [/card]
[card] [card]
primitive=Cipherbound Spirit primitive=Cipherbound Spirit
id=687825 id=687826
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -2606,7 +2606,7 @@ rarity=R
[/card] [/card]
[card] [card]
primitive=Awoken Horror primitive=Awoken Horror
id=687827 id=687828
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -2616,7 +2616,7 @@ rarity=M
[/card] [/card]
[card] [card]
primitive=Lord of Lineage primitive=Lord of Lineage
id=687829 id=687830
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -2626,7 +2626,7 @@ rarity=C
[/card] [/card]
[card] [card]
primitive=Awoken Demon primitive=Awoken Demon
id=687831 id=687832
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -2636,7 +2636,7 @@ rarity=U
[/card] [/card]
[card] [card]
primitive=Bloodsoaked Reveler primitive=Bloodsoaked Reveler
id=687833 id=687834
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -2646,7 +2646,7 @@ rarity=U
[/card] [/card]
[card] [card]
primitive=Vildin-Pack Alpha primitive=Vildin-Pack Alpha
id=687835 id=687836
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -2656,7 +2656,7 @@ rarity=U
[/card] [/card]
[card] [card]
primitive=Erupting Dreadwolf primitive=Erupting Dreadwolf
id=687837 id=687838
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -2666,7 +2666,7 @@ rarity=C
[/card] [/card]
[card] [card]
primitive=Moonrise Intruder primitive=Moonrise Intruder
id=687839 id=687840
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -2676,7 +2676,7 @@ rarity=U
[/card] [/card]
[card] [card]
primitive=Krallenhorde Howler primitive=Krallenhorde Howler
id=687841 id=687842
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -2686,7 +2686,7 @@ rarity=C
[/card] [/card]
[card] [card]
primitive=Moonscarred Werewolf primitive=Moonscarred Werewolf
id=687843 id=687844
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -2696,7 +2696,7 @@ rarity=U
[/card] [/card]
[card] [card]
primitive=Howling Chorus primitive=Howling Chorus
id=687845 id=687846
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -2706,7 +2706,7 @@ rarity=R
[/card] [/card]
[card] [card]
primitive=Ravager of the Fells primitive=Ravager of the Fells
id=687847 id=687848
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -2716,7 +2716,7 @@ rarity=U
[/card] [/card]
[card] [card]
primitive=Chalice of Death primitive=Chalice of Death
id=687849 id=687850
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -2726,7 +2726,7 @@ rarity=U
[/card] [/card]
[card] [card]
primitive=Aurora of Emrakul primitive=Aurora of Emrakul
id=687851 id=687852
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -2736,7 +2736,7 @@ rarity=U
[/card] [/card]
[card] [card]
primitive=Ashmouth Blade primitive=Ashmouth Blade
id=687853 id=687854
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -2746,7 +2746,7 @@ rarity=R
[/card] [/card]
[card] [card]
primitive=Ormendahl, Profane Prince primitive=Ormendahl, Profane Prince
id=687855 id=687856
rarity=T rarity=T
[/card] [/card]
[card] [card]
+2 -1
View File
@@ -4,7 +4,8 @@ name=Tales of Middle-earth Commander
year=2023-06-23 year=2023-06-23
total=592 total=592
[/meta] [/meta]
-primitive=The Monarch [card]
primitive=The Monarch
id=-999905 id=-999905
rarity=T rarity=T
[/card] [/card]
+37 -42
View File
@@ -2,7 +2,7 @@
author=Wagic Team author=Wagic Team
name=Modern Horizons 3 name=Modern Horizons 3
year=2024-06-14 year=2024-06-14
total=558 total=560
[/meta] [/meta]
[card] [card]
primitive=Breaker of Creation primitive=Breaker of Creation
@@ -980,12 +980,7 @@ id=662347
rarity=C rarity=C
[/card] [/card]
[card] [card]
primitive=Ondu Knotmaster primitive=Ondu Knotmaster // Throw a Line
id=662348
rarity=U
[/card]
[card]
primitive=Throw a Line
id=662348 id=662348
rarity=U rarity=U
[/card] [/card]
@@ -1197,7 +1192,7 @@ rarity=M
[card] [card]
primitive=Ajani, Nacatl Avenger primitive=Ajani, Nacatl Avenger
id=661754 id=661754
rarity=M rarity=T
[/card] [/card]
[card] [card]
primitive=Razorgrass Ambush primitive=Razorgrass Ambush
@@ -1207,7 +1202,7 @@ rarity=U
[card] [card]
primitive=Razorgrass Field primitive=Razorgrass Field
id=661756 id=661756
rarity=U rarity=T
[/card] [/card]
[card] [card]
primitive=Witch Enchanter primitive=Witch Enchanter
@@ -1217,7 +1212,7 @@ rarity=U
[card] [card]
primitive=Witch-Blessed Meadow primitive=Witch-Blessed Meadow
id=661758 id=661758
rarity=U rarity=T
[/card] [/card]
[card] [card]
primitive=Hydroelectric Specimen primitive=Hydroelectric Specimen
@@ -1227,7 +1222,7 @@ rarity=U
[card] [card]
primitive=Hydroelectric Laboratory primitive=Hydroelectric Laboratory
id=661760 id=661760
rarity=U rarity=T
[/card] [/card]
[card] [card]
primitive=Sink into Stupor primitive=Sink into Stupor
@@ -1237,7 +1232,7 @@ rarity=U
[card] [card]
primitive=Soporific Springs primitive=Soporific Springs
id=661762 id=661762
rarity=U rarity=T
[/card] [/card]
[card] [card]
primitive=Tamiyo, Inquisitive Student primitive=Tamiyo, Inquisitive Student
@@ -1247,7 +1242,7 @@ rarity=M
[card] [card]
primitive=Tamiyo, Seasoned Scholar primitive=Tamiyo, Seasoned Scholar
id=661764 id=661764
rarity=M rarity=T
[/card] [/card]
[card] [card]
primitive=Boggart Trawler primitive=Boggart Trawler
@@ -1257,7 +1252,7 @@ rarity=U
[card] [card]
primitive=Boggart Bog primitive=Boggart Bog
id=661766 id=661766
rarity=U rarity=T
[/card] [/card]
[card] [card]
primitive=Fell the Profane primitive=Fell the Profane
@@ -1267,7 +1262,7 @@ rarity=U
[card] [card]
primitive=Fell Mire primitive=Fell Mire
id=661768 id=661768
rarity=U rarity=T
[/card] [/card]
[card] [card]
primitive=Sorin of House Markov primitive=Sorin of House Markov
@@ -1277,7 +1272,7 @@ rarity=M
[card] [card]
primitive=Sorin, Ravenous Neonate primitive=Sorin, Ravenous Neonate
id=661770 id=661770
rarity=M rarity=T
[/card] [/card]
[card] [card]
primitive=Pinnacle Monk primitive=Pinnacle Monk
@@ -1287,7 +1282,7 @@ rarity=U
[card] [card]
primitive=Mystic Peak primitive=Mystic Peak
id=661772 id=661772
rarity=U rarity=T
[/card] [/card]
[card] [card]
primitive=Ral, Monsoon Mage primitive=Ral, Monsoon Mage
@@ -1297,7 +1292,7 @@ rarity=M
[card] [card]
primitive=Ral, Leyline Prodigy primitive=Ral, Leyline Prodigy
id=661774 id=661774
rarity=M rarity=T
[/card] [/card]
[card] [card]
primitive=Sundering Eruption primitive=Sundering Eruption
@@ -1307,7 +1302,7 @@ rarity=U
[card] [card]
primitive=Volcanic Fissure primitive=Volcanic Fissure
id=661776 id=661776
rarity=U rarity=T
[/card] [/card]
[card] [card]
primitive=Bridgeworks Battle primitive=Bridgeworks Battle
@@ -1317,7 +1312,7 @@ rarity=U
[card] [card]
primitive=Tanglespan Bridgeworks primitive=Tanglespan Bridgeworks
id=661778 id=661778
rarity=U rarity=T
[/card] [/card]
[card] [card]
primitive=Disciple of Freyalise primitive=Disciple of Freyalise
@@ -1327,7 +1322,7 @@ rarity=U
[card] [card]
primitive=Garden of Freyalise primitive=Garden of Freyalise
id=661780 id=661780
rarity=U rarity=T
[/card] [/card]
[card] [card]
primitive=Grist, Voracious Larva primitive=Grist, Voracious Larva
@@ -1337,7 +1332,7 @@ rarity=M
[card] [card]
primitive=Grist, the Plague Swarm primitive=Grist, the Plague Swarm
id=661782 id=661782
rarity=M rarity=T
[/card] [/card]
[card] [card]
primitive=Bloodsoaked Insight primitive=Bloodsoaked Insight
@@ -1347,7 +1342,7 @@ rarity=U
[card] [card]
primitive=Sanguine Morass primitive=Sanguine Morass
id=661784 id=661784
rarity=U rarity=T
[/card] [/card]
[card] [card]
primitive=Drowner of Truth primitive=Drowner of Truth
@@ -1357,7 +1352,7 @@ rarity=U
[card] [card]
primitive=Drowned Jungle primitive=Drowned Jungle
id=661786 id=661786
rarity=U rarity=T
[/card] [/card]
[card] [card]
primitive=Glasswing Grace primitive=Glasswing Grace
@@ -1367,7 +1362,7 @@ rarity=U
[card] [card]
primitive=Age-Graced Chapel primitive=Age-Graced Chapel
id=661788 id=661788
rarity=U rarity=T
[/card] [/card]
[card] [card]
primitive=Legion Leadership primitive=Legion Leadership
@@ -1377,7 +1372,7 @@ rarity=U
[card] [card]
primitive=Legion Stronghold primitive=Legion Stronghold
id=661790 id=661790
rarity=U rarity=T
[/card] [/card]
[card] [card]
primitive=Revitalizing Repast primitive=Revitalizing Repast
@@ -1387,7 +1382,7 @@ rarity=U
[card] [card]
primitive=Old-Growth Grove primitive=Old-Growth Grove
id=661792 id=661792
rarity=U rarity=T
[/card] [/card]
[card] [card]
primitive=Rush of Inspiration primitive=Rush of Inspiration
@@ -1397,7 +1392,7 @@ rarity=U
[card] [card]
primitive=Crackling Falls primitive=Crackling Falls
id=661794 id=661794
rarity=U rarity=T
[/card] [/card]
[card] [card]
primitive=Strength of the Harvest primitive=Strength of the Harvest
@@ -1407,7 +1402,7 @@ rarity=U
[card] [card]
primitive=Haven of the Harvest primitive=Haven of the Harvest
id=661796 id=661796
rarity=U rarity=T
[/card] [/card]
[card] [card]
primitive=Stump Stomp primitive=Stump Stomp
@@ -1417,7 +1412,7 @@ rarity=U
[card] [card]
primitive=Burnwillow Clearing primitive=Burnwillow Clearing
id=661798 id=661798
rarity=U rarity=T
[/card] [/card]
[card] [card]
primitive=Suppression Ray primitive=Suppression Ray
@@ -1427,7 +1422,7 @@ rarity=U
[card] [card]
primitive=Orderly Plaza primitive=Orderly Plaza
id=661800 id=661800
rarity=U rarity=T
[/card] [/card]
[card] [card]
primitive=Waterlogged Teachings primitive=Waterlogged Teachings
@@ -1437,7 +1432,7 @@ rarity=U
[card] [card]
primitive=Inundated Archive primitive=Inundated Archive
id=661802 id=661802
rarity=U rarity=T
[/card] [/card]
[card] [card]
primitive=Angel of the Ruins primitive=Angel of the Ruins
@@ -2346,8 +2341,8 @@ rarity=M
[/card] [/card]
[card] [card]
primitive=Ajani, Nacatl Avenger primitive=Ajani, Nacatl Avenger
id=661309 id=661310
rarity=M rarity=T
[/card] [/card]
[card] [card]
primitive=Tamiyo, Inquisitive Student primitive=Tamiyo, Inquisitive Student
@@ -2356,8 +2351,8 @@ rarity=M
[/card] [/card]
[card] [card]
primitive=Tamiyo, Seasoned Scholar primitive=Tamiyo, Seasoned Scholar
id=661311 id=661312
rarity=M rarity=T
[/card] [/card]
[card] [card]
primitive=Sorin of House Markov primitive=Sorin of House Markov
@@ -2366,8 +2361,8 @@ rarity=M
[/card] [/card]
[card] [card]
primitive=Sorin, Ravenous Neonate primitive=Sorin, Ravenous Neonate
id=661313 id=661314
rarity=M rarity=T
[/card] [/card]
[card] [card]
primitive=Ral, Monsoon Mage primitive=Ral, Monsoon Mage
@@ -2376,8 +2371,8 @@ rarity=M
[/card] [/card]
[card] [card]
primitive=Ral, Leyline Prodigy primitive=Ral, Leyline Prodigy
id=661315 id=661316
rarity=M rarity=T
[/card] [/card]
[card] [card]
primitive=Grist, Voracious Larva primitive=Grist, Voracious Larva
@@ -2386,8 +2381,8 @@ rarity=M
[/card] [/card]
[card] [card]
primitive=Grist, the Plague Swarm primitive=Grist, the Plague Swarm
id=661317 id=661318
rarity=M rarity=T
[/card] [/card]
[card] [card]
primitive=Argent Dais primitive=Argent Dais
+596 -226
View File
@@ -3,204 +3,9 @@ author=Wagic Team
name=Strixhaven: School of Mages name=Strixhaven: School of Mages
orderindex=EXP-ZZI.STX orderindex=EXP-ZZI.STX
year=2021-04-23 year=2021-04-23
total=340 total=415
[/meta] [/meta]
[card] [card]
primitive=Pest
id=-513734
rarity=T
[/card]
[card]
primitive=Spirit
id=-513728
rarity=T
[/card]
[card]
primitive=Inkling
id=-513722
rarity=T
[/card]
[card]
primitive=Spirit
id=-513712
rarity=T
[/card]
[card]
primitive=Pest
id=-513703
rarity=T
[/card]
[card]
primitive=Fractal
id=-513697
rarity=T
[/card]
[card]
primitive=Spirit
id=-513696
rarity=T
[/card]
[card]
primitive=Elemental
id=-513695
rarity=T
[/card]
[card]
primitive=Spirit
id=-513692
rarity=T
[/card]
[card]
primitive=Spirit
id=-513691
rarity=T
[/card]
[card]
primitive=Fractal
id=-513688
rarity=T
[/card]
[card]
primitive=Inkling
id=-513687
rarity=T
[/card]
[card]
primitive=Fractal
id=-513679
rarity=T
[/card]
[card]
primitive=Elemental
id=-513675
rarity=T
[/card]
[card]
primitive=Elemental
id=-513674
rarity=T
[/card]
[card]
primitive=Elemental
id=-513673
rarity=T
[/card]
[card]
primitive=Inkling
id=-513672
rarity=T
[/card]
[card]
primitive=Treasure
id=-513663
rarity=T
[/card]
[card]
primitive=Fractal
id=-513660
rarity=T
[/card]
[card]
primitive=Inkling
id=-513659
rarity=T
[/card]
[card]
primitive=Fractal
id=-513656
rarity=T
[/card]
[card]
primitive=Pest
id=-513655
rarity=T
[/card]
[card]
primitive=Pest
id=-513652
rarity=T
[/card]
[card]
primitive=Pest
id=-513638
rarity=T
[/card]
[card]
primitive=Fractal
id=-513634
rarity=T
[/card]
[card]
primitive=Pest
id=-513617
rarity=T
[/card]
[card]
primitive=Fractal
id=-513613
rarity=T
[/card]
[card]
primitive=Pest
id=-513602
rarity=T
[/card]
[card]
primitive=Spirit
id=-513586
rarity=T
[/card]
[card]
primitive=Spirit
id=-513585
rarity=T
[/card]
[card]
primitive=Inkling
id=-513566
rarity=T
[/card]
[card]
primitive=Pest
id=-513563
rarity=T
[/card]
[card]
primitive=Pest
id=-513550
rarity=T
[/card]
[card]
primitive=Pest
id=-513543
rarity=T
[/card]
[card]
primitive=Fractal
id=-513529
rarity=T
[/card]
[card]
primitive=Elemental
id=-513528
rarity=T
[/card]
[card]
primitive=Elemental
id=-513525
rarity=T
[/card]
[card]
primitive=Spirit
id=-513502
rarity=T
[/card]
[card]
primitive=Inkling
id=-513481
rarity=T
[/card]
[card]
primitive=Environmental Sciences primitive=Environmental Sciences
id=513477 id=513477
rarity=C rarity=C
@@ -937,42 +742,42 @@ rarity=R
[/card] [/card]
[card] [card]
primitive=Augmenter Pugilist primitive=Augmenter Pugilist
id=513624 id=513625
rarity=R rarity=R
[/card] [/card]
[card] [card]
primitive=Echoing Equation primitive=Echoing Equation
id=513625 id=513624
rarity=T rarity=T
[/card] [/card]
[card] [card]
primitive=Blex, Vexing Pest primitive=Blex, Vexing Pest
id=513626 id=513627
rarity=M rarity=M
[/card] [/card]
[card] [card]
primitive=Search for Blex primitive=Search for Blex
id=513627 id=513626
rarity=T rarity=T
[/card] [/card]
[card] [card]
primitive=Extus, Oriq Overlord primitive=Extus, Oriq Overlord
id=513628 id=516912
rarity=M rarity=M
[/card] [/card]
[card] [card]
primitive=Awaken the Blood Avatar primitive=Awaken the Blood Avatar
id=513629 id=516913
rarity=T rarity=T
[/card] [/card]
[card] [card]
primitive=Flamescroll Celebrant primitive=Flamescroll Celebrant
id=513630 id=513631
rarity=R rarity=R
[/card] [/card]
[card] [card]
primitive=Revel in Silence primitive=Revel in Silence
id=513631 id=513630
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -987,52 +792,52 @@ rarity=T
[/card] [/card]
[card] [card]
primitive=Kianne, Dean of Substance primitive=Kianne, Dean of Substance
id=513634 id=516918
rarity=R rarity=R
[/card] [/card]
[card] [card]
primitive=Imbraham, Dean of Theory primitive=Imbraham, Dean of Theory
id=513635 id=516919
rarity=T rarity=T
[/card] [/card]
[card] [card]
primitive=Mila, Crafty Companion primitive=Mila, Crafty Companion
id=513636 id=516789
rarity=M rarity=M
[/card] [/card]
[card] [card]
primitive=Lukka, Wayward Bonder primitive=Lukka, Wayward Bonder
id=513637 id=516790
rarity=T rarity=T
[/card] [/card]
[card] [card]
primitive=Pestilent Cauldron primitive=Pestilent Cauldron
id=513638 id=516920
rarity=R rarity=R
[/card] [/card]
[card] [card]
primitive=Restorative Burst primitive=Restorative Burst
id=513639 id=516921
rarity=T rarity=T
[/card] [/card]
[card] [card]
primitive=Plargg, Dean of Chaos primitive=Plargg, Dean of Chaos
id=513640 id=516922
rarity=R rarity=R
[/card] [/card]
[card] [card]
primitive=Augusta, Dean of Order primitive=Augusta, Dean of Order
id=513641 id=516923
rarity=T rarity=T
[/card] [/card]
[card] [card]
primitive=Rowan, Scholar of Sparks primitive=Rowan, Scholar of Sparks
id=513642 id=516792
rarity=M rarity=M
[/card] [/card]
[card] [card]
primitive=Will, Scholar of Frost primitive=Will, Scholar of Frost
id=513643 id=516791
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -1057,12 +862,12 @@ rarity=T
[/card] [/card]
[card] [card]
primitive=Torrent Sculptor primitive=Torrent Sculptor
id=513648 id=516928
rarity=R rarity=R
[/card] [/card]
[card] [card]
primitive=Flamethrower Sonata primitive=Flamethrower Sonata
id=513649 id=516929
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -1656,52 +1461,617 @@ id=513767
rarity=C rarity=C
[/card] [/card]
[card] [card]
primitive=Professor Onyx
id=516788
rarity=M
[/card]
[card]
primitive=Mila, Crafty Companion
id=513636
rarity=M
[/card]
[card]
primitive=Lukka, Wayward Bonder
id=513637
rarity=T
[/card]
[card]
primitive=Rowan, Scholar of Sparks
id=513643
rarity=M
[/card]
[card]
primitive=Will, Scholar of Frost
id=513642
rarity=T
[/card]
[card]
primitive=Kasmina, Enigma Sage
id=516793
rarity=M
[/card]
[card]
primitive=Shadrix Silverquill
id=517441
rarity=M
[/card]
[card]
primitive=Galazeth Prismari
id=517442
rarity=M
[/card]
[card]
primitive=Beledros Witherbloom
id=517443
rarity=M
[/card]
[card]
primitive=Velomachus Lorehold
id=517444
rarity=M
[/card]
[card]
primitive=Tanazir Quandrix
id=517445
rarity=M
[/card]
[card]
primitive=Mascot Exhibition
id=516871
rarity=M
[/card]
[card]
primitive=Wandering Archaic
id=516872
rarity=R
[/card]
[card]
primitive=Explore the Vastlands
id=516873
rarity=T
[/card]
[card]
primitive=Academic Probation
id=516874
rarity=R
[/card]
[card]
primitive=Devastating Mastery
id=516875
rarity=R
[/card]
[card]
primitive=Elite Spellbinder
id=516876
rarity=R
[/card]
[card]
primitive=Leonin Lightscribe
id=516877
rarity=R
[/card]
[card]
primitive=Mavinda, Students' Advocate
id=516878
rarity=M
[/card]
[card]
primitive=Semester's End
id=516879
rarity=R
[/card]
[card]
primitive=Sparring Regimen
id=516880
rarity=R
[/card]
[card]
primitive=Strict Proctor
id=516881
rarity=R
[/card]
[card]
primitive=Archmage Emeritus
id=516882
rarity=R
[/card]
[card]
primitive=Dream Strix
id=516883
rarity=R
[/card]
[card]
primitive=Ingenious Mastery
id=516884
rarity=R
[/card]
[card]
primitive=Multiple Choice
id=516885
rarity=R
[/card]
[card]
primitive=Teachings of the Archaics
id=516886
rarity=R
[/card]
[card]
primitive=Tempted by the Oriq
id=516887
rarity=R
[/card]
[card]
primitive=Baleful Mastery
id=516888
rarity=R
[/card]
[card]
primitive=Callous Bloodmage
id=516889
rarity=R
[/card]
[card]
primitive=Confront the Past
id=516890
rarity=R
[/card]
[card]
primitive=Oriq Loremage
id=516891
rarity=R
[/card]
[card]
primitive=Poet's Quill
id=516892
rarity=R
[/card]
[card]
primitive=Sedgemoor Witch
id=516893
rarity=R
[/card]
[card]
primitive=Conspiracy Theorist
id=516894
rarity=R
[/card]
[card]
primitive=Crackle with Power
id=516895
rarity=M
[/card]
[card]
primitive=Draconic Intervention
id=516896
rarity=R
[/card]
[card]
primitive=Efreet Flamepainter
id=516897
rarity=R
[/card]
[card]
primitive=Fervent Mastery
id=516898
rarity=R
[/card]
[card]
primitive=Illuminate History
id=516899
rarity=R
[/card]
[card]
primitive=Retriever Phoenix
id=516900
rarity=R
[/card]
[card]
primitive=Accomplished Alchemist
id=516901
rarity=R
[/card]
[card]
primitive=Basic Conjuration
id=516902
rarity=R
[/card]
[card]
primitive=Dragonsguard Elite
id=516903
rarity=R
[/card]
[card]
primitive=Ecological Appreciation
id=516904
rarity=M
[/card]
[card]
primitive=Exponential Growth
id=516905
rarity=R
[/card]
[card]
primitive=Gnarled Professor
id=516906
rarity=R
[/card]
[card]
primitive=Verdant Mastery
id=516907
rarity=R
[/card]
[card]
primitive=Augmenter Pugilist
id=516909
rarity=R
[/card]
[card]
primitive=Echoing Equation
id=516908
rarity=T
[/card]
[card]
primitive=Blex, Vexing Pest
id=516911
rarity=M
[/card]
[card]
primitive=Search for Blex
id=516910
rarity=T
[/card]
[card]
primitive=Extus, Oriq Overlord
id=513628
rarity=M
[/card]
[card]
primitive=Awaken the Blood Avatar
id=513629
rarity=T
[/card]
[card]
primitive=Flamescroll Celebrant
id=516915
rarity=R
[/card]
[card]
primitive=Revel in Silence
id=516914
rarity=T
[/card]
[card]
primitive=Jadzi, Oracle of Arcavios
id=516916
rarity=M
[/card]
[card]
primitive=Journey to the Oracle
id=516917
rarity=T
[/card]
[card]
primitive=Kianne, Dean of Substance
id=513634
rarity=R
[/card]
[card]
primitive=Imbraham, Dean of Theory
id=513635
rarity=T
[/card]
[card]
primitive=Pestilent Cauldron
id=513638
rarity=R
[/card]
[card]
primitive=Restorative Burst
id=513639
rarity=T
[/card]
[card]
primitive=Plargg, Dean of Chaos
id=513640
rarity=R
[/card]
[card]
primitive=Augusta, Dean of Order
id=513641
rarity=T
[/card]
[card]
primitive=Selfless Glyphweaver
id=516924
rarity=R
[/card]
[card]
primitive=Deadly Vanity
id=516925
rarity=T
[/card]
[card]
primitive=Shaile, Dean of Radiance
id=516926
rarity=R
[/card]
[card]
primitive=Embrose, Dean of Shadow
id=516927
rarity=T
[/card]
[card]
primitive=Torrent Sculptor
id=513648
rarity=R
[/card]
[card]
primitive=Flamethrower Sonata
id=513649
rarity=T
[/card]
[card]
primitive=Uvilda, Dean of Perfection
id=516930
rarity=R
[/card]
[card]
primitive=Nassari, Dean of Expression
id=516931
rarity=T
[/card]
[card]
primitive=Valentin, Dean of the Vein
id=516932
rarity=R
[/card]
[card]
primitive=Lisette, Dean of the Root
id=516933
rarity=T
[/card]
[card]
primitive=Blade Historian
id=516934
rarity=R
[/card]
[card]
primitive=Blot Out the Sky
id=516935
rarity=M
[/card]
[card]
primitive=Body of Research
id=516936
rarity=M
[/card]
[card]
primitive=Culling Ritual
id=516937
rarity=R
[/card]
[card]
primitive=Culmination of Studies
id=516938
rarity=R
[/card]
[card]
primitive=Daemogoth Titan
id=516939
rarity=R
[/card]
[card]
primitive=Double Major
id=516940
rarity=R
[/card]
[card]
primitive=Dramatic Finale
id=516941
rarity=R
[/card]
[card]
primitive=Elemental Expressionist
id=516942
rarity=R
[/card]
[card]
primitive=Harness Infinity
id=516943
rarity=M
[/card]
[card]
primitive=Hofri Ghostforge
id=516944
rarity=M
[/card]
[card]
primitive=Lorehold Command
id=516945
rarity=R
[/card]
[card]
primitive=Magma Opus
id=516946
rarity=M
[/card]
[card]
primitive=Manifestation Sage
id=516947
rarity=R
[/card]
[card]
primitive=Prismari Command
id=516948
rarity=R
[/card]
[card]
primitive=Quandrix Command
id=516949
rarity=R
[/card]
[card]
primitive=Radiant Scrollwielder
id=516950
rarity=R
[/card]
[card]
primitive=Rushed Rebirth
id=516951
rarity=R
[/card]
[card]
primitive=Silverquill Command
id=516952
rarity=R
[/card]
[card]
primitive=Silverquill Silencer
id=516953
rarity=R
[/card]
[card]
primitive=Vanishing Verse
id=516954
rarity=R
[/card]
[card]
primitive=Venerable Warsinger
id=516955
rarity=R
[/card]
[card]
primitive=Witherbloom Command
id=516956
rarity=R
[/card]
[card]
primitive=Codie, Vociferous Codex
id=516957
rarity=R
[/card]
[card]
primitive=Strixhaven Stadium
id=516958
rarity=R
[/card]
[card]
primitive=The Biblioplex
id=516959
rarity=R
[/card]
[card]
primitive=Frostboil Snarl
id=516960
rarity=R
[/card]
[card]
primitive=Furycalm Snarl
id=516961
rarity=R
[/card]
[card]
primitive=Hall of Oracles
id=516962
rarity=R
[/card]
[card]
primitive=Necroblossom Snarl
id=516963
rarity=R
[/card]
[card]
primitive=Shineshadow Snarl
id=516964
rarity=R
[/card]
[card]
primitive=Vineglimmer Snarl
id=516965
rarity=R
[/card]
[card]
primitive=Plains primitive=Plains
id=516678 id=516678
rarity=C rarity=L
[/card] [/card]
[card] [card]
primitive=Plains primitive=Plains
id=516679 id=516679
rarity=C rarity=L
[/card] [/card]
[card] [card]
primitive=Island primitive=Island
id=516680 id=516680
rarity=C rarity=L
[/card] [/card]
[card] [card]
primitive=Island primitive=Island
id=516681 id=516681
rarity=C rarity=L
[/card] [/card]
[card] [card]
primitive=Swamp primitive=Swamp
id=516682 id=516682
rarity=C rarity=L
[/card] [/card]
[card] [card]
primitive=Swamp primitive=Swamp
id=516683 id=516683
rarity=C rarity=L
[/card] [/card]
[card] [card]
primitive=Mountain primitive=Mountain
id=516684 id=516684
rarity=C rarity=L
[/card] [/card]
[card] [card]
primitive=Mountain primitive=Mountain
id=516685 id=516685
rarity=C rarity=L
[/card] [/card]
[card] [card]
primitive=Forest primitive=Forest
id=516686 id=516686
rarity=C rarity=L
[/card] [/card]
[card] [card]
primitive=Forest primitive=Forest
id=516687 id=516687
rarity=C rarity=L
[/card]
[card]
primitive=Dragonsguard Elite
id=516860
rarity=R
[/card]
[card]
primitive=Archmage Emeritus
id=516854
rarity=R
[/card]
[card]
primitive=Fracture
id=517496
rarity=U
[/card]
[card]
primitive=Expressive Iteration
id=517497
rarity=U
[/card]
[card]
primitive=Mortality Spear
id=517498
rarity=U
[/card]
[card]
primitive=Rip Apart
id=517499
rarity=U
[/card]
[card]
primitive=Decisive Denial
id=517500
rarity=U
[/card] [/card]
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+136
View File
@@ -0,0 +1,136 @@
[meta]
author=Wagic Team
name=Ugin's Fate
year=2015-01-17
total=26
[/meta]
[card]
primitive=Ugin, the Spirit Dragon
id=394086
rarity=M
[/card]
[card]
primitive=Mastery of the Unseen
id=394079
rarity=R
[/card]
[card]
primitive=Smite the Monstrous
id=394083
rarity=C
[/card]
[card]
primitive=Soul Summons
id=394084
rarity=C
[/card]
[card]
primitive=Watcher of the Roost
id=394088
rarity=U
[/card]
[card]
primitive=Jeskai Infiltrator
id=394078
rarity=R
[/card]
[card]
primitive=Reality Shift
id=394081
rarity=U
[/card]
[card]
primitive=Mystic of the Hidden Way
id=394080
rarity=C
[/card]
[card]
primitive=Write into Being
id=394090
rarity=C
[/card]
[card]
primitive=Debilitating Injury
id=394070
rarity=C
[/card]
[card]
primitive=Grim Haruspex
id=394075
rarity=R
[/card]
[card]
primitive=Sultai Emissary
id=394085
rarity=C
[/card]
[card]
primitive=Ruthless Ripper
id=394082
rarity=U
[/card]
[card]
primitive=Ainok Tracker
id=394065
rarity=C
[/card]
[card]
primitive=Arc Lightning
id=394068
rarity=U
[/card]
[card]
primitive=Fierce Invocation
id=394072
rarity=C
[/card]
[card]
primitive=Jeering Instigator
id=394077
rarity=R
[/card]
[card]
primitive=Arashin War Beast
id=394067
rarity=U
[/card]
[card]
primitive=Formless Nurturing
id=394073
rarity=C
[/card]
[card]
primitive=Dragonscale Boon
id=394071
rarity=C
[/card]
[card]
primitive=Wildcall
id=394089
rarity=R
[/card]
[card]
primitive=Hewed Stone Retainers
id=394076
rarity=U
[/card]
[card]
primitive=Ugin's Construct
id=394087
rarity=U
[/card]
[card]
primitive=Altar of the Brood
id=394066
rarity=R
[/card]
[card]
primitive=Briber's Purse
id=394069
rarity=U
[/card]
[card]
primitive=Ghostfire Blade
id=394074
rarity=R
[/card]
+1 -2
View File
@@ -1,7 +1,6 @@
[meta] [meta]
author=Wagic Team author=Wagic Team
name=Alchemy: Innistrad name=Alchemy: Innistrad
orderindex=ONL-E.YMID
year=2021-12-09 year=2021-12-09
total=64 total=64
[/meta] [/meta]
@@ -217,7 +216,7 @@ rarity=M
[/card] [/card]
[card] [card]
primitive=Rahilda, Feral Outlaw primitive=Rahilda, Feral Outlaw
id=548268 id=548269
rarity=T rarity=T
[/card] [/card]
[card] [card]
@@ -163,9 +163,6 @@
# Afterlife # Afterlife
#AUTO_DEFINE _AFTERLIFETOKEN_ create(Spirit:Creature Spirit:1/1:white:black:flying) #AUTO_DEFINE _AFTERLIFETOKEN_ create(Spirit:Creature Spirit:1/1:white:black:flying)
# Riot
#AUTO_DEFINE _RIOT_ movedTo(this|myBattlefield):transforms((,newability[ability$! name(Choose counter or ability) choice name(Put a +1/+1 counter) counter(1/1) target(creature) _ choice name(Gains Haste) haste target(creature) forever !$ controller]))
# Learn # Learn
#AUTO_DEFINE _LEARN_ name(Learn) transforms((,newability[if type(*[lesson]|mysideboard)~morethan~0 then choice name(Put lesson in hand) name(Put lesson in hand) target(*[lesson]|mysideboard) moveto(myhand)],newability[if type(*|myhand)~morethan~0 then choice name(Discard and draw) name(Discard and draw) target(*|myhand) reject and!(draw:1)!],newability[if type(Retriever Phoenix|mygraveyard)~morethan~0 then choice name(Return a Retriever Phoenix) name(Return a Retriever Phoenix) target(Retriever Phoenix|mygraveyard) moveto(myBattlefield)],newability[choice name(Don't learn) donothing])) oneshot controller #AUTO_DEFINE _LEARN_ name(Learn) transforms((,newability[if type(*[lesson]|mysideboard)~morethan~0 then choice name(Put lesson in hand) name(Put lesson in hand) target(*[lesson]|mysideboard) moveto(myhand)],newability[if type(*|myhand)~morethan~0 then choice name(Discard and draw) name(Discard and draw) target(*|myhand) reject and!(draw:1)!],newability[if type(Retriever Phoenix|mygraveyard)~morethan~0 then choice name(Return a Retriever Phoenix) name(Return a Retriever Phoenix) target(Retriever Phoenix|mygraveyard) moveto(myBattlefield)],newability[choice name(Don't learn) donothing])) oneshot controller
@@ -179,13 +176,13 @@
#AUTO_DEFINE _FORETELL_ {2}:name(Pay 2 and exile face-down) name(Pay 2 and exile face-down) doforetell myturnonly #AUTO_DEFINE _FORETELL_ {2}:name(Pay 2 and exile face-down) name(Pay 2 and exile face-down) doforetell myturnonly
# Plot # Plot
#AUTO_DEFINE _PLOT_ name(Plot and exile) name(Plot and exile) doforetell asSorcery #AUTO_DEFINE _PLOT_ name(Plot) name(Plot) doforetell asSorcery
# Plot Cast # Plot Cast
#AUTO_DEFINE _PLOTCAST_ {0}restriction{compare(canforetellcast)~morethan~0}:name(Cast with plot) name(Cast with plot) activate castcard(alternative) asSorcery #AUTO_DEFINE _PLOTCAST_ {0}restriction{compare(canforetellcast)~morethan~0}:name(Cast) name(Cast) activate castcard(alternative) asSorcery
# Loot (draw a card, then discard a card.) # Loot. Draw a card, then discard a card.
#AUTO_DEFINE _LOOT_ draw:1 && transforms((,newability[target(*|myhand) reject])) forever #AUTO_DEFINE _LOOT_ draw:1 && transforms((,newability[notatarget(*|myhand) reject])) forever
# Unearth # Unearth
#AUTO_DEFINE _UNEARTH_ name(Unearth) moveto(mybattlefield) and!( transforms((,haste,newability[unearth],newability[exiledeath])) forever )! asSorcery #AUTO_DEFINE _UNEARTH_ name(Unearth) moveto(mybattlefield) and!( transforms((,haste,newability[unearth],newability[exiledeath])) forever )! asSorcery
@@ -210,14 +207,14 @@
# (blink)ueot doesn't work if a creature uses it on itself # (blink)ueot doesn't work if a creature uses it on itself
#AUTO_DEFINE _BLINK_UEOT_ moveto(exile) and!( transforms((,newability[phaseaction[end once checkex] moveto(ownerbattlefield)])) forever )! #AUTO_DEFINE _BLINK_UEOT_ moveto(exile) and!( transforms((,newability[phaseaction[end once checkex] moveto(ownerbattlefield)])) forever )!
# Connives. (Draw a card, then discard a card. If you discarded a nonland card, put a +1/+1 counter on this creature.) # Connives. Draw a card, then discard a card. If you discarded a nonland card, put a +1/+1 counter on this creature.
#AUTO_DEFINE _CONNIVES_ draw:1 && transforms((,newability[if type(*[-land]|myhand)~morethan~0 then choice name(Discard a nonland) name(Discard a nonland) target(*[-land]|myhand) reject && counter(1/1) all(this)],newability[if type(land|myhand)~morethan~0 then choice name(Discard a land) name(Discard a land) target(land|myhand) reject])) oneshot #AUTO_DEFINE _CONNIVES_ draw:1 && transforms((,newability[if type(*[-land]|myhand)~morethan~0 then choice name(Discard a nonland) name(Discard a nonland) target(*[-land]|myhand) reject && counter(1/1) all(this)],newability[if type(land|myhand)~morethan~0 then choice name(Discard a land) name(Discard a land) target(land|myhand) reject])) oneshot
# Eternalize # Eternalize
#AUTO_DEFINE _ETERNALIZE_ name(Eternalize) clone and!( transforms((Zombie,removemc,setpower=4,settoughness=4,black)) forever )! assorcery #AUTO_DEFINE _ETERNALIZE_ name(Eternalize) clone and!( transforms((Zombie,removemc,setpower=4,settoughness=4,black)) forever )! assorcery
# Explores # Explores
#AUTO_DEFINE _EXPLORES_ name(Explores) reveal:1 optionone if type(land|reveal)~lessthan~1 then transforms((,newability[counter(1/1)])) forever optiononeend optiontwo if type(land|reveal)~morethan~0 then name(move to Hand) target(<1>*|reveal) moveto(myHand) else transforms((,newability[Choice name(back to library) target(<1>*|reveal) moveto(mylibrary)],newability[Choice name(put into Graveyard) target(<1>*|reveal) moveto(myGraveyard)])) oneshot optiontwoend afterrevealed explores afterrevealedend revealend #AUTO_DEFINE _EXPLORES_ name(Explores) reveal:1 optionone if type(land|reveal)~lessthan~1 then counter(1/1) optiononeend optiontwo if type(land|reveal)~morethan~0 then name(move to Hand) target(<1>*|reveal) moveto(myHand) else transforms((,newability[Choice name(back to library) target(<1>*|reveal) moveto(mylibrary)],newability[Choice name(put into Graveyard) target(<1>*|reveal) moveto(myGraveyard)])) oneshot optiontwoend afterrevealed explores afterrevealedend revealend
# Discard a card. If you do, draw a card # Discard a card. If you do, draw a card
#AUTO_DEFINE _DISCARD&DRAW_ reject notatarget(*|myhand) and!(draw:1 controller)! #AUTO_DEFINE _DISCARD&DRAW_ reject notatarget(*|myhand) and!(draw:1 controller)!
@@ -225,10 +222,13 @@
# Target creature deals damage equal to its power to target creature you don't control. # Target creature deals damage equal to its power to target creature you don't control.
#AUTO_DEFINE _PUNCH_ transforms((,newability[dynamicability<!powerstrike!> target(creature|opponentbattlefield)])) oneshot #AUTO_DEFINE _PUNCH_ transforms((,newability[dynamicability<!powerstrike!> target(creature|opponentbattlefield)])) oneshot
# Must be blocked this turn if able # Fight. Both creatures deal damage equal to their Power to each other.
#AUTO_DEFINE _MUST_BE_BLOCKD_ newability[@combat(attacking) source(this):ability$! notatarget(creature|myBattlefield) transforms((,newability[mustblock])) ueot!$ opponent] #AUTO_DEFINE _FIGHT_ transforms((,newability[target(creature|opponentbattlefield) dynamicability<!powerstrike eachother!>])) oneshot
# Suspect it (It has menace and can't block.) # Must be blocked this turn if able
#AUTO_DEFINE _MUST_BE_BLOCKD_ newability[@combat(attacking) source(this):ability$! notatarget(creature[-tapped]|myBattlefield) transforms((,newability[mustblock])) ueot!$ opponent]
# Suspect it. It has menace and can't block.
#AUTO_DEFINE _SUSPECT_IT_ name(Suspect it) transforms((suspect,menace,cantblock)) forever #AUTO_DEFINE _SUSPECT_IT_ name(Suspect it) transforms((suspect,menace,cantblock)) forever
# Finality counter, if it would die, it's exiled instead # Finality counter, if it would die, it's exiled instead
@@ -240,15 +240,47 @@
#AUTO_DEFINE _ENLIST_ @combat(attacking) source(this) restriction{type(creature[-fresh]|mybattlefield)~morethan~0}:transforms((,newability[{T(creature[-attacking;-fresh]|mybattlefield)}:storedpower/0 ueot limit:1])) ueot #AUTO_DEFINE _ENLIST_ @combat(attacking) source(this) restriction{type(creature[-fresh]|mybattlefield)~morethan~0}:transforms((,newability[{T(creature[-attacking;-fresh]|mybattlefield)}:storedpower/0 ueot limit:1])) ueot
# Add one mana of any color. # Add one mana of any color.
#AUTO_DEFINE _MANAOFANYCOLOR_ ability$! choice Add{W} _ choice Add{U} _ choice Add{B} _ choice Add{R} _ choice Add{G} !$ controller #AUTO_DEFINE _MANAOFANYCOLOR_ name(Add one mana of any color) ability$! choice Add{W} _ choice Add{U} _ choice Add{B} _ choice Add{R} _ choice Add{G} !$ controller
# Manifest dread. (Look at the top two cards of your library. Put one onto the battlefield face down as a 2/2 creature and the other into your graveyard. Turn it face up any time for its mana cost if it's a creature card.) # Manifest dread. Look at the top two cards of your library. Put one onto the battlefield face down as a 2/2 creature and the other into your graveyard. Turn it face up any time for its mana cost if it's a creature card.
#AUTO_DEFINE _MANIFEST_DREAD_ name(Manifest dread) reveal:2 optionone name(Manifest) target(*|reveal) manifest optiononeend optiontwo all(*|reveal) moveto(mygraveyard) optiontwoend revealend #AUTO_DEFINE _MANIFEST_DREAD_ name(Manifest dread) reveal:2 optionone name(Manifest) target(*|reveal) manifest optiononeend optiontwo all(*|reveal) moveto(mygraveyard) optiontwoend revealend
#AUTO_DEFINE _EERIE_ @movedTo(*[Room]|myBattlefield): #AUTO_DEFINE _EERIE_ @movedTo(*[Room]|myBattlefield):
#AUTO_DEFINE _CREW1_ {crew(other creature[power>=1]|myBattlefield)}:name(crew 1 [1 creature]) becomes(Artifact Creature) ueot restriction{type(other creature[-tapped;power>=1]|mybattlefield)~morethan~0,compare(crewtotalpower)~morethan~0} #AUTO_DEFINE _CREW1_ {crew(other creature[power>=1]|myBattlefield)}:name(crew 1 [1 creature]) becomes(Artifact Creature) ueot restriction{type(other creature[-tapped;power>=1]|mybattlefield)~morethan~0,compare(crewtotalpower)~morethan~0}
#AUTO_DEFINE _CREW2_ {crew(other creature[power>=2]|myBattlefield)}:name(crew 2 [1 creature]) becomes(Artifact Creature) ueot restriction{type(other creature[-tapped;power>=2]|mybattlefield)~morethan~0,compare(crewtotalpower)~morethan~1}
#AUTO_DEFINE _CREW2COMPLEMENT_ {crew(other creature[power>=1]|myBattlefield)}{crew(other creature[power>=1]|myBattlefield)}:name(crew 2 [2 creature]) becomes(Artifact Creature) ueot restriction{type(other creature[-tapped;power>=1]|mybattlefield)~morethan~1,compare(crewtotalpower)~morethan~1}
# Endure
#AUTO_DEFINE _ENDURE1_ transforms((,newability[choice counter(1/1)],newability[choice create(Spirit:Creature:1/1:white)])) ueot
#AUTO_DEFINE _ENDURE2_ transforms((,newability[choice counter(1/1.2)],newability[choice create(Spirit:Creature:2/2:white)])) ueot
#AUTO_DEFINE _ENDURE3_ transforms((,newability[choice counter(1/1.3)],newability[choice create(Spirit:Creature:3/3:white)])) ueot
#AUTO_DEFINE _ENDURE4_ transforms((,newability[choice counter(1/1.4)],newability[choice create(Spirit:Creature:4/4:white)])) ueot
#AUTO_DEFINE _ENDURE5_ transforms((,newability[choice counter(1/1.5)],newability[choice create(Spirit:Creature:5/5:white)])) ueot
#AUTO_DEFINE _ENDURE6_ transforms((,newability[choice counter(1/1.6)],newability[choice create(Spirit:Creature:6/6:white)])) ueot
#AUTO_DEFINE _ENDURE7_ transforms((,newability[choice counter(1/1.7)],newability[choice create(Spirit:Creature:7/7:white)])) ueot
#AUTO_DEFINE _ENDURE8_ transforms((,newability[choice counter(1/1.8)],newability[choice create(Spirit:Creature:8/8:white)])) ueot
#AUTO_DEFINE _ENDURE9_ transforms((,newability[choice counter(1/1.9)],newability[choice create(Spirit:Creature:9/9:white)])) ueot
#AUTO_DEFINE _ENDURE10_ transforms((,newability[choice counter(1/1.10)],newability[choice create(Spirit:Creature:10/10:white)])) ueot
#AUTO_DEFINE _ENDURE11_ transforms((,newability[choice counter(1/1.11)],newability[choice create(Spirit:Creature:11/11:white)])) ueot
#AUTO_DEFINE _ENDURE12_ transforms((,newability[choice counter(1/1.12)],newability[choice create(Spirit:Creature:12/12:white)])) ueot
#AUTO_DEFINE _ENDURE13_ transforms((,newability[choice counter(1/1.13)],newability[choice create(Spirit:Creature:13/13:white)])) ueot
#AUTO_DEFINE _ENDURE14_ transforms((,newability[choice counter(1/1.14)],newability[choice create(Spirit:Creature:14/14:white)])) ueot
#AUTO_DEFINE _ENDURE15_ transforms((,newability[choice counter(1/1.15)],newability[choice create(Spirit:Creature:15/15:white)])) ueot
#AUTO_DEFINE _ENDURE16_ transforms((,newability[choice counter(1/1.16)],newability[choice create(Spirit:Creature:16/16:white)])) ueot
#AUTO_DEFINE _ENDURE17_ transforms((,newability[choice counter(1/1.17)],newability[choice create(Spirit:Creature:17/17:white)])) ueot
#AUTO_DEFINE _ENDURE18_ transforms((,newability[choice counter(1/1.18)],newability[choice create(Spirit:Creature:18/18:white)])) ueot
#AUTO_DEFINE _ENDURE19_ transforms((,newability[choice counter(1/1.19)],newability[choice create(Spirit:Creature:19/19:white)])) ueot
#AUTO_DEFINE _ENDURE20_ transforms((,newability[choice counter(1/1.20)],newability[choice create(Spirit:Creature:20/20:white)])) ueot
# Flurry
#AUTO_DEFINE _FLURRY_ @movedto(*|mystack) restriction{thisturn(*|mystack)~equalto~1}:
# Mobilize
#AUTO_DEFINE _MOBILIZE_($c) @combat(attacking) source(this):create(Warrior:creature Warrior:1/1:red:battleready:treason)*$c
# Angel Token # Angel Token
#AUTO_DEFINE _ANGELTOKEN_ create(Angel:Creature Angel:4/4:white:flying) #AUTO_DEFINE _ANGELTOKEN_ create(Angel:Creature Angel:4/4:white:flying)
@@ -291,6 +323,12 @@
# Glimmer Token # Glimmer Token
#AUTO_DEFINE _GLIMMERTOKEN_ create(glimmer:creature glimmer enchantment:1/1:white) #AUTO_DEFINE _GLIMMERTOKEN_ create(glimmer:creature glimmer enchantment:1/1:white)
# Human Knight Token
#AUTO_DEFINE _HUMANKNIGHTTOKEN_ create(Human Knight:Creature Human Knight:2/2:red:trample:haste)
# Human Soldier Token
#AUTO_DEFINE _HUMANSOLDIERTOKEN_ create(soldier:creature Human soldier:1/1:white)
# Insect Token # Insect Token
#AUTO_DEFINE _INSECTTOKEN_ create(Insect:Creature Insect:1/1:green) #AUTO_DEFINE _INSECTTOKEN_ create(Insect:Creature Insect:1/1:green)
@@ -337,13 +375,13 @@
#AUTO_DEFINE _ZOMBIETOKEN_ create(zombie:creature zombie:2/2:black) #AUTO_DEFINE _ZOMBIETOKEN_ create(zombie:creature zombie:2/2:black)
# Clue Token # Clue Token
#AUTO_DEFINE _CLUE_ token(Clue,Clue Artifact,0/0) and!( transforms((,newability[{2}{S}:draw:1])) forever )! #AUTO_DEFINE _CLUE_ token(Clue^Clue Artifact^0/0) and!( transforms((,newability[{2}{S}:draw:1])) forever )!
# Food Token # Food Token
#AUTO_DEFINE _FOOD_ token(Food,Food Artifact,0/0) and!( transforms((,newability[{2}{T}{S}:life:3])) forever )! #AUTO_DEFINE _FOOD_ token(Food^Food Artifact^0/0) and!( transforms((,newability[{2}{T}{S}:life:3])) forever )!
# Treasure Token # Treasure Token
#AUTO_DEFINE _TREASURE_ token(Treasure,Treasure Artifact,0/0) and!( transforms((,newability[{T}{S}:Add{W}],newability[{T}{S}:Add{U}],newability[{T}{S}:Add{B}],newability[{T}{S}:Add{R}],newability[{T}{S}:Add{G}])) forever )! #AUTO_DEFINE _TREASURE_ token(Treasure^Treasure Artifact^0/0) and!( transforms((,newability[{T}{S}:Add{W}],newability[{T}{S}:Add{U}],newability[{T}{S}:Add{B}],newability[{T}{S}:Add{R}],newability[{T}{S}:Add{G}])) forever )!
# Vehicle Token # Vehicle Token
#AUTO_DEFINE _VEHICLE_ token(Vehicle,Artifact Vehicle,3/2) and!( transforms((,newability[{crew(other creature[power>=1]|myBattlefield)}:name(crew 1 [1 creature]) becomes(Artifact Creature) ueot restriction{type(other creature[-tapped;power>=1]|mybattlefield)~morethan~0,compare(crewtotalpower)~morethan~0}])) forever )! #AUTO_DEFINE _VEHICLE_ token(Vehicle^Artifact Vehicle^3/2) and!( transforms((,newability[{crew(other creature[power>=1]|myBattlefield)}:name(crew 1 [1 creature]) becomes(Artifact Creature) ueot restriction{type(other creature[-tapped;power>=1]|mybattlefield)~morethan~0,compare(crewtotalpower)~morethan~0}])) forever )!
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -1,6 +1,6 @@
#Planeswalkers Primitives Pack for Wagic the Homebrew. #Planeswalkers Primitives Pack for Wagic the Homebrew.
#Please keep these card alphabetized, and try to have the "name=" line at the top of each card #Please keep these card alphabetized, and try to have the "name=" line at the top of each card
#Sorted this programmatically - Thanks to Vitty85 24-12-2024 #Sorted this programmatically - Thanks to Vitty85 29-04-2024
[card] [card]
name=Abian, Luvion Usurper name=Abian, Luvion Usurper
auto=counter(0/0,5,loyalty) auto=counter(0/0,5,loyalty)
@@ -192,7 +192,7 @@ subtype=Aminatou
name=Angrath, Captain of Chaos name=Angrath, Captain of Chaos
auto=counter(0/0,5,loyalty) auto=counter(0/0,5,loyalty)
auto=lord(creature|myBattlefield) menace auto=lord(creature|myBattlefield) menace
auto={C(0/0,-2,Loyalty)}:name(-2: Amass 2) _AMASSZOMBIE2_ auto={C(0/0,-2,Loyalty)}:name(-2: Amass 2) ability$! _AMASSZOMBIE2_ !$ controller
text=Creatures you control have menace. -- -2: Amass 2. (Put two +1/+1 counters on an Army you control. If you don't control one, create a 0/0 black Zombie Army creature token first.) text=Creatures you control have menace. -- -2: Amass 2. (Put two +1/+1 counters on an Army you control. If you don't control one, create a 0/0 black Zombie Army creature token first.)
mana={2}{BR}{BR} mana={2}{BR}{BR}
type=Legendary Planeswalker type=Legendary Planeswalker
@@ -452,7 +452,7 @@ subtype=Chandra
[/card] [/card]
[card] [card]
name=Chandra, Awakened Inferno name=Chandra, Awakened Inferno
auto=nofizzle abilities=nofizzle
auto=counter(0/0,6,loyalty) auto=counter(0/0,6,loyalty)
auto={C(0/0,2,Loyalty)}:name(+2: Emblem: "1 damage each upkeep") emblem transforms((,newability[@each opponent upkeep:damage:1 opponent])) forever dontremove auto={C(0/0,2,Loyalty)}:name(+2: Emblem: "1 damage each upkeep") emblem transforms((,newability[@each opponent upkeep:damage:1 opponent])) forever dontremove
auto={C(0/0,-3,Loyalty)}:name(-3: Deals 3 damage to each non-elemental) damage:3 all(creature[-elemental]) auto={C(0/0,-3,Loyalty)}:name(-3: Deals 3 damage to each non-elemental) damage:3 all(creature[-elemental])
@@ -572,7 +572,7 @@ subtype=Chandra
name=Chandra, Gremlin Wrangler name=Chandra, Gremlin Wrangler
auto=counter(0/0,3,loyalty) auto=counter(0/0,3,loyalty)
auto={C(0/0,1,Loyalty)}:name(+1: Create a 2/2 red Gremlin creature token) token(Gremlin,Creature Gremlin,2/2,red) auto={C(0/0,1,Loyalty)}:name(+1: Create a 2/2 red Gremlin creature token) token(Gremlin,Creature Gremlin,2/2,red)
auto={C(0/0,-2,Loyalty)}:name(-2: Deals X damage to any target... ) damage:damage:type:creature[Gremlin]|myBattlefield target(anytarget) auto={C(0/0,-2,Loyalty)}:name(-2: Deals X damage to any target... ) damage:type:creature[Gremlin]:myBattlefield target(anytarget)
text=+1: Create a 2/2 red Gremlin creature token. -- -2: Chandra, Gremlin Wrangler deals X damage to any target, where X is the number of Gremlins you control. text=+1: Create a 2/2 red Gremlin creature token. -- -2: Chandra, Gremlin Wrangler deals X damage to any target, where X is the number of Gremlins you control.
mana={2}{R}{R} mana={2}{R}{R}
type=Legendary Planeswalker type=Legendary Planeswalker
@@ -595,7 +595,7 @@ auto=counter(0/0,5,loyalty)
auto=@movedTo(*[instant;sorcery]|mystack) turnlimited:name(Copy spell) name(Copy spell) all(trigger[to]) transforms((,newability[name(Copy spell) activate castcard(copied noevent)])) oneshot auto=@movedTo(*[instant;sorcery]|mystack) turnlimited:name(Copy spell) name(Copy spell) all(trigger[to]) transforms((,newability[name(Copy spell) activate castcard(copied noevent)])) oneshot
auto={C(0/0,+2,Loyalty)}:name(+2: Add 2 mana) thisforeach(variable{2}) ability$!name(Choose one) choice name(Add white) add{W} _ choice name(Add blue) add{U} _ choice name(Add red) add{B} _ choice name(Add green) add{R} _ choice name(Add black) add{G}!$ controller auto={C(0/0,+2,Loyalty)}:name(+2: Add 2 mana) thisforeach(variable{2}) ability$!name(Choose one) choice name(Add white) add{W} _ choice name(Add blue) add{U} _ choice name(Add red) add{B} _ choice name(Add green) add{R} _ choice name(Add black) add{G}!$ controller
auto={C(0/0,+1,Loyalty)}:name(+1: Exile top 5 cards) all(*[zpos<=5]|mylibrary) moveto(myexile) and!( if cantargetcard(*[instant;sorcery]|*) then transforms((,newability[canplayfromexile])) ueot )! auto={C(0/0,+1,Loyalty)}:name(+1: Exile top 5 cards) all(*[zpos<=5]|mylibrary) moveto(myexile) and!( if cantargetcard(*[instant;sorcery]|*) then transforms((,newability[canplayfromexile])) ueot )!
auto={C(0/0,-1,Loyalty)}:name(-1: Damage one target) ability$!name(Damage target) name(Damage target) target(anytarget) damage:1!$ controller auto={C(0/0,-1,Loyalty)}:name(-1: Damage one target) ability$!name(Damage target) name(Damage target) target(anytarget) damage:1!$ controller
auto={C(0/0,-1,Loyalty)}:name(-1: Damage two target) ability$!name(Damage targets) name(Damage targets) target(<2>anytarget) damage:1!$ controller auto={C(0/0,-1,Loyalty)}:name(-1: Damage two target) ability$!name(Damage targets) name(Damage targets) target(<2>anytarget) damage:1!$ controller
auto={C(0/0,-2,Loyalty)}:name(-2: Damage one target) ability$!name(Damage target) name(Damage target) target(anytarget) damage:2!$ controller auto={C(0/0,-2,Loyalty)}:name(-2: Damage one target) ability$!name(Damage target) name(Damage target) target(anytarget) damage:2!$ controller
auto={C(0/0,-2,Loyalty)}:name(-2: Damage two target) ability$!name(Damage targets) name(Damage targets) target(<2>anytarget) damage:2!$ controller auto={C(0/0,-2,Loyalty)}:name(-2: Damage two target) ability$!name(Damage targets) name(Damage targets) target(<2>anytarget) damage:2!$ controller
@@ -709,6 +709,20 @@ subtype=Chandra
color=red color=red
[/card] [/card]
[card] [card]
name=Chandra, Spark Hunter
auto=counter(0/0,4,loyalty)
auto=@each my combatbegins:may target(vehicle|myBattlefield) becomes(Artifact Creature,haste) ueot
auto={C(0/0,+2,Loyalty)}:sacrifice notatarget(artifact|mybattlefield) and!( draw:1 )!
auto={C(0/0,+2,Loyalty)}:_DISCARD&DRAW_
auto={C(0/0,+2,Loyalty)}:name(Only +2 counters) doNothing
auto={C(0/0,0,Loyalty)}:_VEHICLE_
auto={C(0/0,-7,Loyalty)}:name(emblem) emblem transforms((,newability[@movedTo(artifact|myBattlefield):damage:3 target(anytarget)])) forever dontremove
text=At the beginning of combat on your turn, choose up to one target Vehicle you control. Until end of turn, it becomes an artifact creature and gains haste. -- [+2]: You may sacrifice an artifact or discard a card. If you do, draw a card. -- [0]: Create a 3/2 colorless Vehicle artifact token with crew 1. -- [-7]: You get an emblem with "Whenever an artifact you control enters, this emblem deals 3 damage to any target."
mana={3}{R}
type=Legendary Planeswalker
subtype=Chandra
[/card]
[card]
name=Chandra, Torch of Defiance name=Chandra, Torch of Defiance
auto=counter(0/0,4,loyalty) auto=counter(0/0,4,loyalty)
auto={C(0/0,1,Loyalty)}:name(+1: Exile Top Card) all(*[zpos=1]|mylibrary) moveto(myexile) and!( transforms((,newability[choice name(Deals 2 damage) name(Deals 2 damage) damage:2 opponent],newability[if cantargetcard(*[-land]|*) then choice name(Cast card from exile) name(Cast card from exile) counter(0/0.1.ChandraEffect) notrg])) ueot )! auto={C(0/0,1,Loyalty)}:name(+1: Exile Top Card) all(*[zpos=1]|mylibrary) moveto(myexile) and!( transforms((,newability[choice name(Deals 2 damage) name(Deals 2 damage) damage:2 opponent],newability[if cantargetcard(*[-land]|*) then choice name(Cast card from exile) name(Cast card from exile) counter(0/0.1.ChandraEffect) notrg])) ueot )!
@@ -847,7 +861,7 @@ auto=counter(0/0,3,loyalty)
auto=lord(other creature|myBattlefield) 1/0 auto=lord(other creature|myBattlefield) 1/0
auto={C(0/0,1,Loyalty)}:name(+1: Add Red mana and creatures can't be countered this turn) transforms((,newability[add{R}],newability[lord(creature|mystack) nofizzle])) ueot auto={C(0/0,1,Loyalty)}:name(+1: Add Red mana and creatures can't be countered this turn) transforms((,newability[add{R}],newability[lord(creature|mystack) nofizzle])) ueot
auto={C(0/0,1,Loyalty)}:name(+1: Add Green mana and creatures can't be countered this turn) transforms((,newability[add{G}],newability[lord(creature|mystack) nofizzle])) ueot auto={C(0/0,1,Loyalty)}:name(+1: Add Green mana and creatures can't be countered this turn) transforms((,newability[add{G}],newability[lord(creature|mystack) nofizzle])) ueot
auto={C(0/0,-2,Loyalty)}:name(-2: Target creature fights another creature) target(creature|myBattlefield) transforms((,newability[target(creature|opponentbattlefield) dynamicability<!powerstrike eachother!>])) ueot auto={C(0/0,-2,Loyalty)}:name(-2: Target creature fights another creature) target(creature|myBattlefield) _FIGHT_
text=Creatures you control get +1/+0. -- +1: Add {R} or {G}. Creature spells you cast this turn can't be countered. -- -2: Target creature you control fights target creature you don't control. text=Creatures you control get +1/+0. -- +1: Add {R} or {G}. Creature spells you cast this turn can't be countered. -- -2: Target creature you control fights target creature you don't control.
mana={1}{R}{G} mana={1}{R}{G}
type=Legendary Planeswalker type=Legendary Planeswalker
@@ -969,6 +983,18 @@ type=Legendary Planeswalker
subtype=Elspeth subtype=Elspeth
[/card] [/card]
[card] [card]
name=Elspeth, Storm Slayer
auto=counter(0/0,5,loyalty)
auto=@tokencreated(*|myBattlefield):name(Double the token) all(trigger) clone options(notrigger)
auto={C(0/0,+1,Loyalty)}:create(soldier:creature soldier:1/1:white)
auto={C(0/0,0,Loyalty)}:all(creature|myBattlefield) transforms((,newability[counter(1/1)],flying)) uynt
auto={C(0/0,-3,Loyalty)}:destroy target(creature[manacost>=3]|opponentBattlefield)
text=If one or more tokens would be created under your control, twice that many of those tokens are created instead. -- [+1]: Create a 1/1 white Soldier creature token. -- [0]: Put a +1/+1 counter on each creature you control. Those creatures gain flying until your next turn. -- [-3]: Destroy target creature an opponent controls with mana value 3 or greater.
mana={3}{W}{W}
type=Legendary Planeswalker
subtype=Elspeth
[/card]
[card]
name=Elspeth, Sun's Champion name=Elspeth, Sun's Champion
auto=counter(0/0,4,loyalty) auto=counter(0/0,4,loyalty)
auto={C(0/0,1,Loyalty)}:name(+1: Create three 1/1 Soldier) _SOLDIERTOKEN_*3 auto={C(0/0,1,Loyalty)}:name(+1: Create three 1/1 Soldier) _SOLDIERTOKEN_*3
@@ -983,7 +1009,7 @@ subtype=Elspeth
name=Elspeth, Sun's Nemesis name=Elspeth, Sun's Nemesis
auto=counter(0/0,5,loyalty) auto=counter(0/0,5,loyalty)
auto={C(0/0,-1,Loyalty)}:name(-1: Up to two creature gets +2/+1) target(<upto:2>creature|myBattlefield) 2/1 ueot auto={C(0/0,-1,Loyalty)}:name(-1: Up to two creature gets +2/+1) target(<upto:2>creature|myBattlefield) 2/1 ueot
auto={C(0/0,-2,Loyalty)}:name(-2: Create two human soldiers) token(Human Soldier,Creature Human Soldier,1/1,white)*2 auto={C(0/0,-2,Loyalty)}:name(-2: Create two human soldiers) _HUMANSOLDIERTOKEN_*2
auto={C(0/0,-6,Loyalty)}:name(-6: Gain 5 life) life:5 controller auto={C(0/0,-6,Loyalty)}:name(-6: Gain 5 life) life:5 controller
retrace={4}{W}{W}{E(other *|myGraveyard)}{E(other *|myGraveyard)}{E(other *|myGraveyard)}{E(other *|myGraveyard)} name(Escape) retrace={4}{W}{W}{E(other *|myGraveyard)}{E(other *|myGraveyard)}{E(other *|myGraveyard)}{E(other *|myGraveyard)} name(Escape)
text=-1: Up to two target creatures you control each get +2/+1 until end of turn. -- -2: Create two 1/1 white Human Soldier creature tokens. -- -3: You gain 5 life. -- Escape-{4}{W}{W}, Exile four other cards from your graveyard. (You may cast this card from your graveyard for its escape cost.) text=-1: Up to two target creatures you control each get +2/+1 until end of turn. -- -2: Create two 1/1 white Human Soldier creature tokens. -- -3: You gain 5 life. -- Escape-{4}{W}{W}, Exile four other cards from your graveyard. (You may cast this card from your graveyard for its escape cost.)
@@ -1255,7 +1281,7 @@ auto=counter(0/0,5,loyalty)
auto={C(0/0,2,Loyalty)}:name(+2: Untap all creatures and get +1/+1) all(creature|mybattlefield) 1/1 && all(creature|mybattlefield) untap ueot auto={C(0/0,2,Loyalty)}:name(+2: Untap all creatures and get +1/+1) all(creature|mybattlefield) 1/1 && all(creature|mybattlefield) untap ueot
auto={C(0/0,0,Loyalty)}:name(+0: Transforms to Human Soldier 5/5) transforms((Creature Human Soldier,setpower=5,settoughness=5,indestructible,newability[preventAllDamage to(this)])) ueot auto={C(0/0,0,Loyalty)}:name(+0: Transforms to Human Soldier 5/5) transforms((Creature Human Soldier,setpower=5,settoughness=5,indestructible,newability[preventAllDamage to(this)])) ueot
auto={C(0/0,-10,Loyalty)}:name(10: Tap all creatures and +2/+2) all(creature|opponentbattlefield) tap && all(creature|mybattlefield) 2/2 ueot auto={C(0/0,-10,Loyalty)}:name(10: Tap all creatures and +2/+2) all(creature|opponentbattlefield) tap && all(creature|mybattlefield) 2/2 ueot
text=+2: Untap all creatures you control. Those creatures get +1/+1 until end of turn. -- 0: Until end of turn, Gideon, Martial Paragon becomes a 5/5 Human Soldier creature with indestructible that's still a planeswalker. Prevent all damage that would be dealt to him this turn. -- -10: Creatures you control get +2/+2 until end of turn. Tap all creatures your opponents control. text=+2: Untap all creatures you control. Those creatures get +1/+1 until end of turn. -- 0: Until end of turn, Gideon, Martial Paragon becomes a 5/5 Human Soldier creature with indestructible that's still a planeswalker. Prevent all damage that would be dealt to him this turn. -- -10: Creatures you control get +2/+2 until end of turn. Tap all creatures your opponents control.
mana={4}{W} mana={4}{W}
type=Legendary Planeswalker type=Legendary Planeswalker
subtype=Gideon subtype=Gideon
@@ -1544,7 +1570,7 @@ subtype=Jace
[/card] [/card]
[card] [card]
name=Jace, the Perfected Mind name=Jace, the Perfected Mind
auto=if paid(alternative) then counter(0/0,3,loyalty) auto=alternative counter(0/0,3,loyalty)
auto=ifnot paid(alternative) then counter(0/0,5,loyalty) auto=ifnot paid(alternative) then counter(0/0,5,loyalty)
auto={C(0/0,+1,Loyalty)}:name(+1: Target creature gains -3/-0) target(creature|battlefield) transforms((,newability[-3/-0])) uynt auto={C(0/0,+1,Loyalty)}:name(+1: Target creature gains -3/-0) target(creature|battlefield) transforms((,newability[-3/-0])) uynt
auto={C(0/0,+1,Loyalty)}:name(+1: Don't target any creature) donothing auto={C(0/0,+1,Loyalty)}:name(+1: Don't target any creature) donothing
@@ -1711,7 +1737,7 @@ name=Kaito, Bane of Nightmares
auto=counter(0/0,4,loyalty) auto=counter(0/0,4,loyalty)
autohand={1}{U}{B}{N}:ninjutsu autohand={1}{U}{B}{N}:ninjutsu
auto=this(variable{controllerturn}>0) becomes(Ninja Creature,3/4,hexproof) auto=this(variable{controllerturn}>0) becomes(Ninja Creature,3/4,hexproof)
auto={C(0/0,+1,Loyalty)}:name(emblem) emblem transforms((,newability[all(ninja|myBattlefield) 1/1])) forever dontremove auto={C(0/0,+1,Loyalty)}:name(emblem) emblem transforms((,newability[lord(ninja|myBattlefield) 1/1])) forever dontremove
auto={C(0/0,0,Loyalty)}:name(Surveil 2) reveal:psurveiloffsetplus2plusend optionone name(put in graveyard) target(<upto:psurveiloffsetplus2plusend>*|reveal) moveto(ownergraveyard) optiononeend optiontwo name(put in library) target(<psurveiloffsetplus2plusend>*|reveal) moveto(ownerlibrary) optiontwoend afterrevealed all(*[zpos=1]|mylibrary) transforms((,newability[draw:1 controller])) oneshot afterrevealedend revealend auto={C(0/0,0,Loyalty)}:name(Surveil 2) reveal:psurveiloffsetplus2plusend optionone name(put in graveyard) target(<upto:psurveiloffsetplus2plusend>*|reveal) moveto(ownergraveyard) optiononeend optiontwo name(put in library) target(<psurveiloffsetplus2plusend>*|reveal) moveto(ownerlibrary) optiontwoend afterrevealed all(*[zpos=1]|mylibrary) transforms((,newability[draw:1 controller])) oneshot afterrevealedend revealend
auto={C(0/0,-2,Loyalty)}:name(-2 Tap target creature) target(creature) transforms((,newability[tap],newability[counter(0/0.2.Stun)])) auto={C(0/0,-2,Loyalty)}:name(-2 Tap target creature) target(creature) transforms((,newability[tap],newability[counter(0/0.2.Stun)]))
text=Ninjutsu {1}{U}{B} ({1}{U}{B}, Return an unblocked attacker you control to hand: Put this card onto the battlefield from your hand tapped and attacking.) -- During your turn, as long as Kaito has one or more loyalty counters on him, he's a 3/4 Ninja creature and has hexproof. -- [+1]: You get an emblem with "Ninjas you control get +1/+1." -- [0]: Surveil 2. Then draw a card for each opponent who lost life this turn. -- [-2]: Tap target creature. Put two stun counters on it. text=Ninjutsu {1}{U}{B} ({1}{U}{B}, Return an unblocked attacker you control to hand: Put this card onto the battlefield from your hand tapped and attacking.) -- During your turn, as long as Kaito has one or more loyalty counters on him, he's a 3/4 Ninja creature and has hexproof. -- [+1]: You get an emblem with "Ninjas you control get +1/+1." -- [0]: Surveil 2. Then draw a card for each opponent who lost life this turn. -- [-2]: Tap target creature. Put two stun counters on it.
@@ -1720,6 +1746,19 @@ type=Legendary Planeswalker
subtype=Kaito subtype=Kaito
[/card] [/card]
[card] [card]
name=Kaito, Cunning Infiltrator
auto=counter(0/0,3,loyalty)
auto=@combatdamagefoeof(player) from(creature|mybattlefield):counter(0/0,1,Loyalty)
auto={C(0/0,+1,Loyalty)}:target(creature|myBattlefield) unblockable && _LOOT_
auto={C(0/0,+1,Loyalty)}:name(+1: No target, only draw and discard) _LOOT_
auto={C(0/0,-2,Loyalty)}:create(ninja:creature ninja:2/1:blue)
auto={C(0/0,-9,Loyalty)}:name(-9: Emblem) emblem transforms((,newability[@movedTo(*|stack):create(ninja:creature ninja:2/1:blue)])) forever dontremove
text=Whenever a creature you control deals combat damage to a player, put a loyalty counter on Kaito. -- [+1]: Up to one target creature you control can't be blocked this turn. Draw a card, then discard a card. -- [-2]: Create a 2/1 blue Ninja creature token. -- [-9]: You get an emblem with "Whenever a player casts a spell, you create a 2/1 blue Ninja creature token."
mana={1}{U}{U}
type=Legendary Planeswalker
subtype=Kaito
[/card]
[card]
name=Kaito, Dancing Shadow name=Kaito, Dancing Shadow
auto=counter(0/0,3,loyalty) auto=counter(0/0,3,loyalty)
auto=@combatdamaged(player) from(creature|myBattlefield) turnlimited:may name(Return to hand) target(creature[attacking]|myBattlefield) moveto(hand) && all(this) transforms((,newability[canloyaltytwice])) ueot auto=@combatdamaged(player) from(creature|myBattlefield) turnlimited:may name(Return to hand) target(creature[attacking]|myBattlefield) moveto(hand) && all(this) transforms((,newability[canloyaltytwice])) ueot
@@ -1855,8 +1894,8 @@ subtype=Kaya
[card] [card]
name=Kaya, Geist Hunter name=Kaya, Geist Hunter
auto=counter(0/0,3,Loyalty) auto=counter(0/0,3,Loyalty)
auto={C(0/0,1,Loyalty)}:name(+1: Creatures gain deathtouch) all(creature|mybattlefield) transforms((,deathtouch)) ueot auto={C(0/0,1,Loyalty)}:name(+1: Creatures gain deathtouch) all(creature|mybattlefield) deathtouch ueot
auto={C(0/0,1,Loyalty)}:name(+1: Creatures gain deathtouch and put counter) target(creature[token]|mybattlefield) counter(1/1) && all(creature|mybattlefield) transforms((,deathtouch)) ueot auto={C(0/0,1,Loyalty)}:name(+1: Creatures gain deathtouch and put counter) target(creature[token]|mybattlefield) counter(1/1) && all(creature|mybattlefield) deathtouch ueot
auto={C(0/0,-2,Loyalty)}:name(-2: Double the tokens) transforms((,newability[@tokencreated(*|myBattlefield):name(Double the token) all(trigger) clone options(notrigger)])) ueot auto={C(0/0,-2,Loyalty)}:name(-2: Double the tokens) transforms((,newability[@tokencreated(*|myBattlefield):name(Double the token) all(trigger) clone options(notrigger)])) ueot
auto={C(0/0,-6,Loyalty)}:name(-6: Exile cards) all(*|graveyard) moveto(exile) and!( _SPIRITTOKEN_ )! auto={C(0/0,-6,Loyalty)}:name(-6: Exile cards) all(*|graveyard) moveto(exile) and!( _SPIRITTOKEN_ )!
text=+1: Creatures you control gain deathtouch until end of turn. Put a +1/+1 counter on up to one target creature token you control. -- -2: Until end of turn, if one or more tokens would be created under your control, twice that many of those tokens are created instead. -- -6: Exile all cards from all graveyards, then create a 1/1 white Spirit creature token with flying for each card exiled this way. text=+1: Creatures you control gain deathtouch until end of turn. Put a +1/+1 counter on up to one target creature token you control. -- -2: Until end of turn, if one or more tokens would be created under your control, twice that many of those tokens are created instead. -- -6: Exile all cards from all graveyards, then create a 1/1 white Spirit creature token with flying for each card exiled this way.
@@ -1911,6 +1950,18 @@ type=Legendary Planeswalker
subtype=Kiora subtype=Kiora
[/card] [/card]
[card] [card]
name=Kiora, Master of the Depths
auto=counter(0/0,4,loyalty)
aicode=activate target(*[zpos<=4]|mylibrary) moveto(hand)
auto={C(0/0,1,Loyalty)}:name(+1: Untap target creature and land) untap target(<upto:1>creature) && ability$!may name(Untap land) untap target(<upto:1>land)!$ controller
auto={C(0/0,-2,Loyalty)}:name(-2: Reveal the top four and put in hand creature or land) name(look) reveal:4 optionone name(Get a card) target(<1>*[creature;land]|reveal) moveTo(myHand) optiononeend optiontwo name(put in grave) all(*|reveal) moveTo(myGraveyard) optiontwoend revealend
auto={C(0/0,-8,Loyalty)}:name(-8: Emblem: "Whenever enter, fight another creature" create a 8/8 octopus) emblem transforms((,newability[@movedTo(creature|myBattlefield):may name(fight) all(trigger[to]) _FIGHT_],newability[create(Octopus:Creature Octopus:8/8:blue)*3])) forever dontremove
text=+1: Untap up to one target creature and up to one target land. -- ⿿2: Reveal the top four cards of your library. You may put a creature card and/or a land card from among them into your hand. Put the rest into your graveyard. -- ⿿8: You get an emblem with "Whenever a creature enters the battlefield under your control, you may have it fight target creature." Then create three 8/8 blue Octopus creature tokens.
mana={2}{G}{U}
type=Legendary Planeswalker
subtype=Kiora
[/card]
[card]
name=Kiora, the Crashing Wave name=Kiora, the Crashing Wave
auto=counter(0/0,2,loyalty) auto=counter(0/0,2,loyalty)
auto={C(0/0,1,Loyalty)}:name(+1: Prevention all damage dealt by and to) target(*|opponentbattlefield) transforms((,newability[preventalldamage from(this)],newability[preventalldamage to(this)])) uynt auto={C(0/0,1,Loyalty)}:name(+1: Prevention all damage dealt by and to) target(*|opponentbattlefield) transforms((,newability[preventalldamage from(this)],newability[preventalldamage to(this)])) uynt
@@ -2140,7 +2191,7 @@ subtype=Windgrace
[card] [card]
name=Lukka, Bound to Ruin name=Lukka, Bound to Ruin
auto=ifnot paid(alternative) then counter(0/0,5,loyalty) auto=ifnot paid(alternative) then counter(0/0,5,loyalty)
auto=if paid(alternative) then counter(0/0,3,loyalty) auto=alternative counter(0/0,3,loyalty)
auto=aslongas(creature|mybattlefield,myrestrictedcastingzone) {C(0/0,+1,Loyalty)}:name(+1: Add mana) name(+1: Add mana) add{R}{G} auto=aslongas(creature|mybattlefield,myrestrictedcastingzone) {C(0/0,+1,Loyalty)}:name(+1: Add mana) name(+1: Add mana) add{R}{G}
auto={C(0/0,-1,Loyalty)}:name(-1: Create beast) token(Phyrexian Beast,Creature Phyrexian Beast,3/3,green,poisontoxic) auto={C(0/0,-1,Loyalty)}:name(-1: Create beast) token(Phyrexian Beast,Creature Phyrexian Beast,3/3,green,poisontoxic)
auto=aslongas(creature[power=1]|mybattlefield) {C(0/0,-4,Loyalty)}:name(-4: Deal 1 damage) name(-4: Deal 1 damage) thisforeach(variable{1}) ability$!name(Deal 1 damage) damage:1 target(*[creature;planeswalker]|battlefield)!$ controller auto=aslongas(creature[power=1]|mybattlefield) {C(0/0,-4,Loyalty)}:name(-4: Deal 1 damage) name(-4: Deal 1 damage) thisforeach(variable{1}) ability$!name(Deal 1 damage) damage:1 target(*[creature;planeswalker]|battlefield)!$ controller
@@ -2312,7 +2363,7 @@ subtype=Nahiri
[card] [card]
name=Nahiri, the Unforgiving name=Nahiri, the Unforgiving
auto=ifnot paid(alternative) then counter(0/0,5,loyalty) auto=ifnot paid(alternative) then counter(0/0,5,loyalty)
auto=if paid(alternative) then counter(0/0,3,loyalty) auto=alternative counter(0/0,3,loyalty)
auto={C(0/0,+1,Loyalty)}:name(+1: Creature must attack) target(creature|battlefield) transforms((,newability[mustattack])) uynt auto={C(0/0,+1,Loyalty)}:name(+1: Creature must attack) target(creature|battlefield) transforms((,newability[mustattack])) uynt
auto={C(0/0,+1,Loyalty)}:name(+1: Don't target any creature) donothing auto={C(0/0,+1,Loyalty)}:name(+1: Don't target any creature) donothing
auto={C(0/0,+1,Loyalty)}:name(+1: Discard and draw) _DISCARD&DRAW_ auto={C(0/0,+1,Loyalty)}:name(+1: Discard and draw) _DISCARD&DRAW_
@@ -2501,7 +2552,7 @@ subtype=Nissa
[card] [card]
name=Nissa, Ascended Animist name=Nissa, Ascended Animist
auto=ifnot paid(kicker) then ifnot paid(alternative) then counter(0/0,7,loyalty) auto=ifnot paid(kicker) then ifnot paid(alternative) then counter(0/0,7,loyalty)
auto=if paid(alternative) then counter(0/0,5,loyalty) auto=alternative counter(0/0,5,loyalty)
auto=if paid(kicker) then counter(0/0,3,loyalty) auto=if paid(kicker) then counter(0/0,3,loyalty)
auto={C(0/0,+1,Loyalty)}:name(+1: Create horror) token(Phyrexian Horror,Creature Phyrexian Horror,hascntloyalty/hascntloyalty,green) auto={C(0/0,+1,Loyalty)}:name(+1: Create horror) token(Phyrexian Horror,Creature Phyrexian Horror,hascntloyalty/hascntloyalty,green)
auto={C(0/0,-1,Loyalty)}:name(-1: Destroy artifact or enchantment) destroy target(*[artifact;enchantment]|battlefield) auto={C(0/0,-1,Loyalty)}:name(-1: Destroy artifact or enchantment) destroy target(*[artifact;enchantment]|battlefield)
@@ -2764,7 +2815,7 @@ otherrestriction=can play planeswalker,compare(isflipped)~equalto~1
restriction=compare(isflipped)~equalto~0 restriction=compare(isflipped)~equalto~0
anyzone={0}:doubleside(Will, Scholar of Frost) anyzone={0}:doubleside(Will, Scholar of Frost)
autostack=if paid(alternative) then name(Will, Scholar of Frost) name(Will, Scholar of Frost) flip(Will, Scholar of Frost) forcetype(Legendary Planeswalker) autostack=if paid(alternative) then name(Will, Scholar of Frost) name(Will, Scholar of Frost) flip(Will, Scholar of Frost) forcetype(Legendary Planeswalker)
auto=if paid(alternative) then counter(0/0,4,Loyalty) else counter(0/0,2,loyalty) auto=alternative counter(0/0,4,Loyalty) else counter(0/0,2,loyalty)
auto=this(variable{isflipped}<1) lord(instant,sorcery|mycastingzone) altercost(colorless,-1) auto=this(variable{isflipped}<1) lord(instant,sorcery|mycastingzone) altercost(colorless,-1)
auto=this(variable{isflipped}<1) {C(0/0,1,Loyalty)}:name(+1: Deals damage) name(+1: Deals damage) if compare(pdrewcount)~lessthan~3 then damage:1 opponent else damage:3 opponent auto=this(variable{isflipped}<1) {C(0/0,1,Loyalty)}:name(+1: Deals damage) name(+1: Deals damage) if compare(pdrewcount)~lessthan~3 then damage:1 opponent else damage:3 opponent
auto=this(variable{isflipped}<1) {C(0/0,-4,Loyalty)}:name(-4: Emblem copy spells) name(-4: Emblem copy spells) emblem transforms((,newability[@movedto(*[instant;sorcery]|mystack):all(trigger[to]<1>) transforms((,newability[pay[[{2}]] name(copy spell) activate name(copy spell) castcard(copied noevent)])) forever])) forever dontremove auto=this(variable{isflipped}<1) {C(0/0,-4,Loyalty)}:name(-4: Emblem copy spells) name(-4: Emblem copy spells) emblem transforms((,newability[@movedto(*[instant;sorcery]|mystack):all(trigger[to]<1>) transforms((,newability[pay[[{2}]] name(copy spell) activate name(copy spell) castcard(copied noevent)])) forever])) forever dontremove
@@ -2812,7 +2863,7 @@ abilities=canbecommander
auto=counter(0/0,4,loyalty) auto=counter(0/0,4,loyalty)
auto={C(0/0,1,Loyalty)}:name(+1: Create a 1/1 colorless Servo) _SERVOTOKEN_ auto={C(0/0,1,Loyalty)}:name(+1: Create a 1/1 colorless Servo) _SERVOTOKEN_
auto={C(0/0,1,Loyalty)}:name(-1: The next spell has affinity for artifacts) target(*|mycastingzone) transforms((,newability[affinityartifacts])) ueot auto={C(0/0,1,Loyalty)}:name(-1: The next spell has affinity for artifacts) target(*|mycastingzone) transforms((,newability[affinityartifacts])) ueot
auto={C(0/0,-7,Loyalty)}:name(-7: Create a token for each artifact) clone all(artifact|mybattlefield) with (unearth) auto={C(0/0,-7,Loyalty)}:name(-7: Create a token for each artifact) clone all(artifact|mybattlefield) with(unearth)
text=+1: Create a 1/1 colorless Servo artifact creature token. -- +1: The next spell you cast this turn costs {1} less to cast for each artifact you control as you cast it. -- -7: For each artifact you control, create a token that's a copy of it. Those tokens gain haste. Exile those tokens at the beginning of the next end step. -- Saheeli, the Gifted can be your commander. text=+1: Create a 1/1 colorless Servo artifact creature token. -- +1: The next spell you cast this turn costs {1} less to cast for each artifact you control as you cast it. -- -7: For each artifact you control, create a token that's a copy of it. Those tokens gain haste. Exile those tokens at the beginning of the next end step. -- Saheeli, the Gifted can be your commander.
mana={2}{U}{R} mana={2}{U}{R}
type=Legendary Planeswalker type=Legendary Planeswalker
@@ -3097,7 +3148,7 @@ subtype=Tamiyo
[card] [card]
name=Tamiyo, Compleated Sage name=Tamiyo, Compleated Sage
auto=ifnot paid(alternative) then counter(0/0,5,loyalty) auto=ifnot paid(alternative) then counter(0/0,5,loyalty)
auto=if paid(alternative) then counter(0/0,3,loyalty) auto=alternative counter(0/0,3,loyalty)
auto={C(0/0,+1,Loyalty)}:name(+1: Tap artifact or creature) target(*[artifact;creature]|battlefield) freeze auto={C(0/0,+1,Loyalty)}:name(+1: Tap artifact or creature) target(*[artifact;creature]|battlefield) freeze
auto={C(0/0,+1,Loyalty)}:name(+1: Don't tap anything) donothing auto={C(0/0,+1,Loyalty)}:name(+1: Don't tap anything) donothing
auto={C(0/0,0,Loyalty)}:name(0: Exile and copy with cost 0) target(*[-land&manacost=0]|mygraveyard) moveto(myexile) and!( clone )! auto={C(0/0,0,Loyalty)}:name(0: Exile and copy with cost 0) target(*[-land&manacost=0]|mygraveyard) moveto(myexile) and!( clone )!
@@ -3235,6 +3286,7 @@ auto=counter(0/0,5,loyalty)
aicode=activate transforms((,newability[moveto(myhand) all(*[zpos=1]|mylibrary) && bottomoflibrary all(*[zpos=2]|mylibrary)])) ueot aicode=activate transforms((,newability[moveto(myhand) all(*[zpos=1]|mylibrary) && bottomoflibrary all(*[zpos=2]|mylibrary)])) ueot
auto={C(0/0,1,Loyalty)}:name(+1: Look at the top two, one in hand other to bottom) name(Look) reveal:2 optionone name(Get a card) target(<1>*|reveal) moveto(myhand) optiononeend optiontwo name(put on bottom) target(<2>*|reveal) bottomoflibrary optiontwoend revealend auto={C(0/0,1,Loyalty)}:name(+1: Look at the top two, one in hand other to bottom) name(Look) reveal:2 optionone name(Get a card) target(<1>*|reveal) moveto(myhand) optiononeend optiontwo name(put on bottom) target(<2>*|reveal) bottomoflibrary optiontwoend revealend
auto={C(0/0,-1,Loyalty)}:name(-1: Untap up to four permanents) untap target(<upto:4>*|battlefield) auto={C(0/0,-1,Loyalty)}:name(-1: Untap up to four permanents) untap target(<upto:4>*|battlefield)
auto={C(0/0,-10,Loyalty)}:name(Emblem) emblem transforms((,newability[lord(planeswalker|myBattlefield) canloyaltyasinst])) forever dontremove
text=+1: Look at the top two cards of your library. Put one of them into your hand and the other on the bottom of your library. -- -1: Untap up to four target permanents. -- -10: You get an emblem with "You may activate loyalty abilities of planeswalkers you control on any player's turn any time you could cast an instant." -- Teferi, Temporal Archmage can be your commander. text=+1: Look at the top two cards of your library. Put one of them into your hand and the other on the bottom of your library. -- -1: Untap up to four target permanents. -- -10: You get an emblem with "You may activate loyalty abilities of planeswalkers you control on any player's turn any time you could cast an instant." -- Teferi, Temporal Archmage can be your commander.
mana={4}{U}{U} mana={4}{U}{U}
type=Legendary Planeswalker type=Legendary Planeswalker
@@ -3614,6 +3666,19 @@ type=Legendary Planeswalker
subtype=Tyvar subtype=Tyvar
[/card] [/card]
[card] [card]
name=Ugin, Eye of the Storms
auto=counter(0/0,7,loyalty)
autostack=may moveTo(exile) target(*[white;blue;black;red;green])
auto=@movedTo(*[colorless]|mystack):may moveTo(exile) target(*[white;blue;black;red;green])
auto={C(0/0,+2,Loyalty)}:life:3 && draw:1
auto={C(0/0,0,Loyalty)}:Add{C}{C}{C}
auto={C(0/0,-11,Loyalty)}:target(<anyAmount>*[colorless]|myLibrary) moveTo(exile) and!( transforms((,newability[zerocast],newability[canplayfromexile])) ueot )!
text=When you cast this spell, exile up to one target permanent that's one or more colors. -- Whenever you cast a colorless spell, exile up to one target permanent that's one or more colors. -- [+2]: You gain 3 life and draw a card. -- [0]: Add {C}{C}{C}. -- [-11]: Search your library for any number of colorless nonland cards, exile them, then shuffle. Until end of turn, you may cast those cards without paying their mana costs.
mana={7}
type=Legendary Planeswalker
subtype=Ugin
[/card]
[card]
name=Ugin, the Ineffable name=Ugin, the Ineffable
auto=counter(0/0,4,loyalty) auto=counter(0/0,4,loyalty)
auto=lord(*[colorless]|mycastingzone) altercost(colorless,-2) auto=lord(*[colorless]|mycastingzone) altercost(colorless,-2)
@@ -3680,7 +3745,7 @@ subtype=Venser
name=Vivien Reid name=Vivien Reid
auto=counter(0/0,5,loyalty) auto=counter(0/0,5,loyalty)
aicode=activate moveto(myhand) target(*[creature;land;zpos<=4]|mylibrary) aicode=activate moveto(myhand) target(*[creature;land;zpos<=4]|mylibrary)
auto={C(0/0,+1,Loyalty)}:name(+1: Look four and put creature or land in hand) name(look) reveal:4 optionone name(Get a creature or land) target(<1>*[creature;land]|reveal) moveto(myhand) optiononeend optiontwo name(put on bottom) target(<4>*|reveal) bottomoflibrary optiontwoend revealend auto={C(0/0,+1,Loyalty)}:name(+1: Look four and put creature or land in hand) name(look) reveal:4 optionone name(Get a creature or land) target(<1>*[creature;land]|reveal) moveto(myhand) optiononeend optiontwo name(put on bottom) all(*|reveal) bottomoflibrary optiontwoend revealend
auto={C(0/0,-3,Loyalty)}:name(-3: Destroy target artifact) destroy target(artifact) auto={C(0/0,-3,Loyalty)}:name(-3: Destroy target artifact) destroy target(artifact)
auto={C(0/0,-3,Loyalty)}:name(-3: Destroy target enchantment) destroy target(enchantment) auto={C(0/0,-3,Loyalty)}:name(-3: Destroy target enchantment) destroy target(enchantment)
auto={C(0/0,-3,Loyalty)}:name(-3: Destroy target creature with flying) destroy target(creature[flying]) auto={C(0/0,-3,Loyalty)}:name(-3: Destroy target creature with flying) destroy target(creature[flying])
@@ -3730,7 +3795,7 @@ abilities=showfromtoplibrary,canplaycreaturelibrarytop
aicode=activate moveto(myBattlefield) target(creature[manacost<=storedmanacost]|mylibrary) aicode=activate moveto(myBattlefield) target(creature[manacost<=storedmanacost]|mylibrary)
auto=counter(0/0,3,Loyalty) auto=counter(0/0,3,Loyalty)
auto={C(0/0,1,Loyalty)}:name(+1: Create a Creature Beast 3/3) token(Beast Viv) auto={C(0/0,1,Loyalty)}:name(+1: Create a Creature Beast 3/3) token(Beast Viv)
auto={C(0/0,-2,Loyalty)}:name(-2: Cast a creature to search a lesser creature) emblem transforms((,newability[@movedTo(creature|myStak):moveTo(myBattlefield) target(creature[manacost<=storedmanacost]|myLibrary) && shuffle])) oneshot auto={C(0/0,-2,Loyalty)}:name(-2: Cast a creature to search a lesser creature) emblem transforms((,newability[@movedTo(creature|myStack):moveTo(myBattlefield) target(creature[manacost<=storedmanacost]|myLibrary) && shuffle])) oneshot
text=You may look at the top card of your library any time. -- You may cast creature spells from the top of your library. -- +1: Create a 3/3 green Beast creature token. Put your choice of a vigilance counter, a reach counter, or a trample counter on it. -- -2: When you cast your next creature spell this turn, search your library for a creature card with lesser mana value, put it onto the battlefield, then shuffle. text=You may look at the top card of your library any time. -- You may cast creature spells from the top of your library. -- +1: Create a 3/3 green Beast creature token. Put your choice of a vigilance counter, a reach counter, or a trample counter on it. -- -2: When you cast your next creature spell this turn, search your library for a creature card with lesser mana value, put it onto the battlefield, then shuffle.
mana={3}{G}{G} mana={3}{G}{G}
type=Legendary Planeswalker type=Legendary Planeswalker
@@ -3761,7 +3826,7 @@ subtype=Vraska
[/card] [/card]
[card] [card]
name=Vraska, Betrayal's Sting name=Vraska, Betrayal's Sting
auto=if paid(alternative) then counter(0/0,4,loyalty) auto=alternative counter(0/0,4,loyalty)
auto=ifnot paid(alternative) then counter(0/0,6,loyalty) auto=ifnot paid(alternative) then counter(0/0,6,loyalty)
auto={C(0/0,0,Loyalty)}:name(0: Draw card and lose life) draw:1 controller && life:-1 controller && _PROLIFERATE_ auto={C(0/0,0,Loyalty)}:name(0: Draw card and lose life) draw:1 controller && life:-1 controller && _PROLIFERATE_
auto={C(0/0,-2,Loyalty)}:name(-2: Creature becomes treasure) target(creature|battlefield) transforms((removeallsubtypes,removeallcolors,newability[becomes(Treasure artifact)],,newability[{T}{S}:Add{W}],newability[{T}{S}:Add{U}],newability[{T}{S}:Add{B}],newability[{T}{S}:Add{R}],newability[{T}{S}:Add{G}])) forever auto={C(0/0,-2,Loyalty)}:name(-2: Creature becomes treasure) target(creature|battlefield) transforms((removeallsubtypes,removeallcolors,newability[becomes(Treasure artifact)],,newability[{T}{S}:Add{W}],newability[{T}{S}:Add{U}],newability[{T}{S}:Add{B}],newability[{T}{S}:Add{R}],newability[{T}{S}:Add{G}])) forever
@@ -3927,4 +3992,4 @@ text=+1: Creatures you control get +1/+0 and gain haste until end of turn. -- 0:
mana={2}{R}{R} mana={2}{R}{R}
type=Legendary Planeswalker type=Legendary Planeswalker
subtype=Zariel subtype=Zariel
[/card] [/card]
+1 -1
View File
@@ -2,5 +2,5 @@
#Sun, 20 May 2020 11:56:35 +0200 #Sun, 20 May 2020 11:56:35 +0200
build.major=0 build.major=0
build.minor=25 build.minor=25
build.point=3 build.point=5
+1 -1
View File
@@ -76,7 +76,7 @@ class AIPlayerBaka: public AIPlayer{
virtual int chooseBlockers(); virtual int chooseBlockers();
virtual int canFirstStrikeKill(MTGCardInstance * card, MTGCardInstance *ennemy); virtual int canFirstStrikeKill(MTGCardInstance * card, MTGCardInstance *ennemy);
virtual int effectBadOrGood(MTGCardInstance * card, int mode = MODE_PUTINTOPLAY, TargetChooser * tc = NULL); virtual int effectBadOrGood(MTGCardInstance * card, int mode = MODE_PUTINTOPLAY, TargetChooser * tc = NULL);
virtual bool shouldAIForceAttack(MTGCardInstance* card, bool globalAttack);
// returns 1 if the AI algorithm supports a given cost (ex:simple mana cost), 0 otherwise (ex: cost involves Sacrificing a target) // returns 1 if the AI algorithm supports a given cost (ex:simple mana cost), 0 otherwise (ex: cost involves Sacrificing a target)
virtual int CanHandleCost(ManaCost * cost, MTGCardInstance * card = NULL); virtual int CanHandleCost(ManaCost * cost, MTGCardInstance * card = NULL);
+2 -1
View File
@@ -364,7 +364,8 @@ class Constants
EQPASINST = 235, EQPASINST = 235,
CANLOYALTYASINST = 236, CANLOYALTYASINST = 236,
CANPLAYENCHANTMENTTOPLIBRARY = 237,//enchantment CANPLAYENCHANTMENTTOPLIBRARY = 237,//enchantment
NB_BASIC_ABILITIES = 238, AFFINITYTWOALLDEADCREATURES = 238,
NB_BASIC_ABILITIES = 239,
RARITY_S = 'S', //Special Rarity RARITY_S = 'S', //Special Rarity
RARITY_M = 'M', //Mythics RARITY_M = 'M', //Mythics
+1 -1
View File
@@ -26,7 +26,7 @@ public:
TYPE_EQUIPMENT = 11, TYPE_EQUIPMENT = 11,
TYPE_AURA = 12, TYPE_AURA = 12,
TYPE_PLANESWALKER = 13, TYPE_PLANESWALKER = 13,
TYPE_TRIBAL = 14, TYPE_KINDRED = 14,
TYPE_PLANE = 15, TYPE_PLANE = 15,
TYPE_SCHEME = 16, TYPE_SCHEME = 16,
TYPE_VANGUARD = 17, TYPE_VANGUARD = 17,
+1 -1
View File
@@ -14,7 +14,7 @@ Mod by: Vitty85
/* Wagic versions */ /* Wagic versions */
#define WAGIC_VERSION_MAJOR 0 #define WAGIC_VERSION_MAJOR 0
#define WAGIC_VERSION_MEDIUM 25 #define WAGIC_VERSION_MEDIUM 25
#define WAGIC_VERSION_MINOR 3 #define WAGIC_VERSION_MINOR 5
#define VERSION_DOT(a, b, c) a ##.## b ##.## c #define VERSION_DOT(a, b, c) a ##.## b ##.## c
#define VERSION_WITHOUT_DOT(a, b, c) a ## b ## c #define VERSION_WITHOUT_DOT(a, b, c) a ## b ## c
+344 -171
View File
@@ -46,9 +46,9 @@ int OrderedAIAction::getEfficiency(AADamager * aad)
return 0; return 0;
} }
if(p && target) if(p && target)
if(p == target->controller()) if(p == target->controller())
return 0; return 0;
if (dTarget && aad && (aad->getDamage() == dTarget->toughness)) if (dTarget && aad && (aad->getDamage() == dTarget->toughness))
return 100; return 100;
@@ -107,7 +107,7 @@ int OrderedAIAction::getEfficiency()
{ {
target = a->source; target = a->source;
} }
AACastCard * CC = dynamic_cast<AACastCard*> (a); AACastCard * CC = dynamic_cast<AACastCard*> (a);
if (CC) if (CC)
return 99; return 99;
@@ -126,13 +126,13 @@ int OrderedAIAction::getEfficiency()
break; break;
if (!coreAbilityCardTarget->regenerateTokens && currentPhase == MTG_PHASE_COMBATBLOCKERS if (!coreAbilityCardTarget->regenerateTokens && currentPhase == MTG_PHASE_COMBATBLOCKERS
&& (coreAbilityCardTarget->defenser || coreAbilityCardTarget->blockers.size()) && (coreAbilityCardTarget->defenser || coreAbilityCardTarget->blockers.size())
) )
{ {
efficiency = 95; efficiency = 95;
} }
//TODO If the card is the target of a damage spell //TODO If the card is the target of a damage spell
break; break;
} }
case MTGAbility::STANDARD_PREVENT: case MTGAbility::STANDARD_PREVENT:
{ {
@@ -272,7 +272,7 @@ int OrderedAIAction::getEfficiency()
} }
case MTGAbility::STANDARD_PUMP: case MTGAbility::STANDARD_PUMP:
{ {
efficiency = 0; efficiency = 0;
if(!coreAbilityCardTarget) if(!coreAbilityCardTarget)
break; break;
if(!target && !dynamic_cast<ALord*> (a) && (((MTGCardInstance *)a->source)->hasSubtype(Subtypes::TYPE_AURA) || ((MTGCardInstance *)a->source)->hasSubtype(Subtypes::TYPE_EQUIPMENT))) if(!target && !dynamic_cast<ALord*> (a) && (((MTGCardInstance *)a->source)->hasSubtype(Subtypes::TYPE_AURA) || ((MTGCardInstance *)a->source)->hasSubtype(Subtypes::TYPE_EQUIPMENT)))
@@ -296,9 +296,9 @@ int OrderedAIAction::getEfficiency()
int suggestion = af.abilityEfficiency(a, p, MODE_ABILITY); int suggestion = af.abilityEfficiency(a, p, MODE_ABILITY);
//i do not set a starting eff. on this ability, this allows Ai to sometimes randomly do it as it normally does. //i do not set a starting eff. on this ability, this allows Ai to sometimes randomly do it as it normally does.
int currentPhase = g->getCurrentGamePhase(); int currentPhase = g->getCurrentGamePhase();
if ((currentPhase == MTG_PHASE_COMBATBLOCKERS) || (currentPhase == MTG_PHASE_COMBATATTACKERS)) if ((currentPhase == MTG_PHASE_COMBATBLOCKERS) || (currentPhase == MTG_PHASE_COMBATATTACKERS))
{ {
if (suggestion == BAKA_EFFECT_GOOD && target->controller() == p) if (suggestion == BAKA_EFFECT_GOOD && target->controller() == p)
{ {
if(coreAbilityCardTarget->defenser || coreAbilityCardTarget->blockers.size()) if(coreAbilityCardTarget->defenser || coreAbilityCardTarget->blockers.size())
{ {
@@ -350,30 +350,30 @@ int OrderedAIAction::getEfficiency()
break; break;
} }
case MTGAbility::MANA_PRODUCER://only way to hit this condition is nested manaabilities, ai skips manaproducers by defualt when finding an ability to use. case MTGAbility::MANA_PRODUCER://only way to hit this condition is nested manaabilities, ai skips manaproducers by defualt when finding an ability to use.
{ {
AManaProducer * manamaker = dynamic_cast<AManaProducer*>(a); AManaProducer * manamaker = dynamic_cast<AManaProducer*>(a);
GenericActivatedAbility * GAA = dynamic_cast<GenericActivatedAbility*>(ability); GenericActivatedAbility * GAA = dynamic_cast<GenericActivatedAbility*>(ability);
if(GAA) if(GAA)
{ {
AForeach * forMana = dynamic_cast<AForeach*>(GAA->ability); AForeach * forMana = dynamic_cast<AForeach*>(GAA->ability);
if (manamaker && forMana) if (manamaker && forMana)
{ {
int outPut = forMana->checkActivation(); int outPut = forMana->checkActivation();
if (ability->getCost() && outPut > int(ability->getCost()->getConvertedCost() +1) && currentPhase == MTG_PHASE_FIRSTMAIN && ability->source->controller()->game->hand->nb_cards > 1) if (ability->getCost() && outPut > int(ability->getCost()->getConvertedCost() +1) && currentPhase == MTG_PHASE_FIRSTMAIN && ability->source->controller()->game->hand->nb_cards > 1)
efficiency = 60;//might be a bit random, but better than never using them. efficiency = 60;//might be a bit random, but better than never using them.
} }
} }
else else
efficiency = 0; efficiency = 0;
break; break;
} }
case MTGAbility::STANDARDABILITYGRANT: case MTGAbility::STANDARDABILITYGRANT:
{ {
efficiency = 0; efficiency = 0;
if (!target) if (!target)
break; break;
//ensuring that Ai grants abilities to creatures during first main, so it can actually use them in combat. //ensuring that Ai grants abilities to creatures during first main, so it can actually use them in combat.
//quick note: the eff is multiplied by creatures ranking then divided by the number of cards in hand. //quick note: the eff is multiplied by creatures ranking then divided by the number of cards in hand.
//the reason i do this is to encourage more casting and less waste of mana on abilities. //the reason i do this is to encourage more casting and less waste of mana on abilities.
@@ -391,8 +391,8 @@ int OrderedAIAction::getEfficiency()
} }
if (!target->has(a->abilitygranted) && g->getCurrentGamePhase() == MTG_PHASE_COMBATBEGIN if (!target->has(a->abilitygranted) && g->getCurrentGamePhase() == MTG_PHASE_COMBATBEGIN
&& p == target->controller() && p == target->controller()
) )
{ {
efficiency += efficiencyModifier; efficiency += efficiencyModifier;
} }
@@ -404,8 +404,8 @@ int OrderedAIAction::getEfficiency()
} }
if ((suggestion == BAKA_EFFECT_BAD && p == target->controller()) if ((suggestion == BAKA_EFFECT_BAD && p == target->controller())
|| (suggestion == BAKA_EFFECT_GOOD && p != target->controller()) || (suggestion == BAKA_EFFECT_GOOD && p != target->controller())
) )
{ {
efficiency = 0; efficiency = 0;
//stop giving trample to the players creatures. //stop giving trample to the players creatures.
@@ -547,13 +547,13 @@ int OrderedAIAction::getEfficiency()
} }
} }
if ((suggestion == BAKA_EFFECT_BAD && p == target->controller()) if ((suggestion == BAKA_EFFECT_BAD && p == target->controller())
|| (suggestion == BAKA_EFFECT_GOOD && p != target->controller())) || (suggestion == BAKA_EFFECT_GOOD && p != target->controller()))
{ {
efficiency = 0; efficiency = 0;
} }
else else
{ {
//without a base to start with Wrand % 5 almost always returns 0. //without a base to start with Wrand % 5 almost always returns 0.
efficiency = 10 + (owner->getRandomGenerator()->random() % 20); //Small percentage of chance for unknown abilities efficiency = 10 + (owner->getRandomGenerator()->random() % 20); //Small percentage of chance for unknown abilities
} }
} }
@@ -650,7 +650,7 @@ int OrderedAIAction::getEfficiency()
} }
if(p->game->battlefield->countByType("token") >= 25) if(p->game->battlefield->countByType("token") >= 25)
efficiency = 0; efficiency = 0;
} }
else if (GenericRevealAbility * grA = dynamic_cast<GenericRevealAbility *>(a)) else if (GenericRevealAbility * grA = dynamic_cast<GenericRevealAbility *>(a))
{ {
@@ -684,7 +684,7 @@ int OrderedAIAction::getEfficiency()
{ {
AIPlayer * chk = (AIPlayer*)p; AIPlayer * chk = (AIPlayer*)p;
if(may->ability && may->ability->getActionTc() && chk->chooseTarget(may->ability->getActionTc(),NULL,NULL,true)) if(may->ability && may->ability->getActionTc() && chk->chooseTarget(may->ability->getActionTc(),NULL,NULL,true))
efficiency = 50 + (owner->getRandomGenerator()->random() % 50); efficiency = 50 + (owner->getRandomGenerator()->random() % 50);
} }
if (p->game->hand->nb_cards == 0) if (p->game->hand->nb_cards == 0)
efficiency = (int) ((float) efficiency * 1.3); //increase chance of using ability if hand is empty efficiency = (int) ((float) efficiency * 1.3); //increase chance of using ability if hand is empty
@@ -720,18 +720,18 @@ int OrderedAIAction::getEfficiency()
{ {
efficiency += 55; efficiency += 55;
} }
if (ability->source) if (ability->source)
{ {
if(ability->source->hasType(Subtypes::TYPE_PLANESWALKER) || ability->source->hasType(Subtypes::TYPE_BATTLE)) if(ability->source->hasType(Subtypes::TYPE_PLANESWALKER) || ability->source->hasType(Subtypes::TYPE_BATTLE))
efficiency += 50; efficiency += 50;
else if(ability->source->hasType(Subtypes::TYPE_LAND)) else if(ability->source->hasType(Subtypes::TYPE_LAND))
{ // probably a shockland, don't pay life if hand is empty { // probably a shockland, don't pay life if hand is empty
if (p->life<=2) if (p->life<=2)
// check that's not a manland(like Celestial Colonnade) // check that's not a manland(like Celestial Colonnade)
if(efficiency < 50) if(efficiency < 50)
efficiency = 0; efficiency = 0;
} }
} }
SAFE_DELETE(transAbility); SAFE_DELETE(transAbility);
@@ -781,7 +781,7 @@ int OrderedAIAction::getRevealedEfficiency(MTGAbility * ability2)
{ {
target = a->source; target = a->source;
} }
AACastCard * CC = dynamic_cast<AACastCard*> (a); AACastCard * CC = dynamic_cast<AACastCard*> (a);
if (CC) if (CC)
return 99; return 99;
@@ -800,8 +800,8 @@ int OrderedAIAction::getRevealedEfficiency(MTGAbility * ability2)
break; break;
if (!coreAbilityCardTarget->regenerateTokens && currentPhase == MTG_PHASE_COMBATBLOCKERS if (!coreAbilityCardTarget->regenerateTokens && currentPhase == MTG_PHASE_COMBATBLOCKERS
&& (coreAbilityCardTarget->defenser || coreAbilityCardTarget->blockers.size()) && (coreAbilityCardTarget->defenser || coreAbilityCardTarget->blockers.size())
) )
{ {
eff2 = 95; eff2 = 95;
} }
@@ -1010,27 +1010,27 @@ int OrderedAIAction::getRevealedEfficiency(MTGAbility * ability2)
break; break;
} }
case MTGAbility::MANA_PRODUCER://only way to hit this condition is nested manaabilities, ai skips manaproducers by defualt when finding an ability to use. case MTGAbility::MANA_PRODUCER://only way to hit this condition is nested manaabilities, ai skips manaproducers by defualt when finding an ability to use.
{
AManaProducer * manamaker = dynamic_cast<AManaProducer*>(a);
GenericActivatedAbility * GAA = dynamic_cast<GenericActivatedAbility*>(ability2);
AForeach * forMana = dynamic_cast<AForeach*>(GAA->ability);
if (manamaker && forMana)
{ {
int outPut = forMana->checkActivation(); AManaProducer * manamaker = dynamic_cast<AManaProducer*>(a);
if (ability2->getCost() && outPut > int(ability2->getCost()->getConvertedCost() +1) && currentPhase == MTG_PHASE_FIRSTMAIN && ability2->source->controller()->game->hand->nb_cards > 1) GenericActivatedAbility * GAA = dynamic_cast<GenericActivatedAbility*>(ability2);
eff2 = 60;//might be a bit random, but better than never using them. AForeach * forMana = dynamic_cast<AForeach*>(GAA->ability);
if (manamaker && forMana)
{
int outPut = forMana->checkActivation();
if (ability2->getCost() && outPut > int(ability2->getCost()->getConvertedCost() +1) && currentPhase == MTG_PHASE_FIRSTMAIN && ability2->source->controller()->game->hand->nb_cards > 1)
eff2 = 60;//might be a bit random, but better than never using them.
}
else
eff2 = 0;
break;
} }
else
eff2 = 0;
break;
}
case MTGAbility::STANDARDABILITYGRANT: case MTGAbility::STANDARDABILITYGRANT:
{ {
eff2 = 0; eff2 = 0;
if (!target) if (!target)
break; break;
//ensuring that Ai grants abilities to creatures during first main, so it can actually use them in combat. //ensuring that Ai grants abilities to creatures during first main, so it can actually use them in combat.
//quick note: the eff is multiplied by creatures ranking then divided by the number of cards in hand. //quick note: the eff is multiplied by creatures ranking then divided by the number of cards in hand.
//the reason i do this is to encourage more casting and less waste of mana on abilities. //the reason i do this is to encourage more casting and less waste of mana on abilities.
@@ -1048,8 +1048,8 @@ int OrderedAIAction::getRevealedEfficiency(MTGAbility * ability2)
} }
if (!target->has(a->abilitygranted) && g->getCurrentGamePhase() == MTG_PHASE_COMBATBEGIN if (!target->has(a->abilitygranted) && g->getCurrentGamePhase() == MTG_PHASE_COMBATBEGIN
&& p == target->controller() && p == target->controller()
) )
{ {
eff2 += eff2Modifier; eff2 += eff2Modifier;
} }
@@ -1061,8 +1061,8 @@ int OrderedAIAction::getRevealedEfficiency(MTGAbility * ability2)
} }
if ((suggestion == BAKA_EFFECT_BAD && p == target->controller()) if ((suggestion == BAKA_EFFECT_BAD && p == target->controller())
|| (suggestion == BAKA_EFFECT_GOOD && p != target->controller()) || (suggestion == BAKA_EFFECT_GOOD && p != target->controller())
) )
{ {
eff2 = 0; eff2 = 0;
//stop giving trample to the players creatures. //stop giving trample to the players creatures.
@@ -1203,13 +1203,13 @@ int OrderedAIAction::getRevealedEfficiency(MTGAbility * ability2)
} }
} }
if ((suggestion == BAKA_EFFECT_BAD && p == target->controller()) if ((suggestion == BAKA_EFFECT_BAD && p == target->controller())
|| (suggestion == BAKA_EFFECT_GOOD && p != target->controller())) || (suggestion == BAKA_EFFECT_GOOD && p != target->controller()))
{ {
eff2 = 0; eff2 = 0;
} }
else else
{ {
//without a base to start with Wrand % 5 almost always returns 0. //without a base to start with Wrand % 5 almost always returns 0.
eff2 = 10 + (owner->getRandomGenerator()->random() % 20); //Small percentage of chance for unknown abilities eff2 = 10 + (owner->getRandomGenerator()->random() % 20); //Small percentage of chance for unknown abilities
} }
} }
@@ -1290,7 +1290,7 @@ int OrderedAIAction::getRevealedEfficiency(MTGAbility * ability2)
} }
if(p->game->battlefield->countByType("token") >= 25) if(p->game->battlefield->countByType("token") >= 25)
eff2 = 0; eff2 = 0;
} }
//At this point the "basic" eff2 is computed, we further tweak it depending on general decisions, independent of theAbility type //At this point the "basic" eff2 is computed, we further tweak it depending on general decisions, independent of theAbility type
@@ -1299,7 +1299,7 @@ int OrderedAIAction::getRevealedEfficiency(MTGAbility * ability2)
{ {
AIPlayer * chk = (AIPlayer*)p; AIPlayer * chk = (AIPlayer*)p;
if(may->ability && may->ability->getActionTc() && chk->chooseTarget(may->ability->getActionTc(),NULL,NULL,true)) if(may->ability && may->ability->getActionTc() && chk->chooseTarget(may->ability->getActionTc(),NULL,NULL,true))
eff2 = 50 + (owner->getRandomGenerator()->random() % 50); eff2 = 50 + (owner->getRandomGenerator()->random() % 50);
} }
if (p->game->hand->nb_cards == 0) if (p->game->hand->nb_cards == 0)
eff2 = (int) ((float) eff2 * 1.3); //increase chance of using ability if hand is empty eff2 = (int) ((float) eff2 * 1.3); //increase chance of using ability if hand is empty
@@ -1351,7 +1351,7 @@ MTGCardInstance * AIPlayerBaka::chooseCard(TargetChooser * tc, MTGCardInstance *
MTGPlayerCards * playerZones = source->controller()->game; MTGPlayerCards * playerZones = source->controller()->game;
if (comboHint && comboHint->cardTargets.size()) if (comboHint && comboHint->cardTargets.size())
{ {
tc = GetComboTc(observer,tc); tc = GetComboTc(observer,tc);
} }
for(int players = 0; players < 2;++players) for(int players = 0; players < 2;++players)
{ {
@@ -1376,9 +1376,9 @@ MTGCardInstance * AIPlayerBaka::chooseCard(TargetChooser * tc, MTGCardInstance *
bool AIPlayerBaka::payTheManaCost(ManaCost * cost, int anytypeofmana, MTGCardInstance * target,vector<MTGAbility*>gotPayments) bool AIPlayerBaka::payTheManaCost(ManaCost * cost, int anytypeofmana, MTGCardInstance * target,vector<MTGAbility*>gotPayments)
{ {
DebugTrace("AIPlayerBaka: AI attempting to pay a mana cost." << endl DebugTrace("AIPlayerBaka: AI attempting to pay a mana cost." << endl
<< "- Target: " << (target ? target->name : "None" ) << endl << "- Target: " << (target ? target->name : "None" ) << endl
<< "- Cost: " << (cost ? cost->toString() : "NULL") ); << "- Cost: " << (cost ? cost->toString() : "NULL") );
if (!cost) if (!cost)
{ {
@@ -1450,7 +1450,7 @@ bool AIPlayerBaka::payTheManaCost(ManaCost * cost, int anytypeofmana, MTGCardIns
} }
} }
if(k == gotPayments.size()-1)//only add it once, and at the end. if(k == gotPayments.size()-1)//only add it once, and at the end.
paid->add(this->getManaPool());//incase some of our payments were mana already in the pool/. paid->add(this->getManaPool());//incase some of our payments were mana already in the pool/.
if(paid->canAfford(cost, anytypeofmana)) if(paid->canAfford(cost, anytypeofmana))
{ {
if((!cost->hasX() && !cost->hasAnotherCost()) || k == gotPayments.size()-1) if((!cost->hasX() && !cost->hasAnotherCost()) || k == gotPayments.size()-1)
@@ -1575,7 +1575,7 @@ vector<MTGAbility*> AIPlayerBaka::canPayMana(MTGCardInstance * target, ManaCost
if(!cost || (cost && !cost->getConvertedCost()) || !target) if(!cost || (cost && !cost->getConvertedCost()) || !target)
return vector<MTGAbility*>(); return vector<MTGAbility*>();
map<MTGCardInstance*, bool> usedCards; map<MTGCardInstance*, bool> usedCards;
return canPayMana(target, cost, anytypeofmana, usedCards); return canPayMana(target, cost, anytypeofmana, usedCards);
} }
@@ -1857,7 +1857,7 @@ vector<MTGAbility*> AIPlayerBaka::canPaySunBurst(ManaCost * cost)
} }
} }
} }
for(int i = fullColor;i < cost->getConvertedCost();i++) for(int i = fullColor;i < cost->getConvertedCost();i++)
{ {
for (size_t i = 0; i < observer->mLayers->actionLayer()->manaObjects.size(); i++) for (size_t i = 0; i < observer->mLayers->actionLayer()->manaObjects.size(); i++)
@@ -1902,7 +1902,7 @@ int AIPlayerBaka::CanHandleCost(ManaCost * cost, MTGCardInstance * card)
{ {
ec->costs[i]->setSource(card); ec->costs[i]->setSource(card);
if(!ec->costs[i]->tc->countValidTargets()) if(!ec->costs[i]->tc->countValidTargets())
return 0; return 0;
if(!chooseCard(ec->costs[i]->tc,card)) if(!chooseCard(ec->costs[i]->tc,card))
return 0; return 0;
} }
@@ -1981,7 +1981,7 @@ int AIPlayerBaka::createAbilityTargets(MTGAbility * a, MTGCardInstance * c, Rank
MTGCardInstance * cTargeting = dynamic_cast<MTGCardInstance*>(potentialTargets[0]); MTGCardInstance * cTargeting = dynamic_cast<MTGCardInstance*>(potentialTargets[0]);
if(cTargeting) if(cTargeting)
check = NEW OrderedAIAction(this, a,c,cTargeting); check = NEW OrderedAIAction(this, a,c,cTargeting);
Player * pTargeting = dynamic_cast<Player*>(potentialTargets[0]); Player * pTargeting = dynamic_cast<Player*>(potentialTargets[0]);
if(pTargeting) if(pTargeting)
@@ -2084,17 +2084,17 @@ int AIPlayerBaka::selectAbility()
} }
} }
} }
// Try Deck hints first // Try Deck hints first
if (selectHintAbility()) if (selectHintAbility())
return 1; return 1;
if(observer->mLayers->stackLayer()->lastActionController == this) if(observer->mLayers->stackLayer()->lastActionController == this)
{ {
//this is here for 2 reasons, MTG rules state that priority is passed with each action. //this is here for 2 reasons, MTG rules state that priority is passed with each action.
//without this ai is able to chain cast {t}:damage:1 target(creature) from everything it can all at once. //without this ai is able to chain cast {t}:damage:1 target(creature) from everything it can all at once.
//this not only is illegal but cause ai to waste abilities ei:all damage:1 on a single 1/1 creature. //this not only is illegal but cause ai to waste abilities ei:all damage:1 on a single 1/1 creature.
return 1; return 1;
} }
RankingContainer ranking; RankingContainer ranking;
list<int>::iterator it; list<int>::iterator it;
@@ -2504,8 +2504,8 @@ int AIPlayerBaka::chooseTarget(TargetChooser * _tc, Player * forceTarget,MTGCard
{ {
if(observer->mExtraPayment) if(observer->mExtraPayment)
{ {
observer->mExtraPayment->action->CheckUserInput(JGE_BTN_SEC); observer->mExtraPayment->action->CheckUserInput(JGE_BTN_SEC);
observer->mExtraPayment = NULL; observer->mExtraPayment = NULL;
} }
//there should never be a case where a extra cost target selection is happening at the same time as this.. //there should never be a case where a extra cost target selection is happening at the same time as this..
//extracost uses "chooseCard()" to determine its targets. //extracost uses "chooseCard()" to determine its targets.
@@ -2522,7 +2522,7 @@ int AIPlayerBaka::chooseTarget(TargetChooser * _tc, Player * forceTarget,MTGCard
assert(tc); assert(tc);
if (comboHint && comboHint->cardTargets.size()) if (comboHint && comboHint->cardTargets.size())
{ {
tc = GetComboTc(observer,tc); tc = GetComboTc(observer,tc);
} }
if(!checkOnly && tc->maxtargets > 1) if(!checkOnly && tc->maxtargets > 1)
{ {
@@ -2619,7 +2619,7 @@ int AIPlayerBaka::chooseTarget(TargetChooser * _tc, Player * forceTarget,MTGCard
} }
} }
if(playerTargetedZone > 1) if(playerTargetedZone > 1)
target = target->opponent(); target = target->opponent();
playerTargetedZone--; playerTargetedZone--;
} }
if (potentialTargets.size()) if (potentialTargets.size())
@@ -2665,10 +2665,10 @@ int AIPlayerBaka::getEfficiency(MTGAbility * ability)
check = NEW OrderedAIAction(this, ability, pTarget, ability->source); check = NEW OrderedAIAction(this, ability, pTarget, ability->source);
else else
check = NEW OrderedAIAction(this, ability, ability->source); check = NEW OrderedAIAction(this, ability, ability->source);
if (!check) if (!check)
return -1; return -1;
int result = getEfficiency(check); int result = getEfficiency(check);
SAFE_DELETE(check); SAFE_DELETE(check);
return result; return result;
@@ -2757,8 +2757,8 @@ MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * pMana, const char * ty
payAlternative = NONE; payAlternative = NONE;
gotPayments = vector<MTGAbility*>(); gotPayments = vector<MTGAbility*>();
//canplayfromgraveyard //canplayfromgraveyard
while ((card = cd.nextmatch(game->graveyard, card))) while ((card = cd.nextmatch(game->graveyard, card)))
{ {
bool hasFlashback = false; bool hasFlashback = false;
if(card->getManaCost()) if(card->getManaCost())
@@ -2784,11 +2784,11 @@ MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * pMana, const char * ty
/*// Case were manacost is equal to flashback cost, if they are different the AI hangs /*// Case were manacost is equal to flashback cost, if they are different the AI hangs
if (hasFlashback && (card->getManaCost() != card->getManaCost()->getFlashback())) if (hasFlashback && (card->getManaCost() != card->getManaCost()->getFlashback()))
continue; continue;
// Case were manacost is equal to retrace cost, if they are different the AI hangs // Case were manacost is equal to retrace cost, if they are different the AI hangs
if (hasRetrace && (card->getManaCost() != card->getManaCost()->getRetrace())) if (hasRetrace && (card->getManaCost() != card->getManaCost()->getRetrace()))
continue;*/ continue;*/
if (card->hasType(Subtypes::TYPE_LAND)) if (card->hasType(Subtypes::TYPE_LAND))
{ {
@@ -2816,7 +2816,7 @@ MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * pMana, const char * ty
if (card->hasType(Subtypes::TYPE_BATTLE) && card->types.size() > 0 && game->inPlay->hasTypeSpecificInt(Subtypes::TYPE_BATTLE,card->types[1])) if (card->hasType(Subtypes::TYPE_BATTLE) && card->types.size() > 0 && game->inPlay->hasTypeSpecificInt(Subtypes::TYPE_BATTLE,card->types[1]))
continue; continue;
if(hints && hints->HintSaysItsForCombo(observer,card)) if(hints && hints->HintSaysItsForCombo(observer,card))
{ {
if(hints->canWeCombo(observer,card,this)) if(hints->canWeCombo(observer,card,this))
@@ -2834,7 +2834,7 @@ MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * pMana, const char * ty
else else
{ {
nextCardToPlay = NULL; nextCardToPlay = NULL;
continue; continue;
} }
} }
int currentCost = card->getManaCost()->getConvertedCost(); int currentCost = card->getManaCost()->getConvertedCost();
@@ -2987,7 +2987,7 @@ MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * pMana, const char * ty
if (card->hasType(Subtypes::TYPE_BATTLE) && card->types.size() > 0 && game->inPlay->hasTypeSpecificInt(Subtypes::TYPE_BATTLE,card->types[1])) if (card->hasType(Subtypes::TYPE_BATTLE) && card->types.size() > 0 && game->inPlay->hasTypeSpecificInt(Subtypes::TYPE_BATTLE,card->types[1]))
continue; continue;
if(hints && hints->HintSaysItsForCombo(observer,card)) if(hints && hints->HintSaysItsForCombo(observer,card))
{ {
if(hints->canWeCombo(observer,card,this)) if(hints->canWeCombo(observer,card,this))
@@ -3005,7 +3005,7 @@ MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * pMana, const char * ty
else else
{ {
nextCardToPlay = NULL; nextCardToPlay = NULL;
continue; continue;
} }
} }
int currentCost = card->getManaCost()->getConvertedCost(); int currentCost = card->getManaCost()->getConvertedCost();
@@ -3013,7 +3013,7 @@ MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * pMana, const char * ty
gotPayments.clear(); gotPayments.clear();
if((!pMana->canAfford(card->getManaCost(),0) || card->getManaCost()->getKicker())) if((!pMana->canAfford(card->getManaCost(),0) || card->getManaCost()->getKicker()))
gotPayments = canPayMana(card,card->getManaCost(),card->has(Constants::ANYTYPEOFMANA)); gotPayments = canPayMana(card,card->getManaCost(),card->has(Constants::ANYTYPEOFMANA));
//for preformence reason we only look for specific mana if the payment couldn't be made with pmana. //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(),card->has(Constants::ANYTYPEOFMANA)))) if ((currentCost > maxCost || hasX) && (gotPayments.size() || pMana->canAfford(card->getManaCost(),card->has(Constants::ANYTYPEOFMANA))))
{ {
TargetChooserFactory tcf(observer); TargetChooserFactory tcf(observer);
@@ -3122,10 +3122,10 @@ MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * pMana, const char * ty
if (game->playRestrictions->canPutIntoZone(card, game->stack) == PlayRestriction::CANT_PLAY) if (game->playRestrictions->canPutIntoZone(card, game->stack) == PlayRestriction::CANT_PLAY)
continue; continue;
if (card->hasType(Subtypes::TYPE_LEGENDARY) && game->inPlay->findByName(card->name)) if (card->hasType(Subtypes::TYPE_LEGENDARY) && game->inPlay->findByName(card->name))
continue; continue;
if(hints && hints->HintSaysItsForCombo(observer,card)) if(hints && hints->HintSaysItsForCombo(observer,card))
{ {
if(hints->canWeCombo(observer,card,this)) if(hints->canWeCombo(observer,card,this))
@@ -3143,7 +3143,7 @@ MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * pMana, const char * ty
else else
{ {
nextCardToPlay = NULL; nextCardToPlay = NULL;
continue; continue;
} }
} }
int currentCost = card->getManaCost()->getConvertedCost(); int currentCost = card->getManaCost()->getConvertedCost();
@@ -3151,7 +3151,7 @@ MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * pMana, const char * ty
gotPayments.clear(); gotPayments.clear();
if((!pMana->canAfford(card->getManaCost(),0) || card->getManaCost()->getKicker())) if((!pMana->canAfford(card->getManaCost(),0) || card->getManaCost()->getKicker()))
gotPayments = canPayMana(card,card->getManaCost(),card->has(Constants::ANYTYPEOFMANA)); gotPayments = canPayMana(card,card->getManaCost(),card->has(Constants::ANYTYPEOFMANA));
//for preformence reason we only look for specific mana if the payment couldn't be made with pmana. //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(),card->has(Constants::ANYTYPEOFMANA)))) if ((currentCost > maxCost || hasX) && (gotPayments.size() || pMana->canAfford(card->getManaCost(),card->has(Constants::ANYTYPEOFMANA))))
{ {
TargetChooserFactory tcf(observer); TargetChooserFactory tcf(observer);
@@ -3275,8 +3275,8 @@ MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * pMana, const char * ty
//PLaneswalkers are now legendary so this is redundant //PLaneswalkers are now legendary so this is redundant
//if (card->hasType(Subtypes::TYPE_PLANESWALKER) && card->types.size() > 0 && game->inPlay->hasTypeSpecificInt(Subtypes::TYPE_PLANESWALKER,card->types[1])) //if (card->hasType(Subtypes::TYPE_PLANESWALKER) && card->types.size() > 0 && game->inPlay->hasTypeSpecificInt(Subtypes::TYPE_PLANESWALKER,card->types[1]))
//continue; //continue;
if(hints && hints->HintSaysItsForCombo(observer,card)) if(hints && hints->HintSaysItsForCombo(observer,card))
{ {
if(hints->canWeCombo(observer,card,this)) if(hints->canWeCombo(observer,card,this))
@@ -3294,7 +3294,7 @@ MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * pMana, const char * ty
else else
{ {
nextCardToPlay = NULL; nextCardToPlay = NULL;
continue; continue;
} }
} }
int currentCost = card->getManaCost()->getConvertedCost(); int currentCost = card->getManaCost()->getConvertedCost();
@@ -3487,7 +3487,7 @@ MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * pMana, const char * ty
if(hints && hints->HintSaysItsForCombo(observer,nextCardToPlay)) if(hints && hints->HintSaysItsForCombo(observer,nextCardToPlay))
{ {
DebugTrace(" AI wants to play a card that belongs to a combo."); DebugTrace(" AI wants to play a card that belongs to a combo.");
nextCardToPlay = NULL; nextCardToPlay = NULL;
} }
} }
@@ -3521,7 +3521,7 @@ MTGCardInstance * AIPlayerBaka::activateCombo()
if(comboCards.size()) if(comboCards.size())
{ {
nextCardToPlay = comboCards.back(); nextCardToPlay = comboCards.back();
DebugTrace("ai is doing a combo:" << nextCardToPlay->getName()); DebugTrace("ai is doing a combo:" << nextCardToPlay->getName());
DebugTrace("ai is doing a combo:" << nextCardToPlay->getName()); DebugTrace("ai is doing a combo:" << nextCardToPlay->getName());
DebugTrace("ai is doing a combo:" << nextCardToPlay->getName()); DebugTrace("ai is doing a combo:" << nextCardToPlay->getName());
@@ -3574,7 +3574,7 @@ int AIPlayerBaka::computeActions()
if(doThis >= 0) if(doThis >= 0)
{ {
if(object->abilitiesMenu->isMultipleChoice) if(object->abilitiesMenu->isMultipleChoice)
observer->mLayers->actionLayer()->ButtonPressedOnMultipleChoice(doThis); observer->mLayers->actionLayer()->ButtonPressedOnMultipleChoice(doThis);
else else
observer->mLayers->actionLayer()->doReactTo(doThis); observer->mLayers->actionLayer()->doReactTo(doThis);
} }
@@ -3985,16 +3985,16 @@ int AIPlayerBaka::getCreaturesInfo(Player * player, int neededInfo, int untapMod
int AIPlayerBaka::chooseAttackers() int AIPlayerBaka::chooseAttackers()
{ {
int myCreatures = getCreaturesInfo(this, INFO_NBCREATURES, -1, 1); int myCreatures = getCreaturesInfo(this, INFO_NBCREATURES, -1, 1);
if (myCreatures < 1) if (myCreatures < 1)
return 0; return 0;
//Attack with all creatures //Attack with all creatures
//How much damage can the other player do during his next Attack ? //How much damage can the other player do during his next Attack ?
int opponentForce = getCreaturesInfo(opponent(), INFO_CREATURESPOWER); int opponentForce = getCreaturesInfo(opponent(), INFO_CREATURESPOWER);
int opponentCreatures = getCreaturesInfo(opponent(), INFO_NBCREATURES); int opponentCreatures = getCreaturesInfo(opponent(), INFO_NBCREATURES);
int myForce = getCreaturesInfo(this, INFO_CREATURESPOWER, -1, 1); int myForce = getCreaturesInfo(this, INFO_CREATURESPOWER, -1, 1);
if(opponent()->life < 5) if(opponent()->life < 5)
agressivity += 31; agressivity += 31;
bool attack = ((myCreatures > opponentCreatures) || (myForce > opponentForce) || (myForce > 2 * opponent()->life)); bool attack = ((myCreatures > opponentCreatures) || (myForce > opponentForce) || (myForce > 2 * opponent()->life));
if (agressivity > 80 && !attack && life > opponentForce) if (agressivity > 80 && !attack && life > opponentForce)
@@ -4002,7 +4002,7 @@ int AIPlayerBaka::chooseAttackers()
opponentCreatures = getCreaturesInfo(opponent(), INFO_NBCREATURES, -1); opponentCreatures = getCreaturesInfo(opponent(), INFO_NBCREATURES, -1);
opponentForce = getCreaturesInfo(opponent(), INFO_CREATURESPOWER, -1); opponentForce = getCreaturesInfo(opponent(), INFO_CREATURESPOWER, -1);
attack = (myCreatures >= opponentCreatures && myForce > opponentForce) attack = (myCreatures >= opponentCreatures && myForce > opponentForce)
|| (myForce > opponentForce) || (myForce > opponent()->life) || ((life - opponentForce) > 30) ; || (myForce > opponentForce) || (myForce > opponent()->life) || ((life - opponentForce) > 30) ;
} }
printf("Choose attackers : %i %i %i %i -> %i\n", opponentForce, opponentCreatures, myForce, myCreatures, attack); printf("Choose attackers : %i %i %i %i -> %i\n", opponentForce, opponentCreatures, myForce, myCreatures, attack);
@@ -4012,16 +4012,13 @@ int AIPlayerBaka::chooseAttackers()
MTGCardInstance * card = NULL; MTGCardInstance * card = NULL;
while ((card = cd.nextmatch(game->inPlay, card))) while ((card = cd.nextmatch(game->inPlay, card)))
{ {
if ((hints && hints->HintSaysAlwaysAttack(observer, card)) || card->has(Constants::UNBLOCKABLE)) if (shouldAIForceAttack(card, attack))
{ {
if (!card->isAttacker()) if (card->attackCost)
{ {
if (card->attackCost) MTGAbility* a = observer->mLayers->actionLayer()->getAbility(MTGAbility::ATTACK_COST);
{ doAbility(a, card);
MTGAbility * a = observer->mLayers->actionLayer()->getAbility(MTGAbility::ATTACK_COST); observer->cardClick(card, MTGAbility::ATTACK_COST);
doAbility(a,card);
observer->cardClick(card, MTGAbility::ATTACK_COST);
}
} }
observer->cardClick(card, MTGAbility::MTG_ATTACK_RULE); observer->cardClick(card, MTGAbility::MTG_ATTACK_RULE);
} }
@@ -4052,6 +4049,76 @@ int AIPlayerBaka::chooseAttackers()
return 1; return 1;
} }
bool AIPlayerBaka::shouldAIForceAttack(MTGCardInstance* card, bool globalAttack)
{
if (globalAttack)
return true;
if (!card || card->isAttacker())
return false;
if (hints)
{
if (hints->HintSaysDontAttack(observer, card))
return false;
if (hints->HintSaysAlwaysAttack(observer, card))
return true;
}
if (card->has(Constants::UNBLOCKABLE))
return true;
// Flags for opponent defenses
bool oppHasShadow = false;
bool oppHasAirDefense = false;
bool oppHasHorsemanship = false;
bool oppHasBlackOrArtifact = false;
bool oppHasMatchingColorOrArtifact = false;
MTGCardInstance* oppCard = NULL;
CardDescriptor desc;
desc.init();
desc.setType("creature");
while ((oppCard = desc.nextmatch(opponent()->game->inPlay, oppCard)))
{
if (oppCard->isTapped())
continue;
if (oppCard->has(Constants::SHADOW))
oppHasShadow = true;
if (oppCard->has(Constants::FLYING) || oppCard->has(Constants::REACH))
oppHasAirDefense = true;
if (oppCard->has(Constants::HORSEMANSHIP))
oppHasHorsemanship = true;
if (oppCard->hasColor(Constants::MTG_COLOR_BLACK) || oppCard->hasType("Artifact"))
oppHasBlackOrArtifact = true;
// Intimidate check: artifact or shares color
if (oppCard->hasType("Artifact") || (oppCard->colors & card->colors))
oppHasMatchingColorOrArtifact = true;
}
// Decision logic based on evasion
if ((card->has(Constants::SHADOW) && !oppHasShadow) ||
(card->has(Constants::FLYING) && !oppHasAirDefense) ||
(card->has(Constants::HORSEMANSHIP) && !oppHasHorsemanship) ||
(card->has(Constants::FEAR) && !oppHasBlackOrArtifact) ||
(card->has(Constants::INTIMIDATE) && !oppHasMatchingColorOrArtifact))
return true;
// Landwalk abilities
if ((card->has(Constants::SWAMPWALK) && opponent()->game->inPlay->hasType("Swamp")) ||
(card->has(Constants::ISLANDWALK) && opponent()->game->inPlay->hasType("Island")) ||
(card->has(Constants::FORESTWALK) && opponent()->game->inPlay->hasType("Forest")) ||
(card->has(Constants::MOUNTAINWALK) && opponent()->game->inPlay->hasType("Mountain")) ||
(card->has(Constants::PLAINSWALK) && opponent()->game->inPlay->hasType("Plains")))
return true;
return false;
}
/* Can I first strike my oponent and get away with murder ? */ /* Can I first strike my oponent and get away with murder ? */
int AIPlayerBaka::canFirstStrikeKill(MTGCardInstance * card, MTGCardInstance *ennemy) int AIPlayerBaka::canFirstStrikeKill(MTGCardInstance * card, MTGCardInstance *ennemy)
{ {
@@ -4073,14 +4140,16 @@ int AIPlayerBaka::chooseBlockers()
//Should not block during my own turn... //Should not block during my own turn...
if (observer->currentPlayer == this) if (observer->currentPlayer == this)
return 0; return 0;
map<MTGCardInstance *, int> opponentsToughness;
int opponentForce = getCreaturesInfo(opponent(), INFO_CREATURESPOWER); map<MTGCardInstance*, int> opponentsToughness;
//Initialize the list of opponent's attacking cards toughness //Initialize the list of opponent's attacking cards toughness
CardDescriptor cdAttackers; CardDescriptor cdAttackers;
cdAttackers.init(); cdAttackers.init();
cdAttackers.setType("Creature"); cdAttackers.setType("Creature");
MTGCardInstance * card = NULL; MTGCardInstance* card = NULL;
// Gather all attacking creatures and store their toughness
while ((card = cdAttackers.nextmatch(opponent()->game->inPlay, card))) while ((card = cdAttackers.nextmatch(opponent()->game->inPlay, card)))
{ {
if (card->isAttacker()) if (card->isAttacker())
@@ -4094,11 +4163,12 @@ int AIPlayerBaka::chooseBlockers()
cd.unsecureSetTapped(-1); cd.unsecureSetTapped(-1);
card = NULL; card = NULL;
// We first try to block the major threats, those that are marked in the Top 3 of our stats // First pass: auto-block top 3 threats if can be killed
while ((card = cd.nextmatch(game->inPlay, card))) while ((card = cd.nextmatch(game->inPlay, card)))
{ {
if(hints && hints->HintSaysDontBlock(observer,card)) if (hints && hints->HintSaysDontBlock(observer, card))
continue; continue;
observer->cardClick(card, MTGAbility::MTG_BLOCK_RULE); observer->cardClick(card, MTGAbility::MTG_BLOCK_RULE);
int set = 0; int set = 0;
while (!set) while (!set)
@@ -4109,8 +4179,8 @@ int AIPlayerBaka::chooseBlockers()
} }
else else
{ {
MTGCardInstance * attacker = card->defenser; MTGCardInstance* attacker = card->defenser;
map<MTGCardInstance *, int>::iterator it = opponentsToughness.find(attacker); map<MTGCardInstance*, int>::iterator it = opponentsToughness.find(attacker);
if (it == opponentsToughness.end()) if (it == opponentsToughness.end())
{ {
opponentsToughness[attacker] = attacker->toughness; opponentsToughness[attacker] = attacker->toughness;
@@ -4125,7 +4195,7 @@ int AIPlayerBaka::chooseBlockers()
{ {
if (card->blockCost) if (card->blockCost)
{ {
MTGAbility * a = observer->mLayers->actionLayer()->getAbility(MTGAbility::BLOCK_COST); MTGAbility* a = observer->mLayers->actionLayer()->getAbility(MTGAbility::BLOCK_COST);
doAbility(a, card); doAbility(a, card);
observer->cardClick(card, MTGAbility::BLOCK_COST); observer->cardClick(card, MTGAbility::BLOCK_COST);
} }
@@ -4135,13 +4205,13 @@ int AIPlayerBaka::chooseBlockers()
} }
} }
//If blocking one of the major threats is not enough to kill it, // Second pass: unassign if attacker is not expected to die
// We change strategy, first we unassign its blockers that where assigned above
card = NULL; card = NULL;
while ((card = cd.nextmatch(game->inPlay, card))) while ((card = cd.nextmatch(game->inPlay, card)))
{ {
if(hints && hints->HintSaysDontBlock(observer,card)) if (hints && hints->HintSaysDontBlock(observer, card))
continue; continue;
if (card->defenser && opponentsToughness[card->defenser] > 0) if (card->defenser && opponentsToughness[card->defenser] > 0)
{ {
while (card->defenser) while (card->defenser)
@@ -4151,53 +4221,156 @@ int AIPlayerBaka::chooseBlockers()
} }
} }
//Assign the "free" potential blockers to attacking creatures that are not blocked enough // Third pass: intelligent blocking
card = NULL; card = NULL;
while ((card = cd.nextmatch(game->inPlay, card))) while ((card = cd.nextmatch(game->inPlay, card)))
{ {
if(hints && hints->HintSaysDontBlock(observer,card)) if (hints && hints->HintSaysDontBlock(observer, card))
continue; continue;
if (!card->defenser) if (card->defenser)
continue;
MTGCardInstance* bestAttacker = NULL;
int bestScore = -1;
for (map<MTGCardInstance*, int>::iterator it = opponentsToughness.begin(); it != opponentsToughness.end(); ++it)
{ {
if (card->blockCost) MTGCardInstance* attacker = it->first;
if (!attacker)
continue;
int currentBlockers = (int)attacker->blockers.size();
int totalAssignedDamage = 0;
std::list<MTGCardInstance*>::iterator itb;
for (itb = attacker->blockers.begin(); itb != attacker->blockers.end(); ++itb)
{ {
MTGAbility * a = observer->mLayers->actionLayer()->getAbility(MTGAbility::BLOCK_COST); MTGCardInstance* blocker = *itb;
doAbility(a, card); if (blocker)
totalAssignedDamage += blocker->power;
} }
observer->cardClick(card, MTGAbility::MTG_BLOCK_RULE);
int set = 0; int maxBlockers = 1;
while (!set) if (attacker->basicAbilities[Constants::MENACE]) maxBlockers = 2;
if (attacker->basicAbilities[Constants::THREEBLOCKERS]) maxBlockers = 3;
if (totalAssignedDamage >= attacker->toughness || currentBlockers >= maxBlockers)
continue;
bool canKill = (card->power >= attacker->toughness);
bool survives = (card->toughness > attacker->power);
// Always block if can kill, regardless of survivability or damage
if (canKill)
{ {
if (!card->defenser) int score = attacker->power * 2 + attacker->toughness;
if (getStats() && getStats()->isInTop(attacker, 3, false))
score += 100;
if (score > bestScore)
{ {
set = 1; bestScore = score;
bestAttacker = attacker;
} }
else }
// Block even if can't kill, but we survive and reduce damage
else if (survives && attacker->power < life)
{
int score = attacker->power;
if (getStats() && getStats()->isInTop(attacker, 3, false))
score += 50;
if (score > bestScore)
{ {
MTGCardInstance * attacker = card->defenser; bestScore = score;
if (opponentsToughness[attacker] <= 0 || (card->toughness <= attacker->power && opponentForce * 2 < life && !canFirstStrikeKill(card, attacker)) || attacker->nbOpponents() > 1) bestAttacker = attacker;
}
}
// Block to prevent lethal damage, even if we die
else if (!survives && attacker->power >= life)
{
int score = attacker->power;
if (getStats() && getStats()->isInTop(attacker, 3, false))
score += 75;
if (score > bestScore)
{
bestScore = score;
bestAttacker = attacker;
}
}
}
if (bestAttacker)
{
int requiredBlockers = 1;
if (bestAttacker->basicAbilities[Constants::MENACE]) requiredBlockers = 2;
if (bestAttacker->basicAbilities[Constants::THREEBLOCKERS]) requiredBlockers = 3;
int currentBlockers = (int)bestAttacker->blockers.size();
int currentBlockPower = 0;
std::list<MTGCardInstance*>::iterator itb;
for (itb = bestAttacker->blockers.begin(); itb != bestAttacker->blockers.end(); ++itb)
{
MTGCardInstance* blocker = *itb;
if (blocker)
currentBlockPower += blocker->power;
}
if (currentBlockers >= requiredBlockers || currentBlockPower >= bestAttacker->toughness)
continue;
vector<MTGCardInstance*> extraBlockers;
if (requiredBlockers > 1)
{
CardDescriptor cd2;
cd2.init();
cd2.setType("Creature");
cd2.unsecureSetTapped(-1);
MTGCardInstance* c2 = NULL;
while ((c2 = cd2.nextmatch(game->inPlay, c2)))
{
if (c2 == card || c2->defenser || (hints && hints->HintSaysDontBlock(observer, c2)))
continue;
int combinedPower = c2->power + card->power;
bool combinedCanKill = (combinedPower >= bestAttacker->toughness);
if (combinedCanKill)
{ {
if (card->blockCost) extraBlockers.push_back(c2);
{ if ((int)extraBlockers.size() + currentBlockers + 1 >= requiredBlockers)
MTGAbility * a = observer->mLayers->actionLayer()->getAbility(MTGAbility::BLOCK_COST); break;
doAbility(a, card);
}
if((!attacker->basicAbilities[Constants::MENACE] && !attacker->basicAbilities[Constants::THREEBLOCKERS]) ||
(attacker->basicAbilities[Constants::MENACE] && attacker->blockers.size() > 2) ||
(attacker->basicAbilities[Constants::THREEBLOCKERS] && attacker->blockers.size() > 3))
observer->cardClick(card, MTGAbility::MTG_BLOCK_RULE);
else
set = 1;
} }
else }
}
if (currentBlockers + (int)extraBlockers.size() + 1 >= requiredBlockers)
{
if (card->blockCost)
{
MTGAbility* a = observer->mLayers->actionLayer()->getAbility(MTGAbility::BLOCK_COST);
doAbility(a, card);
}
observer->cardClick(card, MTGAbility::MTG_BLOCK_RULE);
opponentsToughness[bestAttacker] -= card->power;
for (size_t i = 0; i < extraBlockers.size(); ++i)
{
MTGCardInstance* extra = extraBlockers[i];
if (extra->blockCost)
{ {
set = 1; MTGAbility* a = observer->mLayers->actionLayer()->getAbility(MTGAbility::BLOCK_COST);
doAbility(a, extra);
} }
observer->cardClick(extra, MTGAbility::MTG_BLOCK_RULE);
opponentsToughness[bestAttacker] -= extra->power;
} }
} }
} }
} }
return 1; return 1;
} }
@@ -4269,7 +4442,7 @@ int AIPlayerBaka::receiveEvent(WEvent * event)
AIPlayerBaka::AIPlayerBaka(GameObserver *observer, string file, string fileSmall, string avatarFile, MTGDeck * deck) : AIPlayerBaka::AIPlayerBaka(GameObserver *observer, string file, string fileSmall, string avatarFile, MTGDeck * deck) :
AIPlayer(observer, file, fileSmall, deck) AIPlayer(observer, file, fileSmall, deck)
{ {
nextCardToPlay = NULL; nextCardToPlay = NULL;
@@ -4312,7 +4485,7 @@ AIPlayerBaka::AIPlayerBaka(GameObserver *observer, string file, string fileSmall
if (fileSmall == "ai_baka_eviltwin") if (fileSmall == "ai_baka_eviltwin")
mAvatar->SetHFlip(true); mAvatar->SetHFlip(true);
initTimer(); initTimer();
} }
@@ -4379,17 +4552,17 @@ int AIPlayerBaka::Act(float dt)
else else
{ {
if (observer->currentActionPlayer == this)//if im not the action player why would i requestnextphase? if (observer->currentActionPlayer == this)//if im not the action player why would i requestnextphase?
observer->userRequestNextGamePhase(); observer->userRequestNextGamePhase();
} }
} }
else else
{ {
while(clickstream.size()) while(clickstream.size())
{ {
AIAction * action = clickstream.front(); AIAction * action = clickstream.front();
action->Act(); action->Act();
SAFE_DELETE(action); SAFE_DELETE(action);
clickstream.pop(); clickstream.pop();
} }
} }
return 1; return 1;
+24 -1
View File
@@ -213,6 +213,24 @@ void Credits::compute(GameObserver* g, GameApp * _app)
bonus.push_back(b); bonus.push_back(b);
} }
if (p1->game->hand->nb_cards == 0)
{
CreditBonus * b = NEW CreditBonus(100, _("'Limited Resources' Bonus"));
bonus.push_back(b);
}
if (p1->game->hand->nb_cards > 7)
{
CreditBonus * b = NEW CreditBonus(150, _("'Arcane Encyclopedia' Bonus"));
bonus.push_back(b);
}
if (p1->game->hand->nb_cards == 7)
{
CreditBonus * b = NEW CreditBonus(77, _("'Library of Alexandria' Bonus"));
bonus.push_back(b);
}
if (p1->game->library->nb_cards == 0) if (p1->game->library->nb_cards == 0)
{ {
CreditBonus * b = NEW CreditBonus(391, _("'Decree of Theophilus' Bonus")); CreditBonus * b = NEW CreditBonus(391, _("'Decree of Theophilus' Bonus"));
@@ -379,6 +397,11 @@ void Credits::computeTournament(GameObserver* g, GameApp * _app,bool tournament,
CreditBonus * b = NEW CreditBonus(100 * mGamesWon * difficulty, _("Difficulty Bonus")); CreditBonus * b = NEW CreditBonus(100 * mGamesWon * difficulty, _("Difficulty Bonus"));
bonus.push_back(b); bonus.push_back(b);
} }
if (mGamesWon==0)
{
CreditBonus * b = NEW CreditBonus(100, _("Game Bonus"));
bonus.push_back(b);
}
if (mGamesWon>1) if (mGamesWon>1)
{ {
CreditBonus * b = NEW CreditBonus(mGamesWon * 200, _("Won Game Bonus")); CreditBonus * b = NEW CreditBonus(mGamesWon * 200, _("Won Game Bonus"));
@@ -662,7 +685,7 @@ void Credits::Render()
{ {
f2->DrawString(_("There's more!").c_str(), 10, y + 15); f2->DrawString(_("There's more!").c_str(), 10, y + 15);
f->DrawString(_("Mods, additional cards, updates and more at:").c_str(), 10, y + 30); f->DrawString(_("Mods, additional cards, updates and more at:").c_str(), 10, y + 30);
f2->DrawString("-> http://wololo.net/wagic", 10, y + 42); f2->DrawString("Discord and GitHub: Wagic game", 10, y + 42);
} }
} }
+1
View File
@@ -1292,6 +1292,7 @@ void GameObserver::Affinity()
card->has(Constants::AFFINITYCONTROLLERCREATURES) || card->has(Constants::AFFINITYCONTROLLERCREATURES) ||
card->has(Constants::AFFINITYOPPONENTCREATURES) || card->has(Constants::AFFINITYOPPONENTCREATURES) ||
card->has(Constants::AFFINITYALLDEADCREATURES) || card->has(Constants::AFFINITYALLDEADCREATURES) ||
card->has(Constants::AFFINITYTWOALLDEADCREATURES) ||
card->has(Constants::AFFINITYPARTY) || card->has(Constants::AFFINITYPARTY) ||
card->has(Constants::AFFINITYBASICLANDTYPES) || card->has(Constants::AFFINITYBASICLANDTYPES) ||
card->has(Constants::AFFINITYTWOBASICLANDTYPES) || card->has(Constants::AFFINITYTWOBASICLANDTYPES) ||
+2 -2
View File
@@ -605,7 +605,7 @@ int AbilityFactory::parseCastRestrictions(MTGCardInstance * card, Player * playe
if (grave->hasType("artifact")) checkTypesAmount++; if (grave->hasType("artifact")) checkTypesAmount++;
if (grave->hasType("planeswalker")) checkTypesAmount++; if (grave->hasType("planeswalker")) checkTypesAmount++;
if (grave->hasType("battle")) checkTypesAmount++; if (grave->hasType("battle")) checkTypesAmount++;
if (grave->hasType("tribal")) checkTypesAmount++; if (grave->hasType("kindred")) checkTypesAmount++;
if (checkTypesAmount < 4) if (checkTypesAmount < 4)
return 0; return 0;
} }
@@ -625,7 +625,7 @@ int AbilityFactory::parseCastRestrictions(MTGCardInstance * card, Player * playe
if (grave->hasType("artifact")) checkTypesAmount++; if (grave->hasType("artifact")) checkTypesAmount++;
if (grave->hasType("planeswalker")) checkTypesAmount++; if (grave->hasType("planeswalker")) checkTypesAmount++;
if (grave->hasType("battle")) checkTypesAmount++; if (grave->hasType("battle")) checkTypesAmount++;
if (grave->hasType("tribal")) checkTypesAmount++; if (grave->hasType("kindred")) checkTypesAmount++;
if (checkTypesAmount > 3) if (checkTypesAmount > 3)
return 0; return 0;
} }
+19 -6
View File
@@ -347,12 +347,17 @@ void MTGCardInstance::initMTGCI()
data = this; //an MTGCardInstance point to itself for data, allows to update it without killing the underlying database item data = this; //an MTGCardInstance point to itself for data, allows to update it without killing the underlying database item
if (observer && basicAbilities[(int)Constants::CHANGELING]) if (observer && basicAbilities[(int)Constants::CHANGELING])
{//if the card is a changeling, it gains all creature subtypes {
//if the card is a changeling, it gains all creature subtypes except "Equipment"
vector<string> values = MTGAllCards::getCreatureValuesById(); vector<string> values = MTGAllCards::getCreatureValuesById();
for (size_t i = 0; i < values.size(); ++i) for (size_t i = 0; i < values.size(); ++i)
{ {
//Don' want to send any event to the gameObserver inside of initMCGI, so calling the parent setSubtype method instead of mine const string& subtype = values[i];
CardPrimitive::setSubtype(values[i].c_str()); if (subtype == "Clue" || subtype == "Equipment" || subtype == "Food" || subtype == "Treasure")
continue;
// Don't send any event to the gameObserver inside of initMCGI, so calling the parent setSubtype method instead
CardPrimitive::setSubtype(subtype.c_str());
} }
} }
@@ -1147,8 +1152,8 @@ int MTGCardInstance::canBlock(MTGCardInstance * opponent)
return 0; return 0;
if (opponent->basicAbilities[(int)Constants::FEAR] && !(this->hasType(Subtypes::TYPE_ARTIFACT) || this->hasColor(Constants::MTG_COLOR_BLACK))) if (opponent->basicAbilities[(int)Constants::FEAR] && !(this->hasType(Subtypes::TYPE_ARTIFACT) || this->hasColor(Constants::MTG_COLOR_BLACK)))
return 0; return 0;
if (opponent->controller()->game->battlefield->hasAbility(Constants::LURE) && !opponent->has(Constants::LURE)) //if (opponent->controller()->game->battlefield->hasAbility(Constants::LURE) && !opponent->has(Constants::LURE))
return 0; //return 0; Doesn't consider if the lure creature is attacking
//intimidate //intimidate
if (opponent->basicAbilities[(int)Constants::INTIMIDATE] && !(this->hasType(Subtypes::TYPE_ARTIFACT))) if (opponent->basicAbilities[(int)Constants::INTIMIDATE] && !(this->hasType(Subtypes::TYPE_ARTIFACT)))
{ {
@@ -1340,6 +1345,7 @@ ManaCost * MTGCardInstance::computeNewCost(MTGCardInstance * card,ManaCost * Cos
card->has(Constants::AFFINITYCONTROLLERCREATURES) || card->has(Constants::AFFINITYCONTROLLERCREATURES) ||
card->has(Constants::AFFINITYOPPONENTCREATURES) || card->has(Constants::AFFINITYOPPONENTCREATURES) ||
card->has(Constants::AFFINITYALLDEADCREATURES) || card->has(Constants::AFFINITYALLDEADCREATURES) ||
card->has(Constants::AFFINITYTWOALLDEADCREATURES) ||
card->has(Constants::AFFINITYPARTY) || card->has(Constants::AFFINITYPARTY) ||
card->has(Constants::AFFINITYBASICLANDTYPES) || card->has(Constants::AFFINITYBASICLANDTYPES) ||
card->has(Constants::AFFINITYTWOBASICLANDTYPES) || card->has(Constants::AFFINITYTWOBASICLANDTYPES) ||
@@ -1381,7 +1387,7 @@ ManaCost * MTGCardInstance::computeNewCost(MTGCardInstance * card,ManaCost * Cos
color = 1; color = 1;
type = "creature"; type = "creature";
} }
else if (card->has(Constants::AFFINITYALLCREATURES) || card->has(Constants::AFFINITYCONTROLLERCREATURES) || card->has(Constants::AFFINITYOPPONENTCREATURES) || card->has(Constants::AFFINITYALLDEADCREATURES)) else if (card->has(Constants::AFFINITYALLCREATURES) || card->has(Constants::AFFINITYCONTROLLERCREATURES) || card->has(Constants::AFFINITYOPPONENTCREATURES) || card->has(Constants::AFFINITYALLDEADCREATURES) || card->has(Constants::AFFINITYTWOALLDEADCREATURES))
{ {
type = "creature"; type = "creature";
} }
@@ -1456,6 +1462,13 @@ ManaCost * MTGCardInstance::computeNewCost(MTGCardInstance * card,ManaCost * Cos
reduce = value->getValue(); reduce = value->getValue();
SAFE_DELETE(value); SAFE_DELETE(value);
} }
else if (card->has(Constants::AFFINITYTWOALLDEADCREATURES))
{
WParsedInt* value = NEW WParsedInt("bothalldeadcreature", NULL, card);
if(value)
reduce = value->getValue() * 2;
SAFE_DELETE(value);
}
else if (card->has(Constants::AFFINITYPARTY)) else if (card->has(Constants::AFFINITYPARTY))
{ {
WParsedInt* value = NEW WParsedInt("calculateparty", NULL, card); WParsedInt* value = NEW WParsedInt("calculateparty", NULL, card);
+3 -2
View File
@@ -252,7 +252,7 @@ const char* Constants::MTGBasicAbilities[] = {
"affinityallcreatures", //Cost 1 less for each creature in all battlefields. "affinityallcreatures", //Cost 1 less for each creature in all battlefields.
"affinitycontrollercreatures", //Cost 1 less for each creature in controller battlefield. "affinitycontrollercreatures", //Cost 1 less for each creature in controller battlefield.
"affinityopponentcreatures", //Cost 1 less for each creature in opponent battlefield. "affinityopponentcreatures", //Cost 1 less for each creature in opponent battlefield.
"affinityalldeadcreatures", //Cost 1 less for each died creature in this turn. "affinityalldeadcreatures", //Costs {1} less to cast for each creature that died this turn
"affinityparty", //Cost 1 less for each creature in your party. "affinityparty", //Cost 1 less for each creature in your party.
"affinityenchantments", //Cost 1 less for each enchantment in your battlefield. "affinityenchantments", //Cost 1 less for each enchantment in your battlefield.
"affinitybasiclandtypes", //Cost 1 less for each basic land type in your battlefield. "affinitybasiclandtypes", //Cost 1 less for each basic land type in your battlefield.
@@ -268,7 +268,8 @@ const char* Constants::MTGBasicAbilities[] = {
"poisontentoxic", // Card has toxic 10 "poisontentoxic", // Card has toxic 10
"eqpasinst", // Can equip as instant "eqpasinst", // Can equip as instant
"canloyaltyasinst", // Can activate loyalty abilities as instant (e.g. "The Wandering Emperor"). "canloyaltyasinst", // Can activate loyalty abilities as instant (e.g. "The Wandering Emperor").
"canplayenchantmentlibrarytop" // May play enchantments from top "canplayenchantmentlibrarytop", // May play enchantments from top
"affinitytwoalldeadcreatures" // Costs {2} less to cast for each creature that died this turn
}; };
map<string,int> Constants::MTGBasicAbilitiesMap; map<string,int> Constants::MTGBasicAbilitiesMap;
+2 -2
View File
@@ -19,7 +19,7 @@ Subtypes::Subtypes()
find("Equipment"); find("Equipment");
find("Aura"); find("Aura");
find("Planeswalker"); find("Planeswalker");
find("Tribal"); find("Kindred");
find("Plane"); find("Plane");
find("Scheme"); find("Scheme");
find("Vanguard"); find("Vanguard");
@@ -96,7 +96,7 @@ bool Subtypes::isType(unsigned int type)
type == TYPE_LAND || type == TYPE_LAND ||
type == TYPE_ARTIFACT || type == TYPE_ARTIFACT ||
type == TYPE_PLANESWALKER || type == TYPE_PLANESWALKER ||
type == TYPE_TRIBAL || type == TYPE_KINDRED ||
type == TYPE_PLANE || type == TYPE_PLANE ||
type == TYPE_SCHEME || type == TYPE_SCHEME ||
type == TYPE_VANGUARD || type == TYPE_VANGUARD ||
+6 -1
View File
@@ -319,6 +319,11 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta
zones[nbzones++] = MTGGameZone::MY_HAND; zones[nbzones++] = MTGGameZone::MY_HAND;
zones[nbzones++] = MTGGameZone::OPPONENT_HAND; zones[nbzones++] = MTGGameZone::OPPONENT_HAND;
} }
else if (zoneName.compare("mybattlefieldhand") == 0)
{
zones[nbzones++] = MTGGameZone::MY_HAND;
zones[nbzones++] = MTGGameZone::MY_BATTLEFIELD;
}
else if (zoneName.compare("library") == 0) else if (zoneName.compare("library") == 0)
{ {
zones[nbzones++] = MTGGameZone::MY_LIBRARY; zones[nbzones++] = MTGGameZone::MY_LIBRARY;
@@ -1155,7 +1160,7 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta
cd->removeType("creature"); cd->removeType("creature");
cd->removeType("planeswalker"); cd->removeType("planeswalker");
cd->removeType("battle"); cd->removeType("battle");
cd->removeType("tribal"); cd->removeType("kindred");
if (!cd->types.size()){ if (!cd->types.size()){
int i = rand() % 10000 + 1; int i = rand() % 10000 + 1;
ostringstream subt; ostringstream subt;
+8 -4
View File
@@ -2099,21 +2099,24 @@ void WGuiFilterItem::updateValue()
mParent->subMenu = NEW SimpleMenu(JGE::GetInstance(), WResourceManager::Instance(), -1234, this, Fonts::MAIN_FONT, 20, 20, "Filter:"); mParent->subMenu = NEW SimpleMenu(JGE::GetInstance(), WResourceManager::Instance(), -1234, this, Fonts::MAIN_FONT, 20, 20, "Filter:");
if (filterType == FILTER_TYPE) if (filterType == FILTER_TYPE)
{ {
mParent->addArg("Legendary Creature", "t:Legendary;&t:Creature;");
mParent->addArg("Artifact", "t:Artifact;"); mParent->addArg("Artifact", "t:Artifact;");
mParent->addArg("Artifact Creature", "t:Artifact;&t:Creature;"); mParent->addArg("Artifact Creature", "t:Artifact;&t:Creature;");
mParent->addArg("Aura", "t:Aura;"); mParent->addArg("Aura", "t:Aura;");
mParent->addArg("Basic", "t:Basic;"); mParent->addArg("Basic", "t:Basic;");
mParent->addArg("Battle", "t:Battle;");
mParent->addArg("Creature", "t:Creature;"); mParent->addArg("Creature", "t:Creature;");
mParent->addArg("Enchantment", "t:Enchantment;"); mParent->addArg("Enchantment", "t:Enchantment;");
mParent->addArg("Equipment", "t:Equipment;"); mParent->addArg("Equipment", "t:Equipment;");
mParent->addArg("Instant", "t:Instant;"); mParent->addArg("Instant", "t:Instant;");
mParent->addArg("Kindred", "t:Kindred;");
mParent->addArg("Land", "t:Land;"); mParent->addArg("Land", "t:Land;");
mParent->addArg("Legendary", "t:Legendary;"); mParent->addArg("Legendary", "t:Legendary;");
mParent->addArg("Sorcery", "t:Sorcery;"); mParent->addArg("Noncreature", "{t:Creature;}");
mParent->addArg("Snow", "t:Snow;"); mParent->addArg("Nonland", "{t:Land;}");
mParent->addArg("Tribal", "t:Tribal;");
mParent->addArg("Planeswalker", "t:Planeswalker;"); mParent->addArg("Planeswalker", "t:Planeswalker;");
mParent->addArg("Battle", "t:Battle;"); mParent->addArg("Snow", "t:Snow;");
mParent->addArg("Sorcery", "t:Sorcery;");
mParent->addArg("Dungeon", "t:Dungeon;"); mParent->addArg("Dungeon", "t:Dungeon;");
mParent->addArg("Conspiracy", "t:Conspiracy;"); mParent->addArg("Conspiracy", "t:Conspiracy;");
@@ -2149,6 +2152,7 @@ void WGuiFilterItem::updateValue()
mParent->addArg("Rare", "r:r;"); mParent->addArg("Rare", "r:r;");
mParent->addArg("Uncommon", "r:u;"); mParent->addArg("Uncommon", "r:u;");
mParent->addArg("Common", "r:c;"); mParent->addArg("Common", "r:c;");
mParent->addArg("Basic", "r:l;");
mParent->addArg("Special Rarity", "{r:m;|r:t;|r:r;|r:u;|r:c;|r:l;}"); mParent->addArg("Special Rarity", "{r:m;|r:t;|r:r;|r:u;|r:c;|r:l;}");
} }
else if (filterType == FILTER_CMC) else if (filterType == FILTER_CMC)
+5 -5
View File
@@ -1186,7 +1186,7 @@ void WParsedInt::init(string s, Spell * spell, MTGCardInstance * card)
intValue = 0; intValue = 0;
if(card->hasType(Subtypes::TYPE_PLANESWALKER)) if(card->hasType(Subtypes::TYPE_PLANESWALKER))
intValue++; intValue++;
if(card->hasType(Subtypes::TYPE_TRIBAL)) if(card->hasType(Subtypes::TYPE_KINDRED))
intValue++; intValue++;
if(card->hasType(Subtypes::TYPE_SORCERY)) if(card->hasType(Subtypes::TYPE_SORCERY))
intValue++; intValue++;
@@ -1262,7 +1262,7 @@ void WParsedInt::extendedParse(string s, Spell * spell, MTGCardInstance * card)
MTGGameZone * checkZone = card->getObserver()->players[j]->game->inPlay; MTGGameZone * checkZone = card->getObserver()->players[j]->game->inPlay;
if(cardHasTypeinZone("planeswalker",checkZone)) if(cardHasTypeinZone("planeswalker",checkZone))
pc = 1; pc = 1;
if(cardHasTypeinZone("tribal",checkZone)) if(cardHasTypeinZone("kindred",checkZone))
tc = 1; tc = 1;
if(cardHasTypeinZone("sorcery",checkZone)) if(cardHasTypeinZone("sorcery",checkZone))
sc = 1; sc = 1;
@@ -1283,7 +1283,7 @@ void WParsedInt::extendedParse(string s, Spell * spell, MTGCardInstance * card)
MTGGameZone * checkZone = (s.find("oppbattlefieldcardtypes")!=string::npos)?card->getObserver()->opponent()->game->inPlay:card->controller()->game->inPlay; MTGGameZone * checkZone = (s.find("oppbattlefieldcardtypes")!=string::npos)?card->getObserver()->opponent()->game->inPlay:card->controller()->game->inPlay;
if(cardHasTypeinZone("planeswalker",checkZone)) if(cardHasTypeinZone("planeswalker",checkZone))
pc = 1; pc = 1;
if(cardHasTypeinZone("tribal",checkZone)) if(cardHasTypeinZone("kindred",checkZone))
tc = 1; tc = 1;
if(cardHasTypeinZone("sorcery",checkZone)) if(cardHasTypeinZone("sorcery",checkZone))
sc = 1; sc = 1;
@@ -1311,7 +1311,7 @@ void WParsedInt::extendedParse(string s, Spell * spell, MTGCardInstance * card)
MTGGameZone * checkZone = card->getObserver()->players[j]->game->graveyard; MTGGameZone * checkZone = card->getObserver()->players[j]->game->graveyard;
if(cardHasTypeinZone("planeswalker",checkZone)) if(cardHasTypeinZone("planeswalker",checkZone))
pc = 1; pc = 1;
if(cardHasTypeinZone("tribal",checkZone)) if(cardHasTypeinZone("kindred",checkZone))
tc = 1; tc = 1;
if(cardHasTypeinZone("sorcery",checkZone)) if(cardHasTypeinZone("sorcery",checkZone))
sc = 1; sc = 1;
@@ -1332,7 +1332,7 @@ void WParsedInt::extendedParse(string s, Spell * spell, MTGCardInstance * card)
MTGGameZone * checkZone = (s.find("oppgravecardtypes")!=string::npos)?card->getObserver()->opponent()->game->graveyard:card->controller()->game->graveyard; MTGGameZone * checkZone = (s.find("oppgravecardtypes")!=string::npos)?card->getObserver()->opponent()->game->graveyard:card->controller()->game->graveyard;
if(cardHasTypeinZone("planeswalker",checkZone)) if(cardHasTypeinZone("planeswalker",checkZone))
pc = 1; pc = 1;
if(cardHasTypeinZone("tribal",checkZone)) if(cardHasTypeinZone("kindred",checkZone))
tc = 1; tc = 1;
if(cardHasTypeinZone("sorcery",checkZone)) if(cardHasTypeinZone("sorcery",checkZone))
sc = 1; sc = 1;