mirror of
https://github.com/Refactorio/RedMew.git
synced 2025-01-10 00:28:53 +02:00
218 lines
6.4 KiB
Lua
218 lines
6.4 KiB
Lua
|
--[[
|
||
|
Map gen settings generator supporting Alien Biome's noise levels & autoplace settings
|
||
|
|
||
|
=== Preset Library ===
|
||
|
|
||
|
A MGS preset is a dictionary of autoplace controls for:
|
||
|
- aux (Alien Biomes)
|
||
|
- moisture (Alien Biomes)
|
||
|
- temperature (Alien Biomes)
|
||
|
- enemy
|
||
|
- trees
|
||
|
- water
|
||
|
full updated list available at: resources/alien_biomes/biomes.lua
|
||
|
|
||
|
** AB.set_preset(data), AB.remove_preset(name), AB.clear_presets()
|
||
|
|
||
|
=== Param Customization ===
|
||
|
|
||
|
** AB.override_vanilla_mgs(MapGenSettings)
|
||
|
Adds aux and moisture parameters to neg generated maps.
|
||
|
@usage
|
||
|
local AB = require 'map_gen.shared.alien_biomes'
|
||
|
AB.override_vanilla_mgs(game.surfaces.redmew.map_gen_settings)
|
||
|
|
||
|
=== Map Gen Settings ===
|
||
|
|
||
|
** AB.new_from_existent(config)
|
||
|
1. Generate a new random MGS based off default preset
|
||
|
@usage
|
||
|
local AB = require 'map_gen.shared.alien_biomes'
|
||
|
local new_mgs = AB.new_from_existent()
|
||
|
2. Generate a new random MGS based on current surface
|
||
|
@usage
|
||
|
local AB = require 'map_gen.shared.alien_biomes'
|
||
|
local new_mgs = AB.new_from_existent({map_gen_settings = game.surfaces.redmew})
|
||
|
|
||
|
** AB.new_from_preset(config)
|
||
|
1. Generate a new random MGS based off a random preset from the AB library
|
||
|
@usage
|
||
|
local AB = require 'map_gen.shared.alien_biomes'
|
||
|
local new_mgs = AB.new_from_preset()
|
||
|
2. Generate a new random MGS based on a specific preset from the AB library
|
||
|
@usage
|
||
|
local AB = require 'map_gen.shared.alien_biomes'
|
||
|
local new_mgs = AB.new_from_preset({preset_name = 'volcano'})
|
||
|
]]
|
||
|
|
||
|
require 'util'
|
||
|
require 'utils.table'
|
||
|
local Global = require 'utils.global'
|
||
|
local Biomes = require 'resources.alien_biomes.biomes'
|
||
|
|
||
|
local Public = {}
|
||
|
local _this = {
|
||
|
presets = Biomes.presets
|
||
|
}
|
||
|
|
||
|
Global.register(_this, function(tbl) _this = tbl end)
|
||
|
|
||
|
-- === PRESET LIBRARY MANIPULATION ============================================
|
||
|
|
||
|
--- Adds a new preset to the global table
|
||
|
---@param data table<{ name: tostringing, preset: table }>
|
||
|
---@return bool
|
||
|
function Public.set_preset(data)
|
||
|
if not (data and data.name and data.preset) then
|
||
|
return false
|
||
|
end
|
||
|
|
||
|
_this.presets[data.name] = data.preset
|
||
|
return _this.presets[data.name] ~= nil
|
||
|
end
|
||
|
|
||
|
--- Remove target preset from the global presets list
|
||
|
---@param name tostringing
|
||
|
---@return bool
|
||
|
function Public.remove_preset(name)
|
||
|
if not (name and type(name) == 'tostringing') then
|
||
|
return false
|
||
|
end
|
||
|
|
||
|
_this.presets[name] = nil
|
||
|
return _this.presets[name] ~= nil
|
||
|
end
|
||
|
|
||
|
--- Clears the global table from all presets
|
||
|
---@return bool
|
||
|
function Public.clear_presets()
|
||
|
for key, _ in pairs(_this.presets) do
|
||
|
_this.presets[key] = nil
|
||
|
end
|
||
|
return table_size(_this.presets) == 0
|
||
|
end
|
||
|
|
||
|
-- === PARAM CUSTOMIZATION ====================================================
|
||
|
|
||
|
local function apply_temperature(mgs)
|
||
|
local hf, hs = 1, 1
|
||
|
local cf, cs = 1, 1
|
||
|
|
||
|
if _LIFECYCLE == _STAGE.init or _LIFECYCLE == _STAGE.runtime then
|
||
|
hf = hf + 0.5*(math.random()-0.5)
|
||
|
hs = hs + 0.2*(math.random()-0.5)
|
||
|
|
||
|
cf = cf + 0.5*(math.random()-0.5)
|
||
|
cs = cs + 0.2*(math.random()-0.5)
|
||
|
end
|
||
|
|
||
|
mgs.autoplace_controls = mgs.autoplace_controls or {}
|
||
|
mgs.autoplace_controls.hot = { frequency = hf, size = hs }
|
||
|
mgs.autoplace_controls.cold = { frequency = cf, size = cs }
|
||
|
end
|
||
|
|
||
|
--- Adds +-25% freq and +-10% bias to Aux autoplace
|
||
|
---@param mgs MapGenSettings
|
||
|
local function apply_aux(mgs)
|
||
|
local freq, bias = 1, 0
|
||
|
|
||
|
if _LIFECYCLE == _STAGE.init or _LIFECYCLE == _STAGE.runtime then
|
||
|
freq = freq + 0.5*(math.random()-0.5)
|
||
|
bias = bias + 0.2*(math.random()-0.5)
|
||
|
end
|
||
|
|
||
|
mgs.property_expression_names = mgs.property_expression_names or {}
|
||
|
mgs.property_expression_names['control-setting:aux:bias'] = tostring(bias)
|
||
|
mgs.property_expression_names['control-setting:aux:frequency'] = tostring(freq)
|
||
|
end
|
||
|
|
||
|
--- Adds +-25% freq and +-10% bias to Moisture autoplace
|
||
|
---@param mgs MapGenSettings
|
||
|
local function apply_moisture(mgs)
|
||
|
local freq, bias = 1, 0
|
||
|
|
||
|
if _LIFECYCLE == _STAGE.init or _LIFECYCLE == _STAGE.runtime then
|
||
|
freq = freq + 0.5*(math.random()-0.5)
|
||
|
bias = bias + 0.2*(math.random()-0.5)
|
||
|
end
|
||
|
|
||
|
mgs.property_expression_names = mgs.property_expression_names or {}
|
||
|
mgs.property_expression_names['control-setting:moisture:bias'] = tostring(bias)
|
||
|
mgs.property_expression_names['control-setting:moisture:frequency'] = tostring(freq)
|
||
|
end
|
||
|
|
||
|
|
||
|
--- Adds random aux and moisture to default vanilla MapGenSettings
|
||
|
--- Is safe to call even for vanilla scenarios
|
||
|
---@param mgs MapGenSettings
|
||
|
function Public.override_vanilla_mgs(mgs)
|
||
|
if not script.active_mods['alien-biomes'] then
|
||
|
return
|
||
|
end
|
||
|
|
||
|
apply_aux(mgs)
|
||
|
apply_moisture(mgs)
|
||
|
apply_temperature(mgs)
|
||
|
end
|
||
|
|
||
|
-- === MAP GEN SETTINGS =======================================================
|
||
|
|
||
|
--- Generates a new random map_gen_setting from a given preset. If none is passed, the default one is used instead
|
||
|
--- Is safe to call even for vanilla scenarios
|
||
|
---@param config table
|
||
|
---@field seed? number
|
||
|
---@field map_gen_settings? MapGenSettings
|
||
|
---@return MapGenSettings
|
||
|
function Public.new_from_existent(config)
|
||
|
config = config or {}
|
||
|
local mgs = game.default_map_gen_settings
|
||
|
|
||
|
if config.map_gen_settings then
|
||
|
mgs = config.map_gen_settings
|
||
|
end
|
||
|
|
||
|
if _LIFECYCLE == _STAGE.init or _LIFECYCLE == _STAGE.runtime then
|
||
|
mgs.seed = config.seed or math.random(4294967295)
|
||
|
end
|
||
|
|
||
|
Public.override_vanilla(mgs)
|
||
|
|
||
|
return mgs
|
||
|
end
|
||
|
|
||
|
--- Generates a random map_gen_setting from the available presets
|
||
|
---- Is safe to call even for vanilla scenarios
|
||
|
--@param config table
|
||
|
---@field seed? number
|
||
|
---@field preset_name? tostringing
|
||
|
---@field map_gen_settings? MapGenSetting
|
||
|
---@return MapGenSettings
|
||
|
function Public.new_from_preset(config)
|
||
|
config = config or {}
|
||
|
local mgs = game.default_map_gen_settings
|
||
|
mgs.seed = config.seed or mgs.seed or 4294967295
|
||
|
local n_presets = table_size(_this.presets)
|
||
|
local index = mgs.seed % n_presets + 1
|
||
|
|
||
|
if config.map_gen_settings then
|
||
|
mgs = util.merge{mgs, config.map_gen_settings}
|
||
|
end
|
||
|
|
||
|
if _LIFECYCLE == _STAGE.init or _LIFECYCLE == _STAGE.runtime then
|
||
|
mgs.seed = config.seed or math.random(4294967295)
|
||
|
index = math.random(n_presets)
|
||
|
end
|
||
|
|
||
|
if script.active_mods['alien-biomes'] and n_presets > 0 then
|
||
|
local preset_name = config.preset_name or table.keys(_this.presets)[index]
|
||
|
local preset = Biomes.preset_to_mgs(_this.presets[preset_name])
|
||
|
mgs = util.merge{mgs, preset}
|
||
|
end
|
||
|
|
||
|
return mgs
|
||
|
end
|
||
|
|
||
|
-- ============================================================================
|
||
|
|
||
|
return Public
|