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