✨ Försterkreislauf: Setzlinge beim Fällen, Försterhaus, Förster-Job
- Gefällter Baum → 1–2 tree_seed im Stockpile (zufällig) - Neues Gebäude forester_hut (50 wood): Log-Hütten-Grafik, Klick öffnet Info-Panel - Zonenmarkierung: Edit-Zone-Tool, Radius 5 Tiles, halbtransparente Overlay-Anzeige - Neuer JobType 'forester': Nisse pflanzen Setzlinge auf markierten Zonen-Tiles - Chop-Priorisierung: Zonen-Bäume werden vor natürlichen Bäumen gefällt - Nisse-Panel & Info-Panel zeigen forester-Priorität-Button Closes #25 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -12,6 +12,7 @@ import { FarmingSystem } from '../systems/FarmingSystem'
|
||||
import { VillagerSystem } from '../systems/VillagerSystem'
|
||||
import { DebugSystem } from '../systems/DebugSystem'
|
||||
import { TreeSeedlingSystem } from '../systems/TreeSeedlingSystem'
|
||||
import { ForesterZoneSystem } from '../systems/ForesterZoneSystem'
|
||||
|
||||
export class GameScene extends Phaser.Scene {
|
||||
private adapter!: LocalAdapter
|
||||
@@ -23,6 +24,7 @@ export class GameScene extends Phaser.Scene {
|
||||
villagerSystem!: VillagerSystem
|
||||
debugSystem!: DebugSystem
|
||||
private treeSeedlingSystem!: TreeSeedlingSystem
|
||||
foresterZoneSystem!: ForesterZoneSystem
|
||||
private autosaveTimer = 0
|
||||
private menuOpen = false
|
||||
|
||||
@@ -43,6 +45,7 @@ export class GameScene extends Phaser.Scene {
|
||||
this.villagerSystem = new VillagerSystem(this, this.adapter, this.worldSystem)
|
||||
this.villagerSystem.init(this.resourceSystem, this.farmingSystem)
|
||||
this.treeSeedlingSystem = new TreeSeedlingSystem(this, this.adapter, this.worldSystem)
|
||||
this.foresterZoneSystem = new ForesterZoneSystem(this, this.adapter)
|
||||
this.debugSystem = new DebugSystem(this, this.villagerSystem, this.worldSystem)
|
||||
|
||||
this.worldSystem.create()
|
||||
@@ -68,9 +71,16 @@ export class GameScene extends Phaser.Scene {
|
||||
|
||||
this.treeSeedlingSystem.create()
|
||||
|
||||
this.foresterZoneSystem.create()
|
||||
this.foresterZoneSystem.refreshOverlay()
|
||||
this.foresterZoneSystem.onEditEnded = () => this.events.emit('foresterZoneEditEnded')
|
||||
this.foresterZoneSystem.onZoneChanged = (id, tiles) => this.events.emit('foresterZoneChanged', id, tiles)
|
||||
|
||||
this.villagerSystem.create()
|
||||
this.villagerSystem.onMessage = (msg) => this.events.emit('toast', msg)
|
||||
this.villagerSystem.onNisseClick = (id) => this.events.emit('nisseClicked', id)
|
||||
this.villagerSystem.onMessage = (msg) => this.events.emit('toast', msg)
|
||||
this.villagerSystem.onNisseClick = (id) => this.events.emit('nisseClicked', id)
|
||||
this.villagerSystem.onPlantSeedling = (tileX, tileY, tile) =>
|
||||
this.treeSeedlingSystem.plantSeedling(tileX, tileY, tile)
|
||||
|
||||
this.debugSystem.create()
|
||||
|
||||
@@ -82,9 +92,26 @@ export class GameScene extends Phaser.Scene {
|
||||
} else if (action.type === 'SPAWN_RESOURCE') {
|
||||
this.resourceSystem.spawnResourcePublic(action.resource)
|
||||
this.worldSystem.addResourceTile(action.resource.tileX, action.resource.tileY)
|
||||
} else if (action.type === 'FORESTER_ZONE_UPDATE') {
|
||||
this.foresterZoneSystem.refreshOverlay()
|
||||
}
|
||||
}
|
||||
|
||||
// Detect left-clicks on forester huts to open the zone panel
|
||||
this.input.on('pointerdown', (ptr: Phaser.Input.Pointer) => {
|
||||
if (ptr.rightButtonDown() || this.menuOpen) return
|
||||
if (this.buildingSystem.isActive()) return
|
||||
const tileX = Math.floor(ptr.worldX / TILE_SIZE)
|
||||
const tileY = Math.floor(ptr.worldY / TILE_SIZE)
|
||||
const state = stateManager.getState()
|
||||
const hut = Object.values(state.world.buildings).find(
|
||||
b => b.kind === 'forester_hut' && b.tileX === tileX && b.tileY === tileY
|
||||
)
|
||||
if (hut) {
|
||||
this.events.emit('foresterHutClicked', hut.id)
|
||||
}
|
||||
})
|
||||
|
||||
this.scene.launch('UI')
|
||||
|
||||
this.events.on('selectBuilding', (kind: BuildingType) => this.buildingSystem.selectBuilding(kind))
|
||||
@@ -93,9 +120,17 @@ export class GameScene extends Phaser.Scene {
|
||||
this.events.on('uiRequestBuildMenu', () => {
|
||||
if (!this.buildingSystem.isActive()) this.events.emit('openBuildMenu')
|
||||
})
|
||||
this.events.on('updatePriorities', (villagerId: string, priorities: { chop: number; mine: number; farm: number }) => {
|
||||
this.events.on('updatePriorities', (villagerId: string, priorities: { chop: number; mine: number; farm: number; forester: number }) => {
|
||||
this.adapter.send({ type: 'UPDATE_PRIORITIES', villagerId, priorities })
|
||||
})
|
||||
|
||||
this.events.on('foresterZoneEditStart', (buildingId: string) => {
|
||||
this.foresterZoneSystem.startEditMode(buildingId)
|
||||
this.menuOpen = false // keep game ticking while zone editor is open
|
||||
})
|
||||
this.events.on('foresterZoneEditStop', () => {
|
||||
this.foresterZoneSystem.exitEditMode()
|
||||
})
|
||||
this.events.on('debugToggle', () => this.debugSystem.toggle())
|
||||
|
||||
this.autosaveTimer = AUTOSAVE_INTERVAL
|
||||
@@ -153,6 +188,17 @@ export class GameScene extends Phaser.Scene {
|
||||
this.add.image(wx, wy, 'bed_obj').setName(name).setDepth(8)
|
||||
} else if (building.kind === 'stockpile_zone') {
|
||||
this.add.image(wx, wy, 'stockpile_obj').setName(name).setDepth(4).setAlpha(0.8)
|
||||
} else if (building.kind === 'forester_hut') {
|
||||
// Draw a simple log-cabin silhouette for the forester hut
|
||||
const g = this.add.graphics().setName(name).setDepth(8)
|
||||
// Body
|
||||
g.fillStyle(0x6B3F16); g.fillRect(wx - 12, wy - 9, 24, 18)
|
||||
// Roof
|
||||
g.fillStyle(0x4a2800); g.fillTriangle(wx - 14, wy - 9, wx + 14, wy - 9, wx, wy - 22)
|
||||
// Door
|
||||
g.fillStyle(0x2a1500); g.fillRect(wx - 4, wy + 1, 8, 8)
|
||||
// Tree symbol on the roof
|
||||
g.fillStyle(0x228B22); g.fillTriangle(wx - 6, wy - 11, wx + 6, wy - 11, wx, wy - 20)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -165,6 +211,7 @@ export class GameScene extends Phaser.Scene {
|
||||
this.buildingSystem.destroy()
|
||||
this.farmingSystem.destroy()
|
||||
this.treeSeedlingSystem.destroy()
|
||||
this.foresterZoneSystem.destroy()
|
||||
this.villagerSystem.destroy()
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user