Advertisement
DioEraclea

ReactorD

Jul 30th, 2015
358
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. function write(color, line, caption, text)
  2.   local monitor = peripheral.find("monitor")
  3.   monitor.setCursorPos(1, line)
  4.   monitor.setTextColor(colors.white)
  5.   monitor.write(caption)
  6.   monitor.setTextColor(color)
  7.   monitor.write(text)
  8.   return line + 1
  9. end
  10.  
  11. function findReactors()
  12.   local reactors = {}
  13.   local allReactors = {peripheral.find("BigReactors-Reactor")}
  14.   local i = 0
  15.   for k, v in pairs(allReactors) do
  16.     print("Found reactor " .. i)
  17.     local reactor = {}
  18.     reactor.lastRf = 0
  19.     reactor.maxControlRods = v.getNumberOfControlRods() * 100
  20.     reactor.controlRods = reactor.maxControlRods
  21.     reactor.energyProduced = 0
  22.     reactor.fuelConsumed = 0
  23.     reactor.tickCount = 0
  24.     reactor.api = v
  25.     reactor.lastCasingTemperature = 0
  26.     reactor.lastFuelTemperature= 0
  27.     reactors[i] = reactor
  28.     i = i + 1
  29.   end
  30.   return reactors
  31. end
  32.  
  33. function findTurbines()
  34.   local turbines = {}
  35.   local allTurbines = {peripheral.find("BigReactors-Turbine")}
  36.   local i = 0
  37.   for k, v in pairs(allTurbines) do
  38.     print("Found turbine " .. i)
  39.     local turbine = {}
  40.     turbine.api = v
  41.     turbines[i] = turbine
  42.     i = i + 1
  43.   end
  44.   return turbines
  45. end
  46.  
  47. function reactorControl(line, rt, reduceEnergy)
  48.  
  49.   local monitor = peripheral.find("monitor")
  50.   local reactor = rt.api
  51.  
  52.  
  53.   local rfStored = math.floor(reactor.getEnergyStored() / 100000)
  54.   local fuelTemperature = reactor.getFuelTemperature()
  55.   local casingTemperature = reactor.getCasingTemperature()
  56.  
  57.   if math.abs(fuelTemperature - rt.lastFuelTemperature) < 3 and math.abs(casingTemperature - rt.lastCasingTemperature) < 3 or rt.controlRods == rt.maxControlRods then
  58.     if reduceEnergy then
  59.       if rfStored >= rt.lastRf then
  60.         rt.controlRods = rt.controlRods + 2
  61.       end  
  62.     else
  63.       if rfStored < rt.lastRf then
  64.         rt.controlRods = rt.controlRods - 2
  65.       end
  66.       if rfStored > rt.lastRf then
  67.         rt.controlRods = rt.controlRods + 2
  68.       end
  69.       if rfStored == rt.lastRf then
  70.         if rfStored > 90 then
  71.           rt.controlRods = rt.controlRods + 2
  72.         end
  73.       end
  74.       if rfStored < 1 then
  75.         rt.controlRods = rt.controlRods - 2
  76.       end
  77.     end
  78.   end
  79.  
  80.   if rt.controlRods > rt.maxControlRods then
  81.     rt.controlRods = rt.maxControlRods
  82.   end
  83.   if rt.controlRods < 0 then
  84.     rt.controlRods = 0
  85.   end
  86.  
  87.   if not reactor.getActive() then
  88.     rt.controlRods = rt.maxControlRods
  89.   end  
  90.  
  91.   rt.lastRf = rfStored
  92.   rt.lastFuelTemperature = fuelTemperature
  93.   rt.lastCasingTemperature = casingTemperature
  94.  
  95.   local level = math.ceil(rt.controlRods * 100 / rt.maxControlRods)
  96.   local numberOfReduced = (level * rt.api.getNumberOfControlRods()) - rt.controlRods
  97.  
  98.   for i = 1,numberOfReduced do
  99.     reactor.setControlRodLevel(i-1, level-1)
  100.   end
  101.   for i = numberOfReduced + 1,reactor.getNumberOfControlRods() do
  102.     reactor.setControlRodLevel(i-1, level)
  103.   end
  104.  
  105.   if reactor.getActive() then
  106.     rt.energyProduced = (rt.energyProduced * rt.tickCount + reactor.getEnergyProducedLastTick()) / (rt.tickCount + 1)
  107.     rt.fuelConsumed = (rt.fuelConsumed * rt.tickCount + reactor.getFuelConsumedLastTick()) / (rt.tickCount + 1)
  108.     rt.tickCount = rt.tickCount + 1
  109.     if (rt.tickCount > 600) then
  110.       rt.tickCount = 600
  111.     end
  112.   end
  113.  
  114.   local color
  115.   if reactor.getActive() then
  116.     color = colors.lime
  117.   else
  118.     color = colors.red
  119.   end
  120.  
  121.   line = write(color, line, "RF/T         : ", math.floor(reactor.getEnergyProducedLastTick()) .. " (" .. math.floor(rt.energyProduced) .. ")")
  122.   line = write(color, line, "mB/T         : ", math.floor(reactor.getFuelConsumedLastTick() * 1000) / 1000 .. " (" .. math.floor(rt.fuelConsumed * 1000) / 1000 .. ")")
  123.   line = write(color, line, "RF/mB        : ", math.floor(reactor.getEnergyProducedLastTick() / reactor.getFuelConsumedLastTick()) .. " (" .. math.floor(rt.energyProduced / rt.fuelConsumed).. ")")
  124.   line = line + 1
  125.   line = write(color, line, "Fuel Amount  : ", math.floor(reactor. getFuelAmount()) .. " (" .. math.floor(reactor.getFuelAmount() * 1000  / reactor.getFuelAmountMax()) / 10 .. "%)")
  126.   line = line + 1
  127.   line = write(color, line, "Heat (C/F)   : ", math.floor(reactor.getCasingTemperature()) .. " / " .. math.floor(reactor.getFuelTemperature()))
  128.   line = line + 1
  129.   line = write(color, line, "Control Rods : ", math.floor(rt.controlRods * 100 / rt.maxControlRods * 10) / 10)
  130.  
  131.   return line
  132.  
  133. end
  134.  
  135. function sumEnergyStored(list)
  136.   local value = 0
  137.   for k,v in pairs(list) do
  138.     value = v.api.getEnergyStored() + value
  139.   end
  140.   return value
  141. end
  142.  
  143. function checkReduce(turbines)
  144.   for k,v in pairs(turbines) do
  145.     if v.api.getEnergyStored() > 900000 then
  146.       return true
  147.     end
  148.   end
  149.   return false
  150. end
  151.  
  152. function loop(reactors, turbines)
  153.   local lastRfTurbine = 0
  154.   while true do
  155.     local monitor = peripheral.find("monitor")
  156.     monitor.clear()
  157.     monitor.setTextScale(1)
  158.     local line = 1
  159.     local rfTurbine = sumEnergyStored(turbines)
  160.     local rfReactors = sumEnergyStored(reactors)
  161.     local reduceEnergy
  162.     if math.floor(rfTurbine / 100) > math.floor(lastRfTurbine / 100) then
  163.       lastRfTurbine = rfTurbine
  164.       reduceEnergy = true
  165.     end
  166.     if math.floor(lastRfTurbine / 100) > math.floor(rfTurbine / 100) then
  167.       lastRfTurbine = rfTurbine
  168.       reduceEnergy = false
  169.     end
  170.     if math.floor(lastRfTurbine / 100) == math.floor(rfTurbine / 100) then
  171.       reduceEnergy = checkReduce(turbines)
  172.     end  
  173.     local color = colors.lime
  174.     if reduceEnergy then
  175.       color = colors.red
  176.     end
  177.     line = write(color, line, "RF Stored    : ", math.floor(rfTurbine + rfReactors))
  178.     line = line + 2
  179.  
  180.     for k,v in pairs(reactors) do
  181.       line = reactorControl(line, v, reduceEnergy) + 3
  182.     end
  183.     lastRfTurbine = rfTurbine
  184.     sleep(2)
  185.   end
  186. end
  187.  
  188. function doLoop()
  189.   local reactorList = findReactors()
  190.   local turbineList = findTurbines()  
  191.   loop(reactorList, turbineList)
  192. end
  193.  
  194. while true do
  195.   local status, message = pcall(doLoop)
  196.   local monitor = peripheral.find("monitor")
  197.   monitor.clear()
  198.   monitor.setTextScale(1)
  199.   write(colors.red, 1, "Error : ", message)
  200.   sleep(10)
  201. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement