From cc23fdb7bd309eb610e3771983106f641897833a Mon Sep 17 00:00:00 2001 From: slaguru666 <111923774+slaguru666@users.noreply.github.com> Date: Mon, 10 Aug 2026 20:31:01 +0100 Subject: [PATCH] Rulebook and compendium refresh MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Audited every exported rule in rules.mjs against what the rulebook says and closed the gaps: - Dodge starts at DEX x 2 — newly evaluated, and stated nowhere until now - Encumbrance: free carry, and which skill categories it actually penalises - Bleeding rates and what stops each kind - The merge ladder for Borrowed Authority, as a table - A new page listing all 25 postings, generated from ROLES The rulebook is now 9 pages and every one is generated from the code it documents. All packs, 231 icons and the dice textures rebuilt. Co-Authored-By: Claude Opus 5 --- docs/REVIEW_LOG.md | 45 +++++++++++++++++++++++++++++++++++ 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 18581 -> 23316 bytes packs/rules/000006.log | Bin 35703 -> 44873 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 +- tools/rules-text.mjs | 46 +++++++++++++++++++++++++++++++++++- 31 files changed, 168 insertions(+), 79 deletions(-) diff --git a/docs/REVIEW_LOG.md b/docs/REVIEW_LOG.md index 72dd955..ebc57f3 100644 --- a/docs/REVIEW_LOG.md +++ b/docs/REVIEW_LOG.md @@ -3631,3 +3631,48 @@ roster cannot resolve a phase, and `resolveLegDialog` bails silently), so it is ordered by how good the guess is: player-assigned characters first, then whatever the GM has selected on the canvas, and the whole world only as a last resort — and it says so when it does. Verified: with four tokens selected, the new case has four members. + +## SOFT VERGE, played with four new postings + +Registry, Access, Disposal and Settlements — no role from the original five. The case +generated a location filed twice with the two filings drifting apart, which is a +Registry Officer's whole job, and a police cordon the team could not show a warrant to +because the staff's taboo forbids it. + +They tried Borrowed Authority on the cordon: Registry failed the roll that establishes +what PC Aldiss is actually FOR, so the credential stayed at "read their own records", +which made signing four people through a STRETCH rather than routine — and it was +refused. That is the subsystem working exactly as designed; the dossier item that +matters is the one nobody rolled well on. + +The case was won socially, not tactically. The Settlements Officer read the staff and +made the offer, standing 0 → 2, and they handed over the log — the only continuous +record of a place filed twice. Containment and Extraction both failed at 8% and 3%, +Resources hit 0, and everybody came home. Two skills improved at close. + +**Balance note, not a defect.** The phase ladder gets brutal at the tail: difficult +plus escalating modifiers plus destitution put the last two phases at 8% and 3%. A +team that loses Resources early is not going to pass another phase, and the case +becomes about what they can still do socially. That reads as intended given the tone, +but a GM should know that Resources is the track that actually decides a case. + +## Documentation pass + +Audited every exported rule in `rules.mjs` against what the rulebook actually says, +and closed the gaps the audit found: + +- **Dodge starts at DEX × 2** — newly evaluated, and stated nowhere. Now on the + fighting page, worked with a real number. +- **Encumbrance** — free carry is STR + SIZ, and which skill categories it penalises, + as a table generated from `ENCUMBERED_CATEGORIES`. +- **Bleeding** — rates and what stops each kind, from `BLEED`. +- **The merge ladder** — the five stages of your file converging with a borrowed one, + as a table rather than prose. +- **A new page, "The postings"** — all 25, each with its key characteristic and what + the job is, generated from `ROLES` in `ringbrp.mjs` (read out of the source, since + that module cannot be imported outside Foundry). + +The rulebook is 9 pages, every page generated from the code it documents, and no +unresolved localisation key leaks into it. All packs rebuilt: 53 skills, 18 talents, +30 weapons, 13 armour, 119 gear, 14 vehicles, 6 Arts, 4 pregens, 6 NPCs, 2 tables, +the rulebook and the starter case. 231 icons and the four dice textures regenerated. diff --git a/packs/armour/LOG b/packs/armour/LOG index 912b427..9739494 100644 --- a/packs/armour/LOG +++ b/packs/armour/LOG @@ -1,5 +1,5 @@ -2026/08/10-20:22:43.733467 171e23000 Recovering log #3 -2026/08/10-20:22:43.733493 171e23000 Level-0 table #5: started -2026/08/10-20:22:43.733658 171e23000 Level-0 table #5: 1902 bytes OK -2026/08/10-20:22:43.734023 171e23000 Delete type=0 #3 -2026/08/10-20:22:43.734059 171e23000 Delete type=3 #2 +2026/08/10-20:30:07.065707 1755c3000 Recovering log #3 +2026/08/10-20:30:07.065728 1755c3000 Level-0 table #5: started +2026/08/10-20:30:07.065850 1755c3000 Level-0 table #5: 1902 bytes OK +2026/08/10-20:30:07.066113 1755c3000 Delete type=0 #3 +2026/08/10-20:30:07.066156 1755c3000 Delete type=3 #2 diff --git a/packs/armour/LOG.old b/packs/armour/LOG.old index 4414f1b..a886e7c 100644 --- a/packs/armour/LOG.old +++ b/packs/armour/LOG.old @@ -1 +1 @@ -2026/08/10-20:22:35.453598 1723af000 Delete type=3 #1 +2026/08/10-20:29:51.729566 1735fb000 Delete type=3 #1 diff --git a/packs/expedition/LOG b/packs/expedition/LOG index 9f2a54d..3947593 100644 --- a/packs/expedition/LOG +++ b/packs/expedition/LOG @@ -1,5 +1,5 @@ -2026/08/10-20:22:43.741301 17262f000 Recovering log #3 -2026/08/10-20:22:43.741323 17262f000 Level-0 table #5: started -2026/08/10-20:22:43.741456 17262f000 Level-0 table #5: 4129 bytes OK -2026/08/10-20:22:43.741707 17262f000 Delete type=0 #3 -2026/08/10-20:22:43.741744 17262f000 Delete type=3 #2 +2026/08/10-20:30:07.073841 174db7000 Recovering log #3 +2026/08/10-20:30:07.073861 174db7000 Level-0 table #5: started +2026/08/10-20:30:07.073980 174db7000 Level-0 table #5: 4129 bytes OK +2026/08/10-20:30:07.074278 174db7000 Delete type=0 #3 +2026/08/10-20:30:07.074323 174db7000 Delete type=3 #2 diff --git a/packs/expedition/LOG.old b/packs/expedition/LOG.old index 5c2fce0..600a5ef 100644 --- a/packs/expedition/LOG.old +++ b/packs/expedition/LOG.old @@ -1 +1 @@ -2026/08/10-20:22:35.478012 1723af000 Delete type=3 #1 +2026/08/10-20:29:51.752510 174613000 Delete type=3 #1 diff --git a/packs/gear/LOG b/packs/gear/LOG index f846c49..6400ce5 100644 --- a/packs/gear/LOG +++ b/packs/gear/LOG @@ -1,5 +1,5 @@ -2026/08/10-20:22:43.734698 172e3b000 Recovering log #3 -2026/08/10-20:22:43.734790 172e3b000 Level-0 table #5: started -2026/08/10-20:22:43.735067 172e3b000 Level-0 table #5: 27954 bytes OK -2026/08/10-20:22:43.735279 172e3b000 Delete type=0 #3 -2026/08/10-20:22:43.735322 172e3b000 Delete type=3 #2 +2026/08/10-20:30:07.066829 175dcf000 Recovering log #3 +2026/08/10-20:30:07.066918 175dcf000 Level-0 table #5: started +2026/08/10-20:30:07.067237 175dcf000 Level-0 table #5: 27954 bytes OK +2026/08/10-20:30:07.067567 175dcf000 Delete type=0 #3 +2026/08/10-20:30:07.067649 175dcf000 Delete type=3 #2 diff --git a/packs/gear/LOG.old b/packs/gear/LOG.old index bbdaa0f..165192d 100644 --- a/packs/gear/LOG.old +++ b/packs/gear/LOG.old @@ -1 +1 @@ -2026/08/10-20:22:35.456036 172bbb000 Delete type=3 #1 +2026/08/10-20:29:51.731275 172def000 Delete type=3 #1 diff --git a/packs/npcs/LOG b/packs/npcs/LOG index e896a6c..b90ac15 100644 --- a/packs/npcs/LOG +++ b/packs/npcs/LOG @@ -1,5 +1,5 @@ -2026/08/10-20:22:43.726077 171e23000 Recovering log #3 -2026/08/10-20:22:43.726308 171e23000 Level-0 table #5: started -2026/08/10-20:22:43.726763 171e23000 Level-0 table #5: 60660 bytes OK -2026/08/10-20:22:43.727036 171e23000 Delete type=0 #3 -2026/08/10-20:22:43.727073 171e23000 Delete type=3 #2 +2026/08/10-20:30:07.059142 1755c3000 Recovering log #3 +2026/08/10-20:30:07.059383 1755c3000 Level-0 table #5: started +2026/08/10-20:30:07.059924 1755c3000 Level-0 table #5: 60660 bytes OK +2026/08/10-20:30:07.060223 1755c3000 Delete type=0 #3 +2026/08/10-20:30:07.060258 1755c3000 Delete type=3 #2 diff --git a/packs/npcs/LOG.old b/packs/npcs/LOG.old index 874eec0..a345418 100644 --- a/packs/npcs/LOG.old +++ b/packs/npcs/LOG.old @@ -1 +1 @@ -2026/08/10-20:22:35.466901 1723af000 Delete type=3 #1 +2026/08/10-20:29:51.741242 172def000 Delete type=3 #1 diff --git a/packs/powers/LOG b/packs/powers/LOG index c352986..aa0f4dd 100644 --- a/packs/powers/LOG +++ b/packs/powers/LOG @@ -1,5 +1,5 @@ -2026/08/10-20:22:43.730937 171e23000 Recovering log #3 -2026/08/10-20:22:43.730959 171e23000 Level-0 table #5: started -2026/08/10-20:22:43.731083 171e23000 Level-0 table #5: 3295 bytes OK -2026/08/10-20:22:43.731312 171e23000 Delete type=0 #3 -2026/08/10-20:22:43.731345 171e23000 Delete type=3 #2 +2026/08/10-20:30:07.063712 1755c3000 Recovering log #3 +2026/08/10-20:30:07.063735 1755c3000 Level-0 table #5: started +2026/08/10-20:30:07.063831 1755c3000 Level-0 table #5: 3295 bytes OK +2026/08/10-20:30:07.064030 1755c3000 Delete type=0 #3 +2026/08/10-20:30:07.064057 1755c3000 Delete type=3 #2 diff --git a/packs/powers/LOG.old b/packs/powers/LOG.old index 6e34513..43bf68d 100644 --- a/packs/powers/LOG.old +++ b/packs/powers/LOG.old @@ -1 +1 @@ -2026/08/10-20:22:35.473073 1723af000 Delete type=3 #1 +2026/08/10-20:29:51.746762 172def000 Delete type=3 #1 diff --git a/packs/pregens/LOG b/packs/pregens/LOG index 5128329..cb46c36 100644 --- a/packs/pregens/LOG +++ b/packs/pregens/LOG @@ -1,5 +1,5 @@ -2026/08/10-20:22:43.723772 171e23000 Recovering log #3 -2026/08/10-20:22:43.723973 171e23000 Level-0 table #5: started -2026/08/10-20:22:43.724492 171e23000 Level-0 table #5: 54921 bytes OK -2026/08/10-20:22:43.724852 171e23000 Delete type=0 #3 -2026/08/10-20:22:43.724895 171e23000 Delete type=3 #2 +2026/08/10-20:30:07.056785 1755c3000 Recovering log #3 +2026/08/10-20:30:07.056996 1755c3000 Level-0 table #5: started +2026/08/10-20:30:07.057503 1755c3000 Level-0 table #5: 54921 bytes OK +2026/08/10-20:30:07.057829 1755c3000 Delete type=0 #3 +2026/08/10-20:30:07.057871 1755c3000 Delete type=3 #2 diff --git a/packs/pregens/LOG.old b/packs/pregens/LOG.old index 211c884..675d73c 100644 --- a/packs/pregens/LOG.old +++ b/packs/pregens/LOG.old @@ -1 +1 @@ -2026/08/10-20:22:35.462217 172bbb000 Delete type=3 #1 +2026/08/10-20:29:51.736946 172def000 Delete type=3 #1 diff --git a/packs/rules/000005.ldb b/packs/rules/000005.ldb index 0265ce48982719ad53f6a8564e1b0a250f9064d3..f65723cf6452c8801703ece4bbb16204cb9d74e0 100644 GIT binary patch delta 10809 zcmaKS349ZE+W&9b8JI~XzfPxVNK2@b+LTt)&=v{^wGi5J2rWke0qZeMeo2N-X2Q&* zC0?QKf}&D|h`Q*ycC{?1^#G68+p4(hg^KsPudY$MtL}@};)owmu{)FVClfaLG@rgYO% zw79>QwK6IHj_Y>`)pR8@)yf^7SCI{!hmM^>HBU=4wsdRFsg~9KM6)t=F{O`4dQ7qs zBpH&zngq|&A{qFsn3AqWrG#us8tEg36xS`u(9>E}vUExA(N)Dvz~dxY%fQ)MJlL(7 zx_u+bAaTXC;1U>*s!9>rFtQ3UC0XiJ;t5MSQ#PUm9tF3OHF&6{Y)UJZea7-wOo_mS zvZ`xwQ;8D$e%)G^64zuEZU9%bDJD!*R)0R%3`y;BBq9AY`|$zGQZLC!k%Vl>5f}#y zCaXk(<6|>>VMwN=Slyas$ckp3_}Y?HSP%PqNhPudbJv25RwYZSE=TpWCHdE~a5nP= zvZ!j97aX_8MwJMPX{L$4tg2hnbV-Nd8V#@Uq2_5Rzu9cbJt}EwhA*>n6#g2NlWtj2 z`z_x*%}Ou=yOd-~`KmJ$vSmM5F}V^njhca`70>5;^k~MlXf<4AS_Uje%R+^~b}S=u zw0WAVgl?WjNmW)9hLTaq>D}$?+v;Q$mT8V*FL8HeOI!Q8!KsK}mDbE~tuHHCL{7q} z8J>#W1Z9w-d&EjG@cMq}3#n(3FU*9{3QkOFCC`U42ffc7b4K%&bMI+j*jr zi2p2BiI}B#@To+`qy!%XpDdY*6{h{Sc}=N@B;>yKqWM}xHw+T7)J#ZPkXF*Da>M`)mwjmZ(}5g(DFBqbXbwF5~5*?6-Z zfBlN35fegY6_Ke&C5UG|8I%$_^SoDz=n&<>KnWWs7I&n^gm{2dAd;qsf9;l%5EYjH zHP)0f8(*T(iokMOk?;Qt+Vc`6EF~mmZhcLF_>t9tqv6}!{kqW$AKq-gjg}?m9y*bg z{ZAnhe#;FR6iUH>H8S_ybl@|@wzsVr{0!B;Mm_I_Ro9JZ?QX9u zMGW0E$;B&7DG5;kwZTpp2#=+j-f!0am72xJ6qST`lWUrTQc^dFlr~8$t*V(IHujrKfOpj@_J;~{g+(d9hU5kkGi5`*l#q6QK+EyE2U z8~k6Pe(E`RBbgALB&ysa^(Pca^?o^{P%Px}(S4|AEB3*2RT=Vp<5$QX)*=brIPxLI zu2_EN;D;1iyfxt;31=T)Cg~}ng{0L6q&E}`C^)*ty}(p@6*HowR3*Q|twTD=nZWxf z+WyJ#FR8x?Dg=?JA4$6PDUD&7K6-9?07)r5_rP^UCNz;aPbch~e0*hN@bBdv)cCl5K97+G^D z;-}aiUDvi1`d|SQx~j*IuVjpsjJtiaoK&>o`AEjZ>4y3ovqEz=Ft9F753>ETIXY#i z*$q*WHq*m#>M*}4P0WEDjb z$VPaA7m!a+M-m(Vg3zk5TZT5H<(~g?9ry)()7=HE9!Y2M*&P0kMT9#H)7Z}AYq@%9 zMMAgqxFM$!W)NTF;LWr_xH>;q1?7NjPAEN!g|FjjMOB`)kM+rg{vW)C(vt=--1s39 z!jT9u-}nQyCy&sgil~!phOCF$oKoe8cspm$qaOXF`8g7{sBSiq4>7+lf7 z2~c^7f^WqeUq`5IPNL|*e^7gVQ{Y}jv?wtGF_Z|OTxH5J5|p4K8LqM!fKhS4y^z#K zlDc~I+w#kc{7=_D_3v%HDCWto52i(LGhdDZ`Z@i1*S1Iwhzx8mea8I14 z7nA(!C^-5U4eFS5A#M!OsywV8{%^ErPl2=yhM5Kq6ck?Req<$z zF~ml4VP&8QMR#nU*}yzoM&*Y&7E1TVXDPH$e5$yrQ-)vz6gI8nn+rQP7t+fVaj(D~ z_GGv$$8SGgB}1i383b^Jxm$pZ>LKFAPASq0IBUwu)M(jIiw{T-5Tcm!N)6mQiQ9N& zh%H5)(;b~p7PG*WTK-mY0AS}~4j*>A4d6IRf+EB5jyy<&FEeJ(oH8g}SO% z{srUb1^hDGem}ldgyr?zhItrgMBKpp9}mAun--qPA(=Yt?gjjl;$pxBp}m72%JQbA zr?97ZpxX;5YAQXdmi>)G=pvS-9z7Q=f9{KkdltCZ4!QTm@7+KSVa*u>1;uY%xYN1h z)!KJxGbNfOo)0_%&=wVq^P2%=R$Y5&$tm*5cpk07UNzd z9qO@Jn3>SiYIOgW#y2T6t^7O>nug;7BKUC+n`-IApLqg{@w3kS{cJ>)@yTu!PM?bu zJSZS}N#7}Be0UJkuHoZI&MXyx5cev15yjdc$qG`;(39=E*^PQn<7E`G@SoYhb@%~6 zG>gm6oaC(xRwiYmm)cNMIj6GnqF|+xl;gOu%m;7#ASQHNQHH0pyrHXRMYxRb)73Qo zTX|c3s0q$6jY#Dj4S*Nkirw}eIYYzu$projdswj!cX%&vt z;ej$Crpj@XYgiWn0FCQL=EQ9-Lhv7Dzg$zk*ne&H=L^y7Be~{z{xz-BH_z^kE|@vH zk1RG?n^M#S`&5K3s61DR!qDM(qlEUsbTm0h;EN_(ova2`urjR>O9~s72?s%;*at1L z*`n~~+#S9O2Bga8=j0Ci{Mjx&X_Jj{LLRZ-_sEf6o4X|>6F!csjgYj&X3XQXMwa4A z%ovi$~c7B1WA?v{(wCKT_?#F;OwA{y0vUG zh$JB8)S1+O``{VlqKO$s;nIas`;kzceR&@6FUT3N{ZX{y+JE^MbrfThz=d7>-Q_=Scnj zb7){>bv%i7Yt*+W$d%gA>vH(dAw8npow-wZB&$O+AQe$&p5Pd+WBp9;)URG6l{pU*=Xi|?w`WlI(5qg^pWF+MK-LQ*0CWr8w-!k_&mwF1rLn8%Zf*2U zT*v)T?U~GqFS0fLQdEh>AR{zu|Dm9rsf#*Jcn-s?bb|5&Z6B>bib%0+w-y;Ku(?ZA zAAReG&!~A^mU0AtvMo%AfavI*KG2crXgo`-{A6m*$Tg_DT;%d!^KkDB_Ok$lb}{~L z)hk=*PJM{joKiM4QR3*ZF}n9?0Jl3(rhEoQ9iCKgR~3L+5HX>w6h8C{cdENTp@U|@a~-p7*T8mE$Y!`$&4B!c zAb?aObDH)GAgSdD79F+g#b(xDS`RV@q$!j?IM9#($es3>hvEE1!t@q^HGj9yu8L5b zrh6(J{vQOO6=`Gm0$j-Pz>A{Q(;fclMsa7CebCkan_03ow;&+@?@Z^)SiJE z;wilUd}MCD8A;;&A{Hvx$jiAdd|JWKv$;WBSunIbcMvbiBFq043#x$OSQD7=9eDIz z{0VkLNP`Vh`xPSj0uUvV|3Nf|2_2e@&vOCc>eld|Fs)|%r-Ub;U5@18UyfZzso*jY zbChAhu)mAQ05d?T^-sGO8U!Gms^D!1UUT_JHhzPbXX~frxafvCTDFr0%PQGK z8_b(@5aeekhSZU3CEc87II7;vRTVRtFVqj&ldQ9NA8l zZEL}aE)TVW2P-8(-R-u^fUHten7SHB0kB0@gGB75DgY>{+IlHLWUvdsT?0`={Z=vn z0D#3PrqN%BTDdDxMm~%5(d}CCYiJ(lZhvTPrf}R78|*5`@)=?VL2AeW7dM?*m%LO+ zf_Fx^Nquh@Tyh3-+mx9^k1s{cQXYzp;=1GSyOG-l9$6jSjc85hszXyK-qa(?b1i5C zQ|Ma&*8}dv*B^I>rGD_2hQhh+Nv~&5p|q) z4P7e0a_K25sL*tOB7A4DyUn)PpyJwgDU_;yAZn!g{M`kR@$s~PwHNjsrP{`w#B)Jqfr|u#jARw9<3VO?$IE;aq{V5< zw)4@hZ4*k*4@xyQR45VPueGbTp$-3_f~|@H`#dh>NyCr(D_gFd=u^N$vU!t#4K-!& zl@nJihv~pJsJ7UIx)785fIQ?sAMB?1Q>WJlxSCK0NVxmk5NhmfLv&ZEiYKzq>_n)c zvjYj8ByAbj?kdb_VQ*H>v%smI*^Or2OD(vdz$R9$GP$!G0!sefQr7otngword@AakikLk+{)ifmUxAKX zfuw3!rL;M>J~VP`Xct0F$9JKxccJnjhy96fxan?+u4~%ydEc8%qIe-$A=j+^PvWEc~Tm4f|X0&s@r9&=B38+6Q9b6SN=rJ5Xfu!8uTPvbNuZnFP-vtyA zG%$xzYw2}VaozhU;Sr1Rna;|01$Hseg1O?D2fjwpS3!UD#H~Aj9){QSQ#R>Z$c7&=`VOQO%%u zql^5${TO+OYe&=C9e8^Q8*QmCKOp9QX!AM*h(?v*bBo=%liFubb$$m0vSPS zXqy?t54dZKy(t4GMxyuCqM&D|V_ojz_LEitG~MK4p_c79juIeQ3<(+up*nZ&6Hp%sW-EUV&j0U6Yqk>0>9fb~+3 zs`t;6WWfvLZ>X1I!)f;kt6VG=LQBBF)}lj?h*t|By&&DV1)e_&0yJ+-A`j9;2`Q*_ z{<>+p3UD`TTxkCb?dV%BS0)1aN@m+(H8f9g7^@mE*1Uzndcbe{liER%>QJ9wMa z`d_CF5`G70vdqk78>UMiZ}8gu6IkcbbHV)gf4Y4hBv5;BU>p9LqZ0%_z`0K-g(Zdc zb|LT98fOMi^;m(t)c{eroMg;>PpJOfTopRPnrFx>6E1md~#WwaunKVu0hZ*!Ak*aLa7Y&lPNwPZifW?S7s?fX@(rfnd8# zL^%tb$aG3+JjaQ`wO$lqW)=Si#c?wSvgxPp1=Y!nj^^Fa1n4J5^@UvS?ZzqDe9YG9 zpne|_-*Q0ohh1m;FC9D9a3NBt75)`&z>bs|95?{Ws)K-_dolwn1N)Hd$2>55lUn5k zHwaoKQA!#L4M{=mpCV66`Bhr#r&bNDS`3^zLR3ix2?Kt;UA=;o$w*8r%L7YE`-^BR z)Fg<%0VXXKHqx^Pf-%^@a!OtG^ zUt2bM$#-f;5i|yePdI~53%?c9NX9uPJTxx8u1zY95CQk54`~@0bKe@ zalhlm3r4Ge>bP#64F&|rFkn|;e}|+qM{{_eOMC$5*8>+DIKIi9J3gZ}kUs*07=9F2 zak$s%Q$fSqmJ;<3&`T-uu^_(a!biDWN7Lls2RyslNFP#c!9xr^>JJRR4~^b#EiFFH zQy;*-{|*~PC_cIhf0NtYRJCH0lU||?ym)9ocjwr2zYl4+Llke|la({1Flfh$=0iOrBT3~PqP3s!o!&L#D?I9TufRcEQz(R(I*O&OW<>!Dp zHBKu>R_B<=Y@yD_UpTo7P_tO=gmYTHcp^V(%@q3-e2$Zc9}y7d5H~rLyts3<6D%W{ zY@rpye~<=7_}Z?k#FbCvUYL1OJp|Az6W%pYvXCa3j_<=?LjME|S^0bJ*1q$R8{8zz zAb5@ozc+4Ms=2aRQZ=t6Q#wFL(|YixJx(kaiJv;S2Lfj;SjUKWm9VS(p%EbDx@Xm7 zS9!b3#PpU0197T>PHVVFplZ;D zWcAD<)Q*vWqi){zNlE9(Z@{LhYpf4YFH-CMZ&3RYDcuzC^I$j<&(k~$B-8(UW`TUQ z=hyD7?bLs6s7Awu)Q!b^epSfZ-ofyD)clHgNiI73^ny@X?v~l&dVCKJ0IuJbbJ>_OVOc)xLd6F#Dl^YO{V7J97ZwlkMGG{e_F*k z8{GD8k(7*+laRz6q|>H#2rm?VbKdXgP-0 zP06jC>uI1N(tqo~-xs?GS6u$1Af#HrEyNuE_Cz^~rZysK_};OLo9G)yq+t+17rdI&y#>*o5T>0PQrCg zI;tqFJE{YANAUX#NQ$KHzHk zQ!$!8xC46Z>vuryiQywYykCf2T%c?`=RXR>%1JGkfh9S38M^Z+yXog|ZF#()w0}Vn z>zP}Oy6`m>W2^wxFQJI{IxEif4SlfiWj_mYx#MndVfMPqfwk*~j4v4~X*{#6<2H9k z78GYXIoJTQrlE5_VwdS!dB)NA%YwDb%h~qL*67?_S&%`U@XrEIH;~f0IhPbt_^)jB zT1?fG2Npa@@wN)Y`joMlc;gg2r+iEm100It_ncHm5ZF$ncMeEsRf&p(#W#!MZBt-} zW{cD}BaaMqW_j32;yLQ`Jm`m5!%>MfB^8edpvEQfbTRj!0GZP<;_YmovdgpM^WaI3g1cMN=VeG%fmwERvzp?o zaH$XP@c8T>yy!sS+8->>IzwwG0}}jhG92zx`lz)Ky+esjze0)OjF|VAH&x<*+moD3 zWEPw)Tu|k|!*{~hs#N4@{}0VCtra(x^7_fPtu?#$1kJZ<=l`3n<@s%K?vs{4Xmc%| zfYJZ2S@y)z4-z?SQ}>r#K;0KsB>vS0n`!sK!r(8N+}QF=w-2YcVBM-c=%R@B!?= zT19kfBJ~wiL@DT%mlkc76Ef8qxZ@WTP17T|5knVs)@Z3_gN zE_J!TFbfJ18OWV7;iOa6{k-bX$AnhjKh@RHv7y%SF6JvIl-20UpM=%KoO_Xws|uRvE-Qu8m%B^K3JR)Nq0**gB3 z34ecn&4c$&^!?wj)^m3*3QW5GAeDk|#+#k!i;(GS|bN(^-1Y}2P zz4w9-PemM4Su9-r{O_ngIPIrRgV(w6x(Z&8!|OA6odo^XiSU>$=JzEn3=Rj zgiu!0x;#6&$gb;JwJ0bkvc6rl%T~Qt-CcLtRoqpnYd>|p;`^~GaR1@%z2D9EO_ENM z({uih-{XJVj%v&Q*;Zns?R0I_|ema1kyl7*Ze!;IHTG9s!C|R}MSih7##+Y)nSGa&8^!1daiu{OGy`ikFO6Q^}U6)jo z(*-kVH-1NDKxwopJ$2(eMB7~b{CqNELfHQdbTnqs^@h3V6j)cC{Y zRpB}Csi8*$^{>6}OB<$?2-Fjek-ku%zOJe&6wvxrNpJcf7gdg~KkuZXf;qkbrRg@; zHqQ5_VB@bQlSFRa$GH&UGasWlqaP0};Z|i*vSe}*-NcKi3t#3oewpiOkP?k+G~r1U zlim?p5hpEW`r!~~Iwwd{HY$%ZF}cTFRYey-9!y=3gCAAANcdXr5xyI{ee5PAkKR$0 zlypN=!ws`wsfKM;XuZ%y3M%nmBqwj1jUt1M{CBVv!JlZ%l*_7^ib^8aBP+yIm!#{O ze*2H8KJuwep;ChQ(LGGRrYj@ABfHdr>Eku>hm@okgU=L0&=XppWY`)!rpD=#F;390 zAdQ$HMfr$GauN3t+f>F75)yA?ARi$jg?lLBEhZr-N^oW=vdA-9J!+#-FkuG#)qFPE3 zaUI1!%Xc8L#gRQsT<9AQA&LLvp&!uN;BiV*r9vD8cbe;1x&Fv0Dy^j^wm`U6A=LcX3!bE;3W_|i8_D%uG(U;zN$IdzZ^-nTS!e0HsU=rrRlw85t<8isohdkNExkLHU{AMZ9FoEyIpY!l7$!BZMSo# zo(^*zDI+fUBQ$kcQZUBDRR*W&qO1yfx=Yo^rt`liWz+T`W5BPq2ky%w zc$eMT=@T0}=uGWgqItDF>;=D(1ju z{4R&vin8S-lEzM3`&r(}uNvRxfy#sM4dhwRv4uEtZtxVt2{9di#0a-q|6utRPZFvN zg1B_&hsgPW^M;|*2+giQ;f;iAg(SwLA^#*{aM#6(D}D1hC^uCcS#aSP+IbA2S$n)_ z)?m7%%E4Gm^Me^=V26V=!U38>93H3OVE#PBP3(hg4bzx&oiFniQS56J>Su#aB;lar z$QTCz!YygzR0+R;hba%&AD5$Xd;^1ok+bX!21W4-r%UVML=Eqz&VNcQpfiLW%QP2F za|UEzG$!nx?vxnINalDEQUBW2-X$1%@*r_JN{=Fs#P#S};$N#@-$Ax(!xHRl#DP?n zqsfRqdbs3gdF&1+{)~zYm6}2d0vqDGHJa**#-VjoPB6RFXk5^Rs0lb1)g^BihN|$+ zaCx7keF;HL2}&3bxC>@_GW~H4kPsJQT;s+f_DR>luaq?5Du%RcDO0MSbA*X$oWQd7 zij5Py`2rUJCl|*z+q1X(amYRIxia4Fs%>o65_}iF+s-u1ir0FV=ke!Vx@4yGk*!$C zW1^ZWmetz%Pmt^%b>qKMkWx93!R=0VKgD(Gf@(nH%k11dpo}Jo5L|23gr;FT7QW_3 zLeTw!F6od?Rh#%N|DwwTFjxJLVPY-O!}Mr6H*mL4FgaE0QrUwPX{KwA=HQ#$xYgmw zLQzV=e|AF0^Us#_*(>-)f>?LoWVAYC`))ijaX%Yzc;Z45GBeyo7X*f=f*B~nK5a(} zXxFaBb;l>8HQs|blFM{UrunlCB>xiLU?)E0x8h@LFrP|D!d-ToOB9Uw{K2=8sh3em z{p6r+?2}_?@nFf`1t@rw({;H|f|3z}Pg6Q);)iI`40T9hB;Zzh?=p1kxuG~kYASvw zpX}j??WjLE11ZCMP$F0uDAdz+E-)uCH+5BvlP z>@#kw)mzj|ZPZf!_uK>b;5kkTYIWdE`p<-uNotxhe8MG4QCalPWZZj8Tpr%(iVGr; zWH&qNASJQ&cARlw+HF1Po$e(DPy8LWx7mSfJOg)o7v|v`JcFawN8Wik!YQkCN?;Pc z;Ix)bS&|{mIQ!8Ql(f;5A(`yV{LyzxyCtZ_?v$*EqZPyq7gU-evFAOg-sT!B!q+$% z1L_pNi%BKTUzWPP)eqfsU-wAc36oz{s!xpm4{cJg9iFxS!pMJMmAc*e%GwuR>0H}|u}Xzt;u z7RKDkTW4*+)VUSeJ4aVsx?^u_o18gx1Cug92tDZGj9yt$2B%X{Qh0`=g>wmgnk>=* zU$>(5hr84*Z=;UUbIV$he}SEpRsMa*X*}`@LBgrDBv$OMFt^4OTJ9xEebCEl_NaOG zv8Ar0q$L$rvM$eL+byL0GH$ylItf{ z3s+lJOFS9da)PtskJR23hOUwzn_S{%a6s+@iI`>W^ zt$!{l&%9;Bo1DAO%HJSy*QtT4@Y9s%5+0bilkpzO1Hga4G4T?|^#GY`{YHJ*OM0Ry z$d@?qEoo}FlxaQH0Jy>_ni>N<1vb-kb_K;GG@$MNPy*7Z03r%XpENQ)7{U7~s-`iL z_!k+k!RsAvD%sdM{8zk;VqlH9_i@@9URs>@7{mU~NyQ=N5hR@XsrAaz3XE@K;2)0s z23J$~I=e-*=G)$4@b{Ee*jiNinS<)oQ)6-#R?;bfyrO|h>#h<_k~zaM8X zijA(uq;*Ye>8kB^%;k}yGX4` zZ^t7Hl!rk4(U+CgnwFrOkr^~ll)W?0I^7z~jK1juVPQZE1fQh?H~_^pypp}s(Rvp^ zye{%L`MN=;NqtgqZ!6gVoeW|?N^;#&8VG=6d-Jk@#E!81P2=?xl>aZQYp?d^h{0=XgWAZ49DNpiaF z^w6E|6Q?U5{>y205>?r8!S6#wO7!WtO$rHR5$;-wO8Pg+!pxJcLqmfxAG9oalPMKzc|}2f}MGIOTP8D=s4-- zU$Qj``@Ki=ceP}7k3#?!{j@u?I6CAPw(1jKB6GnJvML0f(3T-g6$% z1971nla%*k7MEbuWP6iXJFGE+DyelV+2T%+RU&{PE4xd+EkKcNMZ|m}gL*LXTbtXa zT@}mErbtQ(_gHY$7EcKQ)E@m1_rL8S=#C{!g-XUjF%?j5^G&F1>Oci5Spl%n8!9l_fwsK_+i zAbX#kl#GGTU9u6EjKFM~e+SpnpndWAd>1G&B|SEht#Ovg!{21=fKopUKMS4s)B-%o z=WPcU3>4&;dS*(N)!CDt$kmLCBQS`-GxZ-9&`J99i*VJ?-x$o>_3x^60kXtp z_FbxEpHIMxsS-+1WBwEis^strFS8~N2r`G-`KqgCU%@Ajd)g#XP9^rfnM+nyw=YE0 z3QhgwzCQ2dbvJvdmg`KRXDEZvoOXC>^4{!3dS(62NyMnPY`{TOv8Sl^A9GPNzCTmA z>i~PYFq_DHjsl_@1Gk7BG|?6UjS%gv=L}7e#gYB^l|1&nLO5D9kNCFjgGicz2uR*w zq4)EtkTHB`F=cQHe$z>TV_-Lz)U@QVmtiDC7TC+FjUpui*co7SPjJJ5J~aW5+AwC}wZ zA$4f`q>%`vgSeT-x~>%x8BS(jo(@(Ga9GC*g{08}e2)uk$~-p{RU{$Oi$wkq(g_>h zZzm`gyS*=Ce5%O*3kD!yco9mD7P?ZPfBNu~`Nd&wiKcxl;93GM!MuQ&; zF8qH(8WlP-6!5-=tsQHExsL>KwF6mOeZ`LZkC$>M%d&FtQ_G2Y>&rD|CqMFKh)k$i z)}yHeG&>BZR*lku#@#tE=ST^rtf`SL#MHyPb2?V`NqRptR6F zs+0h?wu#*4S3x?dAbTXSB3mTS)16^NI~l_iywkx=K)t_o&lN5?lkYA84Foi(PGz zH4U?z?8}g2l>;TL#dIN&0IBfaj@vGo-|P^FOA0a=nRwQ20t*=&OgVH;toztTg8n>h zD`V;#W+l5vZML$)pQYw|)?_8MQIJQqtz1{YFsmgYnvS)6weCF|Q^obh_G&p4EPr7J zYM+5@KYzXE!cS4l2ER_Ut@aw+X z95lN`q55VZ|3Zgt%dtPZnt`Xxy-{S1PV+chj#7#g8_(PMC_~P+#-~-S#FW@r<$u&^UBmh8bKyJy3x>&AJGr?t z@jOX@Pn6!EbN6x#KNuCz7IP0N5fmvzI0G47rVC{9dq z>D;204dF^eu2ku3i90>@Tvllg-hx8jdG_HKK$NR66iKOyoREn57<>`L*>{&xC1du1*NAV=c(S{yJZrsTi9BD5)H_#Nw zT{c)n9H&VpQ$a-dDmA44|bLqdYN_cgkEAqd--g0gVPI+T5u^R4xy@p4|^TypD z5O<)8Nm;ubT|`{GXv^`SA4*UKxqTKQHxjl=&&7*7rae@6YZXGGyNWq6_lM%_d$pj- zxAtN=qRD{Ur98I%m#*xBv*5ZKu6=Ml50?!tg1VmCe|#TN{r*1U2J7=pMMIly7PFc9 EZ>}=7g8%>k diff --git a/packs/rules/000006.log b/packs/rules/000006.log index 4513488e00a674fd5253336297842a3d15fa93f6..c70cb3c3cfda98ed50ca2a58ac8dc37da1e4a5a2 100644 GIT binary patch delta 5665 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 diff --git a/packs/rules/LOG b/packs/rules/LOG index 768a533..ed73d08 100644 --- a/packs/rules/LOG +++ b/packs/rules/LOG @@ -1,5 +1,5 @@ -2026/08/10-20:22:43.737261 172e3b000 Recovering log #3 -2026/08/10-20:22:43.737309 172e3b000 Level-0 table #5: started -2026/08/10-20:22:43.737540 172e3b000 Level-0 table #5: 18581 bytes OK -2026/08/10-20:22:43.737891 172e3b000 Delete type=0 #3 -2026/08/10-20:22:43.737944 172e3b000 Delete type=3 #2 +2026/08/10-20:30:07.070149 174db7000 Recovering log #3 +2026/08/10-20:30:07.070202 174db7000 Level-0 table #5: started +2026/08/10-20:30:07.070462 174db7000 Level-0 table #5: 23316 bytes OK +2026/08/10-20:30:07.070725 174db7000 Delete type=0 #3 +2026/08/10-20:30:07.070754 174db7000 Delete type=3 #2 diff --git a/packs/rules/LOG.old b/packs/rules/LOG.old index 8325518..292c20b 100644 --- a/packs/rules/LOG.old +++ b/packs/rules/LOG.old @@ -1 +1 @@ -2026/08/10-20:22:35.476400 173bd3000 Delete type=3 #1 +2026/08/10-20:29:51.751001 1735fb000 Delete type=3 #1 diff --git a/packs/rules/MANIFEST-000004 b/packs/rules/MANIFEST-000004 index 7341a77111247755d71d94a57590f786ce5337ec..e1e6f6a5daf4a1df3ab04f4db38f0e59f354bbd7 100644 GIT binary patch delta 30 mcmbQtIGJ&RvPcj2<2RWMj7)5t49x5-T LANG[key] ?? key; + +// ROLES lives in ringbrp.mjs, which cannot be imported outside Foundry — it reaches +// for globals on load. Read the literal out of the source, the way check-kits does, +// so the postings page is generated from the same table the game uses. +const ROLES = eval("(" + (await readFile(new URL("../ringbrp.mjs", import.meta.url), "utf8")) + .match(/export const ROLES = (\{[\s\S]*?\n\});/)[1] + ")"); const pc = n => `${n > 0 ? "+" : ""}${n}%`; /* ---------- small builders so the tables below stay readable ---------- */ @@ -181,6 +189,10 @@ they get harder, and you may not mix them: having chosen to dodge, you dodge.

[`${n + 1}${["st","nd","rd","th"][Math.min(n,3)]}`, defencePenaltyFor(n) ? `${defencePenaltyFor(n)}%` : "no penalty"]))} +

Dodge starts at DEX × 2 and training raises it from there — +a DEX 13 agent who has never been taught to get out of the way still dodges on +${skillBaseFrom("dex*2", { dex: { value: 13 } })}%. Every posting can defend itself; +some are simply much better at it.

Dodge uses the skill of that name and avoids the blow. Parry uses the weapon in your hand and stops it. Standing in front of three people is therefore possible, and stupid.

@@ -258,6 +270,9 @@ a circular arrives addressed to them; your pension record shows service you did colleagues are certain you chaired a meeting you did not attend; and at the end, Registry holds one file where there were two, and yours is the copy.

+${table(["Times you pushed it past its Trust", "What has happened to your file"], + MERGE_STAGES.map((k, i) => [String(i), L(k)]))} +

Shooting and hitting

${table(["Range", "Modifier"], RANGE_LADDER.map(r => [L(`RINGBRP.Range.${r.id}`) === `RINGBRP.Range.${r.id}` ? r.id : L(`RINGBRP.Range.${r.id}`), @@ -401,6 +416,19 @@ ${table(["Coherence at the time", "What can arrive"], [

Which is the trap the setting has been building the whole time: the agents most likely to come back with an Art are the ones least able to afford using it.

` }, +{ name: "5b · The postings", content: ` +

The postings

+

Twenty-five of them. An agency this old has never got round to abolishing anything, +so the register still carries a Night Warden and an Antiquities Officer alongside the +Signals and Disposal Officers. Each posting has a key characteristic, the skills it +trains, the talents it leans on, and a loadout containing at least one thing issued to +no other posting.

+${table(["Posting", "Key", "What it is"], + Object.values(ROLES).map(r => [`${r.label}`, r.stat.toUpperCase(), r.blurb ?? ""]))} +

None of this is a class. A posting is what the department has you down as, and the +skills follow from the job rather than the other way round.

+` }, + { name: "6 · A case", content: `

One case is one session. It has three tracks, and they are the pressure.

    @@ -433,6 +461,22 @@ is the four coherence tracks going down.

    ` },

    STR + SIZ, added to melee and thrown damage.

    ${table(["STR + SIZ", "Modifier"], damageLadder)} +

    Carrying it all

    +

    Free carry is STR + SIZ in kilograms. Past that you are encumbered, and it costs +you ${pc(encumbrancePenaltyFor(1, "phys"))} per step on +${ENCUMBERED_CATEGORIES.length} skill categories — the physical ones — and nothing at +all on the rest. Thinking is not heavier when your pack is.

    +${table(["Category", "Encumbered?"], + ["phys", "melee", "ranged", "manip", "mental", "social"].map(c => + [c, ENCUMBERED_CATEGORIES.includes(c) ? `yes, ${pc(encumbrancePenaltyFor(1, c))} a step` : "no"]))} + +

    Bleeding

    +

    A wound that bleeds takes it off you every round until somebody stops it, and what +stops it depends on how bad it is.

    +${table(["Wound", "Per round", "Stopped by"], + Object.entries(BLEED).map(([k, v]) => [k, String(v.perRound), + v.stop.map(x => x.difficulty ? `${x.family} (${x.difficulty})` : x.family).join(", ")]))} +

    Circumstance

    ${table(["Situation", "Modifier"], CIRCUMSTANCE.map(c => [L(c.label).replace(/\s*\([^)]*\)/, ""), pc(c.mod)]))}

    Capped at ±40% no matter how many apply.