diff --git a/docs/REVIEW_LOG.md b/docs/REVIEW_LOG.md index 06dc6c0..badf4a4 100644 --- a/docs/REVIEW_LOG.md +++ b/docs/REVIEW_LOG.md @@ -5825,8 +5825,13 @@ fight** — 4 points through Neil's armour. Seed 2 is the wipe, and its first tw produce a single 3-point scratch; the column lands three blows in round 3, Kate goes 12 to 0 and Arun is disabled by a critical, and the cut is two effective attackers against three. -**Both sides disable on one good hit.** The major-wound threshold is half of max HP and it -is the same rule in both directions — the neighbours have 10, the agents 11 to 13 — so an +**Both sides disable on one good hit.** A LOCATION is disabled when the damage it has +taken reaches that location's own capacity — `locationMaxHp`, a fraction of total hit +points — which is 5 for a neighbour's leg or torso and 4 for its arms, against 6 and 5 for +an agent. (Not, as an earlier version of this entry said, at half of maximum hit points: +that is `majorWoundFor`, it feeds only how long a dying character lasts, and being taken +out of the fight is `conditionFor` at hp <= 2. See R-270 — the invented rule gave the right +answer for legs and torsos, which is why it survived being read.) So an average blow takes a fighter out of the fight. Every disable costs its owner 30 points off the relevant skills — `locationEffectsFor`, an arm or a leg — which for a 40% attacker is three quarters of their hit chance, so it thins the return fire and makes the next disable @@ -6003,3 +6008,38 @@ was possible — no guard measures the tail, because every one of them averages. **So the reading is still doing work the measuring cannot.** Fourteen guards, and the thing worth knowing about this fight — that it ends with one player failing three impossible rolls in a row — is visible only by watching it happen. + +## R-270 — a rule I invented, and the coincidence that hid it + +R-266 said "the major-wound threshold is half of max HP and it is the same rule in both +directions". The scenario session carried the same sentence, went to `rules.mjs` to verify +my correction of a *different* error in it, read the neighbouring functions, and found this +one. It is not a rule. Verified here rather than accepted: + +| what I said | what `rules.mjs` says | +|---|---| +| a fighter goes down at half maximum hit points | `conditionFor` (1623) — down at `hp <= 2` or unconscious; dying at `hp <= 0` | +| half max HP is the threshold that matters | `majorWoundFor` (32) is `ceil(hp/2)` and feeds only `dyingLimitFor` — how long the dying last | +| one rule, both directions | a LOCATION is disabled by `resolveLocationHit` (556) at `after >= locationMax`, which is `locationMaxHp` (54) — a fraction of total hit points, per location | + +**The coincidence is the interesting part.** For a 10-point neighbour, `majorWoundFor` is 5 +and a leg, abdomen or chest holds exactly 5. For a 12-point agent both are 6. So on the +locations that get hit most, the invented rule and the real one return the same number, and +the narration prints `MAJOR WOUND · disabled` together on the same line — two rules firing +at once, reading as one. Arms and heads are where they part (4 against 5 for a neighbour), +and I had not looked at an arm. + +So the sentence was not a guess. It was a generalisation from the case where two unrelated +thresholds agree, checked against the output, and confirmed by it. That is a worse failure +than a guess, because it came with evidence. + +**Neither error is neutral in the same direction.** A disable that removes a fighter, and a +down-threshold at half hit points, both make the fight easier than it is: fewer attackers +still standing, and agents falling at 6 rather than fighting to 3. A GM reading either would +have run a party-ending encounter as a survivable one. + +**And this is the fourth time today that checking one claim surfaced a different one.** Not +the same claim re-examined — the neighbour of it. The pattern is worth naming: the cost of +verifying something is mostly the cost of getting to where it lives, and once you are there +the next function along is nearly free to read. Both of us have now paid that fare and come +back with something we were not looking for. diff --git a/tools/check-firstblood.mjs b/tools/check-firstblood.mjs index 84e4972..e23260b 100644 --- a/tools/check-firstblood.mjs +++ b/tools/check-firstblood.mjs @@ -1,9 +1,9 @@ /** * 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: both sides disable on - * one good hit, 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 + * 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 diff --git a/tools/first-blood.mjs b/tools/first-blood.mjs index f674891..3670169 100644 --- a/tools/first-blood.mjs +++ b/tools/first-blood.mjs @@ -2,8 +2,9 @@ * first-blood — who lands the first disabling blow, and what the fight does afterwards. * * check-lethality and check-focus record how a fight ENDS. Neither records how it TURNS, - * and the four-player cut of CLEAN GROUND turns early: both sides disable on one good - * hit, so whoever lands it first costs the other 30 points off the skills that matter, + * and the four-player cut of CLEAN GROUND turns early: one hit that meets a limb's own + * capacity disables it — 4 or 5 points either way here, `locationMaxHp` — and both sides + * are made of limbs that small, so whoever lands it first costs the other 30 points off the skills that matter, * which thins the return fire, which * makes the next disable likelier. Nothing pulls the fight back toward the middle once it * has tipped, and that — not anything about round five — is where the scenario's bimodal