← Devblog

Rooms are files now

Every episodic project dies the same death: not from running out of ideas, but from each new episode costing engineering. This game’s founding bet is that a room is data — a text file a person can read like a floorplan — and today that stopped being a design document and started being a loader.

A room now looks like this (the actual third episode, abridged):

schema = 1
id = "s1-e03-two-weak-spots"
season = 1
episode = 3

[objective]
type = "exit"
locked_until_contained = [1]

[tools]
seal = 1

[[spawn]]
id = 1
behaviors = ["pursuit"]

[grid]
map = '''
#######################
#@........#..........X#
#..##.....#.......##..#
#..##.....+.......##..#
#.........#...........#
#....##...#...##......#
#....1....#...##......#
#.........#...........#
#..##.....+.......##..#
#..##.....#.......##..#
#.........#...........#
#.........#...........#
'''

The grid is the level editor. @ is you, 1 is her, X is the door, and the two + cells are the wall’s weak spots. You have one seal. Sit with that for a moment, because the intercom won’t: his opening advice in this room is to open both weak spots and let some air through. Open both and the room becomes honestly, provably unsolvable — there’s a test asserting exactly that, on purpose, next to the test asserting the room is solvable if you show some restraint. The tutorial remains the antagonist; now the test suite is in on it.

Three episodes exist: the original room (converted to data — a test pins that the conversion changed nothing), a three-chamber sprint where two of the kids converge on you and the trick is sealing the middle of the house with both inside, and the restraint room above. Clear one, press Enter, meet the next. After the last one the game says the only thing this project will ever say about scheduling: “New room when it’s ready.”

The validator is the quiet star. Every mistake we could imagine a tired author making — a ragged grid, a zombie digit with no definition, a narration key that doesn’t exist, a tile the engine can’t run yet — fails at load, loudly, naming the problem. The alternative is a room that loads wrong silently, and we’ve written enough confession posts this week.

Honesty corner: the milestone’s real test is “author three rooms in an evening,” and shipping three rooms we authored doesn’t prove it — we wrote the format, of course it’s fast for us. That test belongs to someone sitting down with the format cold, and it stays open until they do. Cost of all this: about 250 KB of parser, bringing the whole game to 750 KB — still smaller than this page’s screenshots.