c40f2204494b29879888aea6d725bf548ff9ee6b
[oweals/minetest_game.git] / mods / default / mapgen.lua
1 --
2 -- Aliases for map generator outputs
3 --
4
5 minetest.register_alias("mapgen_stone", "default:stone")
6 minetest.register_alias("mapgen_dirt", "default:dirt")
7 minetest.register_alias("mapgen_dirt_with_grass", "default:dirt_with_grass")
8 minetest.register_alias("mapgen_sand", "default:sand")
9 minetest.register_alias("mapgen_water_source", "default:water_source")
10 minetest.register_alias("mapgen_river_water_source", "default:river_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_snowblock", "default:snowblock")
17 minetest.register_alias("mapgen_snow", "default:snow")
18 minetest.register_alias("mapgen_ice", "default:ice")
19 minetest.register_alias("mapgen_sandstone", "default:sandstone")
20
21 -- Flora
22
23 minetest.register_alias("mapgen_tree", "default:tree")
24 minetest.register_alias("mapgen_leaves", "default:leaves")
25 minetest.register_alias("mapgen_apple", "default:apple")
26 minetest.register_alias("mapgen_jungletree", "default:jungletree")
27 minetest.register_alias("mapgen_jungleleaves", "default:jungleleaves")
28 minetest.register_alias("mapgen_junglegrass", "default:junglegrass")
29 minetest.register_alias("mapgen_pine_tree", "default:pine_tree")
30 minetest.register_alias("mapgen_pine_needles", "default:pine_needles")
31
32 -- Dungeons
33
34 minetest.register_alias("mapgen_cobble", "default:cobble")
35 minetest.register_alias("mapgen_stair_cobble", "stairs:stair_cobble")
36 minetest.register_alias("mapgen_mossycobble", "default:mossycobble")
37 minetest.register_alias("mapgen_sandstonebrick", "default:sandstonebrick")
38 minetest.register_alias("mapgen_stair_sandstonebrick", "stairs:stair_sandstonebrick")
39
40
41 --
42 -- Register ores
43 --
44
45 -- All mapgens except singlenode
46 -- Blob ore first to avoid other ores inside blobs
47
48 function default.register_ores()
49
50         -- Clay
51
52         minetest.register_ore({ 
53                 ore_type         = "blob",
54                 ore              = "default:clay",
55                 wherein          = {"default:sand"},
56                 clust_scarcity   = 24 * 24 * 24,
57                 clust_size       = 7,
58                 y_min            = -15,
59                 y_max            = 0,
60                 noise_threshhold = 0,
61                 noise_params     = {
62                         offset = 0.35,
63                         scale = 0.2,
64                         spread = {x = 5, y = 5, z = 5},
65                         seed = -316,
66                         octaves = 1,
67                         persist = 0.5
68                 },
69         })
70
71         -- Sand
72
73         minetest.register_ore({ 
74                 ore_type         = "blob",
75                 ore              = "default:sand",
76                 wherein          = {"default:stone"},
77                 clust_scarcity   = 24 * 24 * 24,
78                 clust_size       = 7,
79                 y_min            = -63,
80                 y_max            = 4,
81                 noise_threshhold = 0,
82                 noise_params     = {
83                         offset = 0.35,
84                         scale = 0.2,
85                         spread = {x = 5, y = 5, z = 5},
86                         seed = 2316,
87                         octaves = 1,
88                         persist = 0.5
89                 },
90         })
91
92         -- Dirt
93
94         minetest.register_ore({
95                 ore_type         = "blob",
96                 ore              = "default:dirt",
97                 wherein          = {"default:stone"},
98                 clust_scarcity   = 24 * 24 * 24,
99                 clust_size       = 7,
100                 y_min            = -63,
101                 y_max            = 31000,
102                 noise_threshhold = 0,
103                 noise_params     = {
104                         offset = 0.35,
105                         scale = 0.2,
106                         spread = {x = 5, y = 5, z = 5},
107                         seed = 17676,
108                         octaves = 1,
109                         persist = 0.5
110                 },
111         })
112
113         -- Gravel
114
115         minetest.register_ore({
116                 ore_type         = "blob",
117                 ore              = "default:gravel",
118                 wherein          = {"default:stone"},
119                 clust_scarcity   = 24 * 24 * 24,
120                 clust_size       = 7,
121                 y_min            = -31000,
122                 y_max            = 31000,
123                 noise_threshhold = 0,
124                 noise_params     = {
125                         offset = 0.35,
126                         scale = 0.2,
127                         spread = {x = 5, y = 5, z = 5},
128                         seed = 766,
129                         octaves = 1,
130                         persist = 0.5
131                 },
132         })
133
134         -- Coal
135
136         minetest.register_ore({
137                 ore_type       = "scatter",
138                 ore            = "default:stone_with_coal",
139                 wherein        = "default:stone",
140                 clust_scarcity = 8 * 8 * 8,
141                 clust_num_ores = 8,
142                 clust_size     = 3,
143                 y_min          = -31000,
144                 y_max          = 64,
145         })
146
147         minetest.register_ore({
148                 ore_type       = "scatter",
149                 ore            = "default:stone_with_coal",
150                 wherein        = "default:stone",
151                 clust_scarcity = 24 * 24 * 24,
152                 clust_num_ores = 27,
153                 clust_size     = 6,
154                 y_min          = -31000,
155                 y_max          = 0,
156         })
157
158         -- Iron
159
160         minetest.register_ore({
161                 ore_type       = "scatter",
162                 ore            = "default:stone_with_iron",
163                 wherein        = "default:stone",
164                 clust_scarcity = 12 * 12 * 12,
165                 clust_num_ores = 3,
166                 clust_size     = 2,
167                 y_min          = -15,
168                 y_max          = 2,
169         })
170
171         minetest.register_ore({
172                 ore_type       = "scatter",
173                 ore            = "default:stone_with_iron",
174                 wherein        = "default:stone",
175                 clust_scarcity = 9 * 9 * 9,
176                 clust_num_ores = 5,
177                 clust_size     = 3,
178                 y_min          = -63,
179                 y_max          = -16,
180         })
181
182         minetest.register_ore({
183                 ore_type       = "scatter",
184                 ore            = "default:stone_with_iron",
185                 wherein        = "default:stone",
186                 clust_scarcity = 7 * 7 * 7,
187                 clust_num_ores = 5,
188                 clust_size     = 3,
189                 y_min          = -31000,
190                 y_max          = -64,
191         })
192
193         minetest.register_ore({
194                 ore_type       = "scatter",
195                 ore            = "default:stone_with_iron",
196                 wherein        = "default:stone",
197                 clust_scarcity = 24 * 24 * 24,
198                 clust_num_ores = 27,
199                 clust_size     = 6,
200                 y_min          = -31000,
201                 y_max          = -64,
202         })
203
204         --Mese
205
206         minetest.register_ore({
207                 ore_type       = "scatter",
208                 ore            = "default:stone_with_mese",
209                 wherein        = "default:stone",
210                 clust_scarcity = 18 * 18 * 18,
211                 clust_num_ores = 3,
212                 clust_size     = 2,
213                 y_min          = -255,
214                 y_max          = -64,
215         })
216
217         minetest.register_ore({
218                 ore_type       = "scatter",
219                 ore            = "default:stone_with_mese",
220                 wherein        = "default:stone",
221                 clust_scarcity = 14 * 14 * 14,
222                 clust_num_ores = 5,
223                 clust_size     = 3,
224                 y_min          = -31000,
225                 y_max          = -256,
226         })
227
228         minetest.register_ore({
229                 ore_type       = "scatter",
230                 ore            = "default:mese",
231                 wherein        = "default:stone",
232                 clust_scarcity = 36 * 36 * 36,
233                 clust_num_ores = 3,
234                 clust_size     = 2,
235                 y_min          = -31000,
236                 y_max          = -1024,
237         })
238
239         -- Gold
240
241         minetest.register_ore({
242                 ore_type       = "scatter",
243                 ore            = "default:stone_with_gold",
244                 wherein        = "default:stone",
245                 clust_scarcity = 15 * 15 * 15,
246                 clust_num_ores = 3,
247                 clust_size     = 2,
248                 y_min          = -255,
249                 y_max          = -64,
250         })
251
252         minetest.register_ore({
253                 ore_type       = "scatter",
254                 ore            = "default:stone_with_gold",
255                 wherein        = "default:stone",
256                 clust_scarcity = 13 * 13 * 13,
257                 clust_num_ores = 5,
258                 clust_size     = 3,
259                 y_min          = -31000,
260                 y_max          = -256,
261         })
262
263         -- Diamond
264
265         minetest.register_ore({
266                 ore_type       = "scatter",
267                 ore            = "default:stone_with_diamond",
268                 wherein        = "default:stone",
269                 clust_scarcity = 17 * 17 * 17,
270                 clust_num_ores = 4,
271                 clust_size     = 3,
272                 y_min          = -255,
273                 y_max          = -128,
274         })
275
276         minetest.register_ore({
277                 ore_type       = "scatter",
278                 ore            = "default:stone_with_diamond",
279                 wherein        = "default:stone",
280                 clust_scarcity = 15 * 15 * 15,
281                 clust_num_ores = 4,
282                 clust_size     = 3,
283                 y_min          = -31000,
284                 y_max          = -256,
285         })
286
287         -- Copper
288
289         minetest.register_ore({
290                 ore_type       = "scatter",
291                 ore            = "default:stone_with_copper",
292                 wherein        = "default:stone",
293                 clust_scarcity = 12 * 12 * 12,
294                 clust_num_ores = 4,
295                 clust_size     = 3,
296                 y_min          = -63,
297                 y_max          = -16,
298         })
299
300         minetest.register_ore({
301                 ore_type       = "scatter",
302                 ore            = "default:stone_with_copper",
303                 wherein        = "default:stone",
304                 clust_scarcity = 9 * 9 * 9,
305                 clust_num_ores = 5,
306                 clust_size     = 3,
307                 y_min          = -31000,
308                 y_max          = -64,
309         })
310 end
311
312
313 --
314 -- Register biomes
315 --
316
317 -- All mapgens except mgv6 and singlenode
318
319 function default.register_biomes()
320         minetest.clear_registered_biomes()
321
322         -- Permanent ice
323
324         minetest.register_biome({
325                 name = "glacier",
326                 node_dust = "default:snowblock",
327                 node_top = "default:snowblock",
328                 depth_top = 1,
329                 node_filler = "default:snowblock",
330                 depth_filler = 3,
331                 node_stone = "default:ice",
332                 node_water_top = "default:ice",
333                 depth_water_top = 10,
334                 --node_water = "",
335                 y_min = -8,
336                 y_max = 31000,
337                 heat_point = -5,
338                 humidity_point = 50,
339         })
340
341         minetest.register_biome({
342                 name = "glacier_ocean",
343                 node_dust = "default:snowblock",
344                 node_top = "default:gravel",
345                 depth_top = 1,
346                 node_filler = "default:gravel",
347                 depth_filler = 2,
348                 --node_stone = "",
349                 --node_water_top = "",
350                 --depth_water_top = ,
351                 --node_water = "",
352                 y_min = -112,
353                 y_max = -9,
354                 heat_point = -5,
355                 humidity_point = 50,
356         })
357
358         -- Cold
359
360         minetest.register_biome({
361                 name = "tundra",
362                 node_dust = "default:snow",
363                 node_top = "default:dirt_with_snow",
364                 depth_top = 1,
365                 node_filler = "default:dirt",
366                 depth_filler = 0,
367                 --node_stone = "",
368                 --node_water_top = "",
369                 --depth_water_top = ,
370                 --node_water = "",
371                 y_min = 2,
372                 y_max = 31000,
373                 heat_point = 20,
374                 humidity_point = 30,
375         })
376
377         minetest.register_biome({
378                 name = "tundra_ocean",
379                 --node_dust = "",
380                 node_top = "default:sand",
381                 depth_top = 1,
382                 node_filler = "default:sand",
383                 depth_filler = 2,
384                 --node_stone = "",
385                 --node_water_top = "",
386                 --depth_water_top = ,
387                 --node_water = "",
388                 y_min = -112,
389                 y_max = 1,
390                 heat_point = 20,
391                 humidity_point = 30,
392         })
393
394         minetest.register_biome({
395                 name = "taiga",
396                 node_dust = "default:snow",
397                 node_top = "default:snowblock",
398                 depth_top = 1,
399                 node_filler = "default:dirt",
400                 depth_filler = 2,
401                 --node_stone = "",
402                 --node_water_top = "",
403                 --depth_water_top = ,
404                 --node_water = "",
405                 y_min = 2,
406                 y_max = 31000,
407                 heat_point = 20,
408                 humidity_point = 70,
409         })
410
411         minetest.register_biome({
412                 name = "taiga_ocean",
413                 --node_dust = "",
414                 node_top = "default:sand",
415                 depth_top = 1,
416                 node_filler = "default:sand",
417                 depth_filler = 2,
418                 --node_stone = "",
419                 --node_water_top = "",
420                 --depth_water_top = ,
421                 --node_water = "",
422                 y_min = -112,
423                 y_max = 1,
424                 heat_point = 20,
425                 humidity_point = 70,
426         })
427
428         -- Cool
429
430         minetest.register_biome({
431                 name = "stone_grassland",
432                 --node_dust = "",
433                 node_top = "default:dirt_with_grass",
434                 depth_top = 1,
435                 node_filler = "default:dirt",
436                 depth_filler = 0,
437                 --node_stone = "",
438                 --node_water_top = "",
439                 --depth_water_top = ,
440                 --node_water = "",
441                 y_min = 6,
442                 y_max = 31000,
443                 heat_point = 45,
444                 humidity_point = 30,
445         })
446
447         minetest.register_biome({
448                 name = "stone_grassland_ocean",
449                 --node_dust = "",
450                 node_top = "default:sand",
451                 depth_top = 1,
452                 node_filler = "default:sand",
453                 depth_filler = 2,
454                 --node_stone = "",
455                 --node_water_top = "",
456                 --depth_water_top = ,
457                 --node_water = "",
458                 y_min = -112,
459                 y_max = 5,
460                 heat_point = 45,
461                 humidity_point = 30,
462         })
463
464         minetest.register_biome({
465                 name = "coniferous_forest",
466                 --node_dust = "",
467                 node_top = "default:dirt_with_grass",
468                 depth_top = 1,
469                 node_filler = "default:dirt",
470                 depth_filler = 2,
471                 --node_stone = "",
472                 --node_water_top = "",
473                 --depth_water_top = ,
474                 --node_water = "",
475                 y_min = 6,
476                 y_max = 31000,
477                 heat_point = 45,
478                 humidity_point = 70,
479         })
480
481         minetest.register_biome({
482                 name = "coniferous_forest_ocean",
483                 --node_dust = "",
484                 node_top = "default:sand",
485                 depth_top = 1,
486                 node_filler = "default:sand",
487                 depth_filler = 2,
488                 --node_stone = "",
489                 --node_water_top = "",
490                 --depth_water_top = ,
491                 --node_water = "",
492                 y_min = -112,
493                 y_max = 5,
494                 heat_point = 45,
495                 humidity_point = 70,
496         })
497
498         -- Warm
499
500         minetest.register_biome({
501                 name = "sandstone_grassland",
502                 --node_dust = "",
503                 node_top = "default:dirt_with_grass",
504                 depth_top = 1,
505                 node_filler = "default:dirt",
506                 depth_filler = 0,
507                 node_stone = "default:sandstone",
508                 --node_water_top = "",
509                 --depth_water_top = ,
510                 --node_water = "",
511                 y_min = 6,
512                 y_max = 31000,
513                 heat_point = 70,
514                 humidity_point = 30,
515         })
516
517         minetest.register_biome({
518                 name = "sandstone_grassland_ocean",
519                 --node_dust = "",
520                 node_top = "default:sand",
521                 depth_top = 1,
522                 node_filler = "default:sand",
523                 depth_filler = 2,
524                 node_stone = "default:sandstone",
525                 --node_water_top = "",
526                 --depth_water_top = ,
527                 --node_water = "",
528                 y_min = -112,
529                 y_max = 5,
530                 heat_point = 70,
531                 humidity_point = 30,
532         })
533
534         minetest.register_biome({
535                 name = "deciduous_forest",
536                 --node_dust = "",
537                 node_top = "default:dirt_with_grass",
538                 depth_top = 1,
539                 node_filler = "default:dirt",
540                 depth_filler = 2,
541                 --node_stone = "",
542                 --node_water_top = "",
543                 --depth_water_top = ,
544                 --node_water = "",
545                 y_min = 6,
546                 y_max = 31000,
547                 heat_point = 70,
548                 humidity_point = 70,
549         })
550
551         minetest.register_biome({
552                 name = "deciduous_forest_ocean",
553                 --node_dust = "",
554                 node_top = "default:sand",
555                 depth_top = 1,
556                 node_filler = "default:sand",
557                 depth_filler = 2,
558                 --node_stone = "",
559                 --node_water_top = "",
560                 --depth_water_top = ,
561                 --node_water = "",
562                 y_min = -112,
563                 y_max = 5,
564                 heat_point = 70,
565                 humidity_point = 70,
566         })
567
568         -- Hot
569
570         minetest.register_biome({
571                 name = "desert",
572                 --node_dust = "",
573                 node_top = "default:desert_sand",
574                 depth_top = 1,
575                 node_filler = "default:desert_sand",
576                 depth_filler = 1,
577                 node_stone = "default:desert_stone",
578                 --node_water_top = "",
579                 --depth_water_top = ,
580                 --node_water = "",
581                 y_min = 1,
582                 y_max = 31000,
583                 heat_point = 95,
584                 humidity_point = 10,
585         })
586
587         minetest.register_biome({
588                 name = "desert_ocean",
589                 --node_dust = "",
590                 node_top = "default:sand",
591                 depth_top = 1,
592                 node_filler = "default:sand",
593                 depth_filler = 2,
594                 node_stone = "default:desert_stone",
595                 --node_water_top = "",
596                 --depth_water_top = ,
597                 --node_water = "",
598                 y_min = -112,
599                 y_max = 0,
600                 heat_point = 95,
601                 humidity_point = 10,
602         })
603
604         minetest.register_biome({
605                 name = "savanna",
606                 --node_dust = "",
607                 node_top = "default:dirt_with_dry_grass",
608                 depth_top = 1,
609                 node_filler = "default:dirt",
610                 depth_filler = 1,
611                 --node_stone = "",
612                 --node_water_top = "",
613                 --depth_water_top = ,
614                 --node_water = "",
615                 y_min = 5,
616                 y_max = 31000,
617                 heat_point = 95,
618                 humidity_point = 50,
619         })
620
621         minetest.register_biome({
622                 name = "savanna_ocean",
623                 --node_dust = "",
624                 node_top = "default:sand",
625                 depth_top = 1,
626                 node_filler = "default:sand",
627                 depth_filler = 2,
628                 --node_stone = "",
629                 --node_water_top = "",
630                 --depth_water_top = ,
631                 --node_water = "",
632                 y_min = -112,
633                 y_max = 4,
634                 heat_point = 95,
635                 humidity_point = 50,
636         })
637
638         minetest.register_biome({
639                 name = "rainforest",
640                 --node_dust = "",
641                 node_top = "default:dirt_with_grass",
642                 depth_top = 1,
643                 node_filler = "default:dirt",
644                 depth_filler = 2,
645                 --node_stone = "",
646                 --node_water_top = "",
647                 --depth_water_top = ,
648                 --node_water = "",
649                 y_min = 1,
650                 y_max = 31000,
651                 heat_point = 95,
652                 humidity_point = 90,
653         })
654
655         minetest.register_biome({
656                 name = "rainforest_swamp",
657                 --node_dust = "",
658                 node_top = "default:dirt",
659                 depth_top = 1,
660                 node_filler = "default:dirt",
661                 depth_filler = 2,
662                 --node_stone = "",
663                 --node_water_top = "",
664                 --depth_water_top = ,
665                 --node_water = "",
666                 y_min = 0,
667                 y_max = 0,
668                 heat_point = 95,
669                 humidity_point = 90,
670         })
671
672         minetest.register_biome({
673                 name = "rainforest_ocean",
674                 --node_dust = "",
675                 node_top = "default:sand",
676                 depth_top = 1,
677                 node_filler = "default:sand",
678                 depth_filler = 2,
679                 --node_stone = "",
680                 --node_water_top = "",
681                 --depth_water_top = ,
682                 --node_water = "",
683                 y_min = -112,
684                 y_max = -1,
685                 heat_point = 95,
686                 humidity_point = 90,
687         })
688
689         -- Underground
690
691         minetest.register_biome({
692                 name = "underground",
693                 --node_dust = "",
694                 --node_top = "",
695                 depth_top = 0,
696                 --node_filler = "",
697                 depth_filler = -4,
698                 --node_stone = "",
699                 --node_water_top = "",
700                 --depth_water_top = ,
701                 --node_water = "",
702                 y_min = -31000,
703                 y_max = -113,
704                 heat_point = 50,
705                 humidity_point = 50,
706         })
707 end
708
709
710 --
711 -- Register decorations
712 --
713
714 -- Mgv6
715
716 function default.register_mgv6_decorations()
717         minetest.clear_registered_decorations()
718
719         -- Papyrus
720
721         minetest.register_decoration({
722                 deco_type = "simple",
723                 place_on = {"default:dirt_with_grass"},
724                 sidelen = 8,
725                 noise_params = {
726                         offset = -0.3,
727                         scale = 0.7,
728                         spread = {x = 100, y = 100, z = 100},
729                         seed = 354,
730                         octaves = 3,
731                         persist = 0.7
732                 },
733                 y_min = 1,
734                 y_max = 1,
735                 decoration = "default:papyrus",
736                 height = 2,
737                 height_max = 4,
738                 spawn_by = "default:water_source",
739                 num_spawn_by = 1,
740         })
741
742         -- Cacti
743
744         minetest.register_decoration({
745                 deco_type = "simple",
746                 place_on = {"default:desert_sand"},
747                 sidelen = 16,
748                 noise_params = {
749                         offset = -0.012,
750                         scale = 0.024,
751                         spread = {x = 100, y = 100, z = 100},
752                         seed = 230,
753                         octaves = 3,
754                         persist = 0.6
755                 },
756                 y_min = 1,
757                 y_max = 30,
758                 decoration = "default:cactus",
759                 height = 3,
760                 height_max = 4,
761         })
762
763         -- Long grasses
764
765         for length = 1, 5 do
766                 minetest.register_decoration({
767                         deco_type = "simple",
768                         place_on = {"default:dirt_with_grass"},
769                         sidelen = 16,
770                         noise_params = {
771                                 offset = 0,
772                                 scale = 0.007,
773                                 spread = {x = 100, y = 100, z = 100},
774                                 seed = 329,
775                                 octaves = 3,
776                                 persist = 0.6
777                         },
778                         y_min = 1,
779                         y_max = 30,
780                         decoration = "default:grass_"..length,
781                 })
782         end
783
784         -- Dry shrubs
785
786         minetest.register_decoration({
787                 deco_type = "simple",
788                 place_on = {"default:desert_sand", "default:dirt_with_snow"},
789                 sidelen = 16,
790                 noise_params = {
791                         offset = 0,
792                         scale = 0.035,
793                         spread = {x = 100, y = 100, z = 100},
794                         seed = 329,
795                         octaves = 3,
796                         persist = 0.6
797                 },
798                 y_min = 1,
799                 y_max = 30,
800                 decoration = "default:dry_shrub",
801         })
802 end
803
804 -- All mapgens except mgv6 and singlenode
805
806 local function register_grass_decoration(offset, scale, length)
807         minetest.register_decoration({
808                 deco_type = "simple",
809                 place_on = {"default:dirt_with_grass", "default:sand"},
810                 sidelen = 16,
811                 noise_params = {
812                         offset = offset,
813                         scale = scale,
814                         spread = {x=200, y=200, z=200},
815                         seed = 329,
816                         octaves = 3,
817                         persist = 0.6
818                 },
819                 biomes = {
820                         "stone_grassland", "stone_grassland_ocean",
821                         "sandstone_grassland", "sandstone_grassland_ocean",
822                         "deciduous_forest", "deciduous_forest_ocean",
823                         "coniferous_forest", "coniferous_forest_ocean",
824                 },
825                 y_min = 5,
826                 y_max = 31000,
827                 decoration = "default:grass_"..length,
828         })
829 end
830
831 local function register_dry_grass_decoration(offset, scale, length)
832         minetest.register_decoration({
833                 deco_type = "simple",
834                 place_on = {"default:dirt_with_dry_grass"},
835                 sidelen = 16,
836                 noise_params = {
837                         offset = offset,
838                         scale = scale,
839                         spread = {x=200, y=200, z=200},
840                         seed = 329,
841                         octaves = 3,
842                         persist = 0.6
843                 },
844                 biomes = {"savanna"},
845                 y_min = 5,
846                 y_max = 31000,
847                 decoration = "default:dry_grass_"..length,
848         })
849 end
850
851 function default.register_decorations()
852         minetest.clear_registered_decorations()
853
854         -- Apple tree
855
856         minetest.register_decoration({
857                 deco_type = "schematic",
858                 place_on = {"default:dirt_with_grass"},
859                 sidelen = 16,
860                 noise_params = {
861                         offset = 0.04,
862                         scale = 0.02,
863                         spread = {x=250, y=250, z=250},
864                         seed = 2,
865                         octaves = 3,
866                         persist = 0.66
867                 },
868                 biomes = {"deciduous_forest"},
869                 y_min = 6,
870                 y_max = 31000,
871                 schematic = minetest.get_modpath("default").."/schematics/apple_tree.mts",
872                 flags = "place_center_x, place_center_z",
873         })
874
875         -- Jungle tree
876
877         minetest.register_decoration({
878                 deco_type = "schematic",
879                 place_on = {"default:dirt_with_grass", "default:dirt"},
880                 sidelen = 80,
881                 fill_ratio = 0.09,
882                 biomes = {"rainforest", "rainforest_swamp"},
883                 y_min = 0,
884                 y_max = 31000,
885                 schematic = minetest.get_modpath("default").."/schematics/jungle_tree.mts",
886                 flags = "place_center_x, place_center_z",
887         })
888
889         -- Taiga and temperate forest pine tree
890
891         minetest.register_decoration({
892                 deco_type = "schematic",
893                 place_on = {"default:snowblock", "default:dirt_with_grass"},
894                 sidelen = 16,
895                 noise_params = {
896                         offset = 0.04,
897                         scale = 0.02,
898                         spread = {x=250, y=250, z=250},
899                         seed = 2,
900                         octaves = 3,
901                         persist = 0.66
902                 },
903                 biomes = {"taiga", "coniferous_forest"},
904                 y_min = 2,
905                 y_max = 31000,
906                 schematic = minetest.get_modpath("default").."/schematics/pine_tree.mts",
907                 flags = "place_center_x, place_center_z",
908         })
909
910         -- Acacia tree
911
912         minetest.register_decoration({
913                 deco_type = "schematic",
914                 place_on = {"default:dirt_with_dry_grass"},
915                 sidelen = 80,
916                 noise_params = {
917                         offset = 0,
918                         scale = 0.003,
919                         spread = {x=250, y=250, z=250},
920                         seed = 2,
921                         octaves = 3,
922                         persist = 0.66
923                 },
924                 biomes = {"savanna"},
925                 y_min = 6,
926                 y_max = 31000,
927                 schematic = minetest.get_modpath("default").."/schematics/acacia_tree.mts",
928                 flags = "place_center_x, place_center_z",
929                 rotation = "random",
930         })
931
932         -- Large cactus
933
934         minetest.register_decoration({
935                 deco_type = "schematic",
936                 place_on = {"default:desert_sand"},
937                 sidelen = 80,
938                 noise_params = {
939                         offset = -0.0005,
940                         scale = 0.0015,
941                         spread = {x=200, y=200, z=200},
942                         seed = 230,
943                         octaves = 3,
944                         persist = 0.6
945                 },
946                 biomes = {"desert"},
947                 y_min = 2,
948                 y_max = 31000,
949                 schematic = minetest.get_modpath("default").."/schematics/large_cactus.mts",
950                 flags = "place_center_x",
951                 rotation = "random",
952         })
953
954         -- Cactus
955
956         minetest.register_decoration({
957                 deco_type = "simple",
958                 place_on = {"default:desert_sand"},
959                 sidelen = 80,
960                 noise_params = {
961                         offset = -0.0005,
962                         scale = 0.0015,
963                         spread = {x=200, y=200, z=200},
964                         seed = 230,
965                         octaves = 3,
966                         persist = 0.6
967                 },
968                 biomes = {"desert"},
969                 y_min = 2,
970                 y_max = 31000,
971                 decoration = "default:cactus",
972                 height = 2,
973                 height_max = 5,
974         })
975
976         -- Papyrus
977
978         minetest.register_decoration({
979                 deco_type = "schematic",
980                 place_on = {"default:sand"},
981                 sidelen = 16,
982                 noise_params = {
983                         offset = -0.3,
984                         scale = 0.7,
985                         spread = {x=200, y=200, z=200},
986                         seed = 354,
987                         octaves = 3,
988                         persist = 0.7
989                 },
990                 biomes = {"savanna_ocean", "desert_ocean"},
991                 y_min = 0,
992                 y_max = 0,
993                 schematic = minetest.get_modpath("default").."/schematics/papyrus.mts",
994         })
995
996         -- Grasses
997
998         register_grass_decoration(-0.03,  0.09,  5)
999         register_grass_decoration(-0.015, 0.075, 4)
1000         register_grass_decoration(0,      0.06,  3)
1001         register_grass_decoration(0.015,  0.045, 2)
1002         register_grass_decoration(0.03,   0.03,  1)
1003
1004         -- Dry grasses
1005
1006         register_dry_grass_decoration(0.01, 0.05,  5)
1007         register_dry_grass_decoration(0.03, 0.03,  4)
1008         register_dry_grass_decoration(0.05, 0.01,  3)
1009         register_dry_grass_decoration(0.07, -0.01, 2)
1010         register_dry_grass_decoration(0.09, -0.03, 1)
1011
1012         -- Junglegrass
1013
1014         minetest.register_decoration({
1015                 deco_type = "simple",
1016                 place_on = {"default:dirt_with_grass"},
1017                 sidelen = 80,
1018                 fill_ratio = 0.1,
1019                 biomes = {"rainforest"},
1020                 y_min = 1,
1021                 y_max = 31000,
1022                 decoration = "default:junglegrass",
1023         })
1024
1025         -- Dry shrub
1026
1027         minetest.register_decoration({
1028                 deco_type = "simple",
1029                 place_on = {"default:desert_sand", "default:dirt_with_snow"},
1030                 sidelen = 16,
1031                 noise_params = {
1032                         offset = 0,
1033                         scale = 0.02,
1034                         spread = {x=200, y=200, z=200},
1035                         seed = 329,
1036                         octaves = 3,
1037                         persist = 0.6
1038                 },
1039                 biomes = {"desert", "tundra"},
1040                 y_min = 2,
1041                 y_max = 31000,
1042                 decoration = "default:dry_shrub",
1043         })
1044 end
1045
1046
1047 --
1048 -- Generate nyan cats
1049 --
1050
1051 -- All mapgens except singlenode
1052
1053 function default.make_nyancat(pos, facedir, length)
1054         local tailvec = {x = 0, y = 0, z = 0}
1055         if facedir == 0 then
1056                 tailvec.z = 1
1057         elseif facedir == 1 then
1058                 tailvec.x = 1
1059         elseif facedir == 2 then
1060                 tailvec.z = -1
1061         elseif facedir == 3 then
1062                 tailvec.x = -1
1063         else
1064                 facedir = 0
1065                 tailvec.z = 1
1066         end
1067         local p = {x = pos.x, y = pos.y, z = pos.z}
1068         minetest.set_node(p, {name = "default:nyancat", param2 = facedir})
1069         for i = 1, length do
1070                 p.x = p.x + tailvec.x
1071                 p.z = p.z + tailvec.z
1072                 minetest.set_node(p, {name = "default:nyancat_rainbow", param2 = facedir})
1073         end
1074 end
1075
1076 function default.generate_nyancats(minp, maxp, seed)
1077         local height_min = -31000
1078         local height_max = -32
1079         if maxp.y < height_min or minp.y > height_max then
1080                 return
1081         end
1082         local y_min = math.max(minp.y, height_min)
1083         local y_max = math.min(maxp.y, height_max)
1084         local volume = (maxp.x - minp.x + 1) * (y_max - y_min + 1) * (maxp.z - minp.z + 1)
1085         local pr = PseudoRandom(seed + 9324342)
1086         local max_num_nyancats = math.floor(volume / (16 * 16 * 16))
1087         for i = 1, max_num_nyancats do
1088                 if pr:next(0, 1000) == 0 then
1089                         local x0 = pr:next(minp.x, maxp.x)
1090                         local y0 = pr:next(minp.y, maxp.y)
1091                         local z0 = pr:next(minp.z, maxp.z)
1092                         local p0 = {x = x0, y = y0, z = z0}
1093                         default.make_nyancat(p0, pr:next(0, 3), pr:next(3, 15))
1094                 end
1095         end
1096 end
1097
1098
1099 --
1100 -- Detect mapgen to select functions
1101 --
1102
1103 -- Mods using singlenode mapgen can call these functions to enable
1104 -- the use of minetest.generate_ores or minetest.generate_decorations
1105
1106 local mg_params = minetest.get_mapgen_params()
1107 if mg_params.mgname == "v6" then
1108         default.register_ores()
1109         default.register_mgv6_decorations()
1110         minetest.register_on_generated(default.generate_nyancats)
1111 elseif mg_params.mgname ~= "singlenode" then
1112         default.register_ores()
1113         default.register_biomes()
1114         default.register_decorations()
1115         minetest.register_on_generated(default.generate_nyancats)
1116 end