├── major_version ├── requirements.txt ├── source └── mtga │ ├── models │ ├── __init__.py │ ├── card.py │ └── card_set.py │ ├── _version.py │ ├── __init__.py │ └── set_data │ ├── mi.py │ ├── akh.py │ ├── roe.py │ ├── rtr.py │ ├── bfz.py │ ├── weird.py │ ├── __init__.py │ ├── w17.py │ ├── arenasup.py │ ├── dynamic.py │ ├── ana.py │ ├── aer.py │ ├── hou.py │ ├── kld.py │ └── eld.py ├── MANIFEST.in ├── README.md ├── LICENSE ├── .gitignore ├── setup.py └── script └── generate_set_map.py /major_version: -------------------------------------------------------------------------------- 1 | 0.1 -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /source/mtga/models/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /source/mtga/_version.py: -------------------------------------------------------------------------------- 1 | __version__ = "0.9.5" -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | include *.txt 2 | include LICENSE 3 | include major_version 4 | recursive-include *.py -------------------------------------------------------------------------------- /source/mtga/__init__.py: -------------------------------------------------------------------------------- 1 | from .models import card, card_set 2 | from .models.card_set import Pool 3 | from .set_data import xln, dom, rix, m19, grn, rna, war, m20, eld, akh, arenasup, bfz, mi, roe, rtr, all_mtga_cards 4 | from ._version import __version__ 5 | version = _version = __version = __version__ 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Python MTGA 2 | MTGA tools & set data for python. Original cardset generated with MTGJSON and scryfall, 3 | with initial set of MTGA grpId's collected by Fugi & Spencatro. 4 | (Now we just use the data already present in your MTGA installation.) 5 | ## Installation 6 | `pip install mtga` 7 | or 8 | `python setup.py install` 9 | ## Usage 10 | ```python 11 | from mtga.set_data import all_mtga_cards 12 | print(all_mtga_cards.find_one("Mangara")) 13 | # 14 | print(all_mtga_cards.find_one(71809)) 15 | # 16 | print(all_mtga_cards.find_one("71809")) 17 | # 18 | ``` 19 | ## Deploying 20 | Because I always forget: 21 | ```bash 22 | python setup.py sdist bdist_wheel 23 | twine check dist/* # check for readme issues (e.g. line endings MUST BE LF, not CRLF lol) 24 | twine upload dist/MTGA-* 25 | ``` -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 MTGATracker 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /source/mtga/set_data/mi.py: -------------------------------------------------------------------------------- 1 | 2 | import sys 3 | from mtga.models.card import Card 4 | from mtga.models.card_set import Set 5 | import inspect 6 | 7 | 8 | Forest = Card(name="forest", pretty_name="Forest", cost=[], 9 | color_identity=['G'], card_type="Land", sub_types="Forest", 10 | abilities=[], set_id="MI", rarity="Basic", collectible=True, set_number=0, 11 | mtga_id=6993) 12 | Island = Card(name="island", pretty_name="Island", cost=[], 13 | color_identity=['U'], card_type="Land", sub_types="Island", 14 | abilities=[], set_id="MI", rarity="Basic", collectible=True, set_number=0, 15 | mtga_id=7065) 16 | Mountain = Card(name="mountain", pretty_name="Mountain", cost=[], 17 | color_identity=['R'], card_type="Land", sub_types="Mountain", 18 | abilities=[], set_id="MI", rarity="Basic", collectible=True, set_number=0, 19 | mtga_id=7153) 20 | Plains = Card(name="plains", pretty_name="Plains", cost=[], 21 | color_identity=['W'], card_type="Land", sub_types="Plains", 22 | abilities=[], set_id="MI", rarity="Basic", collectible=True, set_number=0, 23 | mtga_id=7193) 24 | Swamp = Card(name="swamp", pretty_name="Swamp", cost=[], 25 | color_identity=['B'], card_type="Land", sub_types="Swamp", 26 | abilities=[], set_id="MI", rarity="Basic", collectible=True, set_number=0, 27 | mtga_id=7347) 28 | 29 | 30 | clsmembers = [card for name, card in inspect.getmembers(sys.modules[__name__]) if isinstance(card, Card)] 31 | Mirage = Set("mi", cards=clsmembers) 32 | 33 | set_ability_map = {} 34 | -------------------------------------------------------------------------------- /source/mtga/set_data/akh.py: -------------------------------------------------------------------------------- 1 | 2 | import sys 3 | from mtga.models.card import Card 4 | from mtga.models.card_set import Set 5 | import inspect 6 | 7 | 8 | Plains = Card(name="plains", pretty_name="Plains", cost=[], 9 | color_identity=['W'], card_type="Land", sub_types="Plains", 10 | abilities=[], set_id="AKH", rarity="Basic", collectible=True, set_number=256, 11 | mtga_id=65363) 12 | Island = Card(name="island", pretty_name="Island", cost=[], 13 | color_identity=['U'], card_type="Land", sub_types="Island", 14 | abilities=[], set_id="AKH", rarity="Basic", collectible=True, set_number=258, 15 | mtga_id=65369) 16 | Swamp = Card(name="swamp", pretty_name="Swamp", cost=[], 17 | color_identity=['B'], card_type="Land", sub_types="Swamp", 18 | abilities=[], set_id="AKH", rarity="Basic", collectible=True, set_number=262, 19 | mtga_id=65379) 20 | Mountain = Card(name="mountain", pretty_name="Mountain", cost=[], 21 | color_identity=['R'], card_type="Land", sub_types="Mountain", 22 | abilities=[], set_id="AKH", rarity="Basic", collectible=True, set_number=264, 23 | mtga_id=65385) 24 | Forest = Card(name="forest", pretty_name="Forest", cost=[], 25 | color_identity=['G'], card_type="Land", sub_types="Forest", 26 | abilities=[], set_id="AKH", rarity="Basic", collectible=True, set_number=267, 27 | mtga_id=65393) 28 | 29 | 30 | clsmembers = [card for name, card in inspect.getmembers(sys.modules[__name__]) if isinstance(card, Card)] 31 | Amonkhet = Set("akh", cards=clsmembers) 32 | 33 | set_ability_map = {} 34 | -------------------------------------------------------------------------------- /source/mtga/set_data/roe.py: -------------------------------------------------------------------------------- 1 | 2 | import sys 3 | from mtga.models.card import Card 4 | from mtga.models.card_set import Set 5 | import inspect 6 | 7 | 8 | Plains = Card(name="plains", pretty_name="Plains", cost=[], 9 | color_identity=['W'], card_type="Land", sub_types="Plains", 10 | abilities=[], set_id="ROE", rarity="Basic", collectible=True, set_number=229, 11 | mtga_id=36786) 12 | Mountain = Card(name="mountain", pretty_name="Mountain", cost=[], 13 | color_identity=['R'], card_type="Land", sub_types="Mountain", 14 | abilities=[], set_id="ROE", rarity="Basic", collectible=True, set_number=242, 15 | mtga_id=36788) 16 | Forest = Card(name="forest", pretty_name="Forest", cost=[], 17 | color_identity=['G'], card_type="Land", sub_types="Forest", 18 | abilities=[], set_id="ROE", rarity="Basic", collectible=True, set_number=245, 19 | mtga_id=36802) 20 | Swamp = Card(name="swamp", pretty_name="Swamp", cost=[], 21 | color_identity=['B'], card_type="Land", sub_types="Swamp", 22 | abilities=[], set_id="ROE", rarity="Basic", collectible=True, set_number=237, 23 | mtga_id=36812) 24 | Island = Card(name="island", pretty_name="Island", cost=[], 25 | color_identity=['U'], card_type="Land", sub_types="Island", 26 | abilities=[], set_id="ROE", rarity="Basic", collectible=True, set_number=235, 27 | mtga_id=36818) 28 | 29 | 30 | clsmembers = [card for name, card in inspect.getmembers(sys.modules[__name__]) if isinstance(card, Card)] 31 | RiseOfEldrazi = Set("roe", cards=clsmembers) 32 | 33 | set_ability_map = {} 34 | -------------------------------------------------------------------------------- /source/mtga/set_data/rtr.py: -------------------------------------------------------------------------------- 1 | 2 | import sys 3 | from mtga.models.card import Card 4 | from mtga.models.card_set import Set 5 | import inspect 6 | 7 | 8 | Plains = Card(name="plains", pretty_name="Plains", cost=[], 9 | color_identity=['W'], card_type="Land", sub_types="Plains", 10 | abilities=[], set_id="RTR", rarity="Basic", collectible=True, set_number=250, 11 | mtga_id=51789) 12 | Island = Card(name="island", pretty_name="Island", cost=[], 13 | color_identity=['U'], card_type="Land", sub_types="Island", 14 | abilities=[], set_id="RTR", rarity="Basic", collectible=True, set_number=255, 15 | mtga_id=51799) 16 | Swamp = Card(name="swamp", pretty_name="Swamp", cost=[], 17 | color_identity=['B'], card_type="Land", sub_types="Swamp", 18 | abilities=[], set_id="RTR", rarity="Basic", collectible=True, set_number=260, 19 | mtga_id=51809) 20 | Mountain = Card(name="mountain", pretty_name="Mountain", cost=[], 21 | color_identity=['R'], card_type="Land", sub_types="Mountain", 22 | abilities=[], set_id="RTR", rarity="Basic", collectible=True, set_number=265, 23 | mtga_id=51819) 24 | Forest = Card(name="forest", pretty_name="Forest", cost=[], 25 | color_identity=['G'], card_type="Land", sub_types="Forest", 26 | abilities=[], set_id="RTR", rarity="Basic", collectible=True, set_number=270, 27 | mtga_id=51829) 28 | 29 | 30 | clsmembers = [card for name, card in inspect.getmembers(sys.modules[__name__]) if isinstance(card, Card)] 31 | ReturnToRavnica = Set("rtr", cards=clsmembers) 32 | 33 | set_ability_map = {} 34 | -------------------------------------------------------------------------------- /source/mtga/set_data/bfz.py: -------------------------------------------------------------------------------- 1 | 2 | import sys 3 | from mtga.models.card import Card 4 | from mtga.models.card_set import Set 5 | import inspect 6 | 7 | 8 | Plains = Card(name="plains", pretty_name="Plains", cost=[], 9 | color_identity=['W'], card_type="Land", sub_types="Plains", 10 | abilities=[], set_id="BFZ", rarity="Basic", collectible=True, set_number=250, 11 | mtga_id=62115) 12 | Island = Card(name="island", pretty_name="Island", cost=[], 13 | color_identity=['U'], card_type="Land", sub_types="Island", 14 | abilities=[], set_id="BFZ", rarity="Basic", collectible=True, set_number=255, 15 | mtga_id=62125) 16 | Swamp = Card(name="swamp", pretty_name="Swamp", cost=[], 17 | color_identity=['B'], card_type="Land", sub_types="Swamp", 18 | abilities=[], set_id="BFZ", rarity="Basic", collectible=True, set_number=260, 19 | mtga_id=62135) 20 | Mountain = Card(name="mountain", pretty_name="Mountain", cost=[], 21 | color_identity=['R'], card_type="Land", sub_types="Mountain", 22 | abilities=[], set_id="BFZ", rarity="Basic", collectible=True, set_number=265, 23 | mtga_id=62145) 24 | Forest = Card(name="forest", pretty_name="Forest", cost=[], 25 | color_identity=['G'], card_type="Land", sub_types="Forest", 26 | abilities=[], set_id="BFZ", rarity="Basic", collectible=True, set_number=270, 27 | mtga_id=62155) 28 | 29 | 30 | clsmembers = [card for name, card in inspect.getmembers(sys.modules[__name__]) if isinstance(card, Card)] 31 | BattleForZendikar = Set("bfz", cards=clsmembers) 32 | 33 | set_ability_map = {} 34 | -------------------------------------------------------------------------------- /source/mtga/set_data/weird.py: -------------------------------------------------------------------------------- 1 | """ WARNING! These cards are no longer in MTGA! This file is likely incorrect, and is left only for reference. 2 | 3 | """ 4 | from mtga.models.card import Card 5 | from mtga.models.card_set import Set 6 | 7 | CinderBarrens = Card("cinder_barrens", "Cinder Barrens", [], ["B", "R"], "Land", "", "OGW", "Common", -1, 62499) 8 | TranquilExpanse = Card("tranquil_expanse", "Tranquil Expanse", [], ["G", "W"], "Land", "", "OGW", "Common", -1, 62523) 9 | MeanderingRiver = Card("meandering_river", "Meandering River", [], ["U", "W"], "Land", "", "OGW", "Common", -1, 62509) 10 | SubmergedBoneyard = Card("submerged_boneyard", "Submerged Boneyard", [], ["B", "U"], "Land", "", "OGW", "Common", -1, 62519) 11 | TimberGorge = Card("timber_gorge", "Timber Gorge", [], ["G", "R"], "Land", "", "OGW", "Common", -1, 62521) 12 | 13 | # TODO: why are these offset more than the others? 14 | 15 | FullArtPlainsAKH = Card("plains", "Plains", [], ['W'], "Basic Land", "Plains", "AKH", "Common", 251, 65433) 16 | FullArtIslandAKH = Card("island", "Island", [], ['U'], "Basic Land", "Island", "AKH", "Common", 250, 65435) 17 | FullArtSwampAKH = Card("swamp", "Swamp", [], ['B'], "Basic Land", "Swamp", "AKH", "Common", 252, 65437) 18 | FullArtMountainAKH = Card("mountain", "Mountain", [], ['R'], "Basic Land", "Mountain", "Common", "AKH", 253, 65439) 19 | FullArtForestAKH = Card("forest", "Forest", [], ['G'], "Basic Land", "Forest", "AKH", "Common", 254, 65441) 20 | 21 | 22 | WeirdLands = Set("weird_lands", cards=[CinderBarrens, TranquilExpanse, MeanderingRiver, TimberGorge, SubmergedBoneyard, 23 | FullArtPlainsAKH, FullArtIslandAKH, FullArtSwampAKH, FullArtMountainAKH, FullArtForestAKH]) 24 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | *.egg-info/ 24 | .installed.cfg 25 | *.egg 26 | MANIFEST 27 | 28 | # PyInstaller 29 | # Usually these files are written by a python script from a template 30 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 31 | *.manifest 32 | *.spec 33 | 34 | # Installer logs 35 | pip-log.txt 36 | pip-delete-this-directory.txt 37 | 38 | # Unit test / coverage reports 39 | htmlcov/ 40 | .tox/ 41 | .coverage 42 | .coverage.* 43 | .cache 44 | nosetests.xml 45 | coverage.xml 46 | *.cover 47 | .hypothesis/ 48 | .pytest_cache/ 49 | 50 | # Translations 51 | *.mo 52 | *.pot 53 | 54 | # Django stuff: 55 | *.log 56 | local_settings.py 57 | db.sqlite3 58 | 59 | # Flask stuff: 60 | instance/ 61 | .webassets-cache 62 | 63 | # Scrapy stuff: 64 | .scrapy 65 | 66 | # Sphinx documentation 67 | docs/_build/ 68 | 69 | # PyBuilder 70 | target/ 71 | 72 | # Jupyter Notebook 73 | .ipynb_checkpoints 74 | 75 | # pyenv 76 | .python-version 77 | 78 | # celery beat schedule file 79 | celerybeat-schedule 80 | 81 | # SageMath parsed files 82 | *.sage.py 83 | 84 | # Environments 85 | .env 86 | .venv 87 | env/ 88 | venv/ 89 | ENV/ 90 | env.bak/ 91 | venv.bak/ 92 | 93 | # Spyder project settings 94 | .spyderproject 95 | .spyproject 96 | 97 | # Rope project settings 98 | .ropeproject 99 | 100 | # mkdocs documentation 101 | /site 102 | 103 | # mypy 104 | .mypy_cache/ 105 | 106 | .idea/ -------------------------------------------------------------------------------- /source/mtga/set_data/__init__.py: -------------------------------------------------------------------------------- 1 | from mtga.models.card_set import Pool 2 | try: 3 | from mtga.set_data import dynamic 4 | dynamic_sets = [] 5 | all_mtga_abilities = {} 6 | 7 | for cardset, ability_map in dynamic.dynamic_set_tuples: 8 | for ability_key in ability_map.keys(): 9 | all_mtga_abilities[ability_key] = ability_map[ability_key] 10 | dynamic_sets.append(cardset) 11 | 12 | all_mtga_cards = Pool.from_sets("mtga_cards", 13 | sets=[*dynamic_sets], 14 | abilities=all_mtga_abilities) 15 | except: 16 | print("WARNING! Could not dynamically generate card sets. Do you have Arena installed?") 17 | from mtga.set_data import xln, dom, rix, m19, ana, grn, rna, war, m20, eld, akh, arenasup, bfz, mi, roe, rtr 18 | 19 | all_mtga_abilities = {**rix.set_ability_map, **xln.set_ability_map, **dom.set_ability_map, **m19.set_ability_map, 20 | **ana.set_ability_map, **grn.set_ability_map, **rna.set_ability_map, **war.set_ability_map, 21 | **m20.set_ability_map, **eld.set_ability_map, **akh.set_ability_map, **arenasup.set_ability_map, 22 | **bfz.set_ability_map, **mi.set_ability_map, **roe.set_ability_map, **rtr.set_ability_map} 23 | 24 | 25 | 26 | all_mtga_cards = Pool.from_sets("mtga_cards", 27 | sets=[rix.RivalsOfIxalan, xln.Ixalan, dom.Dominaria, m19.CoreSet2019, 28 | ana.ArenaExclusives, grn.GuildsOfRavnica, rna.RavnicaAllegiance, 29 | war.WarOfTheSpark, m20.CoreSet2020, eld.ThroneOfEldraine, akh.Amonkhet, 30 | arenasup.ArenaSup, bfz.BattleForZendikar, mi.Mirage, roe.RiseOfEldrazi, 31 | rtr.ReturnToRavnica], 32 | abilities=all_mtga_abilities) 33 | 34 | -------------------------------------------------------------------------------- /source/mtga/set_data/w17.py: -------------------------------------------------------------------------------- 1 | """ WARNING! These cards are no longer in MTGA! This file is likely incorrect, and is left only for reference. 2 | 3 | """ 4 | import sys 5 | from mtga.models.card import Card 6 | from mtga.models.card_set import Set 7 | import inspect 8 | 9 | 10 | DivineVerdict = Card("divine_verdict", "Divine Verdict", ['3', 'W'], ['W'], "Instant", "", "W17", "Common", 1, 68414) 11 | GlorySeeker = Card("glory_seeker", "Glory Seeker", ['1', 'W'], ['W'], "Creature", "Human Soldier", "W17", "Common", 2, 68415) 12 | SerraAngel = Card("serra_angel", "Serra Angel", ['3', 'W', 'W'], ['W'], "Creature", "Angel", "W17", "Uncommon", 3, 68416) 13 | StandingTroops = Card("standing_troops", "Standing Troops", ['2', 'W'], ['W'], "Creature", "Human Soldier", "W17", "Common", 4, 68417) 14 | StormfrontPegasus = Card("stormfront_pegasus", "Stormfront Pegasus", ['1', 'W'], ['W'], "Creature", "Pegasus", "W17", "Uncommon", 5, 68418) 15 | VictorysHerald = Card("victorys_herald", "Victory's Herald", ['3', 'W', 'W', 'W'], ['W'], "Creature", "Angel", "W17", "Rare", 6, 68419) 16 | AirElemental = Card("air_elemental", "Air Elemental", ['3', 'U', 'U'], ['U'], "Creature", "Elemental", "W17", "Uncommon", 7, 68420) 17 | CoralMerfolk = Card("coral_merfolk", "Coral Merfolk", ['1', 'U'], ['U'], "Creature", "Merfolk", "W17", "Common", 8, 68421) 18 | DragUnder = Card("drag_under", "Drag Under", ['2', 'U'], ['U'], "Sorcery", "", "W17", "Common", 9, 68422) 19 | Inspiration = Card("inspiration", "Inspiration", ['3', 'U'], ['U'], "Instant", "", "W17", "Common", 10, 68423) 20 | SleepParalysis = Card("sleep_paralysis", "Sleep Paralysis", ['3', 'U'], ['U'], "Enchantment", "Aura", "W17", "Common", 11, 68424) 21 | SphinxofMagosi = Card("sphinx_of_magosi", "Sphinx of Magosi", ['3', 'U', 'U', 'U'], ['U'], "Creature", "Sphinx", "W17", "Rare", 12, 68425) 22 | StealerofSecrets = Card("stealer_of_secrets", "Stealer of Secrets", ['2', 'U'], ['U'], "Creature", "Human Rogue", "W17", "Common", 13, 68426) 23 | TricksoftheTrade = Card("tricks_of_the_trade", "Tricks of the Trade", ['3', 'U'], ['U'], "Enchantment", "Aura", "W17", "Common", 14, 68427) 24 | BloodhunterBat = Card("bloodhunter_bat", "Bloodhunter Bat", ['3', 'B'], ['B'], "Creature", "Bat", "W17", "Common", 15, 68428) 25 | CertainDeath = Card("certain_death", "Certain Death", ['5', 'B'], ['B'], "Sorcery", "", "W17", "Common", 16, 68429) 26 | Nightmare = Card("nightmare", "Nightmare", ['5', 'B'], ['B'], "Creature", "Nightmare Horse", "W17", "Rare", 17, 68430) 27 | RaiseDead = Card("raise_dead", "Raise Dead", ['B'], ['B'], "Sorcery", "", "W17", "Common", 18, 68431) 28 | SengirVampire = Card("sengir_vampire", "Sengir Vampire", ['3', 'B', 'B'], ['B'], "Creature", "Vampire", "W17", "Uncommon", 19, 68432) 29 | UntamedHunger = Card("untamed_hunger", "Untamed Hunger", ['2', 'B'], ['B'], "Enchantment", "Aura", "W17", "Common", 20, 68433) 30 | FalkenrathReaver = Card("falkenrath_reaver", "Falkenrath Reaver", ['1', 'R'], ['R'], "Creature", "Vampire", "W17", "Common", 21, 68434) 31 | ShivanDragon = Card("shivan_dragon", "Shivan Dragon", ['4', 'R', 'R'], ['R'], "Creature", "Dragon", "W17", "Rare", 22, 68435) 32 | ThunderingGiant = Card("thundering_giant", "Thundering Giant", ['3', 'R', 'R'], ['R'], "Creature", "Giant", "W17", "Common", 23, 68436) 33 | GarruksHorde = Card("garruks_horde", "Garruk's Horde", ['5', 'G', 'G'], ['G'], "Creature", "Beast", "W17", "Rare", 24, 68437) 34 | Oakenform = Card("oakenform", "Oakenform", ['2', 'G'], ['G'], "Enchantment", "Aura", "W17", "Common", 25, 68438) 35 | RabidBite = Card("rabid_bite", "Rabid Bite", ['1', 'G'], ['G'], "Sorcery", "", "W17", "Common", 26, 68439) 36 | Rootwalla = Card("rootwalla", "Rootwalla", ['2', 'G'], ['G'], "Creature", "Lizard", "W17", "Common", 27, 68440) 37 | StalkingTiger = Card("stalking_tiger", "Stalking Tiger", ['3', 'G'], ['G'], "Creature", "Cat", "W17", "Common", 28, 68441) 38 | StampedingRhino = Card("stampeding_rhino", "Stampeding Rhino", ['4', 'G'], ['G'], "Creature", "Rhino", "W17", "Common", 29, 68442) 39 | WingSnare = Card("wing_snare", "Wing Snare", ['2', 'G'], ['G'], "Sorcery", "", "W17", "Uncommon", 30, 68443) 40 | 41 | 42 | clsmembers = [card for name, card in inspect.getmembers(sys.modules[__name__]) if isinstance(card, Card)] 43 | WelcomeDecks2017 = Set("welcome_decks_2017", cards=clsmembers) 44 | 45 | -------------------------------------------------------------------------------- /source/mtga/models/card.py: -------------------------------------------------------------------------------- 1 | COLORMAP = { 2 | "R": "Red", 3 | "W": "White", 4 | "B": "Black", 5 | "U": "Blue", 6 | "G": "Green" 7 | } 8 | 9 | class Card(object): 10 | 11 | def __init__(self, name="", pretty_name="", cost=None, color_identity=None, card_type="", sub_types="", 12 | abilities=None, set_id="", rarity="", collectible=True, set_number=-1, mtga_id=-1): 13 | self.name = name 14 | self.set = set_id 15 | self.pretty_name = pretty_name 16 | if cost is None: 17 | cost = [] 18 | self.cost = cost 19 | if color_identity is None: 20 | color_identity = [] 21 | self.color_identity = color_identity 22 | self.card_type = card_type 23 | self.sub_types = sub_types 24 | self.set_number = set_number 25 | self.mtga_id = mtga_id 26 | self.rarity = rarity 27 | self.collectible = collectible 28 | if abilities is None: 29 | abilities = [] 30 | self.abilities = abilities 31 | 32 | @property 33 | def abilities_decoded(self): 34 | from ..set_data import all_mtga_abilities 35 | return {ability_id: all_mtga_abilities[ability_id] for ability_id in self.abilities} 36 | 37 | 38 | @property 39 | def colors(self): 40 | colors = [] 41 | for color_key in COLORMAP.keys(): 42 | if color_key in self.cost or color_key in self.color_identity: 43 | colors.append(COLORMAP[color_key]) 44 | if not colors: 45 | if self.card_type == "Basic Land": 46 | if "Plains" in self.pretty_name: 47 | colors = ["White"] 48 | if "Swamp" in self.pretty_name: 49 | colors = ["Black"] 50 | if "Forest" in self.pretty_name: 51 | colors = ["Green"] 52 | if "Mountain" in self.pretty_name: 53 | colors = ["Red"] 54 | if "Island" in self.pretty_name: 55 | colors = ["Blue"] 56 | if not colors: 57 | colors = ["Colorless"] 58 | return colors 59 | 60 | @property 61 | def cmc(self): 62 | 'gets converted mana cost for a card' 63 | cmc = 0 64 | for symbol in self.cost: 65 | if symbol.isdigit(): 66 | cmc += int(symbol) 67 | elif symbol == "X": 68 | continue 69 | else: 70 | cmc += 1 71 | return cmc 72 | 73 | def to_serializable(self): 74 | return { 75 | "name": self.name, 76 | "set": self.set, 77 | "colors": self.colors, 78 | "pretty_name": self.pretty_name, 79 | "cost": self.cost, 80 | "color_identity": self.color_identity, 81 | "card_type": self.card_type, 82 | "sub_types": self.sub_types, 83 | "rarity": self.rarity, 84 | "set_number": self.set_number, 85 | "mtga_id": self.mtga_id 86 | } 87 | 88 | @classmethod 89 | def from_dict(cls, obj): 90 | from ..set_data import all_mtga_cards 91 | try: 92 | return all_mtga_cards.find_one(obj["mtga_id"]) 93 | except ValueError: 94 | new_unknown_card = cls("unknown_{}".format(obj["mtga_id"]), "{}: Unknown MTGA ID".format(obj["mtga_id"]), [], [], "unknown", "unknown", "unknown", -1, obj["mtga_id"]) 95 | all_mtga_cards.cards.append(new_unknown_card) 96 | return new_unknown_card 97 | 98 | def __repr__(self): 99 | return "".format(self.pretty_name, self.colors, self.set, self.mtga_id) 100 | 101 | def __str__(self): 102 | return self.__repr__() 103 | 104 | 105 | class GameCard(Card): 106 | 107 | def __init__(self, name, pretty_name, cost, color_identity, card_type, sub_types, set_id, rarity, set_number, mtga_id, owner_seat_id, game_id=-1): 108 | super().__init__(name, pretty_name, cost, color_identity, card_type, sub_types, set_id, rarity, set_number, mtga_id) 109 | self.game_id = game_id 110 | self.previous_iids = [] 111 | self.owner_seat_id = owner_seat_id 112 | 113 | def to_serializable(self): 114 | serial = super(GameCard, self).to_serializable() 115 | serial["iid"] = self.game_id 116 | serial["owner_seat_id"] = self.owner_seat_id 117 | return serial 118 | 119 | def __repr__(self): 120 | if self.mtga_id != -1: 121 | return "".format(self.name, self.mtga_id, self.game_id) 122 | else: 123 | return "".format(self.game_id) 124 | 125 | def transform_to(self, card_id): 126 | from ..set_data import all_mtga_cards 127 | new_card = all_mtga_cards.find_one(card_id) 128 | self.name = new_card.name 129 | self.pretty_name = new_card.pretty_name 130 | self.cost = new_card.cost 131 | self.card_type = new_card.card_type 132 | self.sub_types = new_card.sub_types 133 | self.set = new_card.set 134 | self.set_number = new_card.set_number 135 | self.mtga_id = new_card.mtga_id 136 | -------------------------------------------------------------------------------- /source/mtga/set_data/arenasup.py: -------------------------------------------------------------------------------- 1 | 2 | import sys 3 | from mtga.models.card import Card 4 | from mtga.models.card_set import Set 5 | import inspect 6 | 7 | 8 | FactoryofMomirVig = Card(name="factory_of_momir_vig", pretty_name="Factory of Momir Vig", cost=[], 9 | color_identity=[], card_type="Artifact", sub_types="", 10 | abilities=[121336], set_id="ARENASUP", rarity="Mythic Rare", collectible=False, set_number=1, 11 | mtga_id=68326) 12 | MaelstromNexusEmblem = Card(name="maelstrom_nexus_emblem", pretty_name="Maelstrom Nexus Emblem", cost=[], 13 | color_identity=[], card_type="Artifact", sub_types="", 14 | abilities=[133330], set_id="ARENASUP", rarity="Mythic Rare", collectible=False, set_number=1, 15 | mtga_id=69746) 16 | OmniscienceEmblem = Card(name="omniscience_emblem", pretty_name="Omniscience Emblem", cost=[], 17 | color_identity=['W', 'U', 'B', 'R', 'G'], card_type="Artifact", sub_types="", 18 | abilities=[19205, 133323], set_id="ARENASUP", rarity="Mythic Rare", collectible=False, set_number=1, 19 | mtga_id=69761) 20 | TreasureTokenFactory = Card(name="treasure_token_factory", pretty_name="Treasure Token Factory", cost=[], 21 | color_identity=[], card_type="Artifact", sub_types="", 22 | abilities=[133370], set_id="ARENASUP", rarity="Mythic Rare", collectible=False, set_number=1, 23 | mtga_id=69769) 24 | PandemoniumEmblem = Card(name="pandemonium_emblem", pretty_name="Pandemonium Emblem", cost=[], 25 | color_identity=[], card_type="Artifact", sub_types="", 26 | abilities=[133366], set_id="ARENASUP", rarity="Mythic Rare", collectible=False, set_number=1, 27 | mtga_id=69775) 28 | Treasure = Card(name="treasure", pretty_name="Treasure", cost=[], 29 | color_identity=[], card_type="Artifact", sub_types="Treasure", 30 | abilities=[183], set_id="ARENASUP", rarity="Token", collectible=False, set_number=10001, 31 | mtga_id=69776) 32 | GiantMonstersEmblem = Card(name="giant_monsters_emblem", pretty_name="Giant Monsters Emblem", cost=[], 33 | color_identity=[], card_type="Artifact", sub_types="", 34 | abilities=[133367], set_id="ARENASUP", rarity="Mythic Rare", collectible=False, set_number=1, 35 | mtga_id=69777) 36 | OverflowingCounters = Card(name="overflowing_counters", pretty_name="Overflowing Counters", cost=[], 37 | color_identity=[], card_type="Artifact", sub_types="", 38 | abilities=[136374], set_id="ARENASUP", rarity="Mythic Rare", collectible=False, set_number=1, 39 | mtga_id=70146) 40 | ZombieArmy = Card(name="zombie_army", pretty_name="Zombie Army", cost=[], 41 | color_identity=[], card_type="Creature", sub_types="Zombie Army", 42 | abilities=[], set_id="ARENASUP", rarity="Token", collectible=False, set_number=10002, 43 | mtga_id=70469) 44 | LandfallSatchel = Card(name="landfall_satchel", pretty_name="Landfall Satchel", cost=[], 45 | color_identity=[], card_type="Artifact", sub_types="", 46 | abilities=[136492], set_id="ARENASUP", rarity="Mythic Rare", collectible=False, set_number=1, 47 | mtga_id=70500) 48 | Plant = Card(name="plant", pretty_name="Plant", cost=[], 49 | color_identity=[], card_type="Creature", sub_types="Plant", 50 | abilities=[], set_id="ARENASUP", rarity="Token", collectible=False, set_number=10003, 51 | mtga_id=70511) 52 | 53 | 54 | clsmembers = [card for name, card in inspect.getmembers(sys.modules[__name__]) if isinstance(card, Card)] 55 | ArenaSup = Set("arenasup", cards=clsmembers) 56 | 57 | set_ability_map = {183: '{oT}, Sacrifice this artifact: Add one mana of any color.', 58 | 19205: 'You may cast spells from your hand without paying their mana costs.', 59 | 121336: "{oX}, Discard a Card: Create a token that's a copy of a random " 60 | 'creature card with converted mana cost X. Activate this ability only ' 61 | 'any time you could cast a sorcery and only once each turn.', 62 | 133323: '{o0}: Add {oWoUoBoRoG}. Activate this ability only once each turn.', 63 | 133330: 'Whenever you cast your first spell each turn, exile cards from the ' 64 | 'top of your library until you exile a nonland card with converted ' 65 | "mana cost less than that spell's. You may cast that card without " 66 | "paying its mana cost. Then put the exiled cards that weren't cast " 67 | 'this way on the bottom of that library in a random order.', 68 | 133366: 'Whenever a creature enters the battlefield under your control, this ' 69 | "emblem deals damage equal to that creature's power to target " 70 | 'creature an opponent controls.', 71 | 133367: 'Whenever you cast a creature spell with converted mana cost 4 or ' 72 | 'greater, draw a card.', 73 | 133370: 'At the beginning of your upkeep, create a colorless Treasure ' 74 | 'artifact token with "{oT}, Sacrifice this artifact: Add one mana of ' 75 | 'any color."', 76 | 136374: 'At the beginning of your end step, put a +1/+1 counter on each ' 77 | 'creature you control with a +1/+1 counter on it and a loyalty ' 78 | 'counter on each planeswalker you control. If you control no ' 79 | 'creatures with +1/+1 counters on them and you control no ' 80 | 'planeswalkers, amass 1.', 81 | 136492: 'Landfall Whenever a land enters the battlefield under your ' 82 | 'control, exile the top card of your library. If that card is a land ' 83 | 'card, put it into your hand. If that card is a creature card, put ' 84 | 'that card on the bottom of your library and create a 1/1 green Plant ' 85 | 'creature token. If that card is a noncreature, nonland card, put ' 86 | 'that card on the bottom of your library, each opponent loses 1 life, ' 87 | 'and you gain 1 life.'} 88 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | """A setuptools based setup module. 2 | 3 | See: 4 | https://packaging.python.org/en/latest/distributing.html 5 | https://github.com/pypa/sampleproject 6 | """ 7 | 8 | import codecs 9 | import os 10 | import re 11 | import setuptools 12 | from setuptools.command.test import test as TestCommand 13 | from setuptools import Command 14 | 15 | __author__ = "shawkins" 16 | __email__ = "devs.mtgatracker@gmail.com" 17 | 18 | 19 | PACKAGE_NAME = "MTGA" 20 | INSTALL_REQUIRES = [] 21 | DEPENDENCY_LINKS = [] 22 | TESTS_REQUIRE = [] 23 | LONG_DESCRIPTION = '' 24 | 25 | 26 | def read_requirements_file(path): 27 | """ reads requirements.txt file """ 28 | with open(path) as f: 29 | requires = [] 30 | for line in f.readlines(): 31 | if not line: 32 | continue 33 | requires.append(line.strip()) 34 | return requires 35 | 36 | 37 | if __name__ == "__main__": 38 | VERSION_FILE = os.path.join("source", "mtga", "_version.py") 39 | __version__ = None 40 | # Check first for version in VERSION_FILE 41 | if os.path.isfile(VERSION_FILE): 42 | with open(VERSION_FILE) as f: 43 | lines = f.read() 44 | version_regex = "^__version__ = ['\"]([^'\"]*)['\"]" 45 | search_result = re.search(version_regex, lines, re.M) 46 | if search_result: 47 | __version__ = search_result.group(1) 48 | else: 49 | if os.environ.get('JENKINS_HOME'): 50 | raise RuntimeError("Unable to find version string in %s." % (VERSION_FILE,)) 51 | assert __version__ is not None, "Version not found in _version.py nor major_version" 52 | 53 | _install_requires = read_requirements_file('requirements.txt') 54 | INSTALL_REQUIRES.extend(_install_requires) 55 | 56 | if os.path.isfile('tests/requirements.txt'): 57 | _tests_require = read_requirements_file('tests/requirements.txt') 58 | TESTS_REQUIRE.extend(_tests_require) 59 | 60 | # Get the long description from the relevant file 61 | if os.path.isfile('README.md'): 62 | with codecs.open('README.md', encoding='utf-8') as f: 63 | LONG_DESCRIPTION = f.read() 64 | 65 | setuptools.setup( 66 | name=PACKAGE_NAME, 67 | 68 | # Versions should comply with PEP440. For a discussion on single-sourcing 69 | # the version across setup.py and the project code, see 70 | # https://packaging.python.org/en/latest/single_source_version.html 71 | version=__version__, 72 | 73 | description="python-mtga: a python-accessible interface for MTGA cards", 74 | long_description=LONG_DESCRIPTION, 75 | long_description_content_type="text/markdown", 76 | license="MIT License", 77 | 78 | # The project's main homepage. 79 | url="https://github.com/mtgatracker/python-mtga", 80 | 81 | # Author details 82 | author=__author__, 83 | author_email=__email__, 84 | 85 | # See https://pypi.python.org/pypi?%3Aaction=list_classifiers 86 | classifiers=[ 87 | # How mature is this project? Common values are 88 | # 1 - Planning 89 | # 3 - Alpha 90 | # 4 - Beta 91 | # 5 - Production/Stable 92 | 'Development Status :: 3 - Alpha', 93 | 94 | # Indicate who your project is intended for 95 | 'Intended Audience :: Developers', 96 | 'Topic :: Software Development :: Testing', 97 | 'Topic :: Software Development :: Quality Assurance', 98 | 99 | # Specify the Python versions you support here. In particular, ensure 100 | # that you indicate whether you support Python 2, Python 3 or both. 101 | # 'Programming Language :: Python :: 2', 102 | # 'Programming Language :: Python :: 2.7', 103 | 'Programming Language :: Python :: 3', 104 | 'Programming Language :: Python :: 3.5', 105 | 'Programming Language :: Python :: 3.6', 106 | ], 107 | 108 | # What does your project relate to? 109 | keywords="mtga mtg magic arena grpid mtgjson", 110 | 111 | # You can just specify the packages manually here if your project is 112 | # simple. Or you can use find_packages(). 113 | # In the case of this repo. We aren't installing anyting but the pre-requisites 114 | # But if you want any packages to be installed here, use the following example as a guide: 115 | # packages=find_packages(exclude=['contrib', 'docs', 'tests*']), 116 | package_dir={'': 'source'}, 117 | packages=["mtga", "mtga.models", "mtga.set_data"], 118 | 119 | # List any additional sources that should be included when searching for dependencies 120 | # https://pythonhosted.org/setuptools/setuptools.html#declaring-extras-optional-features-with-their-own-dependencies 121 | # Here is an example of how to do this: 122 | dependency_links=DEPENDENCY_LINKS, 123 | 124 | # List run-time dependencies here. These will be installed by pip when 125 | # your project is installed. For an analysis of "install_requires" vs pip's 126 | # requirements files see: 127 | # https://packaging.python.org/en/latest/requirements.html 128 | install_requires=INSTALL_REQUIRES, 129 | tests_require=TESTS_REQUIRE, 130 | test_suite='tests', 131 | 132 | # List additional groups of dependencies here (e.g. development or test 133 | # dependencies). You can install these using the following syntax, 134 | # for example: 135 | # $ pip install -e .[dev,test] 136 | extras_require={ 137 | 'dev': INSTALL_REQUIRES, 138 | 'test': TESTS_REQUIRE, 139 | }, 140 | 141 | # If there are data files included in your packages that need to be 142 | # installed, specify them here. If using Python 2.6 or less, then these 143 | # have to be included in MANIFEST.in as well. 144 | package_data={}, 145 | 146 | # Although 'package_data' is the preferred approach, in some case you may 147 | # need to place data files outside of your packages. See: 148 | # http://docs.python.org/3.4/distutils/setupscript.html#installing-additional-files # noqa 149 | # In this case, 'data_file' will be installed into '/my_data' 150 | # data_files=[('my_data', ['data/data_file'])], 151 | 152 | # To provide executable scripts, use entry points in preference to the 153 | # "scripts" keyword. Entry points provide cross-platform support and allow 154 | # pip to create the appropriate form of executable for the target platform. 155 | entry_points={ 156 | 'console_scripts': [], 157 | }, 158 | ) 159 | -------------------------------------------------------------------------------- /script/generate_set_map.py: -------------------------------------------------------------------------------- 1 | """ generate_set_map.py: 2 | 3 | given a cards.json and a loc.json, generate a python-mtga style set map. 4 | cards.json can be obtained from the script in Fugiman/deckmaster: 5 | loc.json can also be obtained with minor modifications: data_loc_ instead of data_cards_ 6 | 7 | """ 8 | 9 | import argparse 10 | import json 11 | import re 12 | import pprint 13 | import string 14 | 15 | import os 16 | 17 | printable = set(string.printable) 18 | 19 | data_loc = r"C:\Program Files (x86)\Wizards of the Coast\MTGA\MTGA_Data\Downloads\Data" 20 | 21 | jsons = {"enums": None, "cards": None, "abilities": None, "loc": None} 22 | 23 | for filename in os.listdir(data_loc): 24 | key = filename.split("_")[1] 25 | if key in jsons.keys(): 26 | print("setting {} to {}".format(key, filename)) 27 | jsons[key] = os.path.join(data_loc, filename) 28 | 29 | COLOR_ID_MAP = {1: "W", 2: "U", 3: "B", 4: "R", 5: "G"} 30 | RARITY_ID_MAP = {0: "Token", 1: "Basic", 2: "Common", 3: "Uncommon", 4: "Rare", 5: "Mythic Rare"} 31 | 32 | 33 | def generate_set_map(loc, cards, enums, set_name): 34 | """ 35 | :param loc: dict w/ contents of of loc.json 36 | :param cards: dict w/ contents of cards.json 37 | :param set: set name (GRN, etc) 38 | """ 39 | used_classnames = [] 40 | set_name_class_cased = re.sub('[^0-9a-zA-Z_]', '', set_name) 41 | set_name_snake_cased = re.sub('[^0-9a-zA-Z_]', '', set_name.lower().replace(" ", "_")) 42 | all_abilities = {} 43 | 44 | loc_map = {} 45 | en = list(filter(lambda x: x["langkey"] == "EN", loc))[0] 46 | for obj in en["keys"]: 47 | if obj["id"] in loc_map.keys(): 48 | print("WARNING: overwriting id {} = {} with {}".format(obj["id"], loc_map[obj["id"]], obj["text"])) 49 | loc_map[obj["id"]] = obj["text"] 50 | loc_map = {obj["id"]: obj["text"] for obj in en["keys"]} 51 | enum_map = {obj["name"]: {inner_obj["id"]: inner_obj["text"] for inner_obj in obj["values"]} for obj in enums} 52 | set_cards = [card for card in cards if card["set"].upper() == set_name.upper()] 53 | assert set_cards, "No cards found in set {}. Double check your nomenclature, and ensure the input files contain your set!" 54 | 55 | token_count = 1 56 | 57 | print("translating {} cards from set {}".format(len(set_cards), set_name)) 58 | output_lines = [] 59 | for card in set_cards: 60 | try: 61 | card_title = loc_map[card["titleId"]] 62 | card_name_class_cased = re.sub('[^0-9a-zA-Z_]', '', card_title) 63 | card_name_class_cased_suffixed = card_name_class_cased 64 | card_suffix = 2 65 | 66 | while card_name_class_cased_suffixed in used_classnames: 67 | card_name_class_cased_suffixed = card_name_class_cased + str(card_suffix) 68 | card_suffix += 1 69 | used_classnames.append(card_name_class_cased_suffixed) 70 | 71 | card_name_snake_cased = re.sub('[^0-9a-zA-Z_]', '', card_title.lower().replace(" ", "_")) 72 | cc_raw = card["castingcost"] 73 | # cc's look like: o2o(U/B)o(U/B)o3oUoB, want to turn it into ["2", "(U/B)"] etc 74 | cost = [cost_part for cost_part in cc_raw.split("o")[1:] if cost_part != "0"] 75 | color_identity = [COLOR_ID_MAP[color_id] for color_id in card["colorIdentity"]] 76 | collectible = card["isCollectible"] 77 | 78 | card_type_ids = [enum_map["CardType"][card_type] for card_type in card["types"]] 79 | card_types = " ".join([loc_map[loc_id] for loc_id in card_type_ids]) 80 | 81 | sub_types_ids = [enum_map["SubType"][sub_type] for sub_type in card["subtypes"]] 82 | sub_types = " ".join([loc_map[loc_id] for loc_id in sub_types_ids]) 83 | 84 | set_id = set_name.upper() 85 | 86 | rarity = RARITY_ID_MAP[card["rarity"]] 87 | 88 | if card["isToken"]: 89 | set_number = token_count + 10000 90 | token_count += 1 91 | else: 92 | if card["collectorNumber"].startswith("GR") or card["collectorNumber"].startswith("GP"): 93 | set_number = int(card["collectorNumber"][2]) * 1000 94 | else: 95 | set_number = int(card["collectorNumber"]) 96 | 97 | grp_id = card["grpid"] 98 | abilities = [] 99 | 100 | abilities_raw = card["abilities"] 101 | for ability in abilities_raw: 102 | aid = ability["abilityId"] 103 | textid = ability["textId"] 104 | text = loc_map[textid].encode("ascii", errors="ignore").decode() 105 | abilities.append(aid) 106 | all_abilities[aid] = text 107 | indentation_length = len("{} = Card(".format(card_name_class_cased_suffixed)) 108 | # params: name, pretty_name, cost, color_identity, card_type, sub_types, set_id, rarity, set_number, mtga_id 109 | # ex: "a_b_c", "A B C", ['3', 'W', 'W'], ['W'], "Creature", "Angel", "AKH", "Mythic Rare", 1, 64801 110 | # name, pretty_name, cost, color_identity, card_type, sub_types, set_id, rarity, set_number, mtga_id 111 | new_card_str = '{} = Card(name="{}", pretty_name="{}", cost={},\n' \ 112 | '{{}}color_identity={}, card_type="{}", sub_types="{}",\n' \ 113 | '{{}}abilities={}, set_id="{}", rarity="{}", collectible={}, set_number={},\n' \ 114 | '{{}}mtga_id={})'.format( 115 | card_name_class_cased_suffixed, 116 | card_name_snake_cased, 117 | card_title, 118 | cost, 119 | color_identity, 120 | card_types, 121 | sub_types, 122 | abilities, 123 | set_id, 124 | rarity, 125 | collectible, 126 | set_number, 127 | grp_id 128 | ).format(" "*indentation_length, " "*indentation_length, " "*indentation_length) 129 | output_lines.append(new_card_str) 130 | 131 | except Exception: 132 | print("hit an error on {} / {} / {}".format(card["grpid"], loc_map[card["titleId"]], card["collectorNumber"])) 133 | raise 134 | header = """ 135 | import sys 136 | from mtga.models.card import Card 137 | from mtga.models.card_set import Set 138 | import inspect 139 | """ 140 | 141 | footer = """ 142 | clsmembers = [card for name, card in inspect.getmembers(sys.modules[__name__]) if isinstance(card, Card)] 143 | {} = Set("{}", cards=clsmembers) 144 | 145 | set_ability_map = {} 146 | """.format(set_name_class_cased, set_name_snake_cased, pprint.pformat(all_abilities)) 147 | with open("{}.py".format(set_name.lower()), "w") as set_file: 148 | set_file.write("{}\n\n{}\n\n{}".format(header, "\n".join(output_lines), footer)) 149 | 150 | 151 | if __name__ == '__main__': 152 | arg_parser = argparse.ArgumentParser() 153 | arg_parser.add_argument('-l', '--loc_file') 154 | arg_parser.add_argument('-c', '--cards_file') 155 | arg_parser.add_argument('-e', '--enums_file') 156 | arg_parser.add_argument('-s', '--set') 157 | args = arg_parser.parse_args() 158 | 159 | with open(args.cards_file or jsons["cards"], "r", encoding="utf-8") as card_in: 160 | cards = json.load(card_in) 161 | 162 | with open(args.loc_file or jsons["loc"], "r", encoding="utf-8") as loc_in: 163 | loc = json.load(loc_in) 164 | with open(args.enums_file or jsons["enums"], "r", encoding="utf-8") as enums_in: 165 | enums = json.load(enums_in) 166 | 167 | if args.set: 168 | generate_set_map(loc, cards, enums, args.set) 169 | else: 170 | print("generating all sets!") 171 | known_sets = ["ana", "dar", "grn", "m19", "rix", "xln", "rna", 172 | "mi", "roe", "rtr", "bfz", "akh", "arenasup", "g18", "eld"] 173 | for card_set in known_sets: 174 | generate_set_map(loc, cards, enums, card_set) -------------------------------------------------------------------------------- /source/mtga/set_data/dynamic.py: -------------------------------------------------------------------------------- 1 | """ dynamic.py: this file pulls cards from live .json files in the arena installation (so that e.g. MTGATracker 2 | doesn't have to update everytime a new set drops). 3 | 4 | This file adapted from generate_set_map.py """ 5 | import json 6 | import os 7 | import re 8 | import sys 9 | from pathlib import Path 10 | from mtga.models.card import Card 11 | from mtga.models.card_set import Set 12 | 13 | 14 | def _get_data_location_hardcoded(): 15 | root = os.environ.get( 16 | "ProgramFiles", 17 | r"C:\Program Files" 18 | ) 19 | return os.path.join(root, "Wizards of the Coast", "MTGA", "MTGA_Data", "Downloads", "Data") 20 | 21 | 22 | COLOR_ID_MAP = {1: "W", 2: "U", 3: "B", 4: "R", 5: "G"} 23 | RARITY_ID_MAP = {0: "Token", 1: "Basic", 2: "Common", 3: "Uncommon", 4: "Rare", 5: "Mythic Rare"} 24 | 25 | dynamic_set_tuples = [] 26 | 27 | def get_data_location(): 28 | current_os = sys.platform 29 | if current_os not in ["darwin", "win32"]: 30 | raise 31 | 32 | return { 33 | "darwin": get_darwin_data_location, 34 | "win32": get_win_data_location, 35 | }[current_os]() 36 | 37 | def get_darwin_data_location(): 38 | return os.path.join( 39 | os.path.expanduser("~"), 40 | "Library/Application Support/com.wizards.mtga/Downloads/Data", 41 | ) 42 | 43 | def get_win_data_location(): 44 | try: 45 | from winreg import ConnectRegistry, OpenKey, HKEY_LOCAL_MACHINE, QueryValueEx 46 | registry_connection = ConnectRegistry(None, HKEY_LOCAL_MACHINE) 47 | reg_path = r"SOFTWARE\Wizards of the Coast\MTGArena" 48 | registry_key = OpenKey(registry_connection, reg_path) 49 | data_location = QueryValueEx(registry_key, "Path")[0] + r"MTGA_Data\Downloads\Data" 50 | print("Found data @ ") 51 | print(data_location) 52 | print(r"C:\Program Files\Wizards of the Coast\MTGA\MTGA_Data\Downloads\Data") 53 | except: 54 | print("Couldn't locate MTGA from registry, falling back to hardcoded path...") 55 | data_location = _get_data_location_hardcoded() 56 | return data_location 57 | 58 | data_location = get_data_location() 59 | 60 | json_filepaths = {"enums": "", "cards": "", "abilities": "", "loc": ""} 61 | 62 | # A newer file SHOULD be the preference; alpha sort of hashes may be out of order 63 | # Otherwise it will be necessary to find which is really used 64 | for filepath in sorted(Path(data_location).iterdir(), key=os.path.getmtime): 65 | filename = os.path.basename(filepath) 66 | # In case of rogue files 67 | filesplit = filename.split("_") 68 | if len(filesplit) > 1: 69 | key = filesplit[1] 70 | else: 71 | key = "" 72 | if key in json_filepaths.keys() and filename.endswith("mtga"): 73 | # print("setting {} to {}".format(key, filename)) 74 | json_filepaths[key] = filepath 75 | 76 | with open(json_filepaths["cards"], "r", encoding="utf-8") as card_in: 77 | cards = json.load(card_in) 78 | 79 | with open(json_filepaths["loc"], "r", encoding="utf-8") as loc_in: 80 | loc = json.load(loc_in) 81 | 82 | with open(json_filepaths["enums"], "r", encoding="utf-8") as enums_in: 83 | enums = json.load(enums_in) 84 | 85 | listed_cardsets = list(set([card["set"] for card in cards])) 86 | 87 | for set_name in listed_cardsets: 88 | used_classnames = [] 89 | set_name_class_cased = re.sub('[^0-9a-zA-Z_]', '', set_name) 90 | all_abilities = {} 91 | 92 | loc_map = {} 93 | try: 94 | en = list(filter(lambda x: x["langkey"] == "EN", loc))[0] 95 | except: 96 | ## langkeys are null in 11/21 patch??? 97 | en = loc[0] 98 | for obj in en["keys"]: 99 | # if obj["id"] in loc_map.keys(): 100 | # print("WARNING: overwriting id {} = {} with {}".format(obj["id"], loc_map[obj["id"]], obj["text"])) 101 | loc_map[obj["id"]] = obj["text"] 102 | loc_map = {obj["id"]: obj["text"] for obj in en["keys"]} 103 | enum_map = {obj["name"]: {inner_obj["id"]: inner_obj["text"] for inner_obj in obj["values"]} for obj in enums} 104 | set_cards = [card for card in cards if card["set"].upper() == set_name.upper()] 105 | assert set_cards, "No cards found in set {}. Double check your nomenclature, and ensure the input files contain your set!" 106 | 107 | token_count = 1 108 | 109 | # print("translating {} cards from set {}".format(len(set_cards), set_name)) 110 | output_lines = [] 111 | set_card_objs = [] 112 | for card in set_cards: 113 | try: 114 | card_title = loc_map[card["titleId"]] 115 | card_name_class_cased = re.sub('[^0-9a-zA-Z_]', '', card_title) 116 | card_name_class_cased_suffixed = card_name_class_cased 117 | card_suffix = 2 118 | 119 | while card_name_class_cased_suffixed in used_classnames: 120 | card_name_class_cased_suffixed = card_name_class_cased + str(card_suffix) 121 | card_suffix += 1 122 | used_classnames.append(card_name_class_cased_suffixed) 123 | 124 | card_name_snake_cased = re.sub('[^0-9a-zA-Z_]', '', card_title.lower().replace(" ", "_")) 125 | cc_raw = card["castingcost"] 126 | # cc's look like: o2o(U/B)o(U/B)o3oUoB, want to turn it into ["2", "(U/B)"] etc 127 | cost = [cost_part for cost_part in cc_raw.split("o")[1:] if cost_part != "0"] 128 | color_identity = [COLOR_ID_MAP[color_id] for color_id in card["colorIdentity"]] 129 | try: 130 | collectible = card["isCollectible"] 131 | except KeyError: 132 | collectible = False 133 | 134 | card_type_ids = [enum_map["CardType"][card_type] for card_type in card["types"]] 135 | card_types = " ".join([loc_map[loc_id] for loc_id in card_type_ids]) 136 | 137 | sub_types_ids = [enum_map["SubType"][sub_type] for sub_type in card["subtypes"]] 138 | sub_types = " ".join([loc_map[loc_id] for loc_id in sub_types_ids]) 139 | 140 | set_id = set_name.upper() 141 | 142 | rarity = RARITY_ID_MAP[card["rarity"]] 143 | 144 | if card["isToken"]: 145 | set_number = token_count + 10000 146 | token_count += 1 147 | else: 148 | try: 149 | if card["collectorNumber"].startswith("GR") or card["collectorNumber"].startswith("GP"): 150 | set_number = int(card["collectorNumber"][2]) * 1000 151 | else: 152 | set_number = int(card["collectorNumber"]) 153 | except ValueError: 154 | set_number = card["grpid"] 155 | 156 | grp_id = card["grpid"] 157 | abilities = [] 158 | 159 | abilities_raw = card["abilities"] 160 | for ability in abilities_raw: 161 | aid = ability["abilityId"] 162 | textid = ability["textId"] 163 | try: 164 | text = loc_map[textid].encode("ascii", errors="ignore").decode() 165 | except: 166 | # TODO: there are multiple loc files now?? something weird is up. I don't really feel like trying to 167 | # figure this out right now though. 168 | text = "unknown ability id {} / {}".format(aid, textid) 169 | abilities.append(aid) 170 | all_abilities[aid] = text 171 | 172 | new_card_obj = Card(name=card_name_snake_cased, pretty_name=card_title, cost=cost, 173 | color_identity=color_identity, card_type=card_types, sub_types=sub_types, 174 | abilities=abilities, set_id=set_id, rarity=rarity, collectible=collectible, 175 | set_number=set_number, mtga_id=grp_id) 176 | set_card_objs.append(new_card_obj) 177 | 178 | except Exception: 179 | print("hit an error on {} / {} / {}".format(card["grpid"], loc_map[card["titleId"]], 180 | card["collectorNumber"])) 181 | # raise 182 | card_set_obj = Set(set_name_class_cased, cards=set_card_objs) 183 | dynamic_set_tuples.append((card_set_obj, all_abilities)) 184 | 185 | -------------------------------------------------------------------------------- /source/mtga/models/card_set.py: -------------------------------------------------------------------------------- 1 | import logging 2 | import re 3 | from .card import GameCard, Card 4 | 5 | 6 | class Set(object): 7 | 8 | def __init__(self, set_name, cards=None): 9 | self.set_name = set_name 10 | self.mtga_ids = set() 11 | self.cards_in_set = list() 12 | 13 | if cards: 14 | for card in cards: 15 | self.add_card(card) 16 | 17 | def add_card(self, card): 18 | if card.mtga_id in self.mtga_ids: 19 | raise ValueError("This set already has MTGA ID {}".format(card.mtga_id)) 20 | self.cards_in_set.append(card) 21 | self.mtga_ids.add(card.mtga_id) 22 | 23 | 24 | class Pool(object): 25 | 26 | def __init__(self, pool_name, cards=None, abilities=None): 27 | self.pool_name = pool_name 28 | if cards is None: 29 | cards = [] 30 | if abilities is None: 31 | abilities = {} 32 | self.abilities = abilities 33 | self.cards = cards 34 | self.lookup = {**abilities} 35 | for card in cards: 36 | self.lookup[card.mtga_id] = card 37 | 38 | def __repr__(self): 39 | return "".format(self.pool_name, len(self.cards)) 40 | 41 | def __hash__(self): 42 | _hash = 0 43 | for idx, element in enumerate(self.cards): 44 | hashable = element.name + str(idx) 45 | _hash += hash(hashable) 46 | return _hash 47 | 48 | @property 49 | def total_count(self): 50 | return len(self.cards) 51 | 52 | def count_cards_owned_by(self, seat): 53 | total = 0 54 | for card in self.cards: 55 | if card.owner_seat_id == seat: 56 | total += 1 57 | return total 58 | 59 | def count(self, mtga_id): 60 | return len([card for card in self.cards if card.mtga_id == mtga_id]) 61 | 62 | def group_cards(self): 63 | grouped = {} 64 | for card in self.cards: 65 | if card not in grouped: 66 | grouped[card] = 0 67 | grouped[card] += 1 68 | return grouped 69 | 70 | def transfer_all_to(self, other_pool): 71 | for card in self.cards: 72 | other_pool.cards.append(card) 73 | while self.cards: 74 | self.cards.pop() 75 | 76 | def transfer_cards_to(self, cards, other_pool): 77 | # TODO: make this "session safe" (ie if we error on the third card, we should not have transferred the first 2) 78 | for card in cards: 79 | self.transfer_card_to(card, other_pool) 80 | 81 | def transfer_card_to(self, card, other_pool): 82 | # TODO: make this atomic, somehow? 83 | res = card 84 | if not isinstance(card, Card): # allow you to pass in cards or ids or searches 85 | res = self.find_one(card) 86 | self.cards.remove(res) 87 | other_pool.cards.append(res) 88 | 89 | @classmethod 90 | def from_sets(cls, pool_name, sets, abilities=None): 91 | if abilities is None: 92 | abilities = {} 93 | cards = [] 94 | for set in sets: 95 | for card in set.cards_in_set: 96 | cards.append(card) 97 | return Pool(pool_name, cards, abilities) 98 | 99 | def find_one(self, id_or_keyword): 100 | result = set(self.search(id_or_keyword)) 101 | if len(result) < 1: 102 | raise ValueError("Pool does not contain {}".format(id_or_keyword)) 103 | elif len(result) > 1: 104 | raise ValueError("Pool search '{}' not narrow enough, got: {}".format(id_or_keyword, result)) 105 | return result.pop() 106 | 107 | def search(self, id_or_keyword, direct_match_returns_single=False): 108 | keyword_as_int = None 109 | keyword_as_str = str(id_or_keyword) 110 | try: 111 | keyword_as_int = int(id_or_keyword) 112 | # why is this check here?? 113 | if keyword_as_int < 10000 and keyword_as_int not in self.lookup.keys(): 114 | keyword_as_int = None 115 | except (ValueError, TypeError): 116 | pass 117 | if keyword_as_int and keyword_as_int in self.lookup.keys(): 118 | # we can skip the loop and return in O(1) 119 | return [self.lookup[keyword_as_int]] 120 | results = [] 121 | for card in self.cards: 122 | if keyword_as_int == card.mtga_id or keyword_as_int == card.set_number: 123 | return [card] 124 | 125 | keyword_clean = re.sub('[^0-9a-zA-Z_]', '', keyword_as_str.lower()) 126 | if keyword_clean == card.name and direct_match_returns_single: 127 | return [card] 128 | if keyword_clean in card.name: 129 | results.append(card) 130 | return results 131 | 132 | 133 | class Zone(Pool): 134 | def __init__(self, pool_name, zone_id=-1): 135 | super().__init__(pool_name) 136 | self.zone_id = zone_id 137 | 138 | def match_game_id_to_card(self, instance_id, card_id): 139 | for card in self.cards: 140 | assert isinstance(card, GameCard) 141 | if card.game_id == instance_id or instance_id in card.previous_iids: 142 | if card.mtga_id != -1 and card.mtga_id != card_id: 143 | raise Exception("WHOA. tried to match iid {} to {}, but already has card {}".format( 144 | str(instance_id), str(card_id), str(card.mtga_id))) 145 | card.transform_to(card_id) 146 | elif card.mtga_id == card_id: 147 | # only allowed to set it if it's still -1 (should probably never hit this!) 148 | if card.game_id == -1: 149 | logging.getLogger("mtga").error("What the hell?! How'd we get a card ID without an instance ID?") 150 | card.game_id = instance_id 151 | 152 | 153 | class Deck(Pool): 154 | 155 | def __init__(self, pool_name, deck_id): 156 | super().__init__(pool_name) 157 | self.deck_id = deck_id 158 | 159 | def generate_library(self, owner_id=-1): 160 | library = Library(self.pool_name, self.deck_id, owner_id, -1) 161 | for card in self.cards: 162 | game_card = GameCard(card.name, card.pretty_name, card.cost, card.color_identity, card.card_type, 163 | card.sub_types, card.set, card.set_number, card.mtga_id, owner_id, -1) 164 | library.cards.append(game_card) 165 | return library 166 | 167 | def to_serializable(self, transform_to_counted=False): 168 | obj = { 169 | "deck_id": self.deck_id, 170 | "pool_name": self.pool_name, 171 | } 172 | if transform_to_counted: 173 | card_dict = {} 174 | for card in self.cards: 175 | card_dict[card.mtga_id] = card_dict.get(card.mtga_id, card.to_serializable()) 176 | card_dict[card.mtga_id]["count_in_deck"] = card_dict[card.mtga_id].get("count_in_deck", 0) + 1 177 | obj["cards"] = [v for v in card_dict.values()] 178 | obj["cards"].sort(key=lambda x: x["count_in_deck"]) 179 | obj["cards"].reverse() 180 | obj["cards"] = obj["cards"] 181 | else: 182 | obj["cards"] = [c.to_serializable() for c in self.cards] 183 | return obj 184 | 185 | def to_min_json(self): 186 | min_deck = {} 187 | for card in self.cards: 188 | if card.mtga_id not in min_deck: 189 | min_deck[card.mtga_id] = 0 190 | min_deck[card.mtga_id] += 1 191 | return {"deckID": self.deck_id, "poolName": self.pool_name, "cards": min_deck} 192 | 193 | @classmethod 194 | def from_dict(cls, obj): 195 | deck = Deck(obj["pool_name"], obj["deck_id"]) 196 | for card in obj["cards"]: 197 | deck.cards.append(Card.from_dict(card)) 198 | return deck 199 | 200 | 201 | class Library(Deck, Zone): 202 | def __init__(self, pool_name, deck_id, owner_seat_id, zone_id=-1): 203 | super().__init__(pool_name, deck_id) 204 | self.owner_seat_id = owner_seat_id 205 | self.zone_id = zone_id 206 | 207 | def set_seat_id(self, seat_id): 208 | self.owner_seat_id = seat_id 209 | for card in self.cards: 210 | assert isinstance(card, GameCard) 211 | card.owner_seat_id = seat_id 212 | -------------------------------------------------------------------------------- /source/mtga/set_data/ana.py: -------------------------------------------------------------------------------- 1 | 2 | import sys 3 | from mtga.models.card import Card 4 | from mtga.models.card_set import Set 5 | import inspect 6 | 7 | 8 | BlindingRadiance = Card(name="blinding_radiance", pretty_name="Blinding Radiance", cost=['2', 'W'], 9 | color_identity=['W'], card_type="Sorcery", sub_types="", 10 | abilities=[121583], set_id="ANA", rarity="Uncommon", collectible=False, set_number=2, 11 | mtga_id=68766) 12 | SpiritualGuardian = Card(name="spiritual_guardian", pretty_name="Spiritual Guardian", cost=['3', 'W', 'W'], 13 | color_identity=['W'], card_type="Creature", sub_types="Spirit", 14 | abilities=[88604], set_id="ANA", rarity="Common", collectible=True, set_number=11, 15 | mtga_id=68767) 16 | TacticalAdvantage = Card(name="tactical_advantage", pretty_name="Tactical Advantage", cost=['W'], 17 | color_identity=['W'], card_type="Instant", sub_types="", 18 | abilities=[121584], set_id="ANA", rarity="Common", collectible=True, set_number=12, 19 | mtga_id=68769) 20 | FeralRoar = Card(name="feral_roar", pretty_name="Feral Roar", cost=['1', 'G'], 21 | color_identity=['G'], card_type="Sorcery", sub_types="", 22 | abilities=[1031], set_id="ANA", rarity="Common", collectible=False, set_number=46, 23 | mtga_id=68771) 24 | ShorecomberCrab = Card(name="shorecomber_crab", pretty_name="Shorecomber Crab", cost=['U'], 25 | color_identity=['U'], card_type="Creature", sub_types="Crab", 26 | abilities=[], set_id="ANA", rarity="Common", collectible=False, set_number=18, 27 | mtga_id=68772) 28 | GoblinBruiser = Card(name="goblin_bruiser", pretty_name="Goblin Bruiser", cost=['1', 'R', 'R'], 29 | color_identity=['R'], card_type="Creature", sub_types="Goblin Warrior", 30 | abilities=[], set_id="ANA", rarity="Uncommon", collectible=False, set_number=39, 31 | mtga_id=68773) 32 | ZephyrGull = Card(name="zephyr_gull", pretty_name="Zephyr Gull", cost=['U'], 33 | color_identity=['U'], card_type="Creature", sub_types="Bird", 34 | abilities=[8], set_id="ANA", rarity="Common", collectible=False, set_number=23, 35 | mtga_id=68776) 36 | SoulhunterRakshasa = Card(name="soulhunter_rakshasa", pretty_name="Soulhunter Rakshasa", cost=['3', 'B', 'B'], 37 | color_identity=['B'], card_type="Creature", sub_types="Cat Demon", 38 | abilities=[86476, 121581], set_id="ANA", rarity="Rare", collectible=False, set_number=35, 39 | mtga_id=68782) 40 | RagingGoblin = Card(name="raging_goblin", pretty_name="Raging Goblin", cost=['R'], 41 | color_identity=['R'], card_type="Creature", sub_types="Goblin Berserker", 42 | abilities=[9], set_id="ANA", rarity="Common", collectible=False, set_number=43, 43 | mtga_id=68784) 44 | ConfronttheAssault = Card(name="confront_the_assault", pretty_name="Confront the Assault", cost=['4', 'W'], 45 | color_identity=['W'], card_type="Instant", sub_types="", 46 | abilities=[121586, 17708], set_id="ANA", rarity="Uncommon", collectible=True, set_number=3, 47 | mtga_id=68786) 48 | TakeVengeance = Card(name="take_vengeance", pretty_name="Take Vengeance", cost=['1', 'W'], 49 | color_identity=['W'], card_type="Sorcery", sub_types="", 50 | abilities=[1385], set_id="ANA", rarity="Common", collectible=False, set_number=13, 51 | mtga_id=68787) 52 | KnightsPledge = Card(name="knights_pledge", pretty_name="Knight's Pledge", cost=['1', 'W'], 53 | color_identity=['W'], card_type="Enchantment", sub_types="Aura", 54 | abilities=[1027, 2018], set_id="ANA", rarity="Common", collectible=False, set_number=6, 55 | mtga_id=68788) 56 | LoxodonLineBreaker = Card(name="loxodon_line_breaker", pretty_name="Loxodon Line Breaker", cost=['2', 'W'], 57 | color_identity=['W'], card_type="Creature", sub_types="Elephant Soldier", 58 | abilities=[], set_id="ANA", rarity="Common", collectible=False, set_number=7, 59 | mtga_id=68789) 60 | VolcanicDragon = Card(name="volcanic_dragon", pretty_name="Volcanic Dragon", cost=['4', 'R', 'R'], 61 | color_identity=['R'], card_type="Creature", sub_types="Dragon", 62 | abilities=[8, 9], set_id="ANA", rarity="Uncommon", collectible=False, set_number=45, 63 | mtga_id=68790) 64 | RisefromtheGrave = Card(name="rise_from_the_grave", pretty_name="Rise from the Grave", cost=['4', 'B'], 65 | color_identity=['B'], card_type="Sorcery", sub_types="", 66 | abilities=[2159], set_id="ANA", rarity="Uncommon", collectible=False, set_number=34, 67 | mtga_id=68791) 68 | Waterknot = Card(name="waterknot", pretty_name="Waterknot", cost=['1', 'U', 'U'], 69 | color_identity=['U'], card_type="Enchantment", sub_types="Aura", 70 | abilities=[1027, 89789, 88178], set_id="ANA", rarity="Common", collectible=False, set_number=22, 71 | mtga_id=68792) 72 | SerraAngel = Card(name="serra_angel", pretty_name="Serra Angel", cost=['3', 'W', 'W'], 73 | color_identity=['W'], card_type="Creature", sub_types="Angel", 74 | abilities=[8, 15], set_id="ANA", rarity="Uncommon", collectible=False, set_number=9, 75 | mtga_id=68793) 76 | ChaosMaw = Card(name="chaos_maw", pretty_name="Chaos Maw", cost=['5', 'R', 'R'], 77 | color_identity=['R'], card_type="Creature", sub_types="Hellion", 78 | abilities=[103805], set_id="ANA", rarity="Rare", collectible=False, set_number=36, 79 | mtga_id=68794) 80 | MiasmicMummy = Card(name="miasmic_mummy", pretty_name="Miasmic Mummy", cost=['1', 'B'], 81 | color_identity=['B'], card_type="Creature", sub_types="Zombie Jackal", 82 | abilities=[3861], set_id="ANA", rarity="Common", collectible=False, set_number=29, 83 | mtga_id=68795) 84 | OverflowingInsight = Card(name="overflowing_insight", pretty_name="Overflowing Insight", cost=['4', 'U', 'U', 'U'], 85 | color_identity=['U'], card_type="Sorcery", sub_types="", 86 | abilities=[116816], set_id="ANA", rarity="Mythic Rare", collectible=False, set_number=16, 87 | mtga_id=68796) 88 | Earthquake = Card(name="earthquake", pretty_name="Earthquake", cost=['X', 'R'], 89 | color_identity=['R'], card_type="Sorcery", sub_types="", 90 | abilities=[88501], set_id="ANA", rarity="Rare", collectible=False, set_number=38, 91 | mtga_id=68797) 92 | AmbitionsCost = Card(name="ambitions_cost", pretty_name="Ambition's Cost", cost=['3', 'B'], 93 | color_identity=['B'], card_type="Sorcery", sub_types="", 94 | abilities=[1713], set_id="ANA", rarity="Uncommon", collectible=False, set_number=25, 95 | mtga_id=68798) 96 | ReaveSoul = Card(name="reave_soul", pretty_name="Reave Soul", cost=['1', 'B'], 97 | color_identity=['B'], card_type="Sorcery", sub_types="", 98 | abilities=[61990], set_id="ANA", rarity="Common", collectible=False, set_number=32, 99 | mtga_id=68799) 100 | Divination = Card(name="divination", pretty_name="Divination", cost=['2', 'U'], 101 | color_identity=['U'], card_type="Sorcery", sub_types="", 102 | abilities=[23607], set_id="ANA", rarity="Common", collectible=False, set_number=14, 103 | mtga_id=68800) 104 | RumblingBaloth = Card(name="rumbling_baloth", pretty_name="Rumbling Baloth", cost=['2', 'G', 'G'], 105 | color_identity=['G'], card_type="Creature", sub_types="Beast", 106 | abilities=[], set_id="ANA", rarity="Common", collectible=False, set_number=47, 107 | mtga_id=68801) 108 | GoblinGrenade = Card(name="goblin_grenade", pretty_name="Goblin Grenade", cost=['R'], 109 | color_identity=['R'], card_type="Sorcery", sub_types="", 110 | abilities=[92793, 4801], set_id="ANA", rarity="Uncommon", collectible=False, set_number=41, 111 | mtga_id=68802) 112 | RenegadeDemon = Card(name="renegade_demon", pretty_name="Renegade Demon", cost=['3', 'B', 'B'], 113 | color_identity=['B'], card_type="Creature", sub_types="Demon", 114 | abilities=[], set_id="ANA", rarity="Common", collectible=False, set_number=33, 115 | mtga_id=68803) 116 | SanctuaryCat = Card(name="sanctuary_cat", pretty_name="Sanctuary Cat", cost=['W'], 117 | color_identity=['W'], card_type="Creature", sub_types="Cat", 118 | abilities=[], set_id="ANA", rarity="Common", collectible=False, set_number=8, 119 | mtga_id=68804) 120 | FortressCrab = Card(name="fortress_crab", pretty_name="Fortress Crab", cost=['3', 'U'], 121 | color_identity=['U'], card_type="Creature", sub_types="Crab", 122 | abilities=[], set_id="ANA", rarity="Common", collectible=False, set_number=15, 123 | mtga_id=68805) 124 | AltarsReap = Card(name="altars_reap", pretty_name="Altar's Reap", cost=['1', 'B'], 125 | color_identity=['B'], card_type="Instant", sub_types="", 126 | abilities=[1275, 23607], set_id="ANA", rarity="Common", collectible=False, set_number=24, 127 | mtga_id=68806) 128 | FleshbagMarauder = Card(name="fleshbag_marauder", pretty_name="Fleshbag Marauder", cost=['2', 'B'], 129 | color_identity=['B'], card_type="Creature", sub_types="Zombie Warrior", 130 | abilities=[89023], set_id="ANA", rarity="Uncommon", collectible=False, set_number=28, 131 | mtga_id=68807) 132 | Goblin = Card(name="goblin", pretty_name="Goblin", cost=[], 133 | color_identity=[], card_type="Creature", sub_types="Goblin", 134 | abilities=[], set_id="ANA", rarity="Token", collectible=False, set_number=10001, 135 | mtga_id=68808) 136 | Spirit = Card(name="spirit", pretty_name="Spirit", cost=[], 137 | color_identity=[], card_type="Creature", sub_types="Spirit", 138 | abilities=[8], set_id="ANA", rarity="Token", collectible=False, set_number=10002, 139 | mtga_id=68809) 140 | CruxofFate = Card(name="crux_of_fate", pretty_name="Crux of Fate", cost=['3', 'B', 'B'], 141 | color_identity=['B'], card_type="Sorcery", sub_types="", 142 | abilities=[101832], set_id="ANA", rarity="Rare", collectible=False, set_number=27, 143 | mtga_id=68810) 144 | SeismicRupture = Card(name="seismic_rupture", pretty_name="Seismic Rupture", cost=['2', 'R'], 145 | color_identity=['R'], card_type="Sorcery", sub_types="", 146 | abilities=[96294], set_id="ANA", rarity="Uncommon", collectible=False, set_number=44, 147 | mtga_id=68811) 148 | Twincast = Card(name="twincast", pretty_name="Twincast", cost=['U', 'U'], 149 | color_identity=['U'], card_type="Instant", sub_types="", 150 | abilities=[1246], set_id="ANA", rarity="Rare", collectible=False, set_number=21, 151 | mtga_id=68812) 152 | Murder = Card(name="murder", pretty_name="Murder", cost=['1', 'B', 'B'], 153 | color_identity=['B'], card_type="Instant", sub_types="", 154 | abilities=[26818], set_id="ANA", rarity="Uncommon", collectible=False, set_number=30, 155 | mtga_id=68813) 156 | Doublecast = Card(name="doublecast", pretty_name="Doublecast", cost=['R', 'R'], 157 | color_identity=['R'], card_type="Sorcery", sub_types="", 158 | abilities=[119092], set_id="ANA", rarity="Uncommon", collectible=False, set_number=37, 159 | mtga_id=68814) 160 | AngelicReward = Card(name="angelic_reward", pretty_name="Angelic Reward", cost=['3', 'W', 'W'], 161 | color_identity=['W'], card_type="Enchantment", sub_types="Aura", 162 | abilities=[1027, 8812], set_id="ANA", rarity="Uncommon", collectible=True, set_number=1, 163 | mtga_id=69108) 164 | HallowedPriest = Card(name="hallowed_priest", pretty_name="Hallowed Priest", cost=['2', 'W'], 165 | color_identity=['W'], card_type="Creature", sub_types="Human Cleric", 166 | abilities=[103130], set_id="ANA", rarity="Uncommon", collectible=False, set_number=4, 167 | mtga_id=69109) 168 | InspiringCommander = Card(name="inspiring_commander", pretty_name="Inspiring Commander", cost=['4', 'W', 'W'], 169 | color_identity=['W'], card_type="Creature", sub_types="Human Soldier", 170 | abilities=[121578], set_id="ANA", rarity="Rare", collectible=True, set_number=5, 171 | mtga_id=69110) 172 | ShrineKeeper = Card(name="shrine_keeper", pretty_name="Shrine Keeper", cost=['W', 'W'], 173 | color_identity=['W'], card_type="Creature", sub_types="Human Cleric", 174 | abilities=[], set_id="ANA", rarity="Common", collectible=False, set_number=10, 175 | mtga_id=69111) 176 | RiversFavor = Card(name="rivers_favor", pretty_name="River's Favor", cost=['U'], 177 | color_identity=['U'], card_type="Enchantment", sub_types="Aura", 178 | abilities=[1027, 3974], set_id="ANA", rarity="Common", collectible=False, set_number=17, 179 | mtga_id=69112) 180 | TitanicPelagosaur = Card(name="titanic_pelagosaur", pretty_name="Titanic Pelagosaur", cost=['3', 'U', 'U'], 181 | color_identity=['U'], card_type="Creature", sub_types="Dinosaur", 182 | abilities=[], set_id="ANA", rarity="Uncommon", collectible=False, set_number=19, 183 | mtga_id=69113) 184 | TrappedinaWhirlpool = Card(name="trapped_in_a_whirlpool", pretty_name="Trapped in a Whirlpool", cost=['3', 'U'], 185 | color_identity=['U'], card_type="Enchantment", sub_types="Aura", 186 | abilities=[1027, 88178], set_id="ANA", rarity="Common", collectible=False, set_number=20, 187 | mtga_id=69114) 188 | CruelCut = Card(name="cruel_cut", pretty_name="Cruel Cut", cost=['1', 'B'], 189 | color_identity=['B'], card_type="Instant", sub_types="", 190 | abilities=[30246], set_id="ANA", rarity="Common", collectible=False, set_number=26, 191 | mtga_id=69115) 192 | NimblePilferer = Card(name="nimble_pilferer", pretty_name="Nimble Pilferer", cost=['1', 'B'], 193 | color_identity=['B'], card_type="Creature", sub_types="Human Rogue", 194 | abilities=[7], set_id="ANA", rarity="Common", collectible=False, set_number=31, 195 | mtga_id=69116) 196 | GoblinGangLeader = Card(name="goblin_gang_leader", pretty_name="Goblin Gang Leader", cost=['2', 'R', 'R'], 197 | color_identity=['R'], card_type="Creature", sub_types="Goblin Warrior", 198 | abilities=[96140], set_id="ANA", rarity="Uncommon", collectible=False, set_number=40, 199 | mtga_id=69117) 200 | OgrePainbringer = Card(name="ogre_painbringer", pretty_name="Ogre Painbringer", cost=['3', 'R', 'R'], 201 | color_identity=['R'], card_type="Creature", sub_types="Ogre", 202 | abilities=[121351], set_id="ANA", rarity="Rare", collectible=False, set_number=42, 203 | mtga_id=69118) 204 | TreetopWarden = Card(name="treetop_warden", pretty_name="Treetop Warden", cost=['1', 'G'], 205 | color_identity=['G'], card_type="Creature", sub_types="Elf Warrior", 206 | abilities=[], set_id="ANA", rarity="Common", collectible=False, set_number=48, 207 | mtga_id=69119) 208 | AncientCrab = Card(name="ancient_crab", pretty_name="Ancient Crab", cost=['1', 'U', 'U'], 209 | color_identity=['U'], card_type="Creature", sub_types="Crab", 210 | abilities=[], set_id="ANA", rarity="Common", collectible=False, set_number=49, 211 | mtga_id=69441) 212 | HiredBlade = Card(name="hired_blade", pretty_name="Hired Blade", cost=['2', 'B'], 213 | color_identity=['B'], card_type="Creature", sub_types="Human Assassin", 214 | abilities=[7], set_id="ANA", rarity="Common", collectible=False, set_number=50, 215 | mtga_id=69442) 216 | Plains = Card(name="plains", pretty_name="Plains", cost=[], 217 | color_identity=['W'], card_type="Land", sub_types="Plains", 218 | abilities=[], set_id="ANA", rarity="Basic", collectible=False, set_number=51, 219 | mtga_id=69443) 220 | Island = Card(name="island", pretty_name="Island", cost=[], 221 | color_identity=['U'], card_type="Land", sub_types="Island", 222 | abilities=[], set_id="ANA", rarity="Basic", collectible=False, set_number=52, 223 | mtga_id=69444) 224 | Swamp = Card(name="swamp", pretty_name="Swamp", cost=[], 225 | color_identity=['B'], card_type="Land", sub_types="Swamp", 226 | abilities=[], set_id="ANA", rarity="Basic", collectible=False, set_number=53, 227 | mtga_id=69445) 228 | Mountain = Card(name="mountain", pretty_name="Mountain", cost=[], 229 | color_identity=['R'], card_type="Land", sub_types="Mountain", 230 | abilities=[], set_id="ANA", rarity="Basic", collectible=False, set_number=54, 231 | mtga_id=69446) 232 | Forest = Card(name="forest", pretty_name="Forest", cost=[], 233 | color_identity=['G'], card_type="Land", sub_types="Forest", 234 | abilities=[], set_id="ANA", rarity="Basic", collectible=False, set_number=55, 235 | mtga_id=69447) 236 | 237 | 238 | clsmembers = [card for name, card in inspect.getmembers(sys.modules[__name__]) if isinstance(card, Card)] 239 | ArenaExclusives = Set("ana", cards=clsmembers) 240 | 241 | set_ability_map = {7: 'Flash', 242 | 8: 'Flying', 243 | 9: 'Haste', 244 | 15: 'Vigilance', 245 | 1027: 'Enchant creature', 246 | 1031: 'Target creature gets +4/+4 until end of turn.', 247 | 1246: 'Copy target instant or sorcery spell. You may choose new targets for ' 248 | 'the copy.', 249 | 1275: 'As an additional cost to cast this spell, sacrifice a creature.', 250 | 1385: 'Destroy target tapped creature.', 251 | 1713: 'You draw three cards and you lose 3 life.', 252 | 2018: 'Enchanted creature gets +2/+2.', 253 | 2159: 'Put target creature card from a graveyard onto the battlefield under ' 254 | 'your control. That creature is a black Zombie in addition to its other ' 255 | 'colors and types.', 256 | 3861: 'When Miasmic Mummy enters the battlefield, each player discards a ' 257 | 'card.', 258 | 3974: 'Enchanted creature gets +1/+1.', 259 | 4801: 'Goblin Grenade deals 5 damage to any target.', 260 | 8812: 'Enchanted creature gets +3/+3 and has flying.', 261 | 17708: 'Create three 1/1 white Spirit creature tokens with flying.', 262 | 23607: 'Draw two cards.', 263 | 26818: 'Destroy target creature.', 264 | 30246: 'Destroy target creature with power 2 or less.', 265 | 61990: 'Destroy target creature with power 3 or less.', 266 | 86476: "Soulhunter Rakshasa can't block.", 267 | 88178: "Enchanted creature doesn't untap during its controller's untap step.", 268 | 88501: 'Earthquake deals X damage to each creature without flying and each ' 269 | 'player.', 270 | 88604: 'When Spiritual Guardian enters the battlefield, you gain 4 life.', 271 | 89023: 'When Fleshbag Marauder enters the battlefield, each player sacrifices ' 272 | 'a creature.', 273 | 89789: 'When Waterknot enters the battlefield, tap enchanted creature.', 274 | 92793: 'As an additional cost to cast this spell, sacrifice a Goblin.', 275 | 96140: 'When Goblin Gang Leader enters the battlefield, create two 1/1 red ' 276 | 'Goblin creature tokens.', 277 | 96294: 'Seismic Rupture deals 2 damage to each creature without flying.', 278 | 101832: 'Choose one Destroy all Dragon creatures. Destroy all non-Dragon ' 279 | 'creatures.', 280 | 103130: 'When Hallowed Priest enters the battlefield, create a 1/1 white ' 281 | 'Spirit creature token with flying.', 282 | 103805: 'When Chaos Maw enters the battlefield, it deals 3 damage to each ' 283 | 'other creature.', 284 | 116816: 'Target player draws seven cards.', 285 | 119092: 'When you cast your next instant or sorcery spell this turn, copy ' 286 | 'that spell. You may choose new targets for the copy.', 287 | 121351: 'When Ogre Painbringer enters the battlefield, it deals 3 damage to ' 288 | 'each player.', 289 | 121578: 'Whenever another creature with power 2 or less enters the ' 290 | 'battlefield under your control, you gain 1 life and draw a card.', 291 | 121581: 'When Soulhunter Rakshasa enters the battlefield, it deals 5 damage ' 292 | 'to target opponent.', 293 | 121583: 'Tap all creatures your opponents control with toughness 2 or less.', 294 | 121584: 'Target blocking or blocked creature you control gets +2/+2 until end ' 295 | 'of turn.', 296 | 121586: 'Cast this spell only if a creature is attacking you.'} 297 | -------------------------------------------------------------------------------- /source/mtga/set_data/aer.py: -------------------------------------------------------------------------------- 1 | """ WARNING! These cards are no longer in MTGA! This file is likely incorrect, and is left only for reference. 2 | 3 | """ 4 | import sys 5 | from mtga.models.card import Card 6 | from mtga.models.card_set import Set 7 | import inspect 8 | 9 | 10 | AerialModification = Card("aerial_modification", "Aerial Modification", ['4', 'W'], ['W'], "Enchantment", "Aura", "AER", "Uncommon", 1, 64213) 11 | AeronautAdmiral = Card("aeronaut_admiral", "Aeronaut Admiral", ['3', 'W'], ['W'], "Creature", "Human Pilot", "AER", "Uncommon", 2, 64207) 12 | AetherInspector = Card("aether_inspector", "Aether Inspector", ['3', 'W'], ['W'], "Creature", "Dwarf Artificer", "AER", "Common", 3, 64541) 13 | AethergeodeMiner = Card("aethergeode_miner", "Aethergeode Miner", ['1', 'W'], ['W'], "Creature", "Dwarf Scout", "AER", "Rare", 4, 64543) 14 | AirdropAeronauts = Card("airdrop_aeronauts", "Airdrop Aeronauts", ['3', 'W', 'W'], ['W'], "Creature", "Dwarf Scout", "AER", "Uncommon", 5, 64211) 15 | AlleyEvasion = Card("alley_evasion", "Alley Evasion", ['W'], ['W'], "Instant", "", "AER", "Common", 6, 64545) 16 | AudaciousInfiltrator = Card("audacious_infiltrator", "Audacious Infiltrator", ['1', 'W'], ['W'], "Creature", "Dwarf Rogue", "AER", "Common", 7, 64547) 17 | BastionEnforcer = Card("bastion_enforcer", "Bastion Enforcer", ['2', 'W'], ['W'], "Creature", "Dwarf Soldier", "AER", "Common", 8, 64187) 18 | CallforUnity = Card("call_for_unity", "Call for Unity", ['3', 'W', 'W'], ['W'], "Enchantment", "", "AER", "Rare", 9, 64219) 19 | CaughtintheBrights = Card("caught_in_the_brights", "Caught in the Brights", ['2', 'W'], ['W'], "Enchantment", "Aura", "AER", "Common", 10, 64197) 20 | ConsulateCrackdown = Card("consulate_crackdown", "Consulate Crackdown", ['3', 'W', 'W'], ['W'], "Enchantment", "", "AER", "Rare", 11, 64549) 21 | Conviction = Card("conviction", "Conviction", ['1', 'W'], ['W'], "Enchantment", "Aura", "AER", "Common", 12, 64181) 22 | CountlessGearsRenegade = Card("countless_gears_renegade", "Countless Gears Renegade", ['1', 'W'], ['W'], "Creature", "Dwarf Artificer", "AER", "Common", 13, 64183) 23 | DawnfeatherEagle = Card("dawnfeather_eagle", "Dawnfeather Eagle", ['4', 'W'], ['W'], "Creature", "Bird", "AER", "Common", 14, 64193) 24 | DeadeyeHarpooner = Card("deadeye_harpooner", "Deadeye Harpooner", ['2', 'W'], ['W'], "Creature", "Dwarf Warrior", "AER", "Uncommon", 15, 64203) 25 | Decommission = Card("decommission", "Decommission", ['2', 'W'], ['W'], "Instant", "", "AER", "Common", 16, 64189) 26 | DeftDismissal = Card("deft_dismissal", "Deft Dismissal", ['3', 'W'], ['W'], "Instant", "", "AER", "Uncommon", 17, 64209) 27 | ExquisiteArchangel = Card("exquisite_archangel", "Exquisite Archangel", ['5', 'W', 'W'], ['W'], "Creature", "Angel", "AER", "Mythic Rare", 18, 64551) 28 | FelidarGuardian = Card("felidar_guardian", "Felidar Guardian", ['3', 'W'], ['W'], "Creature", "Cat Beast", "AER", "Uncommon", 19, 64205) 29 | GhirapurOsprey = Card("ghirapur_osprey", "Ghirapur Osprey", ['2', 'W'], ['W'], "Creature", "Bird", "AER", "Common", 20, 64185) 30 | RestorationSpecialist = Card("restoration_specialist", "Restoration Specialist", ['1', 'W'], ['W'], "Creature", "Dwarf Artificer", "AER", "Uncommon", 21, 64199) 31 | SolemnRecruit = Card("solemn_recruit", "Solemn Recruit", ['1', 'W', 'W'], ['W'], "Creature", "Dwarf Warrior", "AER", "Rare", 22, 64217) 32 | SramSeniorEdificer = Card("sram_senior_edificer", "Sram, Senior Edificer", ['1', 'W'], ['W'], "Legendary Creature", "Dwarf Advisor", "AER", "Rare", 23, 64215) 33 | SramsExpertise = Card("srams_expertise", "Sram's Expertise", ['2', 'W', 'W'], ['W'], "Sorcery", "", "AER", "Rare", 24, 64553) 34 | ThopterArrest = Card("thopter_arrest", "Thopter Arrest", ['2', 'W'], ['W'], "Enchantment", "", "AER", "Uncommon", 25, 64201) 35 | AetherSwooper = Card("aether_swooper", "Aether Swooper", ['1', 'U'], ['U'], "Creature", "Vedalken Artificer", "AER", "Common", 26, 64555) 36 | AethertideWhale = Card("aethertide_whale", "Aethertide Whale", ['4', 'U', 'U'], ['U'], "Creature", "Whale", "AER", "Rare", 27, 64271) 37 | BaralChiefofCompliance = Card("baral_chief_of_compliance", "Baral, Chief of Compliance", ['1', 'U'], ['U'], "Legendary Creature", "Human Wizard", "AER", "Rare", 28, 64273) 38 | BaralsExpertise = Card("barals_expertise", "Baral's Expertise", ['3', 'U', 'U'], ['U'], "Sorcery", "", "AER", "Rare", 29, 64557) 39 | BastionInventor = Card("bastion_inventor", "Bastion Inventor", ['5', 'U'], ['U'], "Creature", "Vedalken Artificer", "AER", "Common", 30, 64559) 40 | Disallow = Card("disallow", "Disallow", ['1', 'U', 'U'], ['U'], "Instant", "", "AER", "Rare", 31, 64679) 41 | DispersalTechnician = Card("dispersal_technician", "Dispersal Technician", ['4', 'U'], ['U'], "Creature", "Vedalken Artificer", "AER", "Common", 32, 64237) 42 | EfficientConstruction = Card("efficient_construction", "Efficient Construction", ['3', 'U'], ['U'], "Enchantment", "", "AER", "Uncommon", 33, 64561) 43 | HinterlandDrake = Card("hinterland_drake", "Hinterland Drake", ['2', 'U'], ['U'], "Creature", "Drake", "AER", "Common", 34, 64233) 44 | IceOver = Card("ice_over", "Ice Over", ['1', 'U'], ['U'], "Enchantment", "Aura", "AER", "Common", 35, 64231) 45 | IllusionistsStratagem = Card("illusionists_stratagem", "Illusionist's Stratagem", ['3', 'U'], ['U'], "Instant", "", "AER", "Uncommon", 36, 64563) 46 | LeaveintheDust = Card("leave_in_the_dust", "Leave in the Dust", ['3', 'U'], ['U'], "Instant", "", "AER", "Common", 37, 64245) 47 | MechanizedProduction = Card("mechanized_production", "Mechanized Production", ['2', 'U', 'U'], ['U'], "Enchantment", "Aura", "AER", "Mythic Rare", 38, 64265) 48 | MetallicRebuke = Card("metallic_rebuke", "Metallic Rebuke", ['2', 'U'], ['U'], "Instant", "", "AER", "Common", 39, 64239) 49 | Negate = Card("negate", "Negate", ['1', 'U'], ['U'], "Instant", "", "AER", "Common", 40, 64235) 50 | QuicksmithSpy = Card("quicksmith_spy", "Quicksmith Spy", ['3', 'U'], ['U'], "Creature", "Human Artificer", "AER", "Rare", 41, 64267) 51 | ReverseEngineer = Card("reverse_engineer", "Reverse Engineer", ['3', 'U', 'U'], ['U'], "Sorcery", "", "AER", "Uncommon", 42, 64261) 52 | SalvageScuttler = Card("salvage_scuttler", "Salvage Scuttler", ['4', 'U'], ['U'], "Creature", "Crab", "AER", "Uncommon", 43, 64565) 53 | ShieldedAetherThief = Card("shielded_aether_thief", "Shielded Aether Thief", ['1', 'U'], ['U'], "Creature", "Vedalken Rogue", "AER", "Uncommon", 44, 64567) 54 | ShipwreckMoray = Card("shipwreck_moray", "Shipwreck Moray", ['3', 'U'], ['U'], "Creature", "Fish", "AER", "Common", 45, 64681) 55 | SkyshipPlunderer = Card("skyship_plunderer", "Skyship Plunderer", ['1', 'U'], ['U'], "Creature", "Human Pirate", "AER", "Uncommon", 46, 64249) 56 | TakeintoCustody = Card("take_into_custody", "Take into Custody", ['U'], ['U'], "Instant", "", "AER", "Common", 47, 64569) 57 | TrophyMage = Card("trophy_mage", "Trophy Mage", ['2', 'U'], ['U'], "Creature", "Human Wizard", "AER", "Uncommon", 48, 64571) 58 | WhirofInvention = Card("whir_of_invention", "Whir of Invention", ['X', 'U', 'U', 'U'], ['U'], "Instant", "", "AER", "Rare", 49, 64275) 59 | WindKinRaiders = Card("windkin_raiders", "Wind-Kin Raiders", ['4', 'U', 'U'], ['U'], "Creature", "Human Artificer", "AER", "Uncommon", 50, 64573) 60 | AetherPoisoner = Card("aether_poisoner", "Aether Poisoner", ['1', 'B'], ['B'], "Creature", "Human Artificer", "AER", "Common", 51, 64575) 61 | AlleyStrangler = Card("alley_strangler", "Alley Strangler", ['2', 'B'], ['B'], "Creature", "Aetherborn Rogue", "AER", "Common", 52, 64281) 62 | BattleattheBridge = Card("battle_at_the_bridge", "Battle at the Bridge", ['X', 'B'], ['B'], "Sorcery", "", "AER", "Rare", 53, 64319) 63 | CruelFinality = Card("cruel_finality", "Cruel Finality", ['2', 'B'], ['B'], "Instant", "", "AER", "Common", 54, 64577) 64 | DaringDemolition = Card("daring_demolition", "Daring Demolition", ['2', 'B', 'B'], ['B'], "Sorcery", "", "AER", "Common", 55, 64579) 65 | DefiantSalvager = Card("defiant_salvager", "Defiant Salvager", ['2', 'B'], ['B'], "Creature", "Aetherborn Artificer", "AER", "Common", 56, 64285) 66 | FatalPush = Card("fatal_push", "Fatal Push", ['B'], ['B'], "Instant", "", "AER", "Uncommon", 57, 64311) 67 | FenHauler = Card("fen_hauler", "Fen Hauler", ['6', 'B'], ['B'], "Creature", "Insect", "AER", "Common", 58, 64293) 68 | FoundryHornet = Card("foundry_hornet", "Foundry Hornet", ['3', 'B'], ['B'], "Creature", "Insect", "AER", "Uncommon", 59, 64299) 69 | FourthBridgeProwler = Card("fourth_bridge_prowler", "Fourth Bridge Prowler", ['B'], ['B'], "Creature", "Human Rogue", "AER", "Common", 60, 64297) 70 | GiftedAetherborn = Card("gifted_aetherborn", "Gifted Aetherborn", ['B', 'B'], ['B'], "Creature", "Aetherborn Vampire", "AER", "Uncommon", 61, 64581) 71 | GlintSleeveSiphoner = Card("glintsleeve_siphoner", "Glint-Sleeve Siphoner", ['1', 'B'], ['B'], "Creature", "Human Rogue", "AER", "Rare", 62, 64325) 72 | GontisMachinations = Card("gontis_machinations", "Gonti's Machinations", ['B'], ['B'], "Enchantment", "", "AER", "Uncommon", 63, 64583) 73 | HeraldofAnguish = Card("herald_of_anguish", "Herald of Anguish", ['5', 'B', 'B'], ['B'], "Creature", "Demon", "AER", "Mythic Rare", 64, 64585) 74 | IroncladRevolutionary = Card("ironclad_revolutionary", "Ironclad Revolutionary", ['4', 'B', 'B'], ['B'], "Creature", "Aetherborn Artificer", "AER", "Uncommon", 65, 64317) 75 | MidnightEntourage = Card("midnight_entourage", "Midnight Entourage", ['2', 'B', 'B'], ['B'], "Creature", "Aetherborn Rogue", "AER", "Rare", 66, 64323) 76 | NightMarketAeronaut = Card("night_market_aeronaut", "Night Market Aeronaut", ['3', 'B'], ['B'], "Creature", "Aetherborn Warrior", "AER", "Common", 67, 64289) 77 | PerilousPredicament = Card("perilous_predicament", "Perilous Predicament", ['4', 'B'], ['B'], "Instant", "", "AER", "Uncommon", 68, 64301) 78 | RenegadesGetaway = Card("renegades_getaway", "Renegade's Getaway", ['2', 'B'], ['B'], "Instant", "", "AER", "Common", 69, 64587) 79 | ResourcefulReturn = Card("resourceful_return", "Resourceful Return", ['1', 'B'], ['B'], "Sorcery", "", "AER", "Common", 70, 64683) 80 | SecretSalvage = Card("secret_salvage", "Secret Salvage", ['3', 'B', 'B'], ['B'], "Sorcery", "", "AER", "Rare", 71, 64589) 81 | SlyRequisitioner = Card("sly_requisitioner", "Sly Requisitioner", ['4', 'B'], ['B'], "Creature", "Human Artificer", "AER", "Uncommon", 72, 64591) 82 | VengefulRebel = Card("vengeful_rebel", "Vengeful Rebel", ['2', 'B'], ['B'], "Creature", "Aetherborn Warrior", "AER", "Uncommon", 73, 64303) 83 | YahenniUndyingPartisan = Card("yahenni_undying_partisan", "Yahenni, Undying Partisan", ['2', 'B'], ['B'], "Legendary Creature", "Aetherborn Vampire", "AER", "Rare", 74, 64315) 84 | YahennisExpertise = Card("yahennis_expertise", "Yahenni's Expertise", ['2', 'B', 'B'], ['B'], "Sorcery", "", "AER", "Rare", 75, 64593) 85 | AetherChaser = Card("aether_chaser", "Aether Chaser", ['1', 'R'], ['R'], "Creature", "Human Artificer", "AER", "Common", 76, 64595) 86 | ChandrasRevolution = Card("chandras_revolution", "Chandra's Revolution", ['3', 'R'], ['R'], "Sorcery", "", "AER", "Common", 77, 64597) 87 | DestructiveTampering = Card("destructive_tampering", "Destructive Tampering", ['2', 'R'], ['R'], "Sorcery", "", "AER", "Common", 78, 64335) 88 | EmbraalGearSmasher = Card("embraal_gearsmasher", "Embraal Gear-Smasher", ['2', 'R'], ['R'], "Creature", "Human Warrior", "AER", "Common", 79, 64601) 89 | EnragedGiant = Card("enraged_giant", "Enraged Giant", ['5', 'R'], ['R'], "Creature", "Giant", "AER", "Uncommon", 80, 64361) 90 | FreejamRegent = Card("freejam_regent", "Freejam Regent", ['4', 'R', 'R'], ['R'], "Creature", "Dragon", "AER", "Rare", 81, 64367) 91 | FrontlineRebel = Card("frontline_rebel", "Frontline Rebel", ['2', 'R'], ['R'], "Creature", "Human Warrior", "AER", "Common", 82, 64603) 92 | GremlinInfestation = Card("gremlin_infestation", "Gremlin Infestation", ['3', 'R'], ['R'], "Enchantment", "Aura", "AER", "Uncommon", 83, 64357) 93 | HungryFlames = Card("hungry_flames", "Hungry Flames", ['2', 'R'], ['R'], "Instant", "", "AER", "Uncommon", 84, 64347) 94 | IndomitableCreativity = Card("indomitable_creativity", "Indomitable Creativity", ['X', 'R', 'R', 'R'], ['R'], "Sorcery", "", "AER", "Mythic Rare", 85, 64605) 95 | InvigoratedRampage = Card("invigorated_rampage", "Invigorated Rampage", ['1', 'R'], ['R'], "Instant", "", "AER", "Uncommon", 86, 64351) 96 | KariZevSkyshipRaider = Card("kari_zev_skyship_raider", "Kari Zev, Skyship Raider", ['1', 'R'], ['R'], "Legendary Creature", "Human Pirate", "AER", "Rare", 87, 64607) 97 | KariZevsExpertise = Card("kari_zevs_expertise", "Kari Zev's Expertise", ['1', 'R', 'R'], ['R'], "Sorcery", "", "AER", "Rare", 88, 64609) 98 | LathnuSailback = Card("lathnu_sailback", "Lathnu Sailback", ['4', 'R'], ['R'], "Creature", "Lizard", "AER", "Common", 89, 64343) 99 | LightningRunner = Card("lightning_runner", "Lightning Runner", ['3', 'R', 'R'], ['R'], "Creature", "Human Warrior", "AER", "Mythic Rare", 90, 64375) 100 | PiasRevolution = Card("pias_revolution", "Pia's Revolution", ['2', 'R'], ['R'], "Enchantment", "", "AER", "Rare", 91, 64611) 101 | PreciseStrike = Card("precise_strike", "Precise Strike", ['R'], ['R'], "Instant", "", "AER", "Common", 92, 64333) 102 | QuicksmithRebel = Card("quicksmith_rebel", "Quicksmith Rebel", ['3', 'R'], ['R'], "Creature", "Human Artificer", "AER", "Rare", 93, 64613) 103 | RavenousIntruder = Card("ravenous_intruder", "Ravenous Intruder", ['1', 'R'], ['R'], "Creature", "Gremlin", "AER", "Uncommon", 94, 64685) 104 | RecklessRacer = Card("reckless_racer", "Reckless Racer", ['2', 'R'], ['R'], "Creature", "Human Pilot", "AER", "Uncommon", 95, 64615) 105 | ReleasetheGremlins = Card("release_the_gremlins", "Release the Gremlins", ['X', 'X', 'R'], ['R'], "Sorcery", "", "AER", "Rare", 96, 64373) 106 | ScrapperChampion = Card("scrapper_champion", "Scrapper Champion", ['3', 'R'], ['R'], "Creature", "Human Artificer", "AER", "Uncommon", 97, 64617) 107 | Shock = Card("shock", "Shock", ['R'], ['R'], "Instant", "", "AER", "Common", 98, 64173) 108 | SiegeModification = Card("siege_modification", "Siege Modification", ['1', 'R', 'R'], ['R'], "Enchantment", "Aura", "AER", "Uncommon", 99, 64355) 109 | SweatworksBrawler = Card("sweatworks_brawler", "Sweatworks Brawler", ['3', 'R'], ['R'], "Creature", "Human Artificer", "AER", "Common", 100, 64339) 110 | Wrangle = Card("wrangle", "Wrangle", ['1', 'R'], ['R'], "Sorcery", "", "AER", "Common", 101, 64345) 111 | AetherHerder = Card("aether_herder", "Aether Herder", ['3', 'G'], ['G'], "Creature", "Elf Artificer Druid", "AER", "Common", 102, 64619) 112 | AetherstreamLeopard = Card("aetherstream_leopard", "Aetherstream Leopard", ['2', 'G'], ['G'], "Creature", "Cat", "AER", "Common", 103, 64621) 113 | AetherwindBasker = Card("aetherwind_basker", "Aetherwind Basker", ['4', 'G', 'G', 'G'], ['G'], "Creature", "Lizard", "AER", "Mythic Rare", 104, 64687) 114 | AidfromtheCowl = Card("aid_from_the_cowl", "Aid from the Cowl", ['3', 'G', 'G'], ['G'], "Enchantment", "", "AER", "Rare", 105, 64427) 115 | DruidoftheCowl = Card("druid_of_the_cowl", "Druid of the Cowl", ['1', 'G'], ['G'], "Creature", "Elf Druid", "AER", "Common", 106, 64381) 116 | GreenbeltRampager = Card("greenbelt_rampager", "Greenbelt Rampager", ['G'], ['G'], "Creature", "Elephant", "AER", "Rare", 107, 64623) 117 | GreenwheelLiberator = Card("greenwheel_liberator", "Greenwheel Liberator", ['1', 'G'], ['G'], "Creature", "Elf Warrior", "AER", "Rare", 108, 64421) 118 | HeroicIntervention = Card("heroic_intervention", "Heroic Intervention", ['1', 'G'], ['G'], "Instant", "", "AER", "Rare", 109, 64415) 119 | HiddenHerbalists = Card("hidden_herbalists", "Hidden Herbalists", ['1', 'G'], ['G'], "Creature", "Human Druid", "AER", "Uncommon", 110, 64625) 120 | HighspireInfusion = Card("highspire_infusion", "Highspire Infusion", ['1', 'G'], ['G'], "Instant", "", "AER", "Common", 111, 64379) 121 | LifecraftAwakening = Card("lifecraft_awakening", "Lifecraft Awakening", ['X', 'G'], ['G'], "Instant", "", "AER", "Uncommon", 112, 64413) 122 | LifecraftCavalry = Card("lifecraft_cavalry", "Lifecraft Cavalry", ['4', 'G'], ['G'], "Creature", "Elf Warrior", "AER", "Common", 113, 64391) 123 | LifecraftersGift = Card("lifecrafters_gift", "Lifecrafter's Gift", ['3', 'G'], ['G'], "Instant", "", "AER", "Uncommon", 114, 64627) 124 | MaulfistRevolutionary = Card("maulfist_revolutionary", "Maulfist Revolutionary", ['1', 'G', 'G'], ['G'], "Creature", "Human Warrior", "AER", "Uncommon", 115, 64399) 125 | MonstrousOnslaught = Card("monstrous_onslaught", "Monstrous Onslaught", ['3', 'G', 'G'], ['G'], "Sorcery", "", "AER", "Uncommon", 116, 64405) 126 | NarnamRenegade = Card("narnam_renegade", "Narnam Renegade", ['G'], ['G'], "Creature", "Elf Warrior", "AER", "Uncommon", 117, 64629) 127 | NaturalObsolescence = Card("natural_obsolescence", "Natural Obsolescence", ['1', 'G'], ['G'], "Instant", "", "AER", "Common", 118, 64383) 128 | PeemaAetherSeer = Card("peema_aetherseer", "Peema Aether-Seer", ['3', 'G'], ['G'], "Creature", "Elf Druid", "AER", "Uncommon", 119, 64401) 129 | PreyUpon = Card("prey_upon", "Prey Upon", ['G'], ['G'], "Sorcery", "", "AER", "Common", 120, 64631) 130 | RidgescaleTusker = Card("ridgescale_tusker", "Ridgescale Tusker", ['3', 'G', 'G'], ['G'], "Creature", "Beast", "AER", "Uncommon", 121, 64633) 131 | RishkarPeemaRenegade = Card("rishkar_peema_renegade", "Rishkar, Peema Renegade", ['2', 'G'], ['G'], "Legendary Creature", "Elf Druid", "AER", "Rare", 122, 64417) 132 | RishkarsExpertise = Card("rishkars_expertise", "Rishkar's Expertise", ['4', 'G', 'G'], ['G'], "Sorcery", "", "AER", "Rare", 123, 64635) 133 | ScroungingBandar = Card("scrounging_bandar", "Scrounging Bandar", ['1', 'G'], ['G'], "Creature", "Cat Monkey", "AER", "Common", 124, 64637) 134 | SilkweaverElite = Card("silkweaver_elite", "Silkweaver Elite", ['2', 'G'], ['G'], "Creature", "Elf Archer", "AER", "Common", 125, 64403) 135 | UnbridledGrowth = Card("unbridled_growth", "Unbridled Growth", ['G'], ['G'], "Enchantment", "Aura", "AER", "Common", 126, 64387) 136 | AjaniUnyielding = Card("ajani_unyielding", "Ajani Unyielding", ['4', 'G', 'W'], ['W', 'G'], "Legendary Planeswalker", "Ajani", "AER", "Mythic Rare", 127, 64455) 137 | DarkIntimations = Card("dark_intimations", "Dark Intimations", ['2', 'U', 'B', 'R'], ['U', 'B', 'R'], "Sorcery", "", "AER", "Rare", 128, 64639) 138 | HiddenStockpile = Card("hidden_stockpile", "Hidden Stockpile", ['W', 'B'], ['W', 'B'], "Enchantment", "", "AER", "Uncommon", 129, 64443) 139 | MaverickThopterist = Card("maverick_thopterist", "Maverick Thopterist", ['3', 'U', 'R'], ['U', 'R'], "Creature", "Human Artificer", "AER", "Uncommon", 130, 64641) 140 | OathofAjani = Card("oath_of_ajani", "Oath of Ajani", ['G', 'W'], ['W', 'G'], "Legendary Enchantment", "", "AER", "Rare", 131, 64449) 141 | OutlandBoar = Card("outland_boar", "Outland Boar", ['2', 'R', 'G'], ['R', 'G'], "Creature", "Boar", "AER", "Uncommon", 132, 64437) 142 | RenegadeRallier = Card("renegade_rallier", "Renegade Rallier", ['1', 'G', 'W'], ['W', 'G'], "Creature", "Human Warrior", "AER", "Uncommon", 133, 64435) 143 | RenegadeWheelsmith = Card("renegade_wheelsmith", "Renegade Wheelsmith", ['1', 'R', 'W'], ['W', 'R'], "Creature", "Dwarf Pilot", "AER", "Uncommon", 134, 64643) 144 | RogueRefiner = Card("rogue_refiner", "Rogue Refiner", ['1', 'G', 'U'], ['U', 'G'], "Creature", "Human Rogue", "AER", "Uncommon", 135, 64645) 145 | SpirePatrol = Card("spire_patrol", "Spire Patrol", ['2', 'W', 'U'], ['W', 'U'], "Creature", "Human Soldier", "AER", "Uncommon", 136, 64445) 146 | TezzerettheSchemer = Card("tezzeret_the_schemer", "Tezzeret the Schemer", ['2', 'U', 'B'], ['U', 'B'], "Legendary Planeswalker", "Tezzeret", "AER", "Mythic Rare", 137, 64647) 147 | TezzeretsTouch = Card("tezzerets_touch", "Tezzeret's Touch", ['1', 'U', 'B'], ['U', 'B'], "Enchantment", "Aura", "AER", "Uncommon", 138, 64649) 148 | WeldfastEngineer = Card("weldfast_engineer", "Weldfast Engineer", ['1', 'B', 'R'], ['B', 'R'], "Creature", "Human Artificer", "AER", "Uncommon", 139, 64431) 149 | WindingConstrictor = Card("winding_constrictor", "Winding Constrictor", ['B', 'G'], ['B', 'G'], "Creature", "Snake", "AER", "Uncommon", 140, 64651) 150 | AegisAutomaton = Card("aegis_automaton", "Aegis Automaton", ['2'], ['W'], "Artifact Creature", "Construct", "AER", "Common", 141, 64467) 151 | AethersphereHarvester = Card("aethersphere_harvester", "Aethersphere Harvester", ['3'], [], "Artifact", "Vehicle", "AER", "Rare", 142, 64689) 152 | AugmentingAutomaton = Card("augmenting_automaton", "Augmenting Automaton", ['1'], ['B'], "Artifact Creature", "Construct", "AER", "Common", 143, 64481) 153 | BarricadeBreaker = Card("barricade_breaker", "Barricade Breaker", ['7'], [], "Artifact Creature", "Juggernaut", "AER", "Uncommon", 144, 64515) 154 | CogworkAssembler = Card("cogwork_assembler", "Cogwork Assembler", ['3'], [], "Artifact Creature", "Assembly-Worker", "AER", "Uncommon", 145, 64509) 155 | ConsulateDreadnought = Card("consulate_dreadnought", "Consulate Dreadnought", ['1'], [], "Artifact", "Vehicle", "AER", "Uncommon", 146, 64501) 156 | ConsulateTurret = Card("consulate_turret", "Consulate Turret", ['3'], [], "Artifact", "", "AER", "Common", 147, 64507) 157 | CrackdownConstruct = Card("crackdown_construct", "Crackdown Construct", ['4'], [], "Artifact Creature", "Construct", "AER", "Uncommon", 148, 64655) 158 | DaredevilDragster = Card("daredevil_dragster", "Daredevil Dragster", ['3'], [], "Artifact", "Vehicle", "AER", "Uncommon", 149, 64523) 159 | FiligreeCrawler = Card("filigree_crawler", "Filigree Crawler", ['4'], [], "Artifact Creature", "Insect", "AER", "Common", 150, 64657) 160 | FoundryAssembler = Card("foundry_assembler", "Foundry Assembler", ['5'], [], "Artifact Creature", "Assembly-Worker", "AER", "Common", 151, 64495) 161 | GontisAetherHeart = Card("gontis_aether_heart", "Gonti's Aether Heart", ['6'], [], "Legendary Artifact", "", "AER", "Mythic Rare", 152, 64659) 162 | HeartofKiran = Card("heart_of_kiran", "Heart of Kiran", ['2'], [], "Legendary Artifact", "Vehicle", "AER", "Mythic Rare", 153, 64535) 163 | HopeofGhirapur = Card("hope_of_ghirapur", "Hope of Ghirapur", ['1'], [], "Legendary Artifact Creature", "Thopter", "AER", "Rare", 154, 64661) 164 | ImplementofCombustion = Card("implement_of_combustion", "Implement of Combustion", ['1'], ['R'], "Artifact", "", "AER", "Common", 155, 64461) 165 | ImplementofExamination = Card("implement_of_examination", "Implement of Examination", ['3'], ['U'], "Artifact", "", "AER", "Common", 156, 64479) 166 | ImplementofFerocity = Card("implement_of_ferocity", "Implement of Ferocity", ['1'], ['G'], "Artifact", "", "AER", "Common", 157, 64469) 167 | ImplementofImprovement = Card("implement_of_improvement", "Implement of Improvement", ['1'], ['W'], "Artifact", "", "AER", "Common", 158, 64691) 168 | ImplementofMalice = Card("implement_of_malice", "Implement of Malice", ['2'], ['B'], "Artifact", "", "AER", "Common", 159, 64475) 169 | InspiringStatuary = Card("inspiring_statuary", "Inspiring Statuary", ['3'], [], "Artifact", "", "AER", "Rare", 160, 64663) 170 | IrontreadCrusher = Card("irontread_crusher", "Irontread Crusher", ['4'], [], "Artifact", "Vehicle", "AER", "Common", 161, 64485) 171 | LifecraftersBestiary = Card("lifecrafters_bestiary", "Lifecrafter's Bestiary", ['3'], ['G'], "Artifact", "", "AER", "Rare", 162, 64665) 172 | MerchantsDockhand = Card("merchants_dockhand", "Merchant's Dockhand", ['1'], ['U'], "Artifact Creature", "Construct", "AER", "Rare", 163, 64667) 173 | MetallicMimic = Card("metallic_mimic", "Metallic Mimic", ['2'], [], "Artifact Creature", "Shapeshifter", "AER", "Rare", 164, 64669) 174 | MobileGarrison = Card("mobile_garrison", "Mobile Garrison", ['3'], [], "Artifact", "Vehicle", "AER", "Common", 165, 64473) 175 | NightMarketGuard = Card("night_market_guard", "Night Market Guard", ['3'], [], "Artifact Creature", "Construct", "AER", "Common", 166, 64477) 176 | Ornithopter = Card("ornithopter", "Ornithopter", ['0'], [], "Artifact Creature", "Thopter", "AER", "Uncommon", 167, 64497) 177 | PacificationArray = Card("pacification_array", "Pacification Array", ['1'], [], "Artifact", "", "AER", "Uncommon", 168, 64503) 178 | ParadoxEngine = Card("paradox_engine", "Paradox Engine", ['5'], [], "Legendary Artifact", "", "AER", "Mythic Rare", 169, 64533) 179 | PeacewalkerColossus = Card("peacewalker_colossus", "Peacewalker Colossus", ['3'], ['W'], "Artifact", "Vehicle", "AER", "Rare", 170, 64527) 180 | PlanarBridge = Card("planar_bridge", "Planar Bridge", ['6'], [], "Legendary Artifact", "", "AER", "Mythic Rare", 171, 64539) 181 | PrizefighterConstruct = Card("prizefighter_construct", "Prizefighter Construct", ['5'], [], "Artifact Creature", "Construct", "AER", "Common", 172, 64671) 182 | RenegadeMap = Card("renegade_map", "Renegade Map", ['1'], [], "Artifact", "", "AER", "Common", 173, 64459) 183 | ReservoirWalker = Card("reservoir_walker", "Reservoir Walker", ['5'], [], "Artifact Creature", "Construct", "AER", "Common", 174, 64491) 184 | ScrapTrawler = Card("scrap_trawler", "Scrap Trawler", ['3'], [], "Artifact Creature", "Construct", "AER", "Rare", 175, 64521) 185 | ServoSchematic = Card("servo_schematic", "Servo Schematic", ['2'], [], "Artifact", "", "AER", "Uncommon", 176, 64673) 186 | TreasureKeeper = Card("treasure_keeper", "Treasure Keeper", ['4'], [], "Artifact Creature", "Construct", "AER", "Uncommon", 177, 64513) 187 | UniversalSolvent = Card("universal_solvent", "Universal Solvent", ['1'], [], "Artifact", "", "AER", "Common", 178, 64463) 188 | UntetheredExpress = Card("untethered_express", "Untethered Express", ['4'], [], "Artifact", "Vehicle", "AER", "Uncommon", 179, 64505) 189 | VerdantAutomaton = Card("verdant_automaton", "Verdant Automaton", ['2'], ['G'], "Artifact Creature", "Construct", "AER", "Common", 180, 64487) 190 | WalkingBallista = Card("walking_ballista", "Walking Ballista", ['X', 'X'], [], "Artifact Creature", "Construct", "AER", "Rare", 181, 64675) 191 | WatchfulAutomaton = Card("watchful_automaton", "Watchful Automaton", ['3'], ['U'], "Artifact Creature", "Construct", "AER", "Common", 182, 64483) 192 | WelderAutomaton = Card("welder_automaton", "Welder Automaton", ['2'], ['R'], "Artifact Creature", "Construct", "AER", "Common", 183, 64677) 193 | SpireofIndustry = Card("spire_of_industry", "Spire of Industry", [], [], "Land", "", "AER", "Rare", 184, 64531) 194 | AjaniValiantProtector = Card("ajani_valiant_protector", "Ajani, Valiant Protector", ['4', 'G', 'W'], ['W', 'G'], "Legendary Planeswalker", "Ajani", "AER", "Mythic Rare", 185, 65917) 195 | InspiringRoar = Card("inspiring_roar", "Inspiring Roar", ['3', 'W'], ['W'], "Sorcery", "", "AER", "Common", 186, 65919) 196 | AjanisComrade = Card("ajanis_comrade", "Ajani's Comrade", ['1', 'G'], ['G'], "Creature", "Elf Soldier", "AER", "Uncommon", 187, 65921) 197 | AjanisAid = Card("ajanis_aid", "Ajani's Aid", ['2', 'G', 'W'], ['W', 'G'], "Enchantment", "", "AER", "Rare", 188, 65923) 198 | TranquilExpanse = Card("tranquil_expanse", "Tranquil Expanse", [], ['G', 'W'], "Land", "", "AER", "Common", 189, 65925) 199 | TezzeretMasterofMetal = Card("tezzeret_master_of_metal", "Tezzeret, Master of Metal", ['4', 'U', 'B'], ['U', 'B'], "Legendary Planeswalker", "Tezzeret", "AER", "Mythic Rare", 190, 65927) 200 | TezzeretsBetrayal = Card("tezzerets_betrayal", "Tezzeret's Betrayal", ['3', 'U', 'B'], ['U', 'B'], "Sorcery", "", "AER", "Rare", 191, 65929) 201 | PendulumofPatterns = Card("pendulum_of_patterns", "Pendulum of Patterns", ['2'], [], "Artifact", "", "AER", "Common", 192, 65931) 202 | TezzeretsSimulacrum = Card("tezzerets_simulacrum", "Tezzeret's Simulacrum", ['3'], [], "Artifact Creature", "Golem", "AER", "Uncommon", 193, 65933) 203 | SubmergedBoneyard = Card("submerged_boneyard", "Submerged Boneyard", [], ['U', 'B'], "Land", "", "AER", "Common", 194, 65935) 204 | 205 | 206 | clsmembers = [card for name, card in inspect.getmembers(sys.modules[__name__]) if isinstance(card, Card)] 207 | AetherRevolt = Set("aether_revolt", cards=clsmembers) 208 | 209 | -------------------------------------------------------------------------------- /source/mtga/set_data/hou.py: -------------------------------------------------------------------------------- 1 | """ WARNING! These cards are no longer in MTGA! This file is likely incorrect, and is left only for reference. 2 | 3 | """ 4 | import sys 5 | from mtga.models.card import Card 6 | from mtga.models.card_set import Set 7 | import inspect 8 | 9 | 10 | ActofHeroism = Card("act_of_heroism", "Act of Heroism", ['1', 'W'], ['W'], "Instant", "", "HOU", "Common", 1, 65479) 11 | AdornedPouncer = Card("adorned_pouncer", "Adorned Pouncer", ['1', 'W'], ['W'], "Creature", "Cat", "HOU", "Rare", 2, 65481) 12 | AngelofCondemnation = Card("angel_of_condemnation", "Angel of Condemnation", ['2', 'W', 'W'], ['W'], "Creature", "Angel", "HOU", "Rare", 3, 65483) 13 | AngeloftheGodPharaoh = Card("angel_of_the_godpharaoh", "Angel of the God-Pharaoh", ['4', 'W', 'W'], ['W'], "Creature", "Angel", "HOU", "Uncommon", 4, 65485) 14 | AvenofEnduringHope = Card("aven_of_enduring_hope", "Aven of Enduring Hope", ['4', 'W'], ['W'], "Creature", "Bird Cleric", "HOU", "Common", 5, 65487) 15 | CrestedSunmare = Card("crested_sunmare", "Crested Sunmare", ['3', 'W', 'W'], ['W'], "Creature", "Horse", "HOU", "Mythic Rare", 6, 65489) 16 | DauntlessAven = Card("dauntless_aven", "Dauntless Aven", ['2', 'W'], ['W'], "Creature", "Bird Warrior", "HOU", "Common", 7, 65491) 17 | DesertsHold = Card("deserts_hold", "Desert's Hold", ['2', 'W'], ['W'], "Enchantment", "Aura", "HOU", "Uncommon", 8, 65493) 18 | # mixup start 19 | DisposalMummy = Card("disposal_mummy", "Disposal Mummy", ['2', 'W'], ['W'], "Creature", "Zombie Jackal", "HOU", "Common", 9, 65957) 20 | DjeruWithEyesOpen = Card("djeru_with_eyes_open", "Djeru, With Eyes Open", ['3', 'W', 'W'], ['W'], "Legendary Creature", "Human Warrior", "HOU", "Rare", 10, 65495) 21 | DjerusRenunciation = Card("djerus_renunciation", "Djeru's Renunciation", ['1', 'W'], ['W'], "Instant", "", "HOU", "Common", 11, 65497) 22 | DutifulServants = Card("dutiful_servants", "Dutiful Servants", ['3', 'W'], ['W'], "Creature", "Zombie", "HOU", "Common", 12, 65499) 23 | # mixup end 24 | GideonsDefeat = Card("gideons_defeat", "Gideon's Defeat", ['W'], ['W'], "Instant", "", "HOU", "Uncommon", 13, 65503) 25 | GodPharaohsFaithful = Card("godpharaohs_faithful", "God-Pharaoh's Faithful", ['W'], ['W'], "Creature", "Human Wizard", "HOU", "Common", 14, 65505) 26 | HourofRevelation = Card("hour_of_revelation", "Hour of Revelation", ['3', 'W', 'W', 'W'], ['W'], "Sorcery", "", "HOU", "Rare", 15, 65507) 27 | MummyParamount = Card("mummy_paramount", "Mummy Paramount", ['1', 'W'], ['W'], "Creature", "Zombie", "HOU", "Common", 16, 65509) 28 | OketrasAvenger = Card("oketras_avenger", "Oketra's Avenger", ['1', 'W'], ['W'], "Creature", "Human Warrior", "HOU", "Common", 17, 65511) 29 | OketrasLastMercy = Card("oketras_last_mercy", "Oketra's Last Mercy", ['1', 'W', 'W'], ['W'], "Sorcery", "", "HOU", "Rare", 18, 65513) 30 | OverwhelmingSplendor = Card("overwhelming_splendor", "Overwhelming Splendor", ['6', 'W', 'W'], ['W'], "Enchantment", "Aura Curse", "HOU", "Mythic Rare", 19, 65515) 31 | Sandblast = Card("sandblast", "Sandblast", ['2', 'W'], ['W'], "Instant", "", "HOU", "Common", 20, 65517) 32 | SavingGrace = Card("saving_grace", "Saving Grace", ['1', 'W'], ['W'], "Enchantment", "Aura", "HOU", "Uncommon", 21, 65519) 33 | Solemnity = Card("solemnity", "Solemnity", ['2', 'W'], ['W'], "Enchantment", "", "HOU", "Rare", 22, 65521) 34 | SolitaryCamel = Card("solitary_camel", "Solitary Camel", ['2', 'W'], ['W'], "Creature", "Camel", "HOU", "Common", 23, 65523) 35 | SteadfastSentinel = Card("steadfast_sentinel", "Steadfast Sentinel", ['3', 'W'], ['W'], "Creature", "Human Cleric", "HOU", "Common", 24, 65525) 36 | StewardofSolidarity = Card("steward_of_solidarity", "Steward of Solidarity", ['1', 'W'], ['W'], "Creature", "Human Warrior", "HOU", "Uncommon", 25, 65527) 37 | SunscourgeChampion = Card("sunscourge_champion", "Sunscourge Champion", ['2', 'W'], ['W'], "Creature", "Human Wizard", "HOU", "Uncommon", 26, 65529) 38 | UnconventionalTactics = Card("unconventional_tactics", "Unconventional Tactics", ['2', 'W'], ['W'], "Sorcery", "", "HOU", "Uncommon", 27, 65531) 39 | VizieroftheTrue = Card("vizier_of_the_true", "Vizier of the True", ['3', 'W'], ['W'], "Creature", "Human Cleric", "HOU", "Uncommon", 28, 65533) 40 | AerialGuide = Card("aerial_guide", "Aerial Guide", ['2', 'U'], ['U'], "Creature", "Drake", "HOU", "Common", 29, 65535) 41 | AvenReedstalker = Card("aven_reedstalker", "Aven Reedstalker", ['3', 'U'], ['U'], "Creature", "Bird Warrior", "HOU", "Common", 30, 65537) 42 | ChampionofWits = Card("champion_of_wits", "Champion of Wits", ['2', 'U'], ['U'], "Creature", "Naga Wizard", "HOU", "Rare", 31, 65539) 43 | CountervailingWinds = Card("countervailing_winds", "Countervailing Winds", ['2', 'U'], ['U'], "Instant", "", "HOU", "Common", 32, 65541) 44 | CunningSurvivor = Card("cunning_survivor", "Cunning Survivor", ['1', 'U'], ['U'], "Creature", "Human Warrior", "HOU", "Common", 33, 65543) 45 | EternalofHarshTruths = Card("eternal_of_harsh_truths", "Eternal of Harsh Truths", ['2', 'U'], ['U'], "Creature", "Zombie Cleric", "HOU", "Uncommon", 34, 65545) 46 | FrayingSanity = Card("fraying_sanity", "Fraying Sanity", ['2', 'U'], ['U'], "Enchantment", "Aura Curse", "HOU", "Rare", 35, 65547) 47 | HourofEternity = Card("hour_of_eternity", "Hour of Eternity", ['X', 'X', 'U', 'U', 'U'], ['U'], "Sorcery", "", "HOU", "Rare", 36, 65549) 48 | ImaginaryThreats = Card("imaginary_threats", "Imaginary Threats", ['2', 'U', 'U'], ['U'], "Instant", "", "HOU", "Uncommon", 37, 65551) 49 | JacesDefeat = Card("jaces_defeat", "Jace's Defeat", ['1', 'U'], ['U'], "Instant", "", "HOU", "Uncommon", 38, 65553) 50 | KefnetsLastWord = Card("kefnets_last_word", "Kefnet's Last Word", ['2', 'U', 'U'], ['U'], "Sorcery", "", "HOU", "Rare", 39, 65555) 51 | NimbleObstructionist = Card("nimble_obstructionist", "Nimble Obstructionist", ['2', 'U'], ['U'], "Creature", "Bird Wizard", "HOU", "Rare", 40, 65557) 52 | OminousSphinx = Card("ominous_sphinx", "Ominous Sphinx", ['3', 'U', 'U'], ['U'], "Creature", "Sphinx", "HOU", "Uncommon", 41, 65559) 53 | ProvenCombatant = Card("proven_combatant", "Proven Combatant", ['U'], ['U'], "Creature", "Human Warrior", "HOU", "Common", 42, 65561) 54 | Riddleform = Card("riddleform", "Riddleform", ['1', 'U'], ['U'], "Enchantment", "", "HOU", "Uncommon", 43, 65563) 55 | SeeroftheLastTomorrow = Card("seer_of_the_last_tomorrow", "Seer of the Last Tomorrow", ['2', 'U'], ['U'], "Creature", "Naga Cleric", "HOU", "Common", 44, 65565) 56 | SinuousStriker = Card("sinuous_striker", "Sinuous Striker", ['2', 'U'], ['U'], "Creature", "Naga Warrior", "HOU", "Uncommon", 45, 65567) 57 | SpellweaverEternal = Card("spellweaver_eternal", "Spellweaver Eternal", ['1', 'U'], ['U'], "Creature", "Zombie Naga Wizard", "HOU", "Common", 46, 65569) 58 | StrategicPlanning = Card("strategic_planning", "Strategic Planning", ['1', 'U'], ['U'], "Sorcery", "", "HOU", "Common", 47, 65571) 59 | StripedRiverwinder = Card("striped_riverwinder", "Striped Riverwinder", ['6', 'U'], ['U'], "Creature", "Serpent", "HOU", "Common", 48, 65573) 60 | SupremeWill = Card("supreme_will", "Supreme Will", ['2', 'U'], ['U'], "Instant", "", "HOU", "Uncommon", 49, 65575) 61 | SwarmIntelligence = Card("swarm_intelligence", "Swarm Intelligence", ['6', 'U'], ['U'], "Enchantment", "", "HOU", "Rare", 50, 65577) 62 | TragicLesson = Card("tragic_lesson", "Tragic Lesson", ['2', 'U'], ['U'], "Instant", "", "HOU", "Common", 51, 65579) 63 | UneshCriosphinxSovereign = Card("unesh_criosphinx_sovereign", "Unesh, Criosphinx Sovereign", ['4', 'U', 'U'], ['U'], "Legendary Creature", "Sphinx", "HOU", "Mythic Rare", 52, 65581) 64 | UnquenchableThirst = Card("unquenchable_thirst", "Unquenchable Thirst", ['1', 'U'], ['U'], "Enchantment", "Aura", "HOU", "Common", 53, 65583) 65 | Unsummon = Card("unsummon", "Unsummon", ['U'], ['U'], "Instant", "", "HOU", "Common", 54, 65585) 66 | VizieroftheAnointed = Card("vizier_of_the_anointed", "Vizier of the Anointed", ['3', 'U'], ['U'], "Creature", "Human Cleric", "HOU", "Uncommon", 55, 65587) 67 | AccursedHorde = Card("accursed_horde", "Accursed Horde", ['3', 'B'], ['B'], "Creature", "Zombie", "HOU", "Uncommon", 56, 65589) 68 | AmmitEternal = Card("ammit_eternal", "Ammit Eternal", ['2', 'B'], ['B'], "Creature", "Zombie Crocodile Demon", "HOU", "Rare", 57, 65591) 69 | # mixup start 70 | ApocalypseDemon = Card("apocalypse_demon", "Apocalypse Demon", ['4', 'B', 'B'], ['B'], "Creature", "Demon", "HOU", "Rare", 58, 65595) 71 | BanewhipPunisher = Card("banewhip_punisher", "Banewhip Punisher", ['2', 'B'], ['B'], "Creature", "Human Warrior", "HOU", "Uncommon", 59, 65593) 72 | # mixup end 73 | BontusLastReckoning = Card("bontus_last_reckoning", "Bontu's Last Reckoning", ['1', 'B', 'B'], ['B'], "Sorcery", "", "HOU", "Rare", 60, 65597) 74 | CarrionScreecher = Card("carrion_screecher", "Carrion Screecher", ['3', 'B'], ['B'], "Creature", "Zombie Bird", "HOU", "Common", 61, 65599) 75 | Doomfall = Card("doomfall", "Doomfall", ['2', 'B'], ['B'], "Sorcery", "", "HOU", "Uncommon", 62, 65601) 76 | Dreamstealer = Card("dreamstealer", "Dreamstealer", ['2', 'B'], ['B'], "Creature", "Human Wizard", "HOU", "Rare", 63, 65603) 77 | GrislySurvivor = Card("grisly_survivor", "Grisly Survivor", ['2', 'B'], ['B'], "Creature", "Minotaur Warrior", "HOU", "Common", 64, 65605) 78 | HourofGlory = Card("hour_of_glory", "Hour of Glory", ['3', 'B'], ['B'], "Instant", "", "HOU", "Rare", 65, 65607) 79 | KhenraEternal = Card("khenra_eternal", "Khenra Eternal", ['1', 'B'], ['B'], "Creature", "Zombie Jackal Warrior", "HOU", "Common", 66, 65609) 80 | LethalSting = Card("lethal_sting", "Lethal Sting", ['2', 'B'], ['B'], "Sorcery", "", "HOU", "Common", 67, 65611) 81 | LilianasDefeat = Card("lilianas_defeat", "Liliana's Defeat", ['B'], ['B'], "Sorcery", "", "HOU", "Uncommon", 68, 65613) 82 | LurchingRotbeast = Card("lurching_rotbeast", "Lurching Rotbeast", ['3', 'B'], ['B'], "Creature", "Zombie Beast", "HOU", "Common", 69, 65615) 83 | MaraudingBoneslasher = Card("marauding_boneslasher", "Marauding Boneslasher", ['2', 'B'], ['B'], "Creature", "Zombie Minotaur", "HOU", "Common", 70, 65617) 84 | MercilessEternal = Card("merciless_eternal", "Merciless Eternal", ['2', 'B'], ['B'], "Creature", "Zombie Cleric", "HOU", "Uncommon", 71, 65619) 85 | MoaningWall = Card("moaning_wall", "Moaning Wall", ['2', 'B'], ['B'], "Creature", "Zombie Wall", "HOU", "Common", 72, 65621) 86 | RazakeththeFoulblooded = Card("razaketh_the_foulblooded", "Razaketh, the Foulblooded", ['5', 'B', 'B', 'B'], ['B'], "Legendary Creature", "Demon", "HOU", "Mythic Rare", 73, 65623) 87 | RazakethsRite = Card("razakeths_rite", "Razaketh's Rite", ['3', 'B', 'B'], ['B'], "Sorcery", "", "HOU", "Uncommon", 74, 65625) 88 | RuinRat = Card("ruin_rat", "Ruin Rat", ['1', 'B'], ['B'], "Creature", "Rat", "HOU", "Common", 75, 65627) 89 | ScroungerofSouls = Card("scrounger_of_souls", "Scrounger of Souls", ['4', 'B'], ['B'], "Creature", "Horror", "HOU", "Common", 76, 65629) 90 | TormentofHailfire = Card("torment_of_hailfire", "Torment of Hailfire", ['X', 'B', 'B'], ['B'], "Sorcery", "", "HOU", "Rare", 77, 65631) 91 | TormentofScarabs = Card("torment_of_scarabs", "Torment of Scarabs", ['3', 'B'], ['B'], "Enchantment", "Aura Curse", "HOU", "Uncommon", 78, 65633) 92 | TormentofVenom = Card("torment_of_venom", "Torment of Venom", ['2', 'B', 'B'], ['B'], "Instant", "", "HOU", "Common", 79, 65635) 93 | VileManifestation = Card("vile_manifestation", "Vile Manifestation", ['1', 'B'], ['B'], "Creature", "Horror", "HOU", "Uncommon", 80, 65637) 94 | WithoutWeakness = Card("without_weakness", "Without Weakness", ['1', 'B'], ['B'], "Instant", "", "HOU", "Common", 81, 65639) 95 | WretchedCamel = Card("wretched_camel", "Wretched Camel", ['1', 'B'], ['B'], "Creature", "Zombie Camel", "HOU", "Common", 82, 65641) 96 | Abrade = Card("abrade", "Abrade", ['1', 'R'], ['R'], "Instant", "", "HOU", "Uncommon", 83, 65643) 97 | BlurofBlades = Card("blur_of_blades", "Blur of Blades", ['1', 'R'], ['R'], "Instant", "", "HOU", "Common", 84, 65645) 98 | BurningFistMinotaur = Card("burningfist_minotaur", "Burning-Fist Minotaur", ['1', 'R'], ['R'], "Creature", "Minotaur Wizard", "HOU", "Uncommon", 85, 65647) 99 | ChandrasDefeat = Card("chandras_defeat", "Chandra's Defeat", ['R'], ['R'], "Instant", "", "HOU", "Uncommon", 86, 65649) 100 | ChaosMaw = Card("chaos_maw", "Chaos Maw", ['5', 'R', 'R'], ['R'], "Creature", "Hellion", "HOU", "Rare", 87, 65651) 101 | CrashThrough = Card("crash_through", "Crash Through", ['R'], ['R'], "Sorcery", "", "HOU", "Common", 88, 65653) 102 | DefiantKhenra = Card("defiant_khenra", "Defiant Khenra", ['1', 'R'], ['R'], "Creature", "Jackal Warrior", "HOU", "Common", 89, 65655) 103 | EarthshakerKhenra = Card("earthshaker_khenra", "Earthshaker Khenra", ['1', 'R'], ['R'], "Creature", "Jackal Warrior", "HOU", "Rare", 90, 65657) 104 | FerventPaincaster = Card("fervent_paincaster", "Fervent Paincaster", ['2', 'R'], ['R'], "Creature", "Human Wizard", "HOU", "Uncommon", 91, 65659) 105 | FirebrandArcher = Card("firebrand_archer", "Firebrand Archer", ['1', 'R'], ['R'], "Creature", "Human Archer", "HOU", "Common", 92, 65661) 106 | FrontlineDevastator = Card("frontline_devastator", "Frontline Devastator", ['3', 'R'], ['R'], "Creature", "Zombie Minotaur Warrior", "HOU", "Common", 93, 65663) 107 | InfernoJet = Card("inferno_jet", "Inferno Jet", ['5', 'R'], ['R'], "Sorcery", "", "HOU", "Uncommon", 99, 65673) 108 | KhenraScrapper = Card("khenra_scrapper", "Khenra Scrapper", ['2', 'R'], ['R'], "Creature", "Jackal Warrior", "HOU", "Common", 100, 65675) 109 | KindledFury = Card("kindled_fury", "Kindled Fury", ['R'], ['R'], "Instant", "", "HOU", "Common", 101, 65677) 110 | Magmaroth = Card("magmaroth", "Magmaroth", ['3', 'R'], ['R'], "Creature", "Elemental", "HOU", "Uncommon", 102, 65679) 111 | # mixup start 112 | ThornedMoloch = Card("thorned_moloch", "Thorned Moloch", ['2', 'R'], ['R'], "Creature", "Lizard", "HOU", "Common", 108, 65665) 113 | HazoretsUndyingFury = Card("hazorets_undying_fury", "Hazoret's Undying Fury", ['4', 'R', 'R'], ['R'], "Sorcery", "", "HOU", "Rare", 96, 65667) 114 | HourofDevastation = Card("hour_of_devastation", "Hour of Devastation", ['3', 'R', 'R'], ['R'], "Sorcery", "", "HOU", "Rare", 97, 65669) 115 | ImminentDoom = Card("imminent_doom", "Imminent Doom", ['2', 'R'], ['R'], "Enchantment", "", "HOU", "Rare", 98, 65671) 116 | ManticoreEternal = Card("manticore_eternal", "Manticore Eternal", ['3', 'R', 'R'], ['R'], "Creature", "Zombie Manticore", "HOU", "Uncommon", 103, 65681) 117 | NehebtheEternal = Card("neheb_the_eternal", "Neheb, the Eternal", ['3', 'R', 'R'], ['R'], "Legendary Creature", "Zombie Minotaur Warrior", "HOU", "Mythic Rare", 104, 65683) 118 | OpenFire = Card("open_fire", "Open Fire", ['2', 'R'], ['R'], "Instant", "", "HOU", "Common", 105, 65685) 119 | PuncturingBlow = Card("puncturing_blow", "Puncturing Blow", ['2', 'R', 'R'], ['R'], "Sorcery", "", "HOU", "Common", 106, 65687) 120 | SandStrangler = Card("sand_strangler", "Sand Strangler", ['3', 'R'], ['R'], "Creature", "Beast", "HOU", "Uncommon", 107, 65689) 121 | GraniticTitan = Card("granitic_titan", "Granitic Titan", ['4', 'R', 'R'], ['R'], "Creature", "Elemental", "HOU", "Common", 95, 65691) 122 | GildedCerodon = Card("gilded_cerodon", "Gilded Cerodon", ['4', 'R'], ['R'], "Creature", "Beast", "HOU", "Common", 94, 65693) 123 | WildfireEternal = Card("wildfire_eternal", "Wildfire Eternal", ['3', 'R'], ['R'], "Creature", "Zombie Jackal Cleric", "HOU", "Rare", 109, 65695) 124 | Ambuscade = Card("ambuscade", "Ambuscade", ['2', 'G'], ['G'], "Instant", "", "HOU", "Common", 110, 65697) 125 | BeneaththeSands = Card("beneath_the_sands", "Beneath the Sands", ['2', 'G'], ['G'], "Sorcery", "", "HOU", "Common", 111, 65699) 126 | BitterbowSharpshooters = Card("bitterbow_sharpshooters", "Bitterbow Sharpshooters", ['4', 'G'], ['G'], "Creature", "Jackal Archer", "HOU", "Common", 112, 65701) 127 | DevoteeofStrength = Card("devotee_of_strength", "Devotee of Strength", ['2', 'G'], ['G'], "Creature", "Naga Wizard", "HOU", "Uncommon", 113, 65703) 128 | DuneDiviner = Card("dune_diviner", "Dune Diviner", ['2', 'G'], ['G'], "Creature", "Naga Cleric", "HOU", "Uncommon", 114, 65705) 129 | FeralProwler = Card("feral_prowler", "Feral Prowler", ['1', 'G'], ['G'], "Creature", "Cat", "HOU", "Common", 115, 65707) 130 | FrilledSandwalla = Card("frilled_sandwalla", "Frilled Sandwalla", ['G'], ['G'], "Creature", "Lizard", "HOU", "Common", 116, 65709) 131 | GiftofStrength = Card("gift_of_strength", "Gift of Strength", ['1', 'G'], ['G'], "Instant", "", "HOU", "Common", 117, 65711) 132 | HarrierNaga = Card("harrier_naga", "Harrier Naga", ['2', 'G'], ['G'], "Creature", "Naga Warrior", "HOU", "Common", 118, 65713) 133 | HopeTender = Card("hope_tender", "Hope Tender", ['1', 'G'], ['G'], "Creature", "Human Druid", "HOU", "Uncommon", 119, 65717) 134 | HourofPromise = Card("hour_of_promise", "Hour of Promise", ['4', 'G'], ['G'], "Sorcery", "", "HOU", "Rare", 120, 65715) 135 | LifeGoesOn = Card("life_goes_on", "Life Goes On", ['G'], ['G'], "Instant", "", "HOU", "Common", 121, 65719) 136 | MajesticMyriarch = Card("majestic_myriarch", "Majestic Myriarch", ['4', 'G'], ['G'], "Creature", "Chimera", "HOU", "Mythic Rare", 122, 65721) 137 | NissasDefeat = Card("nissas_defeat", "Nissa's Defeat", ['2', 'G'], ['G'], "Sorcery", "", "HOU", "Uncommon", 123, 65723) 138 | OasisRitualist = Card("oasis_ritualist", "Oasis Ritualist", ['3', 'G'], ['G'], "Creature", "Naga Druid", "HOU", "Common", 124, 65725) 139 | Overcome = Card("overcome", "Overcome", ['3', 'G', 'G'], ['G'], "Sorcery", "", "HOU", "Uncommon", 125, 65727) 140 | PrideSovereign = Card("pride_sovereign", "Pride Sovereign", ['2', 'G'], ['G', 'W'], "Creature", "Cat", "HOU", "Rare", 126, 65729) 141 | QuarryBeetle = Card("quarry_beetle", "Quarry Beetle", ['4', 'G'], ['G'], "Creature", "Insect", "HOU", "Uncommon", 127, 65731) 142 | RampagingHippo = Card("rampaging_hippo", "Rampaging Hippo", ['4', 'G', 'G'], ['G'], "Creature", "Hippo", "HOU", "Common", 128, 65733) 143 | RamunapExcavator = Card("ramunap_excavator", "Ramunap Excavator", ['2', 'G'], ['G'], "Creature", "Naga Cleric", "HOU", "Rare", 129, 65735) 144 | RamunapHydra = Card("ramunap_hydra", "Ramunap Hydra", ['3', 'G'], ['G'], "Creature", "Snake Hydra", "HOU", "Rare", 130, 65737) 145 | ResilientKhenra = Card("resilient_khenra", "Resilient Khenra", ['1', 'G'], ['G'], "Creature", "Jackal Wizard", "HOU", "Rare", 131, 65739) 146 | RhonassLastStand = Card("rhonass_last_stand", "Rhonas's Last Stand", ['G', 'G'], ['G'], "Sorcery", "", "HOU", "Rare", 132, 65741) 147 | RhonassStalwart = Card("rhonass_stalwart", "Rhonas's Stalwart", ['1', 'G'], ['G'], "Creature", "Human Warrior", "HOU", "Common", 133, 65743) 148 | SidewinderNaga = Card("sidewinder_naga", "Sidewinder Naga", ['2', 'G'], ['G'], "Creature", "Naga Warrior", "HOU", "Common", 134, 65745) 149 | SifterWurm = Card("sifter_wurm", "Sifter Wurm", ['5', 'G', 'G'], ['G'], "Creature", "Wurm", "HOU", "Uncommon", 135, 65747) 150 | TenaciousHunter = Card("tenacious_hunter", "Tenacious Hunter", ['2', 'G', 'G'], ['G'], "Creature", "Crocodile", "HOU", "Uncommon", 136, 65749) 151 | UncagetheMenagerie = Card("uncage_the_menagerie", "Uncage the Menagerie", ['X', 'G', 'G'], ['G'], "Sorcery", "", "HOU", "Mythic Rare", 137, 65751) 152 | BloodwaterEntity = Card("bloodwater_entity", "Bloodwater Entity", ['1', 'U', 'R'], ['U', 'R'], "Creature", "Elemental", "HOU", "Uncommon", 138, 65753) 153 | # START God mixup 154 | TheScorpionGod = Card("the_scorpion_god", "The Scorpion God", ['3', 'B', 'R'], ['B', 'R'], "Legendary Creature", "God", "HOU", "Mythic Rare", 146, 65755) # WRONG: was 65769 155 | TheLocustGod = Card("the_locust_god", "The Locust God", ['4', 'U', 'R'], ['U', 'R'], "Legendary Creature", "God", "HOU", "Mythic Rare", 139, 65757) # WRONG: was 65755 156 | NicolBolasGodPharaoh = Card("nicol_bolas_godpharaoh", "Nicol Bolas, God-Pharaoh", ['4', 'U', 'B', 'R'], ['U', 'B', 'R'], "Legendary Planeswalker", "Bolas", "HOU", "Mythic Rare", 140, 65759) # WRONG: was 65757 157 | ObeliskSpider = Card("obelisk_spider", "Obelisk Spider", ['1', 'B', 'G'], ['B', 'G'], "Creature", "Spider", "HOU", "Uncommon", 141, 65761) # WRONG: was 65759 158 | ResoluteSurvivors = Card("resolute_survivors", "Resolute Survivors", ['1', 'R', 'W'], ['W', 'R'], "Creature", "Human Warrior", "HOU", "Uncommon", 142, 65763) # WRONG: was 65761 159 | RiverHoopoe = Card("river_hoopoe", "River Hoopoe", ['G', 'U'], ['U', 'G'], "Creature", "Bird", "HOU", "Uncommon", 143, 65765) # WRONG: was 65763 160 | SamuttheTested = Card("samut_the_tested", "Samut, the Tested", ['2', 'R', 'G'], ['R', 'G'], "Legendary Planeswalker", "Samut", "HOU", "Mythic Rare", 144, 65767) # WRONG: was 65765 161 | TheScarabGod = Card("the_scarab_god", "The Scarab God", ['3', 'U', 'B'], ['U', 'B'], "Legendary Creature", "God", "HOU", "Mythic Rare", 145, 65769) # WRONG: was 65767 162 | # END God mixup 163 | UnravelingMummy = Card("unraveling_mummy", "Unraveling Mummy", ['1', 'W', 'B'], ['W', 'B'], "Creature", "Zombie", "HOU", "Uncommon", 147, 65771) 164 | Farm = Card("farm", "Farm", ['2', 'W'], ['U', 'W'], "Instant", "", "HOU", "Uncommon", 148, 65773) 165 | Market = Card("market", "Market", ['2', 'U'], ['U', 'W'], "Sorcery", "", "HOU", "Uncommon", 148, 65776) 166 | Consign = Card("consign", "Consign", ['1', 'U'], ['B', 'U'], "Instant", "", "HOU", "Uncommon", 149, 65779) 167 | Oblivion = Card("oblivion", "Oblivion", ['4', 'B'], ['B', 'U'], "Sorcery", "", "HOU", "Uncommon", 149, 65782) 168 | Claim = Card("claim", "Claim", ['B'], ['R', 'B'], "Sorcery", "", "HOU", "Uncommon", 150, 65785) 169 | Fame = Card("fame", "Fame", ['1', 'R'], ['R', 'B'], "Sorcery", "", "HOU", "Uncommon", 150, 65788) 170 | Struggle = Card("struggle", "Struggle", ['2', 'R'], ['G', 'R'], "Instant", "", "HOU", "Uncommon", 151, 65791) 171 | Survive = Card("survive", "Survive", ['1', 'G'], ['G', 'R'], "Sorcery", "", "HOU", "Uncommon", 151, 65794) 172 | Appeal = Card("appeal", "Appeal", ['G'], ['W', 'G'], "Sorcery", "", "HOU", "Uncommon", 152, 65797) 173 | Authority = Card("authority", "Authority", ['1', 'W'], ['W', 'G'], "Sorcery", "", "HOU", "Uncommon", 152, 65800) 174 | Leave = Card("leave", "Leave", ['1', 'W'], ['W', 'R'], "Instant", "", "HOU", "Rare", 153, 65803) 175 | Chance = Card("chance", "Chance", ['3', 'R'], ['W', 'R'], "Sorcery", "", "HOU", "Rare", 153, 65806) 176 | Reason = Card("reason", "Reason", ['U'], ['U', 'G'], "Sorcery", "", "HOU", "Rare", 154, 65809) 177 | Believe = Card("believe", "Believe", ['4', 'G'], ['U', 'G'], "Sorcery", "", "HOU", "Rare", 154, 65812) 178 | Grind = Card("grind", "Grind", ['1', 'B'], ['B', 'W'], "Sorcery", "", "HOU", "Rare", 155, 65815) 179 | Dust = Card("dust", "Dust", ['3', 'W'], ['B', 'W'], "Sorcery", "", "HOU", "Rare", 155, 65818) 180 | Refuse = Card("refuse", "Refuse", ['3', 'R'], ['R', 'U'], "Instant", "", "HOU", "Rare", 156, 65821) 181 | Cooperate = Card("cooperate", "Cooperate", ['2', 'U'], ['R', 'U'], "Instant", "", "HOU", "Rare", 156, 65824) 182 | Driven = Card("driven", "Driven", ['1', 'G'], ['G', 'B'], "Sorcery", "", "HOU", "Rare", 157, 65827) 183 | Despair = Card("despair", "Despair", ['1', 'B'], ['G', 'B'], "Sorcery", "", "HOU", "Rare", 157, 65830) 184 | AbandonedSarcophagus = Card("abandoned_sarcophagus", "Abandoned Sarcophagus", ['3'], [], "Artifact", "", "HOU", "Rare", 158, 65833) 185 | CrookofCondemnation = Card("crook_of_condemnation", "Crook of Condemnation", ['2'], [], "Artifact", "", "HOU", "Uncommon", 159, 65835) 186 | DaggeroftheWorthy = Card("dagger_of_the_worthy", "Dagger of the Worthy", ['2'], [], "Artifact", "Equipment", "HOU", "Uncommon", 160, 65837) 187 | GodPharaohsGift = Card("godpharaohs_gift", "God-Pharaoh's Gift", ['7'], [], "Artifact", "", "HOU", "Rare", 161, 65839) 188 | GravenAbomination = Card("graven_abomination", "Graven Abomination", ['3'], [], "Artifact Creature", "Horror", "HOU", "Common", 162, 65841) 189 | HollowOne = Card("hollow_one", "Hollow One", ['5'], [], "Artifact Creature", "Golem", "HOU", "Rare", 163, 65843) 190 | Manalith = Card("manalith", "Manalith", ['3'], [], "Artifact", "", "HOU", "Common", 164, 65845) 191 | MirageMirror = Card("mirage_mirror", "Mirage Mirror", ['3'], [], "Artifact", "", "HOU", "Rare", 165, 65847) 192 | SunsetPyramid = Card("sunset_pyramid", "Sunset Pyramid", ['2'], [], "Artifact", "", "HOU", "Uncommon", 166, 65849) 193 | TravelersAmulet = Card("travelers_amulet", "Traveler's Amulet", ['1'], [], "Artifact", "", "HOU", "Common", 167, 65851) 194 | WallofForgottenPharaohs = Card("wall_of_forgotten_pharaohs", "Wall of Forgotten Pharaohs", ['2'], [], "Artifact Creature", "Wall", "HOU", "Common", 168, 65853) 195 | # wat 196 | CryptoftheEternals = Card("crypt_of_the_eternals", "Crypt of the Eternals", [], ['U', 'B', 'R'], "Land", "", "HOU", "Uncommon", 169, 65959) 197 | # end wat 198 | DesertoftheFervent = Card("desert_of_the_fervent", "Desert of the Fervent", [], ['R'], "Land", "Desert", "HOU", "Common", 170, 65857) 199 | DesertoftheGlorified = Card("desert_of_the_glorified", "Desert of the Glorified", [], ['B'], "Land", "Desert", "HOU", "Common", 171, 65859) 200 | DesertoftheIndomitable = Card("desert_of_the_indomitable", "Desert of the Indomitable", [], ['G'], "Land", "Desert", "HOU", "Common", 172, 65861) 201 | DesertoftheMindful = Card("desert_of_the_mindful", "Desert of the Mindful", [], ['U'], "Land", "Desert", "HOU", "Common", 173, 65863) 202 | DesertoftheTrue = Card("desert_of_the_true", "Desert of the True", [], ['W'], "Land", "Desert", "HOU", "Common", 174, 65865) 203 | DunesoftheDead = Card("dunes_of_the_dead", "Dunes of the Dead", [], [], "Land", "Desert", "HOU", "Uncommon", 175, 65867) 204 | EndlessSands = Card("endless_sands", "Endless Sands", [], [], "Land", "Desert", "HOU", "Rare", 176, 65869) 205 | HashepOasis = Card("hashep_oasis", "Hashep Oasis", [], ['G'], "Land", "Desert", "HOU", "Uncommon", 177, 65871) 206 | HostileDesert = Card("hostile_desert", "Hostile Desert", [], [], "Land", "Desert", "HOU", "Rare", 178, 65873) 207 | IfnirDeadlands = Card("ifnir_deadlands", "Ifnir Deadlands", [], ['B'], "Land", "Desert", "HOU", "Uncommon", 179, 65875) 208 | IpnuRivulet = Card("ipnu_rivulet", "Ipnu Rivulet", [], ['U'], "Land", "Desert", "HOU", "Uncommon", 180, 65877) 209 | RamunapRuins = Card("ramunap_ruins", "Ramunap Ruins", [], ['R'], "Land", "Desert", "HOU", "Uncommon", 181, 65879) 210 | ScavengerGrounds = Card("scavenger_grounds", "Scavenger Grounds", [], [], "Land", "Desert", "HOU", "Rare", 182, 65881) 211 | ShefetDunes = Card("shefet_dunes", "Shefet Dunes", [], ['W'], "Land", "Desert", "HOU", "Uncommon", 183, 65883) 212 | SurvivorsEncampment = Card("survivors_encampment", "Survivors' Encampment", [], [], "Land", "Desert", "HOU", "Common", 184, 65885) 213 | Plains = Card("plains", "Plains", [], ['W'], "Basic Land", "Plains", "HOU", "Basic Land", 185, 65887) 214 | Island = Card("island", "Island", [], ['U'], "Basic Land", "Island", "HOU", "Basic Land", 186, 65889) 215 | Swamp = Card("swamp", "Swamp", [], ['B'], "Basic Land", "Swamp", "HOU", "Basic Land", 187, 65891) 216 | Mountain = Card("mountain", "Mountain", [], ['R'], "Basic Land", "Mountain", "HOU", "Basic Land", 188, 65893) 217 | Forest = Card("forest", "Forest", [], ['G'], "Basic Land", "Forest", "HOU", "Basic Land", 189, 65895) 218 | Plains2 = Card("plains", "Plains", [], ['W'], "Basic Land", "Plains", "HOU", "Basic Land", 190, 65897) 219 | Plains3 = Card("plains", "Plains", [], ['W'], "Basic Land", "Plains", "HOU", "Basic Land", 191, 65899) 220 | Island2 = Card("island", "Island", [], ['U'], "Basic Land", "Island", "HOU", "Basic Land", 192, 65901) 221 | Island3 = Card("island", "Island", [], ['U'], "Basic Land", "Island", "HOU", "Basic Land", 193, 65903) 222 | Swamp2 = Card("swamp", "Swamp", [], ['B'], "Basic Land", "Swamp", "HOU", "Basic Land", 194, 65905) 223 | Swamp3 = Card("swamp", "Swamp", [], ['B'], "Basic Land", "Swamp", "HOU", "Basic Land", 195, 65907) 224 | Mountain2 = Card("mountain", "Mountain", [], ['R'], "Basic Land", "Mountain", "HOU", "Basic Land", 196, 65909) 225 | Mountain3 = Card("mountain", "Mountain", [], ['R'], "Basic Land", "Mountain", "HOU", "Basic Land", 197, 65911) 226 | Forest2 = Card("forest", "Forest", [], ['G'], "Basic Land", "Forest", "HOU", "Basic Land", 198, 65913) 227 | Forest3 = Card("forest", "Forest", [], ['G'], "Basic Land", "Forest", "HOU", "Basic Land", 199, 65915) 228 | # start mixup 229 | NissaGenesisMage = Card("nissa_genesis_mage", "Nissa, Genesis Mage", ['5', 'G', 'G'], ['G'], "Legendary Planeswalker", "Nissa", "HOU", "Mythic Rare", 200, 65937) 230 | AvidReclaimer = Card("avid_reclaimer", "Avid Reclaimer", ['2', 'G'], ['G', 'U'], "Creature", "Human Druid", "HOU", "Uncommon", 201, 65939) 231 | BrambleweftBehemoth = Card("brambleweft_behemoth", "Brambleweft Behemoth", ['4', 'G', 'G'], ['G'], "Creature", "Elemental", "HOU", "Common", 202, 65941) 232 | NissasEncouragement = Card("nissas_encouragement", "Nissa's Encouragement", ['4', 'G'], ['G'], "Sorcery", "", "HOU", "Rare", 203, 65943) 233 | WoodlandStream = Card("woodland_stream", "Woodland Stream", [], ['G', 'U'], "Land", "", "HOU", "Common", 204, 65945) 234 | NicolBolastheDeceiver = Card("nicol_bolas_the_deceiver", "Nicol Bolas, the Deceiver", ['5', 'U', 'B', 'R'], ['U', 'B', 'R'], "Legendary Planeswalker", "Bolas", "HOU", "Mythic Rare", 205, 65947) 235 | WaspoftheBitterEnd = Card("wasp_of_the_bitter_end", "Wasp of the Bitter End", ['1', 'B'], ['B'], "Creature", "Insect Horror", "HOU", "Uncommon", 206, 65949) 236 | ZealotoftheGodPharaoh = Card("zealot_of_the_godpharaoh", "Zealot of the God-Pharaoh", ['3', 'R'], ['R'], "Creature", "Minotaur Archer", "HOU", "Common", 207, 65951) 237 | VisageofBolas = Card("visage_of_bolas", "Visage of Bolas", ['4'], ['U', 'B', 'R'], "Artifact", "", "HOU", "Rare", 208, 65953) 238 | CinderBarrens = Card("cinder_barrens", "Cinder Barrens", [], ['B', 'R'], "Land", "", "HOU", "Common", 209, 65955) 239 | # end mixup 240 | 241 | clsmembers = [card for name, card in inspect.getmembers(sys.modules[__name__]) if isinstance(card, Card)] 242 | HourOfDevastation = Set("hour_of_devastation", cards=clsmembers) 243 | 244 | -------------------------------------------------------------------------------- /source/mtga/set_data/kld.py: -------------------------------------------------------------------------------- 1 | """ WARNING! These cards are no longer in MTGA! This file is likely incorrect, and is left only for reference. 2 | 3 | """ 4 | 5 | import sys 6 | from mtga.models.card import Card 7 | from mtga.models.card_set import Set 8 | import inspect 9 | 10 | 11 | AcrobaticManeuver = Card("acrobatic_maneuver", "Acrobatic Maneuver", ['2', 'W'], ['W'], "Instant", "", "KLD", "Common", 1, 63641) 12 | AerialResponder = Card("aerial_responder", "Aerial Responder", ['1', 'W', 'W'], ['W'], "Creature", "Dwarf Soldier", "KLD", "Uncommon", 2, 63643) 13 | AetherstormRoc = Card("aetherstorm_roc", "Aetherstorm Roc", ['2', 'W', 'W'], ['W'], "Creature", "Bird", "KLD", "Rare", 3, 63645) 14 | AngelofInvention = Card("angel_of_invention", "Angel of Invention", ['3', 'W', 'W'], ['W'], "Creature", "Angel", "KLD", "Mythic Rare", 4, 63647) 15 | AuthorityoftheConsuls = Card("authority_of_the_consuls", "Authority of the Consuls", ['W'], ['W'], "Enchantment", "", "KLD", "Rare", 5, 63649) 16 | AviaryMechanic = Card("aviary_mechanic", "Aviary Mechanic", ['1', 'W'], ['W'], "Creature", "Dwarf Artificer", "KLD", "Common", 6, 63651) 17 | BuilttoLast = Card("built_to_last", "Built to Last", ['W'], ['W'], "Instant", "", "KLD", "Common", 7, 63653) 18 | CapturedbytheConsulate = Card("captured_by_the_consulate", "Captured by the Consulate", ['3', 'W'], ['W'], "Enchantment", "Aura", "KLD", "Rare", 8, 63655) 19 | CataclysmicGearhulk = Card("cataclysmic_gearhulk", "Cataclysmic Gearhulk", ['3', 'W', 'W'], ['W'], "Artifact Creature", "Construct", "KLD", "Mythic Rare", 9, 63657) 20 | ConsulateSurveillance = Card("consulate_surveillance", "Consulate Surveillance", ['3', 'W'], ['W'], "Enchantment", "", "KLD", "Uncommon", 10, 63659) 21 | ConsulsShieldguard = Card("consuls_shieldguard", "Consul's Shieldguard", ['3', 'W'], ['W'], "Creature", "Dwarf Soldier", "KLD", "Uncommon", 11, 63661) 22 | EddytrailHawk = Card("eddytrail_hawk", "Eddytrail Hawk", ['1', 'W'], ['W'], "Creature", "Bird", "KLD", "Common", 12, 63663) 23 | FairgroundsWarden = Card("fairgrounds_warden", "Fairgrounds Warden", ['2', 'W'], ['W'], "Creature", "Dwarf Soldier", "KLD", "Uncommon", 13, 63665) 24 | Fragmentize = Card("fragmentize", "Fragmentize", ['W'], ['W'], "Sorcery", "", "KLD", "Common", 14, 63667) 25 | Fumigate = Card("fumigate", "Fumigate", ['3', 'W', 'W'], ['W'], "Sorcery", "", "KLD", "Rare", 15, 63669) 26 | GearshiftAce = Card("gearshift_ace", "Gearshift Ace", ['1', 'W'], ['W'], "Creature", "Dwarf Pilot", "KLD", "Uncommon", 16, 63671) 27 | GlintSleeveArtisan = Card("glintsleeve_artisan", "Glint-Sleeve Artisan", ['2', 'W'], ['W'], "Creature", "Dwarf Artificer", "KLD", "Common", 17, 63673) 28 | HeraldoftheFair = Card("herald_of_the_fair", "Herald of the Fair", ['2', 'W'], ['W'], "Creature", "Human", "KLD", "Common", 18, 63675) 29 | ImpeccableTiming = Card("impeccable_timing", "Impeccable Timing", ['1', 'W'], ['W'], "Instant", "", "KLD", "Common", 19, 63677) 30 | InspiredCharge = Card("inspired_charge", "Inspired Charge", ['2', 'W', 'W'], ['W'], "Instant", "", "KLD", "Common", 20, 63679) 31 | MasterTrinketeer = Card("master_trinketeer", "Master Trinketeer", ['2', 'W'], ['W'], "Creature", "Dwarf Artificer", "KLD", "Rare", 21, 63681) 32 | NinthBridgePatrol = Card("ninth_bridge_patrol", "Ninth Bridge Patrol", ['1', 'W'], ['W'], "Creature", "Dwarf Soldier", "KLD", "Common", 22, 63683) 33 | PressurePoint = Card("pressure_point", "Pressure Point", ['1', 'W'], ['W'], "Instant", "", "KLD", "Common", 23, 63685) 34 | PropellerPioneer = Card("propeller_pioneer", "Propeller Pioneer", ['3', 'W'], ['W'], "Creature", "Human Artificer", "KLD", "Common", 24, 63687) 35 | Refurbish = Card("refurbish", "Refurbish", ['3', 'W'], ['W'], "Sorcery", "", "KLD", "Uncommon", 25, 63689) 36 | RevokePrivileges = Card("revoke_privileges", "Revoke Privileges", ['2', 'W'], ['W'], "Enchantment", "Aura", "KLD", "Common", 26, 63691) 37 | ServoExhibition = Card("servo_exhibition", "Servo Exhibition", ['1', 'W'], ['W'], "Sorcery", "", "KLD", "Uncommon", 27, 63693) 38 | SkyswirlHarrier = Card("skyswirl_harrier", "Skyswirl Harrier", ['4', 'W'], ['W'], "Creature", "Bird", "KLD", "Common", 28, 63695) 39 | SkywhalersShot = Card("skywhalers_shot", "Skywhaler's Shot", ['2', 'W'], ['W'], "Instant", "", "KLD", "Uncommon", 29, 63697) 40 | TasseledDromedary = Card("tasseled_dromedary", "Tasseled Dromedary", ['W'], ['W'], "Creature", "Camel", "KLD", "Common", 30, 63699) 41 | ThrivingIbex = Card("thriving_ibex", "Thriving Ibex", ['3', 'W'], ['W'], "Creature", "Goat", "KLD", "Common", 31, 63701) 42 | ToolcraftExemplar = Card("toolcraft_exemplar", "Toolcraft Exemplar", ['W'], ['W'], "Creature", "Dwarf Artificer", "KLD", "Rare", 32, 63703) 43 | TrustyCompanion = Card("trusty_companion", "Trusty Companion", ['1', 'W'], ['W'], "Creature", "Hyena", "KLD", "Uncommon", 33, 63705) 44 | VisionaryAugmenter = Card("visionary_augmenter", "Visionary Augmenter", ['2', 'W', 'W'], ['W'], "Creature", "Dwarf Artificer", "KLD", "Uncommon", 34, 63707) 45 | WispweaverAngel = Card("wispweaver_angel", "Wispweaver Angel", ['4', 'W', 'W'], ['W'], "Creature", "Angel", "KLD", "Uncommon", 35, 63709) 46 | AetherMeltdown = Card("aether_meltdown", "Aether Meltdown", ['1', 'U'], ['U'], "Enchantment", "Aura", "KLD", "Uncommon", 36, 63711) 47 | AetherTheorist = Card("aether_theorist", "Aether Theorist", ['1', 'U'], ['U'], "Creature", "Vedalken Rogue", "KLD", "Common", 37, 63713) 48 | AetherTradewinds = Card("aether_tradewinds", "Aether Tradewinds", ['2', 'U'], ['U'], "Instant", "", "KLD", "Common", 38, 63715) 49 | AethersquallAncient = Card("aethersquall_ancient", "Aethersquall Ancient", ['5', 'U', 'U'], ['U'], "Creature", "Leviathan", "KLD", "Rare", 39, 63717) 50 | CeremoniousRejection = Card("ceremonious_rejection", "Ceremonious Rejection", ['U'], ['U'], "Instant", "", "KLD", "Uncommon", 40, 63719) 51 | ConfiscationCoup = Card("confiscation_coup", "Confiscation Coup", ['3', 'U', 'U'], ['U'], "Sorcery", "", "KLD", "Rare", 41, 63721) 52 | CurioVendor = Card("curio_vendor", "Curio Vendor", ['1', 'U'], ['U'], "Creature", "Vedalken", "KLD", "Common", 42, 63723) 53 | DisappearingAct = Card("disappearing_act", "Disappearing Act", ['1', 'U', 'U'], ['U'], "Instant", "", "KLD", "Uncommon", 43, 63725) 54 | DramaticReversal = Card("dramatic_reversal", "Dramatic Reversal", ['1', 'U'], ['U'], "Instant", "", "KLD", "Common", 44, 63727) 55 | EraofInnovation = Card("era_of_innovation", "Era of Innovation", ['1', 'U'], ['U'], "Enchantment", "", "KLD", "Uncommon", 45, 63729) 56 | ExperimentalAviator = Card("experimental_aviator", "Experimental Aviator", ['3', 'U', 'U'], ['U'], "Creature", "Human Artificer", "KLD", "Uncommon", 46, 63731) 57 | FailedInspection = Card("failed_inspection", "Failed Inspection", ['2', 'U', 'U'], ['U'], "Instant", "", "KLD", "Common", 47, 63733) 58 | GearseekerSerpent = Card("gearseeker_serpent", "Gearseeker Serpent", ['5', 'U', 'U'], ['U'], "Creature", "Serpent", "KLD", "Common", 48, 63735) 59 | GlimmerofGenius = Card("glimmer_of_genius", "Glimmer of Genius", ['3', 'U'], ['U'], "Instant", "", "KLD", "Uncommon", 49, 63737) 60 | GlintNestCrane = Card("glintnest_crane", "Glint-Nest Crane", ['1', 'U'], ['U'], "Creature", "Bird", "KLD", "Uncommon", 50, 63739) 61 | HightideHermit = Card("hightide_hermit", "Hightide Hermit", ['4', 'U'], ['U'], "Creature", "Crab", "KLD", "Common", 51, 63741) 62 | InsidiousWill = Card("insidious_will", "Insidious Will", ['2', 'U', 'U'], ['U'], "Instant", "", "KLD", "Rare", 52, 63743) 63 | JanjeetSentry = Card("janjeet_sentry", "Janjeet Sentry", ['2', 'U'], ['U'], "Creature", "Vedalken Soldier", "KLD", "Uncommon", 53, 63745) 64 | LongFinnedSkywhale = Card("longfinned_skywhale", "Long-Finned Skywhale", ['2', 'U', 'U'], ['U'], "Creature", "Whale", "KLD", "Uncommon", 54, 63747) 65 | Malfunction = Card("malfunction", "Malfunction", ['3', 'U'], ['U'], "Enchantment", "Aura", "KLD", "Common", 55, 63749) 66 | MetallurgicSummonings = Card("metallurgic_summonings", "Metallurgic Summonings", ['3', 'U', 'U'], ['U'], "Enchantment", "", "KLD", "Mythic Rare", 56, 63751) 67 | MinisterofInquiries = Card("minister_of_inquiries", "Minister of Inquiries", ['U'], ['U'], "Creature", "Vedalken Advisor", "KLD", "Uncommon", 57, 63753) 68 | NimbleInnovator = Card("nimble_innovator", "Nimble Innovator", ['3', 'U'], ['U'], "Creature", "Vedalken Artificer", "KLD", "Common", 58, 63755) 69 | PadeemConsulofInnovation = Card("padeem_consul_of_innovation", "Padeem, Consul of Innovation", ['3', 'U'], ['U'], "Legendary Creature", "Vedalken Artificer", "KLD", "Rare", 59, 63757) 70 | ParadoxicalOutcome = Card("paradoxical_outcome", "Paradoxical Outcome", ['3', 'U'], ['U'], "Instant", "", "KLD", "Rare", 60, 63759) 71 | RevolutionaryRebuff = Card("revolutionary_rebuff", "Revolutionary Rebuff", ['1', 'U'], ['U'], "Instant", "", "KLD", "Common", 61, 63761) 72 | SaheelisArtistry = Card("saheelis_artistry", "Saheeli's Artistry", ['4', 'U', 'U'], ['U'], "Sorcery", "", "KLD", "Rare", 62, 63763) 73 | SelectforInspection = Card("select_for_inspection", "Select for Inspection", ['U'], ['U'], "Instant", "", "KLD", "Common", 63, 63765) 74 | ShrewdNegotiation = Card("shrewd_negotiation", "Shrewd Negotiation", ['4', 'U'], ['U'], "Sorcery", "", "KLD", "Uncommon", 64, 63767) 75 | TezzeretsAmbition = Card("tezzerets_ambition", "Tezzeret's Ambition", ['3', 'U', 'U'], ['U'], "Sorcery", "", "KLD", "Common", 65, 63769) 76 | ThrivingTurtle = Card("thriving_turtle", "Thriving Turtle", ['U'], ['U'], "Creature", "Turtle", "KLD", "Common", 66, 63771) 77 | TorrentialGearhulk = Card("torrential_gearhulk", "Torrential Gearhulk", ['4', 'U', 'U'], ['U'], "Artifact Creature", "Construct", "KLD", "Mythic Rare", 67, 63773) 78 | VedalkenBlademaster = Card("vedalken_blademaster", "Vedalken Blademaster", ['2', 'U'], ['U'], "Creature", "Vedalken Soldier", "KLD", "Common", 68, 63775) 79 | WeldfastWingsmith = Card("weldfast_wingsmith", "Weldfast Wingsmith", ['3', 'U'], ['U'], "Creature", "Human Artificer", "KLD", "Common", 69, 63777) 80 | WindDrake = Card("wind_drake", "Wind Drake", ['2', 'U'], ['U'], "Creature", "Drake", "KLD", "Common", 70, 63779) 81 | AetherbornMarauder = Card("aetherborn_marauder", "Aetherborn Marauder", ['3', 'B'], ['B'], "Creature", "Aetherborn Rogue", "KLD", "Uncommon", 71, 63781) 82 | AmbitiousAetherborn = Card("ambitious_aetherborn", "Ambitious Aetherborn", ['4', 'B'], ['B'], "Creature", "Aetherborn Artificer", "KLD", "Common", 72, 63783) 83 | DemonofDarkSchemes = Card("demon_of_dark_schemes", "Demon of Dark Schemes", ['3', 'B', 'B', 'B'], ['B'], "Creature", "Demon", "KLD", "Mythic Rare", 73, 63785) 84 | DhundOperative = Card("dhund_operative", "Dhund Operative", ['1', 'B'], ['B'], "Creature", "Human Rogue", "KLD", "Common", 74, 63787) 85 | DiabolicTutor = Card("diabolic_tutor", "Diabolic Tutor", ['2', 'B', 'B'], ['B'], "Sorcery", "", "KLD", "Uncommon", 75, 63789) 86 | DieYoung = Card("die_young", "Die Young", ['1', 'B'], ['B'], "Sorcery", "", "KLD", "Common", 76, 63791) 87 | DukharaScavenger = Card("dukhara_scavenger", "Dukhara Scavenger", ['5', 'B'], ['B'], "Creature", "Crocodile", "KLD", "Common", 77, 63793) 88 | EliminatetheCompetition = Card("eliminate_the_competition", "Eliminate the Competition", ['4', 'B'], ['B'], "Sorcery", "", "KLD", "Rare", 78, 63795) 89 | EmbraalBruiser = Card("embraal_bruiser", "Embraal Bruiser", ['1', 'B'], ['B'], "Creature", "Human Warrior", "KLD", "Uncommon", 79, 63797) 90 | EssenceExtraction = Card("essence_extraction", "Essence Extraction", ['1', 'B', 'B'], ['B'], "Instant", "", "KLD", "Uncommon", 80, 63799) 91 | FortuitousFind = Card("fortuitous_find", "Fortuitous Find", ['2', 'B'], ['B'], "Sorcery", "", "KLD", "Common", 81, 63801) 92 | FoundryScreecher = Card("foundry_screecher", "Foundry Screecher", ['2', 'B'], ['B'], "Creature", "Bat", "KLD", "Common", 82, 63803) 93 | FretworkColony = Card("fretwork_colony", "Fretwork Colony", ['1', 'B'], ['B'], "Creature", "Insect", "KLD", "Uncommon", 83, 63805) 94 | GontiLordofLuxury = Card("gonti_lord_of_luxury", "Gonti, Lord of Luxury", ['2', 'B', 'B'], ['B'], "Legendary Creature", "Aetherborn Rogue", "KLD", "Rare", 84, 63807) 95 | HarshScrutiny = Card("harsh_scrutiny", "Harsh Scrutiny", ['B'], ['B'], "Sorcery", "", "KLD", "Uncommon", 85, 63809) 96 | LawlessBroker = Card("lawless_broker", "Lawless Broker", ['2', 'B'], ['B'], "Creature", "Aetherborn Rogue", "KLD", "Common", 86, 63811) 97 | LiveFast = Card("live_fast", "Live Fast", ['2', 'B'], ['B'], "Sorcery", "", "KLD", "Common", 87, 63813) 98 | LostLegacy = Card("lost_legacy", "Lost Legacy", ['1', 'B', 'B'], ['B'], "Sorcery", "", "KLD", "Rare", 88, 63815) 99 | MakeObsolete = Card("make_obsolete", "Make Obsolete", ['2', 'B'], ['B'], "Instant", "", "KLD", "Uncommon", 89, 63817) 100 | MarionetteMaster = Card("marionette_master", "Marionette Master", ['4', 'B', 'B'], ['B'], "Creature", "Human Artificer", "KLD", "Rare", 90, 63819) 101 | MaulfistSquad = Card("maulfist_squad", "Maulfist Squad", ['3', 'B'], ['B'], "Creature", "Human Artificer", "KLD", "Common", 91, 63821) 102 | MidnightOil = Card("midnight_oil", "Midnight Oil", ['2', 'B', 'B'], ['B'], "Enchantment", "", "KLD", "Rare", 92, 63823) 103 | MindRot = Card("mind_rot", "Mind Rot", ['2', 'B'], ['B'], "Sorcery", "", "KLD", "Common", 93, 63825) 104 | MorbidCuriosity = Card("morbid_curiosity", "Morbid Curiosity", ['1', 'B', 'B'], ['B'], "Sorcery", "", "KLD", "Uncommon", 94, 63827) 105 | NightMarketLookout = Card("night_market_lookout", "Night Market Lookout", ['B'], ['B'], "Creature", "Human Rogue", "KLD", "Common", 95, 63829) 106 | NoxiousGearhulk = Card("noxious_gearhulk", "Noxious Gearhulk", ['4', 'B', 'B'], ['B'], "Artifact Creature", "Construct", "KLD", "Mythic Rare", 96, 63831) 107 | OvalchaseDaredevil = Card("ovalchase_daredevil", "Ovalchase Daredevil", ['3', 'B'], ['B'], "Creature", "Human Pilot", "KLD", "Uncommon", 97, 63833) 108 | PrakhataClubSecurity = Card("prakhata_club_security", "Prakhata Club Security", ['3', 'B'], ['B'], "Creature", "Aetherborn Warrior", "KLD", "Common", 98, 63835) 109 | RushofVitality = Card("rush_of_vitality", "Rush of Vitality", ['1', 'B'], ['B'], "Instant", "", "KLD", "Common", 99, 63837) 110 | SubtleStrike = Card("subtle_strike", "Subtle Strike", ['1', 'B'], ['B'], "Instant", "", "KLD", "Common", 100, 63839) 111 | SyndicateTrafficker = Card("syndicate_trafficker", "Syndicate Trafficker", ['1', 'B'], ['B'], "Creature", "Aetherborn Rogue", "KLD", "Rare", 101, 63841) 112 | ThrivingRats = Card("thriving_rats", "Thriving Rats", ['1', 'B'], ['B'], "Creature", "Rat", "KLD", "Common", 102, 63843) 113 | TidyConclusion = Card("tidy_conclusion", "Tidy Conclusion", ['3', 'B', 'B'], ['B'], "Instant", "", "KLD", "Common", 103, 63845) 114 | UnderhandedDesigns = Card("underhanded_designs", "Underhanded Designs", ['1', 'B'], ['B'], "Enchantment", "", "KLD", "Uncommon", 104, 63847) 115 | WeaponcraftEnthusiast = Card("weaponcraft_enthusiast", "Weaponcraft Enthusiast", ['2', 'B'], ['B'], "Creature", "Aetherborn Artificer", "KLD", "Uncommon", 105, 63849) 116 | AethertorchRenegade = Card("aethertorch_renegade", "Aethertorch Renegade", ['2', 'R'], ['R'], "Creature", "Human Rogue", "KLD", "Uncommon", 106, 63851) 117 | BrazenScourge = Card("brazen_scourge", "Brazen Scourge", ['1', 'R', 'R'], ['R'], "Creature", "Gremlin", "KLD", "Uncommon", 107, 63853) 118 | BuilttoSmash = Card("built_to_smash", "Built to Smash", ['R'], ['R'], "Instant", "", "KLD", "Common", 108, 63855) 119 | CatharticReunion = Card("cathartic_reunion", "Cathartic Reunion", ['1', 'R'], ['R'], "Sorcery", "", "KLD", "Common", 109, 63857) 120 | ChandraTorchofDefiance = Card("chandra_torch_of_defiance", "Chandra, Torch of Defiance", ['2', 'R', 'R'], ['R'], "Legendary Planeswalker", "Chandra", "KLD", "Mythic Rare", 110, 63859) 121 | ChandrasPyrohelix = Card("chandras_pyrohelix", "Chandra's Pyrohelix", ['1', 'R'], ['R'], "Instant", "", "KLD", "Common", 111, 63861) 122 | CombustibleGearhulk = Card("combustible_gearhulk", "Combustible Gearhulk", ['4', 'R', 'R'], ['R'], "Artifact Creature", "Construct", "KLD", "Mythic Rare", 112, 63863) 123 | Demolish = Card("demolish", "Demolish", ['3', 'R'], ['R'], "Sorcery", "", "KLD", "Common", 113, 63865) 124 | FatefulShowdown = Card("fateful_showdown", "Fateful Showdown", ['2', 'R', 'R'], ['R'], "Instant", "", "KLD", "Rare", 114, 63867) 125 | FuriousReprisal = Card("furious_reprisal", "Furious Reprisal", ['3', 'R'], ['R'], "Sorcery", "", "KLD", "Uncommon", 115, 63869) 126 | GiantSpectacle = Card("giant_spectacle", "Giant Spectacle", ['1', 'R'], ['R'], "Enchantment", "Aura", "KLD", "Common", 116, 63871) 127 | HarnessedLightning = Card("harnessed_lightning", "Harnessed Lightning", ['1', 'R'], ['R'], "Instant", "", "KLD", "Uncommon", 117, 63873) 128 | Hijack = Card("hijack", "Hijack", ['1', 'R', 'R'], ['R'], "Sorcery", "", "KLD", "Common", 118, 63875) 129 | IncendiarySabotage = Card("incendiary_sabotage", "Incendiary Sabotage", ['2', 'R', 'R'], ['R'], "Instant", "", "KLD", "Uncommon", 119, 63877) 130 | InventorsApprentice = Card("inventors_apprentice", "Inventor's Apprentice", ['R'], ['R'], "Creature", "Human Artificer", "KLD", "Uncommon", 120, 63879) 131 | LathnuHellion = Card("lathnu_hellion", "Lathnu Hellion", ['2', 'R'], ['R'], "Creature", "Hellion", "KLD", "Rare", 121, 63881) 132 | MadcapExperiment = Card("madcap_experiment", "Madcap Experiment", ['3', 'R'], ['R'], "Sorcery", "", "KLD", "Rare", 122, 63883) 133 | MaulfistDoorbuster = Card("maulfist_doorbuster", "Maulfist Doorbuster", ['3', 'R'], ['R'], "Creature", "Human Warrior", "KLD", "Uncommon", 123, 63885) 134 | PiaNalaar = Card("pia_nalaar", "Pia Nalaar", ['2', 'R'], ['R'], "Legendary Creature", "Human Artificer", "KLD", "Rare", 124, 63887) 135 | QuicksmithGenius = Card("quicksmith_genius", "Quicksmith Genius", ['2', 'R'], ['R'], "Creature", "Human Artificer", "KLD", "Uncommon", 125, 63889) 136 | RecklessFireweaver = Card("reckless_fireweaver", "Reckless Fireweaver", ['1', 'R'], ['R'], "Creature", "Human Artificer", "KLD", "Common", 126, 63891) 137 | RenegadeTactics = Card("renegade_tactics", "Renegade Tactics", ['R'], ['R'], "Sorcery", "", "KLD", "Common", 127, 63893) 138 | RuinousGremlin = Card("ruinous_gremlin", "Ruinous Gremlin", ['R'], ['R'], "Creature", "Gremlin", "KLD", "Common", 128, 63895) 139 | SalivatingGremlins = Card("salivating_gremlins", "Salivating Gremlins", ['2', 'R'], ['R'], "Creature", "Gremlin", "KLD", "Common", 129, 63897) 140 | SkyshipStalker = Card("skyship_stalker", "Skyship Stalker", ['2', 'R', 'R'], ['R'], "Creature", "Dragon", "KLD", "Rare", 130, 63899) 141 | SparkofCreativity = Card("spark_of_creativity", "Spark of Creativity", ['R'], ['R'], "Sorcery", "", "KLD", "Uncommon", 131, 63901) 142 | SpeedwayFanatic = Card("speedway_fanatic", "Speedway Fanatic", ['1', 'R'], ['R'], "Creature", "Human Pilot", "KLD", "Uncommon", 132, 63903) 143 | SpiresideInfiltrator = Card("spireside_infiltrator", "Spireside Infiltrator", ['2', 'R'], ['R'], "Creature", "Human Rogue", "KLD", "Common", 133, 63905) 144 | SpontaneousArtist = Card("spontaneous_artist", "Spontaneous Artist", ['3', 'R'], ['R'], "Creature", "Human Rogue", "KLD", "Common", 134, 63907) 145 | StartYourEngines = Card("start_your_engines", "Start Your Engines", ['3', 'R'], ['R'], "Sorcery", "", "KLD", "Uncommon", 135, 63909) 146 | TerritorialGorger = Card("territorial_gorger", "Territorial Gorger", ['3', 'R'], ['R'], "Creature", "Gremlin", "KLD", "Rare", 136, 63911) 147 | TerroroftheFairgrounds = Card("terror_of_the_fairgrounds", "Terror of the Fairgrounds", ['3', 'R'], ['R'], "Creature", "Gremlin", "KLD", "Common", 137, 63913) 148 | ThrivingGrubs = Card("thriving_grubs", "Thriving Grubs", ['1', 'R'], ['R'], "Creature", "Gremlin", "KLD", "Common", 138, 63915) 149 | WaywardGiant = Card("wayward_giant", "Wayward Giant", ['4', 'R'], ['R'], "Creature", "Giant", "KLD", "Common", 139, 63917) 150 | WeldingSparks = Card("welding_sparks", "Welding Sparks", ['2', 'R'], ['R'], "Instant", "", "KLD", "Common", 140, 63919) 151 | AppetitefortheUnnatural = Card("appetite_for_the_unnatural", "Appetite for the Unnatural", ['2', 'G'], ['G'], "Instant", "", "KLD", "Common", 141, 63921) 152 | ArborbackStomper = Card("arborback_stomper", "Arborback Stomper", ['3', 'G', 'G'], ['G'], "Creature", "Beast", "KLD", "Uncommon", 142, 63923) 153 | ArchitectoftheUntamed = Card("architect_of_the_untamed", "Architect of the Untamed", ['2', 'G'], ['G'], "Creature", "Elf Artificer Druid", "KLD", "Rare", 143, 63925) 154 | ArmorcraftJudge = Card("armorcraft_judge", "Armorcraft Judge", ['3', 'G'], ['G'], "Creature", "Elf Artificer", "KLD", "Uncommon", 144, 63927) 155 | AttunewithAether = Card("attune_with_aether", "Attune with Aether", ['G'], ['G'], "Sorcery", "", "KLD", "Common", 145, 63929) 156 | BlossomingDefense = Card("blossoming_defense", "Blossoming Defense", ['G'], ['G'], "Instant", "", "KLD", "Uncommon", 146, 63931) 157 | BristlingHydra = Card("bristling_hydra", "Bristling Hydra", ['2', 'G', 'G'], ['G'], "Creature", "Hydra", "KLD", "Rare", 147, 63933) 158 | CommencementofFestivities = Card("commencement_of_festivities", "Commencement of Festivities", ['1', 'G'], ['G'], "Instant", "", "KLD", "Common", 148, 63935) 159 | CowlProwler = Card("cowl_prowler", "Cowl Prowler", ['4', 'G', 'G'], ['G'], "Creature", "Wurm", "KLD", "Common", 149, 63937) 160 | CreepingMold = Card("creeping_mold", "Creeping Mold", ['2', 'G', 'G'], ['G'], "Sorcery", "", "KLD", "Uncommon", 150, 63939) 161 | CultivatorofBlades = Card("cultivator_of_blades", "Cultivator of Blades", ['3', 'G', 'G'], ['G'], "Creature", "Elf Artificer", "KLD", "Rare", 151, 63941) 162 | DubiousChallenge = Card("dubious_challenge", "Dubious Challenge", ['3', 'G'], ['G'], "Sorcery", "", "KLD", "Rare", 152, 63943) 163 | DurableHandicraft = Card("durable_handicraft", "Durable Handicraft", ['1', 'G'], ['G'], "Enchantment", "", "KLD", "Uncommon", 153, 63945) 164 | ElegantEdgecrafters = Card("elegant_edgecrafters", "Elegant Edgecrafters", ['4', 'G', 'G'], ['G'], "Creature", "Elf Artificer", "KLD", "Uncommon", 154, 63947) 165 | FairgroundsTrumpeter = Card("fairgrounds_trumpeter", "Fairgrounds Trumpeter", ['2', 'G'], ['G'], "Creature", "Elephant", "KLD", "Uncommon", 155, 63949) 166 | GhirapurGuide = Card("ghirapur_guide", "Ghirapur Guide", ['2', 'G'], ['G'], "Creature", "Elf Scout", "KLD", "Uncommon", 156, 63951) 167 | HighspireArtisan = Card("highspire_artisan", "Highspire Artisan", ['2', 'G'], ['G'], "Creature", "Elf Artificer", "KLD", "Common", 157, 63953) 168 | HunttheWeak = Card("hunt_the_weak", "Hunt the Weak", ['3', 'G'], ['G'], "Sorcery", "", "KLD", "Common", 158, 63955) 169 | KujarSeedsculptor = Card("kujar_seedsculptor", "Kujar Seedsculptor", ['1', 'G'], ['G'], "Creature", "Elf Druid", "KLD", "Common", 159, 63957) 170 | LargerThanLife = Card("larger_than_life", "Larger Than Life", ['1', 'G'], ['G'], "Sorcery", "", "KLD", "Common", 160, 63959) 171 | LongtuskCub = Card("longtusk_cub", "Longtusk Cub", ['1', 'G'], ['G'], "Creature", "Cat", "KLD", "Uncommon", 161, 63961) 172 | NaturesWay = Card("natures_way", "Nature's Way", ['1', 'G'], ['G'], "Sorcery", "", "KLD", "Uncommon", 162, 63963) 173 | NissaVitalForce = Card("nissa_vital_force", "Nissa, Vital Force", ['3', 'G', 'G'], ['G'], "Legendary Planeswalker", "Nissa", "KLD", "Mythic Rare", 163, 63965) 174 | OrnamentalCourage = Card("ornamental_courage", "Ornamental Courage", ['G'], ['G'], "Instant", "", "KLD", "Common", 164, 63967) 175 | OviyaPashiriSageLifecrafter = Card("oviya_pashiri_sage_lifecrafter", "Oviya Pashiri, Sage Lifecrafter", ['G'], ['G'], "Legendary Creature", "Human Artificer", "KLD", "Rare", 165, 63969) 176 | PeemaOutrider = Card("peema_outrider", "Peema Outrider", ['2', 'G', 'G'], ['G'], "Creature", "Elf Artificer", "KLD", "Common", 166, 63971) 177 | RiparianTiger = Card("riparian_tiger", "Riparian Tiger", ['3', 'G', 'G'], ['G'], "Creature", "Cat", "KLD", "Common", 167, 63973) 178 | SageofShailasClaim = Card("sage_of_shailas_claim", "Sage of Shaila's Claim", ['1', 'G'], ['G'], "Creature", "Elf Druid", "KLD", "Common", 168, 63975) 179 | ServantoftheConduit = Card("servant_of_the_conduit", "Servant of the Conduit", ['1', 'G'], ['G'], "Creature", "Elf Druid", "KLD", "Uncommon", 169, 63977) 180 | TakeDown = Card("take_down", "Take Down", ['G'], ['G'], "Sorcery", "", "KLD", "Common", 170, 63979) 181 | ThrivingRhino = Card("thriving_rhino", "Thriving Rhino", ['2', 'G'], ['G'], "Creature", "Rhino", "KLD", "Common", 171, 63981) 182 | VerdurousGearhulk = Card("verdurous_gearhulk", "Verdurous Gearhulk", ['3', 'G', 'G'], ['G'], "Artifact Creature", "Construct", "KLD", "Mythic Rare", 172, 63983) 183 | WildWanderer = Card("wild_wanderer", "Wild Wanderer", ['3', 'G'], ['G'], "Creature", "Elf Druid", "KLD", "Common", 173, 63985) 184 | WildestDreams = Card("wildest_dreams", "Wildest Dreams", ['X', 'X', 'G'], ['G'], "Sorcery", "", "KLD", "Rare", 174, 63987) 185 | WilyBandar = Card("wily_bandar", "Wily Bandar", ['G'], ['G'], "Creature", "Cat Monkey", "KLD", "Common", 175, 63989) 186 | Cloudblazer = Card("cloudblazer", "Cloudblazer", ['3', 'W', 'U'], ['W', 'U'], "Creature", "Human Scout", "KLD", "Uncommon", 176, 63991) 187 | ContrabandKingpin = Card("contraband_kingpin", "Contraband Kingpin", ['U', 'B'], ['U', 'B'], "Creature", "Aetherborn Rogue", "KLD", "Uncommon", 177, 63993) 188 | DepalaPilotExemplar = Card("depala_pilot_exemplar", "Depala, Pilot Exemplar", ['1', 'R', 'W'], ['W', 'R'], "Legendary Creature", "Dwarf Pilot", "KLD", "Rare", 178, 63995) 189 | DovinBaan = Card("dovin_baan", "Dovin Baan", ['2', 'W', 'U'], ['W', 'U'], "Legendary Planeswalker", "Dovin", "KLD", "Mythic Rare", 179, 63997) 190 | EmpyrealVoyager = Card("empyreal_voyager", "Empyreal Voyager", ['1', 'G', 'U'], ['U', 'G'], "Creature", "Vedalken Scout", "KLD", "Uncommon", 180, 63999) 191 | EngineeredMight = Card("engineered_might", "Engineered Might", ['3', 'G', 'W'], ['W', 'G'], "Sorcery", "", "KLD", "Uncommon", 181, 64001) 192 | HazardousConditions = Card("hazardous_conditions", "Hazardous Conditions", ['2', 'B', 'G'], ['B', 'G'], "Sorcery", "", "KLD", "Uncommon", 182, 64003) 193 | KambalConsulofAllocation = Card("kambal_consul_of_allocation", "Kambal, Consul of Allocation", ['1', 'W', 'B'], ['W', 'B'], "Legendary Creature", "Human Advisor", "KLD", "Rare", 183, 64005) 194 | RashmiEternitiesCrafter = Card("rashmi_eternities_crafter", "Rashmi, Eternities Crafter", ['2', 'G', 'U'], ['U', 'G'], "Legendary Creature", "Elf Druid", "KLD", "Mythic Rare", 184, 64007) 195 | RestorationGearsmith = Card("restoration_gearsmith", "Restoration Gearsmith", ['2', 'W', 'B'], ['W', 'B'], "Creature", "Human Artificer", "KLD", "Uncommon", 185, 64009) 196 | SaheeliRai = Card("saheeli_rai", "Saheeli Rai", ['1', 'U', 'R'], ['U', 'R'], "Legendary Planeswalker", "Saheeli", "KLD", "Mythic Rare", 186, 64011) 197 | UnlicensedDisintegration = Card("unlicensed_disintegration", "Unlicensed Disintegration", ['1', 'B', 'R'], ['B', 'R'], "Instant", "", "KLD", "Uncommon", 187, 64013) 198 | VeteranMotorist = Card("veteran_motorist", "Veteran Motorist", ['R', 'W'], ['W', 'R'], "Creature", "Dwarf Pilot", "KLD", "Uncommon", 188, 64015) 199 | VoltaicBrawler = Card("voltaic_brawler", "Voltaic Brawler", ['R', 'G'], ['R', 'G'], "Creature", "Human Warrior", "KLD", "Uncommon", 189, 64017) 200 | WhirlerVirtuoso = Card("whirler_virtuoso", "Whirler Virtuoso", ['1', 'U', 'R'], ['U', 'R'], "Creature", "Vedalken Artificer", "KLD", "Uncommon", 190, 64019) 201 | AccomplishedAutomaton = Card("accomplished_automaton", "Accomplished Automaton", ['7'], [], "Artifact Creature", "Construct", "KLD", "Common", 191, 64021) 202 | AetherfluxReservoir = Card("aetherflux_reservoir", "Aetherflux Reservoir", ['4'], [], "Artifact", "", "KLD", "Rare", 192, 64023) 203 | AetherworksMarvel = Card("aetherworks_marvel", "Aetherworks Marvel", ['4'], [], "Legendary Artifact", "", "KLD", "Mythic Rare", 193, 64025) 204 | AnimationModule = Card("animation_module", "Animation Module", ['1'], [], "Artifact", "", "KLD", "Rare", 194, 64027) 205 | AradaraExpress = Card("aradara_express", "Aradara Express", ['5'], [], "Artifact", "Vehicle", "KLD", "Common", 195, 64029) 206 | BallistaCharger = Card("ballista_charger", "Ballista Charger", ['5'], [], "Artifact", "Vehicle", "KLD", "Uncommon", 196, 64031) 207 | BastionMastodon = Card("bastion_mastodon", "Bastion Mastodon", ['5'], ['W'], "Artifact Creature", "Elephant", "KLD", "Common", 197, 64033) 208 | BomatBazaarBarge = Card("bomat_bazaar_barge", "Bomat Bazaar Barge", ['4'], [], "Artifact", "Vehicle", "KLD", "Uncommon", 198, 64035) 209 | BomatCourier = Card("bomat_courier", "Bomat Courier", ['1'], ['R'], "Artifact Creature", "Construct", "KLD", "Rare", 199, 64037) 210 | ChiefoftheFoundry = Card("chief_of_the_foundry", "Chief of the Foundry", ['3'], [], "Artifact Creature", "Construct", "KLD", "Uncommon", 200, 64039) 211 | CogworkersPuzzleknot = Card("cogworkers_puzzleknot", "Cogworker's Puzzleknot", ['2'], ['W'], "Artifact", "", "KLD", "Common", 201, 64041) 212 | ConsulateSkygate = Card("consulate_skygate", "Consulate Skygate", ['2'], [], "Artifact Creature", "Wall", "KLD", "Common", 202, 64043) 213 | CultivatorsCaravan = Card("cultivators_caravan", "Cultivator's Caravan", ['3'], [], "Artifact", "Vehicle", "KLD", "Rare", 203, 64045) 214 | DeadlockTrap = Card("deadlock_trap", "Deadlock Trap", ['3'], [], "Artifact", "", "KLD", "Rare", 204, 64047) 215 | DecoctionModule = Card("decoction_module", "Decoction Module", ['2'], [], "Artifact", "", "KLD", "Uncommon", 205, 64049) 216 | DemolitionStomper = Card("demolition_stomper", "Demolition Stomper", ['6'], [], "Artifact", "Vehicle", "KLD", "Uncommon", 206, 64051) 217 | DukharaPeafowl = Card("dukhara_peafowl", "Dukhara Peafowl", ['4'], ['U'], "Artifact Creature", "Bird", "KLD", "Common", 207, 64053) 218 | DynavoltTower = Card("dynavolt_tower", "Dynavolt Tower", ['3'], [], "Artifact", "", "KLD", "Rare", 208, 64055) 219 | EagerConstruct = Card("eager_construct", "Eager Construct", ['2'], [], "Artifact Creature", "Construct", "KLD", "Common", 209, 64057) 220 | ElectrostaticPummeler = Card("electrostatic_pummeler", "Electrostatic Pummeler", ['3'], [], "Artifact Creature", "Construct", "KLD", "Rare", 210, 64059) 221 | FabricationModule = Card("fabrication_module", "Fabrication Module", ['3'], [], "Artifact", "", "KLD", "Uncommon", 211, 64061) 222 | FiligreeFamiliar = Card("filigree_familiar", "Filigree Familiar", ['3'], [], "Artifact Creature", "Fox", "KLD", "Uncommon", 212, 64063) 223 | FireforgersPuzzleknot = Card("fireforgers_puzzleknot", "Fireforger's Puzzleknot", ['2'], ['R'], "Artifact", "", "KLD", "Common", 213, 64065) 224 | FleetwheelCruiser = Card("fleetwheel_cruiser", "Fleetwheel Cruiser", ['4'], [], "Artifact", "Vehicle", "KLD", "Rare", 214, 64067) 225 | FoundryInspector = Card("foundry_inspector", "Foundry Inspector", ['3'], [], "Artifact Creature", "Construct", "KLD", "Uncommon", 215, 64069) 226 | GhirapurOrrery = Card("ghirapur_orrery", "Ghirapur Orrery", ['4'], [], "Artifact", "", "KLD", "Rare", 216, 64071) 227 | GlassblowersPuzzleknot = Card("glassblowers_puzzleknot", "Glassblower's Puzzleknot", ['2'], ['U'], "Artifact", "", "KLD", "Common", 217, 64073) 228 | InventorsGoggles = Card("inventors_goggles", "Inventor's Goggles", ['1'], [], "Artifact", "Equipment", "KLD", "Common", 218, 64075) 229 | IronLeagueSteed = Card("iron_league_steed", "Iron League Steed", ['4'], [], "Artifact Creature", "Construct", "KLD", "Uncommon", 219, 64077) 230 | KeytotheCity = Card("key_to_the_city", "Key to the City", ['2'], [], "Artifact", "", "KLD", "Rare", 220, 64079) 231 | MetalspinnersPuzzleknot = Card("metalspinners_puzzleknot", "Metalspinner's Puzzleknot", ['2'], ['B'], "Artifact", "", "KLD", "Common", 221, 64081) 232 | MetalworkColossus = Card("metalwork_colossus", "Metalwork Colossus", ['11'], [], "Artifact Creature", "Construct", "KLD", "Rare", 222, 64083) 233 | MultiformWonder = Card("multiform_wonder", "Multiform Wonder", ['5'], [], "Artifact Creature", "Construct", "KLD", "Rare", 223, 64085) 234 | NarnamCobra = Card("narnam_cobra", "Narnam Cobra", ['2'], ['G'], "Artifact Creature", "Snake", "KLD", "Common", 224, 64087) 235 | OvalchaseDragster = Card("ovalchase_dragster", "Ovalchase Dragster", ['4'], [], "Artifact", "Vehicle", "KLD", "Uncommon", 225, 64089) 236 | Panharmonicon = Card("panharmonicon", "Panharmonicon", ['4'], [], "Artifact", "", "KLD", "Rare", 226, 64091) 237 | PerpetualTimepiece = Card("perpetual_timepiece", "Perpetual Timepiece", ['2'], [], "Artifact", "", "KLD", "Uncommon", 227, 64093) 238 | PrakhataPillarBug = Card("prakhata_pillarbug", "Prakhata Pillar-Bug", ['3'], ['B'], "Artifact Creature", "Insect", "KLD", "Common", 228, 64095) 239 | PropheticPrism = Card("prophetic_prism", "Prophetic Prism", ['2'], [], "Artifact", "", "KLD", "Common", 229, 64097) 240 | RenegadeFreighter = Card("renegade_freighter", "Renegade Freighter", ['3'], [], "Artifact", "Vehicle", "KLD", "Common", 230, 64099) 241 | ScrapheapScrounger = Card("scrapheap_scrounger", "Scrapheap Scrounger", ['2'], ['B'], "Artifact Creature", "Construct", "KLD", "Rare", 231, 64101) 242 | SelfAssembler = Card("selfassembler", "Self-Assembler", ['5'], [], "Artifact Creature", "Assembly-Worker", "KLD", "Common", 232, 64103) 243 | SkySkiff = Card("sky_skiff", "Sky Skiff", ['2'], [], "Artifact", "Vehicle", "KLD", "Common", 233, 64169) 244 | SkysovereignConsulFlagship = Card("skysovereign_consul_flagship", "Skysovereign, Consul Flagship", ['5'], [], "Legendary Artifact", "Vehicle", "KLD", "Mythic Rare", 234, 64107) 245 | SmugglersCopter = Card("smugglers_copter", "Smuggler's Copter", ['2'], [], "Artifact", "Vehicle", "KLD", "Rare", 235, 64171) 246 | SnareThopter = Card("snare_thopter", "Snare Thopter", ['4'], [], "Artifact Creature", "Thopter", "KLD", "Uncommon", 236, 64111) 247 | TorchGauntlet = Card("torch_gauntlet", "Torch Gauntlet", ['2'], [], "Artifact", "Equipment", "KLD", "Common", 237, 64113) 248 | WeldfastMonitor = Card("weldfast_monitor", "Weldfast Monitor", ['3'], ['R'], "Artifact Creature", "Lizard", "KLD", "Common", 238, 64115) 249 | Whirlermaker = Card("whirlermaker", "Whirlermaker", ['3'], [], "Artifact", "", "KLD", "Uncommon", 239, 64117) 250 | WoodweaversPuzzleknot = Card("woodweavers_puzzleknot", "Woodweaver's Puzzleknot", ['2'], ['G'], "Artifact", "", "KLD", "Common", 240, 64119) 251 | WorkshopAssistant = Card("workshop_assistant", "Workshop Assistant", ['3'], [], "Artifact Creature", "Construct", "KLD", "Common", 241, 64121) 252 | AetherHub = Card("aether_hub", "Aether Hub", [], [], "Land", "", "KLD", "Uncommon", 242, 64123) 253 | BloomingMarsh = Card("blooming_marsh", "Blooming Marsh", [], ['B', 'G'], "Land", "", "KLD", "Rare", 243, 64125) 254 | BotanicalSanctum = Card("botanical_sanctum", "Botanical Sanctum", [], ['G', 'U'], "Land", "", "KLD", "Rare", 244, 64127) 255 | ConcealedCourtyard = Card("concealed_courtyard", "Concealed Courtyard", [], ['W', 'B'], "Land", "", "KLD", "Rare", 245, 64129) 256 | InspiringVantage = Card("inspiring_vantage", "Inspiring Vantage", [], ['R', 'W'], "Land", "", "KLD", "Rare", 246, 64131) 257 | InventorsFair = Card("inventors_fair", "Inventors' Fair", [], [], "Legendary Land", "", "KLD", "Rare", 247, 64133) 258 | SequesteredStash = Card("sequestered_stash", "Sequestered Stash", [], [], "Land", "", "KLD", "Uncommon", 248, 64135) 259 | SpirebluffCanal = Card("spirebluff_canal", "Spirebluff Canal", [], ['U', 'R'], "Land", "", "KLD", "Rare", 249, 64137) 260 | Plains = Card("plains", "Plains", [], ['W'], "Basic Land", "Plains", "KLD", "Basic Land", 250, 64139) 261 | Plains2 = Card("plains", "Plains", [], ['W'], "Basic Land", "Plains", "KLD", "Basic Land", 251, 64141) 262 | Plains3 = Card("plains", "Plains", [], ['W'], "Basic Land", "Plains", "KLD", "Basic Land", 252, 64143) 263 | Island = Card("island", "Island", [], ['U'], "Basic Land", "Island", "KLD", "Basic Land", 253, 64145) 264 | Island2 = Card("island", "Island", [], ['U'], "Basic Land", "Island", "KLD", "Basic Land", 254, 64147) 265 | Island3 = Card("island", "Island", [], ['U'], "Basic Land", "Island", "KLD", "Basic Land", 255, 64149) 266 | Swamp = Card("swamp", "Swamp", [], ['B'], "Basic Land", "Swamp", "KLD", "Basic Land", 256, 64151) 267 | Swamp2 = Card("swamp", "Swamp", [], ['B'], "Basic Land", "Swamp", "KLD", "Basic Land", 257, 64153) 268 | Swamp3 = Card("swamp", "Swamp", [], ['B'], "Basic Land", "Swamp", "KLD", "Basic Land", 258, 64155) 269 | Mountain = Card("mountain", "Mountain", [], ['R'], "Basic Land", "Mountain", "KLD", "Basic Land", 259, 64157) 270 | Mountain2 = Card("mountain", "Mountain", [], ['R'], "Basic Land", "Mountain", "KLD", "Basic Land", 260, 64159) 271 | Mountain3 = Card("mountain", "Mountain", [], ['R'], "Basic Land", "Mountain", "KLD", "Basic Land", 261, 64161) 272 | Forest = Card("forest", "Forest", [], ['G'], "Basic Land", "Forest", "KLD", "Basic Land", 262, 64163) 273 | Forest2 = Card("forest", "Forest", [], ['G'], "Basic Land", "Forest", "KLD", "Basic Land", 263, 64165) 274 | Forest3 = Card("forest", "Forest", [], ['G'], "Basic Land", "Forest", "KLD", "Basic Land", 264, 64167) 275 | ChandraPyrogenius = Card("chandra_pyrogenius", "Chandra, Pyrogenius", ['4', 'R', 'R'], ['R'], "Legendary Planeswalker", "Chandra", "KLD", "Mythic Rare", 265, 65407) 276 | FlameLash = Card("flame_lash", "Flame Lash", ['3', 'R'], ['R'], "Instant", "", "KLD", "Common", 266, 65409) 277 | LiberatingCombustion = Card("liberating_combustion", "Liberating Combustion", ['4', 'R'], ['R'], "Sorcery", "", "KLD", "Rare", 267, 65411) 278 | RenegadeFirebrand = Card("renegade_firebrand", "Renegade Firebrand", ['2', 'R'], ['R'], "Creature", "Human Warrior", "KLD", "Uncommon", 268, 65413) 279 | StoneQuarry = Card("stone_quarry", "Stone Quarry", [], ['R', 'W'], "Land", "", "KLD", "Common", 269, 65415) 280 | NissaNaturesArtisan = Card("nissa_natures_artisan", "Nissa, Nature's Artisan", ['4', 'G', 'G'], ['G'], "Legendary Planeswalker", "Nissa", "KLD", "Mythic Rare", 270, 65417) 281 | GuardianoftheGreatConduit = Card("guardian_of_the_great_conduit", "Guardian of the Great Conduit", ['3', 'G'], ['G'], "Creature", "Elemental", "KLD", "Uncommon", 271, 65419) 282 | TerrainElemental = Card("terrain_elemental", "Terrain Elemental", ['1', 'G'], ['G'], "Creature", "Elemental", "KLD", "Common", 272, 65421) 283 | VerdantCrescendo = Card("verdant_crescendo", "Verdant Crescendo", ['3', 'G'], ['G'], "Sorcery", "", "KLD", "Rare", 273, 65423) 284 | WoodlandStream = Card("woodland_stream", "Woodland Stream", [], ['G', 'U'], "Land", "", "KLD", "Common", 274, 65425) 285 | 286 | clsmembers = [card for name, card in inspect.getmembers(sys.modules[__name__]) if isinstance(card, Card)] 287 | Kaladesh = Set("kaladesh", cards=clsmembers) 288 | 289 | -------------------------------------------------------------------------------- /source/mtga/set_data/eld.py: -------------------------------------------------------------------------------- 1 | 2 | import sys 3 | from mtga.models.card import Card 4 | from mtga.models.card_set import Set 5 | import inspect 6 | 7 | 8 | AllThatGlitters = Card(name="all_that_glitters", pretty_name="All That Glitters", cost=['1', 'W'], 9 | color_identity=['W'], card_type="Enchantment", sub_types="Aura", 10 | abilities=[1027, 136335], set_id="ELD", rarity="Uncommon", collectible=True, set_number=2, 11 | mtga_id=70149) 12 | ShiningArmor = Card(name="shining_armor", pretty_name="Shining Armor", cost=['1', 'W'], 13 | color_identity=['W'], card_type="Artifact", sub_types="Equipment", 14 | abilities=[7, 136241, 7610, 1156], set_id="ELD", rarity="Common", collectible=True, set_number=29, 15 | mtga_id=70176) 16 | VenerableKnight = Card(name="venerable_knight", pretty_name="Venerable Knight", cost=['W'], 17 | color_identity=['W'], card_type="Creature", sub_types="Human Knight", 18 | abilities=[136079], set_id="ELD", rarity="Uncommon", collectible=True, set_number=35, 19 | mtga_id=70182) 20 | AnimatingFaerie = Card(name="animating_faerie", pretty_name="Animating Faerie", cost=['2', 'U'], 21 | color_identity=['U'], card_type="Creature", sub_types="Faerie", 22 | abilities=[8], set_id="ELD", rarity="Uncommon", collectible=True, set_number=38, 23 | mtga_id=70185) 24 | CorridorMonitor = Card(name="corridor_monitor", pretty_name="Corridor Monitor", cost=['1', 'U'], 25 | color_identity=['U'], card_type="Artifact Creature", sub_types="Construct", 26 | abilities=[136084], set_id="ELD", rarity="Common", collectible=True, set_number=41, 27 | mtga_id=70188) 28 | FaerieVandal = Card(name="faerie_vandal", pretty_name="Faerie Vandal", cost=['1', 'U'], 29 | color_identity=['U'], card_type="Creature", sub_types="Faerie Rogue", 30 | abilities=[7, 8, 136108], set_id="ELD", rarity="Uncommon", collectible=True, set_number=45, 31 | mtga_id=70192) 32 | Frogify = Card(name="frogify", pretty_name="Frogify", cost=['1', 'U'], 33 | color_identity=['U'], card_type="Enchantment", sub_types="Aura", 34 | abilities=[1027, 136125], set_id="ELD", rarity="Uncommon", collectible=True, set_number=47, 35 | mtga_id=70194) 36 | RunAwayTogether = Card(name="run_away_together", pretty_name="Run Away Together", cost=['1', 'U'], 37 | color_identity=['U'], card_type="Instant", sub_types="", 38 | abilities=[136218], set_id="ELD", rarity="Common", collectible=True, set_number=62, 39 | mtga_id=70209) 40 | WitchingWell = Card(name="witching_well", pretty_name="Witching Well", cost=['U'], 41 | color_identity=['U'], card_type="Artifact", sub_types="", 42 | abilities=[100685, 136240], set_id="ELD", rarity="Common", collectible=True, set_number=74, 43 | mtga_id=70221) 44 | BakeintoaPie = Card(name="bake_into_a_pie", pretty_name="Bake into a Pie", cost=['2', 'B', 'B'], 45 | color_identity=['B'], card_type="Instant", sub_types="", 46 | abilities=[136246], set_id="ELD", rarity="Common", collectible=True, set_number=76, 47 | mtga_id=70223) 48 | BelleoftheBrawl = Card(name="belle_of_the_brawl", pretty_name="Belle of the Brawl", cost=['2', 'B'], 49 | color_identity=['B'], card_type="Creature", sub_types="Human Knight", 50 | abilities=[142, 136248], set_id="ELD", rarity="Uncommon", collectible=True, set_number=78, 51 | mtga_id=70225) 52 | FoulmireKnight = Card(name="foulmire_knight", pretty_name="Foulmire Knight", cost=['B'], 53 | color_identity=['B'], card_type="Creature", sub_types="Zombie Knight", 54 | abilities=[1], set_id="ELD", rarity="Uncommon", collectible=True, set_number=90, 55 | mtga_id=70237) 56 | OrderofMidnight = Card(name="order_of_midnight", pretty_name="Order of Midnight", cost=['1', 'B'], 57 | color_identity=['B'], card_type="Creature", sub_types="Human Knight", 58 | abilities=[8, 86476], set_id="ELD", rarity="Uncommon", collectible=True, set_number=99, 59 | mtga_id=70246) 60 | SmittenSwordmaster = Card(name="smitten_swordmaster", pretty_name="Smitten Swordmaster", cost=['1', 'B'], 61 | color_identity=['B'], card_type="Creature", sub_types="Human Knight", 62 | abilities=[12], set_id="ELD", rarity="Common", collectible=True, set_number=105, 63 | mtga_id=70252) 64 | SyrKonradtheGrim = Card(name="syr_konrad_the_grim", pretty_name="Syr Konrad, the Grim", cost=['3', 'B', 'B'], 65 | color_identity=['B'], card_type="Creature", sub_types="Human Knight", 66 | abilities=[136076, 136077], set_id="ELD", rarity="Uncommon", collectible=True, set_number=107, 67 | mtga_id=70254) 68 | CrystalSlipper = Card(name="crystal_slipper", pretty_name="Crystal Slipper", cost=['1', 'R'], 69 | color_identity=['R'], card_type="Artifact", sub_types="Equipment", 70 | abilities=[136299, 1268], set_id="ELD", rarity="Common", collectible=True, set_number=119, 71 | mtga_id=70266) 72 | EmberethShieldbreaker = Card(name="embereth_shieldbreaker", pretty_name="Embereth Shieldbreaker", cost=['1', 'R'], 73 | color_identity=['R'], card_type="Creature", sub_types="Human Knight", 74 | abilities=[], set_id="ELD", rarity="Uncommon", collectible=True, set_number=122, 75 | mtga_id=70269) 76 | BeanstalkGiant = Card(name="beanstalk_giant", pretty_name="Beanstalk Giant", cost=['6', 'G'], 77 | color_identity=['G'], card_type="Creature", sub_types="Giant", 78 | abilities=[88259], set_id="ELD", rarity="Uncommon", collectible=True, set_number=149, 79 | mtga_id=70296) 80 | KeeperofFables = Card(name="keeper_of_fables", pretty_name="Keeper of Fables", cost=['3', 'G', 'G'], 81 | color_identity=['G'], card_type="Creature", sub_types="Cat", 82 | abilities=[136258], set_id="ELD", rarity="Uncommon", collectible=True, set_number=163, 83 | mtga_id=70310) 84 | RosethornAcolyte = Card(name="rosethorn_acolyte", pretty_name="Rosethorn Acolyte", cost=['2', 'G'], 85 | color_identity=['G'], card_type="Creature", sub_types="Elf Druid", 86 | abilities=[1055], set_id="ELD", rarity="Common", collectible=True, set_number=174, 87 | mtga_id=70321) 88 | GarrukCursedHuntsman = Card(name="garruk_cursed_huntsman", pretty_name="Garruk, Cursed Huntsman", cost=['4', 'B', 'G'], 89 | color_identity=['B', 'G'], card_type="Planeswalker", sub_types="Garruk", 90 | abilities=[136126, 104880, 136128], set_id="ELD", rarity="Mythic Rare", collectible=True, set_number=191, 91 | mtga_id=70338) 92 | InspiringVeteran = Card(name="inspiring_veteran", pretty_name="Inspiring Veteran", cost=['R', 'W'], 93 | color_identity=['R', 'W'], card_type="Creature", sub_types="Human Knight", 94 | abilities=[119104], set_id="ELD", rarity="Uncommon", collectible=True, set_number=194, 95 | mtga_id=70341) 96 | MaraleafPixie = Card(name="maraleaf_pixie", pretty_name="Maraleaf Pixie", cost=['G', 'U'], 97 | color_identity=['G', 'U'], card_type="Creature", sub_types="Faerie", 98 | abilities=[8, 18504], set_id="ELD", rarity="Uncommon", collectible=True, set_number=196, 99 | mtga_id=70343) 100 | SavvyHunter = Card(name="savvy_hunter", pretty_name="Savvy Hunter", cost=['1', 'B', 'G'], 101 | color_identity=['B', 'G'], card_type="Creature", sub_types="Human Warrior", 102 | abilities=[136251, 136147], set_id="ELD", rarity="Uncommon", collectible=True, set_number=200, 103 | mtga_id=70347) 104 | Shinechaser = Card(name="shinechaser", pretty_name="Shinechaser", cost=['1', 'W', 'U'], 105 | color_identity=['W', 'U'], card_type="Creature", sub_types="Faerie", 106 | abilities=[8, 15, 103355, 136148], set_id="ELD", rarity="Uncommon", collectible=True, set_number=201, 107 | mtga_id=70348) 108 | SteelclawLance = Card(name="steelclaw_lance", pretty_name="Steelclaw Lance", cost=['B', 'R'], 109 | color_identity=['B', 'R'], card_type="Artifact", sub_types="Equipment", 110 | abilities=[2512, 136149, 1156], set_id="ELD", rarity="Uncommon", collectible=True, set_number=202, 111 | mtga_id=70349) 112 | WintermoorCommander = Card(name="wintermoor_commander", pretty_name="Wintermoor Commander", cost=['W', 'B'], 113 | color_identity=['W', 'B'], card_type="Creature", sub_types="Human Knight", 114 | abilities=[1, 136151, 136152], set_id="ELD", rarity="Uncommon", collectible=True, set_number=205, 115 | mtga_id=70352) 116 | ArcanistsOwl = Card(name="arcanists_owl", pretty_name="Arcanist's Owl", cost=['(W/U)', '(W/U)', '(W/U)', '(W/U)'], 117 | color_identity=['W', 'U'], card_type="Artifact Creature", sub_types="Bird", 118 | abilities=[8, 136153], set_id="ELD", rarity="Uncommon", collectible=True, set_number=206, 119 | mtga_id=70353) 120 | FirebornKnight = Card(name="fireborn_knight", pretty_name="Fireborn Knight", cost=['(R/W)', '(R/W)', '(R/W)', '(R/W)'], 121 | color_identity=['R', 'W'], card_type="Creature", sub_types="Human Knight", 122 | abilities=[3, 136269], set_id="ELD", rarity="Uncommon", collectible=True, set_number=210, 123 | mtga_id=70357) 124 | GoldenEgg = Card(name="golden_egg", pretty_name="Golden Egg", cost=['2'], 125 | color_identity=[], card_type="Artifact", sub_types="Food", 126 | abilities=[86788, 88207, 136278], set_id="ELD", rarity="Common", collectible=True, set_number=220, 127 | mtga_id=70367) 128 | HeraldicBanner = Card(name="heraldic_banner", pretty_name="Heraldic Banner", cost=['3'], 129 | color_identity=[], card_type="Artifact", sub_types="", 130 | abilities=[88237, 136279, 2374], set_id="ELD", rarity="Uncommon", collectible=True, set_number=222, 131 | mtga_id=70369) 132 | ShamblingSuit = Card(name="shambling_suit", pretty_name="Shambling Suit", cost=['3'], 133 | color_identity=[], card_type="Artifact Creature", sub_types="Construct", 134 | abilities=[1316], set_id="ELD", rarity="Uncommon", collectible=True, set_number=230, 135 | mtga_id=70377) 136 | WitchsOven = Card(name="witchs_oven", pretty_name="Witch's Oven", cost=['1'], 137 | color_identity=[], card_type="Artifact", sub_types="", 138 | abilities=[136178], set_id="ELD", rarity="Uncommon", collectible=True, set_number=237, 139 | mtga_id=70384) 140 | TournamentGrounds = Card(name="tournament_grounds", pretty_name="Tournament Grounds", cost=[], 141 | color_identity=['W', 'B', 'R'], card_type="Land", sub_types="", 142 | abilities=[1152, 136198], set_id="ELD", rarity="Uncommon", collectible=True, set_number=248, 143 | mtga_id=70395) 144 | Plains = Card(name="plains", pretty_name="Plains", cost=[], 145 | color_identity=['W'], card_type="Land", sub_types="Plains", 146 | abilities=[], set_id="ELD", rarity="Basic", collectible=True, set_number=250, 147 | mtga_id=70397) 148 | Plains2 = Card(name="plains", pretty_name="Plains", cost=[], 149 | color_identity=['W'], card_type="Land", sub_types="Plains", 150 | abilities=[], set_id="ELD", rarity="Basic", collectible=True, set_number=251, 151 | mtga_id=70398) 152 | Plains3 = Card(name="plains", pretty_name="Plains", cost=[], 153 | color_identity=['W'], card_type="Land", sub_types="Plains", 154 | abilities=[], set_id="ELD", rarity="Basic", collectible=True, set_number=252, 155 | mtga_id=70399) 156 | Plains4 = Card(name="plains", pretty_name="Plains", cost=[], 157 | color_identity=['W'], card_type="Land", sub_types="Plains", 158 | abilities=[], set_id="ELD", rarity="Basic", collectible=True, set_number=253, 159 | mtga_id=70400) 160 | Island = Card(name="island", pretty_name="Island", cost=[], 161 | color_identity=['U'], card_type="Land", sub_types="Island", 162 | abilities=[], set_id="ELD", rarity="Basic", collectible=True, set_number=254, 163 | mtga_id=70401) 164 | Island2 = Card(name="island", pretty_name="Island", cost=[], 165 | color_identity=['U'], card_type="Land", sub_types="Island", 166 | abilities=[], set_id="ELD", rarity="Basic", collectible=True, set_number=255, 167 | mtga_id=70402) 168 | Island3 = Card(name="island", pretty_name="Island", cost=[], 169 | color_identity=['U'], card_type="Land", sub_types="Island", 170 | abilities=[], set_id="ELD", rarity="Basic", collectible=True, set_number=256, 171 | mtga_id=70403) 172 | Island4 = Card(name="island", pretty_name="Island", cost=[], 173 | color_identity=['U'], card_type="Land", sub_types="Island", 174 | abilities=[], set_id="ELD", rarity="Basic", collectible=True, set_number=257, 175 | mtga_id=70404) 176 | Swamp = Card(name="swamp", pretty_name="Swamp", cost=[], 177 | color_identity=['B'], card_type="Land", sub_types="Swamp", 178 | abilities=[], set_id="ELD", rarity="Basic", collectible=True, set_number=258, 179 | mtga_id=70405) 180 | Swamp2 = Card(name="swamp", pretty_name="Swamp", cost=[], 181 | color_identity=['B'], card_type="Land", sub_types="Swamp", 182 | abilities=[], set_id="ELD", rarity="Basic", collectible=True, set_number=259, 183 | mtga_id=70406) 184 | Swamp3 = Card(name="swamp", pretty_name="Swamp", cost=[], 185 | color_identity=['B'], card_type="Land", sub_types="Swamp", 186 | abilities=[], set_id="ELD", rarity="Basic", collectible=True, set_number=260, 187 | mtga_id=70407) 188 | Swamp4 = Card(name="swamp", pretty_name="Swamp", cost=[], 189 | color_identity=['B'], card_type="Land", sub_types="Swamp", 190 | abilities=[], set_id="ELD", rarity="Basic", collectible=True, set_number=261, 191 | mtga_id=70408) 192 | Mountain = Card(name="mountain", pretty_name="Mountain", cost=[], 193 | color_identity=['R'], card_type="Land", sub_types="Mountain", 194 | abilities=[], set_id="ELD", rarity="Basic", collectible=True, set_number=262, 195 | mtga_id=70409) 196 | Mountain2 = Card(name="mountain", pretty_name="Mountain", cost=[], 197 | color_identity=['R'], card_type="Land", sub_types="Mountain", 198 | abilities=[], set_id="ELD", rarity="Basic", collectible=True, set_number=263, 199 | mtga_id=70410) 200 | Mountain3 = Card(name="mountain", pretty_name="Mountain", cost=[], 201 | color_identity=['R'], card_type="Land", sub_types="Mountain", 202 | abilities=[], set_id="ELD", rarity="Basic", collectible=True, set_number=264, 203 | mtga_id=70411) 204 | Mountain4 = Card(name="mountain", pretty_name="Mountain", cost=[], 205 | color_identity=['R'], card_type="Land", sub_types="Mountain", 206 | abilities=[], set_id="ELD", rarity="Basic", collectible=True, set_number=265, 207 | mtga_id=70412) 208 | Forest = Card(name="forest", pretty_name="Forest", cost=[], 209 | color_identity=['G'], card_type="Land", sub_types="Forest", 210 | abilities=[], set_id="ELD", rarity="Basic", collectible=True, set_number=266, 211 | mtga_id=70413) 212 | Forest2 = Card(name="forest", pretty_name="Forest", cost=[], 213 | color_identity=['G'], card_type="Land", sub_types="Forest", 214 | abilities=[], set_id="ELD", rarity="Basic", collectible=True, set_number=267, 215 | mtga_id=70414) 216 | Forest3 = Card(name="forest", pretty_name="Forest", cost=[], 217 | color_identity=['G'], card_type="Land", sub_types="Forest", 218 | abilities=[], set_id="ELD", rarity="Basic", collectible=True, set_number=268, 219 | mtga_id=70415) 220 | Forest4 = Card(name="forest", pretty_name="Forest", cost=[], 221 | color_identity=['G'], card_type="Land", sub_types="Forest", 222 | abilities=[], set_id="ELD", rarity="Basic", collectible=True, set_number=269, 223 | mtga_id=70416) 224 | WindScarredCrag = Card(name="windscarred_crag", pretty_name="Wind-Scarred Crag", cost=[], 225 | color_identity=['R', 'W'], card_type="Land", sub_types="", 226 | abilities=[76735, 90050, 4247], set_id="ELD", rarity="Common", collectible=True, set_number=308, 227 | mtga_id=70421) 228 | ThornwoodFalls = Card(name="thornwood_falls", pretty_name="Thornwood Falls", cost=[], 229 | color_identity=['G', 'U'], card_type="Land", sub_types="", 230 | abilities=[76735, 90050, 18504], set_id="ELD", rarity="Common", collectible=True, set_number=313, 231 | mtga_id=70426) 232 | Goat = Card(name="goat", pretty_name="Goat", cost=[], 233 | color_identity=[], card_type="Creature", sub_types="Goat", 234 | abilities=[], set_id="ELD", rarity="Token", collectible=False, set_number=10001, 235 | mtga_id=70427) 236 | Human = Card(name="human", pretty_name="Human", cost=[], 237 | color_identity=[], card_type="Creature", sub_types="Human", 238 | abilities=[], set_id="ELD", rarity="Token", collectible=False, set_number=10002, 239 | mtga_id=70428) 240 | Knight = Card(name="knight", pretty_name="Knight", cost=[], 241 | color_identity=[], card_type="Creature", sub_types="Knight", 242 | abilities=[15], set_id="ELD", rarity="Token", collectible=False, set_number=10003, 243 | mtga_id=70429) 244 | Mouse = Card(name="mouse", pretty_name="Mouse", cost=[], 245 | color_identity=[], card_type="Creature", sub_types="PlaceholderSubType2", 246 | abilities=[], set_id="ELD", rarity="Token", collectible=False, set_number=10004, 247 | mtga_id=70430) 248 | Faerie = Card(name="faerie", pretty_name="Faerie", cost=[], 249 | color_identity=[], card_type="Creature", sub_types="Faerie", 250 | abilities=[8], set_id="ELD", rarity="Token", collectible=False, set_number=10005, 251 | mtga_id=70431) 252 | Rat = Card(name="rat", pretty_name="Rat", cost=[], 253 | color_identity=[], card_type="Creature", sub_types="Rat", 254 | abilities=[], set_id="ELD", rarity="Token", collectible=False, set_number=10006, 255 | mtga_id=70432) 256 | Dwarf = Card(name="dwarf", pretty_name="Dwarf", cost=[], 257 | color_identity=[], card_type="Creature", sub_types="Dwarf", 258 | abilities=[], set_id="ELD", rarity="Token", collectible=False, set_number=10007, 259 | mtga_id=70433) 260 | Bear = Card(name="bear", pretty_name="Bear", cost=[], 261 | color_identity=[], card_type="Creature", sub_types="Bear", 262 | abilities=[], set_id="ELD", rarity="Token", collectible=False, set_number=10008, 263 | mtga_id=70434) 264 | Boar = Card(name="boar", pretty_name="Boar", cost=[], 265 | color_identity=[], card_type="Creature", sub_types="Boar", 266 | abilities=[136165], set_id="ELD", rarity="Token", collectible=False, set_number=10009, 267 | mtga_id=70435) 268 | Giant = Card(name="giant", pretty_name="Giant", cost=[], 269 | color_identity=[], card_type="Creature", sub_types="Giant", 270 | abilities=[], set_id="ELD", rarity="Token", collectible=False, set_number=10010, 271 | mtga_id=70436) 272 | HumanCleric = Card(name="human_cleric", pretty_name="Human Cleric", cost=[], 273 | color_identity=[], card_type="Creature", sub_types="Human Cleric", 274 | abilities=[12, 9], set_id="ELD", rarity="Token", collectible=False, set_number=10011, 275 | mtga_id=70437) 276 | HumanRogue = Card(name="human_rogue", pretty_name="Human Rogue", cost=[], 277 | color_identity=[], card_type="Creature", sub_types="Human Rogue", 278 | abilities=[9, 136242], set_id="ELD", rarity="Token", collectible=False, set_number=10012, 279 | mtga_id=70438) 280 | HumanWarrior = Card(name="human_warrior", pretty_name="Human Warrior", cost=[], 281 | color_identity=[], card_type="Creature", sub_types="Human Warrior", 282 | abilities=[14, 9], set_id="ELD", rarity="Token", collectible=False, set_number=10013, 283 | mtga_id=70439) 284 | Wolf = Card(name="wolf", pretty_name="Wolf", cost=[], 285 | color_identity=[], card_type="Creature", sub_types="Wolf", 286 | abilities=[136216], set_id="ELD", rarity="Token", collectible=False, set_number=10014, 287 | mtga_id=70440) 288 | Food = Card(name="food", pretty_name="Food", cost=[], 289 | color_identity=[], card_type="Artifact", sub_types="Food", 290 | abilities=[197], set_id="ELD", rarity="Token", collectible=False, set_number=10015, 291 | mtga_id=70441) 292 | Food2 = Card(name="food", pretty_name="Food", cost=[], 293 | color_identity=[], card_type="Artifact", sub_types="Food", 294 | abilities=[197], set_id="ELD", rarity="Token", collectible=False, set_number=10016, 295 | mtga_id=70442) 296 | Food3 = Card(name="food", pretty_name="Food", cost=[], 297 | color_identity=[], card_type="Artifact", sub_types="Food", 298 | abilities=[197], set_id="ELD", rarity="Token", collectible=False, set_number=10017, 299 | mtga_id=70443) 300 | Food4 = Card(name="food", pretty_name="Food", cost=[], 301 | color_identity=[], card_type="Artifact", sub_types="Food", 302 | abilities=[197], set_id="ELD", rarity="Token", collectible=False, set_number=10018, 303 | mtga_id=70444) 304 | MaceoftheValiant = Card(name="mace_of_the_valiant", pretty_name="Mace of the Valiant", cost=['2', 'W'], 305 | color_identity=['W'], card_type="Artifact", sub_types="Equipment", 306 | abilities=[136349, 136350, 1156], set_id="ELD", rarity="Rare", collectible=True, set_number=314, 307 | mtga_id=70447) 308 | FaerieFormation = Card(name="faerie_formation", pretty_name="Faerie Formation", cost=['4', 'U'], 309 | color_identity=['U'], card_type="Creature", sub_types="Faerie", 310 | abilities=[8, 136368], set_id="ELD", rarity="Rare", collectible=True, set_number=316, 311 | mtga_id=70449) 312 | ShimmerDragon = Card(name="shimmer_dragon", pretty_name="Shimmer Dragon", cost=['4', 'U', 'U'], 313 | color_identity=['U'], card_type="Creature", sub_types="Dragon", 314 | abilities=[8, 136352, 136364], set_id="ELD", rarity="Rare", collectible=True, set_number=317, 315 | mtga_id=70450) 316 | WorkshopElders = Card(name="workshop_elders", pretty_name="Workshop Elders", cost=['6', 'U'], 317 | color_identity=['U'], card_type="Creature", sub_types="Human Artificer", 318 | abilities=[136353, 136366], set_id="ELD", rarity="Rare", collectible=True, set_number=318, 319 | mtga_id=70451) 320 | TasteofDeath = Card(name="taste_of_death", pretty_name="Taste of Death", cost=['4', 'B', 'B'], 321 | color_identity=['B'], card_type="Sorcery", sub_types="", 322 | abilities=[136355], set_id="ELD", rarity="Rare", collectible=True, set_number=320, 323 | mtga_id=70453) 324 | SteelbaneHydra = Card(name="steelbane_hydra", pretty_name="Steelbane Hydra", cost=['X', 'G', 'G'], 325 | color_identity=['G'], card_type="Creature", sub_types="Turtle Hydra", 326 | abilities=[76885, 136369], set_id="ELD", rarity="Rare", collectible=True, set_number=322, 327 | mtga_id=70455) 328 | ThornMammoth = Card(name="thorn_mammoth", pretty_name="Thorn Mammoth", cost=['5', 'G', 'G'], 329 | color_identity=['G'], card_type="Creature", sub_types="Elephant", 330 | abilities=[14, 136357], set_id="ELD", rarity="Rare", collectible=True, set_number=323, 331 | mtga_id=70456) 332 | AlelaArtfulProvocateur = Card(name="alela_artful_provocateur", pretty_name="Alela, Artful Provocateur", cost=['1', 'W', 'U', 'B'], 333 | color_identity=['W', 'U', 'B'], card_type="Creature", sub_types="Faerie Warlock", 334 | abilities=[8, 1, 12, 121999, 136371], set_id="ELD", rarity="Mythic Rare", collectible=True, set_number=324, 335 | mtga_id=70457) 336 | BanishintoFable = Card(name="banish_into_fable", pretty_name="Banish into Fable", cost=['4', 'W', 'U'], 337 | color_identity=['W', 'U'], card_type="Instant", sub_types="", 338 | abilities=[1389, 136359], set_id="ELD", rarity="Rare", collectible=True, set_number=325, 339 | mtga_id=70458) 340 | ChulaneTellerofTales = Card(name="chulane_teller_of_tales", pretty_name="Chulane, Teller of Tales", cost=['2', 'G', 'W', 'U'], 341 | color_identity=['W', 'U', 'G'], card_type="Creature", sub_types="Human Druid", 342 | abilities=[15, 136373, 1392], set_id="ELD", rarity="Mythic Rare", collectible=True, set_number=326, 343 | mtga_id=70459) 344 | KnightsCharge = Card(name="knights_charge", pretty_name="Knights' Charge", cost=['1', 'W', 'B'], 345 | color_identity=['W', 'B'], card_type="Enchantment", sub_types="", 346 | abilities=[1395, 136361], set_id="ELD", rarity="Rare", collectible=True, set_number=328, 347 | mtga_id=70461) 348 | KorvoldFaeCursedKing = Card(name="korvold_faecursed_king", pretty_name="Korvold, Fae-Cursed King", cost=['2', 'B', 'R', 'G'], 349 | color_identity=['B', 'R', 'G'], card_type="Creature", sub_types="Dragon Noble", 350 | abilities=[8, 136365, 1398], set_id="ELD", rarity="Mythic Rare", collectible=True, set_number=329, 351 | mtga_id=70462) 352 | SyrGwynHeroofAshvale = Card(name="syr_gwyn_hero_of_ashvale", pretty_name="Syr Gwyn, Hero of Ashvale", cost=['3', 'R', 'W', 'B'], 353 | color_identity=['W', 'B', 'R'], card_type="Creature", sub_types="Human Knight", 354 | abilities=[15, 142, 1399, 1400], set_id="ELD", rarity="Mythic Rare", collectible=True, set_number=330, 355 | mtga_id=70463) 356 | ArcaneSignet = Card(name="arcane_signet", pretty_name="Arcane Signet", cost=['2'], 357 | color_identity=[], card_type="Artifact", sub_types="", 358 | abilities=[90126], set_id="ELD", rarity="Common", collectible=True, set_number=331, 359 | mtga_id=70464) 360 | TomeofLegends = Card(name="tome_of_legends", pretty_name="Tome of Legends", cost=['2'], 361 | color_identity=[], card_type="Artifact", sub_types="", 362 | abilities=[136362, 136372, 136363], set_id="ELD", rarity="Rare", collectible=True, set_number=332, 363 | mtga_id=70465) 364 | CommandTower = Card(name="command_tower", pretty_name="Command Tower", cost=[], 365 | color_identity=[], card_type="Land", sub_types="", 366 | abilities=[90126], set_id="ELD", rarity="Common", collectible=True, set_number=333, 367 | mtga_id=70466) 368 | BringtoLife = Card(name="bring_to_life", pretty_name="Bring to Life", cost=['2', 'U'], 369 | color_identity=['U'], card_type="Sorcery", sub_types="Adventure", 370 | abilities=[136488], set_id="ELD", rarity="Uncommon", collectible=False, set_number=38, 371 | mtga_id=70477) 372 | ProfaneInsight = Card(name="profane_insight", pretty_name="Profane Insight", cost=['2', 'B'], 373 | color_identity=['B'], card_type="Instant", sub_types="Adventure", 374 | abilities=[1416], set_id="ELD", rarity="Uncommon", collectible=False, set_number=90, 375 | mtga_id=70483) 376 | AlterFate = Card(name="alter_fate", pretty_name="Alter Fate", cost=['1', 'B'], 377 | color_identity=['B'], card_type="Sorcery", sub_types="Adventure", 378 | abilities=[24122], set_id="ELD", rarity="Uncommon", collectible=False, set_number=99, 379 | mtga_id=70485) 380 | CurryFavor = Card(name="curry_favor", pretty_name="Curry Favor", cost=['B'], 381 | color_identity=['B'], card_type="Sorcery", sub_types="Adventure", 382 | abilities=[136490], set_id="ELD", rarity="Common", collectible=False, set_number=105, 383 | mtga_id=70487) 384 | BattleDisplay = Card(name="battle_display", pretty_name="Battle Display", cost=['R'], 385 | color_identity=['R'], card_type="Sorcery", sub_types="Adventure", 386 | abilities=[22564], set_id="ELD", rarity="Uncommon", collectible=False, set_number=122, 387 | mtga_id=70489) 388 | FertileFootsteps = Card(name="fertile_footsteps", pretty_name="Fertile Footsteps", cost=['2', 'G'], 389 | color_identity=['G'], card_type="Sorcery", sub_types="Adventure", 390 | abilities=[5296], set_id="ELD", rarity="Uncommon", collectible=False, set_number=149, 391 | mtga_id=70492) 392 | SeasonalRitual = Card(name="seasonal_ritual", pretty_name="Seasonal Ritual", cost=['G'], 393 | color_identity=['G'], card_type="Sorcery", sub_types="Adventure", 394 | abilities=[1429], set_id="ELD", rarity="Common", collectible=False, set_number=174, 395 | mtga_id=70497) 396 | 397 | 398 | clsmembers = [card for name, card in inspect.getmembers(sys.modules[__name__]) if isinstance(card, Card)] 399 | ThroneOfEldraine = Set("ThroneOfEldraine", cards=clsmembers) 400 | 401 | set_ability_map = {1: 'Deathtouch', 402 | 3: 'Double strike', 403 | 7: 'Flash', 404 | 8: 'Flying', 405 | 9: 'Haste', 406 | 12: 'Lifelink', 407 | 14: 'Trample', 408 | 15: 'Vigilance', 409 | 142: 'Menace', 410 | 197: '{o2}, {oT}, Sacrifice this artifact: You gain 3 life.', 411 | 1027: 'Enchant creature', 412 | 1055: '{oT}: Add one mana of any color.', 413 | 1152: '{oT}: Add {oC}.', 414 | 1156: 'Equip {o3}', 415 | 1268: 'Equip {o1}', 416 | 1316: "Shambling Suit's power is equal to the number of artifacts and/or " 417 | 'enchantments you control.', 418 | 1389: 'When you cast this spell from your hand, copy it if you control an ' 419 | 'artifact, then copy it if you control an enchantment. You may choose ' 420 | 'new targets for the copies.', 421 | 1392: "{o3}, {oT}: Return target creature you control to its owner's hand.", 422 | 1395: 'Whenever a Knight you control attacks, each opponent loses 1 life and ' 423 | 'you gain 1 life.', 424 | 1398: 'Whenever you sacrifice a permanent, put a +1/+1 counter on Korvold and ' 425 | 'draw a card.', 426 | 1399: 'Whenever an equipped creature you control attacks, you draw a card and ' 427 | 'you lose 1 life.', 428 | 1400: 'Equipment you control have equip Knight {o0}.', 429 | 1416: 'You draw a card and you lose 1 life.', 430 | 1429: 'Add one mana of any color.', 431 | 2374: '{oT}: Add one mana of the chosen color.', 432 | 2512: 'Equipped creature gets +2/+2.', 433 | 4247: '{oT}: Add {oR} or {oW}.', 434 | 5296: 'Search your library for a basic land card, put it onto the ' 435 | 'battlefield, then shuffle your library.', 436 | 7610: 'Equipped creature gets +0/+2 and has vigilance.', 437 | 18504: '{oT}: Add {oG} or {oU}.', 438 | 22564: 'Destroy target artifact.', 439 | 24122: 'Return target creature card from your graveyard to your hand.', 440 | 76735: 'Thornwood Falls enters the battlefield tapped.', 441 | 76885: 'Steelbane Hydra enters the battlefield with X +1/+1 counters on it.', 442 | 86476: "Order of Midnight can't block.", 443 | 86788: 'When Golden Egg enters the battlefield, draw a card.', 444 | 88207: '{o1}, {oT}, Sacrifice Golden Egg: Add one mana of any color.', 445 | 88237: 'As Heraldic Banner enters the battlefield, choose a color.', 446 | 88259: "Beanstalk Giant's power and toughness are each equal to the number of " 447 | 'lands you control.', 448 | 90050: 'When Thornwood Falls enters the battlefield, you gain 1 life.', 449 | 90126: "{oT}: Add one mana of any color in your commander's color identity.", 450 | 100685: 'When Witching Well enters the battlefield, scry 2.', 451 | 103355: 'Shinechaser gets +1/+1 as long as you control an artifact.', 452 | 104880: '-3: Destroy target creature. Draw a card.', 453 | 119104: 'Other Knights you control get +1/+1.', 454 | 121999: 'Other creatures you control with flying get +1/+0.', 455 | 136076: 'Whenever another creature dies, or a creature card is put into a ' 456 | 'graveyard from anywhere other than the battlefield, or a creature ' 457 | 'card leaves your graveyard, Syr Konrad, the Grim deals 1 damage to ' 458 | 'each opponent.', 459 | 136077: '{o1oB}: Each player puts the top card of their library into their ' 460 | 'graveyard.', 461 | 136079: 'When Venerable Knight dies, put a +1/+1 counter on target Knight you ' 462 | 'control.', 463 | 136084: 'When Corridor Monitor enters the battlefield, untap target artifact ' 464 | 'or creature you control.', 465 | 136108: 'Whenever you draw your second card each turn, put a +1/+1 counter on ' 466 | 'Faerie Vandal.', 467 | 136125: 'Enchanted creature loses all abilities and is a blue Frog creature ' 468 | 'with base power and toughness 1/1. \n' 469 | '(It loses all other card types and creature types.)', 470 | 136126: '0: Create two 2/2 black and green Wolf creature tokens with "When ' 471 | 'this creature dies, put a loyalty counter on each Garruk you ' 472 | 'control."', 473 | 136128: '-6: You get an emblem with "Creatures you control get +3/+3 and have ' 474 | 'trample."', 475 | 136147: 'Sacrifice two Foods: Draw a card.', 476 | 136148: 'Shinechaser gets +1/+1 as long as you control an enchantment.', 477 | 136149: 'Equip Knight {o1}', 478 | 136151: "Wintermoor Commander's toughness is equal to the number of Knights " 479 | 'you control.', 480 | 136152: 'Whenever Wintermoor Commander attacks, another target Knight you ' 481 | 'control gains indestructible until end of turn.', 482 | 136153: "When Arcanist's Owl enters the battlefield, look at the top four " 483 | 'cards of your library. You may reveal an artifact or enchantment ' 484 | 'card from among them and put it into your hand. Put the rest on the ' 485 | 'bottom of your library in a random order.', 486 | 136165: 'When this creature dies, create a Food token.', 487 | 136178: '{oT}, Sacrifice a creature: Create a Food token. If the sacrificed ' 488 | "creature's toughness was 4 or greater, create two Food tokens " 489 | 'instead.', 490 | 136198: '{oT}: Add {oR}, {oW}, or {oB}. Spend this mana only to cast a Knight ' 491 | 'or Equipment spell.', 492 | 136216: 'When this creature dies, put a loyalty counter on each Garruk you ' 493 | 'control.', 494 | 136218: 'Choose two target creatures controlled by different players. Return ' 495 | "those creatures to their owners' hands.", 496 | 136240: '{o3oU}, Sacrifice Witching Well: Draw two cards.', 497 | 136241: 'When Shining Armor enters the battlefield, attach it to target ' 498 | 'Knight you control.', 499 | 136242: 'When this creature enters the battlefield, it deals 1 damage to any ' 500 | 'target.', 501 | 136246: 'Destroy target creature. Create a Food token.', 502 | 136248: 'Whenever Belle of the Brawl attacks, other Knights you control get ' 503 | '+1/+0 until end of turn.', 504 | 136251: 'Whenever Savvy Hunter attacks or blocks, create a Food token.', 505 | 136258: 'Whenever one or more non-Human creatures you control deal combat ' 506 | 'damage to a player, draw a card.', 507 | 136269: '{o(R/W)o(R/W)o(R/W)o(R/W)}: Fireborn Knight gets +1/+1 until end of ' 508 | 'turn.', 509 | 136278: '{o2}, {oT}, Sacrifice Golden Egg: You gain 3 life.', 510 | 136279: 'Creatures you control of the chosen color get +1/+0.', 511 | 136299: 'Equipped creature gets +1/+0 and has haste.', 512 | 136335: 'Enchanted creature gets +1/+1 for each artifact and/or enchantment ' 513 | 'you control.', 514 | 136349: 'Equipped creature gets +1/+1 for each charge counter on Mace of the ' 515 | 'Valiant and has vigilance.', 516 | 136350: 'Whenever a creature enters the battlefield under your control, put a ' 517 | 'charge counter on Mace of the Valiant.', 518 | 136352: 'As long as you control four or more artifacts, Shimmer Dragon has ' 519 | 'hexproof.', 520 | 136353: 'Artifact creatures you control have flying.', 521 | 136355: 'Each player sacrifices three creatures. You create three Food ' 522 | 'tokens.', 523 | 136357: 'Whenever Thorn Mammoth or another creature enters the battlefield ' 524 | 'under your control, Thorn Mammoth fights up to one target creature ' 525 | "you don't control.", 526 | 136359: "Return target nonland permanent to its owner's hand. You create a " 527 | '2/2 white Knight creature token with vigilance.', 528 | 136361: "{o6oWoB}, Sacrifice Knights' Charge: Return all Knight creature " 529 | 'cards from your graveyard to the battlefield.', 530 | 136362: 'Tome of Legends enters the battlefield with a page counter on it.', 531 | 136363: '{o1}, {oT}, Remove a page counter from Tome of Legends: Draw a card.', 532 | 136364: 'Tap two untapped artifacts you control: Draw a card.', 533 | 136365: 'Whenever Korvold, Fae-Cursed King enters the battlefield or attacks, ' 534 | 'sacrifice another permanent.', 535 | 136366: 'At the beginning of combat on your turn, you may have target ' 536 | 'noncreature artifact you control become a 0/0 artifact creature. If ' 537 | 'you do, put four +1/+1 counters on it.', 538 | 136368: '{o3oU}: Create a 1/1 blue Faerie creature token with flying. Draw a ' 539 | 'card.', 540 | 136369: '{o2oG}, Remove a +1/+1 counter from Steelbane Hydra: Destroy target ' 541 | 'artifact or enchantment.', 542 | 136371: 'Whenever you cast an artifact or enchantment spell, create a 1/1 ' 543 | 'blue Faerie creature token with flying.', 544 | 136372: 'Whenever your commander enters the battlefield or attacks, put a ' 545 | 'page counter on Tome of Legends.', 546 | 136373: 'Whenever you cast a creature spell, draw a card, then you may put a ' 547 | 'land card from your hand onto the battlefield.', 548 | 136488: 'Target noncreature artifact you control becomes a 0/0 artifact ' 549 | 'creature. Put four +1/+1 counters on it.', 550 | 136490: 'You gain X life and each opponent loses X life, where X is the ' 551 | 'number of Knights you control.'} 552 | --------------------------------------------------------------------------------