206 lines
5.8 KiB
JavaScript
206 lines
5.8 KiB
JavaScript
/**
|
|
* GRAVE SYSTEM
|
|
* Zombi workers lahko počivajo v grobovih za regeneracijo
|
|
*/
|
|
class GraveSystem {
|
|
constructor(scene) {
|
|
this.scene = scene;
|
|
this.graves = []; // Seznam vseh postavljenih grobov
|
|
}
|
|
|
|
/**
|
|
* Place grave on terrain
|
|
*/
|
|
placeGrave(gridX, gridY) {
|
|
const terrain = this.scene.terrainSystem;
|
|
if (!terrain) return false;
|
|
|
|
const tile = terrain.getTile(gridX, gridY);
|
|
if (!tile) return false;
|
|
|
|
// Check if already has grave
|
|
const key = `${gridX},${gridY}`;
|
|
if (this.graves.find(g => g.key === key)) {
|
|
console.log('⚠️ Grave already exists here!');
|
|
return false;
|
|
}
|
|
|
|
// Create grave object
|
|
const grave = {
|
|
gridX,
|
|
gridY,
|
|
key,
|
|
occupiedBy: null, // Zombie currently resting
|
|
sprite: null
|
|
};
|
|
|
|
// Create visual sprite
|
|
const screenPos = this.scene.iso.toScreen(gridX, gridY);
|
|
grave.sprite = this.scene.add.sprite(
|
|
screenPos.x + this.scene.terrainOffsetX,
|
|
screenPos.y + this.scene.terrainOffsetY,
|
|
'gravestone'
|
|
);
|
|
grave.sprite.setOrigin(0.5, 1);
|
|
grave.sprite.setScale(0.3);
|
|
grave.sprite.setDepth(this.scene.iso.getDepth(gridX, gridY, this.scene.iso.LAYER_OBJECTS));
|
|
|
|
this.graves.push(grave);
|
|
console.log(`🪦 Grave placed at ${gridX},${gridY}`);
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Remove grave
|
|
*/
|
|
removeGrave(gridX, gridY) {
|
|
const key = `${gridX},${gridY}`;
|
|
const index = this.graves.findIndex(g => g.key === key);
|
|
|
|
if (index === -1) return false;
|
|
|
|
const grave = this.graves[index];
|
|
|
|
// Kick out occupant
|
|
if (grave.occupiedBy) {
|
|
grave.occupiedBy.workerData.isResting = false;
|
|
grave.occupiedBy = null;
|
|
}
|
|
|
|
if (grave.sprite) grave.sprite.destroy();
|
|
this.graves.splice(index, 1);
|
|
|
|
console.log(`🪦 Grave removed at ${gridX},${gridY}`);
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Assign zombie to rest in grave
|
|
*/
|
|
assignZombieToGrave(zombie) {
|
|
if (!zombie.workerData) return false;
|
|
|
|
// Find empty grave
|
|
const emptyGrave = this.graves.find(g => g.occupiedBy === null);
|
|
|
|
if (!emptyGrave) {
|
|
console.log('🚫 No empty graves available!');
|
|
return false;
|
|
}
|
|
|
|
// Mark zombie as resting
|
|
zombie.workerData.isResting = true;
|
|
zombie.workerData.restingGrave = emptyGrave;
|
|
emptyGrave.occupiedBy = zombie;
|
|
|
|
// Move zombie to grave
|
|
zombie.gridX = emptyGrave.gridX;
|
|
zombie.gridY = emptyGrave.gridY;
|
|
zombie.updatePosition();
|
|
|
|
// Visual: Make zombie semi-transparent
|
|
if (zombie.sprite) {
|
|
zombie.sprite.setAlpha(0.5);
|
|
}
|
|
|
|
console.log(`🪦 Zombie resting in grave at ${emptyGrave.gridX},${emptyGrave.gridY}`);
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Wake zombie from grave
|
|
*/
|
|
wakeZombie(zombie) {
|
|
if (!zombie.workerData || !zombie.workerData.isResting) return false;
|
|
|
|
const grave = zombie.workerData.restingGrave;
|
|
if (grave) {
|
|
grave.occupiedBy = null;
|
|
}
|
|
|
|
zombie.workerData.isResting = false;
|
|
zombie.workerData.restingGrave = null;
|
|
|
|
// Restore visual
|
|
if (zombie.sprite) {
|
|
zombie.sprite.setAlpha(1.0);
|
|
}
|
|
|
|
console.log(`🪦 Zombie woke up from grave`);
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Update - regenerate resting zombies
|
|
*/
|
|
update(delta) {
|
|
for (const grave of this.graves) {
|
|
if (grave.occupiedBy && grave.occupiedBy.workerData) {
|
|
const zombie = grave.occupiedBy;
|
|
const wd = zombie.workerData;
|
|
|
|
// Regenerate energy (slower than normal decay)
|
|
wd.energy += (0.2 * delta) / 1000; // +0.2 energy/sec
|
|
wd.energy = Math.min(100, wd.energy);
|
|
|
|
// Regenerate HP if energy > 50
|
|
if (wd.energy > 50) {
|
|
zombie.hp += (0.1 * delta) / 1000; // +0.1 HP/sec
|
|
zombie.hp = Math.min(zombie.maxHp, zombie.hp);
|
|
}
|
|
|
|
// Visual feedback - green tint when regenerating
|
|
if (zombie.sprite) {
|
|
zombie.sprite.setTint(0x00FF00);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Find nearest empty grave
|
|
*/
|
|
findNearestEmptyGrave(x, y) {
|
|
let nearest = null;
|
|
let minDist = 999;
|
|
|
|
for (const grave of this.graves) {
|
|
if (grave.occupiedBy === null) {
|
|
const dist = Phaser.Math.Distance.Between(x, y, grave.gridX, grave.gridY);
|
|
if (dist < minDist) {
|
|
minDist = dist;
|
|
nearest = grave;
|
|
}
|
|
}
|
|
}
|
|
|
|
return nearest;
|
|
}
|
|
|
|
/**
|
|
* Auto-rest: Send low-energy zombies to graves
|
|
*/
|
|
autoRest() {
|
|
if (!this.scene.zombieWorkerSystem) return;
|
|
|
|
for (const worker of this.scene.zombieWorkerSystem.workers) {
|
|
if (!worker.workerData) continue;
|
|
|
|
// If energy < 20 and not resting, send to grave
|
|
if (worker.workerData.energy < 20 && !worker.workerData.isResting) {
|
|
const grave = this.findNearestEmptyGrave(worker.gridX, worker.gridY);
|
|
if (grave) {
|
|
this.assignZombieToGrave(worker);
|
|
console.log(`🪦 Auto-rest: Zombie sent to grave (Low energy)`);
|
|
}
|
|
}
|
|
|
|
// If energy > 80 and resting, wake up
|
|
if (worker.workerData.energy > 80 && worker.workerData.isResting) {
|
|
this.wakeZombie(worker);
|
|
console.log(`🪦 Auto-wake: Zombie restored and ready to work`);
|
|
}
|
|
}
|
|
}
|
|
}
|