From 65ee23c5be4c06f75b8da148ba8b024a0de01c10 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 9 Mar 2026 17:58:02 +0000 Subject: [PATCH] refactor: remove rest POIs from map generation, persistence, and client rendering Co-Authored-By: Claude Opus 4.6 --- client/src/scenes/GameScene.ts | 3 +-- server/src/game/GameLoop.ts | 4 ---- server/src/map/GameMap.ts | 4 ++-- server/src/map/mapGenerator.ts | 10 ++-------- server/src/persistence/__tests__/integration.test.ts | 4 ---- server/src/persistence/__tests__/saveManager.test.ts | 9 --------- .../src/persistence/__tests__/worldSerializer.test.ts | 4 ---- server/src/persistence/saveManager.ts | 3 --- server/src/persistence/worldSerializer.ts | 9 ++------- shared/src/types.ts | 2 +- 10 files changed, 8 insertions(+), 44 deletions(-) diff --git a/client/src/scenes/GameScene.ts b/client/src/scenes/GameScene.ts index dde3467..521c89d 100644 --- a/client/src/scenes/GameScene.ts +++ b/client/src/scenes/GameScene.ts @@ -550,8 +550,7 @@ export class GameScene extends Phaser.Scene { const graphics = this.add.graphics(); graphics.setDepth(-6); for (const poi of pointsOfInterest) { - const color = poi.type === 'food' ? 0xcc8833 : 0x3355cc; - graphics.fillStyle(color, 0.7); + graphics.fillStyle(0xcc8833, 0.7); graphics.fillRect( poi.position.x * TILE_SIZE + 8, poi.position.y * TILE_SIZE + 8, diff --git a/server/src/game/GameLoop.ts b/server/src/game/GameLoop.ts index 482652d..c5da118 100644 --- a/server/src/game/GameLoop.ts +++ b/server/src/game/GameLoop.ts @@ -94,7 +94,6 @@ export class GameLoop { resourceTiles: this.map.resourceTiles, obstacles: new Set(this.map.getObstacles().map(p => `${p.x},${p.y}`)), foodPositions: this.map.getPointsOfInterest('food').map(p => p.position), - restPositions: this.map.getPointsOfInterest('rest').map(p => p.position), }); this.saveManager.saveEntityState(this.world, 0); this.wirePersistenceCallbacks(); @@ -166,9 +165,6 @@ export class GameLoop { for (const pos of generated.foodPositions) { this.map.addPointOfInterest({ type: 'food', position: pos }); } - for (const pos of generated.restPositions) { - this.map.addPointOfInterest({ type: 'rest', position: pos }); - } } private spawnDefaultStockpiles(): void { diff --git a/server/src/map/GameMap.ts b/server/src/map/GameMap.ts index 493695c..3da4caf 100644 --- a/server/src/map/GameMap.ts +++ b/server/src/map/GameMap.ts @@ -1,7 +1,7 @@ import { WORLD_WIDTH, WORLD_HEIGHT, type Position } from '@dflike/shared'; export interface PointOfInterest { - type: 'food' | 'rest'; + type: 'food'; position: Position; } @@ -43,7 +43,7 @@ export class GameMap { this.pois.push(poi); } - getPointsOfInterest(type?: 'food' | 'rest'): PointOfInterest[] { + getPointsOfInterest(type?: 'food'): PointOfInterest[] { if (type) return this.pois.filter(p => p.type === type); return this.pois; } diff --git a/server/src/map/mapGenerator.ts b/server/src/map/mapGenerator.ts index a49af25..141a4e6 100644 --- a/server/src/map/mapGenerator.ts +++ b/server/src/map/mapGenerator.ts @@ -7,7 +7,6 @@ export interface GeneratedMap { trunkDecorations: number[]; obstacles: Set; foodPositions: { x: number; y: number }[]; - restPositions: { x: number; y: number }[]; resourceTiles: Array<{ x: number; y: number; resourceType: string }>; } @@ -42,14 +41,9 @@ export function generateMap( { x: Math.floor(width * 0.25), y: Math.floor(height * 0.25) }, { x: Math.floor(width * 0.75), y: Math.floor(height * 0.75) }, ]; - const restPositions = [ - { x: Math.floor(width * 0.75), y: Math.floor(height * 0.25) }, - { x: Math.floor(width * 0.25), y: Math.floor(height * 0.75) }, - ]; - // Reserve positions that must stay clear const reserved = new Set(); - for (const p of [...foodPositions, ...restPositions]) { + for (const p of [...foodPositions]) { reserved.add(`${p.x},${p.y}`); } @@ -157,5 +151,5 @@ export function generateMap( } } - return { terrain, decorations, trunkDecorations, obstacles, foodPositions, restPositions, resourceTiles }; + return { terrain, decorations, trunkDecorations, obstacles, foodPositions, resourceTiles }; } diff --git a/server/src/persistence/__tests__/integration.test.ts b/server/src/persistence/__tests__/integration.test.ts index 6122841..7e8d42f 100644 --- a/server/src/persistence/__tests__/integration.test.ts +++ b/server/src/persistence/__tests__/integration.test.ts @@ -58,9 +58,6 @@ describe('integration: full save/load cycle', () => { for (const pos of generated.foodPositions) { map.addPointOfInterest({ type: 'food', position: pos }); } - for (const pos of generated.restPositions) { - map.addPointOfInterest({ type: 'rest', position: pos }); - } // Create bond registry singleton const bondRegistry = createBondRegistry(); @@ -102,7 +99,6 @@ describe('integration: full save/load cycle', () => { resourceTiles: generated.resourceTiles, obstacles: generated.obstacles, foodPositions: generated.foodPositions, - restPositions: generated.restPositions, }; manager.initNewWorld(world, map, tileData); manager.saveEntityState(world, 500); diff --git a/server/src/persistence/__tests__/saveManager.test.ts b/server/src/persistence/__tests__/saveManager.test.ts index 5055960..c7685c8 100644 --- a/server/src/persistence/__tests__/saveManager.test.ts +++ b/server/src/persistence/__tests__/saveManager.test.ts @@ -48,7 +48,6 @@ describe('SaveManager', () => { resourceTiles: [], obstacles: new Set(), foodPositions: [], - restPositions: [], }; manager.initNewWorld(world, map, tileData); @@ -73,7 +72,6 @@ describe('SaveManager', () => { resourceTiles: [{ x: 2, y: 3, resourceType: 'tree' }], obstacles: new Set(['1,1', '2,2']), foodPositions: [{ x: 0, y: 1 }], - restPositions: [{ x: 3, y: 3 }], }; manager.initNewWorld(world, map, tileData); @@ -95,10 +93,6 @@ describe('SaveManager', () => { expect(foodPois).toHaveLength(1); expect(foodPois[0].position).toEqual({ x: 0, y: 1 }); - const restPois = map2.getPointsOfInterest('rest'); - expect(restPois).toHaveLength(1); - expect(restPois[0].position).toEqual({ x: 3, y: 3 }); - manager.close(); }); @@ -115,7 +109,6 @@ describe('SaveManager', () => { resourceTiles: [], obstacles: new Set(), foodPositions: [], - restPositions: [], }; manager.initNewWorld(world, map, tileData); @@ -165,7 +158,6 @@ describe('SaveManager', () => { resourceTiles: [], obstacles: new Set(), foodPositions: [], - restPositions: [], }; manager.initNewWorld(world, map, tileData); @@ -191,7 +183,6 @@ describe('SaveManager', () => { resourceTiles: [], obstacles: new Set(), foodPositions: [], - restPositions: [], }; // Open and close, then clear tiles to simulate empty DB diff --git a/server/src/persistence/__tests__/worldSerializer.test.ts b/server/src/persistence/__tests__/worldSerializer.test.ts index 96fe635..308391e 100644 --- a/server/src/persistence/__tests__/worldSerializer.test.ts +++ b/server/src/persistence/__tests__/worldSerializer.test.ts @@ -45,7 +45,6 @@ describe('worldSerializer', () => { ], obstacles: new Set(['1,0', '2,1']), foodPositions: [{ x: 0, y: 0 }, { x: 2, y: 1 }], - restPositions: [{ x: 1, y: 1 }], }; saveTiles(width, height, data); @@ -58,7 +57,6 @@ describe('worldSerializer', () => { expect(loaded!.resourceTiles).toEqual(data.resourceTiles); expect(loaded!.obstacles).toEqual(data.obstacles); expect(loaded!.foodPositions).toEqual(data.foodPositions); - expect(loaded!.restPositions).toEqual(data.restPositions); }); it('returns null when no tiles are saved', () => { @@ -79,7 +77,6 @@ describe('worldSerializer', () => { resourceTiles: [], obstacles: new Set(), foodPositions: [], - restPositions: [], }; saveTiles(width, height, data1); @@ -90,7 +87,6 @@ describe('worldSerializer', () => { resourceTiles: [{ x: 0, y: 0, resourceType: 'iron' }], obstacles: new Set(['0,0']), foodPositions: [{ x: 1, y: 0 }], - restPositions: [{ x: 0, y: 0 }], }; saveTiles(width, height, data2); diff --git a/server/src/persistence/saveManager.ts b/server/src/persistence/saveManager.ts index 1f9dc03..6e2723d 100644 --- a/server/src/persistence/saveManager.ts +++ b/server/src/persistence/saveManager.ts @@ -52,9 +52,6 @@ export class SaveManager { for (const pos of tileData.foodPositions) { map.addPointOfInterest({ type: 'food', position: pos }); } - for (const pos of tileData.restPositions) { - map.addPointOfInterest({ type: 'rest', position: pos }); - } return true; } diff --git a/server/src/persistence/worldSerializer.ts b/server/src/persistence/worldSerializer.ts index c37deba..22ec22b 100644 --- a/server/src/persistence/worldSerializer.ts +++ b/server/src/persistence/worldSerializer.ts @@ -7,7 +7,6 @@ export interface TileData { resourceTiles: Array<{ x: number; y: number; resourceType: string }>; obstacles: Set; foodPositions: Array<{ x: number; y: number }>; - restPositions: Array<{ x: number; y: number }>; } export function saveTiles(width: number, height: number, data: TileData): void { @@ -41,13 +40,12 @@ export function saveTiles(width: number, height: number, data: TileData): void { } } - // Save obstacles, foodPositions, restPositions as metadata + // Save obstacles and foodPositions as metadata const upsertMeta = db.prepare( "INSERT INTO metadata (key, value) VALUES (?, ?) ON CONFLICT(key) DO UPDATE SET value = excluded.value" ); upsertMeta.run('obstacles', JSON.stringify([...data.obstacles])); upsertMeta.run('food_positions', JSON.stringify(data.foodPositions)); - upsertMeta.run('rest_positions', JSON.stringify(data.restPositions)); }); transaction(); @@ -93,10 +91,7 @@ export function loadTiles(width: number, height: number): TileData | null { const foodRow = db.prepare("SELECT value FROM metadata WHERE key = 'food_positions'").get() as { value: string } | undefined; const foodPositions: Array<{ x: number; y: number }> = foodRow ? JSON.parse(foodRow.value) : []; - const restRow = db.prepare("SELECT value FROM metadata WHERE key = 'rest_positions'").get() as { value: string } | undefined; - const restPositions: Array<{ x: number; y: number }> = restRow ? JSON.parse(restRow.value) : []; - - return { terrain, decorations, trunkDecorations, resourceTiles, obstacles, foodPositions, restPositions }; + return { terrain, decorations, trunkDecorations, resourceTiles, obstacles, foodPositions }; } export function saveMetadata(data: { tick: number; lastSavedAt: string }): void { diff --git a/shared/src/types.ts b/shared/src/types.ts index ef33a64..7415c2d 100644 --- a/shared/src/types.ts +++ b/shared/src/types.ts @@ -166,7 +166,7 @@ export interface WorldState { worldHeight: number; tileSize: number; obstacles: Position[]; - pointsOfInterest: { type: 'food' | 'rest'; position: Position }[]; + pointsOfInterest: { type: 'food'; position: Position }[]; terrain: number[]; // flat array [y * width + x], terrain type per tile decorations: number[]; // flat array [y * width + x], decoration tile index (-1 = none) trunkDecorations: number[]; // flat array [y * width + x], trunk tile index (-1 = none)