diff --git a/shared/consts/constModules/abilityConst.ts b/shared/consts/constModules/abilityConst.ts index aad3b340d..aa1686ab3 100644 --- a/shared/consts/constModules/abilityConst.ts +++ b/shared/consts/constModules/abilityConst.ts @@ -94,6 +94,10 @@ export enum ABI_STAGE { END = 4 } +export enum ABI_JOB_STAGE { + START = 0, + END = 6 +} export const ATTR = {} export const HERO_ATTR = { diff --git a/shared/pubUtils/dictionary/DicJob.ts b/shared/pubUtils/dictionary/DicJob.ts index 65baa2697..e2e90e626 100644 --- a/shared/pubUtils/dictionary/DicJob.ts +++ b/shared/pubUtils/dictionary/DicJob.ts @@ -1,5 +1,5 @@ // 兵种表 -import { readFileAndParse, parseNumberList, parseGoodStr} from '../util' +import { readFileAndParse, parseNumberList, parseGoodStr, decodeArrayListStr} from '../util' import { FILENAME, ABI_STAGE } from '../../consts' import { RewardInter } from '../interface'; const _ = require('lodash'); @@ -24,7 +24,7 @@ export interface DicJob { // 升阶消耗 readonly upGradeConsume: Array; // 每阶升级属性 - readonly ceAttr: Map + readonly ceAttr: Map } @@ -43,7 +43,7 @@ export function loadJob() { o.seid = parseNumberList(o.seid); o.trainingConsume = parseGoodStr(o.trainingConsume); o.upGradeConsume = parseGoodStr(o.upGradeConsume); - o.ceAttr = parseCeAttr(o); + o.ceAttr = parseCeAttr(o.attr); dicJob.set(o.jobid, _.pick(o, Object.keys(DicJobKeys))); let jobClass = jobClassMaxGrades.get(o.job_class); if (!jobClass || jobClass.grade < o.grade) { @@ -55,11 +55,16 @@ export function loadJob() { arr = undefined; } -function parseCeAttr(elem) { - let ceAttr = new Map(); - ceAttr.set(ABI_STAGE.HP, elem.hp); - ceAttr.set(ABI_STAGE.ATK, elem.atk); - ceAttr.set(ABI_STAGE.DEF, elem.def); - ceAttr.set(ABI_STAGE.MDEF, elem.mdef); - return ceAttr; +function parseCeAttr(str: string) { + let result = new Map(); + if (!str) return result; + let decodeArr = decodeArrayListStr(str); + for (let i = 0; i < decodeArr.length; i++) { + let [id, attr] = decodeArr[i]; + if (isNaN(parseInt(id)) || isNaN(parseInt(attr))) { + throw new Error('data table format wrong'); + } + result.set(i, { id: parseInt(id), attr: parseFloat(attr) }); + } + return result } \ No newline at end of file diff --git a/shared/pubUtils/playerCe.ts b/shared/pubUtils/playerCe.ts index 9aa74f2ec..8cb9a6d98 100644 --- a/shared/pubUtils/playerCe.ts +++ b/shared/pubUtils/playerCe.ts @@ -14,7 +14,7 @@ import { DicSe } from './dictionary/DicSe'; import { EquipType } from '../db/Equip'; import { DicRandomEffectPool } from './dictionary/DicRandomEffectPool'; import { SchoolModel } from '../db/School'; -import { ABI_TYPE_TO_STAGE, ABI_TYPE_MAIN } from '../consts/constModules/abilityConst' +import { ABI_TYPE_TO_STAGE, ABI_TYPE_MAIN, ABI_JOB_STAGE } from '../consts/constModules/abilityConst' import { PvpDefenseModel } from '../db/PvpDefense'; import { findIndex } from 'underscore'; import { GuildModel } from '../db/Guild'; @@ -443,16 +443,17 @@ export function calHeroTrainIncAttr(originHero: HeroType, update: HeroUpdate) { let { attr: heroAttrs, job: oldJob, jobStage: oldJobStage } = originHero; let { job = oldJob, jobStage = oldJobStage } = update; - let targetAttrId = ABI_TYPE_TO_STAGE.get(jobStage); // 转换为18维的属性id - let dicJob = gameData.job.get(job); + if (dicJob.grade > 1) { let jobGradeAndClass = getJobByGradeAndClass(dicJob.job_class, dicJob.grade - 1); let lastJob = gameData.job.get(jobGradeAndClass.jobid); - let inc = (dicJob.ceAttr.get(jobStage) - lastJob.ceAttr.get(jobStage)) * HERO_CE_RATIO; + let targetAttrId = dicJob.ceAttr.get(jobStage).id; + let inc = (dicJob.ceAttr.get(jobStage).attr - lastJob.ceAttr.get(jobStage).attr) * HERO_CE_RATIO; updateHeroAttr(heroAttrs, targetAttrId, { inc: { fixUp: inc } }) } else { - let inc = dicJob.ceAttr.get(jobStage) * HERO_CE_RATIO; + let targetAttrId = dicJob.ceAttr.get(jobStage).id; + let inc = dicJob.ceAttr.get(jobStage).attr * HERO_CE_RATIO; updateHeroAttr(heroAttrs, targetAttrId, { inc: { fixUp: inc } }) } return heroAttrs; @@ -505,14 +506,15 @@ export function calHeroJobAttr(originHero: HeroType, hero: HeroUpdate, addSeidLi lastJob = gameData.job.get(jobGradeAndClass.jobid); } - for (let stage = ABI_STAGE.START + 1; stage <= ABI_STAGE.END; stage++) { - let targetAttrId = ABI_TYPE_TO_STAGE.get(stage); + for (let stage = ABI_JOB_STAGE.START; stage < ABI_JOB_STAGE.END; stage++) { if(hero.jobStage >= stage) { - let fixUp = currentJob.ceAttr.get(stage) * HERO_CE_RATIO; + let targetAttrId = currentJob.ceAttr.get(stage).id; + let fixUp = currentJob.ceAttr.get(stage).attr * HERO_CE_RATIO; updateHeroAttr(heroAttrs, targetAttrId, { inc: { fixUp }}) } else { if(lastJob) { - let fixUp = lastJob.ceAttr.get(stage) * HERO_CE_RATIO; + let targetAttrId = lastJob.ceAttr.get(stage).id; + let fixUp = lastJob.ceAttr.get(stage).attr * HERO_CE_RATIO; updateHeroAttr(heroAttrs, targetAttrId, { inc: { fixUp } }); } }