DefaultBattleInitializationService.kt
package io.github.lishangbu.avalon.game.battle.init
import io.github.lishangbu.avalon.game.battle.engine.application.BattleEngineService
import io.github.lishangbu.avalon.game.battle.engine.application.InitializeBattleCommand
import io.github.lishangbu.avalon.game.battle.engine.application.InitializeBattleSideCommand
import io.github.lishangbu.avalon.game.battle.engine.core.session.BattleSessionQuery
import io.github.lishangbu.avalon.game.service.unit.BattleUnitImporter
import org.springframework.stereotype.Service
/**
* 默认战斗初始化装配服务。
*
* 设计意图:
* - 把 `BattleUnitImporter` 这类真实数据装配逻辑留在 game;
* - 让 engine 只接收已经成型的 `UnitState`,不认识外部数据来源。
*/
@Service
class DefaultBattleInitializationService(
private val battleUnitImporter: BattleUnitImporter,
private val battleEngineService: BattleEngineService,
) : BattleInitializationService {
override fun createImportedSession(request: CreateImportedBattleSessionRequest): BattleSessionQuery =
battleEngineService.initializeSession(
InitializeBattleCommand(
sessionId = request.sessionId,
formatId = request.formatId,
battleKind = request.battleKind,
capturableSideId = request.capturableSideId,
autoStart = request.autoStart,
sides =
request.sides.map { side ->
InitializeBattleSideCommand(
sideId = side.sideId,
units = side.units.map { unitRequest -> battleUnitImporter.importUnit(unitRequest).unit },
activeUnitIds = side.activeUnitIds,
)
},
),
)
}