const Quest = require("./Quest"); const quests = require("../Data/quests"); class Quests { constructor(quests, doneCallback) { let currentQuest = quests[0]; this.completedQuests = []; this.finishedQuests = {}; this.completedQuestsAmount = {}; this.doneCallback = doneCallback; this.list = {}; this.list = quests.reduce((result, entry) => { this.completedQuestsAmount[entry.questID] = entry.completedAmount; if (entry.state === 1 || entry.state === 2) return result; const quest = this.add(entry.questID); if (!quest) return result; if (currentQuest.id !== entry.questID) { result[entry.questID] = quest; currentQuest = quest; }; if (!entry.amount) return result; const { typeID, entityTypeID } = result[entry.questID].task[entry.taskType][entry.taskIndex]; currentQuest.adjustTask([{ taskCategoryID: entry.taskType, typeID, entityTypeID }], entry.amount); return result; }, {}); }; add(id) { const questScheme = quests[id - 1]; if (!questScheme) return; const isAcceptable = !questScheme.maximumComplete || questScheme.maximumComplete && questScheme.maximumComplete > this.completedQuestsAmount[id] || !this.completedQuestsAmount[id] && questScheme.maximumComplete; if (!isAcceptable) return; const isQuestAlreadyAdded = this.list[id]; if (isQuestAlreadyAdded) return true; const quest = new Quest(questScheme, completedQuestID => { if (questScheme.maximumComplete !== -1) this.completedQuests.push(completedQuestID); if (!this.completedQuestsAmount[completedQuestID]) this.completedQuestsAmount[completedQuestID] = 1; else this.completedQuestsAmount[completedQuestID]++; const completedQuest = this.list[completedQuestID]; this.doneCallback(completedQuest); this.remove(completedQuestID); }); delete this.finishedQuests[id]; this.list[id] = quest; return quest; } remove(id) { const questScheme = quests[id - 1]; if (!questScheme) return; this.finishedQuests[id] = true; delete this.list[id]; } has(id) { return this.list[id] ? true : false; } refresh(pirateLevel) { for (const id in this.list) { const questScheme = quests[+id - 1]; if (questScheme.maximumLevel < pirateLevel || questScheme.minimumLevel > pirateLevel) this.remove(+id); }; } }; module.exports = Quests;