DefaultBattleSettlementExecutor.kt
package io.github.lishangbu.avalon.game.battle.settlement
import io.github.lishangbu.avalon.game.battle.engine.application.BattleEngineService
import io.github.lishangbu.avalon.game.battle.engine.application.BattleSettlementPlan
import io.github.lishangbu.avalon.game.battle.engine.application.BattleSettlementTask
import io.github.lishangbu.avalon.game.battle.engine.core.session.BattleSessionQuery
import io.github.lishangbu.avalon.game.capture.BattleCaptureSettlementService
import io.github.lishangbu.avalon.game.capture.CaptureBattleResult
import org.springframework.stereotype.Service
/**
* 默认结算计划执行器。
*
* 设计意图:
* - 让 engine 只负责规划任务,不直接碰真实副作用;
* - 让 game 按照计划顺序统一执行库存扣减、落库和最终 settled 标记。
*/
@Service
class DefaultBattleSettlementExecutor(
private val battleEngineService: BattleEngineService,
private val battleCaptureSettlementService: BattleCaptureSettlementService,
) : BattleSettlementExecutor {
override fun execute(plan: BattleSettlementPlan): BattleSettlementResult {
var currentSession = plan.session
var captureResult: CaptureBattleResult? = null
plan.tasks.forEach { task ->
when (task) {
BattleSettlementTask.SETTLE_CAPTURE_LEDGER -> {
captureResult = battleCaptureSettlementService.settle(plan.sessionId, currentSession)
}
BattleSettlementTask.MARK_SESSION_SETTLED -> {
currentSession = battleEngineService.markSessionSettled(plan.sessionId)
}
}
}
return BattleSettlementResult(
sessionId = plan.sessionId,
endedReason = currentSession.snapshot.battle.endedReason,
settled =
currentSession.snapshot.battle.lifecycle
.isSettled(),
session = currentSession,
captureResult = captureResult,
)
}
}