locationDamage is keyed by location id and prepareDerivedData reads only
the keys belonging to the current plan, so changing speciesProfile on a
wounded actor stranded every wound it had. Found on a live Barghest that
had been shot in the leg and chest as a humanoid and then switched to
quadruped: 5 points under `legR` and 7 under `chest`, exactly its 12
missing hit points, sitting under keys no quadruped location answers to.
It read on the sheet as a badly hurt dog with eight pristine locations.
Stored and never read — the same defect this system keeps producing.
rules.mjs gains remapLocationDamage, which carries wounds across by KIND,
because kind is what the rules act on. Exact-kind matches are claimed
first in table order, so the obvious pairings land before any fallback
competes for them; that ordering is what makes the arms become the
forelegs going one way and the forelegs become the arms coming back.
Overflow past a location's destroyed ceiling is reported, not dropped.
It also gains locationDamageReplacement, which exists because the first
version of this fix had the bug it was fixing. Foundry merges object
updates so the outgoing keys must be deleted by name (R-93), but a
deletion and an assignment of the SAME key do not both apply — the
deletion wins. quadruped and winged share every location but the wings,
so switching between them emitted `-=hindLegR` alongside `hindLegR: 5`
and threw the wound away. Caught in live testing, not by reading.
Guards, both negative-tested before being wired in:
- check-anatomy now walks all 20 ordered plan pairs and asserts every
wound lands on a location the destination has, the arithmetic closes,
the round trip does not leak, and no update both sets and deletes the
same key.
- check-rules gains 13 spot-checks over both new rules.
Verified in a running Foundry: baseline -> quadruped -> winged ->
quadruped -> baseline conserves all 12 points with no orphans, returns
to exactly {legR: 5, chest: 7}, and whispers the GM a receipt of what
moved each time.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
240 lines
5.5 KiB
JSON
240 lines
5.5 KiB
JSON
{
|
|
"id": "ringbrp",
|
|
"title": "The Custodians",
|
|
"description": "A Basic Roleplaying game of agents who cross the crossing to contain what should not be there — and who come back a little less from here each time.",
|
|
"version": "1.7.1",
|
|
"compatibility": {
|
|
"minimum": 13,
|
|
"verified": "14.364"
|
|
},
|
|
"authors": [
|
|
{
|
|
"name": "Tim Evans (slaguru666)"
|
|
}
|
|
],
|
|
"esmodules": [
|
|
"ringbrp.mjs"
|
|
],
|
|
"styles": [
|
|
"styles/ringbrp.css"
|
|
],
|
|
"languages": [
|
|
{
|
|
"lang": "en",
|
|
"name": "English",
|
|
"path": "lang/en.json"
|
|
}
|
|
],
|
|
"socket": false,
|
|
"initiative": "@characteristics.dex.value",
|
|
"grid": {
|
|
"distance": 3,
|
|
"units": "m"
|
|
},
|
|
"primaryTokenAttribute": "hp",
|
|
"secondaryTokenAttribute": null,
|
|
"packs": [
|
|
{
|
|
"name": "pregens",
|
|
"label": "The Custodians · Agents",
|
|
"path": "packs/pregens",
|
|
"type": "Actor",
|
|
"system": "ringbrp",
|
|
"ownership": {
|
|
"PLAYER": "OBSERVER",
|
|
"ASSISTANT": "OWNER"
|
|
}
|
|
},
|
|
{
|
|
"name": "npcs",
|
|
"label": "The Custodians · Natives & Threats",
|
|
"path": "packs/npcs",
|
|
"type": "Actor",
|
|
"system": "ringbrp",
|
|
"ownership": {
|
|
"PLAYER": "NONE",
|
|
"ASSISTANT": "OWNER"
|
|
}
|
|
},
|
|
{
|
|
"name": "skills",
|
|
"label": "The Custodians · Skill List",
|
|
"path": "packs/skills",
|
|
"type": "Item",
|
|
"system": "ringbrp"
|
|
},
|
|
{
|
|
"name": "talents",
|
|
"label": "The Custodians · Talents",
|
|
"path": "packs/talents",
|
|
"type": "Item",
|
|
"system": "ringbrp",
|
|
"ownership": {
|
|
"PLAYER": "OBSERVER",
|
|
"ASSISTANT": "OWNER"
|
|
}
|
|
},
|
|
{
|
|
"name": "powers",
|
|
"label": "The Custodians · The Quiet Arts",
|
|
"path": "packs/powers",
|
|
"type": "Item",
|
|
"system": "ringbrp",
|
|
"ownership": {
|
|
"PLAYER": "OBSERVER",
|
|
"ASSISTANT": "OWNER"
|
|
}
|
|
},
|
|
{
|
|
"name": "weapons",
|
|
"label": "The Custodians · Weapons",
|
|
"path": "packs/weapons",
|
|
"type": "Item",
|
|
"system": "ringbrp"
|
|
},
|
|
{
|
|
"name": "armour",
|
|
"label": "The Custodians · Armour",
|
|
"path": "packs/armour",
|
|
"type": "Item",
|
|
"system": "ringbrp"
|
|
},
|
|
{
|
|
"name": "gear",
|
|
"label": "The Custodians · Gear & Devices",
|
|
"path": "packs/gear",
|
|
"type": "Item",
|
|
"system": "ringbrp"
|
|
},
|
|
{
|
|
"name": "vehicles",
|
|
"label": "The Custodians · Transport",
|
|
"path": "packs/vehicles",
|
|
"type": "Item",
|
|
"system": "ringbrp"
|
|
},
|
|
{
|
|
"name": "primer",
|
|
"label": "The Custodians · Read this first (players)",
|
|
"path": "packs/primer",
|
|
"type": "JournalEntry",
|
|
"system": "ringbrp"
|
|
},
|
|
{
|
|
"name": "rules",
|
|
"label": "The Custodians · Rules",
|
|
"path": "packs/rules",
|
|
"type": "JournalEntry",
|
|
"system": "ringbrp"
|
|
},
|
|
{
|
|
"name": "throughtrain",
|
|
"label": "The Custodians · THROUGH TRAIN (crossing starter)",
|
|
"path": "packs/throughtrain",
|
|
"type": "Adventure",
|
|
"system": "ringbrp"
|
|
},
|
|
{
|
|
"name": "starter",
|
|
"label": "The Custodians · BLACK PLATFORM (starter case)",
|
|
"path": "packs/starter",
|
|
"type": "Adventure",
|
|
"system": "ringbrp"
|
|
},
|
|
{
|
|
"name": "lastadmission",
|
|
"label": "The Custodians · LAST ADMISSION (prologue)",
|
|
"path": "packs/lastadmission",
|
|
"type": "Adventure",
|
|
"system": "ringbrp"
|
|
},
|
|
{
|
|
"name": "prologue",
|
|
"label": "The Custodians · OPEN DAY (prologue)",
|
|
"path": "packs/prologue",
|
|
"type": "Adventure",
|
|
"system": "ringbrp"
|
|
},
|
|
{
|
|
"name": "slice",
|
|
"label": "The Custodians · The Ilfracombe Crossing",
|
|
"path": "packs/slice",
|
|
"type": "JournalEntry",
|
|
"system": "ringbrp"
|
|
},
|
|
{
|
|
"name": "tables",
|
|
"label": "The Custodians · Site & Hazard Tables",
|
|
"path": "packs/tables",
|
|
"type": "RollTable",
|
|
"system": "ringbrp"
|
|
},
|
|
{
|
|
"name": "expedition",
|
|
"label": "The Custodians · Case File: ILFRACOMBE",
|
|
"path": "packs/expedition",
|
|
"type": "Actor",
|
|
"system": "ringbrp",
|
|
"ownership": {
|
|
"PLAYER": "OBSERVER",
|
|
"ASSISTANT": "OWNER"
|
|
}
|
|
}
|
|
],
|
|
"packFolders": [
|
|
{
|
|
"name": "The Custodians",
|
|
"sorting": "m",
|
|
"color": "#18268d",
|
|
"folders": [
|
|
{
|
|
"name": "Scenarios",
|
|
"sorting": "m",
|
|
"packs": [
|
|
"throughtrain",
|
|
"lastadmission",
|
|
"prologue",
|
|
"starter",
|
|
"expedition",
|
|
"slice"
|
|
]
|
|
},
|
|
{
|
|
"name": "Characters",
|
|
"sorting": "m",
|
|
"packs": [
|
|
"pregens",
|
|
"npcs"
|
|
]
|
|
},
|
|
{
|
|
"name": "Equipment",
|
|
"sorting": "m",
|
|
"packs": [
|
|
"weapons",
|
|
"armour",
|
|
"gear",
|
|
"vehicles"
|
|
]
|
|
},
|
|
{
|
|
"name": "Rules & reference",
|
|
"sorting": "m",
|
|
"packs": [
|
|
"primer",
|
|
"rules",
|
|
"skills",
|
|
"talents",
|
|
"powers",
|
|
"tables"
|
|
]
|
|
}
|
|
]
|
|
}
|
|
],
|
|
"url": "https://gitea.timevans.uk/slaguru666/RingBRP",
|
|
"manifest": "https://gitea.timevans.uk/slaguru666/RingBRP/raw/branch/main/system.json",
|
|
"download": "https://gitea.timevans.uk/slaguru666/RingBRP/archive/main.zip",
|
|
"license": "LICENSE.txt"
|
|
}
|