2024-09-21 03:39:01 +02:00
|
|
|
-- This handles the shared power logic for the Oarc scenario.
|
|
|
|
-- Won't work too hard on this since 2.0 might change things...
|
|
|
|
|
|
|
|
|
2024-09-23 04:18:22 +02:00
|
|
|
STARTING_X_OFFSET_SHARING_POLE = -5
|
|
|
|
Y_OFFSET_SHARING_POLE = 20
|
|
|
|
|
2024-09-21 03:39:01 +02:00
|
|
|
---Create and connect a pair of power poles for a new base given surface and position.
|
|
|
|
---@param surface LuaSurface
|
|
|
|
---@param position MapPosition
|
|
|
|
---@return nil
|
|
|
|
function CreateSharedPowerPolePair(surface, position)
|
|
|
|
|
|
|
|
if global.shared_power_poles == nil then
|
|
|
|
---@type LuaEntity[]
|
|
|
|
global.shared_power_poles = {}
|
|
|
|
end
|
|
|
|
|
|
|
|
--Get an open sharing pole from the holding pen surface if one exists, otherwise create a new one.
|
|
|
|
local hidden_pole = FindSharedPowerPole()
|
|
|
|
if not hidden_pole then
|
|
|
|
local poles_count = table_size(global.shared_power_poles)
|
2024-09-23 04:18:22 +02:00
|
|
|
local new_position = { x = poles_count + STARTING_X_OFFSET_SHARING_POLE, y = Y_OFFSET_SHARING_POLE }
|
2024-09-21 03:39:01 +02:00
|
|
|
hidden_pole = CreateSpecialPole(game.surfaces[HOLDING_PEN_SURFACE_NAME], new_position)
|
|
|
|
if not hidden_pole then
|
|
|
|
log("ERROR - Failed to create shared power poles!? " .. serpent.block(position) .. " on " .. surface.name)
|
|
|
|
return
|
|
|
|
end
|
|
|
|
table.insert(global.shared_power_poles, hidden_pole)
|
|
|
|
end
|
|
|
|
|
|
|
|
--Create the base pole on the new spawn area surface and connect it to the hidden pole.
|
|
|
|
local base_pole = CreateSpecialPole(surface, position)
|
|
|
|
if not base_pole then
|
|
|
|
log("ERROR - Failed to create shared power poles!? " .. serpent.block(position) .. " on " .. surface.name)
|
|
|
|
return
|
|
|
|
end
|
|
|
|
base_pole.connect_neighbour(hidden_pole)
|
|
|
|
|
|
|
|
TemporaryHelperText(
|
|
|
|
{ "oarc-shared-power-pole-helper-txt" },
|
|
|
|
surface,
|
|
|
|
{position.x, position.y+1},
|
|
|
|
TICKS_PER_MINUTE*2,
|
|
|
|
"right"
|
|
|
|
)
|
|
|
|
end
|
|
|
|
|
|
|
|
---Find the first shared power pole that doesn't exceed the max number of connections.
|
|
|
|
---@return LuaEntity?
|
|
|
|
function FindSharedPowerPole()
|
|
|
|
if global.shared_power_poles == nil then return nil end
|
|
|
|
|
|
|
|
for _,pole in pairs(global.shared_power_poles) do
|
|
|
|
-- 5 is the hard coded engine limit and we need to leave one open for the connection to the next hidden pole.
|
|
|
|
if pole.neighbours["copper"] and table_size(pole.neighbours["copper"]) < 4 then
|
|
|
|
return pole
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
return nil
|
|
|
|
end
|
|
|
|
|
|
|
|
---Creates a special pole on the surface at the given position on the neutral force.
|
|
|
|
---@param surface LuaSurface
|
|
|
|
---@param position MapPosition
|
|
|
|
---@return LuaEntity?
|
|
|
|
function CreateSpecialPole(surface, position)
|
|
|
|
local pole = surface.create_entity
|
|
|
|
{
|
|
|
|
name="oarc-linked-power",
|
|
|
|
position=position,
|
|
|
|
force="neutral"
|
|
|
|
}
|
|
|
|
pole.destructible = false
|
|
|
|
pole.minable = false
|
|
|
|
pole.rotatable = false
|
|
|
|
return pole
|
|
|
|
end
|
|
|
|
|
|
|
|
---Creates a special linked-chest on the surface at the given position on the neutral force.
|
|
|
|
---@param surface LuaSurface
|
|
|
|
---@param position MapPosition
|
|
|
|
---@return LuaEntity?
|
|
|
|
function CreateSharedChest(surface, position)
|
|
|
|
local chest = surface.create_entity
|
|
|
|
{
|
|
|
|
name="oarc-linked-chest",
|
|
|
|
position=position,
|
|
|
|
force="neutral"
|
|
|
|
}
|
|
|
|
chest.destructible = false
|
|
|
|
chest.minable = false
|
|
|
|
chest.rotatable = false
|
|
|
|
|
|
|
|
TemporaryHelperText(
|
|
|
|
{ "oarc-shared-chest-helper-txt" },
|
|
|
|
surface,
|
|
|
|
{position.x, position.y+1},
|
|
|
|
TICKS_PER_MINUTE*2,
|
|
|
|
"left"
|
|
|
|
)
|
|
|
|
|
|
|
|
return chest
|
|
|
|
end
|