Advertisement
UNOBTANIUM

OpenPeripheral Client old0.4.4

Feb 24th, 2014
412
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 51.05 KB | None | 0 0
  1. --0.4.4 by UNOBTANIUM 03.03.2014
  2. local site = {}
  3. local selected = 1
  4. local selectedObj = 1
  5. local z = 1
  6. local mode = "mainmenu"
  7. local errorThrown = false
  8. local w,h = term.getSize()
  9. w = w + 1
  10. local updateInterval = 2
  11. local delay = os.startTimer(0.5)
  12. local colorName = {colors.white, colors.orange, colors.magenta, colors.lightBlue, colors.yellow, colors.lime, colors.pink, colors.lightGray, colors.cyan, colors.purple, colors.blue, colors.brown, colors.green, colors.red, colors.black}
  13. local colorHex = {0xFFFFFF,0xFF8800,0xFF8CFF,0x00FFFF,0xFFF700,0x00FF11,0xF7B5DE,0xBFBFBF,0x65A1D6,0xAF56B3,0x0000FF,0x754302,0x004000,0xFF0000,0x000000}
  14. local rednetSide = {"top","bottom","right","front"}
  15. local b = peripheral.wrap("left")
  16. local net = peripheral.wrap("back")
  17.  
  18. -- type text x y c
  19. -- type x y text unit method maxNumber c cMax param
  20. -- type x y w h cBorder tBorder cBack tBack cOne tOne cTwo tTwo unit method maxNumber param
  21. -- type x y w h minNumber maxNumber c t fadeout unit method var param
  22. -- type unit method operator limitNumber action
  23.  
  24. for i=1, 199 do
  25.  site[i] = {}
  26. end
  27.  
  28.  
  29. function save()
  30.   local file = fs.open("openPeripheralClient","w")
  31.     file.writeLine("OPEN PERIPHERAL CLIENT DATA")
  32.     file.writeLine(textutils.serialize(site))
  33.   file.close()
  34. end
  35.  
  36. function buildString(stringBuilder, site)
  37.   stringBuilder = stringBuilder .. "{"
  38.   local added = false
  39.   for i, var in pairs(site) do -- VARIABLE
  40.     added = true
  41.     if type(var) == "string" then
  42.       stringBuilder = stringBuilder .. "\"" .. var .. "\""
  43.     elseif type(var) == "number" then
  44.       stringBuilder = stringBuilder .. var
  45.     elseif type(var) == "boolean" then
  46.       stringBuilder = stringBuilder .. tostring(var)
  47.     elseif type(var) == "table" then
  48.       stringBuilder = buildString(stringBuilder, site[i])
  49.     end
  50.     stringBuilder = stringBuilder .. ","
  51.   end
  52.   if added then
  53.     stringBuilder = stringBuilder:sub(1,stringBuilder:len()-1)
  54.   end
  55.   return stringBuilder .. "}"
  56. end
  57.  
  58. function load()
  59.   if not fs.exists("openPeripheralClient") then return end
  60.   local file = fs.open("openPeripheralClient","r")
  61.    
  62.     if file.readLine() == "OPEN PERIPHERAL CLIENT DATA" then
  63.       site = textutils.unserialize(file.readLine())
  64.       file.close()
  65.     else
  66.       file.close()
  67.       oldLoad()
  68.     end
  69. end
  70.  
  71. function oldSave()
  72.  local file = fs.open("openPeripheralClient","w")
  73.   for i=1,198 do      -- SITE
  74.    file.writeLine(countArray(site[i]))
  75.    for k,v in pairs(site[i]) do -- OBJECT
  76.     file.writeLine(countArray(site[i][k]))
  77.     for m,n in pairs(site[i][k]) do -- VARIABLES
  78.      if (site[i][k][1] == "graphPillar" or site[i][k][1] == "graphPoint") and m == 13 then
  79.       file.writeLine(countArray(site[i][k][m]))
  80.       for a,b in pairs(site[i][k][m]) do
  81.        file.writeLine(site[i][k][m][a])
  82.       end
  83.      else
  84.       file.writeLine(n)
  85.      end
  86.     end
  87.    end
  88.   end
  89.  -- ALARM
  90.  file.close()
  91. end
  92.  
  93. function oldLoad()
  94.  if not fs.exists("openPeripheralClient") then return end
  95.  local file = fs.open("openPeripheralClient","r")
  96.   for i=1,198 do
  97.    local amountObj = tonumber(file.readLine())
  98.    for k=1,amountObj do
  99.     local amountVars = tonumber(file.readLine())
  100.     local typ = file.readLine()
  101.     site[i][k] = {}
  102.     site[i][k][1] = typ
  103.     for m=2,amountVars do
  104.      if typ == "text" then
  105.       if m == 2 then
  106.        site[i][k][m] = file.readLine()
  107.       else
  108.        site[i][k][m] = tonumber(file.readLine())
  109.       end
  110.      elseif typ == "box" then
  111.        site[i][k][m] = tonumber(file.readLine())
  112.      elseif typ == "number" then
  113.       if m == 2 or m == 3 or m >= 7 then
  114.        site[i][k][m] = tonumber(file.readLine())
  115.       else
  116.        site[i][k][m] = file.readLine()
  117.       end
  118.      elseif typ == "bar" then
  119.       if (m >= 2 and m <=13) or m == 16 then
  120.        site[i][k][m] = tonumber(file.readLine())
  121.       else
  122.        site[i][k][m] = file.readLine()
  123.       end
  124.      elseif typ == "graphPillar" or typ == "graphPoint" then
  125.       if m >= 2 and m <= 9 then
  126.        site[i][k][m] = tonumber(file.readLine())
  127.       elseif m == 10 then
  128.        if file.readLine() == "true" then
  129.         site[i][k][m] = true
  130.        else
  131.         site[i][k][m] = false        
  132.        end
  133.       elseif m == 11 or m == 12 then
  134.        site[i][k][m] = file.readLine()
  135.       else
  136.        local amount = tonumber(file.readLine())
  137.        site[i][k][m] = {}
  138.        for a=1,amount do
  139.         site[i][k][m][a] = tonumber(file.readLine())
  140.        end
  141.       end
  142.      elseif typ == "frame" then
  143.        site[i][k][m] = tonumber(file.readLine())
  144.      end
  145.     end
  146.    end
  147.   end
  148.  
  149.  file.close()
  150. end
  151.  
  152. function clear(color)
  153.  color = color or colors.black
  154.  term.setBackgroundColor(color)
  155.  term.clear()
  156.  term.setCursorPos(1,1)
  157. end
  158.  
  159. function countArray(a)
  160.  local amount = 0
  161.  for k,v in pairs(a) do
  162.   amount = amount + 1
  163.  end
  164.  return amount
  165. end
  166.  
  167. function write(text,x,y,c)
  168.  c = c or colors.white
  169.  term.setCursorPos(x,y)
  170.  term.setTextColor(c)
  171.  term.write(text)
  172. end
  173.  
  174. function centered(text,y,c)
  175.  c = c or colors.white
  176.  term.setCursorPos(w/2-math.ceil(#tostring(text)/2),y)
  177.  term.setTextColor(c)
  178.  term.write(tostring(text))
  179. end
  180.  
  181. function fill(text,y)
  182.  centered(string.rep(tostring(text), w), y)
  183. end
  184.  
  185. function setColors(text,background)
  186.  background = background or colors.lightGray
  187.  term.setTextColor(text)
  188.  term.setBackgroundColor(background)
  189. end
  190.  
  191. function drawArrows(y)
  192.   write("<",14,y)
  193.   write(">",36,y)
  194. end
  195.  
  196. -- CHECK ALARM AND ACTIVATIONS
  197.  
  198. function checkAlarm(chatCommand, rednetMessage)
  199.   chatCommand = chatCommand or ""
  200.   rednetMessage = rednetMessage or ""
  201.   local number = 0
  202.   for k, obj in pairs(site[199]) do
  203.     local var = site[199][k]
  204.     if var[1] == "ALARM" then   -- ALARM
  205.       if var[2] ~= "NONE" and var[3] ~= "NONE" and type(var[4]) == "table" then
  206.         if countArray(var[4]) >= 1 then
  207.           local noErr,res = pcall( function() net.callRemote(var[2], var[3], unpack(var[4])) end)
  208.           if noErr then
  209.             number = tonumber(net.callRemote(var[2], var[3], unpack(var[4])))
  210.           else
  211.             number = 0
  212.             if not errorThrown then
  213.               drawText("ERROR!!! ALARM'N'ACTION CALLING WITH ARGUMENTS! " .. res ,1,1,14)
  214.               errorThrown = true
  215.             end
  216.           end
  217.         else
  218.           local noErr,res = pcall( function() net.callRemote(var[2], var[3]) end)
  219.           if noErr then
  220.             number = tonumber(net.callRemote(var[2], var[3]))
  221.           else
  222.             number = 0
  223.             if not errorThrown then
  224.               drawText("ERROR!!! ALARM'N'ACTION CALLING WITHOUT ARGUMENTS! " .. res ,1,1,14)
  225.               errorThrown = true
  226.             end
  227.           end
  228.         end
  229.         if var[5] == "=" and number == var[6] then
  230.           makeAction(var)
  231.         elseif var[5] == ">" and number > var[6] then
  232.           makeAction(var)
  233.         elseif var[5] == "<"and number < var[6] then
  234.           makeAction(var)
  235.         end
  236.       end
  237.     elseif not (chatCommand == "") and var[1] == "CHAT" and var[2] == chatCommand then  -- CHAT
  238.       makeAction(var)
  239.     elseif not (rednetMessage == "") and var[1] == "REDNET" and var[2] == rednetMessage then
  240.       makeAction(var)
  241.     end
  242.   end
  243. end
  244.  
  245. function makeAction(var)
  246.   local relC = 0
  247.   if var[1] == "ALARM" then
  248.     relC = 4
  249.   end
  250.   if var[3+relC] == "TEXT" then
  251.     drawText(var[6+relC],var[4+relC],var[5+relC],var[7+relC])
  252.   elseif var[3+relC] == "ACTIVATION" then
  253.     if var[4+relC] ~= "NONE" and var[5+relC] ~= "NONE" and type(var[6+relC]) == "table" then
  254.       if countArray(var[6+relC]) >= 1 then
  255.         local noErr,res = pcall( function() net.callRemote(var[4+relC], var[5+relC], unpack(var[6+relC])) end)
  256.         if noErr then
  257.           local testvar = net.callRemote(var[4+relC], var[5+relC], unpack(var[6+relC])) or "NOTHING"
  258.         else
  259.           if not errorThrown then
  260.             drawText("ERROR!!! ALARM'N'ACTION CALLING WITH ARGUMENTS! " .. res ,1,1,14)
  261.             errorThrown = true
  262.           end
  263.         end
  264.       else
  265.         local noErr,res = pcall( function() net.callRemote(var[4+relC], var[5+relC], unpack(var[6+relC])) end)
  266.         if noErr then
  267.           local testvar = net.callRemote(var[4+relC], var[5+relC]) or "NOTHING"
  268.         else
  269.           if not errorThrown then
  270.             drawText("ERROR!!! ALARM'N'ACTION CALLING WITHOUT ARGUMENTS! " .. res ,1,1,14)
  271.             errorThrown = true
  272.           end
  273.         end
  274.       end
  275.     end
  276.   elseif var[3+relC] == "REDNET" then
  277.     rednet.broadcast(var[5+relC])
  278.   end
  279. end
  280.  
  281.  
  282.  
  283. -- ON SCREEN OBJECT DRAWING
  284.  
  285. -- type text x y c
  286. function drawText(text,x,y,c)
  287.   local var = b.addText(x,y,text,colorHex[c])
  288.   setZDimension(var)
  289. end
  290.  
  291. -- type x y w h cOne tOne cTwo tTwo
  292. function drawBox(x,y,w,h,cOne,tOne,cTwo,tTwo)
  293.   cOne = colorHex[cOne]
  294.   cTwo = colorHex[cTwo]
  295.   local var1 = b.addBox(x,y,w,2,cTwo,tTwo)
  296.   setZDimension(var1)
  297.   local var2 = b.addBox(x,y+2,2,h-4,cTwo,tTwo)
  298.   setZDimension(var2)
  299.   local var3 = b.addBox(x,y+h-2,w,2,cTwo,tTwo)
  300.   setZDimension(var3)
  301.   local var4 = b.addBox(x+w-2,y+2,2,h-4,cTwo,tTwo)
  302.   setZDimension(var4)
  303.   local var5 = b.addBox(x+2,y+2,w-4,h-4,cOne,tOne)
  304.   setZDimension(var5)
  305. end
  306.  
  307. -- type x y text unit method maxNumber c cMax
  308. function drawNumber(x,y,text,unit,method,maxNumber,c,cMax, param)
  309.   c = colorHex[c]
  310.   cMax = colorHex[cMax]
  311.   local number = "NONE"
  312.   if net.isPresentRemote(unit) and not (method == "NONE") then
  313.     if not (type(param) == "table") then
  314.       number = "NONE"
  315.     elseif not (param[1] == nil) and countArray(param) >= 1 then
  316.       local noErr,res = pcall( net.callRemote, unit, method, unpack(param))
  317.       if noErr then
  318.         number = tonumber(res)
  319.       else
  320.         number = "ERROR"
  321.         if not errorThrown then
  322.           drawText("ERROR!!! DRAWING NUMBER WITH ARGUMENTS! " .. res ,1,1,14)
  323.           errorThrown = true
  324.         end
  325.       end
  326.     else
  327.       local noErr,res = pcall( net.callRemote, unit,method)
  328.       if noErr then
  329.         number = tonumber(res)
  330.       else
  331.         number = "ERROR"
  332.         if not errorThrown then
  333.           drawText("ERROR!!! DRAWING NUMBER WITHOUT ARGUMENTS! " .. res ,1,1,14)
  334.           errorThrown = true
  335.         end
  336.       end
  337.     end
  338.   end
  339.   local lengthText = ((#text) + 2)*6
  340.   local lengthNumber = (#(tostring(number)))*6
  341.   local maxLength = (#(tostring(maxNumber)))*6
  342.   if type(number) == "string" or (type(number) == "number" and number == maxNumber) then
  343.     local var1 = b.addText(x,y,text .. ":",c)
  344.     setZDimension(var1)
  345.     local var2 = b.addText(x+lengthText,y,tostring(number),cMax)
  346.     setZDimension(var2)
  347.     local var3 = b.addText(x+lengthText+maxLength,y, " / " .. maxNumber, c)
  348.     setZDimension(var3)
  349.   else
  350.     local var1 =  b.addText(x,y, text .. ":", c )
  351.     setZDimension(var1)
  352.     local var2 =  b.addText(x+lengthText+(maxLength-lengthNumber),y, number .. " / " .. maxNumber,c)
  353.     setZDimension(var2)
  354.   end
  355. end
  356.  
  357. -- type x y w h cBorder tBorder cBack tBack cOne tOne cTwo tTwo unit method maxNumber
  358. function drawBar(x,y,w,h,cBorder,tBorder,cBack,tBack,cOne,tOne,cTwo,tTwo,unit,method,maxNumber, param)
  359.   param = param or {}
  360.   cBorder = colorHex[cBorder]
  361.   cBack = colorHex[cBack]
  362.   cOne = colorHex[cOne]
  363.   cTwo = colorHex[cTwo]
  364.   local var1 = b.addBox(x+2,y+2,w-4,h-4,cBack,tBack)
  365.   setZDimension(var1)
  366.   local var2 = b.addBox(x,y,w,2,cBorder,tBorder)
  367.   setZDimension(var2)
  368.   local var3 = b.addBox(x,y+h-2,w,2,cBorder,tBorder)
  369.   setZDimension(var3)
  370.   local var4 = b.addBox(x,y+2,2,h-4,cBorder,tBorder)
  371.   setZDimension(var4)
  372.   local var5 = b.addBox(x+w-2,y+2,2,h-4,cBorder,tBorder)
  373.   setZDimension(var5)
  374.   if net.isPresentRemote(unit) and method ~= "NONE" then
  375.     local number = "NONE"
  376.     if net.isPresentRemote(unit) and not (method == "NONE") then
  377.       if not (type(param) == "table") then
  378.         return
  379.       elseif not (param[1] == nil) and countArray(param) >= 1 then
  380.         local noErr,res = pcall( net.callRemote, unit, method, unpack(param) )
  381.         if noErr then
  382.           number = tonumber(res)
  383.         else
  384.           number = maxNumber
  385.           cOne = 14
  386.           if not errorThrown then
  387.             drawText("ERROR!!! DRAWING PROGRESS BAR WITH ARGUMENTS! " .. res ,1,1,14)
  388.             errorThrown = true
  389.           end
  390.         end
  391.       else
  392.         local noErr,res = pcall( net.callRemote, unit, method)
  393.         if noErr then
  394.           number = tonumber(res)
  395.         else
  396.           number = maxNumber
  397.           cOne = 14
  398.           cTwo = 14
  399.           if not errorThrown then
  400.             drawText("ERROR!!! DRAWING PROGRESS BAR WITHOUT ARGUMENTS! " .. res ,1,1,14)
  401.             errorThrown = true
  402.           end
  403.         end
  404.       end
  405.       local box = b.addGradientBox(x+2,y+2,math.ceil((number/maxNumber)*(w-4)),h-4,cOne,tOne,cTwo,tTwo,2)
  406.       z = z + 1
  407.       setZDimension(box)
  408.     end
  409.   end
  410. end
  411.  
  412. -- type x y w h minNumber maxNumber c t fadeout unit method var
  413. function drawGraph(typ,x,y,w,h,minNumber,maxNumber,c,t,fadeout,var, param)
  414.   param = param or {}
  415.   local decrease = t/20
  416.   c = colorHex[c]
  417.   for relX=2,w,2 do
  418.     if fadeout and relX >= w-20 and t > 0.05 then
  419.       t = t - decrease
  420.     end
  421.     if typ == "graphPillar" then
  422.       if type(var[relX/2]) == "number" then
  423.         if var[relX/2] > minNumber then
  424.           local box = b.addBox(x+relX-2,y+(h-1-(math.ceil((var[relX/2]/(maxNumber))*h))),2,(math.ceil((var[relX/2]/(maxNumber))*h)),c,t)
  425.           setZDimension(box)
  426.         else
  427.           local box = b.addBox(x+relX-2,y+h-2,2,1,c,t)
  428.           setZDimension(box)
  429.         end
  430.       else
  431.         local box = b.addBox(x+relX-2,y+h-2,2,1,c,t)
  432.         setZDimension(box)
  433.       end
  434.     else
  435.       if type(var[relX/2]) == "number" then
  436.         if var[relX/2] > minNumber then
  437.           local box = b.addBox(x+relX-2,y+(h-1-((math.ceil((var[relX/2]/(maxNumber))*h)))),2,2,c,t)
  438.           setZDimension(box)
  439.           local box = b.addBox(x+relX-2,y+h-1,2,1,c,t)
  440.           setZDimension(box)
  441.         else
  442.           local box = b.addBox(x+relX-2,y+h-1,2,1,c,t)
  443.           setZDimension(box)
  444.         end
  445.       else
  446.         local box = b.addBox(x+relX-2,y+h-1,2,1,c,t)
  447.         setZDimension(box)
  448.       end
  449.     end
  450.   end
  451. end
  452.  
  453. function setZDimension(obj)
  454.   local wtf = ( obj.setZ and obj.setZ(z) ) or ( obj.setZIndex and obj.setZIndex(z) )
  455. end
  456.  
  457.  
  458.  
  459. -- ON SCREEN DRAWING MAIN METHODS
  460.  
  461.  
  462.  
  463.  
  464. function drawSite()
  465.   updateGraphs()
  466.   if selected == 0 then return end
  467.   z = 1
  468.   b.clear()
  469.   innerDraw(0,0,selected)
  470.   checkAlarm()
  471.   errorThrown = false
  472.   save()
  473. end
  474.  
  475. function updateGraphs()
  476.   for k,v in pairs(site) do
  477.     for m,n in pairs(site[k]) do
  478.       if (site[k][m][1] == "graphPillar" or site[k][m][1] == "graphPoint")
  479.       and net.isPresentRemote(site[k][m][11])
  480.       and site[k][m][12] ~= "NONE"
  481.       and type(site[k][m][14]) == "table" then
  482.         if not (site[k][m][14] == nil) and countArray(site[k][m][14]) >= 1 then
  483.           local noErr,res = pcall( net.callRemote, site[k][m][11], site[k][m][12], unpack(site[k][m][14]) )
  484.           if noErr then
  485.             number = tonumber(res)
  486.           else
  487.             number = site[k][m][13][1]
  488.             if not errorThrown then
  489.               drawText("ERROR!!! UPDATING GRAPH WITH ARGUMENTS! " .. res ,1,1,14)
  490.               errorThrown = true
  491.             end
  492.           end
  493.         else
  494.           local noErr,res = pcall( net.callRemote, site[k][m][11], site[k][m][12])
  495.           if noErr then
  496.             number = tonumber(res)
  497.           else
  498.             number = site[k][m][13][1]
  499.             if not errorThrown then
  500.               drawText("ERROR!!! UPDATING GRAPH WITHOUT ARGUMENTS! " .. res ,1,1,14)
  501.               errorThrown = true
  502.             end
  503.           end
  504.         end
  505.         table.insert(site[k][m][13],1,number)
  506.         if type(site[k][m][13][math.ceil(site[k][m][4]/2)+1]) ~= nil then
  507.           site[k][m][13][math.ceil(site[k][m][4]/2)+1] = nil
  508.         end
  509.       elseif site[k][m][1] == "graphPillar" or site[k][m][1] == "graphPoint" then
  510.         table.insert(site[k][m][13], 1, 0)
  511.         if type(site[k][m][13][math.ceil(site[k][m][4]/2)+1]) ~= nil then
  512.           site[k][m][13][math.ceil(site[k][m][4]/2)+1] = nil
  513.         end
  514.       end
  515.     end
  516.   end
  517. end
  518.  
  519. function innerDraw(relX,relY,s)
  520.   for k,v in pairs(site[s]) do
  521.     if site[s][k][1] == "frame" then
  522.       innerDraw(site[s][k][3],site[s][k][4],site[s][k][2])
  523.     elseif site[s][k][1] == "box" then
  524.       drawBox(site[s][k][2]+relX,site[s][k][3]+relY,site[s][k][4],site[s][k][5],site[s][k][6],site[s][k][7],site[s][k][8],site[s][k][9])
  525.       z = z + 1
  526.     end
  527.   end
  528.  
  529.   for k,v in pairs(site[s]) do
  530.     if site[s][k][1] == "number" then
  531.       drawNumber(site[s][k][2]+relX,site[s][k][3]+relY,site[s][k][4],site[s][k][5],site[s][k][6],site[s][k][7],site[s][k][8],site[s][k][9],site[s][k][10])
  532.       z = z + 1
  533.     elseif site[s][k][1] == "bar" then
  534.       drawBar(site[s][k][2]+relX,site[s][k][3]+relY,site[s][k][4],site[s][k][5],site[s][k][6],site[s][k][7],site[s][k][8],site[s][k][9],site[s][k][10],site[s][k][11],site[s][k][12],site[s][k][13],site[s][k][14],site[s][k][15],site[s][k][16],site[s][k][17])
  535.       z = z + 1
  536.     elseif site[s][k][1] == "graphPillar" or site[s][k][1] == "graphPoint" then
  537.       drawGraph(site[s][k][1],site[s][k][2]+relX,site[s][k][3]+relY,site[s][k][4],site[s][k][5],site[s][k][6],site[s][k][7],site[s][k][8],site[s][k][9],site[s][k][10],site[s][k][13],site[s][k][14])
  538.       z = z + 1
  539.     elseif site[s][k][1] == "text" then
  540.       drawText(site[s][k][2],site[s][k][3]+relX,site[s][k][4]+relY,site[s][k][5])
  541.       z = z + 1
  542.     end
  543.   end
  544. end
  545.  
  546.  
  547.  
  548.  
  549. -- MENU FUNCTIONS
  550.  
  551. function betterRead(x,y,numberOnly,pos,clickX)
  552.   local previousMode = mode
  553.   local selectedSite = selected
  554.   mode = "betterRead"
  555.   term.setTextColor(colors.lightGray)
  556.   term.setCursorBlink(true)
  557.   local s
  558.   if clickX < x then
  559.     s = ""
  560.   else
  561.     s = tostring(site[selected][selectedObj][pos])
  562.   end
  563.  
  564.  
  565.   while true do
  566.     term.setCursorPos(x,y)
  567.     term.write( string.rep(' ', w - x + 1) )
  568.     term.setCursorPos(x,y)
  569.     if s:len()+x < w then
  570.       term.write(s)
  571.     else
  572.       term.write(s:sub( s:len() - (w-x-2)))
  573.     end
  574.     local e = { os.pullEvent() }
  575.     if checkEvent(e, false, true) then
  576.       if e[1] == "mouse_click" then
  577.         mode = "back"
  578.       elseif e[1] == "char" then
  579.         s = s .. e[2]
  580.       elseif e[1] == "key" then
  581.         if e[2] == keys.enter then
  582.           mode = "back"
  583.         elseif e[2] == keys.backspace then
  584.           s = s:sub( 1, s:len() - 1 )
  585.         end
  586.       end
  587.     end
  588.     if mode == "back" then
  589.       mode = previousMode
  590.       break
  591.     elseif not (mode == "betterRead") then
  592.       break
  593.     end
  594.   end
  595.  
  596.   term.setTextColor(colors.white)
  597.   if numberOnly then
  598.     s = tonumber(s)
  599.     if s then
  600.       site[selectedSite][selectedObj][pos] = s
  601.     end
  602.   else
  603.     site[selectedSite][selectedObj][pos] = s
  604.   end
  605.   term.setCursorBlink(false)
  606.   drawSite()
  607. end
  608.  
  609.  
  610. function drawColor(i,y)
  611.   drawArrows(y)
  612.   term.setBackgroundColor(colorName[site[selected][selectedObj][i]])
  613.   centered("   ",y)
  614.   term.setBackgroundColor(colors.black)
  615. end
  616.  
  617. function drawTransparent(i,y)
  618.   drawArrows(y)
  619.   centered(site[selected][selectedObj][i],y)
  620. end
  621.  
  622.  
  623. function changeColor(x,pos)
  624.   if x < 25 then
  625.     site[selected][selectedObj][pos] = site[selected][selectedObj][pos] - 1
  626.   else
  627.     site[selected][selectedObj][pos] = site[selected][selectedObj][pos] + 1
  628.   end
  629.   if site[selected][selectedObj][pos] <= 0 then
  630.     site[selected][selectedObj][pos] = 15
  631.   elseif site[selected][selectedObj][pos] >= 16 then
  632.     site[selected][selectedObj][pos] = 1
  633.   end
  634. end
  635.  
  636. function changeTransparence(x,pos)
  637.   if x < 25 then
  638.     site[selected][selectedObj][pos] = site[selected][selectedObj][pos] - 0.1
  639.   else
  640.     site[selected][selectedObj][pos] = site[selected][selectedObj][pos] + 0.1
  641.   end
  642.   if site[selected][selectedObj][pos] < 0 then
  643.     site[selected][selectedObj][pos] = 1
  644.   elseif site[selected][selectedObj][pos] > 1 then
  645.     site[selected][selectedObj][pos] = 0
  646.   end
  647. end
  648.  
  649.  
  650.  
  651. -- QUATERNARY MENUS
  652.  
  653. function menuArguments(unit, method, amount, args, pos, advancedMethodsSupport)
  654.   local previousMode = mode
  655.   mode = "arguments"
  656.  
  657.   local param = site[selected][selectedObj][pos]
  658.   if advancedMethodsSupport then
  659.     for i=1, amount do
  660.       if args[i]["type"] == "NUMBER" and param[i] == nil then
  661.         param[i] = i
  662.       elseif param[i] == nil then
  663.         param[i] = "Argument" .. i
  664.       end
  665.     end
  666.   end
  667.  
  668.   while true do
  669.     -- DRAW
  670.     amount = countArray(param)
  671.     clear()
  672.     centered("ENTER ARGUMENTS FOR METHOD " .. method, 1)
  673.     fill("-", 2)
  674.     centered("APPLY", 15)
  675.     for i=1, amount do
  676.       write("ARG ".. i ..": " .. param[i],11,3+i)
  677.     end
  678.     if not advancedMethodsSupport and amount <= 10 then
  679.       centered("ADD NEW MANUAL ARGUMENT", 16)
  680.     end
  681.     if not advancedMethodsSupport and amount > 0 then
  682.       centered("DELETE LAST ARGUMENT", 17)
  683.     end
  684.  
  685.     -- EVENT
  686.     local event = { os.pullEvent() }
  687.     if checkEvent(event) then
  688.       if event[4] >= 4 and event[4] <= amount+3 then
  689.         site[selected][selectedObj][pos] = param[event[4]-3]
  690.         if advancedMethodsSupport then
  691.           if args[event[4]-3]["type"] == "NUMBER" then
  692.             betterRead(18,event[4],true,pos,event[3])
  693.           else
  694.             betterRead(18,event[4],false,pos,event[3])
  695.           end
  696.         else -- not advancedMethodsSupport
  697.           betterRead(18,event[4],false,pos,event[3])
  698.           local tempVar = tonumber(site[selected][selectedObj][pos])
  699.           if tempVar then
  700.             site[selected][selectedObj][pos] = tempVar
  701.           end
  702.         end
  703.         param[event[4]-3] = site[selected][selectedObj][pos]
  704.       elseif not advancedMethodsSupport and amount <= 10 and event[4] == 16 then
  705.         param[amount+1] = "Manual Argument" .. amount+1
  706.       elseif not advancedMethodsSupport and amount > 0 and event[4] == 17 then
  707.         param[amount] = nil
  708.       elseif event[4] == 15 then
  709.         mode = "back"
  710.         site[selected][selectedObj][pos] = param
  711.         save()
  712.       end
  713.     end
  714.  
  715.     -- BACK TO MENU
  716.     if mode == "back" then
  717.       mode = previousMode
  718.       break
  719.     elseif not (mode == "arguments") then
  720.       break
  721.     end
  722.   end
  723. end
  724.  
  725.  
  726. function setAction(actionpos)
  727.   if site[199][selectedObj][actionpos] == "NONE" then
  728.     site[199][selectedObj][actionpos] = "TEXT"
  729.     site[199][selectedObj][actionpos+1] = 1
  730.     site[199][selectedObj][actionpos+2] = 1
  731.     site[199][selectedObj][actionpos+3] = "UNOBTANIUM"
  732.     site[199][selectedObj][actionpos+4] = 1
  733.   elseif site[199][selectedObj][actionpos] == "TEXT" then
  734.     site[199][selectedObj][actionpos] = "ACTIVATION"
  735.     site[199][selectedObj][actionpos + 1] = "NONE"
  736.     site[199][selectedObj][actionpos + 2] = "NONE"
  737.     site[199][selectedObj][actionpos + 3] = {}
  738.     site[199][selectedObj][actionpos + 4] = nil
  739.   elseif site[199][selectedObj][actionpos] == "ACTIVATION" then
  740.     site[199][selectedObj][actionpos] = "REDNET"
  741.     site[199][selectedObj][actionpos + 1] = 1
  742.     site[199][selectedObj][actionpos + 2] = "UNOBTANIUM"
  743.     site[199][selectedObj][actionpos + 3] = nil
  744.     site[199][selectedObj][actionpos + 4] = nil
  745.   elseif site[199][selectedObj][actionpos] == "REDNET" then
  746.     site[199][selectedObj][actionpos] = "NONE"
  747.     site[199][selectedObj][actionpos + 1] = nil
  748.     site[199][selectedObj][actionpos + 2] = nil
  749.   end
  750. end
  751.  
  752.  
  753.  
  754. -- TERTIARY MENUS
  755.  
  756. function menuUnit(pos)
  757.  
  758.   clear()
  759.   local list = net.getNamesRemote()
  760.   if countArray(list) == 0 then
  761.     centered("NOTHING ATTACHED TO THE NETWORK!",9)
  762.     while true do
  763.       local event = {os.pullEvent()}
  764.       if event[1] == "timer" and event[2] == delay then
  765.         drawSite()
  766.         delay = os.startTimer(updateInterval)
  767.       else
  768.         return "NONE"
  769.       end
  770.     end
  771.   end
  772.  
  773.   unit = 1
  774.   local previousMode = mode
  775.   mode = "unit"
  776.   while true do
  777.     -- DRAW
  778.     clear()
  779.     centered("SELECT A UNIT",1)
  780.     fill("-",2)
  781.     centered("SELECT",14)
  782.     fill(" ",9)
  783.     drawArrows(9)
  784.     centered(list[unit],9)
  785.  
  786.     -- EVENT
  787.     local event = { os.pullEvent() }
  788.     if checkEvent(event) then
  789.       x,y = event[3], event[4]
  790.       if y >= 8 and y <= 10 then
  791.         if x <= 25 then
  792.           unit = unit - 1
  793.         else
  794.           unit = unit + 1
  795.         end
  796.         if unit == 0 then
  797.           unit = countArray(list)
  798.         elseif unit > countArray(list) then
  799.           unit = 1
  800.         end
  801.       elseif y == 14 then
  802.         site[selected][selectedObj][pos] = list[unit]
  803.         site[selected][selectedObj][pos+1] = "NONE"
  804.         mode = "back"
  805.       end
  806.     end
  807.  
  808.     -- BACK TO MENU
  809.     if mode == "back" then
  810.       mode = previousMode
  811.       break
  812.     elseif not (mode == "unit") then
  813.       break
  814.     end
  815.   end
  816. end
  817.  
  818.  
  819.  
  820.  
  821. function menuMethod(pos,unit,allReturnTypes, alarm)
  822.   alarm = alarm or 0
  823.   allReturnTypes = allReturnTypes or false
  824.   clear()
  825.   if not net.isPresentRemote(unit) then
  826.     return "NONE"
  827.   end
  828.  
  829.   -- methods available?
  830.   local basicMethods = net.getMethodsRemote(unit)
  831.   if basicMethods ~= nil and countArray(basicMethods) == 0 then
  832.     centered("NO METHOD FOUND!",9)
  833.     while true do
  834.       local event = {os.pullEvent()}
  835.       if event[1] == "timer" and event[2] == delay then
  836.         drawSite()
  837.         delay = os.startTimer(updateInterval)
  838.       else
  839.         break
  840.       end
  841.     end
  842.     return "NONE"
  843.   end
  844.  
  845.   -- advanced or normal support?
  846.   local advancedMethodsSupport = false
  847.   local unitType = "NONE"
  848.   local tempList = {}
  849.   for k,v in pairs(basicMethods) do
  850.     if v == "getAdvancedMethodsData" then
  851.       advancedMethodsSupport = true
  852.       unitType = peripheral.getType(unit)
  853.       local tempP = peripheral.wrap(unit)
  854.       tempList = tempP.getAdvancedMethodsData()
  855.       break
  856.     end
  857.   end
  858.  
  859.   -- get advanced methods if possible
  860.   local list = {}
  861.   if advancedMethodsSupport then
  862.     local counter = 1
  863.     for k,v in pairs(tempList) do
  864.       if allReturnTypes or ( v["returnType"] ~= nil and v["returnType"] ) or ( v["returnTypes"][1] == "NUMBER" ) then
  865.         table.insert(list, 1, v)
  866.         counter = counter - 1
  867.       end
  868.       counter = counter + 1
  869.     end
  870.   else
  871.     list = net.getMethodsRemote(unit)
  872.   end
  873.  
  874.   -- still methods with number as return value available?
  875.   if advancedMethodsSupport and list ~= nil and countArray(list) == 0 then
  876.     centered("NO METHOD FOUND!",9)
  877.     while true do
  878.       local event = {os.pullEvent()}
  879.       if event[1] == "timer" and event[2] == delay then
  880.         drawSite()
  881.         delay = os.startTimer(updateInterval)
  882.       else
  883.         break
  884.       end
  885.     end
  886.     return "NONE"
  887.   end
  888.  
  889.  
  890.  
  891.  
  892.   -- selection of the method
  893.   local method = 1
  894.   for k,v in pairs(list) do
  895.     method = method + 1
  896.     if advancedMethodsSupport and v["name"] == site[selected][selectedObj][pos] then
  897.       break
  898.     elseif not advancedMethodsSupport and v == site[selected][selectedObj][pos] then
  899.       break
  900.     end
  901.   end
  902.   method = method - 1
  903.  
  904.   local previousMode = mode
  905.   local previousSelected = selected
  906.   mode = "method"
  907.   while true do
  908.     -- DRAW
  909.     clear()
  910.     centered("SELECT A METHOD FROM " .. unit ,1)
  911.     fill("-",2)
  912.     centered("SELECT",16)
  913.     local methodName = "UNKNOWN"
  914.     local methodDescription = "UNKNOWN! No Advanced Methods Support available!"
  915.     local methodReturnType = "UNKNOWN"
  916.     local methodArguments = 1337
  917.     local methodArgs = {}
  918.     if advancedMethodsSupport then
  919.       local counter = 1
  920.       for k, v in pairs(list) do
  921.         if counter == method then
  922.           methodName = v["name"]
  923.           methodDescription = v["description"]
  924.           methodReturnType = v["returnType"] or v["returnTypes"][1]
  925.           methodArguments = countArray(v["args"]) or 0
  926.           methodArgs = v["args"] or {}
  927.           break
  928.         end
  929.         counter = counter + 1
  930.       end
  931.     else
  932.       methodDescription = "UNKNOWN! No Advanced Methods Support available!"
  933.       methodReturnType = "UNKNOWN"
  934.       methodArguments = 0
  935.       methodName = list[method]
  936.     end
  937.  
  938.  
  939.     fill(" ",6)
  940.     drawArrows(6)
  941.     centered(methodName, 6)
  942.     term.setCursorPos(1,8)
  943.     print(" Description: " .. methodDescription)
  944.     print(" Returns: " .. methodReturnType)
  945.     print(" Arguments: " .. methodArguments)
  946.     if advancedMethodsSupport and methodArguments >= 1 then
  947.       centered("SET OR CHANGE ARGUMENTS", 15)
  948.     elseif not advancedMethodsSupport then
  949.       centered("SET OR CHANGE ARGUMENTS (OWN RISK)", 15)
  950.     end
  951.  
  952.     -- EVENT
  953.     local event = { os.pullEvent() }
  954.     if checkEvent(event) then
  955.       x,y = event[3], event[4]
  956.       if y >= 5 and y <= 8 then
  957.         if alarm > 0 then
  958.           site[selected][selectedObj][alarm] = {}
  959.         else
  960.           site[selected][selectedObj][countArray(site[selected][selectedObj])] = {}
  961.         end
  962.         if x <= 25 then
  963.           method = method - 1
  964.         else
  965.           method = method + 1
  966.         end
  967.         if method == 0 then
  968.           method = countArray(list)
  969.         elseif method > countArray(list) then
  970.           method = 1
  971.         end
  972.       elseif advancedMethodsSupport and methodArguments >= 1 and y == 15 then
  973.         if alarm == 0 then
  974.           menuArguments(unit, methodName, methodArguments, methodArgs, countArray(site[selected][selectedObj]), true)
  975.         else
  976.           menuArguments(unit, methodName, methodArguments, methodArgs, alarm, true)
  977.         end
  978.       elseif not advancedMethodsSupport and y == 15 then
  979.         if alarm == 0 then
  980.           menuArguments(unit, methodName, countArray(site[selected][selectedObj][countArray(site[selected][selectedObj])]), methodArgs, countArray(site[selected][selectedObj]), false)
  981.         else
  982.           menuArguments(unit, methodName, countArray(site[selected][selectedObj][alarm]), methodArgs, alarm, false)
  983.         end
  984.       elseif y == 16 then
  985.         mode = "back"
  986.       end
  987.     end
  988.  
  989.     -- BACK TO MENU
  990.     if mode == "back" then
  991.       mode = previousMode
  992.       if advancedMethodsSupport then
  993.         site[previousSelected][selectedObj][pos] = list[method]["name"]
  994.       else
  995.         site[previousSelected][selectedObj][pos] = list[method]
  996.       end
  997.       break
  998.     elseif not (mode == "method") then
  999.       if advancedMethodsSupport then
  1000.         site[previousSelected][selectedObj][pos] = list[method]["name"]
  1001.       else
  1002.         site[previousSelected][selectedObj][pos] = list[method]
  1003.       end
  1004.       break
  1005.     end
  1006.   end
  1007. end
  1008.  
  1009.  
  1010. -- SECONDARY MENUS
  1011.  
  1012. function menuSiteOrFrame(setMode)
  1013.   mode = setMode
  1014.   if mode == "site" then
  1015.     selected = 1
  1016.   else
  1017.     selected = 100
  1018.   end
  1019.   selectedObj = 1
  1020.   while true do
  1021.     -- DRAW
  1022.     clear()
  1023.     drawArrows(1)
  1024.     if mode == "site" then
  1025.      centered("SITE " .. selected ,1)
  1026.     elseif mode == "frame" then
  1027.      centered("FRAME " .. selected-99 ,1)
  1028.     end
  1029.     fill("-",2)
  1030.     if type(site[selected][selectedObj]) == "table" then
  1031.       centered(selectedObj.. " - " .. site[selected][selectedObj][1] , 3)
  1032.     else
  1033.      centered(selectedObj , 3)
  1034.     end
  1035.     drawArrows(3)
  1036.     fill("-",4)
  1037.     write("BACK",48,1)
  1038.     if type(site[selected][selectedObj]) == "table" then    -- object exists
  1039.       write("DELETE",1,1)
  1040.       if site[selected][selectedObj][1] == "text" then    -- TEXT
  1041.         write("TEXT: " .. site[selected][selectedObj][2],10,7)
  1042.         write("X:    " .. site[selected][selectedObj][3],10,9)
  1043.         write("Y:    " .. site[selected][selectedObj][4],10,11)
  1044.         drawColor(5,13)
  1045.       elseif site[selected][selectedObj][1] == "box" then   -- BOX
  1046.         write("X:      " .. site[selected][selectedObj][2],10,5)
  1047.         write("Y:      " .. site[selected][selectedObj][3],10,6)
  1048.         write("WIDTH:  " .. site[selected][selectedObj][4],10,7)
  1049.         write("HEIGHT: " .. site[selected][selectedObj][5],10,8)
  1050.         drawColor(6,9)
  1051.         drawTransparent(7,10)
  1052.         drawColor(8,11)
  1053.         drawTransparent(9,12)
  1054.       elseif site[selected][selectedObj][1] == "number" then  -- NUMBER
  1055.         write("X:      "..site[selected][selectedObj][2],10,5)
  1056.         write("Y:      "..site[selected][selectedObj][3],10,6)
  1057.         write("TEXT:   "..site[selected][selectedObj][4],10,7)
  1058.         write("UNIT:   "..site[selected][selectedObj][5],10,8)
  1059.         write("METHOD: "..site[selected][selectedObj][6],10,9)
  1060.         write("MAX:    "..site[selected][selectedObj][7],10,10)
  1061.         drawColor(8,11)
  1062.         drawColor(9,12)
  1063.       elseif site[selected][selectedObj][1] == "bar" then   -- BAR
  1064.         write("X:      "..site[selected][selectedObj][2],10,5)
  1065.         write("Y:      "..site[selected][selectedObj][3],10,6)
  1066.         write("WIDTH:  "..site[selected][selectedObj][4],10,7)
  1067.         write("HEIGHT: "..site[selected][selectedObj][5],10,8)
  1068.         write("UNIT:   "..site[selected][selectedObj][14],10,9)
  1069.         write("METHOD: "..site[selected][selectedObj][15],29,9)
  1070.         write("MAX:    "..site[selected][selectedObj][16],10,10)
  1071.         drawColor(6,11)
  1072.         drawTransparent(7,12)
  1073.         drawColor(8,13)
  1074.         drawTransparent(9,14)
  1075.         drawColor(10,15)
  1076.         drawTransparent(11,16)
  1077.         drawColor(12,17)
  1078.         drawTransparent(13,18)
  1079.         write("ADD AUTO TEXT", 10, 19)
  1080.       elseif site[selected][selectedObj][1] == "graphPillar" or site[selected][selectedObj][1] == "graphPoint" then    
  1081.         -- GRAPHS
  1082.         write("X:       "..site[selected][selectedObj][2],10,5)
  1083.         write("Y:       "..site[selected][selectedObj][3],10,6)
  1084.         write("WIDTH:   "..site[selected][selectedObj][4],10,7)
  1085.         write("HEIGHT:  "..site[selected][selectedObj][5],10,8)
  1086.         write("UNIT:    "..site[selected][selectedObj][11],10,9)
  1087.         write("METHOD:  "..site[selected][selectedObj][12],10,10)
  1088.         write("MIN:     "..site[selected][selectedObj][6],10,11)
  1089.         write("MAX:     "..site[selected][selectedObj][7],10,12)
  1090.         drawColor(8,13)
  1091.         drawTransparent(9,14)
  1092.         write("FADEOUT: "..tostring(site[selected][selectedObj][10]),10,15)
  1093.         write("TYPE:   " ..site[selected][selectedObj][1],10,16)
  1094.         write("ADD AUTO BOX", 10, 17)
  1095.       elseif site[selected][selectedObj][1] == "frame" then -- FRAME
  1096.         centered(selectedFrame-99,5)
  1097.         drawArrows(5)
  1098.         fill("-",6)
  1099.         write("X: "..site[selected][selectedObj][3],10,8)
  1100.         write("Y: "..site[selected][selectedObj][4],10,10)
  1101.       end
  1102.     else  --create new object
  1103.       write("TEXT",20,6)
  1104.       write("BOX",20,7)
  1105.       write("NUMBER",20,8)
  1106.       write("BAR",20,9)
  1107.       write("GRAPH (PILLAR)",20,10)
  1108.       write("GRAPH (POINT)",20,11)
  1109.       if mode == "site" then
  1110.         write("FRAME",20,12)
  1111.       end
  1112.     end
  1113.  
  1114.     -- EVENT
  1115.     local event = { os.pullEvent() }
  1116.     if checkEvent(event) then
  1117.       x, y = event[3], event[4]
  1118.       if y == 1 and x >= w-4 then
  1119.         mode = "mainmenu"
  1120.       elseif type(site[selected][selectedObj]) == "table" and y == 1 and x <=6 then
  1121.         site[selected][selectedObj] = nil
  1122.         if selectedObj >= 2 then
  1123.           selectedObj = selectedObj - 1
  1124.         end
  1125.       elseif y == 1 then
  1126.         selectedObj = 1
  1127.         if x < 25 then
  1128.           selected = selected - 1
  1129.         else
  1130.           selected = selected + 1
  1131.         end
  1132.         if mode == "site" then
  1133.           if selected <= 0 then
  1134.             selected = 99
  1135.           elseif selected >= 100 then
  1136.             selected = 1
  1137.           end
  1138.         elseif mode == "frame" then
  1139.           if selected <= 99 then
  1140.             selected = 198
  1141.           elseif selected >= 199 then
  1142.             selected = 100
  1143.           end
  1144.         end
  1145.       elseif y >= 2 and y <= 4 then
  1146.         if x < 25 then
  1147.           selectedObj = selectedObj - 1
  1148.         else
  1149.           selectedObj = selectedObj + 1
  1150.         end
  1151.         if selectedObj == 0 then
  1152.           selectedObj = 1
  1153.         end
  1154.       elseif type(site[selected][selectedObj]) == "table" then
  1155.         if site[selected][selectedObj][1] == "text" then
  1156.           if y == 7 then
  1157.             betterRead(16,y,false,2,x)
  1158.           elseif y == 9 then
  1159.             betterRead(16,y,true,3,x)
  1160.           elseif y == 11 then
  1161.             betterRead(16,y,true,4,x)
  1162.           elseif y == 13 then
  1163.             changeColor(x,5)
  1164.           end
  1165.         elseif site[selected][selectedObj][1] == "box" then
  1166.           if y == 5 then
  1167.             betterRead(18,y,true,2,x)
  1168.           elseif y == 6 then
  1169.             betterRead(18,y,true,3,x)
  1170.           elseif y == 7 then
  1171.             betterRead(18,y,true,4,x)
  1172.           elseif y == 8 then
  1173.             betterRead(18,y,true,5,x)
  1174.           elseif y == 9 then
  1175.             changeColor(x,6)
  1176.           elseif y == 10 then
  1177.             changeTransparence(x,7)
  1178.           elseif y == 11 then
  1179.             changeColor(x,8)
  1180.           elseif y == 12 then
  1181.             changeTransparence(x,9)
  1182.           end
  1183.         elseif site[selected][selectedObj][1] == "number" then
  1184.           if y == 5 then
  1185.            betterRead(18,y,true,2,x)
  1186.           elseif y == 6 then
  1187.             betterRead(18,y,true,3,x)
  1188.           elseif y == 7 then
  1189.             betterRead(18,y,false,4,x)
  1190.           elseif y == 8 then
  1191.             menuUnit(5)
  1192.           elseif y == 9 then
  1193.             if x < 18 then
  1194.               menuMethod(6,site[selected][selectedObj][5],true)
  1195.             else
  1196.               menuMethod(6,site[selected][selectedObj][5],false)
  1197.             end
  1198.           elseif y == 10 then
  1199.             betterRead(18,y,true,7,x)
  1200.           elseif y == 11 then
  1201.             changeColor(x,8)
  1202.           elseif y == 12 then
  1203.             changeColor(x,9)
  1204.           end
  1205.         elseif site[selected][selectedObj][1] == "bar" then
  1206.           if y == 5 then
  1207.             betterRead(18,y,true,2,x)
  1208.           elseif y == 6 then
  1209.             betterRead(18,y,true,3,x)
  1210.           elseif y == 7 then
  1211.             betterRead(18,y,true,4,x)
  1212.           elseif y == 8 then
  1213.             betterRead(18,y,true,5,x)
  1214.           elseif y == 9 then
  1215.             if x < 28 then
  1216.               menuUnit(14)
  1217.             else
  1218.               if x < 18 then
  1219.               menuMethod(15,site[selected][selectedObj][14],true)
  1220.             else
  1221.               menuMethod(15,site[selected][selectedObj][14],false)
  1222.             end
  1223.           end
  1224.           elseif y == 10 then
  1225.             betterRead(18,y,true,16,x)
  1226.           elseif y == 11 then
  1227.             changeColor(x,6)
  1228.           elseif y == 12 then
  1229.             changeTransparence(x,7)
  1230.           elseif y == 13 then
  1231.             changeColor(x,8)
  1232.           elseif y == 14 then
  1233.             changeTransparence(x,9)
  1234.           elseif y == 15 then
  1235.             changeColor(x,10)
  1236.           elseif y == 16 then
  1237.             changeTransparence(x,11)
  1238.           elseif y == 17 then
  1239.             changeColor(x,12)
  1240.           elseif y == 18 then
  1241.             changeTransparence(x,13)
  1242.           elseif y == 19 then
  1243.             local bar = site[selected][selectedObj]
  1244.             local textProperties = {"text","YOUR TEXT",bar[2]-59,bar[3]+4,bar[8]}
  1245.             table.insert(site[selected], selectedObj+1, textProperties )
  1246.             selectedObj = selectedObj+1
  1247.  
  1248.             betterRead(25,y,false,2,50)
  1249.             site[selected][selectedObj][3] = bar[2] - 10 - math.floor(5.5 * #site[selected][selectedObj][2])
  1250.           end
  1251.         elseif site[selected][selectedObj][1] == "graphPillar" or site[selected][selectedObj][1] == "graphPoint" then
  1252.           if y == 5 then
  1253.             betterRead(19,y,true,2,x)
  1254.           elseif y == 6 then
  1255.             betterRead(19,y,true,3,x)
  1256.           elseif y == 7 then
  1257.             betterRead(19,y,true,4,x)
  1258.           elseif y == 8 then
  1259.             betterRead(19,y,true,5,x)
  1260.           elseif y == 9 then
  1261.             menuUnit(11)
  1262.           elseif y == 10 then
  1263.             if x < 18 then
  1264.               menuMethod(12,site[selected][selectedObj][11],true)
  1265.             else
  1266.               menuMethod(12,site[selected][selectedObj][11],false)
  1267.             end
  1268.           elseif y == 11 then
  1269.             betterRead(19,y,true,6,x)
  1270.           elseif y == 12 then
  1271.             betterRead(19,y,true,7,x)
  1272.           elseif y == 13 then
  1273.             changeColor(x,8)
  1274.           elseif y == 14 then
  1275.             changeTransparence(x,9)
  1276.           elseif y == 15 then
  1277.             site[selected][selectedObj][10] = not site[selected][selectedObj][10]
  1278.           elseif y == 16 then
  1279.             if site[selected][selectedObj][1] == "graphPoint" then
  1280.               site[selected][selectedObj][1] = "graphPillar"
  1281.             elseif site[selected][selectedObj][1] == "graphPillar" then
  1282.               site[selected][selectedObj][1] = "graphPoint"
  1283.             end
  1284.           elseif y == 17 then
  1285.             local g = site[selected][selectedObj]
  1286.             local boxProperties = {"box", g[2]-4, g[3]-6, g[4]+8, g[5]+10, 1, 0.4, g[8], 0.9}
  1287.             table.insert(site[selected], selectedObj+1, boxProperties )
  1288.             selectedObj = selectedObj+1
  1289.           end
  1290.         elseif site[selected][selectedObj][1] == "frame" then
  1291.           if y == 5 then
  1292.             if x < 25 then
  1293.               selectedFrame = selectedFrame - 1
  1294.             else
  1295.               selectedFrame = selectedFrame + 1
  1296.             end
  1297.             if selectedFrame == 99 then
  1298.               selectedFrame = 198
  1299.             elseif selectedFrame == 199 then
  1300.               selectedFrame = 100
  1301.             end
  1302.             site[selected][selectedObj][2] = selectedFrame
  1303.           elseif y == 8 then
  1304.             betterRead(13,y,true,3,x)
  1305.           elseif y == 10 then
  1306.             betterRead(13,y,true,4,x)
  1307.           end
  1308.         end
  1309.       else        -- CREATE
  1310.         if y == 6 then
  1311.           site[selected][selectedObj] = {"text","UNOBTANIUM",1,1,1}
  1312.         elseif y == 7 then
  1313.           site[selected][selectedObj] = {"box",1,1,10,10,1,1,15,1}
  1314.         elseif y == 8 then
  1315.           site[selected][selectedObj] = {"number",1,1,"UNOBTANIUM","NONE","NONE",1337,1,1,{}}
  1316.         elseif y == 9 then
  1317.           site[selected][selectedObj] = {"bar",1,1,40,15,1,1,2,1,3,1,4,1,"NONE","NONE",1337, {}}
  1318.         elseif y == 10 then
  1319.           site[selected][selectedObj] = {"graphPillar",1,1,100,40,0,1337,1,1,false,"NONE","NONE",{}, {}}
  1320.         elseif y == 11 then
  1321.           site[selected][selectedObj] = {"graphPoint",1,1,100,40,0,1337,1,1,false,"NONE","NONE",{}, {}}
  1322.         elseif y == 12 and mode == "site" then
  1323.           site[selected][selectedObj] = {"frame",100,1,1}
  1324.         end
  1325.       end
  1326.     end
  1327.  
  1328.     -- BACK TO MENU
  1329.     if not (mode == "site" or mode == "frame") then
  1330.       break
  1331.     end
  1332.   end
  1333. end
  1334.  
  1335.  
  1336.  
  1337. function menuAlarm(pos)
  1338.   mode = "alarm"
  1339.   local previousSelected = selected
  1340.   selected = 199
  1341.   selectedObj = 1
  1342.   while true do
  1343.     -- DRAW
  1344.     clear()
  1345.     b.clear()
  1346.     centered("ALARM'N'ACTION", 1)
  1347.     fill("-",2)
  1348.     if type(site[199][selectedObj]) == "table" then
  1349.       centered(selectedObj .. " - " .. site[199][selectedObj][1], 3)
  1350.     else
  1351.       centered(selectedObj, 3)
  1352.     end
  1353.     drawArrows(3)
  1354.     fill("-",4)
  1355.     write("BACK", 48, 1)
  1356.     local relY = 0
  1357.     local relC = 0
  1358.     if type(site[199][selectedObj]) == "table" and site[199][selectedObj][1] == "ALARM" then
  1359.       write("DELETE", 1, 1)
  1360.       write("UNIT:      "..site[199][selectedObj][2], 10, 6)
  1361.       write("METHOD:    "..site[199][selectedObj][3], 10, 7)
  1362.       write("NUMBER:    "..site[199][selectedObj][5] .. " " .. site[199][selectedObj][6], 10, 8)
  1363.       write("ACTION:    "..site[199][selectedObj][7], 10, 9)
  1364.       relY = 2
  1365.       relC = 4
  1366.     elseif type(site[199][selectedObj]) == "table" and site[199][selectedObj][1] == "CHAT" then
  1367.       write("DELETE", 1, 1)
  1368.       write("COMMAND: $$"..site[199][selectedObj][2], 10, 6)
  1369.       write("ACTION:    "..site[199][selectedObj][3], 10, 7)
  1370.       relY = 0
  1371.       relC = 0
  1372.     elseif type(site[199][selectedObj]) == "table" and site[199][selectedObj][1] == "REDNET" then
  1373.       write("DELETE", 1, 1)
  1374.       write("MESSAGE:   "..site[199][selectedObj][2], 10, 6)
  1375.       write("ACTION:    "..site[199][selectedObj][3], 10, 7)
  1376.       relY = 0
  1377.       relC = 0
  1378.     else
  1379.       write("ALARM", 10, 9)
  1380.       write("CHAT", 10, 10)
  1381.       write("REDNET", 10 , 11)
  1382.     end
  1383.  
  1384.     if type(site[199][selectedObj]) == "table" then
  1385.       if site[199][selectedObj][3+relC] == "TEXT" then
  1386.         write("| X:       "..site[199][selectedObj][4+relC], 10, 8+relY)
  1387.         write("| Y:       "..site[199][selectedObj][5+relC], 10, 9+relY)
  1388.         write("| TEXT:    "..site[199][selectedObj][6+relC], 10, 10+relY)
  1389.         drawColor(7+relC, 11+relY)
  1390.       elseif site[199][selectedObj][3+relC] == "ACTIVATION" then
  1391.         write("| UNIT:    "..site[199][selectedObj][4+relC], 10, 8+relY)
  1392.         write("| METHOD:  "..site[199][selectedObj][5+relC], 10, 9+relY)
  1393.       elseif site[199][selectedObj][3+relC] == "REDNET" then
  1394.         --write("| SIDE:    "..rednetSide[site[199][selectedObj][4+relC]], 10, 8+relY)
  1395.         write("| MESSAGE: "..site[199][selectedObj][5+relC], 10, 8+relY)
  1396.       end
  1397.     end
  1398.  
  1399.     -- EVENT
  1400.     local event = { os.pullEvent() }
  1401.     if checkEvent(event, true) then
  1402.       x, y = event[3], event[4]
  1403.       if y == 1 and x <= 6 and type(site[199][selectedObj]) == "table" then
  1404.         site[199][selectedObj] = nil
  1405.       elseif y == 1 and x >= 48 then
  1406.         save()
  1407.         selected = previousSelected
  1408.         selectedObj = 1
  1409.         mode = "mainmenu"
  1410.       elseif y == 3 or y == 4 then
  1411.         if x > 25 then
  1412.           selectedObj = selectedObj + 1
  1413.         elseif selectedObj > 1 then
  1414.           selectedObj = selectedObj - 1
  1415.         end
  1416.       elseif type(site[199][selectedObj]) == "table" and site[199][selectedObj][1] == "ALARM" then -- ALARM
  1417.         if y == 6 then
  1418.           menuUnit(2)
  1419.         elseif y == 7 then
  1420.           if x < 20 then
  1421.             menuMethod(3, site[199][selectedObj][2],true,4)
  1422.           else
  1423.             menuMethod(3, site[199][selectedObj][2],false,4)
  1424.           end
  1425.         elseif y == 8 and x >=19 and x <= 21 then
  1426.           if site[199][selectedObj][5] == "=" then
  1427.             site[199][selectedObj][5] = ">"
  1428.           elseif site[199][selectedObj][5] == ">" then
  1429.             site[199][selectedObj][5] = "<"
  1430.           elseif site[199][selectedObj][5] == "<" then
  1431.             site[199][selectedObj][5] = "="
  1432.           end
  1433.         elseif y == 8 then
  1434.           betterRead(23,y,true,6,x)
  1435.         elseif y == 9 then
  1436.           setAction(7)
  1437.         elseif site[199][selectedObj][7] == "TEXT" then -- ALARM: TEXT
  1438.           if y == 10 then
  1439.             betterRead(21,y,true,8,x)
  1440.           elseif y == 11 then
  1441.             betterRead(21,y,true,9,x)
  1442.           elseif y == 12 then
  1443.             betterRead(21,y,false,10,x)
  1444.           elseif y == 13 then
  1445.             changeColor(x, 11)
  1446.           end
  1447.         elseif site[199][selectedObj][7] == "ACTIVATION" then -- ALARM: ACTIVATION
  1448.           if y == 10 then
  1449.             menuUnit(8)
  1450.           elseif y == 11 then
  1451.             if x < 20 then
  1452.               menuMethod(9, site[199][selectedObj][8],true,10)
  1453.             else
  1454.               menuMethod(9, site[199][selectedObj][8],false,10)
  1455.             end
  1456.           end
  1457.         elseif site[199][selectedObj][7] == "REDNET" then -- ALARM: REDNET
  1458.           if y == 10 then
  1459.             site[199][selectedObj][8] = site[199][selectedObj][8] + 1
  1460.             if site[199][selectedObj][8] > countArray(rednetSide) then
  1461.               site[199][selectedObj][8] = 1
  1462.             end
  1463.           elseif y == 11 then
  1464.             betterRead(21,y,false,9,x)
  1465.           end
  1466.         end
  1467.  
  1468.       elseif type(site[199][selectedObj]) == "table" and ( site[199][selectedObj][1] == "CHAT" or site[199][selectedObj][1] == "REDNET") then -- CHAT AND REDNET
  1469.         if y == 6 then
  1470.           betterRead(21,y,false,2,x)
  1471.         elseif y == 7 then
  1472.           setAction(3)
  1473.         elseif site[199][selectedObj][3] == "TEXT" then -- CHAT OR REDNET: TEXT
  1474.           if y == 8 then
  1475.             betterRead(21,y,true,4,x)
  1476.           elseif y == 9 then
  1477.             betterRead(21,y,true,5,x)
  1478.           elseif y == 10 then
  1479.             betterRead(21,y,false,6,x)
  1480.           elseif y == 11 then
  1481.             changeColor(x, 7)
  1482.           end
  1483.         elseif site[199][selectedObj][3] == "ACTIVATION" then -- CHAT OR REDNET: ACTIVATION
  1484.           if y == 8 then
  1485.             menuUnit(4)
  1486.           elseif y == 9 then
  1487.             if x < 20 then
  1488.               menuMethod(5, site[199][selectedObj][4],true,6)
  1489.             else
  1490.               menuMethod(5, site[199][selectedObj][4],false,6)
  1491.             end
  1492.           end
  1493.         elseif site[199][selectedObj][3] == "REDNET" then -- CHAT OR REDNET: REDNET
  1494.           --[[if y == 8 then
  1495.             site[199][selectedObj][4] = site[199][selectedObj][4] + 1
  1496.             if site[199][selectedObj][4] > countArray(rednetSide) then
  1497.               site[199][selectedObj][4] = 1
  1498.             end]]
  1499.           if y == 8 then
  1500.             betterRead(21,y,false,5,x)
  1501.           end
  1502.         end
  1503.       else -- CREATE NEW
  1504.         if y == 9 then
  1505.           site[199][selectedObj] = {"ALARM","NONE","NONE",{},"=", 42, "NONE"}
  1506.         elseif y == 10 then
  1507.           site[199][selectedObj] = {"CHAT","NONE","NONE"}
  1508.         elseif y == 11 then
  1509.           site[199][selectedObj] = {"REDNET","NONE","NONE"}
  1510.         end
  1511.       end
  1512.     end
  1513.  
  1514.     -- BACK TO MENU
  1515.     if not (mode == "alarm") then
  1516.       break
  1517.     end
  1518.   end
  1519. end
  1520.  
  1521.  
  1522.  
  1523.  
  1524.  
  1525. -- PRIMARY MENUS
  1526.  
  1527. function mainMenu()
  1528.   mode = "mainmenu"
  1529.   while true do
  1530.     for _, side in pairs(rednetSide) do
  1531.       if peripheral.getType(side) == "modem" then
  1532.         rednet.open(side)
  1533.       end
  1534.     end
  1535.    
  1536.     -- DRAW
  1537.     clear()
  1538.     centered("CLIENT FOR OPENPERIPERAL'S GLASSES", 1)
  1539.     fill("-", 2)
  1540.     write("by UNOBTANIUM", w-13, h)
  1541.     write("Site",20,6)
  1542.     write("Frame",20,8)
  1543.     write("Alarm'n'Action",20,10)
  1544.     write("Quit",20,13)
  1545.  
  1546.     -- EVENT
  1547.     local event = { os.pullEvent() }
  1548.     if checkEvent(event) then
  1549.       x, y = event[3], event[4]
  1550.       if y == 6 then
  1551.         menuSiteOrFrame("site")
  1552.       elseif y == 8 then
  1553.         menuSiteOrFrame("frame")
  1554.       elseif y == 10 then
  1555.         menuAlarm()
  1556.       elseif y == 13 then
  1557.         save()
  1558.         b.clear()
  1559.         mode = "quit"
  1560.       end
  1561.     end
  1562.  
  1563.     if mode == "quit" then
  1564.       break
  1565.     end
  1566.   end
  1567. end
  1568.  
  1569.  
  1570.  
  1571. -- EVENT HANDLING
  1572.  
  1573. function checkEvent(event, justUpdate, charAndKeyEvent)
  1574.   charAndKeyEvent = charAndKeyEvent or false
  1575.   justUpdate = justUpdate or false
  1576.   if event[1] == "timer" and event[2] == delay then
  1577.     if justUpdate then
  1578.       updateGraphs()
  1579.     else
  1580.       drawSite()
  1581.     end
  1582.     delay = os.startTimer(updateInterval)
  1583.  
  1584.   elseif event[1] == "mouse_click" then
  1585.     return true
  1586.   elseif charAndKeyEvent and ( event[1] == "char" or event[1] == "key" ) then
  1587.     return true
  1588.  
  1589.   elseif event[1] == "chat_command" then
  1590.     mode = "mainmenu"
  1591.     checkAlarm(event[2])
  1592.     if event[2] == "clear" or event[2] == "" then
  1593.       b.clear()
  1594.       selected = 0
  1595.     elseif event[2] == "sync" then
  1596.       drawText("Sync!", 10, 10, 14)
  1597.       if selected == 0 then
  1598.         selected = 1
  1599.       end
  1600.       sleep(2)
  1601.       delay = os.startTimer(0.1)
  1602.     else
  1603.       for i=1,99 do
  1604.         if event[2] == "site"..i then
  1605.           selected = i
  1606.           drawSite()
  1607.           break
  1608.         end
  1609.       end
  1610.     end
  1611.  
  1612.   elseif event[1] == "rednet_message" then
  1613.     checkAlarm("", tostring(event[3]))
  1614.   end
  1615.  
  1616.   return false
  1617. end
  1618.  
  1619.  
  1620. -- START
  1621.  
  1622. load()
  1623. mainMenu()
  1624. clear()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement