~/code/solarus-playground · five quests

Five quests on
a 2003 engine.

Small 2D action-RPGs on Solarus, at 320×240, built out of its free resource pack — one folder each, one git repo each. Two of them are games. Three are openings for games that do not exist, which turns out to be the fastest way to find out whether a world is worth the rest of the work. Sibling shelf: godot-playground.

In order of making. Newest last. Click a frame under any plate to swap it in.

A frame from Emberwatch

01 a tutorial that never names a button

Emberwatch

Half an hour of light left, and four lanterns to see to.

Chapter one of a lamplighter’s story, and a ten-minute argument that a tutorial can be a place instead of a list. Every lantern is blocked by something you can see — brambles, a stone too heavy to walk past, a man who won’t move — so the thing in the way is the lesson, and no villager ever says the word “press”. A nudge director watches what you have already tried and only speaks when you are genuinely stuck. Underneath it, levels are authored as ASCII terrain and compiled to Solarus map data with autotiling, and a small PNG codec renders the compiled maps to images, so a level can be reviewed without launching the game at all.

Arrows
walk
Action
talk, read, lift
Attack
the sword, once you have it
Pause
the controls page, any time

320 × 240 · Solarus 2.1.3
maps compiled from ASCII terrain

▶ play cd emberwatch && npm run play

npm run smoke

A frame from The Unnaming

02 an epic intro, and nothing else

The Unnaming

A world written into being by two sisters — one who named things, and one who unnamed them to make room.

Six minutes of myth, credits and cutscene, ending on a chapter card for a game that does not exist. Unnaming is not killing: a thing that is unnamed was never there, and nobody grieves it. Three deliberate moves. You are staff — the most consequential conversation in nine thousand years happens over your head while you carry a tray to a table, and the middle third hands control back and lets the argument continue as captions. The credits are part of the story — they are printed on a map that loses three places while you read them, letter by letter. And nothing auto-advances: a key press moves the current beat, never the whole sequence.

Any key
advance one beat, never more
Arrows
walk, in the three scenes
Action
talk — everyone in the room answers
UNNAMING_FROM=
start at a given menu

320 × 240 · Solarus 2.1.3
plates described in ~25 lines each, not pixelled

▶ play cd the-unnaming && npm run play

npm run smoke -- --intro

A frame from The Thaw

03 an intro, and a voice

The Thaw

Nine hundred people standing on two miles of ice, on the morning the ice starts to go.

The winter is a hundred and four years old. Gran is a hundred and thirteen, she says she ate an apricot once, she kept the stone, and nobody believes her. This morning there is a line on the horizon that isn’t white. Two things in here are worth stealing outright. docs/VOICE.md is a style guide written against the register intro writing drifts into — the one where every line is an abstract noun, a reversal and a full stop — and its most useful rule is if a line would look good on a poster, cut it. And art/tileset-ice.mjs generates an entire tileset, twenty-eight patterns, sheet and .dat together, because the free pack has no snow in it.

Any key
advance one beat
Arrows
walk, in Sokh
Action
talk
THAW_FROM=
start at a given menu

320 × 240 · Solarus 2.1.3
its own generated tileset, twenty-eight patterns

▶ play cd the-thaw && npm run play

npm run smoke -- --intro

A frame from The Dead Hour

04 Max Payne with a sword

The Dead Hour

Five men in a rain-soaked yard, one stairwell at the back, and none of them know you are in it yet.

Hold item 1 and the world drops to a fifth speed while you stay at three quarters. That is the Slow, and it shipped first, on its own, and it was boring — a good verb is not a game. The stealth is what gives it something to be the answer to: every man has a facing and a vision cone, suspicion fills three times faster in lamplight than in rain, and a full bar is a shout that carries a screen width. The pools you can see are drawn at exactly the radius the code measures, because a stealth game where the light you see isn’t the light they see you in is a stealth game that lies. Come up behind a man and attack is a takedown instead of a swing — same button, so there is never a moment of deciding which one you are pressing.

Arrows
move
Attack
swing — or take him down from behind
Hold Item 1
the Slow
Item 2
lunge

320 × 240 · Solarus 2.1.3
comic panels built from real tiles, then graded

▶ play cd the-dead-hour && npm run play

npm run smoke

A frame from The Ninth Bell

05 an intro in the shape of a 1994 RPG

The Ninth Bell

It has been rung eight times, and it has always held. Tam Orrick is fifteen.

Every nineteen years, four months and a day, somebody in Callow rings the bell on the ridge and the thing under the hills goes back down. Nobody knows why it works. It works this time too — and eight seconds later, from under the hill, something rings back. Built deliberately to the grammar of a 16-bit console RPG: a legend in painted plates, the credits over a parallax march at dawn, a world-map flyover, a title card, a fair full of people, and the ritual. The flyover is Mode 7 — a generated continent sampled per scanline and rendered offline into sheets of frames, with the clouds projected onto a plane above the camera by the same maths, which is the difference between flying and scrolling. The way up to the ridge is not locked; it has a person standing in it.

Any key
advance one beat, never more
Arrows
walk, at the fair
Action
talk — everyone answers
BELL_FROM=
start at a given menu

320 × 240 · Solarus 2.1.3
Mode 7, and a bell the resource pack does not have

▶ play cd the-ninth-bell && npm run play

npm run smoke -- --intro