diff --git a/res/content/base/generators/demo.files/ores.json b/res/content/base/generators/demo.files/ores.json new file mode 100644 index 00000000..682bb23a --- /dev/null +++ b/res/content/base/generators/demo.files/ores.json @@ -0,0 +1,3 @@ +[ + {"struct": "coal_ore0", "rarity": 22000} +] diff --git a/res/content/base/generators/demo.files/script.lua b/res/content/base/generators/demo.files/script.lua index 98ccc785..00a91691 100644 --- a/res/content/base/generators/demo.files/script.lua +++ b/res/content/base/generators/demo.files/script.lua @@ -1,13 +1,32 @@ -function place_structures(x, z, w, d, seed, hmap, chunk_height) - local placements = {} - for i=1,10 do - local sx = math.random() * w - local sz = math.random() * d - local sy = math.random() * (chunk_height * 0.5) - if sy < hmap:at(sx, sz) * chunk_height - 6 then - table.insert(placements, {"coal_ore0", {sx, sy, sz}, math.random()*4}) +BLOCKS_PER_CHUNK = 65536 + +local _, dir = parse_path(__DIR__) +ores = file.read_combined_list(dir.."/ores.json") + +local function place_ores(placements, x, z, w, d, seed, hmap, chunk_height) + for _, ore in ipairs(ores) do + local count = BLOCKS_PER_CHUNK / ore.rarity + + -- average count is less than 1 + local addchance = math.fmod(count, 1.0) + if math.random() < addchance then + count = count + 1 + end + + for i=1,count do + local sx = math.random() * w + local sz = math.random() * d + local sy = math.random() * (chunk_height * 0.5) + if sy < hmap:at(sx, sz) * chunk_height - 6 then + table.insert(placements, {ore.struct, {sx, sy, sz}, math.random()*4}) + end end end +end + +function place_structures(x, z, w, d, seed, hmap, chunk_height) + local placements = {} + place_ores(placements, x, z, w, d, seed, hmap, chunk_height) return placements end @@ -23,7 +42,7 @@ function generate_heightmap(x, y, w, h, seed, s) 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) + map:add(0.7) local rivermap = Heightmap(w, h) rivermap.noiseSeed = seed @@ -32,7 +51,6 @@ function generate_heightmap(x, y, w, h, seed, s) rivermap:mul(2.0) rivermap:pow(0.15) rivermap:max(0.3) - map:add(0.3) map:mul(rivermap) return map end diff --git a/src/content/loading/GeneratorLoader.cpp b/src/content/loading/GeneratorLoader.cpp index 2657ddd1..cdf0d893 100644 --- a/src/content/loading/GeneratorLoader.cpp +++ b/src/content/loading/GeneratorLoader.cpp @@ -212,5 +212,6 @@ void ContentLoader::loadGenerator( ); } load_biomes(def, biomesFiles); - def.script = scripting::load_generator(def, scriptFile); + def.script = scripting::load_generator( + def, scriptFile, pack->id+":generators/"+name+".files"); } diff --git a/src/logic/scripting/scripting.hpp b/src/logic/scripting/scripting.hpp index aad1bd9e..8a1a39cd 100644 --- a/src/logic/scripting/scripting.hpp +++ b/src/logic/scripting/scripting.hpp @@ -149,7 +149,8 @@ namespace scripting { std::unique_ptr load_generator( const GeneratorDef& def, - const fs::path& file + const fs::path& file, + const std::string& dirPath ); /// @brief Load package-specific world script diff --git a/src/logic/scripting/scripting_world_generation.cpp b/src/logic/scripting/scripting_world_generation.cpp index 4ee87116..dd4d8ad1 100644 --- a/src/logic/scripting/scripting_world_generation.cpp +++ b/src/logic/scripting/scripting_world_generation.cpp @@ -126,12 +126,20 @@ public: }; std::unique_ptr scripting::load_generator( - const GeneratorDef& def, const fs::path& file + const GeneratorDef& def, const fs::path& file, const std::string& dirPath ) { auto env = create_environment(); auto L = lua::get_main_thread(); lua::stackguard _(L); + lua::pushenv(L, *env); + lua::pushstring(L, dirPath); + lua::setfield(L, "__DIR__"); + lua::pushstring(L, dirPath + "/script.lua"); + lua::setfield(L, "__FILE__"); + + lua::pop(L); + if (fs::exists(file)) { lua::pop(L, load_script(*env, "generator", file)); } else {