diff --git a/LANES/LANE9-fun-layer.md b/LANES/LANE9-fun-layer.md new file mode 100644 index 0000000..b0b2c95 --- /dev/null +++ b/LANES/LANE9-fun-layer.md @@ -0,0 +1,55 @@ +# LANE 9 — the fun layer: still scales, the Roomba, the incident report, chair riding + +*Spec'd and executed by Fable, 2026-08-03. Owns `game/` only.* + +Four features, one commit each, every one riding systems that already exist. House rule +respected throughout: **the game never says so** — no tutorials, no popups explaining. + +## 0. The scales sleep at spawn *(bug fix — restores a red gate)* + +`probe_levels` reads 0.48 m/s residual in the grocer: the scale pan (`Main.gd:391`, +`angular_damp = 0.25`, origin at the pivot) is near-neutrally balanced, so spawn jitter +never dies. Fix: after the joint has resolved (~0.6 s), zero the pan's velocities and put +it to sleep. The swing feel after a hit is untouched — this is a spawn-settle, same spirit +as the spawn guard. Gate: all six sites back to `0.00 m/s`. + +## 1. The Roomba *(scripts/Roomba.gd)* + +A robot vacuum that patrols the site **eating your debris** — the anti-combo antagonist. + +- `class_name Roomba extends Smashable`, `kind = "steel"` — so the weapon matrix already + works: bare hands are futile (clank), a crowbar dents it, a sledge can genuinely kill it + (and the payslip bills you for it, because it's company property). +- Wander: slow patrol; when debris (group `debris`) is within sniff range it steers there. +- Eat: an Area3D mouth; debris it touches shrinks and vanishes with a little vacuum + whirr, and **each item eaten deducts score** (`Main._score`), with an occasional smug beep. +- Dent it and it panics: beeps, flees fast for a few seconds. +- Procedural audio (beeps + whirr) synthesized in `_ready` — no assets, house style. +- Spawns in every site EXCEPT LEVEL 0 (`_backrooms == null` check) — nothing cute in the + Backrooms — and not in the Gauntlet round itself. + +## 2. The incident report *(scripts/Receipt.gd)* + +When a meltdown ends (`Rage.calmed` after a SNAP), a dot-matrix incident report prints, +line by line, itemizing what you broke *during that window*: `OBJECT · unit $ · ×N`, +then `TOTAL DAMAGES`, then `DEDUCTED FROM PAY`. One synth chirp per printed line. +Collected via `Main._on_smashed` while `Rage.is_meltdown()`. Any key (or 5 s) dismisses. +All drawn/synthesized in code — no textures, no audio files. + +## 3. Ride the office chair *(scripts/ChairRide.gd + Player hooks)* + +`E` on an office chair (piece named `office-chair`, within 2.5 m, hands empty) mounts it. + +- The chair stays a real RigidBody3D; the player follows it kinematically (collision + paused), camera up top. WASD pushes it (strong forward, weak steering — deliberately + bad), momentum is real, the floor is the office. Space/E hops off with a small dismount. +- Ramming does what physics says: mass × speed scatters furniture; brittle things + (vinyl, glass, produce) break on impact via their existing `brittle_speed` — no new + damage code. +- If the chair shatters mid-ride (it's `plastic`; you CAN sledge your own vehicle), the + ride ends on the spot, comedically. + +## Gates (each commit) + +Headless smoke clean · `probe_levels` all sites `0.00 m/s` · `probe_overlap` CLEAN. +README controls table updated in the final commit.