import type { TerrainField } from "./terrain.js"; /** A sky-occluding footprint — a roof, dense canopy, a cave mouth. `shade` 0..1 = fraction of sky blocked. */ export interface OccluderRect { x: number; z: number; w: number; d: number; shade?: number; } /** A localized warmth source — campfire, forge, geothermal vent. */ export interface HeatSource { x: number; z: number; radius: number; /** Degrees added at the center, falling to 0 at `radius`. */ strength: number; } export type ShadeProvider = readonly OccluderRect[] | ((x: number, z: number) => number); export type ScalarField = number | ((x: number, z: number, time: number) => number); export interface EnvironmentFieldConfig { /** Game-seconds per day; drives the sun-elevation cycle. Default matches the sim clock day. */ dayLength?: number; /** Temperature at sea level under a noon sun with no weather. Default 20. */ baseTemperature?: number; /** Degrees colder at deep night vs noon. Default 12. */ nightDrop?: number; /** Degrees lost per world-height unit above `seaLevel` (altitude lapse). Default 0. */ altitudeLapse?: number; seaLevel?: number; /** Terrain field used to look up ground altitude when a caller omits `y`. */ terrain?: TerrainField; /** Rain/precipitation intensity 0..1 at a position — from a weather state. Default 0. */ rain?: ScalarField; /** Sky occluders (structures, canopy) that block sun and shelter from rain. */ occluders?: ShadeProvider; /** Campfires and other warmth emitters. */ heatSources?: readonly HeatSource[]; /** Minimum ambient light at night (moonlight floor), 0..1. Default 0.05. */ ambientFloor?: number; /** Per-position base-temperature offset (biome map). Added to `baseTemperature`. */ temperatureAt?: (x: number, z: number) => number; } export interface EnvironmentSample { /** Degrees (game units). */ temperature: number; /** 0..1 surface wetness. */ wetness: number; /** 0..1 direct sun/sky exposure — full sun open sky = 1, deep shade/night = 0. */ lightExposure: number; /** 0..1 overall light level for spawn gating — includes ambient/moonlight. */ ambientLight: number; /** Under an occluder (roof/canopy) enough to shelter from rain. */ sheltered: boolean; } export interface EnvironmentField { sample(x: number, z: number, time: number, y?: number): EnvironmentSample; temperature(x: number, z: number, time: number, y?: number): number; wetness(x: number, z: number, time: number): number; lightExposure(x: number, z: number, time: number): number; ambientLight(x: number, z: number, time: number): number; /** Sun elevation -1..1 (1 = noon overhead, 0 = horizon, negative = night). */ sunElevation(time: number): number; } /** * A sampleable environment field: read temperature, wetness, sun/sky exposure, and * ambient light at any world position and time. Built on the same renderer-free footing * as terrain/wind/water so meters, spawn gating, and damage-in-sunlight read the world * the shell renders — no three.js. Instantaneous and pure (no accumulation); stateful * build-up belongs to a decay meter reading this field. */ export declare function createEnvironmentField(config?: EnvironmentFieldConfig): EnvironmentField;