Getting Started with Shandalar

From download to your first duel: the game with its original 1997 look, a picture on every card, and every card set up to Tempest. You won't write any code. You copy one line into a command window and wait.

  • About 1½ hours, mostly waiting
  • About 2.5 GB of free space
  • An Internet connection
The Shandalar main menu: a castle under a stormy sky, with the Magic Battle, Gauntlet, Deck Builder, Options, Help and Exit buttons.
Where you'll be at the end: the main menu.

Card pictures can't come with the game, because they aren't ours to hand out. So the game brings a small tool that downloads them from Scryfall onto your own computer. The packs that add the later sets are made the same way, because they carry those sets' pictures. Pick your computer in the bar above and this page shows only your steps.

  1. 1

    Download the game

    Open the downloads page. Under Assets, click the file for your computer that ends in -with-skin.zip. That one has the original look and sounds.

    Open the downloads page

    Assets
    • Shandalar-…-linux64.zip
    • Shandalar-…-linux64-with-skin.zipThis one
    • Shandalar-…-macos.zip
    • Shandalar-…-macos-with-skin.zipThis one
    • Shandalar-…-windows64.zip
    • Shandalar-…-windows64-with-skin.zipThis one
    The … is the version number, which goes up with every release. The macos download runs on both Apple Silicon and Intel Macs.
  2. 2

    Unzip it and find the game folder

    Right-click the zip and choose Extract All…, then Extract. The game won't run from inside the zip.

    Double-click the zip. A folder appears next to it.

    Right-click the zip and choose Extract Here.

    Move the folder somewhere easy to find, such as Documents. The game folder is the one with Shandalar.exeShandalar.apprun.sh and a folder called tools in it. You'll come back to it in step 5.

    Windows makes a folder named after the zip and puts the game folder inside it. Go one folder deeper.

    Shandalar-…-windows64Shandalar-…-macosShandalar-…-linux64
    • cards
    • decks
    • packaging
    • skin
    • tools
    • README.txt
    • run.sh
    • Shandalar.exe
    • Shandalar.app
    • Shandalar.pck
    • Shandalar.x86_64
    The game folder (a few more files are in it too).
  3. 3

    Start it once

    Double-click Shandalar.exe. The first time, Windows may warn you, because the game isn't signed by a company. Click More info, then Run anyway.

    Click More info

    Windows protected your PCMicrosoft Defender SmartScreen prevented an unrecognized app from starting.

    More info
    Don't run

    Click Run anyway

    Windows protected your PCApp: Shandalar.exe
    Publisher: Unknown publisher
    Run anywayDon't run

    Double-click Shandalar.app. The first time, macOS stops it because the game isn't from the App Store. Close the message, then let it through once in System Settings.

    Close the message

    “Shandalar” Not OpenedApple could not verify “Shandalar”…
    DoneMove to Trash

    Open System Settings → Privacy & Security, scroll down, click Open Anyway

    Privacy & Security
    “Shandalar” was blocked to protect your Mac.Open Anyway

    Older macOS versions word these a little differently, but the Open Anyway button is in the same place.

    Double-click run.sh (if your file manager asks, choose Run), or start it from a terminal with ./run.sh.

    You'll see the main menu. You can already play the 897 original cards; they just have no pictures yet. Close the game for now.

  4. 4

    Install Python

    Python is free, and the download tool is written in it. You install it once and never have to open it.

    Go to python.org/downloads, click the yellow button, open the file it downloads and keep the default choices.

    python.org/downloads
    Download the latest version for Windows for macOSDownload Python 3.x
    One more click on a Mac. When it has installed, open Applications → Python 3.x and double-click Install Certificates.command. Without this, the downloads stop with a “certificate” error.
    Applications › Python 3.x
    • IDLE.app
    • Install Certificates.command
    • Python Launcher.app
    • ReadMe.rtf
    • Update Shell Profile.command

    You very likely have it already. In a terminal, type python3 --version: it should say 3.10 or newer. If it isn't there, install the python3 package from your software centre.

    Terminal
    $ python3 --version
    Python 3.12.3
  5. 5

    Open a command window in the game folder Key step

    A command window is a plain text window where you paste instructions for your computer. It has to be opened in the game folder, so the tool finds its files.

    Open the game folder and click the address bar at the top

    This PC › Documents › Shandalar-…-windows64
    • cards
    • tools
    • Shandalar.exe

    Type cmd over the path and press Enter

    cmd

    A black window opens, already in the game folder

    Command Prompt
    C:\Users\you\Documents\Shandalar-…-windows64>

    Open Terminal: it's in Applications → Utilities, or press ⌘ Space, type Terminal and press Enter. Open it after Python is installed.

    Type cd and a space. Don't press Enter yet

    Terminal
    ~ % cd 

    Drag the game folder from Finder onto the window

    Terminal
    ~ % cd /Users/you/Documents/Shandalar-…-macos

    Press Enter. The prompt now shows the folder's name

    Terminal
    Shandalar-…-macos % 

    Right-click an empty spot inside the game folder

    Shandalar-…-linux64

    A terminal opens, already in the game folder

    Terminal
    ~/Documents/Shandalar-…-linux64$ 

    How to tell it worked: the line with the blinking cursor ends with the game folder's name.

  6. 6

    Paste the commands and let them run Key step

    Click Copy the commands. Click in the command window, paste, and press Enter.

    Paste with Ctrl V or a right-click ⌘ V Ctrl Shift V
    Command PromptTerminal
    py -3 tools/fetch_card_art.py --out cache/cardartpy -3 tools/mtg_assets.py --from-cardart cache/cardart --out skin/cardart.zippy -3 tools/pack_1_dotp_complete.py fetch-artpy -3 tools/pack_1_dotp_complete.py build cardpacks/Pack-1-DotP-complete.zippy -3 tools/pack_2_fallen_empires.py fetch-artpy -3 tools/pack_2_fallen_empires.py build cardpacks/Pack-2-Fallen-Empires.zippy -3 tools/pack_3_ice_age.py fetch-artpy -3 tools/pack_3_ice_age.py build cardpacks/Pack-3-Ice_Age.zippy -3 tools/pack_4_homelands.py fetch-artpy -3 tools/pack_4_homelands.py build cardpacks/Pack-4-Homelands.zippy -3 tools/pack_5_alliances.py fetch-artpy -3 tools/pack_5_alliances.py build cardpacks/Pack-5-Alliances.zippy -3 tools/pack_6_portal.py fetch-artpy -3 tools/pack_6_portal.py build cardpacks/Pack-6-Portal.zippy -3 tools/pack_7_fifth_edition.py fetch-artpy -3 tools/pack_7_fifth_edition.py build cardpacks/Pack-7-Fifth-Edition.zippy -3 tools/pack_8_mirage_block.py fetch-artpy -3 tools/pack_8_mirage_block.py build cardpacks/Pack-8-Mirage-Block.zippy -3 tools/pack_9_tempest_block.py fetch-artpy -3 tools/pack_9_tempest_block.py build cardpacks/Pack-9-Tempest-Block.zip
    python3 tools/fetch_card_art.py --out cache/cardartpython3 tools/mtg_assets.py --from-cardart cache/cardart --out skin/cardart.zippython3 tools/pack_1_dotp_complete.py fetch-artpython3 tools/pack_1_dotp_complete.py build cardpacks/Pack-1-DotP-complete.zippython3 tools/pack_2_fallen_empires.py fetch-artpython3 tools/pack_2_fallen_empires.py build cardpacks/Pack-2-Fallen-Empires.zippython3 tools/pack_3_ice_age.py fetch-artpython3 tools/pack_3_ice_age.py build cardpacks/Pack-3-Ice_Age.zippython3 tools/pack_4_homelands.py fetch-artpython3 tools/pack_4_homelands.py build cardpacks/Pack-4-Homelands.zippython3 tools/pack_5_alliances.py fetch-artpython3 tools/pack_5_alliances.py build cardpacks/Pack-5-Alliances.zippython3 tools/pack_6_portal.py fetch-artpython3 tools/pack_6_portal.py build cardpacks/Pack-6-Portal.zippython3 tools/pack_7_fifth_edition.py fetch-artpython3 tools/pack_7_fifth_edition.py build cardpacks/Pack-7-Fifth-Edition.zippython3 tools/pack_8_mirage_block.py fetch-artpython3 tools/pack_8_mirage_block.py build cardpacks/Pack-8-Mirage-Block.zippython3 tools/pack_9_tempest_block.py fetch-artpython3 tools/pack_9_tempest_block.py build cardpacks/Pack-9-Tempest-Block.zip
    The button copies all twenty lines joined into one, so they run in order and stop at the first problem.
    What these lines do
    lines 1–2
    Download the pictures of the 897 original cards and pack them into skin/cardart.zip.
    lines 3–4
    Pack 1: completes the original sets' checklists.
    lines 5–6
    Pack 2: Fallen Empires.
    lines 7–8
    Pack 3: Ice Age.
    lines 9–10
    Pack 4: Homelands.
    lines 11–12
    Pack 5: Alliances.
    lines 13–14
    Pack 6: Portal and Portal Second Age.
    lines 15–16
    Pack 7: Fifth Edition.
    lines 17–18
    Pack 8: Mirage, Visions and Weatherlight.
    lines 19–20
    Pack 9: Tempest, Stronghold and Exodus.

    Now wait. It takes about an hour and a half: the pictures come from Scryfall at the steady pace Scryfall asks for. You can use your computer meanwhile; just leave the window open. Lines like these scroll by:

    while it works
      50/897 processed...
      100/897 processed...
      …
    card art: 1794 fetched, 0 already present, 0 failed -> cache/cardart
    …
    Fallen Empires artwork: 10/102 names
    Fallen Empires artwork: 20/102 names
    …
    Pack 2: 102 unique cards · 187 printings -> cardpacks/Pack-2-Fallen-Empires.zip
    …
    Pack 9: 621 unique cards · 636 printings -> cardpacks/Pack-9-Tempest-Block.zip
    When the cursor is back on a new empty line, it's done.

    Saw an error, or did it stop early? Usually the connection dropped for a moment. Paste the same thing again and press Enter: pictures that already downloaded are kept, so it carries on where it stopped.

    When it's done, the game folder has the card pictures in skin/cardart.zip and the nine packs in a new cardpacks folder. Leave those zip files as they are: don't unzip or rename them.

  7. 7

    Switch the packs on

    Start the game. In the main menu click Options, then Card Packs…, and click Enable under each pack.

    The first start after adding the packs takes a little longer, because the game checks their pictures once.

    In Options, scroll to the bottom and click Card Packs…

    The bottom of the Options screen: the words Card packs and a Card Packs button.

    Click Enable under each pack, and scroll down for the rest

    The Card Packs page: an Open Folder and a Rescan button at the top, then each pack with its status and an Enable and a Disable button. Rescan finds new zips

    The card pictures need nothing more: they show by themselves. If a pack is missing from the list, click Rescan.

  8. 8

    Play

    Magic Battle starts a duel against the computer: pick a deck for each seat and click Go!

    To play with the new sets, make a deck that uses them:

    1. Deck Builder
    2. Extras
    3. switch on the sets
    4. Deck → AutoDeck
    5. Deck → Save deck
    6. Done

    Extras picks which sets the Deck Builder shows. AutoDeck, the gold line at the top of the Deck menu, builds a deck for you from the sets and colours you choose; you can also build one card by card. Then pick your deck in Magic Battle.

If something goes wrong

Find the message your window showed. Most problems take one step to fix.

'py' is not recognized as an internal or external command

Python isn't installed yet, or the command window was opened before it was. Install Python (step 4), close the command window, and open a new one (step 5).

The token '&&' is not a valid statement separator

That window is PowerShell, not the Command Prompt. Type cmd, press Enter, and paste again.

python3: command not found

Python isn't installed yet. Install it (step 4), then open a new Terminal window.

Install the python3 package from your software centre, or with your distribution's package manager.

can't open file … tools/fetch_card_art.py … No such file or directory

The command window isn't in the game folder. Close it and open it again from the folder that has tools in it (step 5).

CERTIFICATE_VERIFY_FAILED

Open Applications → Python 3.x, double-click Install Certificates.command, and paste the commands again.

TypeError: unsupported operand type(s) for |

The window is using an older Python. Type python3 --version: it must say 3.10 or newer. Macs come with an older Python of their own: install the one from python.org (step 4), then open a new Terminal window, so it uses the new one.

WARN: download failed, or it stopped partway

The connection dropped for a moment. Paste the same thing again: finished downloads are kept, and it carries on where it stopped.

A pack is missing on the Card Packs page

Click Rescan. The cardpacks folder must be inside the game folder, next to Shandalar.exeShandalar.app (never inside it)run.sh, and the zips must keep their names.

The cards still have no pictures

Check that cardart.zip is in the game folder's skin folder, then start the game again.

Permission denied when starting run.sh

Your unzip tool dropped the “executable” mark. In the game folder, run chmod +x run.sh Shandalar.x86_64.

A new version is out

Download and unzip it as in steps 1 and 2, then copy skin/cardart.zip and the cardpacks folder from your old game folder into the new one. If the Card Packs page says a pack needs rebuilding, run that pack's two lines again in the new folder.