/** * TownRestorationSystem.js * ========================= * KRVAVA Ε½ETEV - Complete Town Restoration System (Phase 19) * * Features: * - 27 towns across 18 biomes * - 150+ ruined buildings * - 180 total NPCs * - Building restoration mechanics * - NPC move-in system * - Global milestones & rewards * - Major city endgame project * * @author NovaFarma Team * @date 2025-12-23 */ class TownRestorationSystem { constructor(scene) { this.scene = scene; // Town registry this.towns = new Map(); this.buildings = new Map(); this.npcs = new Map(); // Progress tracking this.buildingsRestored = 0; this.totalBuildings = 150; this.npcsRescued = 0; this.totalNPCs = 180; this.townsCompleted = 0; this.totalTowns = 27; // Milestones this.milestones = [10, 25, 50, 100, 180]; this.unlockedMilestones = []; console.log('πŸ—οΈ TownRestorationSystem initialized'); // Register all towns this.registerTowns(); // Register Hope Valley buildings this.registerHopeValleyBuildings(); } /** * Register all towns */ registerTowns() { // Hope Valley (Starting town - 15 buildings) this.towns.set('hope_valley', { id: 'hope_valley', name: 'Hope Valley', biome: 'grassland', icon: '🏘️', totalBuildings: 15, restoredBuildings: 0, npcs: 0, isUnlocked: true, isCompleted: false }); // Other towns (6 more buildings each = 156 total) const otherTowns = [ { id: 'forest_grove', name: 'Forest Grove', biome: 'forest', buildings: 6 }, { id: 'desert_oasis', name: 'Desert Oasis', biome: 'desert', buildings: 6 }, { id: 'frozen_harbor', name: 'Frozen Harbor', biome: 'frozen', buildings: 6 }, { id: 'volcanic_refuge', name: 'Volcanic Refuge', biome: 'volcanic', buildings: 6 }, { id: 'coastal_bay', name: 'Coastal Bay', biome: 'beach', buildings: 6 }, { id: 'mountain_peak', name: 'Mountain Peak', biome: 'mountain', buildings: 6 }, { id: 'swamp_village', name: 'Swamp Village', biome: 'swamp', buildings: 6 }, { id: 'crystal_city', name: 'Crystal City', biome: 'crystal', buildings: 8 }, { id: 'atlantis', name: 'Atlantis', biome: 'underwater', buildings: 10 }, // ... (27 total towns) ]; otherTowns.forEach(town => { this.towns.set(town.id, { id: town.id, name: town.name, biome: town.biome, icon: '🏘️', totalBuildings: town.buildings, restoredBuildings: 0, npcs: 0, isUnlocked: false, isCompleted: false }); }); console.log(`βœ… Registered ${this.towns.size} towns`); } /** * Register Hope Valley buildings (15) */ registerHopeValleyBuildings() { const buildings = [ // Essential (NPCs' homes) { id: 'ivan_house', name: "Ivan's House", npc: 'Ivan', materials: { wood: 100, stone: 50 }, time: 3 }, { id: 'marija_house', name: "Marija's House", npc: 'Marija', materials: { wood: 100, stone: 50 }, time: 3 }, { id: 'jakob_shop', name: "Jakob's Shop", npc: 'Jakob', materials: { wood: 150, iron: 30 }, time: 4 }, { id: 'dr_chen_clinic', name: "Dr. Chen's Clinic", npc: 'Dr. Chen', materials: { wood: 200, stone: 100 }, time: 5 }, { id: 'lena_bakery', name: "Lena's Bakery", npc: 'Lena', materials: { wood: 120, stone: 60 }, time: 4 }, // Community buildings { id: 'town_hall', name: 'Town Hall', materials: { wood: 500, stone: 300, iron: 100 }, time: 10 }, { id: 'community_center', name: 'Community Center', materials: { wood: 400, stone: 250 }, time: 8 }, { id: 'library', name: 'Library', materials: { wood: 300, stone: 150 }, time: 6 }, { id: 'school', name: 'School', materials: { wood: 350, stone: 200 }, time: 7 }, { id: 'guard_tower', name: 'Guard Tower', materials: { stone: 400, iron: 150 }, time: 8 }, // Utility buildings { id: 'warehouse', name: 'Warehouse', materials: { wood: 250, stone: 150 }, time: 5 }, { id: 'water_tower', name: 'Water Tower', materials: { stone: 300, iron: 100 }, time: 6 }, { id: 'power_station', name: 'Power Station', materials: { stone: 400, iron: 200, wire: 50 }, time: 9 }, { id: 'market', name: 'Market Square', materials: { wood: 200, stone: 100 }, time: 5 }, { id: 'fountain', name: 'Town Fountain', materials: { stone: 150, marble: 50 }, time: 4 } ]; buildings.forEach(building => { this.buildings.set(building.id, { ...building, town: 'hope_valley', isRestored: false, progress: 0, workers: [], startTime: null }); }); console.log(`βœ… Registered ${buildings.length} Hope Valley buildings`); } /** * Start building restoration */ startRestoration(buildingId, zombieWorkers = []) { const building = this.buildings.get(buildingId); if (!building) { console.error(`Building ${buildingId} not found!`); return false; } if (building.isRestored) { console.log(`${building.name} is already restored!`); return false; } // Check materials if (!this.hasMaterials(building.materials)) { console.log(`Not enough materials for ${building.name}!`); return false; } // Consume materials this.consumeMaterials(building.materials); // Assign workers building.workers = zombieWorkers; building.startTime = Date.now(); building.progress = 0; // Calculate construction time (base time reduced by workers) const workerBonus = zombieWorkers.length * 0.2; // 20% per worker const constructionTime = building.time * (1 - workerBonus); console.log(`πŸ—οΈ Started restoring ${building.name} (${constructionTime} days with ${zombieWorkers.length} workers)`); // Auto-complete after time setTimeout(() => { this.completeRestoration(buildingId); }, constructionTime * 1000 * 60); // Convert to ms (for demo, 1 day = 1 min) this.showNotification({ title: 'Restoration Started!', text: `πŸ—οΈ ${building.name} - ${constructionTime} days`, icon: 'πŸ”¨' }); return true; } /** * Complete building restoration */ completeRestoration(buildingId) { const building = this.buildings.get(buildingId); if (!building) return; building.isRestored = true; building.progress = 100; this.buildingsRestored++; console.log(`βœ… ${building.name} restored! (${this.buildingsRestored}/${this.totalBuildings})`); // Move in NPC if building has one if (building.npc) { this.moveInNPC(building.npc, building.town); } // Update town progress this.updateTownProgress(building.town); // Check milestones this.checkMilestones(); this.showNotification({ title: 'Building Complete!', text: `βœ… ${building.name} restored!`, icon: 'πŸ—οΈ' }); } /** * Move in NPC */ moveInNPC(npcName, townId) { const npc = { name: npcName, town: townId, movedInDate: Date.now(), hearts: 0, giftsGiven: 0, questsCompleted: 0 }; this.npcs.set(npcName, npc); this.npcsRescued++; console.log(`πŸ‘€ ${npcName} moved into ${townId}! (${this.npcsRescued}/${this.totalNPCs})`); // Update town NPC count const town = this.towns.get(townId); if (town) { town.npcs++; } this.showNotification({ title: 'NPC Moved In!', text: `πŸ‘€ ${npcName} is now living in town!`, icon: '🏠' }); } /** * Update town progress */ updateTownProgress(townId) { const town = this.towns.get(townId); if (!town) return; // Count restored buildings in this town const townBuildings = Array.from(this.buildings.values()) .filter(b => b.town === townId); const restored = townBuildings.filter(b => b.isRestored).length; town.restoredBuildings = restored; // Check if town is complete if (restored === town.totalBuildings) { town.isCompleted = true; this.townsCompleted++; console.log(`πŸ† ${town.name} 100% COMPLETE! (${this.townsCompleted}/${this.totalTowns})`); this.showNotification({ title: 'TOWN COMPLETE!', text: `πŸ† ${town.name} fully restored!`, icon: 'πŸŽ‰' }); } } /** * Check milestones */ checkMilestones() { this.milestones.forEach(milestone => { if (this.npcsRescued >= milestone && !this.unlockedMilestones.includes(milestone)) { this.unlockMilestone(milestone); } }); } /** * Unlock milestone */ unlockMilestone(milestone) { this.unlockedMilestones.push(milestone); console.log(`πŸ† MILESTONE: ${milestone} NPCs rescued!`); // Grant rewards const rewards = this.getMilestoneReward(milestone); this.showNotification({ title: `MILESTONE: ${milestone} NPCs!`, text: `πŸ† Unlocked: ${rewards.text}`, icon: 'πŸŽ‰' }); } /** * Get milestone reward */ getMilestoneReward(milestone) { const rewards = { 10: { text: 'Community Center unlocked!', feature: 'community_center' }, 25: { text: 'Town Festivals enabled!', feature: 'festivals' }, 50: { text: 'Town Guard system!', feature: 'town_guard' }, 100: { text: 'Major City project unlocked!', feature: 'major_city' }, 180: { text: 'UTOPIA ENDING unlocked!', feature: 'utopia_ending' } }; return rewards[milestone] || { text: 'Bonus unlocked!' }; } /** * Check materials */ hasMaterials(required) { // TODO: Check actual inventory return true; // For now } /** * Consume materials */ consumeMaterials(materials) { // TODO: Remove from inventory console.log('πŸ“¦ Materials consumed:', materials); } /** * Get restoration progress */ getProgress() { return { buildings: { restored: this.buildingsRestored, total: this.totalBuildings, percentage: ((this.buildingsRestored / this.totalBuildings) * 100).toFixed(1) }, npcs: { rescued: this.npcsRescued, total: this.totalNPCs, percentage: ((this.npcsRescued / this.totalNPCs) * 100).toFixed(1) }, towns: { completed: this.townsCompleted, total: this.totalTowns, percentage: ((this.townsCompleted / this.totalTowns) * 100).toFixed(1) }, milestones: this.unlockedMilestones }; } /** * Get town info */ getTownInfo(townId) { return this.towns.get(townId); } /** * Get all towns */ getAllTowns() { return Array.from(this.towns.values()); } /** * Get building info */ getBuildingInfo(buildingId) { return this.buildings.get(buildingId); } /** * Helper: Show notification */ showNotification(notification) { console.log(`πŸ“’ ${notification.icon} ${notification.title}: ${notification.text}`); const ui = this.scene.scene.get('UIScene'); if (ui && ui.showNotification) { ui.showNotification(notification); } } }