mirror of
https://github.com/VickScarlet/lifeRestart.git
synced 2026-04-07 00:18:59 +08:00
103 lines
3.0 KiB
JavaScript
103 lines
3.0 KiB
JavaScript
import { clone } from './functions/util.js';
|
|
import { checkCondition, extractMaxTriggers } from './functions/condition.js';
|
|
|
|
class Talent {
|
|
constructor() {}
|
|
|
|
#talents;
|
|
|
|
// 初始化传参数去掉{}
|
|
initial(talents) {
|
|
this.#talents = talents;
|
|
for(const id in talents) {
|
|
const talent = talents[id];
|
|
talent.id= Number(id);
|
|
talent.grade = Number(talent.grade);
|
|
talent.max_triggers = extractMaxTriggers(talent.condition);
|
|
}
|
|
}
|
|
|
|
check(talentId, property) {
|
|
const { condition } = this.get(talentId);
|
|
return checkCondition(property, condition);
|
|
}
|
|
|
|
get(talentId) {
|
|
// console.log('talent.js get',talentId,this.#talents)
|
|
var talent
|
|
this.#talents.forEach(function(item){
|
|
if (item._id == talentId) {
|
|
talent = item
|
|
}
|
|
})
|
|
if(!talent) throw new Error(`[ERROR] No Talent[${talentId}]`);
|
|
return clone(talent);
|
|
}
|
|
|
|
information(talentId) {
|
|
const { grade, name, description } = this.get(talentId)
|
|
return { grade, name, description };
|
|
}
|
|
|
|
exclusive(talends, exclusiveId) {
|
|
const { exclusive } = this.get(exclusiveId);
|
|
if(!exclusive) return null;
|
|
for(const talent of talends) {
|
|
for(const e of exclusive) {
|
|
if(talent == e) return talent;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
talentRandom(include) {
|
|
// 1000, 100, 10, 1
|
|
const talentList = {};
|
|
for(const talentId in this.#talents) {
|
|
const { id, grade, name, description } = this.#talents[talentId];
|
|
if(id == include) {
|
|
include = { grade, name, description, id };
|
|
continue;
|
|
}
|
|
if(!talentList[grade]) talentList[grade] = [{ grade, name, description, id }];
|
|
else talentList[grade].push({ grade, name, description, id });
|
|
}
|
|
|
|
return new Array(10)
|
|
.fill(1).map((v, i)=>{
|
|
if(!i && include) return include;
|
|
const gradeRandom = Math.random();
|
|
let grade;
|
|
if(gradeRandom>=0.111) grade = 0;
|
|
else if(gradeRandom>=0.011) grade = 1;
|
|
else if(gradeRandom>=0.001) grade = 2;
|
|
else grade = 3;
|
|
|
|
while(talentList[grade].length == 0) grade--;
|
|
|
|
const length = talentList[grade].length;
|
|
|
|
const random = Math.floor(Math.random()*length) % length;
|
|
return talentList[grade].splice(random,1)[0];
|
|
});
|
|
}
|
|
|
|
allocationAddition(talents) {
|
|
if(Array.isArray(talents)) {
|
|
let addition = 0;
|
|
for(const talent of talents)
|
|
addition += this.allocationAddition(talent);
|
|
return addition;
|
|
}
|
|
return Number(this.get(talents).status) || 0;
|
|
}
|
|
|
|
do(talentId, property) {
|
|
const { effect, condition, grade, name, description } = this.get(talentId);
|
|
if(condition && !checkCondition(property, condition))
|
|
return null;
|
|
return { effect, grade, name, description };
|
|
}
|
|
}
|
|
|
|
export default Talent; |