GameBattleRequestViews.kt

package io.github.lishangbu.avalon.game.battle.api

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

/**
 * 面向前端的导入招式请求视图。
 *
 * @property moveId 招式标识。
 * @property currentPp 当前招式剩余 PP。
 */
data class GameBattleImportedMoveApiRequest(
    val moveId: String,
    val currentPp: Int? = null,
)

/**
 * 面向前端的单位导入元数据视图。
 */
data class GameBattleImportedUnitMetadataApiRequest(
    val level: Int,
    val creatureId: Long? = null,
    val creatureInternalName: String? = null,
    val natureId: Long? = null,
    val natureInternalName: String? = null,
    val captureContext: UnitCaptureContextState = UnitCaptureContextState(),
    val ivs: Map<String, Int> = emptyMap(),
    val evs: Map<String, Int> = emptyMap(),
)

/**
 * 面向前端的导入单位请求视图。
 *
 * @property unitId 单位标识。
 * @property metadata 单位结构化元数据。
 * @property abilityInternalName 特性内部名称。
 * @property itemId 道具标识。
 * @property moves 单位招式列表。
 * @property currentHp 当前生命值。
 * @property statusState 当前主状态运行时状态。
 * @property volatileStates 当前挥发状态运行时状态表。
 * @property conditionStates 当前附着条件运行时状态表。
 * @property boosts 当前 stage / boost 表。
 * @property forceSwitchRequested 当前单位是否被标记为强制替换。
 */
data class GameBattleImportedUnitApiRequest(
    val unitId: String,
    val metadata: GameBattleImportedUnitMetadataApiRequest,
    val abilityInternalName: String? = null,
    val itemId: String? = null,
    val moves: List<GameBattleImportedMoveApiRequest> = emptyList(),
    val currentHp: Int? = null,
    val statusState: AttachedEffectState? = null,
    val volatileStates: Map<String, AttachedEffectState> = emptyMap(),
    val conditionStates: Map<String, AttachedEffectState> = emptyMap(),
    val boosts: Map<String, Int> = emptyMap(),
    val forceSwitchRequested: Boolean = false,
)

/**
 * 面向前端的导入 side 请求视图。
 *
 * @property sideId side 标识。
 * @property units side 下的单位请求列表。
 * @property activeUnitIds 当前需要直接上场的单位标识集合。
 */
data class GameBattleImportedSideApiRequest(
    val sideId: String,
    val units: List<GameBattleImportedUnitApiRequest>,
    val activeUnitIds: Set<String> = emptySet(),
)

/**
 * 面向前端的导入建局请求视图。
 *
 * @property sessionId 会话标识。
 * @property formatId 战斗格式标识。
 * @property sides 本次建局的 side 列表。
 * @property battleKind 战斗种类。
 * @property capturableSideId 可被捕捉的 side 标识。
 * @property autoStart 当前会话是否在导入后自动启动。
 */
data class CreateImportedBattleSessionApiRequest(
    val sessionId: String,
    val formatId: String,
    val sides: List<GameBattleImportedSideApiRequest>,
    val battleKind: BattleType = BattleType.TRAINER,
    val capturableSideId: String? = null,
    val autoStart: Boolean = true,
)