Skip to content

The Map of Britain

The strategic map Spirit of Excalibur is played on: a 72×60 tile grid (1152×960 pixels at the game’s native 16px tile size), decoded from the MMAP/IMAG resources in PLAYA32I.RES and pre-composited into the image below by tools/spirit/render-map.ts. See docs/spirit/amiga/gameplay-data.md § “World Map (MMAP)” in the main repo (not part of this site) for the full byte-level format.

Spirit of Excalibur strategic map (overview)

48 named locations. Hover or focus a marker for its name; search to highlight matches.

The render is immediately recognisable as England, Wales and Cornwall: the coastline shape, the Welsh mountains (grey terrain tiles clustered exactly where Snowdonia/the Cambrian Mountains should be), the road network and the Thames/Severn river paths all fall where they do in reality — overlaying all 48 decoded location coordinates above puts every town exactly where it belongs (London on the Thames estuary, York in the north, Dover and Canterbury on the south-east coast, Exeter and Tintagel in the south-west, Cardiff and Carmarthen in Wales, …). This is direct, strong ground truth for the grid decode, the tile atlas decode, and the palette all at once.

Want to see one of these places up close, composited the way the game’s own SCEN resources actually draw it? The Scene Viewer Gallery shows six named locations — Camelot, London, Tintagel, Stonehenge, Dover, and Morgan’s Castle — as full landscape-plus-object composites.

Every one of the 4,320 tiles is a single byte, but unlike a flat tile index it’s nibble-encoded: the low nibble selects an atlas column and the high nibble an atlas row, both 0–15, directly addressing one 16×16 tile inside a 256×256-pixel, 16×16-tile atlas (IMAG resource #500, 5-bitplane, 32 colours) — atlas_offset = hiNibble * 160 + loNibble * 2 in the original blitter’s byte-addressed terms, or equivalently (srcX, srcY) = (loNibble * 16, hiNibble * 16) once decoded to plain pixels. 234 of the 256 possible byte values are actually used somewhere on the map.

_aLoc, the executable’s compiled default location table, names 48 places. This is the compiled default only — the table is per-episode customizable exactly like the entity/force table (_aForces): each EPISODE<n>.DAT can rename or add locations the compiled defaults leave blank (up to 61 possible slots; EPISODE1.DAT alone names 5 more). The 48 markers above are the compiled table plotted directly against the render — every single one lands on land, none in the sea, confirming both the location table and the map decode simultaneously.