--#requires
local fs = require("filesystem")
local term = require("term")
local serialization = require("serialization")
local component = require("component")
local event = require("event")
local component = require("component")
local colors = require("colors")
--#variables
local gpu = component.gpu
local config = {}
local reactor = nil
local running = true
local screen = "main"
local gpuScreen = "";
--#install
function install()
screen = "install"
term.clear()
print("Requirements:")
print("Tier 2 screen")
print("Tier 2 graphics card")
print("A BigReactor connected by cable from computer port to computer")
print("A keyboard for install only, optional for practical use")
print()
print("Are all requirements met? (y/n)")
--21,49
local result = false
while not result do
local name, adress, char, code, player = event.pull("key_down")
if code == 21 then
result = true
elseif code == 49 then
os.exit()
else
print("Invalid response")
end
end
--set resolution and continue
gpu.setResolution(80,25)
gpu.setForeground(0x000000)
term.clear()
gpu.setBackground(0x0000BB)
term.clear()
gpu.setBackground(0x808080)
gpu.fill(20,9,40,6," ")
term.setCursor(20,9)
print("Thank you for downloading")
term.setCursor(20,10)
print("OpenReactor")
term.setCursor(20,11)
print("press ok to continue")
term.setCursor(20,12)
print("press cancel to cancel the installation")
gpu.setBackground(0x008000)
gpu.fill(20,14,20,1," ")
term.setCursor(29,14)
print("ok")
gpu.setBackground(0x800000)
gpu.fill(40,14,20,1," ")
term.setCursor(48,14)
print("cancel")
local event_running = true
while event_running do
local name, address, x, y, button, player = event.pull("touch")
if x >= 20 and x <= 39 and y == 14 then
print("ok")
event_running = false
elseif x>=40 and x <= 59 and y == 14 then
os.exit()
end
end
install_pick_reactor()
install_pick_screen()
set_color_scheme()
save_config()
main()
end
--#main
function main()
screen = "main"
read_config()
gpu.bind(config.screen)
gpu.setResolution(80,25)
reactor = component.proxy(config.reactor)
event.listen("touch",listen)
while running do
if config.auto_power.enabled == true then
if reactor.getEnergyStored()/10^5<config.auto_power.start_percent then
reactor.setActive(true)
elseif reactor.getEnergyStored()/10^5>config.auto_power.stop_percent then
reactor.setActive(false)
end
end
gpu.setBackground(config.color_scheme.background)
term.clear()
draw_menubar()
if screen == "main" then
draw_main()
elseif screen == "config" then
draw_config()
end
os.sleep(.05)
end
end
--#draw_menubar
function draw_menubar()
term.setCursor(1,1)
gpu.setBackground(config.color_scheme.menubar.background)
gpu.setForeground(config.color_scheme.menubar.foreground)
term.clearLine()
term.setCursor(1,1)
term.write("Status: ")
if reactor.getActive() then
gpu.setForeground(config.color_scheme.success)
term.write("Online ")
else
gpu.setForeground(config.color_scheme.error)
term.write("Offline ")
end
if config.auto_power.enabled then
gpu.setForeground(config.color_scheme.menubar.foreground)
term.write("(")
gpu.setForeground(config.color_scheme.info)
term.write("Auto")
gpu.setForeground(config.color_scheme.menubar.foreground)
term.write(") ")
end
gpu.setForeground(config.color_scheme.menubar.foreground)
term.write(" Fuel Temperature: ")
gpu.setForeground(config.color_scheme.info)
term.write(round(reactor.getFuelTemperature()).."C ")
gpu.setForeground(config.color_scheme.menubar.foreground)
term.write(" Casing Temperature: ")
gpu.setForeground(config.color_scheme.info)
term.write(round(reactor.getCasingTemperature()).."C ")
term.setCursor(74,1)
gpu.setForeground(config.color_scheme.menubar.foreground)
term.write("[")
gpu.setForeground(config.color_scheme.error)
term.write("Exit")
gpu.setForeground(config.color_scheme.menubar.foreground)
term.write("]")
end
--#save_config
function save_config()
local file = io.open("/etc/latias-reactor.cfg","w")
file:write(serialization.serialize(config,false))
file:close()
end
--#read_config
function read_config()
local file = io.open("/etc/latias-reactor.cfg","r")
local c = serialization.unserialize(file:read(fs.size("/etc/latias-reactor.cfg")))
file:close()
for k,v in pairs(c) do
config[k] = v
end
end
--#set_color_scheme
function set_color_scheme()
config.color_scheme = {}
config.color_scheme.background = 0x0000BB
config.color_scheme.button = 0x606060
config.color_scheme.button_disabled = 0xC0C0C0
config.color_scheme.foreground = 0x000000
config.color_scheme.progressBar = {}
config.color_scheme.progressBar.background = 0x000000
config.color_scheme.progressBar.foreground = 0xFFFFFF
config.color_scheme.menubar={}
config.color_scheme.menubar.background = 0x000000
config.color_scheme.menubar.foreground = 0xFFFFFF
config.color_scheme.success = 0x008000
config.color_scheme.error = 0x800000
config.color_scheme.info = 0x808000
config.auto_power = {}
config.auto_power.enabled = false
config.auto_power.start_percent = 15
config.auto_power.stop_percent = 80
end
--#install_pick_reactor
function install_pick_reactor()
gpu.setBackground(0x0000BB)
term.clear()
gpu.setBackground(0x808080)
local reactors = component.list("br_reactor")
local len = 3
for k,v in pairs(reactors) do
if len<#k then
len = #k
end
end
local s_x = 40-len/2
local s_y = 13-round(countTable(reactors)/2)
gpu.fill(s_x-1,s_y-2,len+2,countTable(reactors)+3," ")
term.setCursor(s_x+9,s_y-2)
print("select a reactor")
local i = s_y
for k,v in pairs(reactors) do
term.setCursor(s_x,i)
print(k)
i=i+1
end
local event_running = true
while event_running do
local name, address, x, y, button, player = event.pull("touch")
print(y-s_y)
if x>=s_x and x <= s_x+len and y>=s_y and y<= s_y+countTable(reactors) then
event_running = false
local i = y-s_y
for k,v in pairs(reactors) do
if i == 0 then
config.reactor = k
end
i=i-1
end
end
end
end
--#install_pick_screen
function install_pick_screen()
gpu.setBackground(0x0000BB)
term.clear()
gpu.setBackground(0x808080)
local reactors = component.list("screen")
local len = 3
for k,v in pairs(reactors) do
if len<#k then
len = #k
end
end
local s_x = 40-len/2
local s_y = 13-round(countTable(reactors)/2)
gpu.fill(s_x-1,s_y-2,len+2,countTable(reactors)+3," ")
term.setCursor(s_x+9,s_y-2)
print("select a screen")
local i = s_y
for k,v in pairs(reactors) do
term.setCursor(s_x,i)
print(k)
i=i+1
end
local event_running = true
while event_running do
local name, address, x, y, button, player = event.pull("touch")
print(y-s_y)
if x>=s_x and x <= s_x+len and y>=s_y and y<= s_y+countTable(reactors) then
event_running = false
local i = y-s_y
for k,v in pairs(reactors) do
if i == 0 then
config.screen = k
end
i=i-1
end
end
end
end
--#draw_main
function draw_main()
if config.auto_power.enabled then
gpu.setBackground(config.color_scheme.button)
gpu.setForeground(0xFFFFFF)
gpu.fill(1,2,69,3," ")
term.setCursor(25,3)
term.write("Disable Auto-Power")
gpu.setBackground(0x153F3F)
gpu.fill(70,2,11,3," ")
term.setCursor(71,3)
term.write("Configure")
else
gpu.setBackground(config.color_scheme.button)
gpu.setForeground(0xFFFFFF)
gpu.fill(1,2,69,3," ")
term.setCursor(25,3)
term.write("Enable Auto-Power")
gpu.setBackground(0x153F3F)
gpu.fill(70,2,11,3," ")
term.setCursor(73,3)
term.write("Power")
end
gpu.setForeground(0xFFFFFF)
gpu.setBackground(config.color_scheme.button)
gpu.fill(1,8,13,3," ")
gpu.fill(1,14,13,3," ")
gpu.fill(1,20,13,3," ")
term.setCursor(1,9)
term.write("Energy Buffer")
term.setCursor(2,15)
term.write("Fuel Level")
term.setCursor(2,21)
term.write("Reactivity")
drawProgressBar(14,8,65,3,reactor.getEnergyStored()/10^7,0,16711680) -- Red
drawProgressBar(14,14,65,3,reactor.getFuelAmount()/reactor.getFuelAmountMax(),0,16776960) -- Yellow
drawProgressBar(14,20,65,3,reactor.getFuelReactivity()/10^2,0,65280) -- Green
if config.auto_power.enabled then
gpu.setBackground(config.color_scheme.success)
gpu.fill(14+65*config.auto_power.start_percent/10^2,8,1,3," ")
gpu.setBackground(config.color_scheme.error)
gpu.fill(14+65*config.auto_power.stop_percent/10^2,8,1,3," ")
end
end
--#draw_config
function draw_config()
gpu.setBackground(config.color_scheme.button)
gpu.fill(5,9,71,9," ")
gpu.setForeground(0xFFFFFF)
term.setCursor(36,9)
term.write("Configure")
term.setCursor(35,10)
term.write("Start: "..config.auto_power.start_percent.."%")
term.setCursor(36,11)
term.write("Stop: "..config.auto_power.stop_percent.."%")
drawProgressBar(8,12,65,3,reactor.getEnergyStored()/10^7,0,16777215)
gpu.setBackground(config.color_scheme.success)
gpu.fill(8+65*config.auto_power.start_percent/100,12,1,3," ")
gpu.setBackground(config.color_scheme.error)
gpu.fill(8+65*config.auto_power.stop_percent/100,12,1,3," ")
gpu.setBackground(config.color_scheme.button)
gpu.setForeground(0xFFFFFF)
term.setCursor(37+#("Start: "..config.auto_power.start_percent.."%"),10)
term.write("[")
gpu.setForeground(config.color_scheme.error)
term.write("-")
gpu.setForeground(0xFFFFFF)
term.write("] [")
gpu.setForeground(config.color_scheme.success)
term.write("+")
gpu.setForeground(0xFFFFFF)
term.write("]")
term.setCursor(38+#("Stop: "..config.auto_power.stop_percent.."#"),11)
term.write("[")
gpu.setForeground(config.color_scheme.error)
term.write("-")
gpu.setForeground(0xFFFFFF)
term.write("] [")
gpu.setForeground(config.color_scheme.success)
term.write("+")
gpu.setForeground(0xFFFFFF)
term.write("]")
term.setCursor(5,9)
term.write("[")
gpu.setForeground(config.color_scheme.info)
term.write("back")
gpu.setForeground(0xFFFFFF)
term.write("]")
end
--#drawProgressBar
function drawProgressBar(x,y,w,h,percent,bg,fg)
gpu.setBackground(bg)
gpu.fill(x,y,w,h," ")
gpu.setBackground(fg)
gpu.fill(x,y,w*percent,h," ")
end
--#listen
function listen(name,address,x,y,button,player)
if x >= 74 and x <= 80 and y == 1 then
running = false
end
if screen == "main" then
if x >= 70 and y >=2 and x <= 80 and y <= 4 and config.auto_power.enabled ~= true then
reactor.setActive(not reactor.getActive())
elseif x >= 1 and y >=2 and x <= 69 and y <= 4 then
config.auto_power.enabled = not config.auto_power.enabled
save_config()
elseif x >= 70 and y >= 2 and x <= 80 and y <= 4 and config.auto_power.enabled then
screen = "config"
end
elseif screen=="config" then
if x>= 5 and x <= 10 and y == 9 then
screen="main"
elseif x >= 37 + #("Start: "..config.auto_power.start_percent.."%") and x <= 40+#("Start: "..config.auto_power.start_percent.."%") and y == 10 and config.auto_power.start_percent ~= 0 then
config.auto_power.start_percent = config.auto_power.start_percent-1
save_config()
elseif x >= 43 + #("Start: "..config.auto_power.start_percent.."%") and x <= 46+#("Start: "..config.auto_power.start_percent.."%") and y == 10 and config.auto_power.start_percent+1 ~= config.auto_power.stop_percent then
config.auto_power.start_percent = config.auto_power.start_percent+1
save_config()
elseif x >= 38 + #("Stop: "..config.auto_power.stop_percent.."%") and x <= 41 + #("Stop: "..config.auto_power.stop_percent.."%") and y == 11 and config.auto_power.stop_percent - 1 ~= config.auto_power.start_percent then
config.auto_power.stop_percent = config.auto_power.stop_percent - 1
save_config()
elseif x >= 44 + #("Stop: "..config.auto_power.stop_percent.."%") and x <= 47 + #("Stop: "..config.auto_power.stop_percent.."%") and y == 11 and config.auto_power.stop_percent ~= 100 then
config.auto_power.stop_percent = config.auto_power.stop_percent + 1
save_config()
end
end
end
--#countTable
function countTable(table)
local result = 0
for k,v in pairs(table) do
result = result+1
end
return result
end
--#round
function round(num,idp)
local mult = 10^(idp or 0)
return math.floor(num*mult+0.5)/mult
end
--#init
if not fs.exists("/etc/latias-reactor.cfg") then
install()
else
main()
end
event.ignore("touch",listen)
gpu.setBackground(0x000000)
gpu.setForeground(0xFFFFFF)
term.clear()
Comments