寻宝:机器人伤害时要判断战斗状态
This commit is contained in:
@@ -17,7 +17,7 @@ import { ItemModel } from '../../../db/Item';
|
|||||||
import { handleFixedReward, addItems, handleCost, decreaseItems } from '../../../services/rewardService';
|
import { handleFixedReward, addItems, handleCost, decreaseItems } from '../../../services/rewardService';
|
||||||
import { checkRoleInQueue, getTeamSearchByQuality, rmRoleFromQueue, setTeamSearchReq } from '../../../services/redisService';
|
import { checkRoleInQueue, getTeamSearchByQuality, rmRoleFromQueue, setTeamSearchReq } from '../../../services/redisService';
|
||||||
import { transBossHpArr } from '../../../services/battleService';
|
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 { setAp } from '../../../services/actionPointService';
|
||||||
import { roleLevelup } from '../../../services/normalBattleService';
|
import { roleLevelup } from '../../../services/normalBattleService';
|
||||||
|
|
||||||
@@ -489,6 +489,7 @@ export class ComBattleHandler {
|
|||||||
*/
|
*/
|
||||||
async startBattle(msg: {teamCode: string}, session: BackendSession) {
|
async startBattle(msg: {teamCode: string}, session: BackendSession) {
|
||||||
let roleId = session.get('roleId');
|
let roleId = session.get('roleId');
|
||||||
|
let sid = session.get('sid');
|
||||||
let { teamCode } = msg;
|
let { teamCode } = msg;
|
||||||
let teamStatus = this.teamMap.get(teamCode);
|
let teamStatus = this.teamMap.get(teamCode);
|
||||||
if (!teamStatus || !teamStatus.roleIds || teamStatus.roleIds.indexOf(roleId) === -1) return resResult(STATUS.COM_BATTLE_TEAM_INVALID);
|
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);
|
}, COM_BTL_CONST.BTL_TIME_LMT);
|
||||||
teamStatus.roleStatus.forEach((st, idx) => {
|
teamStatus.roleStatus.forEach((st, idx) => {
|
||||||
if (st.isRobot === true) {
|
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);
|
return resResult(STATUS.SUCCESS);
|
||||||
@@ -585,31 +586,8 @@ export class ComBattleHandler {
|
|||||||
let channel = channelService.getChannel(teamCode, false);
|
let channel = channelService.getChannel(teamCode, false);
|
||||||
const roleStatus = teamStatus.roleStatus.map(st => {return {roleId: st.roleId, totalDmg: st.totalDmg, killed: st.killed}});
|
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 }));
|
channel.pushMessage('onTeammateAct', resResult(STATUS.SUCCESS, { teamCode, bossCurHp: teamStatus.bossCurHp, bossHpArr: teamStatus.bossHpArr, roleStatus, actRoleId: roleId, actBossHurts }));
|
||||||
// 判断战斗是否结束
|
const result = await handleComBtlProgress(teamStatus, sid, this.robotHurtTimer, this.teamMap, channel);
|
||||||
let battleSt = checkComBattleResult(teamStatus);
|
if (result && result.code !== 0) return result;
|
||||||
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);
|
|
||||||
}
|
|
||||||
return resResult(STATUS.SUCCESS);
|
return resResult(STATUS.SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -655,8 +633,8 @@ export class ComBattleHandler {
|
|||||||
let sid = session.get('sid');
|
let sid = session.get('sid');
|
||||||
let { teamCode } = msg;
|
let { teamCode } = msg;
|
||||||
let team = await ComBattleTeamModel.getTeamByCode(teamCode);
|
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);
|
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 { roleStatus, blueprtId, status, bossHpArr } = team;
|
||||||
let roleSt: RoleStatus = null;
|
let roleSt: RoleStatus = null;
|
||||||
roleStatus.forEach(st => {
|
roleStatus.forEach(st => {
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import { getRandRobot } from "./battleService";
|
|||||||
import { difference, omit } from 'underscore';
|
import { difference, omit } from 'underscore';
|
||||||
import { Channel } from 'pinus';
|
import { Channel } from 'pinus';
|
||||||
import { TREASURE } from '../pubUtils/dicParam';
|
import { TREASURE } from '../pubUtils/dicParam';
|
||||||
|
import { decreaseItems } from './rewardService';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 在给定的品质列表中随机返回一定数量的藏宝图Id
|
* 在给定的品质列表中随机返回一定数量的藏宝图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 的伤害
|
* @description 更新机器人对 boss 的伤害
|
||||||
* @export
|
* @export
|
||||||
@@ -254,12 +284,13 @@ export function updateRobotHurt(teamStatus, roleSt: RoleStatus, channel: Channel
|
|||||||
* @param {Channel} channel
|
* @param {Channel} channel
|
||||||
* @param {Map<string, NodeJS.Timer>} robotHurtTimer
|
* @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 timerKey = `${teamStatus.teamCode}_${roleSt.roleId}`;
|
||||||
const robotTimer = setInterval(() => {
|
const robotTimer = setInterval(() => {
|
||||||
const robotTotalHurt = teamStatus.bossHp * COM_BTL_CONST.ROBOT_HURT_RATIO;
|
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);
|
updateRobotHurt(teamStatus, roleSt, channel);
|
||||||
|
handleComBtlProgress(teamStatus, sid, robotHurtTimer, teamMap, channel);
|
||||||
} else {
|
} else {
|
||||||
clearInterval(robotTimer);
|
clearInterval(robotTimer);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user