Archived
buttons fait
This commit is contained in:
commit
59a5c61078
4 files changed
+1314
No files matched your search
Vendored
+8
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"Lua.diagnostics.globals": [
|
||||
"colors",
|
||||
"paintutils",
|
||||
"term",
|
||||
"window"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,238 @@
|
||||
local state, data, reactor, turbine, info_window, rules_window
|
||||
|
||||
local STATES = {
|
||||
READY = 1, -- Reactor is off and can be started with the lever
|
||||
RUNNING = 2, -- Reactor is running and all rules are met
|
||||
ESTOP = 3, -- Reactor is stopped due to rule(s) being violated
|
||||
UNKNOWN = 4, -- Reactor or turbine peripherals are missing
|
||||
}
|
||||
|
||||
------------------------------------------------
|
||||
|
||||
local rules = {}
|
||||
|
||||
local function add_rule(name, fn)
|
||||
table.insert(rules, function()
|
||||
local ok, rule_met, value = pcall(fn)
|
||||
if ok then
|
||||
return rule_met, string.format("%s (%s)", name, value)
|
||||
else
|
||||
return false, name
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
add_rule("REACTOR TEMPERATURE <= 745K", function()
|
||||
local value = string.format("%3dK", math.ceil(data.reactor_temp))
|
||||
return data.reactor_temp <= 745, value
|
||||
end)
|
||||
|
||||
add_rule("REACTOR DAMAGE <= 10%", function()
|
||||
local value = string.format("%3d%%", math.ceil(data.reactor_damage * 100))
|
||||
return data.reactor_damage <= 0.10, value
|
||||
end)
|
||||
|
||||
add_rule("REACTOR COOLANT LEVEL >= 95%", function()
|
||||
local value = string.format("%3d%%", math.floor(data.reactor_coolant * 100))
|
||||
return data.reactor_coolant >= 0.95, value
|
||||
end)
|
||||
|
||||
add_rule("REACTOR WASTE LEVEL <= 90%", function()
|
||||
local value = string.format("%3d%%", math.ceil(data.reactor_waste * 100))
|
||||
return data.reactor_waste <= 0.90, value
|
||||
end)
|
||||
|
||||
add_rule("TURBINE ENERGY LEVEL <= 95%", function()
|
||||
local value = string.format("%3d%%", math.ceil(data.turbine_energy * 100))
|
||||
return data.turbine_energy <= 0.95, value
|
||||
end)
|
||||
|
||||
local function all_rules_met()
|
||||
for i, rule in ipairs(rules) do
|
||||
if not rule() then
|
||||
return false
|
||||
end
|
||||
end
|
||||
-- Allow manual emergency stop with SCRAM button
|
||||
return state ~= STATES.RUNNING or data.reactor_on
|
||||
end
|
||||
|
||||
------------------------------------------------
|
||||
|
||||
local function update_data()
|
||||
data = {
|
||||
lever_on = redstone.getInput("top"),
|
||||
|
||||
reactor_on = reactor.getStatus(),
|
||||
reactor_burn_rate = reactor.getBurnRate(),
|
||||
reactor_max_burn_rate = reactor.getMaxBurnRate(),
|
||||
reactor_temp = reactor.getTemperature(),
|
||||
reactor_damage = reactor.getDamagePercent(),
|
||||
reactor_coolant = reactor.getCoolantFilledPercentage(),
|
||||
reactor_waste = reactor.getWasteFilledPercentage(),
|
||||
|
||||
turbine_energy = turbine.getEnergyFilledPercentage(),
|
||||
}
|
||||
end
|
||||
|
||||
------------------------------------------------
|
||||
|
||||
function colored(text, fg, bg)
|
||||
term.setTextColor(fg or colors.white)
|
||||
term.setBackgroundColor(bg or colors.black)
|
||||
term.write(text)
|
||||
end
|
||||
|
||||
function make_section(name, x, y, w, h, mon)
|
||||
oldTerm = term.current()
|
||||
term.redirect(mon)
|
||||
for row = 1, h do
|
||||
term.setCursorPos(x, y + row - 1)
|
||||
local char = (row == 1 or row == h) and "\127" or " "
|
||||
colored("\127" .. string.rep(char, w - 2) .. "\127", colors.gray)
|
||||
end
|
||||
|
||||
term.setCursorPos(x + 2, y)
|
||||
colored(" " .. name .. " ")
|
||||
term.redirect(oldTerm)
|
||||
return window.create(mon, x + 2, y + 2, w - 4, h - 4)
|
||||
end
|
||||
|
||||
local function update_info()
|
||||
local prev_term = term.redirect(info_window)
|
||||
|
||||
term.clear()
|
||||
term.setCursorPos(1, 1)
|
||||
|
||||
if state == STATES.UNKNOWN then
|
||||
colored("ERROR RETRIEVING DATA", colors.red)
|
||||
return
|
||||
end
|
||||
|
||||
colored("REACTOR: ")
|
||||
colored(data.reactor_on and "ON " or "OFF", data.reactor_on and colors.green or colors.red)
|
||||
colored(" LEVER: ")
|
||||
colored(data.lever_on and "ON " or "OFF", data.lever_on and colors.green or colors.red)
|
||||
colored(" R. LIMIT: ")
|
||||
colored(string.format("%4.1f", data.reactor_burn_rate), colors.blue)
|
||||
colored("/", colors.lightGray)
|
||||
colored(string.format("%4.1f", data.reactor_max_burn_rate), colors.blue)
|
||||
|
||||
term.setCursorPos(1, 3)
|
||||
|
||||
colored("STATUS: ")
|
||||
if state == STATES.READY then
|
||||
colored("READY, flip lever to start", colors.blue)
|
||||
elseif state == STATES.RUNNING then
|
||||
colored("RUNNING, flip lever to stop", colors.green)
|
||||
elseif state == STATES.ESTOP and not all_rules_met() then
|
||||
colored("EMERGENCY STOP, safety rules violated", colors.red)
|
||||
elseif state == STATES.ESTOP then
|
||||
colored("EMERGENCY STOP, toggle lever to reset", colors.red)
|
||||
end -- STATES.UNKNOWN cases handled above
|
||||
|
||||
term.redirect(prev_term)
|
||||
end
|
||||
|
||||
local estop_reasons = {}
|
||||
|
||||
local function update_rules()
|
||||
local prev_term = term.redirect(rules_window)
|
||||
|
||||
term.clear()
|
||||
|
||||
if state ~= STATES.ESTOP then
|
||||
estop_reasons = {}
|
||||
end
|
||||
|
||||
for i, rule in ipairs(rules) do
|
||||
local ok, text = rule()
|
||||
term.setCursorPos(1, i)
|
||||
if ok and not estop_reasons[i] then
|
||||
colored("[ OK ] ", colors.green)
|
||||
colored(text, colors.lightGray)
|
||||
else
|
||||
colored("[ FAIL ] ", colors.red)
|
||||
colored(text, colors.red)
|
||||
estop_reasons[i] = true
|
||||
end
|
||||
end
|
||||
|
||||
term.redirect(prev_term)
|
||||
end
|
||||
|
||||
------------------------------------------------
|
||||
|
||||
local function main_loop()
|
||||
-- Search for peripherals again if one or both are missing
|
||||
if not state or state == STATES.UNKNOWN then
|
||||
reactor = peripheral.find("fissionReactorLogicAdapter")
|
||||
turbine = peripheral.find("turbineValve")
|
||||
end
|
||||
|
||||
if not pcall(update_data) then
|
||||
-- Error getting data (either reactor or turbine is nil?)
|
||||
data = {}
|
||||
state = STATES.UNKNOWN
|
||||
elseif data.reactor_on == nil then
|
||||
-- Reactor is not connected
|
||||
state = STATES.UNKNOWN
|
||||
elseif data.turbine_energy == nil then
|
||||
-- Turbine is not connected
|
||||
state = STATES.UNKNOWN
|
||||
elseif not state then
|
||||
-- Program just started, get current state from lever
|
||||
state = data.lever_on and STATES.RUNNING or STATES.READY
|
||||
elseif state == STATES.READY and data.lever_on then
|
||||
-- READY -> RUNNING
|
||||
state = STATES.RUNNING
|
||||
-- Activate reactor
|
||||
pcall(reactor.activate)
|
||||
data.reactor_on = true
|
||||
elseif state == STATES.RUNNING and not data.lever_on then
|
||||
-- RUNNING -> READY
|
||||
state = STATES.READY
|
||||
elseif state == STATES.ESTOP and not data.lever_on then
|
||||
-- ESTOP -> READY
|
||||
state = STATES.READY
|
||||
elseif state == STATES.UNKNOWN then
|
||||
-- UNKNOWN -> ESTOP
|
||||
state = data.lever_on and STATES.ESTOP or STATES.READY
|
||||
estop_reasons = {}
|
||||
end
|
||||
|
||||
-- Always enter ESTOP if safety rules are not met
|
||||
if state ~= STATES.UNKNOWN and not all_rules_met() then
|
||||
state = STATES.ESTOP
|
||||
end
|
||||
|
||||
-- SCRAM reactor if not running
|
||||
if state ~= STATES.RUNNING and reactor then
|
||||
pcall(reactor.scram)
|
||||
end
|
||||
|
||||
-- Update info and rules windows
|
||||
pcall(update_info)
|
||||
pcall(update_rules)
|
||||
|
||||
sleep() -- Other calls should already yield, this is just in case
|
||||
return main_loop()
|
||||
end
|
||||
|
||||
term.setPaletteColor(colors.black, 0x000000)
|
||||
term.setPaletteColor(colors.gray, 0x343434)
|
||||
term.setPaletteColor(colors.lightGray, 0xababab)
|
||||
term.setPaletteColor(colors.red, 0xdb2d20)
|
||||
term.setPaletteColor(colors.green, 0x01a252)
|
||||
term.setPaletteColor(colors.blue, 0x01a0e4)
|
||||
|
||||
term.clear()
|
||||
local width = term.getSize()
|
||||
info_window = make_section("INFORMATION", 2, 2, width - 2, 7)
|
||||
rules_window = make_section("SAFETY RULES", 2, 10, width - 2, 9)
|
||||
|
||||
parallel.waitForAny(main_loop, function()
|
||||
os.pullEventRaw("terminate")
|
||||
end)
|
||||
|
||||
os.reboot()
|
||||
@@ -0,0 +1,955 @@
|
||||
--config
|
||||
MinProcenttoBoost = 10 -- means min Tank amount vor max Inj Rate
|
||||
MinProcentforLowMode = 75 -- means min Energycelllevel for produce over mrfneed
|
||||
MRFBuffer = 0.1 -- for produce over mrfneed (for KRF = 0. ; MRF = 1)
|
||||
xRC = 1 -- Amount of the Rotary-Condenstrator(Leave it on 1, if u dont use D-T-Fuel)
|
||||
|
||||
---===================================--Fusion-Reaktor-Proramm--v0.9.4 by Dispelnator--============================================
|
||||
|
||||
--Ty for using my Mekanism-Fusion-Reactor-Programm,
|
||||
--Its my first Lua Program, so please tell me better Solutions of this Code.
|
||||
|
||||
--I need help with a Function to calc the current Tritium Production
|
||||
--Means if tank on day < 50 then injection rate = tritium input then the tank goes over 75 %
|
||||
|
||||
--You need minimum ProjectRed and Mekanism(+Tools,Generators)+ draconicevolution (for flux and fluid gates) for this Program
|
||||
|
||||
--BundeledCable list:
|
||||
-- Red for Laser (fireup)
|
||||
-- Yellow for Alarm and Hohlraum-Insert
|
||||
-- Black 2 power laser via Tesseract/cubes...
|
||||
--The fuel usage is Injection-Rate/2 => For INJ-RATE = 98 you need 49 mb Tritium and 49 mb Deuterium (per tick) => ca. 9.8 MRF
|
||||
--For more Power u need Draconic Fluid-Gate and Rotary-Condenstrator*x and a Chemical Infuser (D-T-Fuel)
|
||||
--1 Rotary-Condenstrator = max 256mb/t means ca. + 25.6 MRF/t
|
||||
--Actually u can use Draconic-Energy-Core for Energy Storage but Induction-Matrix from Mekanism is better.
|
||||
--Actually u can use only Dynamic-Tanks but its the best one
|
||||
--
|
||||
--
|
||||
--Everything around the monitor I have taken from Krakaen's Big-Reactor-Program and
|
||||
--Thor_s_Crafter helped me with most buggs in the program
|
||||
--Some Videos about their Big-Reactor-Programs:
|
||||
--Krakaen : https://www.youtube.com/watch?v=SbbT7ncyS2M
|
||||
--Thor_s_Crafter: https://www.youtube.com/watch?v=XNlsU0tSHOc
|
||||
|
||||
---================================================ Edit at own Risk ===============================================================
|
||||
|
||||
FirstProcent = 0
|
||||
SecondProcent = 0
|
||||
k = 0.09961964844
|
||||
InjRate = 0
|
||||
DTFuelInjRate = 0
|
||||
FuelInjRate = 0
|
||||
MRFProduce = 0
|
||||
amountTanks = 0
|
||||
MRFLaser = 0
|
||||
MRFMaxLaser = 0
|
||||
MRFNeed = 0
|
||||
Charge = 0
|
||||
InjRate2 = 2
|
||||
w = 0
|
||||
|
||||
currentChargeLevel = 1
|
||||
currentInjRate = 1
|
||||
|
||||
local TType = ""
|
||||
local EType = ""
|
||||
local ChargeStatus = "UNCHARGED"
|
||||
local ReactorStatus = "OFFLINE"
|
||||
|
||||
local TankLevel = false
|
||||
local TankLevel1 = false
|
||||
local TankLevel2 = false
|
||||
local DraconicFluidGate = false
|
||||
local DraconicFluxGate = false
|
||||
local Auto = false
|
||||
local ChargeOn = false
|
||||
local FireUpOK = false
|
||||
local refresh = true
|
||||
|
||||
local ChargeOnOffcolor = colors.green
|
||||
local FireUpcolor = colors.green
|
||||
local powerUpcolor = colors.green
|
||||
local ChargeTextcolor = colors.red
|
||||
local RectorTextcolor = colors.red
|
||||
|
||||
rs.setBundledOutput("back", 0)
|
||||
|
||||
-- tabels
|
||||
|
||||
local Tanktypes = { "dynamic_tank" }
|
||||
local EnergyStoragetypesMekanism = { "Basic Energy Cube", "Advanced Energy Cube", "Elite Energy Cube",
|
||||
"Ultimate Energy Cube" }
|
||||
local EnergyStoragetypesMekanismIM = { "Induction Matrix" }
|
||||
local EnergyStoragetypesDraconic = { "draconic_rf_storage" }
|
||||
local Tanks = {}
|
||||
|
||||
local button = {}
|
||||
local filleds = {}
|
||||
local boxes = {}
|
||||
local lines = {}
|
||||
local texts = {}
|
||||
|
||||
local FirstTankStats = {}
|
||||
local SecondTankStats = {}
|
||||
|
||||
local GeneralBox = {}
|
||||
local ReactorBox = {}
|
||||
local TankBox = {}
|
||||
local GraphicBox = {}
|
||||
|
||||
function initPeripherals()
|
||||
local peripheralList = peripheral.getNames()
|
||||
for i = 1, #peripheralList do
|
||||
-- Reactor
|
||||
if peripheral.getType(peripheralList[i]) == "Reactor Logic Adapter" then
|
||||
FReactor = peripheral.wrap(peripheralList[i])
|
||||
end
|
||||
-- Laser Amplifier
|
||||
if peripheral.getType(peripheralList[i]) == "Laser Amplifier" then
|
||||
LaserAmp = peripheral.wrap(peripheralList[i])
|
||||
end
|
||||
-- Fluid-Gate
|
||||
if peripheral.getType(peripheralList[i]) == "fluid_gate" then
|
||||
DTFuelInj = peripheral.wrap(peripheralList[i])
|
||||
DraconicFluidGate = true
|
||||
end
|
||||
-- Flux-Gate
|
||||
if peripheral.getType(peripheralList[i]) == "flux_gate" then
|
||||
FluxGate = peripheral.wrap(peripheralList[i])
|
||||
DraconicFluxGate = true
|
||||
end
|
||||
-- Energystorage
|
||||
for k, v in pairs(EnergyStoragetypesMekanism) do
|
||||
if peripheral.getType(peripheralList[i]) == v then
|
||||
RFStorage = peripheral.wrap(peripheralList[i])
|
||||
EType = "mekanism"
|
||||
end
|
||||
end
|
||||
for k, v in pairs(EnergyStoragetypesMekanismIM) do
|
||||
if peripheral.getType(peripheralList[i]) == v then
|
||||
RFStorage = peripheral.wrap(peripheralList[i])
|
||||
EType = "mekanismIM"
|
||||
end
|
||||
end
|
||||
for k, v in pairs(EnergyStoragetypesDraconic) do
|
||||
if peripheral.getType(peripheralList[i]) == v then
|
||||
RFStorage = peripheral.wrap(peripheralList[i])
|
||||
EType = "draconic"
|
||||
end
|
||||
end
|
||||
-- Monitor
|
||||
if peripheral.getType(peripheralList[i]) == "monitor" then
|
||||
mon = peripheral.wrap(peripheralList[i])
|
||||
TType = "TankInfo"
|
||||
end
|
||||
-- Tanks
|
||||
for k, v in pairs(Tanktypes) do
|
||||
if peripheral.getType(peripheralList[i]) == v then
|
||||
Tanks[amountTanks] = peripheral.wrap(peripheralList[i])
|
||||
amountTanks = amountTanks + 1
|
||||
end
|
||||
end
|
||||
end
|
||||
amountTanks = amountTanks - 1
|
||||
end
|
||||
|
||||
initPeripherals()
|
||||
|
||||
term.redirect(mon)
|
||||
mon.clear()
|
||||
mon.setTextScale(0.5)
|
||||
mon.setTextColor(colors.white)
|
||||
mon.setBackgroundColor(colors.black)
|
||||
mon.setCursorPos(1, 1)
|
||||
|
||||
MRFLaser = LaserAmp.getEnergy() / 2500000
|
||||
|
||||
if MRFLaser < 400 and ChargeOn == true then
|
||||
ChargeStatus = "CHARGING"
|
||||
ChargeOnOffcolor = colors.orange
|
||||
ChargeTextcolor = colors.orange
|
||||
elseif MRFLaser < 400 and ChargeOn == false then
|
||||
ChargeStatus = "UNCHARGED"
|
||||
ChargeOnOffcolor = colors.green
|
||||
ChargeTextcolor = colors.red
|
||||
else
|
||||
ChargeStatus = "CHARGED"
|
||||
ChargeOnOffcolor = colors.gray
|
||||
ChargeTextcolor = colors.green
|
||||
end
|
||||
|
||||
function recalcInj()
|
||||
if DraconicFluidGate == true then
|
||||
DTFuelInj.setOverrideEnabled(true)
|
||||
DTFuelInjRate = DTFuelInj.getFlow()
|
||||
InjRateMax = xRC * 256 + 98
|
||||
else
|
||||
InjRateMax = 98
|
||||
end
|
||||
FuelInjRate = FReactor.getInjectionRate()
|
||||
|
||||
end
|
||||
|
||||
if DraconicFluxGate == true then
|
||||
FluxGate.setOverrideEnabled(true)
|
||||
end
|
||||
|
||||
function clearTable()
|
||||
button = {}
|
||||
end
|
||||
|
||||
-- All the things that make my buttons work
|
||||
|
||||
function setButton(name, title, func, xmin, ymin, xmax, ymax, elem, elem2, color)
|
||||
button[name] = {}
|
||||
button[name]["title"] = title
|
||||
button[name]["func"] = func
|
||||
button[name]["active"] = false
|
||||
button[name]["xmin"] = xmin
|
||||
button[name]["ymin"] = ymin
|
||||
button[name]["xmax"] = xmax
|
||||
button[name]["ymax"] = ymax
|
||||
button[name]["color"] = color
|
||||
button[name]["elem"] = elem
|
||||
button[name]["elem2"] = elem2
|
||||
end
|
||||
|
||||
-- stuff and things for buttons
|
||||
|
||||
function fill(text, color, bData)
|
||||
mon.setBackgroundColor(color)
|
||||
mon.setTextColor(colors.white)
|
||||
local yspot = math.floor((bData["ymin"] + bData["ymax"]) / 2)
|
||||
local xspot = math.floor((bData["xmax"] - bData["xmin"] - string.len(bData["title"])) / 2) + 1
|
||||
for j = bData["ymin"], bData["ymax"] do
|
||||
mon.setCursorPos(bData["xmin"], j)
|
||||
if j == yspot then
|
||||
for k = 0, bData["xmax"] - bData["xmin"] - string.len(bData["title"]) + 1 do
|
||||
if k == xspot then
|
||||
mon.write(bData["title"])
|
||||
else
|
||||
mon.write(" ")
|
||||
end
|
||||
end
|
||||
else
|
||||
for i = bData["xmin"], bData["xmax"] do
|
||||
mon.write(" ")
|
||||
end
|
||||
end
|
||||
end
|
||||
mon.setBackgroundColor(colors.black)
|
||||
end
|
||||
|
||||
-- stuff and things for buttons
|
||||
|
||||
function screen()
|
||||
local currColor
|
||||
for name, data in pairs(button) do
|
||||
local on = data["active"]
|
||||
currColor = data["color"]
|
||||
fill(name, currColor, data)
|
||||
end
|
||||
end
|
||||
|
||||
-- stuff and things for buttons
|
||||
|
||||
function flash(name)
|
||||
screen()
|
||||
end
|
||||
|
||||
-- magical handler for clicky clicks
|
||||
|
||||
function checkxy(x, y)
|
||||
for name, data in pairs(button) do
|
||||
if y >= data["ymin"] and y <= data["ymax"] then
|
||||
if x >= data["xmin"] and x <= data["xmax"] then
|
||||
data["func"](data["elem"], data["elem2"])
|
||||
flash(data['name'])
|
||||
return true
|
||||
--data["active"] = not data["active"]
|
||||
--print(name)
|
||||
end
|
||||
end
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
-- Draw function : put's all the beautiful magic in the screen
|
||||
|
||||
function draw()
|
||||
|
||||
for key, value in pairs(filleds) do
|
||||
paintutils.drawFilledBox(value[1], value[2], value[3], value[4], value[5])
|
||||
end
|
||||
|
||||
for key, value in pairs(boxes) do
|
||||
paintutils.drawBox(value[1], value[2], value[3], value[4], value[5])
|
||||
end
|
||||
|
||||
for key, value in pairs(lines) do
|
||||
paintutils.drawLine(value[1], value[2], value[3], value[4], value[5])
|
||||
end
|
||||
|
||||
for key, value in pairs(texts) do
|
||||
mon.setCursorPos(value[1], value[2])
|
||||
mon.setTextColor(value[4])
|
||||
mon.setBackgroundColor(value[5])
|
||||
mon.write(value[3])
|
||||
end
|
||||
screen()
|
||||
resetDraw()
|
||||
end
|
||||
|
||||
-- Resets the elements to draw to only draw the neccessity
|
||||
|
||||
function resetDraw()
|
||||
filleds = {}
|
||||
boxes = {}
|
||||
lines = {}
|
||||
texts = {}
|
||||
end
|
||||
|
||||
-- Handles all the clicks for the buttons
|
||||
|
||||
function clickEvent()
|
||||
local myEvent = { os.pullEvent("monitor_touch") }
|
||||
checkxy(myEvent[3], myEvent[4])
|
||||
end
|
||||
|
||||
-- Power up the reactor (M&N are a good source of food right?)
|
||||
|
||||
function powerUp(m, n)
|
||||
if FReactor.isIgnited() == false then
|
||||
Auto = true
|
||||
ChargeOn = true
|
||||
powerUpcolor = colors.green
|
||||
calcLaserAmplifier()
|
||||
else
|
||||
powerUpcolor = colors.gray
|
||||
end
|
||||
end
|
||||
|
||||
-- Turns Fusion-Reactor off
|
||||
|
||||
function powerDown(m, n)
|
||||
Power = false
|
||||
ChargeOn = false
|
||||
Auto = false
|
||||
rs.setBundledOutput("back", 0)
|
||||
calcInjRate()
|
||||
end
|
||||
|
||||
function addDrawBoxes()
|
||||
local w, h = mon.getSize()
|
||||
Factor = math.floor((w / 100) * 2)
|
||||
|
||||
GeneralBox["startX"] = 2
|
||||
GeneralBox["startY"] = 3
|
||||
GeneralBox["endX"] = ((w - (Factor * 2)) / 3) - Factor
|
||||
GeneralBox["endY"] = (((h - (Factor * 2)) / 3 + 1) / 4) * 3
|
||||
GeneralBox["height"] = GeneralBox["endY"] - GeneralBox["startY"] - (Factor * 2) - 2
|
||||
GeneralBox["width"] = GeneralBox["endX"] - GeneralBox["startX"] - (Factor * 2) - 2
|
||||
GeneralBox["inX"] = GeneralBox["startX"] + Factor + 1
|
||||
GeneralBox["inY"] = GeneralBox["startY"] + Factor + 1
|
||||
|
||||
table.insert(boxes, { GeneralBox["startX"], GeneralBox["startY"], GeneralBox["endX"], GeneralBox["endY"], colors.gray })
|
||||
name = "LASER"
|
||||
table.insert(lines,
|
||||
{ GeneralBox["startX"] + Factor, GeneralBox["startY"], GeneralBox["startX"] + (Factor * 2) + #name + 1,
|
||||
GeneralBox["startY"], colors.black })
|
||||
table.insert(texts, { GeneralBox["startX"] + (Factor * 2), GeneralBox["startY"], name, colors.white, colors.black })
|
||||
|
||||
TankBox["startX"] = GeneralBox["startX"]
|
||||
TankBox["startY"] = (h - Factor) - ((GeneralBox["endY"] - GeneralBox["startY"]) / 3) * 2
|
||||
TankBox["endX"] = GeneralBox["endX"]
|
||||
TankBox["endY"] = h - 1
|
||||
TankBox["height"] = TankBox["endY"] - TankBox["startY"] - (Factor * 2) - 2
|
||||
TankBox["width"] = TankBox["endX"] - TankBox["startX"] - (Factor * 2) - 2
|
||||
TankBox["inX"] = TankBox["startX"] + Factor + 1
|
||||
TankBox["inY"] = TankBox["startY"] + Factor + 1
|
||||
|
||||
table.insert(boxes, { TankBox["startX"], TankBox["startY"], TankBox["endX"], TankBox["endY"], colors.gray })
|
||||
name = "TANKS"
|
||||
table.insert(lines,
|
||||
{ TankBox["startX"] + Factor, TankBox["startY"], TankBox["startX"] + (Factor * 2) + #name + 1, TankBox["startY"],
|
||||
colors.black })
|
||||
table.insert(texts, { TankBox["startX"] + (Factor * 2), TankBox["startY"], name, colors.white, colors.black })
|
||||
|
||||
ReactorBox["startX"] = GeneralBox["startX"]
|
||||
ReactorBox["startY"] = GeneralBox["endY"] + Factor
|
||||
ReactorBox["endX"] = GeneralBox["endX"]
|
||||
ReactorBox["endY"] = TankBox["startY"] - Factor
|
||||
ReactorBox["height"] = ReactorBox["endY"] - ReactorBox["startY"] - (Factor * 2) - 2
|
||||
ReactorBox["width"] = ReactorBox["endX"] - ReactorBox["startX"] - (Factor * 2) - 2
|
||||
ReactorBox["inX"] = ReactorBox["startX"] + Factor + 1
|
||||
ReactorBox["inY"] = ReactorBox["startY"] + Factor + 1
|
||||
|
||||
table.insert(boxes, { ReactorBox["startX"], ReactorBox["startY"], ReactorBox["endX"], ReactorBox["endY"], colors.gray })
|
||||
name = "REACTOR"
|
||||
table.insert(lines,
|
||||
{ ReactorBox["startX"] + Factor, ReactorBox["startY"], ReactorBox["startX"] + (Factor * 2) + #name + 1,
|
||||
ReactorBox["startY"], colors.black })
|
||||
table.insert(texts, { ReactorBox["startX"] + (Factor * 2), ReactorBox["startY"], name, colors.white, colors.black })
|
||||
|
||||
GraphicBox["startX"] = GeneralBox["endX"] + Factor
|
||||
GraphicBox["startY"] = GeneralBox["startY"]
|
||||
GraphicBox["endX"] = w - 2
|
||||
GraphicBox["endY"] = TankBox["endY"]
|
||||
GraphicBox["height"] = GraphicBox["endY"] - GraphicBox["startY"] - (Factor * 2) - 2
|
||||
GraphicBox["width"] = GraphicBox["endX"] - GraphicBox["startX"] - (Factor * 2) - 2
|
||||
GraphicBox["inX"] = GraphicBox["startX"] + Factor
|
||||
GraphicBox["inY"] = GraphicBox["startY"] + 2
|
||||
GraphicBox["sectionHeight"] = math.floor(GraphicBox["height"] / 6)
|
||||
|
||||
table.insert(boxes, { GraphicBox["startX"], GraphicBox["startY"], GraphicBox["endX"], GraphicBox["endY"], colors.gray })
|
||||
name = "GRAPHICS/BUTTONS"
|
||||
table.insert(lines,
|
||||
{ GraphicBox["startX"] + Factor, GraphicBox["startY"], GraphicBox["startX"] + (Factor * 2) + #name + 1,
|
||||
GraphicBox["startY"], colors.black })
|
||||
table.insert(texts, { GraphicBox["startX"] + (Factor * 2), GraphicBox["startY"], name, colors.white, colors.black })
|
||||
|
||||
name = "FUSION-PLANT"
|
||||
table.insert(texts, { (w / 2) - (#name / 2), 1, name, colors.white, colors.black })
|
||||
|
||||
local names = {}
|
||||
names[1] = "CHARGE LEVEL"
|
||||
names[2] = "INJECTION RATE"
|
||||
names[3] = "ENERGY STORED"
|
||||
|
||||
for i = 1, 5, 1 do
|
||||
table.insert(texts,
|
||||
{ GraphicBox["inX"] + Factor, GraphicBox["inY"] + (GraphicBox["sectionHeight"] * i) + i + 1, names[i], colors.white,
|
||||
colors.black })
|
||||
table.insert(filleds,
|
||||
{ GraphicBox["inX"] + Factor, GraphicBox["inY"] + (GraphicBox["sectionHeight"] * i) + i + 2,
|
||||
GraphicBox["inX"] + GraphicBox["width"] - 1, GraphicBox["inY"] + (GraphicBox["sectionHeight"] * (i + 1)) + i,
|
||||
colors.lightGray })
|
||||
end
|
||||
|
||||
refresh = true
|
||||
while refresh do
|
||||
recalcInj()
|
||||
if FReactor.isIgnited() == false then
|
||||
powerUpcolor = colors.green
|
||||
FireUpcolor = colors.green
|
||||
ReactorStatus = "OFFLINE"
|
||||
RectorTextcolor = colors.red
|
||||
else
|
||||
powerUpcolor = colors.gray
|
||||
FireUpcolor = colors.gray
|
||||
ReactorStatus = "ONLINE"
|
||||
RectorTextcolor = colors.green
|
||||
end
|
||||
|
||||
setButton("CHARG", "CHARGE", ChargeOnOff, GraphicBox["inX"] + Factor, GraphicBox["inY"] + 1,
|
||||
GraphicBox["inX"] + (GraphicBox["width"] / 4 - 1), GraphicBox["inY"] + 3, 0, 0, ChargeOnOffcolor)
|
||||
setButton("START INJ", "START INJ", FireUp, GraphicBox["inX"] + (GraphicBox["width"] / 4 + Factor - 1),
|
||||
GraphicBox["inY"] + 1, GraphicBox["inX"] + ((GraphicBox["width"] / 4) * 2 - 1), GraphicBox["inY"] + 3, 0, 0,
|
||||
FireUpcolor)
|
||||
setButton("AUTO-CHARGE", "AUTO-CHARGE", powerUp, GraphicBox["inX"] + ((GraphicBox["width"] / 4) * 2 + Factor - 1),
|
||||
GraphicBox["inY"] + 1, GraphicBox["inX"] + ((GraphicBox["width"] / 4) * 3 - 1), GraphicBox["inY"] + 3, 0, 0,
|
||||
powerUpcolor)
|
||||
setButton("SHUT-DOWN", "SHUT-DOWN", powerDown, GraphicBox["inX"] + ((GraphicBox["width"] / 4) * 3 + Factor - 1),
|
||||
GraphicBox["inY"] + 1, GraphicBox["inX"] + (GraphicBox["width"] - 1), GraphicBox["inY"] + 3, 0, 0, colors.red)
|
||||
|
||||
if FireUpOK == true then
|
||||
sleep(10)
|
||||
rs.setBundledOutput("back", colors.subtract(rs.getBundledOutput("back"), colors.yellow))
|
||||
if FReactor.isIgnited() == false then
|
||||
rs.setBundledOutput("back", colors.red, 1)
|
||||
sleep(1)
|
||||
rs.setBundledOutput("back", 0, colors.red)
|
||||
end
|
||||
FireUpOK = false
|
||||
end
|
||||
|
||||
if (FirstProcent < 25 and FirstProcent >= MinProcenttoBoost) or
|
||||
(SecondProcent < 25 and SecondProcent >= MinProcenttoBoost) then
|
||||
for w = 0, 0 do
|
||||
TankLevel = false
|
||||
TankLevel1 = false
|
||||
TankLevel2 = true
|
||||
end
|
||||
elseif (FirstProcent >= 25 and FirstProcent <= 75) or (SecondProcent >= 25 and SecondProcent <= 75) then
|
||||
for w = 0, 0 do
|
||||
TankLevel = false
|
||||
TankLevel1 = true
|
||||
TankLevel2 = false
|
||||
end
|
||||
elseif (FirstProcent > 75 and SecondProcent > 75) then
|
||||
for w = 0, 0 do
|
||||
TankLevel = true
|
||||
TankLevel1 = false
|
||||
TankLevel2 = false
|
||||
end
|
||||
elseif (FirstProcent < MinProcenttoBoost or SecondProcent < MinProcenttoBoost) then
|
||||
for w = 0, 0 do
|
||||
TankLevel = false
|
||||
TankLevel1 = false
|
||||
TankLevel2 = false
|
||||
end
|
||||
end
|
||||
parallel.waitForAny(refreshStats, loop, clickEvent)
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
function loop()
|
||||
while true do
|
||||
calcInjRate()
|
||||
end
|
||||
end
|
||||
|
||||
function refreshStats()
|
||||
calcInjRate()
|
||||
calcLaserAmplifier()
|
||||
|
||||
-- Laser Visualisierung
|
||||
|
||||
local i = 1
|
||||
|
||||
local infotoAdd = "STATUS: "
|
||||
local infotoAdd1 = "CHARGE-LEVEL: "
|
||||
|
||||
if currentChargeLevel ~= MRFLaser then
|
||||
currentChargeLevel = MRFLaser
|
||||
|
||||
if MRFLaser > 400 then
|
||||
MRFLaserT = 400
|
||||
else
|
||||
MRFLaserT = MRFLaser
|
||||
end
|
||||
|
||||
MRFLaserText = math.floor((MRFLaserT / 400) * 100)
|
||||
|
||||
table.insert(lines,
|
||||
{ GeneralBox["inX"], GeneralBox["inY"], GeneralBox["inX"] + GeneralBox["width"], GeneralBox["inY"], colors.black })
|
||||
table.insert(texts, { GeneralBox["inX"] + 1, GeneralBox["inY"] - 1, infotoAdd, colors.white, colors.black })
|
||||
table.insert(texts,
|
||||
{ GeneralBox["inX"] + 1 + #infotoAdd, GeneralBox["inY"] - 1, ChargeStatus .. " ", ChargeTextcolor, colors.black })
|
||||
table.insert(texts,
|
||||
{ GeneralBox["inX"] + 1, GeneralBox["inY"] + Factor - 1, infotoAdd1 .. MRFLaserText .. "% ", colors.white,
|
||||
colors.black })
|
||||
table.insert(filleds,
|
||||
{ GraphicBox["inX"] + Factor, GraphicBox["inY"] + (GraphicBox["sectionHeight"] * i) + i + 2,
|
||||
GraphicBox["inX"] + GraphicBox["width"] - 1, GraphicBox["inY"] + (GraphicBox["sectionHeight"] * (i + 1)) + i,
|
||||
colors.lightGray })
|
||||
|
||||
width = math.floor((GraphicBox["width"] / 400) * MRFLaserT)
|
||||
table.insert(filleds,
|
||||
{ GraphicBox["inX"] + Factor, GraphicBox["inY"] + (GraphicBox["sectionHeight"] * i) + i + 2,
|
||||
GraphicBox["inX"] + width - 1, GraphicBox["inY"] + (GraphicBox["sectionHeight"] * (i + 1)) + i, colors.green })
|
||||
|
||||
end
|
||||
|
||||
-- Reactor Visualisierung
|
||||
|
||||
local i = 2
|
||||
|
||||
local infotoAdd = "STATUS: "
|
||||
local infotoAdd1 = "INJ-RATE: "
|
||||
local infotoAdd2 = "PLASMA-HEAT: "
|
||||
local infotoAdd3 = "CASE-HEAT: "
|
||||
local infotoAdd4 = "ENERGY/T: "
|
||||
local infotoAdd5 = "ENERGYSTORAGE: "
|
||||
local infotoAdd6 = "WATER: "
|
||||
local infotoAdd7 = "STEAM: "
|
||||
|
||||
if InjRateText > (xRC * 256 + 98) then
|
||||
InjRateT = (xRC * 256 + 98)
|
||||
else
|
||||
InjRateT = InjRateText
|
||||
end
|
||||
|
||||
table.insert(lines,
|
||||
{ ReactorBox["inX"], ReactorBox["inY"], ReactorBox["inX"] + ReactorBox["width"], ReactorBox["inY"], colors.black })
|
||||
table.insert(texts, { ReactorBox["inX"] + 1, ReactorBox["inY"] - 1, infotoAdd, colors.white, colors.black })
|
||||
table.insert(texts,
|
||||
{ ReactorBox["inX"] + 1 + #infotoAdd, ReactorBox["inY"] - 1, ReactorStatus .. " ", RectorTextcolor, colors.black })
|
||||
table.insert(texts,
|
||||
{ ReactorBox["inX"] + 1, ReactorBox["inY"] + Factor - 1, infotoAdd1 .. InjRateT .. " ", colors.white, colors.black })
|
||||
table.insert(texts,
|
||||
{ ReactorBox["inX"] + 1, ReactorBox["inY"] + 2 * Factor - 1, infotoAdd2 .. PlasmaHeat .. " GK ", colors.white,
|
||||
colors.black })
|
||||
table.insert(texts,
|
||||
{ ReactorBox["inX"] + 1, ReactorBox["inY"] + 3 * Factor - 1, infotoAdd3 .. CaseHeat .. " GK ", colors.white,
|
||||
colors.black })
|
||||
table.insert(texts,
|
||||
{ ReactorBox["inX"] + 1, ReactorBox["inY"] + 4 * Factor - 1, infotoAdd4 .. RFOutputT .. " MRF/t ", colors.white,
|
||||
colors.black })
|
||||
table.insert(texts,
|
||||
{ ReactorBox["inX"] + 1, ReactorBox["inY"] + 5 * Factor - 1, infotoAdd5 .. RFStoragePercent .. "% ", colors.white,
|
||||
colors.black })
|
||||
table.insert(texts,
|
||||
{ ReactorBox["inX"] + 1, ReactorBox["inY"] + 6 * Factor - 1, infotoAdd6 .. "--- ", colors.white, colors.black })
|
||||
table.insert(texts,
|
||||
{ ReactorBox["inX"] + 1, ReactorBox["inY"] + 7 * Factor - 1, infotoAdd7 .. "--- ", colors.white, colors.black })
|
||||
|
||||
table.insert(filleds,
|
||||
{ GraphicBox["inX"] + Factor, GraphicBox["inY"] + (GraphicBox["sectionHeight"] * i) + i + 2,
|
||||
GraphicBox["inX"] + GraphicBox["width"] - 1, GraphicBox["inY"] + (GraphicBox["sectionHeight"] * (i + 1)) + i,
|
||||
colors.lightGray })
|
||||
width = math.floor((GraphicBox["width"] / InjRateMax) * InjRateT)
|
||||
table.insert(filleds,
|
||||
{ GraphicBox["inX"] + Factor, GraphicBox["inY"] + (GraphicBox["sectionHeight"] * i) + i + 2,
|
||||
GraphicBox["inX"] + width - 1, GraphicBox["inY"] + (GraphicBox["sectionHeight"] * (i + 1)) + i, colors.green })
|
||||
|
||||
local i = 3
|
||||
|
||||
table.insert(filleds,
|
||||
{ GraphicBox["inX"] + Factor, GraphicBox["inY"] + (GraphicBox["sectionHeight"] * i) + i + 2,
|
||||
GraphicBox["inX"] + GraphicBox["width"] - 1, GraphicBox["inY"] + (GraphicBox["sectionHeight"] * (i + 1)) + i,
|
||||
colors.lightGray })
|
||||
width = math.floor(GraphicBox["width"] * (RFStoragePercent / 100))
|
||||
table.insert(filleds,
|
||||
{ GraphicBox["inX"] + Factor, GraphicBox["inY"] + (GraphicBox["sectionHeight"] * i) + i + 2,
|
||||
GraphicBox["inX"] + width - 1, GraphicBox["inY"] + (GraphicBox["sectionHeight"] * (i + 1)) + i, colors.green })
|
||||
|
||||
-- Tank Visualisierung
|
||||
|
||||
local i = 4
|
||||
|
||||
local infotoAdd = " : "
|
||||
|
||||
table.insert(lines, { TankBox["inX"], TankBox["inY"], TankBox["inX"] + TankBox["width"], TankBox["inY"], colors.black })
|
||||
table.insert(texts,
|
||||
{ TankBox["inX"] + 1, TankBox["inY"] - 1, FirstTankText .. infotoAdd .. FirstProcent .. "% ", colors.white,
|
||||
colors.black })
|
||||
table.insert(texts,
|
||||
{ TankBox["inX"] + 1, TankBox["inY"] + Factor - 1, SecondTankText .. infotoAdd .. SecondProcent .. "% ", colors.white,
|
||||
colors.black })
|
||||
|
||||
table.insert(texts,
|
||||
{ GraphicBox["inX"] + Factor, GraphicBox["inY"] + (GraphicBox["sectionHeight"] * i) + i + 1, FirstTankName,
|
||||
colors.white, colors.black })
|
||||
table.insert(filleds,
|
||||
{ GraphicBox["inX"] + Factor, GraphicBox["inY"] + (GraphicBox["sectionHeight"] * i) + i + 2,
|
||||
GraphicBox["inX"] + GraphicBox["width"] - 1, GraphicBox["inY"] + (GraphicBox["sectionHeight"] * (i + 1)) + i,
|
||||
colors.lightGray })
|
||||
width = math.floor(GraphicBox["width"] * (FirstProcent / 100))
|
||||
table.insert(filleds,
|
||||
{ GraphicBox["inX"] + Factor, GraphicBox["inY"] + (GraphicBox["sectionHeight"] * i) + i + 2,
|
||||
GraphicBox["inX"] + width - 1, GraphicBox["inY"] + (GraphicBox["sectionHeight"] * (i + 1)) + i, FirstTankcolor })
|
||||
|
||||
local i = 5
|
||||
|
||||
table.insert(texts,
|
||||
{ GraphicBox["inX"] + Factor, GraphicBox["inY"] + (GraphicBox["sectionHeight"] * i) + i + 1, SecondTankName,
|
||||
colors.white, colors.black })
|
||||
table.insert(filleds,
|
||||
{ GraphicBox["inX"] + Factor, GraphicBox["inY"] + (GraphicBox["sectionHeight"] * i) + i + 2,
|
||||
GraphicBox["inX"] + GraphicBox["width"] - 1, GraphicBox["inY"] + (GraphicBox["sectionHeight"] * (i + 1)) + i,
|
||||
colors.lightGray })
|
||||
width = math.floor(GraphicBox["width"] * (SecondProcent / 100))
|
||||
table.insert(filleds,
|
||||
{ GraphicBox["inX"] + Factor, GraphicBox["inY"] + (GraphicBox["sectionHeight"] * i) + i + 2,
|
||||
GraphicBox["inX"] + width - 1, GraphicBox["inY"] + (GraphicBox["sectionHeight"] * (i + 1)) + i, SecondTankcolor })
|
||||
|
||||
draw()
|
||||
sleep(1)
|
||||
end
|
||||
|
||||
-- Calcs MRFProduce
|
||||
|
||||
function calcMRFProduce()
|
||||
if EType == "mekanism" then
|
||||
local MRFNeed = RFStorage.getOutput() / 2500000
|
||||
RFStoraged = RFStorage.getEnergy() / 2500000
|
||||
RFMaxStorage = RFStorage.getMaxEnergy() / 2500000
|
||||
RFStoragePercent = math.floor(RFStoraged / RFMaxStorage * 100)
|
||||
if RFStoragePercent > MinProcentforLowMode then
|
||||
MRFProduce = MRFNeed + MRFBuffer -- LowRF Mode but everytime over RFOutput
|
||||
else
|
||||
MRFProduce = RFMaxStorage -- MaxRF Mode
|
||||
end
|
||||
end
|
||||
if EType == "mekanismIM" then
|
||||
local MRFNeed = RFStorage.getOutput() / 2500000
|
||||
RFStoraged = RFStorage.getEnergy() / 2500000
|
||||
RFMaxStorage = RFStorage.getMaxEnergy() / 2500000
|
||||
RFMaxTransfer = RFStorage.getTransferCap() / 2500000
|
||||
RFStoragePercent = math.floor(RFStoraged / RFMaxStorage * 100)
|
||||
if RFStoragePercent > MinProcentforLowMode then
|
||||
MRFProduce = MRFNeed + MRFBuffer -- LowRF Mode but everytime over RFOutput
|
||||
else
|
||||
MRFProduce = RFMaxTransfer -- MaxRF Mode
|
||||
end
|
||||
end
|
||||
if EType == "draconic" then
|
||||
RFStoraged = RFStorage.getEnergyStored() / 1000000
|
||||
RFMaxStorage = RFStorage.getMaxEnergyStored() / 1000000
|
||||
RFStoragePercent = math.floor(RFStoraged / RFMaxStorage * 100)
|
||||
local MRFNeed = RFMaxStorage - RFStoraged
|
||||
MRFProduce = MRFNeed + MRFBuffer
|
||||
end
|
||||
end
|
||||
|
||||
-- Stats of Tanks
|
||||
|
||||
function calcTankStats()
|
||||
local FirstTankInfo = Tanks[0].getTankInfo()
|
||||
local SecondTankInfo = Tanks[1].getTankInfo()
|
||||
if FirstTankInfo[1]["contents"] == nil then
|
||||
FirstTankText = "NO FLUID "
|
||||
FirstTankName = "NO FLUID "
|
||||
FirstTankLiquid = "NO FLUID "
|
||||
FirstAmount = 0
|
||||
FirstProcent = 0
|
||||
FirstTankcolor = colors.lightGray
|
||||
else
|
||||
FirstTankStats = FirstTankInfo[1]
|
||||
local FirstCapacity = FirstTankStats["capacity"]
|
||||
FirstTankName = FirstTankStats["contents"]["rawName"]
|
||||
FirstTankLiquid = FirstTankStats["contents"]["name"]
|
||||
FirstAmount = FirstTankStats["contents"]["amount"]
|
||||
FirstProcent = math.floor(FirstAmount / FirstCapacity * 100)
|
||||
end
|
||||
|
||||
if SecondTankInfo[1]["contents"] == nil then
|
||||
SecondTankText = "NO FLUID "
|
||||
SecondTankName = "NO FLUID "
|
||||
SecondTankLiquid = "NO FLUID "
|
||||
SecondAmount = 0
|
||||
SecondProcent = 0
|
||||
SecondTankcolor = colors.lightGray
|
||||
else
|
||||
SecondTankStats = SecondTankInfo[1]
|
||||
local SecondCapacity = SecondTankStats["capacity"]
|
||||
SecondTankName = SecondTankStats["contents"]["rawName"]
|
||||
SecondTankLiquid = SecondTankStats["contents"]["name"]
|
||||
SecondAmount = SecondTankStats["contents"]["amount"]
|
||||
SecondProcent = math.floor(SecondAmount / SecondCapacity * 100)
|
||||
end
|
||||
|
||||
if FirstTankName == "Liquid Tritium" or SecondTankName == "Liquid Deuterium" then
|
||||
FirstTankcolor = colors.cyan
|
||||
FirstTankText = "L.TRITIUM "
|
||||
SecondTankcolor = colors.red
|
||||
SecondTankText = "L.DEUTERIUM "
|
||||
elseif FirstTankName == "Liquid Deuterium" or SecondTankName == "Liquid Tritium" then
|
||||
FirstTankcolor = colors.red
|
||||
FirstTankText = "L.DEUTERIUM "
|
||||
SecondTankcolor = colors.cyan
|
||||
SecondTankText = "L.TRITIUM "
|
||||
end
|
||||
|
||||
if FirstTankName == "NO FLUID " then
|
||||
FirstTankText = "NO FLUID "
|
||||
FirstTankcolor = colors.lightGray
|
||||
elseif SecondTankName == "NO FLUID " then
|
||||
SecondTankText = "NO FLUID "
|
||||
SecondTankcolor = colors.lightGray
|
||||
end
|
||||
end
|
||||
|
||||
-- Calcs and Sets Inj Rate
|
||||
|
||||
function calcInjRate()
|
||||
recalcInj()
|
||||
calcMRFProduce()
|
||||
calcTankStats()
|
||||
InjRate1 = math.ceil(RFMaxTransfer / k)
|
||||
InjRate2 = math.ceil(MRFProduce / k)
|
||||
|
||||
if Power == true then
|
||||
|
||||
if TankLevel2 == true then
|
||||
InjRate = math.floor(InjRateMax / 4)
|
||||
elseif TankLevel1 == true then
|
||||
InjRate = math.floor(InjRateMax / 4) * 3
|
||||
elseif TankLevel == true then
|
||||
InjRate = InjRate2
|
||||
end
|
||||
if InjRate > InjRate1 then
|
||||
InjRate = InjRate1
|
||||
end
|
||||
if (TankLevel == false and TankLevel1 == false and TankLevel2 == false) or InjRate < 2 then
|
||||
InjRate = 2
|
||||
end
|
||||
if DraconicFluidGate == true then -- if Fluidgate ispresent then D-T-Fuel => main Fuel
|
||||
calcDTFuelInjRate()
|
||||
DTFuelInj.setFlowOverride(DTFuelInjRate)
|
||||
InjRateMax = (xRC * 256 + 98)
|
||||
else -- else normal
|
||||
calcFuelInjRate()
|
||||
InjRateMax = 98
|
||||
end
|
||||
elseif Power == false then
|
||||
if DraconicFluidGate == true then -- if Fluidgate ispresent 0
|
||||
DTFuelInj.setFlowOverride(0)
|
||||
FuelInjRate = 0
|
||||
else -- else FuelInjRate = 0
|
||||
FuelInjRate = 0
|
||||
end
|
||||
end
|
||||
|
||||
InjRateText = FuelInjRate + DTFuelInjRate
|
||||
FReactor.setInjectionRate(FuelInjRate)
|
||||
RFOutputT = round((FReactor.getProducing() / 2500000), 1)
|
||||
PlasmaHeat = round((FReactor.getPlasmaHeat() / 1000000000), 1)
|
||||
CaseHeat = round((FReactor.getCaseHeat() / 1000000000), 1)
|
||||
sleep(1)
|
||||
end
|
||||
|
||||
-- Calcs DTFuelInjRate (max= 256 mb/t because its maximum of one rotary Conden )
|
||||
|
||||
function calcDTFuelInjRate()
|
||||
if InjRate > (xRC * 256) then
|
||||
calcFuelInjRate()
|
||||
DTFuelInjRate = (xRC * 256)
|
||||
else
|
||||
FuelInjRate = 0
|
||||
DTFuelInjRate = InjRate
|
||||
end
|
||||
end
|
||||
|
||||
-- Calcs InjRate for Fusion-Reactor
|
||||
|
||||
function calcFuelInjRate()
|
||||
if DraconicFluidGate == true then
|
||||
FuelInjRate = InjRate - (xRC * 256)
|
||||
else
|
||||
DTFuelInjRate = 0
|
||||
FuelInjRate = InjRate
|
||||
end
|
||||
if FuelInjRate % 2 == 1 then -- Its possible to set InjRate Of Fusion-Reactor to 7, 9, 11, ... in Fusion-Reactor-GUI not possible!!! Maybe Bug??
|
||||
FuelInjRate = FuelInjRate + 1
|
||||
end
|
||||
if FuelInjRate > 98 then -- Its possible to set InjRate Of Fusion-Reactor over 98!!! Maybe Bug??? (For CheatMode set FuelInjRate = 354 for 1,56 GRF!!!)
|
||||
FuelInjRate = 98
|
||||
end
|
||||
end
|
||||
|
||||
-- Laser Amplifier
|
||||
|
||||
function calcLaserAmplifier()
|
||||
MRFMaxLaser = LaserAmp.getMaxEnergy() / 2500000
|
||||
MRFLaser = LaserAmp.getEnergy() / 2500000
|
||||
if MRFLaser < 400 and ChargeOn == true then
|
||||
Charge = 10000000
|
||||
ChargeStatus = "CHARGING"
|
||||
ChargeOnOffcolor = colors.orange
|
||||
ChargeTextcolor = colors.orange
|
||||
elseif MRFLaser < 400 and ChargeOn == false then
|
||||
Charge = 0
|
||||
ChargeStatus = "UNCHARGED"
|
||||
ChargeOnOffcolor = colors.green
|
||||
ChargeTextcolor = colors.red
|
||||
else
|
||||
Charge = 0
|
||||
ChargeStatus = "CHARGED"
|
||||
ChargeOnOffcolor = colors.gray
|
||||
ChargeTextcolor = colors.green
|
||||
end
|
||||
if DraconicFluxGate == true then
|
||||
ChargeLaser = FluxGate.setFlowOverride(Charge)
|
||||
elseif MRFLaser < 400 and DraconicFluxGate == false then
|
||||
rs.setBundledOutput("back", colors.combine(rs.getBundledOutput("back"), colors.black))
|
||||
end
|
||||
if MRFLaser >= 400 then
|
||||
if Auto == true then
|
||||
if DraconicFluidGate == true then -- if Fluidgate ispresent = 2
|
||||
DTFuelInj.setFlowOverride(2)
|
||||
FReactor.setInjectionRate(0)
|
||||
else -- else FuelInjRate = 2
|
||||
FReactor.setInjectionRate(2)
|
||||
end
|
||||
FireUp()
|
||||
elseif MRFLaser >= 400 and Auto == false and DraconicFluxGate == true then
|
||||
FluxGate.setFlowOverride(0)
|
||||
rs.setBundledOutput("back", colors.subtract(rs.getBundledOutput("back"), colors.black))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- Alarm + Hohlraum insert
|
||||
|
||||
function FireUp()
|
||||
if FReactor.isIgnited() == false then
|
||||
Auto = false
|
||||
Power = true
|
||||
FireUpOK = true
|
||||
rs.setBundledOutput("back", colors.combine(rs.getBundledOutput("back"), colors.yellow))
|
||||
FireUpcolor = colors.green
|
||||
calcInjRate()
|
||||
else
|
||||
FireUpcolor = colors.gray
|
||||
end
|
||||
end
|
||||
|
||||
function ChargeOnOff()
|
||||
ChargeOn = true
|
||||
calcLaserAmplifier()
|
||||
end
|
||||
|
||||
--============================================================
|
||||
-- add comma to separate thousands
|
||||
-- From Lua-users.org/wiki/FormattingNumbers
|
||||
--
|
||||
--
|
||||
function comma_value(amount)
|
||||
local formatted = amount
|
||||
while true do
|
||||
formatted, zz = string.gsub(formatted, "^(-?%d+)(%d%d%d)", '%1,%2')
|
||||
if (zz == 0) then
|
||||
break
|
||||
end
|
||||
end
|
||||
return formatted
|
||||
end
|
||||
|
||||
---============================================================
|
||||
-- rounds a number to the nearest decimal places
|
||||
-- From Lua-users.org/wiki/FormattingNumbers
|
||||
--
|
||||
--
|
||||
function round(val, decimal)
|
||||
if (decimal) then
|
||||
return math.floor((val * 10 ^ decimal) + 0.5) / (10 ^ decimal)
|
||||
else
|
||||
return math.floor(val + 0.5)
|
||||
end
|
||||
end
|
||||
|
||||
--===================================================================
|
||||
-- given a numeric value formats output with comma to separate thousands
|
||||
-- and rounded to given decimal places
|
||||
-- From Lua-users.org/wiki/FormattingNumbers
|
||||
--
|
||||
function format_num(amount, decimal, prefix, neg_prefix)
|
||||
local str_amount, formatted, famount, remain
|
||||
|
||||
decimal = decimal or 2 -- default 2 decimal places
|
||||
neg_prefix = neg_prefix or "-" -- default negative sign
|
||||
|
||||
famount = math.abs(round(amount, decimal))
|
||||
famount = math.floor(famount)
|
||||
|
||||
remain = round(math.abs(amount) - famount, decimal)
|
||||
|
||||
-- comma to separate the thousands
|
||||
formatted = comma_value(famount)
|
||||
|
||||
-- attach the decimal portion
|
||||
if (decimal > 0) then
|
||||
remain = string.sub(tostring(remain), 3)
|
||||
formatted = formatted .. "." .. remain ..
|
||||
string.rep("0", decimal - string.len(remain))
|
||||
end
|
||||
|
||||
-- attach prefix string e.g '$'
|
||||
formatted = (prefix or "") .. formatted
|
||||
|
||||
-- if value is negative then format accordingly
|
||||
if (amount < 0) then
|
||||
if (neg_prefix == "()") then
|
||||
formatted = "(" .. formatted .. ")"
|
||||
else
|
||||
formatted = neg_prefix .. formatted
|
||||
end
|
||||
end
|
||||
|
||||
return formatted
|
||||
end
|
||||
|
||||
addDrawBoxes()
|
||||
@@ -0,0 +1,113 @@
|
||||
local reactor, turbine, mon
|
||||
local data = {}
|
||||
buttons = {}
|
||||
local computerTerm = term.current()
|
||||
local wButtons
|
||||
|
||||
local function getPeripherals()
|
||||
rea = peripheral.find("fissionReactorLogicAdapter")
|
||||
turbine = peripheral.find("turbineValve")
|
||||
mon = peripheral.find("monitor")
|
||||
end
|
||||
|
||||
local function update_data()
|
||||
data = {
|
||||
|
||||
reactor_on = reactor.getStatus(),
|
||||
|
||||
reactor_burn_rate = reactor.getBurnRate(),
|
||||
reactor_max_burn_rate = reactor.getMaxBurnRate(),
|
||||
|
||||
reactor_temp = reactor.getTemperature(),
|
||||
reactor_damage = reactor.getDamagePercent(),
|
||||
reactor_coolant = reactor.getCoolantFilledPercentage(),
|
||||
reactor_waste = reactor.getWasteFilledPercentage(),
|
||||
reactor_fuel = reactor.getFuelFilledPercentage(),
|
||||
|
||||
turbine_energy = turbine.getEnergyFilledPercentage(),
|
||||
}
|
||||
end
|
||||
|
||||
local function setButton(name, title, func, x, y, w, h, color, textColor)
|
||||
buttons[name] = {}
|
||||
buttons[name]["title"] = title
|
||||
buttons[name]["func"] = func
|
||||
buttons[name]["active"] = false
|
||||
buttons[name]["x"] = x
|
||||
buttons[name]["y"] = y
|
||||
buttons[name]["w"] = w
|
||||
buttons[name]["h"] = h
|
||||
buttons[name]["color"] = color
|
||||
buttons[name]["textColor"] = textColor
|
||||
end
|
||||
|
||||
local function drawbutton(dButton)
|
||||
paintutils.drawFilledBox(dButton["x"], dButton["y"], dButton["x"] + dButton["w"], dButton["y"] + dButton["h"],
|
||||
dButton["color"])
|
||||
local xTitleCentered = math.floor((dButton["w"] - string.len(dButton["title"])) / 2)
|
||||
term.setCursorPos(dButton["x"] + xTitleCentered, dButton["y"] + math.floor(dButton["h"] / 2))
|
||||
term.setTextColor(dButton["textColor"])
|
||||
term.write(dButton["title"])
|
||||
end
|
||||
|
||||
local function updateButtons()
|
||||
term.redirect(wButtons)
|
||||
for name, dButton in pairs(buttons) do
|
||||
drawbutton(dButton)
|
||||
end
|
||||
term.redirect(computerTerm)
|
||||
end
|
||||
|
||||
local function colored(text, fg, bg)
|
||||
term.setTextColor(fg or colors.white)
|
||||
term.setBackgroundColor(bg or colors.black)
|
||||
term.write(text)
|
||||
end
|
||||
|
||||
local function makeSection(name, x, y, w, h, periph)
|
||||
term.redirect(periph)
|
||||
for row = 1, h do
|
||||
term.setCursorPos(x, y + row - 1)
|
||||
local char = (row == 1 or row == h) and "\127" or " "
|
||||
colored("\127" .. string.rep(char, w - 2) .. "\127", colors.gray)
|
||||
end
|
||||
|
||||
term.setCursorPos(x + 2, y)
|
||||
colored(" " .. name .. " ")
|
||||
term.redirect(computerTerm)
|
||||
return window.create(periph, x + 2, y + 2, w - 4, h - 4)
|
||||
end
|
||||
|
||||
local function drawGraph(name, x, y, w, h, percentage, colorBg, color, periph)
|
||||
local x, y = periph.getSize()
|
||||
term.redirect(periph)
|
||||
if not (name == nil) then
|
||||
term.setCursorPos(x, y)
|
||||
print(name)
|
||||
x = x + 1
|
||||
y = y + 1
|
||||
end
|
||||
paintutils.drawFilledBox(x, y, x + w, y + h, colorBg)
|
||||
-- is graph veritcal ?
|
||||
if (w > h) then
|
||||
paintutils.drawFilledBox(x, y, math.floor(x + w * percentage), y + h, color)
|
||||
else
|
||||
paintutils.drawFilledBox(x, y, x + w, math.floor(y + h * percentage), color)
|
||||
end
|
||||
term.redirect(computerTerm)
|
||||
end
|
||||
|
||||
local function main()
|
||||
getPeripherals()
|
||||
local w, h = mon.getSize()
|
||||
wButtons = makeSection("Buttons", 1, 1, math.floor(w / 3), h, mon)
|
||||
w, h = wButtons.getSize()
|
||||
local hButton = math.floor(h / 4)
|
||||
local spaceBetween = math.ceil(hButton / 2)
|
||||
setButton("+ Inj", "+ Inj", nil, 1, 1, w, hButton, colors.green, colors.white)
|
||||
setButton("- Inj", "- Inj", nil, 1, 1 + hButton + spaceBetween, w, hButton, colors.red, colors.white)
|
||||
setButton("Auto", "Auto Inj", nil, 1, 1 + (spaceBetween + hButton) * 2, w, hButton, colors.orange, colors.white)
|
||||
updateButtons()
|
||||
end
|
||||
|
||||
main()
|
||||
Reference in new issue
Block a user