Files
pirate-corsaire-server/Game/Quest.js
T
2026-08-24 22:20:36 +02:00

68 lines
2.1 KiB
JavaScript

const EventEmitter = require("events");
const Reward = require("./Reward");
class Quest extends EventEmitter {
constructor(configuration, doneCallback) {
super();
this.id = configuration.id;
this.currentComplete = configuration.completedAmount;
this.maximumComplete = configuration.maximumComplete;
this.task = JSON.parse(JSON.stringify(configuration.task));
this.reward = new Reward({
distributionType: 2,
baseReward: configuration.reward
});
this.name = configuration.name || "Quest without a name";
this.finishedCount = 0;
this.totalTasksCount = Object.values(this.task).reduce((pre, cur) => pre + cur.length, 0);
this.doneCallback = doneCallback;
}
adjustTask(events, amount) {
events.forEach(type => {
const tasksInCategory = this.task[type.taskCategoryID];
if (!tasksInCategory) return
tasksInCategory.forEach(task => {
if (task.isFinished) return
if (type.typeID === task.typeID && type.entityTypeID === task.entityTypeID) {
task.amount += amount;
if (task.requiredAmount <= task.amount) {
task.amount = task.requiredAmount;
task.isFinished = true;
this.finishedCount++;
};
};
});
});
if (this.finishedCount === this.totalTasksCount) {
this.doneCallback(this.id);
};
}
getTasks() {
const taskTypes = Object.keys(this.task);
return taskTypes.map(t => this.task[t]);
}
getProgression() {
const taskTypes = Object.keys(this.task);
const progression = [];
taskTypes.forEach(t => this.task[t].forEach((c, i) => {
progression.push({ amount: c.amount, index: i, type: t });
}));
return progression;
}
};
module.exports = Quest;