The harness was fighting a different animal (R-264)

Reading a narrated supporter fight showed it being hit on armR and head. It has wings; it
has never had arms. Three defects, all in the pipeline every published number comes from.

1. It located hits by species, not body plan — simulate.mjs read defender.species where
   the game writes spec.bodyPlan ?? spec.species ?? "baseline" into speciesProfile
   (build-packs.mjs:294). The barghest, kelpie and church grim were fought on two legs
   with arms, and the supporter with no wings, so the fight its tactics call the one the
   agents can win could not occur in a measured fight.
2. Armour was one scalar for the whole creature, and the harness's locations had no
   armour field. Bare wings, the grounded halving and the vital exemption — R-254 and
   R-255 — were invisible to every number. Worn armour was summed the same way, which put
   a stab vest on a cleaner's head.
3. Nothing was ever grounded: a wing could be ruined and the creature kept flying.

Fixed in the game's order — locate, then apply what that location carries, every term
imported from rules.mjs. A ruined wing calls groundedPlanFor and the wounds carry across
by severity through remapLocationDamage, the function _preUpdate uses.

A bug of mine no guard would have caught: remapLocationDamage returns { damage, moved,
rescaled } and my first draft passed the whole object where a damage map was expected, so
every wound a creature carried was forgiven the moment it came down. check-lethality would
have passed it — fewer wounds means a longer fight, which reads as a number moving, and
this commit moves numbers. Found by probing a landing by hand.

20 of 47 creatures moved, 18 deadlier and 2 less. The supporter goes 69.3% -> 25.1% wiped,
3.38 -> 2.16 down, second deadliest to fourth: it was being measured as a 30-hit-point
creature in uniform armour 9 that could not be grounded. The small rises elsewhere are the
party's armour no longer covering locations it never protected.

check-focus then caught the page overclaiming, which is what it is for: focus fire still
helps in all 30 but only 28 clear their own noise where 31 of 31 did. The guard was
asserting more than the page needs — the bestiary prints that count from the artifact and
cannot overstate it — so it now checks only what the page asserts outright, and the page
rewrote itself to "in 28 of them".

Both baselines re-recorded. Minor version, not a patch: the published numbers changed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
slaguru666
2026-09-13 00:42:52 +01:00
co-authored by Claude Opus 5
parent 5dcaaf519a
commit ad5fd57568
9 changed files with 523 additions and 377 deletions
+62
View File
@@ -5703,3 +5703,65 @@ points check-focus records for this creature, seen once instead of averaged.
The defence ladder is legible in the log too — `Ben → Redcap A: 26 SUCCESS — dodged
(10 vs 45, -30 for defences already spent)` — a 75% dodge meeting the second attack of the
round at 45.
## R-264 — the harness was fighting a different animal
Reading a narrated supporter fight (R-263, the first time any fight in this project could
be read rather than totalled) showed it being hit on `armR` and `head`. It has wings. It
has never had arms. Three defects, all in the pipeline every published number comes from.
**1. It located hits by species, not body plan.** `simulate.mjs` read `defender.species`
where the game writes `spec.bodyPlan ?? spec.species ?? "baseline"` into `speciesProfile`
(build-packs.mjs:294). Four creatures were fought human-shaped: the barghest, the kelpie
and the church grim on two legs with arms, and **the supporter with no wings at all**, so
the fight its own tactics call the one the agents can win could not occur in a measured
fight.
**2. Armour was one scalar for the whole creature.** `worn + naturalArmour`, applied
everywhere, and the harness's locations had no armour field at all. So bare wings, the
grounded halving and the vital exemption — R-254 and R-255, most of a session's design —
were invisible to every number. Worn armour was summed the same way, which put a stab
vest on a cleaner's head.
**3. Nothing was ever grounded.** A wing could be ruined and the creature kept flying,
because the harness never changed a body mid-fight.
**The fix, in the game's own order.** Locate first, then apply what that location carries:
`locationArmourFor(slot.armour + naturalArmourOn(slot, exposedHideFor(hide, grounded,
kind)), worn, kind)`, every term imported. A ruined wing now calls `groundedPlanFor`, and
the wounds carry across by severity through `remapLocationDamage` — the same function the
actor's `_preUpdate` uses.
**A bug of mine that no guard would have caught.** `remapLocationDamage` returns
`{ damage, moved, rescaled }` and my first draft passed the whole object where a damage
map was expected, so **every wound a creature was carrying was forgiven the moment it came
down**. check-lethality would have passed it happily: fewer wounds means a longer fight,
which reads as a number moving, and the whole point of this commit is that numbers move.
Found by probing a landing by hand, not by the suite. The engine destructures it the same
way at ringbrp.mjs:462, which is where I should have looked first.
**What it cost. 20 of 47 creatures moved, 18 deadlier and 2 less.**
| | wiped | down of 4 |
|---|---|---|
| **The supporter** | 69.3% → **25.1%** | 3.38 → 2.16 |
| The stanchion | 31.9% → 37.4% | 2.29 → 2.52 |
| Nuckelavee | 16% → 20.3% | 1.70 → 1.98 |
| Long walker | 64.1% → 68% | 3.18 → 3.32 |
The supporter falls from second deadliest in the book to fourth, and that is the correct
direction: it was being measured as a 30-hit-point creature in uniform armour 9 that could
not be grounded, and it is actually a creature you can put on the floor, after which most
of it is armour 4. The small rises everywhere else are the party's own armour no longer
covering locations it never protected — a torso vest stops covering a head.
Focus fire was re-recorded too: 30 of 47 measurable now rather than 31, worth 8 points
against a pair and 12 against three or more, best case 3 × Spriggan at 38.9% → 55.5%.
**And check-focus caught the page overclaiming, which is what it is for.** Its claim-check
failed on the new numbers: focus fire still helps in all 30, but only 28 clear their own
noise where all 31 once did, and the page said "each time". The guard was asserting more
than the page needs to: the bestiary prints the above-noise COUNT from the artifact and so
cannot overstate it however it moves, and what the page actually asserts outright is that
concentrating fire helps. The guard now checks exactly that, and the page rewrote itself
to "in 28 of them" on regeneration.