mirror of
https://github.com/VickScarlet/lifeRestart.git
synced 2026-04-20 11:43:07 +08:00
72 lines
2.0 KiB
JavaScript
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; |