-- draconic_reactor_controller.lua
-- Works *only* with getReactorInfo() — safe & stable controller
--------------- CONFIG ----------------
local TARGET_TEMP = 7600
local EMERGENCY_TEMP = 7900
local MIN_FIELD = 10 -- percent
local SAFETY_FACTOR = 0.85 -- usable fraction of available power
local KP = 25000 -- RF/t per degree of error (tune if needed)
local INJECTOR_FROM_OUTPUT = true -- set false if injector is externally powered
local LOOP_DELAY = 0.2
----------------------------------------
-- Find peripherals
local reactor = peripheral.find("draconic_reactor")
or error("No draconic_reactor peripheral found!")
local fluxOut = peripheral.find("flux_gate")
or error("No flux_gate peripheral found!")
if not fluxOut.setFlowOverride then
error("Flux gate missing setFlowOverride()!")
end
-- Main loop
while true do
local info = reactor.getReactorInfo()
if not info or not info.temperature then
print("Reactor not providing valid info.")
sleep(1)
else
local T = info.temperature
local G = info.generation or 0
local F = info.fieldDrainRate or 0
local fieldPct = info.fieldStrength or 100
-- Emergency shutdown
if T >= EMERGENCY_TEMP or fieldPct <= MIN_FIELD then
fluxOut.setFlowOverride(0)
print("!!! EMERGENCY SHUTDOWN !!!")
print("Temp: ", T, " Field: ", fieldPct)
if reactor.stopReactor then reactor.stopReactor() end
sleep(99999)
end
-- Calculate available power
local A
if INJECTOR_FROM_OUTPUT then
A = G - F
else
A = G
end
if A < 0 then A = 0 end
-- Apply proportional control
local errorTemp = (T - TARGET_TEMP)
local correction = KP * errorTemp
local limit = SAFETY_FACTOR * A - correction
if limit < 0 then limit = 0 end
fluxOut.setFlowOverride(math.floor(limit))
-- Display
term.clear()
term.setCursorPos(1,1)
print("=== Draconic Reactor Controller ===")
print("Temperature: ", T)
print("Generation: ", G)
print("Field Drain: ", F)
print("Field %: ", fieldPct)
print("Available Power: ", A)
print("-------------------------------------")
print("Output Limit Set: ", limit)
print("Temp Error: ", errorTemp)
print("-------------------------------------")
end
sleep(LOOP_DELAY)
end