133 lines
5.2 KiB
TypeScript
133 lines
5.2 KiB
TypeScript
|
|
import { ActionPointModel } from '../../../db/ActionPoint';
|
|
import { BattleDropModel } from '../../../db/BattleDrop';
|
|
|
|
import { getWarById, getGoodById } from '../../../util/gamedata';
|
|
import { decodeStr, Reward } from '../../../util/util';
|
|
import { ACTION_POIN, BATTLE_REWARD_TYPE, GOOD_TYPE } 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}
|
|
}
|
|
|
|
export class WarReward {
|
|
roleId: string;
|
|
roleName: string;
|
|
battleId: number;
|
|
condition: Map<number, boolean>;
|
|
warInfo: any;
|
|
isSuccess: boolean;
|
|
rewards: Array<{type: number, gid: number, count: number}>;
|
|
|
|
constructor(roleId: string, roleName: string, battleId: number, isSuccess: boolean) {
|
|
this.roleId = roleId;
|
|
this.roleName = roleName;
|
|
this.battleId = battleId;
|
|
this.condition = new Map();
|
|
this.warInfo = getWarById(battleId);
|
|
this.isSuccess = isSuccess;
|
|
}
|
|
|
|
public setCondition(id: number, isOk: boolean) {
|
|
this.condition.set(id, isOk);
|
|
}
|
|
|
|
private handleFixReward(num: number) {
|
|
if(this.isSuccess) { // 成功了才给固定奖励
|
|
let {fixReward = ''} = this.warInfo;
|
|
let reward = decodeStr('fixReward', fixReward);
|
|
for(let obj of reward) this.rewards.push({type: BATTLE_REWARD_TYPE.FIX_REWARD, ...obj, count: obj.count * num});
|
|
}
|
|
}
|
|
private handleConditionReward(num: number) {
|
|
if(this.isSuccess) {
|
|
let {conditionReward = ''} = this.warInfo;
|
|
let reward = decodeStr('conditionReward', conditionReward);
|
|
for(let obj of reward) {
|
|
if(this.condition.get(obj.condition)) {
|
|
this.rewards.push({type: BATTLE_REWARD_TYPE.CONDITION_REWARD, ...obj, count: obj.count * num});
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private async handleRandomReward(num: number) {
|
|
if(this.isSuccess) {
|
|
let {RandomReward:randomReward = ''} = this.warInfo;
|
|
|
|
let reward = decodeStr('randomReward', randomReward);
|
|
for(let obj of reward) {
|
|
let { gid, frequency } = obj;
|
|
let dropHistory = await BattleDropModel.findByGid(this.roleId, this.battleId, gid);
|
|
let { getNum = 0, allNum = 0, getSum = 0, allSum = 0 } = dropHistory;
|
|
for(let i = 0; i < num; i ++) {
|
|
let flag = false; // 是否可以获得
|
|
if(allNum + 1 > frequency) {
|
|
allNum = 0; getNum = 0;
|
|
}
|
|
allNum++; allSum++;
|
|
if(getNum == 0) {
|
|
let r = Math.random();
|
|
if(r <= 1/frequency*allNum || (allNum >= frequency) ) {
|
|
flag = true; // 独立概率随机
|
|
}
|
|
}
|
|
if(flag) {
|
|
getNum ++; getSum++;
|
|
this.rewards.push({type: BATTLE_REWARD_TYPE.RANDOM_REWARD, ...obj});
|
|
}
|
|
}
|
|
await BattleDropModel.updateByGid(this.roleId, this.battleId, gid, {
|
|
getNum, allNum, getSum, allSum
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|
|
public async saveReward(num: number) {
|
|
this.rewards = new Array();
|
|
await this.handleFixReward(num);
|
|
await this.handleConditionReward(num);
|
|
await this.handleRandomReward(num);
|
|
|
|
let rewardObject = new Reward(this.roleId, this.roleName, this.rewards);
|
|
let returnGoods = await rewardObject.saveReward();
|
|
return returnGoods;
|
|
}
|
|
|
|
} |