diff --git a/game-server/app/servers/battle/handler/comBattleHandler.ts b/game-server/app/servers/battle/handler/comBattleHandler.ts index 49299ce32..ac42a0a61 100644 --- a/game-server/app/servers/battle/handler/comBattleHandler.ts +++ b/game-server/app/servers/battle/handler/comBattleHandler.ts @@ -1,4 +1,4 @@ -import { COM_BATTLE_ROBOT_CE_RATIO, COM_BATTLE_ROBOT_ID_NAME, COM_BATTLE_ASSIST_TIME } from './../../../consts/consts'; +import { COM_BATTLE_ROBOT_CE_RATIO, COM_BATTLE_ROBOT_ID_NAME, COM_BATTLE_ASSIST_TIME, COM_BATTLE_ROBOT_ROUND_LMT, COM_BATTLE_ROBOT_HURT_RATIO, COM_BATTLE_ROBOT_HURT_CH_RATIO } from './../../../consts/consts'; import { IT_TYPE, GOLD_COST_RATIO, CURRENCY_BY_TYPE, CURRENCY_TYPE } from '../../../consts/consts'; import { getGoodById, getBossHpByBlueprtId, getComBtlSetByQuality, getBlueprtComposeByQuality, getBluePrtByQuality } from '../../../pubUtils/gamedata'; import { COM_TEAM_STATUS, COM_TEAM_ENABLE_LV } from '../../../consts/consts'; @@ -43,6 +43,8 @@ class ComTeam { bossHpArr: Array<{dataId: number, hp: number, curHp: number}>; // 品质 quality: number; + // 当前回合 + curRnd: number; constructor(teamCode: string, pub: boolean, blueprtId: number, status: number, capId: string, ceLimit: number, bossHp: number, quality: number, bossHpArr:Array<{dataId: number, hp: number, curHp: number}> ) { this.teamCode = teamCode; @@ -55,6 +57,7 @@ class ComTeam { this.bossCurHp = bossHp; this.quality = quality; this.bossHpArr = bossHpArr; + this.curRnd = 0; } } export class ComBattleHandler { @@ -95,7 +98,7 @@ export class ComBattleHandler { for (let teammate of teammates) { // TODO: 要判断战力 let roleInfo = await RoleModel.findByRoleId(teammate.roleId); - if (!roleInfo) continue; + if (!roleInfo || roleIds.indexOf(teammate.roleId) !== -1) continue; let {roleId, roleName, headHid = 19, sHid = 19, topFiveCe, lv} = roleInfo; // TODO: 没处理情谊助战 const st = new RoleStatus(roleId, roleName, false, false, headHid, sHid, topFiveCe, lv); @@ -357,9 +360,9 @@ export class ComBattleHandler { return resResult(STATUS.SUCCESS); } - async action(msg: {teamCode: string, heroes: Array<{hid: number, hurtHp: number}>, bossHurts: Array<{dataId: number, hurtHp: number}>, killed: Array}, session: BackendSession) { + async action(msg: {teamCode: string, heroes: Array<{hid: number, hurtHp: number}>, bossHurts: Array<{dataId: number, hurtHp: number}>, killed: Array, curRnd: number}, session: BackendSession) { let roleId = session.get('roleId'); - let { teamCode, heroes, killed, bossHurts } = msg; + let { teamCode, heroes, killed, bossHurts, curRnd } = msg; let teamStatus = this.teamMap.get(teamCode); if (!teamStatus || !teamStatus.roleIds || teamStatus.roleIds.indexOf(roleId) === -1) return resResult(STATUS.COM_BATTLE_TEAM_INVALID); if (teamStatus.status !== COM_TEAM_STATUS.FIGHTING) return resResult(STATUS.COM_BATTLE_NOT_START); @@ -381,8 +384,14 @@ export class ComBattleHandler { }); } if (totalHurtHp !== totalBossHurt) return resResult(STATUS.COM_BATTLE_HURT_NUM_ERR); - - let curRoleSt = null; + teamStatus.bossHpArr.forEach(boss => { + bossHurts.forEach(bh => { + if (boss.dataId === bh.dataId) { + boss.curHp -= bh.hurtHp; + if (boss.curHp < 0) boss.curHp = 0; + } + }) + }); teamStatus.roleStatus.forEach(roleSt => { if (roleSt.roleId === roleId) { if (killed && killed.length) { @@ -393,21 +402,33 @@ export class ComBattleHandler { }); } roleSt.totalDmg += totalHurtHp; - curRoleSt = roleSt; + } else if (curRnd > teamStatus.curRnd && curRnd <= COM_BATTLE_ROBOT_ROUND_LMT && roleSt.isRobot) { + // 机器人的伤害为:boss 血量的一定比例,平均到一定回合数内,再平均到每个敌军,上下浮动一定比例 + let eachHurtHp = getRandValue(teamStatus.bossHp / COM_BATTLE_ROBOT_ROUND_LMT * COM_BATTLE_ROBOT_HURT_RATIO / 5, COM_BATTLE_ROBOT_HURT_CH_RATIO, 0); + let robotTotalHurt = 0; + teamStatus.bossHpArr.forEach(boss => { + if (boss.curHp >= eachHurtHp) { + robotTotalHurt += eachHurtHp; + boss.curHp -= eachHurtHp; + } else { // 丢弃溢出的伤害 + robotTotalHurt += boss.curHp; + boss.curHp = 0; + } + }); + teamStatus.bossCurHp -= robotTotalHurt; + roleSt.totalDmg += robotTotalHurt; + // 输出回合一到机器人武将集体阵亡 + if (curRnd === COM_BATTLE_ROBOT_ROUND_LMT) { + roleSt.killed === roleSt.heroes; + } } }); + teamStatus.curRnd = curRnd; teamStatus.bossCurHp -= totalHurtHp; - teamStatus.bossHpArr.forEach(boss => { - bossHurts.forEach(bh => { - if (boss.dataId === bh.dataId) { - boss.curHp -= bh.hurtHp; - if (boss.curHp < 0) boss.curHp = 0; - } - }) - }); let channelService = this.app.get('channelService'); let channel = channelService.getChannel(teamCode, false); - channel.pushMessage('onTeammateAct', {teamCode, bossCurHp: teamStatus.bossCurHp, bossHpArr: teamStatus.bossHpArr, roleStatus: {roleId, totalDmg: curRoleSt.totalDmg, killed}}); + const roleStatus = teamStatus.roleStatus.map(st => {return {roleId: st.roleId, totalDmg: st.totalDmg, killed: st.killed}}); + channel.pushMessage('onTeammateAct', {teamCode, bossCurHp: teamStatus.bossCurHp, bossHpArr: teamStatus.bossHpArr, roleStatus}); return resResult(STATUS.SUCCESS); } @@ -514,8 +535,6 @@ export class ComBattleHandler { // return resResult(STATUS.SUCCESS, { bossCurHp: this.bossCurHp}); // } - - async composeBlueprt(msg: {original: Array<{id: number, count: number}>}, session: BackendSession) { const roleId = session.get('roleId'); const roleName = session.get('roleName'); diff --git a/shared/consts/consts.ts b/shared/consts/consts.ts index 3c328e39e..81f112b58 100644 --- a/shared/consts/consts.ts +++ b/shared/consts/consts.ts @@ -297,6 +297,12 @@ export const COM_BATTLE_ASSIST_TIME = 60 * 1000; export const COM_BATTLE_CAP_TIME = 60 * 1000; // 人齐后队长开始时长倒计时 export const COM_BATTLE_CAP_START_TIME = 60 * 1000; +// 机器人输出伤害的回合数 +export const COM_BATTLE_ROBOT_ROUND_LMT = 10; +// 单个机器人输出总伤害占 boss 血量比重 +export const COM_BATTLE_ROBOT_HURT_RATIO = 0.2; +// 机器人伤害上下浮动的比例 +export const COM_BATTLE_ROBOT_HURT_CH_RATIO = 0.1; // 机器人名字随机 export const COM_BATTLE_ROBOT_ID_NAME = [