GameBattleSessionView.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.BattleLifecycle
import io.github.lishangbu.avalon.game.battle.engine.core.model.BattleType
import io.github.lishangbu.avalon.game.battle.engine.core.model.UnitMetadataState
import io.github.lishangbu.avalon.game.battle.engine.core.session.BattleSessionTurnStatus

/**
 * 面向前端的战斗会话视图。
 *
 * @property snapshot 当前战斗快照视图。
 * @property turnStatus 当前运行中回合的派生状态;非运行阶段时为空。
 * @property pendingActions 当前待执行动作视图列表。
 * @property choiceStatuses 当前回合各 side 的输入状态视图列表。
 * @property replacementRequests 当前待处理替补请求视图列表。
 * @property resourceLedger 当前资源账本视图列表。
 * @property captureResourceLedger 当前捕捉资源账本视图列表。
 * @property battleLogs 面向前端的人类可读 battle log。
 * @property events 面向前端的结构化事件视图列表。
 */
data class GameBattleSessionView(
    val snapshot: GameBattleSnapshotView,
    val turnStatus: BattleSessionTurnStatus?,
    val pendingActions: List<GameBattleActionView>,
    val choiceStatuses: List<GameBattleChoiceStatusView>,
    val replacementRequests: List<GameBattleReplacementRequestView>,
    val resourceLedger: List<GameBattleResourceUsageView>,
    val captureResourceLedger: List<GameBattleCaptureResourceUsageView>,
    val battleLogs: List<String>,
    val events: List<GameBattleEventView>,
)

/**
 * 面向前端的战斗快照视图。
 *
 * @property battle 战斗级状态视图。
 * @property field 场地级状态视图。
 * @property units 当前全部单位视图列表。
 * @property sides 当前全部 side 视图列表。
 */
data class GameBattleSnapshotView(
    val battle: GameBattleStateView,
    val field: GameBattleFieldView,
    val units: List<GameBattleUnitView>,
    val sides: List<GameBattleSideView>,
)

/**
 * 面向前端的战斗级状态视图。
 *
 * @property id 战斗实例唯一标识。
 * @property formatId 当前战斗采用的规则集标识。
 * @property battleKind 当前战斗种类。
 * @property lifecycle 当前战斗所处的全局生命周期阶段。
 * @property turn 当前回合数。
 * @property winner 战斗赢家标识。
 * @property endedReason 战斗结束原因。
 * @property capturableSideId 可被捕捉的 side 标识。
 * @property capturedUnitId 已被捕捉的目标单位标识。
 */
data class GameBattleStateView(
    val id: String,
    val formatId: String,
    val battleKind: BattleType,
    val lifecycle: BattleLifecycle,
    val turn: Int,
    val winner: String?,
    val endedReason: String?,
    val capturableSideId: String?,
    val capturedUnitId: String?,
)

/**
 * 面向前端的场地级状态视图。
 *
 * @property weatherState 当前天气运行时状态。
 * @property terrainState 当前地形运行时状态。
 */
data class GameBattleFieldView(
    val weatherState: AttachedEffectState?,
    val terrainState: AttachedEffectState?,
)

/**
 * 面向前端的单位状态视图。
 *
 * @property id 单位唯一标识。
 * @property currentHp 当前生命值。
 * @property maxHp 最大生命值。
 * @property metadata 当前单位结构化元数据。
 * @property statusState 主状态运行时状态。
 * @property abilityId 当前特性标识。
 * @property itemId 当前道具标识。
 * @property typeIds 当前属性列表。
 * @property volatileStates 当前挥发状态运行时状态表。
 * @property conditionStates 当前附着条件运行时状态表。
 * @property boosts 当前 stage / boost 表。
 * @property stats 当前运行时属性值表。
 * @property movePp 当前招式剩余 PP。
 * @property forceSwitchRequested 当前单位是否被标记为强制替换。
 */
data class GameBattleUnitView(
    val id: String,
    val currentHp: Int,
    val maxHp: Int,
    val metadata: UnitMetadataState,
    val statusState: AttachedEffectState?,
    val abilityId: String?,
    val itemId: String?,
    val typeIds: List<String>,
    val volatileStates: Map<String, AttachedEffectState>,
    val conditionStates: Map<String, AttachedEffectState>,
    val boosts: Map<String, Int>,
    val stats: Map<String, Int>,
    val movePp: Map<String, Int>,
    val forceSwitchRequested: Boolean,
)

/**
 * 面向前端的 side 状态视图。
 *
 * @property id side 唯一标识。
 * @property unitIds 当前 side 名下全部单位标识列表。
 * @property activeUnitIds 当前处于 active 槽位的单位标识列表。
 * @property conditionStates 当前 side condition 运行时状态表。
 */
data class GameBattleSideView(
    val id: String,
    val unitIds: List<String>,
    val activeUnitIds: List<String>,
    val conditionStates: Map<String, AttachedEffectState>,
)

/**
 * 面向前端的回合输入状态视图。
 *
 * @property sideId 当前 side 标识。
 * @property activeUnitIds 当前 active 单位列表。
 * @property submittedUnitIds 当前已经提交行动的单位列表。
 * @property missingUnitIds 当前尚未提交行动的单位列表。
 * @property requiredActionCount 当前回合要求提交的行动数量。
 * @property submittedActionCount 当前回合已经提交的行动数量。
 * @property ready 当前 side 是否已满足回合结算前置条件。
 */
data class GameBattleChoiceStatusView(
    val sideId: String,
    val activeUnitIds: List<String>,
    val submittedUnitIds: List<String>,
    val missingUnitIds: List<String>,
    val requiredActionCount: Int,
    val submittedActionCount: Int,
    val ready: Boolean,
)

/**
 * 面向前端的替补请求视图。
 *
 * @property sideId 需要替补的 side 标识。
 * @property outgoingUnitIds 当前需要下场的单位列表。
 * @property candidateUnitIds 当前可选替补单位列表。
 */
data class GameBattleReplacementRequestView(
    val sideId: String,
    val outgoingUnitIds: List<String>,
    val candidateUnitIds: List<String>,
)