# CellurarCaves (better)

Apr 26th, 2017
97
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
1. local CHANCE_TO_START_ALIVE = 450
2. local BIRTH_LIMIT = 5
3. local DEATH_LIMIT = 5
4. local STEPS = 6
5.
6. local distance = 40
7. local pointSize = 16
8.
9. function generateCave()
10.     if MapFeatureSize then distance = MapFeatureSize*2 end
11.
12.   x = GetRandom(4096)
13.   y = GetRandom(2048)
14.
15.   local world = {}
16.
17.   initializeWord(world)
18.
19.   for i=1, STEPS do
20.     world = simulationStep(world)
21.   end
22.
23.   local x = 1
24.   local y = 1
25.
26.   while x <= 4096/distance do
27.     while y <= 2048/distance do
28.       if world[x][y] then
29.         AddPoint((x-1) * distance + distance/2, (y-1) * distance + distance/2, pointSize)
30.       end
31.
32.       y = y+1
33.     end
34.
35.     x = x+1
36.     y = 1
37.   end
38.
39.   local distance2 = distance*2
40.
41.   x = 1
42.   y = 1
43.
44.   while x <= 4096/distance2 do
45.     while y <= 2048/distance2 do
46.       local average = 0
47.       if world[x*2][y*2] then average = average+1 end
48.       if world[x*2+1][y*2] then average = average+1 end
49.       if world[x*2+1][y*2+1] then average = average+1 end
50.       if world[x*2+1][y*2] then average = average+1 end
51.
52.       if average >= 2 then
53.         AddPoint((x*2-2) * distance + distance/2, (y*2-1) * distance + distance/2, pointSize/2)
54.         AddPoint((x*2-2) * distance + distance/2, (y*2-2) * distance + distance/2, pointSize/2)
55.         AddPoint((x*2-1) * distance + distance/2, (y*2-2) * distance + distance/2, pointSize/2)
56.         AddPoint((x*2-1) * distance + distance/2, (y*2-1) * distance + distance/2, pointSize/2)
57.       end
58.
59.       y = y+1
60.     end
61.
62.     x = x+1
63.     y = 1
64.   end
65.
66.     FlushPoints()
67. end
68.
69. function initializeWord(world)
70.   local x = 1
71.   local y = 1
72.
73.   while x <= 4096/distance do
74.     table.insert(world, {})
75.
76.     while y <= 2048/distance do
77.       if GetRandom(1000) < CHANCE_TO_START_ALIVE then
78.         table.insert(world[x], true)
79.       else
80.         table.insert(world[x], false)
81.       end
82.
83.       y = y+1
84.     end
85.
86.     x = x+1
87.     y = 1
88.   end
89. end
90.
91. function simulationStep(world)
92.   local x = 1
93.   local y = 1
94.   world2 = {}
95.
96.   while x <= 4096/distance do
97.     table.insert(world2, {})
98.
99.     while y <= 2048/distance do
100.       local count = countNeigbours(world, x, y)
101.
102.       if world[x][y] then
103.         if count < DEATH_LIMIT then
104.           table.insert(world2[x], false)
105.         else
106.           table.insert(world2[x], true)
107.         end
108.       else
109.         if count > BIRTH_LIMIT then
110.           table.insert(world2[x], true)
111.         else
112.           table.insert(world2[x], false)
113.         end
114.       end
115.
116.       y = y+1
117.     end
118.
119.     x = x+1
120.     y = 1
121.   end
122.
123.   return world2
124. end
125.
126. function countNeigbours(world, x, y)
127.   count = 0
128.
129.   for dx=1, 3 do
130.     for dy=1, 3 do
131.       local x2 = x+dx-2
132.       local y2 = y+dy-2
133.
134.       if x2 == 0 or x2 > 4096/distance or y2 == 0 or y2 > 2048/distance or world[x2][y2] then
135.         count = count + 1
136.       end
137.     end
138.   end
139.
140.   return count
141. end
142.
143. function onGameInit()
144.     MapGen = mgDrawn
145.     TemplateFilter = 0
146.     generateCave()
147. end
148.
149. function onPreviewInit()
150.     onGameInit()
151. end
RAW Paste Data