Advertisement
CaptainSpaceCat

Procedural R&D

Jun 25th, 2015
342
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 9.44 KB | None | 0 0
  1. local w, h = term.getSize()
  2. local midW, midH = math.floor(w/2), math.floor(h/2)
  3. local rooms = {
  4.     [1] = {false, true, true, true},
  5.     [2] = {true, false, true, true},
  6.     [3] = {true, true, false, true},
  7.     [4] = {true, true, true, false},
  8.     [5] = {false, false, true, true},
  9.     [6] = {true, false, false, true},
  10.     [7] = {true, true, false, false},
  11.     [8] = {false, true, true, false},
  12.     [9] = {false, true, false, true},
  13.     [10] = {true, false, true, false},
  14.     [11] = {false, false, false, true},
  15.     [12] = {true, false, false, false},
  16.     [13] = {false, true, false, false},
  17.     [14] = {false, false, true, false},
  18.     [15] = {false, false, false, false}
  19. }
  20.  
  21. --[[local available = {
  22.     ["1"] = {1},
  23.     ["2"] = {2},
  24.     ["3"] = {3},
  25.     ["4"] = {4},
  26.     ["12"] = {1, 2, 5},
  27.     ["23"] = {2, 3, 6},
  28.     ["34"] = {3, 4, 7},
  29.     ["14"] = {1, 4, 8},
  30.     ["13"] = {1, 3, 9},
  31.     ["24"] = {2, 4, 10},
  32.     ["123"] = {1, 2, 3, 5, 6, 11},
  33.     ["234"] = {2, 3, 4, 6, 7, 12},
  34.     ["134"] = {1, 3, 4, 7, 8, 13},
  35.     ["124"] = {1, 2, 4, 5, 8, 14},
  36.     ["1234"] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}
  37. }]]
  38.  
  39. local available = {
  40.     ["1"] = {1},
  41.     ["2"] = {2},
  42.     ["3"] = {3},
  43.     ["4"] = {4},
  44.     ["12"] = {1, 2},
  45.     ["23"] = {2, 3},
  46.     ["34"] = {3, 4},
  47.     ["14"] = {1, 4},
  48.     ["13"] = {1, 3},
  49.     ["24"] = {2, 4},
  50.     ["123"] = {1, 2, 3},
  51.     ["234"] = {2, 3, 4},
  52.     ["134"] = {1, 3, 4},
  53.     ["124"] = {1, 2, 4},
  54.     ["1234"] = {1, 2, 3, 4}
  55. }
  56.  
  57. local surroundTab = {
  58.     "____###########################################____",
  59.     "__########                               ########__",
  60.     "_#####                                       #####_",
  61.     "_###                                           ###_",
  62.     "###                                             ###",
  63.     "###                                             ###",
  64.     "##                                               ##",
  65.     "##                                               ##",
  66.     "##                                               ##",
  67.     "##                                               ##",
  68.     "##                                               ##",
  69.     "##                                               ##",
  70.     "##                                               ##",
  71.     "###                                             ###",
  72.     "###                                             ###",
  73.     "_###                                           ###_",
  74.     "_#####                                       #####_",
  75.     "__########                               ########__",
  76.     "____###########################################____",
  77. }
  78.  
  79. function draw(words,x,y,txtcol,backcol)
  80.         local w,h = term.getSize()
  81.         words = tostring(words)
  82.         words = words or ""
  83.         txtcol = txtcol or colors.white
  84.         backcol = backcol or colors.black
  85.         term.setCursorPos(x, y)
  86.         term.setTextColor(txtcol)
  87.         term.setBackgroundColor(backcol)
  88.         write(words)
  89. end
  90.  
  91.  
  92. function mazeGenProcedural(mapW, mapH)
  93.         local maze = {}
  94.     local list = {}
  95.         for x = 1, mapW do
  96.                 maze[x] = {}
  97.                 for y = 1, mapH do
  98.                         maze[x][y] = {}
  99.             list[#list + 1] = {x, y}
  100.                         for i = 1, 4 do
  101.                                 maze[x][y][i] = true
  102.                         end
  103.                 end
  104.         end
  105.     while #list > 0 do
  106.         local current = table.remove(list, math.random(1, #list))
  107.         local usableCells = ""
  108.         if current[2] > 1 and not (maze[current[1]][current[2] - 1][1] and maze[current[1]][current[2] - 1][2] and maze[current[1]][current[2] - 1][3] and maze[current[1]][current[2] - 1][4]) then
  109.             usableCells = usableCells .. "1"
  110.         end
  111.         if current[1] < mapW and not (maze[current[1] + 1][current[2]][1] and maze[current[1] + 1][current[2]][2] and maze[current[1] + 1][current[2]][3] and maze[current[1] + 1][current[2]][4]) then
  112.             usableCells = usableCells .. "2"
  113.         end
  114.         if current[2] < mapH and not (maze[current[1]][current[2] + 1][1] and maze[current[1]][current[2] + 1][2] and maze[current[1]][current[2] + 1][3] and maze[current[1]][current[2] + 1][4]) then
  115.             usableCells = usableCells .. "3"
  116.         end
  117.         if current[1] > 1 and not (maze[current[1] - 1][current[2]][1] and maze[current[1] - 1][current[2]][2] and maze[current[1] - 1][current[2]][3] and maze[current[1] - 1][current[2]][4]) then
  118.             usableCells = usableCells .. "4"
  119.         end
  120.         if usableCells == "" then
  121.             if current[2] > 1 then
  122.                 usableCells = usableCells .. "1"
  123.             elseif current[1] < mapW then
  124.                 usableCells = usableCells .. "2"
  125.             elseif current[2] < mapH then
  126.                 usableCells = usableCells .. "3"
  127.             elseif current[1] > 1 then
  128.                 usableCells = usableCells .. "4"
  129.             end
  130.         end
  131.         usableCells = rooms[available[usableCells][math.random(1, #available[usableCells])]]
  132.         for i = 1, 4 do
  133.             if maze[current[1]][current[2]][i] then
  134.                 maze[current[1]][current[2]][i] = usableCells[i]   
  135.             end
  136.             if not usableCells[i] then
  137.                 if current[2] > 1 and i == 1 then
  138.                     maze[current[1]][current[2] - 1][3] = false
  139.                 elseif current[1] < mapW and i == 2 then
  140.                     maze[current[1] + 1][current[2]][4] = false
  141.                 elseif current[2] < mapH and i == 3 then
  142.                     maze[current[1]][current[2] + 1][1] = false
  143.                 elseif current[1] > 1 and i == 4 then
  144.                     maze[current[1] - 1][current[2]][2] = false
  145.                 end
  146.             end
  147.         end
  148.     end
  149.     for x, v in pairs(maze) do
  150.         for y, e in pairs(v) do
  151.             if e[1] and e[2] and e[3] and e[4] then
  152.                 maze[x][y] = {false, false, false, false}
  153.             end
  154.         end
  155.     end
  156.     local gen = maze
  157.         maze = {}
  158.         for i = 1, mapW*2 + 1 do
  159.                 maze[i] = {}
  160.         end
  161.         for i = 1, mapH*2 + 1 do
  162.                 maze[1][i] = 2^15
  163.                 maze[mapW*2 + 1][i] = 2^15
  164.         end
  165.         for x = 2, mapW*2 do
  166.                 for y = 1, mapH*2 + 1 do
  167.                         if y == 1 or y == mapH*2 + 1 then
  168.                                 maze[x][y] = 2^15
  169.                         elseif x%2 == 0 and y%2 == 0 then
  170.                                 maze[x][y] = 128
  171.                         elseif x%2 == 1 and y%2 == 1 then
  172.                                 maze[x][y] = 2^15
  173.                         else
  174.                 if x%2 == 0 then
  175.                                         if gen[x/2][(y - 1)/2][2] and gen[x/2][(y + 1)/2][4] then
  176.                                                 maze[x][y] = 2^15
  177.                                         else
  178.                                                 maze[x][y] = 128
  179.                                         end
  180.                                 elseif x%2 == 1 then
  181.                                         if gen[(x - 1)/2][y/2][3] and gen[(x + 1)/2][y/2][1] then
  182.                                                 maze[x][y] = 2^15
  183.                                         else
  184.                                                 maze[x][y] = 128
  185.                                         end
  186.                                 end
  187.                         end
  188.                 end
  189.         end
  190.     local map = {}
  191.     for x, v in pairs(maze) do
  192.         for i = 0, 9 do
  193.             map[x*10 - i] = {}
  194.         end
  195.         for y, e in pairs(v) do
  196.             for i = 0, 9 do
  197.                 for n = 0, 9 do
  198.                     map[x*10 - i][y*10 - n] = e
  199.                 end
  200.             end
  201.         end
  202.     end
  203.  
  204.     return maze, map
  205. end
  206.  
  207. local maze, map = mazeGenProcedural(24, 8)
  208. local imgLocation = {34, 14}
  209. local pLocation = {{34, 14}, {35, 15}}
  210. local feet = {2, 1}
  211. local changeFeet, changeMap = true, true
  212.  
  213. function eventHandler(events)
  214.     if events[1] == "key" then
  215.         if events[2] == keys.up and map[pLocation[feet[2]][1]][pLocation[feet[2]][2] - 2] ~= 2^15 then
  216.             pLocation[feet[2]][2] = pLocation[feet[2]][2] - 2
  217.             imgLocation[2] = imgLocation[2] - 1
  218.             changeFeet = true
  219.         elseif events[2] == keys.down and map[pLocation[feet[1]][1]][pLocation[feet[1]][2] + 2] ~= 2^15 then
  220.             pLocation[feet[1]][2] = pLocation[feet[1]][2] + 2
  221.             imgLocation[2] = imgLocation[2] + 1
  222.             changeFeet = true
  223.         elseif events[2] == keys.left and map[pLocation[feet[2]][1] - 2][pLocation[feet[2]][2]] ~= 2^15 then
  224.             pLocation[feet[2]][1] = pLocation[feet[2]][1] - 2
  225.             imgLocation[1] = imgLocation[1] - 1
  226.             changeFeet = true
  227.         elseif events[2] == keys.right and map[pLocation[feet[1]][1] + 2][pLocation[feet[1]][2]] ~= 2^15 then
  228.             pLocation[feet[1]][1] = pLocation[feet[1]][1] + 2
  229.             imgLocation[1] = imgLocation[1] + 1
  230.             changeFeet = true
  231.         end
  232.     end
  233. end
  234.  
  235. function drawRelevantImage(xPos, yPos, img)
  236.     local xSurround = 1
  237.     local ySurround = 1
  238.     for x = xPos < midW and 1 or xPos - midW + 1, xPos + midW < #img and xPos + midW + 1 or #img do
  239.         for y = yPos < midH and 1 or yPos - midH + 1, yPos + midH < #img[x] and yPos + midH + 1 or #img[x] do
  240.             term.setCursorPos(x + midW - xPos, y + midH - yPos)
  241.             term.setTextColor(colors.black)
  242.             if surroundTab[ySurround]:sub(xSurround, xSurround) == "_" then
  243.                 term.setBackgroundColor(colors.black)
  244.                 term.write(" ")
  245.             else
  246.                 term.setBackgroundColor(img[x][y])
  247.                 term.write(surroundTab[ySurround]:sub(xSurround, xSurround))
  248.             end
  249.             ySurround = ySurround + 1
  250.         end
  251.         xSurround = xSurround + 1
  252.         ySurround = 1
  253.     end
  254. end
  255.  
  256. while true do
  257.     if changeMap then
  258.         drawRelevantImage(imgLocation[1], imgLocation[2], map)
  259.         changeMap = false
  260.     end
  261.     if changeFeet then
  262.         if feet[1] == 1 then
  263.             feet = {2, 1}
  264.         else
  265.             feet = {1, 2}
  266.         end
  267.         draw(" ", midW + feet[1] - 1, midH, _, colors.lightBlue)
  268.         draw(" ", midW + feet[2] - 1, midH + 1, _, colors.lightBlue)
  269.         changeFeet = false
  270.     end
  271.     local events = {os.pullEvent()}
  272.     local tempMotion = {imgLocation[1], imgLocation[2]}
  273.     eventHandler(events)
  274.     if tempMotion[1] ~= imgLocation[1] or tempMotion[2] ~= imgLocation[2] then
  275.         changeMap = true
  276.     end
  277. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement