From 8633c9ea4472c3a0c8a2ed2be4d31425c393cebb Mon Sep 17 00:00:00 2001 From: Olav Bakke Svendsen Date: Tue, 17 Oct 2023 05:59:10 +0200 Subject: [PATCH] Pull coal from fullest barrel --- steam/temporary-coal-feeder.lua | 42 ++++++++++++++++++++++++--------- 1 file changed, 31 insertions(+), 11 deletions(-) diff --git a/steam/temporary-coal-feeder.lua b/steam/temporary-coal-feeder.lua index 80a64bf..645e0df 100644 --- a/steam/temporary-coal-feeder.lua +++ b/steam/temporary-coal-feeder.lua @@ -25,30 +25,49 @@ for _,p in pairs(peripheral.getNames()) do end end -local balance_coal = function() +local find_coal = function() local stock = {} - local min = { "", math.huge } + local total = 0 + local min = false for addr,barrel in pairs(coal_barrels) do local item = barrel.getItemDetail(1) - stock[addr] = item and item.count or 0 + local amt = item and item.count or 0 + stock[addr] = amt + total = total + amt end + -- this is shite code, deal with it + local avg = total/2 + for addr,barrel in pairs(coal_barrels) do + if stock[addr] > avg then + end return stock end +local fullest_coal_barrel = function(stock) + local r = { addr = false, count = 0 } + for barrel_addr, count in pairs(stock) do + if count >= fullest_coal_barrel.count then + r = { addr = barrel_addr, count = count } + end + end + return r.addr, r.count +end + local feed = function(stock) local stock = stock for deployer_addr,deployer in pairs(deployers) do local deployer_item = deployer.getItemDetail(1) if refill_when(deployer_item and deployer_item.count or 0) then local f = function() return false, "No coal available" end - for barrel_addr,count in pairs(stock) do - if count >= refill_amt then - stock[barrel_addr] = count - refill_amt - f = function() return deployer.pullItems(barrel_addr, 1, refill_amt, 1) end - break - end + local barrel_addr, count = fullest_coal_barrel(stock) +-- for barrel_addr,count in pairs(stock) do + if count >= refill_amt then + stock[barrel_addr] = count - refill_amt + f = function() return deployer.pullItems(barrel_addr, 1, refill_amt, 1) end +-- break end +-- end local ok, e = f() if not ok then print("Could not feed "..deployer_addr.."\n"..e) @@ -81,13 +100,14 @@ local print_stats = function(monitor, stock) monitor.setCursorPos(1,12) monitor.write("refreshes once every minute") + -- this doesn't work for some reason.. monitor.setTextColor(1) coal_at_boot = coal_at_boot or total_coal minutes_passed = minutes_passed + 1 if minutes_passed < 0 then local avg = (coal_at_boot - total_coal)/minutes_passed monitor.setCursorPos(1,6) - monitor.write("losing on average "..avg.."cc/m") + monitor.write("losing on average "..tostring(avg).."cc/m") end end @@ -118,7 +138,7 @@ while true do main_timer = os.startTimer(60) os.cancelTimer(spinner_timer) print_spinner(main_monitor, 29,12, "?") - local stock = balance_coal() + local stock = find_coal() print_stats(main_monitor, stock) print_spinner(main_monitor, 29,12, "*") feed(stock) -- 2.30.2