Initial commit: 3D Hommie RPG game

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Maxim Dolgolyov
2026-02-25 01:04:09 +03:00
commit fb5f09212b
34 changed files with 14550 additions and 0 deletions

129
js/game/Equipment.js Normal file
View 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 };
}
}