Advertisement
kenik

mazegen.lua

Nov 30th, 2019
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.02 KB | None | 0 0
  1. -- Генерация лабиринта и сохранение модели для робота-строителя
  2. -- @author kenik
  3. local alg = require("wilson_a")
  4.  
  5. local function generateFileHead(f, name)
  6.   f:write("title:string=" .. name .. "\n")
  7.   f:write("author:string=kenik's maze generator\n")
  8.   f:write("mats:table={\n")
  9.   f:write("  x:string=cobblestone\n")
  10.   f:write("}\n")
  11.   f:write("levels:list=[\n")
  12. end
  13.  
  14. local function generateTableHead(f, name)
  15.   f:write("  table={\n")
  16.   f:write("    name:string=" .. name .. "\n")
  17.   f:write("    blocks:list=[\n")
  18. end
  19.  
  20. local function generateTableFooter(f)
  21.   f:write("    ]\n")
  22.   f:write("  }\n")
  23. end
  24.  
  25. local function generateFileLevel(f, n, tbl)
  26.   generateTableHead(f, "level " .. n)
  27.  
  28.   local first_row = "      string= "
  29.   local last_row = "      string=x"
  30.   local empty_row = "      string= "
  31.   local half = #tbl // 2 + 1
  32.   for num = 1, #tbl do
  33.     empty_row = empty_row .. "  "
  34.     first_row = first_row .. ( (n == 2 and num == half) and "v" or "  ")
  35.     last_row = last_row .. "xx"
  36.   end
  37.   empty_row = empty_row .. "\n"
  38.   first_row = first_row .. " \n"
  39.   last_row = last_row .. "\n"
  40.   f:write(first_row)
  41.   f:write(empty_row)
  42.   f:write(last_row)
  43.  
  44.   for _, item in pairs(tbl) do
  45.     local row = "      string=x"
  46.     local second_row = "      string=x"
  47.     for _, letter in pairs(item) do
  48.       row = row .. " " .. (letter["right_wall"] and "x" or " ")
  49.       second_row = second_row .. (letter["bottom_wall"] and "x" or " ") .. (letter["right_wall"] and "x" or " ")
  50.     end
  51.     row = row .. "\n"
  52.     second_row = second_row .. "\n"
  53.  
  54.     f:write(row)
  55.     f:write(second_row)
  56.   end
  57.  
  58.   f:write(last_row)
  59.  
  60.   generateTableFooter(f)
  61. end
  62.  
  63. local function generateFileFloor(f, tbl)
  64.   generateTableHead(f, "floor")
  65.  
  66.   local last_row = "      string=x"
  67.   local empty_row = "      string= "
  68.  
  69.   for num = 1, #tbl do
  70.     empty_row = empty_row .. "  "
  71.     last_row = last_row .. "xx"
  72.   end
  73.   empty_row = empty_row .. "\n"
  74.   last_row = last_row .. "\n"
  75.   f:write(empty_row)
  76.   f:write(empty_row)
  77.   f:write(last_row)
  78.  
  79.   for _, item in pairs(tbl) do
  80.     f:write(last_row)
  81.     f:write(last_row)
  82.   end
  83.  
  84.   f:write(last_row)
  85.  
  86.   generateTableFooter(f)
  87. end
  88.  
  89. local function generateFileFooter(f)
  90.   f:write("]\n")
  91. end
  92.  
  93. local args = {...}
  94. local newfile, width, height, depth
  95.  
  96. if #args < 1 then
  97. print("Input new file name:")
  98.   newfile = io.read()
  99. else
  100.   newfile = args[1]
  101. end
  102.  
  103. if #args < 2 then
  104.   print("Input maze width:")
  105.   width = io.read()
  106. else
  107.   width = args[2]
  108. end
  109.  
  110. if #args < 3 then
  111.   print("Input maze height:")
  112.   height = io.read()
  113. else
  114.   height = args[3]
  115. end
  116.  
  117. if #args < 4 then
  118.   print("Input maze depth:")
  119.   depth = io.read()
  120. else
  121.   depth = args[4]
  122. end
  123.  
  124. local f = io.open(newfile .. ".model","w")
  125.  
  126. local maze = alg.createMaze(1, 1, width, height)
  127.  
  128. -- f:write(dump(maze))
  129. generateFileHead(f, newfile)
  130.  
  131. generateFileFloor(f, maze)
  132.  
  133. for n=1, depth do
  134.   generateFileLevel(f, n, maze)
  135. end
  136.  
  137. generateFileFooter(f)
  138.  
  139. f:close()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement