From 5c114601a9ea51fb0d64eec0dd0c0ed5caf29a1e Mon Sep 17 00:00:00 2001 From: slaguru666 <111923774+slaguru666@users.noreply.github.com> Date: Mon, 10 Aug 2026 22:24:55 +0100 Subject: [PATCH] R-224: a body at zero absorbed damage for free MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Hit points clamp at zero, so further damage to somebody already there changed nothing — and a STABILISED agent absorbed it forever, because the count was held and there was nothing else left to move. You could empty a magazine into someone bleeding out and the system would not notice. Damage at zero now breaks the stabilisation and costs a round of the count, and hitLocationRoll calls died() when that meets the limit. Found by playing LOW VERGE until it killed somebody: two agents who were medically stable died in the water on a failed tidal extraction. Co-Authored-By: Claude Opus 5 --- docs/REVIEW_LOG.md | 37 ++++++++++++++++++++++++++++++++++++ packs/armour/LOG | 10 +++++----- packs/armour/LOG.old | 2 +- packs/expedition/LOG | 10 +++++----- packs/expedition/LOG.old | 2 +- packs/gear/LOG | 10 +++++----- packs/gear/LOG.old | 2 +- packs/npcs/LOG | 10 +++++----- packs/npcs/LOG.old | 2 +- packs/powers/LOG | 10 +++++----- packs/powers/LOG.old | 2 +- packs/pregens/LOG | 10 +++++----- packs/pregens/LOG.old | 2 +- packs/rules/000005.ldb | Bin 24552 -> 24724 bytes packs/rules/000006.log | Bin 47237 -> 47562 bytes packs/rules/LOG | 10 +++++----- packs/rules/LOG.old | 2 +- packs/rules/MANIFEST-000004 | Bin 147 -> 147 bytes packs/skills/LOG | 10 +++++----- packs/skills/LOG.old | 2 +- packs/slice/LOG | 10 +++++----- packs/slice/LOG.old | 2 +- packs/tables/LOG | 10 +++++----- packs/tables/LOG.old | 2 +- packs/talents/LOG | 10 +++++----- packs/talents/LOG.old | 2 +- packs/vehicles/LOG | 10 +++++----- packs/vehicles/LOG.old | 2 +- packs/weapons/LOG | 10 +++++----- packs/weapons/LOG.old | 2 +- ringbrp.mjs | 23 ++++++++++++++++++++-- tools/rules-text.mjs | 4 ++++ 32 files changed, 140 insertions(+), 80 deletions(-) diff --git a/docs/REVIEW_LOG.md b/docs/REVIEW_LOG.md index 4d25aa6..f238453 100644 --- a/docs/REVIEW_LOG.md +++ b/docs/REVIEW_LOG.md @@ -3860,3 +3860,40 @@ journal to answer "where are we and how long have we got". Checked across 300 seeds for `[object Object]`, `undefined` and `NaN` in every generated page: clean. One real leak found and fixed on the way — the group's taboo and desire are objects with a `.text`, and the brief was printing the object. + +## LOW VERGE — played until it killed somebody + +Field Lead, Physician, Recording Officer, Translation Officer at a boarding school out +of term. The brief did its new job: Where, When, the job, what to expect, and the way +back, all before the prose. Four phases. + +The rival desk never became a fight — the Field Lead rolled a natural 1 on Status 15% +and they stood down, which is the leverage the Opposition page names. The danger was +never them. The Pressure page had already declared the price: *"There is a body that +has to be carried, and it is one of ours."* + +Two phases failed, the Containment phase failed, and the other side's weather came +through a gap at the true scale. Three of the four went to zero in a single exposure +and the Physician — 48% First Aid, on four hit points herself — stabilised all three, +one after another, and then did it again after the next wave. + +Then the extraction failed on a tidal causeway with the window already past. Marek +Achterberg and Tomas Vance died in the water, both at Coherence 10, both **recorded +properly — a death in service, a form, a pension, a name that stays where it was put.** +Nkechi Quist came home stable at zero. Ambaro Vance walked off the causeway on four +hit points having kept three people alive for six rounds and lost two of them anyway. + +**R-224 · a body at zero absorbed damage for free.** Found by this play-through and it +is what killed them. Hit points clamp at zero, so further damage to somebody already +there changed nothing — and a STABILISED agent absorbed it forever, because the count +was held and there was nothing else left to move. You could empty a magazine into +someone bleeding out on the floor and the system would not notice. Damage at zero now +breaks the stabilisation and costs a round of the count, and `hitLocationRoll` calls +`died()` directly when that meets the limit. That is precisely how the causeway killed +two people who were medically stable four minutes earlier. + +**Worth noting for the Last Entry table:** both died at Coherence 10 and so got the +dullest of the four entries. Coherence is normally spent on the way home, and these +two never got there — an agent who dies mid-case is likely to be *well* filed. The +interesting entries belong to people who die after a bad crossing, which is the right +way round but means the table's bottom half will be rarer than its top. diff --git a/packs/armour/LOG b/packs/armour/LOG index d137772..2a95d39 100644 --- a/packs/armour/LOG +++ b/packs/armour/LOG @@ -1,5 +1,5 @@ -2026/08/10-22:10:05.167695 172fa3000 Recovering log #3 -2026/08/10-22:10:05.167719 172fa3000 Level-0 table #5: started -2026/08/10-22:10:05.167831 172fa3000 Level-0 table #5: 1902 bytes OK -2026/08/10-22:10:05.168131 172fa3000 Delete type=0 #3 -2026/08/10-22:10:05.168177 172fa3000 Delete type=3 #2 +2026/08/10-22:21:57.701683 1776e7000 Recovering log #3 +2026/08/10-22:21:57.701703 1776e7000 Level-0 table #5: started +2026/08/10-22:21:57.701794 1776e7000 Level-0 table #5: 1902 bytes OK +2026/08/10-22:21:57.701993 1776e7000 Delete type=0 #3 +2026/08/10-22:21:57.702019 1776e7000 Delete type=3 #2 diff --git a/packs/armour/LOG.old b/packs/armour/LOG.old index 7a81f41..f39587b 100644 --- a/packs/armour/LOG.old +++ b/packs/armour/LOG.old @@ -1 +1 @@ -2026/08/10-22:09:56.857234 172fe3000 Delete type=3 #1 +2026/08/10-22:21:49.417954 172017000 Delete type=3 #1 diff --git a/packs/expedition/LOG b/packs/expedition/LOG index 2ef6314..cf313ee 100644 --- a/packs/expedition/LOG +++ b/packs/expedition/LOG @@ -1,5 +1,5 @@ -2026/08/10-22:10:05.175210 172797000 Recovering log #3 -2026/08/10-22:10:05.175229 172797000 Level-0 table #5: started -2026/08/10-22:10:05.175333 172797000 Level-0 table #5: 4129 bytes OK -2026/08/10-22:10:05.175537 172797000 Delete type=0 #3 -2026/08/10-22:10:05.175564 172797000 Delete type=3 #2 +2026/08/10-22:21:57.709136 1776e7000 Recovering log #3 +2026/08/10-22:21:57.709155 1776e7000 Level-0 table #5: started +2026/08/10-22:21:57.709295 1776e7000 Level-0 table #5: 4129 bytes OK +2026/08/10-22:21:57.709506 1776e7000 Delete type=0 #3 +2026/08/10-22:21:57.709532 1776e7000 Delete type=3 #2 diff --git a/packs/expedition/LOG.old b/packs/expedition/LOG.old index 9201cdc..e489392 100644 --- a/packs/expedition/LOG.old +++ b/packs/expedition/LOG.old @@ -1 +1 @@ -2026/08/10-22:09:56.883542 172fe3000 Delete type=3 #1 +2026/08/10-22:21:49.443274 17302f000 Delete type=3 #1 diff --git a/packs/gear/LOG b/packs/gear/LOG index bf1383d..f3169ae 100644 --- a/packs/gear/LOG +++ b/packs/gear/LOG @@ -1,5 +1,5 @@ -2026/08/10-22:10:05.168741 172797000 Recovering log #3 -2026/08/10-22:10:05.168838 172797000 Level-0 table #5: started -2026/08/10-22:10:05.169097 172797000 Level-0 table #5: 27954 bytes OK -2026/08/10-22:10:05.169298 172797000 Delete type=0 #3 -2026/08/10-22:10:05.169329 172797000 Delete type=3 #2 +2026/08/10-22:21:57.702603 176edb000 Recovering log #3 +2026/08/10-22:21:57.702692 176edb000 Level-0 table #5: started +2026/08/10-22:21:57.702943 176edb000 Level-0 table #5: 27954 bytes OK +2026/08/10-22:21:57.703215 176edb000 Delete type=0 #3 +2026/08/10-22:21:57.703261 176edb000 Delete type=3 #2 diff --git a/packs/gear/LOG.old b/packs/gear/LOG.old index fdb436c..f3b8b33 100644 --- a/packs/gear/LOG.old +++ b/packs/gear/LOG.old @@ -1 +1 @@ -2026/08/10-22:09:56.859443 1727d7000 Delete type=3 #1 +2026/08/10-22:21:49.419830 172017000 Delete type=3 #1 diff --git a/packs/npcs/LOG b/packs/npcs/LOG index fd4b2a5..4b858aa 100644 --- a/packs/npcs/LOG +++ b/packs/npcs/LOG @@ -1,5 +1,5 @@ -2026/08/10-22:10:05.160943 173fbb000 Recovering log #3 -2026/08/10-22:10:05.161166 173fbb000 Level-0 table #5: started -2026/08/10-22:10:05.161661 173fbb000 Level-0 table #5: 60660 bytes OK -2026/08/10-22:10:05.161946 173fbb000 Delete type=0 #3 -2026/08/10-22:10:05.162005 173fbb000 Delete type=3 #2 +2026/08/10-22:21:57.694343 177ef3000 Recovering log #3 +2026/08/10-22:21:57.694579 177ef3000 Level-0 table #5: started +2026/08/10-22:21:57.695401 177ef3000 Level-0 table #5: 60660 bytes OK +2026/08/10-22:21:57.695734 177ef3000 Delete type=0 #3 +2026/08/10-22:21:57.695824 177ef3000 Delete type=3 #2 diff --git a/packs/npcs/LOG.old b/packs/npcs/LOG.old index 342c4ce..659b77c 100644 --- a/packs/npcs/LOG.old +++ b/packs/npcs/LOG.old @@ -1 +1 @@ -2026/08/10-22:09:56.870862 172fe3000 Delete type=3 #1 +2026/08/10-22:21:49.430202 172823000 Delete type=3 #1 diff --git a/packs/powers/LOG b/packs/powers/LOG index f720acc..a9b81ed 100644 --- a/packs/powers/LOG +++ b/packs/powers/LOG @@ -1,5 +1,5 @@ -2026/08/10-22:10:05.165461 172fa3000 Recovering log #3 -2026/08/10-22:10:05.165486 172fa3000 Level-0 table #5: started -2026/08/10-22:10:05.165592 172fa3000 Level-0 table #5: 3295 bytes OK -2026/08/10-22:10:05.165831 172fa3000 Delete type=0 #3 -2026/08/10-22:10:05.165879 172fa3000 Delete type=3 #2 +2026/08/10-22:21:57.699606 1776e7000 Recovering log #3 +2026/08/10-22:21:57.699632 1776e7000 Level-0 table #5: started +2026/08/10-22:21:57.699749 1776e7000 Level-0 table #5: 3295 bytes OK +2026/08/10-22:21:57.699987 1776e7000 Delete type=0 #3 +2026/08/10-22:21:57.700037 1776e7000 Delete type=3 #2 diff --git a/packs/powers/LOG.old b/packs/powers/LOG.old index 856d7e6..ee49e46 100644 --- a/packs/powers/LOG.old +++ b/packs/powers/LOG.old @@ -1 +1 @@ -2026/08/10-22:09:56.877345 172fe3000 Delete type=3 #1 +2026/08/10-22:21:49.437043 172017000 Delete type=3 #1 diff --git a/packs/pregens/LOG b/packs/pregens/LOG index 1bb2764..58b3000 100644 --- a/packs/pregens/LOG +++ b/packs/pregens/LOG @@ -1,5 +1,5 @@ -2026/08/10-22:10:05.158567 173fbb000 Recovering log #3 -2026/08/10-22:10:05.158795 173fbb000 Level-0 table #5: started -2026/08/10-22:10:05.159257 173fbb000 Level-0 table #5: 54921 bytes OK -2026/08/10-22:10:05.159544 173fbb000 Delete type=0 #3 -2026/08/10-22:10:05.159580 173fbb000 Delete type=3 #2 +2026/08/10-22:21:57.691875 177ef3000 Recovering log #3 +2026/08/10-22:21:57.692083 177ef3000 Level-0 table #5: started +2026/08/10-22:21:57.692589 177ef3000 Level-0 table #5: 54921 bytes OK +2026/08/10-22:21:57.692893 177ef3000 Delete type=0 #3 +2026/08/10-22:21:57.692928 177ef3000 Delete type=3 #2 diff --git a/packs/pregens/LOG.old b/packs/pregens/LOG.old index b6b487a..47f0b84 100644 --- a/packs/pregens/LOG.old +++ b/packs/pregens/LOG.old @@ -1 +1 @@ -2026/08/10-22:09:56.866210 171fcb000 Delete type=3 #1 +2026/08/10-22:21:49.425591 172017000 Delete type=3 #1 diff --git a/packs/rules/000005.ldb b/packs/rules/000005.ldb index d2d07c74670dc8117f28ee81aa28c7fe91d0d9d1..81959f548f88aa4ad112ea8de3e53616833f3a88 100644 GIT binary patch delta 1485 zcmXw3du$X%7@sY>FxT7tZf`la*X^~;H6FATt^pJ)^6*eF5Fw-(Af{TUw{yLP?e4j| z*IK2Vhdfdq1}Q#KNTWQeVvq_kf|P1%M8RiNASx+7LLh1lA_fz5`NK&jnS7a0%v2yeL1S*k23$CyyYcfLrj?+AZ8jdAL5d#~ zet@4N3pWpHXzJjQ`ihL1<-wPj&ra?A3Pz;rk;>Qvm*|Xo*;G=bBx4L;lF1`^=E7T; zOe8HVP4g~Ouazn%R78}n8+;Tc=#kscd5g>RCpWfEGHbmJKGsO*sr>ZbOfaFuXrt-WcC8 zn4To?M>*E1rv$^&(cUNhu@cYBy%=j`t%mD4oyvJxJr+Y9>Yfm!RpR(?cuBIzX4gRo zV`>%L_=oYsUpGr{f>^O_iv%_0k&Iz7(g7#S>25J?+Ab^zagWGu&bIW#Wf(IS8&+P$ zA(=Xk(GHOcp)XdN#lv6vj>T z9BR24=J%pcEY$wS`_w&;Q%^;FUZ~?KcZK;h-TemkQG~N)h`_iitm_UGG@P*=_($8n zG%*IX!M_#8g~8cLC|NWxCVr3DLUj{XMCrrv)A0p{6zH4&5$fAF?N!82aJgNP7L&C# zSz3QIz8rbOR}TFpGt*@gW=u1~;}?h2o$;Y4d@3VW_Ys+PM#hVo(><7fA20E2;>2bfqUDFs5%&^`nzKMM7-uDv?x--&oN;` zCH4XQd9|F*Ql~W)KwkW_-q(sx!$}O=MV$8$y?CW&cwSM{eu+erP1X`W3gG>*^eXS! z@MD#5D@?=K@U^NX8%y}K(S4oIGDWYF347EJosX*uF`K0Qyz+# zeT7I;hOS%)`kG^~Q^Xn8q2)B;^>qm@s!Ww5Nz&+hdG3hV&YVtdJVtu&1HQ`P#VWpy zB~GJk^_{-C2@F(V-A)(3IB^CUTA)-kn5p-!5-fD*vJG_E37__c#D&clW*5^Kiz@? fLUlO2_4vV_t<5)=R<4_0w|;<|d~~4aSaaQfl1|F{ delta 1342 zcmXw&ZEO@p7{_PpF3$CK=dOFl_U?LZ=NgX|Xpcy>Rzj-R7eE8Ww1`3~bb342Te`P< z>~61?AV-mc6^qbozYtLyYz@{Iw8951m105sgvOWv31SruppYg7F_NIm2Pc_i@+32v z=lA@7gHz14ub5+POW@DX&aME}qlMYcb$I;sC0Ah1rSkEP>Rv7bn=LZajGoRd{Ff&k z)Ra6felt(U0nmH% zeFlzGYAws#yQZHdR>c(1&Pd>ONN${Q zA<@HX?Sj~V+%c6BgFC#&8Eny_csWhhNYnGZ^71A2sbo(9YLbwTkDi8@w4PtGiXdVWK1>Lj8?EF;Xa2l zO>rWtYoR$e?xL#75I}|FpbPEvj2vbaE3ktHRQkcSX(`9n>CARiDcN`&Cyp*+Ggd-6 zQ$W@U`|PLCCjw&lEh{hkkoA*hJeE(=xin!!D`20CY(Np`!WN zuyNRj_fwxHzS~T({Q8=HphAuEkMQ|LQDk9awIcd&Q z^&VhLP39eMn@W={T0qMWy$GzSV?%$sscO>Fs#5m?Cz3W`n2&dTpDj-2aULXY&aJP?_ot%i^lK2ANLigO1Kg||+ZvWfn&&x|MfN-d>L=R- zv{7)ZO!t60XN$%I7jN%+3p9Fj*jg3U266|K*Co{S=E1H_>yzUz)U6BV%}g-X|7B2@9huEeY?g!5 z3&28d$0@*SjBpB%^)go%0|!@nMyyLGnMV&yGDn!~*4BdT&Q>=2 HMl1Xeu$-a2 diff --git a/packs/rules/000006.log b/packs/rules/000006.log index e969202ac8c8ac73b15d015337b60095f077d589..9ce8629506017d6809432812a1b8bf53e71c5868 100644 GIT binary patch delta 360 zcmW-cF-yci5QQ-uSXqjN7Gp1Zji`rM2% z2>uKed$F=}HZaZ3zIoq!*FV|&Z#Eb{ti3!9ZbsSHu)7^?uFQ|gdIMDx1kj-MfC85k z_;4pmU~i5f4}|9t(6=#x3RGM|6RL>IRF3v delta 50 zcmV-20L}l(^8$tO0t8OO*_^Qii#h_IF0+w3Aq}(lNC`Ky2Y^KZ2lFiJL4G&{lQDS} Ivtfa0I3Ir#{Qv*} diff --git a/packs/rules/LOG b/packs/rules/LOG index 8d56ba2..c283fca 100644 --- a/packs/rules/LOG +++ b/packs/rules/LOG @@ -1,5 +1,5 @@ -2026/08/10-22:10:05.171339 172797000 Recovering log #3 -2026/08/10-22:10:05.171403 172797000 Level-0 table #5: started -2026/08/10-22:10:05.171720 172797000 Level-0 table #5: 24552 bytes OK -2026/08/10-22:10:05.172072 172797000 Delete type=0 #3 -2026/08/10-22:10:05.172108 172797000 Delete type=3 #2 +2026/08/10-22:21:57.705201 1776e7000 Recovering log #3 +2026/08/10-22:21:57.705262 1776e7000 Level-0 table #5: started +2026/08/10-22:21:57.705576 1776e7000 Level-0 table #5: 24724 bytes OK +2026/08/10-22:21:57.705849 1776e7000 Delete type=0 #3 +2026/08/10-22:21:57.705894 1776e7000 Delete type=3 #2 diff --git a/packs/rules/LOG.old b/packs/rules/LOG.old index bc4ce69..3ab0284 100644 --- a/packs/rules/LOG.old +++ b/packs/rules/LOG.old @@ -1 +1 @@ -2026/08/10-22:09:56.881569 172fe3000 Delete type=3 #1 +2026/08/10-22:21:49.441356 17302f000 Delete type=3 #1 diff --git a/packs/rules/MANIFEST-000004 b/packs/rules/MANIFEST-000004 index 23212a130d7e1edb56dbd91c97129e7c9a56eec5..b044639e6563120186e454f7695b963a07da6ddc 100644 GIT binary patch delta 30 mcmbQtIGJ&RvdD?{sb@187@62O8JO8wxY!w3ryQJU9s>Y@;0L(? delta 30 mcmbQtIGJ&RvdA8TZ=RV9j7)5t49x5-T 0; + if (wasAtZero && hurtAgain && !sys.dying?.dead) { + upd["system.dying.stabilised"] = false; + upd["system.dying.rounds"] = (Number(sys.dying?.rounds) || 0) + 1; + } + await target.update(upd); + + if (upd["system.dying.rounds"] !== undefined + && upd["system.dying.rounds"] >= dyingLimitFor(sys.majorWound?.value)) { + await died(target); + } return { location: loc, ...res }; } diff --git a/tools/rules-text.mjs b/tools/rules-text.mjs index 82f53c4..c7dbf6a 100644 --- a/tools/rules-text.mjs +++ b/tools/rules-text.mjs @@ -321,6 +321,10 @@ ${table(["Hit points", "You are"], [ own Major Wound threshold you are dead — so the same number that decides how much damage you can take standing up also decides how long you have on the floor. A minimum of ${DYING.minCount} rounds applies however slight you are.

+

Being hurt again at zero breaks any stabilisation and costs a +round of the count. Hit points cannot go below zero, so this is what further damage to +a body on the floor actually does — and it is why leaving somebody stable in a place +that is still dangerous is not the same as getting them out.

Stabilising takes ${DYING.stabiliseWith.join(" or ")} and stops the count. It does not put you back on your feet: you are still at zero and still unconscious until somebody heals you above it. Healing above zero clears the count.