diff --git a/assets/adventures/false-alarm/hd-briefing-memo.svg b/assets/adventures/false-alarm/hd-briefing-memo.svg new file mode 100644 index 0000000..1d46272 --- /dev/null +++ b/assets/adventures/false-alarm/hd-briefing-memo.svg @@ -0,0 +1,75 @@ + diff --git a/assets/adventures/false-alarm/hd-newspaper.svg b/assets/adventures/false-alarm/hd-newspaper.svg new file mode 100644 index 0000000..ed473c8 --- /dev/null +++ b/assets/adventures/false-alarm/hd-newspaper.svg @@ -0,0 +1,96 @@ + diff --git a/assets/adventures/false-alarm/hd-personnel.svg b/assets/adventures/false-alarm/hd-personnel.svg new file mode 100644 index 0000000..df25ef0 --- /dev/null +++ b/assets/adventures/false-alarm/hd-personnel.svg @@ -0,0 +1,71 @@ + diff --git a/assets/adventures/false-alarm/hd-regional-map.svg b/assets/adventures/false-alarm/hd-regional-map.svg new file mode 100644 index 0000000..4d5b432 --- /dev/null +++ b/assets/adventures/false-alarm/hd-regional-map.svg @@ -0,0 +1,70 @@ + diff --git a/assets/adventures/false-alarm/hd-site-dossier.svg b/assets/adventures/false-alarm/hd-site-dossier.svg new file mode 100644 index 0000000..c7aa7d1 --- /dev/null +++ b/assets/adventures/false-alarm/hd-site-dossier.svg @@ -0,0 +1,77 @@ + diff --git a/assets/adventures/false-alarm/hd-timeline.svg b/assets/adventures/false-alarm/hd-timeline.svg new file mode 100644 index 0000000..aa8d71c --- /dev/null +++ b/assets/adventures/false-alarm/hd-timeline.svg @@ -0,0 +1,89 @@ + diff --git a/build/gen-false-alarm.mjs b/build/gen-false-alarm.mjs index 80d944c..2c5a464 100644 --- a/build/gen-false-alarm.mjs +++ b/build/gen-false-alarm.mjs @@ -141,35 +141,70 @@ function journal(key, name, pages) { _key: undefined }; } -const journal_briefing = journal("01-briefing", "① BRIEFING — Operation FALSE ALARM", [ - imagePage("Operation File", `${A}/cover.svg`, "TOP SECRET // DELTA GREEN — EYES ONLY"), +const journal_briefing = journal("01-briefing", "① OPERATIONAL BRIEFING", [ + imagePage("A-Cell Operations Directive", `${A}/hd-briefing-memo.svg`, "Hand this to the players. TOP SECRET // GALVANIZE // NOFORN."), textPage("Your Cover & Your Handler", - "
You are federal law-enforcement officers and specialists. Your Delta Green handler in A-Cell has pulled you off the books for the night. Cover story: a joint FAA / NWS team responding to a “severe weather generator failure” at a remote automated radar station.
You were briefed by phone. There was no paperwork. There will be none.
"), + "You are federal law-enforcement officers and specialists. Your Delta Green handler in A-Cell — callsign “Provost” — has pulled you off the books for the night. Cover story: a joint FAA / NWS team responding to a “severe weather-generator failure” at a remote automated radar station in the North Maine Woods.
You were briefed by phone. There was no paperwork. There will be none. The county has been told a specialist team is inbound and will not interfere.
"), textPage("The Hook", - "Six hours ago, a standard FAA radar facility in the snowbound wilderness of northern Maine abruptly went offline — after transmitting a corrupted data loop. A local sheriff's deputy, Marcus Vance, drove out to investigate. He never checked back in.
"), + "At 0312 local, FAA long-range radar Site ME-07 (“Sable Ridge”) transmitted a corrupted data loop and went dark. It will not answer a remote reboot. Aroostook County deputy Marcus Vance drove up at about 0500 to investigate. He never checked back in.
A-Cell is interested because the pre-crash frames logged a contact that is not consistent with any aircraft.
"), textPage("The Mission", - "Time, weather, and whatever is out there are all against you. Runtime: 3–4 hours.
"), + "Weapons discreet. No local casualties that can't be blamed on weather or wildlife. If an Agent is compromised by what's on that ridge, the mission comes first. Runtime: 3–4 hours.
"), + textPage("Signal & The Weather", + "Cellular dies about three miles up the Ridge Road. You have encrypted VHF, callsign OUTLAW-6. If your radios begin to answer you, stop transmitting.
Heavy snow tonight; lows to −18°F on high ground; the road is impassable by dawn. Whatever you're going to do, do it before first light.
"), ]); -const journal_radar = journal("02-radar", "② HANDOUT — Radar Terminal Log", [ +const journal_site = journal("02-site", "② THE SITE — FAA Sable Ridge", [ + imagePage("Site Fact Sheet (ME-07)", `${A}/hd-site-dossier.svg`, "Attachment A. Player-facing."), + textPage("What the site is", + "FAA Site ME-07 “Sable Ridge” is an automated ARSR-4 long-range air-route surveillance radar — a joint FAA / USAF / NWS installation filling a coverage gap over the Canadian border approaches. It sits at 2,140 ft on an exposed ridge in the North Maine Woods, fourteen gravel miles up the Ridge Road from the nearest village.
It is unmanned. A contractor (Sygnal Dynamics LLC) services it four times a year. Nobody lives within nine miles. Grid power with a diesel backup generator; a satellite uplink; no cellular. A single chain-link compound holds one concrete equipment building and the geodesic radar dome.
"), + textPage("Why it matters here", + "The ridge had a reputation long before the radar. Trappers avoided it; compasses spin near the summit; the old settler families say it “answers whistles.” When the FAA automated the site in 2016 and left a high-power transmitter running unattended on that ridge, ham operators started logging a faint rhythmic carrier on quiet nights — “the Sable hum.”
About fourteen months ago the site's own self-diagnostics began logging phantom returns: contacts with no transponder and no motion vector that vanish between sweeps. The FAA called it receiver noise and, eventually, sent a technician. See ③ The Area and ⑥ Recent Activity.
"), +]); + +const journal_area = journal("03-area", "③ THE AREA — Corliss Notch & the North Woods", [ + imagePage("Regional Map", `${A}/hd-regional-map.svg`, "Attachment B. Player-facing."), + textPage("Corliss Notch, Maine", + "An unincorporated village of about 310 people in Aroostook County, at the edge of the North Maine Woods. A general store with the only gas for forty miles, the Notch Diner, a Grange hall, a white Congregational church, a volunteer fire department, and a two-deputy sheriff's substation that Marcus Vance runs mostly alone.
It is a logging-and-trapping town losing its young people. Everyone knows everyone. Strangers are noticed — your cover will be tested at the diner if you stop. The town is fourteen miles and a locked winter gate from the ridge.
"), + textPage("The land & the cold", + "Dense spruce and fir, frozen bogs, and Cold Cauldron Pond below the ridge — a deep, spring-fed pond that “never quite freezes right,” locals say. This winter is the hardest in forty years; the almanac calls it a record cold snap. Around Sable Ridge the temperature runs colder still, in a way the weather service can't explain.
The Ridge Road is gravel, gated in winter, and yours to open. Past mile three there is no cell signal, no houses, and no help.
"), + textPage("Local legend (GM colour)", + "Old-timers call the ridge “the Whistle.” The stories are consistent across a century: the ridge answers — a whistle, a shout, later a radio — and if you answer it back, and keep answering, it draws you off into the cold. An 1888 hunting diary in the Grange archive records a party that “followed a voice they took for a lost man” and lost two of their own. In 1978 a USGS survey team abandoned a cabin on the ridge after “equipment fouling” and one member's breakdown; the report was buried. Locals don't talk about it to outsiders. They just don't go up there after dark.
"), +]); + +const journal_activity = journal("04-activity", "④ RECENT ACTIVITY — Pattern of Events", [ + imagePage("The Aroostook County Ledger", `${A}/hd-newspaper.svg`, "Attachment C. This week's local paper — hand to players."), + imagePage("Pattern of Activity", `${A}/hd-timeline.svg`, "Attachment D. The escalation, years to hours."), + textPage("What has been happening", + "Read the timeline (Attachment D) and the county paper (Attachment C) as the record of a curve that is steepening. In plain terms, working backward from tonight:
Aroostook County deputy, a Corliss Notch native and an Army signals veteran — which may be exactly why the thing on the ridge could reach him: he speaks radio. Steady, well-liked, nine years on the county, running the one-man Notch substation.
He logged four welfare checks on the Ridge Road this month. Dispatch marked him “rattled” after the last, when a trucker's CB “said his kids' names.” He called the site repeatedly the day it went dark, then drove up alone. Recover him if you can — he is a local hero, and his body cannot simply vanish.
"), + textPage("Dr. Elena Rostova, 41", + "FAA contract field engineer (Sygnal Dynamics LLC), fifteen years on remote arrays. Meticulous, skeptical, not a fanciful woman. Sent up two weeks ago to clear the site's recurring “phantom return” fault.
Her early calls home were routine. Then, per her sister in Vermont, she grew “off,” saying the array was “receiving more than it transmits” and the readings “don't make sense in three dimensions.” Last contact four days ago. Her work notes are a priority recovery; sanitize the contract trail behind her.
"), +]); + +const journal_radar = journal("06-radar", "⑥ HANDOUT — Radar Terminal Log", [ imagePage("ASR-11 Final Frames", `${A}/handout-radar-log.svg`, "The last thing the dish saw before it crashed."), textPage("What it shows", "Show players on a Computer Science success accessing the data log. The radar did not track a physical aircraft. It tracked a “geometric shadow” that hovered directly over the dish — no transponder, no altitude, no motion vector — and then the system crashed into a corrupted loop.
"), ]); -const journal_audio = journal("03-audio", "③ HANDOUT — Final Transmission (Audio)", [ +const journal_audio = journal("07-audio", "⑦ HANDOUT — Final Transmission (Audio)", [ imagePage("Static Capture", `${A}/handout-waveform.svg`, "Rhythmic, oscillating static — a six-second loop."), textPage("Listening closely", "Playing back the audio from the final transmission (SIGINT or Science) reveals a rhythmic, oscillating static. Listening to it closely requires a Sanity check (0/1D4).
On a success, the listener notices a hidden, low-frequency human voice buried under the static — whispering the Agents' own names. (Handler: use the players' real character names. Whisper them.)
"), ]); -const journal_tear = journal("04-tear", "④ HANDOUT — THE TEAR (climax only)", [ +const journal_tear = journal("08-tear", "⑧ HANDOUT — THE TEAR (climax only)", [ imagePage("The Manifestation", `${A}/handout-entity.svg`, "DO NOT REVEAL until the broadcast peaks."), textPage("Reveal notes", "Hold this image back until the radar dish activates and the entity bleeds through. The air is static-charged, everyone's hair stands on end, and a shifting, non-Euclidean fractal silhouette tears open at the centre of the dish. Presence costs 1D6/1D20 SAN. Bullets pass through and warp uselessly. See GM — NPCs & The Threat.
"), ]); -const journal_gm_scenes = journal("05-gm-scenes", "⑤ GM — Scene Guide & Clues", [ +const journal_gm_scenes = journal("09-gm-scenes", "⑨ GM — Scene Guide & Clues", [ textPage("Scene 1 — The Arrival", "A fenced compound: one concrete equipment building and a massive geodesic radar dome over the pines. Heavy snow.
Whether Vance succeeds or the Agents trigger it during the fight, the dish activates, spins wildly, and projects a beam of invisible localised EM radiation. The Tear bleeds through (Handout ④).
It cannot be shot. To close it, cut the primary power — blow the backup generator outside, or manually overload the main transformer inside (lethal shock + 1D6/1D20 SAN). When power dies, the tear snaps back and the vacuum implodes the dome.
"), ]); -const journal_gm_threat = journal("06-gm-threat", "⑥ GM — NPCs & The Threat", [ +const journal_gm_threat = journal("10-gm-threat", "⑩ GM — NPCs & The Threat", [ textPage("Dr. Elena Rostova", aRostova.system.notes), textPage("Deputy Marcus Vance (Changed)", aVance.system.notes), textPage("The Tear", aTear.system.notes), ]); -const journal_gm_after = journal("07-gm-after", "⑦ GM — Cover-Up & Aftermath", [ - textPage("Loose ends", - "Eliminating the threat grants +1D4 SAN, minus any losses from collateral damage or a failed cover-up. An Agent who overloaded the transformer by hand carries the worst of it — if they lived.
"), +const journal_gm_truth = journal("11-gm-truth", "⑪ GM — The Truth (What's Really Happening)", [ + textPage("The static between stations", + "The entity has no name and no shape a human keeps. Think of it as a place adjacent to this one that perceives and moves through resonance — frequency, rhythm, the act of a signal answered by a signal. It has brushed against Sable Ridge for as long as anyone has records: the spinning compasses, the ridge that “answers,” the hunters who followed a voice. For most of history it could only whisper, and only to those who whistled back.
"), + textPage("Why now — the beacon", + "In 2016 the FAA left a high-power radar transmitter running unattended on the one ridge that had always half-listened. Years of steady transmission gave the entity a stable channel — a doorway propped a little further open every night. The “phantom returns” the diagnostics logged were it looking back down the beam. The frozen animals, the radio that answers, the Petrie brothers drawn onto the ice — that is it learning to reach through and feed, pulling warmth and living things into the cold on the other side.
"), + textPage("Rostova, Vance, and the doorway", + "Dr. Rostova's servicing tightened the coupling — she tuned the array and, without knowing it, tuned the door. The corrupted data loop was the entity learning to speak in our signal. It took her first (flash-frozen at the console, the cold bleeding backward through the channel). Then it reached down Deputy Vance's radio — the one man for miles who spoke fluent signal — and remade him into an instrument: blind him so nothing distracts, and set him rewiring the transmitter to broadcast the lure at full power and open the way completely.
This is why every layer of the timeline connects: folklore, the hum, the phantom returns, the deaths, the technician, the deputy. It has been one slow inhale. Tonight it exhales.
"), + textPage("How it ends", + "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 journalArr = [journal_briefing, journal_radar, journal_audio, journal_tear, journal_gm_scenes, journal_gm_threat, journal_gm_after] - .map((j) => { delete j._key; return j; }); +const journal_gm_after = journal("12-gm-after", "⑫ GM — Cover-Up & Aftermath", [ + textPage("Loose ends", + "Eliminating the threat grants +1D4 SAN, minus any losses from collateral damage or a failed cover-up. An Agent who overloaded the transformer by hand carries the worst of it — if they lived. If the broadcast completed and the Agents ran, no reward: the ridge is still open, and A-Cell will be back.
"), +]); + +const journalArr = [ + journal_briefing, journal_site, journal_area, journal_activity, journal_persons, + journal_radar, journal_audio, journal_tear, + journal_gm_scenes, journal_gm_threat, journal_gm_truth, journal_gm_after, +].map((j) => { delete j._key; return j; }); // ---------------------------------------------------------------- scenes function gridCfg() { return { type: 1, size: 100, style: "solidLines", thickness: 1, color: "#59ff87", alpha: 0.12, distance: 5, units: "ft" }; } @@ -229,7 +278,7 @@ const adventure = { name: "Operation FALSE ALARM", img: `${A}/cover.svg`, caption: "A tight 3–4 hour Delta Green shotgun scenario — a remote Maine radar station, and the static between stations.", - description: "A remote automated FAA radar station in snowbound northern Maine has gone dark after transmitting a corrupted data loop, and the deputy who went to look never came back. An extradimensional entity is mimicking radio frequencies, drawing humans into the freezing dark.
Importing this adventure creates four Operation FALSE ALARM folders — Actors, Items, Journals and Scenes. Start players in the ① Briefing journal; run the three scenes in order; keep the GM journals (⑤⑥⑦) for yourself. Handout ④ (The Tear) is for the climax only.
3–4 hours · 4–6 Agents.
", + description: "A remote automated FAA radar station in snowbound northern Maine has gone dark after transmitting a corrupted data loop, and the deputy who went to look never came back. An extradimensional entity is mimicking radio frequencies, drawing humans into the freezing dark.
Importing this adventure creates four Operation FALSE ALARM folders — Actors, Items, Journals and Scenes.
Journals ①–⑤ are the players' intelligence packet — a full A-Cell briefing with six document handouts (operational memo, site fact sheet, regional map, the local newspaper, an activity timeline, and personnel dossiers) plus setting write-ups on the site, the town of Corliss Notch, and the years-long escalation. ⑥–⑧ are the in-scene handouts (radar log, static transmission, the Tear — climax only). ⑨–⑫ are GM-only: scene clues, NPC/threat rules, the truth of what's happening, and the cover-up.
Run the three scenes in order. 3–4 hours · 4–6 Agents.
", sort: 0, folder: null, folders, actors, items, journal: journalArr, scenes, cards: [], playlists: [], tables: [], macros: [], combats: [], diff --git a/packs/false-alarm/000005.ldb b/packs/false-alarm/000005.ldb index f270966..053ed94 100644 Binary files a/packs/false-alarm/000005.ldb and b/packs/false-alarm/000005.ldb differ diff --git a/packs/false-alarm/000004.log b/packs/false-alarm/000007.log similarity index 100% rename from packs/false-alarm/000004.log rename to packs/false-alarm/000007.log diff --git a/packs/false-alarm/CURRENT b/packs/false-alarm/CURRENT index 1a84852..f7753e2 100644 --- a/packs/false-alarm/CURRENT +++ b/packs/false-alarm/CURRENT @@ -1 +1 @@ -MANIFEST-000002 +MANIFEST-000006 diff --git a/packs/false-alarm/LOG b/packs/false-alarm/LOG index 939b2e4..98d4b0e 100644 --- a/packs/false-alarm/LOG +++ b/packs/false-alarm/LOG @@ -1,5 +1,3 @@ -2026/07/15-23:34:13.141809 1715e7000 Delete type=3 #1 -2026/07/15-23:34:13.143714 171e7f000 Level-0 table #5: started -2026/07/15-23:34:13.144042 171e7f000 Level-0 table #5: 12085 bytes OK -2026/07/15-23:34:13.144148 171e7f000 Delete type=0 #3 -2026/07/15-23:34:13.144222 171e7f000 Manual compaction at level-0 from '!adventures!5zf355zpx5s1ux56' @ 72057594037927935 : 1 .. '!adventures!5zf355zpx5s1ux56' @ 0 : 0; will stop at (end) +2026/07/16-10:43:02.339226 1702bf000 Recovering log #4 +2026/07/16-10:43:02.340194 1702bf000 Delete type=0 #4 +2026/07/16-10:43:02.340235 1702bf000 Delete type=3 #2 diff --git a/packs/false-alarm/LOG.old b/packs/false-alarm/LOG.old new file mode 100644 index 0000000..a6d7d18 --- /dev/null +++ b/packs/false-alarm/LOG.old @@ -0,0 +1,5 @@ +2026/07/16-10:42:47.050877 171d97000 Delete type=3 #1 +2026/07/16-10:42:47.053360 17262f000 Level-0 table #5: started +2026/07/16-10:42:47.053724 17262f000 Level-0 table #5: 19547 bytes OK +2026/07/16-10:42:47.053835 17262f000 Delete type=0 #3 +2026/07/16-10:42:47.053915 17262f000 Manual compaction at level-0 from '!adventures!5zf355zpx5s1ux56' @ 72057594037927935 : 1 .. '!adventures!5zf355zpx5s1ux56' @ 0 : 0; will stop at (end) diff --git a/packs/false-alarm/MANIFEST-000002 b/packs/false-alarm/MANIFEST-000002 deleted file mode 100644 index 3195b93..0000000 Binary files a/packs/false-alarm/MANIFEST-000002 and /dev/null differ diff --git a/packs/false-alarm/MANIFEST-000006 b/packs/false-alarm/MANIFEST-000006 new file mode 100644 index 0000000..00cb6f9 Binary files /dev/null and b/packs/false-alarm/MANIFEST-000006 differ