Posted on November 6, 2015, 12:09 am By agathezol
--[[
Factory Control for FTB
types: buttons
 @desc the array of global buttons indexed by name
 button[name] = {
 text the text displayed
 state if it os "on" or "off"
 func the function called if the button is activated
 origx the top right x
 origy the top right y
 width width of the button
 height height of the button
 padx padding to add to the left and right sides
 pady padding to add to the top and bottom
 foreground text color
 background bg color
 }
 a 'box' object is simpy an alignment rectangle, the default
 is the 'window' object and is initialized by the initMon routine
 it is used by alignment routines for control objects "buttons"
 box {
 o { origin 
 x
 y
 }
 w width
 h height
 }
]]--
-- Locals
local version = "1.0"
local running = true
local mon = ""
local buttons = {}
local window = {}
local outBundleSide = "left"
function initMon(side)
 mon = peripheral.wrap(side)
 mon.setTextScale(1)
 mon.setBackgroundColor(colors.black)
 mon.setTextColor(colors.white)
 window["o"] = {}
 window["o"]["x"] = 1
 window["o"]["y"] = 1
 window["w"], window["h"] = mon.getSize()
end
function updateButtonCalc( button )
 button["tlen"] = string.len( button["text"] )
 button["height"] = button["pady"] * 2 + 1
 button["width"] = button["padx"] * 2 + button["tlen"]
 button["xend"] = button["origx"] + button["width"] - 1
 button["yend"] = button["origy"] + button["height"] - 1
 button["tX"] = button["origx"] + (math.floor( button["width"] / 2 ) - math.floor( button["tlen"] / 2 )) - 1 + button["padx"]
 button["tY"] = button["origy"] + math.floor( button["height"] / 2 )
end
function addButton( name, text, func, state, origx, origy, padx, pady, fore, bact, binact )
 buttons[name] = {}
 buttons[name]["text"] = text
 buttons[name]["state"] = state
 buttons[name]["defstate"] = state
 buttons[name]["func"] = func
 buttons[name]["origx"] = origx
 buttons[name]["origy"] = origy
 buttons[name]["padx"] = padx
 buttons[name]["pady"] = pady
 buttons[name]["foreground"] = fore
 buttons[name]["bact"] = bact
 buttons[name]["binact"] = binact
 
 updateButtonCalc(buttons[name])
end
function addSimpleButton( name, text, func, origx, origy )
 addButton( name, text, func, false, origx, origy, 1, 1, colors.white, colors.cyan, colors.red )
end
function drawButton( bData )
 local tLen = bData["tlen"]
 local h = bData["height"]
 local w = bData["width"]
 local xend = bData["xend"]
 local yend = bData["yend"]
 local tY = bData["tY"]
 local tX = bData["tX"]
 if bData["state"] == true then
 mon.setBackgroundColor( bData["bact"] )
 else
 mon.setBackgroundColor( bData["binact"] )
 end
 mon.setTextColor( bData["foreground"] )
 for i = bData["origy"], yend do
 mon.setCursorPos( bData["origx"], i )
 if i == tY then
 for j = bData["origx"], (xend - tLen + 1) do
 if j == tX then
 mon.write(bData["text"])
 else
 mon.write(" ")
 end
 end
 else
 for i = bData["origx"], xend do
 mon.write(" ")
 end
 end
 end
 mon.setBackgroundColor( colors.black )
end
function drawButtons()
 for name,data in pairs(buttons) do
 drawButton( data )
 end
end
function heading( text )
 w, h = mon.getSize()
 mon.setCursorPos( (w-string.len(text))/2+1, 1 )
 mon.write( text )
end
function drawScreen( )
 mon.clear()
 heading("Factory Control v"..version)
 drawButtons()
end
function toggleButton(name)
 buttons[name]["state"] = not buttons[name]["state"]
end
--[[ for alignment, horiz and vert can have 3 states:
 0 no change
 1 left/top
 2 right/bottom
 3 center
]]--
function alignButtonInBox( button, box, horiz, vert )
 local x = box["o"]["x"]
 local y = box["o"]["y"]
 
 if horiz > 0 then
 if horiz == 1 then
 button["origx"] = x
 elseif horiz == 2 then
 x = (x + box["w"] - 1) - button["width"]
 button["origx"] = x
 elseif horiz == 3 then
 x = x + (box["w"] / 2)
 button["origx"] = x
 end
 end
 if vert > 0 then
 if vert == 1 then
 button["origy"] = y
 elseif vert == 2 then
 y = (y + box["h"] - 1) - button["height"]
 button["origy"] = y
 elseif vert == 3 then
 y = y + (box["h"] / 2)
 button["origy"] = y
 end
 end
 updateButtonCalc( button )
end
function powerDown()
 print("shutting down...")
 running = false
end
-- the nuke is using white for its color
function toggleNuclear(name)
 local mcol = colors.white
 local ccol = rs.getBundledOutput(outBundleSide)
 local button = buttons[name]
 if button["state"] == false then
 print("turning "..name.." on")
 button["state"] = true
 local ac = colors.combine( ccol, mcol )
 rs.setBundledOutput(outBundleSide, ac)
 else
 print("turning "..name.." off")
 button["state"] = false
 local ac = colors.subtract( ccol, mcol )
 rs.setBundledOutput( outBundleSide, ac )
 end
end
function toggleMJLava(name)
 local mcol = colors.blue
 local ccol = rs.getBundledOutput(outBundleSide)
 local button = buttons[name]
 if button["state"] == false then
 button["state"] = true
 local ac = colors.combine( ccol, mcol )
 rs.setBundledOutput(outBundleSide, ac)
 else
 button["state"] = false
 local ac = colors.subtract( ccol, mcol )
 rs.setBundledOutput( outBundleSide, ac )
 end
end
-- note, the elec connectoin isn't on
function toggleMJElec(name)
 local mcol = colors.green
 local ccol = rs.getBundledOutput(outBundleSide)
 local button = buttons[name]
 if button["state"] == false then
 button["state"] = true
 local ac = colors.combine( ccol, mcol )
 rs.setBundledOutput(outBundleSide, ac)
 else
 button["state"] = false
 local ac = colors.subtract( ccol, mcol )
 rs.setBundledOutput( outBundleSide, ac )
 end
end
function toggleMassFab(name)
 local mcol = colors.black
 local ccol = rs.getBundledOutput(outBundleSide)
 local button = buttons[name]
 if button["state"] == false then
 button["state"] = true
 local ac = colors.combine( ccol, mcol )
 rs.setBundledOutput(outBundleSide, ac)
 else
 button["state"] = false
 local ac = colors.subtract( ccol, mcol )
 rs.setBundledOutput( outBundleSide, ac )
 end
end
function toggleFarms(name)
 local mcol = colors.pink
 local ccol = rs.getBundledOutput(outBundleSide)
 local button = buttons[name]
 if button["state"] == false then
 print("turning "..name.." on")
 button["state"] = true
 local ac = colors.combine( ccol, mcol )
 rs.setBundledOutput(outBundleSide, ac)
 else
 print("turning "..name.." off")
 button["state"] = false
 local ac = colors.subtract( ccol, mcol )
 rs.setBundledOutput( outBundleSide, ac )
 end
end
function toggleQuarry(name)
 local mcol = colors.lightBlue
 local ccol = rs.getBundledOutput(outBundleSide)
 local button = buttons[name]
 if button["state"] == false then
 print("turning "..name.." on")
 button["state"] = true
 local ac = colors.combine( ccol, mcol )
 rs.setBundledOutput(outBundleSide, ac)
 else
 print("turning "..name.." off")
 button["state"] = false
 local ac = colors.subtract( ccol, mcol )
 rs.setBundledOutput( outBundleSide, ac )
 end
end
function toggleMFFSExt(name)
 local mcol = colors.gray
 local ccol = rs.getBundledOutput(outBundleSide)
 local button = buttons[name]
 if button["state"] == false then
 print("turning "..name.." on")
 button["state"] = true
 local ac = colors.combine( ccol, mcol )
 rs.setBundledOutput(outBundleSide, ac)
 else
 print("turning "..name.." off")
 button["state"] = false
 local ac = colors.subtract( ccol, mcol )
 rs.setBundledOutput( outBundleSide, ac )
 end
end
function initButtons()
 addSimpleButton( "nuke", "Nuclear Power", toggleNuclear, 1, 3 )
 addSimpleButton( "mjlava", "MJ Lava Power", toggleMJLava, 1, 7)
 addSimpleButton( "mjelec", "MJ Elec Power", toggleMJElec, 2 + buttons["mjlava"]["xend"], 7 )
 addSimpleButton( "farms", " Farm Power ", toggleFarms, 1, 11 )
 addSimpleButton( "quarry", "Tesser Power", toggleQuarry, 2 + buttons["farms"]["xend"], 11 )
 -- addSimpleButton( "mffsext","MFFS Extractor", toggleMFFSExt, 2 + buttons["quarry"]["xend"], 11 )
 addSimpleButton( "power", "(|)", powerDown, 1, 3 )
 buttons["power"]["binact"] = colors.purple
 alignButtonInBox( buttons["power"], window, 2, 0 )
 addSimpleButton( "massfab", "Mass Fabricator", toggleMassFab, 1, 7 )
 alignButtonInBox( buttons["massfab"], window, 2, 0 )
end
function checkButtonHit( x, y )
 for name, data in pairs(buttons) do
 if y >= data["origy"] and y <= data["yend"] then
 if x >= data["origx"] and x <= data["xend"] then
 data["func"](name)
 end
 end
 end
end
function shutdownButtons()
 for name, data in pairs(buttons) do
 if data["state"] ~= data["defstate"] then
 data["func"](name)
 end
 end
end
-- current mon is 50x19
print("Factory Control v"..version.." starting up...")
function handleRSEvent()
 local ccolors = rs.getBundledInput(outBundleSide)
 if colors.test( ccolors, colors.purple ) then
 if buttons["nuke"]["state"]== false then
 toggleNuclear("nuke")
 end
 else
 if buttons["nuke"]["state"] == true then
 toggleNuclear("nuke")
 end
 end
end
function handleEvents()
 while running == true do
 drawScreen()
 local e, side, x, y = os.pullEvent()
 if e == "monitor_touch" then
 checkButtonHit( x, y )
 elseif e == "redstone" then
 handleRSEvent()
 else
 print("received event "..e)
 end
 sleep( .1 )
 end
end
rs.setOutput("top", true) -- turn on the "i'm on" output
initMon("right")
initButtons()
handleEvents()
shutdownButtons()
rs.setOutput("top", false) -- turn off "i'm on" output
mon.clear()
 Categories: Minecraft