寻宝:修改机器人伤害计算机制
This commit is contained in:
@@ -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);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -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<string, ComTeam> = new Map();
|
||||
private teamDisTimer: Map<string, NodeJS.Timer> = new Map();
|
||||
private robotHurtTimer: Map<string, NodeJS.Timer> = 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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @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<string, NodeJS.Timer>} 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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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, // 队员奖励比例
|
||||
|
||||
Reference in New Issue
Block a user