战力:计算

This commit is contained in:
luying
2021-08-19 12:00:56 +08:00
parent c17afa200e
commit 90da4e3af2
2 changed files with 28 additions and 37 deletions

View File

@@ -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<number, number>();
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<number, number>();
// 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<number, number>();
@@ -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() {