BattleMovePreHitPhaseStep.kt
package io.github.lishangbu.avalon.game.battle.engine.core.runtime.flow
import io.github.lishangbu.avalon.game.battle.engine.core.event.StandardHookNames
/**
* 出招前置 phase step。
*
* 设计意图:
* - 串行执行 `on_before_move`、`on_try_move`、`on_prepare_hit`、`on_try_hit` 四个前置阶段。
* - 一旦任意前置阶段取消出招,就立刻终止后续 move resolution。
*
* @property phaseProcessor battle hook phase 处理器。
*/
class BattleMovePreHitPhaseStep(
private val phaseProcessor: BattleFlowPhaseProcessor,
) : BattleMoveResolutionStep {
/**
* 当前步骤在 pipeline 中的执行顺序。
*/
override val order: Int = 0
/**
* 执行出招前置阶段。
*/
override fun execute(context: BattleMoveResolutionContext) {
val phaseSpecs =
listOf(
StandardHookNames.ON_BEFORE_MOVE.value to null,
StandardHookNames.ON_TRY_MOVE.value to true,
StandardHookNames.ON_PREPARE_HIT.value to true,
StandardHookNames.ON_TRY_HIT.value to true,
)
phaseSpecs.forEach { (hookName, relay) ->
val result =
phaseProcessor.processPhase(
snapshot = context.snapshot,
hookName = hookName,
moveEffect = context.moveEffect,
selfId = context.attackerId,
targetId = context.targetId,
sourceId = context.sourceId,
relay = relay,
attributes = context.attributes,
)
context.snapshot = result.snapshot
if (result.cancelled) {
context.markCancelled(result.snapshot)
return
}
}
}
}