~/code/godot-playground · thirteen experiments

One folder
per question.

Small self-contained Godot 4 projects, each built to find out whether one specific idea feels good in the hand. No asset files in any of them — the sprites are strings, the music is arithmetic.

In order of making. Newest last.

A frame from Leviathan

06 one fight · ★ favourite

Leviathan

You have no attack. Every point of damage it takes is its own lightning, sent back.

A stone pier, a storm, and four phases of something that keeps turning out to be larger than the last thing you saw of it. The guard is a ring, not a swing: open for 0.15s and then locked for 0.22s, so mashing is strictly worse than reading. The first 0.07s is a perfect guard — brighter flash, a bell a fifth higher, and a quarter second of the world at a third speed. It catches everything inside the ring at once, which makes a three-bolt volley the best thing that can happen to you rather than the worst.

A / D
move
W
jump — the arm comes along the deck
Space
guard
Shift
dash, with invulnerability

320 × 180
tuned against two bots that play it

▶ launch godot --path 06-leviathan

A frame from Vigil

09 the first RPG experiment · ★ favourite

Vigil

It tells you what it is about to do. Answer it.

One turn-based battle, and the tempo of it. Gauges fill in real seconds. The Hollow King never attacks out of nowhere: every move winds up on a bar that names it and says what you can do about it — can be pinned, or cover it. Three of you, six abilities, three resolves, three phases, and the last word in the last phase cannot be survived unless somebody stops it. While a menu is open the world slows to a third instead of stopping, so a decision has a cost but never a price you could not see coming.

W / S
cursor
Space
confirm
K
back
Resolve
fills from being hit; a third option when full

320 × 180
rules and pixels kept apart; the bots play the real game

▶ launch godot --path 09-vigil

A frame from Halden

11 the first act, only · ★ favourite

Halden

More fires on the plain than people behind the wall.

The first act of an RPG and nothing after it: a siege, a runner, a letter, a sword, a bell, and one thing carried out of a burning city. The first frame is nine hundred campfires from the top of the wall. Every card and every line waits for a press. Four missions are the tutorial, each with a person attached — the king teaches running, Brann the sword and then the roll, and the last mission is all three at once for a ten-year-old who cannot roll. Ends where act two would start.

WASD
run
Space
continue; swing
Shift
roll

320 × 180
a bot plays the act on real input and must reach the boat with Ilse alive

▶ launch godot --path 11-halden

A frame from Grapple Swing

01 movement

Grapple Swing

Can a rope feel good without ever taking your speed away?

A grappling hook that constrains position and nothing else. If you are further from the anchor than the rope is long you get snapped back onto the circle — no spring, no damping — and only the outward component of velocity is removed. Everything along the arc survives, so speed compounds from swing to swing instead of bleeding away. Ten orbs hang over the gaps; the only way to reach them is to already be moving.

Hold LMB
fire and hold the hook
A / D
pump the swing
W / S
reel in / pay out
Space
cut the rope and kick upward

1280 × 720
Godot 4 · GDScript

▶ launch godot --path 01-grapple-swing

A frame from Dungeon

02 combat feel

Dungeon

What separates a fight that reads from one that feels like bumping into furniture.

Top-down 16-bit combat at a true SNES resolution. An imp notices you at 96 pixels, closes, then spends four tenths of a second coiling backwards before it lunges — the wind-up is the whole fight. Hits land with a few frames of hitstop, the slash fires on press rather than on release, and rooms change one screen at a time.

WASD
walk, eight ways
J / Z
slash, on press
Hold J / Z
charge, then release to spin
R
restart

256 × 224 · SNES
all sprites are strings in a .gd file

▶ launch godot --path 02-dungeon

A frame from Stormkeep

03 a small game

Stormkeep

You start unarmed, so the early rooms are pure stealth.

An actual game in two chapters, built for a phone at nine by nearly sixteen. Cone-of-vision guards, screened corridors, a sword you have to steal, keys, locked doors, a brother you cannot free, and the Warden at the top of it. The odd width is deliberate: column six is a true centre, so a door or a lone guard can stand dead middle in a way an even-width room never allows.

D-pad / WASD
move
Z
talk, read, and later swing
X
lift and throw
Enter
the pause menu

208 × 368 · portrait
chiptune score synthesised in code

▶ launch godot --path 03-stormkeep

A frame from The Waking

04 a climb

The Waking

A mountain that turns out to be a sleeping giant.

Thirteen hundred metres in seven chapters, from rain on a road at dusk to a sunrise on a forehead. One number — altitude — drives the sky, the weather, the frost line on the rock, the wind and the mix, so the climb is also a night. Five stems of score all play from the first second and altitude opens their faders. Nothing can kill you; a fall costs height and the wind puts you back at the last light you lit.

A / D
move
Space
jump — hold in the air to glide
Into a wall
slide, then jump to kick off
Rising dust
ride it

320 × 180
level verified by flying the real jump arc

▶ launch godot --path 04-colossus

A frame from Perihelion

05 orbital mechanics

Perihelion

Eight seconds of engine, and a star at the bottom of a very deep hole.

The interface is the future: a dotted line showing where you will be for the next ninety seconds, over ghost markers showing where each planet will be when you get there. What the game wants you to feel is the Oberth effect — fourteen pixels per second of thrust, spent at the bottom of the well where you are already doing three hundred, throws you past the gas giant. The same burn anywhere else does almost nothing.

A / D
turn
Space
burn, eight seconds ever
Hold Shift
run the clock, and see the whole system
R
recall to the last gate

320 × 180
route found by simulation before the game was built

▶ launch godot --path 05-perihelion

A frame from Landfall

07 the inversion

Landfall

Every other folder in here is a small person looking up at something enormous.

So this one hands you the enormous thing and leaves the camera where it was. Each tower is a grid of six-pixel blocks: a hit clears blocks in a circle and every cleared block becomes falling debris, so you can see the bite you took out of the eighth floor and the rubble stays in the street. Lose enough of the bottom three rows and the whole thing rotates about its base corner and shatters. The people are three pixels tall and run, and they are the entire reason any of it means anything.

A / D
walk, slowly
Space
swipe
S
stomp
Hold Shift
charge through the building

320 × 180
sixty towers, block by block

▶ launch godot --path 07-landfall

A frame from Sounding

08 echolocation

Sounding

See, or be unheard. Never both.

A flooded cave with no light. Press the voice and a ring of sound rolls out, lighting every rock face it touches, then fading. Something at the bottom hears every call: it goes to where it last heard you and circles there, it hears by water rather than by line, and it cannot get its head into the narrow cracks you can. Its own call lights the cave red from wherever it is, and lights you red when it reaches you. Tested by a diver who shouts and must die, and a blind diver who may only swim toward water its own sound has crossed, and must surface.

WASD
swim; you coast
Space
call out
Bubbles
air, and a checkpoint
A crack
the one place it cannot reach

320 × 180
one Dijkstra flood is the ping, the hearing and the pathfinding

▶ launch godot --path 08-sounding

A frame from Threshold

10 action RPG

Threshold

There is a tower. You are not ready.

An action RPG about one feeling: getting stronger, and knowing it. The thing at the gate kills you in one hit at level one. Damage is scaled by level difference before anything else happens, every enemy wears its level over its head, and ten levels take about eight minutes — short enough that you still remember when it was impossible. Death costs the walk back and nothing else. The map is fog of war, and it draws the tower before you have seen it.

WASD
move
Space
swing; three hits
Shift
roll, through things
M
the map

320 × 180
a rusher must die in one hit; a grinder must open the gate

▶ launch godot --path 10-threshold

A frame from Noon

12 the day the sun went out

Noon

The sun went out at noon on midsummer.

The first act of an RPG, opening in the brightest light in the playground so there is something to lose: sixty people in a square, bunting, a band, the fountain going. At noon the sun goes, in ten seconds, and the town is a different place. Light is the combat system — a lantern pool, oil that burns when you raise it, four lamps that are rooms now, and shades that can only be hit while standing in light. Orrin teaches each of those with a reason. Ends at the glass: an eclipse moves. This has moved not at all.

WASD
walk
Space (hold)
raise the lantern
Space (tap)
swing the pole
Shift
roll

320 × 180
a bot plays the act and must reach the glass with three people under lamps

▶ launch godot --path 12-noon

A frame from Tithe

13 the seventh year

Tithe

Every seventh year it comes down and takes one.

The first act of an RPG whose intro is the thing itself: two hundred pixels of dragon landing in a square full of kneeling people at dusk, taking your sister, and leaving. Everyone goes home. You walk north. Real levels with Threshold’s level-difference rule, so foothills, cliffs and snow are each a wall; a one-legged shepherd teaches the roll; campfires are checkpoints. Ends at the mouth of the lair with one eye the size of the screen: I should like to be wrong about something.

WASD
walk
Space
swing; three hits
Shift
roll, through things

320 × 180
a bot climbs on real input and must reach the lair above level one

▶ launch godot --path 13-tithe

A frame from Parley

14 the river is closed

Parley

The Compact has closed the river. Two knights go aboard to talk.

The first act of an RPG built on the shape of a very well-known opening act: two envoys, an ambush, an escape through the invasion’s loading deck, a landing in the wild, a local who pulls you under — with none of its names. A steward, a state-room, a glass in the wheelhouse that says smoke the room; breath as a bar under your feet; Ser Vesk fighting beside you; wardens a sword does nothing to; a hold where fifty visors light one by one; patrol cones on the barge deck; the fens, the herd, Wend. Cutscenes first, gameplay as the tissue between them.

WASD
walk
Space
swing; three hits
Shift
roll, through things

320 × 180
a bot plays the act on real input and must end in the reeds

▶ launch godot --path 14-parley

A frame from Muster

15 the beacon is lit

Muster

Twenty spears from Ashby by dawn. There are twenty-three. You know all of them.

A mini RPG whose gameplay is knocking on doors. The lord wants twenty spears at the ford by first light; behind every door somebody has a reason to go and a reason not to — the only smith, the widow’s only son, a fourteen-year-old who begs, the bailiff who is not on your roll, an old woman who can hold a needle. TAKE or LEAVE, and they fall in behind you with torches. The sergeant counts heads, dawn comes, three waves cross the ford, and your levy fights beside you with what they are worth. The ending is a ledger: one card per name that did not come home. The Solarus optic: the Solarus free resource pack read straight from its .dat descriptors — a village tileset placed by pattern id, Eldran with the real sword animation, the pack’s NPCs, soldiers and bullblins — at 256×224, with real music and sounds, an 8-px font in blue windows, palette night.

WASD
walk
W / S
choose
Space
say it; swing
Shift
roll

256 × 224
a bot plays the night twice, worth-it and everyone, and must hold the ford

▶ launch godot --path 15-muster

A frame from Hearth

16 the pass is closed

Hearth

Hollin, in the snow, on Midwinter’s Eve. Seven lanterns, a cat, soup, and a gate.

A cosy snow town, Flanoir-style: night, snowfall, warm windows, quiet music. Seven lanterns to light along the street, a smith who won’t come to the hall, a cat behind the chapel, soup carried two-handed to the watchman at the gate — and then a lantern on the pass, on the wrong side of a gate the rule says stays shut. Open it or not; either way something follows the light down and you hold the gate under the lanterns you lit. The cold is a bar that only means something outside. Solarus pack art snowed at load from its own pattern descriptors.

WASD
walk
Space
light, talk, swing
W / S
choose
Shift
roll

256 × 224
a bot plays the night twice, gate opened and gate shut, and must end in the hall

▶ launch godot --path 16-hearth