Skip to content

Scene Viewer Gallery

Unlike War in Middle Earth (which procedurally generates a landscape per map tile from a seeded PRNG), every one of Spirit of Excalibur’s 138 close-up locations is an authored SCEN resource — a fixed, hand-placed list of background and foreground objects, decoded byte-for-byte and addressed by (location, sub-scene) (docs/spirit/amiga/engine.md § “Scene System” in the main repo, not part of this site). That makes this page a straight compositing-and-wiring job rather than new reverse engineering: no scene here is synthesised, every one is exactly what the original game itself would draw for that location.

These six PNGs were pre-composited by tools/spirit/render-scene-gallery.ts, a small headless script that feeds the shared compositeScene() function (src/data/scene-compositor.ts — the same function the offline asset viewer’s “view any location” browser uses) a minimal Node-side canvas shim, plus the real per-location object list from scene-viewer-locations.json (138 locations in total; these six were picked for a mix of Arthurian-legend name recognition and visual variety — capital, port, holy site and villain’s lair).

Each object entry in a decoded SCEN resource is just { id, x, y } — a byte-reversed-on-disk longword _LoadScene un-reverses on load (docs/spirit/amiga/engine.md; reading it little-endian took object-id resolution from 24.2% to 99.9% across the whole corpus). The id itself addresses either a plain IMAG still or the first frame of an FRML animation sheet — _DrawScene range-checks it and calls _OpenFrml for two disjoint 100-wide windows (700–799, 900–999) and _OpenImag for everything else, with no third case. SCENES.RES itself carries no image data of its own; every id an object references lives in one of the ordinary catalog files (PLAYA32I.RES, OVERA32I.RES, BOOT32I.RES) already rendered for the Characters & Creatures page.