mirror of
https://github.com/Xevion/project-cybersyn.git
synced 2025-12-16 18:12:50 -06:00
furthered integration
This commit is contained in:
@@ -1,3 +1,5 @@
|
|||||||
|
--By Monica Moniot
|
||||||
|
local get_distance = require("__flib__.misc").get_distance
|
||||||
local math = math
|
local math = math
|
||||||
local INF = math.huge
|
local INF = math.huge
|
||||||
|
|
||||||
@@ -28,6 +30,7 @@ station: {
|
|||||||
last_delivery_tick: int
|
last_delivery_tick: int
|
||||||
r_threshold: int >= 0
|
r_threshold: int >= 0
|
||||||
p_threshold: int >= 0
|
p_threshold: int >= 0
|
||||||
|
entity: FactorioStop
|
||||||
train_layout: [ [ {
|
train_layout: [ [ {
|
||||||
[car_type]: true|nil
|
[car_type]: true|nil
|
||||||
} ] ]
|
} ] ]
|
||||||
@@ -38,16 +41,18 @@ station: {
|
|||||||
train: {
|
train: {
|
||||||
layout_id: int
|
layout_id: int
|
||||||
depot_id: int
|
depot_id: int
|
||||||
|
depot_name: string
|
||||||
item_slot_capacity: int
|
item_slot_capacity: int
|
||||||
fluid_capacity: int
|
fluid_capacity: int
|
||||||
}
|
}
|
||||||
available_trains: [{
|
available_trains: [{
|
||||||
layout_id: int
|
layout_id: int
|
||||||
capacity: int
|
capacity: int
|
||||||
|
all: [train]
|
||||||
}]
|
}]
|
||||||
]]
|
]]
|
||||||
|
|
||||||
local function create_loading_order(station_name, manifest)
|
local function create_loading_order(stop, manifest)
|
||||||
local condition = {}
|
local condition = {}
|
||||||
for _, item in ipairs(manifest) do
|
for _, item in ipairs(manifest) do
|
||||||
local cond_type
|
local cond_type
|
||||||
@@ -63,22 +68,22 @@ local function create_loading_order(station_name, manifest)
|
|||||||
condition = {comparator = "≥", first_signal = {type = item.type, name = item.name}, constant = item.count}
|
condition = {comparator = "≥", first_signal = {type = item.type, name = item.name}, constant = item.count}
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
return {station = station_name, wait_conditions = condition}
|
return {station = stop.backer_name, wait_conditions = condition}
|
||||||
end
|
end
|
||||||
|
|
||||||
local create_unloading_order_condition = {type = "empty", compare_type = "and"}
|
local create_unloading_order_condition = {type = "empty", compare_type = "and"}
|
||||||
local function create_unloading_order(station_name, manifest)
|
local function create_unloading_order(stop, manifest)
|
||||||
return {station = station_name, wait_conditions = create_unloading_order_condition}
|
return {station = stop.backer_name, wait_conditions = create_unloading_order_condition}
|
||||||
end
|
end
|
||||||
|
|
||||||
local create_inactivity_order_condition = {type = "inactivity", compare_type = "and", ticks = 3}
|
local create_inactivity_order_condition = {type = "inactivity", compare_type = "and", ticks = 3}
|
||||||
local function create_inactivity_order(station_name)
|
local function create_inactivity_order(stop)
|
||||||
return {station = station_name, wait_conditions = create_inactivity_order_condition}
|
return {station = stop.backer_name, wait_conditions = create_inactivity_order_condition}
|
||||||
end
|
end
|
||||||
|
|
||||||
local create_direct_to_station_order_condition = {{type = "time", compare_type = "and", ticks = 0}}
|
local create_direct_to_station_order_condition = {{type = "time", compare_type = "and", ticks = 0}}
|
||||||
local function create_direct_to_station_order(rail, rail_direction)
|
local function create_direct_to_station_order(stop)
|
||||||
return {wait_conditions = create_direct_to_station_order_condition, rail = rail, rail_direction = rail_direction, temporary = false}
|
return {wait_conditions = create_direct_to_station_order_condition, rail = stop.connected_rail, rail_direction = stop.connected_rail_direction}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
@@ -87,8 +92,8 @@ local function get_signals(stations, station_id)
|
|||||||
return {}
|
return {}
|
||||||
end
|
end
|
||||||
|
|
||||||
local function get_station_dist(stations, id0, id1)
|
local function get_stop_dist(stop0, stop1)
|
||||||
return INF
|
return get_distance(stop0.position, stop1.position)
|
||||||
end
|
end
|
||||||
|
|
||||||
local function get_valid_train(stations, r_station_id, p_station_id, available_trains, item_type)
|
local function get_valid_train(stations, r_station_id, p_station_id, available_trains, item_type)
|
||||||
@@ -96,13 +101,14 @@ local function get_valid_train(stations, r_station_id, p_station_id, available_t
|
|||||||
local r_station = stations[r_station_id]
|
local r_station = stations[r_station_id]
|
||||||
local p_station = stations[p_station_id]
|
local p_station = stations[p_station_id]
|
||||||
|
|
||||||
local p_to_r_dist = get_station_dist(stations, p_station_id, r_station_id)
|
local p_to_r_dist = get_stop_dist(p_station.entity, r_station.entity)
|
||||||
if p_to_r_dist == INF then
|
if p_to_r_dist == INF then
|
||||||
return nil, p_to_r_dist
|
return nil, INF
|
||||||
end
|
end
|
||||||
|
|
||||||
local best_train = nil
|
local best_train = nil
|
||||||
local best_dist = INF
|
local best_dist = INF
|
||||||
|
local valid_train_exists = false
|
||||||
|
|
||||||
local is_fluid = item_type == "fluid"
|
local is_fluid = item_type == "fluid"
|
||||||
for k, train in pairs(available_trains.all) do
|
for k, train in pairs(available_trains.all) do
|
||||||
@@ -111,12 +117,14 @@ local function get_valid_train(stations, r_station_id, p_station_id, available_t
|
|||||||
if
|
if
|
||||||
((is_fluid and train.fluid_capacity > 0) or (not is_fluid and train.item_slot_capacity > 0))
|
((is_fluid and train.fluid_capacity > 0) or (not is_fluid and train.item_slot_capacity > 0))
|
||||||
and r_station.accepted_layouts[train.layout_id] and p_station.accepted_layouts[train.layout_id]
|
and r_station.accepted_layouts[train.layout_id] and p_station.accepted_layouts[train.layout_id]
|
||||||
|
and train.entity.station
|
||||||
then
|
then
|
||||||
|
valid_train_exists = true
|
||||||
--check if exists valid path
|
--check if exists valid path
|
||||||
--check if path is shortest so we prioritize locality
|
--check if path is shortest so we prioritize locality
|
||||||
local d_to_p_dist = get_station_dist(stations, train.depot_id, p_station_id)
|
local d_to_p_dist = get_stop_dist(train.entity.station, p_station.entity)
|
||||||
|
|
||||||
local dist = d_to_p_dist + p_to_r_dist
|
local dist = d_to_p_dist
|
||||||
if dist < best_dist then
|
if dist < best_dist then
|
||||||
best_dist = dist
|
best_dist = dist
|
||||||
best_train = train
|
best_train = train
|
||||||
@@ -124,7 +132,11 @@ local function get_valid_train(stations, r_station_id, p_station_id, available_t
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
return best_train, best_dist
|
if valid_train_exists then
|
||||||
|
return best_train, best_dist + p_to_r_dist
|
||||||
|
else
|
||||||
|
return nil, p_to_r_dist
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local function send_train_between(stations, r_station_id, p_station_id, train, primary_item_name, economy)
|
local function send_train_between(stations, r_station_id, p_station_id, train, primary_item_name, economy)
|
||||||
@@ -152,7 +164,7 @@ local function send_train_between(stations, r_station_id, p_station_id, train, p
|
|||||||
local item_name = v.signal.name
|
local item_name = v.signal.name
|
||||||
local item_count = v.count
|
local item_count = v.count
|
||||||
local item_type = v.signal.type
|
local item_type = v.signal.type
|
||||||
if item_name and item_type and item_type ~= "virtual" and item_name ~= primary_item_name then
|
if item_name and item_type and item_type ~= "virtual" then
|
||||||
local effective_item_count = item_count + p_station.delivery_amount[item_name]
|
local effective_item_count = item_count + p_station.delivery_amount[item_name]
|
||||||
if effective_item_count >= p_station.p_threshold then
|
if effective_item_count >= p_station.p_threshold then
|
||||||
local r = requests[item_name]
|
local r = requests[item_name]
|
||||||
@@ -169,8 +181,8 @@ local function send_train_between(stations, r_station_id, p_station_id, train, p
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
--local total_slots_left = 0
|
local total_slots_left = train.item_slot_capacity
|
||||||
--local total_liquid_left = 0
|
local total_liquid_left = train.fluid_capacity
|
||||||
|
|
||||||
local i = 1
|
local i = 1
|
||||||
while i <= #manifest do
|
while i <= #manifest do
|
||||||
@@ -195,7 +207,7 @@ local function send_train_between(stations, r_station_id, p_station_id, train, p
|
|||||||
end
|
end
|
||||||
if keep_item then
|
if keep_item then
|
||||||
i = i + 1
|
i = i + 1
|
||||||
else
|
else--swap remove
|
||||||
manifest[i] = manifest[#manifest]
|
manifest[i] = manifest[#manifest]
|
||||||
manifest[#manifest] = nil
|
manifest[#manifest] = nil
|
||||||
end
|
end
|
||||||
@@ -228,6 +240,21 @@ local function send_train_between(stations, r_station_id, p_station_id, train, p
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
do
|
||||||
|
local records = {}
|
||||||
|
records[#records + 1] = create_inactivity_order(train.depot_name)
|
||||||
|
|
||||||
|
records[#records + 1] = create_direct_to_station_order(p_station.entity)
|
||||||
|
records[#records + 1] = create_loading_order(p_station.entity, manifest)
|
||||||
|
|
||||||
|
records[#records + 1] = create_direct_to_station_order(p_station.entity)
|
||||||
|
records[#records + 1] = create_unloading_order(p_station.entity, manifest)
|
||||||
|
|
||||||
|
local schedule = {current = 1, records = records}
|
||||||
|
|
||||||
|
train.entity.schedule = schedule
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user