1
0
mirror of https://github.com/Refactorio/RedMew.git synced 2024-12-14 10:13:13 +02:00
RedMew/map_gen/entities/neko_bridged_rivers.lua

114 lines
4.2 KiB
Lua
Raw Normal View History

local perlin = require 'map_gen.shared.perlin_noise'
local Global = require 'utils.global'
local seed_a
local seed_b
Global.register_init(
{},
function(tbl)
tbl.seed_a = math.random(10, 10000)
tbl.seed_b = math.random(10, 10000)
end,
function(tbl)
seed_a = tbl.seed_a
seed_b = tbl.seed_b
end
)
local tree_to_place = {'dry-tree', 'dry-hairy-tree', 'tree-06', 'tree-06', 'tree-01', 'tree-02', 'tree-03'}
local types = {'simple-entity', 'tree'}
local function run_terrain_module(x, y, world)
local surface = world.surface
local wx, wy = world.x, world.y
local pos = {wx, wy}
local area = {pos, {wx + 1, wy + 1}}
local es = surface.find_entities_filtered({area = area, type = types})
for i = 1, #es do
es[i].destroy()
end
local tile_to_insert = 'grass-3'
local wiggle = 50 + perlin.noise((x * 0.005), (y * 0.005), seed_a + 71) * 60
local terrain_A = perlin.noise((x * 0.005), (y * 0.005), seed_a + 19) * wiggle --For determining where water is
local terrain_sqr = terrain_A * terrain_A --we can use this again to mess with other layers as well
local terrain_D = 10 + perlin.noise((x * 0.001), (y * 0.001), seed_a + 5) * wiggle --terrain layer
if terrain_sqr < 50 then --Main water areas
terrain_A = perlin.noise((x * 0.01), (y * 0.01), seed_a + 31) * 90 + (wiggle * -0.2) --we only gen this when we consider placing water
if terrain_A * terrain_A > 40 then --creates random bridges over the water by overlapping with another noise layer
tile_to_insert = 'water'
else
if terrain_D >= 20 then
tile_to_insert = 'sand-1'
end
end
elseif terrain_sqr > 70 then
wiggle = 100 + perlin.noise((x * 0.01), (y * 0.01), seed_b + 41) * 60
local terrain_C = perlin.noise((x * 0.02), (y * 0.02), seed_a + 13) * wiggle --tree layer
if terrain_D < 20 then
if terrain_C < 4 then --we set grass-1 around near forest areas
tile_to_insert = 'grass-1'
if terrain_C < -20 and math.random(1, 3) == 1 then --dense trees
local treenum = math.random(3, 7)
if surface.can_place_entity {name = tree_to_place[treenum], position = pos} then
surface.create_entity {name = tree_to_place[treenum], position = pos}
end
else
if terrain_C < 0 and math.random(1, 7) == 1 then --less dense trees
local treenum = math.random(3, 5)
if surface.can_place_entity {name = tree_to_place[treenum], position = pos} then
surface.create_entity {name = tree_to_place[treenum], position = pos}
end
end
end
end
else
if terrain_D < 30 then
tile_to_insert = 'sand-1'
if terrain_C < -20 and math.random(1, 7) == 1 then --dense trees
local treenum = math.random(1, 3)
if surface.can_place_entity {name = tree_to_place[treenum], position = pos} then
surface.create_entity {name = tree_to_place[treenum], position = pos}
end
elseif terrain_C < 0 and math.random(1, 13) == 1 then --less dense trees
local treenum = math.random(1, 2)
if surface.can_place_entity {name = tree_to_place[treenum], position = pos} then
surface.create_entity {name = tree_to_place[treenum], position = pos}
end
end
else
tile_to_insert = 'sand-3'
end
end
if
math.floor(terrain_D) % 5 == 1 and math.random(1, 70) == 1 and
surface.can_place_entity {name = 'rock-big', position = pos}
then
surface.create_entity {name = 'rock-big', position = pos}
end
else
if terrain_D >= 20 then
if terrain_D < 30 then
tile_to_insert = 'sand-1'
else
tile_to_insert = 'sand-3'
end
end
end
return tile_to_insert
end
return run_terrain_module