CaptureModels.kt
package io.github.lishangbu.avalon.game.capture
import io.github.lishangbu.avalon.game.battle.engine.core.capture.CaptureContext
import io.github.lishangbu.avalon.game.battle.engine.core.model.UnitState
import io.github.lishangbu.avalon.game.battle.engine.core.runtime.flow.BattleRuntimeSnapshot
import io.github.lishangbu.avalon.game.battle.engine.core.session.BattleSessionQuery
data class CaptureCommand(
val playerId: String,
val ballItemId: String,
val targetUnitId: String,
val sourceUnitId: String? = null,
)
data class CapturedCreatureSummary(
val ownedCreatureId: String,
val creatureId: String,
val creatureSpeciesId: String,
val creatureInternalName: String,
val creatureName: String,
)
data class CaptureBattleResult(
val success: Boolean,
val sessionId: String,
val targetUnitId: String,
val ballItemId: String,
val shakes: Int,
val reason: String,
val battleEnded: Boolean,
val finalRate: Double,
val session: BattleSessionQuery,
val capturedCreature: CapturedCreatureSummary? = null,
)
data class BattleUnitMetadata(
val creatureId: Long,
val creatureSpeciesId: Long,
val creatureInternalName: String,
val creatureName: String,
val level: Int,
val requiredExperience: Int,
val natureId: Long?,
val captureRate: Int?,
val ivs: Map<String, Int>,
val evs: Map<String, Int>,
val calculatedStats: Map<String, Int>,
)
/**
* 捕捉结算里用于扣库存的最小上下文。
*
* 说明:
* - battle 结束后统一扣资源时,并不总是需要完整的目标精灵元数据。
* - 先把玩家和球的真实主键解析出来,可以避免每次失败尝试都重复查物种信息。
*/
data class CaptureInventoryContext(
val playerId: Long,
val ballItemId: Long,
val ballItemInternalName: String,
)
data class PreparedCaptureContext(
val sessionId: String,
val playerId: Long,
val ballItemId: Long,
val ballItemInternalName: String,
val targetUnitId: String,
val sourceUnitId: String?,
val snapshot: BattleRuntimeSnapshot,
val targetUnit: UnitState,
val sourceUnit: UnitState?,
val targetMetadata: BattleUnitMetadata,
val battleContext: CaptureContext,
)