130 lines
4.8 KiB
JavaScript
130 lines
4.8 KiB
JavaScript
export class Equipment {
|
||
constructor(game) {
|
||
this.game = game;
|
||
|
||
// Слоты экипировки
|
||
this.slots = {
|
||
head: null,
|
||
body: null,
|
||
feet: null,
|
||
hands: null
|
||
};
|
||
|
||
// Все предметы экипировки
|
||
this.allItems = {
|
||
// Голова
|
||
old_hat: { slot: 'head', name: 'Старая шапка', icon: '🧢', warmth: 5, protection: 0, mood: 0, tier: 1 },
|
||
hood: { slot: 'head', name: 'Капюшон', icon: '🪖', warmth: 8, protection: 2, mood: 0, tier: 2 },
|
||
warm_hat: { slot: 'head', name: 'Тёплая шапка', icon: '🎩', warmth: 15, protection: 0, mood: 3, tier: 3 },
|
||
helmet: { slot: 'head', name: 'Каска', icon: '⛑️', warmth: 3, protection: 8, mood: -2, tier: 3 },
|
||
|
||
// Тело
|
||
old_jacket: { slot: 'body', name: 'Драная куртка', icon: '🧥', warmth: 10, protection: 2, mood: 0, tier: 1 },
|
||
coat: { slot: 'body', name: 'Пальто', icon: '🧥', warmth: 18, protection: 3, mood: 2, tier: 2 },
|
||
warm_jacket:{ slot: 'body', name: 'Тёплая куртка', icon: '🧥', warmth: 25, protection: 5, mood: 3, tier: 3 },
|
||
vest: { slot: 'body', name: 'Жилетка', icon: '🦺', warmth: 8, protection: 10, mood: 0, tier: 3 },
|
||
|
||
// Ноги
|
||
old_boots: { slot: 'feet', name: 'Рваные ботинки', icon: '👞', warmth: 5, protection: 1, mood: 0, tier: 1 },
|
||
boots: { slot: 'feet', name: 'Ботинки', icon: '🥾', warmth: 10, protection: 3, mood: 1, tier: 2 },
|
||
warm_boots: { slot: 'feet', name: 'Тёплые сапоги', icon: '🥾', warmth: 18, protection: 4, mood: 2, tier: 3 },
|
||
|
||
// Руки
|
||
old_gloves: { slot: 'hands', name: 'Дырявые перчатки', icon: '🧤', warmth: 3, protection: 0, mood: 0, tier: 1 },
|
||
gloves: { slot: 'hands', name: 'Перчатки', icon: '🧤', warmth: 8, protection: 2, mood: 1, tier: 2 },
|
||
warm_gloves:{ slot: 'hands', name: 'Тёплые перчатки', icon: '🧤', warmth: 14, protection: 3, mood: 2, tier: 3 },
|
||
};
|
||
}
|
||
|
||
equip(itemKey) {
|
||
const item = this.allItems[itemKey];
|
||
if (!item) return false;
|
||
|
||
const prevItem = this.slots[item.slot];
|
||
this.slots[item.slot] = itemKey;
|
||
|
||
if (prevItem) {
|
||
this.game.notify(`Снято: ${this.allItems[prevItem].name}`);
|
||
// Возвращаем в инвентарь
|
||
this.game.inventory.addItem('eq_' + prevItem, 1);
|
||
}
|
||
|
||
this.game.notify(`Экипировано: ${item.name}`, 'good');
|
||
this.game.sound.playPickup();
|
||
|
||
// Проверка полной экипировки
|
||
if (this.getFilledSlots() === 4) {
|
||
this.game.questSystem.onEvent('full_equipment');
|
||
}
|
||
return true;
|
||
}
|
||
|
||
unequip(slot) {
|
||
const itemKey = this.slots[slot];
|
||
if (!itemKey) return false;
|
||
|
||
this.slots[slot] = null;
|
||
this.game.inventory.addItem('eq_' + itemKey, 1);
|
||
this.game.notify(`Снято: ${this.allItems[itemKey].name}`);
|
||
return true;
|
||
}
|
||
|
||
getEquipped(slot) {
|
||
const key = this.slots[slot];
|
||
if (!key) return null;
|
||
return { key, ...this.allItems[key] };
|
||
}
|
||
|
||
// Общий бонус тепла от экипировки
|
||
getWarmthBonus() {
|
||
let total = 0;
|
||
for (const key of Object.values(this.slots)) {
|
||
if (key && this.allItems[key]) {
|
||
total += this.allItems[key].warmth;
|
||
}
|
||
}
|
||
return total;
|
||
}
|
||
|
||
// Общий бонус защиты (снижение урона в %)
|
||
getProtectionBonus() {
|
||
let total = 0;
|
||
for (const key of Object.values(this.slots)) {
|
||
if (key && this.allItems[key]) {
|
||
total += this.allItems[key].protection;
|
||
}
|
||
}
|
||
return Math.min(50, total); // Максимум 50% снижения
|
||
}
|
||
|
||
// Общий бонус настроения
|
||
getMoodBonus() {
|
||
let total = 0;
|
||
for (const key of Object.values(this.slots)) {
|
||
if (key && this.allItems[key]) {
|
||
total += this.allItems[key].mood;
|
||
}
|
||
}
|
||
return total;
|
||
}
|
||
|
||
// Количество слотов заполнено
|
||
getFilledSlots() {
|
||
return Object.values(this.slots).filter(v => v !== null).length;
|
||
}
|
||
|
||
getSaveData() {
|
||
return { slots: { ...this.slots } };
|
||
}
|
||
|
||
loadSaveData(data) {
|
||
if (data && data.slots) {
|
||
this.slots = { ...data.slots };
|
||
}
|
||
}
|
||
|
||
reset() {
|
||
this.slots = { head: null, body: null, feet: null, hands: null };
|
||
}
|
||
}
|