diff --git a/game-server/app/servers/role/handler/heroHandler.ts b/game-server/app/servers/role/handler/heroHandler.ts index 32d559aff..4a351de0f 100644 --- a/game-server/app/servers/role/handler/heroHandler.ts +++ b/game-server/app/servers/role/handler/heroHandler.ts @@ -4,8 +4,8 @@ import { calPlayerCeAndSave } from '../../../services/playerCeService'; import { resResult, getItems, decodeStr } from '../../../pubUtils/util'; import { STATUS } from '../../../consts/statusCode'; import {HeroModel} from '../../../db/Hero'; -import {CURRENCY_BY_TYPE, CURRENCY_TYPE, ITID, CONSUME_TYPE, HERO_GROW_MAX} from '../../../consts/consts'; -import {getJobInfoById, getMaxGradeByjobClass, getHidAndLevelByShipId, getHeroInfoById, getGoodById, getHeroExpByLv, getGamedata, getJobByGradeAndClass, getFriendShipById, getFriendShipLevels, getFashionsById} from '../../../pubUtils/gamedata'; +import {CURRENCY_BY_TYPE, CURRENCY_TYPE, ITID, CONSUME_TYPE, HERO_GROW_MAX, HERO_SYSTEM_TYPE} from '../../../consts/consts'; +import {getJobInfoById, getMaxGradeByjobClass, getHidAndLevelByShipId, getHeroInfoById, getGoodById, getHeroExpByLv, getGamedata, getJobByGradeAndClass, getFriendShipById, getFriendShipLevels, getFashionsById, getHeroLvByExp} from '../../../pubUtils/gamedata'; import { ABI_STAGE } from '../../../consts/abilityConst'; import { RoleModel } from '../../../db/Role'; @@ -59,7 +59,7 @@ export class HeroHandler { let curHero = await HeroModel.createHero({ roleId, serverId, roleName, hid, hName, star, quality, job }, false); - await calPlayerCeAndSave(sid, roleId, [curHero]); + await calPlayerCeAndSave(sid, roleId, [curHero], HERO_SYSTEM_TYPE.STAR); return resResult(STATUS.SUCCESS, {curHero}); } @@ -97,22 +97,10 @@ export class HeroHandler { let {lv: oldLv, exp: oldExp} = hero; if(oldLv + addLv > playerLv ) return resResult(STATUS.ROLE_HERO_LV_OVER); oldExp += allExp; - let newExp = oldExp + allExp; // 不考虑主公等级,还会剩多少经验 - let newLv = oldLv; // 不考虑主公等级,这些经验可以升几级 - let curExp = newExp; // 考虑到主公等级,还剩多少经验 - for(;;) { - let exp = getHeroExpByLv(newLv); + let newExp = oldExp + allExp; // 加上经验书可以达到的经验 + let newLv = getHeroLvByExp(newExp); - if(exp < newExp) { - newExp -= exp; - if(newLv < playerLv) curExp -= exp; - newLv ++; - } else { - break; - } - } - - if(oldLv + addLv > newLv) { + if(newLv < oldLv + addLv) { return resResult(STATUS.ROLE_EXP_NOT_ENOUGH); } @@ -120,9 +108,9 @@ export class HeroHandler { if(!costResult) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH); hero.lv = playerLv > newLv?newLv: playerLv; - hero.exp = curExp; + hero.exp = newExp; - let heros = await calPlayerCeAndSave(sid, roleId, [hero]); + let heros = await calPlayerCeAndSave(sid, roleId, [hero], HERO_SYSTEM_TYPE.STAR); const curHero = { hid, lv : heros[0].lv, exp : heros[0].exp } @@ -163,7 +151,7 @@ export class HeroHandler { hero.star = isUpStar? oldStar + 1: oldStar; hero.starStage = isUpStar? ABI_STAGE.START: oldStarStage + 1; - let heros = await calPlayerCeAndSave(sid, roleId, [hero]); + let heros = await calPlayerCeAndSave(sid, roleId, [hero], HERO_SYSTEM_TYPE.STAR); const curHero = { hid, star : heros[0].star, @@ -208,7 +196,7 @@ export class HeroHandler { if(!costResult) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH); hero.quality ++; - let heros = await calPlayerCeAndSave(sid, roleId, [hero]); + let heros = await calPlayerCeAndSave(sid, roleId, [hero], HERO_SYSTEM_TYPE.STAR); const curHero = { hid, quality : heros[0].quality @@ -218,12 +206,6 @@ export class HeroHandler { // 武将觉醒 public async wakeUp(msg: { hid: number, colorStar: number, colorStarStage: number}, session: BackendSession) { - // 根据dic_hero 获得 碎片id - // 根据dic_zyz_hero_wake 获得需要花费的碎片和材料 - // 特殊处理,初次觉醒fireStage传0,保存为 colorStar = 1, colorStarStage = 0,花费的材料取的0星的 - // 检查品质是否是橙色 - // 升星阶,满6自动升星 - // handleCost let roleId: string = session.get('roleId'); let sid: string = session.get('sid'); @@ -264,7 +246,7 @@ export class HeroHandler { hero.colorStar = isUpStar? oldColorStar + 1: oldColorStar; hero.colorStarStage = isUpStar? ABI_STAGE.START: oldColorStarStage + 1; - let heros = await calPlayerCeAndSave(sid, roleId, [hero]); + let heros = await calPlayerCeAndSave(sid, roleId, [hero], HERO_SYSTEM_TYPE.STAR); const curHero = { hid, star : heros[0].star, diff --git a/game-server/app/services/playerCeService.ts b/game-server/app/services/playerCeService.ts index b703b63c4..7453e6ccc 100644 --- a/game-server/app/services/playerCeService.ts +++ b/game-server/app/services/playerCeService.ts @@ -11,24 +11,33 @@ import Hero from '../db/Hero'; import { RoleModel } from '../db/Role'; import { getJobInfoById, getJobByGradeAndClass, getHeroInfoById, getHeroStar, getHeroWake } from '../pubUtils/gamedata'; import { HEROTARIN, CE_RATIO, ABI_TYPE_TO_STAGE, ABI_STAGE} from '../consts/abilityConst'; -import { CeAttrData } from '../db/BaseModel'; +import { CeAttrData, CeAttr } from '../db/BaseModel'; const HERO_CE_RATIO = 100; //战力计算TODO export function calPlayerCe(hero: any, type: number, args: Array) { let incCe = 0; let incArr = {}; let reIncAttr; // {"hp": {"base": number, "fixUp": number, "ratioUp": number}} + + let addSeidList = new Array(); + let removeSeidList = new Array(); + if (type == HERO_SYSTEM_TYPE.STAR) { - reIncAttr = calHeroStarIncAttr(hero, args); // 返回 计算后的值 + reIncAttr = calHeroStarIncAttr(hero, addSeidList, removeSeidList); // 返回 计算后的值 } else if (type == HERO_SYSTEM_TYPE.TRAIN) { reIncAttr = calHeroTrainIncAttr(hero); } - for (let attrName in reIncAttr) { - let originalAttrData: CeAttrData = hero.ceAttr[attrName]; + + addSeidEffect(reIncAttr, addSeidList, removeSeidList); // 处理加值 + + if(!hero.ceAttr) hero.ceAttr = new CeAttr(); + for (let attrName in reIncAttr) { + let originalAttrData: CeAttrData = hero.ceAttr[attrName]||new CeAttrData(); let oldCe = originalAttrData.fixUp * HERO_CE_RATIO + originalAttrData.base *(HERO_CE_RATIO + originalAttrData.ratioUp) + if(!hero.ceAttr[attrName]) hero.ceAttr[attrName] = new CeAttrData(); for (let attrKey in reIncAttr[attrName]) { - hero.CeAttr[attrName][attrKey] = parseInt(reIncAttr[attrName][attrKey]); + hero.ceAttr[attrName][attrKey] = parseInt(reIncAttr[attrName][attrKey]); } incArr[attrName] = reIncAttr[attrName].fixUp * HERO_CE_RATIO + reIncAttr[attrName].base *(HERO_CE_RATIO + reIncAttr[attrName].ratioUp) - oldCe; //计算属性 incCe += incArr[attrName] * CE_RATIO[attrName]; @@ -61,7 +70,7 @@ export async function calPlayerCeAndSave(sid: string, roleId: string, heros: Arr return heros; } -export function calHeroStarIncAttr (hero: Hero, _args: Array) { +export function calHeroStarIncAttr (hero: Hero, addSeidList: Array, removeSeidList: Array) { let {star, starStage, quality, colorStar, colorStarStage, ceAttr} = hero; let res = {}; const dicHero = getHeroInfoById(hero.hid); @@ -98,7 +107,7 @@ export function calHeroStarIncAttr (hero: Hero, _args: Array) { let starUp = dicStar.ceAttr.get(stage); let newBase = heroAttr + hero.lv * (heroUpAttr + starUp); let field = WAR_JSON_ATTRIBUTE_TYPE[targetAttrId]; - let ceAttrData: CeAttrData = ceAttr[field]; // 存表中的属性下的base,fixup,ratioup + let ceAttrData: CeAttrData = ceAttr[field]||new CeAttrData(); // 存表中的属性下的base,fixup,ratioup let {ratioUp = 0, fixUp = 0} = ceAttrData; res[field] = { base: newBase, ratioUp, fixUp}; // base变动,增量为△base * ratio + 0 } @@ -131,3 +140,8 @@ function getFieldByStage(stage: number, jobid: number) { return targetAttrId(dicJob.type); } } + + +function addSeidEffect(reIncAttr: CeAttr, addSeidList: Array, removeSeidList: Array) { + +} \ No newline at end of file diff --git a/shared/db/BaseModel.ts b/shared/db/BaseModel.ts index 21b304c37..779100c34 100644 --- a/shared/db/BaseModel.ts +++ b/shared/db/BaseModel.ts @@ -26,42 +26,42 @@ export default class BaseModel extends TimeStamps { export class CeAttrData { @prop({ required: true }) - base?: number; + base?: number = 0; @prop({ required: true }) - ratioUp: number; + ratioUp: number = 0; @prop({ required: true }) - fixUp: number; + fixUp: number = 0; } export class CeAttr { - @prop({ required: true }) - hp: CeAttrData; - @prop({ required: true }) - atk: CeAttrData; - @prop({ required: true }) - matk: CeAttrData; - @prop({ required: true }) - def: CeAttrData; - @prop({ required: true }) - mdef: CeAttrData; - @prop({ required: true }) - agi: CeAttrData; - @prop({ required: true }) - luk: CeAttrData; - @prop({ required: true }) - hit: CeAttrData; - @prop({ required: true }) - cri: CeAttrData; - @prop({ required: true }) - flee: CeAttrData; - @prop({ required: true }) - antCri: CeAttrData; - @prop({ required: true }) - damageIncrease: CeAttrData; - @prop({ required: true }) - damageDecrease: CeAttrData; - @prop({ required: true }) - defIngnore: CeAttrData; - @prop({ required: true }) - bloodSuck: CeAttrData; + @prop({ required: false }) + hp?: CeAttrData; + @prop({ required: false }) + atk?: CeAttrData; + @prop({ required: false }) + matk?: CeAttrData; + @prop({ required: false }) + def?: CeAttrData; + @prop({ required: false }) + mdef?: CeAttrData; + @prop({ required: false }) + agi?: CeAttrData; + @prop({ required: false }) + luk?: CeAttrData; + @prop({ required: false }) + hit?: CeAttrData; + @prop({ required: false }) + cri?: CeAttrData; + @prop({ required: false }) + flee?: CeAttrData; + @prop({ required: false }) + antCri?: CeAttrData; + @prop({ required: false }) + damageIncrease?: CeAttrData; + @prop({ required: false }) + damageDecrease?: CeAttrData; + @prop({ required: false }) + defIngnore?: CeAttrData; + @prop({ required: false }) + bloodSuck?: CeAttrData; } \ No newline at end of file diff --git a/shared/db/Hero.ts b/shared/db/Hero.ts index da9677a2b..eac9ad606 100644 --- a/shared/db/Hero.ts +++ b/shared/db/Hero.ts @@ -67,7 +67,7 @@ export default class Hero extends BaseModel { ce: number; // 武将战力 @prop({ required: true, default: 0 }) historyCe: number; // 武将历史最高战力 - @prop({required: true }) + @prop({required: true, default: new CeAttr() }) ceAttr: CeAttr; // 影响战力的属性 @prop({ required: true, default: 1 }) diff --git a/shared/db/Role.ts b/shared/db/Role.ts index 57c2b1134..f20ec1c6b 100644 --- a/shared/db/Role.ts +++ b/shared/db/Role.ts @@ -77,7 +77,7 @@ export default class Role extends BaseModel { lv: number; // 主公等级 @prop({ required: true, default: 0 }) ce: number; // 总战力 - @prop({ required: true, default: {} }) + @prop({ required: true, default: new CeAttr() }) globalCeAttr: CeAttr; // 总战力 @prop({ required: true, default: 0 }) topFiveCe: number; // 最强5人战力 diff --git a/shared/pubUtils/gamedata.ts b/shared/pubUtils/gamedata.ts index 9e391add5..fae7cd4b7 100644 --- a/shared/pubUtils/gamedata.ts +++ b/shared/pubUtils/gamedata.ts @@ -146,9 +146,11 @@ function parseLevelInfo() { function parseHeroLevelInfo() { const jobFile = 'dic_zyz_charexp'; const levelData = gamedata['jsons'][jobFile] || []; + let exp = 0; levelData.forEach(elem => { if (elem && elem.level) { - heroLevelInfo.set(elem.level, elem.exp); + exp += elem.exp; + heroLevelInfo.set(elem.level, exp); } }); } @@ -448,6 +450,17 @@ export function getExpByLv(lv: number) { return levelInfos.get(lv); } +export function getHeroLvByExp(exp: number) { + let curLv = 0; + let entries = heroLevelInfo.entries(); + for (let [lv, sum] of entries) { + curLv = lv; + if(exp < sum) break; + } + + return curLv; +} + export function getHeroExpByLv(lv: number) { return heroLevelInfo.get(lv); }