DefaultBattleSessionItemChoiceSpecification.kt
package io.github.lishangbu.avalon.game.battle.engine.core.session.specification
import io.github.lishangbu.avalon.game.battle.engine.core.runtime.support.BattleFieldConditionSupport
import io.github.lishangbu.avalon.game.battle.engine.core.session.BattleSession
import io.github.lishangbu.avalon.game.battle.engine.spi.effect.EffectDefinitionRepository
/**
* 默认 item 选择限制规格。
*
* 当前已覆盖:
* - `embargo`:禁止主动使用物品。
* - `magic-room-field`:field 上 room 生效期间,禁止主动使用物品。
*/
class DefaultBattleSessionItemChoiceSpecification(
private val effectRepository: EffectDefinitionRepository,
) : BattleSessionItemChoiceSpecification {
override fun validate(
session: BattleSession,
itemId: String,
actorUnitId: String,
): BattleSessionValidationResult {
val actor =
session.currentSnapshot.units[actorUnitId]
?: return BattleSessionValidationResult.rejected(
"Actor unit '$actorUnitId' was not found.",
)
if (!effectRepository.contains(itemId)) {
return BattleSessionValidationResult.rejected("Item effect '$itemId' was not found.")
}
if (BattleSessionChoiceRestrictionSupport.hasEmbargo(actor)) {
return BattleSessionValidationResult.rejected(
"Unit '$actorUnitId' is under embargo and cannot use item '$itemId'.",
)
}
if (BattleFieldConditionSupport.hasMagicRoom(session.currentSnapshot)) {
return BattleSessionValidationResult.rejected(
"Field is under magic room and item '$itemId' cannot be used.",
)
}
return BattleSessionValidationResult.satisfied()
}
}