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