import type { NpcKind } from './constants.js'; /** * NPC zones inside the Dreadwoods. * * The woods are a PvP square with nothing in them but dead trees, a mine and * whoever else is in there with you. A zone is a patch of it given over to one * creature: dressed so you can tell from the edge what lives there, populated * with that creature at a level suited to the ring it sits in, and - where the * descriptor has one - with a den mouth that drops into that creature's cave. * * The descriptor is the whole contract. The backend dresses the ground and * spawns the creatures from it (map.ts and npcs.ts switch on `id` for the * theme); the client draws the den from its style; the discovery card and the * aggro pass read the bounds. Adding a zone is an entry here, a theme in the * dresser, and a den style if it has one. */ export type DreadwoodsNpcZoneId = 'spider-hollow' | 'broken-road' | 'blood-lake' | 'ogre-fortress' | 'crypt-grounds' | 'rotwood-grove' | 'blood-mire'; export type DreadwoodsNpcZone = { id: DreadwoodsNpcZoneId; /** Discovery card and guide label. */ label: string; /** Centre and half-extents of the infested ground, in world tiles. */ cx: number; cz: number; rx: number; rz: number; npc: { kind: NpcKind; count: number; }; /** * Authored stand-tiles instead of the default ring. A zone with a road and * a camp in it has places its people would actually be posted (the arch, * the fork, inside the stockade), and a ring drawn through all of that * lands them on the road as often as not. When set, `count` is its length. * `scale` is a per-spawn visual size sent to clients (the old dragon on the * lake shore is half again its kin); omitted means the kind's default. */ spawns?: readonly { x: number; z: number; scale?: number; }[]; /** * The way down. Sits on one edge of the zone with its mouth facing back * across it, so the approach is over the infested ground rather than round * it. `facing` is where the mouth points; it is also the side the rim is * left open on, since that is the way in. */ den?: { style: string; x: number; z: number; facing: DenFacing; }; /** * The one who rules the zone, spawned beside its population (the Ogre * Fortress's chief): a kind of its own, where it stands and the tile it * looks toward. */ boss?: { kind: NpcKind; x: number; z: number; faceX: number; faceZ: number; }; }; export type DenFacing = 'north' | 'south' | 'east' | 'west'; /** Unit step out of a den mouth in the direction it faces. */ export declare function denFacingStep(facing: DenFacing): { dx: number; dz: number; }; /** * The tiles a den needs kept clear: its own footprint, one behind, and three * in front across a three-wide throat, so the crawl-out lands on something * walkable and the way in is not a tree or a spawn. */ export declare function inDenClearance(den: { x: number; z: number; facing: DenFacing; }, x: number, z: number): boolean; export declare const DREADWOODS_NPC_ZONES: readonly DreadwoodsNpcZone[]; export declare function dreadwoodsNpcZone(id: DreadwoodsNpcZoneId): DreadwoodsNpcZone; /** Inside the zone's ellipse of infested ground. */ export declare function inDreadwoodsNpcZone(zone: DreadwoodsNpcZone, x: number, z: number): boolean; export declare function dreadwoodsNpcZoneAt(x: number, z: number): DreadwoodsNpcZone | null; /** * Where the zone's creatures stand: a ring at about two thirds of the way out, * plus the middle, so the patch reads as occupied from any side you approach * and nothing spawns in the den mouth or on the rim. */ export declare function dreadwoodsNpcZoneSpawns(zone: DreadwoodsNpcZone): Array<{ x: number; z: number; scale?: number; }>; //# sourceMappingURL=dreadwoodsZones.d.ts.map