When the simulated player reacts late: re-measuring and refining the chapter
Our difficulty script now models reaction time, busy hands and errors that run together. One prompt had Claude Code re-measure the 34-room chapter and fix the four rooms that missed.

Before you start
- The juiced chapter from part 8: 34 rooms and 2 bonus rooms in a single-page Phaser game, with tests, a route for every room and the measuring hook.
- Claude Code, started in the game's folder, plus Node and Playwright for the skill's measuring script.
- The skill at the end of this page, in the folder's .claude/skills/platformer-levels/. This version measures with the full player model by default. Then give the prompt above to a fresh session.
What we asked“Our difficulty numbers so far only counted small timing errors. Measure the chapter again with the skill's full player model, marking which steps are reactions, then refine the rooms that now miss their targets. Don't change how the character moves or the effects.”
What happened
- Loaded the platformer-levels skill
- Measured the chapter with the old simple model as a baseline
- Read the rooms and routes and marked 2 steps as reactions
- Measured again with the full model
- Changed rooms 6, 16, 17 and 34, one at a time
- Added room and finished to the measuring hook for --playthrough
- Re-measured the changed rooms at 200 runs on two seeds
- Took pictures of the changed rooms and ran the 15 tests
All 34 main rooms of the chapter are back inside their difficulty targets under a stricter simulated player. Claude Code re-measured them, found four rooms that the new player model fails too often, and changed one or two tiles in each. The character’s movement and the effects from part 8 are untouched.
Up to part 8, our measuring script treated a player as someone who presses every key a little early or late at random. That is the “simple” model. Real players do worse in three ways, so the script’s new “full” model adds them:
- Reaction time. When the game gives no warning, you can only answer it. A step marked “react” in a route comes 0.18 to 0.30 s late, depending on the player.
- Busy hands. Inputs that come less than 0.2 s apart, or that switch direction, get sloppier.
- Errors that run together. A player who was late on one press tends to be late on the next one too.
These numbers are starting guesses. We’ll calibrate them once real players have played the chapter.
What Claude changed
Claude read every route and marked two steps as reactions. Both are the moment a cracked lid drops you onto springs, in Hold still (room 32) and The long way (room 34), and the player has to start moving the instant it goes. Then it measured the whole chapter, traced the rooms that missed, and changed four of them.
The pass rates below are for the player who has reached each room, from our own measurements at 50 runs per player.
| Room | What changed | Simple, before | Full, before | Full, after |
|---|---|---|---|---|
| 6 Goal | Door ledge one tile lower: a 128 px climb instead of 160 px | 96% | 86% | 94% |
| 16 Spring to the crack | Door one tile lower | 64% | 58% | 78% |
| 17 Climbing stones | First cracked stone two tiles wide instead of one, top ledge one tile wider | 68% | 46% | 68% |
| 34 The long way | Last orb two tiles closer to the springs, door ledge one tile wider | 54% | 0% | 52% |
Room 34 went to 0% for every player, skilled ones included, because of the reaction mark. Even with perfect timing the player only grazed the bottom of the last orb, so starting to move a reaction time after the lid dropped always left them too low. Without the mark, the full model gave it 56%.
What the session missed
Our checks after the session found these. Claude didn’t catch them, and we didn’t send them back as prompts.
- The long way now favours a late player. With the modelled reaction delay, the skilled player passes 100%. With on-time presses (the simple model) it passes 82% at 50 runs and 88% at 200.
- The reaction marks are inconsistent. Spring, crack, spring (room 30) has the same kind of step and wasn’t marked. And the lid shakes for a visible 0.5 s before it drops, so you can argue that both marked steps are planned rather than reactions, which is the reason Claude itself gave for not marking anything else.
- The playthrough couldn’t handle optional rooms. The script expected every door to lead to the next room in the list. Claude worked around it on a copy without the two bonus rooms.
- The pictures missed the end of wide rooms, so nobody looked at the changed end of The long way. Claude said so in its report.
- It wrote its experiments to the shared /tmp folder, where a parallel session could have clashed with them.
We’ve fixed the skill since. The playthrough now follows the game’s own door order, pictures cover rooms wider than one screen, and the measuring guide says a visible fixed timer counts as something the player sees coming. It also warns never to tune a room that only a late player can pass, and to check such rooms with the simple model too.
It took one prompt and no follow-ups: 32 minutes and $2.23 of Claude Code working alone.
Get the skill. The measuring script works for any browser platformer, and every player-model number is an option you can change. You can also install all seven skills as a Claude Code plugin or replay this part from its starting files.
The chapter after this session. Arrow keys or A/D to move, Up, W or Space to jump, and again in mid-air to double jump. J switches the effects. You need a keyboard; the game has no touch controls. We only added the start screen and loaded Phaser from this site.
Recorded with a clean Claude Code: no personal skills, plugins or MCP servers. The session had platformer-levels and our earlier platformer-feel and game-juice skills installed.
The skill that made it work
It makes Claude build each room around one idea, check it with the jump numbers and a scripted route, and measure the whole chapter with a bundled script whose simulated players react late, get sloppy when inputs pile up and carry their errors from one input to the next.
- Keep levels as data: each room in a small grid or list (tiles, hazards, pickups, start, exit), separate from the game code.
- Write each room's one-line story first: one sentence about the single thing the room asks of the player. Build only what serves it.
- Teach in order, without text: each new move or object is shown safely, then used, combined and tested.
- Check every room with the jump numbers: work out from the game's constants how far and how high the player can jump, check every required jump and every tempting wrong jump, then play each room with a scripted route.
- Plan the whole game, not just a room: one new element per area through introduce, develop, twist and test, with every room measured so the difficulty rises in waves. For browser games, use the bundled script (default --model full): add its hook, write a route per room and mark the steps that are reactions.
- Report like a level designer: for each room, its story, what it teaches, its hardest jump as a share of the maximum, and whether the scripted route finished.
Save it as .claude/skills/platformer-levels/SKILL.md in your project.
Was this useful?
Thanks, we read every message.
Part 9 of Make a complete platformer with AI

