Rooms are data, physics is code
A room is a plain RoomSpec: cast, personality rigs, locations, an action menu, two room-specific questions, ticker templates. Adding one should mean adding one file and never touching the engine.
The split
| Data (a room) | Code (the engine) |
|---|---|
| who is here, and their rigs | what trust, heat and standing do |
| where they can stand | how proximity moves trust |
| what moves exist, and their prices | what each move kind actually does |
| the two room questions | coercion, resolution, the betrayal bar's shape |
| how the ticker phrases things | what the ticker is told about |
Every action declares a kind
An action in the menu names an engine ActionKind. The Syndicate's pull_in and a pair room's lock_alliance are different words, prices and blurbs over different kinds, and neither room contains any behaviour. If a new room needs something genuinely new, add a new ActionKind to the engine instead of a special case on a room id.
There is a hard version of this rule: no if (room === ...) in the engine, and no engine constant hardcoded into a component.
The room has to explain itself
RoomSpec.objective carries the game in plain English: the prize, who decides, what winning and losing look like, the badge for somebody safe, the badge for somebody out, and three how-to-watch lines. The engine never reads a word of it, and the UI reads nothing else.
That matters because the rooms are mirror images. Being tapped is the win on the rooftop; being named is the loss in the writers' room. No generic phrase is correct in both, so any hardcoded "eliminated" in a component is a bug waiting for the next room.
The three shapes so far
A fourth room has to be a fourth shape. Another room where peers vote somebody out is a reskin, and reskins are how a data-driven engine stops being one.
| Room | Who decides | Selection | Alliances are |
|---|---|---|---|
| Midnight List | an outsider, from outside the politics | tap, positive, visibility wins | a pair |
| The Syndicate | the cage, by crew size | crew, positive, and split | a crew |
| The Cut (archived) | the room, by ballot | ballot, negative, visibility kills | a pair |
Read next
Tap, ballot, count: three ways a room decides
One engine runs positive selection by an outsider, negative selection by the room itself, and payment by coalition size. Which one a room uses inverts what every other rule in it is worth.
Personality as arithmetic, not flavour text
A character in Parlour is a class, meaning what they are allowed to do, plus a rig of code-level modifiers: prices halved or raised, moves forbidden, confidence floors, effects that bounce. No character has a personality paragraph.
Blocs and crews: two shapes of alliance
In the pair rooms an alliance is two people who share heat and cover each other. In The Syndicate it is a crew of any size that splits a pot evenly, which turns every recruitment into a maths problem.
What a beat is
A beat is the simulation's unit of slow time, fifteen seconds of wall clock and twenty or twenty-four to a party. It is the only moment at which heat cools, energy returns, trust drifts and a room makes a decision.