Larvix

map/map

Dec 19th, 2023 (edited)
807
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 5.93 KB | None | 0 0
  1. -- Initialize variables
  2. args = {...}
  3. termW, termH = term.getSize()
  4.  
  5. if not size then
  6.     if args[2] then
  7.         size = tonumber(args[2])
  8.     else
  9.         size = 17
  10.     end
  11. end
  12. if not level then
  13.     if args[1] then
  14.         level = tonumber(args[1])
  15.     else
  16.         level = 0
  17.     end
  18. end
  19.  
  20. -- Data validation
  21. checkVars = function()
  22.     -- Make size odd
  23.     size = (math.floor(size / 2) * 2) + 1
  24.     -- Limit size
  25.     if size > 17 then
  26.         size = 17
  27.     elseif size < 1 then
  28.         size = 1
  29.     end
  30.     -- Limit level
  31.     if level < -8 then
  32.         level = -8
  33.     elseif level > 8 then
  34.         level = 8
  35.     end
  36. end
  37.  
  38. -- Create map table
  39. getMap = function()
  40.     map = {}
  41.     for row = 1, 17 do
  42.         local rows = {}
  43.         for col = 1, 17 do
  44.             table.insert(rows, {tile = "#", selected = false})
  45.         end
  46.         table.insert(map, rows)
  47.     end
  48. end
  49.  
  50.  
  51. drawMap = function()
  52.     -- Ensure map fits
  53.     trim = 0
  54.     offset = math.floor((17-size)/2) - math.floor((termH-size)/2)
  55.     if termH > 17 then
  56.         trim = 0
  57.         offset = 0
  58.     elseif termH < size + 1 then
  59.         trim = math.ceil((size - termH) / 2)
  60.         offset = math.floor((17 - size) / 2)
  61.     end
  62.  
  63.     -- Draw map
  64.     term.clear()
  65.     for row = 9 - ((size-1)/2) + trim, 9 + ((size-1)/2) - trim do
  66.         for col = 9 - (size-1)/2, 9 + (size-1)/2 do
  67.             termX = (2 * col) - 1
  68.             termY = row - trim - offset
  69.             map[row][col].tPos = termX .. ":" .. termY
  70.             map[row][col].pos = row .. ":" .. col
  71.             term.setCursorPos(termX, termY)
  72.             if map[row][col].selected then
  73.                 write("X")
  74.             else write(map[row][col].tile) end
  75.         end
  76.     end
  77.  
  78.     -- Display useless information
  79.     if size > 9 then
  80.         disSize = "S:" .. size
  81.     else
  82.         disSize = "S: " .. size
  83.     end
  84.  
  85.     if level < 0 then
  86.         disLevel = "Y:" .. level
  87.     else
  88.         disLevel = "Y: " .. level
  89.     end
  90.  
  91.     term.setCursorPos(termW - #disSize + 1, 1)
  92.     write(disSize)
  93.     term.setCursorPos(termW - #disLevel + 1, 2)
  94.     write(disLevel)
  95.  
  96.     term.setCursorPos(1, termH)
  97.     term.clearLine()
  98.    
  99.     countS = 0
  100.     for r = 1,#map do
  101.         for c = 1,#map[r] do
  102.             if map[r][c].selected then
  103.                 countS = countS + 1
  104.                 selected = map[r][c].pos
  105.             end
  106.         end
  107.     end
  108.     if countS > 1 then
  109.         write(countS .. " Selected")
  110.     elseif countS == 1 then
  111.         write(selected .. " Selected")
  112.     end
  113. end
  114.  
  115. -- Main loop
  116. getMap()
  117. while true do
  118.     checkVars()
  119.     drawMap()
  120.     evt, e1, e2, e3 = os.pullEvent()
  121.     if evt == "key" then
  122.         -- Spacebar to clear selection
  123.         if e1 == keys.space then
  124.             for r = 1,#map do
  125.                 for c = 1,#map[r] do
  126.                     if map[r][c].selected then
  127.                         map[r][c].selected = false
  128.                     end
  129.                 end
  130.             end
  131.         -- Arrows to change level and size
  132.         elseif e1 == keys.up then
  133.             level = level+1
  134.         elseif e1 == keys.down then
  135.             level = level-1
  136.         elseif e1 == keys.left then
  137.             size = size-2
  138.         elseif e1 == keys.right then
  139.             size = size+2
  140.         -- Hold Left Ctrl to Multi-select
  141.         elseif e1 == keys.leftCtrl then
  142.             selecting = true
  143.             while selecting == true do
  144.                 sEvt,eA,eB,eC = os.pullEvent()
  145.                 if sEvt == "mouse_click" and eA == 1 then
  146.                 for r = 1,#map do
  147.                     for c = 1,#map[r] do
  148.                         if map[r][c].tPos == eB..":"..eC then
  149.                             if map[r][c].selected then
  150.                                 map[r][c].selected = false
  151.                             else
  152.                                 map[r][c].selected = true
  153.                             end
  154.                             drawMap()
  155.                         end
  156.                     end
  157.                 end
  158.                 elseif eA == keys.leftCtrl and sEvt == "key_up" then
  159.                 selecting = false end
  160.             end
  161.         end
  162.     elseif evt == "mouse_click" then
  163.         -- Left click to single select
  164.         if e1 == 1 then
  165.             for r = 1,#map do
  166.                 for c = 1,#map[r] do
  167.                     if map[r][c].tPos == e2..":"..e3 then
  168.                         if not map[r][c].selected then
  169.                             for r = 1,#map do
  170.                                 for c = 1,#map[r] do
  171.                                     if map[r][c].selected then
  172.                                         map[r][c].selected = false
  173.                                     end
  174.                                 end
  175.                             end
  176.                             map[r][c].selected = true
  177.                         end
  178.                     end
  179.                 end
  180.             end
  181.         -- Right click to mass-select
  182.         elseif e1 == 2 then
  183.             startX = nil
  184.             startY = nil
  185.             endX = nil
  186.             endY = nil
  187.             for r = 1,#map do
  188.                 for c = 1,#map[r] do
  189.                     if map[r][c].tPos == e2..":"..e3 then
  190.                         pos = map[r][c].pos
  191.                         startX = pos:sub(1,string.find(pos,":")-1)
  192.                         startY = pos:sub(string.find(pos,":")+1,#pos)
  193.                         term.setCursorPos(1,termH)
  194.                         term.clearLine()
  195.                         write("Mass-selecting from "..pos)
  196.                         pos = map[r][c].tPos
  197.                         xPos = pos:sub(1,string.find(pos,":")-1)
  198.                         yPos = pos:sub(string.find(pos,":")+1,#pos)
  199.                         term.setCursorPos(tonumber(xPos),tonumber(yPos))
  200.                         write("x")
  201.                     end
  202.                 end
  203.             end
  204.             sEvt, eA, eB, eC = os.pullEvent("mouse_click")
  205.             if eA == 2 then
  206.                 for r = 1,#map do
  207.                     for c = 1,#map[r] do
  208.                         if map[r][c].tPos == eB..":"..eC then
  209.                             pos = map[r][c].pos
  210.                             endX = pos:sub(1,string.find(pos,":")-1)
  211.                             endY = pos:sub(string.find(pos,":")+1,#pos)
  212.                         end
  213.                     end
  214.                 end
  215.                 if startX and endX and startY and endY then
  216.                     if startX > endX then
  217.                         tmp = startX
  218.                         startX = endX
  219.                         endX = tmp
  220.                     end
  221.                     if startY > endY then
  222.                         tmp = startY
  223.                         startY = endY
  224.                         endY = tmp
  225.                     end
  226.                     for r = startX,endX do
  227.                         for c = startY,endY do
  228.                             if not map[r][c].selected then
  229.                                 map[r][c].selected = true
  230.                             end
  231.                         end
  232.                     end
  233.                 end
  234.             end
  235.         end
  236.     end
  237. end
Advertisement
Add Comment
Please, Sign In to add comment