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

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

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