# 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 |