88 lines
3.1 KiB
Lua
88 lines
3.1 KiB
Lua
-- We got to do this shit because enqueueInventory calls enqueueItem
|
|
-- And enqueueItem calls enqueueInventory
|
|
-- So unless we define them both before using them
|
|
-- We will get an error saying either is undefined
|
|
local enqueueItem
|
|
local enqueueSlot
|
|
local enqueueInventory
|
|
local _
|
|
|
|
---@param item Barotrauma.Item
|
|
---@param queue Barotrauma.Item[]
|
|
---@param predicate? fun(item: Barotrauma.Item): boolean
|
|
---@return Barotrauma.Item[], string?
|
|
enqueueItem = function(item, queue, predicate)
|
|
queue = queue or {}
|
|
predicate = predicate or function() return true end
|
|
-- debugPrint(string.format("Enqueuing item: %s", item.Prefab.Identifier.Value))
|
|
-- local err
|
|
-- This should make it breadth first, right...?
|
|
-- No, not yet...
|
|
local ok, stop = predicate(item)
|
|
if ok then
|
|
queue[#queue + 1] = item
|
|
end
|
|
if stop then return queue, "Stop" end
|
|
if item.OwnInventory then
|
|
-- As far as I know every item has only one inventory
|
|
-- Only machines have multiple
|
|
-- So inventrorY should be fine here
|
|
-- debugPrint("Item has its own inventory, enqueuing inventory...")
|
|
queue, _ = enqueueInventory(item.OwnInventory, queue, predicate)
|
|
-- if err then
|
|
-- debugPrint(string.format("Error enqueuing inventory: %s", err))
|
|
-- end
|
|
end
|
|
-- debugPrint(string.format("Item enqueued. Current queue size: %d", #queue))
|
|
return queue, nil
|
|
end
|
|
|
|
---@param slot Barotrauma.ItemInventory.Slot
|
|
---@param queue Barotrauma.Item[]
|
|
---@param predicate? fun(item: Barotrauma.Item): boolean
|
|
---@return Barotrauma.Item[], string?
|
|
enqueueSlot = function(slot, queue, predicate)
|
|
queue = queue or {}
|
|
predicate = predicate or function() return true end
|
|
-- debugPrint(string.format("Enqueuing slot with %d items.", #slot.items))
|
|
-- We don't want to shadow queue
|
|
local err
|
|
-- If the slot is empty there's nothing to iterate
|
|
-- And we will naturally return queue as is
|
|
for _, item in ipairs(slot.items) do
|
|
-- Only the final leaf nodes decide upon the predicate
|
|
queue, err = enqueueItem(item, queue, predicate)
|
|
if err then
|
|
return queue, err
|
|
end
|
|
end
|
|
-- debugPrint(string.format("Finished enqueuing slot. Current queue size: %d", #queue))
|
|
return queue
|
|
end
|
|
|
|
---@param inventory Barotrauma.ItemInventory
|
|
---@param queue Barotrauma.Item[]
|
|
---@param predicate? fun(item: Barotrauma.Item): boolean
|
|
---@return Barotrauma.Item[], string?
|
|
enqueueInventory = function(inventory, queue, predicate)
|
|
queue = queue or {}
|
|
predicate = predicate or function() return true end
|
|
-- debugPrint(string.format("Enqueuing inventory with %d slots.", #inventory.slots))
|
|
local err
|
|
for _, slot in ipairs(inventory.slots) do
|
|
-- Only the final leaf nodes decide upon the predicate
|
|
queue, err = enqueueSlot(slot, queue, predicate)
|
|
if err then
|
|
return queue, err
|
|
end
|
|
end
|
|
-- debugPrint(string.format("Finished enqueuing inventory. Current queue size: %d", #queue))
|
|
return queue
|
|
end
|
|
|
|
return {
|
|
enqueueItem = enqueueItem,
|
|
enqueueSlot = enqueueSlot,
|
|
enqueueInventory = enqueueInventory
|
|
}
|