diff --git a/shared/domain/roleField/attribute.ts b/shared/domain/roleField/attribute.ts index 9c45de346..37373a7cf 100644 --- a/shared/domain/roleField/attribute.ts +++ b/shared/domain/roleField/attribute.ts @@ -1,5 +1,6 @@ import { prop } from '@typegoose/typegoose'; -import { HERO_CE_RATIO, getAtrrNameById, CE_CONST, HERO_SUB_ATTR_RATIO, ABI_TYPE_MAIN } from '../../consts'; +import { HERO_CE_RATIO, getAtrrNameById, ABI_TYPE_MAIN } from '../../consts'; +import { gameData } from '../../pubUtils/data'; import { decodeArrayListStr, reduceCe } from '../../pubUtils/util'; // hero表内属性基础格式 @@ -84,17 +85,17 @@ export class AttributeCal { return (heroFix + heroEquip + roleFix) * HERO_CE_RATIO + heroBase * ( HERO_CE_RATIO + heroRatio + roleRatio ); } - private getRealAttrToMap() { - let newMap = new Map(); - for(let [id, val] of this.attrs) { - if(ABI_TYPE_MAIN.includes(id)) { // 主属性 - newMap.set(id, val / HERO_CE_RATIO / HERO_CE_RATIO); - } else { - newMap.set(id, val / HERO_SUB_ATTR_RATIO / HERO_CE_RATIO / HERO_CE_RATIO); - } - } - return newMap; - } + // private getRealAttrToMap() { + // let newMap = new Map(); + // for(let [id, val] of this.attrs) { + // if(ABI_TYPE_MAIN.includes(id)) { // 主属性 + // newMap.set(id, val / HERO_CE_RATIO / HERO_CE_RATIO); + // } else { + // newMap.set(id, val / HERO_SUB_ATTR_RATIO / HERO_CE_RATIO / HERO_CE_RATIO); + // } + // } + // return newMap; + // } private getReduceAttrMap() { let newMap = new Map(); @@ -130,30 +131,11 @@ export class AttributeCal { // 战力计算 public calCe() { - let attrMap = this.getRealAttrToMap(); - let attrs = new Attribute(); - attrs.setByMap(attrMap); - - let { hp, atk, def, mdef, cri, flee, damageIncrease, damageDecrease, damageCri } = attrs; - - let putHit = CE_CONST.PUT_HIT / HERO_SUB_ATTR_RATIO; - let putAntCri = CE_CONST.PUT_ANT_CRI / HERO_SUB_ATTR_RATIO; - - let hitRate = CE_CONST.HIT_RATE_BASE + putHit/2 - flee; // 命中率 - if(hitRate > CE_CONST.HIT_RATE_MAX) hitRate = CE_CONST.HIT_RATE_MAX; - if(hitRate < CE_CONST.HIT_RATE_MIN) hitRate = CE_CONST.HIT_RATE_MIN; - let fleeRate = 1 - hitRate; // 格挡率 - - let criRate = CE_CONST.CRI_RATE_BASE + cri - putAntCri/2; - if(criRate > CE_CONST.CRI_RATE_MAX) criRate = CE_CONST.CRI_RATE_MAX; - if(criRate < CE_CONST.CRI_RATE_MIN) criRate = CE_CONST.CRI_RATE_MIN; - - let criValue = CE_CONST.CRI_VALUE_BASE + damageCri; - - let validHp = hp + (def + mdef) * 0.5 / ((1 - fleeRate * CE_CONST.FLEE_VALUE) * (1 - damageDecrease)); // 有效生命 - let validAtk = atk * hitRate * ( 1 + criRate * criValue) * ( 1 + damageIncrease); // 有效输出 - let ce = Math.floor(validHp * validAtk * HERO_CE_RATIO * HERO_CE_RATIO / 1000); - return ce > 0? ce: 1; + let ce = gameData.ceRatio.reduce((pre, cur) => { + let { type, val } = cur; + return pre + val * (this.attrs.get(type)|| 0) + }, 0); + return Math.floor(ce); } public calCelAndReduce() { diff --git a/shared/pubUtils/data.ts b/shared/pubUtils/data.ts index 74467bf1a..7105368f6 100644 --- a/shared/pubUtils/data.ts +++ b/shared/pubUtils/data.ts @@ -223,7 +223,8 @@ export const gameData = { quenchRangeByQualityAndGrade: dicQuenchRangeByQualityAndGrade, quenchConsume: dicQuenchConsume, quenchByQuality: dicQuenchByQuality, - equipAttributeRatio: new Map() + equipAttributeRatio: new Map(), + ceRatio: new Array<{type: number, val: number}>() }; // 在此提供一些原先在gamedata中提供的方法,以便更方便获取gameData数据 @@ -673,6 +674,13 @@ function getHeroTransPiece() { gameData.heroTransPiece = newMap } +function getCeRatio() { + let arr = decodeArrayListStr(param.ATTRIBUTE.ATTRIBUTE_POWER); + gameData.ceRatio = arr.map(cur => { + return { type: parseInt(cur[0]), val: parseInt(cur[1]) } + }); +} + // 根据groupId获得当前大区名 export function getServerGroupName(groupId: number) { @@ -768,6 +776,7 @@ function parseDicParam() { getGachaTurntablePercent(); getHeroTransPiece(); parseComBtlLvRange(); + getCeRatio(); } // 加载json