import type { NavPoint } from "../nav/navGrid.js"; import { type RandomSeed } from "../random/rng.js"; export interface SpawnEntry { id: string; cost: number; weight?: number; minWave?: number; } export interface WaveManifest { budget: number; entries: readonly SpawnEntry[]; duration?: number; budgetPerSecond?: number; } export interface SpawnDirectorConfig { waves: readonly WaveManifest[]; maxAlive?: number; escalationPerSecond?: number; alertBudgetPerSecond?: number; alertDecayPerSecond?: number; playerBudgetPerSecond?: number; maxSpawnsPerTick?: number; loop?: boolean; seed?: number; spawnPoints?: readonly NavPoint[]; spawnPointBias?: number; } export interface SpawnDirectorState { wave: number; elapsed: number; waveElapsed: number; budget: number; alert: number; spawnedThisWave: number; spawnedTotal: number; /** Opaque PRNG cursor — round-trip it as part of the state, never read or set it directly. */ rng: RandomSeed; done: boolean; } export interface DirectorContext { alive: number; players?: number; playerPositions?: readonly NavPoint[]; } export interface SpawnRequest { entryId: string; cost: number; wave: number; point?: NavPoint; laneId?: number; } /** Preference for picking a spawn point relative to `avoid` positions: closer, farther, or unweighted. */ export type SpawnPointDistanceBias = "near" | "far" | "none"; /** How strongly `distanceBias` weights candidates by distance from `avoid` — a named intent, not a weighting exponent. */ export type SpawnPointBiasStrength = "subtle" | "moderate" | "strong"; /** Semantic options for selecting a spawn point without exposing weighting internals. */ export interface SpawnPointSelectionOptions { candidates: readonly NavPoint[]; avoid?: readonly NavPoint[]; random: () => number; distanceBias?: SpawnPointDistanceBias; /** Default `"moderate"`. */ biasStrength?: SpawnPointBiasStrength; } export interface DirectorStep { state: SpawnDirectorState; spawns: SpawnRequest[]; } export declare function createSpawnDirectorState(config: SpawnDirectorConfig): SpawnDirectorState; export declare function raiseAlert(state: SpawnDirectorState, amount: number): SpawnDirectorState; export declare function advanceWave(config: SpawnDirectorConfig, state: SpawnDirectorState): SpawnDirectorState; export declare function advanceSpawnDirector(config: SpawnDirectorConfig, state: SpawnDirectorState, dt: number, ctx: DirectorContext): DirectorStep; /** Selects a candidate spawn point using a semantic distance preference and caller-supplied randomness. */ export declare function pickSpawnPoint(options: SpawnPointSelectionOptions): NavPoint | null; /** @deprecated Pass one SpawnPointSelectionOptions object instead. */ export declare function pickSpawnPoint(points: readonly NavPoint[], players: readonly NavPoint[], options: { roll: number; bias?: number; }): NavPoint | null;