import type { WindVector } from "./wind.js"; export type WeatherKind = string; export interface WeatherState { kind: WeatherKind; intensity: number; wind?: WindVector; } export interface WeatherModifier { grip?: number; visibility?: number; structureDamage?: number; chill?: number; ignition?: number; spread?: number; } export type WeatherModifierTable = Record; export type WeatherKindOf = Extract; export interface ResolvedWeather { grip: number; visibility: number; structureDamage: number; chill: number; ignition: number; spread: number; } export declare function resolveWeather(state: WeatherState, table: TTable): ResolvedWeather; export type FireCellState = "unburnt" | "burning" | "burnt"; export interface FireCell { fuel: number; heat: number; state: FireCellState; } export interface FireGridConfig { cols: number; rows: number; cellSize: number; /** World x,z of the center of cell (0,0). Default [0,0]. */ origin?: readonly [number, number]; /** Initial fuel 0..1 per cell; default 1 everywhere. */ fuelAt?: (col: number, row: number) => number; /** Accumulated heat needed to ignite a fuelled cell. Default 1. */ ignitionThreshold?: number; /** Heat pushed to each neighbour per second from a burning cell. Default 0.6. */ spreadRate?: number; /** Fuel consumed per second while burning. Default 0.25. */ burnRate?: number; /** Prevailing wind biasing spread direction. */ wind?: WindVector; /** How strongly wind biases downwind vs upwind spread, 0..1. Default 0.6. */ windBias?: number; /** Hard allocation bound; defaults to 65536 cells. */ maxCells?: number; } /** Live fire ignition, spread, consumption and wind policies; grid geometry stays fixed. */ export type FireGridTuning = Pick; export interface FireStepOptions { /** Global spread multiplier this step (rain suppression from resolveWeather().spread). Default 1. */ spread?: number; /** Live wind in metres/second along world X,Z, overriding configured wind this step. */ wind?: WindVector; windAt?: (x: number, z: number) => WindVector; /** Per-cell wetness 0..1 that resists ignition — from an environment field. */ wetnessAt?: (col: number, row: number) => number; /** Heat removed per second at full wetness; 0 (default) leaves extinction to game policy. */ extinguishRate?: number; } export interface FireGrid { readonly cols: number; readonly rows: number; readonly cellSize: number; readonly origin: readonly [number, number]; /** Advance the cellular propagation by game-time `dt`. */ step(dt: number, options?: FireStepOptions): void; igniteCell(col: number, row: number): void; /** Cool a burning cell to unburnt without replacing its remaining fuel. */ extinguishCell(col: number, row: number): boolean; /** Extinguish the cell under a world position; false outside the grid or when not burning. */ extinguish(x: number, z: number): boolean; /** Ignite the cell under a world position; no-op if outside the grid. */ ignite(x: number, z: number): boolean; cell(col: number, row: number): FireCell; cellAt(x: number, z: number): FireCell | null; cellCoord(x: number, z: number): { col: number; row: number; } | null; /** Count of currently burning cells. */ readonly burning: number; /** Flat snapshot (row-major) for rendering. */ snapshot(): FireCell[]; restore(state: readonly FireCell[]): void; retune(tuning: FireGridTuning): void; } export declare function createFireGrid(config: FireGridConfig): FireGrid;