fun_caves/fortress.lua
2016-05-26 10:10:36 -05:00

77 lines
2 KiB
Lua

fun_caves.fortress = function(node, data, area, minp, maxp, level)
local n = 16
local walls = {}
local a, b, c, i, j, u, v, x, y, z, ivm, set, dox, doz
for y2 = 0, n-1 do
--for y2 = 0, 0 do
-- walls is zero-based.
for i = 0, 2 * n * n - 1 do
walls[i] = i
end
table.shuffle(walls)
dox, doz = math.random(0, n-1), math.random(0, n-1)
for z = minp.z, maxp.z do
for y = minp.y + y2 * 5, minp.y + y2 * 5 + 4 do
ivm = area:index(minp.x, y, z)
for x = minp.x, maxp.x do
if (y - minp.y) % 5 == 0 then
if math.floor((z - minp.z) / 5) == doz and math.floor((x - minp.x) / 5) == dox and (z - minp.z) % 5 ~= 0 and (x - minp.x) % 5 ~= 0 and y ~= minp.y then
data[ivm] = node("air")
else
data[ivm] = node('default:steelblock')
end
elseif x == minp.x or z == minp.z or x == maxp.x or z == maxp.z then
data[ivm] = node('default:steelblock')
elseif (z - minp.z) % 5 == 0 or (x - minp.x) % 5 == 0 then
data[ivm] = node("default:sandstone")
else
data[ivm] = node("air")
end
ivm = ivm + 1
end
end
end
set = unionfind(n * n)
for m = 0, #walls do
c = walls[m]
a = math.floor(c / 2)
i = a % n
j = math.floor(a / n)
u = c % 2 == 0 and 1 or 0
v = c % 2 == 1 and 1 or 0
b = a + u + n * v
if i < n - u and j < n - v and set:find(a) ~= set:find(b) then
set:union(a, b)
x = (i + u) * 5 + minp.x
y = minp.y + y2 * 5
z = (j + v) * 5 + minp.z
--if y > minp.y and math.random(20) == 1 then
-- for z1 = z + 1, z + 4 do
-- ivm = area:index(x+1, y, z1)
-- for x1 = x + 1, x + 4 do
-- data[ivm] = node("air")
-- ivm = ivm + 1
-- end
-- end
--end
for z1 = z + (1-v), z + (1-v) * 4 do
for y1 = y + 1, y + 4 do
ivm = area:index(x + (1-u), y1, z1)
for x1 = x + (1-u), x + (1-u) * 4 do
if x1 < maxp.x and z1 < maxp.z and x1 > minp.x and z1 > minp.z then
data[ivm] = node("air")
end
ivm = ivm + 1
end
end
end
end
end
end
end