DefaultBattleSessionRunChoiceSpecification.kt
package io.github.lishangbu.avalon.game.battle.engine.core.session.specification
import io.github.lishangbu.avalon.game.battle.engine.core.model.BattleType
import io.github.lishangbu.avalon.game.battle.engine.core.session.BattleSession
/**
* 默认逃跑提交规格。
*/
class DefaultBattleSessionRunChoiceSpecification : BattleSessionRunChoiceSpecification {
/**
* 校验某个 side 当前是否允许提交逃跑选择。
*/
override fun validate(
session: BattleSession,
sideId: String,
): BattleSessionValidationResult {
if (session.currentSnapshot.battle.battleKind != BattleType.WILD) {
return BattleSessionValidationResult.rejected("Run is only allowed in wild battles.")
}
val side =
session.currentSnapshot.sides[sideId]
?: return BattleSessionValidationResult.rejected("Side '$sideId' was not found.")
val submittedUnitIds = session.submittedUnitIdsForSide(side)
if (submittedUnitIds.isNotEmpty()) {
return BattleSessionValidationResult.rejected(
"Side '$sideId' already has submitted action(s) for active units: $submittedUnitIds",
)
}
return BattleSessionValidationResult.satisfied()
}
}