The problem
I wanted to make a game my partner and I could play together, as a wedding gift. Its theme is that the two players get stronger together, so every system has to work for two people on two computers, with neither player turned against the other.
Who did what
I locked the design decisions and playtested each build. The decision log quotes my calls from those playtests, and a decision changes only when I say so. I picked the music and sounds by ear, since Claude can’t listen. Claude Code wrote the game, the tests and the tooling, and fixes art with scripts, because a project rule says I do no manual art work. Claude Code is co-author on all 367 commits.
Constraints
- The host owns the game state, and the other player only sends input. Every feature is built that way from the start.
- Names, dialogue and other personal text live in data files, never in code.
- Logic that doesn’t need the scene tree gets GdUnit4 tests first.
- The art packs are licensed for use in the game but not for redistribution, so the repo stays private.
The trade-off
Hit-stop, the brief freeze when a hit lands, is visual only. Pausing game time would pause the world for both players, because the host runs it. So a landed hit holds the attacker and the enemy still on screen for 50 ms while the simulation carries on.
Outcome
- Playable and in playtesting. Milestones M0 to M12 are done, in 367 commits over three weeks.
- 511 GdUnit test functions in 78 suites.
- The check script runs a headless co-op test: a host and a joiner start as two Godot processes, and the joiner plays through real input, from moving and aiming to driving the in-game camper van. The test passes only if both sides see the same game state.
- The second Mac wasn’t available, so milestones closed on one Mac running two instances. The two-Mac runs come last.
How it was built
- A
PostToolUsehook runsgd-check.shafter every edit to a.gdfile:gdformat,gdlint, then a headless Godot type check. Anything left goes straight back to Claude. - The Godot MCP server lets Claude run the game and read its errors.
CLAUDE.mdhas ten hard rules, starting with “never re-argue a locked decision”, and defines done:tools/check.shpasses, co-op test included.- Claude searches a local copy of the Godot API docs before guessing at a method.