46 lines
1.8 KiB
TypeScript
46 lines
1.8 KiB
TypeScript
/**
|
||
* 体力系统
|
||
*/
|
||
|
||
import { ActionPointModel } from '../db/ActionPoint';
|
||
import { ACTION_POIN } from '../consts/consts';
|
||
|
||
export async function getAp(now: number, roleId: string) {
|
||
let dataAp = await ActionPointModel.getAp(roleId);
|
||
const maxAp = ACTION_POIN.MAX; // 最大体力值
|
||
const per = ACTION_POIN.PER; // 恢复时间(ms)
|
||
let {ap, refTime} = dataAp;
|
||
if(ap >= maxAp) {
|
||
// 体力溢出不需要做时间的处理
|
||
return { ap, maxAp, refTime: now, apRemainTime: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 }
|
||
} else {
|
||
refTime += n * per; // 更新refTime到离现在最近的一个整的时间点
|
||
let apRemainTime = Math.floor((refTime + per - now)/1000); // 恢复下一点需要多少时间
|
||
|
||
return { ap, maxAp, refTime, apRemainTime, isOver: false }
|
||
}
|
||
}
|
||
}
|
||
|
||
export async function setAp(now: number, roleId: string, changeAp: number) {
|
||
let ApResult = await getAp(now, roleId);
|
||
let { ap, maxAp, refTime, apRemainTime, isOver } = ApResult; // 更新ap
|
||
ap += changeAp;
|
||
if(ap >= maxAp) { // 溢出
|
||
refTime = now;
|
||
apRemainTime = 0;
|
||
}
|
||
if(ap < 0) return null // 体力不足
|
||
await ActionPointModel.saveAp(roleId, ap, refTime);
|
||
|
||
if(isOver && ap < maxAp) apRemainTime = Math.floor(ACTION_POIN.PER / 1000); // 特殊处理
|
||
return {ap, maxAp, refTime, apRemainTime}
|
||
}
|