BattleSessionCaptureChoiceHandler.kt

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

import kotlin.reflect.KClass

/**
 * `CaptureChoice` 提交处理器。
 *
 * @property commandFactory battle session 命令工厂。
 */
class BattleSessionCaptureChoiceHandler(
    private val commandFactory: BattleSessionCommandFactory,
) : BattleSessionChoiceHandler {
    /**
     * 当前处理器负责的 choice 类型。
     */
    override val choiceType: KClass<out BattleSessionChoice> = CaptureChoice::class

    /**
     * 把 capture choice 转为可执行的捕捉动作。
     */
    override fun submit(
        choice: BattleSessionChoice,
        session: BattleSession,
    ): List<BattleSessionAction> {
        val captureChoice = choice as? CaptureChoice ?: error("Expected CaptureChoice but got '${choice::class.qualifiedName}'.")
        session.ensureRunning()
        session.ensureUnitCanSubmitChoice(captureChoice.sourceUnitId)
        session.ensureCaptureIsLegal(
            playerId = captureChoice.playerId,
            sourceUnitId = captureChoice.sourceUnitId,
            targetUnitId = captureChoice.targetId,
        )
        session.actionQueue.enqueue(commandFactory.createAction(captureChoice))
        session.recordLog(
            "Queued capture ${captureChoice.ballItemId} from ${captureChoice.sourceUnitId} to ${captureChoice.targetId} for player ${captureChoice.playerId}.",
        )
        session.recordEvent(
            BattleSessionCaptureQueuedPayload(
                playerId = captureChoice.playerId,
                ballItemId = captureChoice.ballItemId,
                sourceUnitId = captureChoice.sourceUnitId,
                targetId = captureChoice.targetId,
                priority = captureChoice.priority,
                speed = captureChoice.speed,
            ),
        )
        return session.actionQueue.snapshot()
    }
}