124 lines
3.4 KiB
Lua

local floor, ceil = math.floor, math.ceil
local min, max = math.min, math.max
local super_compact = require("layouts.super_compact")
local logistics =require("layouts.logistics")
local builder = require("mpp.builder")
---@class CompactLogisticsLayout: SuperCompactLayout
local layout = table.deepcopy(super_compact)
layout.name = "compact_logistics"
layout.translation = {"", "[entity=logistic-chest-passive-provider] ", {"mpp.settings_layout_choice_compact_logistics"}}
layout.restrictions.lamp_available = false
layout.restrictions.belt_available = false
layout.restrictions.logistics_available = true
layout.restrictions.lane_filling_info_available = false
---@param self SimpleLayout
---@param state SimpleState
function layout:prepare_belt_layout(state)
local m = state.miner
local g = state.grid
local C = state.coords
local attempt = state.best_attempt
local power_poles = {}
state.builder_power_poles = power_poles
---@type table<number, MinerPlacement[]>
local miner_lanes = {{}}
local miner_lane_number = 0 -- highest index of a lane, because using # won't do the job if a lane is missing
local builder_belts = {}
state.builder_belts = builder_belts
local function que_entity(t) builder_belts[#builder_belts+1] = t end
for _, miner in ipairs(attempt.miners) do
local index = miner.line
miner_lane_number = max(miner_lane_number, index)
if not miner_lanes[index] then miner_lanes[index] = {} end
local line = miner_lanes[index]
line._index = index
local out_x = m.output_rotated[defines.direction[miner.direction]][1]
if line.last_x == nil or (miner.x+out_x) > line.last_x then
line.last_x = miner.x + out_x
line.last_miner = miner
end
line[#line+1] = miner
end
local shift_x, shift_y = state.best_attempt.sx, state.best_attempt.sy
local function place_logistics(lane, start_x, end_x, y)
local belt_start = 1 + shift_x + start_x
if start_x ~= 0 then
local miner = g:get_tile(shift_x+m.size, y)
if miner and miner.built_on == "miner" then
que_entity{
name=state.logistics_choice,
thing="belt",
grid_x=shift_x+m.size+1,
grid_y=y,
}
power_poles[#power_poles+1] = {
name=state.pole_choice,
thing="pole",
grid_x = shift_x,
grid_y = y,
}
end
end
for x = belt_start, end_x, m.size * 2 do
local miner1 = g:get_tile(x, y-1) --[[@as GridTile]]
local miner2 = g:get_tile(x, y+1) --[[@as GridTile]]
local miner3 = g:get_tile(x+3, y) --[[@as GridTile]]
local built = (miner1 and miner1.built_on == "miner") or (miner2 and miner2.built_on == "miner")
local capped = miner3 and miner3.built_on == "miner"
local pole_built = built or capped
if capped then
que_entity{
name=state.logistics_choice,
thing="belt",
grid_x=x+m.size*2,
grid_y=y,
}
end
if built then
que_entity{
name=state.logistics_choice,
thing="belt",
grid_x=x+1,
grid_y=y,
}
end
if pole_built then
power_poles[#power_poles+1] = {
name=state.pole_choice,
thing="pole",
grid_x = x + 2,
grid_y = y,
}
end
end
end
for i = 1, miner_lane_number do
local lane = miner_lanes[i]
if lane and lane.last_x then
local y = m.size + shift_y - 1 + (m.size + 2) * (i-1)
local x_start = i % 2 == 0 and 3 or 0
place_logistics(lane, x_start, lane.last_x, y)
end
end
return "expensive_deconstruct"
end
layout.finish = logistics.finish
return layout