# CLAUDE.md

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

## Running the Game

```bash
./start_web.sh        # Starts Python HTTP server on port 8000
```

Open `http://localhost:8000` in a browser. No build step — all source is raw ES modules. Changes take effect on page refresh.

There are no tests or linting configured.

## Architecture

**Tyrants Edge** is a browser-based deck-building card game built with Phaser 3 (v3.60.0, loaded via CDN). Vanilla JavaScript only — no bundler, no npm.

### Scene Flow

`BootScene` → `MainMenuScene` → any of:
- `BattleScene` — 1v1 card battles vs AI
- `DeckBuilderScene` — customize decks (1 commander + 3–10 assault cards)
- `CampaignScene` → launches `BattleScene` with mission config
- `CollectionScene`, `StoreScene`, `FusionScene`

`BootScene` loads all JSON data (`data/*.json`) and card art images, then instantiates global managers stored in Phaser's game registry.

### Global Managers (accessed via `this.registry.get(...)`)

| Key | Class | Purpose |
|-----|-------|---------|
| `cardManager` | `CardManager` | Card definitions and instance creation |
| `packManager` | `PackManager` | Booster pack opening logic |
| `save` | `SaveManager` | localStorage persistence (versioned) |
| `missions` | raw JSON | Campaign mission data |

### Combat System (`src/combat/`)

- **`CombatEngine.js`** — Core battle loop. Turn phases: Draw → Deploy → Activation → Rupture → Jam → Commander Skills → Card Attacks → Cleanup. Uses event queue for animation sequencing.
- **`SkillProcessor.js`** — Resolves card skill effects (strike, swipe, pierce, rupture, berserk, siege, rally, heal, protect, jam, enfeeble, weaken, etc.) with triggers: `on_turn_start`, `on_attack`, `on_kill`.
- **`CombatAI.js`** — AI opponent decision-making.

Combat uses `RNG.js` (seeded random) for deterministic, replayable battles.

### Card Rendering

`CardObject.js` handles all visual card rendering (stats, art, skills). `BattleField.js` manages the 4-lane battle arena layout.

### Data Model

All game content is JSON in `data/`:
- **`cards.json`** — Card stats, faction, rarity, skills
- **`packs.json`** — Booster pack definitions
- **`missions.json`** — Campaign missions with enemy decks and rewards
- **`skills.json`** — Skill reference (skills are also inline in cards)

Card factions: `imperial`, `raider`, `bloodthirsty`, `xeno`, `righteous`
Card types: `commander`, `assault`
Rarities: `common`, `rare`, `epic`, `legendary`

### Save Format (localStorage)

```json
{
  "version": 1,
  "gold": 400,
  "collection": { "cardId": count },
  "decks": [],
  "campaignProgress": { "completedMissions": [], "currentChapter": 1 },
  "starterDeckReceived": false
}
```
