Files
novafarma/EMERGENCY_SYSTEMS_RECOVERY/FarmAutomationSystem.js
2026-01-16 02:43:46 +01:00

564 lines
16 KiB
JavaScript

/**
* FARM AUTOMATION SYSTEM
* Complete automation with zombie workers, creature helpers, buildings, and power grid
*/
class FarmAutomationSystem {
constructor(scene) {
this.scene = scene;
this.enabled = true;
// Workers
this.zombieWorkers = [];
this.creatureWorkers = [];
this.taskQueue = [];
// Buildings
this.automationBuildings = new Map();
this.powerGrid = new Map();
// Power system
this.totalPower = 0;
this.powerConsumption = 0;
// Settings
this.settings = {
maxZombieWorkers: 10,
maxCreatureWorkers: 5,
zombieEfficiency: 0.7, // 70% of player speed
powerUpdateInterval: 1000 // ms
};
this.loadProgress();
this.init();
console.log('✅ Farm Automation System initialized');
}
init() {
// Start power update loop
this.startPowerUpdate();
console.log('🤖 Farm automation ready');
}
// ========== ZOMBIE WORKER SYSTEM ==========
hireZombieWorker(name = 'Zombie') {
if (this.zombieWorkers.length >= this.settings.maxZombieWorkers) {
console.log('❌ Max zombie workers reached');
return null;
}
const worker = {
id: `zombie_${Date.now()}`,
name,
type: 'zombie',
level: 1,
xp: 0,
efficiency: this.settings.zombieEfficiency,
currentTask: null,
position: { x: 0, y: 0 },
hunger: 100,
fatigue: 0,
sprite: null
};
this.zombieWorkers.push(worker);
this.saveProgress();
console.log(`🧟 Hired zombie worker: ${name}`);
return worker;
}
assignTask(worker, task) {
if (!worker) return false;
worker.currentTask = {
type: task.type, // 'plant', 'harvest', 'water'
target: task.target,
priority: task.priority || 1,
startTime: Date.now()
};
console.log(`📋 ${worker.name} assigned to ${task.type}`);
return true;
}
addToTaskQueue(task) {
this.taskQueue.push({
...task,
id: `task_${Date.now()}`,
status: 'pending'
});
// Assign to available worker
this.assignNextTask();
}
assignNextTask() {
// Find idle worker
const idleWorker = [...this.zombieWorkers, ...this.creatureWorkers]
.find(w => !w.currentTask);
if (!idleWorker || this.taskQueue.length === 0) return;
// Get highest priority task
this.taskQueue.sort((a, b) => b.priority - a.priority);
const task = this.taskQueue.shift();
this.assignTask(idleWorker, task);
}
completeTask(worker) {
if (!worker || !worker.currentTask) return;
const task = worker.currentTask;
// Give XP
this.addWorkerXP(worker, 10);
// Increase fatigue
worker.fatigue += 10;
// Clear task
worker.currentTask = null;
// Assign next task
this.assignNextTask();
console.log(`${worker.name} completed ${task.type}`);
}
addWorkerXP(worker, amount) {
worker.xp += amount;
// Level up check
const xpNeeded = worker.level * 100;
if (worker.xp >= xpNeeded) {
worker.level++;
worker.xp = 0;
worker.efficiency += 0.05; // 5% faster per level
console.log(`⬆️ ${worker.name} leveled up to ${worker.level}!`);
}
this.saveProgress();
}
// ========== CREATURE WORKER SYSTEM ==========
tameCreature(creatureType, name) {
if (this.creatureWorkers.length >= this.settings.maxCreatureWorkers) {
console.log('❌ Max creature workers reached');
return null;
}
const specialties = {
donkey: { specialty: 'transport', efficiency: 1.0 },
bigfoot: { specialty: 'gathering', efficiency: 1.2 },
yeti: { specialty: 'snow_tasks', efficiency: 1.1 },
elf: { specialty: 'crafting', efficiency: 1.3 }
};
const data = specialties[creatureType] || { specialty: 'general', efficiency: 0.8 };
const worker = {
id: `creature_${Date.now()}`,
name,
type: creatureType,
specialty: data.specialty,
level: 1,
xp: 0,
efficiency: data.efficiency,
currentTask: null,
position: { x: 0, y: 0 },
hunger: 100,
fatigue: 0,
sprite: null
};
this.creatureWorkers.push(worker);
this.saveProgress();
console.log(`🦌 Tamed ${creatureType}: ${name} (${data.specialty})`);
return worker;
}
// ========== AUTOMATION BUILDINGS ==========
buildAutomation(type, x, y) {
const buildings = {
'auto_planter': {
name: 'Auto-Planter',
powerCost: 10,
range: 3,
speed: 2000 // ms per action
},
'auto_harvester': {
name: 'Auto-Harvester',
powerCost: 15,
range: 5,
speed: 1500
},
'irrigation': {
name: 'Irrigation System',
powerCost: 5,
range: 10,
speed: 3000
},
'conveyor': {
name: 'Conveyor Belt',
powerCost: 3,
range: 1,
speed: 500
},
'silo': {
name: 'Storage Silo',
powerCost: 2,
capacity: 1000
},
'sorter': {
name: 'Sorting Machine',
powerCost: 8,
speed: 1000
}
};
const buildingData = buildings[type];
if (!buildingData) return null;
const building = {
id: `${type}_${x}_${y}`,
type,
x, y,
...buildingData,
active: false,
lastAction: 0
};
this.automationBuildings.set(building.id, building);
this.updatePowerConsumption();
this.saveProgress();
console.log(`🏭 Built ${buildingData.name} at (${x}, ${y})`);
return building;
}
activateBuilding(buildingId) {
const building = this.automationBuildings.get(buildingId);
if (!building) return false;
// Check power
if (this.totalPower < this.powerConsumption + building.powerCost) {
console.log('❌ Not enough power!');
return false;
}
building.active = true;
this.updatePowerConsumption();
console.log(`⚡ Activated ${building.name}`);
return true;
}
deactivateBuilding(buildingId) {
const building = this.automationBuildings.get(buildingId);
if (!building) return false;
building.active = false;
this.updatePowerConsumption();
console.log(`🔌 Deactivated ${building.name}`);
return true;
}
// ========== POWER SYSTEM ==========
buildPowerSource(type, x, y) {
const sources = {
'windmill': { name: 'Windmill', power: 20, cost: { wood: 10, iron: 5 } },
'water_wheel': { name: 'Water Wheel', power: 15, cost: { wood: 8, iron: 3 } },
'solar_panel': { name: 'Solar Panel', power: 25, cost: { iron: 10, glass: 5 } },
'zombie_treadmill': { name: 'Zombie Treadmill', power: 10, cost: { wood: 5 } }
};
const sourceData = sources[type];
if (!sourceData) return null;
const source = {
id: `${type}_${x}_${y}`,
type,
x, y,
...sourceData,
active: true,
currentPower: sourceData.power
};
this.powerGrid.set(source.id, source);
this.updateTotalPower();
this.saveProgress();
console.log(`⚡ Built ${sourceData.name} (+${sourceData.power} power)`);
return source;
}
updateTotalPower() {
this.totalPower = 0;
for (const source of this.powerGrid.values()) {
if (source.active) {
// Solar panels only work during day
if (source.type === 'solar_panel') {
const time = this.scene.weatherSystem?.gameTime || 12;
if (time >= 6 && time <= 18) {
this.totalPower += source.currentPower;
}
} else {
this.totalPower += source.currentPower;
}
}
}
}
updatePowerConsumption() {
this.powerConsumption = 0;
for (const building of this.automationBuildings.values()) {
if (building.active) {
this.powerConsumption += building.powerCost;
}
}
}
startPowerUpdate() {
setInterval(() => {
this.updateTotalPower();
this.updatePowerConsumption();
// Deactivate buildings if not enough power
if (this.powerConsumption > this.totalPower) {
this.handlePowerShortage();
}
}, this.settings.powerUpdateInterval);
}
handlePowerShortage() {
console.log('⚠️ Power shortage! Deactivating low-priority buildings...');
// Deactivate buildings until power is sufficient
for (const building of this.automationBuildings.values()) {
if (building.active && this.powerConsumption > this.totalPower) {
this.deactivateBuilding(building.id);
}
}
}
getPowerStatus() {
return {
total: this.totalPower,
consumption: this.powerConsumption,
available: this.totalPower - this.powerConsumption,
percentage: (this.powerConsumption / this.totalPower) * 100
};
}
// ========== WORKER MANAGEMENT ==========
updateWorkers(delta) {
// Update zombie workers
for (const worker of this.zombieWorkers) {
this.updateWorker(worker, delta);
}
// Update creature workers
for (const worker of this.creatureWorkers) {
this.updateWorker(worker, delta);
}
}
updateWorker(worker, delta) {
// Decrease hunger over time
worker.hunger -= delta / 60000; // 1% per minute
// Increase fatigue if working
if (worker.currentTask) {
worker.fatigue += delta / 30000; // 1% per 30 seconds
// Complete task if enough time passed
const taskDuration = 5000 / worker.efficiency; // Base 5 seconds
if (Date.now() - worker.currentTask.startTime > taskDuration) {
this.completeTask(worker);
}
} else {
// Recover fatigue when idle
worker.fatigue -= delta / 60000;
}
// Clamp values
worker.hunger = Math.max(0, Math.min(100, worker.hunger));
worker.fatigue = Math.max(0, Math.min(100, worker.fatigue));
// Worker needs rest
if (worker.fatigue > 80) {
worker.currentTask = null;
console.log(`😴 ${worker.name} is too tired to work`);
}
// Worker needs food
if (worker.hunger < 20) {
worker.efficiency *= 0.5; // 50% slower when hungry
}
}
feedWorker(worker, food) {
if (!worker) return false;
worker.hunger = Math.min(100, worker.hunger + 30);
console.log(`🍖 Fed ${worker.name}`);
return true;
}
restWorker(worker) {
if (!worker) return false;
worker.currentTask = null;
worker.fatigue = Math.max(0, worker.fatigue - 50);
console.log(`😴 ${worker.name} is resting`);
return true;
}
upgradeWorkerTools(worker, toolTier) {
if (!worker) return false;
const tierBonus = {
'bronze': 0.1,
'iron': 0.2,
'steel': 0.3,
'enchanted': 0.5
};
const bonus = tierBonus[toolTier] || 0;
worker.efficiency += bonus;
console.log(`⚒️ ${worker.name} upgraded to ${toolTier} tools (+${bonus * 100}% efficiency)`);
return true;
}
// ========== AUTOMATION UPDATE ==========
updateAutomation(delta) {
const now = Date.now();
for (const building of this.automationBuildings.values()) {
if (!building.active) continue;
// Check if enough time passed
if (now - building.lastAction < building.speed) continue;
// Perform building action
switch (building.type) {
case 'auto_planter':
this.autoPlant(building);
break;
case 'auto_harvester':
this.autoHarvest(building);
break;
case 'irrigation':
this.autoWater(building);
break;
case 'conveyor':
this.moveItems(building);
break;
case 'sorter':
this.sortItems(building);
break;
}
building.lastAction = now;
}
}
autoPlant(building) {
// Plant crops in range
console.log(`🌱 Auto-planter working at (${building.x}, ${building.y})`);
}
autoHarvest(building) {
// Harvest crops in range
console.log(`🌾 Auto-harvester working at (${building.x}, ${building.y})`);
}
autoWater(building) {
// Water crops in range
console.log(`💧 Irrigation system working at (${building.x}, ${building.y})`);
}
moveItems(building) {
// Move items along conveyor
console.log(`📦 Conveyor moving items at (${building.x}, ${building.y})`);
}
sortItems(building) {
// Sort items in storage
console.log(`🔀 Sorter organizing items at (${building.x}, ${building.y})`);
}
// ========== UPDATE ==========
update(delta) {
this.updateWorkers(delta);
this.updateAutomation(delta);
}
// ========== PERSISTENCE ==========
saveProgress() {
const data = {
zombieWorkers: this.zombieWorkers.map(w => ({
id: w.id,
name: w.name,
level: w.level,
xp: w.xp,
efficiency: w.efficiency
})),
creatureWorkers: this.creatureWorkers.map(w => ({
id: w.id,
name: w.name,
type: w.type,
level: w.level,
xp: w.xp
})),
buildings: Array.from(this.automationBuildings.values()).map(b => ({
id: b.id,
type: b.type,
x: b.x,
y: b.y,
active: b.active
})),
powerSources: Array.from(this.powerGrid.values()).map(p => ({
id: p.id,
type: p.type,
x: p.x,
y: p.y
}))
};
localStorage.setItem('novafarma_farm_automation', JSON.stringify(data));
}
loadProgress() {
const saved = localStorage.getItem('novafarma_farm_automation');
if (saved) {
try {
const data = JSON.parse(saved);
// Restore workers (basic data only, full restoration in init)
this.savedData = data;
console.log('✅ Farm automation progress loaded');
} catch (error) {
console.error('Failed to load farm automation:', error);
}
}
}
destroy() {
this.saveProgress();
console.log('🤖 Farm Automation System destroyed');
}
}