Fix Andesite vault discovery and monitor scaling

This commit is contained in:
2026-07-17 01:25:34 +02:00
parent 8ea978196e
commit 17ed31c60c
+42 -21
View File
@@ -2,8 +2,8 @@
-- Two Create Item Vaults are discovered by their contents and remembered.
local REFRESH_SECONDS = 1
local MIN_WIDTH = 42
local MIN_HEIGHT = 15
local MIN_WIDTH = 28
local MIN_HEIGHT = 13
local CLUTCH_OUTPUT_SIDE = "left"
local STATE_FILE = "create_andesite_state.txt"
local DEVICE_FILE = "create_andesite_devices.txt"
@@ -142,7 +142,14 @@ local function countItems(inventory, wanted)
if not inventory then return 0 end
local count = 0
for _, item in pairs(inventory.list) do
if wanted[item.name] then count = count + (tonumber(item.count) or 0) end
local name = tostring(item.name or ""):lower()
local matches = wanted[item.name]
if wanted == ZINC_ITEMS and name:find("zinc", 1, true) and name:find("nugget", 1, true) then
matches = true
elseif wanted == ALLOY_ITEMS and name:find("andesite_alloy", 1, true) then
matches = true
end
if matches then count = count + (tonumber(item.count) or 0) end
end
return count
end
@@ -155,11 +162,13 @@ local function discoverVaults()
local oldZinc, oldAlloy = devices.zinc, devices.alloy
local savedZinc = getInventory(devices.zinc)
local savedAlloy = getInventory(devices.alloy)
local connectedVaults = {}
for _, name in ipairs(peripheral.getNames()) do
if isVault(name) then
local inventory = getInventory(name)
if inventory then
connectedVaults[#connectedVaults + 1] = inventory
if containsItems(inventory, ZINC_ITEMS) then
devices.zinc = name
savedZinc = inventory
@@ -172,6 +181,27 @@ local function discoverVaults()
end
end
-- This controller intentionally owns exactly two vaults. If a mod supplies
-- Zinc Nuggets under an unexpected registry name, the non-alloy vault is
-- still unambiguous and becomes the input vault.
if not savedZinc and savedAlloy and #connectedVaults == 2 then
for _, inventory in ipairs(connectedVaults) do
if inventory.name ~= savedAlloy.name then
devices.zinc = inventory.name
savedZinc = inventory
end
end
end
if not savedAlloy and savedZinc and #connectedVaults == 2 then
for _, inventory in ipairs(connectedVaults) do
if inventory.name ~= savedZinc.name then
devices.alloy = inventory.name
savedAlloy = inventory
end
end
end
if devices.zinc ~= oldZinc or devices.alloy ~= oldAlloy then
saveText(DEVICE_FILE, textutils.serialize(devices))
end
@@ -198,11 +228,6 @@ local function discoverStressometer()
return nil, nil, nil, nil
end
local function percentage(value, maximum)
if not maximum or maximum <= 0 then return 0 end
return math.min(100, value / maximum * 100)
end
local function evaluate()
local zincVault, alloyVault = discoverVaults()
local zinc = countItems(zincVault, ZINC_ITEMS)
@@ -248,13 +273,10 @@ local function drawInventory(y, label, count, inventory, color)
center(y, label .. ": NO DATA", colors.red)
return
end
local fill = percentage(inventory.total, inventory.capacity)
local fillText = ("%.1f"):format(fill):gsub("%.", ",")
local text = ("%s: %s / %s %s%%"):format(
local text = ("%s %s / %s"):format(
label,
formatInteger(count),
formatInteger(inventory.capacity),
fillText
formatInteger(inventory.capacity)
)
center(y, text, color or colors.white)
end
@@ -263,7 +285,7 @@ local function drawButton(height, data)
local width = monitor.getSize()
local label = requestedRunning and " CONTROL: ENABLED " or " CONTROL: DISABLED "
local x = math.max(1, math.floor((width - #label) / 2) + 1)
local y = math.max(14, height - 1)
local y = math.max(12, height - 1)
button.x1 = x
button.x2 = math.min(width, x + #label - 1)
@@ -285,11 +307,11 @@ local function render()
monitor.setBackgroundColor(colors.black)
monitor.clear()
center(1, "ANDESITE ALLOY FACTORY", colors.cyan)
center(1, "ANDESITE FACTORY", colors.cyan)
drawInventory(3, "ZINC NUGGETS", data.zinc, data.zincVault,
drawInventory(3, "ZINC", data.zinc, data.zincVault,
data.zinc <= 0 and colors.orange or colors.lime)
drawInventory(4, "ANDESITE ALLOY", data.alloy, data.alloyVault,
drawInventory(4, "ALLOY", data.alloy, data.alloyVault,
data.alloyVault and data.alloyVault.total >= data.alloyVault.capacity and colors.orange or colors.lime)
center(6, "MACHINE SHAFT", colors.cyan)
@@ -299,15 +321,14 @@ local function render()
center(7, "Speed: NO DATA", colors.red)
end
if data.capacity then
center(8, "Capacity: " .. formatInteger(data.capacity) .. " SU", colors.white)
center(9, "Usage: " .. formatInteger(data.usage) .. " SU", colors.white)
center(8, "SU: " .. formatInteger(data.usage) .. " / " .. formatInteger(data.capacity), colors.white)
local loadText = ("Load: %.1f %%"):format(data.load):gsub("%.", ",")
center(10, loadText, data.load >= 90 and colors.red or data.load >= 70 and colors.orange or colors.lime)
center(9, loadText, data.load >= 90 and colors.red or data.load >= 70 and colors.orange or colors.lime)
else
center(8, "Shaft network offline", colors.gray)
end
center(12, data.status, data.statusColor)
center(11, data.status, data.statusColor)
drawButton(height, data)
center(height, "Touch = Anlage freigeben/stoppen", colors.gray)
end