Pull coal from fullest barrel
authorOlav Bakke Svendsen <mail@olavbs.no>
Tue, 17 Oct 2023 03:59:10 +0000 (05:59 +0200)
committerOlav Bakke Svendsen <mail@olavbs.no>
Tue, 17 Oct 2023 03:59:10 +0000 (05:59 +0200)
steam/temporary-coal-feeder.lua

index 80a64bf597fbd7b9f81cd3fcf339aa0d44b8e2cc..645e0dfc8c3b561731f870aa3a26015f7cb0a85c 100644 (file)
@@ -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)