AddRelayActionExecutor.kt

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

import io.github.lishangbu.avalon.game.battle.engine.core.dsl.ActionNode
import io.github.lishangbu.avalon.game.battle.engine.core.dsl.action.AddRelayActionNode
import io.github.lishangbu.avalon.game.battle.engine.core.event.EventContext
import io.github.lishangbu.avalon.game.battle.engine.core.runtime.ActionExecutor
import io.github.lishangbu.avalon.game.battle.engine.core.runtime.ActionResult
import io.github.lishangbu.avalon.game.battle.engine.core.runtime.support.BattleRelayReader
import io.github.lishangbu.avalon.game.battle.engine.core.type.ActionTypeId
import io.github.lishangbu.avalon.game.battle.engine.core.type.StandardActionTypeIds

/**
 * `add_relay` 动作执行器。
 */
class AddRelayActionExecutor : ActionExecutor {
    override val type: ActionTypeId = StandardActionTypeIds.ADD_RELAY

    override fun execute(
        action: ActionNode,
        context: EventContext,
    ): ActionResult {
        require(action is AddRelayActionNode) { "Action must be AddRelayActionNode." }
        val relayValue =
            BattleRelayReader.readDouble(context.relay)
                ?: error("add_relay requires numeric relay value.")
        return ActionResult(
            relay = relayValue + action.value,
        )
    }
}