diff --git a/lib/level/turn_order.lua b/lib/level/turn_order.lua index a448409..de1b52e 100644 --- a/lib/level/turn_order.lua +++ b/lib/level/turn_order.lua @@ -119,8 +119,18 @@ function turnOrder:remove(id) return end - self.actedQueue:remove(id) - self.pendingQueue:remove(id) + local function filterQueue(q, targetId) + local newQ = PriorityQueue.new(initiativeComparator) + for _, val in ipairs(q.data) do + if val ~= targetId then + newQ:insert(val) + end + end + return newQ + end + + self.actedQueue = filterQueue(self.actedQueue, id) + self.pendingQueue = filterQueue(self.pendingQueue, id) end return { new = new } diff --git a/lib/utils/priority_queue.lua b/lib/utils/priority_queue.lua index 7aca181..0097604 100644 --- a/lib/utils/priority_queue.lua +++ b/lib/utils/priority_queue.lua @@ -115,29 +115,4 @@ function PriorityQueue:copy() }, PriorityQueue) end ---- Удалить элемент из очереди. ---- Осторожно: O(n), так как нужно найти индекс элемента. ----@param x any -function PriorityQueue:remove(x) - local index = nil - for i, v in ipairs(self.data) do - if v == x then - index = i - break - end - end - - if not index then return end - - local n = #self.data - if index == n then - self.data[n] = nil - else - self.data[index] = self.data[n] - self.data[n] = nil - self:_sift_up(index) - self:_sift_down(index) - end -end - return PriorityQueue