Files
ZYZ/game-server/app/services/normalBattleService.ts
2021-05-20 19:25:52 +08:00

107 lines
4.1 KiB
TypeScript

import { HeroModel } from '../db/Hero';
import Role, { RoleModel } from '../db/Role'
import { getLvByExp, getExpByLv, gameData } from '../pubUtils/data';
import { updateUserInfo } from './redisService';
import { switchOnFunc } from './funcSwitchService';
import { FUNC_OPT_TYPE, TASK_TYPE } from '../consts';
import { BackendSession } from 'pinus';
import { REDIS_KEY } from '../consts';
import { Rank } from './rankService';
import { checkTask } from './taskService';
import { accomplishTask } from '../pubUtils/taskUtil';
export async function roleLevelup(roleId: string, kingExp: number, session: BackendSession) {
const serverId = session.get('serverId');
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 updateUserInfo(REDIS_KEY.USER_INFO, roleId, [{ field: 'lv', value: newLv }]);
let r = new Rank(REDIS_KEY.USER_LV, { serverId: role.serverId });
await r.setRankWithRoleInfo(roleId, newLv, Date.now(), role);
// 任务
await checkTask(roleId, session.get('sid'), session.get('funcs'), TASK_TYPE.ROLE_LV, newLv, false, {});
//成长任务
await accomplishTask(serverId, roleId, TASK_TYPE.ROLE_LV, newLv);
}
let actordata: { lv: number, exp: number, getExp: number, mostExp: number }[] = [];
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, seqIds: Array<number> = []) {
let heroes: number[] = [];
let flag = true;
// if (seqIds.length <= 0) flag = false;
const findHeroes = await HeroModel.findBySeqIdRange(seqIds, roleId);
if (findHeroes.length != seqIds.length) flag = false;
for (let seqId of seqIds) {
let hero = findHeroes.find(cur => cur.seqId == seqId);
if (!hero) {
flag = false; break;
}
heroes.push(hero.hid);
}
return { isOK: flag, heroes };
}
export async function checkBattleHeroesByHid(roleId: string, heroes: Array<number> = []) {
let flag = true;
// if (heroes.length <= 0) flag = false;
const findHeroes = await HeroModel.findByHidRange(heroes, roleId);
if (findHeroes.length != heroes.length) flag = false;
for (let hid of heroes) {
let hero = findHeroes.find(cur => cur.hid == hid);
if (!hero) flag = false;
}
return { isOK: flag, heroes: findHeroes };
}
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
}