/** One assigned worker's caller-resolved contribution; stat names and modifiers stay caller-owned. */ export interface StationWorker { readonly id: string; readonly stat: number; } /** Serializable staffing snapshot. The caller owns assignment, unique worker ids, and stable order. */ export interface StaffedStation { readonly stationId: string; /** Nonnegative whole slot count; fractional values round down and nonfinite values admit no workers. */ readonly slots: number; /** Only the first `slots` entries contribute; overflow assignments are not reordered or mutated. */ readonly workers: readonly StationWorker[]; } /** Caller-owned output tuning in production cycles per game-second. */ export interface StationRateTuning { readonly base: number; readonly perStat: number; /** Applied to the whole rate, including base; defaults to 1 and clamps to 0…1. */ readonly efficiency?: number; } /** * Resolve `(base + perStat * sum(admitted worker stats)) * efficiency` without allocation. * Empty staffing retains base production. Negative/nonfinite contributions are zero; a nonfinite * efficiency or overflowing result stops production with rate zero. Invalid workers still occupy * their ordered slots. Assign the result to a `ProductionBuildingDef.rate` for `tickProduction`. * * @capability staffed-station-rate turn bounded caller-owned worker stats and efficiency into a production rate */ export declare function stationOutputRate(station: StaffedStation, tuning: StationRateTuning): number;