-- === Reactor Control Program === -- ComputerCraft: Tweaked -- Touchscreen GUI with auto-scaling buttons -- === CONFIGURATION === local reactorPowerSide = "back" -- redstone side for reactor on/off local sequenceSide1 = "left" -- first side of open/close sequence local sequenceSide2 = "right" -- second side of open/close sequence local sequenceDelay = 2 -- seconds between signals (adjust as needed) -- === STATE === local reactorOn = false local reactorOpen = false -- === SETUP === local mon = peripheral.find("monitor") if not mon then print("No monitor found!") return end mon.setTextScale(1) mon.setBackgroundColor(colors.black) mon.setTextColor(colors.white) mon.clear() local monW, monH = mon.getSize() -- === FUNCTIONS === local function drawButton(x, y, w, h, label, active) mon.setBackgroundColor(active and colors.green or colors.red) for i = y, y + h - 1 do mon.setCursorPos(x, i) mon.write(string.rep(" ", w)) end mon.setTextColor(colors.white) mon.setCursorPos(x + math.floor((w - #label) / 2), y + math.floor(h / 2)) mon.write(label) mon.setBackgroundColor(colors.black) end local function drawUI() mon.clear() local buttonW = math.floor(monW * 0.6) local buttonH = math.floor(monH * 0.3) local startX = math.floor((monW - buttonW) / 2) -- Top button (reactor) drawButton(startX, 2, buttonW, buttonH, "Reactor: " .. (reactorOn and "ON" or "OFF"), reactorOn) -- Bottom button (open/close) local bottomY = monH - buttonH - 1 drawButton(startX, bottomY, buttonW, buttonH, reactorOpen and "Close Reactor" or "Open Reactor", reactorOpen) end local function toggleReactor() reactorOn = not reactorOn redstone.setOutput(reactorPowerSide, reactorOn) end local function toggleReactorOpen() if reactorOpen then -- Close sequence (reverse) redstone.setOutput(sequenceSide2, true) sleep(sequenceDelay) redstone.setOutput(sequenceSide2, false) redstone.setOutput(sequenceSide1, true) sleep(sequenceDelay) redstone.setOutput(sequenceSide1, false) else -- Open sequence (forward) redstone.setOutput(sequenceSide1, true) sleep(sequenceDelay) redstone.setOutput(sequenceSide1, false) redstone.setOutput(sequenceSide2, true) sleep(sequenceDelay) redstone.setOutput(sequenceSide2, false) end reactorOpen = not reactorOpen end -- === MAIN LOOP === drawUI() while true do local event, side, x, y = os.pullEvent("monitor_touch") local buttonW = math.floor(monW * 0.6) local buttonH = math.floor(monH * 0.3) local startX = math.floor((monW - buttonW) / 2) local bottomY = monH - buttonH - 1 -- Reactor toggle area if x >= startX and x <= startX + buttonW - 1 and y >= 2 and y <= 2 + buttonH - 1 then toggleReactor() drawUI() end -- Open/Close area if x >= startX and x <= startX + buttonW - 1 and y >= bottomY and y <= bottomY + buttonH - 1 then toggleReactorOpen() drawUI() end end