added filtering

This commit is contained in:
Monica Moniot
2022-11-06 15:27:22 -05:00
parent 09c34521ef
commit e111e865d6
7 changed files with 106 additions and 62 deletions

14
.vscode/launch.json vendored
View File

@@ -18,6 +18,20 @@
}, },
"disableExtraMods": true "disableExtraMods": true
}, },
{
"type": "factoriomod",
"request": "launch",
"name": "Factorio Mod Debug (Modded)",
"modsPath": "C:\\Users\\mmoni\\AppData\\Roaming\\Factorio\\mods",
"manageMod": true,
"adjustMods": {
"debugadapter": true,
"flib": true,
"cybersyn": true,
"creative-mod": true,
},
"disableExtraMods": false
},
{ {
"type": "factoriomod", "type": "factoriomod",
"request": "launch", "request": "launch",

3
TODO
View File

@@ -4,3 +4,6 @@ do hardcore testing
models & art models & art
space elevator compat space elevator compat
railloader compat railloader compat
add missing items alert
lost train can be repurposed and rescheduled while alert is active
display when train is coming

View File

@@ -9,6 +9,7 @@ local btest = bit32.btest
local band = bit32.band local band = bit32.band
local table_remove = table.remove local table_remove = table.remove
local table_sort = table.sort local table_sort = table.sort
local random = math.random
local create_loading_order_condition = {type = "inactivity", compare_type = "and", ticks = 120} local create_loading_order_condition = {type = "inactivity", compare_type = "and", ticks = 120}
---@param stop LuaEntity ---@param stop LuaEntity
@@ -99,8 +100,8 @@ local function set_comb2(map_data, station)
local signals = {} local signals = {}
for item_name, count in pairs(deliveries) do for item_name, count in pairs(deliveries) do
local i = #signals + 1 local i = #signals + 1
local item_type = game.item_prototypes[item_name].type--NOTE: this is expensive local is_fluid = game.item_prototypes[item_name] == nil--NOTE: this is expensive
signals[i] = {index = i, signal = {type = item_type, name = item_name}, count = -count} signals[i] = {index = i, signal = {type = is_fluid and "fluid" or "item", name = item_name}, count = -count}
end end
set_combinator_output(map_data, station.entity_comb2, signals) set_combinator_output(map_data, station.entity_comb2, signals)
end end
@@ -481,23 +482,13 @@ local function tick_dispatch(map_data, mod_settings)
local all_p_stations = map_data.economy.all_p_stations local all_p_stations = map_data.economy.all_p_stations
local all_names = map_data.economy.all_names local all_names = map_data.economy.all_names
local stations = map_data.stations local stations = map_data.stations
local size = #all_names
local r_stations = tick_data.r_stations local r_stations = tick_data.r_stations
local p_stations = tick_data.p_stations local p_stations = tick_data.p_stations
if not (p_stations and #r_stations > 0 and #p_stations > 0) then if not (p_stations and #r_stations > 0 and #p_stations > 0) then
if size == 0 then
map_data.tick_state = STATE_INIT
return true
elseif tick_data.start_i == nil then
--semi-randomized starting item
tick_data.start_i = 2*(map_data.total_ticks%(size/2)) + 1
tick_data.offset_i = 0
end
while true do while true do
if tick_data.offset_i >= size then local size = #all_names
tick_data.start_i = nil if size == 0 then
tick_data.offset_i = nil
tick_data.r_stations = nil tick_data.r_stations = nil
tick_data.p_stations = nil tick_data.p_stations = nil
tick_data.item_name = nil tick_data.item_name = nil
@@ -505,11 +496,16 @@ local function tick_dispatch(map_data, mod_settings)
map_data.tick_state = STATE_INIT map_data.tick_state = STATE_INIT
return true return true
end end
local name_i = tick_data.start_i + tick_data.offset_i
tick_data.offset_i = tick_data.offset_i + 2
local item_network_name = all_names[(name_i - 1)%size + 1] --randomizing the ordering should only matter if we run out of available trains
local signal = all_names[(name_i)%size + 1] local name_i = size <= 2 and 2 or 2*random(size/2)
local item_network_name = all_names[name_i - 1]
local signal = all_names[name_i]
--swap remove
all_names[name_i - 1] = all_names[size - 1]
all_names[name_i] = all_names[size]
all_names[size] = nil
all_names[size - 1] = nil
r_stations = all_r_stations[item_network_name] r_stations = all_r_stations[item_network_name]
p_stations = all_p_stations[item_network_name] p_stations = all_p_stations[item_network_name]

View File

@@ -15,6 +15,7 @@ COMBINATOR_CLOSE_SOUND = "entity-close/cybersyn-combinator"
OPERATION_DEFAULT = "*" OPERATION_DEFAULT = "*"
OPERATION_PRIMARY_IO = "/" OPERATION_PRIMARY_IO = "/"
OPERATION_PRIMARY_IO_ACTIVE = "^"
OPERATION_SECONDARY_IO = "%" OPERATION_SECONDARY_IO = "%"
OPERATION_DEPOT = "+" OPERATION_DEPOT = "+"
OPERATION_WAGON_MANIFEST = "-" OPERATION_WAGON_MANIFEST = "-"

View File

@@ -53,6 +53,7 @@
---@field public p_station_id uint ---@field public p_station_id uint
---@field public r_station_id uint ---@field public r_station_id uint
---@field public manifest Manifest ---@field public manifest Manifest
---@field public has_filtered_wagon boolean
---@alias Manifest {}[] ---@alias Manifest {}[]
---@alias TrainClass {[uint]: boolean} ---@alias TrainClass {[uint]: boolean}

View File

@@ -2,6 +2,7 @@
local area = require("__flib__.area") local area = require("__flib__.area")
local abs = math.abs local abs = math.abs
local floor = math.floor local floor = math.floor
local ceil = math.ceil
local function iterr(a, i) local function iterr(a, i)
i = i + 1 i = i + 1
@@ -123,6 +124,7 @@ function set_p_wagon_combs(map_data, station, train)
local ivpairs = is_reversed and irpairs or ipairs local ivpairs = is_reversed and irpairs or ipairs
for carriage_i, carriage in ivpairs(carriages) do for carriage_i, carriage in ivpairs(carriages) do
--NOTE: we are not checking valid
---@type LuaEntity? ---@type LuaEntity?
local comb = station.wagon_combs[carriage_i] local comb = station.wagon_combs[carriage_i]
if comb and not comb.valid then if comb and not comb.valid then
@@ -137,26 +139,36 @@ function set_p_wagon_combs(map_data, station, train)
local signals = {} local signals = {}
local inv = carriage.get_inventory(defines.inventory.cargo_wagon) local inv = carriage.get_inventory(defines.inventory.cargo_wagon)
if inv then
local inv_filter_i = 1
local item_slots_capacity = #inv - station.locked_slots local item_slots_capacity = #inv - station.locked_slots
while item_slots_capacity > 0 do while item_slots_capacity > 0 do
local do_inc = false local do_inc = false
if item.type == "item" then if item.type == "item" then
local stack_size = game.item_prototypes[item.name].stack_size local stack_size = game.item_prototypes[item.name].stack_size
local item_slots = math.ceil(item_count/stack_size) local item_slots = ceil(item_count/stack_size)
local i = #signals + 1 local i = #signals + 1
local slots_to_filter
if item_slots > item_slots_capacity then if item_slots > item_slots_capacity then
if comb then if comb then
signals[i] = {index = i, signal = {type = item.type, name = item.name}, count = item_slots_capacity*stack_size} signals[i] = {index = i, signal = {type = item.type, name = item.name}, count = item_slots_capacity*stack_size}
end end
item_slots_capacity = 0 item_slots_capacity = 0
item_count = item_count - item_slots_capacity*stack_size item_count = item_count - item_slots_capacity*stack_size
slots_to_filter = item_slots_capacity
else else
if comb then if comb then
signals[i] = {index = i, signal = {type = item.type, name = item.name}, count = item_count} signals[i] = {index = i, signal = {type = item.type, name = item.name}, count = item_count}
end end
item_slots_capacity = item_slots_capacity - item_slots item_slots_capacity = item_slots_capacity - item_slots
do_inc = true do_inc = true
slots_to_filter = item_slots
end end
for j = 1, slots_to_filter do
inv.set_filter(inv_filter_i, item.name)
inv_filter_i = inv_filter_i + 1
end
train.has_filtered_wagon = true
else else
do_inc = true do_inc = true
end end
@@ -174,6 +186,7 @@ function set_p_wagon_combs(map_data, station, train)
if comb then if comb then
set_combinator_output(map_data, comb, signals) set_combinator_output(map_data, comb, signals)
end end
end
elseif carriage.type == "fluid-wagon" and fluid_i <= #manifest then elseif carriage.type == "fluid-wagon" and fluid_i <= #manifest then
local fluid_capacity = carriage.prototype.fluid_capacity local fluid_capacity = carriage.prototype.fluid_capacity
local signals = {} local signals = {}

View File

@@ -562,6 +562,20 @@ end
local function on_train_leaves_station(map_data, train) local function on_train_leaves_station(map_data, train)
if train.manifest then if train.manifest then
if train.status == STATUS_P then if train.status == STATUS_P then
if train.has_filtered_wagon then
train.has_filtered_wagon = false
for carriage_i, carriage in ipairs(train.entity.carriages) do
if carriage.type == "cargo-wagon" then
local inv = carriage.get_inventory(defines.inventory.cargo_wagon)
if inv and inv.is_filtered() then
---@type uint
for i = 1, #inv do
inv.set_filter(i, nil)
end
end
end
end
end
train.status = STATUS_P_TO_R train.status = STATUS_P_TO_R
local station = map_data.stations[train.p_station_id] local station = map_data.stations[train.p_station_id]
remove_manifest(map_data, station, train.manifest, 1) remove_manifest(map_data, station, train.manifest, 1)
@@ -663,6 +677,7 @@ end
local function on_train_changed(event) local function on_train_changed(event)
local train_e = event.train local train_e = event.train
local train = global.trains[train_e.id] local train = global.trains[train_e.id]
if train_e.valid then
if train_e.state == defines.train_state.wait_station then if train_e.state == defines.train_state.wait_station then
local stop = train_e.station local stop = train_e.station
if stop and stop.valid and stop.name == "train-stop" then if stop and stop.valid and stop.name == "train-stop" then
@@ -680,6 +695,7 @@ local function on_train_changed(event)
on_train_leaves_station(global, train) on_train_leaves_station(global, train)
end end
end end
end
end end
local function on_surface_removed(event) local function on_surface_removed(event)
@@ -739,7 +755,7 @@ local function main()
mod_settings.p_threshold = settings.global["cybersyn-provide-threshold"].value--[[@as int]] mod_settings.p_threshold = settings.global["cybersyn-provide-threshold"].value--[[@as int]]
mod_settings.network_flag = settings.global["cybersyn-network-flag"].value--[[@as int]] mod_settings.network_flag = settings.global["cybersyn-network-flag"].value--[[@as int]]
--NOTE: I have no idea if this correctly registers all events once in all situations --NOTE: There is a concern that it is possible to build or destroy important entities without one of these events being triggered, in which case the mod will have undefined behavior
flib_event.register(defines.events.on_built_entity, on_built, filter_built) flib_event.register(defines.events.on_built_entity, on_built, filter_built)
flib_event.register(defines.events.on_robot_built_entity, on_built, filter_built) flib_event.register(defines.events.on_robot_built_entity, on_built, filter_built)
flib_event.register({defines.events.script_raised_built, defines.events.script_raised_revive, defines.events.on_entity_cloned}, on_built) flib_event.register({defines.events.script_raised_built, defines.events.script_raised_revive, defines.events.on_entity_cloned}, on_built)
@@ -754,7 +770,7 @@ local function main()
flib_event.register(defines.events.on_entity_settings_pasted, on_paste) flib_event.register(defines.events.on_entity_settings_pasted, on_paste)
local nth_tick = math.ceil(60/mod_settings.tps); local nth_tick = math.ceil(60/mod_settings.tps);
flib_event.on_nth_tick(nth_tick, function(event) flib_event.on_nth_tick(nth_tick, function()
tick(global, mod_settings) tick(global, mod_settings)
end) end)