counterspell

@counterspell@mtgzone.com

This profile is from a federated server and may be incomplete. Browse more on the original instance.

Looking for Decklists with Original Set Information for Preconstructed Decks

I’ve been wanting to get started using XMage and thought it would be fun to play a few matches against the AI with the GRN Guild Kit decks (GK1) using the original printings. I found decklists on sites like mtg.wtf that list the card names and quantities, but they don’t specify the original set name and card number for each...

counterspell,

Manabox has a list of all precon lists and exports in “n cardname (set)set#” format

counterspell,

tappedout exports as csv with set information:


<span style="color:#323232;">.csv
</span><span style="color:#323232;">Board,Qty,Name,Printing,Foil,Alter,Signed,Condition,Language
</span><span style="color:#323232;">main,1,Beacon Bolt,GRN,,,,,
</span><span style="color:#323232;">
</span><span style="color:#323232;">.dck
</span><span style="color:#323232;">1 [GRN:?] Beacon Bolt
</span>

Here is a Python script that reads the .csv file and writes the required format to a .dck file. This script uses the csv module to read the .csv file and write to the .dck file.


<span style="font-weight:bold;color:#a71d5d;">import </span><span style="color:#323232;">csv
</span><span style="color:#323232;">
</span><span style="font-weight:bold;color:#a71d5d;">def </span><span style="font-weight:bold;color:#323232;">read_csv_file</span><span style="color:#323232;">(file_path):
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">with </span><span style="color:#62a35c;">open</span><span style="color:#323232;">(file_path, </span><span style="color:#183691;">'r'</span><span style="color:#323232;">) </span><span style="font-weight:bold;color:#a71d5d;">as </span><span style="color:#323232;">file:
</span><span style="color:#323232;">        </span><span style="font-weight:bold;color:#a71d5d;">return </span><span style="color:#0086b3;">list</span><span style="color:#323232;">(csv.reader(file))
</span><span style="color:#323232;">
</span><span style="font-weight:bold;color:#a71d5d;">def </span><span style="font-weight:bold;color:#323232;">write_to_dck_file</span><span style="color:#323232;">(file_path, data):
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">with </span><span style="color:#62a35c;">open</span><span style="color:#323232;">(file_path, </span><span style="color:#183691;">'w'</span><span style="color:#323232;">) </span><span style="font-weight:bold;color:#a71d5d;">as </span><span style="color:#323232;">file:
</span><span style="color:#323232;">        file.writelines(data)
</span><span style="color:#323232;">
</span><span style="font-weight:bold;color:#a71d5d;">def </span><span style="font-weight:bold;color:#323232;">convert_csv_to_dck_format</span><span style="color:#323232;">(csv_data):
</span><span style="color:#323232;">    csv_header, </span><span style="font-weight:bold;color:#a71d5d;">*</span><span style="color:#323232;">csv_rows </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#323232;">csv_data
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">return </span><span style="color:#323232;">[format_dck_line(row) </span><span style="font-weight:bold;color:#a71d5d;">for </span><span style="color:#323232;">row </span><span style="font-weight:bold;color:#a71d5d;">in </span><span style="color:#323232;">csv_rows]
</span><span style="color:#323232;">
</span><span style="font-weight:bold;color:#a71d5d;">def </span><span style="font-weight:bold;color:#323232;">format_dck_line</span><span style="color:#323232;">(row):
</span><span style="color:#323232;">    quantity, name, printing </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#323232;">row[</span><span style="color:#0086b3;">1</span><span style="color:#323232;">], row[</span><span style="color:#0086b3;">2</span><span style="color:#323232;">], row[</span><span style="color:#0086b3;">3</span><span style="color:#323232;">]
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">return f</span><span style="color:#183691;">"</span><span style="color:#323232;">{quantity}</span><span style="color:#183691;"> [</span><span style="color:#323232;">{printing}</span><span style="color:#183691;">:?] </span><span style="color:#323232;">{name}</span><span style="color:#0086b3;">n</span><span style="color:#183691;">"
</span><span style="color:#323232;">
</span><span style="color:#323232;">csv_data </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#323232;">read_csv_file(</span><span style="color:#183691;">'input.csv'</span><span style="color:#323232;">)
</span><span style="color:#323232;">dck_data </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#323232;">convert_csv_to_dck_format(csv_data)
</span><span style="color:#323232;">write_to_dck_file(</span><span style="color:#183691;">'output.dck'</span><span style="color:#323232;">, dck_data)
</span>

This script works as follows:

  1. It opens the .csv file in read mode.
  2. It creates a csv reader object to read the .csv file.
  3. It skips the header row using the next() function.
  4. It opens the .dck file in write mode.
  5. For each row in the .csv file, it formats the line as per the .dck file format. The format is “Quantity [Printing:?] Name”. Here, Quantity is the second column in the .csv file, Printing is the fourth column, and Name is the third column.
  6. It writes the formatted line to the .dck file.

Please replace ‘input.csv’ with the path to your .csv file and ‘output.dck’ with the path where you want to create the .dck file. Run this script in a Python environment, and it will create the .dck file with the required format.

counterspell, (edited )

github.com/taw/magic-preconstructed-decks-data

This repository contains machine readable decklist data generated from:

Files

decks.json has traditional cards + sideboard structure, with commanders reusing sideboard.

decks_v2.json has cards + sideboard + commander structure. You should use this one.

Data format

Data file i a JSON array, with every element representing one deck.

Fields for each deck:

  • name - deck name
  • type - deck type
  • set_code - mtgjson set code
  • set_name - set name
  • release_date - deck release date (many decks are released much after their set)
  • cards - list of cards in the deck’s mainboard
  • sideboard - list of cards in the deck’s sideboard
  • commander - any commanders deck has (can be multiple for partners)

Each card is:

  • name - card name
  • set_code - mtgjson set card is from (decks often have cards from multiple sets)
  • number - card collector number
  • foil - is this a foil version
  • count - how many of given card
  • mtgjson_uuid - mtgjson uuid
  • multiverseid - Gatherer multiverseid of card if cards is on Gatherer (optional field)

Data Limitations

All precons ever released by Wizards of the Coast should be present, and decklists should always contain right cards, with correct number and foiling, and mainboard/sideboard/commander status.

Source decklists generally do not say which printing (set and card number) each card is from, so we need to use heuristics to figure that out.

We use a script to infer most likely set for each card based on some heuristics, and as far as I know, it always matches perfectly.

That just leaves situation where there are multiple printings of same card in same set.

If some of the printings are special (full art basics, Jumpstart basics, showcase frames etc.), these have been manually chosen to match every product.

If you see any errors for anything mentioned above, please report them, so they can be fixed.

That just leaves the case of multiple non-special printings of same card in same set - most commonly basic lands. In such case one of them is chosen arbitrarily, even though in reality a core set deck with 16 Forests would likely have 4 of each Forest in that core set, not 16 of one of them.

Feel free to create issue with data on exact priting if you want, but realistically we’ll never get them all, and it’s not something most people care about much.

counterspell, (edited )

Here are step-by-step instructions to migrate decks_v2.json to .dck files with the desired structure, assuming no prior knowledge of the command line:

  1. Open a web browser and go to the following link: github.com/taw/magic-preconstructed-decks
  2. Click the green “Code” button and select “Download ZIP” to download the repository as a ZIP file.
  3. Extract the ZIP file to a folder on your computer.
  4. Open the folder and create a new file migrate_decks.py.
  5. Right-click on the file and select “Open With” and then choose a text editor such as Notepad or Sublime Text.
  6. Copy the following Python script and paste it into the text editor:

<span style="font-weight:bold;color:#a71d5d;">import </span><span style="color:#323232;">json
</span><span style="font-weight:bold;color:#a71d5d;">import </span><span style="color:#323232;">os
</span><span style="font-weight:bold;color:#a71d5d;">import </span><span style="color:#323232;">re
</span><span style="color:#323232;">
</span><span style="font-weight:bold;color:#a71d5d;">from </span><span style="color:#323232;">typing </span><span style="font-weight:bold;color:#a71d5d;">import </span><span style="color:#323232;">List, Dict
</span><span style="color:#323232;">
</span><span style="color:#0086b3;">DECKS_FOLDER </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#183691;">'Preconstructed Decks'
</span><span style="color:#323232;">
</span><span style="font-weight:bold;color:#a71d5d;">def </span><span style="font-weight:bold;color:#323232;">load_decks</span><span style="color:#323232;">(file_path: </span><span style="color:#0086b3;">str</span><span style="color:#323232;">) -> List[Dict]:
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">with </span><span style="color:#62a35c;">open</span><span style="color:#323232;">(file_path, </span><span style="color:#183691;">'r'</span><span style="color:#323232;">) </span><span style="font-weight:bold;color:#a71d5d;">as </span><span style="color:#323232;">f:
</span><span style="color:#323232;">        </span><span style="font-weight:bold;color:#a71d5d;">return </span><span style="color:#323232;">json.load(f)
</span><span style="color:#323232;">
</span><span style="font-weight:bold;color:#a71d5d;">def </span><span style="font-weight:bold;color:#323232;">format_deck_name</span><span style="color:#323232;">(name: </span><span style="color:#0086b3;">str</span><span style="color:#323232;">) -> </span><span style="color:#0086b3;">str</span><span style="color:#323232;">:
</span><span style="color:#323232;">    name </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#323232;">name.lower().replace(</span><span style="color:#183691;">' '</span><span style="color:#323232;">, </span><span style="color:#183691;">'_'</span><span style="color:#323232;">).replace(</span><span style="color:#183691;">'-'</span><span style="color:#323232;">, </span><span style="color:#183691;">'_'</span><span style="color:#323232;">)
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">return </span><span style="color:#323232;">re.sub(</span><span style="font-weight:bold;color:#a71d5d;">r</span><span style="color:#183691;">'</span><span style="color:#0086b3;">[</span><span style="font-weight:bold;color:#a71d5d;">^</span><span style="color:#0086b3;">a-z0-9_]</span><span style="color:#183691;">'</span><span style="color:#323232;">, </span><span style="color:#183691;">''</span><span style="color:#323232;">, name)
</span><span style="color:#323232;">
</span><span style="font-weight:bold;color:#a71d5d;">def </span><span style="font-weight:bold;color:#323232;">get_deck_info</span><span style="color:#323232;">(deck: Dict) -> Dict:
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">return </span><span style="color:#323232;">{
</span><span style="color:#323232;">        </span><span style="color:#183691;">'name'</span><span style="color:#323232;">: format_deck_name(deck[</span><span style="color:#183691;">'name'</span><span style="color:#323232;">]),
</span><span style="color:#323232;">        </span><span style="color:#183691;">'type'</span><span style="color:#323232;">: deck[</span><span style="color:#183691;">'type'</span><span style="color:#323232;">],
</span><span style="color:#323232;">        </span><span style="color:#183691;">'set_code'</span><span style="color:#323232;">: deck[</span><span style="color:#183691;">'set_code'</span><span style="color:#323232;">].upper(),
</span><span style="color:#323232;">        </span><span style="color:#183691;">'set_name'</span><span style="color:#323232;">: deck[</span><span style="color:#183691;">'set_name'</span><span style="color:#323232;">],
</span><span style="color:#323232;">        </span><span style="color:#183691;">'release_date'</span><span style="color:#323232;">: deck[</span><span style="color:#183691;">'release_date'</span><span style="color:#323232;">],
</span><span style="color:#323232;">        </span><span style="color:#183691;">'deck_folder'</span><span style="color:#323232;">: </span><span style="color:#0086b3;">DECKS_FOLDER</span><span style="color:#323232;">,
</span><span style="color:#323232;">        </span><span style="color:#183691;">'cards'</span><span style="color:#323232;">: deck[</span><span style="color:#183691;">'cards'</span><span style="color:#323232;">],
</span><span style="color:#323232;">        </span><span style="color:#183691;">'sideboard'</span><span style="color:#323232;">: deck[</span><span style="color:#183691;">'sideboard'</span><span style="color:#323232;">]
</span><span style="color:#323232;">    }
</span><span style="color:#323232;">
</span><span style="font-weight:bold;color:#a71d5d;">def </span><span style="font-weight:bold;color:#323232;">build_deck_text</span><span style="color:#323232;">(deck_info: Dict) -> </span><span style="color:#0086b3;">str</span><span style="color:#323232;">:
</span><span style="color:#323232;">    lines </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#323232;">[
</span><span style="color:#323232;">        </span><span style="font-weight:bold;color:#a71d5d;">f</span><span style="color:#183691;">'// </span><span style="color:#323232;">{deck_info[</span><span style="color:#183691;">"name"</span><span style="color:#323232;">]}</span><span style="color:#183691;">'</span><span style="color:#323232;">,
</span><span style="color:#323232;">        </span><span style="font-weight:bold;color:#a71d5d;">f</span><span style="color:#183691;">'// Set: </span><span style="color:#323232;">{deck_info[</span><span style="color:#183691;">"set_name"</span><span style="color:#323232;">]}</span><span style="color:#183691;"> (</span><span style="color:#323232;">{deck_info[</span><span style="color:#183691;">"set_code"</span><span style="color:#323232;">]}</span><span style="color:#183691;">)'</span><span style="color:#323232;">,
</span><span style="color:#323232;">        </span><span style="font-weight:bold;color:#a71d5d;">f</span><span style="color:#183691;">'// Release Date: </span><span style="color:#323232;">{deck_info[</span><span style="color:#183691;">"release_date"</span><span style="color:#323232;">]}</span><span style="color:#183691;">'</span><span style="color:#323232;">,
</span><span style="color:#323232;">        </span><span style="color:#183691;">''</span><span style="color:#323232;">,
</span><span style="color:#323232;">    ]
</span><span style="color:#323232;">
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">for </span><span style="color:#323232;">card </span><span style="font-weight:bold;color:#a71d5d;">in </span><span style="color:#323232;">deck_info[</span><span style="color:#183691;">'cards'</span><span style="color:#323232;">]:
</span><span style="color:#323232;">        lines.append(</span><span style="font-weight:bold;color:#a71d5d;">f</span><span style="color:#183691;">'</span><span style="color:#323232;">{card[</span><span style="color:#183691;">"count"</span><span style="color:#323232;">]}</span><span style="color:#183691;"> [</span><span style="color:#323232;">{card[</span><span style="color:#183691;">"set_code"</span><span style="color:#323232;">]}</span><span style="color:#183691;">:</span><span style="color:#323232;">{card[</span><span style="color:#183691;">"number"</span><span style="color:#323232;">]}</span><span style="color:#183691;">] </span><span style="color:#323232;">{card[</span><span style="color:#183691;">"name"</span><span style="color:#323232;">]}</span><span style="color:#183691;">'</span><span style="color:#323232;">)
</span><span style="color:#323232;">
</span><span style="color:#323232;">    lines.append(</span><span style="color:#183691;">''</span><span style="color:#323232;">)
</span><span style="color:#323232;">    lines.append(</span><span style="color:#183691;">'SB:'</span><span style="color:#323232;">)
</span><span style="color:#323232;">
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">for </span><span style="color:#323232;">card </span><span style="font-weight:bold;color:#a71d5d;">in </span><span style="color:#323232;">deck_info[</span><span style="color:#183691;">'sideboard'</span><span style="color:#323232;">]:
</span><span style="color:#323232;">        lines.append(</span><span style="font-weight:bold;color:#a71d5d;">f</span><span style="color:#183691;">'</span><span style="color:#323232;">{card[</span><span style="color:#183691;">"count"</span><span style="color:#323232;">]}</span><span style="color:#183691;"> [</span><span style="color:#323232;">{card[</span><span style="color:#183691;">"set_code"</span><span style="color:#323232;">]}</span><span style="color:#183691;">:</span><span style="color:#323232;">{card[</span><span style="color:#183691;">"number"</span><span style="color:#323232;">]}</span><span style="color:#183691;">] </span><span style="color:#323232;">{card[</span><span style="color:#183691;">"name"</span><span style="color:#323232;">]}</span><span style="color:#183691;">'</span><span style="color:#323232;">)
</span><span style="color:#323232;">
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">return </span><span style="color:#183691;">'</span><span style="color:#0086b3;">n</span><span style="color:#183691;">'</span><span style="color:#323232;">.join(lines)
</span><span style="color:#323232;">
</span><span style="font-weight:bold;color:#a71d5d;">def </span><span style="font-weight:bold;color:#323232;">build_deck_path</span><span style="color:#323232;">(deck_info: Dict) -> </span><span style="color:#0086b3;">str</span><span style="color:#323232;">:
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">return </span><span style="color:#323232;">os.path.join(deck_info[</span><span style="color:#183691;">'deck_folder'</span><span style="color:#323232;">],
</span><span style="color:#323232;">                        deck_info[</span><span style="color:#183691;">'type'</span><span style="color:#323232;">],
</span><span style="color:#323232;">                        deck_info[</span><span style="color:#183691;">'set_code'</span><span style="color:#323232;">])
</span><span style="color:#323232;">
</span><span style="font-weight:bold;color:#a71d5d;">def </span><span style="font-weight:bold;color:#323232;">write_deck_file</span><span style="color:#323232;">(deck_info: Dict, deck_text: </span><span style="color:#0086b3;">str</span><span style="color:#323232;">) -> </span><span style="color:#0086b3;">None</span><span style="color:#323232;">:
</span><span style="color:#323232;">    deck_path </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#323232;">build_deck_path(deck_info)
</span><span style="color:#323232;">    os.makedirs(deck_path, exist_ok</span><span style="font-weight:bold;color:#a71d5d;">=</span><span style="color:#0086b3;">True</span><span style="color:#323232;">)
</span><span style="color:#323232;">
</span><span style="color:#323232;">    filename </span><span style="font-weight:bold;color:#a71d5d;">= f</span><span style="color:#183691;">"</span><span style="color:#323232;">{deck_info[</span><span style="color:#183691;">'name'</span><span style="color:#323232;">]}</span><span style="color:#183691;">.dck"
</span><span style="color:#323232;">    file_path </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#323232;">os.path.join(deck_path, filename)
</span><span style="color:#323232;">
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">with </span><span style="color:#62a35c;">open</span><span style="color:#323232;">(file_path, </span><span style="color:#183691;">'w'</span><span style="color:#323232;">) </span><span style="font-weight:bold;color:#a71d5d;">as </span><span style="color:#323232;">f:
</span><span style="color:#323232;">        f.write(deck_text)
</span><span style="color:#323232;">
</span><span style="font-weight:bold;color:#a71d5d;">def </span><span style="font-weight:bold;color:#323232;">migrate_decks</span><span style="color:#323232;">(input_file: </span><span style="color:#0086b3;">str</span><span style="color:#323232;">, error_file: </span><span style="color:#0086b3;">str</span><span style="color:#323232;">) -> </span><span style="color:#0086b3;">None</span><span style="color:#323232;">:
</span><span style="color:#323232;">    decks </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#323232;">load_decks(input_file)
</span><span style="color:#323232;">
</span><span style="color:#323232;">    error_decks: List[Dict] </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#323232;">[]
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">for </span><span style="color:#323232;">deck </span><span style="font-weight:bold;color:#a71d5d;">in </span><span style="color:#323232;">decks:
</span><span style="color:#323232;">        </span><span style="font-weight:bold;color:#a71d5d;">try</span><span style="color:#323232;">:
</span><span style="color:#323232;">            deck_info </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#323232;">get_deck_info(deck)
</span><span style="color:#323232;">            deck_text </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#323232;">build_deck_text(deck_info)
</span><span style="color:#323232;">            write_deck_file(deck_info, deck_text)
</span><span style="color:#323232;">        </span><span style="font-weight:bold;color:#a71d5d;">except </span><span style="color:#0086b3;">KeyError</span><span style="color:#323232;">:
</span><span style="color:#323232;">            error_decks.append(deck)
</span><span style="color:#323232;">
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">if </span><span style="color:#323232;">error_decks:
</span><span style="color:#323232;">        </span><span style="font-weight:bold;color:#a71d5d;">with </span><span style="color:#62a35c;">open</span><span style="color:#323232;">(error_file, </span><span style="color:#183691;">'w'</span><span style="color:#323232;">) </span><span style="font-weight:bold;color:#a71d5d;">as </span><span style="color:#323232;">f:
</span><span style="color:#323232;">            json.dump(error_decks, f)
</span><span style="color:#323232;">
</span><span style="font-weight:bold;color:#a71d5d;">if </span><span style="color:#323232;">__name__ </span><span style="font-weight:bold;color:#a71d5d;">== </span><span style="color:#183691;">'__main__'</span><span style="color:#323232;">:
</span><span style="color:#323232;">    migrate_decks(</span><span style="color:#183691;">'decks_v2.json'</span><span style="color:#323232;">, </span><span style="color:#183691;">'error_decks.json'</span><span style="color:#323232;">)
</span>
  1. Open a terminal or command prompt on your computer. On Windows, you can do this by pressing the Windows key and typing “cmd” and then pressing Enter.
  2. Navigate to the folder where the decks_v2.json file and the migrate_decks.py file are located. You can do this by typing cd followed by the path to the folder, such as cd C:UsersYourNameDownloadsmagic-preconstructed-decks-master.
  3. Type python migrate_decks.py and press Enter to run the Python script.
  4. Wait for the script to finish running. It will create a .dck file for each deck in the decks_v2.json file, with the desired structure.

Note: If you don’t have Python installed on your computer, you can download it from the official website: www.python.org/downloads/. Choose the latest version for your operating system and follow the installation instructions.

counterspell,

github.com/taw/mtg

mtg

Magic the Gathering scripts.

scripts

  • analyze_deck_colors - reports colors of the deck according to correct algorithm [ …blogspot.com/…/simple-and-correct-algorithm-for.… ]
  • clean_up_decklist - clean up manually created decklist
  • cod2dck - convert Cockatrice’s .cod to XMage’s .dck
  • cod2txt - convert Cockatrice’s .cod to .txt format
  • txt2cod - convert plaintext deck formats to Cockatrice’s cod
  • txt2dck - convert plaintext deck format to XMage
  • txt2txt - convert plaintext deck format to plaintext deck format (i.e. normalize the decklist)
  • url2cod - download decklists from URL and convert to .cod (a few popular websites supported)
  • url2dck - download decklists from URL and convert to XMage .dck format
  • url2txt - download decklists from URL and convert to .txt format

data management

These are used to generate data in data/, you probably won’t need to run them yourself

  • generate_colors_tsv_mtgjson - generate data/colors.tsv from mtgjson’s AllSets-x.json (recommended)
  • generate_colors_tsv_cockatrice - generate data/colors.tsv from cockatrice’s cards.xml (use mtgjson instead)
  • mage_card_map_generator - generate data/mage_cards.txt
counterspell,

You can download the .txt file for each decklist from MTGGoldfish by clicking on the “Download > Exact Card Versions (Tabletop)” button. However, please note that these files may not be compatible with Xmage due to differences in formatting. Nonetheless, creating a conversion script should not be too difficult.

counterspell,

You can either go here mtg.wtf/deckOr the same data is also exported to mtgjson if you want it in JSON format mtgjson.comThe same data is also available in a few other export formats.

Source data for it is in github.com/taw/magic-preconstructed-decks with source URLs for every deck (some of these expired by now and you’d need to go to the Web Archive - WotC redesigns its website every few years, killing old URLs).

Inferring exact set and collector number based on all available information is done algorithmically.

Everything should have correct names, quantities, and set codes.

A few cards won’t have correct collector numbers. The list of cards which are generally expected to not have exact collector number: “Plains”, “Island”, “Swamp”, “Mountain”, “Forest”, “Wastes”, “Azorius Guildgate”, “Boros Guildgate”, “Dimir Guildgate”, “Golgari Guildgate”, “Gruul Guildgate”, “Izzet Guildgate”, “Orzhov Guildgate”, “Rakdos Guildgate”, “Selesnya Guildgate”, “Simic Guildgate”

For everything else, the algorithm is exact as far as we know. Anything the algorithm can’t detect automatically it flags, and we resolve it manually.

Tomasz Wegrzanowski

I noticed that the default deck download format on the website doesn’t include set code and collector number information.

If you’re fine with JSON, you can use mtgjson, or this file: raw.githubusercontent.com/taw/…/decks_v2.json(which is exported to mtgjson).

In case it matters, collector numbers are Gatherer-style not Scryfall-style (so DFCs are 123a / 123b, not 123 etc.). This only really affects cards with multiple parts.

Do you have any more questions?

Tomasz Wegrzanowski

counterspell,

I was thinking just a few days ago how I wish I was playing Magic: The Gathering when some sets were released to play Limited with those sets. Seems like I’ve found just what I wanted.

How do you all play Magic: The Gathering these days?

Do you play tabletop Magic at your local game store (LGS)? Perhaps you prefer the convenience of Magic: The Gathering Online (MTGO) or Magic: The Gathering Arena on your computer. Or maybe you like playing on your phone or tablet with the Android version. Let me know how you play and what your preferred platform is!...

counterspell, (edited )

Ideas to shake up the meta:

  1. Rotate the legal card list monthly instead of after each regular set release.
  2. Each rotation, ban the top 1% most played cards for a number of rotations. Or a random number of rotations for each card so they don’t all become legal again simultaneously.
  3. Set a limit on the max number of copies allowed of each card. The limit could be randomized each rotation.
  4. Limit the number of rares/mythics allowed per deck.
  5. Require a minimum number of cards from the latest sets.
  6. Have occasional flashback weekends using previous cardpool rotations.
  7. Sometimes change to a different base cardpool like a block format or a format other than vintage.
counterspell,

A Flashback Draft is a limited-time event on Magic Online where players can draft and play with sets from the past. The sets available for Flashback Drafts change regularly, and Wizards of the Coast does not publish a schedule for them. However, players can stay up to date on upcoming Flashback Drafts by checking the Magic Online website or following Magic Online’s social media accounts. Flashback Drafts are a popular way for players to experience sets that they may have missed or to revisit sets that they enjoyed in the past. The entry fee for Flashback Drafts varies depending on the set and the type of draft league, but players can typically use event tickets or play points to enter.

Flashback Format

  • Inspired by the MTGO Flashback Drafts, but for constructed play
  • Minimum deck size: 60 cards
  • No more than 4 copies of any card, except basic lands
  • Cards can be of any rarity
  • The legal card pool changes every month, based on a randomly selected block from Magic’s history
  • You can only use cards from the chosen block, and only from the sets that were released at that point in time
  • For example, if the block is Innistrad, you can use cards from Innistrad, Dark Ascension, and Avacyn Restored, but not from Shadows over Innistrad or Eldritch Moon
  • Additionally, you can only use cards that cost less than $1 according to Scryfall’s market price
  • This format lets you revisit old sets and experience different eras of Magic with a budget-friendly twist
  • It challenges you to adapt to changing metagames and discover new synergies with limited card choices
  • All
  • Subscribed
  • Moderated
  • Favorites
  • megavids
  • rosin
  • ngwrru68w68
  • osvaldo12
  • DreamBathrooms
  • mdbf
  • magazineikmin
  • thenastyranch
  • Youngstown
  • khanakhh
  • everett
  • slotface
  • tacticalgear
  • kavyap
  • JUstTest
  • cubers
  • normalnudes
  • modclub
  • ethstaker
  • InstantRegret
  • GTA5RPClips
  • cisconetworking
  • Durango
  • Leos
  • provamag3
  • tester
  • anitta
  • lostlight
  • All magazines