属性:fix

This commit is contained in:
luying
2021-02-27 18:48:54 +08:00
parent 41f65eadd0
commit a0e87a9513
8 changed files with 83 additions and 70 deletions

View File

@@ -81,9 +81,9 @@ export class HeroHandler {
let curHero = await HeroModel.createHero({
roleId, serverId, roleName, hid, hName, star, quality, job, skins:[{id: initialSkin, enable: true}]
});
await calPlayerCeAndSave(HERO_SYSTEM_TYPE.INIT, sid, roleId, curHero, {});
let hero = await calPlayerCeAndSave(HERO_SYSTEM_TYPE.INIT, sid, roleId, curHero, {});
await calAllHeroCe(HERO_SYSTEM_TYPE.ADD_SKIN, sid, roleId, {}, [initialSkin])
return resResult(STATUS.SUCCESS, {curHero: returnHeroCeRatio(curHero)});
return resResult(STATUS.SUCCESS, {curHero: returnHeroCeRatio(hero)});
}
// 武将升级

View File

@@ -158,7 +158,6 @@ export class RoleHandler {
return resResult(STATUS.ROLE_TERAPH_NOT_QUILITY);
teraph.attr.set(attrId, 0);
console.log('****', attrId, val)
}
teraph.grade ++;

View File

@@ -127,7 +127,7 @@ export async function matchRobots(scale: number, myCe: number, robotCe: number,
const { attribute } = json;
let newAttribute = getRobotAttribute(attribute, myCe, robotCe, scale);
let ce = newAttribute.calCe();
let ce = newAttribute.calCelAndReduce();
enemyObj.enemies.push({...json, attribute: newAttribute, lv});
allCe += ce;
}
@@ -153,21 +153,6 @@ export async function getCEScaleAndRange(roleId: string, curDicExpedition: any)
return {scale, range, lv: role.lv}
}
// 远征表属性解码
export function decodeWarJsonAttribute(attribute: string) {
let arr = decodeStr('attribute', attribute);
// 初始化
let obj = {hp: 0, atk: 0, matk: 0, def: 0, mdef: 0, speed: 0, agi: 0, luk: 0, hit: 0, cri: 0, flee: 0, antCri: 0, damageIncrease: 0, damageDecrease: 0, defIngnore: 0, bloodSuck: 0}
for(let {id, value} of arr) {
let field = getAtrrNameById(id);
if(field) {
obj[field] = value;
}
}
return obj
}
// 远征累计点数获取
export async function getPointRewardStatus(roleId: string, role?: Role) {
if(!role) {

View File

@@ -14,6 +14,7 @@ import { RoleUpdate } from '../db/Role';
//修改并下发战力
export async function calPlayerCeAndSave(type: number, sid: string, roleId: string, originHero: HeroType, update: HeroUpdate, args?: Array<number>) {
let {role, pushHeros, topLineupCe, hero} = await pubCalPlayerCeAndSave(type, roleId, originHero, update, null, args);
console.log(JSON.stringify(pushHeros))
//下发战力
let uids = [{ uid: roleId, sid }];
pinus.app.get('channelService').pushMessageByUids('onPlayerCeUpdate', resResult(STATUS.SUCCESS, { ce: reduceCe(role.ce) , heros: pushHeros, topLineupCe: reduceCe(topLineupCe) }), uids);
@@ -23,7 +24,9 @@ export async function calPlayerCeAndSave(type: number, sid: string, roleId: stri
export async function calAllHeroCe(type:number, sid: string, roleId: string, update: RoleUpdate, args?:Array<number>) {
let {role, ce, pushHeros, topLineupCe } = await reCalAllHeroCe(type, roleId, update, args);
let uids = [{ uid: roleId, sid }];
pinus.app.get('channelService').pushMessageByUids('onPlayerCeUpdate', resResult(STATUS.SUCCESS, { ce: reduceCe(ce), heros: pushHeros, topLineupCe: reduceCe(topLineupCe) }), uids);
if(pushHeros.length > 0) {
let uids = [{ uid: roleId, sid }];
pinus.app.get('channelService').pushMessageByUids('onPlayerCeUpdate', resResult(STATUS.SUCCESS, { ce: reduceCe(ce), heros: pushHeros, topLineupCe: reduceCe(topLineupCe) }), uids);
}
return role;
}

View File

@@ -21,6 +21,7 @@ module.exports = {
"message Hero": {
'required uInt32 hid': 1,
'required uInt32 ce': 2,
'required uInt32 incHeroCe': 3,
},
'required uInt32 ce': 1,
'repeated Hero heros': 2,

View File

@@ -4,7 +4,7 @@ import { HERO_CE_RATIO, getAtrrNameById, CE_CONST, HERO_SUB_ATTR_RATIO } from '.
// hero表内属性基础格式
export class CeAttrData {
@prop({ required: true })
id?: number = 0;
id: number = 0;
@prop({ required: true })
base: number = 0;
@prop({ required: true })
@@ -13,16 +13,24 @@ export class CeAttrData {
fixUp: number = 0;
@prop({ required: true })
equipUp: number = 0;
constructor(id: number) {
this.id = id;
}
}
// role表属性格式
export class CeAttrDataRole {
@prop({ required: true })
id?: number = 0;
id: number = 0;
@prop({ required: true })
ratioUp: number = 0;
@prop({ required: true })
fixUp: number = 0;
constructor(id: number) {
this.id = id;
}
}
// 主属性
@@ -109,34 +117,51 @@ export class Attribute {
private setSubAttrRatio() {
return {
hit: this.hit / HERO_SUB_ATTR_RATIO,
cri: this.cri / HERO_SUB_ATTR_RATIO,
flee: this.flee / HERO_SUB_ATTR_RATIO,
antCri: this.antCri / HERO_SUB_ATTR_RATIO,
damageIncrease: this.damageIncrease / HERO_SUB_ATTR_RATIO,
damageDecrease: this.damageDecrease / HERO_SUB_ATTR_RATIO,
defIngnore: this.defIngnore / HERO_SUB_ATTR_RATIO,
damageCri: this.damageCri / HERO_SUB_ATTR_RATIO
hit: this.hit / HERO_SUB_ATTR_RATIO / HERO_CE_RATIO / HERO_CE_RATIO,
cri: this.cri / HERO_SUB_ATTR_RATIO / HERO_CE_RATIO / HERO_CE_RATIO,
flee: this.flee / HERO_SUB_ATTR_RATIO / HERO_CE_RATIO / HERO_CE_RATIO,
antCri: this.antCri / HERO_SUB_ATTR_RATIO / HERO_CE_RATIO / HERO_CE_RATIO,
damageIncrease: this.damageIncrease / HERO_SUB_ATTR_RATIO / HERO_CE_RATIO / HERO_CE_RATIO,
damageDecrease: this.damageDecrease / HERO_SUB_ATTR_RATIO / HERO_CE_RATIO / HERO_CE_RATIO,
defIngnore: this.defIngnore / HERO_SUB_ATTR_RATIO / HERO_CE_RATIO / HERO_CE_RATIO,
damageCri: this.damageCri / HERO_SUB_ATTR_RATIO / HERO_CE_RATIO / HERO_CE_RATIO
}
}
public calCe() {
let { cri, flee, damageIncrease, damageDecrease, damageCri } = this.setSubAttrRatio();
private setMainAttrRatio() {
return {
hp: this.hp / HERO_CE_RATIO / HERO_CE_RATIO,
atk: this.atk / HERO_CE_RATIO / HERO_CE_RATIO,
def: this.def / HERO_CE_RATIO / HERO_CE_RATIO,
mdef: this.mdef / HERO_CE_RATIO / HERO_CE_RATIO
}
}
let hitRate = CE_CONST.HIT_RATE_BASE + CE_CONST.PUT_HIT/2 - flee; // 命中率
// 战力计算
public calCe() {
let { hp, atk, def, mdef } = this.setMainAttrRatio();
let { cri, flee, damageIncrease, damageDecrease, damageCri } = this.setSubAttrRatio();
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 - CE_CONST.PUT_ANT_CRI/2;
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 = this.hp + (this.def + this.mdef) * 0.5 / ((1 - fleeRate * CE_CONST.FLEE_VALUE) * (1 - damageDecrease)); // 有效生命
let validAtk = this.atk * hitRate * ( 1 + criRate * criValue) * ( 1 + damageIncrease); // 有效输出
let ce = Math.floor(validHp * validAtk);
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);
return ce > 0? ce: 1;
}
public calCelAndReduce() {
return Math.floor(this.calCe() / HERO_CE_RATIO / HERO_CE_RATIO);
}
}

View File

@@ -46,12 +46,8 @@ function parseBaseAbilityArr(json) {
let map = new Map<number, number>();
map.set(ABI_TYPE.ABI_HP, json.hp||0);
map.set(ABI_TYPE.ABI_ATK, json.atk||0);
map.set(ABI_TYPE.ABI_MATK, json.matk||0);
map.set(ABI_TYPE.ABI_DEF, json.def||0);
map.set(ABI_TYPE.ABI_MDEF, json.mdef||0);
map.set(ABI_TYPE.ABI_AGI, json.agi||0);
map.set(ABI_TYPE.ABI_LUK, json.luk||0);
map.set(ABI_TYPE.ABI_SPEED, json.speed||0);
return map
}
@@ -59,11 +55,7 @@ function parseBaseAbilityUpArr(json) {
let map = new Map<number, number>();
map.set(ABI_TYPE.ABI_HP, json.hp_up||0);
map.set(ABI_TYPE.ABI_ATK, json.atk_up||0);
map.set(ABI_TYPE.ABI_MATK, json.matk_up||0);
map.set(ABI_TYPE.ABI_DEF, json.def_up||0);
map.set(ABI_TYPE.ABI_MDEF, json.mdef_up||0);
map.set(ABI_TYPE.ABI_AGI, json.agi_up||0);
map.set(ABI_TYPE.ABI_LUK, json.luk_up||0);
map.set(ABI_TYPE.ABI_SPEED, json.speed_up||0);
return map
}

View File

@@ -233,12 +233,16 @@ export async function calculatetopLineup(role: RoleType, hid?: number, ce?: numb
* @param {number[]} removeSeidList 用于更新被动
*/
export function calHeroInitIncAttr(hero: HeroType, addSeidList: Array<number>, removeSeidList: Array<number>) {
let originHero = new HeroModel();
let heroAttrs = calHeroStarIncAttr(originHero, hero, HERO_SYSTEM_TYPE.INIT, addSeidList, removeSeidList);
let curSkin = hero.skins.find(cur => cur.enable);
heroAttrs = calHeroWearSkinIncAttr(hero, curSkin ? curSkin.id : 0, 0, addSeidList, removeSeidList, true);
heroAttrs = calHeroJobAttr(originHero, hero, addSeidList, removeSeidList);
return heroAttrs;
try{
delete hero._id;
let heroAttrs = calHeroStarIncAttr(hero, hero, HERO_SYSTEM_TYPE.INIT, addSeidList, removeSeidList);
let curSkin = hero.skins.find(cur => cur.enable);
heroAttrs = calHeroWearSkinIncAttr(hero, curSkin ? curSkin.id : 0, 0, addSeidList, removeSeidList, true);
heroAttrs = calHeroJobAttr(hero, hero, addSeidList, removeSeidList);
return heroAttrs;
}catch(e) {
console.error(e);
}
}
/**
@@ -271,13 +275,14 @@ function calHeroAddSkin(role: RoleType, skinIds: Array<number>) {
export function calHeroStarIncAttr(originHero: HeroType, update: HeroUpdate, type: number, addSeidList: Array<number>, removeSeidList: Array<number>) {
let isInit = type == HERO_SYSTEM_TYPE.INIT;
let { hid, star: originStar, starStage: originStarStage, quality: originQuality, colorStar: originColorStar, colorStarStage: originColorStarStage, attr: heroAttrs, skins, lv } = originHero;
let { star = originStar, starStage = originStarStage, quality = originQuality, colorStar = originStarStage, colorStarStage = originColorStarStage } = update;
let { star = originStar, starStage = originStarStage, quality = originQuality, colorStar = originColorStar, colorStarStage = originColorStarStage } = update;
const dicHero = gameData.hero.get(hid);
const isWake = colorStar > 0; // 是否觉醒,只要激活了觉醒,彩星就会 > 1
const isFirstWake = colorStar > 0 && originColorStar <= 0; // 是否是初次觉醒
const isUpStar = originStarStage + 1 != starStage; // 如果升星了starStage会变成0
const isUpStar = originStar != star || originColorStar != colorStar; // 是否有升星
console.log('*isUpstar', isUpStar, originStar, star, originColorStar, colorStar)
const dicStar = isWake ? getHeroWakeByQuality(dicHero.quality, originColorStar) : getHeroStarByQuality(quality, originStar); // 星级表
@@ -287,7 +292,7 @@ export function calHeroStarIncAttr(originHero: HeroType, update: HeroUpdate, typ
} else if (type == HERO_SYSTEM_TYPE.LVUP) {
stages = getAllAttrStage();
} else if (type == HERO_SYSTEM_TYPE.STAR) {
stages = [isUpStar ? ABI_STAGE.END : starStage];
stages.push(isUpStar? ABI_STAGE.END: starStage);
} else if (type == HERO_SYSTEM_TYPE.QUALITY) {
stages = getAllAttrStage();
} else if (type = HERO_SYSTEM_TYPE.COLORSTAR) {
@@ -335,7 +340,7 @@ type updateCeAttr = Partial<CeAttrData>;
function updateHeroAttr(heroAttrs: CeAttrData[], id: number, update: { inc?: updateCeAttr, set?: updateCeAttr }) {
let curAttr = heroAttrs.find(cur => cur.id == id);
if(!curAttr) {
curAttr = new CeAttrData();
curAttr = new CeAttrData(id);
heroAttrs.push(curAttr);
}
if(update.inc) {
@@ -358,7 +363,7 @@ type updateCeAttrRole = Partial<CeAttrDataRole>;
function updateRoleAttr(roleAttrs: CeAttrDataRole[], id: number, update: { inc?: updateCeAttrRole, set?: updateCeAttrRole }) {
let curAttr = roleAttrs.find(cur => cur.id == id);
if(!curAttr) {
curAttr = new CeAttrDataRole();
curAttr = new CeAttrDataRole(id);
roleAttrs.push(curAttr);
}
if(update.inc) {
@@ -999,19 +1004,21 @@ function calHeroCeScrollIncAttr(originHero: HeroType, update: HeroUpdate) {
*/
function calTitle(role: RoleType, update: RoleUpdate) {
let { title: oldTitle, attr: roleAttrs } = role;
let { title = oldTitle } = update;
let { title: newTitle = oldTitle } = update;
let dicTitle = gameData.title.get(title);
if(!dicTitle) return null;
for (let i = ABI_TYPE.ABI_HP; i < ABI_TYPE.ABI_MAX; i++) {
if(dicTitle.mainAttrValue.has(i)) {
let fixUp = dicTitle.mainAttrValue.get(i) * HERO_CE_RATIO;
updateRoleAttr(roleAttrs, i, { inc: { fixUp }});
}
if(dicTitle.assiAttrValue.has(i)) {
let fixUp = dicTitle.assiAttrValue.get(i) * HERO_CE_RATIO;
updateRoleAttr(roleAttrs, i, { inc: { fixUp }});
for(let title = oldTitle; title <= newTitle; title++) {
let dicTitle = gameData.title.get(title);
if(!dicTitle) break;
for (let i = ABI_TYPE.ABI_HP; i < ABI_TYPE.ABI_MAX; i++) {
if(dicTitle.mainAttrValue.has(i)) {
let fixUp = dicTitle.mainAttrValue.get(i) * HERO_CE_RATIO;
updateRoleAttr(roleAttrs, i, { inc: { fixUp }});
}
if(dicTitle.assiAttrValue.has(i)) {
let fixUp = dicTitle.assiAttrValue.get(i) * HERO_CE_RATIO;
updateRoleAttr(roleAttrs, i, { inc: { fixUp }});
}
}
}
@@ -1080,5 +1087,6 @@ function calTeraphAssistAttr(role: RoleType, update: RoleUpdate, id: number) {
* @param role
*/
export function initRoleAtrr(role: RoleType) {
calTitle(role, role); // 计算初始爵位带来的全局
delete role._id;
calTitle({...role, title: 0}, role); // 计算初始爵位带来的全局
}