-- Function to check if a peripheral is connected and return it, or raise an error with a custom error message. local function checkPeripheral(name, errorMessage) local peripheral = peripheral.find(name) assert(peripheral, errorMessage) return peripheral end -- Custom colors for button states colorButtonOn = colors.lime colorButtonOff = colors.gray -- Initialize the monitor peripheral mon = checkPeripheral("monitor", "Monitor not found.") button = {} -- Table to store button data -- Function to clear the button table and clear the monitor screen. function clearTable() button = {} mon.clear() end -- Function to add a button to the button table with its associated function and coordinates. function setTable(name, func, xmin, xmax, ymin, ymax) button[name] = {} button[name]["func"] = func button[name]["active"] = false button[name]["xmin"] = xmin button[name]["ymin"] = ymin button[name]["xmax"] = xmax button[name]["ymax"] = ymax end -- Function to fill a button area with text and color. function fill(text, color, bData) mon.setBackgroundColor(color) local yspot = math.floor((bData["ymin"] + bData["ymax"]) / 2) local xspot = math.floor((bData["xmax"] - bData["xmin"] - string.len(text)) / 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(text) + 1 do if k == xspot then mon.write(text) else mon.write(" ") end end else for i = bData["xmin"], bData["xmax"] do mon.write(" ") end end end mon.setBackgroundColor(colors.black) end -- Function to update the screen with button states. function screen() local currColor for name, data in pairs(button) do local on = data["active"] if on == true then currColor = colorButtonOn else currColor = colorButtonOff end fill(name, currColor, data) end end -- Function to toggle a button's state and update the screen. function toggleButton(name) for buttonName, data in pairs(button) do if buttonName ~= name and data["active"] then data["active"] = false end end button[name]["active"] = true screen() end -- Function to temporarily toggle a button's state (for visual feedback) and update the screen. function flash(name) toggleButton(name) screen() sleep(0.25) toggleButton(name) screen() end -- Function to check if a click falls within any button's coordinates and execute its associated function. 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 if data["func"] then data["func"]() end return true end end end return false end -- Function to draw a colored box on the monitor. function drawBox(xStart, yStart, xEnd, yEnd, color) local w, h = mon.getSize() xStart = math.max(1, xStart) xEnd = math.min(w, xEnd) yStart = math.max(1, yStart) yEnd = math.min(w, yEnd) for x = xStart, xEnd do mon.setBackgroundColor(color) mon.setCursorPos(x, yStart) mon.write(" ") mon.setCursorPos(x, yEnd) mon.write(" ") end for y = yStart + 1, yEnd - 1 do mon.setBackgroundColor(color) mon.setCursorPos(xStart, y) mon.write(" ") mon.setCursorPos(xEnd, y) mon.write(" ") end end -- Function to draw button boxes with a specified color. function drawButtonBoxes(color) drawBox(2, 2, 78, 33, color) end -- Function to display centered text on the monitor. function heading(text, y, bgColor) local w, h = mon.getSize() mon.setBackgroundColor(colors.black) mon.setCursorPos((w - string.len(text)) / 2 + 1, y) mon.write(text) end