BattleSessionActionQueue.kt

package io.github.lishangbu.avalon.game.battle.engine.core.session

import io.github.lishangbu.avalon.game.battle.engine.core.runtime.flow.BattleRuntimeSnapshot

/**
 * BattleSession 的最小动作队列。
 *
 * 设计意图:
 * - 为一回合内多个 move action 提供收集与顺序执行能力。
 * - 当前排序已升级为基于 snapshot 的动态解析:
 *   1. priority
 *   2. 有效速度
 *   3. action type order
 *   4. side / active slot 稳定顺序
 *   5. enqueueOrder
 *
 * @property actionSortingStrategy 当前队列使用的 action 排序策略。
 */
class BattleSessionActionQueue(
    private val actionSortingStrategy: BattleSessionActionSortingStrategy,
) {
    private val actions: MutableList<QueuedBattleSessionMoveAction> = mutableListOf()
    private var nextEnqueueOrder: Long = 0

    /**
     * 入队一个 move action。
     */
    fun enqueue(action: BattleSessionAction) {
        actions +=
            QueuedBattleSessionMoveAction(
                action = action,
                enqueueOrder = nextEnqueueOrder++,
            )
    }

    /**
     * 返回当前待执行动作的只读快照。
     */
    fun snapshot(): List<BattleSessionAction> = actions.map(QueuedBattleSessionMoveAction::action)

    /**
     * 取出并清空当前队列。
     */
    fun drain(snapshot: BattleRuntimeSnapshot): List<BattleSessionAction> {
        val drained = actionSortingStrategy.sort(snapshot, actions)
        actions.clear()
        return drained
    }

    /**
     * 以给定动作列表重建当前队列。
     */
    fun replaceAll(newActions: List<BattleSessionAction>) {
        actions.clear()
        nextEnqueueOrder = 0
        newActions.forEach(::enqueue)
    }

    /**
     * 当前队列是否为空。
     */
    fun isEmpty(): Boolean = actions.isEmpty()
}