import type { RingBossKind, WorldBossRing } from './worldBossRing.js'; /** Each lair's own clock: four lairs, one every three hours. */ export declare const LAIR_PERIOD_MS: number; /** Lair i is offset by this plus LAIR_SLOT_GAP_MS * i. */ export declare const LAIR_FIRST_OFFSET_MS: number; export declare const LAIR_SLOT_GAP_MS: number; /** The arena: tiles within this of the lair's centre (the boss's station). */ export declare const LAIR_ARENA_RADIUS = 9; /** Rank r of the damage dealers gets the thrown piece r for this long. */ export declare const LAIR_FLOOR_RESERVE_MS = 45000; /** A satchel or ladder reward needs this share of all the damage dealt to the boss. */ export declare const LAIR_MIN_SHARE = 0.03; /** The pack creature kills a qualifying fighter is credited on an active Bounty. */ export declare const LAIR_BOUNTY_CREDIT = 3; /** The countdown's chat lines start at stage 3 ("under an hour"); the sign and the login line carry the rest. */ export declare const LAIR_ANNOUNCE_FROM: 3; /** * The lairs. Centres are each boss's own station (cryptGrounds.ts CRYPT_PLAZA, rotwoodGrove.ts GROVE_ENT, bloodMire.ts MIRE_ELEMENTAL, the * Spider Matriarch's spot two tiles out from her den in Spider Hollow, Ring 4 since 2026-10-17: spiderHollow.ts, GATE_MONSTER_PROFILES). The cage (the chest) stands 5-8 tiles off on the lair's * far side from the way in, on a tile with all eight neighbours clear (surveyed 2026-10-14, backend dump of canStand). `sign` and `entrance` * are only where the way in meets the arena (no board is built at a lair). No pillars, lamps or sign: the lair is its own place. */ export declare const CRYPT_LAIR: WorldBossRing; export declare const GROVE_LAIR: WorldBossRing; export declare const MIRE_LAIR: WorldBossRing; export declare const HOLLOW_LAIR: WorldBossRing; /** The four lairs in rota order (lair i wakes at its offset, every LAIR_PERIOD_MS). */ export declare const LAIR_RINGS: readonly WorldBossRing[]; /** The lair boss kinds. */ export declare const LAIR_BOSS_KINDS: readonly RingBossKind[]; export declare function isLairRing(ring: { id: string; }): boolean; /** Only the mere ring-like facts: a ring that is a lair awakening carries `lair` rules. */ export declare function lairRulesOf(ring: WorldBossRing): NonNullable | null; /** One fighter's credit (what the engine keeps per player and saves with the fight). */ export type LairCredit = { id: string; damage: number; firstAt: number; }; /** * The fighters in rank order: most damage first; a tie goes to the earlier first blow, then to the lower id (so the order is the same on * every restart and nobody can tie their way past a rival). Zero-damage entries are not fighters. */ export declare function lairRanking(credits: readonly LairCredit[]): LairCredit[]; /** * Who qualifies for a satchel and the ladder: at least `minShare` of all the damage dealt (a fraction). One blow among thousands does not. * Returned in rank order, with their rank (1-based). */ export declare function lairQualifiers(credits: readonly LairCredit[], minShare: number): Array; /** The ladder reward rolls for a rank: the entry for that rank, or nothing (rank 11 and below get the satchel only). */ export declare function lairLadderFor(rules: NonNullable, rank: number, random?: () => number): Array<{ kind: string; qty: number; }>; /** * The gear thrown at the chest is reserved by rank: piece i (0-based, in the order thrown) is the rank-(i+1) fighter's for * `floorReserveMs`; a piece with no qualifying fighter of that rank is free at once. Returns the owner id (or null for free) per piece. */ export declare function lairFloorOwners(pieces: number, qualifiers: ReadonlyArray<{ id: string; rank: number; }>): Array; /** The world chat lines of a lair awakening (one place, so the backend and the tests read the same words). */ export declare function lairFightLine(kind: 'start' | 'won' | 'failed' | 'empty', bossName: string, ring: WorldBossRing): string; //# sourceMappingURL=lairAwakening.d.ts.map