diff --git a/game-server/app.ts b/game-server/app.ts index 8b61978d5..7a471fd7c 100644 --- a/game-server/app.ts +++ b/game-server/app.ts @@ -71,6 +71,7 @@ app.configure(function() { redisService.initAllRank(); redisService.clearComBtlQueue(); updateTeamStatus(COM_TEAM_STATUS.DEFAULT, COM_TEAM_STATUS.LOOSE); + updateTeamStatus(COM_TEAM_STATUS.FIGHTING, COM_TEAM_STATUS.LOOSE); } }); diff --git a/game-server/app/servers/battle/handler/comBattleHandler.ts b/game-server/app/servers/battle/handler/comBattleHandler.ts index d1fc82b92..a43a7f4d0 100644 --- a/game-server/app/servers/battle/handler/comBattleHandler.ts +++ b/game-server/app/servers/battle/handler/comBattleHandler.ts @@ -16,7 +16,7 @@ import { ItemModel } from '../../../db/Item'; import { handleFixedReward, addItems, handleCost } from '../../../services/rewardService'; import { checkRoleInQueue, getTeamSearchByQuality, rmRoleFromQueue, setTeamSearchReq } from '../../../services/redisService'; import { transBossHpArr } from '../../../services/battleService'; -import { getRandBlueprtId, getRandComBtlRobots, checkComBattleResult, clearComBtlTimer, getRealReward, getAssistTimesByQuality, getFrd } from '../../../services/comBattleService'; +import { getRandBlueprtId, getRandComBtlRobots, checkComBattleResult, clearComBtlTimer, getRealReward, getAssistTimesByQuality, getFrd, updateRobotHurt, updateRobotHurtByTime } from '../../../services/comBattleService'; import { setAp } from '../../../services/actionPointService'; import { roleLevelup } from '../../../services/normalBattleService'; @@ -73,6 +73,7 @@ export class ComBattleHandler { } private teamMap: Map = new Map(); private teamDisTimer: Map = new Map(); + private robotHurtTimer: Map = new Map(); /** * @description 队长创建队伍 @@ -541,6 +542,11 @@ export class ComBattleHandler { thiz.teamMap.delete(teamCode); } }, 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); + } + }); return resResult(STATUS.SUCCESS); } @@ -592,25 +598,6 @@ export class ComBattleHandler { }); } roleSt.totalDmg += totalHurtHp; - } else if (curRnd > teamStatus.curRnd && curRnd <= COM_BTL_CONST.ROBOT_RND_LMT && roleSt.isRobot) { - // 机器人的伤害为:boss 血量的一定比例,平均到一定回合数内,再平均到每个敌军,上下浮动一定比例 - let eachHurtHp = getRandValue(teamStatus.bossHp / COM_BTL_CONST.ROBOT_RND_LMT * COM_BTL_CONST.ROBOT_HURT_RATIO / 5, COM_BTL_CONST.ROBOT_HURT_CH_RATIO, 0); - let robotTotalHurt = 0; - teamStatus.bossHpArr.forEach(boss => { - if (boss.curHp >= eachHurtHp) { - robotTotalHurt += eachHurtHp; - boss.curHp -= eachHurtHp; - } else if (boss.curHp > 0) { // 丢弃溢出的伤害 - robotTotalHurt += boss.curHp; - boss.curHp = 0; - } - }); - teamStatus.bossCurHp -= robotTotalHurt; - roleSt.totalDmg += robotTotalHurt; - // 输出回合一到机器人武将集体阵亡 - if (curRnd === COM_BTL_CONST.ROBOT_RND_LMT) { - roleSt.killed === roleSt.heroes; - } } }); teamStatus.curRnd = curRnd; diff --git a/game-server/app/services/comBattleService.ts b/game-server/app/services/comBattleService.ts index a0672294d..007bc7fb0 100644 --- a/game-server/app/services/comBattleService.ts +++ b/game-server/app/services/comBattleService.ts @@ -5,6 +5,8 @@ import { RoleStatus, ComBattleTeamModel } from './../db/ComBattleTeam'; import { getBluePrtByQuality, getComBtlSetByQuality, getRewardByBlueprtId, getWarById, getWarIdByBlueprtId } from "../pubUtils/gamedata"; import { getRandEelm, getRandValue, resResult, ratioReward } from "../pubUtils/util"; import { getRandRobot } from "./battleService"; +import { difference } from 'underscore'; +import { Channel } from 'pinus'; /** * 在给定的品质列表中随机返回一定数量的藏宝图Id @@ -177,4 +179,83 @@ export async function getFrd(roleId: string, quality: number) { export async function updateTeamStatus(preStatus: number, newStatus: number) { if (preStatus === newStatus) return; await ComBattleTeamModel.updateStatusByStatus(preStatus, newStatus); -} \ No newline at end of file +} + +/** + * @description 计算机器人每次对 boss 造成的伤害 + * @param {number} bossHp boss 总血量 + */ +function robotEachHurt(bossHp: number, bossCnt: number) { + const robotTotalHurt = bossHp * COM_BTL_CONST.ROBOT_HURT_RATIO; + const robotAverageHurt = robotTotalHurt / COM_BTL_CONST.ROBOT_ACT_LMT / bossCnt; + return getRandValue(robotAverageHurt, COM_BTL_CONST.ROBOT_HURT_CH_RATIO, 0) +} + +/** + * @description 更新机器人阵亡情况 + * @param {number} bossHp + * @param {RoleStatus} roleSt + */ +function updateRobotKilled(bossHp: number, roleSt: RoleStatus) { + const robotTotalHurt = bossHp * COM_BTL_CONST.ROBOT_HURT_RATIO; + // 让阵亡人数和打出伤害的进度同步,比如有 5 个武将,每打出目标总伤害的 1 / 5 应该增加一个阵亡武将 + const dmgProgress = Math.floor(roleSt.totalDmg / (robotTotalHurt / roleSt.heroes.length)); + if (dmgProgress > roleSt.killed.length && dmgProgress <= roleSt.heroes.length) { + const newKilledCnt = dmgProgress - roleSt.killed.length; + const aliveHeroes = difference(roleSt.heroes, roleSt.killed); + const newKilledHeroes = getRandEelm(aliveHeroes, newKilledCnt); + roleSt.killed.concat(newKilledHeroes); + } +} + +/** + * @description 更新机器人对 boss 的伤害 + * @export + * @param {*} teamStatus 要更新的队伍信息 + * @param {RoleStatus} roleSt 要更新的玩家信息 + */ +export function updateRobotHurt(teamStatus, roleSt: RoleStatus, channel: Channel) { + // 机器人的伤害为:boss 血量的一定比例,平均到一定回合数内,再平均到每个敌军,上下浮动一定比例 + let eachHurtHp = robotEachHurt(teamStatus.bossHp, teamStatus.bossHpArr.length); + let robotTotalHurt = 0; + let actBossHurts = []; + for (let boss of teamStatus.bossHpArr) { + if (boss.curHp === 0) continue; + if (boss.curHp >= eachHurtHp) { + actBossHurts.push({dataId: boss.dataId, hurtHp: eachHurtHp}); + robotTotalHurt += eachHurtHp; + boss.curHp -= eachHurtHp; + } else if (boss.curHp > 0) { // 丢弃溢出的伤害 + actBossHurts.push({dataId: boss.dataId, hurtHp: boss.curHp}); + robotTotalHurt += boss.curHp; + boss.curHp = 0; + } + break; + } + teamStatus.bossCurHp -= robotTotalHurt; + roleSt.totalDmg += robotTotalHurt; + updateRobotKilled(teamStatus.bossHp, roleSt); + channel.pushMessage('onTeammateAct', resResult(STATUS.SUCCESS, { teamCode: teamStatus.teamCode, bossCurHp: teamStatus.bossCurHp, bossHpArr: teamStatus.bossHpArr, roleStatus: roleSt, actRoleId: roleSt.roleId, actBossHurts })); + +} + +/** + * @description 按一定时间间隔刷新机器人伤害 + * @export + * @param {*} teamStatus + * @param {RoleStatus} roleSt + * @param {number} interval + * @param {Channel} channel + * @param {Map} robotHurtTimer + */ +export function updateRobotHurtByTime(teamStatus, roleSt: RoleStatus, interval: number, channel: Channel) { + const robotTimer = setInterval(() => { + const robotTotalHurt = teamStatus.bossHp * COM_BTL_CONST.ROBOT_HURT_RATIO; + if (roleSt.totalDmg < robotTotalHurt) { + updateRobotHurt(teamStatus, roleSt, channel); + } else { + clearInterval(robotTimer); + } + }, interval * 1000); +} + diff --git a/shared/consts/constModules/battleConst.ts b/shared/consts/constModules/battleConst.ts index 0a541619d..46e77426c 100644 --- a/shared/consts/constModules/battleConst.ts +++ b/shared/consts/constModules/battleConst.ts @@ -140,6 +140,8 @@ export const COM_BTL_CONST = { CAP_TIME: 60 * 1000, // 队长匹配机器人的等待时长 CAP_START_TIME: 60 * 1000, // 人齐后队长开始时长倒计时 ROBOT_RND_LMT: 10, // 机器人输出伤害的回合数 + ROBOT_ACT_LMT: 10, // 机器人输出伤害的次数 + ROBOT_BASE_TIME_INTERVAL: 4, // 机器人产生伤害的基础时间 ROBOT_HURT_RATIO: 0.2, // 单个机器人输出总伤害占 boss 血量比重 ROBOT_HURT_CH_RATIO: 0.1, // 机器人伤害上下浮动的比例 ASSIST_REWARD_RATIO: 0.5, // 队员奖励比例