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