BattleEngineCommands.kt

package io.github.lishangbu.avalon.game.battle.engine.application

import io.github.lishangbu.avalon.game.battle.engine.core.model.BattleType
import io.github.lishangbu.avalon.game.battle.engine.core.model.UnitState

/**
 * 引擎初始化时单个 side 的输入。
 *
 * 这里直接要求调用方提供已经装配完成的 `UnitState`,
 * 让 battle-engine 不再认识数据库实体或 dataset 读取细节。
 */
data class InitializeBattleSideCommand(
    val sideId: String,
    val units: List<UnitState>,
    val activeUnitIds: Set<String> = emptySet(),
)

/**
 * 引擎建局命令。
 *
 * 设计意图:
 * - 把原先 `create/configure/registerSide/registerUnit/start` 这一串低层步骤收成一个稳定入口;
 * - 让 game 模块只负责把真实数据装配成命令,而不再手动驱动引擎内部生命周期。
 */
data class InitializeBattleCommand(
    val sessionId: String,
    val formatId: String,
    val sides: List<InitializeBattleSideCommand>,
    val battleKind: BattleType = BattleType.TRAINER,
    val capturableSideId: String? = null,
    val autoStart: Boolean = true,
)

/**
 * 智能出招命令。
 */
data class SubmitMoveChoiceCommand(
    val attackerId: String,
    val moveId: String,
    val targetId: String? = null,
    val priority: Int? = null,
    val speed: Int? = null,
    val accuracy: Int? = null,
    val evasion: Int? = null,
    val basePower: Int? = null,
    val damage: Int? = null,
    val accuracyRoll: Int? = null,
    val chanceRoll: Int? = null,
    val criticalRoll: Int? = null,
    val damageRoll: Int? = null,
    val criticalHit: Boolean? = null,
    val attributes: Map<String, Any?> = emptyMap(),
)

/**
 * 智能用道具命令。
 */
data class SubmitItemChoiceCommand(
    val actorUnitId: String,
    val itemId: String,
    val targetId: String? = null,
    val priority: Int? = null,
    val speed: Int? = null,
    val chanceRoll: Int? = null,
    val attributes: Map<String, Any?> = emptyMap(),
)

/**
 * 智能捕捉命令。
 */
data class SubmitCaptureChoiceCommand(
    val playerId: String,
    val ballItemId: String,
    val sourceUnitId: String? = null,
    val targetId: String,
    val priority: Int? = null,
    val speed: Int? = null,
)

/**
 * 换人命令。
 */
data class SubmitSwitchChoiceCommand(
    val sideId: String,
    val outgoingUnitId: String,
    val incomingUnitId: String,
    val priority: Int? = null,
    val speed: Int? = null,
)

/**
 * 逃跑命令。
 */
data class SubmitRunChoiceCommand(
    val sideId: String,
    val priority: Int? = null,
    val speed: Int? = null,
)

/**
 * 替补上场命令。
 */
data class SubmitReplacementChoiceCommand(
    val sideId: String,
    val incomingUnitId: String,
)