/** * THE DWARF ROAD'S DENS AND THE RAIL-EATER (T102, 2026-10-14; plan `.cursor/task-plans/2026-10-14-t102-dwarf-road-middle.md`; dwarfRoadCamp.ts has the * camp and the Spur). The road had 26 single creatures over 81k tiles. Four dens of EXISTING kinds (the Dwarf Road's own: rock crawlers, mountain * goats, iron beetles, cliff hawks, stone serpents, track hounds), scaled to levels 30-38, are set on the valley's flanks away from the road, in * the pattern of the Frozen north's wilds (northWilds.ts, T76): a creature of a den is told apart from the same kind elsewhere by its id * (`dd---`), the backend rolls its level, hit, drops, respawn and aggro from THIS file, and it hunts only a player standing INSIDE * its own den's box and gives up at its leash. A den needs no new model, name, icon or guide row. * * The Rail-Eater is the road's mid-band boss (levels 36-37): a great iron-plated beetle in the Gnawed Cut, west of the road opposite the Old Quarry. * Passive until struck like the rest of the west. Every fourth blow is its Rail Rend (bossSignatures.ts `rail-rend`): it rears and a ring of * torn track closes round it a full turn ahead; step out of reach and it misses (the E8 step-clear counter). Drawn as an Iron Beetle at a larger * scale until a model of its own exists (upgrades row `rail-eater-model`). * * Nothing here is 41+. Every number is a PLACEHOLDER for the balance pass. World tiles (x east, z south). */ import type { LanternWakeBox } from './lanternWake.js'; import type { DiscoveryZone } from './landmarks.js'; export type DwarfDenKind = 'rockcrawler' | 'roadgoat' | 'ironbeetle' | 'cliffhawk' | 'stoneserpent' | 'trackhound'; export type DwarfDenSiteId = 'spoil-heaps' | 'goat-terraces' | 'old-kennels' | 'serpent-stones'; export type DwarfDenSpot = { readonly x: number; readonly z: number; readonly leash: number; }; export type DwarfDenGroup = { readonly kind: DwarfDenKind; /** Level rolled between these two (each respawn rolls again). */ readonly level: readonly [number, number]; readonly maxHit: number; /** Health is the band's ordinary health for the rolled level, times this. */ readonly healthScale: number; /** A player this close (tiles) inside the den's box is hunted; the creature gives up this far (leash) from its spot. */ readonly aggro: number; readonly leashRadius: number; readonly notice: string; readonly respawnMs: { readonly minMs: number; readonly maxMs: number; }; readonly pace: { readonly speed: number; readonly idleChance: number; readonly pause: readonly [number, number]; }; readonly spots: readonly DwarfDenSpot[]; readonly drops: readonly { readonly itemKind: string; readonly chance: number; readonly minQty: number; readonly maxQty: number; }[]; }; export type DwarfDenSite = { readonly id: DwarfDenSiteId; readonly label: string; readonly box: LanternWakeBox; /** Where the guide and the verify link send a player: open ground on the den's edge nearest the road. */ readonly stand: { readonly x: number; readonly z: number; }; readonly blurb: string; readonly groups: readonly DwarfDenGroup[]; }; /** The road's own width: no den's box comes nearer the road's centre line than this many tiles (the road itself is never a hunting ground). */ export declare const DWARF_DEN_MIN_ROAD_GAP = 5; export declare const DWARF_DEN_SITES: readonly DwarfDenSite[]; export declare const DWARF_DEN_SITE_IDS: readonly DwarfDenSiteId[]; export declare function inDwarfDenBox(box: LanternWakeBox, x: number, z: number): boolean; /** The den whose box holds this tile, or null. The boxes never overlap (scripts/dwarf-road-camp-test.mjs). */ export declare function dwarfDenSiteAt(x: number, z: number): DwarfDenSite | null; /** A den creature's server id: `dd---`. */ export declare const DWARF_DEN_ID_PREFIX = "dd-"; export declare function dwarfDenId(site: DwarfDenSiteId, kind: DwarfDenKind, n: number): string; /** The site and group an id names, or null for any other creature. */ export declare function parseDwarfDenId(id: string): { site: DwarfDenSite; group: DwarfDenGroup; } | null; export declare const RAIL_EATER_KIND = "raileater"; export declare const RAIL_EATER_NAME = "Rail-Eater"; export declare const RAIL_EATER_BOX: LanternWakeBox; export declare const RAIL_EATER: { readonly id: "dd-raileater-1"; readonly x: 1878; readonly z: 712; readonly leash: 4; readonly level: readonly [number, number]; readonly maxHit: 27; /** A boss's hide: much thicker than the level's ordinary health. */ readonly healthScale: 2.4; /** Drawn bigger than an Iron Beetle (the same model, scaled). */ readonly scale: 3; readonly note: "A great beetle in iron plate that has eaten its way through the dwarves' sleepers and is working on the rail. Passive until struck. Every fourth blow it rears and a ring of torn track closes round it, announced a turn ahead: step clear of the ring and the blow goes wide. Back six to eight minutes after it falls."; }; export declare const RAIL_EATER_RESPAWN_MS: { readonly minMs: 360000; readonly maxMs: 480000; }; export declare const RAIL_EATER_PACE: { readonly speed: 0.7; readonly idleChance: 0.7; readonly pause: readonly [number, number]; }; /** Placeholders for the balance pass: coins, a bar or two of steel, ore, and a chance at a silver or gold bar. */ export declare const RAIL_EATER_DROPS: readonly { itemKind: string; chance: number; minQty: number; maxQty: number; }[]; /** The model the client draws it with until it has one (the Iron Beetle's, at RAIL_EATER.scale). */ export declare const RAIL_EATER_STAND_IN = "ironbeetle"; /** The Spur Crossing's box: the lane, its buffers and the road across it. */ export declare const SPUR_CROSSING_BOX: LanternWakeBox; export declare const DWARF_MIDDLE_DISCOVERY_ZONES: readonly DiscoveryZone[]; //# sourceMappingURL=dwarfRoadDens.d.ts.map