diff --git a/README.md b/README.md index 7f999f5..472ce6d 100644 --- a/README.md +++ b/README.md @@ -180,7 +180,7 @@ The build runs all five guards before it writes anything: ``` -check-rules: OK — 92 rules, 20 files scanned, 3 aliases + 45 constant sets checked, 291 formulas verified +check-rules: OK — 92 rules, 21 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, 981 keys, no leaf/branch collisions check-behaviour: OK — 59 behavioural tests diff --git a/art/scenes/tt_01_draw.webp b/art/scenes/tt_01_draw.webp new file mode 100644 index 0000000..0351bc6 Binary files /dev/null and b/art/scenes/tt_01_draw.webp differ diff --git a/art/scenes/tt_02_stores.webp b/art/scenes/tt_02_stores.webp new file mode 100644 index 0000000..2d05667 Binary files /dev/null and b/art/scenes/tt_02_stores.webp differ diff --git a/art/scenes/tt_03_bench.webp b/art/scenes/tt_03_bench.webp new file mode 100644 index 0000000..25e2806 Binary files /dev/null and b/art/scenes/tt_03_bench.webp differ diff --git a/art/scenes/tt_04_cordera.webp b/art/scenes/tt_04_cordera.webp new file mode 100644 index 0000000..48e64ce Binary files /dev/null and b/art/scenes/tt_04_cordera.webp differ diff --git a/art/scenes/tt_05_boarding.webp b/art/scenes/tt_05_boarding.webp new file mode 100644 index 0000000..8111c93 Binary files /dev/null and b/art/scenes/tt_05_boarding.webp differ diff --git a/art/scenes/tt_06_car.webp b/art/scenes/tt_06_car.webp new file mode 100644 index 0000000..34f239c Binary files /dev/null and b/art/scenes/tt_06_car.webp differ diff --git a/art/scenes/tt_07_after.webp b/art/scenes/tt_07_after.webp new file mode 100644 index 0000000..63b7c76 Binary files /dev/null and b/art/scenes/tt_07_after.webp differ diff --git a/docs/scenarios/THROUGH_TRAIN.md b/docs/scenarios/THROUGH_TRAIN.md new file mode 100644 index 0000000..9888458 --- /dev/null +++ b/docs/scenarios/THROUGH_TRAIN.md @@ -0,0 +1,394 @@ +# Crossing starter — The Custodians: THROUGH TRAIN + +> *A train has been running the same four miles of track since the third of November, +> 1881. It has never stopped. There are sixty-one people on it and they are all alive.* + +--- + +## GM ESSENTIALS + +- **System:** d100 roll-under. Special under a fifth, critical under a twentieth. + 96–99 never succeed; 00 always fumbles; a 60% skill fumbles on 98–00. +- **Panic is live** — 0–5, up. A trigger costs a point with no roll; relief is rolled. + **This is the case where it earns its keep.** +- **Standing Order 9 is live** — nothing modern goes through. Charge for *using*, never + for carrying. Anchors are exempt. +- **Runs with 4–6 agents from the duty roster.** Not the "(before)" sheets — this is the + job, and it wants people who have been trained. +- **Hard rule: at 2:45 on the clock, they are on the train.** +- **Content warnings:** entrapment and confinement; a decision that condemns named + people including children; period racism and hardship implied but not staged; heights; + one death by fire in backstory. + +--- + +## Overview + +- **Setting:** Mercy Draw, Nevada — present day, and 3–4 November 1881. +- **Tone:** Procedural, then unbearable. It is a paperwork error with sixty-one people + inside it. +- **Runtime:** 3h30 play + a 10 minute break. +- **The crossing:** opens at 11:40 every day, for about four minutes, on the grade. + +### Design intent + +1. **The supernatural is science fiction underneath.** Nobody is dead, nothing is + haunting anybody, and the whole event has a mechanism the players can understand and + explain back. If a table leaves thinking "ghost train", it has been run wrong. +2. **The obstacle is a physical problem, not a mystery.** They will know what is + happening by the end of Act One. Acts Two and Three are about a train that cannot + stop and an arithmetic that cannot be beaten. +3. **Standing Order 9 is the tutorial.** One shot at a time, no radio, a lantern that + runs out. The period kit *is* the difficulty setting, and it is the scene where + players learn what kind of game this is. +4. **The ending is a decision priced on both sides**, with no roll and no correct + answer, taken in front of a woman holding a manifest. +5. **What this is not:** a fight. There is no antagonist. Kell is not possessed, Vane is + not a villain, and the train is not malevolent — it is a note being held. + +--- + +## Session Timing + +| Section | Time | Cumulative | Checkpoint | +|---|---|---|---| +| Briefing — the standing order | ~20 min | 0:20 | kit swapped, somebody has complained | +| Act One — Mercy Draw, now | ~50 min | 1:10 | they know it is a survey fraud, and they have heard 11:40 | +| *Break* | *10 min* | *1:10* | lands on the whistle | +| Act Two — Cordera, 1881 | ~70 min | 2:20 | they are on the train | +| Act Three — Aboard | ~50 min | 3:10 | they have decided | +| Epilogue — the register | ~20 min | 3:30 | sixty-one names, written down | + +**Hard rule:** at 2:45 they are aboard, by the department's wagon if not by their own wit. + +--- + +## Plot Summary (GM truth) + +**April 1881.** The Cordera & Western needed four miles of narrow gauge across a dry +wash called **Mercy Draw**. The company surveyor, **Elias Vane**, was told what the chart +had to say before he walked the ground. He filed a survey showing the line on the +**north bench**. The line was laid on the **south bench**, because that is where the +ground allowed it. + +Nobody was hurt by that. It is the dullest possible paperwork lie. And for six months +every timetable, waybill, dispatch and telegraph order in the company's operation +described a train running along the north bench. + +**Reality keeps a record of what belongs where.** It can be made to get it wrong by +anything patient enough — and a train is the most patient arguer there is: a fixed line, +a constant speed, on the hour, every day, saying the same wrong thing about where it was. + +**3 November 1881, 11:40.** The record gave way. Four miles of line came loose from the +date with No. 9 and five cars on it and **sixty-one souls aboard**. + +**The running is what holds it open.** This is the thing the players must arrive at: the +train is not trapped inside the crossing — the train *is* the crossing. A standing wave, +sustained by its own motion the way a bow sustains a note. + +- **Nobody is dead.** They eat, sleep in shifts, and have organised a water rota. By + their clocks it has been about nine hours. +- **Nobody can get off.** Step down and you are on ground outside the error. Three + departmental attempts are on file; none returned; all three tried to stop it first. +- **Stop the train and the note ends** — and everything it holds open ends with it. + +**Elias Vane is aboard.** He rode his own line to see what he had signed for. He has had +nine hours and a hundred and forty-five years to think about it. He understands the +standing wave better than the department does, he has told nobody, and he will answer any +direct question honestly because he has been waiting a very long time to be asked. + +### Timeline + +| When | What | +|---|---| +| 12 Apr 1881 | Vane files the survey. North bench. | +| Apr–Oct 1881 | Line laid on the south bench. Six months of paperwork says otherwise. | +| **3 Nov 1881, 11:40** | The record gives way, with No. 9 inside it. | +| 1889 | Rails lifted. The grade is still there. | +| 1974, 1991, 2009 | Three departmental attempts. No survivors. All tried to stop it. | +| Every day, 11:40 | The crossing opens on the grade for about four minutes. | + +### Revelations + +| # | Revelation | +|---|---| +| R1 | The filed survey puts the line on the north bench | +| R2 | There has never been a railway on the north bench | +| R3 | Six months of paperwork repeated it | +| R4 | The dispatcher's book has no 11:45 entry | +| R5 | The 11:40 sound is a train working *up* a grade — always accelerating | +| R6 | Nobody aboard is dead, and by their clocks it has been nine hours | +| R7 | The running is what holds the crossing open | +| R8 | Coal that should have lasted four hours has lasted a hundred and forty-five years | +| R9 | Kell will stop if told to, and only if told to | +| R10 | Vane signed it, and knows exactly what stopping it costs | +| R11 | Sixty-one people, six passes, four hours — and the crossing may not hold | + +--- + +## Player Experience + +You are handed a Webley, a single-shot rifle, an oil lantern and a pocket watch, and told +that the handset stays behind. Then you stand in a dry wash in Nevada at 11:38 in the +morning and listen to a train you cannot see work a grade that has had no rails on it +since 1889. By lunchtime you know it is a survey fraud from 1881. By the evening you are +lying on the top of a water tower waiting for forty seconds of slow track, and after that +you are in a warm carriage that smells of coffee, being asked by a conductor with a +manifest whether you are from the company. She has counted sixty-one every hour for a +hundred and forty-five years. She would like that noted. + +--- + +## The Countdown — the crossing clock (0–6) + +Move it on **each pass of the train**, when **somebody uses a modern object across**, and +on a **fumbled boarding attempt**. + +| Clock | What | +|---|---| +| 0 | Open. Four minutes at 11:40. | +| 1 | Thinning. The whistle arrives a half-second before it should. | +| 2 | Slipping. −1 Coherence to everyone across, once. | +| 3 | The line flickers — a hundred yards of grade is briefly not there. | +| 4 | The far end stops answering. Fallon's wire goes dead in 1881. | +| 5 | One pass left, and everybody can tell. | +| 6 | It closes, with whoever is aboard. | + +--- + +## Handouts + +| ID | Description | When | +|---|---|---| +| TT-H01 | Case brief TT-004 | Briefing | +| TT-H02 | **Standing Order 9** — period crossings | Briefing | +| TT-H03 | Issue list, 1881 | Briefing | +| TT-H04 | **The filed survey** — the line on the north bench | Act One | +| TT-H05 | Working timetable and the dispatcher's book | Act One | +| TT-H06 | **Passenger manifest** — sixty-one souls, nine children | Act Three | + +The manifest is deliberately held back to Act Three. It is a list of names, and the +players should not be holding it until the moment it starts to weigh something. + +--- + +## Briefing — the standing order *(~20 min)* + +> You will be crossing to November 1881. Nothing you are carrying goes with you. Stores +> has laid out what you may take instead, and I would ask you not to argue with the +> storeman, because he is right and you are in a hurry. + +**Nothing modern goes through.** Give both reasons: + +1. **It costs you.** An object that does not belong is a thing the far side must also be + wrong about. **Using** a modern item across costs **1 Coherence**, per object, first + time. +2. **It is a beacon.** A crossing is a place where the record is already wrong. It + notices what does not fit, and the case clock moves. + +**Charge for using, never for carrying.** A player who smuggles a torch across and never +switches it on has made a good decision and should get away with it. + +**The anchor is exempt.** Everybody keeps theirs. + +### The 1881 issue + +| Instead of | They get | +|---|---| +| service pistol | **Webley revolver** — 1d10, six shots, slow reload | +| carbine | **Martini-Henry** — 2d6+2, **one shot**, then work the lever | +| torch | **oil lantern** and lamp oil, which runs out | +| the handset | **nothing.** Out of contact from the moment they cross. | +| stab vest | **buff coat** or oilcloth coat | +| medkit | **chirurgeon's roll** and **laudanum** | +| phone and GPS | **brass compass**, **pocket watch**, **spyglass** | + +--- + +## Act One — Mercy Draw, now *(~50 min)* + +> **Goal:** find the fraud, hear the train, understand it is on a timetable. + +Nevada. A dry wash four miles long with a railway grade along the south side. Rails +lifted in 1889; ballast and tie marks still there. Your watch says 11:38. + +- **The south bench** — the grade, real and obvious. +- **The north bench** — nothing, and never anything. `[CUS: Spot or Engineering]` +- **The water tower footing**, half a mile up at the top of the grade. *Remember it.* +- **11:40.** A whistle a long way off, then four minutes of a train working a grade, + getting no nearer. **Automatic — nobody rolls for this.** + +### Clue trail + +| # | Clue | How found | Type | +|---|---|---|---| +| 1 | The filed survey puts the line on the **north** bench | **Automatic** — it is a handout with a line drawn on it | Essential | +| 2 | There has never been a railway on the north bench | **Automatic** to anyone who walks it | Essential | +| 3 | Six months of paperwork all say north bench | `[CUS: Research]`, or Registry provides | Essential | +| 4 | No 11:45 entry in the dispatcher's book | `[CUS: Research]` | Essential | +| 5 | E. Vane, surveyor, is on the manifest | `[CUS: Research]` | Optional | +| 6 | Three previous attempts, no survivors, all tried to stop it | Registry, if asked | Optional | +| 7 | The sound is a train *accelerating* up a grade | `[CUS: Listen or Engineering]` | Optional | + +**Fallbacks.** 1 and 2 are the handout and the ground. 3 and 4 arrive from Registry by +telephone at the twenty-minute mark if nobody goes looking — Bewley is thorough and +slightly impatient. + +**They cannot board at this end.** Too fast, grade against them. Let them try: a bruise, a +lesson, and the clock moves one. + +> **Fast-track at 1:10:** the 11:40 comes round again and the door stays open long enough +> to walk through. That is what degrading looks like. + +--- + +## Act Two — Cordera, 1881 *(~70 min)* + +> **Goal:** the far side, the standing order in practice, and the boarding. + +The fourth of November, 1881. A town of four hundred that smells of woodsmoke and horses. +Nobody is frightened yet — a train went into the Draw yesterday and has not come out, and +the wire says it never arrived. + +- **The company office** — dispatcher, orders on spikes, the original survey in a drawer. +- **The livery** — horses. This matters. +- **Ada Reyes**, telegraph, who has sent the same query forty times and has noticed the + missing 11:45. +- **The Draw**, four miles out. The train passes about every forty minutes. + +**Nobody in 1881 can help them stop it, and everybody will help them get near it.** The +company wants its train back. Let the players use that. + +### The set-piece — getting aboard + +The train cannot stop and cannot be flagged. The only way on is to **match its speed**, +and the only place it is slow is **the top of the grade at the water tower** — about eight +miles an hour, for perhaps forty seconds. + +1. **Ride it down.** Horses alongside on the bench, step across. `[CUS: Ride, then + Athletics]` — and the horse needs its own Ride roll to go near the train at all. +2. **Drop from the tower.** Twelve feet onto a moving roof. `[CUS: Athletics — average; + **only a fumble is a fall**]`. **Do not make this difficult** — playtested at halved + skill it put four agents on 12–31% and all four missed, which stalls the one scene the + scenario is built around. +3. **The wagon on the grade.** Four horses, a plank across. Slowest to arrange, safest to + cross, and it needs the company's help. + +**The wagon is easier than the tower, and the tower is easier than the horses.** A party +that spends an hour arranging the wagon has bought an easy roll and should get one. + +**Everybody has to get on.** A failed attempt gets the next pass, forty minutes later, and +the clock moves — not a full stop. + +**Panic:** boarding is worth a point to anybody who wants one. Offer it; do not force it. + +> **At 2:45 they are aboard.** If two attempts have failed, the department's second wagon +> arrives with two more agents and a plank, and the players owe somebody a favour. + +--- + +## Act Three — Aboard *(~50 min)* + +> **Goal:** sixty-one people, one man who knows, and a decision that costs either way. + +> It is warm. That is the first thing. Sixty-one people in five cars, and it smells of +> bodies and coal smoke and coffee. Somebody has organised a rota for the water. A child +> is asleep across two seats with a coat over her. They look up when you come through the +> door, and one of them says: *"Are you from the company?"* + +| Where | What | +|---|---| +| The locomotive | **Marius Kell**, engineer, who has not let go of the regulator | +| Tender, car one | Coal that has not run out — the first hard evidence | +| Cars two and three | Most of the sixty-one. Organised, rationed, glad to see anyone | +| Car four | Freight, the company safe, **the signed survey** | +| Car five | **Elias Vane**, alone, watching the line come out from under | + +### The three facts aboard + +1. **The coal has not run out.** `[CUS: Engineering or Spot]` +2. **Kell cannot let go** — not *will* not. He worked out on day one that slowing is the + end of everything, and he has been right for a hundred and forty-five years. He is not + mad and not possessed. He is tired. +3. **Vane knows**, and will say so to a direct question. + +### Getting people off + +**Off the moving train is survivable. Off the crossing is not.** A person put off at the +top of the grade — the same forty seconds the agents used — lands in 1881 and lives. + +**Sixty-one people. Six passes. Four hours.** They cannot do it in the time they have. +That is deliberate: the ending is what they choose to do about the arithmetic. + +### The choices — no roll resolves this + +| Choice | Cost | +|---|---| +| **Everyone off, then stop it** | Four hours while the crossing degrades. It may not hold. The right answer, and a gamble. | +| **Stop it now** | Clean close, clean file. Sixty-one people end. Kell will do it if asked. | +| **Children and crew off, then stop it** | The compromise every table finds. It works — and it means choosing, by name, off a manifest they are holding. | +| **Leave it running** | Everyone lives today. It fails inside a year with everyone aboard. A real option; the scenario logs it without punishing it. | + +### If they ask Vane + +> I filed a chart that said the line was somewhere it was not, because a man told me to +> and I wanted the work. That is all I did. It took six months of honest railwaymen +> repeating it to make it true. If you stop us I would call that fair, and I would ask you +> to put the children off first. + +--- + +## Epilogue — the register *(~20 min)* + +A Registry room, a form, and somebody writing down sixty-one names. + +| Ending | What the register says | +|---|---| +| **All off, then stopped** | Sixty-one resettled in 1881, new papers, no way home. Two find their way into the department's files within the decade. | +| **Stopped with people aboard** | Closes clean. The file closes clean. Nobody is quite the same about a timetable. | +| **Partial** | However many were put off, put off. The rest are a number in a column, and the agent who chose is named. | +| **Left running** | Logged, monitored, inherited by whoever holds the case in a year. Defensible. Nobody thanks them. | + +--- + +## Cast + +| Who | Wants | Key line | +|---|---|---| +| **Marius Kell**, engineer | to be allowed to stop | *"You tell me when. I'll not do it before you say."* | +| **Elias Vane**, surveyor | to be asked, at last | *"I signed it. Six months of honest men made it true."* | +| **Hester Bligh**, conductor | her passengers accounted for | *"Sixty-one aboard. I have counted them every hour since."* | +| **Ada Reyes**, telegraph | an answer up the line | *"It never got to Fallon. I've sent it forty times."* | +| **Mr Bewley**, Registry | the chart, and the truth written down | *"Bring me the paper. The paper is the case."* | + +--- + +## Do not resolve + +- **Why the coal has not run out.** The wave sustains it; that is as far as anyone gets. +- **What is at the far end of the line.** Nobody aboard has reached it. +- **Whether the people put off in 1881 were saved or exiled.** Both. It should sit badly. + +## GM notes + +- **Play the passengers as people, hard.** The scenario dies the moment they become a + number, and it lives on the fact that they are not. +- **Standing Order 9 is the tutorial.** Do not soften it and do not apologise for it. +- **Cut first:** the town, down to the livery and the telegraph office. Never cut the + boarding. +- **If they crack it early,** run the passes — six of them, forty minutes apart — and let + the table feel the arithmetic they are betting on. + +--- + +## Which scenario to run + +| | Length | Combat | Sends them across | +|---|---|---|---| +| **LAST ADMISSION** | 2h | yes, one fight | no — prologue, civilians | +| **OPEN DAY** | 2h15 | no | no — prologue, civilians | +| **THROUGH TRAIN** | 3h30 | no | **yes** — the first real case | +| **BLACK PLATFORM** | 3–4h | yes, heavily | no — a modern-day action case | + +Run a prologue, then THROUGH TRAIN. BLACK PLATFORM is the one to reach for when a table +wants a fight. diff --git a/packs/armour/LOG b/packs/armour/LOG index a9ce3a0..843be17 100644 --- a/packs/armour/LOG +++ b/packs/armour/LOG @@ -1 +1 @@ -2026/08/18-00:10:28.183213 16f9eb000 Delete type=3 #1 +2026/08/18-00:25:18.939914 16fcaf000 Delete type=3 #1 diff --git a/packs/expedition/LOG b/packs/expedition/LOG index 7b5cdac..a388aa5 100644 --- a/packs/expedition/LOG +++ b/packs/expedition/LOG @@ -1 +1 @@ -2026/08/18-00:10:28.247767 16e9d3000 Delete type=3 #1 +2026/08/18-00:25:19.010528 1704bb000 Delete type=3 #1 diff --git a/packs/gear/LOG b/packs/gear/LOG index 92bb0dc..55953be 100644 --- a/packs/gear/LOG +++ b/packs/gear/LOG @@ -1 +1 @@ -2026/08/18-00:10:28.184766 1701f7000 Delete type=3 #1 +2026/08/18-00:25:18.941763 16f4a3000 Delete type=3 #1 diff --git a/packs/lastadmission/LOG b/packs/lastadmission/LOG index 9fe01e4..8b22fcb 100644 --- a/packs/lastadmission/LOG +++ b/packs/lastadmission/LOG @@ -1 +1 @@ -2026/08/18-00:10:28.233431 16f9eb000 Delete type=3 #1 +2026/08/18-00:25:18.995451 16f4a3000 Delete type=3 #1 diff --git a/packs/npcs/LOG b/packs/npcs/LOG index fedaee0..533ff49 100644 --- a/packs/npcs/LOG +++ b/packs/npcs/LOG @@ -1 +1 @@ -2026/08/18-00:10:28.217982 16f1df000 Delete type=3 #1 +2026/08/18-00:25:18.976255 16fcaf000 Delete type=3 #1 diff --git a/packs/powers/LOG b/packs/powers/LOG index fecbdf7..1b54c0c 100644 --- a/packs/powers/LOG +++ b/packs/powers/LOG @@ -1 +1 @@ -2026/08/18-00:10:28.243180 16e9d3000 Delete type=3 #1 +2026/08/18-00:25:19.005331 16ec97000 Delete type=3 #1 diff --git a/packs/pregens/000003.log b/packs/pregens/000003.log index c49c543..703492d 100644 Binary files a/packs/pregens/000003.log and b/packs/pregens/000003.log differ diff --git a/packs/pregens/LOG b/packs/pregens/LOG index 066498d..f31b71a 100644 --- a/packs/pregens/LOG +++ b/packs/pregens/LOG @@ -1 +1 @@ -2026/08/18-00:10:28.204150 16f9eb000 Delete type=3 #1 +2026/08/18-00:25:18.961584 16ec97000 Delete type=3 #1 diff --git a/packs/primer/LOG b/packs/primer/LOG index 508b740..48cad76 100644 --- a/packs/primer/LOG +++ b/packs/primer/LOG @@ -1 +1 @@ -2026/08/18-00:10:28.240419 16f1df000 Delete type=3 #1 +2026/08/18-00:25:19.002226 16f4a3000 Delete type=3 #1 diff --git a/packs/prologue/LOG b/packs/prologue/LOG index 1c82dfb..9d2cfe8 100644 --- a/packs/prologue/LOG +++ b/packs/prologue/LOG @@ -1 +1 @@ -2026/08/18-00:10:28.237109 16e9d3000 Delete type=3 #1 +2026/08/18-00:25:18.999210 16fcaf000 Delete type=3 #1 diff --git a/packs/rules/LOG b/packs/rules/LOG index a652db8..738903e 100644 --- a/packs/rules/LOG +++ b/packs/rules/LOG @@ -1 +1 @@ -2026/08/18-00:10:28.246420 16f9eb000 Delete type=3 #1 +2026/08/18-00:25:19.008595 16f4a3000 Delete type=3 #1 diff --git a/packs/skills/LOG b/packs/skills/LOG index 85ead0c..5025ab1 100644 --- a/packs/skills/LOG +++ b/packs/skills/LOG @@ -1 +1 @@ -2026/08/18-00:10:28.177717 16f1df000 Delete type=3 #1 +2026/08/18-00:25:18.934271 16fcaf000 Delete type=3 #1 diff --git a/packs/slice/LOG b/packs/slice/LOG index 5c78192..6c6f88c 100644 --- a/packs/slice/LOG +++ b/packs/slice/LOG @@ -1 +1 @@ -2026/08/18-00:10:28.241902 16f9eb000 Delete type=3 #1 +2026/08/18-00:25:19.003783 16fcaf000 Delete type=3 #1 diff --git a/packs/starter/LOG b/packs/starter/LOG index eda84ca..f26d922 100644 --- a/packs/starter/LOG +++ b/packs/starter/LOG @@ -1 +1 @@ -2026/08/18-00:10:28.227548 16e9d3000 Delete type=3 #1 +2026/08/18-00:25:18.985846 16f4a3000 Delete type=3 #1 diff --git a/packs/tables/LOG b/packs/tables/LOG index 4f4055f..d165e04 100644 --- a/packs/tables/LOG +++ b/packs/tables/LOG @@ -1 +1 @@ -2026/08/18-00:10:28.221971 1701f7000 Delete type=3 #1 +2026/08/18-00:25:18.980204 16fcaf000 Delete type=3 #1 diff --git a/packs/talents/LOG b/packs/talents/LOG index 4959873..45ea4c9 100644 --- a/packs/talents/LOG +++ b/packs/talents/LOG @@ -1 +1 @@ -2026/08/18-00:10:28.180038 1701f7000 Delete type=3 #1 +2026/08/18-00:25:18.936682 16f4a3000 Delete type=3 #1 diff --git a/packs/throughtrain/000003.log b/packs/throughtrain/000003.log new file mode 100644 index 0000000..706fd7f Binary files /dev/null and b/packs/throughtrain/000003.log differ diff --git a/packs/throughtrain/CURRENT b/packs/throughtrain/CURRENT new file mode 100644 index 0000000..1a84852 --- /dev/null +++ b/packs/throughtrain/CURRENT @@ -0,0 +1 @@ +MANIFEST-000002 diff --git a/packs/throughtrain/LOG b/packs/throughtrain/LOG new file mode 100644 index 0000000..4028c0d --- /dev/null +++ b/packs/throughtrain/LOG @@ -0,0 +1 @@ +2026/08/18-00:25:18.991213 1704bb000 Delete type=3 #1 diff --git a/packs/throughtrain/MANIFEST-000002 b/packs/throughtrain/MANIFEST-000002 new file mode 100644 index 0000000..bbbc585 Binary files /dev/null and b/packs/throughtrain/MANIFEST-000002 differ diff --git a/packs/vehicles/LOG b/packs/vehicles/LOG index b5a3854..aa3bcad 100644 --- a/packs/vehicles/LOG +++ b/packs/vehicles/LOG @@ -1 +1 @@ -2026/08/18-00:10:28.186339 1701f7000 Delete type=3 #1 +2026/08/18-00:25:18.943608 16f4a3000 Delete type=3 #1 diff --git a/packs/weapons/LOG b/packs/weapons/LOG index c506404..6cf129c 100644 --- a/packs/weapons/LOG +++ b/packs/weapons/LOG @@ -1 +1 @@ -2026/08/18-00:10:28.181674 1701f7000 Delete type=3 #1 +2026/08/18-00:25:18.938385 16fcaf000 Delete type=3 #1 diff --git a/postings.mjs b/postings.mjs index f1d5d40..4e2c182 100644 --- a/postings.mjs +++ b/postings.mjs @@ -60,8 +60,8 @@ export const ROLES = { registry: { label: "Registry Officer", blurb: "Keeps the record that a crossing is made against. Knows what the file says and, more usefully, what it used to say.", stat: "edu", - core: ["occult","knowledge","anomaly_lore","language:own","computer_use","insight"], - support: ["spot","art","first_aid","tradecraft","firearm:pistol"], + core: ["research","occult","knowledge","anomaly_lore","language:own"], + support: ["computer_use","insight","spot","first_aid","tradecraft","firearm:pistol"], talents: ["chain_custody","wrong_memory","debriefer","quorum"], kit: ["spectacles","notebook","handset","jacket","pistol_light", "carbon_book", "date_stamp", "seals"] }, @@ -173,7 +173,7 @@ export const ROLES = { antiquities: { label: "Antiquities Officer", blurb: "An archaic posting the department never abolished. Old objects, older records, and the manners to ask about both.", stat: "edu", core: ["religion","art","anomaly_lore","research","status"], - support: ["insight","spot","first_aid","melee_weapon:sword","firearm:pistol"], + support: ["knowledge","insight","spot","first_aid","melee_weapon:sword","firearm:pistol"], talents: ["chain_custody","wrong_memory","borrowed_hour","quorum"], kit: ["pocket_watch","tallow_candle","duelling_sword","brigandine","flintlock", "quill_ink", "sealing_wax", "sand_glass"] }, diff --git a/system.json b/system.json index 222aed3..dd414c7 100644 --- a/system.json +++ b/system.json @@ -2,7 +2,7 @@ "id": "ringbrp", "title": "The Custodians", "description": "A Basic Roleplaying game of agents who cross the crossing to contain what should not be there — and who come back a little less from here each time.", - "version": "1.2.0", + "version": "1.3.0", "compatibility": { "minimum": 13, "verified": "14.364" @@ -127,6 +127,13 @@ "type": "JournalEntry", "system": "ringbrp" }, + { + "name": "throughtrain", + "label": "The Custodians · THROUGH TRAIN (crossing starter)", + "path": "packs/throughtrain", + "type": "Adventure", + "system": "ringbrp" + }, { "name": "starter", "label": "The Custodians · BLACK PLATFORM (starter case)", @@ -184,6 +191,7 @@ "name": "Scenarios", "sorting": "m", "packs": [ + "throughtrain", "lastadmission", "prologue", "starter", diff --git a/tools/build-packs.mjs b/tools/build-packs.mjs index fd91503..1e1eec2 100644 --- a/tools/build-packs.mjs +++ b/tools/build-packs.mjs @@ -864,6 +864,106 @@ function cullandScene() { }; } +// THROUGH TRAIN — the crossing starter. Unlike the two prologues this one has a real +// case file, because it is the first time the players are sent ACROSS and the case +// tracks are the point. +{ + const X = await import("./scenario-throughtrain.mjs"); + + const castDocs = []; + for (const spec of X.TT_CAST) { + const { actorDoc, itemDocs } = buildActor(spec, "npc"); + actorDoc.items = itemDocs; + castDocs.push(actorDoc); + } + + // The case file, already at its opening state, with Standing Order 9 in the notes. + const C = X.TT_CASE; + const caseId = idFor(`actor:${C.key}`); + const caseDoc = { + _id: caseId, name: C.name, type: "expedition", img: ICON.caseFile ?? ICON.actor, + system: { + integrityMode: "abstract", + integrity: { value: C.containment, max: 10 }, + supply: { value: C.resources, max: 10 }, + power: { value: C.clearance, max: 10 }, + assets: [], members: [], + journey: { + destinationId: "mercy_draw", destinationName: C.destination, + destinationKnowledge: "briefed", currentLeg: 0, elapsedDays: 0, + siteTableId: "sites", hazardTableId: "hazards", returnClock: 0, + legs: C.legs.map((l, i) => ({ + index: i, terrain: l.label, mode: "foot", kind: l.kindId, + difficulty: l.difficulty, modifier: l.mod, days: 0, + explored: true, resolved: false, forcedEncounterId: "", + costSupply: 1, costPower: 0 + })) + }, + standings: [], + across: false, crossingModifier: 0, salvageEra: "antique", + notes: C.notes + }, + items: [], effects: [], + prototypeToken: { name: C.name, displayName: 20, actorLink: true, width: 1, height: 1, + texture: { src: ICON.actor }, sight: { enabled: false }, disposition: 1, + bar1: { attribute: "integrity" }, bar2: { attribute: "supply" }, flags: {} }, + ...BASE() + }; + castDocs.push(caseDoc); + + const gmJournal = journalDoc("THROUGH TRAIN — Run the case", "tt_gm", X.TT_PAGES); + const handouts = journalDoc("THROUGH TRAIN — Player handouts", "tt_handouts", X.TT_HANDOUTS); + handouts.doc.ownership = { default: 2 }; + handouts.doc.flags = { ringbrp: { brand: true } }; + for (const pg of handouts.pages) pg.ownership = { default: 2 }; + + const showJournal = imageJournal("THROUGH TRAIN — Show the players", "tt_show", [ + { name: "1 · Mercy Draw, now", src: "art/scenes/tt_01_draw.webp" }, + { name: "2 · Stores, and the 1881 issue", src: "art/scenes/tt_02_stores.webp" }, + { name: "3 · The grade on the south bench", src: "art/scenes/tt_03_bench.webp" }, + { name: "4 · Cordera, 1881", src: "art/scenes/tt_04_cordera.webp" }, + { name: "5 · The water tower — boarding", src: "art/scenes/tt_05_boarding.webp" }, + { name: "6 · Inside car three", src: "art/scenes/tt_06_car.webp" }, + { name: "7 · Afterwards, the register", src: "art/scenes/tt_07_after.webp" } + ]); + + const advId = idFor("adventure:through_train"); + const adventure = { + _id: advId, + name: "THROUGH TRAIN — The Mercy Draw Crossing", + img: IC("actor_case") ?? ICON.caseFile ?? ICON.actor, + caption: "The crossing starter. Three and a half hours, and nothing modern goes through.", + description: + "
A train has been running the same four miles of track since the third of " + + "November, 1881. It has never stopped. There are sixty-one people on it and they " + + "are all still alive.
" + + "A railway company laid track to a filed survey instead of to the ground, then " + + "described the line as being where it was not — ten thousand times, for six " + + "months, at a constant speed. Reality keeps a record of what belongs where, and " + + "that is the most patient argument there is.
" + + "The running is what holds the crossing open. The agents have to board a train " + + "that cannot stop, get sixty-one people off it, and decide what to do about the " + + "arithmetic when they find they cannot.
" + + "Also the case that teaches Standing Order 9: nothing modern goes " + + "through. Seven GM pages, six handouts including the survey that started " + + "it, the case file, four of the people aboard, and seven plates to show.
", + actors: castDocs, + items: [], + journal: [ + { ...gmJournal.doc, pages: gmJournal.pages }, + { ...handouts.doc, pages: handouts.pages }, + { ...showJournal.doc, pages: showJournal.pages } + ], + scenes: [], combats: [], tables: [], macros: [], cards: [], playlists: [], folders: [], + sort: 0, ...BASE() + }; + + await writePack("throughtrain", [[`!adventures!${advId}`, adventure]]); + console.log(` throughtr THROUGH TRAIN — ${castDocs.length} actors, ` + + `${X.TT_PAGES.length} GM pages, ${X.TT_HANDOUTS.length} handouts, ` + + `${showJournal.pages.length} plates`); +} + // LAST ADMISSION — the two-hour prologue, and the one to run by default. Same shape as // OPEN DAY's adventure and for the same reason: journals and cast only, because the // player characters are the "(before)" pregens in the Pregens pack. diff --git a/tools/scenario-throughtrain.mjs b/tools/scenario-throughtrain.mjs new file mode 100644 index 0000000..9163b4e --- /dev/null +++ b/tools/scenario-throughtrain.mjs @@ -0,0 +1,596 @@ +/** + * THROUGH TRAIN — the crossing starter, as data. + * + * "Through train" is the railway term for a service that passes without stopping. It is + * also the department's case name, and it is the problem: the players must get aboard a + * train that cannot stop, because the running is what holds the crossing open. + * + * The supernatural here is science fiction underneath. Nobody aboard is dead and nothing + * is haunting anybody. In 1881 a railway company laid track to a filed survey rather than + * to the ground, then described the resulting line ten thousand times — timetables, + * waybills, dispatches, telegraph orders — as being somewhere it was not. Reality keeps a + * record of what belongs where, and an argument made at a constant speed on a fixed line + * for six months is the most patient argument there is. On 3 November 1881 the record + * gave way, and the train that was inside it at 11:40 has been running ever since. + * + * It is a standing wave. The motion sustains the error the way a bow sustains a note. + * Stop the train and the note ends — and everything the note is holding open ends with + * it, including sixty-one people, unless they are off first. + * + * This is also the scenario that teaches the standing order on period crossings: NOTHING + * MODERN GOES THROUGH. The catalogue already carries the 1881 issue — Webley, Martini- + * Henry, oil lantern, brass compass, pocket watch — so the constraint costs the GM + * nothing to enforce and gives the players something to feel. + * + * Full GM document: docs/scenarios/THROUGH_TRAIN.md. + */ + +const P = s => `${s}
`; +const H = (n, s) => `| ${h} | `).join("")}
|---|
| ${c} | `).join("")}
${s}`; +const ART = (id, alt) => + `

11:31 No.9 out of Cordera, on time, 61 souls and mixed freight11:38 No.9 entering the Draw. Whistle heard. Clear road to Fallon11:45 —11:52 Fallon asks after No.912:20 Fallon says No.9 has not arrived. Line walked. Nothing found14:00 Line walked again, both benches. Nothing found")
+ + P("There is no 11:45 entry. The page is not torn and nothing is "
+ + "crossed out. The clerk simply had nothing to write.")
+},
+
+{ name: "6 · Passenger manifest", content:
+ P("No. 9 · 3 NOVEMBER 1881 · SIXTY-ONE SOULSCrossing clock 0 / 6. Move it on each pass of the train, when " + + "somebody uses a modern object across, and on a fumbled attempt to board.
" + + "0 Open · 1 Thinning · 2 Slipping (−1 Coherence, once) · 3 The line flickers " + + "· 4 The far end stops answering · 5 One pass left · 6 It closes, with whoever is " + + "aboard.
" + + "Standing Order 9 is live: using any modern item across costs 1 " + + "Coherence the first time and moves this clock. Carrying costs nothing. Anchors " + + "are exempt.
" + + "Issued for this case: Webley revolvers, one Martini-Henry, oil " + + "lanterns and oil, brass compass, pocket watch, spyglass, buff coats, a chirurgeon's " + + "roll, laudanum, iron manacles, and period coin.
", + legs: [ + { label: "Approach — Mercy Draw, present day", kindId: "approach", difficulty: "average", mod: 0 }, + { label: "Across — Cordera, 1881", kindId: "cordon", difficulty: "average", mod: -5 }, + { label: "Containment — board the train", kindId: "containment", difficulty: "difficult", mod: -10 }, + { label: "Extraction — off the grade, and out", kindId: "extraction", difficulty: "average", mod: -10 } + ] +};