export type Direction = -1 | 1;
export type Mode = 'title' | 'playing' | 'paused' | 'dead' | 'won';
export interface Rect { x: number; y: number; w: number; h: number }
export interface Platform extends Rect { kind: 'road' | 'metal' | 'ledge' }
export interface Checkpoint { x: number; y: number; label: string }
export interface Level {
  width: number; height: number; platforms: Platform[]; hazards: Rect[];
  checkpoints: Checkpoint[]; signs: { x: number; y: number; text: string }[];
  enemies: Enemy[]; bossX: number; arena: Rect;
}
export interface Player extends Rect {
  vx: number; vy: number; facing: Direction; hp: number; maxHp: number;
  grounded: boolean; wall: -1 | 0 | 1; charge: number; dashTime: number;
  dashCooldown: number; airDashUsed: boolean; invulnerable: number;
  coyote: number; jumpBuffer: number; shootCooldown: number; wallLock: number;
}
export interface Enemy extends Rect {
  id: number; kind: 'walker' | 'drone' | 'turret'; hp: number; maxHp: number;
  vx: number; vy: number; facing: Direction; originX: number; originY: number;
  timer: number; phase: number; flash: number;
}
export interface Boss extends Rect {
  vx: number; vy: number; hp: number; maxHp: number; active: boolean;
  phase: 'idle' | 'windup-dash' | 'dash' | 'windup-shot' | 'shoot' | 'windup-slam' | 'slam' | 'recover' | 'defeated';
  timer: number; cycle: number; facing: Direction; flash: number; targetX: number;
}
export interface Shot extends Rect {
  id: number; vx: number; vy: number; damage: number; charged: number;
  owner: 'player' | 'enemy'; life: number;
}
export interface Particle { x: number; y: number; vx: number; vy: number; life: number; maxLife: number; color: string; size: number }
export interface Pickup extends Rect { kind: 'health'; life: number }
export type SoundEvent = 'jump' | 'dash' | 'shot' | 'charge' | 'charged-shot' | 'hit' | 'explosion' | 'pickup' | 'checkpoint' | 'death' | 'boss' | 'win';
export interface GameState {
  mode: Mode; elapsed: number; deaths: number; kills: number; checkpoint: number;
  player: Player; enemies: Enemy[]; shots: Shot[]; particles: Particle[]; pickups: Pickup[];
  boss: Boss; level: Level; camera: { x: number; y: number; shake: number };
  notice: string; noticeTime: number; events: SoundEvent[]; frame: number; nextId: number;
}
export interface GameInput {
  left: boolean; right: boolean; jump: boolean; jumpPressed: boolean; jumpReleased: boolean;
  shoot: boolean; shootPressed: boolean; shootReleased: boolean; dashPressed: boolean;
}
export const WIDTH = 384;
export const HEIGHT = 216;
export const EMPTY_INPUT: GameInput = { left: false, right: false, jump: false, jumpPressed: false, jumpReleased: false, shoot: false, shootPressed: false, shootReleased: false, dashPressed: false };
