destroyulator/LANES/LANE9-fun-layer.md
2026-08-03 23:49:53 +10:00

56 lines
3.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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.