寻宝:机器人伤害时要判断战斗状态

This commit is contained in:
liangtongchuan
2021-01-23 20:55:31 +08:00
parent 1011cd3ef9
commit 50aee50e5e
2 changed files with 39 additions and 30 deletions

View File

@@ -17,7 +17,7 @@ import { ItemModel } from '../../../db/Item';
import { handleFixedReward, addItems, handleCost, decreaseItems } from '../../../services/rewardService';
import { checkRoleInQueue, getTeamSearchByQuality, rmRoleFromQueue, setTeamSearchReq } from '../../../services/redisService';
import { transBossHpArr } from '../../../services/battleService';
import { getRandBlueprtId, getRandComBtlRobots, checkComBattleResult, clearComBtlTimer, getRealReward, getAssistTimesByQuality, getFrd, updateRobotHurtByTime, comBtlLvInvalid, clearRobotHurtTimer, setDismissTimer, dismissTeam, incEquipPrintDrop, randEquipPrintId } from '../../../services/comBattleService';
import { getRandBlueprtId, getRandComBtlRobots, checkComBattleResult, clearComBtlTimer, getRealReward, getAssistTimesByQuality, getFrd, updateRobotHurtByTime, comBtlLvInvalid, clearRobotHurtTimer, setDismissTimer, dismissTeam, incEquipPrintDrop, randEquipPrintId, handleComBtlProgress } from '../../../services/comBattleService';
import { setAp } from '../../../services/actionPointService';
import { roleLevelup } from '../../../services/normalBattleService';
@@ -489,6 +489,7 @@ export class ComBattleHandler {
*/
async startBattle(msg: {teamCode: string}, session: BackendSession) {
let roleId = session.get('roleId');
let sid = session.get('sid');
let { teamCode } = msg;
let teamStatus = this.teamMap.get(teamCode);
if (!teamStatus || !teamStatus.roleIds || teamStatus.roleIds.indexOf(roleId) === -1) return resResult(STATUS.COM_BATTLE_TEAM_INVALID);
@@ -520,7 +521,7 @@ export class ComBattleHandler {
}, COM_BTL_CONST.BTL_TIME_LMT);
teamStatus.roleStatus.forEach((st, idx) => {
if (st.isRobot === true) {
updateRobotHurtByTime(teamStatus, st, COM_BTL_CONST.ROBOT_BASE_TIME_INTERVAL + idx, channel, this.robotHurtTimer);
updateRobotHurtByTime(teamStatus, st, COM_BTL_CONST.ROBOT_BASE_TIME_INTERVAL + idx, channel, this.robotHurtTimer, this.teamMap, sid);
}
});
return resResult(STATUS.SUCCESS);
@@ -585,31 +586,8 @@ export class ComBattleHandler {
let channel = channelService.getChannel(teamCode, false);
const roleStatus = teamStatus.roleStatus.map(st => {return {roleId: st.roleId, totalDmg: st.totalDmg, killed: st.killed}});
channel.pushMessage('onTeammateAct', resResult(STATUS.SUCCESS, { teamCode, bossCurHp: teamStatus.bossCurHp, bossHpArr: teamStatus.bossHpArr, roleStatus, actRoleId: roleId, actBossHurts }));
// 判断战斗是否结束
let battleSt = checkComBattleResult(teamStatus);
teamStatus.status = battleSt;
if (battleSt === COM_TEAM_STATUS.WIN || battleSt === COM_TEAM_STATUS.LOOSE) {
let result = battleSt === COM_TEAM_STATUS.WIN;
if (result) {
teamStatus.bossHpArr.forEach(bs => {
bs.curHp = 0;
});
for (let st of teamStatus.roleStatus) {
st.fixReward = await getRealReward(teamStatus.blueprtId, st);
};
}
let team = await ComBattleTeamModel.syncTeamData({teamCode, status: battleSt, roleStatus: teamStatus.roleStatus, bossHpArr: teamStatus.bossHpArr});
if (!team) return resResult(STATUS.COM_BATTLE_RESULT_ERR);
// 战斗胜利队长扣减藏宝图
if (result && teamStatus.capId != 'robot') {
let res = await decreaseItems(teamStatus.capId, sid, [{id: teamStatus.blueprtId, count: 1}]);
if (res === true) return resResult(STATUS.COM_BATTLE_BLUEPRT_NOT_ENOUGH);
}
clearRobotHurtTimer(teamStatus, this.robotHurtTimer);
channel.pushMessage('onTeamComplete', resResult(STATUS.SUCCESS, {teamCode, result}));
this.teamMap.delete(teamCode);
}
const result = await handleComBtlProgress(teamStatus, sid, this.robotHurtTimer, this.teamMap, channel);
if (result && result.code !== 0) return result;
return resResult(STATUS.SUCCESS);
}
@@ -655,8 +633,8 @@ export class ComBattleHandler {
let sid = session.get('sid');
let { teamCode } = msg;
let team = await ComBattleTeamModel.getTeamByCode(teamCode);
if (!team || team.status !== COM_TEAM_STATUS.WIN) return resResult(STATUS.COM_BATTLE_REWARD_ERR);
clearRobotHurtTimer(team, this.robotHurtTimer);
if (!team || team.status !== COM_TEAM_STATUS.WIN) return resResult(STATUS.COM_BATTLE_REWARD_ERR);
let { roleStatus, blueprtId, status, bossHpArr } = team;
let roleSt: RoleStatus = null;
roleStatus.forEach(st => {

View File

@@ -9,6 +9,7 @@ import { getRandRobot } from "./battleService";
import { difference, omit } from 'underscore';
import { Channel } from 'pinus';
import { TREASURE } from '../pubUtils/dicParam';
import { decreaseItems } from './rewardService';
/**
* 在给定的品质列表中随机返回一定数量的藏宝图Id
@@ -215,6 +216,35 @@ function updateRobotKilled(bossHp: number, roleSt: RoleStatus) {
}
}
export async function handleComBtlProgress(teamStatus, sid: string, robotHurtTimer: Map<string, NodeJS.Timer>, teamMap: Map<string, any>, channel: Channel) {
const { teamCode } = teamStatus;
// 判断战斗是否结束
let battleSt = checkComBattleResult(teamStatus);
teamStatus.status = battleSt;
if (battleSt === COM_TEAM_STATUS.WIN || battleSt === COM_TEAM_STATUS.LOOSE) {
let result = battleSt === COM_TEAM_STATUS.WIN;
if (result) {
teamStatus.bossHpArr.forEach(bs => {
bs.curHp = 0;
});
for (let st of teamStatus.roleStatus) {
st.fixReward = await getRealReward(teamStatus.blueprtId, st);
};
}
let team = await ComBattleTeamModel.syncTeamData({teamCode, status: battleSt, roleStatus: teamStatus.roleStatus, bossHpArr: teamStatus.bossHpArr});
if (!team) return resResult(STATUS.COM_BATTLE_RESULT_ERR);
// 战斗胜利队长扣减藏宝图
if (result && teamStatus.capId != 'robot') {
let res = await decreaseItems(teamStatus.capId, sid, [{id: teamStatus.blueprtId, count: 1}]);
if (res === true) return resResult(STATUS.COM_BATTLE_BLUEPRT_NOT_ENOUGH);
}
clearRobotHurtTimer(teamStatus, robotHurtTimer);
channel.pushMessage('onTeamComplete', resResult(STATUS.SUCCESS, {teamCode, result}));
teamMap.delete(teamCode);
}
}
/**
* @description 更新机器人对 boss 的伤害
* @export
@@ -254,12 +284,13 @@ export function updateRobotHurt(teamStatus, roleSt: RoleStatus, channel: Channel
* @param {Channel} channel
* @param {Map<string, NodeJS.Timer>} robotHurtTimer
*/
export function updateRobotHurtByTime(teamStatus, roleSt: RoleStatus, interval: number, channel: Channel, robotHurtTimer: Map<string, NodeJS.Timer>) {
export function updateRobotHurtByTime(teamStatus, roleSt: RoleStatus, interval: number, channel: Channel, robotHurtTimer: Map<string, NodeJS.Timer>, teamMap: Map<string, any>, sid: string) {
const timerKey = `${teamStatus.teamCode}_${roleSt.roleId}`;
const robotTimer = setInterval(() => {
const robotTotalHurt = teamStatus.bossHp * COM_BTL_CONST.ROBOT_HURT_RATIO;
if (roleSt.totalDmg < robotTotalHurt) {
if (roleSt.totalDmg < robotTotalHurt && teamStatus.bossCurHp > 0) {
updateRobotHurt(teamStatus, roleSt, channel);
handleComBtlProgress(teamStatus, sid, robotHurtTimer, teamMap, channel);
} else {
clearInterval(robotTimer);
}