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()
    }
}