mirror of
https://github.com/Refactorio/RedMew.git
synced 2025-01-18 03:21:47 +02:00
160 lines
4.7 KiB
Lua
160 lines
4.7 KiB
Lua
--- Safety Ores, by R. Nukem, inspired by Zengief
|
|
--- all local resources
|
|
local RS = require 'map_gen.shared.redmew_surface'
|
|
local MGSP = require 'resources.map_gen_settings'
|
|
local ScenarioInfo = require 'features.gui.info'
|
|
local config = global.config
|
|
local RE = require 'map_gen.shared.entity_placement_restriction'
|
|
local Token = require 'utils.token'
|
|
local Event = require 'utils.event'
|
|
--- local math functions
|
|
local floor = math.floor
|
|
--- Scenario Info
|
|
ScenarioInfo.set_map_name('Safety Ores')
|
|
ScenarioInfo.set_map_description('Welcome to Safety Ores.\nOre patches are the only stable ground on this world. All factory buildings must be placed on ores or they will collapse.')
|
|
ScenarioInfo.set_map_extra_info(
|
|
'Our engineers have only been able to build the following outside the stability of our ore patches:\n -rails \n -rail signals\n -power poles\n -offshore pumps\n -pumpjacks\n -pipes\n-vehicles\n-robots')
|
|
ScenarioInfo.set_new_info(
|
|
[[
|
|
2024-02-08 - R. Nukem
|
|
- Initial Map Creation
|
|
]]
|
|
)
|
|
--- Market Config
|
|
config.currency = nil
|
|
config.market.enabled = false
|
|
config.player_rewards.enabled = false
|
|
--- Ore Settings. Since we can only build on ore patches high size is recommended.
|
|
--- With high size, lower richness seems intuitive. Frequency is the big ???
|
|
local ore_size = 6
|
|
local ore_richness = 0.166
|
|
local ore_freq = 0.166
|
|
--- Create map_gen table for ores
|
|
local ore_settings = {
|
|
autoplace_controls = {
|
|
coal = {
|
|
frequency = ore_freq,
|
|
richness = ore_richness,
|
|
size = ore_size
|
|
},
|
|
['copper-ore'] = {
|
|
frequency = ore_freq,
|
|
richness = ore_richness,
|
|
size = ore_size
|
|
},
|
|
['crude-oil'] = {
|
|
frequency = 0.25,
|
|
richness = 2,
|
|
size = 0.25
|
|
},
|
|
['iron-ore'] = {
|
|
frequency = ore_freq,
|
|
richness = ore_richness,
|
|
size = ore_size
|
|
},
|
|
stone = {
|
|
frequency = ore_freq,
|
|
richness = ore_richness,
|
|
size = ore_size
|
|
},
|
|
['uranium-ore'] = {
|
|
frequency = ore_freq,
|
|
richness = ore_richness,
|
|
size = ore_size
|
|
}
|
|
}
|
|
}
|
|
--- change enemy autoplace controls
|
|
local enemy_settings = {
|
|
autoplace_controls = {
|
|
['enemy-base'] = {
|
|
frequency = 0.25,
|
|
richness = 1,
|
|
size = 1
|
|
}
|
|
}
|
|
}
|
|
--- Set map_gen settings
|
|
RS.set_map_gen_settings(
|
|
{
|
|
MGSP.default,
|
|
ore_settings,
|
|
enemy_settings
|
|
}
|
|
)
|
|
--- Set Item Restrictions
|
|
--- Items allowed everywhere
|
|
RE.add_allowed({
|
|
'small-electric-pole',
|
|
'medium-electric-pole',
|
|
'big-electric-pole',
|
|
'rail',
|
|
'straight-rail',
|
|
'curved-rail',
|
|
'pumpjack',
|
|
'pipe',
|
|
'pipe-to-ground',
|
|
'rail-signal',
|
|
'rail-chain-signal',
|
|
'offshore-pump',
|
|
'train-stop',
|
|
'pump',
|
|
'car',
|
|
'tank',
|
|
'spidertron',
|
|
'defender',
|
|
'destroyer',
|
|
'distractor',
|
|
'construction-robot',
|
|
'logistic-robot',
|
|
'locomotive',
|
|
'cargo-wagon',
|
|
'fluid-wagon',
|
|
'artillery-wagon'
|
|
})
|
|
--- The logic for checking that there are resources under the entity's position
|
|
RE.set_keep_alive_callback(
|
|
Token.register(
|
|
function(entity)
|
|
local box = entity.bounding_box
|
|
if entity.surface.count_entities_filtered {area = box, type = 'resource', limit = 1} > 0 then
|
|
return true
|
|
end
|
|
end
|
|
)
|
|
)
|
|
--- Warning for players when their entities are destroyed
|
|
local function on_destroy(event)
|
|
local p = event.player
|
|
if p and p.valid then
|
|
p.surface.create_entity{name="flying-text", position = p.position, text = 'You can only build that on top of ores, the ground is too soft'}
|
|
end
|
|
end
|
|
Event.add(RE.events.on_restricted_entity_destroyed, on_destroy)
|
|
--- Spawn stone around pumpjacks so oil can be defended
|
|
local function on_built_pumpjack(event)
|
|
local size = 7 -- size in all directions from center. total size = 2x+1
|
|
local density = 1 -- Every time a pumpjack is placed this much stone is added
|
|
local entity = event.created_entity
|
|
if not entity or not entity.valid then
|
|
return
|
|
end
|
|
--- calculate center of bounding box
|
|
local box = entity.bounding_box
|
|
local center_x = floor((box.left_top.x + box.right_bottom.x)/2)
|
|
local center_y = floor((box.left_top.y + box.right_bottom.y)/2)
|
|
--- If a pumpjack is built, create a 2x+1 square of stone centered on the pumpjack
|
|
if entity.name == 'pumpjack' then
|
|
for x = center_x - size, center_x + size do
|
|
for y = center_y - size, center_y + size do
|
|
if entity.surface.get_tile(x, y).collides_with("ground-tile") then
|
|
entity.surface.create_entity({name="stone", amount=density, position={x, y}})
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
Event.add(defines.events.on_robot_built_entity, on_built_pumpjack)
|
|
Event.add(defines.events.on_built_entity, on_built_pumpjack)
|
|
--- To Do:
|