BoostCompareConditionInterpreter.kt

package io.github.lishangbu.avalon.game.battle.engine.core.runtime.condition

import io.github.lishangbu.avalon.game.battle.engine.core.dsl.ConditionNode
import io.github.lishangbu.avalon.game.battle.engine.core.dsl.condition.BoostCompareConditionNode
import io.github.lishangbu.avalon.game.battle.engine.core.event.EventContext
import io.github.lishangbu.avalon.game.battle.engine.core.runtime.ConditionInterpreter
import io.github.lishangbu.avalon.game.battle.engine.core.runtime.support.BattleStatStageSupport
import io.github.lishangbu.avalon.game.battle.engine.core.runtime.support.ComparisonSupport
import io.github.lishangbu.avalon.game.battle.engine.core.runtime.support.EventContextActorReader
import io.github.lishangbu.avalon.game.battle.engine.core.type.ConditionTypeId
import io.github.lishangbu.avalon.game.battle.engine.core.type.StandardConditionTypeIds

/**
 * `boost_compare` 条件解释器。
 */
class BoostCompareConditionInterpreter : ConditionInterpreter {
    override val type: ConditionTypeId = StandardConditionTypeIds.BOOST_COMPARE

    override fun evaluate(
        condition: ConditionNode,
        context: EventContext,
    ): Boolean {
        require(condition is BoostCompareConditionNode) { "Condition must be BoostCompareConditionNode." }
        val unit =
            requireNotNull(EventContextActorReader.readUnit(condition.actor, context)) {
                "Actor '${condition.actor.value}' is not available for boost evaluation."
            }
        val actual = BattleStatStageSupport.readStage(unit.boosts, condition.stat)
        return ComparisonSupport.compare(actual.toDouble(), condition.operator, condition.value.toDouble())
    }
}