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; /** 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, seed?: number); getState(): Readonly; 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; }