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