BattleSessionCaptureActionHandler.kt
package io.github.lishangbu.avalon.game.battle.engine.core.session
import kotlin.reflect.KClass
/**
* `BattleSessionCaptureAction` 执行处理器。
*/
class BattleSessionCaptureActionHandler : BattleSessionActionHandler {
/**
* 当前处理器负责的 action 类型。
*/
override val actionType: KClass<out BattleSessionAction> = BattleSessionCaptureAction::class
/**
* 执行 capture action。
*/
override fun execute(
action: BattleSessionAction,
session: BattleSession,
): BattleSessionActionExecutionResult {
val captureAction =
action as? BattleSessionCaptureAction
?: error("Expected BattleSessionCaptureAction but got '${action::class.qualifiedName}'.")
val captureResult =
session.captureActionResolver.resolve(
session = session,
action = captureAction,
)
session.recordResourceUsage(
BattleSessionCaptureResourceUsage(
playerId = captureAction.playerId,
sourceUnitId = captureAction.sourceUnitId,
ballItemId = captureAction.ballItemId,
targetUnitId = captureAction.targetId,
quantity = 1,
success = captureResult.success,
shakes = captureResult.shakes,
reason = captureResult.reason,
finalRate = captureResult.finalRate,
),
)
session.currentSnapshot =
if (captureResult.success) {
session.finishByCapture(captureAction.targetId)
} else {
session.recordCaptureFailure(
ballItemId = captureAction.ballItemId,
targetUnitId = captureAction.targetId,
shakes = captureResult.shakes,
reason = captureResult.reason,
finalRate = captureResult.finalRate,
)
}
return BattleSessionActionExecutionResult(
action = captureAction,
snapshot = session.currentSnapshot,
captureResult = captureResult,
)
}
}