The Whole Tour Is a JSON File
100 stages, five venues, boss nights and breathers — all of it lives in levels.json, and a headless robot plays every stage to prove they're beatable.
Early on, the difficulty curve of Roadie Wars 5 was a handful of formulas: hazard counts as functions of the stage number. Elegant, and a trap — when every stage is a function of its position, stage 3 and stage 63 can differ in scale but never in character.
So the formulas got written out as data. levels.json holds one entry per stage — 100 of them — seeded by a script so that an untouched file reproduces the old curve exactly. What the file adds is the ability to disagree with the curve.
![]()
The load-bearing idea is intensity. It's what the difficulty formulas are fed instead of the raw stage number, and by default it's equal to it. But set stage 63's intensity to 12 and it plays like stage 12 while still being the 63rd night of the tour — a breather after a brutal boss, which a pure ramp can't express. Music sets do this. Tours do this. Now the game does it too.
Each stage entry can also carry its own venue, objective, tower height, boss, per-hazard overrides, custom goal art (a stage that climbs toward a bathroom door is a stage I will neither confirm nor deny), even its own backing track. The venues rotate every five stages — dingy bar, small venue, theater, arena, stadium — with a boss on every fifth night: the Super Groupie, the Promoter, the Headliner, and worse.
![]()
And everything degrades safely: no file, a broken file, a stage the file doesn't mention — they all fall back to the formulas. A bad edit costs you the edit, not the game.
The robot that plays every stage. Procedural levels have a failure mode: a stage that cannot be finished. A trap door cuts a girder, a ladder lands wrong, and suddenly stage 47 is a wall. So the game has an -audit launch flag: it boots headless, builds every stage, and walks the level graph — girders, ladders, springs, portals — to prove there's a path from the spawn to the objective. Every stage, every venue, in seconds, in CI fashion, with no human thumbs involved.
The result is a 100-stage tour that one person can actually tune. Change a number, run the audit, play the stage. The tour is a JSON file, and that's the most rock and roll sentence I've ever written.
This is part 3 of a five-part series on building Roadie Wars 5 : Stage Climb:
- Why our first iPhone game starts at 5
- An AI art department in a Python folder
- The whole tour is a JSON file
- Comic cutscenes and a localhost editor
- Shipping an iPhone game with a robot on the mixing desk
Roadie Wars 5 : Stage Climb is heading to the App Store — climb the rig, save the tour.