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

View File

@@ -29,11 +29,30 @@ public:
{
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__(
"swp %0, %1, [%2]":
"=&r"( r ): // outputs
"r"( 1 ), "r"( &v_ ): // inputs
"memory", "cc" );
"ldaxr %0, [%1];" // Load-Exclusive instruction
"cbnz %0, 1f;" // If the value is non-zero, the lock is already acquired
"stlxr %w0, %2, [%1];" // Store-Exclusive instruction
"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;
}

View File

@@ -14,10 +14,11 @@
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
2. Altered source versions must be plainly marked as such, and must not
be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
*/
#include "SDL_stdinc.h"
#include "SDL_atomic.h"
@@ -30,8 +31,7 @@
#endif
/* This function is where all the magic happens... */
SDL_bool
SDL_AtomicTryLock(SDL_SpinLock *lock)
SDL_bool SDL_AtomicTryLock(SDL_SpinLock *lock)
{
#if SDL_ATOMIC_DISABLED
/* Terrible terrible damage */
@@ -85,13 +85,27 @@ SDL_AtomicTryLock(SDL_SpinLock *lock)
return (result == 0);
#else
/* Need CPU instructions for spinlock here! */
__need_spinlock_implementation__
/* Fallback implementation using a standard mutex */
/* 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
}
void
SDL_AtomicLock(SDL_SpinLock *lock)
void SDL_AtomicLock(SDL_SpinLock *lock)
{
/* FIXME: Should we have an eventual timeout? */
while (!SDL_AtomicTryLock(lock)) {
@@ -99,8 +113,7 @@ SDL_AtomicLock(SDL_SpinLock *lock)
}
}
void
SDL_AtomicUnlock(SDL_SpinLock *lock)
void SDL_AtomicUnlock(SDL_SpinLock *lock)
{
#if defined(_MSC_VER)
_ReadWriteBarrier();

View File

@@ -1,6 +1,9 @@
APP_PROJECT_PATH := $(call my-dir)/..
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_STL := c++_static
APP_MODULES := libpng libjpeg main SDL

File diff suppressed because it is too large Load Diff

View File

@@ -1,76 +1,18 @@
#NAME:Nightmare
#DESC:I had a terrible Nightmare once
#DESC:and then a second
#DESC:and a third
#DESC:and then I won.
#2x Obsianus Golem
1129
1129
#2x animate dead
1143
1143
#2x Bad Moon
1144
1144
#2x Bog Wraith
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)
#DESC:'All evil is as a nightmare'
#DESC:Thomas Carlyle
#DESC:
#DESC:Win matches to unlock more
#DESC:opponents, sets and game modes
Air Elemental (RV) (*) * 2
Animate Dead (RV) (*) * 2
Bad Moon (RV) (*) * 2
Bog Wraith (RV) (*) * 2
Cursed Land (RV) (*) * 1
El-Hajjaj (RV) (*) * 2
Fear (RV) (*) * 1
Hypnotic Specter (RV) (*) * 2
# RV Islands
1392
1392
1392
@@ -83,3 +25,26 @@
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

View File

@@ -1,30 +1,24 @@
#NAME:Howlings
#DESC:Supported by elemental rage
#DESC:goblins descend from the mountains
#DESC:to conquer the lands below.
# (PSY) added 2 Mountains, 1 Black Vise, 1 Howling Mine
# (would've been better to add creatures, but all creatures in the
# deck were already at 4 pieces))
# Land(s)
Mountain (8ED) * 20
# Creature(s)
#DESC:'What the howling deep down
#DESC:there conceals, no blessed
#DESC:living soul can tell'
#DESC:Friedrich Schiller
#DESC:
#DESC:Win matches to unlock more
#DESC:opponents, sets and game modes
Black Vise (MPS) * 4
Goblin King (8ED) * 4
Goblin Mountaineer (9ED) * 4
Goblin Piker (9ED) * 4
Goblin Striker (MRD) * 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
Spark Elemental (5DN) * 4
# Artifact(s)
Black Vise (V10) * 4
Howling Mine (8ED) * 3
# Instant(s)
Lightning Bolt (M10) * 4
# Sorcery(s)
Wheel of Fortune (VMA) * 1
Wheel of Fortune (VMA) * 1

View File

@@ -1,66 +1,17 @@
#NAME:Taiga
#DESC:The forces of fire and nature unite.
#DESC:Beware the fires deep in
#DESC:the boreal forest
#DESC:
#DESC:Can you withstand
#DESC:their combined fervor?
#2x Cockatrice
1238
1238
#3x Craw Wurm
1239
1239
1239
#2x Elvish Archers
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)
#DESC:Win matches to unlock more
#DESC:opponents, sets and game modes
Cockatrice (RV) (*) * 2
Craw Wurm (RV) (*) * 3
Earth Elemental (RV) (*) * 2
Elvish Archers (RV) (*) * 2
Firebreathing (RV) (*) * 1
Fire Elemental (RV) (*) * 2
Flashfires (RV) (*) * 2
# RV Forests
1386
1386
1386
@@ -73,7 +24,12 @@
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
@@ -86,3 +42,9 @@
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

View File

@@ -1,39 +1,33 @@
#NAME:Savannah
#DESC:United against the terrible
#DESC:Phyrexian Fate,
#DESC:there is no time for dispute
#DESC:or rivalries
#DESC:in Eladamri and Gerrard's army
# (PSY) 2x Benalish Hero not available any more, removed (deck has still >60 cards)
# (PSY) 2x Mesa Pegasus not available any more, removed (deck has still >60 cards)
# Land(s)
Forest (8ED) * 13
Plains (8ED) * 9
# Creature(s)
#DESC:Beasts stalk their prey
#DESC:among the tall grasses
#DESC:
#DESC:
#DESC:Win matches to unlock more
#DESC:opponents, sets and game modes
Armageddon (VMA) * 1
Black Vise (V10) * 2
Builder's Blessing (AVR) * 2
Cockatrice (TSB) * 2
Craw Wurm (9ED) * 2
Crusade (DDF) * 2
Forest (8ED) * 4
Forest (9ED) * 4
Forest (MRD) * 1
Forest (ONS) * 4
Giant Spider (AKH) * 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
Savannah Lions (A25) * 2
Scute Mob (ZEN) * 3
Serra Angel (M13) * 2
Jukai Messenger (CHK) * 4
Kessig Recluse (DKA) * 2
Rhox Charger (ALA) * 1
# Artifact(s)
Black Vise (V10) * 2
Spitting Spider (8ED) * 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

View File

@@ -1,64 +1,23 @@
#NAME:Plateau
#DESC:In the highland of Boros
#DESC:Angels, elementals and goblins
#DESC:are preparing for battle.
#DESC:Beware, the crusade is coming...
#4x Lightning Helix {W}{R} - does 3 damage and you gain 3 life replacement for #2x Black Vise (1097) and #2x The Rack (1139)
87908
87908
87908
87908
# (PSY) added a third Bull Cerodon to bring the deck to 60 cards
#2x Bull Cerodon replacement for #3x Earth Elementat {3}{R}{R} -4/5 (1287)
174952
174952
174952
#2x Fire Elemental {3}{R}{R} - 5/4
1290
1290
#2 x Nobilis of War {RW}{RW}{RW}{RW}{RW} replacement for 2x Fire elemental (1290)
154258
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
#DESC:There are no hiding places
#DESC:on the high steppes beyond
#DESC:the mountain passes
#DESC:
#DESC:Win matches to unlock more
#DESC:opponents, sets and game modes
Boros Recruit (RAV) * 4
Bull Cerodon (ALA) * 3
Castle (RV) * 2
Cerodon Yearling (ARB) * 2
Crusade (RV) * 1
Fire Elemental (RV) * 2
Goblin King (10E) * 2
Hearthfire Hobgoblin (EVE) * 2
Hill Giant (RV) * 1
Keldon Warlord (RV) * 1
Lightning Helix (RAV) * 4
Mons's Goblin Raiders (RV) * 1
# RV Mountains
1389
1389
1389
@@ -71,7 +30,9 @@
1391
1391
1391
#Plains
Nobilis of War (EVE) * 2
Orcish Oriflamme (RV) * 1
# RV Plains
1395
1395
1395
@@ -84,3 +45,7 @@
1397
1397
1397
Serra Angel (RV) * 2
Skyknight Legionnaire (RAV) * 2
Wall of Swords (RV) * 2
White knight (RV) * 2

View File

@@ -1,68 +1,37 @@
#NAME:Badlands
#DESC:Dangerous foes await you.
#DESC:Both undead, goblins, and
#DESC:other abominations will
#DESC:fight you recklessly.
#Ankh of Mishra
1094
1094
1094
1094
#Armageddon Clock
1095
#Black Vise
1097
1097
#Dancing Scimitar
1104
1104
#Howling Mine
1112
#The Rack
1139
1139
#Bad Moon
1144
1144
#Black Knight
1145
1145
#Drudge Skeletons
1157
1157
1157
1157
#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
#DESC:The badlands are full of
#DESC:treachery; even the paths
#DESC:through the marshes will
#DESC:mislead and betray
#DESC:
#DESC:Win matches to unlock more
#DESC:opponents, sets and game modes
Ankh of Mishra (RV) * 4
Armageddon Clock (RV) * 1
Bad Moon (RV) * 2
Black Knight (RV) * 2
Black Vise (RV) * 2
Dancing Scimitar (RV) * 2
Drudge Skeletons (RV) * 4
El-Hajjaj (RV) * 2
Goblin King (RV) * 2
Howling Mine (RV) * 1
Hypnotic Specter (RV) * 2
Mons's Goblin Raiders (RV) * 4
# RV Mountains
1389
1390
1391
1389
1390
1391
1389
1390
1391
Orcish Oriflamme (RV) * 2
Scathe Zombies (RV) * 4
Sedge Troll (RV) * 3
# RV Swamps
1373
1374
1375
@@ -73,13 +42,6 @@
1374
1375
1373
#Mountain
1389
1390
1391
1389
1390
1391
1389
1390
1391
The Rack (RV) * 2
Wheel of Fortune (RV) * 1
Zombie Master (RV) * 1

View File

@@ -1,66 +1,18 @@
#NAME:Yavimaya
#DESC:Beasts of the woods and the
#DESC:seas are gathering, preparing
#DESC:for battle.
#Armageddon Clock
1095
#Obsianus Golem
1129
1129
#Air Elemental
1189
1189
1189
1189
#Lifetap
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
#DESC:On the island of Yavimaya
#DESC:the forest is not just
#DESC:ancient and wild. It is
#DESC:also sentient.
#DESC:
#DESC:Win matches to unlock more
#DESC:opponents, sets and game modes
#HINT:combo hold(Tranquility|myhand)^cast(Tranquility|myhand)^restriction{type(enchantment|opponentbattlefield)~morethan~0}^totalmananeeded({2}{G})
Air Elemental (RV) * 4
Armageddon Clock (RV) * 1
Cockatrice (RV) * 1
Craw Wurm (RV) * 1
Elvish Archers (RV) * 2
# RV Forests
1386
1387
1388
@@ -73,7 +25,9 @@
1386
1387
1388
#Island
Giant Spider (RV) * 2
Grizzly Bears (RV) * 2
# RV Islands
1392
1393
1394
@@ -86,3 +40,14 @@
1392
1393
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

View File

@@ -1,25 +1,26 @@
#NAME:Wrath
#DESC:O miserable of happy
#DESC:Is this the end
#DESC:Of this new glorious world
# Land(s)
Plains (8ED) * 21
# Creature(s)
#DESC:The truly wrathful person
#DESC:harms themselves as much as
#DESC:their enemies
#DESC:
#DESC:Win matches to unlock more
#DESC:opponents, sets and game modes
#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
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
Serra Angel (8ED) * 4
Sigiled Paladin (ALA) * 4
Skyhunter Skirmisher (5DN) * 3
White Knight (M10) * 4
# Enchantment(s)
Crusade (DDF) * 4
# Instant(s)
Swords to Plowshares (DDF) * 4
# Sorcery(s)
Armageddon (VMA) * 4
Wrath of God (8ED) * 3
White Knight (M10) * 4
Wrath of God (8ED) * 3

View File

@@ -1,58 +1,16 @@
#Mill /Artifact Game for AI
#NAME:Inquisitor
#DESC:Black vises in Ivory Towers
#DESC:await you, when facing
#DESC:this artificially created army,
#DESC:designed to completely stop
#DESC:your progress, and then
#DESC:torture you to death.
#4x Howling Mine
129598
129598
129598
129598
#4 x Black Vise
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
#DESC:'The voice of nature is
#DESC:worthless in front of
#DESC:the Inquisition'
#DESC:Friedrich Schiller
#DESC:
#DESC:Win matches to unlock more
#DESC:opponents, sets and game modes
Black Vise (RV) * 4
Clockwork Beast (RV) * 4
Dancing Scimitar (RV) * 4
Howling Mine (10E) * 4
# 10E Islands
129606
129606
129606
@@ -63,15 +21,11 @@
129607
129608
129609
#7swamps
129755
129756
129757
129754
129755
129756
129757
#7Plains
Ivory Tower (RV) * 4
Living Wall (RV) * 4
Master of Etherium (ALA) * 4
Obsianus Golem (RV) * 4
# 10E Plains
129681
129682
129683
@@ -79,3 +33,12 @@
129681
129682
129683
# 10E Swamps
129755
129756
129757
129754
129755
129756
129757
Tower Gargoyle (ALA) * 4

View File

@@ -1,22 +1,23 @@
#NAME:Shatter
#DESC:See all your efforts shattered
#DESC:by the all-consuming power
#DESC:of righteous fury.
# Land(s)
Mountain (8ED) * 12
Plains (8ED) * 12
# Creature(s)
#DESC:See your efforts shattered
#DESC:by righteous fury
#DESC:
#DESC:Win matches to unlock more
#DESC:opponents, sets and game modes
Anaba Bodyguard (10E) * 4
Ancestor's Chosen (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
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
Tempest of Light (MRD) * 2
Steadfast Guard (10E) * 4
Suntail Hawk (8ED) * 2
Tempest of Light (MRD) * 2
Thundering Giant (10E) * 4

View File

@@ -3,219 +3,9 @@ author=Wagic Team
name=Commander 2021
orderindex=COM-P.C21
year=2021-04-23
total=371
total=410
[/meta]
[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
id=518307
rarity=M
@@ -938,7 +728,7 @@ rarity=C
[card]
primitive=Greed
id=519180
rarity=R
rarity=U
[/card]
[card]
primitive=Infernal Offering
@@ -1703,7 +1493,7 @@ rarity=R
[card]
primitive=Lonely Sandbar
id=519333
rarity=C
rarity=U
[/card]
[card]
primitive=Lumbering Falls
@@ -1788,7 +1578,7 @@ rarity=R
[card]
primitive=Secluded Steppe
id=519350
rarity=C
rarity=U
[/card]
[card]
primitive=Shivan Reef
@@ -1851,6 +1641,406 @@ id=519362
rarity=R
[/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
id=519363
rarity=C

File diff suppressed because it is too large Load Diff

View File

@@ -2,7 +2,7 @@
author=Wagic Team
name=Dominaria United Commander
year=2022-09-09
total=219
total=241
[/meta]
[card]
primitive=Dihada, Binder of Wills
@@ -250,6 +250,11 @@ id=578711
rarity=M
[/card]
[card]
primitive=Jared Carthalion
id=578712
rarity=M
[/card]
[card]
primitive=Historian's Boon
id=580393
rarity=R

View File

@@ -46,7 +46,7 @@ rarity=U
[/card]
[card]
primitive=Seasoned Cathar
id=685822
id=685823
rarity=T
[/card]
[card]
@@ -66,7 +66,7 @@ rarity=M
[/card]
[card]
primitive=Avacyn, the Purifier
id=685826
id=685827
rarity=T
[/card]
[card]
@@ -86,7 +86,7 @@ rarity=R
[/card]
[card]
primitive=Brisela, Voice of Nightmares
id=686144
id=686145
rarity=T
[/card]
[card]
@@ -181,7 +181,7 @@ rarity=C
[/card]
[card]
primitive=Luminous Phantom
id=685848
id=685849
rarity=T
[/card]
[card]
@@ -256,7 +256,7 @@ rarity=U
[/card]
[card]
primitive=Incited Rabble
id=685863
id=685864
rarity=T
[/card]
[card]
@@ -266,7 +266,7 @@ rarity=U
[/card]
[card]
primitive=Twinblade Invocation
id=685865
id=685866
rarity=T
[/card]
[card]
@@ -291,7 +291,7 @@ rarity=R
[/card]
[card]
primitive=Wedding Festivity
id=685870
id=685871
rarity=T
[/card]
[card]
@@ -301,7 +301,7 @@ rarity=U
[/card]
[card]
primitive=Perfected Form
id=685872
id=685873
rarity=T
[/card]
[card]
@@ -316,7 +316,7 @@ rarity=U
[/card]
[card]
primitive=Biolume Serpent
id=685875
id=685876
rarity=T
[/card]
[card]
@@ -341,7 +341,7 @@ rarity=U
[/card]
[card]
primitive=Ghostly Castigator
id=685880
id=685881
rarity=T
[/card]
[card]
@@ -356,7 +356,7 @@ rarity=C
[/card]
[card]
primitive=Insectile Aberration
id=685883
id=685884
rarity=T
[/card]
[card]
@@ -371,7 +371,7 @@ rarity=R
[/card]
[card]
primitive=Final Iteration
id=685886
id=685887
rarity=T
[/card]
[card]
@@ -401,7 +401,7 @@ rarity=U
[/card]
[card]
primitive=Grisly Anglerfish
id=685892
id=685893
rarity=T
[/card]
[card]
@@ -431,7 +431,7 @@ rarity=C
[/card]
[card]
primitive=Lanterns' Lift
id=685898
id=685899
rarity=T
[/card]
[card]
@@ -501,7 +501,7 @@ rarity=U
[/card]
[card]
primitive=Cipherbound Spirit
id=685912
id=685913
rarity=T
[/card]
[card]
@@ -536,7 +536,7 @@ rarity=R
[/card]
[card]
primitive=Awoken Horror
id=685919
id=685920
rarity=T
[/card]
[card]
@@ -576,7 +576,7 @@ rarity=M
[/card]
[card]
primitive=Lord of Lineage
id=685927
id=685928
rarity=T
[/card]
[card]
@@ -616,7 +616,7 @@ rarity=C
[/card]
[card]
primitive=Depraved Harvester
id=685935
id=685936
rarity=T
[/card]
[card]
@@ -631,7 +631,7 @@ rarity=C
[/card]
[card]
primitive=Awoken Demon
id=685938
id=685939
rarity=T
[/card]
[card]
@@ -701,7 +701,7 @@ rarity=R
[/card]
[card]
primitive=Deluge of the Dead
id=685952
id=685953
rarity=T
[/card]
[card]
@@ -721,7 +721,7 @@ rarity=C
[/card]
[card]
primitive=Chittering Host
id=686143
id=686144
rarity=T
[/card]
[card]
@@ -751,7 +751,7 @@ rarity=U
[/card]
[card]
primitive=Bloodsoaked Reveler
id=685961
id=685962
rarity=T
[/card]
[card]
@@ -806,7 +806,7 @@ rarity=R
[/card]
[card]
primitive=Bloodbat Summoner
id=685972
id=685973
rarity=T
[/card]
[card]
@@ -871,7 +871,7 @@ rarity=C
[/card]
[card]
primitive=Conduit of Emrakul
id=685985
id=685986
rarity=T
[/card]
[card]
@@ -906,7 +906,7 @@ rarity=U
[/card]
[card]
primitive=Vildin-Pack Alpha
id=685992
id=685993
rarity=T
[/card]
[card]
@@ -916,7 +916,7 @@ rarity=R
[/card]
[card]
primitive=Hanweir, the Writhing Township
id=686145
id=686146
rarity=T
[/card]
[card]
@@ -926,7 +926,7 @@ rarity=C
[/card]
[card]
primitive=Bane of Hanweir
id=685995
id=685996
rarity=T
[/card]
[card]
@@ -946,7 +946,7 @@ rarity=R
[/card]
[card]
primitive=Terror of Kruin Pass
id=685999
id=686000
rarity=T
[/card]
[card]
@@ -1001,7 +1001,7 @@ rarity=U
[/card]
[card]
primitive=Erupting Dreadwolf
id=686010
id=686011
rarity=T
[/card]
[card]
@@ -1046,7 +1046,7 @@ rarity=C
[/card]
[card]
primitive=Moonrise Intruder
id=686019
id=686020
rarity=T
[/card]
[card]
@@ -1121,7 +1121,7 @@ rarity=U
[/card]
[card]
primitive=Krallenhorde Howler
id=686034
id=686035
rarity=T
[/card]
[card]
@@ -1146,7 +1146,7 @@ rarity=M
[/card]
[card]
primitive=Garruk, the Veil-Cursed
id=686039
id=686040
rarity=T
[/card]
[card]
@@ -1181,7 +1181,7 @@ rarity=C
[/card]
[card]
primitive=Timber Shredder
id=686046
id=686047
rarity=T
[/card]
[card]
@@ -1206,7 +1206,7 @@ rarity=R
[/card]
[card]
primitive=Howlpack Alpha
id=686051
id=686052
rarity=T
[/card]
[card]
@@ -1236,7 +1236,7 @@ rarity=C
[/card]
[card]
primitive=Moonscarred Werewolf
id=686057
id=686058
rarity=T
[/card]
[card]
@@ -1251,7 +1251,7 @@ rarity=U
[/card]
[card]
primitive=Howling Chorus
id=686060
id=686061
rarity=T
[/card]
[card]
@@ -1306,7 +1306,7 @@ rarity=C
[/card]
[card]
primitive=Howlpack of Estwald
id=686071
id=686072
rarity=T
[/card]
[card]
@@ -1341,7 +1341,7 @@ rarity=M
[/card]
[card]
primitive=Arlinn, Embraced by the Moon
id=686078
id=686079
rarity=T
[/card]
[card]
@@ -1401,7 +1401,7 @@ rarity=R
[/card]
[card]
primitive=Ravager of the Fells
id=686090
id=686091
rarity=T
[/card]
[card]
@@ -1486,7 +1486,7 @@ rarity=U
[/card]
[card]
primitive=Chalice of Death
id=686107
id=686108
rarity=T
[/card]
[card]
@@ -1506,7 +1506,7 @@ rarity=U
[/card]
[card]
primitive=Aurora of Emrakul
id=686111
id=686112
rarity=T
[/card]
[card]
@@ -1536,7 +1536,7 @@ rarity=C
[/card]
[card]
primitive=Scrounged Scythe
id=686117
id=686118
rarity=T
[/card]
[card]
@@ -1561,7 +1561,7 @@ rarity=U
[/card]
[card]
primitive=Ashmouth Blade
id=686122
id=686123
rarity=T
[/card]
[card]
@@ -1656,7 +1656,7 @@ rarity=R
[/card]
[card]
primitive=Ormendahl, Profane Prince
id=686141
id=686142
rarity=T
[/card]
[card]
@@ -1841,7 +1841,7 @@ rarity=U
[/card]
[card]
primitive=Krallenhorde Howler
id=688901
id=688902
rarity=T
[/card]
[card]
@@ -1851,7 +1851,7 @@ rarity=M
[/card]
[card]
primitive=Arlinn, Embraced by the Moon
id=688903
id=688904
rarity=T
[/card]
[card]
@@ -1861,7 +1861,7 @@ rarity=R
[/card]
[card]
primitive=Ravager of the Fells
id=688905
id=688906
rarity=T
[/card]
[card]
@@ -1876,7 +1876,7 @@ rarity=M
[/card]
[card]
primitive=Lord of Lineage
id=688878
id=688879
rarity=T
[/card]
[card]
@@ -2486,7 +2486,7 @@ rarity=U
[/card]
[card]
primitive=Seasoned Cathar
id=687803
id=687804
rarity=T
[/card]
[card]
@@ -2496,7 +2496,7 @@ rarity=M
[/card]
[card]
primitive=Avacyn, the Purifier
id=687805
id=687806
rarity=T
[/card]
[card]
@@ -2506,7 +2506,7 @@ rarity=C
[/card]
[card]
primitive=Luminous Phantom
id=687807
id=687808
rarity=T
[/card]
[card]
@@ -2516,7 +2516,7 @@ rarity=U
[/card]
[card]
primitive=Incited Rabble
id=687809
id=687810
rarity=T
[/card]
[card]
@@ -2526,7 +2526,7 @@ rarity=U
[/card]
[card]
primitive=Twinblade Invocation
id=687811
id=687812
rarity=T
[/card]
[card]
@@ -2536,7 +2536,7 @@ rarity=R
[/card]
[card]
primitive=Wedding Festivity
id=687813
id=687814
rarity=T
[/card]
[card]
@@ -2546,7 +2546,7 @@ rarity=U
[/card]
[card]
primitive=Perfected Form
id=687815
id=687816
rarity=T
[/card]
[card]
@@ -2556,7 +2556,7 @@ rarity=U
[/card]
[card]
primitive=Biolume Serpent
id=687817
id=687818
rarity=T
[/card]
[card]
@@ -2566,7 +2566,7 @@ rarity=U
[/card]
[card]
primitive=Ghostly Castigator
id=687819
id=687820
rarity=T
[/card]
[card]
@@ -2576,7 +2576,7 @@ rarity=C
[/card]
[card]
primitive=Insectile Aberration
id=687821
id=687822
rarity=T
[/card]
[card]
@@ -2586,7 +2586,7 @@ rarity=U
[/card]
[card]
primitive=Grisly Anglerfish
id=687823
id=687824
rarity=T
[/card]
[card]
@@ -2596,7 +2596,7 @@ rarity=U
[/card]
[card]
primitive=Cipherbound Spirit
id=687825
id=687826
rarity=T
[/card]
[card]
@@ -2606,7 +2606,7 @@ rarity=R
[/card]
[card]
primitive=Awoken Horror
id=687827
id=687828
rarity=T
[/card]
[card]
@@ -2616,7 +2616,7 @@ rarity=M
[/card]
[card]
primitive=Lord of Lineage
id=687829
id=687830
rarity=T
[/card]
[card]
@@ -2626,7 +2626,7 @@ rarity=C
[/card]
[card]
primitive=Awoken Demon
id=687831
id=687832
rarity=T
[/card]
[card]
@@ -2636,7 +2636,7 @@ rarity=U
[/card]
[card]
primitive=Bloodsoaked Reveler
id=687833
id=687834
rarity=T
[/card]
[card]
@@ -2646,7 +2646,7 @@ rarity=U
[/card]
[card]
primitive=Vildin-Pack Alpha
id=687835
id=687836
rarity=T
[/card]
[card]
@@ -2656,7 +2656,7 @@ rarity=U
[/card]
[card]
primitive=Erupting Dreadwolf
id=687837
id=687838
rarity=T
[/card]
[card]
@@ -2666,7 +2666,7 @@ rarity=C
[/card]
[card]
primitive=Moonrise Intruder
id=687839
id=687840
rarity=T
[/card]
[card]
@@ -2676,7 +2676,7 @@ rarity=U
[/card]
[card]
primitive=Krallenhorde Howler
id=687841
id=687842
rarity=T
[/card]
[card]
@@ -2686,7 +2686,7 @@ rarity=C
[/card]
[card]
primitive=Moonscarred Werewolf
id=687843
id=687844
rarity=T
[/card]
[card]
@@ -2696,7 +2696,7 @@ rarity=U
[/card]
[card]
primitive=Howling Chorus
id=687845
id=687846
rarity=T
[/card]
[card]
@@ -2706,7 +2706,7 @@ rarity=R
[/card]
[card]
primitive=Ravager of the Fells
id=687847
id=687848
rarity=T
[/card]
[card]
@@ -2716,7 +2716,7 @@ rarity=U
[/card]
[card]
primitive=Chalice of Death
id=687849
id=687850
rarity=T
[/card]
[card]
@@ -2726,7 +2726,7 @@ rarity=U
[/card]
[card]
primitive=Aurora of Emrakul
id=687851
id=687852
rarity=T
[/card]
[card]
@@ -2736,7 +2736,7 @@ rarity=U
[/card]
[card]
primitive=Ashmouth Blade
id=687853
id=687854
rarity=T
[/card]
[card]
@@ -2746,7 +2746,7 @@ rarity=R
[/card]
[card]
primitive=Ormendahl, Profane Prince
id=687855
id=687856
rarity=T
[/card]
[card]

View File

@@ -4,7 +4,8 @@ name=Tales of Middle-earth Commander
year=2023-06-23
total=592
[/meta]
-primitive=The Monarch
[card]
primitive=The Monarch
id=-999905
rarity=T
[/card]

View File

@@ -2,7 +2,7 @@
author=Wagic Team
name=Modern Horizons 3
year=2024-06-14
total=558
total=560
[/meta]
[card]
primitive=Breaker of Creation
@@ -980,12 +980,7 @@ id=662347
rarity=C
[/card]
[card]
primitive=Ondu Knotmaster
id=662348
rarity=U
[/card]
[card]
primitive=Throw a Line
primitive=Ondu Knotmaster // Throw a Line
id=662348
rarity=U
[/card]
@@ -1197,7 +1192,7 @@ rarity=M
[card]
primitive=Ajani, Nacatl Avenger
id=661754
rarity=M
rarity=T
[/card]
[card]
primitive=Razorgrass Ambush
@@ -1207,7 +1202,7 @@ rarity=U
[card]
primitive=Razorgrass Field
id=661756
rarity=U
rarity=T
[/card]
[card]
primitive=Witch Enchanter
@@ -1217,7 +1212,7 @@ rarity=U
[card]
primitive=Witch-Blessed Meadow
id=661758
rarity=U
rarity=T
[/card]
[card]
primitive=Hydroelectric Specimen
@@ -1227,7 +1222,7 @@ rarity=U
[card]
primitive=Hydroelectric Laboratory
id=661760
rarity=U
rarity=T
[/card]
[card]
primitive=Sink into Stupor
@@ -1237,7 +1232,7 @@ rarity=U
[card]
primitive=Soporific Springs
id=661762
rarity=U
rarity=T
[/card]
[card]
primitive=Tamiyo, Inquisitive Student
@@ -1247,7 +1242,7 @@ rarity=M
[card]
primitive=Tamiyo, Seasoned Scholar
id=661764
rarity=M
rarity=T
[/card]
[card]
primitive=Boggart Trawler
@@ -1257,7 +1252,7 @@ rarity=U
[card]
primitive=Boggart Bog
id=661766
rarity=U
rarity=T
[/card]
[card]
primitive=Fell the Profane
@@ -1267,7 +1262,7 @@ rarity=U
[card]
primitive=Fell Mire
id=661768
rarity=U
rarity=T
[/card]
[card]
primitive=Sorin of House Markov
@@ -1277,7 +1272,7 @@ rarity=M
[card]
primitive=Sorin, Ravenous Neonate
id=661770
rarity=M
rarity=T
[/card]
[card]
primitive=Pinnacle Monk
@@ -1287,7 +1282,7 @@ rarity=U
[card]
primitive=Mystic Peak
id=661772
rarity=U
rarity=T
[/card]
[card]
primitive=Ral, Monsoon Mage
@@ -1297,7 +1292,7 @@ rarity=M
[card]
primitive=Ral, Leyline Prodigy
id=661774
rarity=M
rarity=T
[/card]
[card]
primitive=Sundering Eruption
@@ -1307,7 +1302,7 @@ rarity=U
[card]
primitive=Volcanic Fissure
id=661776
rarity=U
rarity=T
[/card]
[card]
primitive=Bridgeworks Battle
@@ -1317,7 +1312,7 @@ rarity=U
[card]
primitive=Tanglespan Bridgeworks
id=661778
rarity=U
rarity=T
[/card]
[card]
primitive=Disciple of Freyalise
@@ -1327,7 +1322,7 @@ rarity=U
[card]
primitive=Garden of Freyalise
id=661780
rarity=U
rarity=T
[/card]
[card]
primitive=Grist, Voracious Larva
@@ -1337,7 +1332,7 @@ rarity=M
[card]
primitive=Grist, the Plague Swarm
id=661782
rarity=M
rarity=T
[/card]
[card]
primitive=Bloodsoaked Insight
@@ -1347,7 +1342,7 @@ rarity=U
[card]
primitive=Sanguine Morass
id=661784
rarity=U
rarity=T
[/card]
[card]
primitive=Drowner of Truth
@@ -1357,7 +1352,7 @@ rarity=U
[card]
primitive=Drowned Jungle
id=661786
rarity=U
rarity=T
[/card]
[card]
primitive=Glasswing Grace
@@ -1367,7 +1362,7 @@ rarity=U
[card]
primitive=Age-Graced Chapel
id=661788
rarity=U
rarity=T
[/card]
[card]
primitive=Legion Leadership
@@ -1377,7 +1372,7 @@ rarity=U
[card]
primitive=Legion Stronghold
id=661790
rarity=U
rarity=T
[/card]
[card]
primitive=Revitalizing Repast
@@ -1387,7 +1382,7 @@ rarity=U
[card]
primitive=Old-Growth Grove
id=661792
rarity=U
rarity=T
[/card]
[card]
primitive=Rush of Inspiration
@@ -1397,7 +1392,7 @@ rarity=U
[card]
primitive=Crackling Falls
id=661794
rarity=U
rarity=T
[/card]
[card]
primitive=Strength of the Harvest
@@ -1407,7 +1402,7 @@ rarity=U
[card]
primitive=Haven of the Harvest
id=661796
rarity=U
rarity=T
[/card]
[card]
primitive=Stump Stomp
@@ -1417,7 +1412,7 @@ rarity=U
[card]
primitive=Burnwillow Clearing
id=661798
rarity=U
rarity=T
[/card]
[card]
primitive=Suppression Ray
@@ -1427,7 +1422,7 @@ rarity=U
[card]
primitive=Orderly Plaza
id=661800
rarity=U
rarity=T
[/card]
[card]
primitive=Waterlogged Teachings
@@ -1437,7 +1432,7 @@ rarity=U
[card]
primitive=Inundated Archive
id=661802
rarity=U
rarity=T
[/card]
[card]
primitive=Angel of the Ruins
@@ -2346,8 +2341,8 @@ rarity=M
[/card]
[card]
primitive=Ajani, Nacatl Avenger
id=661309
rarity=M
id=661310
rarity=T
[/card]
[card]
primitive=Tamiyo, Inquisitive Student
@@ -2356,8 +2351,8 @@ rarity=M
[/card]
[card]
primitive=Tamiyo, Seasoned Scholar
id=661311
rarity=M
id=661312
rarity=T
[/card]
[card]
primitive=Sorin of House Markov
@@ -2366,8 +2361,8 @@ rarity=M
[/card]
[card]
primitive=Sorin, Ravenous Neonate
id=661313
rarity=M
id=661314
rarity=T
[/card]
[card]
primitive=Ral, Monsoon Mage
@@ -2376,8 +2371,8 @@ rarity=M
[/card]
[card]
primitive=Ral, Leyline Prodigy
id=661315
rarity=M
id=661316
rarity=T
[/card]
[card]
primitive=Grist, Voracious Larva
@@ -2386,8 +2381,8 @@ rarity=M
[/card]
[card]
primitive=Grist, the Plague Swarm
id=661317
rarity=M
id=661318
rarity=T
[/card]
[card]
primitive=Argent Dais

View File

@@ -3,204 +3,9 @@ author=Wagic Team
name=Strixhaven: School of Mages
orderindex=EXP-ZZI.STX
year=2021-04-23
total=340
total=415
[/meta]
[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
id=513477
rarity=C
@@ -937,42 +742,42 @@ rarity=R
[/card]
[card]
primitive=Augmenter Pugilist
id=513624
id=513625
rarity=R
[/card]
[card]
primitive=Echoing Equation
id=513625
id=513624
rarity=T
[/card]
[card]
primitive=Blex, Vexing Pest
id=513626
id=513627
rarity=M
[/card]
[card]
primitive=Search for Blex
id=513627
id=513626
rarity=T
[/card]
[card]
primitive=Extus, Oriq Overlord
id=513628
id=516912
rarity=M
[/card]
[card]
primitive=Awaken the Blood Avatar
id=513629
id=516913
rarity=T
[/card]
[card]
primitive=Flamescroll Celebrant
id=513630
id=513631
rarity=R
[/card]
[card]
primitive=Revel in Silence
id=513631
id=513630
rarity=T
[/card]
[card]
@@ -987,52 +792,52 @@ rarity=T
[/card]
[card]
primitive=Kianne, Dean of Substance
id=513634
id=516918
rarity=R
[/card]
[card]
primitive=Imbraham, Dean of Theory
id=513635
id=516919
rarity=T
[/card]
[card]
primitive=Mila, Crafty Companion
id=513636
id=516789
rarity=M
[/card]
[card]
primitive=Lukka, Wayward Bonder
id=513637
id=516790
rarity=T
[/card]
[card]
primitive=Pestilent Cauldron
id=513638
id=516920
rarity=R
[/card]
[card]
primitive=Restorative Burst
id=513639
id=516921
rarity=T
[/card]
[card]
primitive=Plargg, Dean of Chaos
id=513640
id=516922
rarity=R
[/card]
[card]
primitive=Augusta, Dean of Order
id=513641
id=516923
rarity=T
[/card]
[card]
primitive=Rowan, Scholar of Sparks
id=513642
id=516792
rarity=M
[/card]
[card]
primitive=Will, Scholar of Frost
id=513643
id=516791
rarity=T
[/card]
[card]
@@ -1057,12 +862,12 @@ rarity=T
[/card]
[card]
primitive=Torrent Sculptor
id=513648
id=516928
rarity=R
[/card]
[card]
primitive=Flamethrower Sonata
id=513649
id=516929
rarity=T
[/card]
[card]
@@ -1656,52 +1461,617 @@ id=513767
rarity=C
[/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
id=516678
rarity=C
rarity=L
[/card]
[card]
primitive=Plains
id=516679
rarity=C
rarity=L
[/card]
[card]
primitive=Island
id=516680
rarity=C
rarity=L
[/card]
[card]
primitive=Island
id=516681
rarity=C
rarity=L
[/card]
[card]
primitive=Swamp
id=516682
rarity=C
rarity=L
[/card]
[card]
primitive=Swamp
id=516683
rarity=C
rarity=L
[/card]
[card]
primitive=Mountain
id=516684
rarity=C
rarity=L
[/card]
[card]
primitive=Mountain
id=516685
rarity=C
rarity=L
[/card]
[card]
primitive=Forest
id=516686
rarity=C
rarity=L
[/card]
[card]
primitive=Forest
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]

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

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]

View File

@@ -1,7 +1,6 @@
[meta]
author=Wagic Team
name=Alchemy: Innistrad
orderindex=ONL-E.YMID
year=2021-12-09
total=64
[/meta]
@@ -217,7 +216,7 @@ rarity=M
[/card]
[card]
primitive=Rahilda, Feral Outlaw
id=548268
id=548269
rarity=T
[/card]
[card]

View File

@@ -163,9 +163,6 @@
# Afterlife
#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
#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
# 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
#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.)
#AUTO_DEFINE _LOOT_ draw:1 && transforms((,newability[target(*|myhand) reject])) forever
# Loot. Draw a card, then discard a card.
#AUTO_DEFINE _LOOT_ draw:1 && transforms((,newability[notatarget(*|myhand) reject])) forever
# Unearth
#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
#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
# Eternalize
#AUTO_DEFINE _ETERNALIZE_ name(Eternalize) clone and!( transforms((Zombie,removemc,setpower=4,settoughness=4,black)) forever )! assorcery
# 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
#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.
#AUTO_DEFINE _PUNCH_ transforms((,newability[dynamicability<!powerstrike!> target(creature|opponentbattlefield)])) oneshot
# Must be blocked this turn if able
#AUTO_DEFINE _MUST_BE_BLOCKD_ newability[@combat(attacking) source(this):ability$! notatarget(creature|myBattlefield) transforms((,newability[mustblock])) ueot!$ opponent]
# Fight. Both creatures deal damage equal to their Power to each other.
#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
# 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
# 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 _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 _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
#AUTO_DEFINE _ANGELTOKEN_ create(Angel:Creature Angel:4/4:white:flying)
@@ -291,6 +323,12 @@
# Glimmer Token
#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
#AUTO_DEFINE _INSECTTOKEN_ create(Insect:Creature Insect:1/1:green)
@@ -337,13 +375,13 @@
#AUTO_DEFINE _ZOMBIETOKEN_ create(zombie:creature zombie:2/2:black)
# 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
#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
#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
#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

View File

@@ -1,6 +1,6 @@
#Planeswalkers Primitives Pack for Wagic the Homebrew.
#Please keep these card alphabetized, and try to have the "name=" line at the top of each card
#Sorted this programmatically - Thanks to Vitty85 24-12-2024
#Sorted this programmatically - Thanks to Vitty85 29-04-2024
[card]
name=Abian, Luvion Usurper
auto=counter(0/0,5,loyalty)
@@ -192,7 +192,7 @@ subtype=Aminatou
name=Angrath, Captain of Chaos
auto=counter(0/0,5,loyalty)
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.)
mana={2}{BR}{BR}
type=Legendary Planeswalker
@@ -452,7 +452,7 @@ subtype=Chandra
[/card]
[card]
name=Chandra, Awakened Inferno
auto=nofizzle
abilities=nofizzle
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,-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
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,-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.
mana={2}{R}{R}
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={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: 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,-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
@@ -709,6 +709,20 @@ subtype=Chandra
color=red
[/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
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 )!
@@ -847,7 +861,7 @@ auto=counter(0/0,3,loyalty)
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 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.
mana={1}{R}{G}
type=Legendary Planeswalker
@@ -969,6 +983,18 @@ type=Legendary Planeswalker
subtype=Elspeth
[/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
auto=counter(0/0,4,loyalty)
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
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,-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
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.)
@@ -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,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
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}
type=Legendary Planeswalker
subtype=Gideon
@@ -1544,7 +1570,7 @@ subtype=Jace
[/card]
[card]
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={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
@@ -1711,7 +1737,7 @@ name=Kaito, Bane of Nightmares
auto=counter(0/0,4,loyalty)
autohand={1}{U}{B}{N}:ninjutsu
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,-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.
@@ -1720,6 +1746,19 @@ type=Legendary Planeswalker
subtype=Kaito
[/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
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
@@ -1855,8 +1894,8 @@ subtype=Kaya
[card]
name=Kaya, Geist Hunter
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 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) 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) 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,-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.
@@ -1911,6 +1950,18 @@ type=Legendary Planeswalker
subtype=Kiora
[/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
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
@@ -2140,7 +2191,7 @@ subtype=Windgrace
[card]
name=Lukka, Bound to Ruin
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={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
@@ -2312,7 +2363,7 @@ subtype=Nahiri
[card]
name=Nahiri, the Unforgiving
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: Don't target any creature) donothing
auto={C(0/0,+1,Loyalty)}:name(+1: Discard and draw) _DISCARD&DRAW_
@@ -2501,7 +2552,7 @@ subtype=Nissa
[card]
name=Nissa, Ascended Animist
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={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)
@@ -2764,7 +2815,7 @@ otherrestriction=can play planeswalker,compare(isflipped)~equalto~1
restriction=compare(isflipped)~equalto~0
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)
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) {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
@@ -2812,7 +2863,7 @@ abilities=canbecommander
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: 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.
mana={2}{U}{R}
type=Legendary Planeswalker
@@ -3097,7 +3148,7 @@ subtype=Tamiyo
[card]
name=Tamiyo, Compleated Sage
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: 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 )!
@@ -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
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,-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.
mana={4}{U}{U}
type=Legendary Planeswalker
@@ -3614,6 +3666,19 @@ type=Legendary Planeswalker
subtype=Tyvar
[/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
auto=counter(0/0,4,loyalty)
auto=lord(*[colorless]|mycastingzone) altercost(colorless,-2)
@@ -3680,7 +3745,7 @@ subtype=Venser
name=Vivien Reid
auto=counter(0/0,5,loyalty)
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 enchantment) destroy target(enchantment)
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)
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,-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.
mana={3}{G}{G}
type=Legendary Planeswalker
@@ -3761,7 +3826,7 @@ subtype=Vraska
[/card]
[card]
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={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
@@ -3927,4 +3992,4 @@ text=+1: Creatures you control get +1/+0 and gain haste until end of turn. -- 0:
mana={2}{R}{R}
type=Legendary Planeswalker
subtype=Zariel
[/card]
[/card]

View File

@@ -2,5 +2,5 @@
#Sun, 20 May 2020 11:56:35 +0200
build.major=0
build.minor=25
build.point=3
build.point=5

View File

@@ -76,7 +76,7 @@ class AIPlayerBaka: public AIPlayer{
virtual int chooseBlockers();
virtual int canFirstStrikeKill(MTGCardInstance * card, MTGCardInstance *ennemy);
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)
virtual int CanHandleCost(ManaCost * cost, MTGCardInstance * card = NULL);

View File

@@ -364,7 +364,8 @@ class Constants
EQPASINST = 235,
CANLOYALTYASINST = 236,
CANPLAYENCHANTMENTTOPLIBRARY = 237,//enchantment
NB_BASIC_ABILITIES = 238,
AFFINITYTWOALLDEADCREATURES = 238,
NB_BASIC_ABILITIES = 239,
RARITY_S = 'S', //Special Rarity
RARITY_M = 'M', //Mythics

View File

@@ -26,7 +26,7 @@ public:
TYPE_EQUIPMENT = 11,
TYPE_AURA = 12,
TYPE_PLANESWALKER = 13,
TYPE_TRIBAL = 14,
TYPE_KINDRED = 14,
TYPE_PLANE = 15,
TYPE_SCHEME = 16,
TYPE_VANGUARD = 17,

View File

@@ -14,7 +14,7 @@ Mod by: Vitty85
/* Wagic versions */
#define WAGIC_VERSION_MAJOR 0
#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_WITHOUT_DOT(a, b, c) a ## b ## c

View File

@@ -46,9 +46,9 @@ int OrderedAIAction::getEfficiency(AADamager * aad)
return 0;
}
if(p && target)
if(p == target->controller())
return 0;
if(p && target)
if(p == target->controller())
return 0;
if (dTarget && aad && (aad->getDamage() == dTarget->toughness))
return 100;
@@ -107,7 +107,7 @@ int OrderedAIAction::getEfficiency()
{
target = a->source;
}
AACastCard * CC = dynamic_cast<AACastCard*> (a);
if (CC)
return 99;
@@ -126,13 +126,13 @@ int OrderedAIAction::getEfficiency()
break;
if (!coreAbilityCardTarget->regenerateTokens && currentPhase == MTG_PHASE_COMBATBLOCKERS
&& (coreAbilityCardTarget->defenser || coreAbilityCardTarget->blockers.size())
)
&& (coreAbilityCardTarget->defenser || coreAbilityCardTarget->blockers.size())
)
{
efficiency = 95;
}
//TODO If the card is the target of a damage spell
break;
//TODO If the card is the target of a damage spell
break;
}
case MTGAbility::STANDARD_PREVENT:
{
@@ -272,7 +272,7 @@ int OrderedAIAction::getEfficiency()
}
case MTGAbility::STANDARD_PUMP:
{
efficiency = 0;
efficiency = 0;
if(!coreAbilityCardTarget)
break;
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);
//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();
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())
{
@@ -350,30 +350,30 @@ int OrderedAIAction::getEfficiency()
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.
{
AManaProducer * manamaker = dynamic_cast<AManaProducer*>(a);
GenericActivatedAbility * GAA = dynamic_cast<GenericActivatedAbility*>(ability);
if(GAA)
{
AForeach * forMana = dynamic_cast<AForeach*>(GAA->ability);
if (manamaker && forMana)
{
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)
efficiency = 60;//might be a bit random, but better than never using them.
}
}
else
efficiency = 0;
break;
}
{
AManaProducer * manamaker = dynamic_cast<AManaProducer*>(a);
GenericActivatedAbility * GAA = dynamic_cast<GenericActivatedAbility*>(ability);
if(GAA)
{
AForeach * forMana = dynamic_cast<AForeach*>(GAA->ability);
if (manamaker && forMana)
{
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)
efficiency = 60;//might be a bit random, but better than never using them.
}
}
else
efficiency = 0;
break;
}
case MTGAbility::STANDARDABILITYGRANT:
{
efficiency = 0;
if (!target)
break;
//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.
//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
&& p == target->controller()
)
&& p == target->controller()
)
{
efficiency += efficiencyModifier;
}
@@ -404,8 +404,8 @@ int OrderedAIAction::getEfficiency()
}
if ((suggestion == BAKA_EFFECT_BAD && p == target->controller())
|| (suggestion == BAKA_EFFECT_GOOD && p != target->controller())
)
|| (suggestion == BAKA_EFFECT_GOOD && p != target->controller())
)
{
efficiency = 0;
//stop giving trample to the players creatures.
@@ -547,13 +547,13 @@ int OrderedAIAction::getEfficiency()
}
}
if ((suggestion == BAKA_EFFECT_BAD && p == target->controller())
|| (suggestion == BAKA_EFFECT_GOOD && p != target->controller()))
|| (suggestion == BAKA_EFFECT_GOOD && p != target->controller()))
{
efficiency = 0;
}
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
}
}
@@ -650,7 +650,7 @@ int OrderedAIAction::getEfficiency()
}
if(p->game->battlefield->countByType("token") >= 25)
efficiency = 0;
}
else if (GenericRevealAbility * grA = dynamic_cast<GenericRevealAbility *>(a))
{
@@ -684,7 +684,7 @@ int OrderedAIAction::getEfficiency()
{
AIPlayer * chk = (AIPlayer*)p;
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)
efficiency = (int) ((float) efficiency * 1.3); //increase chance of using ability if hand is empty
@@ -720,18 +720,18 @@ int OrderedAIAction::getEfficiency()
{
efficiency += 55;
}
if (ability->source)
{
if(ability->source->hasType(Subtypes::TYPE_PLANESWALKER) || ability->source->hasType(Subtypes::TYPE_BATTLE))
efficiency += 50;
else if(ability->source->hasType(Subtypes::TYPE_LAND))
{ // probably a shockland, don't pay life if hand is empty
if (p->life<=2)
// check that's not a manland(like Celestial Colonnade)
if(efficiency < 50)
efficiency = 0;
}
{ // probably a shockland, don't pay life if hand is empty
if (p->life<=2)
// check that's not a manland(like Celestial Colonnade)
if(efficiency < 50)
efficiency = 0;
}
}
SAFE_DELETE(transAbility);
@@ -781,7 +781,7 @@ int OrderedAIAction::getRevealedEfficiency(MTGAbility * ability2)
{
target = a->source;
}
AACastCard * CC = dynamic_cast<AACastCard*> (a);
if (CC)
return 99;
@@ -800,8 +800,8 @@ int OrderedAIAction::getRevealedEfficiency(MTGAbility * ability2)
break;
if (!coreAbilityCardTarget->regenerateTokens && currentPhase == MTG_PHASE_COMBATBLOCKERS
&& (coreAbilityCardTarget->defenser || coreAbilityCardTarget->blockers.size())
)
&& (coreAbilityCardTarget->defenser || coreAbilityCardTarget->blockers.size())
)
{
eff2 = 95;
}
@@ -1010,27 +1010,27 @@ int OrderedAIAction::getRevealedEfficiency(MTGAbility * ability2)
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.
{
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();
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.
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();
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:
{
eff2 = 0;
if (!target)
break;
//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.
//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
&& p == target->controller()
)
&& p == target->controller()
)
{
eff2 += eff2Modifier;
}
@@ -1061,8 +1061,8 @@ int OrderedAIAction::getRevealedEfficiency(MTGAbility * ability2)
}
if ((suggestion == BAKA_EFFECT_BAD && p == target->controller())
|| (suggestion == BAKA_EFFECT_GOOD && p != target->controller())
)
|| (suggestion == BAKA_EFFECT_GOOD && p != target->controller())
)
{
eff2 = 0;
//stop giving trample to the players creatures.
@@ -1203,13 +1203,13 @@ int OrderedAIAction::getRevealedEfficiency(MTGAbility * ability2)
}
}
if ((suggestion == BAKA_EFFECT_BAD && p == target->controller())
|| (suggestion == BAKA_EFFECT_GOOD && p != target->controller()))
|| (suggestion == BAKA_EFFECT_GOOD && p != target->controller()))
{
eff2 = 0;
}
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
}
}
@@ -1290,7 +1290,7 @@ int OrderedAIAction::getRevealedEfficiency(MTGAbility * ability2)
}
if(p->game->battlefield->countByType("token") >= 25)
eff2 = 0;
}
//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;
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)
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;
if (comboHint && comboHint->cardTargets.size())
{
tc = GetComboTc(observer,tc);
tc = GetComboTc(observer,tc);
}
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)
{
DebugTrace("AIPlayerBaka: AI attempting to pay a mana cost." << endl
<< "- Target: " << (target ? target->name : "None" ) << endl
<< "- Cost: " << (cost ? cost->toString() : "NULL") );
DebugTrace("AIPlayerBaka: AI attempting to pay a mana cost." << endl
<< "- Target: " << (target ? target->name : "None" ) << endl
<< "- Cost: " << (cost ? cost->toString() : "NULL") );
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.
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((!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)
return vector<MTGAbility*>();
map<MTGCardInstance*, bool> 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 (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);
if(!ec->costs[i]->tc->countValidTargets())
return 0;
return 0;
if(!chooseCard(ec->costs[i]->tc,card))
return 0;
}
@@ -1981,7 +1981,7 @@ int AIPlayerBaka::createAbilityTargets(MTGAbility * a, MTGCardInstance * c, Rank
MTGCardInstance * cTargeting = dynamic_cast<MTGCardInstance*>(potentialTargets[0]);
if(cTargeting)
check = NEW OrderedAIAction(this, a,c,cTargeting);
check = NEW OrderedAIAction(this, a,c,cTargeting);
Player * pTargeting = dynamic_cast<Player*>(potentialTargets[0]);
if(pTargeting)
@@ -2084,17 +2084,17 @@ int AIPlayerBaka::selectAbility()
}
}
}
// Try Deck hints first
if (selectHintAbility())
// Try Deck hints first
if (selectHintAbility())
return 1;
if(observer->mLayers->stackLayer()->lastActionController == this)
{
//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.
//this not only is illegal but cause ai to waste abilities ei:all damage:1 on a single 1/1 creature.
return 1;
}
if(observer->mLayers->stackLayer()->lastActionController == this)
{
//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.
//this not only is illegal but cause ai to waste abilities ei:all damage:1 on a single 1/1 creature.
return 1;
}
RankingContainer ranking;
list<int>::iterator it;
@@ -2504,8 +2504,8 @@ int AIPlayerBaka::chooseTarget(TargetChooser * _tc, Player * forceTarget,MTGCard
{
if(observer->mExtraPayment)
{
observer->mExtraPayment->action->CheckUserInput(JGE_BTN_SEC);
observer->mExtraPayment = NULL;
observer->mExtraPayment->action->CheckUserInput(JGE_BTN_SEC);
observer->mExtraPayment = NULL;
}
//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.
@@ -2522,7 +2522,7 @@ int AIPlayerBaka::chooseTarget(TargetChooser * _tc, Player * forceTarget,MTGCard
assert(tc);
if (comboHint && comboHint->cardTargets.size())
{
tc = GetComboTc(observer,tc);
tc = GetComboTc(observer,tc);
}
if(!checkOnly && tc->maxtargets > 1)
{
@@ -2619,7 +2619,7 @@ int AIPlayerBaka::chooseTarget(TargetChooser * _tc, Player * forceTarget,MTGCard
}
}
if(playerTargetedZone > 1)
target = target->opponent();
target = target->opponent();
playerTargetedZone--;
}
if (potentialTargets.size())
@@ -2665,10 +2665,10 @@ int AIPlayerBaka::getEfficiency(MTGAbility * ability)
check = NEW OrderedAIAction(this, ability, pTarget, ability->source);
else
check = NEW OrderedAIAction(this, ability, ability->source);
if (!check)
return -1;
int result = getEfficiency(check);
SAFE_DELETE(check);
return result;
@@ -2757,8 +2757,8 @@ MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * pMana, const char * ty
payAlternative = NONE;
gotPayments = vector<MTGAbility*>();
//canplayfromgraveyard
while ((card = cd.nextmatch(game->graveyard, card)))
{
while ((card = cd.nextmatch(game->graveyard, card)))
{
bool hasFlashback = false;
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
if (hasFlashback && (card->getManaCost() != card->getManaCost()->getFlashback()))
continue;
continue;
// Case were manacost is equal to retrace cost, if they are different the AI hangs
if (hasRetrace && (card->getManaCost() != card->getManaCost()->getRetrace()))
continue;*/
continue;*/
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]))
continue;
if(hints && hints->HintSaysItsForCombo(observer,card))
{
if(hints->canWeCombo(observer,card,this))
@@ -2834,7 +2834,7 @@ MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * pMana, const char * ty
else
{
nextCardToPlay = NULL;
continue;
continue;
}
}
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]))
continue;
if(hints && hints->HintSaysItsForCombo(observer,card))
{
if(hints->canWeCombo(observer,card,this))
@@ -3005,7 +3005,7 @@ MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * pMana, const char * ty
else
{
nextCardToPlay = NULL;
continue;
continue;
}
}
int currentCost = card->getManaCost()->getConvertedCost();
@@ -3013,7 +3013,7 @@ MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * pMana, const char * ty
gotPayments.clear();
if((!pMana->canAfford(card->getManaCost(),0) || card->getManaCost()->getKicker()))
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))))
{
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)
continue;
if (card->hasType(Subtypes::TYPE_LEGENDARY) && game->inPlay->findByName(card->name))
continue;
if(hints && hints->HintSaysItsForCombo(observer,card))
{
if(hints->canWeCombo(observer,card,this))
@@ -3143,7 +3143,7 @@ MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * pMana, const char * ty
else
{
nextCardToPlay = NULL;
continue;
continue;
}
}
int currentCost = card->getManaCost()->getConvertedCost();
@@ -3151,7 +3151,7 @@ MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * pMana, const char * ty
gotPayments.clear();
if((!pMana->canAfford(card->getManaCost(),0) || card->getManaCost()->getKicker()))
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))))
{
TargetChooserFactory tcf(observer);
@@ -3275,8 +3275,8 @@ MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * pMana, const char * ty
//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]))
//continue;
//continue;
if(hints && hints->HintSaysItsForCombo(observer,card))
{
if(hints->canWeCombo(observer,card,this))
@@ -3294,7 +3294,7 @@ MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * pMana, const char * ty
else
{
nextCardToPlay = NULL;
continue;
continue;
}
}
int currentCost = card->getManaCost()->getConvertedCost();
@@ -3487,7 +3487,7 @@ MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * pMana, const char * ty
if(hints && hints->HintSaysItsForCombo(observer,nextCardToPlay))
{
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())
{
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());
@@ -3574,7 +3574,7 @@ int AIPlayerBaka::computeActions()
if(doThis >= 0)
{
if(object->abilitiesMenu->isMultipleChoice)
observer->mLayers->actionLayer()->ButtonPressedOnMultipleChoice(doThis);
observer->mLayers->actionLayer()->ButtonPressedOnMultipleChoice(doThis);
else
observer->mLayers->actionLayer()->doReactTo(doThis);
}
@@ -3985,16 +3985,16 @@ int AIPlayerBaka::getCreaturesInfo(Player * player, int neededInfo, int untapMod
int AIPlayerBaka::chooseAttackers()
{
int myCreatures = getCreaturesInfo(this, INFO_NBCREATURES, -1, 1);
if (myCreatures < 1)
return 0;
int myCreatures = getCreaturesInfo(this, INFO_NBCREATURES, -1, 1);
if (myCreatures < 1)
return 0;
//Attack with all creatures
//How much damage can the other player do during his next Attack ?
int opponentForce = getCreaturesInfo(opponent(), INFO_CREATURESPOWER);
int opponentCreatures = getCreaturesInfo(opponent(), INFO_NBCREATURES);
int myForce = getCreaturesInfo(this, INFO_CREATURESPOWER, -1, 1);
if(opponent()->life < 5)
agressivity += 31;
if(opponent()->life < 5)
agressivity += 31;
bool attack = ((myCreatures > opponentCreatures) || (myForce > opponentForce) || (myForce > 2 * opponent()->life));
if (agressivity > 80 && !attack && life > opponentForce)
@@ -4002,7 +4002,7 @@ int AIPlayerBaka::chooseAttackers()
opponentCreatures = getCreaturesInfo(opponent(), INFO_NBCREATURES, -1);
opponentForce = getCreaturesInfo(opponent(), INFO_CREATURESPOWER, -1);
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);
@@ -4012,16 +4012,13 @@ int AIPlayerBaka::chooseAttackers()
MTGCardInstance * card = NULL;
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);
observer->cardClick(card, MTGAbility::ATTACK_COST);
}
MTGAbility* a = observer->mLayers->actionLayer()->getAbility(MTGAbility::ATTACK_COST);
doAbility(a, card);
observer->cardClick(card, MTGAbility::ATTACK_COST);
}
observer->cardClick(card, MTGAbility::MTG_ATTACK_RULE);
}
@@ -4052,6 +4049,76 @@ int AIPlayerBaka::chooseAttackers()
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 ? */
int AIPlayerBaka::canFirstStrikeKill(MTGCardInstance * card, MTGCardInstance *ennemy)
{
@@ -4073,14 +4140,16 @@ int AIPlayerBaka::chooseBlockers()
//Should not block during my own turn...
if (observer->currentPlayer == this)
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
CardDescriptor cdAttackers;
cdAttackers.init();
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)))
{
if (card->isAttacker())
@@ -4094,11 +4163,12 @@ int AIPlayerBaka::chooseBlockers()
cd.unsecureSetTapped(-1);
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)))
{
if(hints && hints->HintSaysDontBlock(observer,card))
if (hints && hints->HintSaysDontBlock(observer, card))
continue;
observer->cardClick(card, MTGAbility::MTG_BLOCK_RULE);
int set = 0;
while (!set)
@@ -4109,8 +4179,8 @@ int AIPlayerBaka::chooseBlockers()
}
else
{
MTGCardInstance * attacker = card->defenser;
map<MTGCardInstance *, int>::iterator it = opponentsToughness.find(attacker);
MTGCardInstance* attacker = card->defenser;
map<MTGCardInstance*, int>::iterator it = opponentsToughness.find(attacker);
if (it == opponentsToughness.end())
{
opponentsToughness[attacker] = attacker->toughness;
@@ -4125,7 +4195,7 @@ int AIPlayerBaka::chooseBlockers()
{
if (card->blockCost)
{
MTGAbility * a = observer->mLayers->actionLayer()->getAbility(MTGAbility::BLOCK_COST);
MTGAbility* a = observer->mLayers->actionLayer()->getAbility(MTGAbility::BLOCK_COST);
doAbility(a, card);
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,
// We change strategy, first we unassign its blockers that where assigned above
// Second pass: unassign if attacker is not expected to die
card = NULL;
while ((card = cd.nextmatch(game->inPlay, card)))
{
if(hints && hints->HintSaysDontBlock(observer,card))
if (hints && hints->HintSaysDontBlock(observer, card))
continue;
if (card->defenser && opponentsToughness[card->defenser] > 0)
{
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;
while ((card = cd.nextmatch(game->inPlay, card)))
{
if(hints && hints->HintSaysDontBlock(observer,card))
if (hints && hints->HintSaysDontBlock(observer, card))
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);
doAbility(a, card);
MTGCardInstance* blocker = *itb;
if (blocker)
totalAssignedDamage += blocker->power;
}
observer->cardClick(card, MTGAbility::MTG_BLOCK_RULE);
int set = 0;
while (!set)
int maxBlockers = 1;
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;
if (opponentsToughness[attacker] <= 0 || (card->toughness <= attacker->power && opponentForce * 2 < life && !canFirstStrikeKill(card, attacker)) || attacker->nbOpponents() > 1)
bestScore = score;
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)
{
MTGAbility * a = observer->mLayers->actionLayer()->getAbility(MTGAbility::BLOCK_COST);
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;
extraBlockers.push_back(c2);
if ((int)extraBlockers.size() + currentBlockers + 1 >= requiredBlockers)
break;
}
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;
}
@@ -4269,7 +4442,7 @@ int AIPlayerBaka::receiveEvent(WEvent * event)
AIPlayerBaka::AIPlayerBaka(GameObserver *observer, string file, string fileSmall, string avatarFile, MTGDeck * deck) :
AIPlayer(observer, file, fileSmall, deck)
AIPlayer(observer, file, fileSmall, deck)
{
nextCardToPlay = NULL;
@@ -4312,7 +4485,7 @@ AIPlayerBaka::AIPlayerBaka(GameObserver *observer, string file, string fileSmall
if (fileSmall == "ai_baka_eviltwin")
mAvatar->SetHFlip(true);
initTimer();
}
@@ -4379,17 +4552,17 @@ int AIPlayerBaka::Act(float dt)
else
{
if (observer->currentActionPlayer == this)//if im not the action player why would i requestnextphase?
observer->userRequestNextGamePhase();
observer->userRequestNextGamePhase();
}
}
else
{
while(clickstream.size())
{
AIAction * action = clickstream.front();
action->Act();
SAFE_DELETE(action);
clickstream.pop();
AIAction * action = clickstream.front();
action->Act();
SAFE_DELETE(action);
clickstream.pop();
}
}
return 1;

View File

@@ -213,6 +213,24 @@ void Credits::compute(GameObserver* g, GameApp * _app)
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)
{
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"));
bonus.push_back(b);
}
if (mGamesWon==0)
{
CreditBonus * b = NEW CreditBonus(100, _("Game Bonus"));
bonus.push_back(b);
}
if (mGamesWon>1)
{
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);
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);
}
}

View File

@@ -1292,6 +1292,7 @@ void GameObserver::Affinity()
card->has(Constants::AFFINITYCONTROLLERCREATURES) ||
card->has(Constants::AFFINITYOPPONENTCREATURES) ||
card->has(Constants::AFFINITYALLDEADCREATURES) ||
card->has(Constants::AFFINITYTWOALLDEADCREATURES) ||
card->has(Constants::AFFINITYPARTY) ||
card->has(Constants::AFFINITYBASICLANDTYPES) ||
card->has(Constants::AFFINITYTWOBASICLANDTYPES) ||

View File

@@ -605,7 +605,7 @@ int AbilityFactory::parseCastRestrictions(MTGCardInstance * card, Player * playe
if (grave->hasType("artifact")) checkTypesAmount++;
if (grave->hasType("planeswalker")) checkTypesAmount++;
if (grave->hasType("battle")) checkTypesAmount++;
if (grave->hasType("tribal")) checkTypesAmount++;
if (grave->hasType("kindred")) checkTypesAmount++;
if (checkTypesAmount < 4)
return 0;
}
@@ -625,7 +625,7 @@ int AbilityFactory::parseCastRestrictions(MTGCardInstance * card, Player * playe
if (grave->hasType("artifact")) checkTypesAmount++;
if (grave->hasType("planeswalker")) checkTypesAmount++;
if (grave->hasType("battle")) checkTypesAmount++;
if (grave->hasType("tribal")) checkTypesAmount++;
if (grave->hasType("kindred")) checkTypesAmount++;
if (checkTypesAmount > 3)
return 0;
}

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
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();
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
CardPrimitive::setSubtype(values[i].c_str());
const string& subtype = values[i];
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;
if (opponent->basicAbilities[(int)Constants::FEAR] && !(this->hasType(Subtypes::TYPE_ARTIFACT) || this->hasColor(Constants::MTG_COLOR_BLACK)))
return 0;
if (opponent->controller()->game->battlefield->hasAbility(Constants::LURE) && !opponent->has(Constants::LURE))
return 0;
//if (opponent->controller()->game->battlefield->hasAbility(Constants::LURE) && !opponent->has(Constants::LURE))
//return 0; Doesn't consider if the lure creature is attacking
//intimidate
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::AFFINITYOPPONENTCREATURES) ||
card->has(Constants::AFFINITYALLDEADCREATURES) ||
card->has(Constants::AFFINITYTWOALLDEADCREATURES) ||
card->has(Constants::AFFINITYPARTY) ||
card->has(Constants::AFFINITYBASICLANDTYPES) ||
card->has(Constants::AFFINITYTWOBASICLANDTYPES) ||
@@ -1381,7 +1387,7 @@ ManaCost * MTGCardInstance::computeNewCost(MTGCardInstance * card,ManaCost * Cos
color = 1;
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";
}
@@ -1456,6 +1462,13 @@ ManaCost * MTGCardInstance::computeNewCost(MTGCardInstance * card,ManaCost * Cos
reduce = value->getValue();
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))
{
WParsedInt* value = NEW WParsedInt("calculateparty", NULL, card);

View File

@@ -252,7 +252,7 @@ const char* Constants::MTGBasicAbilities[] = {
"affinityallcreatures", //Cost 1 less for each creature in all battlefields.
"affinitycontrollercreatures", //Cost 1 less for each creature in controller 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.
"affinityenchantments", //Cost 1 less for each enchantment 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
"eqpasinst", // Can equip as instant
"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;

View File

@@ -19,7 +19,7 @@ Subtypes::Subtypes()
find("Equipment");
find("Aura");
find("Planeswalker");
find("Tribal");
find("Kindred");
find("Plane");
find("Scheme");
find("Vanguard");
@@ -96,7 +96,7 @@ bool Subtypes::isType(unsigned int type)
type == TYPE_LAND ||
type == TYPE_ARTIFACT ||
type == TYPE_PLANESWALKER ||
type == TYPE_TRIBAL ||
type == TYPE_KINDRED ||
type == TYPE_PLANE ||
type == TYPE_SCHEME ||
type == TYPE_VANGUARD ||

View File

@@ -319,6 +319,11 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta
zones[nbzones++] = MTGGameZone::MY_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)
{
zones[nbzones++] = MTGGameZone::MY_LIBRARY;
@@ -1155,7 +1160,7 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta
cd->removeType("creature");
cd->removeType("planeswalker");
cd->removeType("battle");
cd->removeType("tribal");
cd->removeType("kindred");
if (!cd->types.size()){
int i = rand() % 10000 + 1;
ostringstream subt;

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:");
if (filterType == FILTER_TYPE)
{
mParent->addArg("Legendary Creature", "t:Legendary;&t:Creature;");
mParent->addArg("Artifact", "t:Artifact;");
mParent->addArg("Artifact Creature", "t:Artifact;&t:Creature;");
mParent->addArg("Aura", "t:Aura;");
mParent->addArg("Basic", "t:Basic;");
mParent->addArg("Battle", "t:Battle;");
mParent->addArg("Creature", "t:Creature;");
mParent->addArg("Enchantment", "t:Enchantment;");
mParent->addArg("Equipment", "t:Equipment;");
mParent->addArg("Instant", "t:Instant;");
mParent->addArg("Kindred", "t:Kindred;");
mParent->addArg("Land", "t:Land;");
mParent->addArg("Legendary", "t:Legendary;");
mParent->addArg("Sorcery", "t:Sorcery;");
mParent->addArg("Snow", "t:Snow;");
mParent->addArg("Tribal", "t:Tribal;");
mParent->addArg("Noncreature", "{t:Creature;}");
mParent->addArg("Nonland", "{t:Land;}");
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("Conspiracy", "t:Conspiracy;");
@@ -2149,6 +2152,7 @@ void WGuiFilterItem::updateValue()
mParent->addArg("Rare", "r:r;");
mParent->addArg("Uncommon", "r:u;");
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;}");
}
else if (filterType == FILTER_CMC)

View File

@@ -1186,7 +1186,7 @@ void WParsedInt::init(string s, Spell * spell, MTGCardInstance * card)
intValue = 0;
if(card->hasType(Subtypes::TYPE_PLANESWALKER))
intValue++;
if(card->hasType(Subtypes::TYPE_TRIBAL))
if(card->hasType(Subtypes::TYPE_KINDRED))
intValue++;
if(card->hasType(Subtypes::TYPE_SORCERY))
intValue++;
@@ -1262,7 +1262,7 @@ void WParsedInt::extendedParse(string s, Spell * spell, MTGCardInstance * card)
MTGGameZone * checkZone = card->getObserver()->players[j]->game->inPlay;
if(cardHasTypeinZone("planeswalker",checkZone))
pc = 1;
if(cardHasTypeinZone("tribal",checkZone))
if(cardHasTypeinZone("kindred",checkZone))
tc = 1;
if(cardHasTypeinZone("sorcery",checkZone))
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;
if(cardHasTypeinZone("planeswalker",checkZone))
pc = 1;
if(cardHasTypeinZone("tribal",checkZone))
if(cardHasTypeinZone("kindred",checkZone))
tc = 1;
if(cardHasTypeinZone("sorcery",checkZone))
sc = 1;
@@ -1311,7 +1311,7 @@ void WParsedInt::extendedParse(string s, Spell * spell, MTGCardInstance * card)
MTGGameZone * checkZone = card->getObserver()->players[j]->game->graveyard;
if(cardHasTypeinZone("planeswalker",checkZone))
pc = 1;
if(cardHasTypeinZone("tribal",checkZone))
if(cardHasTypeinZone("kindred",checkZone))
tc = 1;
if(cardHasTypeinZone("sorcery",checkZone))
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;
if(cardHasTypeinZone("planeswalker",checkZone))
pc = 1;
if(cardHasTypeinZone("tribal",checkZone))
if(cardHasTypeinZone("kindred",checkZone))
tc = 1;
if(cardHasTypeinZone("sorcery",checkZone))
sc = 1;