/** * ASHFALL CAMP (T121, 2026-10-15; plan `.cursor/task-plans/2026-10-15-t121-ashfall-camp.md`; backend COVERAGE_1_40.md section 6 slice 7, second wave). * The Emberdeep outskirts: a survivors' camp for levels 28-36 in the ash country NORTH of the Emberdeep Ruins, a place with a smith, a cook, * a board, gold and silver seams, a vent field you cross on a clock, three creature dens and a mini-boss. * * THE ENTRANCE (decided 2026-10-15): the NORTH CUT, a five-wide corridor (x 1776-1780) carved through Emberdeep's rock from the ruins' east burn * scar north through the inner wall's east end and both rims into the camp's south edge. It starts INSIDE Emberdeep's ground, so the only way in * is the West Track gate (areaGates.ts `west-track`: Combat 25 and A Stronger Bridge); no new gate, no back door. The Ash Gate and the Lower * Vault (x 1690-1740, z 668-734) are untouched. The whole box is shut in rock like Emberdeep (a rim ASHFALL_RIM tiles deep). * * THE LAYOUT (box x 1640-1790, z 450-659; open ground x 1647-1783, z 457-652): * - the SOUTH YARD (z 597-652): the camp in its east half (smithy, furnace, anvil, workbench, cookhouse, fire, Bounty Board, seams of coal, * iron, gold and silver), the Slag Heaps den in its west half; * - the VENT GORGE (x 1700-1744, z 526-596): a rock-walled canyon you must cross to go north. Five FISSURES (bands, three rows deep) run across * it. They pulse on one shared clock like the Cinder Warden's Magma Sweep: a hiss a turn ahead (the warning), then the eruption. Each fissure has * a three-tile LANE, a gap in its band that never erupts (the lanes alternate west and east), so the field is a step-clear puzzle: learn the lanes * or time the bands. A vent costs a share of full health and NEVER the last point. The tiles between the bands are SAFE SLABS, four gauge posts * stand on them (the vent mapper's quest) and the server keeps a count of the vents a player stepped clear of (the safe-spot counter); * - the NORTH BASIN (z 457-525): the Cinder Barrens and Basalt Kennels dens and the Ashmaw's Hollow, the mini-boss. * * Nothing 41+ is built. 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 `ashfall-*`). */ import type { LanternWakeBox, LanternWakePoint } from './lanternWake.js'; import type { DiscoveryZone } from './landmarks.js'; export declare const ASHFALL_ID = "ashfall"; export declare const ASHFALL_NAME = "Ashfall Camp"; export declare const ASHFALL_BOX: LanternWakeBox; /** The rock that closes the box in: this many tiles deep all round. */ export declare const ASHFALL_RIM = 7; export declare const ASHFALL_GROUND: LanternWakeBox; /** The North Cut: carved through Emberdeep's rock from its east scar (z 758 is inside its open ground) to the camp's south edge. */ export declare const ASHFALL_CUT: LanternWakeBox; /** The vent gorge: the only open ground between the south yard and the north basin. */ export declare const ASHFALL_GORGE: LanternWakeBox; /** The south yard and the north basin (the open ground either side of the gorge). */ export declare const ASHFALL_SOUTH_YARD: LanternWakeBox; export declare const ASHFALL_NORTH_BASIN: LanternWakeBox; /** The camp's ground, in the south yard's east half beside the cut's mouth. */ export declare const ASHFALL_CAMP_BOX: LanternWakeBox; export declare function inBoxOf(b: LanternWakeBox, x: number, z: number, pad?: number): boolean; export declare const inAshfallBox: (x: number, z: number, pad?: number) => boolean; export declare const inAshfallCut: (x: number, z: number) => boolean; export declare const inAshfallGorge: (x: number, z: number) => boolean; /** Is this tile open (walkable) ground of the camp, the cut or the box? Everything else in the box is rock. */ export declare function isAshfallOpen(x: number, z: number): boolean; /** Roads inside the ground (world polylines, width in tiles), laid as Path. */ export declare const ASHFALL_PATHS: ReadonlyArray<{ id: string; w: number; pts: readonly LanternWakePoint[]; }>; export type AshVentBand = { readonly id: string; /** The fissure's centre row; it erupts on this row and the row either side (three rows deep). */ readonly z: number; readonly minX: number; readonly maxX: number; /** The lane: a gap of three tiles in the band that never erupts. */ readonly laneMinX: number; readonly laneMaxX: number; /** When in the cycle this fissure erupts (its start offset, ms). */ readonly offsetMs: number; }; export declare const ASH_VENT_CYCLE_MS = 9000; /** The hiss before an eruption: the warning window (it ends where the eruption begins). */ export declare const ASH_VENT_WARN_MS = 2400; /** Where in a fissure's own cycle its eruption begins, and how long it lasts. */ export declare const ASH_VENT_ERUPT_AT_MS = 3000; export declare const ASH_VENT_ERUPT_MS = 1200; /** A fissure erupts on its centre row and this many rows either side. */ export declare const ASH_VENT_HALF_DEPTH = 1; /** A fissure that erupts costs this share of a player's full health (never the last point) at most once per eruption. */ export declare const ASH_VENT_DAMAGE_SHARE = 0.18; /** Standing this many rows (or fewer) beyond an erupting fissure's hit rows, or in its lane, a player has stepped clear of it (the safe-spot counter). */ export declare const ASH_VENT_NEAR_ROWS = 1; export declare const ASH_VENT_BANDS: readonly AshVentBand[]; export type AshVentPhase = 'rest' | 'warn' | 'erupt'; /** The phase of fissure `band` at `nowMs` (every player reads the same clock; nothing is stored). */ export declare function ashVentPhase(band: AshVentBand, nowMs: number): AshVentPhase; /** The start of the eruption that is next (or now) for this fissure at `nowMs` (ms, absolute): used to count each eruption once. */ export declare function ashVentEruptionIndex(band: AshVentBand, nowMs: number): number; /** Is this tile in the fissure's hit rows and out of its lane? */ export declare function inAshVentHit(band: AshVentBand, x: number, z: number): boolean; /** The fissure a tile is in the hit rows of (lane or not), or null. */ export declare function ashVentBandAt(x: number, z: number): AshVentBand | null; /** The fissures erupting at `nowMs` that hit this tile. */ export declare function ashVentsHitting(x: number, z: number, nowMs: number): AshVentBand[]; export declare const ASH_VENT_WARNING = "The ground hisses and a seam of heat runs across the gorge ahead. Find the lane or wait for the vent to die."; export declare const ASH_VENT_HIT_TEXT = "A fissure bursts under your feet and the ash-fire scorches you."; export declare const ASH_VENT_CLEAR_TEXT = "You step clear as the fissure erupts."; export declare const ASH_VENT_LANE_TEXT = "You walk the lane as the fissure erupts beside you."; /** The fissure end cap at both ends of each fissure (basalt round a painted lava crack, 2026-10-19; was the Frostwatch lit brazier). */ export declare const ASH_VENT_BRAZIER_MODEL = "afventcap"; /** One thing laid on the ground: the kit's own kinds and styles, placed by the backend's ground placer. */ export type AshfallProp = { 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. */ export declare const ASHFALL_CAMP_PIECES: readonly AshfallProp[]; /** The gorge's lit braziers (stand-ins for the vents' glow), one at each end of every fissure. */ export declare const ASHFALL_VENT_PIECES: readonly AshfallProp[]; /** * The fissures themselves (2026-10-19): each band's three rows are a row of 3 x 3 `affissure` segments (a painted lava crack, flat, walked over) tiled * out from a plank bridge at the vent spine's crossing (x 1722) to both rock walls, leaving the band's lane bare. They are scenery only: the clock, * the hiss and the scorch are the server's (ashVents.ts), and nothing here blocks a tile. */ export declare const ASHFALL_FISSURE_BRIDGE_X = 1722; export declare const ASHFALL_FISSURE_PIECES: readonly AshfallProp[]; /** The camp's rock face: six mineral seams (ORE_ROCK_KIND styles) down its east edge. Gold is Mining 30 and silver Mining 33 (mining.ts). */ export declare const ASHFALL_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 ASHFALL_SIGNS: ReadonlyArray<{ readonly id: string; readonly x: number; readonly z: number; readonly text: string; }>; export type AshfallFolk = { 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 ASHFALL_FOLK_NAMES: { readonly mapper: "Ventmapper Isolde Pryce"; readonly smith: "Smith Garrick Tindall"; readonly survivor: "Marta Linn"; readonly scout: "Scout Wren Aldous"; readonly warden: "Hold-Warden Beric Hollin"; }; /** The five residents (named residents on the default look, stationary): the camp's cook is in campTraders.ts. */ export declare const ASHFALL_FOLK: ReadonlyArray; export declare function ashfallFolkByName(name: string | null | undefined): AshfallFolk | null; /** The camp's cook, which lives in CAMP_TRADERS (campTraders.ts) beside the other camps' cooks. */ export declare const ASHFALL_COOK: { readonly id: "camp-ashfall"; readonly name: "Odile Marsh"; readonly x: 1769; readonly z: 622; readonly faceX: 1771; readonly faceZ: 619; }; export declare const AF_PROP: { readonly gauge: "afgauge"; readonly satchel: "afsatchel"; readonly cairn: "afcairn"; }; export type AfQuestProp = { readonly id: string; readonly x: number; readonly z: number; readonly style: string; }; /** The mapper's four gauge posts, one on each safe slab between the fissures (south to north). */ export declare const AF_GAUGE_1: AfQuestProp; export declare const AF_GAUGE_2: AfQuestProp; export declare const AF_GAUGE_3: AfQuestProp; export declare const AF_GAUGE_4: AfQuestProp; /** The survivors' three dropped satchels, one inside each of three dens. */ export declare const AF_SATCHEL_HEAPS: AfQuestProp; export declare const AF_SATCHEL_BARRENS: AfQuestProp; export declare const AF_SATCHEL_KENNELS: AfQuestProp; /** The scout's three cairns, one outside each of three dens. */ export declare const AF_CAIRN_HEAPS: AfQuestProp; export declare const AF_CAIRN_BARRENS: AfQuestProp; export declare const AF_CAIRN_KENNELS: AfQuestProp; export declare const ASHFALL_QUEST_PROPS: readonly AfQuestProp[]; export declare const ASHFALL_QUEST_PROP_NAMES: Readonly>; /** The model an Ashfall quest prop draws with (frontend quest-prop models that already exist), or null if not one of them. */ export declare function ashfallPropModel(prop: string): string | null; /** Standable tiles for teleports, smokes and the helper. */ export declare const ASHFALL_STANDS: { readonly cutMouth: { readonly x: 1778; readonly z: 648; }; readonly camp: { readonly x: 1766; readonly z: 636; }; readonly smithy: { readonly x: 1751; readonly z: 626; }; readonly board: { readonly x: 1758; readonly z: 636; }; readonly seams: { readonly x: 1779; readonly z: 622; }; readonly ventSouth: { readonly x: 1722; readonly z: 600; }; readonly ventNorth: { readonly x: 1722; readonly z: 522; }; readonly slagHeaps: { readonly x: 1692; readonly z: 612; }; readonly barrens: { readonly x: 1722; readonly z: 507; }; readonly kennels: { readonly x: 1756; readonly z: 504; }; readonly hollow: { readonly x: 1680; readonly z: 508; }; }; export declare const ASHFALL_PLACE_TEXT = "Ashfall Camp is a survivors' camp in the ash country north of the Emberdeep Ruins, reached only by the North Cut that runs up from the ruins' east scar behind the West Track gate: a smithy with 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 behind it. Five people work it."; export declare const ASHFALL_VENT_TEXT = "North of the camp the Vent Gorge is cut by five fissures that erupt one after another every nine seconds. Each fissure has a three-tile lane that never erupts, the lanes alternating west and east, and a hiss comes a turn before each eruption. A vent costs a share of your full health but never the last point."; /** The camp's discovery zone and the gorge's. The dens and the Hollow are in ashfallDens.ts; the umbrella zone (the whole box) comes last. */ export declare const ASHFALL_CAMP_DISCOVERY_ZONE: DiscoveryZone; export declare const ASHFALL_VENT_DISCOVERY_ZONE: DiscoveryZone; export declare const ASHFALL_UMBRELLA_DISCOVERY_ZONE: DiscoveryZone; //# sourceMappingURL=ashfallCamp.d.ts.map