Clear the last of the "ladder" vocabulary out of the handoff and the comments

Left over from the rename: the handoff still described opponent 2 as "rung N"
and pointed at matchRung, and three comments in gameplay.js still called the
opponent curve a ladder. One word per thing, everywhere now — OPPONENTS, WOUND
STAGES, a sprite FAMILY — with a note in the handoff saying which word replaced
what, so the next reader is not left translating.

(The barrel weapons keep their own "rungs of the same ladder" line: that one is
about the WEAPON payout order and was never part of the confusion.)

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
wuwiandClaude Opus 5 committed 2026-08-12 14:54:54 +02:00
1 parent e674677f4e
commit a568d75aed
2 files changed
+12 -10

No files matched your search

+9 -7
View File
@@ -38,7 +38,7 @@ Oliver picked **A: blood-only**, of three options offered:
blood already spent, and heals are how you last. **The measure becomes OPPONENTS FELLED.** blood already spent, and heals are how you last. **The measure becomes OPPONENTS FELLED.**
- B — tennis-true: a lost game ends the run. Rejected for now (worth one playtest someday; it might - B — tennis-true: a lost game ends the run. Rejected for now (worth one playtest someday; it might
be the mode's real personality). be the mode's real personality).
- C — hybrid, lost game drops a rung. Rejected. - C — hybrid, a lost game drops you an opponent. Rejected.
**Important context for whoever implements this:** Oliver believed losing a match killed him **Important context for whoever implements this:** Oliver believed losing a match killed him
("i really die losing one match"). It does not — he was bleeding out during deuce wars and hitting ("i really die losing one match"). It does not — he was bleeding out during deuce wars and hitting
@@ -55,10 +55,12 @@ communicating its own rules. Model A only works if the player can see they are b
same `endRun` with a mode tag — see "The record shape" below. The blood also got a readout, one same `endRun` with a mode tag — see "The record shape" below. The blood also got a readout, one
pip per hit left beside the board, because the vignette says "worse" and never says "how many". pip per hit left beside the board, because the vignette says "worse" and never says "how many".
2. ~~**Named opponent ladder**~~ **DONE, partly.** Rung N takes design N's name off the chapter 2. ~~**Named opponent list**~~ **DONE, partly.** Opponent N takes design N's name off the chapter
roster (`matchRung` in config) plus a personality that is DIALS — pace, width, flub, speed roster (`matchFoe` in config, rows in `config.OPPONENTS`) plus a personality that is DIALS — pace,
scalings on numbers `racketAI` already reads. Name plate on the walk-on, board names it width, flub, speed scalings on numbers `racketAI` already reads. Name plate on the walk-on, the
(`short`), kills file under the rung so THE LADDER screen can list them. board names it (`short`), and the kill files under it so the OPPONENTS FELLED screen can list it.
*(The word "ladder" was retired — it had come to mean the opponent list, the wound stages AND a
stats screen. One word per thing now: OPPONENTS, WOUND STAGES, and a sprite FAMILY.)*
**Still open, and still the cheapest depth in the mode:** `shots[]` and the PARRY are fully built **Still open, and still the cheapest depth in the mode:** `shots[]` and the PARRY are fully built
and completely unused here. A body-shot thrower is a personality no dial can express. and completely unused here. A body-shot thrower is a personality no dial can express.
@@ -112,7 +114,7 @@ slots carry each MODE's own two numbers:
`g` is what everything ranks on, so each mode's real measure goes in that slot and there is no second `g` is what everything ranks on, so each mode's real measure goes in that slot and there is no second
best stored anywhere to drift. `read(period, runs, mode)` filters; the stats screen is one function best stored anywhere to drift. `read(period, runs, mode)` filters; the stats screen is one function
with three sets of words (BODY COUNT / THE LADDER / THE RECORD). The world board stays the gore with three sets of words (BODY COUNT / OPPONENTS FELLED / THE RECORD). The world board stays the gore
mode's — it ranks kills in a run, and a five-body match would post a "5 kills" row next to a mode's — it ranks kills in a run, and a five-body match would post a "5 kills" row next to a
300-kill massacre. A tennis board would rank FELLED with points won as the tiebreak; that is a 300-kill massacre. A tennis board would rank FELLED with points won as the tiebreak; that is a
server change. server change.
@@ -124,7 +126,7 @@ frame is picked off `racketAI`'s own `pose`, so the picture cannot drift from th
Expansion ideas that survived discussion, in `PROJECT.md`'s LATER: the **tournament frame** Expansion ideas that survived discussion, in `PROJECT.md`'s LATER: the **tournament frame**
(QUALIFYING → ROUND OF 16 → THE FINAL vs THE CHAMPION — gives the run a destination), the Hawk-Eye (QUALIFYING → ROUND OF 16 → THE FINAL vs THE CHAMPION — gives the run a destination), the Hawk-Eye
**challenge** as an earned continue, sudden-death deuce past a rung, doubles, and **item 7: **challenge** as an earned continue, sudden-death deuce past a given opponent, doubles, and **item 7:
multiplayer** (ghost match first). multiplayer** (ghost match first).
--- ---
+3 -3
View File
@@ -153,11 +153,11 @@ function doHit(ch, quality, aim) {
// time than auto-run needs from the far corner. Opponent one gives you the flight time; the // time than auto-run needs from the far corner. Opponent one gives you the flight time; the
// rungs take it back. // rungs take it back.
// ...and the RUNG's own pace trait rides on top, inside the cap: full pace is still the ceiling, // ...and the RUNG's own pace trait rides on top, inside the cap: full pace is still the ceiling,
// a rung just gets there sooner or later than the flat ladder would (see matchRung in config). // an opponent just gets there sooner or later than the flat curve would (see matchFoe in config).
s *= Math.min(1, (TUNE.matchOppPace + (G.match.opp - 1) * TUNE.matchOppPacePer) * (ch.foe?.pace || 1)); s *= Math.min(1, (TUNE.matchOppPace + (G.match.opp - 1) * TUNE.matchOppPacePer) * (ch.foe?.pace || 1));
} }
if (G.match) { if (G.match) {
// THE OPPONENT'S WIDTH IS THE LADDER'S THIRD DIAL. Its returns scatter off aimError x (1 - 0.55 // THE OPPONENT'S WIDTH IS THE THIRD DIAL. Its returns scatter off aimError x (1 - 0.55
// quality), which paints lines an auto-run player cannot reach — "still a LOT of unreachable // quality), which paints lines an auto-run player cannot reach — "still a LOT of unreachable
// balls". Opponent one keeps its returns inside matchWideBase of the centre line; each rung // balls". Opponent one keeps its returns inside matchWideBase of the centre line; each rung
// earns matchWidePer more width, so the line-painting is the LATE ladder, not the opening one. // earns matchWidePer more width, so the line-painting is the LATE ladder, not the opening one.
@@ -1045,7 +1045,7 @@ function racketAI(rz, dt) {
const tz = Math.max(1.5, Math.min(COURT.svcFar, ball.z)); // chase laterally, hold deep on the far court const tz = Math.max(1.5, Math.min(COURT.svcFar, ball.z)); // chase laterally, hold deep on the far court
const dx = ball.x - rz.x, dz = tz - rz.z, d = Math.hypot(dx, dz); const dx = ball.x - rz.x, dz = tz - rz.z, d = Math.hypot(dx, dz);
if (d > 0.15) { if (d > 0.15) {
// THE MATCH LADDER ESCALATES HERE, not in hp: with regicide gone the pool is pure scoreboard, // THE MATCH ESCALATES HERE, not in hp: with regicide gone the pool is pure scoreboard,
// so a harder opponent is a FASTER one that flubs less. The BASE is boosted too — the duel's // so a harder opponent is a FASTER one that flubs less. The BASE is boosted too — the duel's
// 2.8 m/s lumber was tuned for one sudden-death point against a fresh player, and across a // 2.8 m/s lumber was tuned for one sudden-death point against a fresh player, and across a
// whole game it read as "very weak and slow": opponent one already moves at matchSpeedBase. // whole game it read as "very weak and slow": opponent one already moves at matchSpeedBase.