79a3c401f66a9f12edb4da56419cc12aab721465
[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   = 16 * 16 * 16,
57                 clust_size       = 5,
58                 y_min            = -15,
59                 y_max            = 0,
60                 noise_threshhold = 0.0,
61                 noise_params     = {
62                         offset = 0.5,
63                         scale = 0.2,
64                         spread = {x = 5, y = 5, z = 5},
65                         seed = -316,
66                         octaves = 1,
67                         persist = 0.0
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   = 16 * 16 * 16,
78                 clust_size       = 5,
79                 y_min            = -31,
80                 y_max            = 4,
81                 noise_threshhold = 0.0,
82                 noise_params     = {
83                         offset = 0.5,
84                         scale = 0.2,
85                         spread = {x = 5, y = 5, z = 5},
86                         seed = 2316,
87                         octaves = 1,
88                         persist = 0.0
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   = 16 * 16 * 16,
99                 clust_size       = 5,
100                 y_min            = -31,
101                 y_max            = 31000,
102                 noise_threshhold = 0.0,
103                 noise_params     = {
104                         offset = 0.5,
105                         scale = 0.2,
106                         spread = {x = 5, y = 5, z = 5},
107                         seed = 17676,
108                         octaves = 1,
109                         persist = 0.0
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   = 16 * 16 * 16,
120                 clust_size       = 5,
121                 y_min            = -31000,
122                 y_max            = 31000,
123                 noise_threshhold = 0.0,
124                 noise_params     = {
125                         offset = 0.5,
126                         scale = 0.2,
127                         spread = {x = 5, y = 5, z = 5},
128                         seed = 766,
129                         octaves = 1,
130                         persist = 0.0
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                 node_river_water = "default:ice",
336                 y_min = -8,
337                 y_max = 31000,
338                 heat_point = 0,
339                 humidity_point = 50,
340         })
341
342         minetest.register_biome({
343                 name = "glacier_ocean",
344                 node_dust = "default:snowblock",
345                 node_top = "default:sand",
346                 depth_top = 1,
347                 node_filler = "default:sand",
348                 depth_filler = 3,
349                 --node_stone = "",
350                 --node_water_top = "",
351                 --depth_water_top = ,
352                 --node_water = "",
353                 --node_river_water = "",
354                 y_min = -112,
355                 y_max = -9,
356                 heat_point = 0,
357                 humidity_point = 50,
358         })
359
360         -- Cold
361
362         minetest.register_biome({
363                 name = "tundra",
364                 --node_dust = "",
365                 node_top = "default:dirt_with_snow",
366                 depth_top = 1,
367                 node_filler = "default:dirt",
368                 depth_filler = 1,
369                 --node_stone = "",
370                 --node_water_top = "",
371                 --depth_water_top = ,
372                 --node_water = "",
373                 --node_river_water = "",
374                 y_min = 2,
375                 y_max = 31000,
376                 heat_point = 15,
377                 humidity_point = 35,
378         })
379
380         minetest.register_biome({
381                 name = "tundra_ocean",
382                 --node_dust = "",
383                 node_top = "default:sand",
384                 depth_top = 1,
385                 node_filler = "default:sand",
386                 depth_filler = 3,
387                 --node_stone = "",
388                 --node_water_top = "",
389                 --depth_water_top = ,
390                 --node_water = "",
391                 --node_river_water = "",
392                 y_min = -112,
393                 y_max = 1,
394                 heat_point = 15,
395                 humidity_point = 35,
396         })
397
398
399         minetest.register_biome({
400                 name = "taiga",
401                 node_dust = "default:snow",
402                 node_top = "default:dirt_with_snow",
403                 depth_top = 1,
404                 node_filler = "default:dirt",
405                 depth_filler = 3,
406                 --node_stone = "",
407                 --node_water_top = "",
408                 --depth_water_top = ,
409                 --node_water = "",
410                 --node_river_water = "",
411                 y_min = 2,
412                 y_max = 31000,
413                 heat_point = 15,
414                 humidity_point = 65,
415         })
416
417         minetest.register_biome({
418                 name = "taiga_ocean",
419                 --node_dust = "",
420                 node_top = "default:sand",
421                 depth_top = 1,
422                 node_filler = "default:sand",
423                 depth_filler = 3,
424                 --node_stone = "",
425                 --node_water_top = "",
426                 --depth_water_top = ,
427                 --node_water = "",
428                 --node_river_water = "",
429                 y_min = -112,
430                 y_max = 1,
431                 heat_point = 15,
432                 humidity_point = 65,
433         })
434
435         -- Temperate
436
437         minetest.register_biome({
438                 name = "stone_grassland",
439                 --node_dust = "",
440                 node_top = "default:dirt_with_grass",
441                 depth_top = 1,
442                 node_filler = "default:dirt",
443                 depth_filler = 1,
444                 --node_stone = "",
445                 --node_water_top = "",
446                 --depth_water_top = ,
447                 --node_water = "",
448                 --node_river_water = "",
449                 y_min = 5,
450                 y_max = 31000,
451                 heat_point = 40,
452                 humidity_point = 35,
453         })
454
455         minetest.register_biome({
456                 name = "stone_grassland_ocean",
457                 --node_dust = "",
458                 node_top = "default:sand",
459                 depth_top = 1,
460                 node_filler = "default:sand",
461                 depth_filler = 3,
462                 --node_stone = "",
463                 --node_water_top = "",
464                 --depth_water_top = ,
465                 --node_water = "",
466                 --node_river_water = "",
467                 y_min = -112,
468                 y_max = 4,
469                 heat_point = 40,
470                 humidity_point = 35,
471         })
472
473
474         minetest.register_biome({
475                 name = "coniferous_forest",
476                 --node_dust = "",
477                 node_top = "default:dirt_with_grass",
478                 depth_top = 1,
479                 node_filler = "default:dirt",
480                 depth_filler = 3,
481                 --node_stone = "",
482                 --node_water_top = "",
483                 --depth_water_top = ,
484                 --node_water = "",
485                 --node_river_water = "",
486                 y_min = 5,
487                 y_max = 31000,
488                 heat_point = 40,
489                 humidity_point = 65,
490         })
491
492         minetest.register_biome({
493                 name = "coniferous_forest_ocean",
494                 --node_dust = "",
495                 node_top = "default:sand",
496                 depth_top = 1,
497                 node_filler = "default:sand",
498                 depth_filler = 3,
499                 --node_stone = "",
500                 --node_water_top = "",
501                 --depth_water_top = ,
502                 --node_water = "",
503                 --node_river_water = "",
504                 y_min = -112,
505                 y_max = 4,
506                 heat_point = 40,
507                 humidity_point = 65,
508         })
509
510
511         minetest.register_biome({
512                 name = "sandstone_grassland",
513                 --node_dust = "",
514                 node_top = "default:dirt_with_grass",
515                 depth_top = 1,
516                 node_filler = "default:dirt",
517                 depth_filler = 1,
518                 node_stone = "default:sandstone",
519                 --node_water_top = "",
520                 --depth_water_top = ,
521                 --node_water = "",
522                 --node_river_water = "",
523                 y_min = 5,
524                 y_max = 31000,
525                 heat_point = 60,
526                 humidity_point = 35,
527         })
528
529         minetest.register_biome({
530                 name = "sandstone_grassland_ocean",
531                 --node_dust = "",
532                 node_top = "default:sand",
533                 depth_top = 1,
534                 node_filler = "default:sand",
535                 depth_filler = 3,
536                 node_stone = "default:sandstone",
537                 --node_water_top = "",
538                 --depth_water_top = ,
539                 --node_water = "",
540                 --node_river_water = "",
541                 y_min = -112,
542                 y_max = 4,
543                 heat_point = 60,
544                 humidity_point = 35,
545         })
546
547
548         minetest.register_biome({
549                 name = "deciduous_forest",
550                 --node_dust = "",
551                 node_top = "default:dirt_with_grass",
552                 depth_top = 1,
553                 node_filler = "default:dirt",
554                 depth_filler = 3,
555                 --node_stone = "",
556                 --node_water_top = "",
557                 --depth_water_top = ,
558                 --node_water = "",
559                 --node_river_water = "",
560                 y_min = 1,
561                 y_max = 31000,
562                 heat_point = 60,
563                 humidity_point = 65,
564         })
565
566         minetest.register_biome({
567                 name = "deciduous_forest_swamp",
568                 --node_dust = "",
569                 node_top = "default:dirt",
570                 depth_top = 1,
571                 node_filler = "default:dirt",
572                 depth_filler = 3,
573                 --node_stone = "",
574                 --node_water_top = "",
575                 --depth_water_top = ,
576                 --node_water = "",
577                 --node_river_water = "",
578                 y_min = -3,
579                 y_max = 0,
580                 heat_point = 60,
581                 humidity_point = 65,
582         })
583
584         minetest.register_biome({
585                 name = "deciduous_forest_ocean",
586                 --node_dust = "",
587                 node_top = "default:sand",
588                 depth_top = 1,
589                 node_filler = "default:sand",
590                 depth_filler = 3,
591                 --node_stone = "",
592                 --node_water_top = "",
593                 --depth_water_top = ,
594                 --node_water = "",
595                 --node_river_water = "",
596                 y_min = -112,
597                 y_max = -4,
598                 heat_point = 60,
599                 humidity_point = 65,
600         })
601
602         -- Hot
603
604         minetest.register_biome({
605                 name = "desert",
606                 --node_dust = "",
607                 node_top = "default:desert_sand",
608                 depth_top = 1,
609                 node_filler = "default:desert_sand",
610                 depth_filler = 1,
611                 node_stone = "default:desert_stone",
612                 --node_water_top = "",
613                 --depth_water_top = ,
614                 --node_water = "",
615                 --node_river_water = "",
616                 y_min = 5,
617                 y_max = 31000,
618                 heat_point = 85,
619                 humidity_point = 20,
620         })
621
622         minetest.register_biome({
623                 name = "desert_ocean",
624                 --node_dust = "",
625                 node_top = "default:sand",
626                 depth_top = 1,
627                 node_filler = "default:sand",
628                 depth_filler = 3,
629                 node_stone = "default:desert_stone",
630                 --node_water_top = "",
631                 --depth_water_top = ,
632                 --node_water = "",
633                 --node_river_water = "",
634                 y_min = -112,
635                 y_max = 4,
636                 heat_point = 85,
637                 humidity_point = 20,
638         })
639
640
641         minetest.register_biome({
642                 name = "savanna",
643                 --node_dust = "",
644                 node_top = "default:dirt_with_dry_grass",
645                 depth_top = 1,
646                 node_filler = "default:dirt",
647                 depth_filler = 1,
648                 --node_stone = "",
649                 --node_water_top = "",
650                 --depth_water_top = ,
651                 --node_water = "",
652                 --node_river_water = "",
653                 y_min = 1,
654                 y_max = 31000,
655                 heat_point = 85,
656                 humidity_point = 50,
657         })
658
659         minetest.register_biome({
660                 name = "savanna_swamp",
661                 --node_dust = "",
662                 node_top = "default:dirt",
663                 depth_top = 1,
664                 node_filler = "default:dirt",
665                 depth_filler = 3,
666                 --node_stone = "",
667                 --node_water_top = "",
668                 --depth_water_top = ,
669                 --node_water = "",
670                 --node_river_water = "",
671                 y_min = -3,
672                 y_max = 0,
673                 heat_point = 85,
674                 humidity_point = 50,
675         })
676
677         minetest.register_biome({
678                 name = "savanna_ocean",
679                 --node_dust = "",
680                 node_top = "default:sand",
681                 depth_top = 1,
682                 node_filler = "default:sand",
683                 depth_filler = 3,
684                 --node_stone = "",
685                 --node_water_top = "",
686                 --depth_water_top = ,
687                 --node_water = "",
688                 --node_river_water = "",
689                 y_min = -112,
690                 y_max = -4,
691                 heat_point = 85,
692                 humidity_point = 50,
693         })
694
695
696         minetest.register_biome({
697                 name = "rainforest",
698                 --node_dust = "",
699                 node_top = "default:dirt_with_grass",
700                 depth_top = 1,
701                 node_filler = "default:dirt",
702                 depth_filler = 3,
703                 --node_stone = "",
704                 --node_water_top = "",
705                 --depth_water_top = ,
706                 --node_water = "",
707                 --node_river_water = "",
708                 y_min = 1,
709                 y_max = 31000,
710                 heat_point = 85,
711                 humidity_point = 80,
712         })
713
714         minetest.register_biome({
715                 name = "rainforest_swamp",
716                 --node_dust = "",
717                 node_top = "default:dirt",
718                 depth_top = 1,
719                 node_filler = "default:dirt",
720                 depth_filler = 3,
721                 --node_stone = "",
722                 --node_water_top = "",
723                 --depth_water_top = ,
724                 --node_water = "",
725                 --node_river_water = "",
726                 y_min = -3,
727                 y_max = 0,
728                 heat_point = 85,
729                 humidity_point = 80,
730         })
731
732         minetest.register_biome({
733                 name = "rainforest_ocean",
734                 --node_dust = "",
735                 node_top = "default:sand",
736                 depth_top = 1,
737                 node_filler = "default:sand",
738                 depth_filler = 3,
739                 --node_stone = "",
740                 --node_water_top = "",
741                 --depth_water_top = ,
742                 --node_water = "",
743                 --node_river_water = "",
744                 y_min = -112,
745                 y_max = -4,
746                 heat_point = 85,
747                 humidity_point = 80,
748         })
749
750         -- Underground
751
752         minetest.register_biome({
753                 name = "underground",
754                 --node_dust = "",
755                 --node_top = "",
756                 --depth_top = ,
757                 --node_filler = "",
758                 --depth_filler = ,
759                 --node_stone = "",
760                 --node_water_top = "",
761                 --depth_water_top = ,
762                 --node_water = "",
763                 --node_river_water = "",
764                 y_min = -31000,
765                 y_max = -113,
766                 heat_point = 50,
767                 humidity_point = 50,
768         })
769 end
770
771
772 --
773 -- Register decorations
774 --
775
776 -- Mgv6
777
778 function default.register_mgv6_decorations()
779         minetest.clear_registered_decorations()
780
781         -- Papyrus
782
783         minetest.register_decoration({
784                 deco_type = "simple",
785                 place_on = {"default:dirt_with_grass"},
786                 sidelen = 16,
787                 noise_params = {
788                         offset = -0.3,
789                         scale = 0.7,
790                         spread = {x = 100, y = 100, z = 100},
791                         seed = 354,
792                         octaves = 3,
793                         persist = 0.7
794                 },
795                 y_min = 1,
796                 y_max = 1,
797                 decoration = "default:papyrus",
798                 height = 2,
799                 height_max = 4,
800                 spawn_by = "default:water_source",
801                 num_spawn_by = 1,
802         })
803
804         -- Cacti
805
806         minetest.register_decoration({
807                 deco_type = "simple",
808                 place_on = {"default:desert_sand"},
809                 sidelen = 16,
810                 noise_params = {
811                         offset = -0.012,
812                         scale = 0.024,
813                         spread = {x = 100, y = 100, z = 100},
814                         seed = 230,
815                         octaves = 3,
816                         persist = 0.6
817                 },
818                 y_min = 1,
819                 y_max = 30,
820                 decoration = "default:cactus",
821                 height = 3,
822                 height_max = 4,
823         })
824
825         -- Long grasses
826
827         for length = 1, 5 do
828                 minetest.register_decoration({
829                         deco_type = "simple",
830                         place_on = {"default:dirt_with_grass"},
831                         sidelen = 16,
832                         noise_params = {
833                                 offset = 0,
834                                 scale = 0.007,
835                                 spread = {x = 100, y = 100, z = 100},
836                                 seed = 329,
837                                 octaves = 3,
838                                 persist = 0.6
839                         },
840                         y_min = 1,
841                         y_max = 30,
842                         decoration = "default:grass_"..length,
843                 })
844         end
845
846         -- Dry shrubs
847
848         minetest.register_decoration({
849                 deco_type = "simple",
850                 place_on = {"default:desert_sand", "default:dirt_with_snow"},
851                 sidelen = 16,
852                 noise_params = {
853                         offset = 0,
854                         scale = 0.035,
855                         spread = {x = 100, y = 100, z = 100},
856                         seed = 329,
857                         octaves = 3,
858                         persist = 0.6
859                 },
860                 y_min = 1,
861                 y_max = 30,
862                 decoration = "default:dry_shrub",
863         })
864 end
865
866 -- All mapgens except mgv6 and singlenode
867
868 local function register_grass_decoration(offset, scale, length)
869         minetest.register_decoration({
870                 deco_type = "simple",
871                 place_on = {"default:dirt_with_grass", "default:sand"},
872                 sidelen = 16,
873                 noise_params = {
874                         offset = offset,
875                         scale = scale,
876                         spread = {x = 200, y = 200, z = 200},
877                         seed = 329,
878                         octaves = 3,
879                         persist = 0.6
880                 },
881                 biomes = {"stone_grassland", "sandstone_grassland",
882                         "deciduous_forest", "coniferous_forest"},
883                 y_min = 1,
884                 y_max = 31000,
885                 decoration = "default:grass_"..length,
886         })
887 end
888
889 local function register_dry_grass_decoration(offset, scale, length)
890         minetest.register_decoration({
891                 deco_type = "simple",
892                 place_on = {"default:dirt_with_dry_grass"},
893                 sidelen = 16,
894                 noise_params = {
895                         offset = offset,
896                         scale = scale,
897                         spread = {x = 200, y = 200, z = 200},
898                         seed = 329,
899                         octaves = 3,
900                         persist = 0.6
901                 },
902                 biomes = {"savanna"},
903                 y_min = 1,
904                 y_max = 31000,
905                 decoration = "default:dry_grass_"..length,
906         })
907 end
908
909 function default.register_decorations()
910         minetest.clear_registered_decorations()
911
912         -- Apple tree
913
914         minetest.register_decoration({
915                 deco_type = "schematic",
916                 place_on = {"default:dirt_with_grass"},
917                 sidelen = 16,
918                 noise_params = {
919                         offset = 0.04,
920                         scale = 0.02,
921                         spread = {x = 250, y = 250, z = 250},
922                         seed = 2,
923                         octaves = 3,
924                         persist = 0.66
925                 },
926                 biomes = {"deciduous_forest"},
927                 y_min = 1,
928                 y_max = 31000,
929                 schematic = minetest.get_modpath("default").."/schematics/apple_tree.mts",
930                 flags = "place_center_x, place_center_z",
931         })
932
933         -- Jungle tree
934
935         minetest.register_decoration({
936                 deco_type = "schematic",
937                 place_on = {"default:dirt_with_grass", "default:dirt"},
938                 sidelen = 80,
939                 fill_ratio = 0.09,
940                 biomes = {"rainforest", "rainforest_swamp"},
941                 y_min = 0,
942                 y_max = 31000,
943                 schematic = minetest.get_modpath("default").."/schematics/jungle_tree.mts",
944                 flags = "place_center_x, place_center_z",
945                 rotation = "random",
946         })
947
948         -- Taiga and temperate coniferous forest pine tree
949
950         minetest.register_decoration({
951                 deco_type = "schematic",
952                 place_on = {"default:dirt_with_snow", "default:dirt_with_grass"},
953                 sidelen = 16,
954                 noise_params = {
955                         offset = 0.04,
956                         scale = 0.02,
957                         spread = {x = 250, y = 250, z = 250},
958                         seed = 2,
959                         octaves = 3,
960                         persist = 0.66
961                 },
962                 biomes = {"taiga", "coniferous_forest"},
963                 y_min = 2,
964                 y_max = 31000,
965                 schematic = minetest.get_modpath("default").."/schematics/pine_tree.mts",
966                 flags = "place_center_x, place_center_z",
967         })
968
969         -- Acacia tree
970
971         minetest.register_decoration({
972                 deco_type = "schematic",
973                 place_on = {"default:dirt_with_dry_grass"},
974                 sidelen = 16,
975                 noise_params = {
976                         offset = 0,
977                         scale = 0.002,
978                         spread = {x = 250, y = 250, z = 250},
979                         seed = 2,
980                         octaves = 3,
981                         persist = 0.66
982                 },
983                 biomes = {"savanna"},
984                 y_min = 1,
985                 y_max = 31000,
986                 schematic = minetest.get_modpath("default").."/schematics/acacia_tree.mts",
987                 flags = "place_center_x, place_center_z",
988                 rotation = "random",
989         })
990
991         -- Large cactus
992
993         minetest.register_decoration({
994                 deco_type = "schematic",
995                 place_on = {"default:desert_sand"},
996                 sidelen = 16,
997                 noise_params = {
998                         offset = -0.0003,
999                         scale = 0.0009,
1000                         spread = {x = 200, y = 200, z = 200},
1001                         seed = 230,
1002                         octaves = 3,
1003                         persist = 0.6
1004                 },
1005                 biomes = {"desert"},
1006                 y_min = 5,
1007                 y_max = 31000,
1008                 schematic = minetest.get_modpath("default").."/schematics/large_cactus.mts",
1009                 flags = "place_center_x",
1010                 rotation = "random",
1011         })
1012
1013         -- Cactus
1014
1015         minetest.register_decoration({
1016                 deco_type = "simple",
1017                 place_on = {"default:desert_sand"},
1018                 sidelen = 16,
1019                 noise_params = {
1020                         offset = -0.0003,
1021                         scale = 0.0009,
1022                         spread = {x = 200, y = 200, z = 200},
1023                         seed = 230,
1024                         octaves = 3,
1025                         persist = 0.6
1026                 },
1027                 biomes = {"desert"},
1028                 y_min = 5,
1029                 y_max = 31000,
1030                 decoration = "default:cactus",
1031                 height = 2,
1032                 height_max = 5,
1033         })
1034
1035         -- Papyrus
1036
1037         minetest.register_decoration({
1038                 deco_type = "schematic",
1039                 place_on = {"default:dirt"},
1040                 sidelen = 16,
1041                 noise_params = {
1042                         offset = -0.3,
1043                         scale = 0.7,
1044                         spread = {x = 200, y = 200, z = 200},
1045                         seed = 354,
1046                         octaves = 3,
1047                         persist = 0.7
1048                 },
1049                 biomes = {"savanna_swamp"},
1050                 y_min = 0,
1051                 y_max = 0,
1052                 schematic = minetest.get_modpath("default").."/schematics/papyrus.mts",
1053         })
1054
1055         -- Grasses
1056
1057         register_grass_decoration(-0.03,  0.09,  5)
1058         register_grass_decoration(-0.015, 0.075, 4)
1059         register_grass_decoration(0,      0.06,  3)
1060         register_grass_decoration(0.015,  0.045, 2)
1061         register_grass_decoration(0.03,   0.03,  1)
1062
1063         -- Dry grasses
1064
1065         register_dry_grass_decoration(0.01, 0.05,  5)
1066         register_dry_grass_decoration(0.03, 0.03,  4)
1067         register_dry_grass_decoration(0.05, 0.01,  3)
1068         register_dry_grass_decoration(0.07, -0.01, 2)
1069         register_dry_grass_decoration(0.09, -0.03, 1)
1070
1071         -- Junglegrass
1072
1073         minetest.register_decoration({
1074                 deco_type = "simple",
1075                 place_on = {"default:dirt_with_grass"},
1076                 sidelen = 80,
1077                 fill_ratio = 0.1,
1078                 biomes = {"rainforest"},
1079                 y_min = 1,
1080                 y_max = 31000,
1081                 decoration = "default:junglegrass",
1082         })
1083
1084         -- Dry shrub
1085
1086         minetest.register_decoration({
1087                 deco_type = "simple",
1088                 place_on = {"default:desert_sand", "default:dirt_with_snow"},
1089                 sidelen = 16,
1090                 noise_params = {
1091                         offset = 0,
1092                         scale = 0.02,
1093                         spread = {x = 200, y = 200, z = 200},
1094                         seed = 329,
1095                         octaves = 3,
1096                         persist = 0.6
1097                 },
1098                 biomes = {"desert", "tundra"},
1099                 y_min = 2,
1100                 y_max = 31000,
1101                 decoration = "default:dry_shrub",
1102         })
1103 end
1104
1105
1106 --
1107 -- Generate nyan cats
1108 --
1109
1110 -- All mapgens except singlenode
1111
1112 function default.make_nyancat(pos, facedir, length)
1113         local tailvec = {x = 0, y = 0, z = 0}
1114         if facedir == 0 then
1115                 tailvec.z = 1
1116         elseif facedir == 1 then
1117                 tailvec.x = 1
1118         elseif facedir == 2 then
1119                 tailvec.z = -1
1120         elseif facedir == 3 then
1121                 tailvec.x = -1
1122         else
1123                 facedir = 0
1124                 tailvec.z = 1
1125         end
1126         local p = {x = pos.x, y = pos.y, z = pos.z}
1127         minetest.set_node(p, {name = "default:nyancat", param2 = facedir})
1128         for i = 1, length do
1129                 p.x = p.x + tailvec.x
1130                 p.z = p.z + tailvec.z
1131                 minetest.set_node(p, {name = "default:nyancat_rainbow", param2 = facedir})
1132         end
1133 end
1134
1135 function default.generate_nyancats(minp, maxp, seed)
1136         local height_min = -31000
1137         local height_max = -32
1138         if maxp.y < height_min or minp.y > height_max then
1139                 return
1140         end
1141         local y_min = math.max(minp.y, height_min)
1142         local y_max = math.min(maxp.y, height_max)
1143         local volume = (maxp.x - minp.x + 1) * (y_max - y_min + 1) * (maxp.z - minp.z + 1)
1144         local pr = PseudoRandom(seed + 9324342)
1145         local max_num_nyancats = math.floor(volume / (16 * 16 * 16))
1146         for i = 1, max_num_nyancats do
1147                 if pr:next(0, 1000) == 0 then
1148                         local x0 = pr:next(minp.x, maxp.x)
1149                         local y0 = pr:next(minp.y, maxp.y)
1150                         local z0 = pr:next(minp.z, maxp.z)
1151                         local p0 = {x = x0, y = y0, z = z0}
1152                         default.make_nyancat(p0, pr:next(0, 3), pr:next(3, 15))
1153                 end
1154         end
1155 end
1156
1157
1158 --
1159 -- Detect mapgen to select functions
1160 --
1161
1162 -- Mods using singlenode mapgen can call these functions to enable
1163 -- the use of minetest.generate_ores or minetest.generate_decorations
1164
1165 local mg_params = minetest.get_mapgen_params()
1166 if mg_params.mgname == "v6" then
1167         default.register_ores()
1168         default.register_mgv6_decorations()
1169         minetest.register_on_generated(default.generate_nyancats)
1170 elseif mg_params.mgname ~= "singlenode" then
1171         default.register_ores()
1172         default.register_biomes()
1173         default.register_decorations()
1174         minetest.register_on_generated(default.generate_nyancats)
1175 end