Initial commit: 3D Hommie RPG game
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
129
js/game/Equipment.js
Normal file
129
js/game/Equipment.js
Normal file
@@ -0,0 +1,129 @@
|
||||
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 };
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user