/** * LAMPLIGHT COMMON (2026-10-19; plan `.cursor/task-plans/2026-10-19-lamplight-common-build.md`; design sheets `lamplight-common-1..8`, ChatGPT proposals of * 2026-10-19; series plan `2026-10-19-sheets-1-40-wave3.md`): the free first meadow of the Western Kingdoms, levels 1-10, between the west ridge and Lantern * Wake's high street. A gentle place for newcomers just off the train: a small camp (the Lamplighters' Green), a loop path with twelve lamp-posts, a heron * pond, a moth meadow, a pine wood, a hill that looks down on the sea and the hollow of Old Dimwing, the one small boss. * * WHERE: claim x 1944-2024, z 958-1070 plus the Green's strip x 1946-1976, z 1056-1088 (world tiles, x east, z south): the meadow NORTH of the high street (the street is * z 1092-1096 and the town's buildings stand from x 1981 at z 1074-1106: untouched), east of the west ridge (x 1936-1941, crags to 1942) and west of the "forest" path. Saltgrass Downs (z 770-950) * and Gannet Point (z 1197-1343) are clear. No gate: the Brindle Road pass is on the far side of the ridge, so a level-1 newcomer from the station walks * straight in. NO bank (banks are in towns), no shop sells food (the cook BUYS what players cook), nothing heals anyone. * * THE LAMPLIGHTERS' ROUND (the signature mechanic; the backend's lamplightRound.ts runs it): Lamplighter Wick Harbottle lends a lit TAPER that burns for three * minutes (a clock per player, in memory); the Lamp Shed relights it, free, any time. Twelve unlit lamp-posts stand on a looping path: touch one with a burning * taper and it catches. The lamps are SHARED (everyone sees them, like the Beacon Chain's towers) and burn five minutes on their own. LAMP MOTHS drift over the * meadow; one that finds a lit lamp near a taper-holder settles on it and snuffs it after a few seconds unless somebody shoos it (a click on the moth). * When all twelve burn at once the Round is done: every player who lit one of them and is still on the Common is paid (coins, Lamp Wicks and Explorer XP, once * per five minutes per character), the lamps glow for a while, then reset. Gentle, no combat; the one fight is Old Dimwing. Every number is a PLACEHOLDER for * the balance pass (James, 2026-10-12: balance last). The models are the kit's own as stand-ins (backend upgrades rows `lamplight-*`). */ import type { LanternWakeBox, LanternWakePoint } from './lanternWake.js'; import type { DiscoveryZone } from './landmarks.js'; export declare const LAMPLIGHT_ID = "lamplight-common"; export declare const LAMPLIGHT_NAME = "Lamplight Common"; export declare const LAMPLIGHT_BOX: LanternWakeBox; /** The levels the place is for. */ export declare const LAMPLIGHT_LEVELS: { readonly min: 1; readonly max: 10; }; export declare const inLcBox: (b: LanternWakeBox, x: number, z: number, pad?: number) => boolean; /** The Common's ground: its meadow and the Green's strip down to the lane (the town's cottages stand from x 1981 at z 1072 and south, outside both). */ export declare const inLamplightBox: (x: number, z: number, pad?: number) => boolean; /** The Lamplighters' Green: the camp where the Brindle Road's lane meets the meadow. */ export declare const LAMPLIGHT_GREEN_BOX: LanternWakeBox; /** Heron Pond (an ellipse of water) and its jetty on the south shore. */ export declare const LAMPLIGHT_POND: { readonly cx: 2002; readonly cz: 992; readonly rx: 8; readonly rz: 6; }; export declare const LAMPLIGHT_POND_BOX: LanternWakeBox; /** The Moth Meadow: the loop's open middle, where the moths gather. */ export declare const LAMPLIGHT_MEADOW_BOX: LanternWakeBox; /** The beacon-view hill in the north-west corner (a watch stand that looks down on the sea). */ export declare const LAMPLIGHT_HILL_BOX: LanternWakeBox; /** Old Dimwing's hollow, on the west edge below the loop's twelfth lamp. */ export declare const LAMPLIGHT_HOLLOW_BOX: LanternWakeBox; /** The pine wood edge on the west: foraging and a fox. */ export declare const LAMPLIGHT_WOOD_BOX: LanternWakeBox; /** The loop path (a closed ring from the Green's east exit, clockwise): the twelve lamps stand beside it. */ export declare const LAMPLIGHT_LOOP: readonly LanternWakePoint[]; export declare const LAMPLIGHT_PATHS: ReadonlyArray<{ id: string; w: number; pts: readonly LanternWakePoint[]; }>; export declare const LC_PROP: { readonly lamp: "lclamp"; readonly lampLit: "lclamplit"; readonly lampGlow: "lclampglow"; readonly shed: "lcshed"; readonly board: "lcboard"; readonly shoo: "lcshoo"; readonly glow: "lcglow"; }; export type LcQuestProp = { readonly id: string; readonly x: number; readonly z: number; readonly style: string; }; export declare const LC_LAMP_COUNT = 12; export declare const LC_LAMP_NAMES: readonly ["Green Lamp", "Gate Lamp", "Hedge Lamp", "Stile Lamp", "Pond Lamp", "Reed Lamp", "Willow Lamp", "Hill Lamp", "Hawthorn Lamp", "Pine Lamp", "Fern Lamp", "Hollow Lamp"]; export declare const lcLampStyle: (n: number, state: "unlit" | "lit" | "glow") => string; export declare const LC_LAMPS: readonly (LcQuestProp & { readonly n: number; readonly name: string; })[]; /** The lamp number (1-12) a quest-prop style names (unlit, lit or glowing), or 0. */ export declare function lcLampNumber(style: string | undefined | null): number; /** Which state a lamp style is in, or null when it is not a lamp's. */ export declare function lcLampState(style: string | undefined | null): 'unlit' | 'lit' | 'glow' | null; export declare const LC_SHED: LcQuestProp; export declare const LC_BOARD: LcQuestProp; export declare const LC_QUEST_PROPS: readonly LcQuestProp[]; export declare const LC_QUEST_PROP_NAMES: Readonly>; /** The model a Lamplight quest prop draws with (frontend models that already exist), or null if not one of them. */ export declare function lamplightPropModel(prop: string): string | null; /** The verb on the hover for each prop. */ export declare const LAMPLIGHT_PROP_VERBS: Readonly>; /** A taper burns this long from the moment it is taken or relit (a clock per player, in memory). */ export declare const LC_TAPER_BURN_MS = 180000; /** A lit lamp burns this long on its own, then goes out (so a part-lit Common never stays that way). */ export declare const LC_LAMP_BURN_MS = 300000; /** The whole Common glows this long after a finished Round, then the lamps reset. */ export declare const LC_GLOW_MS = 45000; /** One payout per character in this time. */ export declare const LC_PAY_COOLDOWN_MS = 300000; /** How close a player must be to a lamp, the Lamp Shed or the board (tiles, either axis). */ export declare const LC_TOUCH_REACH = 4; /** The Round's payout, per paid player: placeholders. */ export declare const LC_ROUND_REWARD: { readonly coins: 70; readonly wicks: 3; readonly explorerXp: 600; }; /** Lamp moths: the number on the Common, how they behave. */ export declare const LC_MOTH_KIND = "lampmoth"; export declare const LC_MOTH_NAME = "Lamp Moth"; export declare const LC_MOTH_ID_PREFIX = "lcm-"; export declare const LC_MOTH_SCALE = 1.5; /** A moth sets out for a lit lamp near a taper-holder: first this long after the lamp caught, then at most one new moth every `every` ms, `maxAtOnce` out. */ export declare const LC_MOTH: { readonly grace: 12000; readonly every: 20000; readonly maxAtOnce: 2; /** Tiles a second in flight. */ readonly speed: 3.2; /** It sits on the lamp this long before the flame goes out. */ readonly settleMs: 14000; /** A lit lamp this close to a player carrying a burning taper is one a moth wants (the taper's flame draws them). */ readonly noticeRadius: 16; /** The same lamp is not picked again for this long after a moth was shooed off it. */ readonly lampCooldownMs: 20000; /** A moth is shooed from this close (tiles, either axis). */ readonly shooReach: 3; /** A shooed or finished moth flies home at this speed. */ readonly fleeSpeed: 4.5; }; /** Where each moth drifts: three over the Moth Meadow, five beside lamps. */ export declare const LC_MOTH_HOMES: readonly (readonly [number, number])[]; /** The glad and cross words of the Round. */ export declare const LC_TEXT: { readonly taken: "Wick Harbottle lights a taper at his lantern and puts it in your hand. It burns for three minutes: touch it to an unlit lamp-post, and relight it at the Lamp Shed if it dies."; readonly held: "Your taper is burning: no need for another. It has {left} left."; readonly relit: "The Lamp Shed relights your taper. Three minutes more."; readonly relitHint: "The taper dies in a breath. Take one from Wick Harbottle, or relight it at the Lamp Shed."; readonly noTaper: "You need a burning taper to light a lamp-post. Take one from Wick Harbottle at the Lamp Shed."; readonly taperDied: "Your taper gutters and goes out. Relight it at the Lamp Shed."; readonly taperLow: "Your taper is burning low: about a minute left."; readonly lit: (name: string, lit: number) => string; readonly burning: "That lamp is already burning."; readonly glowing: "The Common is glowing. Let it shine a moment."; readonly tooFar: "Walk up to the lamp-post first."; readonly mothSettled: (name: string) => string; readonly snuffed: (name: string) => string; readonly shooed: "You wave the moth off the lamp, and it flutters away."; readonly shooFar: "Walk up to the moth first."; readonly nothingToShoo: "The moth is just drifting. It is not bothering any lamp."; readonly done: "All twelve lamps burn at once, and the whole Common glows!"; readonly paid: (r: { coins: number; wicks: number; }) => string; readonly cooldown: "The Lamplighters have already paid you for this Round: keep the lamps if you like, but the purse is shut for a few minutes."; readonly noCredit: "You did not light any of the lamps this Round, so there is no purse for you. Take a taper and have a go."; readonly reset: "The glow fades, and the lamps go dark again. The Common is ready for another Round."; readonly burnedOut: "A lamp has burned out."; readonly swapped: "Ione Brae turns a Hand Lantern over in her hands, hangs it on a cord and gives it to you for the wicks."; readonly swapShort: (have: number) => string; readonly swapHave: "You already carry a Hand Lantern. One is plenty."; readonly shedHint: "The Lamp Shed: ladders, oil cans and spare lamp heads. Click it to relight a burnt-out taper."; readonly board: (lit: number, state: string) => string; }; export declare const LAMP_WICK_KIND = "lampwick"; export declare const LAMP_WICK_NAME = "Lamp Wick"; export declare const HAND_LANTERN_KIND = "handlantern"; export declare const HAND_LANTERN_NAME = "Hand Lantern"; /** Lamp Wicks Ione Brae swaps for one Hand Lantern (a cosmetic trophy; no worn model yet: upgrades row). */ export declare const LC_LANTERN_SWAP_WICKS = 20; /** Opens the swap in Ione's menu; the server answers. */ export declare const LC_ACTION_PREFIX = "lc:"; export declare const LC_ACTION: { readonly taper: "lc:taper"; readonly swap: "lc:swap"; readonly shoo: "lc:shoo"; readonly round: "lc:round"; }; /** The Round as told to a player (message `lamp_round`): their taper, the lamps and their moths. `taperMs` is null with no burning taper. */ export type LampRoundView = { stage: 'idle' | 'lighting' | 'glow'; taperMs: number | null; taperMaxMs: number; lit: number; total: number; shooed: number; glowMs?: number; }; export declare const lcTaperBar: (leftMs: number, maxMs?: number, cells?: number) => string; /** One thing laid on the ground: the kit's own kinds and styles, placed by the backend's ground placer. */ export type LamplightProp = { readonly id: string; readonly kind: 'dreadmodel' | 'dreadprop' | 'campfire' | 'barrel' | 'stove' | 'signpost'; readonly style: string; readonly x: number; readonly z: number; readonly scale?: number; }; /** The Green's pieces (the Lamp Shed and the Round board are quest props). No bank, no stall that sells food. */ export declare const LAMPLIGHT_GREEN_PIECES: readonly LamplightProp[]; /** The rest of the Common's dressing: the jetty and reeds on the pond, the hedgehog bank, the hill's stand, Old Dimwing's hollow, benches on the loop. */ export declare const LAMPLIGHT_DRESSING: readonly LamplightProp[]; /** The signs (the placard signpost). */ export declare const LAMPLIGHT_SIGNS: ReadonlyArray<{ readonly id: string; readonly x: number; readonly z: number; readonly text: string; }>; export type LamplightFolk = { 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; }>; /** Options the server answers (their ids start with `lc:`): the client forwards them. */ readonly actions?: ReadonlyArray<{ readonly id: string; readonly label: string; readonly say: string; }>; }; /** Sheet 5's six people, with the sheet's exact names. The cook lives in campTraders.ts. */ export declare const LAMPLIGHT_FOLK_NAMES: { readonly lamplighter: "Wick Harbottle"; readonly taperMaker: "Ione Brae"; readonly warden: "Gilbert Sallow"; readonly mothCatcher: "Sorrel Vane"; readonly cook: "Agnes Thorne"; readonly traveller: "Tam Alder"; }; export declare const LAMPLIGHT_FOLK: ReadonlyArray; export declare function lamplightFolkByName(name: string | null | undefined): LamplightFolk | null; /** The camp's cook, which lives in CAMP_TRADERS (campTraders.ts) beside the other camps' cooks. */ export declare const LAMPLIGHT_COOK: { readonly id: "camp-lamplight"; readonly name: "Agnes Thorne"; readonly x: 1956; readonly z: 1084; readonly faceX: 1957; readonly faceZ: 1081; }; export type LcWildlifeKind = 'commonrabbit' | 'hedgehog' | 'heron' | 'commonfox'; export type LcWildlifeSpot = { readonly kind: LcWildlifeKind; readonly name: string; readonly x: number; readonly z: number; readonly leash: number; }; /** Harmless wildlife of the Common: they fight back only if struck (the hedgehog never). Names are the sheet's. */ export declare const LAMPLIGHT_WILDLIFE_SPOTS: readonly LcWildlifeSpot[]; export declare const LC_WILDLIFE_ID_PREFIX = "lcw-"; /** How each moves about its spot (tiles a second, how often it stops). */ export declare const LC_WILDLIFE_PACE: Readonly>; export declare const OLD_DIMWING_KIND = "olddimwing"; export declare const OLD_DIMWING_NAME = "Old Dimwing"; export declare const OLD_DIMWING: { readonly id: "lcd-dimwing-1"; readonly x: 1952; readonly z: 1033; readonly leash: 5; readonly level: readonly [number, number]; readonly maxHit: 6; /** A mini-boss's hide: thicker than the level's ordinary health. */ readonly healthScale: 2.2; /** Drawn bigger than the ember bat file (the same model, scaled). */ readonly scale: 3.2; readonly note: "A huge grey moth with ragged wings and a lamp-glass belly, asleep in the hollow tree. Passive until struck. Every fourth blow he beats his wings and a cone of wind sweeps the grass in front of him, told a full turn ahead: step out of it and the Wing Gust misses."; }; export declare const OLD_DIMWING_RESPAWN_MS: { readonly minMs: 240000; readonly maxMs: 360000; }; export declare const OLD_DIMWING_PACE: { readonly speed: 0.8; readonly idleChance: 0.7; readonly pause: readonly [number, number]; }; /** Placeholders for the balance pass: coins, feathers, Lamp Wicks. Nothing heals. */ export declare const OLD_DIMWING_DROPS: readonly { itemKind: string; chance: number; minQty: number; maxQty: number; }[]; /** The model the client draws him with until he has one (the ember bat's, at OLD_DIMWING.scale). */ export declare const OLD_DIMWING_STAND_IN = "emberbat"; /** Standable tiles for teleports, smokes and the helper. */ export declare const LAMPLIGHT_STANDS: { readonly lane: { readonly x: 1960; readonly z: 1087; }; readonly green: { readonly x: 1962; readonly z: 1068; }; readonly shed: { readonly x: 1956; readonly z: 1072; }; readonly board: { readonly x: 1968; readonly z: 1065; }; readonly cookhouse: { readonly x: 1957; readonly z: 1085; }; readonly meadow: { readonly x: 1988; readonly z: 1024; }; readonly pond: { readonly x: 2004; readonly z: 1004; }; readonly hill: { readonly x: 1960; readonly z: 972; }; readonly hollow: { readonly x: 1958; readonly z: 1030; }; readonly wood: { readonly x: 1956; readonly z: 1004; }; }; export declare const LAMPLIGHT_PLACE_TEXT = "Lamplight Common is the free first meadow of the Western Kingdoms, between the west ridge and Lantern Wake's high street: walk west from the station and the town's street and turn north at the lane to the Lamplighters' Green. It has a camp with the Lamp Shed, a taper-maker's cart, a cookhouse (the cook buys what you cook and sells no food) and a notice board, a loop path with twelve lamp-posts, Heron Pond with its jetty, the Moth Meadow, a pine wood, Beacon-View Hill and Old Dimwing's hollow. There is no bank here: banks are in the towns."; export declare const LAMPLIGHT_ROUND_TEXT = "Lamplighter Wick Harbottle lends you a lit taper that burns for three minutes (the Lamp Shed relights it). Twelve lamp-posts stand on the loop path: touch one with the taper to light it. Lamps are shared, so a friend lighting lamps with you shares the credit, and each burns five minutes on its own. Lamp moths settle on lit lamps near a taper and snuff them in a few seconds unless you shoo them with a click. Light all twelve at once and the whole Common glows: every lighter on the Common is paid coins and Lamp Wicks (once every five minutes). Twenty Lamp Wicks swap for a Hand Lantern at Ione Brae's cart."; export declare const LAMPLIGHT_CAMP_DISCOVERY_ZONE: DiscoveryZone; export declare const LAMPLIGHT_DISCOVERY_ZONES: readonly DiscoveryZone[]; //# sourceMappingURL=lamplightCommon.d.ts.map