From 83bc909fd805af6f5e006a5c39dedf8616d1318d Mon Sep 17 00:00:00 2001 From: luying Date: Wed, 8 Jun 2022 13:17:11 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=BB=E6=88=90=EF=BC=9A=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E6=AD=A6=E5=B0=86=E5=8D=87=E9=98=B6=E7=9A=84=E6=97=B6=E5=80=99?= =?UTF-8?q?=E6=88=98=E5=8A=9B=E5=8F=8D=E8=80=8C=E4=B8=8B=E9=99=8D=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game-server/app/services/role/calCe.ts | 20 +++----------- shared/pubUtils/dictionary/DicJob.ts | 36 ++++++++++++++++++++++---- 2 files changed, 35 insertions(+), 21 deletions(-) diff --git a/game-server/app/services/role/calCe.ts b/game-server/app/services/role/calCe.ts index dea778c72..50c8a68ef 100644 --- a/game-server/app/services/role/calCe.ts +++ b/game-server/app/services/role/calCe.ts @@ -159,23 +159,11 @@ export class CalCe { // 职业基础 public setJob(hid: number, job: number, jobStage: number) { - this.data.clearHeroAttrByHid(hid, 'job'); - this.data.clearHeroAttrByHid(hid, 'subBase'); const dicJob = gameData.job.get(job); - let lastJob = getJobByGradeAndClass(dicJob.job_class, dicJob.grade - 1); - let dicLastJob = lastJob? gameData.job.get(lastJob.jobid): null; - for(let i = 1; i <= (dicJob.maxStage||dicLastJob.maxStage); i++) { - if(jobStage >= i) { - let { id, attr } = dicJob.ceAttr.get(i); - let heroAttr = this.data.getHeroAttrByHidAndId(hid, id); - heroAttr.job = attr; - } else { - if(dicLastJob) { - let { id, attr } = dicLastJob.ceAttr.get(i); - let heroAttr = this.data.getHeroAttrByHidAndId(hid, id); - heroAttr.job = attr; - } - } + let ceAttr = dicJob.ceAttr.get(jobStage)||[]; + for(let { id, attr } of ceAttr) { + let heroAttr = this.data.getHeroAttrByHidAndId(hid, id); + heroAttr.job = attr; } for(let { id, val } of dicJob.baseSubAttr) { let heroAttr = this.data.getHeroAttrByHidAndId(hid, id); diff --git a/shared/pubUtils/dictionary/DicJob.ts b/shared/pubUtils/dictionary/DicJob.ts index e9ad50ee3..72785f1e8 100644 --- a/shared/pubUtils/dictionary/DicJob.ts +++ b/shared/pubUtils/dictionary/DicJob.ts @@ -24,7 +24,7 @@ export interface DicJob { // 升阶消耗 readonly upGradeConsume: Array; // 每阶升级属性 stage => {} - readonly ceAttr: Map; + readonly ceAttr: Map; // 次级属性基础 attr => value attr1 readonly baseSubAttr: {id: number, val: number}[]; // 一共有多少阶升级 @@ -49,6 +49,7 @@ export function loadJob() { let arr = readFileAndParse(FILENAME.DIC_JOB); // let jobByJobClass = new Map(); // jobClass => jobid[] + let lastJob: DicJob; arr.forEach(o => { if(o.isPlayer) { @@ -56,7 +57,7 @@ export function loadJob() { o.trainingConsume = parseGoodStr(o.trainingConsume); o.maxStage = o.trainingConsume.length; o.upGradeConsume = parseGoodStr(o.upGradeConsume); - o.ceAttr = parseCeAttr(o.maxStage, o.attr); + o.ceAttr = parseCeAttr(o.maxStage, o.attr, lastJob, o.job_class); o.baseSubAttr = parseAttribute(o.baseAttr||''); dicJob.set(o.jobid, _.pick(o, Object.keys(DicJobKeys))); let jobClass = jobClassMaxGrades.get(o.job_class); @@ -69,6 +70,7 @@ export function loadJob() { // } // jobByJobClass.get(o.job_class).push(o.jobid); talentPointOfJob.set(o.jobid, o.talentPoint); + lastJob = o; } }); // for(let [_, { job_class, talentPoint }] of dicJob) { @@ -86,16 +88,40 @@ export function loadJob() { arr = undefined; } -function parseCeAttr(maxStage: number, str: string) { - let result = new Map(); +function parseCeAttr(maxStage: number, str: string, lastJob: DicJob, job_class: number) { + let result = new Map(); + for (let i = 1; i <= maxStage; i++) { + if(lastJob && lastJob.job_class == job_class && lastJob.ceAttr && lastJob.ceAttr.has(maxStage)) { + let attrs: { id: number, attr: number }[] = []; + for(let { id, attr} of lastJob.ceAttr.get(maxStage)||[]) { + attrs.push({ id, attr }); + } + result.set(i, attrs) + } else { + result.set(i, []); + } + } if (!str) return result; let decodeArr = decodeArrayListStr(str); for (let i = 1; i <= maxStage; i++) { let [id, attr] = decodeArr[i - 1]||[i.toString(), "0"]; + let _id = parseInt(id); + let _attr = parseFloat(attr); + if (isNaN(parseInt(id)) || isNaN(parseInt(attr))) { throw new Error('data table format wrong'); } - result.set(i, { id: parseInt(id), attr: parseFloat(attr) }); + for(let j = i; j <= maxStage; j++) { + let arr = result.get(j)||[]; + let index = arr.findIndex(cur => cur.id == _id); + if(index == -1) { + arr.push({ id: _id, attr: _attr }); + } else { + arr[index].attr = _attr; + } + + result.set(j, arr); + } } return result }