destroyulator/LANES/LANE7-cubicle-hell.md
Monster Robot Party e5f4e8c5e4 LANE7: the Gauntlet, four modes, two more provocations, and ambient attrition
THE GAUNTLET (Gauntlet.gd + Cabinet.gd)
Five identical cabinets, each with its alphabetical range on a Label3D. The brief names
a CLIENT, never a cabinet, so working out that HENDERSON lives in F-J is the puzzle —
no waypoint, nothing glows. Destruction is granular on purpose: pull a drawer, it
slides out on a spring and goes live, and the folders inside become individual
smashables. Doing that by hand inside the clock isn't really possible.

The perfect tool: every site hides a SHREDDER that eats a whole open drawer at once,
and the game never says so. Noticing it and working out what it's for IS the level.
Getting it wrong isn't fatal, just slow — the right shape for a secret, since it
rewards the observant without hard-failing everyone else.

Each site nominates its own records area in its spec. Building the bank 3.4 m in front
of wherever the player happened to be standing put it through walls.

MODES (Modes.gd, M cycles)
  CUBICLE HELL       the main loop
  THE GAUNTLET       above
  TOTAL DESTRUCTION  no job, no pay, clear the site, scored on time
  AGAINST THE CLOCK  fixed timer, maximise damage VALUE — the exact inverse of Cubicle
                     Hell, where expensive things become the goal rather than the
                     mistake. Same level, opposite instinct.
Entering a mode arms only what that mode needs; Cubicle Hell and the Gauntlet are
mutually exclusive, because you cannot be doing your job and shredding the Henderson
file at the same time.

TWO MORE PROVOCATIONS (Tasks.gd)
  STAPLES     SPACE lifts a staple, then it must be pulled the way it's bent — and it's
              bent differently each time. Dither and the sheet tears, bundle reprints.
  GUILLOTINE  align to a mark and cut. The guide has a PERMANENT offset and nothing on
              screen admits it. Once you work out the error it's easy, which is the
              joke: you have to learn to distrust the equipment.
Desks now alternate spreadsheet/staples so "a desk" isn't always the same minigame.

AMBIENCE (Ambience.gd) — the attrition you can't play around. The tube above your desk
flickers, and actually flickers the real lights. Fish in the microwave. A phone ringing
four desks away. Reply-all, forty-one recipients, "thanks!". Small periodic ticks with
no interaction at all; it's what makes the room hostile rather than merely beige.

Fixes: the payslip was rendering over the Gauntlet (it belongs to Cubicle Hell, and only
once the shift has actually ended); gauntlet drawer reach was 2.0 m when the true
distance from standing-at-a-cabinet to a bottom drawer is over 2 m.

dev/probe_gauntlet.gd drives a whole run headlessly — mode switch, labels, open every
drawer, shred, win — because that catches the failure that matters: a run you can't
finish because the files never become destroyable.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-31 18:12:20 +10:00

9.1 KiB
Raw Blame History

LANE 7 — CUBICLE HELL

The game stopped being a smash sandbox and became a game about a man having a bad day.

The pitch

You are at work. The work is designed to provoke you. A meter fills. When it fills you snap, and for half a minute you physically cannot go back to your desk until you've broken enough things. Then you sit back down and try to earn the rest of your shift.

Falling Down, but the payslip is the scoreboard.

The score IS your payslip

        NET  =  WAGES (tasks completed)    DAMAGES (everything you broke)

The load-bearing detail: rage drains a flat amount per object destroyed, but each object bills at its own value. During a meltdown the optimal play is therefore to smash a lot of cheap rubbish very fast — cartons, paperwork, monitors — rather than put the sledgehammer through a filing cabinet. You don't choose whether you lose your temper. You choose how expensive losing your temper is.

FURY (objects broken while actually melting down) is tracked separately and is deliberately not money, so "I ended the shift owing them $2,400" stays a brag.


BUILT (this lane, shipped)

Piece File What it does
Tilt meter game/scripts/Rage.gd WORKING → MELTDOWN → COOLDOWN. Provocations fill it, clean work drains it slightly, ambient office drains your patience passively. During a meltdown the clock stalls if you stop destroying — you MUST break things.
The blood vessel game/scripts/RageOverlay.gd Red vignette that closes in with rage and jumps inward on every heartbeat; procedural veins that creep further into frame the angrier you get; a synthesized lub-dub whose BPM goes 62 → 172. Zero assets: shader built in code, veins are draw_polyline, heartbeat is a generated WAV.
The job game/scripts/Tasks.gd Stations you walk to and are locked in place at (you're at your desk — that's the joke). Two tasks so far, below.
The shift game/scripts/CubicleHell.gd 5-minute shift, wages vs damages, meltdown count, end-of-shift payslip with a verdict line.

The two tasks that exist

  • SPREADSHEET — enter a figure in a named cell. Partway through, the selection silently drifts one cell — no sound, no animation. Commit without noticing and the figure lands in the wrong cell, you eat a big provoke, and you start again. This one task is the whole thesis of the game in about forty lines.
  • PHOTOCOPIER — run a copy job. It jams. Clearing it needs the right tray, and the trays are labelled 1, 2, 2A, 3, 3B because that's what head office decided.

BUILT — more ways to be provoked

STAPLES and GUILLOTINE shipped (see Tasks.gd), plus Ambience.gd for the passive attrition. The table below is what's still open.

Still to build

Each is a Tasks.Kind + a panel_state() case. The framework takes them without changes; the design constraint is that each must have one specific, identifiable way of wasting your time, not just "it's slow".

Task The provocation
Staple removal A stack with N staples. Click each. Too slow and the page tears — redo the sheet. The remover slips and takes a chunk out of the page.
Guillotine / paper slicer Align the sheet to a line, pull the handle. Misalign and the cut is crooked → redo. The alignment guide is 2mm off and always has been.
The phone Rings mid-task. You must answer it. It's hold music. Not answering keeps it ringing and ringing raises rage faster than answering does.
Printer driver The printer is "offline". Toggling it takes four clicks in a dialog that moves its buttons.
Reply-all An email thread with 40 recipients. You must reply to the sender only. The default is Reply All.
Toner Replace the cartridge. It's the wrong model number by one digit.
Timesheet Enter hours. It won't accept decimals. It also won't accept fractions.

Passive ambient provocations (no interaction, just attrition)

Someone microwaves fish. The air-con drips. A colleague's ringtone. The fluorescent tube above your desk flickers at a frequency chosen to be maximally irritating. Each is a small periodic rage.provoke() — cheap to add, and they're what makes the room feel hostile rather than neutral.


BUILT — modes

All four ship in Modes.gd; M cycles. The Gauntlet is Gauntlet.gd + Cabinet.gd (drawers slide out as their own bodies, folders inside go live, and the shredder eats a whole open drawer). Versus is still the open one.

The original design notes

  1. CUBICLE HELL (built — the core). Shift timer, work, snap, wreck, repeat, payslip.
  2. TOTAL DESTRUCTION — no job, no pay. Destroy 100% of the level. Scored on time.
  3. AGAINST THE CLOCK — fixed timer, maximise damage value. The inverse of Cubicle Hell: here expensive things are the goal.
  4. THE GAUNTLET (designed below — the most interesting one).
  5. VERSUS — two players, one office. Explore later; the interesting version is asymmetric (one working, one wrecking) rather than both wrecking.

THE GAUNTLET (design)

"you need to destroy every file in a specific cabinet but which one, heaps cabinets, real subtle hints, time limit, and you have to actually pull each drawer out, empty files out, destroy them individually or in small lots unless you have a specific tool"

  • A room of many identical filing cabinets. Exactly one holds the target files.
  • Subtle hints only: a memo on a desk names a client; a labelled folder on the copier; a sticky note with half a reference number. No waypoint, no glow.
  • Destruction is granular, not one-hit: pull a drawer → drawer slides out as its own body → files inside become individual smashables → destroy singly or in small lots.
  • The perfect tool. Each level has ONE tool that makes its gauntlet tractable — an industrial shredder for files, a crowbar for the drawers, a lighter for a wastepaper bin. It is somewhere in the level, and the game does not tell you what it is. Working out "what would actually make this fast" IS the puzzle. With the wrong tool the gauntlet is possible but you will not beat the clock.
  • Needs: Drawer.gd (pull-out sub-body with its own contents), a Container concept on Smashable, and a Tool flag on Weapon marking it as a level's key tool.

BUILT — the other three workplaces

Shipped as Levels.gd specs consumed by Floorplan.gd. The notes below are the design they were built from.

Design notes

Reference floor plans provided: Parks & Rec (municipal, partitioned, outdoor patio), Silicon Valley hacker house (domestic-open-plan, kitchen + pool), The IT Crowd (basement, two rooms, glorious junk), plus the generic open-plan bullpen.

Each is a new script alongside Office.gd implementing the same interface:

build()                    # shell, fittings, lighting
configure_environment(env)
desk_spots() / chair_spots() / copier_spot()
spawn_point() / spawn_yaw()

They differ in materials and hazards, which is what stops them being reskins:

Level Signature material Signature provocation
Municipal (Parks & Rec) laminate, pinboard, civic beige the public counter; forms in triplicate
Hacker house (Silicon Valley) glass, whiteboard, drywall, a pool standup meetings; someone's monitor wall
Basement IT (IT Crowd) server steel, cardboard mountains, CRTs "have you tried turning it off and on again"

On procedurally generating floor plans

The repo you found — doratracyer/floor_planwon't help. It's OpenSCAD that turns hand-drawn SVG wall paths into 3D-printable STLs. It doesn't generate layouts, doesn't parse plan images, and produces no room polygons or graph you could build a level from. It's also GPL-3.0, which we would not want to link against.

Better path, and we're most of the way there already: Office.gd is a parametric floor-plan builder that just happens to have its numbers hard-coded. Lift those into a data spec —

{ rooms:  [{name, x0, x1, z0, z1, walls, door_at}],
  fittings: [{kind, pos, yaw}],
  lights:  {grid_x, grid_z},
  spawn:   {pos, yaw} }

— and a generic Floorplan.gd builds any of them. Then each workplace is a data file, new levels are authorable in minutes, and a generator becomes possible later (rooms as a BSP split of the footprint, doors on shared walls, fittings by room type) because the consumer is already data-driven. Do the spec first, generation second.


Asset needs (MODELBEAST / tools/gen_office_props.py)

Already generated procedurally: office chair, vending machine, microwave, potted plant. Needed next, in rough priority order:

filing cabinet with pullable drawers (split mesh per drawer) · desk phone · guillotine / paper slicer · stapler + staple remover · wall clock · whiteboard · server rack · pinboard · water cooler bottle (separate from base) · wastepaper bin · hole punch · shredder (the gauntlet's perfect tool)

Rule of thumb established this lane: if it's a box, build it in code; if its silhouette can't be faked by a box, generate it.