R-266 said a fighter goes down at half maximum hit points and called it one rule in both directions. conditionFor puts someone down at hp <= 2; majorWoundFor is ceil(hp/2) and feeds only how long the dying last; a location is disabled by resolveLocationHit at its own locationMaxHp capacity. The reason it survived reading: for a 10-point neighbour majorWoundFor is 5 and a leg, abdomen or chest holds exactly 5, and for a 12-point agent both are 6. On the locations that get hit most the invented rule returns the real one's answer, and the narration prints MAJOR WOUND and disabled on the same line. Arms and heads are where they part, and I had not looked at an arm. Found by the scenario session going to rules.mjs to verify a different correction of mine and reading the next function along. Both errors made the fight look easier than it is. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
29 lines
1.6 KiB
JavaScript
29 lines
1.6 KiB
JavaScript
/**
|
|
* The four-player cut turns on its first disabling blow, and it must keep doing so.
|
|
*
|
|
* R-266 found the mechanism behind CLEAN GROUND's bimodal outcome: one hit meeting a
|
|
* limb's capacity disables it, and both sides are made of limbs that hold 4 or 5 points,
|
|
* so whoever lands the first one thins the return fire and makes the next likelier. It was measured in a scratch harness, and another session declined to put it
|
|
* in the scenario for that reason — correctly, and that refusal is why this guard exists.
|
|
*
|
|
* Thin on purpose. The measurement lives in first-blood.mjs, which is also the tool a
|
|
* reader runs; re-deriving it here would be the duplication check-rules exists to forbid,
|
|
* and would let the page and the guard drift apart again.
|
|
*/
|
|
import { spawnSync } from "node:child_process";
|
|
|
|
const r = spawnSync(process.execPath, [new URL("first-blood.mjs", import.meta.url).pathname, "--check"],
|
|
{ encoding: "utf8" });
|
|
|
|
if (r.status !== 0) {
|
|
process.stdout.write(r.stdout ?? "");
|
|
process.stderr.write(r.stderr ?? "");
|
|
console.error("check-firstblood: FAILED — the fight no longer turns the way it was recorded. "
|
|
+ "Read `node tools/first-blood.mjs` before re-recording: a changed swing is a changed scenario.");
|
|
process.exit(1);
|
|
}
|
|
// update-readme reads the line beginning with this file's own name.
|
|
const m = r.stdout.match(/worth ([\d.]+) points of wipe rate in the cut, ([\d.]+) in the line/) ?? [];
|
|
console.log(`check-firstblood: OK — the first disabling blow is worth ${m[1] ?? "?"} points of wipe rate `
|
|
+ `in the four-player cut, ${m[2] ?? "?"} in the six-a-side line`);
|