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