Files
lifeRestart/src/modules/achievement.js
T
2022-01-27 16:04:55 +08:00

72 lines
2.0 KiB
JavaScript

class Achievement {
constructor(system) {
this.#system = system;
}
// 时机
Opportunity = {
START: "START", // 分配完成点数,点击开始新人生后
TRAJECTORY: "TRAJECTORY", // 每一年的人生经历中
SUMMARY: "SUMMARY", // 人生结束,点击人生总结后
END: "END", // 游戏完成,点击重开 重开次数在这之后才会+1
};
#system;
#achievements;
initial({achievements}) {
this.#achievements = achievements;
return this.count;
}
get count() {
return Object.keys(this.#achievements).length;
}
get #prop() {
return this.#system.request(this.#system.Module.PROPERTY);
}
list() {
return Object
.values(this.#achievements)
.map(({
id, name, opportunity,
description, hide, grade,
})=>({
id, name, opportunity,
description, hide, grade,
isAchieved: this.isAchieved(id, this.#prop),
}));
}
get(achievementId) {
const achievement = this.#achievements[achievementId];
if(!achievement) throw new Error(`[ERROR] No Achievement[${achievementId}]`);
return this.#system.clone(achievement);
}
check(achievementId) {
const { condition } = this.get(achievementId);
return this.#system.check(condition);
}
isAchieved(achievementId) {
for(const [achieved] of (this.#prop.get(this.#prop.TYPES.ACHV)||[]))
if(achieved == achievementId) return true;
return false;
}
achieve(opportunity) {
this.list()
.filter(({isAchieved})=>!isAchieved)
.filter(({opportunity: o})=>o==opportunity)
.filter(({id})=>this.check(id, this.#prop))
.forEach(({id})=>{
this.#prop.achieve(this.#prop.TYPES.ACHV, id)
$$event('achievement', this.get(id))
});
}
}
export default Achievement;