export class QuestSystem { constructor(game) { this.game = game; this.quests = []; this.completedQuests = []; } initQuests() { this.quests = []; this.completedQuests = []; this.addQuest({ id: 'first_search', title: 'Первые поиски', description: 'Обыщите мусорку и найдите что-нибудь полезное.', target: 1, progress: 0, event: 'collect_bottle', altEvents: ['find_food', 'find_money'], location: { x: -20, z: -10 }, reward: () => { this.game.player.stats.mood += 10; this.game.notify('Квест выполнен! +10 Настроение'); } }); this.addQuest({ id: 'bottle_collector', title: 'Собиратель бутылок', description: 'Соберите 5 пустых бутылок.', target: 5, progress: 0, event: 'collect_bottle', reward: () => { this.game.player.stats.money += 30; this.game.notify('Квест выполнен! +30 ₽'); } }); this.addQuest({ id: 'meet_serega', title: 'Новые знакомства', description: 'Поговорите с Серёгой в укрытии.', target: 1, progress: 0, event: 'talk_npc', eventFilter: 'Серёга', location: { x: -35, z: 28 }, reward: () => { this.game.player.stats.mood += 15; this.game.notify('Квест выполнен! +15 Настроение. Серёга теперь ваш друг.'); } }); this.addQuest({ id: 'first_night', title: 'Первая ночь', description: 'Переживите первую ночь — поспите в укрытии.', target: 1, progress: 0, event: 'sleep', location: { x: -45, z: 40 }, reward: () => { this.game.player.stats.health = Math.min(100, this.game.player.stats.health + 10); this.game.notify('Квест выполнен! +10 Здоровье'); } }); this.addQuest({ id: 'earn_money', title: 'Первый заработок', description: 'Заработайте 50 ₽ любым способом.', target: 50, progress: 0, event: 'find_money', cumulative: true, reward: () => { this.game.player.stats.mood += 20; this.game.notify('Квест выполнен! +20 Настроение. Вы учитесь выживать!'); } }); this.addQuest({ id: 'talk_granny', title: 'Добрая душа', description: 'Поговорите с бабушкой Зиной в парке.', target: 1, progress: 0, event: 'talk_npc', eventFilter: 'Бабушка Зина', location: { x: -22, z: 22 }, reward: () => { this.game.player.stats.mood += 10; this.game.notify('Квест выполнен! Бабушка Зина вас не забудет.'); } }); this.addQuest({ id: 'survive_3days', title: 'Стойкий', description: 'Проживите 3 дня.', target: 3, progress: 0, event: 'new_day', reward: () => { this.game.player.stats.mood += 25; this.game.player.stats.health = 100; this.game.notify('Квест выполнен! Вы стали крепче. Полное здоровье!'); } }); // === Новые квесты === this.addQuest({ id: 'adopt_dog', title: 'Верный друг', description: 'Приручите бездомного пса.', target: 1, progress: 0, event: 'adopt_dog', reward: () => { this.game.player.stats.mood += 25; this.game.notify('Квест выполнен! Теперь у вас есть верный друг! +25 Настроение', 'good'); } }); this.addQuest({ id: 'first_beg', title: 'Просящему дастся', description: 'Успешно попросите милостыню 3 раза.', target: 3, progress: 0, event: 'beg', reward: () => { this.game.player.stats.money += 50; this.game.sound.playCoin(); this.game.notify('Квест выполнен! +50 ₽ бонус', 'good'); } }); this.addQuest({ id: 'visit_church', title: 'Утешение', description: 'Посетите церковь.', target: 1, progress: 0, event: 'visit_church', location: { x: 28, z: 35 }, reward: () => { this.game.player.stats.mood = Math.min(100, this.game.player.stats.mood + 15); this.game.player.stats.health = Math.min(100, this.game.player.stats.health + 10); this.game.notify('Квест выполнен! +15 Настроение, +10 Здоровье', 'good'); } }); this.addQuest({ id: 'sobriety', title: 'Трезвость', description: 'Преодолейте зависимость от алкоголя.', target: 1, progress: 0, event: 'sobriety', reward: () => { this.game.player.stats.mood += 30; this.game.player.stats.health = Math.min(100, this.game.player.stats.health + 20); this.game.notify('Квест выполнен! Вы завязали! +30 Настроение, +20 Здоровье', 'good'); } }); this.addQuest({ id: 'wash_fountain', title: 'Чистота — залог здоровья', description: 'Помойтесь у фонтанчика.', target: 1, progress: 0, event: 'wash', reward: () => { this.game.player.stats.mood += 15; this.game.player.stats.health = Math.min(100, this.game.player.stats.health + 10); this.game.notify('Квест выполнен! +15 Настроение, +10 Здоровье', 'good'); } }); this.addQuest({ id: 'street_musician', title: 'Уличный музыкант', description: 'Заработайте бускингом 3 раза.', target: 3, progress: 0, event: 'busking', reward: () => { this.game.player.stats.mood += 20; this.game.player.stats.money += 50; this.game.sound.playCoin(); this.game.notify('Квест выполнен! +20 Настроение, +50₽ бонус', 'good'); } }); this.addQuest({ id: 'first_craft', title: 'Мастер на все руки', description: 'Создайте любой предмет в крафте.', target: 1, progress: 0, event: 'craft_item', reward: () => { this.game.player.stats.mood += 15; this.game.inventory.addItem('scrap', 3); this.game.notify('Квест выполнен! +15 Настроение, +3 Хлам', 'good'); } }); this.addQuest({ id: 'survive_7days', title: 'Закалённый', description: 'Проживите 7 дней на улице.', target: 7, progress: 0, event: 'new_day', reward: () => { this.game.player.stats.health = 100; this.game.player.stats.hunger = 100; this.game.player.stats.warmth = 100; this.game.player.stats.mood = 100; this.game.notify('Квест выполнен! Все статы восстановлены до максимума!', 'good'); } }); this.addQuest({ id: 'rich', title: 'Первый капитал', description: 'Накопите 300 ₽.', target: 300, progress: 0, event: 'find_money', cumulative: true, reward: () => { this.game.player.stats.mood += 30; this.game.notify('Квест выполнен! +30 Настроение. Вы на верном пути!', 'good'); } }); // === Квесты новых систем === this.addQuest({ id: 'first_job', title: 'Рабочий человек', description: 'Выполните первую подработку.', target: 1, progress: 0, event: 'complete_job', location: { x: 22, z: -10 }, reward: () => { this.game.player.stats.mood += 15; this.game.player.stats.money += 30; this.game.sound.playCoin(); this.game.notify('Квест выполнен! +15 Настроение, +30₽ бонус', 'good'); } }); this.addQuest({ id: 'hard_worker', title: 'Трудяга', description: 'Выполните 5 подработок.', target: 5, progress: 0, event: 'complete_job', reward: () => { this.game.player.stats.mood += 25; this.game.player.stats.money += 100; this.game.sound.playCoin(); this.game.notify('Квест выполнен! +25 Настроение, +100₽! Вас ценят!', 'good'); this.game.reputation.change(10); } }); this.addQuest({ id: 'survive_winter', title: 'Зимовка', description: 'Переживите зиму.', target: 1, progress: 0, event: 'survive_winter', reward: () => { this.game.player.stats.health = 100; this.game.player.stats.warmth = 100; this.game.notify('Квест выполнен! Вы пережили зиму! Здоровье и Тепло восстановлены!', 'good'); } }); this.addQuest({ id: 'respected', title: 'Уважаемый человек', description: 'Достигните репутации "Уважаемый".', target: 1, progress: 0, event: 'reputation_level', reward: () => { this.game.player.stats.mood = 100; this.game.player.stats.money += 200; this.game.sound.playCoin(); this.game.notify('Квест выполнен! Вас уважают! +200₽, Настроение MAX', 'good'); } }); // === Квесты для новых систем === this.addQuest({ id: 'build_shelter', title: 'Свой угол', description: 'Постройте собственное укрытие.', target: 1, progress: 0, event: 'build_shelter', location: { x: -32, z: 42 }, reward: () => { this.game.player.stats.mood += 30; this.game.player.stats.health = Math.min(100, this.game.player.stats.health + 20); this.game.notify('Квест выполнен! Теперь у вас есть дом! +30 Настроение, +20 Здоровье', 'good'); } }); this.addQuest({ id: 'full_equipment', title: 'Полная экипировка', description: 'Экипируйте предметы во все 4 слота.', target: 1, progress: 0, event: 'full_equipment', reward: () => { this.game.player.stats.mood += 20; this.game.player.stats.warmth = Math.min(100, this.game.player.stats.warmth + 30); this.game.notify('Квест выполнен! Вы полностью одеты! +20 Настроение, +30 Тепло', 'good'); } }); this.addQuest({ id: 'visit_hospital', title: 'На поправку', description: 'Посетите больницу.', target: 1, progress: 0, event: 'visit_hospital', location: { x: -28, z: -60 }, reward: () => { this.game.player.stats.health = Math.min(100, this.game.player.stats.health + 25); this.game.notify('Квест выполнен! +25 Здоровье', 'good'); } }); this.addQuest({ id: 'defeat_enemy', title: 'Самозащита', description: 'Отбейтесь от врага.', target: 1, progress: 0, event: 'defeat_enemy', reward: () => { this.game.player.stats.mood += 15; this.game.reputation.change(5); this.game.notify('Квест выполнен! +15 Настроение, +5 Репутация', 'good'); } }); this.addQuest({ id: 'craft_5', title: 'Умелые руки', description: 'Создайте 5 предметов в крафте.', target: 5, progress: 0, event: 'craft_item', reward: () => { this.game.player.stats.mood += 20; this.game.inventory.addItem('scrap', 5); this.game.inventory.addItem('rope', 3); this.game.notify('Квест выполнен! +20 Настроение, +5 Хлам, +3 Верёвка', 'good'); } }); } addQuest(quest) { this.quests.push(quest); } onEvent(eventName, data) { this.quests.forEach(quest => { if (quest.completed) return; let matches = quest.event === eventName; if (!matches && quest.altEvents) { matches = quest.altEvents.includes(eventName); } if (matches) { if (quest.eventFilter && data !== quest.eventFilter) return; if (quest.cumulative && typeof data === 'number') { quest.progress += data; } else { quest.progress++; } if (quest.progress >= quest.target) { this.completeQuest(quest); } } }); } completeQuest(quest) { quest.completed = true; quest.reward(); this.completedQuests.push(quest.id); this.game.sound.playQuestComplete(); } update(dt) { // Проверка дней const prevDay = this._lastDay || 1; if (this.game.gameDay > prevDay) { for (let d = prevDay + 1; d <= this.game.gameDay; d++) { this.onEvent('new_day'); } } this._lastDay = this.game.gameDay; } getActiveQuests() { return this.quests.filter(q => !q.completed); } getCompletedQuests() { return this.quests.filter(q => q.completed); } reset() { this.quests = []; this.completedQuests = []; } }