武将:职业天赋接口

This commit is contained in:
陆莹
2022-03-22 20:46:17 +08:00
parent 3c24e54350
commit 5d0040b8a8
20 changed files with 2811 additions and 1199 deletions

View File

@@ -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();

View 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));
});
}

View File

@@ -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;
}