mirror of
https://github.com/Refactorio/RedMew.git
synced 2024-12-16 10:19:27 +02:00
77 lines
2.2 KiB
Lua
77 lines
2.2 KiB
Lua
local Perlin = require 'map_gen.shared.perlin_noise'
|
|
local ShareGlobals = require 'map_gen.maps.danger_ores.modules.shared_globals'
|
|
local math = require 'utils.math'
|
|
local seed_provider = require 'map_gen.maps.danger_ores.modules.seed_provider'
|
|
|
|
local sqrt = math.sqrt
|
|
local max = math.max
|
|
local min = math.min
|
|
local ceil = math.ceil
|
|
local perlin_noise = Perlin.noise
|
|
local random = math.random
|
|
|
|
return function(config)
|
|
local worm_names =
|
|
config.worm_names or {'small-worm-turret', 'medium-worm-turret', 'big-worm-turret', 'behemoth-worm-turret'}
|
|
local spawner_names = config.spawner_names or {'biter-spawner', 'spitter-spawner'}
|
|
local factor = config.enemy_factor or 10 / (768 * 32)
|
|
local max_chance = config.enemy_max_chance or 1 / 6
|
|
local scale_factor = config.enemy_scale_factor or 32
|
|
local seed = config.enemy_seed or seed_provider()
|
|
|
|
local sf = 1 / scale_factor
|
|
local m = 1 / 768
|
|
|
|
return function(x, y, world)
|
|
if ShareGlobals.data.biters_disabled then
|
|
return nil
|
|
end
|
|
|
|
local d = sqrt(world.x * world.x + world.y * world.y)
|
|
|
|
if d < 64 then
|
|
return nil
|
|
end
|
|
|
|
local threshold = 1 - d * m
|
|
threshold = max(threshold, 0.3)
|
|
|
|
x, y = x * sf, y * sf
|
|
if perlin_noise(x, y, seed) <= threshold then
|
|
return
|
|
end
|
|
|
|
if random(8) == 1 then
|
|
local lvl
|
|
if d < 400 then
|
|
lvl = 1
|
|
elseif d < 650 then
|
|
lvl = 2
|
|
elseif d < 900 then
|
|
lvl = 3
|
|
else
|
|
lvl = 4
|
|
end
|
|
|
|
local chance = min(max_chance, d * factor)
|
|
|
|
if random() < chance then
|
|
local worm_id
|
|
if d > 1000 then
|
|
local power = 1000 / d
|
|
worm_id = ceil((random() ^ power) * lvl)
|
|
else
|
|
worm_id = random(lvl)
|
|
end
|
|
return {name = worm_names[worm_id]}
|
|
end
|
|
else
|
|
local chance = min(max_chance, d * factor)
|
|
if random() < chance then
|
|
local spawner_id = random(2)
|
|
return {name = spawner_names[spawner_id]}
|
|
end
|
|
end
|
|
end
|
|
end
|