md5-fight-plus
Version:
225 lines (218 loc) • 7.45 kB
text/typescript
import {
getPlayerActionTimes,
getPlayerSpeed,
initActionTimes,
} from "@/player/utils";
import { BattleFieldInstance } from "@/types/battleField";
import {
checkPlayerDeath,
getOpponent,
getPlayerState,
getPlayers,
initFnToPlayers,
} from "@/utils";
import { initOrder } from "../../battle-field/utils";
import { PlayerInstanceProperty } from "@/types/player";
import _ from "lodash";
import { onUnderAttack, RoundStart } from "@/logs";
export function registerRoundHooks(battleField: BattleFieldInstance) {
const { player1: attacker, player2: defender } = getPlayers(battleField);
initRoundStart(battleField);
initPrepare(battleField);
initRounding(battleField);
initOnAttack(attacker, defender, battleField);
initOnAttack(defender, attacker, battleField);
initOnUnderAttack(battleField);
initRoundEnd(battleField);
}
function initRoundStart(battleField: BattleFieldInstance) {
let firstPlayer = undefined;
battleField.roundHooks.roundStart.tap("Order", (battleField) => {
const { player1, player2 } = getPlayers(battleField);
const spd1 = getPlayerSpeed(player1);
const spd2 = getPlayerSpeed(player2);
const p1ActionTimes = getPlayerActionTimes(player1);
const p2ActionTimes = getPlayerActionTimes(player2);
//决定本轮攻击左右方,左方为攻击者,右方为防御者
//行动计数高的玩家优先行动
if (p1ActionTimes > p2ActionTimes) {
initOrder(battleField, player1, player2);
}
if (p1ActionTimes < p2ActionTimes) {
initOrder(battleField, player2, player1);
}
// 若计数相同,根据速度决定顺序
if (p1ActionTimes === p2ActionTimes) {
if (spd1 === spd2) {
if (!firstPlayer) {
firstPlayer = player1;
}
initOrder(battleField, firstPlayer, getOpponent(firstPlayer));
return battleField;
}
if (spd1 > spd2) {
initOrder(battleField, player1, player2);
}
if (spd1 < spd2) {
initOrder(battleField, player2, player1);
}
}
return battleField;
});
battleField.roundHooks.roundStart.tap("Start Info", (battleField) => {
battleField.logger.addInfo(
`------------------第${battleField.roundCount}回合------------------`,
RoundStart
);
if (battleField.roundCount > 100) {
const { player1, player2 } = getPlayers(battleField);
const dmg = 1 + (battleField.roundCount - 100) * 2;
battleField.logger.addInfo(
`当前已超过100回合,双方受到${dmg}点伤害`,
RoundStart
);
player1.hooks.onAdjustHp.call(-dmg);
//死亡检测
const deathEvent = checkPlayerDeath(battleField);
if (deathEvent) throw deathEvent.message;
player2.hooks.onAdjustHp.call(-dmg);
}
return battleField;
});
}
function initRoundEnd(battleField: BattleFieldInstance) {
battleField.roundHooks.roundEnd.tap(
"exec player action count",
(battleField) => {
//处理玩家行动计数
const { player1, player2 } = getPlayers(battleField);
player1.runtimeContext.actionTimes--; //减少攻击者的行动计数
player1.runtimeContext.roundCount++; //玩家行动回合数+1
const p1ActionTimes = getPlayerActionTimes(player1);
const p2ActionTimes = getPlayerActionTimes(player2);
if (p1ActionTimes === 0 && p2ActionTimes === 0)
initActionTimes(player1, player2);
return battleField;
}
);
battleField.roundHooks.roundEnd.tap(
{ name: "log player status", stage: 100 },
(battleField) => {
const { player1, player2 } = getPlayers(battleField);
battleField.logger.addDebug(`${getPlayerState(player1)}`);
battleField.logger.addDebug(`${getPlayerState(player2)}`);
return battleField;
}
);
//每个回合结束,回复一点蓝量
battleField.roundHooks.roundEnd.tap("recover mana", (battleField) => {
initFnToPlayers(battleField, (player: PlayerInstanceProperty) => {
if (player.runtimeProperty.mana <= player.baseProperty.MANA) {
player.runtimeProperty.mana++;
}
});
return battleField;
});
}
function initPrepare(battleField: BattleFieldInstance) {
const { player1, player2 } = getPlayers(battleField);
run(player1);
run(player2);
function run(player: PlayerInstanceProperty) {
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;
});
}
}
export function initRounding(battleField: BattleFieldInstance) {
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 } = getPlayers(battleField);
attacker.hooks.onAttack.call({
battleField,
oneRoundContext,
}); //攻击
return battleField;
});
}
function initOnAttack(
attacker: PlayerInstanceProperty,
defender: PlayerInstanceProperty,
battleField: BattleFieldInstance
) {
//攻击前阶段
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: BattleFieldInstance) {
const { player1, player2 } = getPlayers(battleField);
run(player1);
run(player2);
function run(player: PlayerInstanceProperty) {
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;
});
}
}