寻宝:修改机器人伤害计算机制

This commit is contained in:
liangtongchuan
2021-01-20 01:27:30 +08:00
parent 3d29da928e
commit 58b8d1c05d
4 changed files with 92 additions and 21 deletions

View File

@@ -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);
}
});

View File

@@ -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;

View File

@@ -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);
}

View File

@@ -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, // 队员奖励比例