寻宝:修改机器人伤害计算机制
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user