Hide 9, grounded 4, vital exempt — the borough is worth 56 points again
R-254 shipped the belly rule and called +6.4 points "modest on purpose". That read the
wrong statistic. +6.4 measured whether grounding helps; the question was whether the
borough still matters, and the gap between fighting the supporter on borough ground and
off it had fallen from 60.6 points to 44.9. Half damage from every departmental weapon is
meant to be the fight's central problem, and I had quietly taken sixteen points off it
while reporting a small number about something else. Same error as R-251.
Three changes that only work together:
- hide 7 -> 9, restoring the weight on the axis that should hurt
- grounded still halves it, 9 -> 4, which an ordinary round beats
- exposedHideFor now takes the location's kind and leaves `vital` unhalved: a beast on
its belly is not presenting its chest to the floor
Measured: 28.4% on borough ground flying, 68.4% grounded, 84.6% off it — a 56.2 point gap
against 44.9 before. Predicted 28.4 / 84.3 / 55.9 before building.
The composition of the three hide functions lives in prepareDerivedData where no test
could reach it, and check-anatomy's guard 6 is deliberately one-sided so it would not
have caught the vital losing its exemption. check-behaviour now composes the same
expression from the real supporter spec and the real tables. Negative-tested four ways:
removing the exemption, un-baring the wings, removing the halving, and inflating the hide
past what a round can beat each fail it with the right message.
Cost: the supporter goes from fifth to second deadliest creature in the book (2.84 -> 3.38
down, 46.8% -> 69.3% wiped). check-lethality refused the build until that row was
deliberately re-recorded.
BESTIARY.md printed the new hide and said nothing about it halving, because the body-plan
blurb predates the rule. The README said "eight guards" in three sentences above a
generated block listing nine. Both are the signature defect in prose: a number written
down that nothing reads. Both now generate.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
ee4e687c6c
commit
c0d33ee81d
@@ -48,7 +48,7 @@ packs or regenerate art on that machine:
|
||||
```bash
|
||||
npm install # pulls classic-level, used to write the LevelDB packs
|
||||
npm run build # rebuilds packs/ from tools/content.mjs
|
||||
npm run check # the eight guards; the build refuses to run if they fail
|
||||
npm run check # the nine guards; the build refuses to run if they fail
|
||||
```
|
||||
|
||||
To update a deployed server: `git pull` and restart Foundry. If the pull touches
|
||||
@@ -157,7 +157,7 @@ icons/ fonts/ art/ generated art
|
||||
packs/ built LevelDB compendia (committed — see Deploying)
|
||||
tools/
|
||||
content.mjs the catalogue: skills, weapons, armour, gear, vehicles, NPCs
|
||||
build-packs.mjs builds packs/ — runs the eight guards first and refuses on failure
|
||||
build-packs.mjs builds packs/ — runs the nine guards first and refuses on failure
|
||||
make-icons.mjs draws all 231 icons
|
||||
rules-text.mjs generates the rules journal FROM rules.mjs
|
||||
mission.mjs the case generator
|
||||
@@ -177,15 +177,15 @@ stops being identity-equal to what it aliases, if a constant is re-declared as a
|
||||
literal, or if an exported rule has no spot-check. The packs used to be built under
|
||||
one set of numbers and played under another; this makes that impossible to ship.
|
||||
|
||||
The build runs all eight guards before it writes anything:
|
||||
The build runs all nine guards before it writes anything:
|
||||
|
||||
<!-- guards:start -->
|
||||
```
|
||||
check-rules: OK — 107 rules, 34 files scanned, 3 aliases + 46 constant sets checked, 381 formulas verified
|
||||
check-rules: OK — 108 rules, 34 files scanned, 3 aliases + 46 constant sets checked, 387 formulas verified
|
||||
check-kits: OK — 25 roles, 10 trades, 218 catalogue items, every kit key resolves, every posting can use what it carries, every loadout distinct
|
||||
check-lang: OK — en.json, 1016 keys, no leaf/branch collisions
|
||||
check-templates: OK — 19 templates compile
|
||||
check-behaviour: OK — 75 behavioural tests
|
||||
check-behaviour: OK — 76 behavioural tests
|
||||
check-scenarios: OK — 10 scenario files, 78 mechanic tags, every skill named resolves against 62 catalogue entries
|
||||
check-creatures: OK — 102 actor specs across 8 sources, every characteristic, skill, kit key, talent, species and style resolves, no duplicate keys
|
||||
check-anatomy: OK — 5 body plans, 36 locations, d20 complete in both modes, every location drawn, every kind handled and destructible, 20 plan changes carried 432 wounds with their severity intact, 1 flyer(s) with a survivable landing
|
||||
|
||||
+4
-4
@@ -12,8 +12,8 @@ Sorted by how much of a four-agent party each one puts on the floor, alone. **So
|
||||
| | Creature | Essence | SIZ | Arm | HP | Attack | Down of 4 |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
| | **Quarantine unit** | Sent to contain the same thing you were, and it got here first | 14 | 9 | 17 | Unmaker 75% | 3.71 |
|
||||
| | **The supporter** | The winged beast off a borough coat of arms, come down off it | 24 | 9 | 30 | Grasping limb 75% | 3.38 |
|
||||
| | **Long walker** | It has been coming here for a very long time and is nearly arrived | 22 | 10 | 24 | Grasping limb 80% | 3.18 |
|
||||
| | **The supporter** | The winged beast off a borough coat of arms, come down off it | 24 | 7 | 30 | Grasping limb 75% | 2.84 |
|
||||
| | **The stanchion** | Something was driven through the floor here to keep the door from shutting | 21 | 12 | 23 | Grasping limb 45% | 2.29 |
|
||||
| | **Nuckelavee** | It came up out of the firth and everything it breathes on dies | 20 | 5 | 20 | Grasping limb 85% | 1.70 |
|
||||
| | **The arrears** | Something was borrowed from the far side in 1968 and this is the collection | 19 | 7 | 20 | Grasping limb 80% | 1.62 |
|
||||
@@ -72,17 +72,17 @@ Older than the department and largely uninterested in it. Most of these are arra
|
||||
|
||||
*The winged beast off a borough coat of arms, come down off it*
|
||||
|
||||
> **Four-legged, winged** — as the four-legged, plus wings. **Disable either wing and it cannot fly**, which is the fight the players can win. Wings are 6 faces of 20 at range and 2 in melee.
|
||||
> **Four-legged, winged** — as the four-legged, plus wings. **Disable either wing and it cannot fly**, which is the fight the players can win. Wings are 6 faces of 20 at range and 2 in melee, and carry no hide at all. Once it is grounded the hide halves everywhere except the chest, which it keeps turned towards you.
|
||||
|
||||
| STR | CON | SIZ | INT | POW | DEX | Armour | HP | Major wound | Locations |
|
||||
|---|---|---|---|---|---|---|---|---|---|
|
||||
| 26 | 36 | 24 | 8 | 17 | 12 | 7 | 30 | 15 | 7 |
|
||||
| 26 | 36 | 24 | 8 | 17 | 12 | 9 | 30 | 15 | 7 |
|
||||
|
||||
**Attacks with** Grasping limb at 75%, 1d6+1 · **dodges** 35%
|
||||
|
||||
**ARGENT AND GULES.** While it stands on ground the borough holds, it takes half damage from anything the borough owns — which includes the department's vehicles and any weapon signed out of Stores. WING IT.
|
||||
|
||||
*Measured alone against the frozen party: 2.84 of 4 down, 46.8% wiped, 14 rounds.*
|
||||
*Measured alone against the frozen party: 3.38 of 4 down, 69.3% wiped, 17 rounds.*
|
||||
|
||||
### Nuckelavee
|
||||
|
||||
|
||||
@@ -5312,3 +5312,54 @@ It is also deliberately one-sided: it catches grounding being a setback, not gro
|
||||
being too generous. Stripping the hide to zero passes it. That is a balance question and
|
||||
this is a correctness guard, and conflating the two is how the six-point tolerance in
|
||||
check-lethality came to hide a real change for four commits.
|
||||
|
||||
## R-255 — the belly rule was measured against the wrong question, and undersold
|
||||
|
||||
R-254 called +6.4 points "modest on purpose" and I left it there. That was the wrong
|
||||
reading of my own number. +6.4 measured whether grounding *helps*; the design question was
|
||||
whether the borough still *matters*, and on that the belly rule had quietly gone too far —
|
||||
the gap between fighting the supporter on borough ground and off it had fallen from 60.6
|
||||
points (1.7.8) to 44.9 (1.7.9). Half-damage from every departmental weapon is supposed to
|
||||
be the fight's central problem. Compressing the penalty for ignoring it by sixteen points
|
||||
is not modest, and calling it modest because a different statistic looked small is the
|
||||
same error as R-251: reporting the measurement I happened to take instead of the one the
|
||||
decision needed.
|
||||
|
||||
**The fix: hide 9, grounded 4, vital exempt.** Three changes that only work together.
|
||||
|
||||
- Hide 7 → 9. Restores the weight the belly rule removed, on the axis that is supposed to
|
||||
hurt: being shot at with departmental kit.
|
||||
- Grounded halves it, as R-254 — 9 becomes 4, still a number an ordinary round beats.
|
||||
- `exposedHideFor` now takes the location's kind and returns natural armour **unhalved for
|
||||
`vital`**. A beast on its belly is not presenting its chest to the floor; that plate is
|
||||
facing you in every posture. Mechanically it keeps one hard target so grounding is a
|
||||
change of problem, not a solved fight.
|
||||
|
||||
| | flying | grounded | gap to off-borough |
|
||||
|---|---|---|---|
|
||||
| 1.7.8 (no belly rule) | 1.4% | — | 60.6 |
|
||||
| 1.7.9 (hide 7, halved) | 45.3% | 51.7% | 44.9 |
|
||||
| **1.7.10 (hide 9, grounded 4, vital exempt)** | **28.4%** | **68.4%** | **56.2** |
|
||||
|
||||
Grounding is now worth 40 points and the borough is worth 56 again. Predicted 28.4 / 84.3
|
||||
/ 55.9 before building; measured 28.4 / 84.6 / 56.2.
|
||||
|
||||
**Negative test.** Exempting every location rather than only the vital makes check-anatomy
|
||||
guard 6 fail — "an average round gets 2.30 through it flying and only 0.50 once grounded" —
|
||||
which is the guard doing its job on the version of this change that would have been wrong.
|
||||
|
||||
**Cost.** The supporter moves from fifth to second deadliest creature in the book: 2.84 of
|
||||
4 down to 3.38, 46.8% wiped to 69.3%, 14 rounds to 17. check-lethality refused the build
|
||||
until that row was deliberately re-recorded, which is the behaviour R-251 bought.
|
||||
|
||||
**The doc gap this exposed.** BESTIARY.md printed the new hide of 9 and said nothing about
|
||||
it halving, because the body-plan blurb was written before the rule existed. A rule that
|
||||
lives in `rules.mjs` and not on the page the GM reads at the table is the project's
|
||||
signature defect wearing a different coat. The `winged` note now states both halves: the
|
||||
wings carry no hide, and grounding halves the rest except the chest.
|
||||
|
||||
**One more count that was written down and never read.** The README's guard block is
|
||||
generated and validated against `npm run check`, and three sentences around it still said
|
||||
"the eight guards" while nine ran. `update-readme` now rewrites the count word as well as
|
||||
the block. The comment warning that a hardcoded list goes stale was sitting four lines
|
||||
above the prose that had gone stale.
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
||||
MANIFEST-000004
|
||||
MANIFEST-000002
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
||||
MANIFEST-000004
|
||||
MANIFEST-000002
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+1
-1
@@ -1 +1 @@
|
||||
MANIFEST-000004
|
||||
MANIFEST-000002
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
||||
MANIFEST-000004
|
||||
MANIFEST-000002
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+1
-1
@@ -1 +1 @@
|
||||
MANIFEST-000004
|
||||
MANIFEST-000002
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
||||
MANIFEST-000004
|
||||
MANIFEST-000002
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
||||
MANIFEST-000004
|
||||
MANIFEST-000002
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
||||
MANIFEST-000004
|
||||
MANIFEST-000002
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
||||
MANIFEST-000004
|
||||
MANIFEST-000002
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+1
-1
@@ -1 +1 @@
|
||||
MANIFEST-000004
|
||||
MANIFEST-000002
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
||||
MANIFEST-000004
|
||||
MANIFEST-000002
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+1
-1
@@ -1 +1 @@
|
||||
MANIFEST-000004
|
||||
MANIFEST-000002
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
||||
MANIFEST-000004
|
||||
MANIFEST-000002
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
||||
MANIFEST-000004
|
||||
MANIFEST-000002
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
||||
MANIFEST-000004
|
||||
MANIFEST-000002
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
||||
MANIFEST-000004
|
||||
MANIFEST-000002
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user