~/code/godot-playground · thirteen experiments
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.
06 one fight · ★ favourite
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.
320 × 180
tuned against two bots that play it
▶ launch godot --path 06-leviathan
09 the first RPG experiment · ★ favourite
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.
320 × 180
rules and pixels kept apart; the bots play the real game
▶ launch godot --path 09-vigil
11 the first act, only · ★ favourite
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.
320 × 180
a bot plays the act on real input and must reach the boat with Ilse alive
▶ launch godot --path 11-halden
01 movement
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.
1280 × 720
Godot 4 · GDScript
▶ launch godot --path 01-grapple-swing
02 combat feel
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.
256 × 224 · SNES
all sprites are strings in a .gd file
▶ launch godot --path 02-dungeon
03 a small game
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.
208 × 368 · portrait
chiptune score synthesised in code
▶ launch godot --path 03-stormkeep
04 a climb
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.
320 × 180
level verified by flying the real jump arc
▶ launch godot --path 04-colossus
05 orbital mechanics
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.
320 × 180
route found by simulation before the game was built
▶ launch godot --path 05-perihelion
07 the inversion
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.
320 × 180
sixty towers, block by block
▶ launch godot --path 07-landfall
08 echolocation
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.
320 × 180
one Dijkstra flood is the ping, the hearing and the pathfinding
▶ launch godot --path 08-sounding
10 action RPG
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.
320 × 180
a rusher must die in one hit; a grinder must open the gate
▶ launch godot --path 10-threshold
12 the day the sun went out
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.
320 × 180
a bot plays the act and must reach the glass with three people under lamps
▶ launch godot --path 12-noon
13 the seventh year
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.
320 × 180
a bot climbs on real input and must reach the lair above level one
▶ launch godot --path 13-tithe
14 the river is closed
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.
320 × 180
a bot plays the act on real input and must end in the reeds
▶ launch godot --path 14-parley
15 the beacon is lit
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.
256 × 224
a bot plays the night twice, worth-it and everyone, and must hold the ford
▶ launch godot --path 15-muster
16 the pass is closed
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.
256 × 224
a bot plays the night twice, gate opened and gate shut, and must end in the hall
▶ launch godot --path 16-hearth