import { HeroModel } from '../db/Hero'; import Role, { RoleModel } from '../db/Role' import { getLvByExp, getExpByLv, gameData } from '../pubUtils/data'; import { redisUserInfoUpdate } from './redisService'; import { switchOnFunc } from './funcSwitchService'; import { FUNC_OPT_TYPE } from '../consts'; import { BackendSession } from 'pinus'; export async function roleLevelup(roleId: string, kingExp: number, session: BackendSession) { let role = await RoleModel.findByRoleId(roleId); let {lv = 1, exp = 0} = role; let canGetExp = lv < gameData.maxPlayerLv; // 当主公超过最大级后,挑战结算不再获得经验值 let newExp = canGetExp? exp + kingExp: exp; let newLv = getLvByExp(newExp); // 等级超过最高级之后,经验依然可以稍微溢出一些,以备下一次提升等级 // let nextExpObj = getExpByLv(newLv + 1); // let curExpObj = getExpByLv(newLv); // if(curExpObj && !nextExpObj && newExp > curExpObj.sum) { // newExp = curExpObj.sum; // } role = await RoleModel.levelup(roleId, newLv, newExp); if(newLv > lv) { // 升级 await switchOnFunc(roleId, FUNC_OPT_TYPE.LEVEL_UP, newLv, session); await redisUserInfoUpdate(roleId, [{field: 'lv', value: newLv}]) } let actordata = []; for(let i = lv; i <= newLv; i++) { let lvObj = getExpByLv(i); if(!lvObj) break; let {sum, cur} = lvObj; let lastSum = sum - cur; // console.log(sum, cur, lastSum, exp, newExp); let startExp = exp > lastSum? exp - lastSum: 0; let getExp = newExp > sum? cur - startExp: newExp - lastSum - startExp; actordata.push({ lv : i, exp : startExp, // 升级前经验 getExp : getExp > 0? getExp: 0, // 获得的经验 mostExp : cur }); } return {actordata, lv: newLv, exp: newExp, kingExp: newExp - exp}; } export async function checkBattleHeroes(roleId: string, heroes: Array) { let flag = true; if(heroes.length <= 0) flag = false; const findHeroes = await HeroModel.findBySeqIdRange(heroes, roleId); if(findHeroes.length != heroes.length) flag = false; for(let seqId of heroes) { let hero = findHeroes.find(cur => cur.seqId == seqId); if(!hero) flag = false; } return flag; } export async function updateWarStar(roleId: string, battleId: number, warType: number, star: number) { let role = await RoleModel.findByRoleId(roleId); let { warStar = new Array<{id: number, warType: number, star: number}>() } = role; let curStar = warStar.find(cur => cur.id == battleId); let result: Role; if(curStar) { if(star > curStar.star) { result = await Role.updateWarStar(roleId, battleId, star); } } else { result = await RoleModel.pushWarStar(roleId, battleId, warType, star); } return result }