BattleSessionAttachedHookDispatcher.kt

package io.github.lishangbu.avalon.game.battle.engine.core.session

import io.github.lishangbu.avalon.game.battle.engine.core.runtime.flow.BattleFlowPhaseProcessor
import io.github.lishangbu.avalon.game.battle.engine.core.runtime.flow.BattleRuntimeSnapshot

/**
 * session attached-effect 生命周期 hook 派发器。
 *
 * 设计意图:
 * - 收敛 `processAttachedEffects(...)` 的会话层调用方式;
 * - 让 `before_turn / switch_in / switch_out / faint` 这类生命周期点共用同一条
 *   简单调度路径;
 * - 使 `BattleSessionHookLifecycleProcessor` 更聚焦于“该派发给谁”,而不是“如何派发”。
 */
internal class BattleSessionAttachedHookDispatcher(
    private val battleFlowPhaseProcessor: BattleFlowPhaseProcessor,
) {
    fun processHookForUnitIds(
        snapshot: BattleRuntimeSnapshot,
        unitIds: List<String>,
        hookName: String,
    ): BattleRuntimeSnapshot {
        var currentSnapshot = snapshot
        unitIds.forEach { unitId ->
            currentSnapshot = processHookForUnit(currentSnapshot, unitId, hookName)
        }
        return currentSnapshot
    }

    fun processHookForUnit(
        snapshot: BattleRuntimeSnapshot,
        unitId: String,
        hookName: String,
    ): BattleRuntimeSnapshot {
        if (unitId !in snapshot.units) {
            return snapshot
        }
        return battleFlowPhaseProcessor
            .processAttachedEffects(
                snapshot = snapshot,
                unitId = unitId,
                hookName = hookName,
                targetId = null,
                sourceId = unitId,
                relay = null,
                attributes = emptyMap(),
            ).snapshot
    }
}