/** * HIGHFOLD WATCH (2026-10-18; plan `.cursor/task-plans/2026-10-18-highfold-watch-build.md`; design sheets `highfold-watch-1..7`, ChatGPT proposals of * 2026-10-18; plan of the empty-land round `2026-10-18-sheets-1-40-empty-land.md`): the old wardens' fortress on the heights east of the Dwarf Road's * Gate Court, levels 36-40, the last place before the sealed Dwarf Pass and the top of the free 1-40 band. A ruined curtain wall round a safe * Watch Camp, a broken keep full of empty armour, five Beacon Towers on the south wall, a view platform over the Gate Court and the Hollow Gallery * where The Hollow Watchman stands. * * WHERE: box x 1976-2156, z 300-399, the bare rock plateau east of the canyon's east ridge (rock to x about 1974) and west of the sea (from x about * 2162), south of the Dwarf Road's wall rows (z 296-299, untouched: nothing here touches a 41+ gate; the Dwarf Pass stays sealed). The plan's box ran on to * z 470 and overlapped Cairn Shelf (z 400-660); Highfold keeps z 300-399. The way in on foot is gate-free: the plateau is walkable from Riversend * Halt, and the Approach path runs from the box's south edge (x 2069, z 399) north to the Highfold Gate. * * THE BEACON CHAIN (the signature mechanic; it reuses the Hollow Delve's ordered levers and the Cracked Bell's ordered touch, and the Vent Gorge's * shared clock): five Beacon Towers stand on the south wall. The Wardens' tally board names the order they must be lit in, drawn afresh every week * (hfBeaconOrder). They catch only in the WIND'S CALM (a clock the whole land shares: calm, then the wind rising a turn ahead, then a gust that puts * every flame out). A beacon out of order, or a gust that catches a part-lit chain, douses them all and rings the alarm bell: the hollow guards of the * Great Hall wake and come for anyone in the yard. All five in order open the Wardens' Stair, a door in the view platform's wall that takes anyone * who walks it down to the Gate Court, for a while. The state is shared (everyone sees the flames), in memory (a restart douses them) and nothing in it * heals. The runtime is the backend's highfoldBeacons.ts. * * Every number is a WORLD tile (x east, z south) and a PLACEHOLDER for the balance pass. The models are the kit's own as stand-ins (backend upgrades * rows `highfold-*`). */ import type { LanternWakeBox, LanternWakePoint } from './lanternWake.js'; import type { DiscoveryZone } from './landmarks.js'; export declare const HIGHFOLD_ID = "highfold-watch"; export declare const HIGHFOLD_NAME = "Highfold Watch"; export declare const HIGHFOLD_BOX: LanternWakeBox; /** The levels the place is for. */ export declare const HIGHFOLD_LEVELS: { readonly min: 36; readonly max: 40; }; export declare function inHfBox(b: LanternWakeBox, x: number, z: number, pad?: number): boolean; export declare const inHighfoldBox: (x: number, z: number, pad?: number) => boolean; /** A ring of rock: the outer rectangle, how many tiles thick, and the gaps cut through it. */ export type HfRing = { readonly id: string; readonly outer: LanternWakeBox; readonly thick: number; readonly gaps: readonly LanternWakeBox[]; }; /** The curtain wall: the Highfold Gate in the south wall, a west door to the view platform. */ export declare const HIGHFOLD_CURTAIN: HfRing; /** The broken keep: its great hall's south entrance and two breaches. */ export declare const HIGHFOLD_KEEP: HfRing; /** The Hollow Gallery's walls: one way in, from the south. */ export declare const HIGHFOLD_GALLERY_WALL: HfRing; export declare const HIGHFOLD_RINGS: readonly HfRing[]; /** The wall's height above the plateau's ground (3): stone stand-in for the dwarven masonry. */ export declare const HIGHFOLD_WALL_HEIGHT = 7; export declare function onRing(r: HfRing, x: number, z: number): boolean; /** Is this tile wall (rock the world blocks)? The keep's walls are ragged: a hashed tenth of them has fallen. */ export declare function isHighfoldWall(x: number, z: number): boolean; /** A fallen tile of the keep wall (open rubble ground): a stable hash so the types, the backend and the tests agree. */ export declare function isHighfoldFallen(x: number, z: number): boolean; /** The yard inside the curtain wall, and the sub-places in it. */ export declare const HIGHFOLD_YARD: LanternWakeBox; export declare const HIGHFOLD_CAMP_BOX: LanternWakeBox; export declare const HIGHFOLD_PLATFORM: LanternWakeBox; export declare const HIGHFOLD_GATE_BAND: LanternWakeBox; export declare const HIGHFOLD_PATHS: ReadonlyArray<{ id: string; w: number; pts: readonly LanternWakePoint[]; }>; /** * THE HIGHFOLD ROAD (2026-10-18): how a player on foot gets here. Cairn Shelf's rock rim shuts the plateau from x 1944 to 2148 at z 480-660, so the way * north from Riversend Halt runs up the open shore strip east of it (x 2149 to about 2158, sea beyond) and then west along the box's south edge to the * approach. It is laid as a path over the land tiles of the strip (never over water, rock or a prop); it needs no gate, and Cairn Shelf's own north path * (the sheet's way in) is left for later (NEXT_STEPS). */ export declare const HIGHFOLD_ROAD: { id: string; w: number; pts: readonly LanternWakePoint[]; }; export declare const HF_BEACON_NAMES: readonly ["Far West Beacon", "West Beacon", "Gate-West Beacon", "Gate-East Beacon", "East Beacon"]; export declare const HF_PROP: { readonly beacon: "hfbeacon"; readonly beaconLit: "hfbeaconlit"; readonly tally: "hftally"; readonly spyglass: "hfspyglass"; readonly bell: "hfbell"; readonly stair: "hfstair"; readonly stairOpen: "hfstairopen"; }; export type HfQuestProp = { readonly id: string; readonly x: number; readonly z: number; readonly style: string; }; export declare const HF_BEACON_Z = 367; /** The five towers, west to east, unlit. A tower's lit look is the same id with `hfbeaconlit:` in place of `hfbeacon:`. */ export declare const HF_BEACONS: readonly (HfQuestProp & { readonly n: number; readonly name: string; })[]; export declare const hfBeaconStyle: (n: number, lit: boolean) => string; /** The beacon number (1-5) a quest-prop style names (lit or not), or 0. */ export declare function hfBeaconNumber(style: string | undefined | null): number; /** The wind clock the whole land shares: calm (the beacons catch), rising (a turn's warning; they still catch), then the gust that puts every flame out. */ export declare const HF_WIND_CYCLE_MS = 120000; export declare const HF_WIND_CALM_MS = 82000; export declare const HF_WIND_RISING_MS = 8000; export type HfWindPhase = 'calm' | 'rising' | 'gust'; export declare function hfWindPhase(nowMs: number): HfWindPhase; /** Index of the wind cycle `nowMs` is in (the part-lit chain is doused when it changes). */ export declare const hfWindCycle: (nowMs: number) => number; /** Seconds left of the calm (0 in the rising and the gust). */ export declare function hfCalmLeftMs(nowMs: number): number; /** The Wardens' Stair stays open this long after the chain is lit, for everyone. */ export declare const HF_STAIR_OPEN_MS = 150000; /** The alarm bell's reach in time: the hollow guards hunt the yard this long. */ export declare const HF_ALARM_MS = 40000; /** One wrong beacon per player in this time (a player cannot spam the bell). */ export declare const HF_WRONG_COOLDOWN_MS = 4000; /** Weeks run Monday 00:00 UTC; this is a Monday. */ export declare const HF_ORDER_EPOCH_MS: number; export declare const hfWeekIndex: (nowMs: number) => number; /** This week's order the five beacons are lit in (beacon numbers, west to east): a permutation, never the same as last week's. */ export declare function hfBeaconOrder(week: number): number[]; export declare function hfOrderNames(order: readonly number[]): string; /** The tally board's words for a week. */ export declare function hfTallyText(week: number): string; export declare const HF_TEXT: { readonly lit: (name: string) => string; readonly litLast: "The fifth beacon catches and the whole chain flares along the wall. High in the view platform's wall the Wardens' Stair grinds open."; readonly wrong: "That beacon was out of turn. Every flame on the wall dies, and the alarm bell begins to toll. The hollow guards are waking!"; readonly gustWait: "The wind is tearing at the wall and no flame will catch. Wait for the calm."; readonly gustOut: "The gust takes every flame on the wall, and the alarm bell tolls: the chain was not finished in the calm."; readonly rising: "The wind is rising on the heights. Whatever is burning on the wall will not last the gust."; readonly burning: "That beacon is already burning."; readonly held: "The Wardens' chain is lit and the stair is open. Leave the beacons be."; readonly cool: "You have only just rung the bell on yourself. Wait a moment."; readonly stairShut: "The Wardens' Stair is barred with old iron. Light the five beacons in the tally board's order within the calm and it will open."; readonly stairDown: "You go down the Wardens' Stair, a long switchback of worn steps, and come out in the east of the Gate Court."; readonly stairClosing: "The Wardens' Stair grinds shut again and the beacons burn down."; readonly bell: "The alarm bell hangs from its post by the keep, rope worn smooth. When a beacon is lit out of turn or the gust catches the chain, it tolls and the hollow guards wake."; }; /** The Wardens' Stair: a door in the view platform's west wall that takes you to the Gate Court, when the chain is lit. */ export declare const HF_STAIR: HfQuestProp; export declare const HF_STAIR_OPEN_STYLE: string; /** Where the stair lets out: the Gate Court's east side (the backend finds the nearest standable tile). */ export declare const HF_STAIR_LANDING: { readonly x: 1904; readonly z: 332; }; export declare const HF_BELL: HfQuestProp; export declare const HF_TALLY: HfQuestProp; export declare const HF_SPYGLASS: HfQuestProp; export declare const HIGHFOLD_QUEST_PROPS: readonly HfQuestProp[]; export declare const HIGHFOLD_QUEST_PROP_NAMES: Readonly>; /** The model a Highfold quest prop draws with (frontend models that already exist), or null if not one of them. */ export declare function highfoldPropModel(prop: string): string | null; /** The verb on the hover for each prop. */ export declare const HIGHFOLD_PROP_VERBS: Readonly>; /** One thing laid on the ground: the kit's own kinds and styles, placed by the backend's ground placer. */ export type HighfoldProp = { readonly id: string; readonly kind: 'dreadmodel' | 'dreadprop' | 'campfire' | 'barrel' | 'bountyboard' | 'furnace' | 'anvil' | 'workbench' | 'stove' | 'signpost'; readonly style: string; readonly x: number; readonly z: number; readonly scale?: number; }; /** The camp's pieces and working stations (Ashfall's layout, moved). No bank anywhere in Highfold. */ export declare const HIGHFOLD_CAMP_PIECES: readonly HighfoldProp[]; /** Dressing on the wall and in the ruins: banners at the gate and the stair, braziers (unlit stand-ins) at the Hollow Gallery's door. */ export declare const HIGHFOLD_DRESSING: readonly HighfoldProp[]; /** The signs (the placard signpost). */ export declare const HIGHFOLD_SIGNS: ReadonlyArray<{ readonly id: string; readonly x: number; readonly z: number; readonly text: string; }>; export type HighfoldFolk = { readonly id: string; readonly name: string; readonly place: string; readonly x: number; readonly z: number; readonly faceX: number; readonly faceZ: number; readonly leash: number; readonly speak: string; readonly extras?: ReadonlyArray<{ readonly id: string; readonly label: string; readonly say: string; }>; }; /** The plan's six names (design sheet 5 invented others; see the plan file for the mapping). The cook lives in campTraders.ts. */ export declare const HIGHFOLD_FOLK_NAMES: { readonly captain: "Captain Berrin Holt"; readonly lamplighter: "Lamplighter Nessa Tarn"; readonly smith: "Smith Dunmar Cole"; readonly cook: "Agnes Burr"; readonly scout: "Scout Ivo Dray"; readonly chronicler: "Chronicler Mabel Orrin"; }; /** The five residents who are not the cook (named residents on the default look, stationary). */ export declare const HIGHFOLD_FOLK: ReadonlyArray; export declare function highfoldFolkByName(name: string | null | undefined): HighfoldFolk | null; /** The camp's cook, which lives in CAMP_TRADERS (campTraders.ts) beside the other camps' cooks. */ export declare const HIGHFOLD_COOK: { readonly id: "camp-highfold"; readonly name: "Agnes Burr"; readonly x: 2027; readonly z: 346; readonly faceX: 2029; readonly faceZ: 343; }; /** Standable tiles for teleports, smokes and the helper. */ export declare const HIGHFOLD_STANDS: { readonly approach: { readonly x: 2069; readonly z: 396; }; readonly gate: { readonly x: 2069; readonly z: 376; }; readonly camp: { readonly x: 2030; readonly z: 351; }; readonly smithy: { readonly x: 2010; readonly z: 349; }; readonly board: { readonly x: 2020; readonly z: 357; }; readonly beacons: { readonly x: 2069; readonly z: 362; }; readonly hall: { readonly x: 2085; readonly z: 340; }; readonly gallery: { readonly x: 2129; readonly z: 336; }; readonly platform: { readonly x: 1989; readonly z: 328; }; readonly barracks: { readonly x: 2118; readonly z: 357; }; readonly outerWatch: { readonly x: 2040; readonly z: 388; }; readonly crag: { readonly x: 2125; readonly z: 388; }; }; export declare const HIGHFOLD_PLACE_TEXT = "Highfold Watch is the old wardens' fortress on the heights east of the Gate Court, on the open plateau above the Dwarf Road: a camp inside its wall with a smithy, a furnace, an anvil, a workbench, a cookhouse, a fire and a Bounty Board, a broken keep full of empty armour, five beacon towers on the south wall and a view platform over the Gate Court. There is no bank. The Dwarf Pass below stays sealed. On foot from Riversend Halt, go north over the open plateau and up the shore strip east of Cairn Shelf: the Highfold Road leads along the fortress's south edge to its gate."; export declare const HIGHFOLD_CHAIN_TEXT = "Five beacons stand on Highfold's south wall. The Wardens' tally board names the order to light them in, drawn afresh every week, and they catch only in the calm of the wind, which runs on a two-minute clock: calm, a few seconds of rising wind, then a gust that puts every flame out. A beacon lit out of turn, or a gust that catches a part-lit chain, puts them all out and rings the alarm bell, and the hollow guards of the Great Hall wake. All five in order open the Wardens' Stair, a door down to the Gate Court, for two and a half minutes."; export declare const HIGHFOLD_CAMP_DISCOVERY_ZONE: DiscoveryZone; export declare const HIGHFOLD_PLATFORM_DISCOVERY_ZONE: DiscoveryZone; export declare const HIGHFOLD_UMBRELLA_DISCOVERY_ZONE: DiscoveryZone; //# sourceMappingURL=highfoldWatch.d.ts.map