Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5aaae186e0 | ||
|
|
20306d83d9 | ||
|
|
cbad87ba98 | ||
|
|
ab619f4b73 | ||
|
|
9b6c61ffcb | ||
|
|
0852427586 | ||
|
|
ad771ff2b5 |
@@ -28,7 +28,8 @@ git clone https://gitea.timevans.uk/slaguru666/RingBRP.git ringbrp
|
||||
```
|
||||
|
||||
Requires **Foundry v13+** (verified against v14.364). No modules are required. Dice So
|
||||
Nice is supported but optional — the system registers four of its own dice textures.
|
||||
Nice works if you have it, using your own dice — the system ships no dice skins and does
|
||||
not touch anybody's dice settings.
|
||||
|
||||
### Deploying to a remote Foundry server
|
||||
|
||||
@@ -47,7 +48,7 @@ packs or regenerate art on that machine:
|
||||
```bash
|
||||
npm install # pulls classic-level, used to write the LevelDB packs
|
||||
npm run build # rebuilds packs/ from tools/content.mjs
|
||||
npm run check # the three guards; the build refuses to run if they fail
|
||||
npm run check # the five guards; the build refuses to run if they fail
|
||||
```
|
||||
|
||||
To update a deployed server: `git pull` and restart Foundry. If the pull touches
|
||||
@@ -64,13 +65,13 @@ changing underneath a running server.
|
||||
| **Postings** | 25, each with a key characteristic, trained skills, talents and its own kit |
|
||||
| **Trades** | 10 ordinary jobs the department recruits from, plus induction |
|
||||
| **Catalogue** | 236 items — 123 gear, 62 weapons, 32 armour, 19 vehicles |
|
||||
| **Skills / talents** | 59 skills, 19 talents |
|
||||
| **Skills / talents** | 62 skills, 19 talents |
|
||||
| **Bestiary** | 21 statblocks across folklore, horror and the far side |
|
||||
| **Eras** | modern, antique, future, anomalous — the agency is old and never abolishes anything |
|
||||
| **Icons** | 292, all generated from `tools/icons.mjs`; no external art |
|
||||
| **Starter scenario** | **BLACK PLATFORM**, a six-player action starter, importable as a single Adventure |
|
||||
| **Compendia** | pregens, NPCs, skills, weapons, armour, gear, vehicles, powers, tables, rules, the starter |
|
||||
| **Rules journal** | 12 pages, generated from `rules.mjs` so the book cannot drift from the code |
|
||||
| **Rules journal** | 13 pages, generated from `rules.mjs` so the book cannot drift from the code |
|
||||
<!-- box:end -->
|
||||
|
||||
---
|
||||
@@ -152,13 +153,12 @@ template.json data model for every Actor and Item type
|
||||
templates/ Handlebars sheets
|
||||
styles/ one stylesheet
|
||||
lang/en.json all user-facing text
|
||||
icons/ dice/ fonts/ generated art
|
||||
icons/ fonts/ art/ generated art
|
||||
packs/ built LevelDB compendia (committed — see Deploying)
|
||||
tools/
|
||||
content.mjs the catalogue: skills, weapons, armour, gear, vehicles, NPCs
|
||||
build-packs.mjs builds packs/ — runs the three guards first and refuses on failure
|
||||
build-packs.mjs builds packs/ — runs the five guards first and refuses on failure
|
||||
make-icons.mjs draws all 231 icons
|
||||
make-dice-textures.mjs
|
||||
rules-text.mjs generates the rules journal FROM rules.mjs
|
||||
mission.mjs the case generator
|
||||
mission-tables.mjs its content tables
|
||||
@@ -176,13 +176,13 @@ stops being identity-equal to what it aliases, if a constant is re-declared as a
|
||||
literal, or if an exported rule has no spot-check. The packs used to be built under
|
||||
one set of numbers and played under another; this makes that impossible to ship.
|
||||
|
||||
The build runs all three guards before it writes anything:
|
||||
The build runs all five guards before it writes anything:
|
||||
|
||||
<!-- guards:start -->
|
||||
```
|
||||
check-rules: OK — 87 rules, 21 files scanned, 3 aliases + 41 constant sets checked, 275 formulas verified
|
||||
check-rules: OK — 92 rules, 20 files scanned, 3 aliases + 45 constant sets checked, 291 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, 945 keys, no leaf/branch collisions
|
||||
check-behaviour: OK — 45 behavioural tests
|
||||
check-lang: OK — en.json, 977 keys, no leaf/branch collisions
|
||||
check-behaviour: OK — 57 behavioural tests
|
||||
```
|
||||
<!-- guards:end -->
|
||||
|
||||
|
Before Width: | Height: | Size: 43 KiB |
|
Before Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 3.9 KiB |
|
Before Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 785 B |
|
Before Width: | Height: | Size: 970 B |
|
Before Width: | Height: | Size: 826 B |
@@ -33,10 +33,9 @@ Only if you intend to edit the catalogue there:
|
||||
|
||||
```bash
|
||||
npm install # classic-level, for writing LevelDB
|
||||
npm run check # the three guards
|
||||
npm run check # the five guards
|
||||
npm run build # rebuilds packs/
|
||||
node tools/make-icons.mjs # redraws all icons
|
||||
node tools/make-dice-textures.mjs # regenerates the Dice So Nice textures
|
||||
```
|
||||
|
||||
`npm run build` runs the guards first and aborts if any fails, so a broken catalogue
|
||||
|
||||
@@ -943,5 +943,37 @@
|
||||
"RINGBRP.Item.ArtRating": "Rating",
|
||||
"RINGBRP.Item.PushCost": "Push cost",
|
||||
"RINGBRP.Item.PushRule": "What pushing does",
|
||||
"RINGBRP.Item.Origin": "Where it came from"
|
||||
"RINGBRP.Item.Origin": "Where it came from",
|
||||
"RINGBRP.Panic.Label": "Panic",
|
||||
"RINGBRP.Panic.Steady": "Steady",
|
||||
"RINGBRP.Panic.SteadyNote": "You are all right. You are doing the job.",
|
||||
"RINGBRP.Panic.Rattled": "Rattled",
|
||||
"RINGBRP.Panic.RattledNote": "Your hands are not quite steady. No penalty — the first one is free.",
|
||||
"RINGBRP.Panic.Shaken": "Shaken",
|
||||
"RINGBRP.Panic.ShakenNote": "−5% to everything. You keep checking the way you came in.",
|
||||
"RINGBRP.Panic.Losing": "Losing it",
|
||||
"RINGBRP.Panic.LosingNote": "−10% to everything. You are talking too fast and not hearing answers.",
|
||||
"RINGBRP.Panic.Overwhelmed": "Overwhelmed",
|
||||
"RINGBRP.Panic.OverwhelmedNote": "−20% to everything. One more and you go.",
|
||||
"RINGBRP.Panic.Broken": "Broken",
|
||||
"RINGBRP.Panic.BrokenNote": "You freeze, run, or go at it. Choose one, take it, and come back at 3.",
|
||||
"RINGBRP.Panic.Trig.WrongThing": "Something that should not be there",
|
||||
"RINGBRP.Panic.Trig.Touched": "It touched you",
|
||||
"RINGBRP.Panic.Trig.Body": "A body",
|
||||
"RINGBRP.Panic.Trig.Known": "Somebody you knew",
|
||||
"RINGBRP.Panic.Trig.Dark": "The lights went",
|
||||
"RINGBRP.Panic.Trig.Wounded": "A major wound",
|
||||
"RINGBRP.Panic.Trig.Named": "It said your name",
|
||||
"RINGBRP.Panic.Relief.Steady": "Steady yourself (POW×5)",
|
||||
"RINGBRP.Panic.Relief.Religion": "Religion — something older than the department",
|
||||
"RINGBRP.Panic.Relief.Psychology": "Psychology — talk somebody else down",
|
||||
"RINGBRP.Panic.Relief.Occult": "Occult — name it, out loud, for everyone who can hear",
|
||||
"RINGBRP.Panic.Relief.Anchor": "Your anchor, once per case",
|
||||
"RINGBRP.Panic.Gained": "{name} — panic {from} → {to}",
|
||||
"RINGBRP.Panic.Eased": "{name} — panic {from} → {to}",
|
||||
"RINGBRP.Panic.Breaks": "BREAKS — freeze, flee, or fixate. Choose, take it, come back at 3.",
|
||||
"RINGBRP.Panic.NoChange": "No change.",
|
||||
"RINGBRP.Flavour.Panicking": "panicking ({mod}%)",
|
||||
"RINGBRP.Chat.ToEverything": "to everything",
|
||||
"RINGBRP.Panic.Backfired": "Fumbled —"
|
||||
}
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
"scripts": {
|
||||
"build": "node tools/build-packs.mjs && node tools/update-readme.mjs",
|
||||
"icons": "node tools/make-icons.mjs",
|
||||
"dice": "node tools/make-dice-textures.mjs",
|
||||
"check": "node tools/check-rules.mjs && node tools/check-kits.mjs && node tools/check-lang.mjs && node tools/check-templates.mjs && node tools/check-behaviour.mjs",
|
||||
"test": "npm run check",
|
||||
"readme": "node tools/update-readme.mjs"
|
||||
|
||||
@@ -1 +1 @@
|
||||
MANIFEST-000002
|
||||
MANIFEST-000004
|
||||
|
||||
@@ -1 +1,5 @@
|
||||
2026/08/12-19:12:20.951787 172dab000 Delete type=3 #1
|
||||
2026/08/17-23:24:47.247472 17253f000 Recovering log #3
|
||||
2026/08/17-23:24:47.247505 17253f000 Level-0 table #5: started
|
||||
2026/08/17-23:24:47.247700 17253f000 Level-0 table #5: 4591 bytes OK
|
||||
2026/08/17-23:24:47.248094 17253f000 Delete type=0 #3
|
||||
2026/08/17-23:24:47.248137 17253f000 Delete type=3 #2
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
2026/08/17-23:24:31.473921 16e827000 Delete type=3 #1
|
||||
@@ -1 +1 @@
|
||||
MANIFEST-000002
|
||||
MANIFEST-000004
|
||||
|
||||
@@ -1 +1,5 @@
|
||||
2026/08/12-19:12:21.036764 172dab000 Delete type=3 #1
|
||||
2026/08/17-23:24:47.267497 173d63000 Recovering log #3
|
||||
2026/08/17-23:24:47.267518 173d63000 Level-0 table #5: started
|
||||
2026/08/17-23:24:47.267658 173d63000 Level-0 table #5: 4129 bytes OK
|
||||
2026/08/17-23:24:47.267918 173d63000 Delete type=0 #3
|
||||
2026/08/17-23:24:47.267949 173d63000 Delete type=3 #2
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
2026/08/17-23:24:31.544854 16e827000 Delete type=3 #1
|
||||
@@ -1 +1 @@
|
||||
MANIFEST-000002
|
||||
MANIFEST-000004
|
||||
|
||||
@@ -1 +1,5 @@
|
||||
2026/08/12-19:12:20.954786 17259f000 Delete type=3 #1
|
||||
2026/08/17-23:24:47.248920 173d63000 Recovering log #3
|
||||
2026/08/17-23:24:47.249014 173d63000 Level-0 table #5: started
|
||||
2026/08/17-23:24:47.249313 173d63000 Level-0 table #5: 31614 bytes OK
|
||||
2026/08/17-23:24:47.249730 173d63000 Delete type=0 #3
|
||||
2026/08/17-23:24:47.249796 173d63000 Delete type=3 #2
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
2026/08/17-23:24:31.475804 17004b000 Delete type=3 #1
|
||||
@@ -1 +1 @@
|
||||
MANIFEST-000002
|
||||
MANIFEST-000004
|
||||
|
||||
@@ -1 +1,5 @@
|
||||
2026/08/12-19:12:21.015776 172dab000 Delete type=3 #1
|
||||
2026/08/17-23:24:47.261246 17253f000 Recovering log #3
|
||||
2026/08/17-23:24:47.261511 17253f000 Level-0 table #5: started
|
||||
2026/08/17-23:24:47.261915 17253f000 Level-0 table #5: 46857 bytes OK
|
||||
2026/08/17-23:24:47.262265 17253f000 Delete type=0 #3
|
||||
2026/08/17-23:24:47.262307 17253f000 Delete type=3 #2
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
2026/08/17-23:24:31.528809 16f033000 Delete type=3 #1
|
||||
@@ -1 +1 @@
|
||||
MANIFEST-000002
|
||||
MANIFEST-000004
|
||||
|
||||
@@ -1 +1,5 @@
|
||||
2026/08/12-19:12:20.996296 1735b7000 Delete type=3 #1
|
||||
2026/08/17-23:24:47.235329 173d63000 Recovering log #3
|
||||
2026/08/17-23:24:47.236302 173d63000 Level-0 table #5: started
|
||||
2026/08/17-23:24:47.238305 173d63000 Level-0 table #5: 234672 bytes OK
|
||||
2026/08/17-23:24:47.238754 173d63000 Delete type=0 #3
|
||||
2026/08/17-23:24:47.238827 173d63000 Delete type=3 #2
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
2026/08/17-23:24:31.510747 16f83f000 Delete type=3 #1
|
||||
@@ -1 +1 @@
|
||||
MANIFEST-000002
|
||||
MANIFEST-000004
|
||||
|
||||
@@ -1 +1,5 @@
|
||||
2026/08/12-19:12:21.030689 17259f000 Delete type=3 #1
|
||||
2026/08/17-23:24:47.244550 17253f000 Recovering log #3
|
||||
2026/08/17-23:24:47.244581 17253f000 Level-0 table #5: started
|
||||
2026/08/17-23:24:47.244685 17253f000 Level-0 table #5: 3295 bytes OK
|
||||
2026/08/17-23:24:47.244965 17253f000 Delete type=0 #3
|
||||
2026/08/17-23:24:47.245003 17253f000 Delete type=3 #2
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
2026/08/17-23:24:31.539431 17004b000 Delete type=3 #1
|
||||
@@ -1 +1 @@
|
||||
MANIFEST-000002
|
||||
MANIFEST-000004
|
||||
|
||||
@@ -1 +1,5 @@
|
||||
2026/08/12-19:12:20.979932 17259f000 Delete type=3 #1
|
||||
2026/08/17-23:24:47.222820 172d4b000 Recovering log #3
|
||||
2026/08/17-23:24:47.225060 172d4b000 Level-0 table #5: started
|
||||
2026/08/17-23:24:47.229466 172d4b000 Level-0 table #5: 561098 bytes OK
|
||||
2026/08/17-23:24:47.229981 172d4b000 Delete type=0 #3
|
||||
2026/08/17-23:24:47.230132 172d4b000 Delete type=3 #2
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
2026/08/17-23:24:31.496406 16e827000 Delete type=3 #1
|
||||
@@ -1 +1 @@
|
||||
MANIFEST-000002
|
||||
MANIFEST-000004
|
||||
|
||||
@@ -1 +1,5 @@
|
||||
2026/08/12-19:12:21.025079 172dab000 Delete type=3 #1
|
||||
2026/08/17-23:24:47.251999 173d63000 Recovering log #3
|
||||
2026/08/17-23:24:47.252036 173d63000 Level-0 table #5: started
|
||||
2026/08/17-23:24:47.252324 173d63000 Level-0 table #5: 21613 bytes OK
|
||||
2026/08/17-23:24:47.252692 173d63000 Delete type=0 #3
|
||||
2026/08/17-23:24:47.252736 173d63000 Delete type=3 #2
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
2026/08/17-23:24:31.536318 17004b000 Delete type=3 #1
|
||||
@@ -1 +1 @@
|
||||
MANIFEST-000002
|
||||
MANIFEST-000004
|
||||
|
||||
@@ -1 +1,5 @@
|
||||
2026/08/12-19:12:21.020396 17259f000 Delete type=3 #1
|
||||
2026/08/17-23:24:47.263027 17253f000 Recovering log #3
|
||||
2026/08/17-23:24:47.263228 17253f000 Level-0 table #5: started
|
||||
2026/08/17-23:24:47.263611 17253f000 Level-0 table #5: 44887 bytes OK
|
||||
2026/08/17-23:24:47.263871 17253f000 Delete type=0 #3
|
||||
2026/08/17-23:24:47.263914 17253f000 Delete type=3 #2
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
2026/08/17-23:24:31.533004 16e827000 Delete type=3 #1
|
||||
@@ -1 +1 @@
|
||||
MANIFEST-000002
|
||||
MANIFEST-000004
|
||||
|
||||
@@ -1 +1,5 @@
|
||||
2026/08/12-19:12:21.035224 1735b7000 Delete type=3 #1
|
||||
2026/08/17-23:24:47.253858 172d4b000 Recovering log #3
|
||||
2026/08/17-23:24:47.253959 172d4b000 Level-0 table #5: started
|
||||
2026/08/17-23:24:47.254345 172d4b000 Level-0 table #5: 36526 bytes OK
|
||||
2026/08/17-23:24:47.254740 172d4b000 Delete type=0 #3
|
||||
2026/08/17-23:24:47.254786 172d4b000 Delete type=3 #2
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
2026/08/17-23:24:31.542959 16f83f000 Delete type=3 #1
|
||||
@@ -1 +1 @@
|
||||
MANIFEST-000002
|
||||
MANIFEST-000004
|
||||
|
||||
@@ -1 +1,5 @@
|
||||
2026/08/12-19:12:20.942094 17259f000 Delete type=3 #1
|
||||
2026/08/17-23:24:47.241716 17253f000 Recovering log #3
|
||||
2026/08/17-23:24:47.241766 17253f000 Level-0 table #5: started
|
||||
2026/08/17-23:24:47.241955 17253f000 Level-0 table #5: 7806 bytes OK
|
||||
2026/08/17-23:24:47.242285 17253f000 Delete type=0 #3
|
||||
2026/08/17-23:24:47.242328 17253f000 Delete type=3 #2
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
2026/08/17-23:24:31.467729 16f033000 Delete type=3 #1
|
||||