Add project files: decks, scripts, and collection data

This commit is contained in:
Tuan-Dat Tran
2026-02-20 00:22:14 +01:00
parent 013aa9c636
commit 36a31da6d4
22 changed files with 48758 additions and 0 deletions

14859
card_cache.json Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,932 @@
1 Giant Koi (TLA) 53
1 Grappling Kraken (FDN) 39
3 Stratosoarer (ECL) 72
1 Doc Ock, Sinister Scientist (SPM) 29
1 Hraesvelgr of the First Brood (FIC) 37
1 Summon: Shiva (FIN) 78
2 Pestered Wellguard (ECL) 63
2 Wanderwine Distracter (ECL) 82
1 Alphinaud Leveilleur (FIC) 33
1 Kukemssa Serpent (MIR) 72
1 Surveillance Monitor (MKM) 73
1 Enduring Curiosity (DSK) 51
2 Kulrath Mystic (ECL) 56
1 Glamermite (ECL) 50
1 Nebelgast Herald (INR) 78
1 Quistis Trepe (FIN) 66
1 Erudite Wizard (FDN) 37
1 The Mechanist, Aerial Artisan (TLA) 64
1 Jill, Shiva's Dominant // Shiva, Warden of Ice (FIN) 58
1 Gogo, Master of Mimicry (FIN) 54
1 Fear of Isolation (DSK) 58
1 Il Mheg Pixie (FIN) 57
1 Agent of Kotis (TDM) 36
1 Hypnotic Sprite // Mesmeric Glare (FIC) 264
1 Tiger-Seal (TLA) 75
1 Kithkeeper (ECL) 23
1 Salt Road Packbeast (TDM) 23
1 Beatrix, Loyal General (FIN) 554
2 Sun-Dappled Celebrant (ECL) 37
1 Summon: Good King Mog XII (FIC) 26
1 Master Piandao (TLA) 28
1 Kalonian Twingrove (M15) 182
1 Thancred Waters (FIC) 31
1 Minwu, White Mage (FIN) 26
1 Friendly Ghost (DSK) 12
1 Daily Bugle Reporters (SPM) 6
1 Unsettling Twins (DSK) 38
1 Kyoshi Warriors (TLA) 26
1 Summon: Primal Garuda (FIN) 37
1 Rosa, Resolute White Mage (FIN) 555
1 Dragonback Lancer (TDM) 9
4 Weapons Vendor (FIN) 40
1 Gallant Fowlknight (ECL) 17
4 Shore Lurker (ECL) 34
1 Anafenza, Unyielding Lineage (TDM) 2
1 Tempest Hawk (TDM) 31
1 Summon: Choco/Mog (FIN) 35
1 Arachne, Psionic Weaver (SPM) 2
1 Dazzling Angel (FDN) 9
1 Flight-Deck Coordinator (EOE) 17
1 Earth Kingdom Jailer (TLA) 16
1 Aerith Gainsborough (FIN) 4
1 Alisaie Leveilleur (FIC) 9
1 Glider Kids (TLA) 21
3 Gaelicat (FIN) 22
2 Reluctant Dounguard (ECL) 31
2 Meanders Guide (ECL) 25
1 Tributary Vaulter (ECL) 40
1 Sunpearl Kirin (TDM) 29
1 Bearer of Glory (TDM) 4
1 Flash Thompson, Spider-Fan (SPM) 7
1 Tataru Taru (FIC) 30
1 Jeong Jeong's Deserters (TLA) 25
1 Hildibrand Manderville // Gentleman's Rise (FIC) 83
2 Ambrosia Whiteheart (FIN) 6
4 Coeurl (FIN) 12
2 Timid Shieldbearer (ECL) 39
1 Encumbered Reejerey (ECL) 14
1 Veteran Survivor (DSK) 40
1 Mardu Devotee (TDM) 16
1 Momo, Friendly Flier (TLA) 29
1 Curious Farm Animals (TLA) 14
2 Valkyrie Aerial Unit (FIN) 84
2 Ice Flan (FIN) 55
3 Rook Turret (FIN) 69
2 Venser, Shaper Savant (FCA) 6
2 Qiqirn Merchant (FIN) 65
8 Dragoon's Wyvern (FIN) 49
3 Sahagin (FIN) 71
3 Scorpion Sentinel (FIN) 72
2 G'raha Tia (FIN) 21
4 Cloudbound Moogle (FIN) 11
2 Delivery Moogle (FIN) 15
2 Compassionate Healer (TLA) 13
3 Adelbert Steiner (FIN) 3
6 Dwarven Castle Guard (FIN) 18
2 Magitek Infantry (FIN) 25
1 Zodiark, Umbral God (FIN) 128
1 Feral Deathgorger // Dusk Sight (TDM) 80
1 Basilica Stalker (MKM) 78
1 Spectral Snatcher (DSK) 116
1 Canyon Crawler (TLA) 90
1 Perigee Beckoner (EOE) 112
1 Venom, Evil Unleashed (SPM) 71
1 Stinging Scorpion (UND) 46
2 Blighted Blackthorn (ECL) 90
1 Syr Konrad, the Grim (FCA) 10
1 Zenos yae Galvus // Shinryu, Transcendent Rival (FIN) 127
1 Jecht, Reluctant Guardian // Braska's Final Aeon (FIN) 104
1 Dashing Bloodsucker (DSK) 90
1 Crypt Feaster (FDN) 59
1 Gravblade Heavy (EOE) 102
1 Buzzard-Wasp Colony (TLA) 88
1 Soul-Shackled Zombie (FDN) 70
3 Dawnhand Eulogist (ECL) 99
4 Dream Seizer (ECL) 101
1 Nightmare Sower (ECL) 114
1 Vincent Valentine // Galian Beast (FIN) 125
1 Shambling Cie'th (FIN) 117
1 Plaguecrafter (BLC) 187
1 Archghoul of Thraben (INR) 95
1 Fang, Fearless l'Cie (FIN) 99
1 Hog-Monkey (TLA) 104
1 Pirate Peddlers (TLA) 115
1 Moonglove Extractor (ECL) 109
1 Heirloom Auntie (ECL) 107
1 Gnarlbark Elm (ECL) 103
1 Retched Wretch (ECL) 117
1 June, Bounty Hunter (TLA) 106
1 Merchant of Many Hats (TLA) 110
1 Mai, Scornful Striker (TLA) 109
1 Corrupt Court Official (TLA) 92
1 Burglar Rat (FDN) 170
1 Reno and Rude (FIN) 113
1 Demon Wall (FIN) 97
1 Unburied Earthcarver (TDM) 95
1 Scarblade Scout (ECL) 118
3 Boggart Prankster (ECL) 93
3 Bile-Vial Boggart (ECL) 87
2 Summon: Primal Odin (FIN) 121
2 Malboro (FIN) 106
2 Beetle-Headed Merchants (TLA) 86
4 Namazu Trader (FIN) 107
2 Gaius van Baelsar (FIN) 102
2 Qutrub Forayer (FIN) 112
3 Ahriman (FIN) 87
3 Shinra Reinforcements (FIN) 118
2 Fire Nation Engineer (TLA) 99
2 Wolfbat (TLA) 122
3 Al Bhed Salvagers (FIN) 88
3 Undercity Dire Rat (FIN) 123
5 Hecteyes (FIN) 103
2 Kulrath Zealot (ECL) 148
1 Gilgamesh, Master-at-Arms (FIN) 139
1 Mongoose Lizard (TLA) 148
1 Boilerbilges Ripper (DSK) 127
1 Razorkin Hordecaller (DSK) 152
1 Sandworm (FIN) 155
1 Combustion Man (TLA) 127
1 Meticulous Artisan (TDM) 112
1 Sower of Chaos (FDN) 95
1 Wartime Protestors (TLA) 160
1 Gogo, Mysterious Mime (FIC) 56
1 Flamekin Gildweaver (ECL) 140
1 Tersa Lightshatter (TDM) 127
1 Vicious Clown (DSK) 163
1 Frontline War-Rager (EOE) 134
1 Spider-Gwen, Free Spirit (SPM) 90
1 Lightning, Security Sergeant (FIN) 560
1 Summon: G.F. Cerberus (FIN) 162
1 Boar-q-pine (TLA) 124
3 Brambleback Brute (ECL) 128
1 Brazen Scourge (FDN) 191
1 Deserter's Disciple (TLA) 131
1 Yuyan Archers (TLA) 161
1 Blood Petal Celebrant (INR) 144
1 Axgard Cavalry (FDN) 189
1 Shock Brigade (TDM) 120
1 Taxi Driver (SPM) 97
1 Firebrand Archer (FDN) 196
1 Explosive Prodigy (ECL) 136
2 Flame-Chain Mauler (ECL) 138
2 Hill Gigas (FIN) 141
2 Boldwyr Aggressor (ECL) 125
2 Barret Wallace (FIN) 129
2 Spider-Islanders (SPM) 91
2 Fire Nation Raider (TLA) 135
2 Mysidian Elder (FIN) 145
2 Superior Foes of Spider-Man (SPM) 96
2 Queen Brahne (FIN) 149
4 Summon: G.F. Ifrit (FIN) 163
3 Enraged Flamecaster (ECL) 135
2 Sabotender (FIN) 153
2 Tiger-Dillo (TLA) 155
7 Item Shopkeep (FIN) 142
3 Gristle Glutton (ECL) 144
3 Blazing Bomb (FIN) 130
2 Freya Crescent (FIN) 138
1 Wildwood Scourge (FDN) 236
1 Diamond Weapon (FIN) 183
1 Coliseum Behemoth (FIN) 181
1 Slavering Branchsnapper (DSK) 198
1 Spider-Rex, Daring Dino (SPM) 116
1 Apothecary Stomper (FDN) 99
1 Badgermole (TLA) 166
2 Safewright Cavalry (ECL) 191
1 The Boulder, Ready to Rumble (TLA) 168
1 Cackling Prowler (FDN) 101
1 Damage Control Crew (SPM) 99
1 Festerhide Boar (INR) 196
1 Rainveil Rejuvenator (TDM) 152
1 Trystan, Callous Cultivator // Trystan, Penitent Culler (ECL) 199
1 Vinebred Brawler (ECL) 201
1 Ostrich-Horse (TLA) 188
1 Supportive Parents (SPM) 119
1 Cryptid Inspector (DSK) 174
1 Tireless Tracker (EOC) 110
3 Lys Alana Informant (ECL) 181
1 Lys Alana Dignitary (ECL) 180
1 Town Greeter (FIN) 209
1 Sultai Devotee (TDM) 160
1 Rebellious Captives (TLA) 191
1 Hinterland Logger // Timber Shredder (INR) 203
1 House Cartographer (DSK) 185
1 Tunnel Tipster (MKM) 180
2 Virulent Emissary (ECL) 202
1 Spider-Ham, Peter Porker (PW25) 10
1 Cactuar (FIN) 177
1 Llanowar Elves (FDN) 227
3 Balamb T-Rexaur (FIN) 173
2 Summon: Fat Chocobo (FIN) 202
2 Vanille, Cheerful l'Cie (FIN) 211
6 Gigantoad (FIN) 187
3 Crossroads Watcher (ECL) 173
2 Walltop Sentries (TLA) 202
3 Loporrit Scout (FIN) 192
3 Summon: Fenrir (FIN) 203
2 Great Forest Druid (ECL) 178
2 Goobbue Gardener (FIN) 188
2 Kraven's Cats (SPM) 104
2 Turtle-Duck (TLA) 200
2 Gran Pulse Ochu (FIN) 189
1 Reputable Merchant (TDM) 217
1 Monastery Messenger (TDM) 208
1 G'raha Tia, Scion Reborn (FIC) 3
1 Rhino, Barreling Brute (SPM) 140
1 Vibrance (ECL) 249
1 Huntmaster of the Fells // Ravager of the Fells (INR) 241
1 Uncle Iroh (TLA) 248
1 Rydia, Summoner of Mist (FIN) 239
2 Stoic Grove-Guide (ECL) 243
1 Dai Li Agents (TLA) 214
1 Jenova, Ancient Calamity (FIN) 228
1 Stalwart Successor (TDM) 227
1 Lluwen, Imperfect Naturalist (ECL) 232
1 Shadow Urchin (ECL) 242
2 Chaos Spewer (ECL) 210
1 Black Waltz No. 3 (FIN) 214
1 Vial Smasher the Fierce (FCA) 59
1 Zuko, Conflicted (TLA) 253
1 Omega, Heartless Evolution (FIN) 236
1 Guru Pathik (TLA) 223
1 Clement, the Worrywort (BLB) 329
1 Hermitic Herbalist (TLA) 226
1 Platypus-Bear (TLA) 236
1 Twinflame Travelers (ECL) 345
1 Twinflame Travelers (ECL) 248
1 Sanar, Innovative First-Year (ECL) 241
2 Shantotto, Tactician Magician (FIN) 241
2 Flaring Cinder (ECL) 225
1 Ashling, Rekindled // Ashling, Rimebound (ECL) 124
2 The Emperor of Palamecia // The Lord Master of Hell (FIN) 219
1 Balmor, Battlemage Captain (FDN) 237
1 Azula, Cunning Usurper (TLA) 208
1 Ultimecia, Time Sorceress // Ultimecia, Omnipotent (FIN) 247
1 Messenger Hawk (TLA) 234
1 Emet-Selch, Unsundered // Hades, Sorcerer of Eld (FIN) 218
1 Locke Cole (FIN) 234
1 Suki, Kyoshi Warrior (TLA) 243
1 Good-Fortune Unicorn (FDN) 240
1 Serah Farron // Crystallized Serah (FIN) 240
1 Wary Farmer (ECL) 251
1 Garnet, Princess of Alexandria (FIN) 222
1 Catharsis (ECL) 209
1 Cloud, Planet's Champion (FIN) 552 *F*
1 Sami, Ship's Engineer (EOE) 225
2 Feisty Spikeling (ECL) 223
1 Eirdu, Carrier of Dawn // Isilu, Carrier of Twilight (ECL) 13
1 Estinien Varlineau (FIC) 82
1 Prideful Feastling (ECL) 238
1 Ardbert, Warrior of Darkness (FIC) 77
1 Merrow Skyswimmer (ECL) 234
1 Wraith, Vicious Vigilante (SPM) 160
1 Lyse Hext (FIC) 88
1 Tidus, Blitzball Star (FIN) 246
1 Deepchannel Duelist (ECL) 213
1 Urianger Augurelt (FIC) 96
2 Gladiolus Amicitia (FIN) 224
2 Balthier and Fran (FIN) 213
3 Cloud of Darkness (FIN) 217
2 Exdeath, Void Warlock // Neo Exdeath, Dimension's End (FIN) 220
2 Boggart Cursecrafter (ECL) 331
2 Garland, Knight of Cornelia // Chaos, the Endless (FIN) 221
2 Ignis Scientia (FIN) 227
2 Mischievous Sneakling (ECL) 235
2 Voracious Tome-Skimmer (ECL) 250
2 Rinoa Heartilly (FIN) 237
2 Giott, King of the Dwarves (FIN) 223
2 Private Eye (MKM) 223
1 Red Herring (MKM) 142
1 Abundant Maw (INR) 1
1 Relentless X-ATM092 (FIN) 268
2 Rooftop Percher (ECL) 2
1 Palladium Myr (CMM) 967
2 Changeling Wayfinder (ECL) 1
1 Spider-Bot (SPM) 173
1 Campus Guide (FDN) 251
2 Iron Giant (FIN) 260
7 Magic Pot (FIN) 263
2 Mechanical Mobster (SPM) 168
2 Embermouth Sentinel (TDM) 242
2 Chocobo Racetrack (FIN) 179
1 The Fire Crystal (FIN) 135
1 Chaos Shrine's Black Crystal (FIC) 445
1 Cryogen Relic (EOE) 52
1 Phoenix Down (FIN) 29
1 Coveted Jewel (FIC) 341
2 Firdoch Core (ECL) 255
1 Puca's Eye (ECL) 259
1 Talisman of Dominance (FIC) 364
1 Ravenous Amulet (FDN) 131
1 Tome of Legends (FIC) 369
3 Sol Ring (M3C) 305
2 Everflowing Chalice (FIC) 343
9 White Auracite (FIN) 41
3 Blitzball (FIN) 254
4 Instant Ramen (FIN) 259
3 World Map (FIN) 270
3 Lunatic Pandora (FIN) 262
1 Genji Glove (FIN) 258
2 Black Mage's Rod (FIN) 90
2 Barbed Bloodletter (ECL) 86
2 Blue Mage's Cane (FIC) 35
1 Dragoon's Lance (FIN) 17
1 Ultima Weapon (FIN) 563
1 Leyline Axe (FDN) 129
1 Butcher's Cleaver (INR) 256
2 Whispersilk Cloak (10E) 345
1 Monk's Fist (FIN) 265
1 Cobbled Wings (INR) 258
1 Kyoshi Battle Fan (TLA) 257
2 Swiftfoot Boots (TDC) 328
1 Spider-Suit (SPM) 176
1 Thinking Cap (MKM) 257
1 Excalibur II (FIN) 352
1 Phantom Train (FIN) 110
1 Invasion Submersible (TLA) 57
1 Cargo Ship (FIN) 47
1 Smuggler's Copter (FCA) 62
1 Subway Train (SPM) 178
3 Bard's Bow (FIN) 174
5 Warrior's Sword (FIN) 169
5 Samurai's Katana (FIN) 154
4 Red Mage's Rapier (FIN) 152
3 Coral Sword (FIN) 134
4 Dark Knight's Greatsword (FIN) 95
4 Sage's Nouliths (FIN) 70
3 Astrologian's Planisphere (FIN) 46
3 Paladin's Arms (FIN) 28
4 White Mage's Staff (FIN) 42
2 Crystal Fragments // Summon: Alexander (FIN) 13
2 The Masamune (FIN) 264
4 Stalactite Dagger (ECL) 261
2 The Prima Vista (FIN) 64
3 Magitek Armor (FIN) 24
1 Disturbing Mirth (DSK) 212
1 Eusocial Engineering (EOE) 181
1 Wall Crawl (SPM) 121
5 Gilt-Leaf's Embrace (ECL) 177
1 Campsite Cuisine (FIC) 464
1 Triple Triad (FIN) 340
1 Breaching Dragonstorm (TDM) 101
1 Connecting the Dots (MKM) 118
1 Meathook Massacre II (DSK) 108
1 Boggart Mischief (ECL) 92
1 Cracked Skull (DSK) 88
1 Bastion of Remembrance (FIC) 274
1 Eye of Nidhogg (FIC) 44
2 Mornsong Aria (ECL) 111
1 Corroding Dragonstorm (TDM) 75
1 Northern Air Temple (TLA) 111
1 Sidequest: Card Collection // Magicked Card (FIN) 73
1 Meat Locker // Drowned Diner (DSK) 65
1 Spider-Man No More (SPM) 45
1 Security Bypass (SNC) 59
1 Roiling Dragonstorm (TDM) 296
3 Blossombind (ECL) 45
1 Noggle the Mind (ECL) 60
1 Aquitect's Defenses (ECL) 44
1 Watery Grasp (TLA) 82
1 Sleep Magic (FIN) 74
1 Witness Protection (FDN) 168
1 Ringing Strike Mastery (TDM) 53
1 Kinbinding (ECL) 407 *F*
1 Southern Air Temple (TLA) 36
2 Clachan Festival (ECL) 10
4 Spiral into Solitude (ECL) 36
1 Evershrike's Gift (ECL) 15
2 Kraven's Last Hunt (SPM) 105
2 Prismatic Undercurrents (ECL) 189
3 Ride the Shoopuf (FIN) 197
2 Sidequest: Play Blitzball // World Champion, Celestial Weapon (FIN) 158
3 Liminal Hold (ECL) 24
2 Sidequest: Catch a Fish // Cooking Campsite (FIN) 31
2 Due Diligence (MKM) 14
1 Dragonclaw Strike (TDM) 180
1 Trystan's Command (ECL) 247
1 Grub's Command (ECL) 228
1 Pumpkin Bombardment (SPM) 139
1 Lie in Wait (TDM) 203
1 Brigid's Command (ECL) 208
1 Rydia's Return (FIN) 198
1 Bite Down on Crime (MKM) 154
1 Earthbending Lesson (TLA) 176
2 Reach the Horizon (FIN) 195
1 Tend the Sprigs (ECL) 197
1 Shattered Wings (EOE) 206
1 Scout the City (SPM) 113
2 Chocobo Kick (FIN) 178
1 Clash of the Eikons (FIN) 180
1 Clash of the Eikons (FIN) 341
1 Choco-Comet (FIN) 132
1 Terminal Velocity (EOE) 163
1 Unexpected Request (FIN) 167
1 Light Up the Stage (FCA) 39
1 Boulder Dash (ECL) 127
1 Jet's Brainwashing (TLA) 143
1 Killing Wave (INR) 121
1 Bloodline Bidding (ECL) 91
1 Evil Reawakened (FIN) 98
1 Crux of Fate (FIC) 275
2 Circle of Power (FIN) 92
1 The Final Days (FIN) 101
2 Risky Research (SPM) 62
1 Temporal Intervention (EOE) 120
1 Extract a Confession (MKM) 84
4 Bogslither's Embrace (ECL) 94
1 Reanimate (ARC) 21
1 Wanderwine Farewell (ECL) 83
1 Waterbending Lesson (TLA) 80
1 Lingering Souls (FIC) 245
1 Cut a Deal (FIC) 238
4 Gysahl Greens (FIN) 190
4 Commune with Beavers (FIN) 182
2 Random Encounter (FIN) 150
2 Call the Mountain Chocobo (FIN) 131
3 Suplex (FIN) 164
2 Impolite Entrance (ECL) 146
3 Cinder Strike (ECL) 131
3 Venom's Hunger (SPM) 73
2 Darkness Descends (ECL) 97
2 Poison the Waters (FIN) 111
2 Dai Li Indoctrination (TLA) 93
4 Resentful Revelation (FIN) 114
2 Retrieve the Esper (FIN) 68
2 Temporal Cleansing (ECL) 78
3 Relm's Sketching (FIN) 67
3 Combat Tutorial (FIN) 48
2 Boomerang Basics (TLA) 46
2 The Crystal's Chosen (FIN) 14
3 Aerith Rescue Mission (FIN) 5
2 From Father to Son (FIN) 20
2 Aang's Journey (TLA) 1
1 Auroral Procession (TDM) 169
1 Perennation (TDM) 212
1 Abandon Attachments (TLA) 205
2 Prishe's Wanderings (FIN) 193
1 Cycle of Renewal (TLA) 170
2 Unforgiving Aim (ECL) 200
1 Origin of Metalbending (TLA) 187
1 Rocky Rebuke (TLA) 193
1 Heritage Reclamation (TDM) 145
1 Close Encounter (EOE) 176
2 Midnight Tilling (ECL) 182
1 Giant Growth (FDN) 223
1 Caught Red-Handed (MKM) 115
1 Impossible Inferno (DSK) 140
1 Judgment Bolt (FIN) 559
1 Seize Opportunity (TDM) 119
2 Tweeze (ECL) 162
1 Laughing Mad (FIN) 143
1 Lightning Strike (TLA) 146
1 Firebending Lesson (TLA) 138
2 Fire Magic (FIN) 136
1 Murder (DSK) 110
1 Alesha's Legacy (TDM) 72
1 Fatal Fissure (TLA) 97
2 Vincent's Limit Break (FIN) 126
1 Fatal Push (FCA) 9
3 Scarblade's Malice (ECL) 119
1 Into the Story (FIC) 266
2 Sublime Epiphany (FIC) 271
2 Unexpected Assistance (ECL) 80
1 Uncharted Voyage (FDN) 53
1 Glimmerburst (DSK) 62
1 Scour for Scrap (EOE) 73
1 Swat Away (ECL) 75
1 Faebloom Trick (FDN) 38
1 Don't Make a Sound (DSK) 49
1 It'll Quench Ya! (TLA) 58
1 Dreams of Laguna (FIN) 50
1 Backslide (ONS) 70
1 Accumulate Wisdom (TLA) 44
1 Whoosh! (SPM) 48
3 Run Away Together (ECL) 67
4 Wild Unraveling (ECL) 84
1 Get Out (DSK) 60
1 Long River's Pull (BLB) 58
1 Stolen Uniform (FIN) 75
1 Claws Out (FDN) 6
1 Moogles' Valor (FIN) 27
1 Rally the Monastery (TDM) 19
1 Protective Response (ECL) 29
1 Razor Rings (TLA) 33
1 Keep Out (ECL) 19
2 Riverguard's Reflexes (ECL) 33
1 Yip Yip! (TLA) 43
1 Enter the Avatar State (TLA) 18
1 Unwanted Remake (DSK) 39
1 Strength of Arms (INR) 42
1 Zuko's Exile (TLA) 3
3 Airship Crash (FIN) 171
2 Allies at Last (TLA) 164
2 Sarkhan's Resolve (TDM) 158
3 Blitzball Shot (FIN) 176
2 Light of Judgment (FIN) 144
2 Haste Magic (FIN) 140
2 Cunning Maneuver (TLA) 130
4 Thunder Magic (FIN) 165
2 Sephiroth's Intervention (FIN) 116
3 Fight On! (FIN) 100
3 Vayne's Treachery (FIN) 124
3 Syncopate (FIN) 80
2 Lost Days (TLA) 62
2 Eject (FIN) 52
3 Ice Magic (FIN) 56
2 Octopus Form (TLA) 66
3 Magic Damper (FIN) 61
6 Fate of the Sun-Cryst (FIN) 19
2 Auron's Inspiration (FIN) 8
2 Battle Menu (FIN) 9
6 Slash of Light (FIN) 32
3 You're Not Alone (FIN) 44
1 Emeria Angel (TDC) 114
1 Summon: Choco/Mog (FIN) 358
1 Arcane Denial (CMA) 30
1 Emeria Shepherd (ZNC) 16
1 Abandoned Air Temple (TLA) 263
2 Prairie Stream (FIC) 413
1 Tangled Islet (FIC) 434
3 Reliquary Tower (TDC) 386
1 Farseek (FCA) 45
1 Gilded Goose (BLC) 221
1 Restoration Magic (FIN) 30
1 Radiant Grove (FIC) 414
1 Tranquil Landscape (MH3) 231
1 Suburban Sanctuary (SPM) 185
1 Hinterland Harbor (FIC) 403
1 Jackdaw Savior (BLB) 18
1 Negate (BBD) 123
1 Sazh's Chocobo (FIN) 200
1 Balamb Garden, SeeD Academy // Balamb Garden, Airborne (FIN) 272
2 Birds of Paradise (FIC) 483 *F*
2 Beastmaster Ascension (BLC) 118
1 River Hoopoe (2X2) 269
2 Swords to Plowshares (FIC) 256
1 Austere Command (M3C) 167
1 Bartz and Boko (FIN) 175
1 The Goose Mother (WOE) 204
1 Beast Within (TDC) 249
1 Flurry of Wings (ARB) 127
1 Glacial Fortress (BLC) 307
1 An Offer You Can't Refuse (FIC) 267
1 Cultivate (PW23) 6 *F*
1 Patchwork Banner (BLB) 247
1 Kastral, the Windcrested (BLB) 221
1 Restless Anchorage (LCI) 347
2 Plains (FIN) 295
1 Watcher of the Spheres (M21) 227
1 Murmuration (BLC) 10
1 Talisman of Progress (FIC) 367
1 Windurst, Federation Center (FIN) 292
1 Meditation Pools (TLA) 272
1 Demolition Field (FDN) 687
1 Adarkar Wastes (EOC) 147
1 Empyrean Eagle (FDN) 239
1 Forest (FIN) 307
1 Seaside Citadel (FIC) 420
1 Warden of Evos Isle (CMR) 106
2 Exotic Orchard (BLC) 131
1 Felidar Retreat (ZNR) 292
1 Ascend from Avernus (CLB) 5
1 Path to Exile (BLC) 147
1 Curiosity Crafter (BLC) 165
1 Sazh Katzroy (FIN) 199
1 Traveling Chocobo (FIN) 568 *F*
2 Counterspell (DSC) 114
1 Jumbo Cactuar (FIN) 191
1 Lifecreed Duo (BLB) 20
2 Evolving Wilds (BLC) 302
2 Path of Ancestry (TDC) 382
1 Airborne Aid (ONS) 62
1 Sharlayan, Nation of Scholars (FIN) 288
1 Brushland (FIC) 377
1 Plumecreed Escort (BLB) 65
1 Summon: Fat Chocobo (FIN) 371
1 Rampant Growth (TDC) 265
1 Winged Portent (VOW) 89
1 Hermes, Overseer of Elpis (FIC) 36
1 Wingmate Roc (C19) 78
1 Sunpetal Grove (BLC) 335
1 Herald's Horn (M3C) 296
1 Kangee's Lieutenant (CMR) 26
1 Dusk // Dawn (DRC) 65
1 Nature's Lore (FIC) 311
1 Terramorphic Expanse (TDC) 408
1 Plains (FIN) 294
1 Yavimaya Coast (TDC) 413
1 Seaside Haven (ONS) 323
1 Forest (FIN) 306
1 Gwaihir the Windlord (LTR) 210
1 City Pigeon (SPM) 4
1 Command Tower (FIC) 484
1 Sevinne's Reclamation (MH3) 267
1 Kangee, Sky Warden (CMR) 283
3 Plains (FIC) 478 *F*
1 Sidequest: Raise a Chocobo // Black Chocobo (FIN) 201
1 Generous Gift (BLC) 106
4 Island (FIC) 479 *F*
1 Canopy Vista (FIC) 378
2 Forest (FIC) 482 *F*
1 Choco, Seeker of Paradise (FIN) 215
3 Plains (FIN) 296
2 Mountain (FIC) 481 *F*
1 Mana Geyser (TDC) 223
1 Big Score (TDC) 206
1 Ovika, Enigma Goliath (ONE) 322
1 Summons of Saruman (LTC) 70
1 Izzet Signet (TDC) 320
1 Seize the Storm (INR) 170
1 Fact or Fiction (CMM) 91
2 Ring of the Lucii (FIN) 269
1 Elixir of Immortality (C21) 243
1 Drown in Dreams (M3C) 181
1 Vivi Ornitier (FIN) 248
1 Ultros, Obnoxious Octopus (FIN) 83
1 Island (TLA) 293
1 Decaying Time Loop (WHO) 80
1 Tellah, Great Sage (FIN) 244
1 Traumatize (MAR) 15
1 Experimental Overload (M21) 218
1 Sulfur Falls (EOC) 184
1 Abundant Growth (INR) 184
1 Curator's Ward (DOM) 49
2 Curiosity (ISD) 49
1 Snort (FIC) 58
1 Aetherize (FDN) 151
1 Talrand, Sky Summoner (OTC) 116
1 Epic Experiment (OTC) 222
2 Ur-Golem's Eye (C14) 280
1 Careful Consideration (TSR) 56
1 Isengard Unleashed (LTC) 495
1 The Rollercrusher Ride (DSK) 155
1 Press the Enemy (LTR) 65
1 Thousand-Year Storm (FDN) 248
1 Fateful Showdown (KLD) 114
1 Increasing Confusion (DKA) 41
1 Snapcaster Mage (ISD) 78
1 Tezzeret's Gambit (M3C) 194
1 Command Tower (FIC) 382
1 Shivan Reef (EOC) 179
1 Zephid's Embrace (USG) 114
1 Arcane Signet (FIC) 335
1 Drake Umbra (ROE) 63
1 Channeled Force (IKO) 180
1 Bond of Insight (WAR) 43
1 Consider (TDC) 148
1 Baron, Airship Kingdom (FIN) 273
1 Mystic Confluence (LTC) 193
1 Frostboil Snarl (DRC) 158
1 Ether (FIN) 53
1 Spellheart Chimera (DDS) 25
1 Protective Bubble (LRW) 80
1 Path of the Pyromancer (MOC) 34
1 Blasphemous Act (TDC) 207
2 Firemind Vessel (2X2) 306
1 Pirate's Pillage (2X2) 120
1 Rise from the Tides (INR) 82
1 Full Throttle (DFT) 127
2 Rewind (M21) 63
1 Gandalf's Sanction (LTR) 208
2 Hedron Archive (BLC) 275
1 Peter Parker's Camera (SPM) 171
1 Pinnacle Monk // Mystic Peak (MH3) 246
1 Cut Your Losses (SNC) 38
2 Mountain (FIN) 304
6 Island (FIN) 297
4 Mountain (FIN) 305
6 Island (FIN) 298
4 Mountain (FIN) 303
5 Island (FIN) 299
1 Garruk, Cursed Huntsman (BLC) 99
1 Moldervine Reclamation (BLC) 255
1 Chitterspitter (BLC) 211
1 Viridescent Bog (EOC) 190
1 Gourmand's Talent (BLC) 31
1 Moonstone Eulogist (BLC) 19
1 Wolfwillow Haven (BLC) 246
1 Beledros Witherbloom (BLC) 247
1 Ravenous Squirrel (BLC) 258
1 Llanowar Wastes (EOC) 165
1 Arasta of the Endless Web (TDC) 244
1 Command Tower (BLC) 130
1 Worthy Cost (TDM) 99
1 Swarmyard Massacre (BLC) 20
1 Rootcast Apprenticeship (BLC) 32
1 Sword of the Squeak (BLC) 40
1 Necroblossom Snarl (DSC) 290
1 Chatterfang, Squirrel General (BLC) 209
1 Chatterstorm (BLC) 210
1 Gilded Goose (LTC) 246
1 Temple of Malady (TDC) 403
1 Golgari Rot Farm (TDC) 368
1 Casualties of War (BLC) 125
1 Woe Strider (TDC) 201
1 Bojuka Bog (EOC) 149
1 Haunted Mire (TDC) 369
1 Hazel's Brewmaster (BLC) 17
1 Deadly Dispute (TDC) 177
1 Ogre Slumlord (BLC) 186
1 Nested Shambler (BLC) 185
1 Oran-Rief, the Vastwood (BLC) 320
1 Terramorphic Expanse (BLC) 345
1 Prosperous Innkeeper (BLC) 121
1 Maelstrom Pulse (BLC) 126
1 Jungle Hollow (BLC) 313
1 Skullclamp (BLC) 283
1 Plumb the Forbidden (BLC) 188
1 Saw in Half (BLC) 113
1 End-Raze Forerunners (BLC) 214
1 Putrefy (BLC) 257
1 Squirrel Sovereign (BLC) 240
1 Toski, Bearer of Secrets (BLC) 244
1 Insatiable Frugivore (BLC) 18
1 Poison-Tip Archer (BLC) 256
1 Windgrace's Judgment (EOC) 129
1 Honored Dreyleader (BLB) 178
1 Cache Grab (BLB) 167
1 Tear Asunder (EOC) 109
1 Tranquil Thicket (DSC) 318
1 Skyfisher Spider (BLC) 261
1 Shamanic Revelation (BLC) 237
1 Zulaport Cutthroat (BLC) 190
1 Nadier's Nightblade (BLC) 184
1 Chittering Witch (TDC) 175
1 Haywire Mite (DSC) 247
1 Deep Forest Hermit (BLC) 213
1 Idol of Oblivion (TDC) 319
1 Tainted Wood (DSC) 305
1 Barren Moor (DSC) 262
1 Talisman of Resilience (DSC) 255
1 Binding the Old Gods (DSC) 213
1 Tireless Provisioner (BLC) 243
1 Midgar, City of Mako // Reactor Raid (FIN) 286
1 Golgari Signet (DSC) 246
1 Morbid Opportunist (TDC) 188
1 Swarmyard (BLC) 133
1 Twilight Mire (EOC) 189
1 Arcane Signet (BLC) 127
1 Squirrel Nest (BLC) 239
1 Maskwood Nexus (DRC) 132
1 The Odd Acorn Gang (BLC) 7 *F*
1 Woodland Cemetery (TDC) 412
1 Second Harvest (BLC) 123
1 Academy Manufactor (BLC) 264
1 Sol Ring (BLC) 129
1 Scurry of Squirrels (BLC) 33
1 Decree of Pain (DSC) 136
1 Bastion of Remembrance (TDC) 171
1 Grim Backwoods (DSC) 281
1 Hazel of the Rootbloom (BLC) 2
5 Forest (BLB) 377
4 Swamp (BLB) 374
4 Forest (BLB) 378
3 Swamp (BLB) 373
1 Exotic Orchard (FIC) 390
1 Ultima (FIN) 38
1 Darkwater Catacombs (FIC) 384
1 Void Rend (FIC) 331
1 Avatar's Wrath (TLA) 12
1 Arcane Sanctum (FIC) 373
1 Vindicate (FIC) 330
1 Overkill (FIN) 109
1 Drowned Catacomb (FIC) 388
1 Authority of the Consuls (FIC) 232
1 School Daze (SPM) 42
1 Cleansing Nova (FIC) 235
1 Multiversal Passage (SPM) 180
1 Choked Estuary (FIC) 379
1 Exsanguinate (FIC) 276
1 Cornered by Black Mages (FIN) 93
1 Frantic Search (TDC) 153
1 Evolving Wilds (FIC) 389
1 Lethal Scheme (FIC) 277
1 Withering Torment (DSK) 124
1 Rite of Replication (FIC) 270
1 Underground River (FIC) 439
1 Archaeomancer's Map (FIC) 230
2 Swamp (FIC) 480 *F*
1 Vanish from Sight (DSK) 82
1 Scavenger Grounds (FIC) 419
1 Fetid Heath (FIC) 391
1 Reaper's Scythe (FIC) 48
1 Brainstorm (FCA) 28
1 Urza's Saga (MH2) 259
1 Krile Baldesion (FIC) 86
1 Swamp (FIN) 301
1 Amazing Acrobatics (SPM) 25
1 Ash Barrens (FIC) 374
1 Riverwalk Technique (TDM) 54
1 Dig Through Time (FIC) 263
1 Vote Out (EOE) 126
1 Syphon Mind (FIC) 288
1 Banishing Light (FDN) 138
1 Command Beacon (TDC) 352
1 Murderous Rider // Swift End (FIC) 279
1 Emet-Selch of the Third Seat (FIC) 81
1 Sunlit Marsh (FIC) 431
1 Dancer's Chakrams (FIC) 17
1 Skycloud Expanse (FIC) 423
1 Sol Ring (FIC) 359
1 Stuck in Summoner's Sanctum (FIN) 76
1 Static Snare (TDM) 26
1 Fandaniel, Telophoroi Ascian (FIC) 46
1 Talisman of Hierarchy (FIC) 365
1 Archmage Emeritus (FIC) 261
1 Shineshadow Snarl (FIC) 422
1 Sunken Hollow (FIC) 429
1 Idyllic Beachfront (FIC) 404
1 Glacial Fortress (FIC) 400
1 Thought Vessel (FIC) 368
1 Papalymo Totolymo (FIC) 90
1 Path of Ancestry (FIC) 411
1 Final Judgment (FIC) 243
1 Torrential Gearhulk (FIC) 272
1 Propaganda (FIC) 268
1 Transpose (FIC) 52
1 Snuff Out (FIC) 285
1 Dovin's Veto (FCA) 51
1 Archmage of Runes (FDN) 30
1 Temple of the False God (FIC) 438
1 Sunken Ruins (FIC) 430
1 Observed Stasis (FIC) 40
1 Relic of Legends (FIC) 354
1 Contaminated Aquifer (FIC) 383
1 Port Town (FIC) 412
1 Demolition Field (FIC) 385
1 Champions from Beyond (FIC) 11
1 Baleful Strix (FIC) 318
1 Desolate Mire (FIC) 386
1 Isolated Chapel (FIC) 405
1 Y'shtola, Night's Blessed (FIC) 7
1 Barret, Avalanche Leader (FIC) 472 *F*
1 Cloud, Midgar Mercenary (FIN) 564 *F*
1 Wakka, Devoted Guardian (FIC) 477 *F*
1 Elspeth, Storm Slayer (TDM) 11
1 Forest (ECL) 273
2 Boneclub Berserker (ECL) 126
1 Flitterwing Nuisance (ECL) 48
1 Thoughtweft Lieutenant (ECL) 343
1 Rime Chill (ECL) 64
1 Flock Impostor (ECL) 16
1 Reckless Ransacking (ECL) 152
1 Requiting Hex (ECL) 116
1 Bristlebane Battler (ECL) 168
1 Sting-Slinger (ECL) 161
1 Surly Farrier (ECL) 196
1 Gravelgill Scoundrel (ECL) 53
2 Omni-Changeling (ECL) 62
1 Ashling's Command (ECL) 205
1 Hovel Hurler (ECL) 230
1 Perfect Intimidation (ECL) 115
1 Chomping Changeling (ECL) 172
1 Rhys, the Evermore (ECL) 32
1 Pitiless Fists (ECL) 187
1 Bark of Doran (ECL) 6
1 Lofty Dreams (ECL) 58
1 Taster of Wares (ECL) 121
1 Tanufel Rimespeaker (ECL) 77
1 Blossoming Defense (ECL) 167
1 Appeal to Eirdu (ECL) 5
2 Dawn-Blessed Pennant (ECL) 254
1 Deepway Navigator (ECL) 214
1 Iron-Shield Elf (ECL) 108
2 Evolving Wilds (ECL) 264
2 Giantfall (ECL) 141
2 Rimekin Recluse (ECL) 66
2 Foraging Wickermaw (ECL) 256
2 Lasting Tarfire (ECL) 149
2 Elder Auntie (ECL) 133
1 Blight Rot (ECL) 89
1 Goldmeadow Nomad (ECL) 18
1 Mudbutton Cursetosser (ECL) 112
1 Silvergill Mentor (ECL) 69
1 Noggle Robber (ECL) 237
1 Gangly Stompling (ECL) 226
1 Spider-Sense (SPM) 284 *F*
1 Abigale, Eloquent First-Year (ECL) 204
1 Swamp (ECL) 271
1 Pallimud (TMP) 195
1 Steam Vents (ECL) 267
1 Champions of the Shoal (ECL) 46
1 End-Blaze Epiphany (ECL) 134
1 Dundoolin Weaver (ECL) 175
1 Boggart Cursecrafter (ECL) 206
1 Mirrormind Crown (ECL) 258
1 Celestial Reunion (ECL) 170
1 Morcant's Loyalist (ECL) 236
2 Assert Perfection (ECL) 164
1 Gutsplitter Gang (ECL) 106
1 Dream Harvest (ECL) 216
1 Eclipsed Kithkin (ECL) 220
1 Sizzling Changeling (ECL) 155
1 Chitinous Graspling (ECL) 211
1 Wanderbrine Preacher (ECL) 41
1 Summit Sentinel (ECL) 73
1 Mistmeadow Council (ECL) 183
1 Burning Curiosity (ECL) 129
1 Goliath Daydreamer (ECL) 143
1 Morcant's Loyalist (ECL) 341
1 Puca's Eye (ECL) 259
1 Clachan Festival (ECL) 10

View File

@@ -0,0 +1,74 @@
1 Nameless Inversion (ECL) 113
1 Lavaleaper (ECL) 318
1 Burdened Stoneback (ECL) 8
1 Gathering Stone (ECL) 257
1 Deepchannel Duelist (ECL) 213
1 Gangly Stompling (ECL) 226
1 Merrow Skyswimmer (ECL) 234
1 Appeal to Eirdu (ECL) 5
1 Elder Auntie (ECL) 133
1 Sygg's Command (ECL) 244
1 Pitiless Fists (ECL) 187
1 Encumbered Reejerey (ECL) 14
1 Sear (ECL) 154
1 Feisty Spikeling (ECL) 223
1 Enraged Flamecaster (ECL) 135
1 Bile-Vial Boggart (ECL) 87
1 Blossombind (ECL) 45
1 Trystan, Callous Cultivator // Trystan, Penitent Culler (ECL) 199
1 Gutsplitter Gang (ECL) 106
1 Glamer Gifter (ECL) 49
1 Keep Out (ECL) 19
1 Barbed Bloodletter (ECL) 86
1 Sun-Dappled Celebrant (ECL) 37
1 Wanderwine Distracter (ECL) 82
1 Lluwen, Imperfect Naturalist (ECL) 232
1 Deceit (ECL) 212
1 Iron-Shield Elf (ECL) 108
1 Illusion Spinners (ECL) 55
1 Kindle the Inner Flame (ECL) 147
1 Mischievous Sneakling (ECL) 235
1 Stratosoarer (ECL) 72
1 Run Away Together (ECL) 67
1 Shore Lurker (ECL) 34
2 Reckless Ransacking (ECL) 152
1 Dawnhand Eulogist (ECL) 99
1 Evershrike's Gift (ECL) 15
1 Dawnhand Dissident (ECL) 311
1 Bark of Doran (ECL) 6
1 Gnarlbark Elm (ECL) 103
1 Luminollusk (ECL) 179
1 Flaring Cinder (ECL) 225
1 Dose of Dawnglow (ECL) 100
1 Ashling, Rekindled // Ashling, Rimebound (ECL) 124
1 Morcant's Eyes (ECL) 185
1 Wanderwine Farewell (ECL) 83
1 Pyrrhic Strike (ECL) 30
1 Chaos Spewer (ECL) 210
1 Blighted Blackthorn (ECL) 90
1 Great Forest Druid (ECL) 178
2 Thoughtweft Charge (ECL) 198
2 Unexpected Assistance (ECL) 80
2 Safewright Cavalry (ECL) 191
3 Bogslither's Embrace (ECL) 94
3 Riverguard's Reflexes (ECL) 33
2 Unbury (ECL) 123
3 Midnight Tilling (ECL) 182
2 Flamekin Gildweaver (ECL) 140
2 Stalactite Dagger (ECL) 261
2 Cinder Strike (ECL) 131
2 Lys Alana Informant (ECL) 181
2 Reluctant Dounguard (ECL) 31
2 Temporal Cleansing (ECL) 78
1 Loch Mare (ECL) 57
1 Sygg, Wanderwine Wisdom // Sygg, Wanderbrine Shield (ECL) 76
1 Moonglove Extractor (ECL) 109
1 Wildvine Pummeler (ECL) 203
1 Aquitect's Defenses (ECL) 44
1 Gallant Fowlknight (ECL) 17
1 Wary Farmer (ECL) 251
1 Chitinous Graspling (ECL) 211
1 Reaping Willow (ECL) 240
1 Moon-Vigil Adherents (ECL) 184
1 Dawn-Blessed Pennant (ECL) 254
1 Unwelcome Sprite (ECL) 81

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,20 @@
[
{
"scryfall_uri": "https://scryfall.com/card/spm/29/doc-ock-sinister-scientist?utm_source=api",
"name": "Doc Ock, Sinister Scientist",
"mana_cost": "{4}{U}",
"cmc": 5.0,
"colors": [
"U"
],
"color_identity": [
"U"
],
"type_line": "Legendary Creature \u2014 Human Scientist Villain",
"oracle_text": "As long as there are eight or more cards in your graveyard, Doc Ock has base power and toughness 8/8.\nAs long as you control another Villain, Doc Ock has hexproof. (He can't be the target of spells or abilities your opponents control.)",
"power": "4",
"toughness": "5",
"loyalty": null,
"count": 1
}
]

File diff suppressed because it is too large Load Diff

15380
collection_hydrated/deck.json Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

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,40 @@
[
{
"scryfall_uri": "https://scryfall.com/card/eld/191/garruk-cursed-huntsman?utm_source=api",
"name": "Garruk, Cursed Huntsman",
"mana_cost": "{4}{B}{G}",
"cmc": 6.0,
"colors": [
"B",
"G"
],
"color_identity": [
"B",
"G"
],
"type_line": "Legendary Planeswalker \u2014 Garruk",
"oracle_text": "0: Create two 2/2 black and green Wolf creature tokens with \"When this token dies, put a loyalty counter on each Garruk you control.\"\n\u22123: Destroy target creature. Draw a card.\n\u22126: You get an emblem with \"Creatures you control get +3/+3 and have trample.\"",
"power": null,
"toughness": null,
"loyalty": "5",
"count": 1
},
{
"scryfall_uri": "https://scryfall.com/card/tdm/11/elspeth-storm-slayer?utm_source=api",
"name": "Elspeth, Storm Slayer",
"mana_cost": "{3}{W}{W}",
"cmc": 5.0,
"colors": [
"W"
],
"color_identity": [
"W"
],
"type_line": "Legendary Planeswalker \u2014 Elspeth",
"oracle_text": "If one or more tokens would be created under your control, twice that many of those tokens are created instead.\n+1: Create a 1/1 white Soldier creature token.\n0: Put a +1/+1 counter on each creature you control. Those creatures gain flying until your next turn.\n\u22123: Destroy target creature an opponent controls with mana value 3 or greater.",
"power": null,
"toughness": null,
"loyalty": "5",
"count": 1
}
]

File diff suppressed because it is too large Load Diff

877
deck_analysis.json Normal file
View File

@@ -0,0 +1,877 @@
{
"palamecia": {
"Aetherize": 1,
"Arcane Signet": 1,
"Baron, Airship Kingdom": 1,
"Big Score": 1,
"Blasphemous Act": 1,
"Bond of Insight": 1,
"Careful Consideration": 1,
"Channeled Force": 1,
"Combat Tutorial": 1,
"Command Tower": 1,
"Consider": 1,
"Counterspell": 1,
"Curator's Ward": 1,
"Curiosity": 1,
"Cut Your Losses": 1,
"Decaying Time Loop": 1,
"Drake Umbra": 1,
"Drown in Dreams": 1,
"Elixir of Immortality": 1,
"Epic Experiment": 1,
"Ether": 1,
"Everflowing Chalice": 1,
"Experimental Overload": 1,
"Fact or Fiction": 1,
"Fateful Showdown": 1,
"Fire Magic": 1,
"Firemind Vessel": 1,
"Frostboil Snarl": 1,
"Full Throttle": 1,
"Gandalf's Sanction": 1,
"Hedron Archive": 1,
"Increasing Confusion": 1,
"Isengard Unleashed": 1,
"Island": 18,
"Izzet Signet": 1,
"Mana Geyser": 1,
"Mountain": 12,
"Mystic Confluence": 1,
"Ovika, Enigma Goliath": 1,
"Path of the Pyromancer": 1,
"Peter Parker's Camera": 1,
"Pinnacle Monk // Mystic Peak": 1,
"Pirate's Pillage": 1,
"Press the Enemy": 1,
"Protective Bubble": 1,
"Reliquary Tower": 1,
"Rewind": 1,
"Ring of the Lucii": 1,
"Rise from the Tides": 1,
"Sahagin": 1,
"Seize the Storm": 1,
"Shantotto, Tactician Magician": 1,
"Shivan Reef": 1,
"Snapcaster Mage": 1,
"Snort": 1,
"Sol Ring": 1,
"Spellheart Chimera": 1,
"Sulfur Falls": 1,
"Summons of Saruman": 1,
"Swiftfoot Boots": 1,
"Talrand, Sky Summoner": 1,
"Tellah, Great Sage": 1,
"Tezzeret's Gambit": 1,
"The Emperor of Palamecia // The Lord Master of Hell": 1,
"The Rollercrusher Ride": 1,
"Thousand-Year Storm": 1,
"Traumatize": 1,
"Ultros, Obnoxious Octopus": 1,
"Ur-Golem's Eye": 1,
"Vivi Ornitier": 1,
"Whispersilk Cloak": 1,
"Zephid's Embrace": 1
},
"choco": {
"Abandoned Air Temple": 1,
"Adarkar Wastes": 1,
"Airborne Aid": 1,
"Ambrosia Whiteheart": 1,
"An Offer You Can't Refuse": 1,
"Arcane Denial": 1,
"Ascend from Avernus": 1,
"Austere Command": 1,
"Balamb Garden, SeeD Academy // Balamb Garden, Airborne": 1,
"Bartz and Boko": 1,
"Beast Within": 1,
"Beastmaster Ascension": 1,
"Birds of Paradise": 1,
"Brushland": 1,
"Canopy Vista": 1,
"Choco, Seeker of Paradise": 1,
"Chocobo Kick": 1,
"Chocobo Racetrack": 1,
"City Pigeon": 1,
"Command Tower": 1,
"Commune with Beavers": 1,
"Counterspell": 1,
"Cultivate": 1,
"Curiosity Crafter": 1,
"Demolition Field": 1,
"Dusk // Dawn": 1,
"Emeria Angel": 1,
"Emeria Shepherd": 1,
"Empyrean Eagle": 1,
"Evolving Wilds": 1,
"Exotic Orchard": 1,
"Farseek": 1,
"Felidar Retreat": 1,
"Flurry of Wings": 1,
"Forest": 3,
"Generous Gift": 1,
"Gilded Goose": 1,
"Glacial Fortress": 1,
"Gwaihir the Windlord": 1,
"Gysahl Greens": 1,
"Herald's Horn": 1,
"Hermes, Overseer of Elpis": 1,
"Hinterland Harbor": 1,
"Island": 1,
"Jackdaw Savior": 1,
"Jumbo Cactuar": 1,
"Kangee, Sky Warden": 1,
"Kangee's Lieutenant": 1,
"Kastral, the Windcrested": 1,
"Lifecreed Duo": 1,
"Meditation Pools": 1,
"Murmuration": 1,
"Nature's Lore": 1,
"Negate": 1,
"Patchwork Banner": 1,
"Path of Ancestry": 1,
"Path to Exile": 1,
"Plains": 5,
"Plumecreed Escort": 1,
"Prairie Stream": 1,
"Prishe's Wanderings": 1,
"Radiant Grove": 1,
"Rampant Growth": 1,
"Reach the Horizon": 1,
"Reliquary Tower": 1,
"Restless Anchorage": 1,
"Restoration Magic": 1,
"Ride the Shoopuf": 1,
"River Hoopoe": 1,
"Sazh Katzroy": 1,
"Sazh's Chocobo": 1,
"Seaside Citadel": 1,
"Seaside Haven": 1,
"Sevinne's Reclamation": 1,
"Sharlayan, Nation of Scholars": 1,
"Sidequest: Raise a Chocobo // Black Chocobo": 1,
"Sol Ring": 1,
"Suburban Sanctuary": 1,
"Summon: Choco/Mog": 1,
"Summon: Fat Chocobo": 1,
"Sunpetal Grove": 1,
"Swords to Plowshares": 1,
"Talisman of Progress": 1,
"Tangled Islet": 1,
"Terramorphic Expanse": 1,
"The Goose Mother": 1,
"Tranquil Landscape": 1,
"Traveling Chocobo": 1,
"Warden of Evos Isle": 1,
"Watcher of the Spheres": 1,
"Windurst, Federation Center": 1,
"Winged Portent": 1,
"Wingmate Roc": 1,
"Yavimaya Coast": 1
},
"hazel": {
"Academy Manufactor": 1,
"Arasta of the Endless Web": 1,
"Arcane Signet": 1,
"Barren Moor": 1,
"Bastion of Remembrance": 1,
"Beastmaster Ascension": 1,
"Beledros Witherbloom": 1,
"Binding the Old Gods": 1,
"Bojuka Bog": 1,
"Cache Grab": 1,
"Casualties of War": 1,
"Chatterfang, Squirrel General": 1,
"Chatterstorm": 1,
"Chittering Witch": 1,
"Chitterspitter": 1,
"Command Tower": 1,
"Deadly Dispute": 1,
"Decree of Pain": 1,
"Deep Forest Hermit": 1,
"End-Raze Forerunners": 1,
"Evolving Wilds": 1,
"Exotic Orchard": 1,
"Forest": 9,
"Garruk, Cursed Huntsman": 1,
"Gilded Goose": 1,
"Golgari Rot Farm": 1,
"Golgari Signet": 1,
"Gourmand's Talent": 1,
"Grim Backwoods": 1,
"Haunted Mire": 1,
"Haywire Mite": 1,
"Hazel of the Rootbloom": 1,
"Hazel's Brewmaster": 1,
"Honored Dreyleader": 1,
"Idol of Oblivion": 1,
"Insatiable Frugivore": 1,
"Jungle Hollow": 1,
"Llanowar Wastes": 1,
"Maelstrom Pulse": 1,
"Maskwood Nexus": 1,
"Midgar, City of Mako // Reactor Raid": 1,
"Moldervine Reclamation": 1,
"Moonstone Eulogist": 1,
"Morbid Opportunist": 1,
"Nadier's Nightblade": 1,
"Necroblossom Snarl": 1,
"Nested Shambler": 1,
"Ogre Slumlord": 1,
"Oran-Rief, the Vastwood": 1,
"Path of Ancestry": 1,
"Plumb the Forbidden": 1,
"Poison-Tip Archer": 1,
"Prosperous Innkeeper": 1,
"Putrefy": 1,
"Ravenous Squirrel": 1,
"Rootcast Apprenticeship": 1,
"Saw in Half": 1,
"Scurry of Squirrels": 1,
"Second Harvest": 1,
"Shamanic Revelation": 1,
"Skullclamp": 1,
"Skyfisher Spider": 1,
"Sol Ring": 1,
"Squirrel Nest": 1,
"Squirrel Sovereign": 1,
"Swamp": 7,
"Swarmyard": 1,
"Swarmyard Massacre": 1,
"Sword of the Squeak": 1,
"Tainted Wood": 1,
"Talisman of Resilience": 1,
"Tear Asunder": 1,
"Temple of Malady": 1,
"Terramorphic Expanse": 1,
"The Odd Acorn Gang": 1,
"Tireless Provisioner": 1,
"Toski, Bearer of Secrets": 1,
"Tranquil Thicket": 1,
"Twilight Mire": 1,
"Viridescent Bog": 1,
"Windgrace's Judgment": 1,
"Woe Strider": 1,
"Wolfwillow Haven": 1,
"Woodland Cemetery": 1,
"Worthy Cost": 1,
"Zulaport Cutthroat": 1
},
"yshtola": {
"Amazing Acrobatics": 1,
"Arcane Sanctum": 1,
"Archaeomancer's Map": 1,
"Archmage Emeritus": 1,
"Archmage of Runes": 1,
"Ash Barrens": 1,
"Authority of the Consuls": 1,
"Avatar's Wrath": 1,
"Baleful Strix": 1,
"Banishing Light": 1,
"Black Mage's Rod": 1,
"Blitzball": 1,
"Blue Mage's Cane": 1,
"Brainstorm": 1,
"Champions from Beyond": 1,
"Choked Estuary": 1,
"Circle of Power": 1,
"Cleansing Nova": 1,
"Command Beacon": 1,
"Contaminated Aquifer": 1,
"Cornered by Black Mages": 1,
"Curiosity": 1,
"Dancer's Chakrams": 1,
"Darkwater Catacombs": 1,
"Demolition Field": 1,
"Desolate Mire": 1,
"Dig Through Time": 1,
"Dovin's Veto": 1,
"Drowned Catacomb": 1,
"Emet-Selch of the Third Seat": 1,
"Evolving Wilds": 1,
"Exotic Orchard": 1,
"Exsanguinate": 1,
"Fandaniel, Telophoroi Ascian": 1,
"Fetid Heath": 1,
"Fight On!": 1,
"Final Judgment": 1,
"Firemind Vessel": 1,
"Frantic Search": 1,
"Glacial Fortress": 1,
"Hedron Archive": 1,
"Idyllic Beachfront": 1,
"Island": 2,
"Isolated Chapel": 1,
"Krile Baldesion": 1,
"Lethal Scheme": 1,
"Multiversal Passage": 1,
"Murderous Rider // Swift End": 1,
"Observed Stasis": 1,
"Overkill": 1,
"Papalymo Totolymo": 1,
"Path of Ancestry": 1,
"Plains": 3,
"Port Town": 1,
"Prairie Stream": 1,
"Propaganda": 1,
"Reaper's Scythe": 1,
"Relic of Legends": 1,
"Reliquary Tower": 1,
"Rewind": 1,
"Ring of the Lucii": 1,
"Risky Research": 1,
"Rite of Replication": 1,
"Riverwalk Technique": 1,
"Scavenger Grounds": 1,
"School Daze": 1,
"Shineshadow Snarl": 1,
"Skycloud Expanse": 1,
"Snuff Out": 1,
"Sol Ring": 1,
"Static Snare": 1,
"Stuck in Summoner's Sanctum": 1,
"Sublime Epiphany": 1,
"Sunken Hollow": 1,
"Sunken Ruins": 1,
"Sunlit Marsh": 1,
"Swamp": 2,
"Swords to Plowshares": 1,
"Syphon Mind": 1,
"Talisman of Hierarchy": 1,
"Temple of the False God": 1,
"Thought Vessel": 1,
"Torrential Gearhulk": 1,
"Transpose": 1,
"Ultima": 1,
"Underground River": 1,
"Ur-Golem's Eye": 1,
"Urza's Saga": 1,
"Vanish from Sight": 1,
"Vincent's Limit Break": 1,
"Vindicate": 1,
"Void Rend": 1,
"Vote Out": 1,
"White Auracite": 1,
"Withering Torment": 1,
"Y'shtola, Night's Blessed": 1
},
"available": [
"Magitek Infantry",
"Resentful Revelation",
"Venom's Hunger",
"Genji Glove",
"Auron's Inspiration",
"Slavering Branchsnapper",
"Retrieve the Esper",
"Red Herring",
"Firebrand Archer",
"Llanowar Elves",
"Wartime Protestors",
"Sanar, Innovative First-Year",
"Coeurl",
"Azula, Cunning Usurper",
"Glimmerburst",
"Kraven's Cats",
"Ringing Strike Mastery",
"Unexpected Request",
"Monk's Fist",
"You're Not Alone",
"Fate of the Sun-Cryst",
"Dwarven Castle Guard",
"Into the Story",
"Good-Fortune Unicorn",
"Venser, Shaper Savant",
"Il Mheg Pixie",
"Yuyan Archers",
"Summon: Primal Odin",
"Call the Mountain Chocobo",
"Long River's Pull",
"Mornsong Aria",
"Embermouth Sentinel",
"The Prima Vista",
"Cackling Prowler",
"Kithkeeper",
"Lluwen, Imperfect Naturalist",
"Cinder Strike",
"Hog-Monkey",
"Kukemssa Serpent",
"Fire Nation Engineer",
"Blossombind",
"Summon: G.F. Ifrit",
"Enduring Curiosity",
"Triple Triad",
"Hraesvelgr of the First Brood",
"Wary Farmer",
"Close Encounter",
"Firdoch Core",
"Origin of Metalbending",
"Qiqirn Merchant",
"Friendly Ghost",
"Samurai's Katana",
"Boggart Mischief",
"Apothecary Stomper",
"White Mage's Staff",
"Sleep Magic",
"Giant Growth",
"Locke Cole",
"Cloudbound Moogle",
"Brazen Scourge",
"Scour for Scrap",
"Abundant Growth",
"Paladin's Arms",
"Syncopate",
"Hecteyes",
"Private Eye",
"Vayne's Treachery",
"Judgment Bolt",
"Boggart Prankster",
"Namazu Trader",
"Plaguecrafter",
"Pumpkin Bombardment",
"Rydia's Return",
"Rhino, Barreling Brute",
"Lingering Souls",
"Haste Magic",
"Boilerbilges Ripper",
"Magic Damper",
"Unwanted Remake",
"Momo, Friendly Flier",
"Perigee Beckoner",
"Boomerang Basics",
"Summon: Fenrir",
"Cobbled Wings",
"Brigid's Command",
"Campus Guide",
"World Map",
"Virulent Emissary",
"Blazing Bomb",
"Omega, Heartless Evolution",
"The Fire Crystal",
"Weapons Vendor",
"Barret Wallace",
"Agent of Kotis",
"Cut a Deal",
"Scorpion Sentinel",
"Loporrit Scout",
"Disturbing Mirth",
"Sarkhan's Resolve",
"Tiger-Seal",
"Ice Magic",
"Shadow Urchin",
"Stoic Grove-Guide",
"Changeling Wayfinder",
"Unforgiving Aim",
"Jenova, Ancient Calamity",
"Impossible Inferno",
"Scout the City",
"Poison the Waters",
"Lightning, Security Sergeant",
"Airship Crash",
"Roiling Dragonstorm",
"Evershrike's Gift",
"Vanille, Cheerful l'Cie",
"Kyoshi Battle Fan",
"Rally the Monastery",
"Flight-Deck Coordinator",
"Moogles' Valor",
"Meanders Guide",
"Nebelgast Herald",
"Qutrub Forayer",
"Mysidian Elder",
"Heritage Reclamation",
"Hermitic Herbalist",
"House Cartographer",
"Waterbending Lesson",
"Turtle-Duck",
"Perennation",
"Reluctant Dounguard",
"Razorkin Hordecaller",
"Wraith, Vicious Vigilante",
"Ahriman",
"Accumulate Wisdom",
"Dragoon's Wyvern",
"Flamekin Gildweaver",
"Keep Out",
"Elspeth, Storm Slayer",
"G'raha Tia",
"Reanimate",
"Tweeze",
"Eirdu, Carrier of Dawn // Isilu, Carrier of Twilight",
"Festerhide Boar",
"Temporal Cleansing",
"Hypnotic Sprite // Mesmeric Glare",
"Coral Sword",
"Rebellious Captives",
"Deepchannel Duelist",
"Sabotender",
"Merrow Skyswimmer",
"Iron Giant",
"Magitek Armor",
"Dawnhand Eulogist",
"Frontline War-Rager",
"Yip Yip!",
"Gladiolus Amicitia",
"Compassionate Healer",
"Bard's Bow",
"Kulrath Mystic",
"Wakka, Devoted Guardian",
"Kinbinding",
"Summon: Primal Garuda",
"Summon: Good King Mog XII",
"Spider-Ham, Peter Porker",
"Canyon Crawler",
"Syr Konrad, the Grim",
"Wanderwine Farewell",
"Darkness Descends",
"Cryptid Inspector",
"Dragonback Lancer",
"Impolite Entrance",
"Vial Smasher the Fierce",
"Blitzball Shot",
"Aerith Rescue Mission",
"Kyoshi Warriors",
"Emet-Selch, Unsundered // Hades, Sorcerer of Eld",
"Badgermole",
"Crux of Fate",
"Dreams of Laguna",
"Merchant of Many Hats",
"Lightning Strike",
"Stratosoarer",
"Jill, Shiva's Dominant // Shiva, Warden of Ice",
"Leyline Axe",
"Eusocial Engineering",
"Alesha's Legacy",
"Terminal Velocity",
"Undercity Dire Rat",
"Scarblade's Malice",
"Campsite Cuisine",
"Murder",
"Cunning Maneuver",
"Mechanical Mobster",
"Temporal Intervention",
"Rydia, Summoner of Mist",
"Barbed Bloodletter",
"Feisty Spikeling",
"Mischievous Sneakling",
"Dragonclaw Strike",
"Ostrich-Horse",
"Valkyrie Aerial Unit",
"Minwu, White Mage",
"Urianger Augurelt",
"Eject",
"Wall Crawl",
"Glider Kids",
"Summon: G.F. Cerberus",
"Jet's Brainwashing",
"Dragoon's Lance",
"Zenos yae Galvus // Shinryu, Transcendent Rival",
"Cargo Ship",
"Great Forest Druid",
"Relentless X-ATM092",
"Supportive Parents",
"Malboro",
"Corroding Dragonstorm",
"Spiral into Solitude",
"Thunder Magic",
"Chaos Spewer",
"Sower of Chaos",
"Beetle-Headed Merchants",
"Uncharted Voyage",
"Giant Koi",
"Witness Protection",
"Lie in Wait",
"The Boulder, Ready to Rumble",
"Northern Air Temple",
"Ultima Weapon",
"Lyse Hext",
"Hildibrand Manderville // Gentleman's Rise",
"Lys Alana Dignitary",
"Eye of Nidhogg",
"Seize Opportunity",
"Lunatic Pandora",
"Timid Shieldbearer",
"From Father to Son",
"Buzzard-Wasp Colony",
"Enraged Flamecaster",
"Cloud of Darkness",
"Crossroads Watcher",
"Magic Pot",
"Choco-Comet",
"Protective Response",
"Kulrath Zealot",
"Heirloom Auntie",
"Faebloom Trick",
"Surveillance Monitor",
"Hill Gigas",
"Sami, Ship's Engineer",
"Red Mage's Rapier",
"Retched Wretch",
"Pestered Wellguard",
"Spectral Snatcher",
"Flash Thompson, Spider-Fan",
"Shinra Reinforcements",
"Brambleback Brute",
"Unburied Earthcarver",
"Dazzling Angel",
"Nightmare Sower",
"Ultimecia, Time Sorceress // Ultimecia, Omnipotent",
"Jecht, Reluctant Guardian // Braska's Final Aeon",
"Liminal Hold",
"Spider-Rex, Daring Dino",
"Cloud, Midgar Mercenary",
"Phoenix Down",
"Thancred Waters",
"Dark Knight's Greatsword",
"Gilgamesh, Master-at-Arms",
"Tidus, Blitzball Star",
"Bite Down on Crime",
"Lys Alana Informant",
"Erudite Wizard",
"Run Away Together",
"Tunnel Tipster",
"Spider-Man No More",
"Trystan's Command",
"Rinoa Heartilly",
"Veteran Survivor",
"The Final Days",
"Rosa, Resolute White Mage",
"Soul-Shackled Zombie",
"Adelbert Steiner",
"Freya Crescent",
"G'raha Tia, Scion Reborn",
"Jeong Jeong's Deserters",
"Ice Flan",
"Instant Ramen",
"Aerith Gainsborough",
"Allies at Last",
"Gallant Fowlknight",
"Serah Farron // Crystallized Serah",
"Grappling Kraken",
"Ardbert, Warrior of Darkness",
"Midnight Tilling",
"Black Waltz No. 3",
"Balthier and Fran",
"Mardu Devotee",
"Light of Judgment",
"Catharsis",
"Rocky Rebuke",
"Don't Make a Sound",
"Subway Train",
"Vinebred Brawler",
"Caught Red-Handed",
"Axgard Cavalry",
"Clachan Festival",
"Vicious Clown",
"Guru Pathik",
"Gilt-Leaf's Embrace",
"Dashing Bloodsucker",
"Gaelicat",
"Sandworm",
"Spider-Suit",
"Huntmaster of the Fells // Ravager of the Fells",
"Queen Brahne",
"Shambling Cie'th",
"Bearer of Glory",
"Sage's Nouliths",
"Southern Air Temple",
"Sun-Dappled Celebrant",
"Gristle Glutton",
"Burglar Rat",
"Balmor, Battlemage Captain",
"Watery Grasp",
"Grub's Command",
"Zuko's Exile",
"Noggle the Mind",
"Light Up the Stage",
"Coveted Jewel",
"Safewright Cavalry",
"Random Encounter",
"Archghoul of Thraben",
"Strength of Arms",
"Basilica Stalker",
"Cloud, Planet's Champion",
"Prismatic Undercurrents",
"Diamond Weapon",
"Claws Out",
"Estinien Varlineau",
"Cracked Skull",
"Zodiark, Umbral God",
"Doc Ock, Sinister Scientist",
"Gigantoad",
"The Masamune",
"Daily Bugle Reporters",
"Vincent Valentine // Galian Beast",
"Chaos Shrine's Black Crystal",
"Octopus Form",
"Beatrix, Loyal General",
"Tireless Tracker",
"Stalactite Dagger",
"Unsettling Twins",
"Fatal Fissure",
"Corrupt Court Official",
"Backslide",
"Platypus-Bear",
"Anafenza, Unyielding Lineage",
"Dai Li Agents",
"Wild Unraveling",
"Puca's Eye",
"Reno and Rude",
"Evil Reawakened",
"Wolfbat",
"Razor Rings",
"Flame-Chain Mauler",
"June, Bounty Hunter",
"Giott, King of the Dwarves",
"Suplex",
"Butcher's Cleaver",
"Abandon Attachments",
"Cactuar",
"Unexpected Assistance",
"Spider-Islanders",
"Auroral Procession",
"Due Diligence",
"Excalibur II",
"Laughing Mad",
"Fire Nation Raider",
"Enter the Avatar State",
"Combustion Man",
"Security Bypass",
"Boggart Cursecrafter",
"The Crystal's Chosen",
"Messenger Hawk",
"Firebending Lesson",
"Breaching Dragonstorm",
"It'll Quench Ya!",
"Battle Menu",
"Fear of Isolation",
"Deserter's Disciple",
"Boldwyr Aggressor",
"Sunpearl Kirin",
"Barret, Avalanche Leader",
"Ravenous Amulet",
"Glamermite",
"Master Piandao",
"Feral Deathgorger // Dusk Sight",
"Dream Seizer",
"Smuggler's Copter",
"Stalwart Successor",
"Meticulous Artisan",
"Curious Farm Animals",
"Kalonian Twingrove",
"Twinflame Travelers",
"Whoosh!",
"Venom, Evil Unleashed",
"Exdeath, Void Warlock // Neo Exdeath, Dimension's End",
"Cycle of Renewal",
"Moonglove Extractor",
"Crystal Fragments // Summon: Alexander",
"Damage Control Crew",
"Aang's Journey",
"Explosive Prodigy",
"Gran Pulse Ochu",
"Uncle Iroh",
"Mongoose Lizard",
"Sultai Devotee",
"Trystan, Callous Cultivator // Trystan, Penitent Culler",
"Tributary Vaulter",
"Phantom Train",
"Sidequest: Play Blitzball // World Champion, Celestial Weapon",
"Connecting the Dots",
"Al Bhed Salvagers",
"Warrior's Sword",
"Superior Foes of Spider-Man",
"Riverguard's Reflexes",
"Coliseum Behemoth",
"Lost Days",
"Alisaie Leveilleur",
"Walltop Sentries",
"Hinterland Logger // Timber Shredder",
"Summon: Shiva",
"Suki, Kyoshi Warrior",
"Wildwood Scourge",
"Blood Petal Celebrant",
"Tempest Hawk",
"Monastery Messenger",
"Gogo, Mysterious Mime",
"Flaring Cinder",
"Voracious Tome-Skimmer",
"Goobbue Gardener",
"Aquitect's Defenses",
"Sidequest: Catch a Fish // Cooking Campsite",
"Demon Wall",
"Quistis Trepe",
"Shore Lurker",
"Gogo, Master of Mimicry",
"Town Greeter",
"Reputable Merchant",
"Gnarlbark Elm",
"Dai Li Indoctrination",
"Fatal Push",
"Rooftop Percher",
"Ignis Scientia",
"Balamb T-Rexaur",
"Meathook Massacre II",
"Gaius van Baelsar",
"Meat Locker // Drowned Diner",
"Tiger-Dillo",
"Boulder Dash",
"Fang, Fearless l'Cie",
"Vibrance",
"Scarblade Scout",
"Item Shopkeep",
"Stolen Uniform",
"Invasion Submersible",
"Shock Brigade",
"Spider-Bot",
"Clash of the Eikons",
"Gravblade Heavy",
"Earth Kingdom Jailer",
"Rainveil Rejuvenator",
"Mai, Scornful Striker",
"The Mechanist, Aerial Artisan",
"Tersa Lightshatter",
"Zuko, Conflicted",
"Encumbered Reejerey",
"Crypt Feaster",
"Delivery Moogle",
"Slash of Light",
"Tend the Sprigs",
"Cryogen Relic",
"Wanderwine Distracter",
"Spider-Gwen, Free Spirit",
"Prideful Feastling",
"Bogslither's Embrace",
"Thinking Cap",
"Palladium Myr",
"Salt Road Packbeast",
"Clement, the Worrywort",
"Get Out",
"Arachne, Psionic Weaver",
"Abundant Maw",
"Rook Turret",
"Tome of Legends",
"Garland, Knight of Cornelia // Chaos, the Endless",
"Alphinaud Leveilleur",
"Shattered Wings",
"Taxi Driver",
"Pirate Peddlers",
"Swat Away",
"Extract a Confession",
"Relm's Sketching",
"Garnet, Princess of Alexandria",
"Killing Wave",
"Sephiroth's Intervention",
"Stinging Scorpion",
"Sidequest: Card Collection // Magicked Card",
"Kraven's Last Hunt",
"Tataru Taru",
"Boar-q-pine",
"Bile-Vial Boggart",
"Earthbending Lesson",
"Ashling, Rekindled // Ashling, Rimebound",
"Bloodline Bidding",
"Talisman of Dominance",
"Blighted Blackthorn",
"Astrologian's Planisphere"
]
}

102
decks/choco.json Normal file
View File

@@ -0,0 +1,102 @@
{
"name": "Choco",
"commander": "Choco, Seeker of Paradise",
"colors": ["U", "G", "W"],
"archetype": "Bird Tribal Landfall",
"cards": {
"Abandoned Air Temple": 1,
"Adarkar Wastes": 1,
"Airborne Aid": 1,
"Ambrosia Whiteheart": 1,
"An Offer You Can't Refuse": 1,
"Arcane Denial": 1,
"Ascend from Avernus": 1,
"Austere Command": 1,
"Balamb Garden, SeeD Academy // Balamb Garden, Airborne": 1,
"Bartz and Boko": 1,
"Beast Within": 1,
"Beastmaster Ascension": 1,
"Birds of Paradise": 1,
"Brushland": 1,
"Canopy Vista": 1,
"Choco, Seeker of Paradise": 1,
"Chocobo Kick": 1,
"Chocobo Racetrack": 1,
"City Pigeon": 1,
"Command Tower": 1,
"Commune with Beavers": 1,
"Counterspell": 1,
"Cultivate": 1,
"Curiosity Crafter": 1,
"Demolition Field": 1,
"Dusk // Dawn": 1,
"Emeria Angel": 1,
"Emeria Shepherd": 1,
"Empyrean Eagle": 1,
"Evolving Wilds": 2,
"Exotic Orchard": 1,
"Farseek": 1,
"Felidar Retreat": 1,
"Flurry of Wings": 1,
"Forest": 3,
"Generous Gift": 1,
"Gilded Goose": 1,
"Glacial Fortress": 1,
"Gwaihir the Windlord": 1,
"Gysahl Greens": 1,
"Herald's Horn": 1,
"Hermes, Overseer of Elpis": 1,
"Hinterland Harbor": 1,
"Island": 1,
"Jackdaw Savior": 1,
"Jumbo Cactuar": 1,
"Kangee, Sky Warden": 1,
"Kangee's Lieutenant": 1,
"Kastral, the Windcrested": 1,
"Lifecreed Duo": 1,
"Meditation Pools": 1,
"Murmuration": 1,
"Nature's Lore": 1,
"Negate": 1,
"Patchwork Banner": 1,
"Path of Ancestry": 1,
"Path to Exile": 1,
"Plains": 5,
"Plumecreed Escort": 1,
"Prairie Stream": 1,
"Prishe's Wanderings": 1,
"Radiant Grove": 1,
"Rampant Growth": 1,
"Reach the Horizon": 1,
"Reliquary Tower": 1,
"Restless Anchorage": 1,
"Restoration Magic": 1,
"Ride the Shoopuf": 1,
"River Hoopoe": 1,
"Sazh Katzroy": 1,
"Sazh's Chocobo": 1,
"Seaside Citadel": 1,
"Seaside Haven": 1,
"Sevinne's Reclamation": 1,
"Sharlayan, Nation of Scholars": 1,
"Sidequest: Raise a Chocobo // Black Chocobo": 1,
"Sol Ring": 1,
"Suburban Sanctuary": 1,
"Summon: Choco/Mog": 1,
"Summon: Fat Chocobo": 1,
"Sunpetal Grove": 1,
"Swords to Plowshares": 1,
"Talisman of Progress": 1,
"Tangled Islet": 1,
"Terramorphic Expanse": 1,
"The Goose Mother": 1,
"Tranquil Landscape": 1,
"Traveling Chocobo": 1,
"Warden of Evos Isle": 1,
"Watcher of the Spheres": 1,
"Windurst, Federation Center": 1,
"Winged Portent": 1,
"Wingmate Roc": 1,
"Yavimaya Coast": 1
}
}

94
decks/hazel.json Normal file
View File

@@ -0,0 +1,94 @@
{
"name": "Hazel",
"commander": "Hazel of the Rootbloom",
"colors": ["B", "G"],
"archetype": "Golgari Aristocrats",
"cards": {
"Academy Manufactor": 1,
"Arasta of the Endless Web": 1,
"Arcane Signet": 1,
"Barren Moor": 1,
"Bastion of Remembrance": 1,
"Beastmaster Ascension": 1,
"Beledros Witherbloom": 1,
"Binding the Old Gods": 1,
"Bojuka Bog": 1,
"Cache Grab": 1,
"Casualties of War": 1,
"Chatterfang, Squirrel General": 1,
"Chatterstorm": 1,
"Chittering Witch": 1,
"Chitterspitter": 1,
"Command Tower": 1,
"Deadly Dispute": 1,
"Decree of Pain": 1,
"Deep Forest Hermit": 1,
"End-Raze Forerunners": 1,
"Evolving Wilds": 1,
"Exotic Orchard": 1,
"Forest": 9,
"Garruk, Cursed Huntsman": 1,
"Gilded Goose": 1,
"Golgari Rot Farm": 1,
"Golgari Signet": 1,
"Gourmand's Talent": 1,
"Grim Backwoods": 1,
"Haunted Mire": 1,
"Haywire Mite": 1,
"Hazel of the Rootbloom": 1,
"Hazel's Brewmaster": 1,
"Honored Dreyleader": 1,
"Idol of Oblivion": 1,
"Insatiable Frugivore": 1,
"Jungle Hollow": 1,
"Llanowar Wastes": 1,
"Maelstrom Pulse": 1,
"Maskwood Nexus": 1,
"Midgar, City of Mako // Reactor Raid": 1,
"Moldervine Reclamation": 1,
"Moonstone Eulogist": 1,
"Morbid Opportunist": 1,
"Nadier's Nightblade": 1,
"Necroblossom Snarl": 1,
"Nested Shambler": 1,
"Ogre Slumlord": 1,
"Oran-Rief, the Vastwood": 1,
"Path of Ancestry": 1,
"Plumb the Forbidden": 1,
"Poison-Tip Archer": 1,
"Prosperous Innkeeper": 1,
"Putrefy": 1,
"Ravenous Squirrel": 1,
"Rootcast Apprenticeship": 1,
"Saw in Half": 1,
"Scurry of Squirrels": 1,
"Second Harvest": 1,
"Shamanic Revelation": 1,
"Skullclamp": 1,
"Skyfisher Spider": 1,
"Sol Ring": 1,
"Squirrel Nest": 1,
"Squirrel Sovereign": 1,
"Swamp": 7,
"Swarmyard": 1,
"Swarmyard Massacre": 1,
"Sword of the Squeak": 1,
"Tainted Wood": 1,
"Talisman of Resilience": 1,
"Tear Asunder": 1,
"Temple of Malady": 1,
"Terramorphic Expanse": 1,
"The Odd Acorn Gang": 1,
"Tireless Provisioner": 1,
"Toski, Bearer of Secrets": 1,
"Tranquil Thicket": 1,
"Twilight Mire": 1,
"Viridescent Bog": 1,
"Windgrace's Judgment": 1,
"Woe Strider": 1,
"Wolfwillow Haven": 1,
"Woodland Cemetery": 1,
"Worthy Cost": 1,
"Zulaport Cutthroat": 1
}
}

80
decks/palamecia.json Normal file
View File

@@ -0,0 +1,80 @@
{
"name": "Palamecia",
"commander": "The Emperor of Palamecia // The Lord Master of Hell",
"colors": ["U", "R"],
"archetype": "Izzet Self-Mill Storm",
"cards": {
"Aetherize": 1,
"Arcane Signet": 1,
"Baron, Airship Kingdom": 1,
"Big Score": 1,
"Blasphemous Act": 1,
"Bond of Insight": 1,
"Careful Consideration": 1,
"Channeled Force": 1,
"Combat Tutorial": 1,
"Command Tower": 1,
"Consider": 1,
"Counterspell": 1,
"Curator's Ward": 1,
"Curiosity": 1,
"Cut Your Losses": 1,
"Decaying Time Loop": 1,
"Drake Umbra": 1,
"Drown in Dreams": 1,
"Elixir of Immortality": 1,
"Epic Experiment": 1,
"Ether": 1,
"Everflowing Chalice": 1,
"Experimental Overload": 1,
"Fact or Fiction": 1,
"Fateful Showdown": 1,
"Fire Magic": 1,
"Firemind Vessel": 1,
"Frostboil Snarl": 1,
"Full Throttle": 1,
"Gandalf's Sanction": 1,
"Hedron Archive": 1,
"Increasing Confusion": 1,
"Isengard Unleashed": 1,
"Island": 18,
"Izzet Signet": 1,
"Mana Geyser": 1,
"Mountain": 12,
"Mystic Confluence": 1,
"Ovika, Enigma Goliath": 1,
"Path of the Pyromancer": 1,
"Peter Parker's Camera": 1,
"Pinnacle Monk // Mystic Peak": 1,
"Pirate's Pillage": 1,
"Press the Enemy": 1,
"Protective Bubble": 1,
"Reliquary Tower": 1,
"Rewind": 2,
"Ring of the Lucii": 2,
"Rise from the Tides": 1,
"Sahagin": 1,
"Seize the Storm": 1,
"Shantotto, Tactician Magician": 2,
"Shivan Reef": 1,
"Snapcaster Mage": 1,
"Snort": 1,
"Sol Ring": 1,
"Spellheart Chimera": 1,
"Sulfur Falls": 1,
"Summons of Saruman": 1,
"Swiftfoot Boots": 1,
"Talrand, Sky Summoner": 1,
"Tellah, Great Sage": 1,
"Tezzeret's Gambit": 1,
"The Emperor of Palamecia // The Lord Master of Hell": 1,
"The Rollercrusher Ride": 1,
"Thousand-Year Storm": 1,
"Traumatize": 1,
"Ultros, Obnoxious Octopus": 1,
"Ur-Golem's Eye": 2,
"Vivi Ornitier": 1,
"Whispersilk Cloak": 1,
"Zephid's Embrace": 1
}
}

104
decks/yshtola.json Normal file
View File

@@ -0,0 +1,104 @@
{
"name": "Yshtola",
"commander": "Y'shtola, Night's Blessed",
"colors": ["U", "B", "W"],
"archetype": "Esper Stax Drain",
"cards": {
"Amazing Acrobatics": 1,
"Arcane Sanctum": 1,
"Archaeomancer's Map": 1,
"Archmage Emeritus": 1,
"Archmage of Runes": 1,
"Ash Barrens": 1,
"Authority of the Consuls": 1,
"Avatar's Wrath": 1,
"Baleful Strix": 1,
"Banishing Light": 1,
"Black Mage's Rod": 1,
"Blitzball": 1,
"Blue Mage's Cane": 1,
"Brainstorm": 1,
"Champions from Beyond": 1,
"Choked Estuary": 1,
"Circle of Power": 1,
"Cleansing Nova": 1,
"Command Beacon": 1,
"Contaminated Aquifer": 1,
"Cornered by Black Mages": 1,
"Curiosity": 1,
"Dancer's Chakrams": 1,
"Darkwater Catacombs": 1,
"Demolition Field": 1,
"Desolate Mire": 1,
"Dig Through Time": 1,
"Dovin's Veto": 1,
"Drowned Catacomb": 1,
"Emet-Selch of the Third Seat": 1,
"Evolving Wilds": 1,
"Exotic Orchard": 1,
"Exsanguinate": 1,
"Fandaniel, Telophoroi Ascian": 1,
"Fetid Heath": 1,
"Fight On!": 1,
"Final Judgment": 1,
"Firemind Vessel": 1,
"Frantic Search": 1,
"Glacial Fortress": 1,
"Hedron Archive": 1,
"Idyllic Beachfront": 1,
"Island": 2,
"Isolated Chapel": 1,
"Krile Baldesion": 1,
"Lethal Scheme": 1,
"Multiversal Passage": 1,
"Murderous Rider // Swift End": 1,
"Observed Stasis": 1,
"Overkill": 1,
"Papalymo Totolymo": 1,
"Path of Ancestry": 1,
"Plains": 3,
"Port Town": 1,
"Prairie Stream": 1,
"Propaganda": 1,
"Reaper's Scythe": 1,
"Relic of Legends": 1,
"Reliquary Tower": 1,
"Rewind": 1,
"Ring of the Lucii": 1,
"Risky Research": 1,
"Rite of Replication": 1,
"Riverwalk Technique": 1,
"Scavenger Grounds": 1,
"School Daze": 1,
"Shineshadow Snarl": 1,
"Skycloud Expanse": 1,
"Snuff Out": 1,
"Sol Ring": 1,
"Static Snare": 1,
"Stuck in Summoner's Sanctum": 1,
"Sublime Epiphany": 1,
"Sunken Hollow": 1,
"Sunken Ruins": 1,
"Sunlit Marsh": 1,
"Swamp": 2,
"Swords to Plowshares": 1,
"Syphon Mind": 1,
"Talisman of Hierarchy": 1,
"Temple of the False God": 1,
"Thought Vessel": 1,
"Torrential Gearhulk": 1,
"Transpose": 1,
"Ultima": 1,
"Underground River": 1,
"Ur-Golem's Eye": 1,
"Urza's Saga": 1,
"Vanish from Sight": 1,
"Vincent's Limit Break": 1,
"Vindicate": 1,
"Void Rend": 1,
"Vote Out": 1,
"White Auracite": 1,
"Withering Torment": 1,
"Y'shtola, Night's Blessed": 1
}
}

View File

@@ -0,0 +1,435 @@
# Auto-updating Documentation Implementation Plan
> **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task.
**Goal:** Create README.md and AGENTS.md that auto-update via git pre-commit hook when files change.
**Architecture:** Template files with placeholders + Python generator script that reads deck/collection data + pre-commit hook that runs on every commit.
**Tech Stack:** Python 3 stdlib (json, pathlib, argparse)
---
### Task 1: Create Template Files
**Files:**
- Create: `docs/templates/README.template.md`
- Create: `docs/templates/AGENTS.template.md`
**Step 1: Create docs/templates directory**
```bash
mkdir -p docs/templates
```
**Step 2: Create README template**
Create `docs/templates/README.template.md`:
```markdown
# MTG EDH Deck Manager
Command-line toolkit for managing Magic: The Gathering Commander (EDH) decks using the Scryfall API.
## Installation
```bash
git clone <repo-url>
cd Decks
```
No dependencies required - pure Python 3 standard library.
## Usage
### Hydrate a Collection
Fetch card data from Scryfall for a decklist:
```bash
python hydrate.py hydrate collection/decklist.txt -o collection_hydrated/ -c card_cache.json
```
### Create a New Deck
```bash
python hydrate.py new my_deck
```
### Analyze Decks
Find upgrade options from your collection:
```bash
python scripts/analyze_decks.py --collection collection_hydrated/deck.json --deck-dir decks/
```
### Find Synergies
Search for cards by keywords, colors, and type:
```bash
# Find landfall cards in Simic colors
python scripts/find_synergies.py --collection collection_hydrated/deck.json --colors U G --keywords landfall
# Find Bird creatures in Bant colors
python scripts/find_synergies.py --collection collection_hydrated/deck.json --colors U G W --creature-type Bird
# Find instants with CMC 2 or less
python scripts/find_synergies.py --collection collection_hydrated/deck.json --type instant --cmc-max 2
```
### Generate Reports
```bash
python scripts/deck_report.py --collection collection_hydrated/deck.json --decks-dir decks/ --output report.md
```
## Decks
{{DECK_TABLE}}
## Workflow
1. **Import** - Place text decklists in `collection/`
2. **Hydrate** - Run `hydrate.py` to fetch Scryfall data → `collection_hydrated/`
3. **Define** - Create deck JSON files in `decks/`
4. **Analyze** - Run `analyze_decks.py` to find upgrade options
5. **Report** - Use `deck_report.py` for markdown summaries
## Collection Stats
{{COLLECTION_STATS}}
---
*This file is auto-generated. Edit `docs/templates/README.template.md` instead.*
```
**Step 3: Create AGENTS template**
Create `docs/templates/AGENTS.template.md`:
```markdown
# AGENTS.md
Guide for AI assistants working on this codebase.
## Build/Verify Commands
This project has no external dependencies or test framework.
```bash
# No lint/typecheck commands currently
# Verify scripts work by running them:
python hydrate.py --help
python scripts/analyze_decks.py --help
```
## Code Style
- **Language:** Python 3 (stdlib only, no external packages)
- **Formatting:** 4-space indent, max line length ~100
- **Imports:** Standard library only (argparse, json, pathlib, urllib, re, sys, os, time)
- **CLI:** Use `argparse` with subparsers for multi-command tools
- **Error handling:** Print to stderr, use sys.exit(1) for failures
- **Docstrings:** Triple-quoted at module and function level with usage examples
- **Type hints:** Optional but encouraged for complex functions
## Project Structure
```
├── hydrate.py # Main CLI - fetches card data from Scryfall
├── card_cache.json # Local cache of Scryfall card data
├── deck_analysis.json # Analysis output
├── collection/ # Raw decklist text files
├── collection_hydrated/ # Enriched card data by type
│ ├── deck.json # All cards combined
│ ├── commander.json
│ ├── creatures.json
│ ├── instants.json
│ ├── sorceries.json
│ ├── artifacts.json
│ ├── enchantments.json
│ ├── lands.json
│ └── planeswalkers.json
├── decks/ # Deck definitions (JSON)
│ └── <deck_name>.json # name, commander, colors, archetype, cards
├── scripts/
│ ├── analyze_decks.py # Find upgrade options for decks
│ ├── find_synergies.py # Search for synergistic cards
│ ├── parse_deck.py # Parse text decklists to JSON
│ └── deck_report.py # Generate markdown reports
└── docs/
└── templates/ # Documentation templates
```
## Data Formats
### Deck JSON (`decks/*.json`)
```json
{
"name": "Deck Name",
"commander": "Commander Name",
"colors": ["U", "G", "W"],
"archetype": "Theme Description",
"cards": {
"Card Name": count,
...
}
}
```
### Card Data (`collection_hydrated/*.json`)
Array of card objects with Scryfall fields:
- `name`, `mana_cost`, `cmc`, `colors`, `color_identity`
- `type_line`, `oracle_text`, `power`, `toughness`, `loyalty`
- `scryfall_uri`, `count`
## Extension Guide
### Adding a New Deck
1. Create `decks/<name>.json` with required fields
2. Run `python scripts/update_docs.py` to regenerate documentation
### Adding a New Script
1. Create `scripts/<name>.py` with argparse CLI
2. Follow existing patterns: `load_collection()`, argparse with --help
3. Update README template with usage example
4. Run `python scripts/update_docs.py`
### Modifying Deck Analysis
- `scripts/analyze_decks.py`: Core logic for finding upgrades
- Color identity matching uses `color_identity` field from Scryfall
- Cards are categorized by `type_line`
## Current Decks
{{DECK_TABLE}}
```
**Step 4: Commit templates**
```bash
git add docs/templates/
git commit -m "Add documentation templates"
```
---
### Task 2: Create update_docs.py Script
**Files:**
- Create: `scripts/update_docs.py`
**Step 1: Create the generator script**
Create `scripts/update_docs.py`:
```python
#!/usr/bin/env python3
"""
Generate README.md and AGENTS.md from templates.
Usage:
python scripts/update_docs.py
"""
import json
import os
from pathlib import Path
SCRIPT_DIR = Path(__file__).parent
PROJECT_ROOT = SCRIPT_DIR.parent
TEMPLATES_DIR = PROJECT_ROOT / "docs" / "templates"
DECKS_DIR = PROJECT_ROOT / "decks"
COLLECTION_DIR = PROJECT_ROOT / "collection_hydrated"
def load_decks() -> list[dict]:
"""Load all deck JSON files."""
decks = []
if DECKS_DIR.exists():
for path in sorted(DECKS_DIR.glob("*.json")):
with open(path, "r", encoding="utf-8") as f:
data = json.load(f)
data["filename"] = path.stem
decks.append(data)
return decks
def load_collection_stats() -> dict:
"""Get collection statistics."""
stats = {
"total_cards": 0,
"unique_cards": 0,
"by_type": {}
}
deck_file = COLLECTION_DIR / "deck.json"
if deck_file.exists():
with open(deck_file, "r", encoding="utf-8") as f:
cards = json.load(f)
stats["unique_cards"] = len(cards)
stats["total_cards"] = sum(c.get("count", 1) for c in cards)
for category in ["creatures", "instants", "sorceries", "artifacts", "enchantments", "lands", "planeswalkers"]:
cat_file = COLLECTION_DIR / f"{category}.json"
if cat_file.exists():
with open(cat_file, "r", encoding="utf-8") as f:
cards = json.load(f)
stats["by_type"][category] = len(cards)
return stats
def generate_deck_table(decks: list[dict]) -> str:
"""Generate markdown table of decks."""
if not decks:
return "*No decks defined yet.*"
lines = ["| Deck | Colors | Commander | Archetype |", "|------|--------|-----------|-----------|"]
color_map = {"W": "White", "U": "Blue", "B": "Black", "R": "Red", "G": "Green"}
for deck in decks:
name = deck.get("name", deck.get("filename", "Unknown"))
colors = deck.get("colors", [])
color_str = "".join(colors) if colors else "Colorless"
commander = deck.get("commander", "Unknown")
archetype = deck.get("archetype", "-")
lines.append(f"| {name} | {color_str} | {commander} | {archetype} |")
return "\n".join(lines)
def generate_collection_stats(stats: dict) -> str:
"""Generate collection statistics section."""
lines = [f"- **Total cards:** {stats['total_cards']}", f"- **Unique cards:** {stats['unique_cards']}"]
if stats["by_type"]:
lines.append("- **By type:**")
for category, count in sorted(stats["by_type"].items()):
lines.append(f" - {category.title()}: {count}")
return "\n".join(lines)
def generate_docs() -> None:
"""Generate README.md and AGENTS.md from templates."""
decks = load_decks()
stats = load_collection_stats()
deck_table = generate_deck_table(decks)
collection_stats = generate_collection_stats(stats)
for template_name in ["README.template.md", "AGENTS.template.md"]:
template_path = TEMPLATES_DIR / template_name
if not template_path.exists():
print(f"Template not found: {template_path}")
continue
with open(template_path, "r", encoding="utf-8") as f:
content = f.read()
content = content.replace("{{DECK_TABLE}}", deck_table)
content = content.replace("{{COLLECTION_STATS}}", collection_stats)
output_name = template_name.replace(".template", "")
output_path = PROJECT_ROOT / output_name
with open(output_path, "w", encoding="utf-8") as f:
f.write(content)
print(f"Generated: {output_path}")
if __name__ == "__main__":
generate_docs()
```
**Step 2: Test the script**
```bash
python scripts/update_docs.py
```
Expected: Creates README.md and AGENTS.md in project root
**Step 3: Verify generated files**
```bash
ls -la README.md AGENTS.md
head -20 README.md
```
**Step 4: Commit the script**
```bash
git add scripts/update_docs.py README.md AGENTS.md
git commit -m "Add update_docs.py and generate initial documentation"
```
---
### Task 3: Create Pre-commit Hook
**Files:**
- Create: `.git/hooks/pre-commit`
**Step 1: Create the hook**
```bash
cat > .git/hooks/pre-commit << 'EOF'
#!/bin/bash
# Auto-update documentation on commit
python scripts/update_docs.py
if [ -f README.md ]; then
git add README.md
fi
if [ -f AGENTS.md ]; then
git add AGENTS.md
fi
EOF
chmod +x .git/hooks/pre-commit
```
**Step 2: Test the hook**
```bash
# Make a small change to trigger the hook
echo "# test" >> hydrate.py
git add hydrate.py
git commit -m "Test pre-commit hook"
```
Expected: Hook runs, updates docs if needed, includes them in commit
**Step 3: Verify hook worked**
```bash
git log -1 --stat
```
Expected: README.md and AGENTS.md may appear in commit if changed
---
### Task 4: Cleanup and Final Commit
**Step 1: Remove test change if added**
```bash
# If you added the test line, revert it:
git checkout hydrate.py
```
**Step 2: Make a clean commit documenting the hook**
```bash
git add .git/hooks/pre-commit
git commit -m "Add pre-commit hook for auto-updating documentation"
```
---
## Success Criteria
- [ ] `README.md` exists with deck table and usage docs
- [ ] `AGENTS.md` exists with build commands and project structure
- [ ] `scripts/update_docs.py` generates both files from templates
- [ ] Pre-commit hook runs and stages updated docs
- [ ] Templates are editable without touching generated files

174
scripts/analyze_decks.py Normal file
View File

@@ -0,0 +1,174 @@
#!/usr/bin/env python3
"""
Analyze decks against a hydrated collection to find upgrade options.
Usage:
python analyze_decks.py --collection collection_hydrated/deck.json --decks deck1.json deck2.json ...
python analyze_decks.py --collection collection_hydrated/deck.json --deck-dir decks/
"""
import argparse
import json
import os
import sys
from pathlib import Path
def load_collection(path: str) -> dict:
"""Load hydrated collection JSON."""
with open(path, 'r') as f:
cards = json.load(f)
return {c['name']: c for c in cards}
def load_deck(path: str) -> dict:
"""Load deck JSON (from parse_deck.py output or deck.json format)."""
with open(path, 'r') as f:
data = json.load(f)
if 'cards' in data:
return data['cards']
return data
def get_color_identity(card: dict) -> set:
"""Get color identity as a set."""
return set(card.get('color_identity', []))
def matches_colors(card_identity: set, deck_colors: set) -> bool:
"""Check if card identity fits within deck colors."""
return card_identity <= deck_colors or not card_identity
def find_upgrades(collection: dict[str, dict], deck_cards: dict, all_deck_cards: set,
deck_colors: set, archetype: str | None = None) -> dict:
"""Find potential upgrade cards for a deck."""
available = set(collection.keys()) - all_deck_cards
upgrades = {
'creatures': [],
'instants': [],
'sorceries': [],
'artifacts': [],
'enchantments': [],
'lands': [],
'other': []
}
for name in available:
card = collection.get(name, {})
if not card:
continue
ci = get_color_identity(card)
if not matches_colors(ci, deck_colors):
continue
type_line = card.get('type_line', '').lower() if card.get('type_line') else ''
entry = {
'name': name,
'mana_cost': card.get('mana_cost', ''),
'cmc': card.get('cmc', 0),
'type_line': card.get('type_line', ''),
'oracle_text': card.get('oracle_text', ''),
'count': card.get('count', 1)
}
if 'creature' in type_line:
upgrades['creatures'].append(entry)
elif 'instant' in type_line:
upgrades['instants'].append(entry)
elif 'sorcery' in type_line:
upgrades['sorceries'].append(entry)
elif 'artifact' in type_line:
upgrades['artifacts'].append(entry)
elif 'enchantment' in type_line:
upgrades['enchantments'].append(entry)
elif 'land' in type_line:
upgrades['lands'].append(entry)
else:
upgrades['other'].append(entry)
return upgrades
def find_synergies(collection: dict, available: set, deck_colors: set,
keywords: list) -> list:
"""Find cards with specific keyword synergies."""
synergies = []
for name in available:
card = collection.get(name, {})
if not card:
continue
ci = get_color_identity(card)
if not matches_colors(ci, deck_colors):
continue
oracle = card.get('oracle_text', '').lower() if card.get('oracle_text') else ''
if any(kw.lower() in oracle for kw in keywords):
synergies.append({
'name': name,
'type_line': card.get('type_line', ''),
'mana_cost': card.get('mana_cost', ''),
'oracle_snippet': oracle[:100]
})
return synergies
def main():
parser = argparse.ArgumentParser(description='Analyze decks for upgrade options')
parser.add_argument('--collection', '-c', required=True, help='Hydrated collection JSON')
parser.add_argument('--decks', '-d', nargs='+', help='Deck JSON files')
parser.add_argument('--deck-dir', help='Directory containing deck JSON files')
parser.add_argument('--output', '-o', help='Output JSON file')
parser.add_argument('--keywords', '-k', nargs='+', help='Keywords to search for synergies')
args = parser.parse_args()
collection = load_collection(args.collection)
decks = {}
if args.decks:
for path in args.decks:
name = Path(path).stem
decks[name] = load_deck(path)
elif args.deck_dir:
for path in Path(args.deck_dir).glob('*.json'):
decks[path.stem] = load_deck(str(path))
else:
print("Error: Provide --decks or --deck-dir", file=sys.stderr)
sys.exit(1)
all_deck_cards = set()
for deck_cards in decks.values():
all_deck_cards.update(deck_cards.keys())
results = {}
for deck_name, deck_cards in decks.items():
deck_colors = set()
for name in deck_cards:
card = collection.get(name, {})
deck_colors |= get_color_identity(card)
upgrades = find_upgrades(collection, deck_cards, all_deck_cards, deck_colors)
available = set(collection.keys()) - all_deck_cards
synergies = {}
if args.keywords:
synergies = find_synergies(collection, available, deck_colors, args.keywords)
results[deck_name] = {
'total_cards': sum(deck_cards.values()),
'unique_cards': len(deck_cards),
'color_identity': list(deck_colors),
'available_upgrades': {k: len(v) for k, v in upgrades.items()},
'upgrades': upgrades,
'synergies': synergies
}
output = json.dumps(results, indent=2)
if args.output:
with open(args.output, 'w') as f:
f.write(output)
else:
print(output)
if __name__ == '__main__':
main()

72
scripts/deck_report.py Normal file
View File

@@ -0,0 +1,72 @@
#!/usr/bin/env python3
"""
Generate a deck upgrade report comparing collection to existing decks.
Usage:
python deck_report.py --collection collection_hydrated/deck.json --decks-dir decks/ --output report.md
"""
import argparse
import json
from pathlib import Path
def load_collection(path: str) -> dict:
with open(path, 'r') as f:
cards = json.load(f)
return {c['name']: c for c in cards}
def load_deck(path: str) -> dict:
with open(path, 'r') as f:
data = json.load(f)
if 'cards' in data:
return data
return {'cards': data, 'name': Path(path).stem}
def main():
parser = argparse.ArgumentParser(description='Generate deck upgrade report')
parser.add_argument('--collection', '-c', required=True)
parser.add_argument('--decks-dir', '-d', required=True)
parser.add_argument('--output', '-o', required=True)
args = parser.parse_args()
collection = load_collection(args.collection)
decks = []
for path in Path(args.decks_dir).glob('*.json'):
decks.append(load_deck(str(path)))
# Find all cards in decks
all_deck_cards = set()
for deck in decks:
all_deck_cards.update(deck['cards'].keys())
available = set(collection.keys()) - all_deck_cards
report = []
report.append("# Deck Upgrade Report\n")
report.append(f"Collection size: {len(collection)} cards")
report.append(f"Cards in decks: {len(all_deck_cards)}")
report.append(f"Available for upgrades: {len(available)}\n")
for deck in decks:
deck_name = deck.get('name', 'Unknown')
deck_cards = deck['cards']
deck_colors = set()
for name in deck_cards:
card = collection.get(name, {})
ci = card.get('color_identity', [])
deck_colors.update(ci)
report.append(f"\n---\n## {deck_name}\n")
report.append(f"**Colors:** {''.join(sorted(deck_colors))}")
report.append(f"**Total cards:** {sum(deck_cards.values())}")
report.append(f"**Unique cards:** {len(deck_cards)}\n")
with open(args.output, 'w') as f:
f.write('\n'.join(report))
print(f"Report saved to {args.output}")
if __name__ == '__main__':
main()

119
scripts/find_synergies.py Normal file
View File

@@ -0,0 +1,119 @@
#!/usr/bin/env python3
"""
Find cards with specific synergies from a hydrated collection.
Usage:
python find_synergies.py --collection collection_hydrated/deck.json --colors U R --keywords "landfall" "enter the battlefield"
python find_synergies.py --collection collection_hydrated/deck.json --colors U R --creature-type Bird
python find_synergies.py --collection collection_hydrated/deck.json --colors U R --cmc-min 4 --type instant
"""
import argparse
import json
import re
import sys
from typing import Optional
def load_collection(path: str) -> dict:
"""Load hydrated collection JSON."""
with open(path, 'r') as f:
cards = json.load(f)
return {c['name']: c for c in cards}
def matches_colors(card_identity: set, allowed_colors: set) -> bool:
"""Check if card identity fits within allowed colors."""
if not card_identity:
return True
return card_identity <= allowed_colors
def extract_creature_types(type_line: str) -> list:
"""Extract creature types from type line."""
if not type_line:
return []
parts = type_line.split('')
if len(parts) < 2:
return []
types_part = parts[1].strip()
return [t.strip().lower() for t in types_part.split()]
def main():
parser = argparse.ArgumentParser(description='Find synergistic cards in collection')
parser.add_argument('--collection', '-c', required=True, help='Hydrated collection JSON')
parser.add_argument('--colors', nargs='+', default=[], help='Allowed colors (e.g., U R for Izzet)')
parser.add_argument('--exclude', nargs='+', default=[], help='Cards to exclude (already in deck)')
parser.add_argument('--keywords', '-k', nargs='+', help='Keywords to search in oracle text')
parser.add_argument('--creature-type', '-t', help='Creature type to search for')
parser.add_argument('--type', help='Card type to filter (creature, instant, sorcery, etc.)')
parser.add_argument('--cmc-min', type=int, help='Minimum CMC')
parser.add_argument('--cmc-max', type=int, help='Maximum CMC')
parser.add_argument('--output', '-o', help='Output JSON file')
parser.add_argument('--format', choices=['json', 'text'], default='text', help='Output format')
args = parser.parse_args()
collection = load_collection(args.collection)
allowed_colors = set(c.upper() for c in args.colors)
exclude = set(args.exclude)
matches = []
for name, card in collection.items():
if name in exclude:
continue
ci = set(card.get('color_identity', []))
if not matches_colors(ci, allowed_colors):
continue
type_line = card.get('type_line', '').lower() if card.get('type_line') else ''
if args.type and args.type.lower() not in type_line:
continue
cmc = card.get('cmc', 0) or 0
if args.cmc_min is not None and cmc < args.cmc_min:
continue
if args.cmc_max is not None and cmc > args.cmc_max:
continue
if args.creature_type:
creature_types = extract_creature_types(type_line)
if args.creature_type.lower() not in creature_types:
continue
oracle = card.get('oracle_text', '').lower() if card.get('oracle_text') else ''
if args.keywords:
if not any(kw.lower() in oracle for kw in args.keywords):
continue
matches.append({
'name': name,
'mana_cost': card.get('mana_cost', ''),
'cmc': cmc,
'type_line': card.get('type_line', ''),
'colors': card.get('colors', []),
'color_identity': list(ci),
'oracle_text': card.get('oracle_text', ''),
'count': card.get('count', 1)
})
matches.sort(key=lambda x: (x['cmc'], x['name']))
if args.format == 'json':
output = json.dumps(matches, indent=2)
if args.output:
with open(args.output, 'w') as f:
f.write(output)
else:
print(output)
else:
for card in matches:
print(f"{card['mana_cost']} {card['name']} ({int(card['cmc'])}cmc) x{card['count']}")
if card['oracle_text']:
print(f" {card['oracle_text'][:100]}...")
if __name__ == '__main__':
main()

62
scripts/parse_deck.py Normal file
View File

@@ -0,0 +1,62 @@
#!/usr/bin/env python3
"""
Parse deck list text files or pasted deck lists.
Usage:
python parse_deck.py <deck_file.txt>
python parse_deck.py --stdin < decklist.txt
"""
import argparse
import json
import re
import sys
def parse_deck_text(text: str) -> dict[str, int]:
"""Parse deck list text into {card_name: count} dict."""
cards = {}
for line in text.strip().split('\n'):
line = line.strip()
if not line or line.startswith('#'):
continue
match = re.match(r'^(\d+)x?\s+(.+)$', line, re.IGNORECASE)
if match:
count = int(match.group(1))
name = match.group(2).strip()
cards[name] = count
return cards
def main():
parser = argparse.ArgumentParser(description='Parse deck list into JSON')
parser.add_argument('input', nargs='?', help='Deck list file')
parser.add_argument('--stdin', action='store_true', help='Read from stdin')
parser.add_argument('-o', '--output', help='Output JSON file')
args = parser.parse_args()
if args.stdin:
text = sys.stdin.read()
elif args.input:
with open(args.input, 'r') as f:
text = f.read()
else:
parser.print_help()
sys.exit(1)
cards = parse_deck_text(text)
result = {
'total_cards': sum(cards.values()),
'unique_cards': len(cards),
'cards': cards
}
output = json.dumps(result, indent=2)
if args.output:
with open(args.output, 'w') as f:
f.write(output)
else:
print(output)
if __name__ == '__main__':
main()