/** * RANGER'S REST'S DENS AND THE SNARE-MASTER (T120, 2026-10-15; plan `.cursor/task-plans/2026-10-15-t120-rangers-rest.md`; rangersRest.ts has the camp). * The Greenwood's south reach had no creatures of its own. Three dens of EXISTING kinds (the Greenwood's lynx, mole, bristlehart stag, knuckleroot * and thornwood reiver), scaled to levels 22-30, are set on the reach's west and south, in the pattern of the Dwarf Road's dens * (dwarfRoadDens.ts, T102): a creature of a den is told apart from the same kind elsewhere by its id (`rrd---`), 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 Snare-Master is the reach's mini-boss (levels 28-29): the poachers' chief, in the Snare Cut south-west of the Hide. Passive until struck like * the rest of the west. Every fourth blow is his Net Cast (bossSignatures.ts `net-cast`): he whirls a weighted net and a ring of cord closes round * him a full turn ahead; step out of reach and it misses (the E8 step-clear counter). Drawn as a Thornwood Reiver at a larger scale until a model of * his own exists (upgrades row `snare-master-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 RangersDenKind = 'barkhidelynx' | 'burrowmole' | 'knuckleroot' | 'bristlehartstag' | 'thornreiver'; export type RangersDenSiteId = 'lynx-brake' | 'rootmoor-hollow' | 'poachers-hide'; export type RangersDenSpot = { readonly x: number; readonly z: number; readonly leash: number; }; export type RangersDenGroup = { readonly kind: RangersDenKind; /** 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 RangersDenSpot[]; readonly drops: readonly { readonly itemKind: string; readonly chance: number; readonly minQty: number; readonly maxQty: number; }[]; }; export type RangersDenSite = { readonly id: RangersDenSiteId; 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 camp's tracks. */ readonly stand: { readonly x: number; readonly z: number; }; readonly blurb: string; readonly groups: readonly RangersDenGroup[]; }; export declare const RANGERS_DEN_SITES: readonly RangersDenSite[]; export declare const RANGERS_DEN_SITE_IDS: readonly RangersDenSiteId[]; export declare function inRangersDenBox(box: LanternWakeBox, x: number, z: number): boolean; /** The den whose box holds this tile, or null. The boxes never overlap (scripts/rangers-rest-test.mjs). */ export declare function rangersDenSiteAt(x: number, z: number): RangersDenSite | null; /** A den creature's server id: `rrd---`. */ export declare const RANGERS_DEN_ID_PREFIX = "rrd-"; export declare function rangersDenId(site: RangersDenSiteId, kind: RangersDenKind, n: number): string; /** The site and group an id names, or null for any other creature. */ export declare function parseRangersDenId(id: string): { site: RangersDenSite; group: RangersDenGroup; } | null; export declare const SNARE_MASTER_KIND = "snaremaster"; export declare const SNARE_MASTER_NAME = "Snare-Master"; export declare const SNARE_CUT_BOX: LanternWakeBox; export declare const SNARE_MASTER: { readonly id: "rrd-snaremaster-1"; readonly x: 1682; readonly z: 1278; readonly leash: 4; readonly level: readonly [number, number]; readonly maxHit: 24; /** A boss's hide: much thicker than the level's ordinary health. */ readonly healthScale: 2.2; /** Drawn bigger than a Thornwood Reiver (the same model, scaled). */ readonly scale: 1.5; readonly note: "The poachers' chief, a long man in a cloak of nets who has never been caught in one. Passive until struck. Every fourth blow he whirls a weighted net and a ring of cord closes round him, announced a turn ahead: step clear of the ring and the blow goes wide. Back five to seven minutes after he falls."; }; export declare const SNARE_MASTER_RESPAWN_MS: { readonly minMs: 300000; readonly maxMs: 420000; }; export declare const SNARE_MASTER_PACE: { readonly speed: 0.9; readonly idleChance: 0.6; readonly pause: readonly [number, number]; }; /** Placeholders for the balance pass: coins, spruce arrows, ash, hide and a chance at a steel bar. */ export declare const SNARE_MASTER_DROPS: readonly { itemKind: string; chance: number; minQty: number; maxQty: number; }[]; /** The model the client draws him with until he has one (the Thornwood Reiver's, at SNARE_MASTER.scale). */ export declare const SNARE_MASTER_STAND_IN = "thornreiver"; export declare const RANGERS_PEN_ZONE_BOX: LanternWakeBox; export declare const RANGERS_RUN_ZONE_BOX: LanternWakeBox; export declare const RANGERS_TRAIL_ZONE_BOX: LanternWakeBox; export declare const RANGERS_GROVE_ZONE_BOX: LanternWakeBox; export declare const RANGERS_KNOLL_ZONE_BOX: LanternWakeBox; export declare const RANGERS_REST_DISCOVERY_ZONES: readonly DiscoveryZone[]; //# sourceMappingURL=rangersRestDens.d.ts.map