diff --git a/docs/REVIEW_LOG.md b/docs/REVIEW_LOG.md index e32ddac..c343fbb 100644 --- a/docs/REVIEW_LOG.md +++ b/docs/REVIEW_LOG.md @@ -4521,3 +4521,52 @@ on the first attempt and landed on the second, staunched the bleeding, healed 3, `reviveIfHealed` took Plated out of the dying state without being asked. My harness then called `tickDying` on a revived character and read `.state` off the null it correctly returned — the rule was right and the probe was wrong. + +## Shields — armour with a switch + +A shield is the one piece of armour you *hold*, and it protects you exactly as much as +you are currently holding it up. Everything interesting follows from that switch +having a cost, so the design is: raised it is armour and a defence, lowered it is +weight, and the price of keeping it up is that it occupies a hand and you are shooting +around it. + +* **Raised** — its points apply to what it covers, and it is the only armour you can + also defend with, on a new **Shield** skill. +* **Lowered** — nothing. Verified: heater shield slung reads 0 on every location, + raised reads 4 on torso and both arms and 0 on legs and head. +* **The cost** — −20% to your own ranged attacks while it is up, printed on + the card as plainly as anything else: *"Heater shield −20%"*. That is what stops + "always raised" being the only answer; it is obviously right for a containment + officer and obviously wrong for a marksman. +* **Only one goes up.** Raising a second lowers the first. Two shields is not a stance. + +Seven of them, from a 2-point buckler to a 6-point ballistic shield, with the pavise +and the barrier plate covering legs as well because they are walls you carry. + +**`degradation` finally does something.** It has been on every armour item since the +packs were first built and was read by nothing. Shields wear: a blow costs the shield a +point for every step the attack stood above an ordinary success, so an ordinary hit +costs it nothing, a special costs 1 and a critical costs 2. At its limit it comes apart +— no points, nothing to parry with, and it drops out of your hand and refuses to be +raised again. + +### Two defects found by testing it rather than reading it + +**R-244. Every shield defence quietly rolled Dodge.** I added `"shield"` as a third +defence type and passed it through `defenceTypeAllowed`, which returned it unchanged — +so `kind` was `"shield"`, neither of the `kind === "parry"` branches matched, and the +function fell through to the dodge branch. It was invisible in the chat card and only +showed up as a statistical smell: eight rolls at a supposed 85% produced six failures. +Taking a blow on the shield **is** a parry — it locks with parries and is not a dodge — +so the shield is a flag on a parry rather than a type of its own. + +**R-245. The wear rule was unreachable.** I first wrote it to fire only when the shield +turned a blow aside *completely*. But under graded defences only a critical fully stops +a critical, so a shield would have gone its entire service life without a scratch. Wear +is for what the shield **absorbed**: a shield that drags a critical down to a special +has very much taken that blow, and that is exactly when shields splinter. Ten forced +criticals produced zero wear under the first rule; under the corrected one the shield +went 0 → 2 → 4 → broken in three absorbed blows. + +Both were mine, both were introduced in this change, and both were found by driving the +real functions rather than by reading the diff. diff --git a/icons/ballistic_shield.svg b/icons/ballistic_shield.svg new file mode 100644 index 0000000..b112d3e --- /dev/null +++ b/icons/ballistic_shield.svg @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/icons/barrier_field.svg b/icons/barrier_field.svg new file mode 100644 index 0000000..1e99a1a --- /dev/null +++ b/icons/barrier_field.svg @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/icons/buckler.svg b/icons/buckler.svg new file mode 100644 index 0000000..1fdd799 --- /dev/null +++ b/icons/buckler.svg @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/icons/heater.svg b/icons/heater.svg new file mode 100644 index 0000000..5d919fb --- /dev/null +++ b/icons/heater.svg @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/icons/pavise.svg b/icons/pavise.svg new file mode 100644 index 0000000..d3e954a --- /dev/null +++ b/icons/pavise.svg @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/icons/riot_shield.svg b/icons/riot_shield.svg new file mode 100644 index 0000000..86e06f2 --- /dev/null +++ b/icons/riot_shield.svg @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/icons/targe.svg b/icons/targe.svg new file mode 100644 index 0000000..cf67082 --- /dev/null +++ b/icons/targe.svg @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/lang/en.json b/lang/en.json index b694455..8cc9d88 100644 --- a/lang/en.json +++ b/lang/en.json @@ -893,5 +893,19 @@ "RINGBRP.Coverage.head": "head", "RINGBRP.Sheet.Unarmoured": "bare", "RINGBRP.Sheet.ByLocation": "by location", - "RINGBRP.Item.Coverage": "Covers" + "RINGBRP.Item.Coverage": "Covers", + "RINGBRP.Shield.Raised": "raised — {n} points where it covers", + "RINGBRP.Shield.InTheWay": "raised — you are shooting around it ({mod}%)", + "RINGBRP.Shield.Wear": "{name} takes the blow — {n}/{max}", + "RINGBRP.Shield.Broken": "{name} comes apart. {n}/{max} — it is firewood.", + "RINGBRP.Sheet.RaiseHint": "Raise or lower this shield. Raised it protects what it covers and you can defend with it; lowered it is weight.", + "RINGBRP.Sheet.ShieldUp": "raised", + "RINGBRP.Sheet.ShieldDown": "slung", + "RINGBRP.Sheet.ShieldBroken": "broken", + "RINGBRP.Sheet.ShieldHint": "Take the blow on the shield. It wears against anything better than an ordinary hit.", + "RINGBRP.Notify.ShieldBroken": "{name} is broken. It cannot be raised.", + "RINGBRP.Item.IsShield": "Is a shield", + "RINGBRP.Item.Raised": "Raised", + "RINGBRP.Item.Wear": "Wear", + "RINGBRP.Item.WearMax": "Breaks at" } diff --git a/packs/armour/000003.log b/packs/armour/000003.log new file mode 100644 index 0000000..9b6d27d Binary files /dev/null and b/packs/armour/000003.log differ diff --git a/packs/armour/000005.ldb b/packs/armour/000005.ldb deleted file mode 100644 index 35545db..0000000 Binary files a/packs/armour/000005.ldb and /dev/null differ diff --git a/packs/armour/000006.log b/packs/armour/000006.log deleted file mode 100644 index c6bd211..0000000 Binary files a/packs/armour/000006.log and /dev/null differ diff --git a/packs/armour/CURRENT b/packs/armour/CURRENT index cacca75..1a84852 100644 --- a/packs/armour/CURRENT +++ b/packs/armour/CURRENT @@ -1 +1 @@ -MANIFEST-000004 +MANIFEST-000002 diff --git a/packs/armour/LOG b/packs/armour/LOG index b6656cb..ff9cf85 100644 --- a/packs/armour/LOG +++ b/packs/armour/LOG @@ -1,5 +1 @@ -2026/08/11-10:31:15.815927 175f73000 Recovering log #3 -2026/08/11-10:31:15.816054 175f73000 Level-0 table #5: started -2026/08/11-10:31:15.816169 175f73000 Level-0 table #5: 3399 bytes OK -2026/08/11-10:31:15.816387 175f73000 Delete type=0 #3 -2026/08/11-10:31:15.816415 175f73000 Delete type=3 #2 +2026/08/11-18:22:31.919810 17373b000 Delete type=3 #1 diff --git a/packs/armour/LOG.old b/packs/armour/LOG.old deleted file mode 100644 index 10115e3..0000000 --- a/packs/armour/LOG.old +++ /dev/null @@ -1 +0,0 @@ -2026/08/11-10:29:47.321526 1714a3000 Delete type=3 #1 diff --git a/packs/armour/MANIFEST-000002 b/packs/armour/MANIFEST-000002 new file mode 100644 index 0000000..bbbc585 Binary files /dev/null and b/packs/armour/MANIFEST-000002 differ diff --git a/packs/armour/MANIFEST-000004 b/packs/armour/MANIFEST-000004 deleted file mode 100644 index 819d483..0000000 Binary files a/packs/armour/MANIFEST-000004 and /dev/null differ diff --git a/packs/expedition/000003.log b/packs/expedition/000003.log new file mode 100644 index 0000000..263295b Binary files /dev/null and b/packs/expedition/000003.log differ diff --git a/packs/expedition/000005.ldb b/packs/expedition/000005.ldb deleted file mode 100644 index 4ff460d..0000000 Binary files a/packs/expedition/000005.ldb and /dev/null differ diff --git a/packs/expedition/000006.log b/packs/expedition/000006.log deleted file mode 100644 index 268b187..0000000 Binary files a/packs/expedition/000006.log and /dev/null differ diff --git a/packs/expedition/CURRENT b/packs/expedition/CURRENT index cacca75..1a84852 100644 --- a/packs/expedition/CURRENT +++ b/packs/expedition/CURRENT @@ -1 +1 @@ -MANIFEST-000004 +MANIFEST-000002 diff --git a/packs/expedition/LOG b/packs/expedition/LOG index e2c93cc..0861364 100644 --- a/packs/expedition/LOG +++ b/packs/expedition/LOG @@ -1,5 +1 @@ -2026/08/11-10:31:15.827053 176f8b000 Recovering log #3 -2026/08/11-10:31:15.827202 176f8b000 Level-0 table #5: started -2026/08/11-10:31:15.827356 176f8b000 Level-0 table #5: 4129 bytes OK -2026/08/11-10:31:15.827638 176f8b000 Delete type=0 #3 -2026/08/11-10:31:15.827685 176f8b000 Delete type=3 #2 +2026/08/11-18:22:31.954955 173f47000 Delete type=3 #1 diff --git a/packs/expedition/LOG.old b/packs/expedition/LOG.old deleted file mode 100644 index 8713030..0000000 --- a/packs/expedition/LOG.old +++ /dev/null @@ -1 +0,0 @@ -2026/08/11-10:29:47.359914 170c97000 Delete type=3 #1 diff --git a/packs/expedition/MANIFEST-000002 b/packs/expedition/MANIFEST-000002 new file mode 100644 index 0000000..bbbc585 Binary files /dev/null and b/packs/expedition/MANIFEST-000002 differ diff --git a/packs/expedition/MANIFEST-000004 b/packs/expedition/MANIFEST-000004 deleted file mode 100644 index 47fbcd4..0000000 Binary files a/packs/expedition/MANIFEST-000004 and /dev/null differ diff --git a/packs/gear/000003.log b/packs/gear/000003.log new file mode 100644 index 0000000..629ba6d Binary files /dev/null and b/packs/gear/000003.log differ diff --git a/packs/gear/000005.ldb b/packs/gear/000005.ldb deleted file mode 100644 index d9bac03..0000000 Binary files a/packs/gear/000005.ldb and /dev/null differ diff --git a/packs/gear/000006.log b/packs/gear/000006.log deleted file mode 100644 index d1deb9b..0000000 Binary files a/packs/gear/000006.log and /dev/null differ diff --git a/packs/gear/CURRENT b/packs/gear/CURRENT index cacca75..1a84852 100644 --- a/packs/gear/CURRENT +++ b/packs/gear/CURRENT @@ -1 +1 @@ -MANIFEST-000004 +MANIFEST-000002 diff --git a/packs/gear/LOG b/packs/gear/LOG index 198b123..90a702f 100644 --- a/packs/gear/LOG +++ b/packs/gear/LOG @@ -1,5 +1 @@ -2026/08/11-10:31:15.817069 177797000 Recovering log #3 -2026/08/11-10:31:15.817858 177797000 Level-0 table #5: started -2026/08/11-10:31:15.818239 177797000 Level-0 table #5: 31614 bytes OK -2026/08/11-10:31:15.818545 177797000 Delete type=0 #3 -2026/08/11-10:31:15.818601 177797000 Delete type=3 #2 +2026/08/11-18:22:31.921916 172723000 Delete type=3 #1 diff --git a/packs/gear/LOG.old b/packs/gear/LOG.old deleted file mode 100644 index c8ab21b..0000000 --- a/packs/gear/LOG.old +++ /dev/null @@ -1 +0,0 @@ -2026/08/11-10:29:47.323743 171caf000 Delete type=3 #1 diff --git a/packs/gear/MANIFEST-000002 b/packs/gear/MANIFEST-000002 new file mode 100644 index 0000000..bbbc585 Binary files /dev/null and b/packs/gear/MANIFEST-000002 differ diff --git a/packs/gear/MANIFEST-000004 b/packs/gear/MANIFEST-000004 deleted file mode 100644 index f7cd73c..0000000 Binary files a/packs/gear/MANIFEST-000004 and /dev/null differ diff --git a/packs/npcs/000003.log b/packs/npcs/000003.log new file mode 100644 index 0000000..09b2bf6 Binary files /dev/null and b/packs/npcs/000003.log differ diff --git a/packs/npcs/000005.ldb b/packs/npcs/000005.ldb deleted file mode 100644 index ab23f79..0000000 Binary files a/packs/npcs/000005.ldb and /dev/null differ diff --git a/packs/npcs/000006.log b/packs/npcs/000006.log deleted file mode 100644 index ed99ff7..0000000 Binary files a/packs/npcs/000006.log and /dev/null differ diff --git a/packs/npcs/CURRENT b/packs/npcs/CURRENT index cacca75..1a84852 100644 --- a/packs/npcs/CURRENT +++ b/packs/npcs/CURRENT @@ -1 +1 @@ -MANIFEST-000004 +MANIFEST-000002 diff --git a/packs/npcs/LOG b/packs/npcs/LOG index a035e49..b32283b 100644 --- a/packs/npcs/LOG +++ b/packs/npcs/LOG @@ -1,5 +1 @@ -2026/08/11-10:31:15.803065 177797000 Recovering log #3 -2026/08/11-10:31:15.804714 177797000 Level-0 table #5: started -2026/08/11-10:31:15.806503 177797000 Level-0 table #5: 223539 bytes OK -2026/08/11-10:31:15.806843 177797000 Delete type=0 #3 -2026/08/11-10:31:15.806889 177797000 Delete type=3 #2 +2026/08/11-18:22:31.938436 172723000 Delete type=3 #1 diff --git a/packs/npcs/LOG.old b/packs/npcs/LOG.old deleted file mode 100644 index f263391..0000000 --- a/packs/npcs/LOG.old +++ /dev/null @@ -1 +0,0 @@ -2026/08/11-10:29:47.341619 170c97000 Delete type=3 #1 diff --git a/packs/npcs/MANIFEST-000002 b/packs/npcs/MANIFEST-000002 new file mode 100644 index 0000000..bbbc585 Binary files /dev/null and b/packs/npcs/MANIFEST-000002 differ diff --git a/packs/npcs/MANIFEST-000004 b/packs/npcs/MANIFEST-000004 deleted file mode 100644 index 9793e35..0000000 Binary files a/packs/npcs/MANIFEST-000004 and /dev/null differ diff --git a/packs/powers/000003.log b/packs/powers/000003.log new file mode 100644 index 0000000..d723043 Binary files /dev/null and b/packs/powers/000003.log differ diff --git a/packs/powers/000005.ldb b/packs/powers/000005.ldb deleted file mode 100644 index 7f540c6..0000000 Binary files a/packs/powers/000005.ldb and /dev/null differ diff --git a/packs/powers/000006.log b/packs/powers/000006.log deleted file mode 100644 index 43e306f..0000000 Binary files a/packs/powers/000006.log and /dev/null differ diff --git a/packs/powers/CURRENT b/packs/powers/CURRENT index cacca75..1a84852 100644 --- a/packs/powers/CURRENT +++ b/packs/powers/CURRENT @@ -1 +1 @@ -MANIFEST-000004 +MANIFEST-000002 diff --git a/packs/powers/LOG b/packs/powers/LOG index 44e2293..5b533e1 100644 --- a/packs/powers/LOG +++ b/packs/powers/LOG @@ -1,5 +1 @@ -2026/08/11-10:31:15.812365 175f73000 Recovering log #3 -2026/08/11-10:31:15.812699 175f73000 Level-0 table #5: started -2026/08/11-10:31:15.812860 175f73000 Level-0 table #5: 3295 bytes OK -2026/08/11-10:31:15.813123 175f73000 Delete type=0 #3 -2026/08/11-10:31:15.813163 175f73000 Delete type=3 #2 +2026/08/11-18:22:31.946701 172723000 Delete type=3 #1 diff --git a/packs/powers/LOG.old b/packs/powers/LOG.old deleted file mode 100644 index 9e996b0..0000000 --- a/packs/powers/LOG.old +++ /dev/null @@ -1 +0,0 @@ -2026/08/11-10:29:47.352685 170c97000 Delete type=3 #1 diff --git a/packs/powers/MANIFEST-000002 b/packs/powers/MANIFEST-000002 new file mode 100644 index 0000000..bbbc585 Binary files /dev/null and b/packs/powers/MANIFEST-000002 differ diff --git a/packs/powers/MANIFEST-000004 b/packs/powers/MANIFEST-000004 deleted file mode 100644 index 20de082..0000000 Binary files a/packs/powers/MANIFEST-000004 and /dev/null differ diff --git a/packs/pregens/000003.log b/packs/pregens/000003.log new file mode 100644 index 0000000..712264f Binary files /dev/null and b/packs/pregens/000003.log differ diff --git a/packs/pregens/000005.ldb b/packs/pregens/000005.ldb deleted file mode 100644 index 4f39ac7..0000000 Binary files a/packs/pregens/000005.ldb and /dev/null differ diff --git a/packs/pregens/000006.log b/packs/pregens/000006.log deleted file mode 100644 index 327442d..0000000 Binary files a/packs/pregens/000006.log and /dev/null differ diff --git a/packs/pregens/CURRENT b/packs/pregens/CURRENT index cacca75..1a84852 100644 --- a/packs/pregens/CURRENT +++ b/packs/pregens/CURRENT @@ -1 +1 @@ -MANIFEST-000004 +MANIFEST-000002 diff --git a/packs/pregens/LOG b/packs/pregens/LOG index 67b8b8a..8380368 100644 --- a/packs/pregens/LOG +++ b/packs/pregens/LOG @@ -1,5 +1 @@ -2026/08/11-10:31:15.799594 177797000 Recovering log #3 -2026/08/11-10:31:15.800464 177797000 Level-0 table #5: started -2026/08/11-10:31:15.800988 177797000 Level-0 table #5: 58133 bytes OK -2026/08/11-10:31:15.801383 177797000 Delete type=0 #3 -2026/08/11-10:31:15.801428 177797000 Delete type=3 #2 +2026/08/11-18:22:31.928648 172723000 Delete type=3 #1 diff --git a/packs/pregens/LOG.old b/packs/pregens/LOG.old deleted file mode 100644 index b460cd9..0000000 --- a/packs/pregens/LOG.old +++ /dev/null @@ -1 +0,0 @@ -2026/08/11-10:29:47.331121 1724bb000 Delete type=3 #1 diff --git a/packs/pregens/MANIFEST-000002 b/packs/pregens/MANIFEST-000002 new file mode 100644 index 0000000..bbbc585 Binary files /dev/null and b/packs/pregens/MANIFEST-000002 differ diff --git a/packs/pregens/MANIFEST-000004 b/packs/pregens/MANIFEST-000004 deleted file mode 100644 index ca194a0..0000000 Binary files a/packs/pregens/MANIFEST-000004 and /dev/null differ diff --git a/packs/rules/000003.log b/packs/rules/000003.log new file mode 100644 index 0000000..916d086 Binary files /dev/null and b/packs/rules/000003.log differ diff --git a/packs/rules/000005.ldb b/packs/rules/000005.ldb deleted file mode 100644 index 1147e24..0000000 Binary files a/packs/rules/000005.ldb and /dev/null differ diff --git a/packs/rules/000006.log b/packs/rules/000006.log deleted file mode 100644 index 5e876ff..0000000 Binary files a/packs/rules/000006.log and /dev/null differ diff --git a/packs/rules/CURRENT b/packs/rules/CURRENT index cacca75..1a84852 100644 --- a/packs/rules/CURRENT +++ b/packs/rules/CURRENT @@ -1 +1 @@ -MANIFEST-000004 +MANIFEST-000002 diff --git a/packs/rules/LOG b/packs/rules/LOG index 6dd2eaa..2e749bc 100644 --- a/packs/rules/LOG +++ b/packs/rules/LOG @@ -1,5 +1 @@ -2026/08/11-10:31:15.822560 176f8b000 Recovering log #3 -2026/08/11-10:31:15.823036 176f8b000 Level-0 table #5: started -2026/08/11-10:31:15.823351 176f8b000 Level-0 table #5: 30975 bytes OK -2026/08/11-10:31:15.823593 176f8b000 Delete type=0 #3 -2026/08/11-10:31:15.823625 176f8b000 Delete type=3 #2 +2026/08/11-18:22:31.951456 172f2f000 Delete type=3 #1 diff --git a/packs/rules/LOG.old b/packs/rules/LOG.old deleted file mode 100644 index 11bb770..0000000 --- a/packs/rules/LOG.old +++ /dev/null @@ -1 +0,0 @@ -2026/08/11-10:29:47.357907 170c97000 Delete type=3 #1 diff --git a/packs/rules/MANIFEST-000002 b/packs/rules/MANIFEST-000002 new file mode 100644 index 0000000..bbbc585 Binary files /dev/null and b/packs/rules/MANIFEST-000002 differ diff --git a/packs/rules/MANIFEST-000004 b/packs/rules/MANIFEST-000004 deleted file mode 100644 index e2e1bf1..0000000 Binary files a/packs/rules/MANIFEST-000004 and /dev/null differ diff --git a/packs/skills/000003.log b/packs/skills/000003.log new file mode 100644 index 0000000..2a55440 Binary files /dev/null and b/packs/skills/000003.log differ diff --git a/packs/skills/000005.ldb b/packs/skills/000005.ldb deleted file mode 100644 index d613d26..0000000 Binary files a/packs/skills/000005.ldb and /dev/null differ diff --git a/packs/skills/000006.log b/packs/skills/000006.log deleted file mode 100644 index aa7dd7d..0000000 Binary files a/packs/skills/000006.log and /dev/null differ diff --git a/packs/skills/CURRENT b/packs/skills/CURRENT index cacca75..1a84852 100644 --- a/packs/skills/CURRENT +++ b/packs/skills/CURRENT @@ -1 +1 @@ -MANIFEST-000004 +MANIFEST-000002 diff --git a/packs/skills/LOG b/packs/skills/LOG index 4ecde2e..221a782 100644 --- a/packs/skills/LOG +++ b/packs/skills/LOG @@ -1,5 +1 @@ -2026/08/11-10:31:15.809540 175f73000 Recovering log #3 -2026/08/11-10:31:15.809752 175f73000 Level-0 table #5: started -2026/08/11-10:31:15.809950 175f73000 Level-0 table #5: 7486 bytes OK -2026/08/11-10:31:15.810216 175f73000 Delete type=0 #3 -2026/08/11-10:31:15.810251 175f73000 Delete type=3 #2 +2026/08/11-18:22:31.912459 172f2f000 Delete type=3 #1 diff --git a/packs/skills/LOG.old b/packs/skills/LOG.old deleted file mode 100644 index c4bf034..0000000 --- a/packs/skills/LOG.old +++ /dev/null @@ -1 +0,0 @@ -2026/08/11-10:29:47.314145 1724bb000 Delete type=3 #1 diff --git a/packs/skills/MANIFEST-000002 b/packs/skills/MANIFEST-000002 new file mode 100644 index 0000000..bbbc585 Binary files /dev/null and b/packs/skills/MANIFEST-000002 differ diff --git a/packs/skills/MANIFEST-000004 b/packs/skills/MANIFEST-000004 deleted file mode 100644 index 792e8a1..0000000 Binary files a/packs/skills/MANIFEST-000004 and /dev/null differ diff --git a/packs/slice/000003.log b/packs/slice/000003.log new file mode 100644 index 0000000..4a86fe9 Binary files /dev/null and b/packs/slice/000003.log differ diff --git a/packs/slice/000005.ldb b/packs/slice/000005.ldb deleted file mode 100644 index 4851c77..0000000 Binary files a/packs/slice/000005.ldb and /dev/null differ diff --git a/packs/slice/000006.log b/packs/slice/000006.log deleted file mode 100644 index c7d9b16..0000000 Binary files a/packs/slice/000006.log and /dev/null differ diff --git a/packs/slice/CURRENT b/packs/slice/CURRENT index cacca75..1a84852 100644 --- a/packs/slice/CURRENT +++ b/packs/slice/CURRENT @@ -1 +1 @@ -MANIFEST-000004 +MANIFEST-000002 diff --git a/packs/slice/LOG b/packs/slice/LOG index be57eab..8638976 100644 --- a/packs/slice/LOG +++ b/packs/slice/LOG @@ -1,5 +1 @@ -2026/08/11-10:31:15.824364 17677f000 Recovering log #3 -2026/08/11-10:31:15.824536 17677f000 Level-0 table #5: started -2026/08/11-10:31:15.824835 17677f000 Level-0 table #5: 16892 bytes OK -2026/08/11-10:31:15.825060 17677f000 Delete type=0 #3 -2026/08/11-10:31:15.825097 17677f000 Delete type=3 #2 +2026/08/11-18:22:31.945043 17373b000 Delete type=3 #1 diff --git a/packs/slice/LOG.old b/packs/slice/LOG.old deleted file mode 100644 index 3be9995..0000000 --- a/packs/slice/LOG.old +++ /dev/null @@ -1 +0,0 @@ -2026/08/11-10:29:47.350616 1714a3000 Delete type=3 #1 diff --git a/packs/slice/MANIFEST-000002 b/packs/slice/MANIFEST-000002 new file mode 100644 index 0000000..bbbc585 Binary files /dev/null and b/packs/slice/MANIFEST-000002 differ diff --git a/packs/slice/MANIFEST-000004 b/packs/slice/MANIFEST-000004 deleted file mode 100644 index 0552c3a..0000000 Binary files a/packs/slice/MANIFEST-000004 and /dev/null differ diff --git a/packs/tables/000003.log b/packs/tables/000003.log new file mode 100644 index 0000000..f125b7d Binary files /dev/null and b/packs/tables/000003.log differ diff --git a/packs/tables/000005.ldb b/packs/tables/000005.ldb deleted file mode 100644 index 64baa1c..0000000 Binary files a/packs/tables/000005.ldb and /dev/null differ diff --git a/packs/tables/000006.log b/packs/tables/000006.log deleted file mode 100644 index d5e06f3..0000000 Binary files a/packs/tables/000006.log and /dev/null differ diff --git a/packs/tables/CURRENT b/packs/tables/CURRENT index cacca75..1a84852 100644 --- a/packs/tables/CURRENT +++ b/packs/tables/CURRENT @@ -1 +1 @@ -MANIFEST-000004 +MANIFEST-000002 diff --git a/packs/tables/LOG b/packs/tables/LOG index f29fd17..6590e5d 100644 --- a/packs/tables/LOG +++ b/packs/tables/LOG @@ -1,5 +1 @@ -2026/08/11-10:31:15.825859 175f73000 Recovering log #3 -2026/08/11-10:31:15.825973 175f73000 Level-0 table #5: started -2026/08/11-10:31:15.826082 175f73000 Level-0 table #5: 3739 bytes OK -2026/08/11-10:31:15.826284 175f73000 Delete type=0 #3 -2026/08/11-10:31:15.826314 175f73000 Delete type=3 #2 +2026/08/11-18:22:31.943087 17373b000 Delete type=3 #1 diff --git a/packs/tables/LOG.old b/packs/tables/LOG.old deleted file mode 100644 index f1ac225..0000000 --- a/packs/tables/LOG.old +++ /dev/null @@ -1 +0,0 @@ -2026/08/11-10:29:47.347262 1714a3000 Delete type=3 #1 diff --git a/packs/tables/MANIFEST-000002 b/packs/tables/MANIFEST-000002 new file mode 100644 index 0000000..bbbc585 Binary files /dev/null and b/packs/tables/MANIFEST-000002 differ diff --git a/packs/tables/MANIFEST-000004 b/packs/tables/MANIFEST-000004 deleted file mode 100644 index 004ff30..0000000 Binary files a/packs/tables/MANIFEST-000004 and /dev/null differ diff --git a/packs/talents/000003.log b/packs/talents/000003.log new file mode 100644 index 0000000..443b7ea Binary files /dev/null and b/packs/talents/000003.log differ diff --git a/packs/talents/000005.ldb b/packs/talents/000005.ldb deleted file mode 100644 index fb653de..0000000 Binary files a/packs/talents/000005.ldb and /dev/null differ diff --git a/packs/talents/000006.log b/packs/talents/000006.log deleted file mode 100644 index 29003f7..0000000 Binary files a/packs/talents/000006.log and /dev/null differ diff --git a/packs/talents/CURRENT b/packs/talents/CURRENT index cacca75..1a84852 100644 --- a/packs/talents/CURRENT +++ b/packs/talents/CURRENT @@ -1 +1 @@ -MANIFEST-000004 +MANIFEST-000002 diff --git a/packs/talents/LOG b/packs/talents/LOG index 5bf1264..23ce093 100644 --- a/packs/talents/LOG +++ b/packs/talents/LOG @@ -1,5 +1 @@ -2026/08/11-10:31:15.810995 177797000 Recovering log #3 -2026/08/11-10:31:15.811100 177797000 Level-0 table #5: started -2026/08/11-10:31:15.811254 177797000 Level-0 table #5: 5770 bytes OK -2026/08/11-10:31:15.811516 177797000 Delete type=0 #3 -2026/08/11-10:31:15.811553 177797000 Delete type=3 #2 +2026/08/11-18:22:31.915613 173f47000 Delete type=3 #1 diff --git a/packs/talents/LOG.old b/packs/talents/LOG.old deleted file mode 100644 index 7f324bc..0000000 --- a/packs/talents/LOG.old +++ /dev/null @@ -1 +0,0 @@ -2026/08/11-10:29:47.318325 1724bb000 Delete type=3 #1 diff --git a/packs/talents/MANIFEST-000002 b/packs/talents/MANIFEST-000002 new file mode 100644 index 0000000..bbbc585 Binary files /dev/null and b/packs/talents/MANIFEST-000002 differ diff --git a/packs/talents/MANIFEST-000004 b/packs/talents/MANIFEST-000004 deleted file mode 100644 index f8c6b47..0000000 Binary files a/packs/talents/MANIFEST-000004 and /dev/null differ diff --git a/packs/vehicles/000003.log b/packs/vehicles/000003.log new file mode 100644 index 0000000..9950ce5 Binary files /dev/null and b/packs/vehicles/000003.log differ diff --git a/packs/vehicles/000005.ldb b/packs/vehicles/000005.ldb deleted file mode 100644 index f6b2cd4..0000000 Binary files a/packs/vehicles/000005.ldb and /dev/null differ diff --git a/packs/vehicles/000006.log b/packs/vehicles/000006.log deleted file mode 100644 index 47800e2..0000000 Binary files a/packs/vehicles/000006.log and /dev/null differ diff --git a/packs/vehicles/CURRENT b/packs/vehicles/CURRENT index cacca75..1a84852 100644 --- a/packs/vehicles/CURRENT +++ b/packs/vehicles/CURRENT @@ -1 +1 @@ -MANIFEST-000004 +MANIFEST-000002 diff --git a/packs/vehicles/LOG b/packs/vehicles/LOG index fec31df..924b9a0 100644 --- a/packs/vehicles/LOG +++ b/packs/vehicles/LOG @@ -1,5 +1 @@ -2026/08/11-10:31:15.819847 17677f000 Recovering log #3 -2026/08/11-10:31:15.820254 17677f000 Level-0 table #5: started -2026/08/11-10:31:15.821322 17677f000 Level-0 table #5: 6939 bytes OK -2026/08/11-10:31:15.821576 17677f000 Delete type=0 #3 -2026/08/11-10:31:15.821605 17677f000 Delete type=3 #2 +2026/08/11-18:22:31.924112 172723000 Delete type=3 #1 diff --git a/packs/vehicles/LOG.old b/packs/vehicles/LOG.old deleted file mode 100644 index e1200c4..0000000 --- a/packs/vehicles/LOG.old +++ /dev/null @@ -1 +0,0 @@ -2026/08/11-10:29:47.325901 170c97000 Delete type=3 #1 diff --git a/packs/vehicles/MANIFEST-000002 b/packs/vehicles/MANIFEST-000002 new file mode 100644 index 0000000..bbbc585 Binary files /dev/null and b/packs/vehicles/MANIFEST-000002 differ diff --git a/packs/vehicles/MANIFEST-000004 b/packs/vehicles/MANIFEST-000004 deleted file mode 100644 index d4d73b7..0000000 Binary files a/packs/vehicles/MANIFEST-000004 and /dev/null differ diff --git a/packs/weapons/000003.log b/packs/weapons/000003.log new file mode 100644 index 0000000..e1488ed Binary files /dev/null and b/packs/weapons/000003.log differ diff --git a/packs/weapons/000005.ldb b/packs/weapons/000005.ldb deleted file mode 100644 index 742beba..0000000 Binary files a/packs/weapons/000005.ldb and /dev/null differ diff --git a/packs/weapons/000006.log b/packs/weapons/000006.log deleted file mode 100644 index 4d427a6..0000000 Binary files a/packs/weapons/000006.log and /dev/null differ diff --git a/packs/weapons/CURRENT b/packs/weapons/CURRENT index cacca75..1a84852 100644 --- a/packs/weapons/CURRENT +++ b/packs/weapons/CURRENT @@ -1 +1 @@ -MANIFEST-000004 +MANIFEST-000002 diff --git a/packs/weapons/LOG b/packs/weapons/LOG index 5fcd2da..6ff2401 100644 --- a/packs/weapons/LOG +++ b/packs/weapons/LOG @@ -1,5 +1 @@ -2026/08/11-10:31:15.814063 177797000 Recovering log #3 -2026/08/11-10:31:15.814421 177797000 Level-0 table #5: started -2026/08/11-10:31:15.814700 177797000 Level-0 table #5: 14767 bytes OK -2026/08/11-10:31:15.814977 177797000 Delete type=0 #3 -2026/08/11-10:31:15.815010 177797000 Delete type=3 #2 +2026/08/11-18:22:31.917625 172f2f000 Delete type=3 #1 diff --git a/packs/weapons/LOG.old b/packs/weapons/LOG.old deleted file mode 100644 index bac01ca..0000000 --- a/packs/weapons/LOG.old +++ /dev/null @@ -1 +0,0 @@ -2026/08/11-10:29:47.320066 170c97000 Delete type=3 #1 diff --git a/packs/weapons/MANIFEST-000002 b/packs/weapons/MANIFEST-000002 new file mode 100644 index 0000000..bbbc585 Binary files /dev/null and b/packs/weapons/MANIFEST-000002 differ diff --git a/packs/weapons/MANIFEST-000004 b/packs/weapons/MANIFEST-000004 deleted file mode 100644 index 6a582af..0000000 Binary files a/packs/weapons/MANIFEST-000004 and /dev/null differ diff --git a/ringbrp.mjs b/ringbrp.mjs index 36b7e43..75ebeec 100644 --- a/ringbrp.mjs +++ b/ringbrp.mjs @@ -34,6 +34,7 @@ import { BURST, burstHitsFor, burstRoundsSpent, BURST_FUMBLE, BURST_ONE_MAJOR_WOUND, BURST_HITS, LAMP, lampReachFor, lampCovers, COVERAGE, coverageFor, armourCoversKind, locationArmourFor, + SHIELD, shieldArmourFor, shieldRangedPenaltyFor, shieldWearFor, shieldBroken, FIRE_MODE, fireModeFor, burstSizesFor, fireModeAttackFor, secondShotPenaltyFor, SUSTAIN, sustainDamageFor, sustainChargeFor, SIGHT, sightFor, sightBonusFor, sightSeesInDark, @@ -666,10 +667,30 @@ class RingBRPActor extends Actor { // Every piece used to add to every location, so a Brodie helmet protected your // legs. Pieces now declare coverage and the total is computed per location. const naturalArmour = Number(sys.naturalArmour?.value) || 0; + // A shield is armour you HOLD: its points count only while it is raised and only + // while it is still a shield. Lowered or broken it is weight and nothing else. const wornArmour = this.items.filter(i => i.type === "armour" && i.system.equipped) - .map(i => ({ name: i.name, points: Number(i.system.points) || 0, - coverage: i.system.coverage || "all" })); + .map(i => { + const isShield = !!i.system.shield; + const broken = isShield && shieldBroken(i.system.degradation?.current, + i.system.degradation?.max); + const pts = Number(i.system.points) || 0; + return { name: i.name, shield: isShield, raised: !!i.system.raised, broken, + points: isShield ? shieldArmourFor(pts, { raised: !!i.system.raised, broken }) + : pts, + coverage: i.system.coverage || "all" }; + }) + .filter(p => p.points > 0 || !p.shield); sys.wornArmour = wornArmour; + // The shield in hand, if there is one up. Everything else reads this. + { + const up = this.items.find(i => i.type === "armour" && i.system.shield + && i.system.equipped && i.system.raised + && !shieldBroken(i.system.degradation?.current, i.system.degradation?.max)); + sys.shieldUp = up ? { id: up.id, name: up.name, points: Number(up.system.points) || 0, + wear: Number(up.system.degradation?.current) || 0, + wearMax: Number(up.system.degradation?.max) || 0 } : null; + } // --- hit locations (spec §3.6) --- const speciesId = sys.speciesProfile || "baseline"; @@ -2967,6 +2988,13 @@ export async function medicalCare(medic, patient, { difficulty = "average" } = { * Returns the roll result plus whether the attack was turned aside, so a caller * can decide what that means: a dodge avoids the blow, a parry stops it. */ +/** The shield this actor currently has up, as the item — null if none, or if broken. */ +function this_shield(actor) { + return actor?.items?.find(i => i.type === "armour" && i.system.shield + && i.system.equipped && i.system.raised + && !shieldBroken(i.system.degradation?.current, i.system.degradation?.max)) ?? null; +} + export async function defend(actor, { type = "dodge", weapon = null, difficulty = "average", against = null } = {}) { if (!actor) return null; @@ -2976,15 +3004,28 @@ export async function defend(actor, { type = "dodge", weapon = null, difficulty const incoming = against ?? standingBlow(actor)?.level ?? "success"; const combat = actor.system.combat ?? {}; const used = Number(combat.defencesThisRound) || 0; - const kind = defenceTypeAllowed(combat.defenceTypeLock, type); - if (kind !== type) { + // Taking it on the shield IS a parry — it locks with parries and it is not a dodge. + // What differs is the skill it rolls, so the shield is a flag rather than a third + // defence type: passing "shield" through defenceTypeAllowed produced a `kind` the + // branches below did not recognise, and every shield defence quietly rolled Dodge. + const wantsShield = type === "shield"; + const asked = wantsShield ? "parry" : type; + const kind = defenceTypeAllowed(combat.defenceTypeLock, asked); + if (kind !== asked) { ui.notifications?.info(game.i18n.format("RINGBRP.Notify.DefenceLocked", { kind: game.i18n.localize(`RINGBRP.Defence.${kind}`) })); } - // Dodge is its own skill; a parry uses the weapon you are holding. + // Dodge is its own skill; a parry uses the weapon you are holding — or the shield, + // which is the whole point of a shield and the only armour you can defend with. let rating = 0, label = "", famId = "", catId = "phys"; - if (kind === "parry" && weapon) { + const shieldItem = (kind === "parry" && (wantsShield || !weapon)) + ? this_shield(actor) : null; + if (kind === "parry" && shieldItem) { + rating = actor.skillRating(SHIELD.parryFamily, SHIELD.parrySpec) ?? 0; + label = game.i18n.format("RINGBRP.Defence.ParryWith", { name: shieldItem.name }); + famId = SHIELD.parryFamily; catId = "melee"; + } else if (kind === "parry" && weapon) { rating = actor.skillRating(weapon.system.skillFamilyId, weapon.system.skillSpecialisationId) ?? 0; label = game.i18n.format("RINGBRP.Defence.ParryWith", { name: weapon.name }); famId = weapon.system.skillFamilyId; catId = "melee"; @@ -3008,6 +3049,25 @@ export async function defend(actor, { type = "dodge", weapon = null, difficulty "system.combat.defenceTypeLock": kind }); const outcome = defenceOutcomeFor(incoming, res.level); + // Shields break. Wear is taken for what the shield ABSORBED, not only for what it + // stopped outright — a shield that turns a critical down to a special has very much + // taken that blow, and it is exactly then that shields splinter. Requiring a clean + // stop made this unreachable: only a critical defence fully stops a critical, so a + // shield would have gone its entire life without a scratch. + if (shieldItem && (outcome.turnedAside || outcome.steps > 0)) { + const wear = shieldWearFor(incoming); + if (wear) { + const cur = (Number(shieldItem.system.degradation?.current) || 0) + wear; + await shieldItem.update({ "system.degradation.current": cur }); + const max = Number(shieldItem.system.degradation?.max) || 0; + const broken = shieldBroken(cur, max); + await ChatMessage.create({ speaker: ChatMessage.getSpeaker({ actor }), + content: `