Mendenbarr

Reactorcraft Control Script v0.2

Dec 20th, 2015
332
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. -- Mendenbarr's Big Reactor control script, adapted from http://pastebin.com/FHnfkprx, courtesy of Lyqyd.
  2. -- Tries to add in support for a large reactor with many turbines, turning the reactor off and on as needed to support the number of turbines connected.
  3.  
  4. local modemSide, reactorSide
  5.  
  6. for _, side in ipairs(rs.getSides()) do
  7.     if peripheral.getType(side) == "modem" then
  8.         local wirelessMethod = false
  9.         for i, method in ipairs(peripheral.getMethods(side)) do
  10.             if method == "isWireless" then
  11.                 wirelessMethod = true
  12.                 if peripheral.call(side, "isWireless") then
  13.                     modemSide = side
  14.                 end
  15.                 break
  16.             end
  17.         end
  18.         if not wirelessMethod then
  19.             modemSide = side
  20.         end
  21.     elseif peripheral.getType(side) == "BigReactors-Reactor" then
  22.         reactorSide = side
  23.     end
  24.     if modemSide and reactorSide then break end
  25. end
  26.  
  27. local modem, reactor
  28.  
  29. if modemSide then
  30.     rednet.open(modemSide)
  31.     modem = peripheral.wrap(modemSide)
  32. end
  33. if reactorSide then
  34.     reactor = peripheral.wrap(reactorSide)
  35. else
  36.     error("No Reactor Found")
  37. end
  38.  
  39. local function sendUpdate(id, message)
  40.     if modemSide then
  41.         rednet.send(id, message)
  42.     end
  43. end
  44.  
  45. local function average(tab)
  46.     local average = 0
  47.     for i = 1, #tab do
  48.         average = average + tab[i]
  49.     end
  50.     return average / #tab
  51. end
  52.  
  53. local function pollInformation(reactor)
  54.     local information = {}
  55.     information.reactor = {}
  56.     information.fuel = {}
  57.     information.rods = {}
  58.     information.cooling = {}
  59.     information.power = {}
  60.     do
  61.         information.reactor.active = reactor.getActive()
  62.         information.reactor.activeCooling = reactor.isActivelyCooled()
  63.         information.reactor.temperature = reactor.getCasingTemperature()
  64.     end
  65.     do
  66.         information.fuel.fuelAmount = reactor.getFuelAmount()
  67.         information.fuel.wasteAmount = reactor.getWasteAmount()
  68.         information.fuel.max = reactor.getFuelAmountMax()
  69.         information.fuel.reactivity = reactor.getFuelReactivity()
  70.         information.fuel.consumption = reactor.getFuelConsumedLastTick()
  71.         information.fuel.temperature = reactor.getFuelTemperature()
  72.     end
  73.     do
  74.         information.rods.count = reactor.getNumberOfControlRods()
  75.         information.rods.levels = {}
  76.         for i = 1, information.rods.count do
  77.             information.rods.levels[i] = reactor.getControlRodLevel(i - 1)
  78.         end
  79.         information.rods.average = average(information.rods.levels)
  80.     end
  81.     if information.reactor.activeCooling then
  82.         information.cooling.coldType = reactor.getCoolantType()
  83.         information.cooling.coldAmount = reactor.getCoolantAmount()
  84.         information.cooling.hotType = reactor.getHotFluidType()
  85.         information.cooling.hotAmount = reactor.getHotFluidAmount()
  86.         information.cooling.hotProduced = reactor.getHotFluidProducedLastTick()
  87.     end
  88.     if not information.reactor.activeCooling then
  89.         information.power.produced = reactor.getEnergyProducedLastTick()
  90.         information.power.stored = reactor.getEnergyStored()
  91.         information.power.percentage = math.floor(information.power.stored / 100000)
  92.     end
  93.     return information
  94. end
  95.  
  96. local settings = {
  97.     rods = {
  98.         setpoint = 0,
  99.         maximum = 100,
  100.         minimum = 0,
  101.         mode = "auto",
  102.         --values are auto, operator, startup.
  103.     },
  104.     reactor = {
  105.         active = true,
  106.     },
  107.     general = {
  108.         slowStartTickDelayCount = 4,
  109.         slowStartSteamTickDelayCount = 20,
  110.     },
  111.     turbines = {
  112.         count = 3,
  113.     }
  114. }
  115.  
  116. local startupCount = 0
  117. local lastRodsSetting
  118.  
  119. local function printCenter(text)
  120.     text = tostring(text)
  121.     local x, y = term.getSize()
  122.     local xCur, yCur = term.getCursorPos()
  123.     term.setCursorPos((x - #text) / 2 + 1, yCur)
  124.     term.write(text)
  125. end
  126.  
  127. local function displayScreen(info)
  128.     local x, y = term.getSize()
  129.     local column = math.ceil(x / 2)
  130.     term.setBackgroundColor(term.isColor() and colors.gray or colors.black)
  131.     term.setTextColor(colors.white)
  132.     term.clear()
  133.     do
  134.         term.setCursorPos(2, 3)
  135.         term.write("Temperature:")
  136.         term.setCursorPos(2, 4)
  137.         term.write("Core: "..info.fuel.temperature)
  138.         term.setCursorPos(2, 5)
  139.         term.write("Case: "..info.reactor.temperature)
  140.     end
  141.     do
  142.         term.setCursorPos(2, 7)
  143.         term.write("Fuel:")
  144.         term.setCursorPos(2, 8)
  145.         term.write("Fuel Level: "..tostring(info.fuel.fuelAmount).." mB")
  146.         term.setCursorPos(2, 9)
  147.         term.write("Waste Level: "..tostring(info.fuel.wasteAmount).." mB")
  148.         term.setCursorPos(2, 10)
  149.         term.write("Total: "..tostring(info.fuel.fuelAmount + info.fuel.wasteAmount).." mB")
  150.         term.setCursorPos(2, 11)
  151.         term.write("Capacity: "..tostring(info.fuel.max).." mB")
  152.         term.setCursorPos(2, 12)
  153.         term.write("Consumed: "..string.match(string.format("%f", info.fuel.consumption).."0000", "(%d+%.%d%d%d%d)").." mB/t")
  154.         term.setCursorPos(2, 13)
  155.         term.write("Reactivity: "..string.match(string.format("%f", info.fuel.reactivity).."00", "(%d+%.%d%d)").."%")
  156.     end
  157.     do
  158.         term.setCursorPos(column, 3)
  159.         term.write("Control Rods:")
  160.         term.setCursorPos(column, 4)
  161.         term.write("Actual: "..tostring(info.rods.average).."%")
  162.         term.setCursorPos(column, 5)
  163.         term.write("Setpoint: "..tostring(settings.rods.setpoint).."%")
  164.         do
  165.             if term.isColor() then term.setBackgroundColor(colors.red) end
  166.             term.setCursorPos(column, 6)
  167.             term.write("--")
  168.             term.setCursorPos(column + 3, 6)
  169.             term.write("-")
  170.             if term.isColor() then term.setBackgroundColor(colors.yellow) end
  171.             term.setCursorPos(column + 5, 6)
  172.             term.write("=")
  173.             if term.isColor() then term.setBackgroundColor(colors.lime) end
  174.             term.setCursorPos(column + 7, 6)
  175.             term.write("+")
  176.             term.setCursorPos(column + 9, 6)
  177.             term.write("++")
  178.             if term.isColor() then term.setBackgroundColor(colors.blue) end
  179.             term.setCursorPos(column + 12, 6)
  180.             term.write("A")
  181.             if term.isColor() then term.setBackgroundColor(colors.gray) end
  182.         end
  183.     end
  184.     if info.reactor.activeCooling then
  185.         --active cooling set
  186.         term.setCursorPos(column, 8)
  187.         term.write("Cooling:")
  188.         term.setCursorPos(column, 9)
  189.         term.write("Steam Output: "..tostring(info.cooling.hotProduced).." mB/t")
  190.         term.setCursorPos(column, 10)
  191.         term.write("Steam Level: "..tostring(info.cooling.hotAmount).." mB")
  192.         term.setCursorPos(column, 11)
  193.         term.write("Water Level: "..tostring(info.cooling.coldAmount).." mB")
  194.     else
  195.         --passive cooling set
  196.         term.setCursorPos(column, 8)
  197.         term.write("Power:")
  198.         term.setCursorPos(column, 9)
  199.         term.write("RF Output: "..tostring(math.floor(info.power.produced)).." RF/t")
  200.         term.setCursorPos(column, 10)
  201.         term.write("RF Stored: "..tostring(info.power.stored).." RF")
  202.         term.setCursorPos(column, 11)
  203.         term.write("RF % Full: "..tostring(info.power.percentage).."%")
  204.     end
  205. end
  206.  
  207. local function handleScreen(event)
  208.     if event[1] == "mouse_click" then
  209.         local x, y = term.getSize()
  210.         local column = math.ceil(x / 2)
  211.         if event[4] == 6 then
  212.             if event[3] == column or event[3] == column + 1 then
  213.                 if event[2] == 1 then
  214.                     settings.rods.setpoint = math.max(0, settings.rods.setpoint - 10)
  215.                     settings.rods.mode = "operator"
  216.                 elseif event[2] == 2 then
  217.                     settings.rods.setpoint = 0
  218.                     settings.rods.mode = "operator"
  219.                 end
  220.             elseif event[3] == column + 3 then
  221.                 settings.rods.setpoint = math.max(0, settings.rods.setpoint - 1)
  222.                 settings.rods.mode = "operator"
  223.             elseif event[3] == column + 5 then
  224.                 settings.rods.setpoint = lastRodsSetting
  225.                 settings.rods.mode = "operator"
  226.             elseif event[3] == column + 7 then
  227.                 settings.rods.setpoint = math.min(100, settings.rods.setpoint + 1)
  228.                 settings.rods.mode = "operator"
  229.             elseif event[3] == column + 9 or event[3] == column + 10 then
  230.                 if event[2] == 1 then
  231.                     settings.rods.setpoint = math.min(100, settings.rods.setpoint + 10)
  232.                     settings.rods.mode = "operator"
  233.                 elseif event[2] == 2 then
  234.                     settings.rods.setpoint = 100
  235.                     settings.rods.mode = "operator"
  236.                 end
  237.             elseif event[3] == column + 12 then
  238.                 settings.rods.mode = "auto"
  239.             end
  240.         end
  241.     elseif event[1] == "char" then
  242.         if event[2] == "-" then
  243.             settings.rods.setpoint = math.max(0, settings.rods.setpoint - 1)
  244.             settings.rods.mode = "operator"
  245.         elseif event[2] == "=" then
  246.             settings.rods.setpoint = lastRodsSetting
  247.             settings.rods.mode = "operator"
  248.         elseif event[2] == "+" then
  249.             settings.rods.setpoint = math.min(100, settings.rods.setpoint + 1)
  250.             settings.rods.mode = "operator"
  251.         elseif string.lower(event[2]) == "a" then
  252.             settings.rods.mode = "auto"
  253.         end
  254.     end
  255. end
  256.  
  257. local function setRods(setpoint)
  258.     if setpoint ~= lastRodsSetting then
  259.         reactor.setAllControlRodLevels(math.max(settings.rods.minimum, math.min(settings.rods.maximum, setpoint)))
  260.         sendUpdate(masterControl, "rods.actual:"..tostring(setpoint))
  261.         lastRodsSetting = setpoint
  262.     end
  263. end
  264.  
  265. local tickRods = {
  266.     operator = function(info)
  267.         setRods(settings.rods.setpoint)
  268.     end,
  269.     startup = function(info)
  270.         startupCount = startupCount + 1
  271.         if info.power.percentage < info.rods.average then
  272.             if startupCount >= settings.general.slowStartTickDelayCount then
  273.                 setRods(info.rods.average - 1)
  274.                 startupCount = 0
  275.             end
  276.         else
  277.             settings.rods.mode = "auto"
  278.             print("Reactor in AUTO mode")
  279.         end
  280.     end,
  281.     auto = function(info)
  282.     end,
  283.     steamStartup = function(info)
  284.         --
  285.     end,
  286. }
  287.  
  288. if fs.exists("reactorsettings") then
  289.     dofile("reactorsettings")
  290. end
  291.  
  292. local reactorTick = os.startTimer(0.5)
  293. print("Reactor Control Started")
  294.  
  295. while true do
  296.     local info = pollInformation(reactor)
  297.     reactor.setActive(info.cooling.hotProduced < settings.turbines.count * 2000)
  298.     displayScreen(info)
  299.     local event = {os.pullEvent()}
  300.     if event[1] == "rednet_message" then
  301.         if event[2] == masterControl then
  302.             if event[3] == "stop" then
  303.                 print("Received STOP command")
  304.                 settings.reactor.active = false
  305.                 sendUpdate(masterControl, "reactor.active:false")
  306.                 reactor.setActive(false)
  307.             elseif event[3] == "start" then
  308.                 print("Received START command")
  309.                 settings.reactor.active = true
  310.                 sendUpdate(masterControl, "reactor.active:true")
  311.                 reactor.setActive(true)
  312.                 reactor.setAllControlRodLevels(99)
  313.                 settings.rods.mode = "startup"
  314.                 sendUpdate(masterControl, "rods.mode:startup")
  315.                 print("Reactor in STARTUP mode")
  316.                 startupCount = 0
  317.                 reactorTick = os.startTimer(0.5)
  318.             end
  319.         end
  320.     elseif event[1] == "timer" then
  321.         if event[2] == reactorTick then
  322.             if tickRods[settings.rods.mode] then
  323.                 tickRods[settings.rods.mode](info)
  324.             end
  325.             reactorTick = os.startTimer(0.5)
  326.         end
  327.     else
  328.         handleScreen(event)
  329.     end
  330. end
Advertisement
Add Comment
Please, Sign In to add comment