I am building a game for the kids in my family. It is a Godot 4 project, two dimensional, a side-scrolling platformer stitched to a top-down village hub in the style of the SNES role-playing games I grew up on. The story is short and finished: a star falls, a boy carries it home. The whole cast is the family, turned from photographs into game art by an offline pipeline, which is a separate post. This one is the pictures.

The repository keeps a docs/img/ folder, and the rule for it is that a screenshot goes in when it proves something: a before and an after, a measurement, a decision. That makes the folder a progression by accident. Here it is, in the order the files arrived.

July: a level is a JSON file

The first level, 11 July: a tilemap and coloured dots, drawn by the loader from a JSON file.

The first screenshot is the least impressive and the most important. Every level, story node, line of dialogue, battle and cutscene is data, read by one loader. The coloured dots are entity markers: the loader knows what a “chest” or a “villager” is from a tile-id dictionary, and nothing in the level is a hand-built scene. A level authored by a script looks identical to one authored by me, which is the point.

The same festival place two ways, 12 and 26 July: a painted concept for the tileset, and the tilemap the game actually loads.

The festival as a tilemap: the shape of the painted concept, in tiles the loader can walk.

Each place got a painted concept and a tilemap. The painting decides what the tileset needs; the tilemap is what ships. Keeping both side by side is how I caught a well that was drawn as a fountain, which the two-presentations post tells at length.

July: a cast

The splash, 11 July: the family under the falling star.

The cast sheet, 26 July: one identity per person, projected onto every surface the game has.

The cast sheet is the contract. Every character has a portrait, a hub sprite, a platformer sprite and a battle pose, and they must read as the same person. The pipeline that produces them ran on reference photographs that never leave the house; the sheet is generated art only. When a new character is added, the sheet is the QA gate.

September: a title screen and a fight

The title screen, before and after the September UI pass.

After: the same screen, with a font and a frame that belong to the game rather than to the engine.

A battle, before: the fox, the party, and default controls.

A battle, after: the same fox, the same party, a menu you can read from a couch.

The battle system is turn based and gentle. You do not defeat the fox; you make friends with it. The before-and-after pairs exist because the UI pass was done as one sweep across six screens, and a sweep needs evidence per screen or it is a claim.

The fishing minigame, 1 September: a rhythm of four shapes, played from the town square pond.

Fishing arrived as the first life skill. The design page argues for five villages, each with a skill, and fishing was the one I could build in a day: cast, wait, match four shapes, catch. The bag, the phone and the shop counter all came with it.

Feet, 2 September: eight frames of the platformer sprite before and after the ground-contact fix.

This one is a measurement. The platformer sprite floated a few pixels above the ground in half its frames. The fix was a per-frame foot offset written into the character package, and the sheet is the proof it holds across all eight.

Cockle Bay at night, 8 September: the beach village the design page asked for, arriving as a painted concept first.

The same chapter, in three dimensions

In late August I started a second Godot project that reads the same story files and the same place manifests, and presents them in 3D. It is not a port. It is the same content with a different renderer, and where the two disagreed, the disagreement was always in a picture rather than in the data.

The 3D title, at 2560 wide: a village hub behind the menu.

The village in 3D: terrain, real grass, a fountain that is a fountain.

The seaside crossing, in the 3D game's 2.5D mode: the platformer level's own tilemap, extruded, with movement locked to one axis.

The 2.5D crossing is the one I was sure could not exist. A side-scrolling level is an elevation; a 3D level is a plan. Then the 3D game grew a planar mode with an orthographic side camera, and the crossing is derived from the 2D level’s tilemap directly. What genuinely refused to port was one number: the jump height.

A 3D battle, stylised on purpose: the register shifts from a realistic hub to a flat, bright fight, and that shift is a kept decision.

Fishing in 3D: the same four shapes, the same pond, a different camera.

Inside the inn: interiors generated as props from a catalogue, placed by manifest.

The festival at night: the same scene as the 2D tilemap above, lit.

The launch: the star climbs out of the boy's arms, and the caption is the same line the 2D game shows.

The sky cloak in both games: one 24 by 30 pixel sprite, one 3D garment, the same four-colour ramp.

The cloak is the picture I would keep if I could keep one. It is one item in one save file, drawn by two renderers from one palette, and it is the whole argument for sharing meaning and forking the picture.

What the folder taught me

A screenshot that proves something is worth keeping; a screenshot that shows something is worth deleting. The folder has thirty-five files after two months because every one of them answers a question I had that day, and the questions turned out to be the history.