diff --git a/README.md b/README.md index 5910fb9..1c5f01b 100644 --- a/README.md +++ b/README.md @@ -182,7 +182,7 @@ The build runs all three guards before it writes anything: ``` check-rules: OK — 87 rules, 21 files scanned, 3 aliases + 41 constant sets checked, 275 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, 927 keys, no leaf/branch collisions -check-behaviour: OK — 44 behavioural tests +check-lang: OK — en.json, 945 keys, no leaf/branch collisions +check-behaviour: OK — 45 behavioural tests ``` diff --git a/art/maps/culland-hall.svg b/art/maps/culland-hall.svg new file mode 100644 index 0000000..8b5f589 --- /dev/null +++ b/art/maps/culland-hall.svg @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + CULLAND HALL + GROUND FLOOR · THE CULLAND HAUNTING · LAST ADMISSION 22:00 + + + + + + + 5 + LONG GALLERY + strobe · mirrors · no cast at all + + + + 6 + BALLROOM + lights up · fire exit · "thanks for coming" + + + + 1 + ENTRANCE HALL + the WALL PANEL — four names + + ticket desk · head count + + + + + + + MAIN STAIRS + + + EDITH CRANE stands here + + + + 2 + THE WARD — EAST CORRIDOR + Sister Enderby counts + + JOSH PARDOE is behind this wall → + + + + 3 + THE NURSERY + Sammy in the wall · hole at ankle height + + + + + GREEN + ROOM + call sheet + costumes + SET PLANS + pinned up + + + + CONTROL + Ferriby · comms + + + + KITCHENS + Sharrock's way + out — NOT on + the fire plan + + + + YARD + skip · taped hasp + + + + + + + + + + + + + + + + + THE LAWN — ninety feet of it + + + + MARQUEE + queue · box office · muster point + + + + 4 + THE GLASSHOUSE + Old Marrow · the taped line + + he stops here — and tonight he does not + + + + CAR PARK + the van · the tea urn · blue lights + + + + OLD MARROW WILL NOT CROSS THIS LINE — inside is a complete answer + + + + + KEY + door / opening + a body, or a person + + Marrow's limit + + diff --git a/art/maps/culland-hall.webp b/art/maps/culland-hall.webp new file mode 100644 index 0000000..d0a6f86 Binary files /dev/null and b/art/maps/culland-hall.webp differ diff --git a/docs/scenarios/LAST_ADMISSION.md b/docs/scenarios/LAST_ADMISSION.md index fb806e9..22c95ce 100644 --- a/docs/scenarios/LAST_ADMISSION.md +++ b/docs/scenarios/LAST_ADMISSION.md @@ -439,6 +439,7 @@ If there is time — and there usually is, because this ends early — she says | LA-ART-06 | The green room: mirrors, costumes, a clipboard on the door — used on the Act One page, where the call sheet is | | LA-ART-07 | Edith Crane on the stairs | | LA-ART-08 | The car park afterwards: a van, a tea urn, blue lights | +| LA-MAP-01 | **Culland Hall floor plan** — drawn, not generated (`art/maps/culland-hall.svg`), and shipped as a playable **Scene** in the adventure: 2800×2000 at 100px to the square, 5ft grid, no walls (add them if you want line-of-sight). | --- diff --git a/lang/en.json b/lang/en.json index d3c405c..6e20b38 100644 --- a/lang/en.json +++ b/lang/en.json @@ -13,6 +13,8 @@ "TYPES.Item.group": "Group", "TYPES.Item.vehicle": "Vehicle", "TYPES.Item.authority": "Authority", + "TYPES.Item.talent": "Talent", + "TYPES.Item.power": "Art", "RINGBRP.Tab.Access": "Access", "RINGBRP.New.authority": "New authority", "RINGBRP.Scope.nothing": "nothing at all", @@ -925,5 +927,21 @@ "RINGBRP.Gen.RolledChar": "{ch}", "RINGBRP.Gen.TakeThem": "Keep these", "RINGBRP.Gen.Nth": "agent {n}", - "RINGBRP.Dialog.Circumstance": "How are the circumstances?" + "RINGBRP.Dialog.Circumstance": "How are the circumstances?", + "RINGBRP.Item.TalentId": "Talent key", + "RINGBRP.Item.TalentCategory": "Category", + "RINGBRP.Item.TalentSummary": "In one line", + "RINGBRP.Item.TalentRule": "What it does", + "RINGBRP.Item.GrantsAction": "Grants action", + "RINGBRP.Item.UsesPerCase": "Uses per case", + "RINGBRP.Item.UsedThisCase": "Used this case", + "RINGBRP.Item.SkillBonusFam": "Bonus to skill", + "RINGBRP.Item.SkillBonusVal": "Bonus", + "RINGBRP.Item.ArtId": "Art key", + "RINGBRP.Item.ArtSummary": "In one line", + "RINGBRP.Item.ArtRule": "What it does", + "RINGBRP.Item.ArtRating": "Rating", + "RINGBRP.Item.PushCost": "Push cost", + "RINGBRP.Item.PushRule": "What pushing does", + "RINGBRP.Item.Origin": "Where it came from" } diff --git a/packs/armour/LOG b/packs/armour/LOG index 4d8cf14..8776f37 100644 --- a/packs/armour/LOG +++ b/packs/armour/LOG @@ -1 +1 @@ -2026/08/12-18:41:45.665018 17412b000 Delete type=3 #1 +2026/08/12-19:01:54.231003 174603000 Delete type=3 #1 diff --git a/packs/expedition/LOG b/packs/expedition/LOG index 4852486..8c4a8e3 100644 --- a/packs/expedition/LOG +++ b/packs/expedition/LOG @@ -1 +1 @@ -2026/08/12-18:41:45.733783 172907000 Delete type=3 #1 +2026/08/12-19:01:54.298648 173df7000 Delete type=3 #1 diff --git a/packs/gear/LOG b/packs/gear/LOG index 236679a..38822a5 100644 --- a/packs/gear/LOG +++ b/packs/gear/LOG @@ -1 +1 @@ -2026/08/12-18:41:45.666832 17391f000 Delete type=3 #1 +2026/08/12-19:01:54.232848 174603000 Delete type=3 #1 diff --git a/packs/lastadmission/000003.log b/packs/lastadmission/000003.log index 817f360..ce0f98c 100644 Binary files a/packs/lastadmission/000003.log and b/packs/lastadmission/000003.log differ diff --git a/packs/lastadmission/LOG b/packs/lastadmission/LOG index b2bdb1b..963c54b 100644 --- a/packs/lastadmission/LOG +++ b/packs/lastadmission/LOG @@ -1 +1 @@ -2026/08/12-18:41:45.717519 17412b000 Delete type=3 #1 +2026/08/12-19:01:54.282484 173df7000 Delete type=3 #1 diff --git a/packs/npcs/LOG b/packs/npcs/LOG index 86ac18a..a601b23 100644 --- a/packs/npcs/LOG +++ b/packs/npcs/LOG @@ -1 +1 @@ -2026/08/12-18:41:45.701249 173113000 Delete type=3 #1 +2026/08/12-19:01:54.266480 174603000 Delete type=3 #1 diff --git a/packs/powers/LOG b/packs/powers/LOG index b88a9bc..7d4e028 100644 --- a/packs/powers/LOG +++ b/packs/powers/LOG @@ -1 +1 @@ -2026/08/12-18:41:45.728905 173113000 Delete type=3 #1 +2026/08/12-19:01:54.293373 173df7000 Delete type=3 #1 diff --git a/packs/pregens/LOG b/packs/pregens/LOG index ce0ed96..9a7326e 100644 --- a/packs/pregens/LOG +++ b/packs/pregens/LOG @@ -1 +1 @@ -2026/08/12-18:41:45.686790 17412b000 Delete type=3 #1 +2026/08/12-19:01:54.252536 174603000 Delete type=3 #1 diff --git a/packs/primer/LOG b/packs/primer/LOG index 6de1ebf..cad6883 100644 --- a/packs/primer/LOG +++ b/packs/primer/LOG @@ -1 +1 @@ -2026/08/12-18:41:45.725345 17412b000 Delete type=3 #1 +2026/08/12-19:01:54.290196 172ddf000 Delete type=3 #1 diff --git a/packs/prologue/LOG b/packs/prologue/LOG index 1fea6ae..b202996 100644 --- a/packs/prologue/LOG +++ b/packs/prologue/LOG @@ -1 +1 @@ -2026/08/12-18:41:45.721830 17391f000 Delete type=3 #1 +2026/08/12-19:01:54.286378 174603000 Delete type=3 #1 diff --git a/packs/rules/LOG b/packs/rules/LOG index 5d3f62e..9f633fc 100644 --- a/packs/rules/LOG +++ b/packs/rules/LOG @@ -1 +1 @@ -2026/08/12-18:41:45.732314 17391f000 Delete type=3 #1 +2026/08/12-19:01:54.297168 1735eb000 Delete type=3 #1 diff --git a/packs/skills/LOG b/packs/skills/LOG index ca7c052..0b724e4 100644 --- a/packs/skills/LOG +++ b/packs/skills/LOG @@ -1 +1 @@ -2026/08/12-18:41:45.659409 172907000 Delete type=3 #1 +2026/08/12-19:01:54.224954 172ddf000 Delete type=3 #1 diff --git a/packs/slice/LOG b/packs/slice/LOG index e6e8f8e..3e29be6 100644 --- a/packs/slice/LOG +++ b/packs/slice/LOG @@ -1 +1 @@ -2026/08/12-18:41:45.727208 173113000 Delete type=3 #1 +2026/08/12-19:01:54.291920 1735eb000 Delete type=3 #1 diff --git a/packs/starter/LOG b/packs/starter/LOG index 870547d..61e8c3e 100644 --- a/packs/starter/LOG +++ b/packs/starter/LOG @@ -1 +1 @@ -2026/08/12-18:41:45.711308 17412b000 Delete type=3 #1 +2026/08/12-19:01:54.276268 174603000 Delete type=3 #1 diff --git a/packs/tables/LOG b/packs/tables/LOG index c7b272c..e01280e 100644 --- a/packs/tables/LOG +++ b/packs/tables/LOG @@ -1 +1 @@ -2026/08/12-18:41:45.705364 17412b000 Delete type=3 #1 +2026/08/12-19:01:54.270666 173df7000 Delete type=3 #1 diff --git a/packs/talents/LOG b/packs/talents/LOG index 89cfe2e..99bf54a 100644 --- a/packs/talents/LOG +++ b/packs/talents/LOG @@ -1 +1 @@ -2026/08/12-18:41:45.662077 172907000 Delete type=3 #1 +2026/08/12-19:01:54.227877 174603000 Delete type=3 #1 diff --git a/packs/vehicles/LOG b/packs/vehicles/LOG index a1f5bd0..8c419b5 100644 --- a/packs/vehicles/LOG +++ b/packs/vehicles/LOG @@ -1 +1 @@ -2026/08/12-18:41:45.668653 17412b000 Delete type=3 #1 +2026/08/12-19:01:54.234705 1735eb000 Delete type=3 #1 diff --git a/packs/weapons/LOG b/packs/weapons/LOG index 76a1df1..f4bb6e4 100644 --- a/packs/weapons/LOG +++ b/packs/weapons/LOG @@ -1 +1 @@ -2026/08/12-18:41:45.663680 17412b000 Delete type=3 #1 +2026/08/12-19:01:54.229633 174603000 Delete type=3 #1 diff --git a/ringbrp.mjs b/ringbrp.mjs index f3a0e47..f335f9d 100644 --- a/ringbrp.mjs +++ b/ringbrp.mjs @@ -1524,7 +1524,10 @@ export async function loseCoherence(actor, reasonKey, { amount = null, note = "" speaker: ChatMessage.getSpeaker({ actor }), content: await rbRenderTemplate("systems/ringbrp/templates/chat-coherence.hbs", { actorName: actor.name, before, after, cost, - reason: game.i18n.localize(spec?.label ?? reasonKey), note, + // The cost is already applied by this point, so anything that throws here loses + // the announcement and leaves the actor quietly poorer. localize() throws on a + // non-string, which an unrecognised reason will be. + reason: game.i18n.localize(String(spec?.label ?? reasonKey ?? "")), note, band: bAfter, crossed: bBefore.id !== bAfter.id, pips: Array.from({ length: Number(actor.system.coherence?.max ?? 10) }, (_, i) => i < after) }) @@ -5514,6 +5517,11 @@ class RingBRPItemSheet extends ItemSheet { ctx.isMaterial = this.item.type === "material"; ctx.isVehicle = this.item.type === "vehicle"; ctx.isAuthority = this.item.type === "authority"; + // Talents and Arts were added after this list and never joined it, so their sheets + // rendered an empty Detail tab over real data — category, rule, uses and cost all + // sat in the document with nothing on screen reading them. + ctx.isTalent = this.item.type === "talent"; + ctx.isPower = this.item.type === "power"; ctx.descriptionHTML = await rbEnrich(ctx.sys.description ?? ""); if (ctx.isGear) { diff --git a/system.json b/system.json index c9f010b..9a6bdad 100644 --- a/system.json +++ b/system.json @@ -2,7 +2,7 @@ "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.0.1", + "version": "1.0.2", "compatibility": { "minimum": 13, "verified": "14.364" diff --git a/templates/item-sheet.hbs b/templates/item-sheet.hbs index 7e4a9f5..edbd771 100644 --- a/templates/item-sheet.hbs +++ b/templates/item-sheet.hbs @@ -171,6 +171,28 @@ {{/if}} + {{#if isTalent}} +
+
{{localize "RINGBRP.Item.TalentCategory"}} + {{sys.category}}
+
{{localize "RINGBRP.Item.UsesPerCase"}} + {{#if sys.usesPerCase}}{{sys.usedThisCase}} / {{sys.usesPerCase}}{{else}}—{{/if}}
+
{{localize "RINGBRP.Coh.Label"}} + {{#if sys.coherenceCost}}{{sys.coherenceCost}}{{else}}—{{/if}}
+
+ {{/if}} + + {{#if isPower}} +
+
{{localize "RINGBRP.Item.ArtRating"}} + {{sys.value}}%
+
{{localize "RINGBRP.Coh.Label"}} + {{sys.coherenceCost}}
+
{{localize "RINGBRP.Item.PushCost"}} + {{sys.pushCost}}
+
+ {{/if}} +