武将:职业天赋接口
This commit is contained in:
@@ -33,10 +33,12 @@ export interface DicHero {
|
||||
readonly recruit: boolean;
|
||||
// 武将图标id
|
||||
readonly face_id: string;
|
||||
// 天赋树id
|
||||
readonly talentId: number;
|
||||
}
|
||||
|
||||
type KeysEnum<T> = { [P in keyof Required<T>]: true };
|
||||
const DicHeroKeys: KeysEnum<DicHero> = {heroId: true, name: true, quality: true, camp: true, jobClass: true, jobid: true, skill: true, pieceId: true, initialStars: true, pieceCount: true, baseAbilityArr: true, baseAbilityUpArr: true, initialSkin: true, recruit: true, face_id: true};
|
||||
const DicHeroKeys: KeysEnum<DicHero> = {heroId: true, name: true, quality: true, camp: true, jobClass: true, jobid: true, skill: true, pieceId: true, initialStars: true, pieceCount: true, baseAbilityArr: true, baseAbilityUpArr: true, initialSkin: true, recruit: true, face_id: true, talentId: true};
|
||||
export const dicHero = new Map<number, DicHero>();
|
||||
export function loadHero() {
|
||||
dicHero.clear();
|
||||
|
||||
81
shared/pubUtils/dictionary/DicHeroTalent.ts
Normal file
81
shared/pubUtils/dictionary/DicHeroTalent.ts
Normal file
@@ -0,0 +1,81 @@
|
||||
// 武将升星表
|
||||
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();
|
||||
|
||||
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));
|
||||
});
|
||||
}
|
||||
@@ -17,8 +17,8 @@ export interface DicJob {
|
||||
readonly job_class: number;
|
||||
// 职业类别
|
||||
readonly type: number;
|
||||
// 特性
|
||||
readonly seid: Array<number>;
|
||||
// // 特性
|
||||
// readonly seid: Array<number>;
|
||||
// 训练消耗
|
||||
readonly trainingConsume: Array<RewardInter>;
|
||||
// 升阶消耗
|
||||
@@ -27,15 +27,17 @@ export interface DicJob {
|
||||
readonly ceAttr: Map<number, {id: number, attr: number}>;
|
||||
// 一共有多少阶升级
|
||||
readonly maxStage: number;
|
||||
|
||||
// 到这一阶能获得多少天赋点
|
||||
readonly talentPoint: number;
|
||||
}
|
||||
|
||||
type KeysEnum<T> = { [P in keyof Required<T>]: true };
|
||||
const DicJobKeys: KeysEnum<DicJob> = {jobid: true, name: true, grade: true, unlockLevel: true, job_class: true, type: true, seid: true,trainingConsume: true, upGradeConsume: true, ceAttr: true, maxStage: true};
|
||||
const DicJobKeys: KeysEnum<DicJob> = {jobid: true, name: true, grade: true, unlockLevel: true, job_class: true, type: true, trainingConsume: true, upGradeConsume: true, ceAttr: true, maxStage: true, talentPoint: true};
|
||||
|
||||
export const dicJob = new Map<number, DicJob>();
|
||||
export const jobClassMaxGrades = new Map<number, {grade:number, jobid:number}>();
|
||||
export const jobClassAndgrades = new Map<string, {jobid:number, unlockLevel:number}>();
|
||||
export const talentPointOfJob = new Map<number, number>();
|
||||
|
||||
export function loadJob() {
|
||||
dicJob.clear();
|
||||
@@ -43,6 +45,7 @@ export function loadJob() {
|
||||
jobClassAndgrades.clear();
|
||||
|
||||
let arr = readFileAndParse(FILENAME.DIC_JOB);
|
||||
let jobByJobClass = new Map<number, number[]>(); // jobClass => jobid[]
|
||||
|
||||
arr.forEach(o => {
|
||||
if(o.isPlayer) {
|
||||
@@ -56,9 +59,25 @@ export function loadJob() {
|
||||
if (!jobClass || jobClass.grade < o.grade) {
|
||||
jobClassMaxGrades.set(o.job_class, {grade: o.grade,jobid: o.jobid});
|
||||
}
|
||||
jobClassAndgrades.set(o.job_class+'_'+o.grade,{unlockLevel:o.unlockLevel, jobid:o.jobid});
|
||||
jobClassAndgrades.set(o.job_class+'_'+o.grade,{unlockLevel:o.unlockLevel, jobid:o.jobid});
|
||||
if(!jobByJobClass.has(o.job_class)) {
|
||||
jobByJobClass.set(o.job_class, []);
|
||||
}
|
||||
jobByJobClass.get(o.job_class).push(o.jobid);
|
||||
}
|
||||
});
|
||||
for(let [_, { job_class, talentPoint }] of dicJob) {
|
||||
let jobs = jobByJobClass.get(job_class)||[];
|
||||
for(let jobid of jobs) {
|
||||
if(!talentPointOfJob.has(jobid)) {
|
||||
talentPointOfJob.set(jobid, talentPoint);
|
||||
} else {
|
||||
talentPointOfJob.set(jobid, talentPointOfJob.get(jobid) + talentPoint);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
jobByJobClass = undefined;
|
||||
arr = undefined;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user