]> git.lizzy.rs Git - dragonblocks3d-lua.git/blob - modules/MapGen/src/init.lua
Trees; Random Seed
[dragonblocks3d-lua.git] / modules / MapGen / src / init.lua
1 local stone = BlockSystem:get_def("game:stone")
2 local dirt = BlockSystem:get_def("game:dirt")
3 local grass = BlockSystem:get_def("game:grass")
4 local leaves = BlockSystem:get_def("game:leaves")
5 local tree = BlockSystem:get_def("game:tree")
6
7 math.randomseed(os.time())
8
9 function MapGen:generate(chunk)
10         local grass_layer_table, old_grass_layer_table
11         local grass_layer
12         for x = 0, 15 do
13                 grass_layer_table, old_grass_layer_table = {}, grass_layer_table
14                 grass_layer = old_grass_layer_table and old_grass_layer_table[1] or 8 + math.random(5)
15                 for z = 0, 15 do
16                         local old_grass_layer = old_grass_layer_table and old_grass_layer_table[z] or grass_layer
17                         grass_layer = math.floor((grass_layer + old_grass_layer) / 2)
18                         if math.random(3) == 1 then
19                                 grass_layer = grass_layer + math.random(3) - 2
20                         end
21                         grass_layer = glm.clamp(grass_layer, 0, 15)
22                         grass_layer_table[z] = grass_layer
23                         if math.random(25) == 1 then
24                                 chunk:add_block(glm.vec3(x, grass_layer, z), dirt)
25                                 self:add_tree(chunk, glm.vec3(x, grass_layer + 1, z))
26                         else
27                                 chunk:add_block(glm.vec3(x, grass_layer, z), grass)
28                         end
29                         local dirt_start, dirt_end = grass_layer - 1, math.max(grass_layer - 5, 0)
30                         local stone_start, stone_end = grass_layer - 6, 0
31                         if dirt_start >= 0 then
32                                 for y = dirt_start, dirt_end, -1  do
33                                         chunk:add_block(glm.vec3(x, y, z), dirt)
34                                 end
35                         end
36                         if stone_start >= 0 then
37                                 for y = stone_start, stone_end, -1  do
38                                         chunk:add_block(glm.vec3(x, y, z), stone)
39                                 end
40                         end
41                 end
42         end
43 end
44
45 local tree_blocks = {
46         glm.vec3( 0,  0,  0),
47         glm.vec3( 0,  1,  0),
48         glm.vec3(-1,  2, -1),
49         glm.vec3(-1,  2,  0),
50         glm.vec3(-1,  2,  1),
51         glm.vec3( 0,  2, -1),
52         glm.vec3( 0,  2,  0),
53         glm.vec3( 0,  2,  1),
54         glm.vec3( 1,  2, -1),
55         glm.vec3( 1,  2,  0),
56         glm.vec3( 1,  2,  1),
57         glm.vec3(-1,  3, -1),
58         glm.vec3(-1,  3,  0),
59         glm.vec3(-1,  3,  1),
60         glm.vec3( 0,  3, -1),
61         glm.vec3( 0,  3,  0),
62         glm.vec3( 0,  3,  1),
63         glm.vec3( 1,  3, -1),
64         glm.vec3( 1,  3,  0),
65         glm.vec3( 1,  3,  1),
66         glm.vec3(-1,  4, -1),
67         glm.vec3(-1,  4,  0),
68         glm.vec3(-1,  4,  1),
69         glm.vec3( 0,  4, -1),
70         glm.vec3( 0,  4,  0),
71         glm.vec3( 0,  4,  1),
72         glm.vec3( 1,  4, -1),
73         glm.vec3( 1,  4,  0),
74         glm.vec3( 1,  4,  1),
75 }
76
77 function MapGen:add_tree(chunk, tree_pos)
78         for i, p in ipairs(tree_blocks) do
79                 local block = leaves
80                 if i < 3 then
81                         block = tree
82                 end
83                 local pos = tree_pos + p
84                 if chunk:get_pos_hash(pos) then
85                         chunk:add_block(pos, block)
86                 end
87         end
88 end