Files

190 lines
8.0 KiB
JavaScript

// Zombie Lab & Mutation System for "I, Zombie" mode
window.ZombieLabSystem = class ZombieLabSystem {
constructor(economy, workshop) {
this.economy = economy;
this.workshop = workshop;
// Upgradable zombie definitions
this.zombies = {
normal: {
id: 'normal',
name: 'Обычный зомби',
icon: '🧟',
tiers: {
1: { title: 'Базовый ходок', desc: 'HP 200, стандартная скорость' },
2: { title: 'Спринтер', desc: 'Скорость бега +35%', cost: { coins: 150, scrapMetal: 8 } },
3: { title: 'Зомби-Вампир', desc: 'Лечит +45 HP за каждый укус растения', cost: { coins: 350, scrapMetal: 15, bioHumus: 10 } }
}
},
conehead: {
id: 'conehead',
name: 'Зомби с конусом',
icon: '⚠️',
tiers: {
1: { title: 'Дорожный конус', desc: 'HP 560 (конус поглощает урон)' },
2: { title: 'Титановый конус', desc: 'HP 800 + устойчивость к критам', cost: { coins: 200, scrapMetal: 15 } },
3: { title: 'Шипованный шлем', desc: 'HP 1050 + отражает 25% урона стрелкам', cost: { coins: 450, scrapMetal: 30, crystals: 1 } }
}
},
polevaulter: {
id: 'polevaulter',
name: 'Зомби с шестом',
icon: '🏃',
tiers: {
1: { title: 'Легкоатлет', desc: 'Быстрый разбег, 1 прыжок через растение' },
2: { title: 'Двойной шест', desc: 'Может перепрыгнуть 2 растения подряд!', cost: { coins: 250, scrapMetal: 20, bioHumus: 10 } },
3: { title: 'Турбо-спринтер', desc: 'Спринт +50% скорости даже после приземления', cost: { coins: 500, scrapMetal: 35, crystals: 1 } }
}
},
buckethead: {
id: 'buckethead',
name: 'Зомби с ведром',
icon: '🪣',
tiers: {
1: { title: 'Стальное ведро', desc: 'HP 1300 тяжелая броня' },
2: { title: 'Тяжелый сплав', desc: 'HP 1800 колоссальная прочность', cost: { coins: 300, scrapMetal: 25 } },
3: { title: 'Крио-изоляция', desc: 'HP 2300 + полный иммунитет к замедлению льдом!', cost: { coins: 650, scrapMetal: 45, crystals: 2 } }
}
},
football: {
id: 'football',
name: 'Зомби-футболист',
icon: '🏈',
tiers: {
1: { title: 'Квотербек', desc: 'HP 1600 суперскорость и шлем' },
2: { title: 'Тяжелый лайнмен', desc: 'HP 2200 + поглощает 20% урона', cost: { coins: 400, scrapMetal: 35 } },
3: { title: 'Безумный таран', desc: 'HP 2800 + сминает картофельную мину без взрыва!', cost: { coins: 800, scrapMetal: 60, crystals: 2 } }
}
}
};
// User levels (1..3)
this.levels = {
normal: 1,
conehead: 1,
polevaulter: 1,
buckethead: 1,
football: 1
};
// Unlocked stage in I, Zombie campaign (1..5)
this.unlockedStage = 1;
this.selectedStage = 1;
this.stages = [
{ id: 1, title: '1. Зелёный Двор', desc: 'Базовый газон Дэйва. Съешьте все подсолнухи!', reward: 100 },
{ id: 2, title: '2. Ночной Дозор', desc: 'Тёмный двор с Дымогрибами и Могилами', reward: 150 },
{ id: 3, title: '3. Водный Штурм', desc: '6 дорожек, Кувшинки и тройные Горохострелы', reward: 220 },
{ id: 4, title: '4. Ореховый Бастион', desc: 'Мощный частокол Стеноорехов и Картофельных Мин', reward: 300 },
{ id: 5, title: '5. РЕЙД-БОСС: Золотой Подсолнух', desc: 'Эпический бой против гигантского Подсолнуха-Босса 5000 HP!', reward: 600, crystals: 2, isBoss: true }
];
this.loadFromAuth();
}
loadFromAuth() {
if (window.PvZAuth) {
const uData = window.PvZAuth.getUserData();
if (uData.zombieLab) {
const zl = uData.zombieLab;
if (zl.levels) {
for (const k in this.levels) {
if (zl.levels[k]) this.levels[k] = Math.min(3, Math.max(1, Number(zl.levels[k])));
}
}
if (zl.unlockedStage) {
this.unlockedStage = Math.max(1, Math.min(5, Number(zl.unlockedStage)));
}
}
}
}
saveToAuth() {
if (window.PvZAuth && !window.PvZAuth.isGuest()) {
window.PvZAuth.saveUserData({
zombieLab: {
levels: { ...this.levels },
unlockedStage: this.unlockedStage
}
});
}
}
getZombieLevel(type) {
return this.levels[type] || 1;
}
canUpgrade(type) {
const curLevel = this.getZombieLevel(type);
if (curLevel >= 3) return false;
const def = this.zombies[type];
if (!def) return false;
const nextTier = def.tiers[curLevel + 1];
if (!nextTier) return false;
const cost = nextTier.cost;
if (cost.coins && (!this.economy || this.economy.totalCoins < cost.coins)) return false;
if (this.workshop) {
if (cost.scrapMetal && (this.workshop.materials.scrapMetal || 0) < cost.scrapMetal) return false;
if (cost.bioHumus && (this.workshop.materials.bioHumus || 0) < cost.bioHumus) return false;
if (cost.crystals && (this.workshop.materials.crystals || 0) < cost.crystals) return false;
}
return true;
}
upgradeZombie(type) {
const curLevel = this.getZombieLevel(type);
if (curLevel >= 3) return { success: false, message: 'Максимальный уровень мутации!' };
const def = this.zombies[type];
if (!def) return { success: false, message: 'Неизвестный зомби' };
const nextTier = def.tiers[curLevel + 1];
if (!nextTier) return { success: false, message: 'Нет следующего уровня' };
const cost = nextTier.cost;
if (cost.coins && (!this.economy || this.economy.totalCoins < cost.coins)) {
return { success: false, message: 'Недостаточно монет' };
}
if (this.workshop) {
if (cost.scrapMetal && (this.workshop.materials.scrapMetal || 0) < cost.scrapMetal) {
return { success: false, message: 'Недостаточно металлолома ⚙️' };
}
if (cost.bioHumus && (this.workshop.materials.bioHumus || 0) < cost.bioHumus) {
return { success: false, message: 'Недостаточно био-гумуса 🧪' };
}
if (cost.crystals && (this.workshop.materials.crystals || 0) < cost.crystals) {
return { success: false, message: 'Недостаточно кристаллов 💎' };
}
// Deduct materials
if (cost.scrapMetal) this.workshop.materials.scrapMetal -= cost.scrapMetal;
if (cost.bioHumus) this.workshop.materials.bioHumus -= cost.bioHumus;
if (cost.crystals) this.workshop.materials.crystals -= cost.crystals;
this.workshop.saveToAuth();
}
if (cost.coins) {
this.economy.totalCoins -= cost.coins;
this.economy.saveProfileData();
}
this.levels[type] = curLevel + 1;
this.saveToAuth();
if (window.PvZAudio) window.PvZAudio.playWin();
return {
success: true,
newLevel: this.levels[type],
message: `🎉 ${def.name} мутировал до Ур. ${this.levels[type]} («${nextTier.title}»)!`
};
}
unlockNextStage(completedStage) {
if (completedStage >= this.unlockedStage && this.unlockedStage < 5) {
this.unlockedStage = completedStage + 1;
this.saveToAuth();
return true;
}
return false;
}
};