82 lines
2.9 KiB
TypeScript
82 lines
2.9 KiB
TypeScript
// 武将升星表
|
||
import { decodeArrayListStr, parseNumberList, readFileAndParse } from '../util'
|
||
import { FILENAME } from '../../consts';
|
||
const _ = require('lodash');
|
||
|
||
export interface DicHeroTalent {
|
||
// 唯一id
|
||
readonly id: number;
|
||
// 天赋组id
|
||
readonly talentId: number;
|
||
// 节点层数
|
||
readonly nodeSort: number;
|
||
// 和其他节点关系
|
||
readonly relation: [{ type: number, ids?: number[] }];
|
||
// 节点等级数
|
||
readonly level: [{ lv: number, seid: number, cost: number }];
|
||
// 前置节点
|
||
readonly prepositionId: number[][];
|
||
// 需要满足在天赋树中累计消耗n点天赋点
|
||
readonly preTotalPoint: number;
|
||
// 在前置节点中消耗至少n点天赋点(在有多个前置节点时,取最高的1个)
|
||
readonly preSinglePoint: number;
|
||
}
|
||
|
||
|
||
type KeysEnum<T> = { [P in keyof Required<T>]: true };
|
||
const DicHeroTalentKeys: KeysEnum<DicHeroTalent> = {id: true, talentId: true, nodeSort: true, relation: true, level: true, prepositionId: true, preTotalPoint: true, preSinglePoint: true};
|
||
|
||
export const dicHeroTalent = new Map<number, DicHeroTalent>();
|
||
export const initTalents = new Map<number, number[]>();
|
||
export function loadHeroTalent() {
|
||
dicHeroTalent.clear();
|
||
initTalents.clear();
|
||
|
||
let arr = readFileAndParse(FILENAME.DIC_HERO_TALENT);
|
||
|
||
arr.forEach(o => {
|
||
o.relation = parseRelation(o.type, o.relationId);
|
||
o.level = parseLevel(o.levelCount, o.levelSeid, o.levelConsume);
|
||
o.prepositionId = parsePrePositionId(o.prepositionId);
|
||
dicHeroTalent.set(o.id, _.pick(o, Object.keys(DicHeroTalentKeys)));
|
||
if(o.prepositionId.length == 0 && o.levelConsume == '&') {
|
||
if(!initTalents.has(o.talentId)) {
|
||
initTalents.set(o.talentId, []);
|
||
}
|
||
initTalents.get(o.talentId).push(o.id);
|
||
}
|
||
});
|
||
arr = undefined;
|
||
}
|
||
|
||
function parseRelation(type: string, relationId: string) {
|
||
let relation: {type: number, ids?: number[]}[] = [];
|
||
let types = parseNumberList(type);
|
||
let relations = decodeArrayListStr(relationId);
|
||
for(let i = 0; i < types.length; i++) {
|
||
if(relations[i]) {
|
||
relation.push({
|
||
type: types[i],
|
||
ids: relations[i].map(id => parseInt(id))
|
||
});
|
||
}
|
||
}
|
||
return relation;
|
||
}
|
||
|
||
function parseLevel(levelCount: number, levelSeid: string, levelConsume: string) {
|
||
let levelSeids = parseNumberList(levelSeid);
|
||
let levelConsumes = parseNumberList(levelConsume);
|
||
let level: { lv: number, seid: number, cost: number }[] = [];
|
||
for(let i = 0; i < levelCount; i++) {
|
||
level.push({ lv: i + 1, seid: levelSeids[i]||0, cost: levelConsumes[i]||0});
|
||
}
|
||
return level;
|
||
}
|
||
|
||
function parsePrePositionId(str: string) {
|
||
let arr = decodeArrayListStr(str);
|
||
return arr.map(arr1 => {
|
||
return arr1.map(str => parseInt(str));
|
||
});
|
||
} |