Advertisement
surferpup

PortalComputer

Dec 9th, 2013
380
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 16.17 KB | None | 0 0
  1. -- Portal Computer v 2.2 (inspired by Armitige Shanks You Tube video of same)
  2. -- by Mike Simpkins December 2013 (Creative Commons)
  3. -- Paired with Portal Turtle (http://pastebin.com/aysQLJG7)
  4.  
  5. wirelessModemSide="bottom"
  6. showDebug=false
  7. hasDrawBridge=1
  8. drawBridgeColor=colors.orange
  9. drawBridgeOutput="top"
  10. startingRow=5
  11. numberRows=4
  12. numberColumns=4
  13. linesPerRow=4
  14. columnWidth=10
  15. borderColor=colors.cyan
  16. buttonBackgroundColor=colors.lightBlue
  17. buttonTextColor=colors.black
  18. buttonSelectedBackground=colors.lime
  19. buttonSelectedTextColor=colors.white
  20. buttonDisabledBackgroundColor=colors.lightGray
  21. buttonDisabledTextColor=colors.gray
  22. portalMessageBackground=colors.yellow
  23. rednet.open(wirelessModemSide)
  24. local screen = 1
  25. local numberOfPages = 3
  26. local pages =
  27. {
  28.     --center
  29.     [1]={Monitor=peripheral.wrap("monitor_13"),Side="monitor_13",Title="PLAYER LOCATIONS",Buttons=
  30.         {
  31.             [1]={Label1 ="Oatmeal",Label2=" Defender",Label3="",Enabled=true},
  32.             [2]={Label1 ="",Label2="Surferpup",Label3="",Enabled=true},
  33.             [3]={Label1 = "Bremon",Label2="&",Label3="Kirra",Enabled=false},
  34.             [4]={Label1 ="MoNKi",Label2="Di",Label3="RuFFi",Enabled=false},
  35.            
  36.             [5]={Label1 = "Telephone",Label2="Guy",Label3="",Enabled=false},
  37.             [6]={Label1 = "",Label2=" MacBoyJr",Label3="",Enabled=true},
  38.             [7]={Label1 = "Enderman",Label2="209",Label3="",Enabled=false},
  39.             [8]={Label1 = "Korbynx",Label2="&",Label3="Joeltine",Enabled=true},
  40.            
  41.             [9]={Label1 ="",Label2="Gh0stRAT",Label3="",Enabled=false},
  42.             [10]={Label1 ="",Label2="",Label3="",Enabled=false},
  43.             [11]={Label1 ="",Label2="",Label3="",Enabled=false},
  44.             [12]={Label1 ="",Label2="",Label3="",Enabled=true},
  45.            
  46.             [13]={Label1 = "",Label2="",Label3="",Enabled=false},
  47.             [14]={Label1 = "",Label2="",Label3="",Enabled=true},
  48.             [15]={Label1 = "",Label2="",Label3="",Enabled=true},
  49.             [16]={Label1 = "",Label2="",Label3="",Enabled=true}
  50.         }},
  51.     --left
  52.     [2]={Monitor=peripheral.wrap("monitor_12"),Side="monitor_12",Title="WORLD PLACES",Buttons=
  53.         {
  54.             [1]={Label1 = "Portal",Label2="Room",Label3="",Enabled=false},
  55.             [2]={Label1 ="Lovely",Label2="Portoa",Label3="",Enabled=false},
  56.             [3]={Label1 ="New",Label2="Mining",Label3="World",Enabled=true},
  57.             [4]={Label1 ="Old",Label2="Mining",Label3="World",Enabled=true},
  58.            
  59.             [5]={Label1 ="The",Label2="Nether",Label3="",Enabled=false},
  60.             [6]={Label1 ="",Label2="THE END",Label3="",Enabled=false},
  61.             [7]={Label1 ="Twilight",Label2="Forest",Label3="",Enabled=true},
  62.             [8]={Label1 ="Promised",Label2="Land",Label3="",Enabled=false},
  63.            
  64.             [9]={Label1="Original",Label2="Spawn",Label3="",Enabled=false},
  65.             [10]={Label1 ="",Label2="",Label3="",Enabled=false},
  66.             [11]={Label1 ="",Label2="",Label3="",Enabled=false},
  67.             [12]={Label1 ="",Label2="",Label3="",Enabled=false},
  68.            
  69.             [13]={Label1 ="",Label2="",Label3="",Enabled=true},
  70.             [14]={Label1 ="",Label2="",Label3="",Enabled=false},
  71.             [15]={Label1 ="",Label2="",Label3="",Enabled=false},
  72.             [16]={Label1 ="",Label2="",Label3="",Enabled=true}
  73.         }},
  74.     --right
  75.     [3]={Monitor=peripheral.wrap("monitor_10"),Side="monitor_10",Title="RESTRICTED LOCATIONS",Buttons=
  76.         {
  77.             [1]={Label1 ="Portal",Label2="Back",Label3="Room",Enabled=false},
  78.             [2]={Label1 ="Portal",Label2="Emergency",Label3="Exit",Enabled=false},
  79.             [3]={Label1 ="Surferpup",Label2="Machine",Label3="Room",Enabled=true},
  80.             [4]={Label1 ="",Label2="",Label3="",Enabled=true},
  81.            
  82.             [5]={Label1 ="Nexus",Label2="Area 51",Label3="",Enabled=false},
  83.             [6]={Label1 ="Nexus",Label2="Storage",Label3="Tanks",Enabled=true},
  84.             [7]={Label1 ="",Label2="",Label3="",Enabled=true},
  85.             [8]={Label1 ="",Label2="",Label3="",Enabled=true},
  86.            
  87.             [9]={Label1 ="Surferpup",Label2="OldWorld",Label3="House",Enabled=true},
  88.             [10]={Label1 = "Oatmeal",Label2="OldWorld",Label3="Palace",Enabled=false},
  89.             [11]={Label1 ="Old World",Label2="Spawn",Label3="",Enabled=false},
  90.             [12]={Label1 ="",Label2="",Label3="",Enabled=false},
  91.            
  92.             [13]={Label1 ="Bee-Topia",Label2="",Label3="",Enabled=true},
  93.             [14]={Label1 ="Ocean",Label2="Castle",Label3="",Enabled=false},
  94.             [15]={Label1 ="",Label2="",Label3="",Enabled=true},
  95.             [16]={Label1 ="",Label2="",Label3="",Enabled=true}
  96.         }}
  97.    
  98. }
  99. local message=""
  100. local turtles={}
  101. function forceInit(page)
  102.     if (not rednet.isOpen(wirelessModemSide)) then rednet.Open(wirelessModemSide) end
  103.     rednet.send(turtles[page],"InitTurtle"..tostring(page))
  104.     initTurtle(page)
  105. end
  106. function forceAnnounce()
  107.     if (not rednet.isOpen(wirelessModemSide)) then rednet.Open(wirelessModemSide) end
  108.     portalMessage(true,"ACQUIRING DESTINATIONS",colors.orange)
  109.     --print("updatedPortalMessage")
  110.     while true do
  111.         print("Announcing...")
  112.         rednet.broadcast("ANNOUNCE")
  113.         event,sender,message,_ = os.pullEvent("rednet_message")
  114.         --print ("sender="..sender.."message="..(message or "BUBBA"))
  115.         if (string.sub(message or "BOB",1,6)=="TURTLE") then break end
  116.         sleep (1)
  117.     end
  118.     print ("...Done with Announce")
  119. end
  120. function initTurtle(page)
  121.     if (not rednet.isOpen(wirelessModemSide)) then rednet.Open(wirelessModemSide) end
  122.     portalMessage(true,"    REFRESHING PAGE   "..tostring(page),colors.orange)
  123.     repeat
  124.         event,sender,message,_=os.pullEvent("rednet_message")
  125.     until message== "InitTurtle"..page
  126.     rednet.send(sender,"PROCEED"..page,true)
  127.     print("Sent Init PROCEED to Turtle"..page)
  128.     repeat
  129.         repeat
  130.             sender,message,_=rednet.receive()
  131.         until sender == turtles[page]
  132.         if ((message or "")~=("OK"..page)) then
  133.             status=(message or "NONE")
  134.             rednet.send(sender,status,true)
  135.         end
  136.         --print("repeating")
  137.     until message==("OK"..page)
  138.     print (status)
  139.     local turtleInventory = textutils.unserialize(status)
  140.     --print (""..#pages[1]..","..page)
  141.     for i=1,#pages[page].Buttons do
  142.         currentButton=pages[page].Buttons[i]
  143.         currentButton.Enabled=(turtleInventory[i]>0)
  144.     end
  145.     print("Turtle"..page.." Initialized")
  146. end
  147.  
  148. function centerText(text,maxWidth)
  149.     text=text or ""
  150.     local leftPadding = math.floor((maxWidth-string.len(string.sub(text,1,maxWidth)))/2)
  151.     local newString=""
  152.     if leftPadding>0 then
  153.         newString= (string.rep(" ",leftPadding)..string.sub(text,1,maxWidth))
  154.         else
  155.         newString= string.sub(text,1,maxWidth)
  156.     end
  157.    
  158.     newString=newString..string.rep(" ",maxWidth-string.len(newString))
  159.     return newString
  160. end
  161.  
  162.  
  163. function drawGUI(page)
  164.     page=page or 1
  165.     --Heading
  166.     --Monitor=peripheral.wrap(pages[page].Side)
  167.     pages[page].Monitor.clear()
  168.     pages[page].Monitor.setBackgroundColor(borderColor)
  169.     pages[page].Monitor.setCursorPos(9,1)
  170.     pages[page].Monitor.setBackgroundColor(colors.white)
  171.     pages[page].Monitor.setTextColor(colors.red)
  172.     pages[page].Monitor.write(centerText("",26))
  173.     pages[page].Monitor.setBackgroundColor(borderColor)
  174.     pages[page].Monitor.setCursorPos(9,2)
  175.     pages[page].Monitor.setBackgroundColor(colors.white)
  176.     pages[page].Monitor.write(centerText(pages[page].Title,26))
  177.     pages[page].Monitor.setBackgroundColor(borderColor)
  178.     pages[page].Monitor.setCursorPos(9,3)
  179.     pages[page].Monitor.setBackgroundColor(colors.white)
  180.     pages[page].Monitor.write(centerText("",26))
  181.     pages[page].Monitor.setBackgroundColor(borderColor)
  182.    
  183.    
  184.     for row = 1,numberRows do
  185.         currentRow=startingRow+((row-1)*linesPerRow)
  186.         for column = 1,numberColumns do
  187.             currentColumn=(column-1)*columnWidth+1
  188.             -- Button 1_1
  189.             currentButton = pages[page].Buttons[((row-1)*numberColumns)+column]
  190.             local buttonColor
  191.             if (currentButton.Enabled) then
  192.                 buttonColor = buttonBackgroundColor
  193.                 buttonText = buttonTextColor
  194.                 else
  195.                 buttonColor = buttonDisabledBackgroundColor
  196.                 buttonText = buttonDisabledTextColor
  197.             end
  198.             pages[page].Monitor.setCursorPos(currentColumn,currentRow)
  199.             pages[page].Monitor.setBackgroundColor(buttonColor)
  200.             pages[page].Monitor.setTextColor(buttonTextColor)
  201.             pages[page].Monitor.write(centerText(currentButton.Label1,9))
  202.             pages[page].Monitor.setBackgroundColor(borderColor)
  203.             pages[page].Monitor.setCursorPos(currentColumn,currentRow+1)
  204.             pages[page].Monitor.setBackgroundColor(buttonColor)
  205.             pages[page].Monitor.setTextColor(buttonTextColor)
  206.             pages[page].Monitor.write(centerText(currentButton.Label2,9))
  207.             pages[page].Monitor.setBackgroundColor(borderColor)
  208.             pages[page].Monitor.setCursorPos(currentColumn,currentRow+2)
  209.             pages[page].Monitor.setBackgroundColor(buttonColor)
  210.             pages[page].Monitor.setTextColor(buttonTextColor)
  211.             pages[page].Monitor.write(centerText(currentButton.Label3,9))
  212.             pages[page].Monitor.setBackgroundColor(borderColor)
  213.         end
  214.     end
  215.    
  216. end
  217.  
  218. function portalMessage(result,screenMessage,messageBackground,page) -- add background color
  219.     page=page or 1
  220.     messageBackground = messageBackground or portalMessageBackground
  221.     if(result) then
  222.         background = messageBackground
  223.         else
  224.         background = colors.pink
  225.     end
  226.     pages[page].Monitor=peripheral.wrap(pages[page].Side)
  227.     pages[page].Monitor.setCursorPos(8,9)
  228.     pages[page].Monitor.setBackgroundColor(background)
  229.     pages[page].Monitor.write("                       ")
  230.     pages[page].Monitor.setCursorPos(8,10)
  231.     pages[page].Monitor.write("                       ")
  232.     pages[page].Monitor.setCursorPos(8,11)
  233.     pages[page].Monitor.write("                       ")
  234.     pages[page].Monitor.setCursorPos(8,12)
  235.     pages[page].Monitor.write("                       ")
  236.     pages[page].Monitor.setCursorPos(8,13)
  237.     pages[page].Monitor.write("                       ")
  238.     pages[page].Monitor.setCursorPos(8,11)
  239.     pages[page].Monitor.setTextColor(colors.black)
  240.     --Monitor.write("     OPENING PORTAL    ")
  241.     pages[page].Monitor.write(screenMessage)
  242.     pages[page].Monitor.setBackgroundColor(borderColor)
  243. end
  244.  
  245. -- BEGIN PROGRAM
  246.  
  247. rs.setBundledOutput(drawBridgeOutput,drawBridgeColor)
  248. --drawGUI()
  249. screen=1
  250. term.restore()
  251. term.clear()
  252. if (showDebug) then
  253.     mon2 = peripheral.wrap("monitor_7")
  254.     mon2.clear()
  255. end
  256. drawGUI(1)
  257. forceAnnounce()
  258. currentPage = 1
  259. while true do
  260.     local clickPage=1
  261.     for i = 1,#pages do
  262.         drawGUI(i)
  263.     end
  264.     event,arg1,arg2,arg3,arg4,a4g5 =os.pullEvent()
  265.     --event, mouseButton, x, y = os.pullEvent("monitor_touch")
  266.     if (showDebug) then
  267.         term.redirect(mon2)
  268.         print(""..event..","..(arg1 or "")..","..arg2 or ""..","..(arg3 or "")..","..(arg4 or "")..","..(arg5 or ""))
  269.         term.restore()
  270.     end
  271.     if (event=="monitor_touch") then
  272.         side = arg1
  273.         x=arg2
  274.         y=arg3
  275.         print("Monitor "..side..", x="..tostring(x)..", y="..tostring(y))
  276.         Monitor=peripheral.wrap(side)
  277.         for i=1,#pages do
  278.             if side==pages[i].Side then
  279.                 clickPage=i
  280.                 break
  281.             end
  282.             clickPage=1
  283.         end
  284.         if (y<5 or y>20) then
  285.             if (showDebug) then
  286.                 term.redirect(mon2)
  287.                 print("Non-Button Pressed")
  288.                 term.restore()
  289.             end
  290.             else
  291.             buttonColumn = math.floor(x/columnWidth) +1
  292.             buttonRow = math.floor((y - 5)/linesPerRow)+1
  293.             currentRow=startingRow+((buttonRow-1)*linesPerRow)
  294.             currentColumn=(buttonColumn-1)*columnWidth+1
  295.             --print (""..buttonColumn.." C--R "..buttonRow)
  296.             if (showDebug) then
  297.                 term.redirect(mon2)
  298.                 print(""..y..","..x.." -- "..buttonRow..","..buttonColumn)
  299.                 term.restore()
  300.             end
  301.             buttonNumber=(buttonRow-1)*numberColumns+buttonColumn
  302.             buttonPressed=pages[clickPage].Buttons[buttonNumber]
  303.             if (buttonPressed.Enabled) then
  304.                 if (showDebug) then
  305.                     term.redirect(mon2)
  306.                     print(buttonPressed.Label)
  307.                     term.restore()
  308.                 end
  309.                 portalMessage(true,"   CONFIGURING PORTAL  ")
  310.                 Monitor.setCursorPos(currentColumn,currentRow)
  311.                 Monitor.setBackgroundColor(buttonSelectedBackground) -- change button color make selectable.
  312.                 Monitor.setTextColor(buttonSelectedTextColor)
  313.                 Monitor.write(centerText(buttonPressed.Label1,9))
  314.                 Monitor.setBackgroundColor(borderColor)
  315.                 Monitor.setCursorPos(currentColumn,currentRow+1)
  316.                 Monitor.setBackgroundColor(buttonSelectedBackground)
  317.                 Monitor.setTextColor(buttonSelectedTextColor)
  318.                 Monitor.write(centerText(buttonPressed.Label2,9))
  319.                 Monitor.setBackgroundColor(buttonSelectedBackground)
  320.                 Monitor.setCursorPos(currentColumn,currentRow+2)
  321.                 Monitor.setBackgroundColor(buttonSelectedBackground)
  322.                 Monitor.setTextColor(colors.black)
  323.                 Monitor.write(centerText(buttonPressed.Label3,9))
  324.                 Monitor.setBackgroundColor(borderColor)
  325.                 --sleep(1)
  326.                 print("Requesting Book: "..buttonPressed.Label1.." "..buttonPressed.Label2.." "..buttonPressed.Label3)
  327.                 rednet.send(turtles[clickPage],"GetBook"..tostring(buttonNumber))
  328.                 local event, sender, message, _ = os.pullEvent("rednet_message")
  329.                 --print ("Received Turtle: "..message)
  330.                 if(message=="OK") then
  331.                     portalMessage(true,"     OPENING PORTAL    ",colors.lime)
  332.                     rs.setBundledOutput(drawBridgeOutput,0)
  333.                     local event, sender, message, _ = os.pullEvent("rednet_message")
  334.                     portalMessage(true,"     CLOSING PORTAL    ")
  335.                     rs.setBundledOutput(drawBridgeOutput,drawBridgeColor)
  336.                     print("Received from Turtle:"..message)
  337.                     sleep(3)
  338.                     else
  339.                     portalMessage(false,"     PORTAL FAILURE    ")
  340.                     print("Portal Failure on Page "..tostring(clickPage)..", forcing Init.")
  341.                     sleep(2)
  342.                     forceInit(clickPage)
  343.                     sleep(2)
  344.                 end
  345.                 else
  346.                 print("Disabled Button pressed.")
  347.                 portalMessage(false,"     BUTTON DISABLED   ")
  348.                 sleep(3)
  349.             end
  350.         end
  351.         elseif event=="rednet_message" and arg1~=os.getComputerID() then
  352.         sender = arg1
  353.         message = arg2
  354.         --print(tostring(sender).." sent "..message)
  355.         if(string.sub(message,1,6)=="TURTLE") then
  356.             turtlePage=tonumber(string.sub(message,7))
  357.             turtles[turtlePage]=sender
  358.             print("Turtle ID = "..turtles[turtlePage].." Page = "..turtlePage)
  359.             print("Sending CONTROL to "..sender)
  360.             rednet.send(sender,"CONTROL",true)
  361.             initTurtle(turtlePage)
  362.         end
  363.         elseif event=="char" then
  364.         if arg1=="1" then
  365.             forceInit(1)
  366.             elseif arg1=="2" then
  367.             forceInit(2)
  368.             elseif arg1=="3" then
  369.             forceInit(3)
  370.             elseif arg1=="4" then
  371.             forceInit(4)
  372.             elseif arg1=="a" then
  373.             forceAnnounce()
  374.             elseif arg1=="s" then
  375.             term.redirect(term.native)
  376.             elseif arg1=="t" then
  377.             --Monitor.monitorclose()
  378.             term.redirect(term.native)
  379.             break
  380.         end
  381.     end
  382. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement