diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp index 833675d29..dc7222608 100644 --- a/src/defaultsettings.cpp +++ b/src/defaultsettings.cpp @@ -360,6 +360,7 @@ void set_default_settings(Settings *settings) settings->setDefault("mapgen_limit", "31000"); settings->setDefault("chunksize", "5"); settings->setDefault("mg_flags", "dungeons"); + settings->setDefault("mgflat_spflags", "nocaves"); settings->setDefault("fixed_map_seed", ""); settings->setDefault("max_block_generate_distance", "8"); settings->setDefault("projecting_dungeons", "false"); diff --git a/src/hud.cpp b/src/hud.cpp index 4384f84d6..c6835ad9d 100644 --- a/src/hud.cpp +++ b/src/hud.cpp @@ -331,17 +331,17 @@ void Hud::drawLuaElements(const v3s16 &camera_offset) if (e->pos.X == 0.5) { v2s32 offset((e->align.X - 1.0) * (textsize.Width / 2), #if defined(__ANDROID__) - (e->align.Y - 1.0) * (textsize.Height) * 4); + (e->align.Y - 1.0) * (textsize.Height) * 4); #elif defined(__IOS__) - (e->align.Y - 1.0) * (textsize.Height) * 3); + (e->align.Y - 1.0) * (textsize.Height) * 3 * g_settings->getFloat("hud_scaling")); #else - (e->align.Y - 1.0) * (textsize.Height / 2)); + (e->align.Y - 1.0) * (textsize.Height / 2)); #endif v2s32 offs(e->offset.X, e->offset.Y); font->draw(text.c_str(), size + pos + offset + offs, color); } else { v2s32 offset((e->align.X - 1.0) * (textsize.Width / 2), - (e->align.Y - 1.0) * (textsize.Height / 2)); + (e->align.Y - 1.0) * (textsize.Height / 2)); v2s32 offs(e->offset.X, e->offset.Y); font->draw(text.c_str(), size + pos + offset + offs, color); } diff --git a/src/mapgen.h b/src/mapgen.h index f8c1c2314..521e8fe4e 100644 --- a/src/mapgen.h +++ b/src/mapgen.h @@ -28,8 +28,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "util/string.h" #include "util/container.h" -#define MAPGEN_DEFAULT MAPGEN_V7 -#define MAPGEN_DEFAULT_NAME "v7" +#define MAPGEN_DEFAULT MAPGEN_V7P +#define MAPGEN_DEFAULT_NAME "v7p" /////////////////// Mapgen flags #define MG_TREES 0x01 // Deprecated. Moved into mgv6 flags diff --git a/src/mapgen_flat.cpp b/src/mapgen_flat.cpp index bd34fb4da..a92fb8aa6 100644 --- a/src/mapgen_flat.cpp +++ b/src/mapgen_flat.cpp @@ -42,6 +42,7 @@ with this program; if not, write to the Free Software Foundation, Inc., FlagDesc flagdesc_mapgen_flat[] = { {"lakes", MGFLAT_LAKES}, {"hills", MGFLAT_HILLS}, + {"caves", MGFLAT_CAVES}, {NULL, 0} }; @@ -68,6 +69,10 @@ MapgenFlat::MapgenFlat(int mapgenid, MapgenFlatParams *params, EmergeManager *em // 3D noise MapgenBasic::np_cave1 = params->np_cave1; MapgenBasic::np_cave2 = params->np_cave2; + + bedrock_level = water_level - 64; + // Resolve additional nodes + c_bedrock = ndef->getId("mapgen_bedrock"); } @@ -83,7 +88,7 @@ MapgenFlat::~MapgenFlat() MapgenFlatParams::MapgenFlatParams() { spflags = 0; - ground_level = 8; + ground_level = 2; large_cave_depth = -33; cave_width = 0.09; lake_threshold = -0.45; @@ -187,35 +192,40 @@ void MapgenFlat::makeChunk(BlockMakeData *data) blockseed = getBlockSeed2(full_node_min, seed); - // Generate base terrain, mountains, and ridges with initial heightmaps - s16 stone_surface_max_y = generateTerrain(); + if (node_max.Y <= bedrock_level) { + // Only generate bedrock + generateBedrock(); + } else { + // Generate base and mountain terrain + s16 stone_surface_max_y = generateTerrain(); - // Create heightmap - updateHeightmap(node_min, node_max); + // Create heightmap + updateHeightmap(node_min, node_max); - // Init biome generator, place biome-specific nodes, and build biomemap - biomegen->calcBiomeNoise(node_min); - MgStoneType stone_type = generateBiomes(); + // Init biome generator, place biome-specific nodes, and build biomemap + biomegen->calcBiomeNoise(node_min); + MgStoneType stone_type = generateBiomes(); - if (flags & MG_CAVES) - generateCaves(stone_surface_max_y, large_cave_depth); + if (flags & MGFLAT_CAVES) + generateCaves(stone_surface_max_y, large_cave_depth); - if (flags & MG_DUNGEONS) - generateDungeons(stone_surface_max_y, stone_type); + if (flags & MG_DUNGEONS) + generateDungeons(stone_surface_max_y, stone_type); - // Generate the registered decorations - if (flags & MG_DECORATIONS) - m_emerge->decomgr->placeAllDecos(this, blockseed, node_min, node_max); + // Generate the registered decorations + if (flags & MG_DECORATIONS) + m_emerge->decomgr->placeAllDecos(this, blockseed, node_min, node_max); - // Generate the registered ores - m_emerge->oremgr->placeAllOres(this, blockseed, node_min, node_max); + // Generate the registered ores + m_emerge->oremgr->placeAllOres(this, blockseed, node_min, node_max); - // Sprinkle some dust on top after everything else was generated - dustTopNodes(); + // Sprinkle some dust on top after everything else was generated + dustTopNodes(); - //printf("makeChunk: %dms\n", t.stop()); + //printf("makeChunk: %dms\n", t.stop()); - updateLiquid(&data->transforming_liquid, full_node_min, full_node_max); + updateLiquid(&data->transforming_liquid, full_node_min, full_node_max); + } if (flags & MG_LIGHT) calcLighting(node_min - v3s16(0, 1, 0), node_max + v3s16(0, 1, 0), @@ -227,11 +237,26 @@ void MapgenFlat::makeChunk(BlockMakeData *data) this->generating = false; } +void MapgenFlat::generateBedrock() +{ + MapNode n_bedrock(c_bedrock); + + for (s16 z = node_min.Z; z <= node_max.Z; z++) + for (s16 y = node_min.Y - 1; y <= node_max.Y + 1; y++) { + u32 vi = vm->m_area.index(node_min.X, y, z); + + for (s16 x = node_min.X; x <= node_max.X; x++, vi++) { + if (vm->m_data[vi].getContent() == CONTENT_IGNORE) + vm->m_data[vi] = n_bedrock; + } + } +} s16 MapgenFlat::generateTerrain() { MapNode n_air(CONTENT_AIR); MapNode n_stone(c_stone); + MapNode n_bedrock(c_bedrock); MapNode n_water(c_water_source); v3s16 em = vm->m_area.getExtent(); @@ -256,10 +281,14 @@ s16 MapgenFlat::generateTerrain() } u32 vi = vm->m_area.index(x, node_min.Y - 1, z); + for (s16 y = node_min.Y - 1; y <= node_max.Y + 1; y++) { if (vm->m_data[vi].getContent() == CONTENT_IGNORE) { if (y <= stone_level) { - vm->m_data[vi] = n_stone; + if (y <= bedrock_level) + vm->m_data[vi] = n_bedrock; // Bedrock + else + vm->m_data[vi] = n_stone; // Base and mountain terrain if (y > stone_surface_max_y) stone_surface_max_y = y; } else if (y <= water_level) { diff --git a/src/mapgen_flat.h b/src/mapgen_flat.h index 9f5cf4a35..f9ab8d660 100644 --- a/src/mapgen_flat.h +++ b/src/mapgen_flat.h @@ -26,6 +26,7 @@ with this program; if not, write to the Free Software Foundation, Inc., /////// Mapgen Flat flags #define MGFLAT_LAKES 0x01 #define MGFLAT_HILLS 0x02 +#define MGFLAT_CAVES 0x04 class BiomeManager; @@ -63,6 +64,7 @@ public: virtual void makeChunk(BlockMakeData *data); int getSpawnLevelAtPoint(v2s16 p); + void generateBedrock(); s16 generateTerrain(); private: @@ -73,6 +75,9 @@ private: float hill_threshold; float hill_steepness; Noise *noise_terrain; + + s16 bedrock_level; + content_t c_bedrock; }; #endif diff --git a/src/mapgen_v7p.cpp b/src/mapgen_v7p.cpp index e29c9c787..242088299 100644 --- a/src/mapgen_v7p.cpp +++ b/src/mapgen_v7p.cpp @@ -168,7 +168,7 @@ int MapgenV7P::getSpawnLevelAtPoint(v2s16 p) if (spflags & MGV7P_MOUNTAINS) y = MYMAX(mountainLevelAtPoint(p.X, p.Y), y); - if (y < water_level || y > water_level + 16) + if (y <= water_level || y > water_level + 16) return MAX_MAP_GENERATION_LIMIT; // Unsuitable spawn point else return y + 2; // +2 because surface is at y and due to biome 'dust'