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:
@@ -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,
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user