# CLAUDE.md

This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.

## Running the Game

No bundler required. Serve with any local HTTP server and open `http://localhost:8080`:

```bash
python3 -m http.server 8080
# or
npx serve .
```

## Architecture

### Entry Point & Scene Flow

`index.html` loads `src/main.js` as an ES6 module. Phaser is loaded via CDN (no bundler). Scene flow:

1. `MainMenu` — title screen, starts game
2. `GameManager` — reads `config/game.json`, randomly selects N mini-games for the current level, sequences through them, and manages global state (lives, current level)
3. Each mini-game scene — runs its level, then signals completion or failure back to `GameManager`

### Mini-Game Contract

Each mini-game is a self-contained Phaser `Scene` exported from its subdirectory. Every mini-game must implement the same interface so `GameManager` can plug it in without knowing its internals:

- Accept a `onComplete` and `onFail` callback (passed via Phaser scene data or events)
- Emit/call `onComplete` when the level is beaten; `onFail` when a life is lost

To add a new mini-game: create a subdirectory under `src/games/`, implement the Scene contract, and register it in `config/game.json`.

### Directory Structure

```
index.html
config/
  game.json               # level-to-game-count mapping, lives, active game pool
src/
  main.js                 # Phaser game init, registers all scenes
  scenes/
    MainMenu.js
    GameManager.js        # sequences mini-games, tracks lives/level
  games/
    colorado-defense/
      ColoradoDefense.js
      config.json
    code-bug-invaders/
      CodeBugInvaders.js
      config.json
    dot-dude/
      DotDude.js
      config.json
    smash-out/
      SmashOut.js
      config.json
```

### Configuration

- `config/game.json` — top-level settings: number of games per level, lives count, which games are in the pool
- `src/games/<name>/config.json` — per-game tuning: speeds, enemy counts, timing, etc.

## Tech Stack & Constraints

- **Phaser 3.90** — loaded via CDN, not npm
- **Vanilla JS ES6 modules** — `import`/`export` only, no webpack/Vite/bundler
- **Canvas:** 1600×900 with `Phaser.Scale.FIT` for responsive scaling
- **Graphics:** Vector graphics only during initial development (no sprite sheets yet)
- **Controls:** Arrow keys + `A` to fire for all games; mouse for aiming in Colorado Defense only
- **Lives:** 3 lives global; game over on third loss
- **Level 1:** 3 randomly selected games; **Level 2:** 4 randomly selected games
