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:
co-authored by
Claude Opus 5
parent
5dcaaf519a
commit
ad5fd57568
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user