GameBattleActionView.kt

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

import io.github.lishangbu.avalon.game.battle.engine.core.session.BattleSessionActionKind

/**
 * 面向前端的战斗动作视图。
 *
 * @property kind 当前动作种类。
 * @property priority 当前动作优先级。
 * @property speed 当前动作排序速度。
 * @property submittingUnitId 提交当前动作的单位标识。
 * @property sideId 当前动作所属 side 标识。
 * @property effectId 当前动作对应的 effect 标识。
 * @property targetUnitId 当前动作目标单位标识。
 * @property playerId 发起捕捉的玩家标识。
 * @property ballItemId 使用的球类道具标识。
 * @property outgoingUnitId 当前下场单位标识。
 * @property incomingUnitId 即将上场单位标识。
 */
data class GameBattleActionView(
    val kind: BattleSessionActionKind,
    val priority: Int,
    val speed: Int,
    val submittingUnitId: String? = null,
    val sideId: String? = null,
    val effectId: String? = null,
    val targetUnitId: String? = null,
    val playerId: String? = null,
    val ballItemId: String? = null,
    val outgoingUnitId: String? = null,
    val incomingUnitId: String? = null,
)

/**
 * 面向前端的 move 结算视图。
 *
 * @property cancelled 本次出招是否在前置阶段被取消。
 * @property hitSuccessful 本次出招是否成功命中目标。
 * @property criticalHit 本次出招是否击中要害。
 * @property accuracy 经过修正后的命中值。
 * @property evasion 经过修正后的回避值。
 * @property basePower 经过修正后的威力。
 * @property damageRoll 本次伤害浮动使用的随机倍率;未参与伤害浮动时为空。
 * @property damage 经过修正后的伤害。
 */
data class GameBattleMoveResolutionView(
    val cancelled: Boolean,
    val hitSuccessful: Boolean,
    val criticalHit: Boolean,
    val accuracy: Int?,
    val evasion: Int?,
    val basePower: Int,
    val damageRoll: Int? = null,
    val damage: Int,
)

/**
 * 面向前端的捕捉动作执行结果视图。
 *
 * @property success 本次捕捉是否成功。
 * @property playerId 发起捕捉的玩家标识。
 * @property ballItemId 使用的球类道具标识。
 * @property sourceUnitId 扔球单位标识。
 * @property targetId 捕捉目标单位标识。
 * @property shakes 本次捕捉的摇晃次数。
 * @property reason 本次捕捉结果原因。
 * @property finalRate 本次捕捉的最终概率。
 */
data class GameBattleCaptureExecutionView(
    val success: Boolean,
    val playerId: String,
    val ballItemId: String,
    val sourceUnitId: String,
    val targetId: String,
    val shakes: Int,
    val reason: String,
    val finalRate: Double,
)

/**
 * 面向前端的单个动作执行结果视图。
 *
 * @property action 已执行动作视图。
 * @property snapshot 执行该动作后的快照视图。
 * @property moveResult 如果该动作是 move,则附带其结算视图。
 * @property captureResult 如果该动作是 capture,则附带其结算视图。
 * @property skippedReason 如果该动作在轮到执行前已失效,则记录跳过原因。
 */
data class GameBattleActionExecutionResultView(
    val action: GameBattleActionView,
    val snapshot: GameBattleSnapshotView,
    val moveResult: GameBattleMoveResolutionView? = null,
    val captureResult: GameBattleCaptureExecutionView? = null,
    val skippedReason: String? = null,
)

/**
 * 面向前端的整回合推进结果视图。
 *
 * @property actionResults 本回合动作执行结果视图列表。
 * @property snapshot 执行动作并完成回合结束后的最新快照视图。
 */
data class GameBattleTurnResultView(
    val actionResults: List<GameBattleActionExecutionResultView>,
    val snapshot: GameBattleSnapshotView,
)