caa5f95339
2 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
7455c03ae3 |
[lane B+C+E+F] Playtest blockers: the game never taught its controls, deleted bosses on death, and shipped an unwinnable tutorial
A five-way audit of the shipped build found the first thirty seconds are broken in three
independent ways. All three are verified, not inferred.
1. THE CONTROLS WERE NEVER STATED. The title said "press any key", and aim + fire are both gated
on pointer lock (input.js:45 onMouseMove early-returns unlocked; input.js:50 the first
mousedown only REQUESTS the lock) — so a player who dismissed with a key got no mouse look and
a cannon that silently did nothing. Worse: in an ARENA the forward axis belongs solely to
intent.throttle (player.js), so an untaught player coasts to a dead stop in front of L1's Mast
Cell and reasonably concludes the game is broken. Six arenas across L1/L3/L5/LS are the same
trap. The card now says CLICK TO FLY, takes the pointer lock on any dismissal, and prints the
legend that has existed — written and styled — in flight/dev.html since round 1, visible only
to whoever was running Lane B's harness.
2. DYING DELETED THE BOSS. boot's pump advanced `_ei` monotonically and never rewound. That
reasoning is right for `spawn` and `pickup` (re-firing double-spawns survivors and resurrects
banked pickups) but it silently applied to `boss` as well: die to any of the five, respawn,
fly through an empty lair, cross the gate, and collect a graded medal for a fight that never
happened. Dying was the fastest route past every boss in the game. Now a REARM set ({boss,
acid}) re-fires on respawn while everything else is retired into `_spent`. Verified by event
trace: start:mast_cell -> end:wipe -> start:mast_cell. Also despawns the sentinel's body on a
wipe, which the fix exposed as a duplicate (1 -> 2 Mast Cells per death).
3. L1'S TIDE WAS UNWINNABLE, AND MINE. I authored it this morning at speed 5 in a flow-2 segment,
reasoning "5 against 2 catches a dawdler". The player ceiling there is 2.8 u/s sustained
(throttleMax 1.4 x flow 2); boost peaks 5.2 for 0.55s on a 2.4s cooldown. C's own --sim prints
the verdict in plain text — "required 2.50x UNWINNABLE" — and I never ran it. Because
hazards.js grazes on gap<=catchRadius and the gap stays negative once passed, it was a ~74 dps
loop back onto the s=475 checkpoint: a brand-new player, in the default level, hard-stopped
three minutes in. Retuned to 2.4 (required 1.20x — the same shape as L2's teaching burp).
The validator was exempting it: `if (!c.lethal) continue` in levels/index.js meant qa.sh went
green over a death loop. An unwinnable chase is a design failure whatever its lethality — a
non-lethal one you cannot outrun is a continuous-damage trap. That exemption is gone, and all
six levels still validate.
Also: DEFAULT_LEVEL was still 'L2_esophagus' from when L2 was the only finished level, so every
new player skipped the tutorial entirely and started mid-campaign. LANE_C_NOTES §→ Lane F #2
said "change it if you would rather it be L1". It is L1 now.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
||
|
|
464f5c8a18 |
[lane E] The game finds its voice: procedural synth bank, the WebAudio graph, the damage feed, and the medal/title/pause cards
Round-1 Lane E audio + the two remaining UI surfaces, consolidated from the JING5
clone onto main and made determinism-clean:
- audio/synth.js — procedural voice bank (primary path; audible with an empty manifest)
- audio/engine.js — WebAudio graph, cue router, bed, heartbeat; now the listener for the
11 gameplay bus events that were previously firing into the void
- ui/feedback.js — feed-corruption damage overlay (an ART_BIBLE law previously unmet)
- ui/cards.js — title / medal / pause cards; boot now honours ui:pause
- boot.js — mounts all five modules with per-module failure isolation and a
frame() tick (never step(), so stepped sims stay deterministic)
Determinism gate: threaded engine's seeded rnd (mulberry32 off ?seed=) into createSynth,
replacing every Math.random in synth.js. Audio texture is now reproducible per-seed and
qa.sh is green.
Verified: QA green; runtime smoke on ?seed=7 scheduled 182 osc + 91 buffer voices + 268
envelope ramps during play, zero console errors.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|