A toy-diorama Zelda maker, in one evening
The whole brief was one message: take any rpg engine (solarus would probably be good
since its live action) that is open source or multiple ones and try to one-up them. the
whole thing in the topdown 3D style of the switch zelda titles like links awakening or
echoes of wisdom.
What came back that evening is called Diorama, and it is a game
maker that runs in a browser tab.
The look is a lens, not a model
The Switch remake of Link's Awakening looks like a toy set on a table, and very little of that is the models. It is a narrow lens a long way off, depth of field melting the top and bottom of the frame, soft vinyl shading and ink lines. So that is what Diorama builds, and every one of those is a dial with a slider in the maker.
The maps themselves stay flat data. A level is a 2D grid of heights and ground types — stored as rows of letters, so two versions of a map diff like text — and the engine turns a one-step drop into a ledge the hero hops down and a two-step drop into a cliff with a grass lip and baked shadow in the corners. Tiles, planks, cobbles and bricks are drawn by the shader in world space, which is why none of it needs a texture.
Where it beats the engines it was told to beat
Solarus has the best built-in Zelda rules of any free engine, and no way to put a game on the web or to test a change without relaunching. GB Studio proved how much instant sharing matters and has no melee combat. So the list of things to one-up was not hard to write:
- Play from the cursor. Press P over any cell of the map and you are playing from there, on the same canvas. Escape puts you back in the editor where you left it.
- Puzzle wiring you can see. A switch that opens a door is not a callback in a script file; it is a property, drawn on the map as an arc from the switch to the door.
- A solver instead of a playtest. Check walks the level and reports chests you cannot reach, ledges that soft-lock you, and keys locked behind their own door. Each issue is clickable and jumps to the spot.
- Scripts as plain async functions:
await say("…"),give("gem", 5),open("door_2").
The solver earned its keep before the evening was out: it caught a push block that could be spent where the level still needed it, and a key with no door to open.
It plays my old Solarus quests
The part I did not ask for and like most. Two weeks ago I made three openings in Solarus, a 2D engine. Diorama imports Solarus quests: every tile's ground type becomes a height, the entities map across, dialogs come along, and each map's original pixel art is laid onto the tops of the 3D terrain.
The official Solarus sample quest imports too, all thirteen maps, with camera rooms taken from its separators. Lua is not run — the importer lists what it skipped — so doors that Solarus opens from a script simply stand open, and the checker still finds one soft-lock and four unreachable things in it.
Tested without a person
- code
- 9,490 lines of JavaScript, three.js
- tests
- 18 unit tests plus the solver over every project
- bot
- finished the demo in 8 steps, keys only
- build
- 3.4 s; 800 KB of JS, 218 KB gzipped
- frame rate
- 60 fps on an integrated Iris GPU at 720p
- models
- 1,153 imported, from 12 CC0 packs
The bot is the detail I trust most. It plays the demo only through the same simulated key presses a person would make, because scripted walks sail straight through the triggers a real player would hit — which is exactly the lesson the Solarus project had already taught the hard way.
Along the way the shared asset library it draws from grew to forty CC0 3D packs — 3,366 models — and twenty audio packs, each licence read off its source page rather than assumed. Every map gets music for its role, and anything without a recording falls back to a synthesised version, so nothing is ever silent.
Still rough
No bombs, bow, boomerang or swimming yet. Imported cliffs come out as low ridges, and side-view maps do not read in 3D at all. The touch controls exist but have never met a real phone. And it is not online yet: the imported Solarus art is CC BY-SA, which travels with the pages the moment they are public, so that is a decision before a deploy, not after.
For one evening and one message, though, that is a lot of engine.