/** * CAIRN SHELF (2026-10-18; plan `.cursor/task-plans/2026-10-18-cairn-shelf-build.md`; design sheets `cairn-shelf-1..6`). The wind-scoured rock shelf * east of the Dwarf Road's canyon, above the Pass-Road Camp, for levels 31-37: a lee camp with a smith, a cook, a board and six seams, a field of five wind * lanes you cross on a clock, a ring of old waymark cairns, three creature dens and a mini-boss on a crag. Nothing 41+ is built; the Dwarf Pass stays sealed. * * THE WAY IN (decided 2026-10-18): the GOAT STAIR, a five-wide cut (CAIRN_CUT, z 497-501) from the Dwarf Road's valley floor east through the canyon's rock * wall onto the shelf. It starts INSIDE the valley, which is open from Riversend's North Path with no gate (the Dwarf Pass is the only gate, at the north * end), so the stair adds no way round any gate. The whole box is shut in rock like Ashfall (a rim CAIRN_RIM tiles deep), the sea beyond its east edge: the * stair is the one door. The Cairn Lift's head house stands at the stair's top as dressing (the lift itself is not a ride: the stair is the route). * * THE LAYOUT (box x 1944-2148, z 480-660; open ground x 1950-2142, z 486-654): * - the NORTH SHELF (z 486-539): Lee Camp in the west (smithy, furnace, anvil, workbench, cookhouse, fire, Bounty Board, stores, six seams in the rock * buttress at its east edge), the Ram Terrace den in the middle and Thunderhorn's Crag, the mini-boss's ledge, in the north-east; * - the GALE FIELD (x 2044-2092, z 540-608): the only gap in the middle ridge. Five WIND LANES (bands three rows deep) cross it, one shared nine-second * clock like the Vent Gorge's: dust streaks and snapping pennants a turn ahead, then the gust. A gust shoves a player three tiles along its lane and costs * a share of full health, NEVER the last point (the Cart Run's rule). Behind each standing cairn is a three-tile LEE pocket the gust never reaches (two * in every lane). The rows between the lanes are calm; * - the SOUTH SHELF (z 609-654): the Slate Scree den in the west, the Cairn Ring (six tall waymark cairns, the explorer's goal) in the middle and the * Houndrun den in the east. * * 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 * `cairn-shelf-*`). There is NO bank here (banks are in towns) and no shop sells food: the cook buys what players cook. */ import type { LanternWakeBox, LanternWakePoint } from './lanternWake.js'; import type { DiscoveryZone } from './landmarks.js'; export declare const CAIRN_ID = "cairn-shelf"; export declare const CAIRN_NAME = "Cairn Shelf"; export declare const CAIRN_BOX: LanternWakeBox; /** The rock that closes the box in: this many tiles deep all round. */ export declare const CAIRN_RIM = 6; export declare const CAIRN_GROUND: LanternWakeBox; /** The Goat Stair: carved from the valley floor (x 1890 is inside it) east through the canyon's rock to the shelf's ground, five wide. */ export declare const CAIRN_CUT: LanternWakeBox; /** The rock buttress that shelters the camp from the wind: a solid wall at the camp's east edge, open round its south end. */ export declare const CAIRN_BUTTRESS: LanternWakeBox; /** The middle ridge's rows: rock across the whole shelf but for the Gale Field. */ export declare const CAIRN_RIDGE_ROWS: { readonly minZ: 540; readonly maxZ: 608; }; /** The Gale Field: the only open ground in the ridge's rows. */ export declare const CAIRN_FIELD: LanternWakeBox; /** The north and south shelves (the open ground either side of the ridge). */ export declare const CAIRN_NORTH_SHELF: LanternWakeBox; export declare const CAIRN_SOUTH_SHELF: LanternWakeBox; /** Lee Camp's ground, in the north shelf's west end beside the stair's mouth. */ export declare const CAIRN_CAMP_BOX: LanternWakeBox; /** The Cairn Lift's head house, at the stair's top (dressing). */ export declare const CAIRN_LIFT_BOX: LanternWakeBox; /** The Cairn Ring: the waymark cairns' circle. */ export declare const CAIRN_RING_BOX: LanternWakeBox; export declare const CAIRN_RING_CENTRE: { readonly x: 2068; readonly z: 636; }; export declare const inCairnBoxOf: (b: LanternWakeBox, x: number, z: number, pad?: number) => boolean; export declare const inCairnBox: (x: number, z: number, pad?: number) => boolean; export declare const inCairnCut: (x: number, z: number) => boolean; export declare const inCairnField: (x: number, z: number) => boolean; /** Is this tile open (walkable) ground of the shelf, the stair or the box? Everything else in the box is rock. */ export declare function isCairnOpen(x: number, z: number): boolean; /** Roads inside the ground (world polylines, width in tiles), laid as Path. */ export declare const CAIRN_PATHS: ReadonlyArray<{ id: string; w: number; pts: readonly LanternWakePoint[]; }>; export type GaleDirection = 'e' | 'w'; export type GaleLee = { readonly minX: number; readonly maxX: number; readonly cairnX: number; }; export type GaleBand = { readonly id: string; /** The lane's centre row; a gust blows on this row and the row either side (three rows deep). */ readonly z: number; readonly minX: number; readonly maxX: number; /** Which way the gust blows along the lane: it shoves a player this way. */ readonly dir: GaleDirection; /** Two lee pockets, each three tiles wide, behind a standing cairn on the upwind side; the gust never reaches them. */ readonly lees: readonly [GaleLee, GaleLee]; /** When in the cycle this lane gusts (its start offset, ms). */ readonly offsetMs: number; }; export declare const GALE_CYCLE_MS = 9000; /** The dust streak and the snapping pennants: the warning window (it ends where the gust begins). */ export declare const GALE_WARN_MS = 3000; /** Where in a lane's own cycle its gust begins, and how long it blows. */ export declare const GALE_GUST_AT_MS = 3600; export declare const GALE_GUST_MS = 1000; /** A gust blows on its centre row and this many rows either side. */ export declare const GALE_HALF_DEPTH = 1; /** A gust costs this share of a player's full health (never the last point) at most once per gust. */ export declare const GALE_DAMAGE_SHARE = 0.12; /** A gust shoves a player this many tiles along its lane (it stops at rock and at a standing cairn). */ export declare const GALE_SHOVE_TILES = 3; /** Standing this many rows (or fewer) beyond a blowing lane's rows, or in a lee pocket, a player has sheltered from it (the counter). */ export declare const GALE_NEAR_ROWS = 1; export declare const GALE_BANDS: readonly GaleBand[]; export type GalePhase = 'rest' | 'warn' | 'gust'; /** The phase of lane `band` at `nowMs` (every player reads the same clock; nothing is stored). */ export declare function galePhase(band: GaleBand, nowMs: number): GalePhase; /** The index of the gust that is next (or now) for this lane at `nowMs`: used to count each gust once. */ export declare function galeGustIndex(band: GaleBand, nowMs: number): number; /** Is this tile in one of the lane's lee pockets? */ export declare function inGaleLee(band: GaleBand, x: number, z: number): boolean; /** Is this tile in the lane's rows, across the field, out of every lee? (what a gust hits) */ export declare function inGaleHit(band: GaleBand, x: number, z: number): boolean; /** The lane a tile is in the rows of (in a lee or not), or null. */ export declare function galeBandAt(x: number, z: number): GaleBand | null; /** The lanes blowing at `nowMs` that hit this tile. */ export declare function galeGustsHitting(x: number, z: number, nowMs: number): GaleBand[]; export declare const GALE_WARNING = "Dust streaks across the rock and the pennants snap taut: a gust is coming down the lane. Get behind a cairn or wait it out."; export declare const GALE_HIT_TEXT = "The gale takes you off your feet and shoves you along the rock."; export declare const GALE_CLEAR_TEXT = "You wait out the gust as it howls past."; export declare const GALE_LEE_TEXT = "You crouch in the lee of the cairn as the gust howls past."; /** The stand-in pennant posts at both ends of every lane (draw the clock-read wind until a proper pennant prop exists). */ export declare const GALE_PENNANT_MODEL = "evsapperpennant"; /** One thing laid on the ground: the kit's own kinds and styles, placed by the backend's ground placer. */ export type CairnProp = { readonly id: string; readonly kind: 'dreadmodel' | 'dreadprop' | 'campfire' | 'barrel' | 'bountyboard' | 'furnace' | 'anvil' | 'workbench' | 'stove' | 'signpost' | 'rock'; readonly style: string; readonly x: number; readonly z: number; readonly scale?: number; }; /** Lee Camp's pieces and working stations (Ashfall's layout, translated: the camp's ground is the same 42 by 43). */ export declare const CAIRN_CAMP_PIECES: readonly CairnProp[]; /** The Cairn Lift's head house at the stair's top: a winch, a cage, its counterweight and crates, and the lamps along the stair. Dressing, not a ride. */ export declare const CAIRN_LIFT_PIECES: readonly CairnProp[]; /** The Gale Field's pieces: a standing cairn upwind of every lee pocket and a pennant post at both ends of every lane. */ export declare const CAIRN_GALE_PIECES: readonly CairnProp[]; /** The Cairn Ring's six tall waymark cairns (a stand-in boulder at 2.2 times scale), one just outside each rune cairn's quest prop. */ export declare const CAIRN_RING_PIECES: readonly CairnProp[]; /** Lee Camp's rock face: six mineral seams (ORE_ROCK_KIND styles) down the buttress's west edge. Gold is Mining 30 and silver Mining 33 (mining.ts). */ export declare const CAIRN_SEAMS: ReadonlyArray<{ readonly id: string; readonly x: number; readonly z: number; readonly style: 'coal' | 'iron' | 'gold' | 'silver'; }>; /** The signs (the placard signpost). */ export declare const CAIRN_SIGNS: ReadonlyArray<{ readonly id: string; readonly x: number; readonly z: number; readonly text: string; }>; export type CairnFolk = { 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; }>; }; export declare const CAIRN_FOLK_NAMES: { readonly cairnwright: "Cairnwright Edda Strand"; readonly keeper: "Winch-Keeper Osric Tane"; readonly smith: "Smith Torvald Quenby"; readonly scout: "Scout Ilka Dorne"; readonly warden: "Warden Rhys Calder"; }; /** The five residents (named residents on the default look, stationary): the camp's cook is in campTraders.ts. */ export declare const CAIRN_FOLK: ReadonlyArray; export declare function cairnFolkByName(name: string | null | undefined): CairnFolk | null; /** The camp's cook, which lives in CAMP_TRADERS (campTraders.ts) beside the other camps' cooks. */ export declare const CAIRN_COOK: { readonly id: "camp-cairn-shelf"; readonly name: "Maud Heskett"; readonly x: 1989; readonly z: 504; readonly faceX: 1991; readonly faceZ: 501; }; export declare const CRN_PROP: { readonly marker: "crnmarker"; readonly pack: "crnpack"; readonly rune: "crnrune"; }; export type CsQuestProp = { readonly id: string; readonly x: number; readonly z: number; readonly style: string; }; /** The cairnwright's five lane markers, one in the first lee pocket of each lane (north to south): you reach each by crossing the field. */ export declare const CRN_MARKERS: readonly CsQuestProp[]; /** The winch-keeper's three lost packs, one inside each of three dens. */ export declare const CRN_PACK_TERRACE: CsQuestProp; export declare const CRN_PACK_SCREE: CsQuestProp; export declare const CRN_PACK_HOUNDRUN: CsQuestProp; /** The six rune cairns of the Cairn Ring (a circle of radius 9 round its centre). */ export declare const CRN_RUNES: readonly CsQuestProp[]; export declare const CAIRN_QUEST_PROPS: readonly CsQuestProp[]; export declare const CAIRN_QUEST_PROP_NAMES: Readonly>; /** The model a Cairn Shelf quest prop draws with (frontend quest-prop models that already exist), or null if not one of them. */ export declare function cairnPropModel(prop: string): string | null; /** Standable tiles for teleports, smokes and the helper. */ export declare const CAIRN_STANDS: { readonly valleyFoot: { readonly x: 1892; readonly z: 499; }; readonly stairTop: { readonly x: 1952; readonly z: 499; }; readonly camp: { readonly x: 1986; readonly z: 518; }; readonly smithy: { readonly x: 1971; readonly z: 508; }; readonly board: { readonly x: 1978; readonly z: 518; }; readonly seams: { readonly x: 1999; readonly z: 504; }; readonly fieldNorth: { readonly x: 2068; readonly z: 545; }; readonly fieldSouth: { readonly x: 2068; readonly z: 604; }; readonly ring: { readonly x: 2068; readonly z: 640; }; readonly ramTerrace: { readonly x: 2036; readonly z: 536; }; readonly crag: { readonly x: 2102; readonly z: 522; }; readonly scree: { readonly x: 2036; readonly z: 636; }; readonly houndrun: { readonly x: 2098; readonly z: 636; }; }; export declare const CAIRN_PLACE_TEXT = "Cairn Shelf is a wind-scoured rock shelf east of the Dwarf Road's canyon, reached by the Goat Stair that climbs the canyon wall across from the Pass-Road Camp: Lee Camp tucked behind a rock buttress, with a smithy, a furnace, an anvil and a workbench, a cookhouse with a hot pot, a fire, a Bounty Board and six seams of coal, iron, gold and silver in the rock. Five people work it."; export declare const CAIRN_GALE_TEXT = "South of the camp lies the Gale Field, and its five wind lanes (the Gale Lanes) blow one after another every nine seconds. Dust and snapping pennants warn you a turn ahead. A gust shoves you three tiles along its lane and costs a share of your full health but never the last point, and behind every standing cairn is a three-tile pocket of still air the gust never reaches."; /** The camp's discovery zone, the field's, the ring's and the umbrella (the whole box). The dens and the Crag are in cairnShelfDens.ts. */ export declare const CAIRN_CAMP_DISCOVERY_ZONE: DiscoveryZone; export declare const CAIRN_STAIR_DISCOVERY_ZONE: DiscoveryZone; export declare const CAIRN_LIFT_DISCOVERY_ZONE: DiscoveryZone; export declare const CAIRN_FIELD_DISCOVERY_ZONE: DiscoveryZone; export declare const CAIRN_RING_DISCOVERY_ZONE: DiscoveryZone; export declare const CAIRN_UMBRELLA_DISCOVERY_ZONE: DiscoveryZone; //# sourceMappingURL=cairnShelf.d.ts.map