diff --git a/README.md b/README.md index d35e252..ff3160e 100644 --- a/README.md +++ b/README.md @@ -181,13 +181,13 @@ The build runs all eight guards before it writes anything: ``` -check-rules: OK — 103 rules, 34 files scanned, 3 aliases + 46 constant sets checked, 358 formulas verified +check-rules: OK — 107 rules, 34 files scanned, 3 aliases + 46 constant sets checked, 381 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, 1015 keys, no leaf/branch collisions +check-lang: OK — en.json, 1016 keys, no leaf/branch collisions check-templates: OK — 19 templates compile check-behaviour: OK — 75 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-lethality: OK — 47 creatures, none drifted more than 6 points of wipe rate against the frozen party, 1 new +check-lethality: OK — 47 creatures, none drifted more than 6 points of wipe rate against the frozen party ``` diff --git a/anatomy.mjs b/anatomy.mjs index 92a30fa..a8d03ce 100644 --- a/anatomy.mjs +++ b/anatomy.mjs @@ -68,8 +68,8 @@ export const LOCATION_TABLES = { { id: "foreQtr", label: "RINGBRP.Loc.ForeQtr", melee: [10, 12], ranged: [7, 9], frac: 0.5, kind: "vital", slot: "vital" }, { id: "foreLegR", label: "RINGBRP.Loc.ForeLegR", melee: [13, 14], ranged: [10, 10], frac: 0.42, kind: "leg" , slot: "upperR" }, { id: "foreLegL", label: "RINGBRP.Loc.ForeLegL", melee: [15, 16], ranged: [11, 11], frac: 0.42, kind: "leg" , slot: "upperL" }, - { id: "wingR", label: "RINGBRP.Loc.WingR", melee: [17, 17], ranged: [12, 14], frac: 0.35, kind: "wing" , slot: "wingR" }, - { id: "wingL", label: "RINGBRP.Loc.WingL", melee: [18, 18], ranged: [15, 17], frac: 0.35, kind: "wing" , slot: "wingL" }, + { id: "wingR", label: "RINGBRP.Loc.WingR", melee: [17, 17], ranged: [12, 14], frac: 0.35, kind: "wing" , slot: "wingR", bare: true }, + { id: "wingL", label: "RINGBRP.Loc.WingL", melee: [18, 18], ranged: [15, 17], frac: 0.35, kind: "wing" , slot: "wingL", bare: true }, { id: "neck", label: "RINGBRP.Loc.Neck", melee: [19, 19], ranged: [18, 19], frac: 0.4, kind: "neck" , slot: "neck" }, { id: "head", label: "RINGBRP.Loc.Head", melee: [20, 20], ranged: [20, 20], frac: 0.4, kind: "head" , slot: "head" } ] diff --git a/packs/armour/000003.log b/packs/armour/000003.log deleted file mode 100644 index 9b6d27d..0000000 Binary files a/packs/armour/000003.log and /dev/null differ diff --git a/packs/armour/000005.ldb b/packs/armour/000005.ldb new file mode 100644 index 0000000..c982555 Binary files /dev/null and b/packs/armour/000005.ldb differ diff --git a/packs/armour/000006.log b/packs/armour/000006.log new file mode 100644 index 0000000..1a1bb27 Binary files /dev/null and b/packs/armour/000006.log differ diff --git a/packs/armour/CURRENT b/packs/armour/CURRENT index 1a84852..cacca75 100644 --- a/packs/armour/CURRENT +++ b/packs/armour/CURRENT @@ -1 +1 @@ -MANIFEST-000002 +MANIFEST-000004 diff --git a/packs/armour/MANIFEST-000002 b/packs/armour/MANIFEST-000002 deleted file mode 100644 index bbbc585..0000000 Binary files a/packs/armour/MANIFEST-000002 and /dev/null differ diff --git a/packs/armour/MANIFEST-000004 b/packs/armour/MANIFEST-000004 new file mode 100644 index 0000000..9c05997 Binary files /dev/null and b/packs/armour/MANIFEST-000004 differ diff --git a/packs/expedition/000003.log b/packs/expedition/000003.log deleted file mode 100644 index 263295b..0000000 Binary files a/packs/expedition/000003.log and /dev/null differ diff --git a/packs/expedition/000005.ldb b/packs/expedition/000005.ldb new file mode 100644 index 0000000..4ff460d Binary files /dev/null and b/packs/expedition/000005.ldb differ diff --git a/packs/expedition/000006.log b/packs/expedition/000006.log new file mode 100644 index 0000000..268b187 Binary files /dev/null and b/packs/expedition/000006.log differ diff --git a/packs/expedition/CURRENT b/packs/expedition/CURRENT index 1a84852..cacca75 100644 --- a/packs/expedition/CURRENT +++ b/packs/expedition/CURRENT @@ -1 +1 @@ -MANIFEST-000002 +MANIFEST-000004 diff --git a/packs/expedition/MANIFEST-000002 b/packs/expedition/MANIFEST-000002 deleted file mode 100644 index bbbc585..0000000 Binary files a/packs/expedition/MANIFEST-000002 and /dev/null differ diff --git a/packs/expedition/MANIFEST-000004 b/packs/expedition/MANIFEST-000004 new file mode 100644 index 0000000..47fbcd4 Binary files /dev/null and b/packs/expedition/MANIFEST-000004 differ diff --git a/packs/gear/000003.log b/packs/gear/000003.log deleted file mode 100644 index 629ba6d..0000000 Binary files a/packs/gear/000003.log and /dev/null differ diff --git a/packs/gear/000005.ldb b/packs/gear/000005.ldb new file mode 100644 index 0000000..d9bac03 Binary files /dev/null and b/packs/gear/000005.ldb differ diff --git a/packs/gear/000006.log b/packs/gear/000006.log new file mode 100644 index 0000000..d1deb9b Binary files /dev/null and b/packs/gear/000006.log differ diff --git a/packs/gear/CURRENT b/packs/gear/CURRENT index 1a84852..cacca75 100644 --- a/packs/gear/CURRENT +++ b/packs/gear/CURRENT @@ -1 +1 @@ -MANIFEST-000002 +MANIFEST-000004 diff --git a/packs/gear/MANIFEST-000002 b/packs/gear/MANIFEST-000002 deleted file mode 100644 index bbbc585..0000000 Binary files a/packs/gear/MANIFEST-000002 and /dev/null differ diff --git a/packs/gear/MANIFEST-000004 b/packs/gear/MANIFEST-000004 new file mode 100644 index 0000000..f7cd73c Binary files /dev/null and b/packs/gear/MANIFEST-000004 differ diff --git a/packs/lastadmission/000003.log b/packs/lastadmission/000003.log deleted file mode 100644 index 8198bc0..0000000 Binary files a/packs/lastadmission/000003.log and /dev/null differ diff --git a/packs/lastadmission/000005.ldb b/packs/lastadmission/000005.ldb new file mode 100644 index 0000000..e5b019a Binary files /dev/null and b/packs/lastadmission/000005.ldb differ diff --git a/packs/lastadmission/000006.log b/packs/lastadmission/000006.log new file mode 100644 index 0000000..79bcc33 Binary files /dev/null and b/packs/lastadmission/000006.log differ diff --git a/packs/lastadmission/CURRENT b/packs/lastadmission/CURRENT index 1a84852..cacca75 100644 --- a/packs/lastadmission/CURRENT +++ b/packs/lastadmission/CURRENT @@ -1 +1 @@ -MANIFEST-000002 +MANIFEST-000004 diff --git a/packs/lastadmission/MANIFEST-000002 b/packs/lastadmission/MANIFEST-000002 deleted file mode 100644 index bbbc585..0000000 Binary files a/packs/lastadmission/MANIFEST-000002 and /dev/null differ diff --git a/packs/lastadmission/MANIFEST-000004 b/packs/lastadmission/MANIFEST-000004 new file mode 100644 index 0000000..0bf96a0 Binary files /dev/null and b/packs/lastadmission/MANIFEST-000004 differ diff --git a/packs/npcs/000003.log b/packs/npcs/000003.log deleted file mode 100644 index d3eedb8..0000000 Binary files a/packs/npcs/000003.log and /dev/null differ diff --git a/packs/npcs/000005.ldb b/packs/npcs/000005.ldb new file mode 100644 index 0000000..566f8de Binary files /dev/null and b/packs/npcs/000005.ldb differ diff --git a/packs/npcs/000006.log b/packs/npcs/000006.log new file mode 100644 index 0000000..aa1c847 Binary files /dev/null and b/packs/npcs/000006.log differ diff --git a/packs/npcs/CURRENT b/packs/npcs/CURRENT index 1a84852..cacca75 100644 --- a/packs/npcs/CURRENT +++ b/packs/npcs/CURRENT @@ -1 +1 @@ -MANIFEST-000002 +MANIFEST-000004 diff --git a/packs/npcs/MANIFEST-000002 b/packs/npcs/MANIFEST-000002 deleted file mode 100644 index bbbc585..0000000 Binary files a/packs/npcs/MANIFEST-000002 and /dev/null differ diff --git a/packs/npcs/MANIFEST-000004 b/packs/npcs/MANIFEST-000004 new file mode 100644 index 0000000..5e31df4 Binary files /dev/null and b/packs/npcs/MANIFEST-000004 differ diff --git a/packs/powers/000003.log b/packs/powers/000003.log deleted file mode 100644 index d723043..0000000 Binary files a/packs/powers/000003.log and /dev/null differ diff --git a/packs/powers/000005.ldb b/packs/powers/000005.ldb new file mode 100644 index 0000000..7f540c6 Binary files /dev/null and b/packs/powers/000005.ldb differ diff --git a/packs/powers/000006.log b/packs/powers/000006.log new file mode 100644 index 0000000..43e306f Binary files /dev/null and b/packs/powers/000006.log differ diff --git a/packs/powers/CURRENT b/packs/powers/CURRENT index 1a84852..cacca75 100644 --- a/packs/powers/CURRENT +++ b/packs/powers/CURRENT @@ -1 +1 @@ -MANIFEST-000002 +MANIFEST-000004 diff --git a/packs/powers/MANIFEST-000002 b/packs/powers/MANIFEST-000002 deleted file mode 100644 index bbbc585..0000000 Binary files a/packs/powers/MANIFEST-000002 and /dev/null differ diff --git a/packs/powers/MANIFEST-000004 b/packs/powers/MANIFEST-000004 new file mode 100644 index 0000000..20de082 Binary files /dev/null and b/packs/powers/MANIFEST-000004 differ diff --git a/packs/pregens/000003.log b/packs/pregens/000003.log deleted file mode 100644 index 4639dc5..0000000 Binary files a/packs/pregens/000003.log and /dev/null differ diff --git a/packs/pregens/000005.ldb b/packs/pregens/000005.ldb new file mode 100644 index 0000000..6957180 Binary files /dev/null and b/packs/pregens/000005.ldb differ diff --git a/packs/pregens/000006.log b/packs/pregens/000006.log new file mode 100644 index 0000000..01cc480 Binary files /dev/null and b/packs/pregens/000006.log differ diff --git a/packs/pregens/CURRENT b/packs/pregens/CURRENT index 1a84852..cacca75 100644 --- a/packs/pregens/CURRENT +++ b/packs/pregens/CURRENT @@ -1 +1 @@ -MANIFEST-000002 +MANIFEST-000004 diff --git a/packs/pregens/MANIFEST-000002 b/packs/pregens/MANIFEST-000002 deleted file mode 100644 index bbbc585..0000000 Binary files a/packs/pregens/MANIFEST-000002 and /dev/null differ diff --git a/packs/pregens/MANIFEST-000004 b/packs/pregens/MANIFEST-000004 new file mode 100644 index 0000000..dc2195a Binary files /dev/null and b/packs/pregens/MANIFEST-000004 differ diff --git a/packs/primer/000003.log b/packs/primer/000003.log deleted file mode 100644 index 4a43c24..0000000 Binary files a/packs/primer/000003.log and /dev/null differ diff --git a/packs/primer/000005.ldb b/packs/primer/000005.ldb new file mode 100644 index 0000000..75e5695 Binary files /dev/null and b/packs/primer/000005.ldb differ diff --git a/packs/primer/000006.log b/packs/primer/000006.log new file mode 100644 index 0000000..bb91941 Binary files /dev/null and b/packs/primer/000006.log differ diff --git a/packs/primer/CURRENT b/packs/primer/CURRENT index 1a84852..cacca75 100644 --- a/packs/primer/CURRENT +++ b/packs/primer/CURRENT @@ -1 +1 @@ -MANIFEST-000002 +MANIFEST-000004 diff --git a/packs/primer/MANIFEST-000002 b/packs/primer/MANIFEST-000002 deleted file mode 100644 index bbbc585..0000000 Binary files a/packs/primer/MANIFEST-000002 and /dev/null differ diff --git a/packs/primer/MANIFEST-000004 b/packs/primer/MANIFEST-000004 new file mode 100644 index 0000000..7f1100d Binary files /dev/null and b/packs/primer/MANIFEST-000004 differ diff --git a/packs/prologue/000003.log b/packs/prologue/000003.log deleted file mode 100644 index 3b576db..0000000 Binary files a/packs/prologue/000003.log and /dev/null differ diff --git a/packs/prologue/000005.ldb b/packs/prologue/000005.ldb new file mode 100644 index 0000000..88477dc Binary files /dev/null and b/packs/prologue/000005.ldb differ diff --git a/packs/prologue/000006.log b/packs/prologue/000006.log new file mode 100644 index 0000000..199b3af Binary files /dev/null and b/packs/prologue/000006.log differ diff --git a/packs/prologue/CURRENT b/packs/prologue/CURRENT index 1a84852..cacca75 100644 --- a/packs/prologue/CURRENT +++ b/packs/prologue/CURRENT @@ -1 +1 @@ -MANIFEST-000002 +MANIFEST-000004 diff --git a/packs/prologue/MANIFEST-000002 b/packs/prologue/MANIFEST-000002 deleted file mode 100644 index bbbc585..0000000 Binary files a/packs/prologue/MANIFEST-000002 and /dev/null differ diff --git a/packs/prologue/MANIFEST-000004 b/packs/prologue/MANIFEST-000004 new file mode 100644 index 0000000..57a863b Binary files /dev/null and b/packs/prologue/MANIFEST-000004 differ diff --git a/packs/rules/000003.log b/packs/rules/000003.log deleted file mode 100644 index 602aa25..0000000 Binary files a/packs/rules/000003.log and /dev/null differ diff --git a/packs/rules/000005.ldb b/packs/rules/000005.ldb new file mode 100644 index 0000000..b4e6a9a Binary files /dev/null and b/packs/rules/000005.ldb differ diff --git a/packs/rules/000006.log b/packs/rules/000006.log new file mode 100644 index 0000000..e5ce67c Binary files /dev/null and b/packs/rules/000006.log differ diff --git a/packs/rules/CURRENT b/packs/rules/CURRENT index 1a84852..cacca75 100644 --- a/packs/rules/CURRENT +++ b/packs/rules/CURRENT @@ -1 +1 @@ -MANIFEST-000002 +MANIFEST-000004 diff --git a/packs/rules/MANIFEST-000002 b/packs/rules/MANIFEST-000002 deleted file mode 100644 index bbbc585..0000000 Binary files a/packs/rules/MANIFEST-000002 and /dev/null differ diff --git a/packs/rules/MANIFEST-000004 b/packs/rules/MANIFEST-000004 new file mode 100644 index 0000000..bbb24de Binary files /dev/null and b/packs/rules/MANIFEST-000004 differ diff --git a/packs/skills/000003.log b/packs/skills/000003.log deleted file mode 100644 index d985ef5..0000000 Binary files a/packs/skills/000003.log and /dev/null differ diff --git a/packs/skills/000005.ldb b/packs/skills/000005.ldb new file mode 100644 index 0000000..2ac258b Binary files /dev/null and b/packs/skills/000005.ldb differ diff --git a/packs/skills/000006.log b/packs/skills/000006.log new file mode 100644 index 0000000..3318040 Binary files /dev/null and b/packs/skills/000006.log differ diff --git a/packs/skills/CURRENT b/packs/skills/CURRENT index 1a84852..cacca75 100644 --- a/packs/skills/CURRENT +++ b/packs/skills/CURRENT @@ -1 +1 @@ -MANIFEST-000002 +MANIFEST-000004 diff --git a/packs/skills/MANIFEST-000002 b/packs/skills/MANIFEST-000002 deleted file mode 100644 index bbbc585..0000000 Binary files a/packs/skills/MANIFEST-000002 and /dev/null differ diff --git a/packs/skills/MANIFEST-000004 b/packs/skills/MANIFEST-000004 new file mode 100644 index 0000000..39883ac Binary files /dev/null and b/packs/skills/MANIFEST-000004 differ diff --git a/packs/slice/000003.log b/packs/slice/000003.log deleted file mode 100644 index 39926e8..0000000 Binary files a/packs/slice/000003.log and /dev/null differ diff --git a/packs/slice/000005.ldb b/packs/slice/000005.ldb new file mode 100644 index 0000000..ac4df01 Binary files /dev/null and b/packs/slice/000005.ldb differ diff --git a/packs/slice/000006.log b/packs/slice/000006.log new file mode 100644 index 0000000..c25ac75 Binary files /dev/null and b/packs/slice/000006.log differ diff --git a/packs/slice/CURRENT b/packs/slice/CURRENT index 1a84852..cacca75 100644 --- a/packs/slice/CURRENT +++ b/packs/slice/CURRENT @@ -1 +1 @@ -MANIFEST-000002 +MANIFEST-000004 diff --git a/packs/slice/MANIFEST-000002 b/packs/slice/MANIFEST-000002 deleted file mode 100644 index bbbc585..0000000 Binary files a/packs/slice/MANIFEST-000002 and /dev/null differ diff --git a/packs/slice/MANIFEST-000004 b/packs/slice/MANIFEST-000004 new file mode 100644 index 0000000..0966a50 Binary files /dev/null and b/packs/slice/MANIFEST-000004 differ diff --git a/packs/starter/000003.log b/packs/starter/000003.log deleted file mode 100644 index df928ff..0000000 Binary files a/packs/starter/000003.log and /dev/null differ diff --git a/packs/starter/000005.ldb b/packs/starter/000005.ldb new file mode 100644 index 0000000..368bf7e Binary files /dev/null and b/packs/starter/000005.ldb differ diff --git a/packs/starter/000006.log b/packs/starter/000006.log new file mode 100644 index 0000000..a884f4d Binary files /dev/null and b/packs/starter/000006.log differ diff --git a/packs/starter/CURRENT b/packs/starter/CURRENT index 1a84852..cacca75 100644 --- a/packs/starter/CURRENT +++ b/packs/starter/CURRENT @@ -1 +1 @@ -MANIFEST-000002 +MANIFEST-000004 diff --git a/packs/starter/MANIFEST-000002 b/packs/starter/MANIFEST-000002 deleted file mode 100644 index bbbc585..0000000 Binary files a/packs/starter/MANIFEST-000002 and /dev/null differ diff --git a/packs/starter/MANIFEST-000004 b/packs/starter/MANIFEST-000004 new file mode 100644 index 0000000..5cdb872 Binary files /dev/null and b/packs/starter/MANIFEST-000004 differ diff --git a/packs/tables/000003.log b/packs/tables/000003.log deleted file mode 100644 index f125b7d..0000000 Binary files a/packs/tables/000003.log and /dev/null differ diff --git a/packs/tables/000005.ldb b/packs/tables/000005.ldb new file mode 100644 index 0000000..64baa1c Binary files /dev/null and b/packs/tables/000005.ldb differ diff --git a/packs/tables/000006.log b/packs/tables/000006.log new file mode 100644 index 0000000..d5e06f3 Binary files /dev/null and b/packs/tables/000006.log differ diff --git a/packs/tables/CURRENT b/packs/tables/CURRENT index 1a84852..cacca75 100644 --- a/packs/tables/CURRENT +++ b/packs/tables/CURRENT @@ -1 +1 @@ -MANIFEST-000002 +MANIFEST-000004 diff --git a/packs/tables/MANIFEST-000002 b/packs/tables/MANIFEST-000002 deleted file mode 100644 index bbbc585..0000000 Binary files a/packs/tables/MANIFEST-000002 and /dev/null differ diff --git a/packs/tables/MANIFEST-000004 b/packs/tables/MANIFEST-000004 new file mode 100644 index 0000000..004ff30 Binary files /dev/null and b/packs/tables/MANIFEST-000004 differ diff --git a/packs/talents/000003.log b/packs/talents/000003.log deleted file mode 100644 index 6257c26..0000000 Binary files a/packs/talents/000003.log and /dev/null differ diff --git a/packs/talents/000005.ldb b/packs/talents/000005.ldb new file mode 100644 index 0000000..4ac65dd Binary files /dev/null and b/packs/talents/000005.ldb differ diff --git a/packs/talents/000006.log b/packs/talents/000006.log new file mode 100644 index 0000000..b484ea0 Binary files /dev/null and b/packs/talents/000006.log differ diff --git a/packs/talents/CURRENT b/packs/talents/CURRENT index 1a84852..cacca75 100644 --- a/packs/talents/CURRENT +++ b/packs/talents/CURRENT @@ -1 +1 @@ -MANIFEST-000002 +MANIFEST-000004 diff --git a/packs/talents/MANIFEST-000002 b/packs/talents/MANIFEST-000002 deleted file mode 100644 index bbbc585..0000000 Binary files a/packs/talents/MANIFEST-000002 and /dev/null differ diff --git a/packs/talents/MANIFEST-000004 b/packs/talents/MANIFEST-000004 new file mode 100644 index 0000000..4c77b74 Binary files /dev/null and b/packs/talents/MANIFEST-000004 differ diff --git a/packs/throughtrain/000003.log b/packs/throughtrain/000003.log deleted file mode 100644 index 868c3dd..0000000 Binary files a/packs/throughtrain/000003.log and /dev/null differ diff --git a/packs/throughtrain/000005.ldb b/packs/throughtrain/000005.ldb new file mode 100644 index 0000000..72544b1 Binary files /dev/null and b/packs/throughtrain/000005.ldb differ diff --git a/packs/throughtrain/000006.log b/packs/throughtrain/000006.log new file mode 100644 index 0000000..643165a Binary files /dev/null and b/packs/throughtrain/000006.log differ diff --git a/packs/throughtrain/CURRENT b/packs/throughtrain/CURRENT index 1a84852..cacca75 100644 --- a/packs/throughtrain/CURRENT +++ b/packs/throughtrain/CURRENT @@ -1 +1 @@ -MANIFEST-000002 +MANIFEST-000004 diff --git a/packs/throughtrain/MANIFEST-000002 b/packs/throughtrain/MANIFEST-000002 deleted file mode 100644 index bbbc585..0000000 Binary files a/packs/throughtrain/MANIFEST-000002 and /dev/null differ diff --git a/packs/throughtrain/MANIFEST-000004 b/packs/throughtrain/MANIFEST-000004 new file mode 100644 index 0000000..923360d Binary files /dev/null and b/packs/throughtrain/MANIFEST-000004 differ diff --git a/packs/vehicles/000003.log b/packs/vehicles/000003.log deleted file mode 100644 index 9950ce5..0000000 Binary files a/packs/vehicles/000003.log and /dev/null differ diff --git a/packs/vehicles/000005.ldb b/packs/vehicles/000005.ldb new file mode 100644 index 0000000..f6b2cd4 Binary files /dev/null and b/packs/vehicles/000005.ldb differ diff --git a/packs/vehicles/000006.log b/packs/vehicles/000006.log new file mode 100644 index 0000000..47800e2 Binary files /dev/null and b/packs/vehicles/000006.log differ diff --git a/packs/vehicles/CURRENT b/packs/vehicles/CURRENT index 1a84852..cacca75 100644 --- a/packs/vehicles/CURRENT +++ b/packs/vehicles/CURRENT @@ -1 +1 @@ -MANIFEST-000002 +MANIFEST-000004 diff --git a/packs/vehicles/MANIFEST-000002 b/packs/vehicles/MANIFEST-000002 deleted file mode 100644 index bbbc585..0000000 Binary files a/packs/vehicles/MANIFEST-000002 and /dev/null differ diff --git a/packs/vehicles/MANIFEST-000004 b/packs/vehicles/MANIFEST-000004 new file mode 100644 index 0000000..d4d73b7 Binary files /dev/null and b/packs/vehicles/MANIFEST-000004 differ diff --git a/packs/weapons/000003.log b/packs/weapons/000003.log deleted file mode 100644 index e20483e..0000000 Binary files a/packs/weapons/000003.log and /dev/null differ diff --git a/packs/weapons/000005.ldb b/packs/weapons/000005.ldb new file mode 100644 index 0000000..cb5fdfb Binary files /dev/null and b/packs/weapons/000005.ldb differ diff --git a/packs/weapons/000006.log b/packs/weapons/000006.log new file mode 100644 index 0000000..a7be3fe Binary files /dev/null and b/packs/weapons/000006.log differ diff --git a/packs/weapons/CURRENT b/packs/weapons/CURRENT index 1a84852..cacca75 100644 --- a/packs/weapons/CURRENT +++ b/packs/weapons/CURRENT @@ -1 +1 @@ -MANIFEST-000002 +MANIFEST-000004 diff --git a/packs/weapons/MANIFEST-000002 b/packs/weapons/MANIFEST-000002 deleted file mode 100644 index bbbc585..0000000 Binary files a/packs/weapons/MANIFEST-000002 and /dev/null differ diff --git a/packs/weapons/MANIFEST-000004 b/packs/weapons/MANIFEST-000004 new file mode 100644 index 0000000..6a582af Binary files /dev/null and b/packs/weapons/MANIFEST-000004 differ diff --git a/ringbrp.mjs b/ringbrp.mjs index dfdcb42..1bd1d9b 100644 --- a/ringbrp.mjs +++ b/ringbrp.mjs @@ -25,7 +25,7 @@ import { reactionLoadFrom, reactionPrintedFrom, woundEffectsFor, BLEED, bleedStoppedBy, bleedRateFor, locationEffectsFor, locationFor, resolveLocationHit, locationsFor, woundPenaltyFrom, remapLocationDamage, - groundedPlanFor, + groundedPlanFor, naturalArmourOn, locationDamageReplacement, encumbrancePenaltyFor, ENCUMBERED_CATEGORIES, freeCarryFor, defencePenaltyFor, defenceTypeAllowed, DEFENCE_STEP, @@ -618,7 +618,8 @@ class RingBRPActor extends Actor { ranged: `${loc.ranged[0]}${loc.ranged[1] > loc.ranged[0] ? `-${loc.ranged[1]}` : ""}`, max, taken: t, remaining: Math.max(0, max - t), // The body's own armour here, plus every worn piece that reaches this kind. - armour: locationArmourFor((Number(loc.armour) || 0) + naturalArmour, + // Hide stops at the edge of a wing; worn barding does not. + armour: locationArmourFor((Number(loc.armour) || 0) + naturalArmourOn(loc, naturalArmour), wornArmour, loc.kind), armourFrom: wornArmour.filter(p => armourCoversKind(p.coverage, loc.kind)) .map(p => ({ name: p.name, points: p.points })), @@ -1109,7 +1110,8 @@ export async function hitLocationRoll({ target, damage, mode = "ranged", // torso's armour a second time on every limb now that coverage exists. const locArmour = live ? Number(live.armour) || 0 - : locationArmourFor((Number(loc.armour) || 0) + (Number(sys.naturalArmour?.value) || 0), + : locationArmourFor((Number(loc.armour) || 0) + + naturalArmourOn(loc, sys.naturalArmour?.value), sys.wornArmour ?? [], loc.kind); effective = Math.max(0, effective - armourAgainst(level, locArmour)); } diff --git a/rules.mjs b/rules.mjs index 8a4497f..79a2431 100644 --- a/rules.mjs +++ b/rules.mjs @@ -583,6 +583,24 @@ export function groundedPlanFor(speciesId = "baseline") { return (LOCATION_TABLES[speciesId] ?? {}).grounded ?? ""; } +/** + * How much of a creature's own hide reaches a given location. + * + * Natural armour used to be added to every location without exception, which put the + * supporter's six points of heraldic hide on its wing membrane. Measured over 20,000 + * fights, that was the whole reason its written rule never fired: a wing needed eight + * points past armour six before it would fold, so the beast was grounded in 9% of + * fights and its own tactics — "disable either wing and it is on the ground for the + * rest of the scene" — described something almost nobody ever saw. + * + * Hide does not grow on membrane. A location marked `bare` carries only what it is + * wearing. WORN armour still covers it, so barding a wing works exactly as before; + * it is the animal's own hide that stops at the edge of the wing. + */ +export function naturalArmourOn(location, naturalArmour = 0) { + return location?.bare ? 0 : (Number(naturalArmour) || 0); +} + /** Every location a species has — what a combatant has to keep a tally for. */ export function locationsFor(speciesId = "baseline") { return (LOCATION_TABLES[speciesId] ?? LOCATION_TABLES.baseline).locations; diff --git a/system.json b/system.json index 4b51f79..a5252ac 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.7.3", + "version": "1.7.4", "compatibility": { "minimum": 13, "verified": "14.364" diff --git a/tools/check-anatomy.mjs b/tools/check-anatomy.mjs index e5058fc..5b9afb6 100644 --- a/tools/check-anatomy.mjs +++ b/tools/check-anatomy.mjs @@ -29,7 +29,8 @@ import { join, dirname } from "node:path"; import { fileURLToPath } from "node:url"; import { LOCATION_TABLES, BODY_ART } from "../anatomy.mjs"; import { locationEffectsFor, destructionOutcomeFor, remapLocationDamage, - locationDamageReplacement, locationMaxHp, groundedPlanFor } from "../rules.mjs"; + locationDamageReplacement, locationMaxHp, groundedPlanFor, + naturalArmourOn } from "../rules.mjs"; const ROOT = join(dirname(fileURLToPath(import.meta.url)), ".."); const problems = []; @@ -222,6 +223,22 @@ for (const [id, table] of Object.entries(LOCATION_TABLES)) { if (groundedPlanFor(landing)) { problems.push(`${id}: grounded plan "${landing}" is itself a flyer — landing must end`); } + // The trigger has to be REACHABLE. This is the defect that started all of this: the + // supporter's wings sat under the same six points of hide as the rest of it, so the + // eight damage needed to fold one almost never arrived and its written rule fired in + // 9% of fights. A plan whose whole behaviour turns on losing a wing must not armour + // that wing with the creature's own hide. + for (const l of table.locations) { + if (l.kind === "wing" && !l.bare) { + problems.push(`${id}.${l.id}: a flyer's wing carries the creature's hide, so the ` + + `grounded rule needs it beaten through full natural armour — mark it bare or ` + + `the rule is decoration`); + } + if (l.bare && naturalArmourOn(l, 9) !== 0) { + problems.push(`${id}.${l.id}: marked bare but still takes natural armour`); + } + } + // every wound it could be carrying, wings excluded, must survive the drop const src = {}; for (const l of table.locations) if (l.kind !== "wing") src[l.id] = locationMaxHp(16, l.frac); diff --git a/tools/check-rules.mjs b/tools/check-rules.mjs index 67911de..7567249 100644 --- a/tools/check-rules.mjs +++ b/tools/check-rules.mjs @@ -537,6 +537,17 @@ const checks = [ ["groundedPlanFor(quadruped) is nothing", RULES.groundedPlanFor("quadruped"), ""], ["groundedPlanFor(baseline) is nothing", RULES.groundedPlanFor("baseline"), ""], ["groundedPlanFor(unknown) is nothing", RULES.groundedPlanFor("nonesuch"), ""], + // Hide does not grow on membrane: a bare location carries only what it is wearing. + ["naturalArmourOn(a hide location) is the full hide", + RULES.naturalArmourOn({ kind: "vital" }, 7), 7], + ["naturalArmourOn(a bare wing) is nothing", + RULES.naturalArmourOn({ kind: "wing", bare: true }, 7), 0], + // Only an explicit `bare` strips the hide. Anything unmarked — or missing — keeps it, + // so a location this rule has never heard of fails toward armoured, not toward naked. + ["naturalArmourOn(an unmarked location) keeps the hide", + RULES.naturalArmourOn({ kind: "wing" }, 7), 7], + ["naturalArmourOn(no location at all) keeps the hide", + RULES.naturalArmourOn(null, 7), 7], // 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 this is where a wound // was silently thrown away instead of carried. diff --git a/tools/content.mjs b/tools/content.mjs index b548ab9..7a51cfd 100644 --- a/tools/content.mjs +++ b/tools/content.mjs @@ -809,8 +809,13 @@ export const NPCS = [ tactics: "It does not leave the ground it was put in and it does not sleep. Inside its ground it cannot be surprised and does not need to roll to notice anything. POWER: THE GROUND IS MINE. Any agent who digs, opens, or removes something from its ground takes 1d6 with no roll to avoid and no armour, every round they continue. It has no interest in anybody who leaves." }, { key: "supporter", name: "The supporter", role: "FOLKLORE. The winged beast off a borough coat of arms, come down off it", - chosenStyle: "reflex", naturalArmour: 6, species: "baseline", bodyPlan: "winged", - ch: { str: 26, siz: 24, con: 20, int: 8, pow: 17, dex: 12, cha: 14, edu: 2 }, + chosenStyle: "reflex", naturalArmour: 7, species: "baseline", bodyPlan: "winged", + // Six hundred years of being drawn accurately makes a thing hard to kill, so the + // hide goes up and the constitution with it; the wings are `bare` in anatomy.mjs + // and carry none of it. Measured: grounding it goes from 9% of fights to 67%, the + // borough-ground fight stays a losing one (22%), and the fight off borough ground + // keeps its teeth at 84% with a 17% wipe. See docs/REVIEW_LOG.md. + ch: { str: 26, siz: 24, con: 36, int: 8, pow: 17, dex: 12, cha: 14, edu: 2 }, skills: [{fam:"brawl",spec:"",val:75},{fam:"dodge",spec:"",val:35},{fam:"spot",spec:"",val:70}, {fam:"athletics",spec:"",val:70},{fam:"insight",spec:"",val:45},{fam:"track",spec:"",val:55}], weapons: ["grasp"], diff --git a/tools/lethality-baseline.json b/tools/lethality-baseline.json index b2bf77a..69bd779 100644 --- a/tools/lethality-baseline.json +++ b/tools/lethality-baseline.json @@ -26,7 +26,7 @@ }, "cleaner_marksman": { "wipe": 0, - "down": 0.07, + "down": 0.06, "rounds": 2 }, "revenant": { @@ -36,7 +36,7 @@ }, "duplicate": { "wipe": 0, - "down": 0.05, + "down": 0.04, "rounds": 2 }, "barghest": { @@ -46,12 +46,12 @@ }, "kelpie": { "wipe": 0, - "down": 0.23, + "down": 0.21, "rounds": 3 }, "redcap": { - "wipe": 1, - "down": 0.34, + "wipe": 0, + "down": 0.3, "rounds": 3 }, "boggart": { @@ -61,9 +61,14 @@ }, "churchgrim": { "wipe": 0, - "down": 0.25, + "down": 0.26, "rounds": 4 }, + "supporter": { + "wipe": 47, + "down": 2.82, + "rounds": 15 + }, "hollow_man": { "wipe": 0, "down": 0, @@ -81,8 +86,8 @@ }, "precedent": { "wipe": 0, - "down": 0.17, - "rounds": 3 + "down": 0.16, + "rounds": 4 }, "carrion_file": { "wipe": 0, @@ -95,28 +100,28 @@ "rounds": 2 }, "surveyor": { - "wipe": 7, - "down": 1.33, + "wipe": 8, + "down": 1.4, "rounds": 11 }, "quarantine_unit": { - "wipe": 85.5, - "down": 3.69, + "wipe": 84.5, + "down": 3.64, "rounds": 8 }, "cuckoo_array": { "wipe": 1, - "down": 0.76, + "down": 0.81, "rounds": 8 }, "long_walker": { - "wipe": 68, - "down": 3.33, - "rounds": 15 + "wipe": 66.5, + "down": 3.35, + "rounds": 16 }, "auditor": { "wipe": 0, - "down": 0.1, + "down": 0.12, "rounds": 3 }, "washer_ford": { @@ -127,7 +132,7 @@ "lantern_man": { "wipe": 0, "down": 0, - "rounds": 2 + "rounds": 1 }, "grindylow": { "wipe": 0, @@ -141,12 +146,12 @@ }, "spriggan": { "wipe": 0, - "down": 0.3, + "down": 0.33, "rounds": 4 }, "nuckelavee": { - "wipe": 16.5, - "down": 1.68, + "wipe": 15.5, + "down": 1.75, "rounds": 7 }, "hedley_kow": { @@ -155,8 +160,8 @@ "rounds": 2 }, "apple_man": { - "wipe": 2.5, - "down": 1.1, + "wipe": 1.5, + "down": 1.02, "rounds": 12 }, "the_committee": { @@ -171,12 +176,12 @@ }, "the_locum": { "wipe": 0, - "down": 0.06, + "down": 0.04, "rounds": 2 }, "lost_property": { - "wipe": 1.5, - "down": 0.75, + "wipe": 0.5, + "down": 0.79, "rounds": 8 }, "the_minutes": { @@ -186,13 +191,13 @@ }, "waiting_room": { "wipe": 0, - "down": 0.17, + "down": 0.18, "rounds": 6 }, "the_predecessor": { "wipe": 0, "down": 0.09, - "rounds": 3 + "rounds": 2 }, "switchboard": { "wipe": 0, @@ -201,27 +206,27 @@ }, "the_census": { "wipe": 0, - "down": 0.14, + "down": 0.17, "rounds": 4 }, "the_courier": { - "wipe": 6, - "down": 1.37, + "wipe": 3.5, + "down": 1.3, "rounds": 9 }, "the_relay": { "wipe": 0.5, - "down": 0.69, - "rounds": 11 + "down": 0.67, + "rounds": 10 }, "the_stanchion": { - "wipe": 26, - "down": 2.25, - "rounds": 19 + "wipe": 28, + "down": 2.27, + "rounds": 18 }, "the_yield": { - "wipe": 1, - "down": 0.78, + "wipe": 0.5, + "down": 0.76, "rounds": 6 }, "the_overwriter": { @@ -230,13 +235,13 @@ "rounds": 6 }, "the_arrears": { - "wipe": 7.5, - "down": 1.58, + "wipe": 9.5, + "down": 1.53, "rounds": 10 }, "the_margin": { "wipe": 0, - "down": 0.03, + "down": 0.02, "rounds": 3 } }