56 lines
3.0 KiB
Markdown
56 lines
3.0 KiB
Markdown
# 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.
|