ComputerCraft Archive

openperipheral client

computer utility Vexatos github

Description

0.2.0 by UNOBTANIUM

Installation

Copy one of these commands into your ComputerCraft terminal:

wget:wget https://raw.githubusercontent.com/Vexatos/ComputerCraft-Programs/master/Other/UNOBTANIUM/openperipheral_client.lua openperipheral_client
Archive:wget https://cc.shobie.xyz/cc/get/gh-Vexatos-ComputerCraft-Programs-other-unobtanium-openperipheral-client openperipheral_client
Quick Install: wget https://cc.shobie.xyz/cc/get/gh-Vexatos-ComputerCraft-Programs-other-unobtanium-openperipheral-client openperipheral client

Usage

Run: openperipheral_client

Tags

none

Source

View Original Source

Code Preview

--0.2.0 by UNOBTANIUM
local site = {}
local alarm = {}
local selected = 1
local selectedObj = 1
local selectedFrame = 100
local z = 1
local mode = "mainmenu"
local w,h = term.getSize()
local delay = os.startTimer(1)
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}
local colorHex = {0xFFFFFF,0xFF8800,0xFF8CFF,0x00FFFF,0xFFF700,0x00FF11,0xF7B5DE,0xBFBFBF,0x65A1D6,0xAF56B3,0x0000FF,0x754302,0x004000,0xFF0000,0x000000}
local b = peripheral.wrap("left")
local net = peripheral.wrap("back")

-- type text x y c
-- type x y text unit method maxNumber c cMax
-- type x y w h cBorder tBorder cBack tBack cOne tOne cTwo tTwo unit method maxNumber
-- type x y w h minNumber maxNumber c t fadeout unit method var

for i=1, 198 do
 site[i] = {}
end

function save()
 local file = fs.open("openPeripheralClient","w")
  for i=1,198 do			-- SITE
   file.writeLine(countArray(site[i]))
   for k,v in pairs(site[i]) do	-- OBJECT
    file.writeLine(countArray(site[i][k]))
    for m,n in pairs(site[i][k]) do	-- VARIABLES
     if (site[i][k][1] == "graphPillar" or site[i][k][1] == "graphPoint") and m == 13 then
      file.writeLine(countArray(site[i][k][m]))
      for a,b in pairs(site[i][k][m]) do
       file.writeLine(site[i][k][m][a])
      end
     else
      file.writeLine(n)
     end
    end
   end
  end
 -- ALARM
 file.close()
end

function load()
 if not fs.exists("openPeripheralClient") then return end
 local file = fs.open("openPeripheralClient","r")
  for i=1,198 do
   local amountObj = tonumber(file.readLine())
   for k=1,amountObj do
    local amountVars = tonumber(file.readLine())
    local typ = file.readLine()
    site[i][k] = {}
    site[i][k][1] = typ
    for m=2,amountVars do
     if typ == "text" then
      if m == 2 then
       site[i][k][m] = file.readLine()
      else
       site[i][k][m] = tonumber(file.readLine())
      end
     elseif typ == "box" then
       site[i][k][m] = tonumber(file.readLine())
     elseif typ == "number" then
      if m == 2 or m == 3 or m >= 7 then
       site[i][k][m] = tonumber(file.readLine())
      else
       site[i][k][m] = file.readLine()
      end
     elseif typ == "bar" then
      if (m >= 2 and m <=13) or m == 16 then
       site[i][k][m] = tonumber(file.readLine())
      else
       site[i][k][m] = file.readLine()
      end
     elseif typ == "graphPillar" or typ == "graphPoint" then
      if m >= 2 and m <= 9 then
       site[i][k][m] = tonumber(file.readLine())
      elseif m == 10 then
       if file.readLine() == "true" then
        site[i][k][m] = true
       else
        site[i][k][m] = false        
       end
      elseif m == 11 or m == 12 then
       site[i][k][m] = file.readLine()
      else
       local amount = tonumber(file.readLine())
       site[i][k][m] = {}
       for a=1,amount do
        site[i][k][m][a] = tonumber(file.readLine())
       end
      end
     elseif typ == "frame" then
       site[i][k][m] = tonumber(file.readLine())
     end
    end
   end
  end

 -- ALARM
 file.close()
end

function clear(color)
 color = color or colors.black
 term.setBackgroundColor(color)
 term.clear()
 term.setCursorPos(1,1)
end

function countArray(a)
 local amount = 0
 for k,v in pairs(a) do
  amount = amount + 1
 end
 return amount
end

function write(text,x,y,c)
 c = c or colors.white
 term.setCursorPos(x,y)
 term.setTextColor(c)
 term.write(text)
end

function centered(text,y,c)
 c = c or colors.white
 term.setCursorPos(w/2-math.ceil(#tostring(text)/2),y)
 term.setTextColor(c)
 term.write(tostring(text))
end

function fill(text,y)
 centered(string.rep(tostring(text), w), y)
end

function setColors(text,background)
 background = background or colors.lightGray
 term.setTextColor(text)
 term.setBackgroundColor(background)
end

function drawArrows(y)
  write("<",15,y)
  write(">",34,y)
end

-- UNIT AND METHOD

function getUnit(pos)
 clear()
 local list = net.getNamesRemote()
 if countArray(list) == 0 then
  write("NOTHING ATTACHED TO THE NETWORK!",25,9)
  sleep(1.5)
  return "NONE"
 end
 local unit = 1
 centered("SELECT A UNIT",1)
 fill("-",2)
 centered("SELECT",14)
 while true do
  fill(" ",9)
  drawArrows(9)
  centered(list[unit],9)
  local event, button, x, y = os.pullEvent()
  if event == "mouse_click" then
   if y >= 8 and y <= 10 then
    if x <= 25 then
     unit = unit - 1
    else
      unit = unit + 1
    end
    if unit == 0 then
     unit = countArray(list)
    elseif unit > countArray(list) then
     unit = 1
    end
   elseif y == 14 then
    site[selected][selectedObj][pos] = list[unit]
    site[selected][selectedObj][pos+1] = "NONE"
    break
   end
  elseif event == "timer" and button == delay then
   drawSite(false)
   delay = os.startTimer(2)
  end
 end
end

function getMethod(pos,unit)
 clear()
 if not net.isPresentRemote(unit) then
  return "NONE"
 end
 local list = net.getMethodsRemote(unit)
-- local list = {}
-- for k,v in pairs(tempList) do
--  print(v)
--  if type(net.callRemote(unit, v)) == "number" then
--   table.insert(list,1,v)
--  end
-- end
 if countArray(list) == 0 then
  centered("NO METHOD FOUND!",9)
  sleep(1.5)
  return "NONE"
 end
 local method = 1
 centered("SELECT A METHOD FROM " .. unit ,1)
 fill("-",2)
 centered("SELECT",14)
 while true do
  fill(" ",9)
  drawArrows(9)
  centered(list[method],9)
  local event, button, x, y = os.pullEvent()
  if event == "mouse_click" then
   if y >= 8 and y <= 10 then
    if x <= 25 then
     method = method - 1
    else
     method = method + 1
    end
    if method == 0 then
     method = countArray(list)
    elseif method > countArray(list) then
     method = 1
    end
   elseif y == 14 then
    site[selected][selectedObj][pos] = list[method]
    break
   end
  elseif event == "timer" and button == delay then
   drawSite(false)
   delay = os.startTimer(2)
  end
 end
end


-- DRAW

-- type text x y c
function drawText(text,x,y,c)
 local var = b.addText(x,y,text,colorHex[c])
 var.setZIndex(z)
end

-- type x y w h cOne tOne cTwo tTwo
function drawBox(x,y,w,h,cOne,tOne,cTwo,tTwo)
 cOne = colorHex[cOne]
 cTwo = colorHex[cTwo]
 local var1 = b.addBox(x,y,w,2,cTwo,tTwo)
 var1.setZIndex(z)
 local var2 = b.addBox(x,y+2,2,h-4,cTwo,tTwo)
 var2.setZIndex(z)
 local var3 = b.addBox(x,y+h-2,w,2,cTwo,tTwo)
 var3.setZIndex(z)
 local var4 = b.addBox(x+w-2,y+2,2,h-4,cTwo,tTwo)
 var4.setZIndex(z)
 local var5 = b.addBox(x+2,y+2,w-4,h-4,cOne,tOne)
 var5.setZIndex(z)
end

-- type x y text unit method maxNumber c cMax
function drawNumber(x,y,text,unit,method,maxNumber,c,cMax)
 c = colorHex[c]
 cMax = colorHex[cMax]
 local number = "NONE"
 if net.isPresentRemote(unit) and not (method == "NONE") then
  number = tonumber(net.callRemote(unit,method))
 end
 local lengthText = ((#text) + 2)*6
 local lengthNumber = (#(tostring(number)))*6
 local maxLength = (#(tostring(maxNumber)))*6
 if type(number) == "string" or (type(number) == "number" and number == maxNumber) then
  local var1 = b.addText(x,y,text .. ":",c)
  var1.setZIndex(z)
  local var2 = b.addText(x+lengthText,y,tostring(number),cMax)
  var2.setZIndex(z)
  local var3 = b.addText(x+lengthText+maxLength,y, " / " .. maxNumber, c)
  var3.setZIndex(z)
 else
  local var1 =  b.addText(x,y, text .. ":", c )
  var1.setZIndex(z)
  local var2 =  b.addText(x+lengthText+(maxLength-lengthNumber),y, number .. " / " .. maxNumber,c)
  var2.setZIndex(z)
 end
end

-- type x y w h cBorder tBorder cBack tBack cOne tOne cTwo tTwo unit method maxNumber
function drawBar(x,y,w,h,cBorder,tBorder,cBack,tBack,cOne,tOne,cTwo,tTwo,unit,method,maxNumber)
 cBorder = colorHex[cBorder]
 cBack = colorHex[cBack]
 cOne = colorHex[cOne]
 cTwo = colorHex[cTwo]
 local var1 = b.addBox(x+2,y+2,w-4,h-4,cBack,tBack)
 var1.setZIndex(z)
 local var2 = b.addBox(x,y,w,2,cBorder,tBorder)
 var2.setZIndex(z)
 local var3 = b.addBox(x,y+h-2,w,2,cBorder,tBorder)
 var3.setZIndex(z)
 local var4 = b.addBox(x,y+2,2,h-4,cBorder,tBorder)
 var4.setZIndex(z)
 local var5 = b.addBox(x+w-2,y+2,2,h-4,cBorder,tBorder)
 var5.setZIndex(z)
 if net.isPresentRemote(unit) and method ~= "NONE" and net.callRemote(unit,method) <= maxNumber then
  local number = net.callRemote(unit,method)
  local box = b.addBox(x+2,y+2,math.ceil((number/maxNumber)*(w-4)),h-4,cOne,tOne)
  box.setColor2(cTwo)
  box.setOpacity(tTwo)
  box.setGradient(2)
  z = z + 1
  box.setZIndex(z)
 end
end

-- type x y w h minNumber maxNumber c t fadeout unit method var
function drawGraph(typ,x,y,w,h,minNumber,maxNumber,c,t,fadeout,var)
 local decrease = t/20
 c = colorHex[c]
 for relX=2,w,2 do
  if fadeout and relX >= w-20 and t > 0.05 then
   t = t - decrease
  end
  if typ == "graphPillar" then
   if type(var[relX/2]) == "number" then
    if var[relX/2] > minNumber then
     local box = b.addBox(x+relX-2,y+(h-(math.ceil((var[relX/2]/(maxNumber))*h))),2,(math.ceil((var[relX/2]/(maxNumber))*h)),c,t)
     box.setZIndex(z)
    else
     local box = b.addBox(x+relX-2,y+h-1,2,1,c,t)
     box.setZIndex(z)
    end
   else
    local box = b.addBox(x+relX-2,y+h-1,2,1,c,t)
    box.setZIndex(z)
   end
  else
   if type(var[relX/2]) == "number" then
    if var[relX/2] > minNumber then
     local box = b.addBox(x+relX-2,y+(h-1-((math.ceil((var[relX/2]/(maxNumber))*h)))),2,2,c,t)
     box.setZIndex(z)
     local box = b.addBox(x+relX-2,y+h-1,2,1,c,t)
     box.setZIndex(z)
    else
     local box = b.addBox(x+relX-2,y+h-1,2,1,c,t)
     box.setZIndex(z)
    end
   else
    local box = b.addBox(x+relX-2,y+h-1,2,1,c,t)
    box.setZIndex(z)
   end
  end
 end
end

function innerDraw(relX,relY,s) 
 for k,v in pairs(site[s]) do
  if site[s][k][1] == "frame" then
   innerDraw(site[s][k][3],site[s][k][4],site[s][k][2])
  elseif site[s][k][1] == "box" then
   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])
   z = z + 1
  end
 end

 for k,v in pairs(site[s]) do
  if site[s][k][1] == "number" then
   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])
   z = z + 1
  elseif site[selected][k][1] == "bar" then
   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])
   z = z + 1
  elseif site[s][k][1] == "graphPillar" or site[s][k][1] == "graphPoint" then
   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])
   z = z + 1
  end
 end

 for k,v in pairs(site[s]) do
  if site[s][k][1] == "text" then
   drawText(site[s][k][2],site[s][k][3]+relX,site[s][k][4]+relY,site[s][k][5])
   z = z + 1
  end
 end
end

function drawSite(doRefresh)
 z = 1
 if doRefresh then
  refresh()
 end
 b.clear()
 if selected == 0 then return end
 innerDraw(0,0,selected)
 save()
end

function refresh()
 for k,v in pairs(site) do
  for m,n in pairs(site[k]) do
   if (site[k][m][1] == "graphPillar" or site[k][m][1] == "graphPoint") and net.isPresentRemote(site[k][m][11]) and site[k][m][12] ~= "NONE" then
    table.insert(site[k][m][13],1,net.callRemote(site[k][m][11],site[k][m][12]))
    if type(site[k][m][13][math.ceil(site[k][m][4]/2)+1]) ~= nil then
     site[k][m][13][math.ceil(site[k][m][4]/2)+1] = nil
    end
   elseif site[k][m][1] == "graphPillar" or site[k][m][1] == "graphPoint" then
    table.insert(site[k][m][13], 1, 0)
    if type(site[k][m][13][math.ceil(site[k][m][4]/2)+1]) ~= nil then
     site[k][m][13][math.ceil(site[k][m][4]/2)+1] = nil
    end
   end
  end
 end
end

function drawColor(i,y)
 drawArrows(y)
 term.setBackgroundColor(colorName[site[selected][selectedObj][i]])
 centered("   ",y)
 term.setBackgroundColor(colors.black)
end

function drawTransparent(i,y)
 drawArrows(y)
 centered(site[selected][selectedObj][i],y)
end




function draw()
 clear()
 if mode == "mainmenu" then
  write("Site",20,6)
  write("Frame",20,8)
  write("Alarm",20,10)
  write("Quit",20,12)
 elseif mode == "selectSite" then
  centered("Select Site",1)
  centered(selected, 8)
  drawArrows(8)
  centered("SELECT",11)
  centered("BACK",13)
 elseif mode == "selectFrame" then
  centered("Select Frame",1)
  centered(selected-99, 8)
  drawArrows(8)
  centered("SELECT",11)
  centered("BACK",13)
 elseif mode == "selectAlarm" then
  
 elseif mode == "individualizeSite" or mode == "individualizeFrame" then
  if mode == "individualizeSite" then
   centered("INDIVIDUALIZE SITE " .. selected ,1)
  elseif mode == "individualizeFrame" then
   centered("INDIVIDUALIZE FRAME " .. selected-99 ,1)
  end
  fill("-",2)
  if type(site[selected][selectedObj]) == "table" then
   centered(selectedObj.. " - " .. site[selected][selectedObj][1] , 3)
  else
   centered(selectedObj , 3)
  end
  drawArrows(3)
  fill("-",4)
  write("BACK",48,1)
  if type(site[selected][selectedObj]) == "table" then		-- object exists
   write("DELETE",1,1)
   if site[selected][selectedObj][1] == "text" then		-- TEXT
    write("TEXT: " .. site[selected][selectedObj][2],10,7)
    write("X:    " .. site[selected][selectedObj][3],10,9)
    write("Y:    " .. site[selected][selectedObj][4],10,11)
    drawColor(5,13)
   elseif site[selected][selectedObj][1] == "box" then		-- BOX
    write("X:      " .. site[selected][selectedObj][2],10,5)
    write("Y:      " .. site[selected][selectedObj][3],10,6)
    write("WIDTH:  " .. site[selected][selectedObj][4],10,7)
    write("HEIGHT: " .. site[selected][selectedObj][5],10,8)
    drawColor(6,9)
    drawTransparent(7,10)
    drawColor(8,11)
    drawTransparent(9,12)
   elseif site[selected][selectedObj][1] == "number" then	-- NUMBER
    write("X:      "..site[selected][selectedObj][2],10,5)
    write("Y:      "..site[selected][selectedObj][3],10,6)
    write("TEXT:   "..site[selected][selectedObj][4],10,7)
    write("UNIT:   "..site[selected][selectedObj][5],10,8)
    write("METHOD: "..site[selected][selectedObj][6],10,9)
    write("MAX:    "..site[selected][selectedObj][7],10,10)
    drawColor(8,11)
    drawColor(9,12)
   elseif site[selected][selectedObj][1] == "bar" then		-- BAR
    write("X:      "..site[selected][selectedObj][2],10,5)
    write("Y:      "..site[selected][selectedObj][3],10,6)
    write("WIDTH:  "..site[selected][selectedObj][4],10,7)
    write("HEIGHT: "..site[selected][selectedObj][5],10,8)
    write("UNIT:   "..site[selected][selectedObj][14],10,9)
    write("METHOD: "..site[selected][selectedObj][15],10,10)
    write("MAX:    "..site[selected][selectedObj][16],10,11)
    drawColor(6,12)
    drawTransparent(7,13)
    drawColor(8,14)
    drawTransparent(9,15)
    drawColor(10,16)
    drawTransparent(11,17)
    drawColor(12,18)
    drawTransparent(13,19)
   elseif site[selected][selectedObj][1] == "graphPillar" or site[selected][selectedObj][1] == "graphPoint" then			
		-- GRAPHS
    write("X:       "..site[selected][selectedObj][2],10,5)
    write("Y:       "..site[selected][selectedObj][3],10,6)
    write("WIDTH:   "..site[selected][selectedObj][4],10,7)
    write("HEIGHT:  "..site[selected][selectedObj][5],10,8)
    write("UNIT:    "..site[selected][selectedObj][11],10,9)
    write("METHOD:  "..site[selected][selectedObj][12],10,10)
    write("MIN:     "..site[selected][selectedObj][6],10,11)
    write("MAX:     "..site[selected][selectedObj][7],10,12)
    drawColor(8,13)
    drawTransparent(9,14)
    write("FADEOUT: "..tostring(site[selected][selectedObj][10]),10,15)
    write("TYPE:   " ..site[selected][selectedObj][1],10,16)
   elseif site[selected][selectedObj][1] == "frame" then	-- FRAME
    centered(selectedFrame-99,5)
    drawArrows(5)
    fill("-",6)
    write("X: "..site[selected][selectedObj][3],10,8)
    write("Y: "..site[selected][selectedObj][4],10,10)
   end
  else	--create new object
   write("TEXT",20,6)
   write("BOX",20,7)
   write("NUMBER",20,8)
   write("BAR",20,9)
   write("GRAPH (PILLAR)",20,10)
   write("GRAPH (POINT)",20,11)
   if mode == "individualizeSite" then
    write("FRAME",20,12)
   end
  end
 end
end



function changeColor(x,pos)
 if x < 25 then
  site[selected][selectedObj][pos] = site[selected][selectedObj][pos] - 1
 else
  site[selected][selectedObj][pos] = site[selected][selectedObj][pos] + 1
 end
 if site[selected][selectedObj][pos] <= 0 then
  site[selected][selectedObj][pos] = 15
 elseif site[selected][selectedObj][pos] >= 16 then
  site[selected][selectedObj][pos] = 1
 end
end

function changeTransparence(x,pos)
 if x < 25 then
  site[selected][selectedObj][pos] = site[selected][selectedObj][pos] - 0.1
 else
  site[selected][selectedObj][pos] = site[selected][selectedObj][pos] + 0.1
 end
 if site[selected][selectedObj][pos] < 0 then
  site[selected][selectedObj][pos] = 1
 elseif site[selected][selectedObj][pos] > 1 then
  site[selected][selectedObj][pos] = 0
 end
end

function betterRead(x,y,numberOnly,pos,clickX)
 term.setTextColor(colors.lightGray)
 term.setCursorBlink(true)
 local s
 if clickX < x then
  s = ""
 else
  s = tostring(site[selected][selectedObj][pos])
 end


 while true do
  term.setCursorPos(x,y)
  term.write( string.rep(' ', w - x + 1) )
  term.setCursorPos(x,y)
  if s:len()+x < w then
   term.write(s)
  else
   term.write(s:sub( s:len() - (w-x-2)))
  end
  local e = { os.pullEvent() }
  if e[1] == "timer" and e[2] == delay then
   drawSite(false)
   delay = os.startTimer( 2 )
  elseif e[1] == "char" then
   s = s .. e[2]
  elseif e[1] == "key" then
   if e[2] == keys.enter then
    break
   elseif e[2] == keys.backspace then
    s = s:sub( 1, s:len() - 1 )
   end
  end
 end
 term.setTextColor(colors.white)
 if numberOnly then
  s = tonumber(s)
  if s then
   site[selected][selectedObj][pos] = s
  end
 else
  site[selected][selectedObj][pos] = s
 end
 term.setCursorBlink(false)
end





function mouseInteraction(x,y)
 if mode == "mainmenu" then
  if y == 6 then
   mode = "selectSite"
   selected = 1
   elseif y == 8 then
   mode = "selectFrame"
   selected = 100
  elseif y == 10 then
   --mode = "selectAlarm"
  elseif y == 12 then
   save()
   b.clear()
   os.reboot()
  end
 elseif mode == "individualizeSite" then
  checkIndividualization(x,y)
 elseif mode == "individualizeFrame" then
  checkIndividualization(x,y)
 elseif mode == "individualizeAlarm" then

 elseif mode == "selectSite" or mode == "selectFrame" or mode == "selectAlarm" then	-- SELECT
  if y == 8 then
   if x < 25 then
    selected = selected - 1
   else
    selected = selected + 1
   end
   if mode == "selectSite" then
    if selected == 0 then
     selected = 99
    elseif selected == 100 then
     selected = 1
    end
   elseif mode == "selectFrame" then
    if selected == 99 then
     selected = 198
    elseif selected == 199 then
     selected = 100
    end
   end
  elseif y == 11 then
   if mode == "selectSite" then
    mode = "individualizeSite"
    selectedObj = 1
   elseif mode == "selectFrame" then
    mode = "individualizeFrame"
    selectedObj = 1
    selectedFrame = 100
   elseif mode == "selectAlarm" then
    mode = "individualizeAlarm"
    selectedObj = 1
   end
   return
  elseif y == 13 then
   mode = "mainmenu"
  end
 end
end


function checkIndividualization(x,y)
 if y == 3 then
  if x < 25 then
   selectedObj = selectedObj - 1
  else
   selectedObj = selectedObj + 1
  end
  if selectedObj == 0 then
   selectedObj = 1
  end
 elseif y == 1 and x >= w-3 then
  mode = "mainmenu"
  return
 end
 if type(site[selected][selectedObj]) == "table" then
  if y == 1 and x <=6 then
   site[selected][selectedObj] = nil
  elseif site[selected][selectedObj][1] == "text" then
   if y == 7 then
    betterRead(16,y,false,2,x)
   elseif y == 9 then
    betterRead(16,y,true,3,x)
   elseif y == 11 then
    betterRead(16,y,true,4,x)
   elseif y == 13 then
    changeColor(x,5)
   end
  elseif site[selected][selectedObj][1] == "box" then
   if y == 5 then
    betterRead(18,y,true,2,x)
   elseif y == 6 then
    betterRead(18,y,true,3,x)
   elseif y == 7 then
    betterRead(18,y,true,4,x)
   elseif y == 8 then
    betterRead(18,y,true,5,x)
   elseif y == 9 then
    changeColor(x,6)
   elseif y == 10 then
    changeTransparence(x,7)
   elseif y == 11 then
    changeColor(x,8)
   elseif y == 12 then
    changeTransparence(x,9)
   end
  elseif site[selected][selectedObj][1] == "number" then
   if y == 5 then
    betterRead(18,y,true,2,x)
   elseif y == 6 then
    betterRead(18,y,true,3,x)
   elseif y == 7 then
    betterRead(18,y,false,4,x)
   elseif y == 8 then
    getUnit(5)
   elseif y == 9 then
    getMethod(6,site[selected][selectedObj][5])
   elseif y == 10 then
    betterRead(18,y,true,7,x)
   elseif y == 11 then
    changeColor(x,8)
   elseif y == 12 then
    changeColor(x,9)
   elseif y == 13 then
   end
  elseif site[selected][selectedObj][1] == "bar" then
   if y == 5 then
    betterRead(18,y,true,2,x)
   elseif y == 6 then
    betterRead(18,y,true,3,x)
   elseif y == 7 then
    betterRead(18,y,true,4,x)
   elseif y == 8 then
    betterRead(18,y,true,5,x)
   elseif y == 9 then
    getUnit(14)
   elseif y == 10 then
    getMethod(15,site[selected][selectedObj][14])
   elseif y == 11 then
    betterRead(18,y,true,16,x)
   elseif y == 12 then
    changeColor(x,6)
   elseif y == 13 then
    changeTransparence(x,7)
   elseif y == 14 then
    changeColor(x,8)
   elseif y == 15 then
    changeTransparence(x,9)
   elseif y == 16 then
    changeColor(x,10)
   elseif y == 17 then
    changeTransparence(x,11)
   elseif y == 18 then
    changeColor(x,12)
   elseif y == 19 then
    changeTransparence(x,13)
   end
  elseif site[selected][selectedObj][1] == "graphPillar" or site[selected][selectedObj][1] == "graphPoint" then
   if y == 5 then
    betterRead(19,y,true,2,x)
   elseif y == 6 then
    betterRead(19,y,true,3,x)
   elseif y == 7 then
    betterRead(19,y,true,4,x)
   elseif y == 8 then
    betterRead(19,y,true,5,x)
   elseif y == 9 then
    getUnit(11)
   elseif y == 10 then
    getMethod(12,site[selected][selectedObj][11])
   elseif y == 11 then
    betterRead(19,y,true,6,x)
   elseif y == 12 then
    betterRead(19,y,true,7,x)
   elseif y == 13 then
    changeColor(x,8)
   elseif y == 14 then
    changeTransparence(x,9)
   elseif y == 15 then
    site[selected][selectedObj][10] = not site[selected][selectedObj][10]
   elseif y == 16 then
    if site[selected][selectedObj][1] == "graphPoint" then
     site[selected][selectedObj][1] = "graphPillar"
    elseif site[selected][selectedObj][1] == "graphPillar" then
     site[selected][selectedObj][1] = "graphPoint"
    end
   end
  elseif site[selected][selectedObj][1] == "frame" then
   if y == 5 then
    if x < 25 then
     selectedFrame = selectedFrame - 1
    else
     selectedFrame = selectedFrame + 1
    end
    if selectedFrame == 99 then
     selectedFrame = 198
    elseif selectedFrame == 199 then
     selectedFrame = 100
    end
    site[selected][selectedObj][2] = selectedFrame
   elseif y == 8 then
    betterRead(13,y,true,3,x)
   elseif y == 10 then
    betterRead(13,y,true,4,x)
   end
  end
 else				-- CREATE
  if y == 6 then
   site[selected][selectedObj] = {"text","UNOBTANIUM",1,1,1}
  elseif y == 7 then
   site[selected][selectedObj] = {"box",1,1,10,10,1,1,1,1}
  elseif y == 8 then
   site[selected][selectedObj] = {"number",1,1,"UNOBTANIUM","NONE","NONE",1337,1,1}
  elseif y == 9 then
   site[selected][selectedObj] = {"bar",1,1,40,15,1,1,1,1,1,1,1,1,"NONE","NONE",1337}
  elseif y == 10 then
   site[selected][selectedObj] = {"graphPillar",1,1,100,40,0,1337,1,1,false,"NONE","NONE",{}}
  elseif y == 11 then
   site[selected][selectedObj] = {"graphPoint",1,1,100,40,0,1337,1,1,false,"NONE","NONE",{}}
  elseif y == 12 and mode == "individualizeSite" then
   site[selected][selectedObj] = {"frame",100,1,1}
  end
 end
 save()
end

function run()
 -- draw
 draw()
 drawSite(false)

 -- interactions
 local event = {os.pullEvent()}
 
 if event[1] == "timer" and event[2] == delay then
  drawSite(true)
  delay = os.startTimer(2)
 elseif event[1] == "mouse_click" then
  mouseInteraction(event[3],event[4])
 elseif event[1] == "chat_command" then
  if event[2] == "clear" then
   selected = 0
   mode = "mainmenu"
  end
  for i=1,99 do
   if event[2] == "site"..i then
    selected = i
    selectedObj = 1
    selectedFrame = 1
    break
   end
  end
 end
end


load()
while true do
 run()
end