import type { CelState } from './celebration'; import type { Dot } from './engine-grid'; import type { EngineOptions, GameStats } from './types'; export declare const ROUND_ATTACKS = 100; export declare const MAX_TARGETS = 8; export declare const MAX_BULLETS = 24; export declare const BULLET_SPEED = 720; export declare const FIRE_CADENCE = 0.28; export declare const CANNON_SPEED = 350; export declare const TARGET_LIFE = 2.8; export declare const ARMED_SPAWN = 0.4; export declare const HIT_R2: number; export declare const TARGET_LIFE_END = 1.6; export declare const ARMED_SPAWN_END = 0.2; export declare const MAX_TARGETS_END = 12; export declare const CLICK_RADIUS = 52; export declare const REVEAL_DELAY = 0.3; export declare const ARM_RISE = 0.45; export declare const FIRST_SPAWN_DELAY = 0.7; export declare const ANOMALY_R = 42; export declare const ANOMALY_R_SQ: number; export declare const CAUGHT_DUR = 1.4; export declare const CANNON_HALF_W = 16; export declare const CANNON_BASE_OFFSET = 26; export declare const CANNON_BARREL_Y = 40; export declare const HUD_CLEAR_W = 120; export declare const HUD_CLEAR_H = 140; export declare const CARD_CLEAR_PAD = 48; export declare const SPAWN_EDGE = 24; export declare const CANNON_CLEAR = 72; export declare const SPAWN_TRIES = 24; export declare const IDLE_ANOMALY_LIFE = 2.4; export declare const VERDICTS: readonly ["BLOCKED", "TERMINATED", "NEUTRALIZED", "QUARANTINED", "MITIGATED", "CONTAINED"]; export interface Anomaly { x: number; y: number; t0: number; life: number; caught: boolean; } export interface Bullet { x: number; y: number; } export interface CaughtCell { x: number; y: number; half: number; ao: number; } export interface CaughtEffect { x: number; y: number; t0: number; cells: CaughtCell[]; label: string; } export type GameMode = 'idle' | 'armed' | 'over'; /** Plugin interface for lazily-loaded game modules (sfx + celebration). */ export interface GamePlugins { playCoin?(): void; playZap?(): void; playPew?(): void; playPowerUp?(): void; playFanfare?(): void; startCelebration?(score: number, t: number, host: GameEngineHost): CelState | null; stepCelebration?(cel: CelState, t: number, dt: number, host: GameEngineHost, c1: string, c2: string): void; adjustCelebrationTimeMarkers?(cel: CelState, skip: number): void; tierForScore?(score: number): number; } export interface GameEngineHost { w: number; h: number; dots: Dot[]; gridCols: number; gridSp: number; opts: EngineOptions; tanTilt: number; exclusionBox: { width: number; height: number; } | null; } export interface GameLogic { readonly anomalies: Anomaly[]; readonly bullets: Bullet[]; readonly caughtEffects: CaughtEffect[]; gameActive: boolean; gameMode: GameMode; cannonX: number; armT: number; fontLoaded: boolean; cel: CelState | null; cannonAway: boolean; gameSim(t: number, dt: number): void; stepCel(t: number, dt: number, caughtColor: string, dotColor: string): void; pruneCaughtEffects(t: number): void; adjustTimeMarkers(skip: number): void; setGameActive(active: boolean): void; catchAt(x: number, y: number, running: boolean): boolean; setMode(mode: 'idle' | 'armed'): void; startRound(): void; exitGame(): void; setCannonDir(dir: number): void; setFiring(on: boolean): void; onStats(cb: (s: GameStats) => void): void; setExclusion(box: { width: number; height: number; } | null): void; celebrate(score: number): void; setSound(on: boolean): void; setPlugins(p: GamePlugins): void; } export declare function createGameLogic(host: GameEngineHost): GameLogic;