@@ -41,9 +41,10 @@ with this program; if not, write to the Free Software Foundation, Inc.,
41
41
42
42
43
43
FlagDesc flagdesc_mapgen_v7[] = {
44
- {" mountains" , MGV7_MOUNTAINS},
45
- {" ridges" , MGV7_RIDGES},
46
- {NULL , 0 }
44
+ {" mountains" , MGV7_MOUNTAINS},
45
+ {" ridges" , MGV7_RIDGES},
46
+ {" floatlands" , MGV7_FLOATLANDS},
47
+ {NULL , 0 }
47
48
};
48
49
49
50
@@ -53,17 +54,23 @@ FlagDesc flagdesc_mapgen_v7[] = {
53
54
MapgenV7::MapgenV7 (int mapgenid, MapgenV7Params *params, EmergeManager *emerge)
54
55
: MapgenBasic(mapgenid, params, emerge)
55
56
{
56
- this ->spflags = params->spflags ;
57
- this ->cave_width = params->cave_width ;
57
+ this ->spflags = params->spflags ;
58
+ this ->cave_width = params->cave_width ;
59
+ this ->float_mount_density = params->float_mount_density ;
60
+ this ->float_mount_height = params->float_mount_height ;
61
+ this ->floatland_level = params->floatland_level ;
62
+ this ->shadow_limit = params->shadow_limit ;
58
63
59
64
// // Terrain noise
60
- noise_terrain_base = new Noise (¶ms->np_terrain_base , seed, csize.X , csize.Z );
61
- noise_terrain_alt = new Noise (¶ms->np_terrain_alt , seed, csize.X , csize.Z );
62
- noise_terrain_persist = new Noise (¶ms->np_terrain_persist , seed, csize.X , csize.Z );
63
- noise_height_select = new Noise (¶ms->np_height_select , seed, csize.X , csize.Z );
64
- noise_filler_depth = new Noise (¶ms->np_filler_depth , seed, csize.X , csize.Z );
65
- noise_mount_height = new Noise (¶ms->np_mount_height , seed, csize.X , csize.Z );
66
- noise_ridge_uwater = new Noise (¶ms->np_ridge_uwater , seed, csize.X , csize.Z );
65
+ noise_terrain_base = new Noise (¶ms->np_terrain_base , seed, csize.X , csize.Z );
66
+ noise_terrain_alt = new Noise (¶ms->np_terrain_alt , seed, csize.X , csize.Z );
67
+ noise_terrain_persist = new Noise (¶ms->np_terrain_persist , seed, csize.X , csize.Z );
68
+ noise_height_select = new Noise (¶ms->np_height_select , seed, csize.X , csize.Z );
69
+ noise_filler_depth = new Noise (¶ms->np_filler_depth , seed, csize.X , csize.Z );
70
+ noise_mount_height = new Noise (¶ms->np_mount_height , seed, csize.X , csize.Z );
71
+ noise_ridge_uwater = new Noise (¶ms->np_ridge_uwater , seed, csize.X , csize.Z );
72
+ noise_floatland_base = new Noise (¶ms->np_floatland_base , seed, csize.X , csize.Z );
73
+ noise_float_base_height = new Noise (¶ms->np_float_base_height , seed, csize.X , csize.Z );
67
74
68
75
// // 3d terrain noise
69
76
// 1-up 1-down overgeneration
@@ -84,65 +91,85 @@ MapgenV7::~MapgenV7()
84
91
delete noise_filler_depth;
85
92
delete noise_mount_height;
86
93
delete noise_ridge_uwater;
94
+ delete noise_floatland_base;
95
+ delete noise_float_base_height;
87
96
delete noise_mountain;
88
97
delete noise_ridge;
89
98
}
90
99
91
100
92
101
MapgenV7Params::MapgenV7Params ()
93
102
{
94
- spflags = MGV7_MOUNTAINS | MGV7_RIDGES;
95
- cave_width = 0.2 ;
96
-
97
- np_terrain_base = NoiseParams (4 , 70 , v3f (600 , 600 , 600 ), 82341 , 5 , 0.6 , 2.0 );
98
- np_terrain_alt = NoiseParams (4 , 25 , v3f (600 , 600 , 600 ), 5934 , 5 , 0.6 , 2.0 );
99
- np_terrain_persist = NoiseParams (0.6 , 0.1 , v3f (2000 , 2000 , 2000 ), 539 , 3 , 0.6 , 2.0 );
100
- np_height_select = NoiseParams (-8 , 16 , v3f (500 , 500 , 500 ), 4213 , 6 , 0.7 , 2.0 );
101
- np_filler_depth = NoiseParams (0 , 1.2 , v3f (150 , 150 , 150 ), 261 , 3 , 0.7 , 2.0 );
102
- np_mount_height = NoiseParams (256 , 112 , v3f (1000 , 1000 , 1000 ), 72449 , 3 , 0.6 , 2.0 );
103
- np_ridge_uwater = NoiseParams (0 , 1 , v3f (1000 , 1000 , 1000 ), 85039 , 5 , 0.6 , 2.0 );
104
- np_mountain = NoiseParams (-0.6 , 1 , v3f (250 , 350 , 250 ), 5333 , 5 , 0.63 , 2.0 );
105
- np_ridge = NoiseParams (0 , 1 , v3f (100 , 100 , 100 ), 6467 , 4 , 0.75 , 2.0 );
106
- np_cave1 = NoiseParams (0 , 12 , v3f (61 , 61 , 61 ), 52534 , 3 , 0.5 , 2.0 );
107
- np_cave2 = NoiseParams (0 , 12 , v3f (67 , 67 , 67 ), 10325 , 3 , 0.5 , 2.0 );
103
+ spflags = MGV7_MOUNTAINS | MGV7_RIDGES;
104
+ cave_width = 0.2 ;
105
+ float_mount_density = 0.6 ;
106
+ float_mount_height = 128.0 ;
107
+ floatland_level = 1280 ;
108
+ shadow_limit = 1024 ;
109
+
110
+ np_terrain_base = NoiseParams (4 , 70 , v3f (600 , 600 , 600 ), 82341 , 5 , 0.6 , 2.0 );
111
+ np_terrain_alt = NoiseParams (4 , 25 , v3f (600 , 600 , 600 ), 5934 , 5 , 0.6 , 2.0 );
112
+ np_terrain_persist = NoiseParams (0.6 , 0.1 , v3f (2000 , 2000 , 2000 ), 539 , 3 , 0.6 , 2.0 );
113
+ np_height_select = NoiseParams (-8 , 16 , v3f (500 , 500 , 500 ), 4213 , 6 , 0.7 , 2.0 );
114
+ np_filler_depth = NoiseParams (0 , 1.2 , v3f (150 , 150 , 150 ), 261 , 3 , 0.7 , 2.0 );
115
+ np_mount_height = NoiseParams (256 , 112 , v3f (1000 , 1000 , 1000 ), 72449 , 3 , 0.6 , 2.0 );
116
+ np_ridge_uwater = NoiseParams (0 , 1 , v3f (1000 , 1000 , 1000 ), 85039 , 5 , 0.6 , 2.0 );
117
+ np_floatland_base = NoiseParams (-0.6 , 1.5 , v3f (600 , 600 , 600 ), 114 , 5 , 0.6 , 2.0 );
118
+ np_float_base_height = NoiseParams (48 , 24 , v3f (300 , 300 , 300 ), 907 , 4 , 0.7 , 2.0 );
119
+ np_mountain = NoiseParams (-0.6 , 1 , v3f (250 , 350 , 250 ), 5333 , 5 , 0.63 , 2.0 );
120
+ np_ridge = NoiseParams (0 , 1 , v3f (100 , 100 , 100 ), 6467 , 4 , 0.75 , 2.0 );
121
+ np_cave1 = NoiseParams (0 , 12 , v3f (61 , 61 , 61 ), 52534 , 3 , 0.5 , 2.0 );
122
+ np_cave2 = NoiseParams (0 , 12 , v3f (67 , 67 , 67 ), 10325 , 3 , 0.5 , 2.0 );
108
123
}
109
124
110
125
111
126
void MapgenV7Params::readParams (const Settings *settings)
112
127
{
113
- settings->getFlagStrNoEx (" mgv7_spflags" , spflags, flagdesc_mapgen_v7);
114
- settings->getFloatNoEx (" mgv7_cave_width" , cave_width);
115
-
116
- settings->getNoiseParams (" mgv7_np_terrain_base" , np_terrain_base);
117
- settings->getNoiseParams (" mgv7_np_terrain_alt" , np_terrain_alt);
118
- settings->getNoiseParams (" mgv7_np_terrain_persist" , np_terrain_persist);
119
- settings->getNoiseParams (" mgv7_np_height_select" , np_height_select);
120
- settings->getNoiseParams (" mgv7_np_filler_depth" , np_filler_depth);
121
- settings->getNoiseParams (" mgv7_np_mount_height" , np_mount_height);
122
- settings->getNoiseParams (" mgv7_np_ridge_uwater" , np_ridge_uwater);
123
- settings->getNoiseParams (" mgv7_np_mountain" , np_mountain);
124
- settings->getNoiseParams (" mgv7_np_ridge" , np_ridge);
125
- settings->getNoiseParams (" mgv7_np_cave1" , np_cave1);
126
- settings->getNoiseParams (" mgv7_np_cave2" , np_cave2);
128
+ settings->getFlagStrNoEx (" mgv7_spflags" , spflags, flagdesc_mapgen_v7);
129
+ settings->getFloatNoEx (" mgv7_cave_width" , cave_width);
130
+ settings->getFloatNoEx (" mgv7_float_mount_density" , float_mount_density);
131
+ settings->getFloatNoEx (" mgv7_float_mount_height" , float_mount_height);
132
+ settings->getS16NoEx (" mgv7_floatland_level" , floatland_level);
133
+ settings->getS16NoEx (" mgv7_shadow_limit" , shadow_limit);
134
+
135
+ settings->getNoiseParams (" mgv7_np_terrain_base" , np_terrain_base);
136
+ settings->getNoiseParams (" mgv7_np_terrain_alt" , np_terrain_alt);
137
+ settings->getNoiseParams (" mgv7_np_terrain_persist" , np_terrain_persist);
138
+ settings->getNoiseParams (" mgv7_np_height_select" , np_height_select);
139
+ settings->getNoiseParams (" mgv7_np_filler_depth" , np_filler_depth);
140
+ settings->getNoiseParams (" mgv7_np_mount_height" , np_mount_height);
141
+ settings->getNoiseParams (" mgv7_np_ridge_uwater" , np_ridge_uwater);
142
+ settings->getNoiseParams (" mgv7_np_floatland_base" , np_floatland_base);
143
+ settings->getNoiseParams (" mgv7_np_float_base_height" , np_float_base_height);
144
+ settings->getNoiseParams (" mgv7_np_mountain" , np_mountain);
145
+ settings->getNoiseParams (" mgv7_np_ridge" , np_ridge);
146
+ settings->getNoiseParams (" mgv7_np_cave1" , np_cave1);
147
+ settings->getNoiseParams (" mgv7_np_cave2" , np_cave2);
127
148
}
128
149
129
150
130
151
void MapgenV7Params::writeParams (Settings *settings) const
131
152
{
132
- settings->setFlagStr (" mgv7_spflags" , spflags, flagdesc_mapgen_v7, U32_MAX);
133
- settings->setFloat (" mgv7_cave_width" , cave_width);
134
-
135
- settings->setNoiseParams (" mgv7_np_terrain_base" , np_terrain_base);
136
- settings->setNoiseParams (" mgv7_np_terrain_alt" , np_terrain_alt);
137
- settings->setNoiseParams (" mgv7_np_terrain_persist" , np_terrain_persist);
138
- settings->setNoiseParams (" mgv7_np_height_select" , np_height_select);
139
- settings->setNoiseParams (" mgv7_np_filler_depth" , np_filler_depth);
140
- settings->setNoiseParams (" mgv7_np_mount_height" , np_mount_height);
141
- settings->setNoiseParams (" mgv7_np_ridge_uwater" , np_ridge_uwater);
142
- settings->setNoiseParams (" mgv7_np_mountain" , np_mountain);
143
- settings->setNoiseParams (" mgv7_np_ridge" , np_ridge);
144
- settings->setNoiseParams (" mgv7_np_cave1" , np_cave1);
145
- settings->setNoiseParams (" mgv7_np_cave2" , np_cave2);
153
+ settings->setFlagStr (" mgv7_spflags" , spflags, flagdesc_mapgen_v7, U32_MAX);
154
+ settings->setFloat (" mgv7_cave_width" , cave_width);
155
+ settings->setFloat (" mgv7_float_mount_density" , float_mount_density);
156
+ settings->setFloat (" mgv7_float_mount_height" , float_mount_height);
157
+ settings->setS16 (" mgv7_floatland_level" , floatland_level);
158
+ settings->setS16 (" mgv7_shadow_limit" , shadow_limit);
159
+
160
+ settings->setNoiseParams (" mgv7_np_terrain_base" , np_terrain_base);
161
+ settings->setNoiseParams (" mgv7_np_terrain_alt" , np_terrain_alt);
162
+ settings->setNoiseParams (" mgv7_np_terrain_persist" , np_terrain_persist);
163
+ settings->setNoiseParams (" mgv7_np_height_select" , np_height_select);
164
+ settings->setNoiseParams (" mgv7_np_filler_depth" , np_filler_depth);
165
+ settings->setNoiseParams (" mgv7_np_mount_height" , np_mount_height);
166
+ settings->setNoiseParams (" mgv7_np_ridge_uwater" , np_ridge_uwater);
167
+ settings->setNoiseParams (" mgv7_np_floatland_base" , np_floatland_base);
168
+ settings->setNoiseParams (" mgv7_np_float_base_height" , np_float_base_height);
169
+ settings->setNoiseParams (" mgv7_np_mountain" , np_mountain);
170
+ settings->setNoiseParams (" mgv7_np_ridge" , np_ridge);
171
+ settings->setNoiseParams (" mgv7_np_cave1" , np_cave1);
172
+ settings->setNoiseParams (" mgv7_np_cave2" , np_cave2);
146
173
}
147
174
148
175
@@ -249,9 +276,13 @@ void MapgenV7::makeChunk(BlockMakeData *data)
249
276
250
277
updateLiquid (&data->transforming_liquid , full_node_min, full_node_max);
251
278
279
+ // Limit floatland shadow
280
+ bool propagate_shadow = !((spflags & MGV7_FLOATLANDS) &&
281
+ node_min.Y <= shadow_limit && node_max.Y >= shadow_limit);
282
+
252
283
if (flags & MG_LIGHT)
253
284
calcLighting (node_min - v3s16 (0 , 1 , 0 ), node_max + v3s16 (0 , 1 , 0 ),
254
- full_node_min, full_node_max);
285
+ full_node_min, full_node_max, propagate_shadow );
255
286
256
287
// setLighting(node_min - v3s16(1, 0, 1) * MAP_BLOCKSIZE,
257
288
// node_max + v3s16(1, 0, 1) * MAP_BLOCKSIZE, 0xFF);
@@ -313,6 +344,47 @@ bool MapgenV7::getMountainTerrainFromMap(int idx_xyz, int idx_xz, s16 y)
313
344
}
314
345
315
346
347
+ bool MapgenV7::getFloatlandMountainFromMap (int idx_xyz, int idx_xz, s16 y)
348
+ {
349
+ float density_gradient =
350
+ -pow (fabs ((float )(y - floatland_level) / float_mount_height), 0 .8f );
351
+ float floatn = noise_mountain->result [idx_xyz] + float_mount_density;
352
+
353
+ return floatn + density_gradient >= 0 .0f ;
354
+ }
355
+
356
+
357
+ void MapgenV7::floatBaseExtentFromMap (s16 *float_base_min, s16 *float_base_max, int idx_xz)
358
+ {
359
+ // '+1' to avoid a layer of stone at y = MAX_MAP_GENERATION_LIMIT
360
+ s16 base_min = MAX_MAP_GENERATION_LIMIT + 1 ;
361
+ s16 base_max = MAX_MAP_GENERATION_LIMIT;
362
+
363
+ float n_base = noise_floatland_base->result [idx_xz];
364
+ if (n_base > 0 .0f ) {
365
+ float n_base_height =
366
+ MYMAX (noise_float_base_height->result [idx_xz], 0 .0f );
367
+ float amp = n_base * n_base_height;
368
+ float ridge = n_base_height / 3 .0f ;
369
+ base_min = floatland_level - amp / 2 .0f ;
370
+
371
+ if (amp > ridge * 2 .0f ) {
372
+ // Lake bed
373
+ base_max = floatland_level - (amp - ridge * 2 .0f ) / 2 .0f ;
374
+ } else {
375
+ // Hills and ridges
376
+ float diff = fabs (amp - ridge) / ridge;
377
+ // Smooth ridges using the 'smoothstep function'
378
+ float smooth_diff = diff * diff * (3 .0f - 2 .0f * diff);
379
+ base_max = floatland_level + ridge - smooth_diff * ridge;
380
+ }
381
+ }
382
+
383
+ *float_base_min = base_min;
384
+ *float_base_max = base_max;
385
+ }
386
+
387
+
316
388
int MapgenV7::generateTerrain ()
317
389
{
318
390
MapNode n_air (CONTENT_AIR);
@@ -327,11 +399,19 @@ int MapgenV7::generateTerrain()
327
399
noise_terrain_alt->perlinMap2D (node_min.X , node_min.Z , persistmap);
328
400
noise_height_select->perlinMap2D (node_min.X , node_min.Z );
329
401
330
- if (spflags & MGV7_MOUNTAINS) {
402
+ if (( spflags & MGV7_MOUNTAINS) || (spflags & MGV7_FLOATLANDS) ) {
331
403
noise_mountain->perlinMap3D (node_min.X , node_min.Y - 1 , node_min.Z );
404
+ }
405
+
406
+ if (spflags & MGV7_MOUNTAINS) {
332
407
noise_mount_height->perlinMap2D (node_min.X , node_min.Z );
333
408
}
334
409
410
+ if (spflags & MGV7_FLOATLANDS) {
411
+ noise_floatland_base->perlinMap2D (node_min.X , node_min.Z );
412
+ noise_float_base_height->perlinMap2D (node_min.X , node_min.Z );
413
+ }
414
+
335
415
// // Place nodes
336
416
v3s16 em = vm->m_area .getExtent ();
337
417
s16 stone_surface_max_y = -MAX_MAP_GENERATION_LIMIT;
@@ -340,10 +420,16 @@ int MapgenV7::generateTerrain()
340
420
for (s16 z = node_min.Z ; z <= node_max.Z ; z++)
341
421
for (s16 x = node_min.X ; x <= node_max.X ; x++, index2d++) {
342
422
s16 surface_y = baseTerrainLevelFromMap (index2d);
343
-
344
423
if (surface_y > stone_surface_max_y)
345
424
stone_surface_max_y = surface_y;
346
425
426
+ // Get extent of floatland base terrain
427
+ // '+1' to avoid a layer of stone at y = MAX_MAP_GENERATION_LIMIT
428
+ s16 float_base_min = MAX_MAP_GENERATION_LIMIT + 1 ;
429
+ s16 float_base_max = MAX_MAP_GENERATION_LIMIT;
430
+ if (spflags & MGV7_FLOATLANDS)
431
+ floatBaseExtentFromMap (&float_base_min, &float_base_max, index2d);
432
+
347
433
u32 vi = vm->m_area .index (x, node_min.Y - 1 , z);
348
434
u32 index3d = (z - node_min.Z ) * zstride_1u1d + (x - node_min.X );
349
435
@@ -356,8 +442,16 @@ int MapgenV7::generateTerrain()
356
442
vm->m_data [vi] = n_stone; // Mountain terrain
357
443
if (y > stone_surface_max_y)
358
444
stone_surface_max_y = y;
445
+ } else if ((spflags & MGV7_FLOATLANDS) &&
446
+ ((y >= float_base_min && y <= float_base_max) ||
447
+ getFloatlandMountainFromMap (index3d, index2d, y))) {
448
+ vm->m_data [vi] = n_stone; // Floatland terrain
449
+ stone_surface_max_y = node_max.Y ;
359
450
} else if (y <= water_level) {
360
- vm->m_data [vi] = n_water;
451
+ vm->m_data [vi] = n_water; // Ground level water
452
+ } else if ((spflags & MGV7_FLOATLANDS) &&
453
+ (y >= float_base_max && y <= floatland_level)) {
454
+ vm->m_data [vi] = n_water; // Floatland water
361
455
} else {
362
456
vm->m_data [vi] = n_air;
363
457
}
@@ -373,7 +467,7 @@ int MapgenV7::generateTerrain()
373
467
374
468
void MapgenV7::generateRidgeTerrain ()
375
469
{
376
- if (node_max.Y < water_level - 16 )
470
+ if (( node_max.Y < water_level - 16 ) || (node_max. Y > shadow_limit) )
377
471
return ;
378
472
379
473
noise_ridge->perlinMap3D (node_min.X , node_min.Y - 1 , node_min.Z );
0 commit comments