diff --git a/res/content/base/generators/demo.lua b/res/content/base/generators/demo.lua new file mode 100644 index 00000000..a8e0a365 --- /dev/null +++ b/res/content/base/generators/demo.lua @@ -0,0 +1,86 @@ +sea_level = 64 + +-- 1 - temperature +-- 2 - humidity +biome_parameters = 2 + +biomes = json.parse(file.read("base:generators/demo/biomes.json")) + +function place_structures(x, z, w, d, seed, hmap) + local placements = {} + for i=1,10 do + local sx = math.random() * w + local sz = math.random() * d + local sy = math.random() * 128 + if sy < hmap:at(sx, sz) * 256 - 6 then + table.insert(placements, {"coal_ore0", {sx, sy, sz}, math.random()*4}) + end + end + return placements +end + +local function _generate_heightmap(x, y, w, h, seed, s) + local umap = Heightmap(w, h) + local vmap = Heightmap(w, h) + umap.noiseSeed = seed + vmap.noiseSeed = seed + vmap:noise({x+521, y+70}, 0.1*s, 3, 25.8) + vmap:noise({x+95, y+246}, 0.15*s, 3, 25.8) + + local map = Heightmap(w, h) + map.noiseSeed = seed + map:noise({x, y}, 0.8*s, 4, 0.02) + map:cellnoise({x, y}, 0.1*s, 3, 0.3, umap, vmap) + map:add(0.4) + + local rivermap = Heightmap(w, h) + rivermap.noiseSeed = seed + rivermap:noise({x+21, y+12}, 0.1*s, 4) + rivermap:abs() + rivermap:mul(2.0) + rivermap:pow(0.15) + rivermap:max(0.3) + map:add(0.3) + map:mul(rivermap) + return map +end + +function generate_heightmap(x, y, w, h, seed) + -- blocks per dot + -- 8 - linear interpolation is visible, but not so much + -- 4 - high quality, but slower + -- 2 - you really don't need it + -- 1 - please have mercy on your CPU + local bpd = 4 + local map = _generate_heightmap( + math.floor(x/bpd), math.floor(y/bpd), + math.floor(w/bpd)+1, math.floor(h/bpd)+1, seed, bpd) + map:resize(w+bpd, h+bpd, 'linear') + map:crop(0, 0, w, h) + return map +end + +local function _generate_biome_parameters(x, y, w, h, seed, s) + local tempmap = Heightmap(w, h) + tempmap.noiseSeed = seed + 5324 + tempmap:noise({x, y}, 0.04*s, 6) + local hummap = Heightmap(w, h) + hummap.noiseSeed = seed + 953 + hummap:noise({x, y}, 0.04*s, 6) + tempmap:pow(3) + hummap:pow(3) + return tempmap, hummap +end + +function generate_biome_parameters(x, y, w, h, seed) + local bpd = 8 + local tmap, hmap = _generate_biome_parameters( + math.floor(x/bpd), math.floor(y/bpd), + math.floor(w/bpd)+1, math.floor(h/bpd)+1, seed, bpd) + tmap:resize(w+bpd, h+bpd, 'linear') + tmap:crop(0, 0, w, h) + + hmap:resize(w+bpd, h+bpd, 'linear') + hmap:crop(0, 0, w, h) + return tmap, hmap +end diff --git a/res/generators/default/biomes.json b/res/content/base/generators/demo/biomes.json similarity index 100% rename from res/generators/default/biomes.json rename to res/content/base/generators/demo/biomes.json diff --git a/res/generators/default/coal_ore0.vox b/res/content/base/generators/demo/coal_ore0.vox similarity index 100% rename from res/generators/default/coal_ore0.vox rename to res/content/base/generators/demo/coal_ore0.vox diff --git a/res/generators/default/structures.json b/res/content/base/generators/demo/structures.json similarity index 100% rename from res/generators/default/structures.json rename to res/content/base/generators/demo/structures.json diff --git a/res/generators/default/tower.vox b/res/content/base/generators/demo/tower.vox similarity index 100% rename from res/generators/default/tower.vox rename to res/content/base/generators/demo/tower.vox diff --git a/res/generators/default/tree0.vox b/res/content/base/generators/demo/tree0.vox similarity index 100% rename from res/generators/default/tree0.vox rename to res/content/base/generators/demo/tree0.vox diff --git a/res/generators/default/tree1.vox b/res/content/base/generators/demo/tree1.vox similarity index 100% rename from res/generators/default/tree1.vox rename to res/content/base/generators/demo/tree1.vox diff --git a/res/generators/default/tree2.vox b/res/content/base/generators/demo/tree2.vox similarity index 100% rename from res/generators/default/tree2.vox rename to res/content/base/generators/demo/tree2.vox diff --git a/res/content/base/preload.json b/res/content/base/preload.json index 1e519ca2..33f38f36 100644 --- a/res/content/base/preload.json +++ b/res/content/base/preload.json @@ -7,13 +7,6 @@ "models": [ "drop-item" ], - "shaders": [ - "ui3d", - "entity", - "screen", - "background", - "skybox_gen" - ], "textures": [ "misc/moon", "misc/sun", diff --git a/res/generators/default.lua b/res/generators/default.lua index a5bd50bf..c88a6135 100644 --- a/res/generators/default.lua +++ b/res/generators/default.lua @@ -1,84 +1,15 @@ -sea_level = 64 +biome_parameters = 0 --- 1 - temperature --- 2 - humidity -biome_parameters = 2 - -biomes = json.parse(file.read("core:generators/default/biomes.json")) - -function place_structures(x, z, w, d, seed, hmap) - local placements = {} - for i=1,10 do - local sx = math.random() * w - local sz = math.random() * d - local sy = math.random() * hmap:at(sx, sz)*256 - 6 - table.insert(placements, {"coal_ore0", {sx, sy, sz}, math.random()*4}) - end - return placements -end - -local function _generate_heightmap(x, y, w, h, seed, s) - local umap = Heightmap(w, h) - local vmap = Heightmap(w, h) - umap.noiseSeed = seed - vmap.noiseSeed = seed - vmap:noise({x+521, y+70}, 0.1*s, 3, 25.8) - vmap:noise({x+95, y+246}, 0.15*s, 3, 25.8) - - local map = Heightmap(w, h) - map.noiseSeed = seed - map:noise({x, y}, 0.8*s, 4, 0.02) - map:cellnoise({x, y}, 0.1*s, 3, 0.3, umap, vmap) - map:add(0.4) - - local rivermap = Heightmap(w, h) - rivermap.noiseSeed = seed - rivermap:noise({x+21, y+12}, 0.1*s, 4) - rivermap:abs() - rivermap:mul(2.0) - rivermap:pow(0.15) - rivermap:max(0.3) - map:add(0.3) - map:mul(rivermap) - return map -end +biomes = {flat = { + parameters = {}, + layers = { + {height=-1, block="core:obstacle"}, + }, + sea_layers = { + {height=-1, block="core:obstacle"} + } +}} function generate_heightmap(x, y, w, h, seed) - -- blocks per dot - -- 8 - linear interpolation is visible, but not so much - -- 4 - high quality, but slower - -- 2 - you really don't need it - -- 1 - please have mercy on your CPU - local bpd = 4 - local map = _generate_heightmap( - math.floor(x/bpd), math.floor(y/bpd), - math.floor(w/bpd)+1, math.floor(h/bpd)+1, seed, bpd) - map:resize(w+bpd, h+bpd, 'linear') - map:crop(0, 0, w, h) - return map -end - -local function _generate_biome_parameters(x, y, w, h, seed, s) - local tempmap = Heightmap(w, h) - tempmap.noiseSeed = seed + 5324 - tempmap:noise({x, y}, 0.04*s, 6) - local hummap = Heightmap(w, h) - hummap.noiseSeed = seed + 953 - hummap:noise({x, y}, 0.04*s, 6) - tempmap:pow(3) - hummap:pow(3) - return tempmap, hummap -end - -function generate_biome_parameters(x, y, w, h, seed) - local bpd = 8 - local tmap, hmap = _generate_biome_parameters( - math.floor(x/bpd), math.floor(y/bpd), - math.floor(w/bpd)+1, math.floor(h/bpd)+1, seed, bpd) - tmap:resize(w+bpd, h+bpd, 'linear') - tmap:crop(0, 0, w, h) - - hmap:resize(w+bpd, h+bpd, 'linear') - hmap:crop(0, 0, w, h) - return tmap, hmap + return Heightmap(w, h) end diff --git a/res/preload.json b/res/preload.json index 92d371cf..72f96c6b 100644 --- a/res/preload.json +++ b/res/preload.json @@ -1,8 +1,13 @@ { "shaders": [ "ui", + "ui3d", "main", - "lines" + "lines", + "entity", + "screen", + "background", + "skybox_gen" ], "textures": [ "gui/menubg", diff --git a/res/content/base/resources.json b/res/resources.json similarity index 100% rename from res/content/base/resources.json rename to res/resources.json diff --git a/res/textures/blocks/obstacle.png b/res/textures/blocks/obstacle.png new file mode 100644 index 00000000..a15d3bde Binary files /dev/null and b/res/textures/blocks/obstacle.png differ diff --git a/src/constants.hpp b/src/constants.hpp index 15b3e732..63aa840b 100644 --- a/src/constants.hpp +++ b/src/constants.hpp @@ -17,6 +17,7 @@ inline constexpr bool ENGINE_DEBUG_BUILD = true; inline const std::string ENGINE_VERSION_STRING = "0.23"; inline constexpr blockid_t BLOCK_AIR = 0; +inline constexpr blockid_t BLOCK_OBSTACLE = 1; inline constexpr itemid_t ITEM_EMPTY = 0; inline constexpr entityid_t ENTITY_NONE = 0; diff --git a/src/content/ContentLoader.cpp b/src/content/ContentLoader.cpp index 0844503d..907e8388 100644 --- a/src/content/ContentLoader.cpp +++ b/src/content/ContentLoader.cpp @@ -528,6 +528,18 @@ void ContentLoader::load() { } } + fs::path resourcesFile = folder / fs::u8path("resources.json"); + if (fs::exists(resourcesFile)) { + auto resRoot = files::read_json(resourcesFile); + for (const auto& [key, arr] : resRoot.asObject()) { + if (auto resType = ResourceType_from(key)) { + loadResources(*resType, arr); + } else { + logger.warning() << "unknown resource type: " << key; + } + } + } + if (!fs::is_regular_file(pack->getContentFile())) return; auto root = files::read_json(pack->getContentFile()); @@ -723,18 +735,6 @@ void ContentLoader::load() { } } } - - fs::path resourcesFile = folder / fs::u8path("resources.json"); - if (fs::exists(resourcesFile)) { - auto resRoot = files::read_json(resourcesFile); - for (const auto& [key, arr] : resRoot.asObject()) { - if (auto resType = ResourceType_from(key)) { - loadResources(*resType, arr); - } else { - logger.warning() << "unknown resource type: " << key; - } - } - } } void ContentLoader::loadResources(ResourceType type, const dv::value& list) { diff --git a/src/core_defs.cpp b/src/core_defs.cpp index cf8dc1f4..b56b3cc8 100644 --- a/src/core_defs.cpp +++ b/src/core_defs.cpp @@ -12,17 +12,19 @@ // All in-game definitions (blocks, items, etc..) void corecontent::setup(EnginePaths* paths, ContentBuilder* builder) { - Block& block = builder->blocks.create("core:air"); - block.replaceable = true; - block.drawGroup = 1; - block.lightPassing = true; - block.skyLightPassing = true; - block.obstacle = false; - block.selectable = false; - block.model = BlockModel::none; - block.pickingItem = "core:empty"; + { + Block& block = builder->blocks.create(CORE_AIR); + block.replaceable = true; + block.drawGroup = 1; + block.lightPassing = true; + block.skyLightPassing = true; + block.obstacle = false; + block.selectable = false; + block.model = BlockModel::none; + block.pickingItem = CORE_EMPTY; + } - ItemDef& item = builder->items.create("core:empty"); + ItemDef& item = builder->items.create(CORE_EMPTY); item.iconType = item_icon_type::none; auto bindsFile = paths->getResourcesFolder()/fs::path("bindings.toml"); @@ -31,4 +33,17 @@ void corecontent::setup(EnginePaths* paths, ContentBuilder* builder) { bindsFile.u8string(), files::read_string(bindsFile) ); } + + { + Block& block = builder->blocks.create(CORE_OBSTACLE); + for (uint i = 0; i < 6; i++) { + block.textureFaces[i] = "obstacle"; + } + block.hitboxes = {AABB()}; + ItemDef& item = builder->items.create(CORE_OBSTACLE+".item"); + item.iconType = item_icon_type::block; + item.icon = CORE_OBSTACLE; + item.placingBlock = CORE_OBSTACLE; + item.caption = block.caption; + } } diff --git a/src/core_defs.hpp b/src/core_defs.hpp index 32b2424c..ccfa2e69 100644 --- a/src/core_defs.hpp +++ b/src/core_defs.hpp @@ -3,6 +3,7 @@ #include inline const std::string CORE_EMPTY = "core:empty"; +inline const std::string CORE_OBSTACLE = "core:obstacle"; inline const std::string CORE_AIR = "core:air"; inline const std::string TEXTURE_NOTFOUND = "notfound"; diff --git a/src/logic/scripting/scripting_world_generation.cpp b/src/logic/scripting/scripting_world_generation.cpp index eeeeb1c5..da6e63a4 100644 --- a/src/logic/scripting/scripting_world_generation.cpp +++ b/src/logic/scripting/scripting_world_generation.cpp @@ -286,7 +286,8 @@ std::unique_ptr scripting::load_generator( lua::pop(L); uint biomeParameters = root["biome_parameters"].asInteger(); - uint seaLevel = root["sea_level"].asInteger(); + uint seaLevel = 0; + root.at("sea_level").get(seaLevel); std::vector biomes; diff --git a/src/objects/Player.cpp b/src/objects/Player.cpp index 2acbdf46..a2f854ee 100644 --- a/src/objects/Player.cpp +++ b/src/objects/Player.cpp @@ -37,9 +37,9 @@ Player::Player( position(position), inventory(std::move(inv)), eid(eid), - camera(level->getCamera("base:first-person")), - spCamera(level->getCamera("base:third-person-front")), - tpCamera(level->getCamera("base:third-person-back")), + camera(level->getCamera("core:first-person")), + spCamera(level->getCamera("core:third-person-front")), + tpCamera(level->getCamera("core:third-person-back")), currentCamera(camera) { camera->setFov(glm::radians(90.0f)); spCamera->setFov(glm::radians(90.0f));