1
0
mirror of https://github.com/Refactorio/RedMew.git synced 2025-01-03 22:52:13 +02:00
RedMew/map_gen/maps/concrete_jungle.lua

209 lines
6.4 KiB
Lua
Raw Normal View History

local floor = math.floor
local RestrictEntities = require 'map_gen.shared.entity_placement_restriction'
local Event = require 'utils.event'
local b = require 'map_gen.shared.builders'
2019-10-05 11:09:32 +02:00
local redmew_config = global.config
-- Needed because refined hazard concrete is needed and must not be changed by this module
redmew_config.paint.enabled = false
2019-10-05 02:37:35 +02:00
local ScenarioInfo = require 'features.gui.info'
ScenarioInfo.set_map_name('Concrete Jungle')
ScenarioInfo.set_map_description([[
2019-10-05 11:09:32 +02:00
Extensive underground mining has resulted in brittle soil.
New regulations requires heavy objects to being placed on top of,
proper materials to support the ground!
2019-10-05 02:37:35 +02:00
]])
2019-10-05 11:09:32 +02:00
-- Tiers of tiles definition (tier 0 is default)
local tile_tiers = {
['stone-path'] = 1,
['concrete'] = 2,
['refined-concrete'] = 3,
['hazard-concrete-right'] = 2,
['hazard-concrete-left'] = 2,
['refined-hazard-concrete-right'] = 3,
['refined-hazard-concrete-left'] = 3
}
--- Items explicitly allowed everywhere (tier 0 and up)
--- The RestrictEntities module auto skips all checks for these entities
--- They do not trigger set_keep_alive_callback or the on_pre_restricted_entity_destroyed event
RestrictEntities.add_allowed(
{
'transport-belt',
'fast-transport-belt',
'express-transport-belt',
'underground-belt',
'fast-underground-belt',
'express-underground-belt',
'small-electric-pole',
'burner-mining-drill',
'pumpjack',
'car',
'tank',
2019-10-05 01:37:33 +02:00
'pipe',
'pipe-to-ground',
'offshore-pump'
}
)
2019-10-05 11:09:32 +02:00
-- Items only allowed on tiles of tier 2 or higher (tier 1 is the default)
local entity_tiers = {
-- Tier 2
['oil-refinery'] = 2,
['chemical-plant'] = 2,
['storage-tank'] = 2,
['straight-rail'] = 2,
['curved-rail'] = 2,
['train-stop'] = 2,
['solar-panel'] = 2,
['flamethrower-turret'] = 2,
['assembling-machine-2'] = 2,
['steel-furnace'] = 2,
['iron-chest'] = 2,
['fast-inserter'] = 2,
['filter-inserter'] = 2,
['accumulator'] = 2,
['big-electric-pole'] = 2,
-- Tier 3
['rocket-silo'] = 3,
['nuclear-reactor'] = 3,
['centrifuge'] = 3,
['heat-exchanger'] = 3,
['heat-pipe'] = 3,
['steam-turbine'] = 3,
['artillery-turret'] = 3,
['roboport'] = 3,
['beacon'] = 3,
['assembling-machine-3'] = 3,
['electric-furnace'] = 3,
['substation'] = 3,
['laser-turret'] = 3,
['steel-chest'] = 3,
['stack-inserter'] = 3,
['stack-filter-inserter'] = 3,
['logistic-chest-active-provider'] = 3,
['logistic-chest-passive-provider'] = 3,
['logistic-chest-buffer'] = 3,
['logistic-chest-storage'] = 3,
['logistic-chest-requester'] = 3
}
2019-10-05 11:09:32 +02:00
--Creates rich text icons of the tiered entities
local tier_2_items = ""
local tier_3_items = ''
2019-10-05 11:09:32 +02:00
local tier_2_counter = 0
local tier_3_counter = 0
2019-10-05 02:37:35 +02:00
2019-10-05 11:09:32 +02:00
for k, v in pairs(entity_tiers) do
if (v == 3) then
tier_3_items = tier_3_items .. ' [entity=' .. k .. ']'
tier_3_counter = tier_3_counter + 1
elseif (v == 2) then
tier_2_items = tier_2_items .. ' [entity=' .. k .. ']'
tier_2_counter = tier_2_counter + 1
2019-10-05 02:37:35 +02:00
end
if tier_3_counter > 14 then
tier_3_counter = 0
tier_3_items = tier_3_items .. '\n'
2019-10-05 11:09:32 +02:00
elseif tier_2_counter > 14 then
tier_2_counter = 0
tier_2_items = tier_2_items .. '\n'
end
end
local tile_tiers_entities = "You may only build the factory on:\n"
local tile_tiers_entities_counter = 0
for k, _ in pairs(tile_tiers) do
tile_tiers_entities = tile_tiers_entities .. ' [tile=' .. k .. '] ' .. k
tile_tiers_entities_counter = tile_tiers_entities_counter + 1
if tile_tiers_entities_counter == 3 or tile_tiers_entities_counter == 5 then
--tile_tiers_entities_counter = 0
tile_tiers_entities = tile_tiers_entities .. '\n'
2019-10-05 02:37:35 +02:00
end
end
ScenarioInfo.add_map_extra_info(
2019-10-05 11:09:32 +02:00
tile_tiers_entities ..
[[
2019-10-05 02:37:35 +02:00
Exceptions:
[item=burner-mining-drill] [item=pumpjack] [item=small-electric-pole] [item=car] [item=tank] [item=pipe] [item=pipe-to-ground] [item=offshore-pump]
[item=transport-belt] [item=fast-transport-belt] [item=express-transport-belt] [item=underground-belt] [item=fast-underground-belt] [item=express-underground-belt]
2019-10-05 11:09:32 +02:00
Stone bricks provide ground support for most buildings/entities,
but some require better ground support!
2019-10-05 02:37:35 +02:00
Ground support minimum concrete:
]] ..
tier_2_items .. [[
Ground support minimum refined concrete:
]] .. tier_3_items
)
2019-10-05 11:09:32 +02:00
--- The logic for checking that there are the correct ground support under the entity's position
RestrictEntities.set_keep_alive_callback(
function(entity)
local get_tile = entity.surface.get_tile
local area = entity.bounding_box
local left_top = area.left_top
local right_bottom = area.right_bottom
local name = entity.name
if name == 'entity-ghost' then
name = entity.ghost_name
end
for x = floor(left_top.x), floor(right_bottom.x) do
for y = floor(left_top.y), floor(right_bottom.y) do
local tile_name = get_tile(x, y).name
2019-10-05 11:09:32 +02:00
local tier = tile_tiers[tile_name]
if not((entity_tiers[name] or 1) <= (tier or 0)) then
return false
end
end
end
return true
end
)
2019-10-05 02:37:35 +02:00
--- Warning for players when their entities are destroyed (needs to be pre because of the stack)
local function on_destroy(event)
2019-10-05 02:14:57 +02:00
local p = game.get_player(event.player_index)
local name = event.stack.name
if p and p.valid then
2019-10-05 02:37:35 +02:00
if not (name == 'blueprint') then
2019-10-05 02:14:57 +02:00
local tier = 'stone path'
2019-10-05 11:09:32 +02:00
if (entity_tiers[name] == 2) then
2019-10-05 02:14:57 +02:00
tier = 'concrete'
2019-10-05 11:09:32 +02:00
elseif (entity_tiers[name] == 3) then
2019-10-05 02:14:57 +02:00
tier = 'refined concrete'
end
p.print('[color=yellow]This [/color][color=red]' .. name .. '[/color][color=yellow] cannot be placed here, it needs ground support of at least [/color][color=red]' .. tier .. '[/color]')
else
p.print('[color=yellow]Some parts of this [/color][color=red]blueprint[/color][color=yellow] cannot be placed here, they need better ground support![/color]')
end
end
end
2019-10-05 02:14:57 +02:00
Event.add(RestrictEntities.events.on_pre_restricted_entity_destroyed, on_destroy)
2019-10-05 11:09:32 +02:00
--Creating the starting circle
local shape = b.circle(50)
local stone_path = b.tile('stone-path')
shape = b.invert(shape)
local map = b.if_else(shape, stone_path)
return map