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,
                        )
                    },
            ),
        )
}