Triage: always kill the body that would reach you first
The sequence drill tested nothing — the strip was always visible (no memory), the batch was slow (no urgency), the aim was easy (no execution). A checklist with gore, and Oliver said so: "not interesting enough to keep me playing". Settled in discussion, he picked triage + streak. One rule: always kill the body that would reach you first. Nothing is called, nothing shown — the court is the puzzle. arrival = distance / speed down a held lane, and the roster's speed spread means the answer is not the closest body: a runner at the far baseline beats a roller at the service line. Court sense — and it trains the exact target-priority read the gore mode rewards. Wounds are free: only the kill is judged, so pre-softening a heavy while it is third in line is legal and eventually necessary. The slack (0.9s) makes near-ties legal both ways, or the rule is a coin flip. The streak is both punishment and payout: x1..x5, a misread shows OUT OF TURN and resets it, and nothing else happens — the queue keeps walking. Caught is the real setback. Best score banks to localStorage; the world board can carry it if it ships. drillMark draws a chevron over the queue head for playtest calibration. It answers the exact question the mode asks, so it must be off in anything shipped. Deleted: the alphabet, the batch, the strip, the eaters. Shamblers are first-class stream members with pts 20; a roller is 100. 30 tests, rewritten around arithmetic riggings (known speeds and distances) instead of luck; 20 seeds clean. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
57e96d629e
commit
6a16e77480
8 files changed
+313
-459
No files matched your search
+27
-33
@@ -345,42 +345,36 @@ export const TUNE = {
|
||||
barrelRoll: 2.6, // m/s it trundles across the far court — fast enough to have to be led
|
||||
barrelHp: 1, // anything pops it: ball, pellet, bomb, flame, swish. It is a target, not a body
|
||||
barrelH: 1.15, // drawn height (a body is 1.8)
|
||||
// ---- THE COACHING DRILL (src/drill.js) — the cognitive mode. THE SEQUENCE IS THE ZOMBIES
|
||||
// THEMSELVES: a BATCH of distinct roster types is born on the far side and the combination is
|
||||
// called off them at once, so everything the strip asks for is already in front of you. There are
|
||||
// no colours, signs or markers anywhere — a brute does not look like a runner, and that is the
|
||||
// whole point. The danger is a separate channel: plain shambler EATERS on their own clock, never
|
||||
// in the alphabet, converging on you the way ordinary shamblers do.
|
||||
drillBatch: 3, // TYPES in a batch at the bottom of the ramp...
|
||||
drillBatchMax: 6, // ...and at the top. Capped by DRILL_TYPES — one of each type on court at most
|
||||
drillBatchDepth: 3.0, // m of depth a batch is staggered over. All of it still on the far side,
|
||||
// which is the promise: you see every colour before you are asked for it
|
||||
// ---- THE TRIAGE DRILL (src/drill.js) — the cognitive mode, fourth design. ONE RULE: always
|
||||
// kill the body that would reach you first. Nothing is called and nothing is shown — the court is
|
||||
// the puzzle, and the skill is reading speeds against distances (a runner at the far baseline
|
||||
// beats a roller at the service line). The streak multiplier is the hook; the score is what you
|
||||
// come back to beat.
|
||||
drillMaxOnCourt: 7, // bodies on court at once — the queue you are reading. Past ~7 it is noise
|
||||
drillSeed: 4, // bodies placed at the start so there is a queue to read from the first second
|
||||
drillSeedGap: 2.6,// m of depth between those seeded bodies
|
||||
drillSpawnZ: 0.6, // z they enter at (the far baseline is 0)
|
||||
drillNearZ: 9.0, // spawn spacing is measured against bodies nearer than this
|
||||
drillSpread: 3.4, // m either side of the centre line the lanes fan across
|
||||
drillSpeed: 0.80, // m/s a batch body walks at the bottom of the ramp (x its type's vMul)...
|
||||
drillSpeedMax: 1.9,// ...and at the top. Stamped per body AT SPAWN, so the ramp shows up as new
|
||||
// arrivals outpacing the ones already walking, not the court accelerating
|
||||
// The eaters are RARE on purpose. At every 7 s / 2.2 s they were a second crowd rather than an
|
||||
// interruption, and the puzzle is the point of the mode — a threat you have to break off and deal
|
||||
// with only works if breaking off is occasional. They also enter wide of the colour gang
|
||||
// (spawnEater), because the one body out there that is neither the puzzle nor worth anything has
|
||||
// no business standing in front of the puzzle.
|
||||
drillEaterEvery: 12.0, // s between plain-shambler eaters at the bottom of the ramp...
|
||||
drillEaterMin: 5.0, // ...and at the top. Still THE difficulty dial, just a slower one
|
||||
drillEaterMax: 0, // eaters allowed on court at once. **0 = OFF, which is where it is now** —
|
||||
// Oliver: "remove the fake zombies for now", so the drill is currently the
|
||||
// pure puzzle with no second threat. The whole mechanism is intact
|
||||
// (spawnEater, the wide entry, the never-a-fault rule); this one number
|
||||
// brings it back. Past 3 the puzzle stops being readable.
|
||||
drillEaterSpeed: 1.15,// they walk a touch faster than the batch: the batch is a list, this is a threat
|
||||
drillSpeed: 0.85, // m/s at the bottom of the ramp (x the type's vMul)...
|
||||
drillSpeedMax: 2.0,// ...and at the top. Stamped per body AT SPAWN — constant v is also what lets
|
||||
// arrival() be a plain division, so the queue is honest
|
||||
drillSpawnEvery: 3.2, // s between arrivals at the bottom of the ramp...
|
||||
drillSpawnMin: 1.1, // ...and at the top. THE pressure dial: the queue outgrows your clearing rate
|
||||
drillRampT: 210, // s to go from the bottom of every curve above to the top
|
||||
// TESTING KNOB, and it is OFF again after one playtest: "one-shot is bad - way too easy - also
|
||||
// we're losing all the nice gore animation sprites". Both halves matter and the second is the one
|
||||
// that is easy to miss — a 1 hp body never passes through any of its WOUND STAGES, so every skin
|
||||
// in ZWOUND (arm off, ribs out, still walking) is skipped entirely and the roster's best art never
|
||||
// renders. The HP is also what makes the called ORDER matter: a roller is seven serves, so being
|
||||
// told to take it third means starting on it first. Left here as a switch, not a default.
|
||||
drillOneShot: 0, // >= 0.5: batch bodies AND eaters all drop to 1 hp
|
||||
// THE JUDGEMENT SLACK. Two bodies arriving within this of each other are BOTH legal kills —
|
||||
// without it, near-simultaneous arrivals made the rule a coin flip and a fault read as theft.
|
||||
// Tightening it is the real difficulty curve for good players; below ~0.4 it starts punishing
|
||||
// reads the eye genuinely cannot separate.
|
||||
drillSlack: 0.9,
|
||||
drillMultEvery: 4, // correct kills per multiplier step...
|
||||
drillMultCap: 5, // ...capped: a deep streak should feel valuable, not become the whole score
|
||||
drillMark: 1, // >= 0.5 draws a chevron over the queue head — the CALIBRATION AID, so a
|
||||
// playtest can check the game's read against the player's. Off for the real
|
||||
// thing: the marker answers the exact question the mode exists to ask
|
||||
drillOneShot: 0, // >= 0.5: every drill body drops to 1 hp. OFF after one playtest: "way too easy"
|
||||
// AND a 1 hp body skips every ZWOUND stage, so the gore art never renders.
|
||||
// Also flattens triage — pre-softening a heavy IS the planning layer
|
||||
drillCaughtBack: 45, // s of ramp handed back when one reaches you. A real setback, not a reset
|
||||
fps: 60, // frame cap — 30 halves battery/heat but Oliver felt it; smoothness wins (0 = uncapped)
|
||||
lowPower: 1, // >= 0.5 caps RES at 3 (−44% of pixels painted per frame) — the battery saver,
|
||||
|
||||
Reference in new issue
Block a user