refactor: remove rest POIs from map generation, persistence, and client rendering

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
root
2026-03-09 17:58:02 +00:00
parent b76ce16cba
commit 65ee23c5be
10 changed files with 8 additions and 44 deletions
+1 -2
View File
@@ -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,
-4
View File
@@ -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 {
+2 -2
View File
@@ -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;
}
+2 -8
View File
@@ -7,7 +7,6 @@ export interface GeneratedMap {
trunkDecorations: number[];
obstacles: Set<string>;
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<string>();
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 };
}
@@ -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);
@@ -48,7 +48,6 @@ describe('SaveManager', () => {
resourceTiles: [],
obstacles: new Set<string>(),
foodPositions: [],
restPositions: [],
};
manager.initNewWorld(world, map, tileData);
@@ -73,7 +72,6 @@ describe('SaveManager', () => {
resourceTiles: [{ x: 2, y: 3, resourceType: 'tree' }],
obstacles: new Set<string>(['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<string>(),
foodPositions: [],
restPositions: [],
};
manager.initNewWorld(world, map, tileData);
@@ -165,7 +158,6 @@ describe('SaveManager', () => {
resourceTiles: [],
obstacles: new Set<string>(),
foodPositions: [],
restPositions: [],
};
manager.initNewWorld(world, map, tileData);
@@ -191,7 +183,6 @@ describe('SaveManager', () => {
resourceTiles: [],
obstacles: new Set<string>(),
foodPositions: [],
restPositions: [],
};
// Open and close, then clear tiles to simulate empty DB
@@ -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);
-3
View File
@@ -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;
}
+2 -7
View File
@@ -7,7 +7,6 @@ export interface TileData {
resourceTiles: Array<{ x: number; y: number; resourceType: string }>;
obstacles: Set<string>;
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 {
+1 -1
View File
@@ -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)