diff --git a/assets/adventures/false-alarm/map-crossing.png b/assets/adventures/false-alarm/map-crossing.png new file mode 100644 index 0000000..cabd1a9 Binary files /dev/null and b/assets/adventures/false-alarm/map-crossing.png differ diff --git a/assets/adventures/false-alarm/map-crossing.svg b/assets/adventures/false-alarm/map-crossing.svg new file mode 100644 index 0000000..10349b1 --- /dev/null +++ b/assets/adventures/false-alarm/map-crossing.svg @@ -0,0 +1,96 @@ + diff --git a/assets/adventures/false-alarm/token-agnes.png b/assets/adventures/false-alarm/token-agnes.png new file mode 100644 index 0000000..5281adc Binary files /dev/null and b/assets/adventures/false-alarm/token-agnes.png differ diff --git a/assets/adventures/false-alarm/token-agnes.svg b/assets/adventures/false-alarm/token-agnes.svg new file mode 100644 index 0000000..4df7355 --- /dev/null +++ b/assets/adventures/false-alarm/token-agnes.svg @@ -0,0 +1,33 @@ + diff --git a/assets/adventures/false-alarm/token-called.png b/assets/adventures/false-alarm/token-called.png new file mode 100644 index 0000000..88bf988 Binary files /dev/null and b/assets/adventures/false-alarm/token-called.png differ diff --git a/assets/adventures/false-alarm/token-called.svg b/assets/adventures/false-alarm/token-called.svg new file mode 100644 index 0000000..3ce139b --- /dev/null +++ b/assets/adventures/false-alarm/token-called.svg @@ -0,0 +1,30 @@ + diff --git a/assets/adventures/false-alarm/token-returned-dale.png b/assets/adventures/false-alarm/token-returned-dale.png new file mode 100644 index 0000000..731b4e9 Binary files /dev/null and b/assets/adventures/false-alarm/token-returned-dale.png differ diff --git a/assets/adventures/false-alarm/token-returned-dale.svg b/assets/adventures/false-alarm/token-returned-dale.svg new file mode 100644 index 0000000..4dbc6ab --- /dev/null +++ b/assets/adventures/false-alarm/token-returned-dale.svg @@ -0,0 +1,29 @@ + diff --git a/assets/adventures/false-alarm/token-returned-roy.png b/assets/adventures/false-alarm/token-returned-roy.png new file mode 100644 index 0000000..c252d1c Binary files /dev/null and b/assets/adventures/false-alarm/token-returned-roy.png differ diff --git a/assets/adventures/false-alarm/token-returned-roy.svg b/assets/adventures/false-alarm/token-returned-roy.svg new file mode 100644 index 0000000..b261d44 --- /dev/null +++ b/assets/adventures/false-alarm/token-returned-roy.svg @@ -0,0 +1,35 @@ + diff --git a/build/gen-false-alarm.mjs b/build/gen-false-alarm.mjs index f53b1e1..e4e58ff 100644 --- a/build/gen-false-alarm.mjs +++ b/build/gen-false-alarm.mjs @@ -65,6 +65,8 @@ const items = [ "Incendiary supplied for sanitation. Burns hot enough to reduce a frozen body — or a data drive — to slag. Needed to dispose of Dr. Rostova's remains without leaving forensic questions."), gearItem("Cold-Weather Field Kit", "camping-gear", "Standard", "Parkas, chemical heat packs, headlamps and rope. The dome interior is pitch black and the whole site is well below freezing; Agents without light and warmth accrue penalties over a long night."), + gearItem("Elias Corliss's Ham Handset", "walkie-talkie", "Trivial", + "A 1970s hand microphone on a worn leather strap, wired to nothing. Agnes Corliss has carried it since her husband died at his radio bench in 1988. The Tear speaks to her through it — it is the anchor of the Chorus. Destroying it (called shot −20%, 6 HP) or taking it from her silences the static and frees the Called. Afterward it is inert — but at 3 a.m. it is very slightly cold to the touch."), ]; // ---------------------------------------------------------------- actors @@ -122,7 +124,56 @@ const aTear = npcActor({ shortDescription: "An extradimensional entity that mimics radio frequencies.", notes: "
Not a creature so much as a place that should not touch this one: a shifting, non-Euclidean fractal silhouette that bleeds through the centre of the radar dish when the broadcast peaks. The air turns static-charged; hair stands on end; the temperature crashes.
The tear cannot be fought, only closed by killing the broadcast:
When power dies the tear snaps back, and the vacuum implodes the dome.
", }); -const actors = [aRostova, aVance, aTear]; +// ---- Midpoint encounter: The Congregation ---- + +const aAgnes = npcActor({ + key: "agnes", name: "Agnes Corliss, the Switchboard Widow", type: "unnatural", + img: `${A}/token-agnes.png`, token: `${A}/token-agnes.png`, + stats: { str: 8, con: 12, dex: 9, int: 14, pow: 18, cha: 16 }, health: 10, + san: { failed: "1D6", success: "1" }, + skills: { alertness: 55, occult: 40, persuade: 60, sigint: 50 }, + shortDescription: "The Tear speaks through her dead husband's handset.", + notes: "Great-granddaughter of the town's founders. Her husband Elias died at his ham bench in 1988, headphones on, tuned to the ridge. Agnes has listened every night since — and three months ago, the ridge started answering in Elias's voice. She believes the broadcast is heaven. She has been gathering the weak-willed of Corliss Notch to “hear the call.” Tonight she has brought them to meet it.
The Chorus anchors through Elias's handset on her belt (called shot −20%, 6 HP, or a successful grapple to snatch it). Destroy or take it — or deafen her (flash-bang) — and the Chorus dies: Stand Still drops to 45%, the Called wake, and Agnes collapses into a confused, weeping old woman asking where Elias has gone. She is a victim. What A-Cell does with her afterward is the Handler's knife to twist.
SAN to witness the Chorus in a dead loved one's voice: 1/1D6.
", +}); + +const aDale = npcActor({ + key: "dale", name: "Dale Petrie, Returned", type: "unnatural", + img: `${A}/token-returned-dale.png`, token: `${A}/token-returned-dale.png`, + stats: { str: 17, con: 16, dex: 12, int: 7, pow: 12, cha: 4 }, health: 17, + san: { failed: "1D6", success: "1" }, + skills: { alertness: 50, athletics: 60, melee_weapons: 60, unarmed_combat: 55, swim: 70 }, + shortDescription: "Ten weeks drowned. Walking anyway.", + weapons: [ + { name: "Boat Hook", icon: "forcible-entry-tool", skill: "melee_weapons", damage: "1D8+2", range: "0M" }, + { name: "Grasp of the Drowned", icon: "unarmed", skill: "unarmed_combat", damage: "1D6+1", range: "0M" }, + ], + notes: "The elder of the vanished hunters. Ten weeks at the bottom of Cold Cauldron Pond, and now he stands at its edge, soaked and patient, holding the boat hook he went in with. The Tear kept the shape and threw away most of the man.
SAN to see one clearly: 1/1D6.
", +}); + +const aRoy = npcActor({ + key: "roy", name: "Roy Petrie, Returned", type: "unnatural", + img: `${A}/token-returned-roy.png`, token: `${A}/token-returned-roy.png`, + stats: { str: 18, con: 16, dex: 11, int: 6, pow: 12, cha: 4 }, health: 17, + san: { failed: "1D6", success: "1" }, + skills: { alertness: 45, athletics: 60, melee_weapons: 60, unarmed_combat: 55, swim: 70 }, + shortDescription: "The younger brother. He hums the broadcast now.", + weapons: [ + { name: "Splitting Maul", icon: "wood-axe", skill: "melee_weapons", damage: "1D10+2", range: "0M" }, + { name: "Grasp of the Drowned", icon: "unarmed", skill: "unarmed_combat", damage: "1D6+1", range: "0M" }, + ], + notes: "The younger, bigger brother. One eye is frozen shut; his jaw hangs; from somewhere inside him comes the six-second static loop, humming, over and over. He carries the splitting maul from his own woodpile.
Use Dale's stat block — identical rules, except: Splitting Maul 60%, 1D10+2 (slower, meaner). Roy always moves toward whoever is LOUDEST — gunfire, shouting, a radio squawk. Handler note: point him at the Agent doing the most talking.
Armor 3 (frost-hardened flesh) · fire = double damage · HUMINT name-call makes him hesitate once · Baptism drag with Dale · SAN 1/1D6.
", +}); + +const aCalled = npcActor({ + key: "called", name: "The Called (Notch townsfolk)", type: "npc", + img: `${A}/token-called.png`, token: `${A}/token-called.png`, + stats: { str: 11, con: 11, dex: 10, int: 10, pow: 10, cha: 10 }, health: 11, san: 40, + skills: { alertness: 30, athletics: 30, unarmed_combat: 40 }, + shortDescription: "Five entranced neighbours. They are crying while they do it.", + notes: "Cody Aldous (17, deleted the livestream), Ruth the diner cook, Whit Emmons the trapper, and the Pelletier couple from the feed store. They stand in the snow in their nightclothes and hunting jackets, faces upturned, humming the six-second loop in unison. Look closely (HUMINT 40%): they are weeping while they hum. They are prisoners in their own bodies.
Killing one of the Called costs the shooter 1/1D8 SAN — they are innocent — and hands the cover-up (journal ⓫) a body that cannot be blamed on weather. The Handler should make the easy trigger-pull expensive.
", +}); + +const actors = [aRostova, aVance, aTear, aAgnes, aDale, aRoy, aCalled]; // ---------------------------------------------------------------- journals let jSort = 0; @@ -209,6 +260,8 @@ const journal_gm_scenes = journal("09-gm-scenes", "⑨ GM — Scene Guide & "A fenced compound: one concrete equipment building and a massive geodesic radar dome over the pines. Heavy snow.
The concrete building runs on a failing backup generator that hums unsteadily. Dr. Elena Rostova is dead at the console: frozen solid in a 40°F room, eyes wide, lips torn from her teeth.
Between the server room and the dome, the town comes up the mountain. When the Agents step back outside — or drive for the dome — headlights crest the Ridge Road at mile 9, and under the wind they hear it: a dozen human voices humming the six-second static loop in unison.
Full encounter, map, and stat blocks: journal ⓬ GM — MIDPOINT: The Congregation. Run it before Scene 3; it is the operation's turn from investigation to horror.
"), textPage("Scene 3 — The Radar Dome", "The upper catwalk inside the dome is pitch black, reeking of ozone and scorched copper. Deputy Vance is here — blind, self-mutilated, frantically rewiring the transmitter to broadcast the static loop at maximum amplification.
The tear cannot be fought — only starved of signal. Cut the primary power (blow the outside generator, or overload the dome transformer by hand at lethal cost) and the channel collapses: the entity snaps back and the vacuum implodes the dome. If the Agents fail, the broadcast completes, the doorway holds open, and Sable Ridge becomes a permanent cold spot that swallows the Notch over the following winter — a much larger Delta Green problem, later.
"), ]); +const journal_midpoint = journal("13-gm-midpoint", "⑬ GM — MIDPOINT: The Congregation", [ + imagePage("Cold Cauldron Crossing", `${A}/map-crossing.svg`, "Ridge Road, mile 9 — the battle map is in the Scenes folder."), + textPage("The Setup", + "The broadcast has been calling Corliss Notch for weeks — the hum, the radio that answers, the names. Tonight, as the transmitter nears full power, the most susceptible finally answered. Agnes Corliss, who has heard her dead husband in the static for months, has led five entranced neighbours up the Ridge Road to “meet the call.” And at Cold Cauldron Pond, the Tear has sent up what it kept: the Petrie brothers.
Trigger: run this when the Agents leave the equipment building for the dome (or try to drive back down). A jackknifed log truck blocks the road at mile 9; vehicles cluster with doors open, engines running; six figures stand in a circle in the snow, faces upturned, humming. The pond glimmers to the south. Read-aloud:
"), + textPage("The Opposition", + "The snow parts around them like they've been standing there an hour. Old Agnes Corliss stands at the centre in her nightcoat, one hand pressing a dead man's radio handset to her ear. Without turning, she says your point-man's name — first, middle, last — in a voice that is not hers. From the pond shore, two big men in soaked hunting jackets begin to walk up the bank. They have been dead for ten weeks, and they are smiling like they're late for supper.
Four actor sheets in the FALSE ALARM folder carry the full rules:
Balance note (4 Agents): this is deliberately unwinnable as a straight shootout — ~34 effective HP of armored Returned plus five bodies the Agents must not shoot, while Agnes strips actions and SAN. The door out is the handset.
"), + textPage("Running It — tactics, outs, aftermath", + "Round order of intent: the Called advance to restrain; the Returned make for whoever resists hardest (Roy goes for the loudest); Agnes stands still and takes Agents apart with words. Anyone dragged to the pond has 2 rounds before they go under.
Ways to win that aren't massacre:
Aftermath: freed Called remember everything as a dream of “the most beautiful voice.” Waking all five alive: +1 SAN each Agent. Agnes, if freed, keeps asking where Elias went — and once, flatly, in the wrong voice: “IT IS ALMOST DONE LEARNING OUR SHAPE.” That is the players' warning for Scene 3. Every civilian death here becomes a named problem in ⓫ Cover-Up.
"), +]); + const journal_gm_after = journal("12-gm-after", "⑫ GM — Cover-Up & Aftermath", [ textPage("Loose ends", "