import { World } from '../ecs/World';
import { type WaveConfig, type LootDrop } from '../procedural/Procedural';
export interface WaveDefenseConfig {
    arenaWidth: number;
    arenaHeight: number;
    playerSpeed: number;
    bulletSpeed: number;
    bulletCooldown: number;
    baseEnemyHp: number;
    enemyHpGrowth: number;
    waveConfig: WaveConfig;
    upgrades: UpgradeDef[];
    lootDrops: LootDrop[];
}
export interface UpgradeDef {
    id: string;
    name: string;
    description: string;
    cost: number;
    costGrowth: number;
    maxLevel: number;
    effect: UpgradeEffect;
}
export type UpgradeEffect = {
    type: 'speed';
    bonus: number;
} | {
    type: 'firerate';
    bonus: number;
} | {
    type: 'damage';
    bonus: number;
} | {
    type: 'health';
    bonus: number;
} | {
    type: 'magnet';
    bonus: number;
};
export declare const DEFAULT_WAVE_DEFENSE_CONFIG: WaveDefenseConfig;
export interface WaveDefenseState {
    phase: 'playing' | 'shop' | 'gameover';
    wave: number;
    score: number;
    coins: number;
    kills: number;
    playerHp: number;
    maxHp: number;
    upgradeLevels: Record<string, number>;
    /** Enemies remaining in current wave. */
    enemiesRemaining: number;
    /** Time survived. */
    timeSurvived: number;
}
export declare class WaveDefenseTemplate {
    private config;
    private rng;
    private waveGen;
    private lootTable;
    private state;
    private _moveSpeed;
    private _bulletCooldown;
    private _damage;
    private _magnetRange;
    private _cooldownTimer;
    constructor(config?: Partial<WaveDefenseConfig>, seed?: number);
    getState(): Readonly<WaveDefenseState>;
    setupScene(world: World, playerCount?: number): void;
    private createPlayer;
    private createWall;
    nextWave(world: World): void;
    private spawnTimers;
    private scheduleSpawnGroup;
    private spawnEnemy;
    update(world: World, dt: number, inputActions: {
        moveX: number;
        moveY: number;
    }[]): void;
    private spawnBullet;
    onBulletHitEnemy(world: World, bulletId: number, enemyId: number): void;
    onEnemyHitPlayer(world: World, enemyId: number, _playerId: number): void;
    getAvailableUpgrades(): (UpgradeDef & {
        currentLevel: number;
        currentCost: number;
    })[];
    buyUpgrade(upgradeId: string): boolean;
    private recalcStats;
    /** After the shop phase, start the next wave. */
    startNextWave(world: World): void;
    /** Reset the game entirely. */
    reset(world: World, playerCount?: number): void;
}
