md5-fight-plus
Version:
188 lines (187 loc) • 7.96 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.registerRoundHooks = registerRoundHooks;
exports.initRounding = initRounding;
const utils_1 = require("../../player/utils");
const utils_2 = require("../../utils");
const utils_3 = require("../../battle-field/utils");
const logs_1 = require("../../logs");
function registerRoundHooks(battleField) {
const { player1: attacker, player2: defender } = (0, utils_2.getPlayers)(battleField);
initRoundStart(battleField);
initPrepare(battleField);
initRounding(battleField);
initOnAttack(attacker, defender, battleField);
initOnAttack(defender, attacker, battleField);
initOnUnderAttack(battleField);
initRoundEnd(battleField);
}
function initRoundStart(battleField) {
let firstPlayer = undefined;
battleField.roundHooks.roundStart.tap("Order", (battleField) => {
const { player1, player2 } = (0, utils_2.getPlayers)(battleField);
const spd1 = (0, utils_1.getPlayerSpeed)(player1);
const spd2 = (0, utils_1.getPlayerSpeed)(player2);
const p1ActionTimes = (0, utils_1.getPlayerActionTimes)(player1);
const p2ActionTimes = (0, utils_1.getPlayerActionTimes)(player2);
//决定本轮攻击左右方,左方为攻击者,右方为防御者
//行动计数高的玩家优先行动
if (p1ActionTimes > p2ActionTimes) {
(0, utils_3.initOrder)(battleField, player1, player2);
}
if (p1ActionTimes < p2ActionTimes) {
(0, utils_3.initOrder)(battleField, player2, player1);
}
// 若计数相同,根据速度决定顺序
if (p1ActionTimes === p2ActionTimes) {
if (spd1 === spd2) {
if (!firstPlayer) {
firstPlayer = player1;
}
(0, utils_3.initOrder)(battleField, firstPlayer, (0, utils_2.getOpponent)(firstPlayer));
return battleField;
}
if (spd1 > spd2) {
(0, utils_3.initOrder)(battleField, player1, player2);
}
if (spd1 < spd2) {
(0, utils_3.initOrder)(battleField, player2, player1);
}
}
return battleField;
});
battleField.roundHooks.roundStart.tap("Start Info", (battleField) => {
battleField.logger.addInfo(`------------------第${battleField.roundCount}回合------------------`, logs_1.RoundStart);
if (battleField.roundCount > 100) {
const { player1, player2 } = (0, utils_2.getPlayers)(battleField);
const dmg = 1 + (battleField.roundCount - 100) * 2;
battleField.logger.addInfo(`当前已超过100回合,双方受到${dmg}点伤害`, logs_1.RoundStart);
player1.hooks.onAdjustHp.call(-dmg);
//死亡检测
const deathEvent = (0, utils_2.checkPlayerDeath)(battleField);
if (deathEvent)
throw deathEvent.message;
player2.hooks.onAdjustHp.call(-dmg);
}
return battleField;
});
}
function initRoundEnd(battleField) {
battleField.roundHooks.roundEnd.tap("exec player action count", (battleField) => {
//处理玩家行动计数
const { player1, player2 } = (0, utils_2.getPlayers)(battleField);
player1.runtimeContext.actionTimes--; //减少攻击者的行动计数
player1.runtimeContext.roundCount++; //玩家行动回合数+1
const p1ActionTimes = (0, utils_1.getPlayerActionTimes)(player1);
const p2ActionTimes = (0, utils_1.getPlayerActionTimes)(player2);
if (p1ActionTimes === 0 && p2ActionTimes === 0)
(0, utils_1.initActionTimes)(player1, player2);
return battleField;
});
battleField.roundHooks.roundEnd.tap({ name: "log player status", stage: 100 }, (battleField) => {
const { player1, player2 } = (0, utils_2.getPlayers)(battleField);
battleField.logger.addDebug(`${(0, utils_2.getPlayerState)(player1)}`);
battleField.logger.addDebug(`${(0, utils_2.getPlayerState)(player2)}`);
return battleField;
});
//每个回合结束,回复一点蓝量
battleField.roundHooks.roundEnd.tap("recover mana", (battleField) => {
(0, utils_2.initFnToPlayers)(battleField, (player) => {
if (player.runtimeProperty.mana <= player.baseProperty.MANA) {
player.runtimeProperty.mana++;
}
});
return battleField;
});
}
function initPrepare(battleField) {
const { player1, player2 } = (0, utils_2.getPlayers)(battleField);
run(player1);
run(player2);
function run(player) {
player.hooks.prepare.tap("prepare skill", (battleField) => {
const skillIndex = player.runtimeContext.roundCount % player.runtimeContext.skills.length;
const currentSkill = player.runtimeContext.skills[skillIndex];
currentSkill.run(player);
return battleField;
});
}
}
function initRounding(battleField) {
let oneRoundContext = {
attackTimes: 0,
totalDamage: 0,
};
battleField.roundHooks.rounding.tap({ name: "initContext", stage: 0 }, (battleField) => {
oneRoundContext = {
attackTimes: 0,
totalDamage: 0,
};
return battleField;
});
battleField.roundHooks.rounding.tap("attack stage", (battleField) => {
const { player1: attacker } = (0, utils_2.getPlayers)(battleField);
attacker.hooks.onAttack.call({
battleField,
oneRoundContext,
}); //攻击
return battleField;
});
}
function initOnAttack(attacker, defender, battleField) {
//攻击前阶段
attacker.hooks.onAttack.registerBeforeActionHook("before attack", (props) => {
attacker.hooks.beforeAttack.call(props);
defender.hooks.beforeUnderAttack.call(props);
return props;
});
//计算攻击时的一些操作
attacker.hooks.onAttack.registerAfterActionHook("onUnderAttack", (props) => {
defender.hooks.onUnderAttack.call(props);
return props;
});
//攻击后阶段
attacker.hooks.onAttack.registerAfterActionHook("after attack", (props) => {
attacker.hooks.afterAttack.call(props);
defender.hooks.afterUnderAttack.call(props);
return props;
});
}
function initOnUnderAttack(battleField) {
const { player1, player2 } = (0, utils_2.getPlayers)(battleField);
run(player1);
run(player2);
function run(player) {
player.hooks.onUnderAttack.tap("calculate armor", (props) => {
const { damage } = props;
const armor = player.runtimeProperty.armor; //damage=3,armor=5
if (armor <= 0 || damage <= 0)
return props;
if (!armor || !damage)
return props;
if (armor < damage) {
//伤害更多
player.hooks.onAdjustArmor.call(-armor);
props.damage = damage - armor;
player.battleField.logger.addInfo(`${player.name}抵挡${armor}点伤害,护甲剩余0`);
}
else {
//护甲更多
player.hooks.onAdjustArmor.call(-damage);
props.damage = 0;
player.battleField.logger.addInfo(`${player.name}抵挡${damage}点伤害,护甲剩余${armor - damage}`);
}
return props;
});
player.hooks.onUnderAttack.tap("calculate damage", (props) => {
const { damage, battleField } = props;
if (!damage)
return props;
player.hooks.onAdjustHp.call(-damage);
battleField.logger.addInfo(`${player.name}: 受到${damage}点伤害,当前剩余【hp】${[
player.runtimeProperty.hp,
]}`, "calculateDamage");
return props;
});
}
}