diff --git a/README.md b/README.md index 472ce6d..956f839 100644 --- a/README.md +++ b/README.md @@ -180,9 +180,9 @@ The build runs all five guards before it writes anything: ``` -check-rules: OK — 92 rules, 21 files scanned, 3 aliases + 45 constant sets checked, 291 formulas verified +check-rules: OK — 96 rules, 21 files scanned, 3 aliases + 46 constant sets checked, 306 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, 981 keys, no leaf/branch collisions -check-behaviour: OK — 59 behavioural tests +check-lang: OK — en.json, 995 keys, no leaf/branch collisions +check-behaviour: OK — 67 behavioural tests ``` diff --git a/lang/en.json b/lang/en.json index c289746..8907e2a 100644 --- a/lang/en.json +++ b/lang/en.json @@ -581,6 +581,8 @@ "RINGBRP.Heal.Fumbled": "First Aid fumbled — the patient loses a further hit point.", "RINGBRP.Exp.Title": "End of case — improvement", "RINGBRP.Exp.NoGain": "no gain", + "RINGBRP.Exp.Capped": "held at its ceiling", + "RINGBRP.Exp.AtCeiling": "already as far as training takes it", "RINGBRP.Exp.NoTicks": "No skill earned a tick this case.", "RINGBRP.Flavour.Gear": "{item}: +{mod}%", "RINGBRP.Target.Title": "Target", @@ -979,5 +981,17 @@ "RINGBRP.Panic.SceneEnd": "Scene over", "RINGBRP.Panic.SceneEndNote": "Panic clears when the scene does. Coherence does not.", "RINGBRP.Party.Title": "The team, right now", - "RINGBRP.Party.Who": "Agent" + "RINGBRP.Party.Who": "Agent", + "RINGBRP.Dev.Title": "Development", + "RINGBRP.Dev.SettingName": "Development phase open", + "RINGBRP.Dev.SettingHint": "While open, every agent's sheet offers a Development roll for the skills that failed them this case.", + "RINGBRP.Dev.Opened": "The case is closed. Roll for the skills that beat you.", + "RINGBRP.Dev.Closed": "The development phase is closed.", + "RINGBRP.Dev.Marked": "skills marked", + "RINGBRP.Dev.Toggle": "Development phase", + "RINGBRP.Dev.PressIt": "Each agent presses Development on their own sheet.", + "RINGBRP.Dev.GMOnly": "Only the GM can open the development phase.", + "RINGBRP.Dev.Button": "Development", + "RINGBRP.Dev.NotOpen": "The GM has not opened the development phase.", + "RINGBRP.Dev.Tooltip": "Roll to improve the skills that failed you this case. A skill improves if the roll is ANOTHER failure." } diff --git a/packs/armour/LOG b/packs/armour/LOG index c67ae16..3669d22 100644 --- a/packs/armour/LOG +++ b/packs/armour/LOG @@ -1,5 +1,5 @@ -2026/08/18-22:37:32.799186 176b97000 Recovering log #3 -2026/08/18-22:37:32.799323 176b97000 Level-0 table #5: started -2026/08/18-22:37:32.799504 176b97000 Level-0 table #5: 4591 bytes OK -2026/08/18-22:37:32.799868 176b97000 Delete type=0 #3 -2026/08/18-22:37:32.799916 176b97000 Delete type=3 #2 +2026/08/18-23:21:42.522827 16edc3000 Recovering log #3 +2026/08/18-23:21:42.522857 16edc3000 Level-0 table #5: started +2026/08/18-23:21:42.523016 16edc3000 Level-0 table #5: 4591 bytes OK +2026/08/18-23:21:42.523288 16edc3000 Delete type=0 #3 +2026/08/18-23:21:42.523332 16edc3000 Delete type=3 #2 diff --git a/packs/armour/LOG.old b/packs/armour/LOG.old index 6aab54a..f1db83c 100644 --- a/packs/armour/LOG.old +++ b/packs/armour/LOG.old @@ -1 +1 @@ -2026/08/18-22:37:15.356757 172877000 Delete type=3 #1 +2026/08/18-23:21:17.000759 16ec7f000 Delete type=3 #1 diff --git a/packs/expedition/LOG b/packs/expedition/LOG index 6f43f8f..331cc1f 100644 --- a/packs/expedition/LOG +++ b/packs/expedition/LOG @@ -1,5 +1,5 @@ -2026/08/18-22:37:32.827220 176b97000 Recovering log #3 -2026/08/18-22:37:32.827303 176b97000 Level-0 table #5: started -2026/08/18-22:37:32.827422 176b97000 Level-0 table #5: 4129 bytes OK -2026/08/18-22:37:32.827654 176b97000 Delete type=0 #3 -2026/08/18-22:37:32.827715 176b97000 Delete type=3 #2 +2026/08/18-23:21:42.542861 1705e7000 Recovering log #3 +2026/08/18-23:21:42.542881 1705e7000 Level-0 table #5: started +2026/08/18-23:21:42.543000 1705e7000 Level-0 table #5: 4129 bytes OK +2026/08/18-23:21:42.543233 1705e7000 Delete type=0 #3 +2026/08/18-23:21:42.543262 1705e7000 Delete type=3 #2 diff --git a/packs/expedition/LOG.old b/packs/expedition/LOG.old index e962a5f..c6c19fb 100644 --- a/packs/expedition/LOG.old +++ b/packs/expedition/LOG.old @@ -1 +1 @@ -2026/08/18-22:37:15.433657 17388f000 Delete type=3 #1 +2026/08/18-23:21:17.085840 1704a3000 Delete type=3 #1 diff --git a/packs/gear/LOG b/packs/gear/LOG index 52c8408..3289fc0 100644 --- a/packs/gear/LOG +++ b/packs/gear/LOG @@ -1,5 +1,5 @@ -2026/08/18-22:37:32.801021 17638b000 Recovering log #3 -2026/08/18-22:37:32.801454 17638b000 Level-0 table #5: started -2026/08/18-22:37:32.801772 17638b000 Level-0 table #5: 31614 bytes OK -2026/08/18-22:37:32.802069 17638b000 Delete type=0 #3 -2026/08/18-22:37:32.802111 17638b000 Delete type=3 #2 +2026/08/18-23:21:42.523809 16edc3000 Recovering log #3 +2026/08/18-23:21:42.523911 16edc3000 Level-0 table #5: started +2026/08/18-23:21:42.524193 16edc3000 Level-0 table #5: 31614 bytes OK +2026/08/18-23:21:42.524392 16edc3000 Delete type=0 #3 +2026/08/18-23:21:42.524442 16edc3000 Delete type=3 #2 diff --git a/packs/gear/LOG.old b/packs/gear/LOG.old index 7584902..4e62250 100644 --- a/packs/gear/LOG.old +++ b/packs/gear/LOG.old @@ -1 +1 @@ -2026/08/18-22:37:15.358422 17409b000 Delete type=3 #1 +2026/08/18-23:21:17.002659 1704a3000 Delete type=3 #1 diff --git a/packs/lastadmission/LOG b/packs/lastadmission/LOG index 7bdf5d6..92ad3e4 100644 --- a/packs/lastadmission/LOG +++ b/packs/lastadmission/LOG @@ -1,5 +1,5 @@ -2026/08/18-22:37:32.818774 176b97000 Recovering log #3 -2026/08/18-22:37:32.819665 176b97000 Level-0 table #5: started -2026/08/18-22:37:32.820075 176b97000 Level-0 table #5: 46857 bytes OK -2026/08/18-22:37:32.820335 176b97000 Delete type=0 #3 -2026/08/18-22:37:32.820381 176b97000 Delete type=3 #2 +2026/08/18-23:21:42.537220 1705e7000 Recovering log #3 +2026/08/18-23:21:42.537462 1705e7000 Level-0 table #5: started +2026/08/18-23:21:42.537820 1705e7000 Level-0 table #5: 46857 bytes OK +2026/08/18-23:21:42.538102 1705e7000 Delete type=0 #3 +2026/08/18-23:21:42.538144 1705e7000 Delete type=3 #2 diff --git a/packs/lastadmission/LOG.old b/packs/lastadmission/LOG.old index c5694a1..5549886 100644 --- a/packs/lastadmission/LOG.old +++ b/packs/lastadmission/LOG.old @@ -1 +1 @@ -2026/08/18-22:37:15.417310 172877000 Delete type=3 #1 +2026/08/18-23:21:17.066464 16ec7f000 Delete type=3 #1 diff --git a/packs/npcs/LOG b/packs/npcs/LOG index e85dc95..f37bb6d 100644 --- a/packs/npcs/LOG +++ b/packs/npcs/LOG @@ -1,5 +1,5 @@ -2026/08/18-22:37:32.784037 17638b000 Recovering log #3 -2026/08/18-22:37:32.786085 17638b000 Level-0 table #5: started -2026/08/18-22:37:32.787900 17638b000 Level-0 table #5: 234672 bytes OK -2026/08/18-22:37:32.788307 17638b000 Delete type=0 #3 -2026/08/18-22:37:32.788379 17638b000 Delete type=3 #2 +2026/08/18-23:21:42.511991 16edc3000 Recovering log #3 +2026/08/18-23:21:42.512828 16edc3000 Level-0 table #5: started +2026/08/18-23:21:42.514313 16edc3000 Level-0 table #5: 234672 bytes OK +2026/08/18-23:21:42.514681 16edc3000 Delete type=0 #3 +2026/08/18-23:21:42.514785 16edc3000 Delete type=3 #2 diff --git a/packs/npcs/LOG.old b/packs/npcs/LOG.old index e9a811c..65c1374 100644 --- a/packs/npcs/LOG.old +++ b/packs/npcs/LOG.old @@ -1 +1 @@ -2026/08/18-22:37:15.394128 172877000 Delete type=3 #1 +2026/08/18-23:21:17.040817 1704a3000 Delete type=3 #1 diff --git a/packs/powers/LOG b/packs/powers/LOG index 601fd23..3a1ae77 100644 --- a/packs/powers/LOG +++ b/packs/powers/LOG @@ -1,5 +1,5 @@ -2026/08/18-22:37:32.795533 176b97000 Recovering log #3 -2026/08/18-22:37:32.795934 176b97000 Level-0 table #5: started -2026/08/18-22:37:32.796065 176b97000 Level-0 table #5: 3295 bytes OK -2026/08/18-22:37:32.796355 176b97000 Delete type=0 #3 -2026/08/18-22:37:32.796392 176b97000 Delete type=3 #2 +2026/08/18-23:21:42.520180 16edc3000 Recovering log #3 +2026/08/18-23:21:42.520206 16edc3000 Level-0 table #5: started +2026/08/18-23:21:42.520334 16edc3000 Level-0 table #5: 3295 bytes OK +2026/08/18-23:21:42.520647 16edc3000 Delete type=0 #3 +2026/08/18-23:21:42.520681 16edc3000 Delete type=3 #2 diff --git a/packs/powers/LOG.old b/packs/powers/LOG.old index a2f69d8..23535aa 100644 --- a/packs/powers/LOG.old +++ b/packs/powers/LOG.old @@ -1 +1 @@ -2026/08/18-22:37:15.428065 173083000 Delete type=3 #1 +2026/08/18-23:21:17.079222 16f48b000 Delete type=3 #1 diff --git a/packs/pregens/LOG b/packs/pregens/LOG index 6d74ddc..e268a49 100644 --- a/packs/pregens/LOG +++ b/packs/pregens/LOG @@ -1,5 +1,5 @@ -2026/08/18-22:37:32.768723 176b97000 Recovering log #3 -2026/08/18-22:37:32.772081 176b97000 Level-0 table #5: started -2026/08/18-22:37:32.777725 176b97000 Level-0 table #5: 560581 bytes OK -2026/08/18-22:37:32.778401 176b97000 Delete type=0 #3 -2026/08/18-22:37:32.778494 176b97000 Delete type=3 #2 +2026/08/18-23:21:42.501500 16edc3000 Recovering log #3 +2026/08/18-23:21:42.503444 16edc3000 Level-0 table #5: started +2026/08/18-23:21:42.506554 16edc3000 Level-0 table #5: 560581 bytes OK +2026/08/18-23:21:42.506965 16edc3000 Delete type=0 #3 +2026/08/18-23:21:42.507130 16edc3000 Delete type=3 #2 diff --git a/packs/pregens/LOG.old b/packs/pregens/LOG.old index 5de7279..8b53a27 100644 --- a/packs/pregens/LOG.old +++ b/packs/pregens/LOG.old @@ -1 +1 @@ -2026/08/18-22:37:15.379031 173083000 Delete type=3 #1 +2026/08/18-23:21:17.025927 16fc97000 Delete type=3 #1 diff --git a/packs/primer/000005.ldb b/packs/primer/000005.ldb index 6abe3a0..75e5695 100644 Binary files a/packs/primer/000005.ldb and b/packs/primer/000005.ldb differ diff --git a/packs/primer/000006.log b/packs/primer/000006.log index 554a3a3..bb91941 100644 Binary files a/packs/primer/000006.log and b/packs/primer/000006.log differ diff --git a/packs/primer/LOG b/packs/primer/LOG index b5f686c..f6a0730 100644 --- a/packs/primer/LOG +++ b/packs/primer/LOG @@ -1,5 +1,5 @@ -2026/08/18-22:37:32.804709 175b7f000 Recovering log #3 -2026/08/18-22:37:32.804956 175b7f000 Level-0 table #5: started -2026/08/18-22:37:32.805208 175b7f000 Level-0 table #5: 23087 bytes OK -2026/08/18-22:37:32.805486 175b7f000 Delete type=0 #3 -2026/08/18-22:37:32.805525 175b7f000 Delete type=3 #2 +2026/08/18-23:21:42.526413 16edc3000 Recovering log #3 +2026/08/18-23:21:42.526467 16edc3000 Level-0 table #5: started +2026/08/18-23:21:42.526727 16edc3000 Level-0 table #5: 24730 bytes OK +2026/08/18-23:21:42.526971 16edc3000 Delete type=0 #3 +2026/08/18-23:21:42.526999 16edc3000 Delete type=3 #2 diff --git a/packs/primer/LOG.old b/packs/primer/LOG.old index eed8a7c..5835654 100644 --- a/packs/primer/LOG.old +++ b/packs/primer/LOG.old @@ -1 +1 @@ -2026/08/18-22:37:15.424767 17409b000 Delete type=3 #1 +2026/08/18-23:21:17.075510 16fc97000 Delete type=3 #1 diff --git a/packs/primer/MANIFEST-000004 b/packs/primer/MANIFEST-000004 index 757bfe9..7f1100d 100644 Binary files a/packs/primer/MANIFEST-000004 and b/packs/primer/MANIFEST-000004 differ diff --git a/packs/prologue/LOG b/packs/prologue/LOG index 741965e..412ad02 100644 --- a/packs/prologue/LOG +++ b/packs/prologue/LOG @@ -1,5 +1,5 @@ -2026/08/18-22:37:32.821353 176b97000 Recovering log #3 -2026/08/18-22:37:32.821969 176b97000 Level-0 table #5: started -2026/08/18-22:37:32.822328 176b97000 Level-0 table #5: 44887 bytes OK -2026/08/18-22:37:32.822647 176b97000 Delete type=0 #3 -2026/08/18-22:37:32.822686 176b97000 Delete type=3 #2 +2026/08/18-23:21:42.538839 16f5cf000 Recovering log #3 +2026/08/18-23:21:42.539012 16f5cf000 Level-0 table #5: started +2026/08/18-23:21:42.539381 16f5cf000 Level-0 table #5: 44887 bytes OK +2026/08/18-23:21:42.539604 16f5cf000 Delete type=0 #3 +2026/08/18-23:21:42.539638 16f5cf000 Delete type=3 #2 diff --git a/packs/prologue/LOG.old b/packs/prologue/LOG.old index 148d211..36808ba 100644 --- a/packs/prologue/LOG.old +++ b/packs/prologue/LOG.old @@ -1 +1 @@ -2026/08/18-22:37:15.421322 17409b000 Delete type=3 #1 +2026/08/18-23:21:17.071063 16ec7f000 Delete type=3 #1 diff --git a/packs/rules/000005.ldb b/packs/rules/000005.ldb index 1e29a85..b4e6a9a 100644 Binary files a/packs/rules/000005.ldb and b/packs/rules/000005.ldb differ diff --git a/packs/rules/000006.log b/packs/rules/000006.log index 6821460..e5ce67c 100644 Binary files a/packs/rules/000006.log and b/packs/rules/000006.log differ diff --git a/packs/rules/LOG b/packs/rules/LOG index 6436c28..e9bdaeb 100644 --- a/packs/rules/LOG +++ b/packs/rules/LOG @@ -1,5 +1,5 @@ -2026/08/18-22:37:32.806477 1773a3000 Recovering log #3 -2026/08/18-22:37:32.807016 1773a3000 Level-0 table #5: started -2026/08/18-22:37:32.807385 1773a3000 Level-0 table #5: 36532 bytes OK -2026/08/18-22:37:32.807654 1773a3000 Delete type=0 #3 -2026/08/18-22:37:32.807690 1773a3000 Delete type=3 #2 +2026/08/18-23:21:42.527792 16f5cf000 Recovering log #3 +2026/08/18-23:21:42.527874 16f5cf000 Level-0 table #5: started +2026/08/18-23:21:42.528257 16f5cf000 Level-0 table #5: 37376 bytes OK +2026/08/18-23:21:42.528527 16f5cf000 Delete type=0 #3 +2026/08/18-23:21:42.528572 16f5cf000 Delete type=3 #2 diff --git a/packs/rules/LOG.old b/packs/rules/LOG.old index 0899e5e..fcea83e 100644 --- a/packs/rules/LOG.old +++ b/packs/rules/LOG.old @@ -1 +1 @@ -2026/08/18-22:37:15.432064 172877000 Delete type=3 #1 +2026/08/18-23:21:17.083980 16fc97000 Delete type=3 #1 diff --git a/packs/rules/MANIFEST-000004 b/packs/rules/MANIFEST-000004 index 3c4122b..bbb24de 100644 Binary files a/packs/rules/MANIFEST-000004 and b/packs/rules/MANIFEST-000004 differ diff --git a/packs/skills/LOG b/packs/skills/LOG index a8b3d1c..5ecdd3f 100644 --- a/packs/skills/LOG +++ b/packs/skills/LOG @@ -1,5 +1,5 @@ -2026/08/18-22:37:32.791576 1773a3000 Recovering log #3 -2026/08/18-22:37:32.791785 1773a3000 Level-0 table #5: started -2026/08/18-22:37:32.792018 1773a3000 Level-0 table #5: 7806 bytes OK -2026/08/18-22:37:32.792443 1773a3000 Delete type=0 #3 -2026/08/18-22:37:32.792496 1773a3000 Delete type=3 #2 +2026/08/18-23:21:42.517325 16edc3000 Recovering log #3 +2026/08/18-23:21:42.517371 16edc3000 Level-0 table #5: started +2026/08/18-23:21:42.517580 16edc3000 Level-0 table #5: 7806 bytes OK +2026/08/18-23:21:42.518061 16edc3000 Delete type=0 #3 +2026/08/18-23:21:42.518138 16edc3000 Delete type=3 #2 diff --git a/packs/skills/LOG.old b/packs/skills/LOG.old index 98526f0..3b01202 100644 --- a/packs/skills/LOG.old +++ b/packs/skills/LOG.old @@ -1 +1 @@ -2026/08/18-22:37:15.351270 17409b000 Delete type=3 #1 +2026/08/18-23:21:16.994201 1704a3000 Delete type=3 #1 diff --git a/packs/slice/LOG b/packs/slice/LOG index 3a1b405..ecfa214 100644 --- a/packs/slice/LOG +++ b/packs/slice/LOG @@ -1,5 +1,5 @@ -2026/08/18-22:37:32.823569 176b97000 Recovering log #3 -2026/08/18-22:37:32.823738 176b97000 Level-0 table #5: started -2026/08/18-22:37:32.824004 176b97000 Level-0 table #5: 16902 bytes OK -2026/08/18-22:37:32.824268 176b97000 Delete type=0 #3 -2026/08/18-22:37:32.824310 176b97000 Delete type=3 #2 +2026/08/18-23:21:42.540416 16fddb000 Recovering log #3 +2026/08/18-23:21:42.540459 16fddb000 Level-0 table #5: started +2026/08/18-23:21:42.540720 16fddb000 Level-0 table #5: 16902 bytes OK +2026/08/18-23:21:42.540972 16fddb000 Delete type=0 #3 +2026/08/18-23:21:42.541026 16fddb000 Delete type=3 #2 diff --git a/packs/slice/LOG.old b/packs/slice/LOG.old index 38a1310..c64b8c7 100644 --- a/packs/slice/LOG.old +++ b/packs/slice/LOG.old @@ -1 +1 @@ -2026/08/18-22:37:15.426452 173083000 Delete type=3 #1 +2026/08/18-23:21:17.077585 16fc97000 Delete type=3 #1 diff --git a/packs/starter/LOG b/packs/starter/LOG index 053b782..4ea1137 100644 --- a/packs/starter/LOG +++ b/packs/starter/LOG @@ -1,5 +1,5 @@ -2026/08/18-22:37:32.815371 176b97000 Recovering log #3 -2026/08/18-22:37:32.816691 176b97000 Level-0 table #5: started -2026/08/18-22:37:32.817466 176b97000 Level-0 table #5: 84039 bytes OK -2026/08/18-22:37:32.817750 176b97000 Delete type=0 #3 -2026/08/18-22:37:32.817802 176b97000 Delete type=3 #2 +2026/08/18-23:21:42.534997 16edc3000 Recovering log #3 +2026/08/18-23:21:42.535341 16edc3000 Level-0 table #5: started +2026/08/18-23:21:42.535924 16edc3000 Level-0 table #5: 84039 bytes OK +2026/08/18-23:21:42.536290 16edc3000 Delete type=0 #3 +2026/08/18-23:21:42.536355 16edc3000 Delete type=3 #2 diff --git a/packs/starter/LOG.old b/packs/starter/LOG.old index 148f8f8..f520bc2 100644 --- a/packs/starter/LOG.old +++ b/packs/starter/LOG.old @@ -1 +1 @@ -2026/08/18-22:37:15.404367 173083000 Delete type=3 #1 +2026/08/18-23:21:17.052004 1704a3000 Delete type=3 #1 diff --git a/packs/tables/LOG b/packs/tables/LOG index 8874da8..4158d77 100644 --- a/packs/tables/LOG +++ b/packs/tables/LOG @@ -1,5 +1,5 @@ -2026/08/18-22:37:32.825592 175b7f000 Recovering log #3 -2026/08/18-22:37:32.825723 175b7f000 Level-0 table #5: started -2026/08/18-22:37:32.825837 175b7f000 Level-0 table #5: 3739 bytes OK -2026/08/18-22:37:32.826141 175b7f000 Delete type=0 #3 -2026/08/18-22:37:32.826181 175b7f000 Delete type=3 #2 +2026/08/18-23:21:42.541794 1705e7000 Recovering log #3 +2026/08/18-23:21:42.541832 1705e7000 Level-0 table #5: started +2026/08/18-23:21:42.541980 1705e7000 Level-0 table #5: 3739 bytes OK +2026/08/18-23:21:42.542243 1705e7000 Delete type=0 #3 +2026/08/18-23:21:42.542288 1705e7000 Delete type=3 #2 diff --git a/packs/tables/LOG.old b/packs/tables/LOG.old index e6c428a..786f74a 100644 --- a/packs/tables/LOG.old +++ b/packs/tables/LOG.old @@ -1 +1 @@ -2026/08/18-22:37:15.398341 17409b000 Delete type=3 #1 +2026/08/18-23:21:17.045501 1704a3000 Delete type=3 #1 diff --git a/packs/talents/LOG b/packs/talents/LOG index b71da07..2ab73b9 100644 --- a/packs/talents/LOG +++ b/packs/talents/LOG @@ -1,5 +1,5 @@ -2026/08/18-22:37:32.793721 17638b000 Recovering log #3 -2026/08/18-22:37:32.793870 17638b000 Level-0 table #5: started -2026/08/18-22:37:32.794081 17638b000 Level-0 table #5: 5770 bytes OK -2026/08/18-22:37:32.794365 17638b000 Delete type=0 #3 -2026/08/18-22:37:32.794405 17638b000 Delete type=3 #2 +2026/08/18-23:21:42.519065 16edc3000 Recovering log #3 +2026/08/18-23:21:42.519098 16edc3000 Level-0 table #5: started +2026/08/18-23:21:42.519276 16edc3000 Level-0 table #5: 5770 bytes OK +2026/08/18-23:21:42.519549 16edc3000 Delete type=0 #3 +2026/08/18-23:21:42.519584 16edc3000 Delete type=3 #2 diff --git a/packs/talents/LOG.old b/packs/talents/LOG.old index eee745f..ff775fa 100644 --- a/packs/talents/LOG.old +++ b/packs/talents/LOG.old @@ -1 +1 @@ -2026/08/18-22:37:15.353747 17388f000 Delete type=3 #1 +2026/08/18-23:21:16.997485 1704a3000 Delete type=3 #1 diff --git a/packs/throughtrain/LOG b/packs/throughtrain/LOG index dbcbab7..9db2725 100644 --- a/packs/throughtrain/LOG +++ b/packs/throughtrain/LOG @@ -1,5 +1,5 @@ -2026/08/18-22:37:32.810562 176b97000 Recovering log #3 -2026/08/18-22:37:32.811570 176b97000 Level-0 table #5: started -2026/08/18-22:37:32.812165 176b97000 Level-0 table #5: 68636 bytes OK -2026/08/18-22:37:32.812502 176b97000 Delete type=0 #3 -2026/08/18-22:37:32.812546 176b97000 Delete type=3 #2 +2026/08/18-23:21:42.531147 1705e7000 Recovering log #3 +2026/08/18-23:21:42.531387 1705e7000 Level-0 table #5: started +2026/08/18-23:21:42.531924 1705e7000 Level-0 table #5: 68636 bytes OK +2026/08/18-23:21:42.532247 1705e7000 Delete type=0 #3 +2026/08/18-23:21:42.532303 1705e7000 Delete type=3 #2 diff --git a/packs/throughtrain/LOG.old b/packs/throughtrain/LOG.old index 5a2454d..de05636 100644 --- a/packs/throughtrain/LOG.old +++ b/packs/throughtrain/LOG.old @@ -1 +1 @@ -2026/08/18-22:37:15.412095 17409b000 Delete type=3 #1 +2026/08/18-23:21:17.060194 16f48b000 Delete type=3 #1 diff --git a/packs/vehicles/LOG b/packs/vehicles/LOG index a5b12a5..309684b 100644 --- a/packs/vehicles/LOG +++ b/packs/vehicles/LOG @@ -1,5 +1,5 @@ -2026/08/18-22:37:32.803216 1773a3000 Recovering log #3 -2026/08/18-22:37:32.803361 1773a3000 Level-0 table #5: started -2026/08/18-22:37:32.803524 1773a3000 Level-0 table #5: 6939 bytes OK -2026/08/18-22:37:32.803783 1773a3000 Delete type=0 #3 -2026/08/18-22:37:32.803833 1773a3000 Delete type=3 #2 +2026/08/18-23:21:42.525170 16edc3000 Recovering log #3 +2026/08/18-23:21:42.525197 16edc3000 Level-0 table #5: started +2026/08/18-23:21:42.525391 16edc3000 Level-0 table #5: 6939 bytes OK +2026/08/18-23:21:42.525699 16edc3000 Delete type=0 #3 +2026/08/18-23:21:42.525727 16edc3000 Delete type=3 #2 diff --git a/packs/vehicles/LOG.old b/packs/vehicles/LOG.old index 3ec41e4..7358978 100644 --- a/packs/vehicles/LOG.old +++ b/packs/vehicles/LOG.old @@ -1 +1 @@ -2026/08/18-22:37:15.360390 17409b000 Delete type=3 #1 +2026/08/18-23:21:17.004916 1704a3000 Delete type=3 #1 diff --git a/packs/weapons/LOG b/packs/weapons/LOG index c13f9ea..8157caa 100644 --- a/packs/weapons/LOG +++ b/packs/weapons/LOG @@ -1,5 +1,5 @@ -2026/08/18-22:37:32.797239 17638b000 Recovering log #3 -2026/08/18-22:37:32.797509 17638b000 Level-0 table #5: started -2026/08/18-22:37:32.797806 17638b000 Level-0 table #5: 14767 bytes OK -2026/08/18-22:37:32.798073 17638b000 Delete type=0 #3 -2026/08/18-22:37:32.798122 17638b000 Delete type=3 #2 +2026/08/18-23:21:42.521392 16edc3000 Recovering log #3 +2026/08/18-23:21:42.521476 16edc3000 Level-0 table #5: started +2026/08/18-23:21:42.521798 16edc3000 Level-0 table #5: 14767 bytes OK +2026/08/18-23:21:42.522090 16edc3000 Delete type=0 #3 +2026/08/18-23:21:42.522134 16edc3000 Delete type=3 #2 diff --git a/packs/weapons/LOG.old b/packs/weapons/LOG.old index 7360601..1d7a683 100644 --- a/packs/weapons/LOG.old +++ b/packs/weapons/LOG.old @@ -1 +1 @@ -2026/08/18-22:37:15.355377 172877000 Delete type=3 #1 +2026/08/18-23:21:16.999207 1704a3000 Delete type=3 #1 diff --git a/ringbrp.mjs b/ringbrp.mjs index 50b83ff..00894f3 100644 --- a/ringbrp.mjs +++ b/ringbrp.mjs @@ -52,7 +52,8 @@ import { CIRCUMSTANCE, RANGE_LADDER, rangeBandFrom, MAJOR_WOUND_TABLE, COHERENCE_BANDS, COHERENCE_COSTS, COHERENCE_RECOVERY, coherenceBandFrom, PANIC_MAX, PANIC_BANDS, PANIC_TRIGGERS, PANIC_RELIEF, PANIC_BREAK, PANIC_AFTER_BREAK, - panicBandFrom, panicPenaltyFor, panicBreaksAt, panicAfter, panicReliefFor + panicBandFrom, panicPenaltyFor, panicBreaksAt, panicAfter, panicReliefFor, + DEVELOPMENT, developmentMarksOn, developmentImproves, developmentGainFor } from "./rules.mjs"; export { hitPointsFor, majorWoundFor, damageModifierFor, locationMaxHp, reflexRating, awarenessRating }; @@ -1096,10 +1097,10 @@ export async function skillRoll({ tokenId: actor?.token?.id ?? null } } }, { rollMode: game.settings.get("core", "rollMode") }); - // BRP experience: a skill used SUCCESSFULLY under pressure earns a tick. This - // was stored on every skill and set by nothing, so ticks never appeared and the - // end-of-case improvement roll had nothing to work on. - if (skillItem && ["critical", "special", "success"].includes(level) + // Development is REVERSED from Call of Cthulhu: a skill is marked when it FAILS you, + // not when it works. Nobody learns anything from the lock that opened first time. + // The condition lives in rules.mjs so the rulebook, the primer and this cannot drift. + if (skillItem && developmentMarksOn(level) && skillItem.system?.experienceEligible !== false && !skillItem.system?.experienceTicked) { await skillItem.update({ "system.experienceTicked": true }); } @@ -3309,7 +3310,7 @@ export async function usePower(actor, power, { pushed = false, difficulty = "ave // An Art earns its tick the way a skill does. Without this it arrived at roughly // POW x2 and stayed there for the rest of the character's life while charging // Coherence per attempt — a trap rather than a temptation. - if (["critical", "special", "success"].includes(res.level) && !power.system?.experienceTicked) { + if (developmentMarksOn(res.level) && !power.system?.experienceTicked) { await power.update({ "system.experienceTicked": true }); } @@ -3665,6 +3666,31 @@ export async function restFor(actor, { days = 0, hours = 0, device = "" } = {}) return total > 0 ? heal(actor, total, { source: device || "natural" }) : actor.system.hp.value; } +/** Is the development phase open? Safe before init, so the sheet can ask freely. */ +export function developmentOpen() { + try { return game.settings.get("ringbrp", "developmentPhase") === true; } + catch { return false; } +} + +/** + * The GM opens the phase at the end of a case. Everybody's sheet grows a button; each + * player presses their own. Closing it again is the GM saying the case is finished. + */ +export async function setDevelopmentPhase(open = true) { + if (!game.user.isGM) { ui.notifications?.warn(game.i18n.localize("RINGBRP.Dev.GMOnly")); return null; } + await game.settings.set("ringbrp", "developmentPhase", !!open); + const marked = game.actors.filter(a => a.type === "character") + .map(a => ({ name: a.name, + n: a.items.filter(i => ["skill","power"].includes(i.type) && i.system.experienceTicked).length })) + .filter(r => r.n > 0); + await ChatMessage.create({ + speaker: { alias: game.i18n.localize("RINGBRP.Dev.Title") }, + content: await rbRenderTemplate("systems/ringbrp/templates/chat-development.hbs", + { open: !!open, rows: marked }) + }); + return !!open; +} + /** * End of case. Every ticked skill rolls to improve: succeed against d100 > current * rating and it goes up 1D6, and the tick clears either way. This is the step that @@ -3690,18 +3716,23 @@ export async function endOfCase(actor) { const rating = Number(sk.system.value) || 0; const roll = await new Roll("1d100").evaluate(); // Roll OVER the current rating: the better you already are, the harder to gain. - const improved = roll.total > rating; - const gain = improved ? (await new Roll("1d6").evaluate()).total : 0; + const improved = developmentImproves(roll.total, rating); + const rolled = improved ? (await new Roll(DEVELOPMENT.gain).evaluate()).total : 0; + // A d100 gain can overshoot the top, so clip it to the skill's ceiling. + const gain = developmentGainFor(rating, rolled, sk.system.trainingCap); + const capped = improved && gain < rolled; await sk.update({ "system.value": rating + gain, "system.experienceTicked": false }); - results.push({ name: sk.name, rating, roll: roll.total, gain, improved }); + results.push({ name: sk.name, rating, roll: roll.total, gain, improved, capped }); } await ChatMessage.create({ speaker: ChatMessage.getSpeaker({ actor }), content: `
{{localize "RINGBRP.Dev.Opened"}}
+ {{#if rows.length}} +| {{localize "RINGBRP.Party.Who"}} | {{localize "RINGBRP.Dev.Marked"}} |
|---|---|
| {{r.name}} | {{r.n}} |
{{localize "RINGBRP.Dev.PressIt"}}
+ {{else}} +{{localize "RINGBRP.Exp.NoTicks"}}
+ {{/if}} + {{else}} +{{localize "RINGBRP.Dev.Closed"}}
+ {{/if}} +Every skill you used successfully under pressure is ticked. At the end of the case -each ticked skill rolls to improve: beat your current rating on 1D100 and it goes up -1D6. Ticks clear either way.
+This is the opposite way round from most games in this family, and it is meant +to be.
+A skill is marked when it FAILS you — ${DEVELOPMENT.marksOn.join(' or ')} — +and not when it works. Nobody learns anything from the lock that opened first time.
+At the end of a case the GM opens the development phase, and each +agent rolls once for every marked skill. Roll 1D100 OVER your current rating and +it goes up ${DEVELOPMENT.gain}. If you make the roll you have learned nothing this +time. Marks clear either way.
+So the two halves pull against each other on purpose. A skill you are bad at fails +constantly, gets marked, and then fails its development roll and climbs quickly. A skill +you are good at rarely fails at all, and when it does it usually passes the development +roll and gains nothing. Ratings converge instead of running away.
+The GM opens it with the Development phase toggle in the token +controls on the left of the screen, which only GMs see. Opening it posts a card naming +every agent and how many skills each has marked, and puts a Development +button on every agent's sheet. Each player presses their own button once; the rolls and +the results go to chat. Marks clear as they are rolled, so a second press does nothing. +Close the toggle when everyone has rolled.
+A scene has to be open on the canvas for the toggle to respond — that is true of +every control on that bar, not just this one.
Cases do not need to connect. The running thread of a campaign is not a plot — it is the four coherence tracks going down.
` },