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
}
}