rednet.open("back")
buttons = {}
local cur_power_gen = 0
local target_power = 5000 -- RF/Tick
local control_rod_level = 50
local reactor_enabled = false
local mw, mh = term.getSize()
function drawBoxWithCenteredText(x,y,w,h,text,color)
local ox,oy = term.getCursorPos()
local bgColor = term.getBackgroundColor()
term.setBackgroundColor(color)
for cy=1,h,1 do
for cx=1,w,1 do
term.setCursorPos(x+cx,y+cy)
term.write(" ")
end
end
local cx = math.floor(w / 2 + x - string.len(text) / 2 + 1)
local cy = math.floor(h / 2 + y + 1)
term.setCursorPos(cx, cy)
term.write(text)
term.setBackgroundColor(bgColor)
term.setCursorPos(ox, oy)
end
function clamp(val, min, max)
if val > max then
return max
elseif val < min then
return min
else
return val
end
end
function drawBar(x, y, size, perc)
local bgColor = term.getBackgroundColor()
local ox, oy = term.getCursorPos()
term.setCursorPos(x, y)
term.setBackgroundColor(colors.green)
local percGreen = clamp(math.floor(perc * size), 0, size)
local percGray = clamp(size - percGreen, 0, size - percGreen)
if percGray < 0 then
percGray = 0
end
for i = percGreen,1,-1 do
term.write(" ")
end
term.setBackgroundColor(colors.lightGray)
for i = percGray,1,-1 do
term.write(" ")
end
term.setBackgroundColor(bgColor)
term.setCursorPos(ox, oy)
end
function getControlRodDiff(RFDiff)
if RFDiff > 10000 then
return 5
elseif RFDiff > 5000 then
return 3
elseif RFDiff > 1000 then
return 1
elseif RFDiff > 500 then
return 0.5
elseif RFDiff > 100 then
return 0.1
else
return 0.05
end
end
function formatRF(rf)
if rf >= 1000000 then
return round(rf/1000000, 2) .. " MiRF"
elseif rf >= 1000 then
return round(rf/1000, 2) .. " KiRF"
else
return math.floor(rf) .. " RF"
end
end
function round(num, numDecimalPlaces)
local mult = 10^(numDecimalPlaces or 0)
return math.floor(num * mult + 0.5) / mult
end
function renderButtons()
for i = 1, #buttons do
local button = buttons[i]
if not reactor_enabled then
if button.drod then
drawBoxWithCenteredText(button.x,button.y,button.w,button.h,button.text,button.color)
end
else
drawBoxWithCenteredText(button.x,button.y,button.w,button.h,button.text,button.color)
end
end
end
function addButton(x,y,w,h,text,color,doRenderOnDisable, executor)
local button = {
x = x,
y = y,
w = w,
h = h,
text = text,
color = color,
drod = doRenderOnDisable,
executor = executor
}
buttons[#buttons+1] = button
end
function inBounds(n, min, max)
return n <= max and n >= min
end
function sendBTNCommand(btn)
sendCommand({button = btn.text})
end
addButton(1,mh - 4,11,3,"SHUT DOWN",colours.red, true, sendBTNCommand)
addButton(14,mh - 4,11,3,"START",colours.green, true, sendBTNCommand)
addButton(1, 9, 3, 1, "-10", colours.red, false, sendBTNCommand)
addButton(5, 9, 4, 1, "-100", colours.red, false, sendBTNCommand)
addButton(10, 9, 5, 1, "-1000", colours.red, false, sendBTNCommand)
addButton(1, 11, 3, 1, "+10", colours.green, false, sendBTNCommand)
addButton(5, 11, 4, 1, "+100", colours.green, false, sendBTNCommand)
addButton(10, 11, 5, 1, "+1000", colours.green, false, sendBTNCommand)
function sendCommand(command)
rednet.send(0, textutils.serialize(command), "reactor_control")
local id, object = rednet.receive("reactor_response")
return textutils.unserialize(object)
end
function getReactorStatus()
return sendCommand("_QUERY_")
end
term.clear()
function render()
while true do
local reactor_status = getReactorStatus()
cur_power_gen = reactor_status.cur_power_gen
reactor_enabled = reactor_status.reactor_enabled
target_power = reactor_status.target_power
control_rod_level = reactor_status.control_rod_level
if cur_power_gen ~= 0 and reactor_enabled then
term.setCursorPos(1,1)
term.write("Control Rod Level: ")
drawBar(1,2,20,control_rod_level/100)
term.setCursorPos(22,2)
term.write(math.floor(control_rod_level) .. "\% ")
term.setCursorPos(1,4)
term.write("Power Generation: ")
drawBar(1,5,13,cur_power_gen/target_power)
term.setCursorPos(15,5)
term.write(formatRF(cur_power_gen) .. "/t ")
term.setCursorPos(1,7)
term.write("Target power generation: ")
term.setCursorPos(2,8)
term.clearLine()
term.setBackgroundColor(colors.blue)
term.write(formatRF(target_power) .. "/t")
term.setBackgroundColor(colors.black)
end
if not reactor_enabled then
term.clear()
term.setCursorPos(2,2)
term.write("Reactor is offline")
end
renderButtons()
sleep(0.1)
end
end
function pullEvents()
while true do
event, button, x, y = os.pullEvent("mouse_click")
for i=1, #buttons do
local button = buttons[i]
if inBounds(x, button.x, button.x + button.w) and inBounds(y, button.y, button.y + button.h) then
button.executor(button)
break
end
end
end
end
parallel.waitForAny(pullEvents, render)
Comments