体力:修改体力逻辑
This commit is contained in:
@@ -3,48 +3,79 @@
|
||||
*/
|
||||
|
||||
import { ActionPointModel } from '../db/ActionPoint';
|
||||
import { ACTION_POIN, TASK_TYPE } from '../consts';
|
||||
import { TASK_TYPE, STATUS } from '../consts';
|
||||
import { checkTask } from './taskService';
|
||||
import { getDicApByLv } from '../pubUtils/data';
|
||||
import { pinus } from 'pinus';
|
||||
import { resResult } from '../pubUtils/util';
|
||||
|
||||
export async function getAp(now: number, roleId: string) {
|
||||
/**
|
||||
* 获取当前体力
|
||||
* @param roleId 玩家id
|
||||
* @param lv 玩家等级
|
||||
*/
|
||||
export async function getAp(roleId: string, lv: number) {
|
||||
const now = Date.now();
|
||||
const dicAp = getDicApByLv(lv);
|
||||
let dataAp = await ActionPointModel.getAp(roleId);
|
||||
const maxAp = ACTION_POIN.MAX; // 最大体力值
|
||||
const per = ACTION_POIN.PER; // 恢复时间(ms)
|
||||
const maxAp = dicAp.maxAp; // 最大体力值
|
||||
const per = dicAp.perApRestoreTime * 1000; // 恢复时间(ms)
|
||||
let {ap, refTime} = dataAp;
|
||||
|
||||
if(ap >= maxAp) {
|
||||
// 体力溢出不需要做时间的处理
|
||||
return { ap, maxAp, refTime: now, apRemainTime:0, isOver: true }
|
||||
return { ap, maxAp, refTime: now, apRemainTime:0, apMaxRemainTime: 0, isOver: true }
|
||||
} else {
|
||||
if(refTime > now) refTime = now; // refTime:每次记录时候最近的一个整的时间点,绝对不会大于now
|
||||
let n = Math.floor((now - refTime)/per); // 上次记录到现在可以增长多少体力
|
||||
ap += n; // 增加上
|
||||
if(ap >= maxAp) { // 加上后溢出了
|
||||
ap = maxAp;
|
||||
return { ap, maxAp, refTime: now, apRemainTime:0, isOver: true }
|
||||
return { ap, maxAp, refTime: now, apRemainTime:0, apMaxRemainTime: 0, isOver: true }
|
||||
} else {
|
||||
refTime += n * per; // 更新refTime到离现在最近的一个整的时间点
|
||||
let apRemainTime = Math.floor((refTime + per - now)/1000); // 恢复下一点需要多少时间
|
||||
|
||||
return { ap, maxAp, refTime, apRemainTime, isOver: false }
|
||||
let apMaxRemainTime = (maxAp - ap - 1) * dicAp.perApRestoreTime + apRemainTime;
|
||||
return { ap, maxAp, refTime, apRemainTime, apMaxRemainTime, isOver: false }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export async function setAp(now: number, roleId: string, sid: string, funcs: number[], changeAp: number) {
|
||||
let ApResult = await getAp(now, roleId);
|
||||
let { ap, maxAp, refTime, apRemainTime, isOver } = ApResult; // 更新ap
|
||||
/**
|
||||
* 增加或减少体力
|
||||
* @param roleId 玩家id
|
||||
* @param lv 玩家等级
|
||||
* @param changeAp 体力变化,正是加,负是减
|
||||
* @param sid
|
||||
* @param funcs 开启的功能
|
||||
*/
|
||||
export async function setAp(roleId: string, lv: number, changeAp: number, sid: string, funcs: number[]) {
|
||||
const now = Date.now();
|
||||
const dicAp = getDicApByLv(lv);
|
||||
let ApResult = await getAp(roleId, lv);
|
||||
let { ap, maxAp, refTime, apRemainTime, apMaxRemainTime, isOver } = ApResult; // 更新ap
|
||||
ap += changeAp;
|
||||
if(ap >= maxAp) { // 溢出
|
||||
refTime = now;
|
||||
apRemainTime = 0;
|
||||
apMaxRemainTime = 0;
|
||||
}
|
||||
if(ap < 0) return null // 体力不足
|
||||
await ActionPointModel.saveAp(roleId, ap, refTime);
|
||||
|
||||
if(isOver && ap < maxAp) apRemainTime = Math.floor(ACTION_POIN.PER / 1000); // 特殊处理
|
||||
if(isOver && ap < maxAp) { // 特殊处理,溢出之后做减少体力的操作时
|
||||
apRemainTime = dicAp.perApRestoreTime;
|
||||
apMaxRemainTime = (maxAp - ap) * dicAp.perApRestoreTime;
|
||||
}
|
||||
|
||||
if(changeAp < 0) {
|
||||
await checkTask(roleId, sid, funcs, TASK_TYPE.BATTLE_COST_AP, -1 * changeAp, true, {});
|
||||
}
|
||||
return {ap, maxAp, refTime, apRemainTime}
|
||||
let apJson = {ap, maxAp, refTime, apMaxRemainTime, apRemainTime};
|
||||
if(changeAp != 0) {
|
||||
let uids = [{ uid: roleId, sid }];
|
||||
pinus.app.get('channelService').pushMessageByUids('onApUpdate', resResult(STATUS.SUCCESS, { apJson }), uids);
|
||||
}
|
||||
|
||||
return apJson
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
|
||||
import { HeroModel } from '../db/Hero';
|
||||
import Role, { RoleModel, RoleType } from '../db/Role'
|
||||
import { getLvByExp, getExpByLv, gameData } from '../pubUtils/data';
|
||||
import { getLvByExp, getExpByLv, gameData, getDicApByLv } from '../pubUtils/data';
|
||||
import { updateUserInfo } from './redisService';
|
||||
import { switchOnFunc } from './funcSwitchService';
|
||||
import { FUNC_OPT_TYPE, TASK_TYPE, WAR_TYPE } from '../consts';
|
||||
@@ -11,9 +11,12 @@ import { Rank } from './rankService';
|
||||
import { checkActivityTask, checkTask } from './taskService';
|
||||
import { accomplishTask } from '../pubUtils/taskUtil';
|
||||
import { RScriptRecordModel } from '../db/RScriptRecord';
|
||||
import { setAp } from './actionPointService';
|
||||
|
||||
export async function roleLevelup(roleId: string, kingExp: number, session: BackendSession) {
|
||||
const serverId = session.get('serverId');
|
||||
const sid = session.get('sid');
|
||||
const funcs = session.get('funcs');
|
||||
let role = await RoleModel.findByRoleId(roleId);
|
||||
let { lv = 1, exp = 0 } = role;
|
||||
let canGetExp = lv < gameData.maxPlayerLv.max; // 当主公超过最大级后,挑战结算不再获得经验值
|
||||
@@ -57,7 +60,12 @@ export async function roleLevelup(roleId: string, kingExp: number, session: Back
|
||||
getExp: getExp > 0 ? getExp : 0, // 获得的经验
|
||||
mostExp: cur
|
||||
});
|
||||
if(i != lv) { // 升级加体力
|
||||
let dicAp = getDicApByLv(i);
|
||||
await setAp(roleId, i, dicAp.restoreAp, sid, funcs);
|
||||
}
|
||||
}
|
||||
|
||||
return { actordata, lv: newLv, exp: newExp, kingExp: newExp - exp };
|
||||
}
|
||||
|
||||
|
||||
@@ -132,7 +132,7 @@ export async function addItems(roleId: string, roleName: string, sid: string, go
|
||||
let role = await RoleModel.findByRoleId(roleId);
|
||||
for (let key in currencysMap) {
|
||||
if (key == 'ap') {
|
||||
let { ap } = await setAp(Date.now(), roleId, sid, null, currencysMap[key]);
|
||||
let { ap } = await setAp(roleId, role.lv, currencysMap[key], sid, []);
|
||||
currencysMap.ap = ap;
|
||||
} else {
|
||||
currencysMap[key] += role[key];
|
||||
|
||||
Reference in New Issue
Block a user