/** * THE DWARF HOLD AS A HUB, levels 28-38 (track T93, 2026-10-14; plan `.cursor/task-plans/2026-10-14-t93-dwarf-hold-hub.md`). * * The Hold (dwarfHold.ts) was a train stop with a warden, one mining face and a sealed stair. This file makes it a place to spend an evening * on the Western Line without a new stop, leg or dwell (circuit version 2 is frozen) and without new land: everything is inside the Hold's * existing pocket (x 949-1000, z 1100-1185). * * - THREE NEW RESIDENTS beside Warden Thrida Deepstair: Forgemaster Dagrim Emberhand (the Hold smith), Brewmistress Hilda Ashkettle (the * cook and brewer) and Archivist Vessa Stonepage (keeper of the stair's records). * - THE STATIONS: two furnaces and two anvils in the hall's north half (Blacksmithing has a stop on the line) and two ranges with a fire in * the south half (Cooking has one), plus two counters (existing goods at existing prices: nothing here pays a profit). * - THE BACK BORE: the Hold's own work gallery in the rock north of the hall (dwarfHold.ts DWARF_HOLD_BACK_BORE), eight more ore seams * (iron, coal and gold: the K3 kit's `wloreseam` stand-ins) and the Back Bore Rockworm, a mid-band boss (level 36-37) with a telegraphed * lunge: step clear of its ring before it lands. It fights only when struck. * - SIX QUESTS (the story engine, data only): Ore for the Forge, Supper for the Deep Shift, Gold and Silver for the Hold, The Lamplighter's * Run (a timed lantern run along the platform, bore B's side, on a clock shorter than the gap between two trains), What the Stair Keeps * (the lore of the sealed Great Stair: it explains, it gives a keepsake, it never opens anything) and The Rockworm of the Back Bore. * * The Great Stair and both side doors stay sealed; nothing here is 41+. Every level, count, price and reward is a PLACEHOLDER for the * balance pass (James, 2026-10-12: balance last). * * Imports only erased types from storyQuests.ts, so storyQuests.ts spreads HOLD_HUB_QUESTS with no cycle. */ import type { StoryQuestDef } from './storyQuests.js'; import { type DwarfHoldPiece } from './dwarfHold.js'; export type HoldBox = { readonly minX: number; readonly maxX: number; readonly minZ: number; readonly maxZ: number; }; export declare const HOLD_HUB_NAME = "The Dwarf Hold"; export declare const BACK_BORE_NAME = "The Back Bore"; export declare const HOLD_FOLK_NAMES: { readonly smith: "Forgemaster Dagrim Emberhand"; readonly cook: "Brewmistress Hilda Ashkettle"; readonly archivist: "Archivist Vessa Stonepage"; }; export type HoldShop = { readonly title: string; readonly stock: ReadonlyArray<{ readonly kind: string; readonly price: number; }>; /** What the counter pays over the trader's rate (a cook buys players' cooking: no shop sells food, shopFood.ts). */ readonly buys?: Readonly>; }; export type HoldFolk = { readonly id: string; readonly name: string; /** Where they are, for the guide, the verify links, the resident card and the dialog. */ 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; }>; readonly shop?: HoldShop; /** The line the Trade option opens with. */ readonly trade?: string; }; export declare const HOLD_FOLK: ReadonlyArray; export declare function holdFolkByName(name: string | null | undefined): HoldFolk | null; export declare function holdFolkById(id: string | null | undefined): HoldFolk | null; /** The counters, keyed by the keeper's name (backend world.ts NAMED_SHOPKEEPERS). */ export declare const HOLD_SHOP_FOLK: ReadonlyArray; export type HoldStation = { readonly id: string; readonly kind: string; readonly style: string; readonly x: number; readonly z: number; }; /** The working stations in the hall (real entities: the skills' own kinds). */ export declare const HOLD_STATIONS: readonly HoldStation[]; /** Eight more seams along the gallery's north wall, worked from the south (the K3 kit's `wloreseam` stand-ins: ORE_ROCK_KIND). */ export declare const BACK_BORE_SEAMS: ReadonlyArray<{ id: string; x: number; z: number; style: 'iron' | 'coal' | 'gold'; }>; export declare const BACK_BORE_FURNITURE: readonly DwarfHoldPiece[]; /** The complete gallery: furniture plus its rock walls (the footprint reader is passed in, so this file never imports the hall's). */ export declare function backBorePieces(tilesOf: (p: DwarfHoldPiece) => Array<{ x: number; z: number; }>): DwarfHoldPiece[]; export declare const ROCKWORM_KIND: "rockworm"; export declare const ROCKWORM: { readonly name: "Back Bore Rockworm"; readonly level: readonly [number, number]; readonly maxHit: 21; readonly healthScale: 2; /** Drawn on the Stone Serpent's model, bigger. */ readonly scale: 2.6; readonly leash: 7; /** Where it lies: the gallery's east end, a boss arena twelve tiles long. */ readonly x: 992; readonly z: 1106; readonly note: "A fat grey worm of the deep rock, thick as a cart, that bores the Hold's back gallery and lies across the east end of it. It does nothing until it is struck. Every fourth blow it coils back and lunges, announced a full turn ahead: step clear of the ring on the floor and it spends itself on the stone. Back six to eight minutes after it falls."; }; export declare const ROCKWORM_RESPAWN_MS: { readonly minMs: 360000; readonly maxMs: 480000; }; export declare const ROCKWORM_PACE: { readonly speed: 0.7; readonly idleChance: 0.8; readonly pause: readonly [number, number]; }; /** The arena: the gallery's east end, where the Rockworm lies. Standing in it is what the quest's `reach` step counts. */ export declare const ROCKWORM_ARENA: HoldBox; export declare const ROCKWORM_DROPS: ReadonlyArray<{ itemKind: string; chance: number; minQty: number; maxQty: number; }>; /** Quest props (QUEST_PROP_KIND, style `:`): the lamps along the platform and the rune pillars in the hall. */ export declare const HOLD_PROP: { readonly lamp: "dhlamp"; readonly rune: "dhrune"; }; export type HoldProp = { readonly id: string; readonly x: number; readonly z: number; readonly style: string; }; /** * The six platform lamps, north to south, on the platform's back column (x 952) clear of the doorways' rows (1118-1120, 1143-1145, * 1168-1170), the benches and the nameboard. The line's trains blow them out as they pass; The Lamplighter's Run relights them in order. */ export declare const HOLD_LAMP_Z: readonly number[]; export declare const HOLD_LAMPS: readonly HoldProp[]; export declare const HOLD_LAMP_ORDER: readonly string[]; /** The three rune pillars (The Sealed Stair's story): the kings', the warden's and the smiths'. */ export declare const HOLD_RUNES: readonly HoldProp[]; export declare const HOLD_QUEST_PROPS: readonly HoldProp[]; export declare const HOLD_QUEST_PROP_NAMES: Readonly>; /** What a click on a rune pillar reads (the Sealed Stair's story; the quest counts the three). */ export declare const HOLD_RUNE_TEXT: Readonly>; /** The model a Hold prop draws with (CAPITAL_BUILDING_MODELS), or null for a prop that is not one of them. */ export declare function holdHubPropModel(prop: string): string | null; export declare const HOLD_HUB_IDS: readonly ["holdOre", "holdSupper", "holdForging", "holdLamps", "holdStairLore", "holdRockworm"]; export type HoldHubQuestId = (typeof HOLD_HUB_IDS)[number]; /** Levels (placeholders). */ export declare const HOLD_ORE_COMBAT = 28; export declare const HOLD_SUPPER_COMBAT = 28; export declare const HOLD_FORGING_COMBAT = 33; export declare const HOLD_LAMPS_COMBAT = 30; export declare const HOLD_ROCKWORM_COMBAT = 34; export declare const HOLD_STAIR_LORE_COMBAT = 36; /** Skill gates (the ores' and bars' own levels are in mining.ts and blacksmithing.ts). */ export declare const HOLD_ORE_MINING = 30; export declare const HOLD_SUPPER_COOKING = 25; export declare const HOLD_FORGING_SMITHING = 34; /** Counts (placeholders). */ export declare const HOLD_ORE_IRON = 6; export declare const HOLD_ORE_COAL = 6; export declare const HOLD_ORE_GOLD = 3; export declare const HOLD_SUPPER_COOKS = 4; export declare const HOLD_SUPPER_DISHES = 4; export declare const HOLD_FORGING_GOLD_BARS = 2; export declare const HOLD_FORGING_SILVER_BARS = 2; export declare const HOLD_FORGING_DAGGERS = 1; /** Every dish that counts for the Hold's supper (cooked fish, game and bread). */ export declare const HOLD_SUPPER_DISH_KINDS: readonly string[]; /** * The Lamplighter's Run's clock: shorter than the gap between two trains (the cycle over the trains) so the lamps are relit before the next * one blows them out again. The types test reads the circuit and fails if it ever stops being shorter. The run walks about 70 tiles of * platform. Circuit version 3 (the faster train, 2026-10-18) has a gap of about 111 s, so the clock went from 120 s to 100 s. */ export declare const HOLD_LAMPS_MS = 100000; export declare const HOLD_LAMPS_WARN_AT_MS: readonly number[]; export declare const HOLD_ORE_QUEST: StoryQuestDef; export declare const HOLD_SUPPER_QUEST: StoryQuestDef; export declare const HOLD_FORGING_QUEST: StoryQuestDef; export declare const HOLD_LAMPS_QUEST: StoryQuestDef; export declare const HOLD_STAIR_LORE_QUEST: StoryQuestDef; export declare const HOLD_ROCKWORM_QUEST: StoryQuestDef; export declare const HOLD_HUB_QUESTS: Record; export declare const HOLD_HUB_META: Readonly>; /** Where each giver stands, for the quest guide. */ export declare const HOLD_HUB_GIVER_PLACES: Readonly>; /** The extra Seams the Hold now has, for the guide (the hall's seven are DWARF_HOLD_SEAMS). */ export declare const HOLD_SEAM_COUNT: number; /** The Hold's hall box again, for the tests' "nothing stands off the floor" check (re-exported so the test imports one file). */ export declare const HOLD_HALL_BOX: HoldBox; //# sourceMappingURL=dwarfHoldHub.d.ts.map