TheTartalex

touchpoint api mystcraft

Jul 25th, 2016
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. -------------------------------------------------
  2. -- This script is designed to handle a touch
  3. -- screen controlled mystcraft portal, and
  4. -- requires the Touchpoint API to run (pFHeia96),
  5. -- saved as "touchpoint" on the computer.
  6. --
  7. -- Most important variables to adjust are listed
  8. -- first, and the script assumes that you have
  9. -- two chests (one for storage, one for removal),
  10. -- as well as this computer and a book receptacle
  11. -- adjacent to the storage chest. You also need
  12. -- an advanced monitor connected to the computer.
  13. -------------------------------------------------
  14. os.loadAPI("touchpoint") --Do not adjust.
  15.  
  16. --Use either the side of the computer touching the
  17. --object, or the modem connecting them.
  18. local monitorLocation = "back"
  19. local chestLocation = "iron_4"
  20.  
  21. --Use compass direction from the storage chest to
  22. --the listed object (or up/down).
  23. local directionToPortal = "up"
  24. local directionToEject = "down"
  25.  
  26. --Primary customization options are below.
  27. local textSize = 1
  28. local minimumNameLength = 4
  29. local buttonPadding = 1 --Min 1, Space before/after
  30. local centerPadding = 0 --Min 0, Space before/after
  31. local idleButtonColor = colors.blue
  32. local activeButtonColor = colors.cyan
  33. local portalDuration = 5 --In Seconds
  34. local showEject = true
  35. local showPageNum = true
  36. local showTotalPages = true
  37. local pageSeparator = " of "
  38.  
  39. --Secondary customization options are below.
  40. local drawBorders = false
  41. local borderSymbol1 = "-"
  42. local borderSymbol2 = "+"
  43. local pageBack = "Prev Page"
  44. local pageFore = "Next Page"
  45. local ejectButton = "Eject"
  46. local resetButton = "Refresh"
  47.  
  48. --Used internally. Do not adjust.
  49. local mon = peripheral.wrap(monitorLocation)
  50. local touch = touchpoint.new(monitorLocation)
  51. local chest = peripheral.wrap(chestLocation)
  52. local monX = 0
  53. local monY = 0
  54. local monMidL = 0
  55. local monMidR = 0
  56. local maxNameLength = 0
  57. local problem = false
  58. local iBC = idleButtonColor
  59. local aBC = activeButtonColor
  60. local names = {}
  61. local curPage = 1
  62. local lastPage = 1
  63. local namesPerPage = 1
  64. local pages = {}
  65. local eviction = false
  66. local pLabel
  67. local event, p1
  68.  
  69. function centerText(cString)
  70.   local sSize = string.len(cString)
  71.   offset = math.floor((monX - sSize) / 2) + 1
  72.   return offset
  73. end
  74.  
  75. function populateNames()
  76.   names = {}
  77.  
  78.   local invSize = chest.getInventorySize()
  79.   local stackInfo = chest.getAllStacks()
  80.   for a=1,invSize + 1,1 do
  81.     if stackInfo[a] ~= nil then
  82.       names[#names + 1] = {name = stackInfo[a]["myst_book"]["destination"],slot = a}
  83.       print(#names..": "..names[#names]["name"]..", "..names[#names]["slot"])
  84.     end
  85.   end
  86. end
  87.  
  88. function returnDir(myDir)
  89.   if myDir == "north" then
  90.     return "south"
  91.   elseif myDir == "south" then
  92.     return "north"
  93.   elseif myDir == "east" then
  94.     return "west"
  95.   elseif myDir == "west" then
  96.     return "east"
  97.   elseif myDir == "down" then
  98.     return "up"
  99.   elseif myDir == "up" then
  100.     return "down"
  101.   else
  102.     problem = true
  103.     return "oops..."
  104.   end
  105. end
  106.  
  107. function prepareScreen()
  108.   mon.clear()
  109.   mon.setTextScale(textSize)
  110.   monX, monY = mon.getSize()
  111.  
  112.   if (monY < 5) or (monX < (minimumNameLength * 2) + 4) then
  113.     mon.setBackgroundColor(colors.red)
  114.     mon.setTextColor(colors.black)
  115.     mon.setCursorPos(1,1)
  116.     mon.write("!!!")
  117.     print("Screen too small with current resolution, please adjust.")
  118.     problem = true
  119.   else
  120.     if math.floor(monX/2) == math.ceil(monX/2) then --Even
  121.       monMidR = monX/2 + 1
  122.       monMidL = monMidR - 1
  123.       maxNameLength = (monX - 4)/2 - (centerPadding + buttonPadding) * 2
  124.     else --Odd
  125.       monMidR = math.floor(monX/2) + 1
  126.       monMidL = monMidR
  127.       maxNameLength = (monX - 3)/2 - (centerPadding + buttonPadding) * 2
  128.     end
  129.     namesPerPage = math.ceil((monY - 4) / 2) * 2
  130.   end
  131. end
  132.  
  133. function checkDirections()
  134.   if directionToEject == "oops..." then
  135.     print("Direction to Eject isn't a valid forge direction.")
  136.     print("Please use north, south, east, west, up or down.")
  137.   end
  138.  
  139.   if directionToPortal == "oops..." then
  140.     print("Direction to Portal isn't a valid forge direction.")
  141.     print("Please use north, south, east, west, up or down.")
  142.   end  
  143. end
  144.  
  145. function initialPull()
  146.   chest.pullItemIntoSlot(directionToPortal,1,1,1)
  147. end
  148.  
  149. function determineLength(myString)
  150.   local theLength = 0
  151.   if string.len(myString) > maxNameLength then
  152.     theLength = maxNameLength + buttonPadding * 2
  153.   else
  154.     theLength = string.len(myString) + buttonPadding * 2
  155.   end
  156.  
  157.   return theLength
  158. end
  159.  
  160. function drawRuler(vert)
  161.   local toggle = true
  162.   for a=1,monX,1 do
  163.     mon.setCursorPos(a,vert)
  164.     if toggle then
  165.       mon.write(borderSymbol1)
  166.       toggle = false
  167.     else
  168.       mon.write(borderSymbol2)
  169.       toggle = true
  170.     end
  171.   end
  172. end
  173.  
  174. function drawLabels()
  175.   mon.setBackgroundColor(colors.black)
  176.  
  177.   if showPageNum then
  178.     if showTotalPages then
  179.       pLabel = curPage..pageSeparator..#pages
  180.     else
  181.       pLabel = curPage
  182.     end
  183.  
  184.     mon.setCursorPos(centerText(pLabel),1)
  185.     mon.write(pLabel)
  186.   end
  187.  
  188.   if drawBorders then
  189.     drawRuler(2)
  190.     drawRuler(monY - 1)
  191.   end
  192. end
  193.  
  194. function prevPage()
  195.   lastPage = curPage
  196.  
  197.   if eviction then
  198.     evictBook()
  199.   end
  200.  
  201.   pages[lastPage]:toggleButton(pageBack)
  202.   drawLabels()
  203.   os.sleep(0.125)
  204.  
  205.   curPage = curPage - 1
  206.   if curPage < 1 then
  207.     curPage = #pages
  208.   end
  209.   pages[lastPage]:toggleButton(pageBack)
  210.   drawLabels()
  211. end
  212.  
  213. function nextPage()
  214.   lastPage = curPage
  215.  
  216.   if eviction then
  217.     evictBook()
  218.   end
  219.  
  220.   pages[lastPage]:toggleButton(pageFore)
  221.   drawLabels()
  222.   os.sleep(0.125)
  223.  
  224.   curPage = curPage + 1
  225.   if curPage > #pages then
  226.     curPage = 1
  227.   end
  228.   pages[lastPage]:toggleButton(pageFore)
  229.   pages[curPage]:draw()
  230.   drawLabels()
  231. end
  232.  
  233. function doAction()
  234.   pages[curPage]:toggleButton(p1)
  235.   drawLabels()
  236.   for k,v in ipairs(names) do
  237.     if v["name"] == p1 then
  238.       curSlot = v["slot"]
  239.       break
  240.     end
  241.   end
  242.  
  243.   if eviction then
  244.     chest.pushItemIntoSlot(directionToEject,curSlot,1,1)
  245.     os.sleep(0.125)
  246.     refresh()
  247.     eviction = false
  248.   else
  249.     chest.pushItemIntoSlot(directionToPortal,curSlot,1,1)
  250.     os.sleep(portalDuration)
  251.     chest.pullItemIntoSlot(directionToPortal,1,1,curSlot)
  252.     pages[curPage]:toggleButton(p1)
  253.     drawLabels()
  254.   end
  255. end
  256.  
  257.  
  258. function refresh()
  259.   print("Collecting Names.")
  260.   populateNames()
  261.  
  262.   pages = {}
  263.  
  264.   local myPage = 1
  265.  
  266.   if #names > 0 then
  267.     while (myPage - 1) * namesPerPage < #names do
  268.       print("Populating page "..myPage..".")
  269.       buildPage(myPage)
  270.       myPage = myPage + 1
  271.     end
  272.   else
  273.     buildPage(1)
  274.   end
  275.  
  276.   if curPage > #pages then
  277.     curPage = #pages
  278.   end
  279.  
  280.   pages[curPage]:draw()
  281.   drawLabels()
  282. end
  283.  
  284. function rebuildPages()
  285.   pages[curPage]:toggleButton(resetButton)
  286.   drawLabels()
  287.   refresh()
  288. end
  289.  
  290. function evictBook()
  291.   pages[curPage]:toggleButton(ejectButton)
  292.   if eviction then
  293.     eviction = false
  294.   else
  295.     eviction = true
  296.   end
  297.   drawLabels()
  298. end
  299.  
  300. function buildPage(pN)
  301.   pages[pN] = touchpoint.new(monitorLocation)
  302.   pages[pN]:add(pageBack, prevPage, 1, 1, determineLength(pageBack), 1, iBC, aBC)
  303.   pages[pN]:add(pageFore, nextPage, monX - determineLength(pageFore) + 1, 1, monX, 1, iBC, aBC)
  304.  
  305.   if #names > 0 then
  306.     local curIndex = (pN - 1) * namesPerPage + 1
  307.     for y = 3, monY - 2, 2 do
  308.       if curIndex < #names + 1 then
  309.         pages[pN]:add(names[curIndex]["name"], doAction, 2, y, monMidL - 1 - centerPadding, y, iBC, aBC)
  310.       else
  311.         break
  312.       end
  313.       curIndex = curIndex + 1
  314.       if curIndex < #names + 1 then
  315.         pages[pN]:add(names[curIndex]["name"], doAction, monMidR + 1 + centerPadding, y, monX - 1, y, iBC, aBC)
  316.       else
  317.         break
  318.       end
  319.       curIndex = curIndex + 1
  320.     end
  321.   end
  322.  
  323.   pages[pN]:add(resetButton, rebuildPages, 1, monY, determineLength(resetButton), monY, iBC, aBC)
  324.   if showEject then
  325.     pages[pN]:add(ejectButton, evictBook, monX - determineLength(ejectButton) + 1, monY, monX, monY, iBC, aBC)
  326.   end
  327. end
  328.  
  329. prepareScreen()
  330. checkDirections()
  331.  
  332. if not problem then
  333.   initialPull()
  334.   refresh()
  335.   print("Starting main control loop.")
  336.   while true do
  337.     pages[curPage]:draw()
  338.     drawLabels()
  339.     event, p1 = pages[curPage]:handleEvents(os.pullEvent())
  340.     if event == "button_click" then
  341.       pages[curPage].buttonList[p1].func()
  342.     end
  343.   end
  344. end
Add Comment
Please, Sign In to add comment