Log in

List of MTG Engines

Here's a list of MTG Engines:


Basic Features

Name DesktopOS Language Last Release Screenshot Release Schedule AI* Card Count*
Forge Any (Java) Java 2020-06-28 (1.6.35) - 2-4 Weeks Simple 20186
Incantus Any (Python) Python 2012-05-23 (0.7.1c) - 1-68 Weeks None 2583+
XMage Any (Java) Java 2018-06-24 (1.4.30V6) - 1-2 Weeks Mad, DraftBot 17218
BotArena Windows C++ 2013-03-02 (1.44.2) - ~4-6 Weeks Minimax 10744
Magarena Any (Java) Java 2018-04-29 (1.93) - Monthly & Daily Builds Minimax/Monte Carlo/Vegas - incl. cheat vers. 11854
Multiverse Any (Java) Java 2014-08-24 (1.2.1) click 2-8 Weeks None 1500+
Wagic Any C++ 2012-05-20 (0.18.6) - - Simple 9000+
Manalink 3.0 Windows ASM / C 2016-08-07 (EMN) - 4 Weeks Simple 12869
Magicgrove Windows C#/Xaml 2014-08-11(3.0) - ~3 Months Minimax 690
  • For AI column, please give a short description that makes a touch of sense about how the AI works (AI/Simple State machine etc). Add details as a note below, if you can't think of a good description.
  • Card Count: Not as simple as you'd first think -
    There are about 17232 Distinct Mtg Cards by name ever printed (including non Standard cards like Schemes and Avatars).
    There are 165 total physical cards with multiple names (Split, Flip, Transform) giving a total of 17067 physical cards.
    There are 224 total physical cards in Un-sets (not including basic lands Gatherer), many of which involve physical actions which cannot be programmable, which would reduce the total to 16843
    There are also 2 other cards involving physical actions Chaos Orb and Falling Star creating a likely realistic total of 16841
    Vintage format contains 16,530 physical cards.

Comparable Features

Name Undo Multiplayer* Human vs Human* "Quest" Mode Draft Sealed Card Scripting*
Forge Limited (Costs) Yes Beta Yes Yes Yes Yes
Incantus None No Yes No No No Yes
XMage Yes Yes (3-10) Yes No Booster & Cube (4-16) Yes (2-16) No
BotArena Limited (Basics) No Yes No No Yes No
Magarena Yes No No No No No Yes (Natural language & Groovy script)
Multiverse Limited (Costs) Yes Yes No Yes Yes Yes
Wagic Beta No Alpha Yes No No Yes
Manalink 3.0 No No Not working Yes Yes Yes No
Magicgrove No No No No Yes Yes No
  • Multiplayer means more than 2 Players.
  • Human vs Human is generally used for over the Network against another Human. If you support local Human vs Human (via Hot Seat) make a note as applicable.
  • Card scripting allows for creation/testing of new cards outside of the chosen programming language, generally without recompiling.

Additional Features

Name Standard Commander Planechase Vanguard Archenemy AI vs AI AI Cards Ante MobileOS Save/Load State
Forge 100% Yes Yes Yes Yes Yes  ? Yes Android  ?
Incantus  ??% No No No No  ?  ? No No?  ?
XMage 99% Yes Yes No No during Tournament  ? No No Rollbacks
BotArena 90% Yes Yes Yes Yes  ?  ? No No  ?
Magarena 70% No No No No Yes 100% No No Limited
Multiverse  ??% Yes No No No No  ? No All Java-supporting Replays
Wagic  ??% No No No No Limited* No No PSP,Android,iOS Limited*
Manalink 3.0 99% Yes Yes Yes Yes No ~90%,~70%decent Yes No Yes+auto save beginning of turn.
Magicgrove 0% No No No No Yes 100% No No Yes
  • Save/Load State: Saving an existing game to disk, for loading back in at a later time.
  • Limited: Techically it is possible to describe a game state with some limitations (ex. auras cannot be attached). This is widely used in test utility.


Name Pictures Folder Structure Naming Convention Crops Full Uniques*
Forge Yes Set-per-folder slightlymagic No Yes Yes
Incantus Yes All in one folder WotC website* No Yes No
XMage Yes Set-per-folder slightlymagic No Yes Yes
BotArena Yes Set-per-folder slightlymagic No Yes Yes
Magarena Yes All in one folder slightlymagic Yes Yes No
Multiverse Yes All in one folder Gatherer Multiverse IDs Yes - Yes
Wagic Yes Set-per-folder Gatherer Multiverse IDs* Yes Yes Yes
Manalink 3.0 Yes All in one folder WotC Gatherer* Yes (288x232) No Yes
Magicgrove Possible All in one folder slightlymagic Yes No 4 Lands
  • Uniques: This basically allows for cards which have more than one image in each set to be displayed in it's different forms. This was in effect for a few early sets like Fallen Empires and Alliances. This is also the case for most basic lands.
  • Incantus downloads card images from the WotC website into a card_images.db, but it can also read images from the /data/cardimg/ folder as long as they use the same format, i.e. the name of the card with spaces turned into underscores and commas stripped out.
  • Manalink 3.0: Image files are named conforming to the English language card names officially listed in the Magic Gatherer Card Database, with non-legal file naming characters (*, /, \, :,") being replaced in the file name with an underscore for each of the illegal characters used in the card’s name. Except for the default image, alternative artwork files for a card are identified by a single space after the card’s name followed by a bracketed number. e.g ‘Circle of Protection_ Black (1).jpg'
  • Wagic Gatherer Multiverse IDs: The majority of cards follow Gatherer’s IDs, except for tokens, that have no ID (?), which names are source card’s ID and then «t» letter (for «token»). For example, «249685t» for 3/3 Beast token from M13. Also this rule has exceptions, too.


Here are some brief instructions on how to add Engines to the above tables. Please let me know (friarsol) if you have difficulties with the instructions, and I'll try to clarify them.

Adding an Engine

Copy the format provided by one of the other Engines already on the list.

For example, on the first table, copy the following (from the wiki code):

| [http://www.slightlymagic.net/forum/viewforum.php?f=26 Forge] || Any (Java) || N/A || Java || 2012-08-03 [http://www.slightlymagic.net/forum/viewtopic.php?f=26&t=7738 (1.2.11)] || 3-4 Weeks || Simple || 11034 

and paste it below the last line that starts an Engine table row, just before the


and then fill in the appropriate data, making sure to leave spaces in between the || symbol

Each table has slightly different column length, so make sure to grab your sample table row from the right table before adding.

Adding new Columns

If you'd like to add a new Column, I'd recommend adding at the end of an existing table. The trick here is to make sure you provide phantom data cells for every other engine that exists. Unless you don't mind hitting the preview button a lot, feel free to make suggestions and I can add them in if they seem like a reasonable comparison.