Default/mapgen.lua: Remove ores absheight flags. Add aliases for mgv6 snow biomes
[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         })
357
358         -- Cacti
359
360         minetest.register_decoration({
361                 deco_type = "simple",
362                 place_on = {"default:desert_sand"},
363                 sidelen = 16,
364                 noise_params = {
365                         offset = -0.012,
366                         scale = 0.024,
367                         spread = {x=100, y=100, z=100},
368                         seed = 230,
369                         octaves = 3,
370                         persist = 0.6
371                 },
372                 y_min = 1,
373                 y_max = 30,
374                 decoration = "default:cactus",
375                 height = 3,
376                 height_max = 4,
377         })
378
379         -- Grasses
380
381         for length = 1, 5 do
382                 minetest.register_decoration({
383                         deco_type = "simple",
384                         place_on = {"default:dirt_with_grass"},
385                         sidelen = 16,
386                         noise_params = {
387                                 offset = 0,
388                                 scale = 0.007,
389                                 spread = {x=100, y=100, z=100},
390                                 seed = 329,
391                                 octaves = 3,
392                                 persist = 0.6
393                         },
394                         y_min = 1,
395                         y_max = 30,
396                         decoration = "default:grass_"..length,
397                 })
398         end
399
400         -- Dry shrubs
401
402         minetest.register_decoration({
403                 deco_type = "simple",
404                 place_on = {"default:desert_sand"},
405                 sidelen = 16,
406                 noise_params = {
407                         offset = 0,
408                         scale = 0.035,
409                         spread = {x=100, y=100, z=100},
410                         seed = 329,
411                         octaves = 3,
412                         persist = 0.6
413                 },
414                 y_min = 1,
415                 y_max = 30,
416                 decoration = "default:dry_shrub",
417         })
418 end
419
420
421 --
422 -- Register decorations
423 --
424
425
426 function default.register_decorations()
427
428         -- Flowers
429
430         minetest.register_decoration({
431                 deco_type = "simple",
432                 place_on = {"default:dirt_with_grass"},
433                 sidelen = 16,
434                 noise_params = {
435                         offset = -0.02,
436                         scale = 0.03,
437                         spread = {x=200, y=200, z=200},
438                         seed = 436,
439                         octaves = 3,
440                         persist = 0.6
441                 },
442                 biomes = {"default:grassland"},
443                 y_min = -31000,
444                 y_max = 31000,
445                 decoration = "flowers:rose",
446         })
447         
448         minetest.register_decoration({
449                 deco_type = "simple",
450                 place_on = {"default:dirt_with_grass"},
451                 sidelen = 16,
452                 noise_params = {
453                         offset = -0.02,
454                         scale = 0.03,
455                         spread = {x=200, y=200, z=200},
456                         seed = 19822,
457                         octaves = 3,
458                         persist = 0.6
459                 },
460                 biomes = {"default:grassland"},
461                 y_min = 33,
462                 y_max = 31000,
463                 decoration = "flowers:tulip",
464         })
465         
466         minetest.register_decoration({
467                 deco_type = "simple",
468                 place_on = {"default:dirt_with_grass"},
469                 sidelen = 16,
470                 noise_params = {
471                         offset = -0.02,
472                         scale = 0.03,
473                         spread = {x=200, y=200, z=200},
474                         seed = 1220999,
475                         octaves = 3,
476                         persist = 0.6
477                 },
478                 biomes = {"default:grassland"},
479                 y_min = -31000,
480                 y_max = 31000,
481                 decoration = "flowers:dandelion_yellow",
482         })
483         
484         minetest.register_decoration({
485                 deco_type = "simple",
486                 place_on = {"default:dirt_with_grass"},
487                 sidelen = 16,
488                 noise_params = {
489                         offset = -0.02,
490                         scale = 0.03,
491                         spread = {x=200, y=200, z=200},
492                         seed = 36662,
493                         octaves = 3,
494                         persist = 0.6
495                 },
496                 biomes = {"default:grassland"},
497                 y_min = -31000,
498                 y_max = 31000,
499                 decoration = "flowers:geranium",
500         })
501         
502         minetest.register_decoration({
503                 deco_type = "simple",
504                 place_on = {"default:dirt_with_grass"},
505                 sidelen = 16,
506                 noise_params = {
507                         offset = -0.02,
508                         scale = 0.03,
509                         spread = {x=200, y=200, z=200},
510                         seed = 1133,
511                         octaves = 3,
512                         persist = 0.6
513                 },
514                 biomes = {"default:grassland"},
515                 y_min = -31000,
516                 y_max = 31000,
517                 decoration = "flowers:viola",
518         })
519         
520         minetest.register_decoration({
521                 deco_type = "simple",
522                 place_on = {"default:dirt_with_grass"},
523                 sidelen = 16,
524                 noise_params = {
525                         offset = -0.02,
526                         scale = 0.03,
527                         spread = {x=200, y=200, z=200},
528                         seed = 73133,
529                         octaves = 3,
530                         persist = 0.6
531                 },
532                 biomes = {"default:grassland"},
533                 y_min = -31000,
534                 y_max = 31000,
535                 decoration = "flowers:dandelion_white",
536         })
537
538         -- Grasses
539
540         minetest.register_decoration({
541                 deco_type = "simple",
542                 place_on = {"default:dirt_with_grass"},
543                 sidelen = 16,
544                 noise_params = {
545                         offset = 0.04,
546                         scale = 0.04,
547                         spread = {x=200, y=200, z=200},
548                         seed = 66440,
549                         octaves = 3,
550                         persist = 0.6
551                 },
552                 biomes = {"default:grassland"},
553                 y_min = -31000,
554                 y_max = 31000,
555                 decoration = "default:grass_1",
556         })
557         
558         minetest.register_decoration({
559                 deco_type = "simple",
560                 place_on = {"default:dirt_with_grass"},
561                 sidelen = 16,
562                 noise_params = {
563                         offset = 0.02,
564                         scale = 0.06,
565                         spread = {x=200, y=200, z=200},
566                         seed = 66440,
567                         octaves = 3,
568                         persist = 0.6
569                 },
570                 biomes = {"default:grassland"},
571                 y_min = -31000,
572                 y_max = 31000,
573                 decoration = "default:grass_2",
574         })
575         
576         minetest.register_decoration({
577                 deco_type = "simple",
578                 place_on = {"default:dirt_with_grass"},
579                 sidelen = 16,
580                 noise_params = {
581                         offset = 0,
582                         scale = 0.08,
583                         spread = {x=200, y=200, z=200},
584                         seed = 66440,
585                         octaves = 3,
586                         persist = 0.6
587                 },
588                 biomes = {"default:grassland"},
589                 y_min = -31000,
590                 y_max = 31000,
591                 decoration = "default:grass_3",
592         })
593         
594         minetest.register_decoration({
595                 deco_type = "simple",
596                 place_on = {"default:dirt_with_grass"},
597                 sidelen = 16,
598                 noise_params = {
599                         offset = -0.02,
600                         scale = 0.10,
601                         spread = {x=200, y=200, z=200},
602                         seed = 66440,
603                         octaves = 3,
604                         persist = 0.6
605                 },
606                 biomes = {"default:grassland"},
607                 y_min = -31000,
608                 y_max = 31000,
609                 decoration = "default:grass_4",
610         })
611         
612         minetest.register_decoration({
613                 deco_type = "simple",
614                 place_on = {"default:dirt_with_grass"},
615                 sidelen = 16,
616                 noise_params = {
617                         offset = -0.04,
618                         scale = 0.12,
619                         spread = {x=200, y=200, z=200},
620                         seed = 66440,
621                         octaves = 3,
622                         persist = 0.6
623                 },
624                 biomes = {"default:grassland"},
625                 y_min = -31000,
626                 y_max = 31000,
627                 decoration = "default:grass_5",
628         })
629 end
630
631
632 --
633 -- Detect mapgen to select functions
634 --
635
636
637 -- Mods using singlenode mapgen can call these functions to enable
638 -- the use of minetest.generate_ores or minetest.generate_decorations
639
640 local mg_params = minetest.get_mapgen_params()
641 if mg_params.mgname == "v5" then
642         default.register_ores()
643         default.register_biomes()
644         default.register_decorations()
645 elseif mg_params.mgname == "v6" then
646         default.register_ores()
647         default.register_mgv6_decorations()
648 elseif mg_params.mgname == "v7" 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