BattleSessionLifecycleEventPayloads.kt

package io.github.lishangbu.avalon.game.battle.engine.core.session

/**
 * battle session 启动事件 payload。
 */
data object BattleSessionStartedPayload : BattleSessionEventPayload {
    /**
     * 当前 payload 对应的结构化事件类型。
     */
    override val type: BattleSessionEventType = BattleSessionEventType.SESSION_STARTED
}

/**
 * side 注册事件 payload。
 *
 * @property sideId 本次注册的 side 标识。
 */
data class BattleSessionSideRegisteredPayload(
    val sideId: String,
) : BattleSessionEventPayload {
    /**
     * 当前 payload 对应的结构化事件类型。
     */
    override val type: BattleSessionEventType = BattleSessionEventType.SIDE_REGISTERED
}

/**
 * 单位注册事件 payload。
 *
 * @property sideId 单位所属 side 标识。
 * @property unitId 本次注册的单位标识。
 * @property active 单位是否直接加入 active 列表。
 */
data class BattleSessionUnitRegisteredPayload(
    val sideId: String,
    val unitId: String,
    val active: Boolean,
) : BattleSessionEventPayload {
    /**
     * 当前 payload 对应的结构化事件类型。
     */
    override val type: BattleSessionEventType = BattleSessionEventType.UNIT_REGISTERED
}

/**
 * 捕捉失败事件 payload。
 *
 * @property ballItemId 使用的球类道具标识。
 * @property targetUnitId 捕捉目标单位标识。
 * @property shakes 本次捕捉的摇晃次数。
 * @property reason 捕捉失败原因。
 * @property finalRate 本次捕捉的最终概率。
 */
data class BattleSessionCaptureFailedPayload(
    val ballItemId: String,
    val targetUnitId: String,
    val shakes: Int,
    val reason: String,
    val finalRate: Double,
) : BattleSessionEventPayload {
    /**
     * 当前 payload 对应的结构化事件类型。
     */
    override val type: BattleSessionEventType = BattleSessionEventType.CAPTURE_FAILED
}

/**
 * 逃跑失败事件 payload。
 *
 * @property sideId 发起逃跑的 side 标识。
 * @property runnerUnitId 代表本次逃跑尝试的单位标识。
 * @property reason 本次逃跑失败原因。
 * @property failedAttempts 当前 side 已累计的失败逃跑次数。
 * @property escapeValue 本次公式计算得到的逃走值;若未进入公式则为空。
 * @property roll 本次随机判定值;若未进入随机判定则为空。
 */
data class BattleSessionRunFailedPayload(
    val sideId: String,
    val runnerUnitId: String?,
    val reason: String,
    val failedAttempts: Int,
    val escapeValue: Int? = null,
    val roll: Int? = null,
) : BattleSessionEventPayload {
    /**
     * 当前 payload 对应的结构化事件类型。
     */
    override val type: BattleSessionEventType = BattleSessionEventType.RUN_FAILED
}

/**
 * 捕捉成功事件 payload。
 *
 * @property targetUnitId 被成功捕捉的目标单位标识。
 */
data class BattleSessionCaptureSucceededPayload(
    val targetUnitId: String,
) : BattleSessionEventPayload {
    /**
     * 当前 payload 对应的结构化事件类型。
     */
    override val type: BattleSessionEventType = BattleSessionEventType.CAPTURE_SUCCEEDED
}

/**
 * 回合结算完成事件 payload。
 *
 * @property actionCount 本回合已执行的 action 数量。
 */
data class BattleSessionTurnResolvedPayload(
    val actionCount: Int,
) : BattleSessionEventPayload {
    /**
     * 当前 payload 对应的结构化事件类型。
     */
    override val type: BattleSessionEventType = BattleSessionEventType.TURN_RESOLVED
}

/**
 * 回合结束事件 payload。
 */
data object BattleSessionTurnEndedPayload : BattleSessionEventPayload {
    /**
     * 当前 payload 对应的结构化事件类型。
     */
    override val type: BattleSessionEventType = BattleSessionEventType.TURN_ENDED
}

/**
 * 替补完成事件 payload。
 *
 * @property sideId 发生替补的 side 标识。
 * @property before 替补前的 active 单位列表;手动替补时可为空。
 * @property after 替补后的 active 单位列表。
 * @property manual 当前替补是否来自手动提交;自动替补时可为空。
 */
data class BattleSessionAutoReplacedPayload(
    val sideId: String,
    val before: List<String>? = null,
    val after: List<String>,
    val manual: Boolean? = null,
) : BattleSessionEventPayload {
    /**
     * 当前 payload 对应的结构化事件类型。
     */
    override val type: BattleSessionEventType = BattleSessionEventType.AUTO_REPLACED
}

/**
 * 战斗结束事件 payload。
 *
 * @property winner 当前战斗胜者标识;平局时为空。
 * @property actionType 如果战斗由某类 action 直接结束,则记录该动作种类。
 * @property runner 如果战斗由逃跑直接结束,则记录逃跑方 side 标识。
 */
data class BattleSessionBattleEndedPayload(
    val winner: String?,
    val actionType: BattleSessionActionEventKind? = null,
    val runner: String? = null,
) : BattleSessionEventPayload {
    /**
     * 当前 payload 对应的结构化事件类型。
     */
    override val type: BattleSessionEventType = BattleSessionEventType.BATTLE_ENDED
}