export class Achievements { constructor(game) { this.game = game; this.unlocked = new Set(); this.list = [ // Выживание { id: 'first_day', title: 'Новая жизнь', desc: 'Прожить 1 день', icon: '🌅', category: 'survival' }, { id: 'week_survivor', title: 'Недельный марафон', desc: 'Прожить 7 дней', icon: '📅', category: 'survival' }, { id: 'month_survivor', title: 'Бывалый', desc: 'Прожить 28 дней', icon: '🏆', category: 'survival' }, { id: 'winter_survivor', title: 'Морозоустойчивый', desc: 'Пережить зиму', icon: '❄️', category: 'survival' }, { id: 'full_year', title: 'Годовщина', desc: 'Прожить все 4 сезона', icon: '🎊', category: 'survival' }, { id: 'near_death', title: 'На грани', desc: 'Выжить при здоровье < 5', icon: '💀', category: 'survival' }, { id: 'well_fed', title: 'Сытый', desc: 'Держать сытость на 100 в течение 5 минут', icon: '🍽️', category: 'survival' }, // Социальные { id: 'first_talk', title: 'Общительный', desc: 'Поговорить с 3 NPC', icon: '💬', category: 'social' }, { id: 'all_npcs', title: 'Душа компании', desc: 'Поговорить со всеми NPC', icon: '🤝', category: 'social' }, { id: 'best_friend', title: 'Лучший друг', desc: 'Приручить пса', icon: '🐕', category: 'social' }, { id: 'respected', title: 'Уважаемый', desc: 'Достичь репутации 50+', icon: '⭐', category: 'social' }, { id: 'beloved', title: 'Свой человек', desc: 'Достичь репутации 80+', icon: '💛', category: 'social' }, // Экономика { id: 'first_money', title: 'Первый рубль', desc: 'Заработать первые деньги', icon: '💰', category: 'economy' }, { id: 'rich_100', title: 'Копилка', desc: 'Накопить 100₽', icon: '🪙', category: 'economy' }, { id: 'rich_500', title: 'Состояние', desc: 'Накопить 500₽', icon: '💎', category: 'economy' }, { id: 'rich_1000', title: 'Богач', desc: 'Накопить 1000₽', icon: '👑', category: 'economy' }, { id: 'first_job_done', title: 'Трудяга', desc: 'Выполнить первую подработку', icon: '🔧', category: 'economy' }, { id: 'jobs_10', title: 'Работяга', desc: 'Выполнить 10 подработок', icon: '🏗️', category: 'economy' }, { id: 'bottle_king', title: 'Король бутылок', desc: 'Сдать 20 бутылок', icon: '🍾', category: 'economy' }, // Боевые { id: 'first_fight', title: 'Боец', desc: 'Отбиться от врага', icon: '👊', category: 'combat' }, { id: 'fighter_5', title: 'Бывалый боец', desc: 'Победить 5 врагов', icon: '🥊', category: 'combat' }, { id: 'survivor_combat', title: 'Несгибаемый', desc: 'Отбиться от 3 врагов подряд', icon: '🛡️', category: 'combat' }, // Исследование { id: 'explorer', title: 'Исследователь', desc: 'Посетить все локации', icon: '🗺️', category: 'explore' }, { id: 'crafter', title: 'Мастер', desc: 'Создать 5 предметов', icon: '🔨', category: 'explore' }, { id: 'skill_max', title: 'Эксперт', desc: 'Достичь 5 уровня любого навыка', icon: '📚', category: 'explore' }, { id: 'fully_equipped', title: 'Экипированный', desc: 'Заполнить все слоты экипировки', icon: '🛡️', category: 'explore' }, { id: 'shelter_built', title: 'Свой угол', desc: 'Построить укрытие', icon: '🏠', category: 'explore' }, ]; } // Вызывается из разных мест кода check(id) { if (this.unlocked.has(id)) return; const achievement = this.list.find(a => a.id === id); if (!achievement) return; this.unlocked.add(id); this.showPopup(achievement); this.game.sound.playQuestComplete(); this.game.player.stats.mood = Math.min(100, this.game.player.stats.mood + 5); } // Проверки, вызываемые каждый тик updateChecks() { const player = this.game.player; const day = this.game.gameDay; // Выживание if (day >= 2) this.check('first_day'); if (day >= 8) this.check('week_survivor'); if (day >= 29) this.check('month_survivor'); // Здоровье if (player.stats.health > 0 && player.stats.health < 5) { this.check('near_death'); } // Деньги if (player.stats.money >= 1) this.check('first_money'); if (player.stats.money >= 100) this.check('rich_100'); if (player.stats.money >= 500) this.check('rich_500'); if (player.stats.money >= 1000) this.check('rich_1000'); // Репутация if (this.game.reputation.value >= 50) this.check('respected'); if (this.game.reputation.value >= 80) this.check('beloved'); // Пёс if (this.game.dog.adopted) this.check('best_friend'); // Навыки const skills = this.game.skills.skills; for (const skill of Object.values(skills)) { if (skill.level >= 5) { this.check('skill_max'); break; } } // Экипировка if (this.game.equipment.getFilledSlots() === 4) { this.check('fully_equipped'); } } showPopup(achievement) { let popup = document.getElementById('achievement-popup'); if (!popup) { popup = document.createElement('div'); popup.id = 'achievement-popup'; popup.style.cssText = ` position: fixed; top: -80px; left: 50%; transform: translateX(-50%); background: linear-gradient(135deg, rgba(20,20,40,0.95), rgba(40,30,60,0.95)); border: 2px solid #ffd740; border-radius: 8px; padding: 12px 24px; z-index: 60; display: flex; align-items: center; gap: 12px; transition: top 0.5s ease; backdrop-filter: blur(8px); box-shadow: 0 4px 20px rgba(255,215,64,0.3); pointer-events: none; `; document.body.appendChild(popup); } popup.innerHTML = ` ${achievement.icon}