DefaultCaptureActionResolver.kt

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

import io.github.lishangbu.avalon.game.battle.engine.core.capture.CaptureFormulaService
import io.github.lishangbu.avalon.game.battle.engine.core.capture.DefaultCaptureFormulaService
import io.github.lishangbu.avalon.game.battle.engine.core.session.BattleSession
import io.github.lishangbu.avalon.game.battle.engine.core.session.BattleSessionCaptureAction
import io.github.lishangbu.avalon.game.battle.engine.core.session.BattleSessionCaptureResult
import io.github.lishangbu.avalon.game.battle.engine.spi.capture.CaptureActionResolver
import io.github.lishangbu.avalon.game.battle.engine.spi.capture.CaptureFormulaInputResolver

/**
 * 引擎内置的默认 capture action resolver。
 *
 * 业务层只需要提供公式输入,具体公式计算由 battle-engine 负责。
 */
class DefaultCaptureActionResolver(
    private val captureFormulaInputResolver: CaptureFormulaInputResolver,
    private val captureFormulaService: CaptureFormulaService = DefaultCaptureFormulaService(),
) : CaptureActionResolver {
    override fun resolve(
        session: BattleSession,
        action: BattleSessionCaptureAction,
    ): BattleSessionCaptureResult {
        val formulaInput =
            captureFormulaInputResolver.resolve(
                sessionId = session.currentSnapshot.battle.id,
                snapshot = session.currentSnapshot,
                action = action,
            )
        val formulaResult = captureFormulaService.calculate(formulaInput, session::nextCaptureShakeRoll)
        return BattleSessionCaptureResult(
            success = formulaResult.success,
            playerId = action.playerId,
            ballItemId = action.ballItemId,
            sourceUnitId = action.sourceUnitId,
            targetId = action.targetId,
            shakes = formulaResult.shakes,
            reason = formulaResult.reason,
            finalRate = formulaResult.finalRate,
        )
    }
}