Default: Add improved mgv5/mgv7 tree schematics
[oweals/minetest_game.git] / mods / default / mapgen.lua
1 --
2 -- Aliases for map generator outputs
3 --
4
5
6 minetest.register_alias("mapgen_stone", "default:stone")
7 minetest.register_alias("mapgen_dirt", "default:dirt")
8 minetest.register_alias("mapgen_dirt_with_grass", "default:dirt_with_grass")
9 minetest.register_alias("mapgen_sand", "default:sand")
10 minetest.register_alias("mapgen_water_source", "default:water_source")
11 minetest.register_alias("mapgen_river_water_source", "default:river_water_source")
12 minetest.register_alias("mapgen_lava_source", "default:lava_source")
13 minetest.register_alias("mapgen_gravel", "default:gravel")
14 minetest.register_alias("mapgen_desert_stone", "default:desert_stone")
15 minetest.register_alias("mapgen_desert_sand", "default:desert_sand")
16 minetest.register_alias("mapgen_dirt_with_snow", "default:dirt_with_snow")
17 minetest.register_alias("mapgen_snowblock", "default:snowblock")
18 minetest.register_alias("mapgen_snow", "default:snow")
19 minetest.register_alias("mapgen_ice", "default:ice")
20 minetest.register_alias("mapgen_sandstone", "default:sandstone")
21
22 minetest.register_alias("mapgen_tree", "default:tree")
23 minetest.register_alias("mapgen_leaves", "default:leaves")
24 minetest.register_alias("mapgen_apple", "default:apple")
25 minetest.register_alias("mapgen_jungletree", "default:jungletree")
26 minetest.register_alias("mapgen_jungleleaves", "default:jungleleaves")
27 minetest.register_alias("mapgen_junglegrass", "default:junglegrass")
28 minetest.register_alias("mapgen_pinetree", "default:pinetree")
29 minetest.register_alias("mapgen_pine_needles", "default:pine_needles")
30
31 minetest.register_alias("mapgen_cobble", "default:cobble")
32 minetest.register_alias("mapgen_stair_cobble", "stairs:stair_cobble")
33 minetest.register_alias("mapgen_mossycobble", "default:mossycobble")
34 minetest.register_alias("mapgen_sandstonebrick", "default:sandstonebrick")
35 minetest.register_alias("mapgen_stair_sandstonebrick", "stairs:stair_sandstonebrick")
36
37
38 --
39 -- Register ores
40 --
41
42
43 -- Blob ore first to avoid other ores inside blobs
44
45 function default.register_ores()
46         minetest.register_ore({ 
47                 ore_type         = "blob",
48                 ore              = "default:clay",
49                 wherein          = {"default:sand"},
50                 clust_scarcity   = 24 * 24 * 24,
51                 clust_size       = 7,
52                 y_min            = -15,
53                 y_max            = 0,
54                 noise_threshhold = 0,
55                 noise_params     = {
56                         offset = 0.35,
57                         scale = 0.2,
58                         spread = {x = 5, y = 5, z = 5},
59                         seed = -316,
60                         octaves = 1,
61                         persist = 0.5
62                 },
63         })
64
65         minetest.register_ore({ 
66                 ore_type         = "blob",
67                 ore              = "default:sand",
68                 wherein          = {"default:stone"},
69                 clust_scarcity   = 24 * 24 * 24,
70                 clust_size       = 7,
71                 y_min            = -63,
72                 y_max            = 4,
73                 noise_threshhold = 0,
74                 noise_params     = {
75                         offset = 0.35,
76                         scale = 0.2,
77                         spread = {x = 5, y = 5, z = 5},
78                         seed = 2316,
79                         octaves = 1,
80                         persist = 0.5
81                 },
82         })
83
84         minetest.register_ore({
85                 ore_type         = "blob",
86                 ore              = "default:dirt",
87                 wherein          = {"default:stone"},
88                 clust_scarcity   = 24 * 24 * 24,
89                 clust_size       = 7,
90                 y_min            = -63,
91                 y_max            = 31000,
92                 noise_threshhold = 0,
93                 noise_params     = {
94                         offset = 0.35,
95                         scale = 0.2,
96                         spread = {x = 5, y = 5, z = 5},
97                         seed = 17676,
98                         octaves = 1,
99                         persist = 0.5
100                 },
101         })
102
103         minetest.register_ore({
104                 ore_type         = "blob",
105                 ore              = "default:gravel",
106                 wherein          = {"default:stone"},
107                 clust_scarcity   = 24 * 24 * 24,
108                 clust_size       = 7,
109                 y_min            = -31000,
110                 y_max            = 31000,
111                 noise_threshhold = 0,
112                 noise_params     = {
113                         offset = 0.35,
114                         scale = 0.2,
115                         spread = {x = 5, y = 5, z = 5},
116                         seed = 766,
117                         octaves = 1,
118                         persist = 0.5
119                 },
120         })
121
122         minetest.register_ore({
123                 ore_type       = "scatter",
124                 ore            = "default:stone_with_coal",
125                 wherein        = "default:stone",
126                 clust_scarcity = 8 * 8 * 8,
127                 clust_num_ores = 8,
128                 clust_size     = 3,
129                 y_min          = -31000,
130                 y_max          = 64,
131         })
132
133         minetest.register_ore({
134                 ore_type       = "scatter",
135                 ore            = "default:stone_with_coal",
136                 wherein        = "default:stone",
137                 clust_scarcity = 24 * 24 * 24,
138                 clust_num_ores = 27,
139                 clust_size     = 6,
140                 y_min          = -31000,
141                 y_max          = 0,
142         })
143
144         minetest.register_ore({
145                 ore_type       = "scatter",
146                 ore            = "default:stone_with_iron",
147                 wherein        = "default:stone",
148                 clust_scarcity = 12 * 12 * 12,
149                 clust_num_ores = 3,
150                 clust_size     = 2,
151                 y_min          = -15,
152                 y_max          = 2,
153         })
154
155         minetest.register_ore({
156                 ore_type       = "scatter",
157                 ore            = "default:stone_with_iron",
158                 wherein        = "default:stone",
159                 clust_scarcity = 9 * 9 * 9,
160                 clust_num_ores = 5,
161                 clust_size     = 3,
162                 y_min          = -63,
163                 y_max          = -16,
164         })
165
166         minetest.register_ore({
167                 ore_type       = "scatter",
168                 ore            = "default:stone_with_iron",
169                 wherein        = "default:stone",
170                 clust_scarcity = 7 * 7 * 7,
171                 clust_num_ores = 5,
172                 clust_size     = 3,
173                 y_min          = -31000,
174                 y_max          = -64,
175         })
176
177         minetest.register_ore({
178                 ore_type       = "scatter",
179                 ore            = "default:stone_with_iron",
180                 wherein        = "default:stone",
181                 clust_scarcity = 24 * 24 * 24,
182                 clust_num_ores = 27,
183                 clust_size     = 6,
184                 y_min          = -31000,
185                 y_max          = -64,
186         })
187
188         minetest.register_ore({
189                 ore_type       = "scatter",
190                 ore            = "default:stone_with_mese",
191                 wherein        = "default:stone",
192                 clust_scarcity = 18 * 18 * 18,
193                 clust_num_ores = 3,
194                 clust_size     = 2,
195                 y_min          = -255,
196                 y_max          = -64,
197         })
198
199         minetest.register_ore({
200                 ore_type       = "scatter",
201                 ore            = "default:stone_with_mese",
202                 wherein        = "default:stone",
203                 clust_scarcity = 14 * 14 * 14,
204                 clust_num_ores = 5,
205                 clust_size     = 3,
206                 y_min          = -31000,
207                 y_max          = -256,
208         })
209
210         minetest.register_ore({
211                 ore_type       = "scatter",
212                 ore            = "default:mese",
213                 wherein        = "default:stone",
214                 clust_scarcity = 36 * 36 * 36,
215                 clust_num_ores = 3,
216                 clust_size     = 2,
217                 y_min          = -31000,
218                 y_max          = -1024,
219         })
220
221         minetest.register_ore({
222                 ore_type       = "scatter",
223                 ore            = "default:stone_with_gold",
224                 wherein        = "default:stone",
225                 clust_scarcity = 15 * 15 * 15,
226                 clust_num_ores = 3,
227                 clust_size     = 2,
228                 y_min          = -255,
229                 y_max          = -64,
230         })
231
232         minetest.register_ore({
233                 ore_type       = "scatter",
234                 ore            = "default:stone_with_gold",
235                 wherein        = "default:stone",
236                 clust_scarcity = 13 * 13 * 13,
237                 clust_num_ores = 5,
238                 clust_size     = 3,
239                 y_min          = -31000,
240                 y_max          = -256,
241         })
242
243         minetest.register_ore({
244                 ore_type       = "scatter",
245                 ore            = "default:stone_with_diamond",
246                 wherein        = "default:stone",
247                 clust_scarcity = 17 * 17 * 17,
248                 clust_num_ores = 4,
249                 clust_size     = 3,
250                 y_min          = -255,
251                 y_max          = -128,
252         })
253
254         minetest.register_ore({
255                 ore_type       = "scatter",
256                 ore            = "default:stone_with_diamond",
257                 wherein        = "default:stone",
258                 clust_scarcity = 15 * 15 * 15,
259                 clust_num_ores = 4,
260                 clust_size     = 3,
261                 y_min          = -31000,
262                 y_max          = -256,
263         })
264
265         minetest.register_ore({
266                 ore_type       = "scatter",
267                 ore            = "default:stone_with_copper",
268                 wherein        = "default:stone",
269                 clust_scarcity = 12 * 12 * 12,
270                 clust_num_ores = 4,
271                 clust_size     = 3,
272                 y_min          = -63,
273                 y_max          = -16,
274         })
275
276         minetest.register_ore({
277                 ore_type       = "scatter",
278                 ore            = "default:stone_with_copper",
279                 wherein        = "default:stone",
280                 clust_scarcity = 9 * 9 * 9,
281                 clust_num_ores = 5,
282                 clust_size     = 3,
283                 y_min          = -31000,
284                 y_max          = -64,
285         })
286 end
287
288
289 --
290 -- Register biomes
291 --
292
293
294 function default.register_biomes()
295         minetest.clear_registered_biomes()
296
297         minetest.register_biome({
298                 name = "default:grassland",
299                 --node_dust = "",
300                 node_top = "default:dirt_with_grass",
301                 depth_top = 1,
302                 node_filler = "default:dirt",
303                 depth_filler = 1,
304                 --node_stone = "",
305                 --node_water_top = "",
306                 --depth_water_top = ,
307                 --node_water = "",
308                 y_min = 5,
309                 y_max = 31000,
310                 heat_point = 50,
311                 humidity_point = 50,
312         })
313
314         minetest.register_biome({
315                 name = "default:grassland_ocean",
316                 --node_dust = "",
317                 node_top = "default:sand",
318                 depth_top = 1,
319                 node_filler = "default:sand",
320                 depth_filler = 2,
321                 --node_stone = "",
322                 --node_water_top = "",
323                 --depth_water_top = ,
324                 --node_water = "",
325                 y_min = -31000,
326                 y_max = 4,
327                 heat_point = 50,
328                 humidity_point = 50,
329         })
330 end
331
332
333 --
334 -- Register mgv6 decorations
335 --
336
337
338 function default.register_mgv6_decorations()
339
340         -- Papyrus
341
342         minetest.register_decoration({
343                 deco_type = "simple",
344                 place_on = {"default:dirt_with_grass"},
345                 sidelen = 8,
346                 noise_params = {
347                         offset = -0.3,
348                         scale = 0.7,
349                         spread = {x = 100, y = 100, z = 100},
350                         seed = 354,
351                         octaves = 3,
352                         persist = 0.7
353                 },
354                 y_min = 1,
355                 y_max = 1,
356                 decoration = "default:papyrus",
357                 height = 2,
358                 height_max = 4,
359                 spawn_by = "default:water_source",
360                 num_spawn_by = 1,
361         })
362
363         -- Cacti
364
365         minetest.register_decoration({
366                 deco_type = "simple",
367                 place_on = {"default:desert_sand"},
368                 sidelen = 16,
369                 noise_params = {
370                         offset = -0.012,
371                         scale = 0.024,
372                         spread = {x = 100, y = 100, z = 100},
373                         seed = 230,
374                         octaves = 3,
375                         persist = 0.6
376                 },
377                 y_min = 1,
378                 y_max = 30,
379                 decoration = "default:cactus",
380                 height = 3,
381                 height_max = 4,
382         })
383
384         -- Grasses
385
386         for length = 1, 5 do
387                 minetest.register_decoration({
388                         deco_type = "simple",
389                         place_on = {"default:dirt_with_grass"},
390                         sidelen = 16,
391                         noise_params = {
392                                 offset = 0,
393                                 scale = 0.007,
394                                 spread = {x = 100, y = 100, z = 100},
395                                 seed = 329,
396                                 octaves = 3,
397                                 persist = 0.6
398                         },
399                         y_min = 1,
400                         y_max = 30,
401                         decoration = "default:grass_"..length,
402                 })
403         end
404
405         -- Dry shrubs
406
407         minetest.register_decoration({
408                 deco_type = "simple",
409                 place_on = {"default:desert_sand", "default:dirt_with_snow"},
410                 sidelen = 16,
411                 noise_params = {
412                         offset = 0,
413                         scale = 0.035,
414                         spread = {x = 100, y = 100, z = 100},
415                         seed = 329,
416                         octaves = 3,
417                         persist = 0.6
418                 },
419                 y_min = 1,
420                 y_max = 30,
421                 decoration = "default:dry_shrub",
422         })
423 end
424
425
426 --
427 -- Register decorations
428 --
429
430
431 function default.register_decorations()
432
433         -- Flowers
434
435         minetest.register_decoration({
436                 deco_type = "simple",
437                 place_on = {"default:dirt_with_grass"},
438                 sidelen = 16,
439                 noise_params = {
440                         offset = -0.02,
441                         scale = 0.03,
442                         spread = {x = 200, y = 200, z = 200},
443                         seed = 436,
444                         octaves = 3,
445                         persist = 0.6
446                 },
447                 biomes = {"default:grassland"},
448                 y_min = -31000,
449                 y_max = 31000,
450                 decoration = "flowers:rose",
451         })
452         
453         minetest.register_decoration({
454                 deco_type = "simple",
455                 place_on = {"default:dirt_with_grass"},
456                 sidelen = 16,
457                 noise_params = {
458                         offset = -0.02,
459                         scale = 0.03,
460                         spread = {x = 200, y = 200, z = 200},
461                         seed = 19822,
462                         octaves = 3,
463                         persist = 0.6
464                 },
465                 biomes = {"default:grassland"},
466                 y_min = 33,
467                 y_max = 31000,
468                 decoration = "flowers:tulip",
469         })
470         
471         minetest.register_decoration({
472                 deco_type = "simple",
473                 place_on = {"default:dirt_with_grass"},
474                 sidelen = 16,
475                 noise_params = {
476                         offset = -0.02,
477                         scale = 0.03,
478                         spread = {x = 200, y = 200, z = 200},
479                         seed = 1220999,
480                         octaves = 3,
481                         persist = 0.6
482                 },
483                 biomes = {"default:grassland"},
484                 y_min = -31000,
485                 y_max = 31000,
486                 decoration = "flowers:dandelion_yellow",
487         })
488         
489         minetest.register_decoration({
490                 deco_type = "simple",
491                 place_on = {"default:dirt_with_grass"},
492                 sidelen = 16,
493                 noise_params = {
494                         offset = -0.02,
495                         scale = 0.03,
496                         spread = {x = 200, y = 200, z = 200},
497                         seed = 36662,
498                         octaves = 3,
499                         persist = 0.6
500                 },
501                 biomes = {"default:grassland"},
502                 y_min = -31000,
503                 y_max = 31000,
504                 decoration = "flowers:geranium",
505         })
506         
507         minetest.register_decoration({
508                 deco_type = "simple",
509                 place_on = {"default:dirt_with_grass"},
510                 sidelen = 16,
511                 noise_params = {
512                         offset = -0.02,
513                         scale = 0.03,
514                         spread = {x = 200, y = 200, z = 200},
515                         seed = 1133,
516                         octaves = 3,
517                         persist = 0.6
518                 },
519                 biomes = {"default:grassland"},
520                 y_min = -31000,
521                 y_max = 31000,
522                 decoration = "flowers:viola",
523         })
524         
525         minetest.register_decoration({
526                 deco_type = "simple",
527                 place_on = {"default:dirt_with_grass"},
528                 sidelen = 16,
529                 noise_params = {
530                         offset = -0.02,
531                         scale = 0.03,
532                         spread = {x = 200, y = 200, z = 200},
533                         seed = 73133,
534                         octaves = 3,
535                         persist = 0.6
536                 },
537                 biomes = {"default:grassland"},
538                 y_min = -31000,
539                 y_max = 31000,
540                 decoration = "flowers:dandelion_white",
541         })
542
543         -- Grasses
544
545         minetest.register_decoration({
546                 deco_type = "simple",
547                 place_on = {"default:dirt_with_grass"},
548                 sidelen = 16,
549                 noise_params = {
550                         offset = 0.04,
551                         scale = 0.04,
552                         spread = {x = 200, y = 200, z = 200},
553                         seed = 66440,
554                         octaves = 3,
555                         persist = 0.6
556                 },
557                 biomes = {"default:grassland"},
558                 y_min = -31000,
559                 y_max = 31000,
560                 decoration = "default:grass_1",
561         })
562         
563         minetest.register_decoration({
564                 deco_type = "simple",
565                 place_on = {"default:dirt_with_grass"},
566                 sidelen = 16,
567                 noise_params = {
568                         offset = 0.02,
569                         scale = 0.06,
570                         spread = {x = 200, y = 200, z = 200},
571                         seed = 66440,
572                         octaves = 3,
573                         persist = 0.6
574                 },
575                 biomes = {"default:grassland"},
576                 y_min = -31000,
577                 y_max = 31000,
578                 decoration = "default:grass_2",
579         })
580         
581         minetest.register_decoration({
582                 deco_type = "simple",
583                 place_on = {"default:dirt_with_grass"},
584                 sidelen = 16,
585                 noise_params = {
586                         offset = 0,
587                         scale = 0.08,
588                         spread = {x = 200, y = 200, z = 200},
589                         seed = 66440,
590                         octaves = 3,
591                         persist = 0.6
592                 },
593                 biomes = {"default:grassland"},
594                 y_min = -31000,
595                 y_max = 31000,
596                 decoration = "default:grass_3",
597         })
598         
599         minetest.register_decoration({
600                 deco_type = "simple",
601                 place_on = {"default:dirt_with_grass"},
602                 sidelen = 16,
603                 noise_params = {
604                         offset = -0.02,
605                         scale = 0.10,
606                         spread = {x = 200, y = 200, z = 200},
607                         seed = 66440,
608                         octaves = 3,
609                         persist = 0.6
610                 },
611                 biomes = {"default:grassland"},
612                 y_min = -31000,
613                 y_max = 31000,
614                 decoration = "default:grass_4",
615         })
616         
617         minetest.register_decoration({
618                 deco_type = "simple",
619                 place_on = {"default:dirt_with_grass"},
620                 sidelen = 16,
621                 noise_params = {
622                         offset = -0.04,
623                         scale = 0.12,
624                         spread = {x = 200, y = 200, z = 200},
625                         seed = 66440,
626                         octaves = 3,
627                         persist = 0.6
628                 },
629                 biomes = {"default:grassland"},
630                 y_min = -31000,
631                 y_max = 31000,
632                 decoration = "default:grass_5",
633         })
634 end
635
636
637 --
638 -- Detect mapgen to select functions
639 --
640
641
642 -- Mods using singlenode mapgen can call these functions to enable
643 -- the use of minetest.generate_ores or minetest.generate_decorations
644
645 local mg_params = minetest.get_mapgen_params()
646 if mg_params.mgname == "v6" then
647         default.register_ores()
648         default.register_mgv6_decorations()
649 elseif mg_params.mgname ~= "singlenode" then
650         default.register_ores()
651         default.register_biomes()
652         default.register_decorations()
653 end
654
655
656 --
657 -- Generate nyan cats in all mapgens
658 --
659
660
661 -- facedir: 0/1/2/3 (head node facedir value)
662 -- length: length of rainbow tail
663 function default.make_nyancat(pos, facedir, length)
664         local tailvec = {x = 0, y = 0, z = 0}
665         if facedir == 0 then
666                 tailvec.z = 1
667         elseif facedir == 1 then
668                 tailvec.x = 1
669         elseif facedir == 2 then
670                 tailvec.z = -1
671         elseif facedir == 3 then
672                 tailvec.x = -1
673         else
674                 --print("default.make_nyancat(): Invalid facedir: "+dump(facedir))
675                 facedir = 0
676                 tailvec.z = 1
677         end
678         local p = {x = pos.x, y = pos.y, z = pos.z}
679         minetest.set_node(p, {name = "default:nyancat", param2 = facedir})
680         for i = 1, length do
681                 p.x = p.x + tailvec.x
682                 p.z = p.z + tailvec.z
683                 minetest.set_node(p, {name = "default:nyancat_rainbow", param2 = facedir})
684         end
685 end
686
687
688 function default.generate_nyancats(minp, maxp, seed)
689         local height_min = -31000
690         local height_max = -32
691         if maxp.y < height_min or minp.y > height_max then
692                 return
693         end
694         local y_min = math.max(minp.y, height_min)
695         local y_max = math.min(maxp.y, height_max)
696         local volume = (maxp.x - minp.x + 1) * (y_max - y_min + 1) * (maxp.z - minp.z + 1)
697         local pr = PseudoRandom(seed + 9324342)
698         local max_num_nyancats = math.floor(volume / (16 * 16 * 16))
699         for i = 1, max_num_nyancats do
700                 if pr:next(0, 1000) == 0 then
701                         local x0 = pr:next(minp.x, maxp.x)
702                         local y0 = pr:next(minp.y, maxp.y)
703                         local z0 = pr:next(minp.z, maxp.z)
704                         local p0 = {x = x0, y = y0, z = z0}
705                         default.make_nyancat(p0, pr:next(0, 3), pr:next(3, 15))
706                 end
707         end
708 end
709
710
711 minetest.register_on_generated(default.generate_nyancats)