# ZP1 Minimal Migration Plan

## Goal
Rewrite zp1 into zp2, keeping only: room management, map loading, player movement, and minimal frontend display. Same tech stack (Java + Vite/Three.js), ECS architecture, client prediction.

## Scope
- **Keep**: Room system, map loading/rendering, player movement (WASD), client prediction, WebSocket communication
- **Strip**: Zombies, weapons/bullets, turrets, fire zones, loots, explosions/effects, HUD, settings, map designer, template system, object pool

---

## Phase 1: Backend Skeleton

### 1.1 Project structure
```
zp2/backend/
├── pom.xml
└── src/main/java/com/zombie/game/
    ├── GameServerMain.java
    ├── model/
    │   ├── Constants.java
    │   ├── Room.java
    │   ├── PlayerInfo.java
    │   ├── GameMap.java
    │   ├── MapData.java
    │   └── StaticWall.java
    ├── server/
    │   ├── GameWebSocketServer.java
    │   ├── RoomManager.java
    │   ├── GameService.java
    │   ├── GameLoop.java
    │   ├── MessageUtils.java
    │   └── MapStorage.java
    ├── ecs/
    │   ├── ECSWorld.java
    │   ├── System.java
    │   └── components/
    │       ├── Position.java
    │       ├── PlayerInput.java
    │       ├── Health.java
    │       ├── Collision.java
    │       └── RenderInfo.java
    └── systems/
        ├── PlayerInputSystem.java
        └── StateSyncSystem.java
```

### 1.2 Key changes

**Constants.java** — Keep `GRID_SIZE`, `TICK_RATE`, `PLAYER_SIZE`, `PLAYER_SPEED`, `MSG_*`. Remove zombie/weapon/loot constants.

**GameMap.java** — Keep `loadFromJson()`, `isWall()`, `isWalkable()`, `getCells()`, `getSpawnPoints()`. Remove `FlowField` entirely.

**ECSWorld.java** — Keep `entities`, `players`, `playerIdToEntity`, `map`, `systems`, `lock`. Remove zombies/bullets/loots/turrets/fireZones. Remove object pools. Keep `createPlayerEntity()` only.

**GameService.java** — Register only `PlayerInputSystem` + `StateSyncSystem`.

**StateSyncSystem.java** — Broadcast `{players: [{id, x, y, angle, health}], gameTime}` only.

**GameWebSocketServer.java** — Keep room CRUD + player input + state broadcast.

### 1.3 Map data
- Copy `maps/d540209a.json` (walls + playerSpawns + zombieSpawns)

---

## Phase 2: Frontend Skeleton

### 2.1 Project structure
```
zp2/frontend/
├── package.json
├── vite.config.js
├── index.html
└── src/
    ├── main.js
    ├── style.css
    ├── game/
    │   ├── engine.js
    │   └── scene.js
    ├── network/
    │   └── client.js
    ├── ui/
    │   └── lobby.js
    └── utils/
        ├── constants.js
        ├── grid.js
        └── input.js
```

### 2.2 Key changes

**constants.js** — Keep `GRID_SIZE`, `PLAYER_SIZE`, `TICK_RATE`, `TICK_INTERVAL`, `PLAYER_CONFIG`, `MSG_TYPE`. Remove `WEAPONS`, `WEAPON_CONFIG`, `ZOMBIE_CONFIG`.

**grid.js** — Keep `Grid` class (`parseMap`, `isWall`, `worldToGrid`, `gridToWorld`, `isWalkable`). Remove `findPath`, `getSpawnPoints`.

**input.js** — Keep `attach/detach`, `getMovement`, `buildInputState` (movement + aim only). Remove weapon bindings.

**engine.js (~666→~250 lines)** — Keep connect, loop, tick, local prediction, reconciliation. Strip zombie/bullet/loot/turret processing.

**scene.js (~1331→~250 lines)** — Keep constructor, lighting, `buildMap`, player rendering, camera, `getMouseGroundPos`. Remove zombie/bullet/effect/turret/loot rendering.

**lobby.js** — Keep as-is.

**main.js** — Keep lobby wiring + game transition. Remove HUD/settings.

**style.css** — Keep lobby + room + canvas styles. Remove HUD/weapon/kill-feed styles.

---

## Phase 3: Cleanup & Verification

### 3.1 Message protocol
- `CREATE_ROOM` / `JOIN_ROOM` / `LEAVE_ROOM` / `READY` / `START_GAME`
- `ROOM_LIST` / `ROOM_STATE` / `GAME_STARTED` / `ERROR`
- `PLAYER_INPUT` (dx, dy, aimX, aimY, seq)
- `GAME_STATE` (players only)

### 3.2 Test flow
1. `mvn package && java -jar target/*.jar`
2. `npm run dev`
3. Open two tabs → Create room → Join room → Start game
4. Both players see each other move, WASD responsive, wall collision works

---

## Files to Create (36 total)

| # | File | Source |
|---|------|--------|
| 1-23 | Backend Java files (see 1.1) | Simplified from zp1 |
| 24-35 | Frontend JS/HTML/CSS (see 2.1) | Simplified from zp1 |
| 36 | `maps/d540209a.json` | Copy from zp1 |

## Key Decisions

| Decision | Choice | Reason |
|----------|--------|--------|
| Tech stack | Java 17 + Vite + Three.js | Same as zp1 |
| ECS | Keep | Structure preserved |
| Client prediction | Keep | Better movement feel |
| Flow field | Remove | Zombie-only feature |
| HUD/Settings | Remove | Not in scope |
