BattleMoveHitHooksPhaseStep.kt

package io.github.lishangbu.avalon.game.battle.engine.core.runtime.flow

import io.github.lishangbu.avalon.game.battle.engine.core.constant.BattleAttributeKeys
import io.github.lishangbu.avalon.game.battle.engine.core.event.StandardHookNames

/**
 * 命中后 hook phase step。
 *
 * @property phaseProcessor battle hook phase 处理器。
 */
class BattleMoveHitHooksPhaseStep(
    private val phaseProcessor: BattleFlowPhaseProcessor,
) : BattleMoveResolutionStep {
    /**
     * 当前步骤在 pipeline 中的执行顺序。
     */
    override val order: Int = 400

    /**
     * 执行命中后的 `on_hit` 与 `on_after_hit` 阶段。
     */
    override fun execute(context: BattleMoveResolutionContext) {
        if (!context.hitSuccessful) {
            return
        }
        val hitResult =
            phaseProcessor.processPhase(
                snapshot = context.snapshot,
                hookName = StandardHookNames.ON_HIT.value,
                moveEffect = context.moveEffect,
                selfId = context.attackerId,
                targetId = context.targetId,
                sourceId = context.sourceId,
                relay = null,
                attributes = context.attributes + mapOf(BattleAttributeKeys.CRITICAL_HIT to context.criticalHit),
            )
        context.snapshot = hitResult.snapshot

        val afterHitResult =
            phaseProcessor.processPhase(
                snapshot = context.snapshot,
                hookName = StandardHookNames.ON_AFTER_HIT.value,
                moveEffect = context.moveEffect,
                selfId = context.attackerId,
                targetId = context.targetId,
                sourceId = context.sourceId,
                relay = null,
                attributes = context.attributes + mapOf(BattleAttributeKeys.CRITICAL_HIT to context.criticalHit),
            )
        context.snapshot = afterHitResult.snapshot
    }
}