mirror of
https://github.com/Xevion/project-cybersyn.git
synced 2025-12-09 12:08:22 -06:00
added entities
This commit is contained in:
26
.luarc.json
26
.luarc.json
@@ -1,8 +1,26 @@
|
||||
{
|
||||
"$schema": "https://raw.githubusercontent.com/sumneko/vscode-lua/master/setting/schema.json",
|
||||
"Lua.diagnostics.disable": [
|
||||
"lowercase-global"
|
||||
],
|
||||
"Lua.diagnostics.globals": [
|
||||
"mods",
|
||||
"table_size",
|
||||
"log",
|
||||
"localised_print",
|
||||
"serpent",
|
||||
"global",
|
||||
"__DebugAdapter",
|
||||
"__Profiler",
|
||||
"create_inactivity_order"
|
||||
],
|
||||
"runtime": {
|
||||
"plugin": "C:\\Users\\mmoni\\files\\data\\projects\\factorio\\mtc\\.vscode\\lua\\plugin.lua",
|
||||
"pluginArgs": ["--global-as-class", "--mode=mods", "--mod_name=ltndless"]
|
||||
"plugin": "C:\\Users\\mmoni\\files\\data\\projects\\factorio\\cybersyn\\.vscode\\lua\\plugin.lua",
|
||||
"pluginArgs": [
|
||||
"--global-as-class",
|
||||
"--mode=mods",
|
||||
"--mod_name=ltndless"
|
||||
]
|
||||
},
|
||||
"runtime.path": [
|
||||
"?.lua",
|
||||
@@ -13,8 +31,8 @@
|
||||
"src/scripts/?/init.lua"
|
||||
],
|
||||
"runtime.pathStrict": false,
|
||||
"workspace.ignoreSubmodules": false,
|
||||
"workspace": {
|
||||
"useGitIgnore": false
|
||||
}
|
||||
},
|
||||
"workspace.ignoreSubmodules": false
|
||||
}
|
||||
|
||||
6
.vscode/launch.json
vendored
6
.vscode/launch.json
vendored
@@ -13,7 +13,7 @@
|
||||
"adjustMods": {
|
||||
"debugadapter": true,
|
||||
"flib": true,
|
||||
"mtc": true,
|
||||
"cybersyn": true,
|
||||
},
|
||||
"disableExtraMods": true
|
||||
},
|
||||
@@ -26,7 +26,7 @@
|
||||
"adjustMods": {
|
||||
"debugadapter": true,
|
||||
"flib": true,
|
||||
"mtc": true,
|
||||
"cybersyn": true,
|
||||
},
|
||||
"disableExtraMods": true
|
||||
},
|
||||
@@ -38,7 +38,7 @@
|
||||
"adjustMods": {
|
||||
"debugadapter": true,
|
||||
"flib": true,
|
||||
"mtc": true,
|
||||
"cybersyn": true,
|
||||
},
|
||||
"disableExtraMods": true
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
|
||||
|
||||
require("scripts.constants")
|
||||
require("scripts.global")
|
||||
require("scripts.controller")
|
||||
require("scripts.main")
|
||||
|
||||
19
mtc/data.lua
19
mtc/data.lua
@@ -0,0 +1,19 @@
|
||||
--By Mami
|
||||
flib = require('__flib__.data-util')
|
||||
|
||||
require('scripts.constants')
|
||||
require('prototypes.item')
|
||||
require('prototypes.tech')
|
||||
require('prototypes.entity')
|
||||
|
||||
data:extend({
|
||||
cybersyn_depot_item,
|
||||
cybersyn_station_item,
|
||||
cybersyn_depot_recipe,
|
||||
cybersyn_station_recipe,
|
||||
cybersyn_tech,
|
||||
cybersyn_depot_entity,
|
||||
cybersyn_station_entity,
|
||||
cybersyn_station_in,
|
||||
cybersyn_station_out,
|
||||
})
|
||||
|
||||
BIN
mtc/graphics/icons/depot.png
Normal file
BIN
mtc/graphics/icons/depot.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.5 KiB |
BIN
mtc/graphics/icons/station.png
Normal file
BIN
mtc/graphics/icons/station.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.5 KiB |
BIN
mtc/graphics/icons/tech.png
Normal file
BIN
mtc/graphics/icons/tech.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.5 KiB |
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "mtc",
|
||||
"name": "cybersyn",
|
||||
"version": "0.0.1",
|
||||
"title": "mtc",
|
||||
"title": "Project Cybersyn",
|
||||
"author": "Mami",
|
||||
"factorio_version": "1.1",
|
||||
"dependencies": [
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
[mod-setting-name]
|
||||
cybersyn-ticks-per-second=Dispatcher ticks per second
|
||||
cybersyn-requester-threshold=Default requester threshold
|
||||
cybersyn-provider-threshold=Default provider threshold
|
||||
|
||||
[mod-setting-description]
|
||||
cybersyn-ticks-per-second=How many times per second to check all stations for possible deliveries. This value will be rounded up to a divisor of 60.
|
||||
cybersyn-requester-threshold=When a requester threshold signal is not recieved by a station it will default to this value.
|
||||
cybersyn-provider-threshold=When a provider threshold signal is not recieved by a station it will default to this value.
|
||||
|
||||
37
mtc/prototypes/entity.lua
Normal file
37
mtc/prototypes/entity.lua
Normal file
@@ -0,0 +1,37 @@
|
||||
--By Mami
|
||||
cybersyn_station_entity = flib.copy_prototype(data.raw["train-stop"]["train-stop"], BUFFER_STATION_NAME)
|
||||
cybersyn_station_entity.icon = "__cybersyn__/graphics/icon/station.png"
|
||||
cybersyn_station_entity.icon_size = 64
|
||||
cybersyn_station_entity.icon_mipmaps = 4
|
||||
cybersyn_station_entity.next_upgrade = nil
|
||||
|
||||
cybersyn_depot_entity = flib.copy_prototype(data.raw["train-stop"]["train-stop"], DEPOT_STATION_NAME)
|
||||
cybersyn_depot_entity.icon = "__cybersyn__/graphics/icon/depot.png"
|
||||
cybersyn_depot_entity.icon_size = 64
|
||||
cybersyn_depot_entity.icon_mipmaps = 4
|
||||
cybersyn_depot_entity.next_upgrade = nil
|
||||
|
||||
cybersyn_station_in = flib.copy_prototype(data.raw["lamp"]["small-lamp"], STATION_IN_NAME)
|
||||
cybersyn_station_in.icon = "__cybersyn__/graphics/icon/station.png"
|
||||
cybersyn_station_in.icon_size = 64
|
||||
cybersyn_station_in.icon_mipmaps = 4
|
||||
cybersyn_station_in.next_upgrade = nil
|
||||
cybersyn_station_in.minable = nil
|
||||
cybersyn_station_in.selection_box = {{-0.5, -0.5}, {0.5, 0.5}}
|
||||
cybersyn_station_in.selection_priority = cybersyn_station_in.selection_priority + 10
|
||||
cybersyn_station_in.collision_box = {{-0.15, -0.15}, {0.15, 0.15}}
|
||||
cybersyn_station_in.collision_mask = {"rail-layer"}
|
||||
cybersyn_station_in.energy_usage_per_tick = "10W"
|
||||
cybersyn_station_in.light = {intensity = 1, size = 6}
|
||||
cybersyn_station_in.energy_source = {type="void"}
|
||||
|
||||
cybersyn_station_out = flib.copy_prototype(data.raw["constant-combinator"]["constant-combinator"],STATION_OUT_NAME)
|
||||
cybersyn_station_out.icon = "__cybersyn__/graphics/icon/station.png"
|
||||
cybersyn_station_out.icon_size = 64
|
||||
cybersyn_station_out.icon_mipmaps = 4
|
||||
cybersyn_station_out.next_upgrade = nil
|
||||
cybersyn_station_out.minable = nil
|
||||
cybersyn_station_out.selection_box = {{-0.5, -0.5}, {0.5, 0.5}}
|
||||
cybersyn_station_out.selection_priority = cybersyn_station_out.selection_priority + 10
|
||||
cybersyn_station_out.collision_box = {{-0.15, -0.15}, {0.15, 0.15}}
|
||||
cybersyn_station_out.collision_mask = {"rail-layer"}
|
||||
12
mtc/prototypes/item.lua
Normal file
12
mtc/prototypes/item.lua
Normal file
@@ -0,0 +1,12 @@
|
||||
--By Mami
|
||||
cybersyn_station_item = flib.copy_prototype(data.raw["item"]["train-stop"], BUFFER_STATION_NAME)
|
||||
cybersyn_station_item.icon = "__cybersyn__/graphics/icons/station.png"
|
||||
cybersyn_station_item.icon_size = 64
|
||||
cybersyn_station_item.icon_mipmaps = 4
|
||||
cybersyn_station_item.order = cybersyn_station_item.order.."-c"
|
||||
|
||||
cybersyn_depot_item = flib.copy_prototype(data.raw["item"]["train-stop"], DEPOT_STATION_NAME)
|
||||
cybersyn_depot_item.icon = "__cybersyn__/graphics/icons/depot.png"
|
||||
cybersyn_depot_item.icon_size = 64
|
||||
cybersyn_depot_item.icon_mipmaps = 4
|
||||
cybersyn_depot_item.order = cybersyn_depot_item.order.."-d"
|
||||
46
mtc/prototypes/tech.lua
Normal file
46
mtc/prototypes/tech.lua
Normal file
@@ -0,0 +1,46 @@
|
||||
--By Mami
|
||||
cybersyn_station_recipe = flib.copy_prototype(data.raw["recipe"]["train-stop"], BUFFER_STATION_NAME)
|
||||
cybersyn_station_recipe.ingredients = {
|
||||
{"train-stop", 1},
|
||||
{"advanced-circuit", 5},
|
||||
}
|
||||
cybersyn_station_recipe.enabled = false
|
||||
|
||||
cybersyn_depot_recipe = flib.copy_prototype(data.raw["recipe"]["train-stop"], BUFFER_STATION_NAME)
|
||||
cybersyn_depot_recipe.ingredients = {
|
||||
{"train-stop", 1},
|
||||
{"electronic-circuit", 5},
|
||||
}
|
||||
cybersyn_depot_recipe.enabled = false
|
||||
|
||||
cybersyn_tech = {
|
||||
type = "technology",
|
||||
name = "cybernetic-train-network",
|
||||
icon = "__cybersyn__/graphics/icon/tech.png",
|
||||
icon_size = 64,
|
||||
icon_mipmaps = 4,
|
||||
prerequisites = {
|
||||
"automated-rail-transportation",
|
||||
"circuit-network",
|
||||
"advanced-electronics"
|
||||
},
|
||||
effects = {
|
||||
{
|
||||
type = "unlock-recipe",
|
||||
recipe = BUFFER_STATION_NAME
|
||||
},
|
||||
{
|
||||
type = "unlock-recipe",
|
||||
recipe = DEPOT_STATION_NAME
|
||||
},
|
||||
},
|
||||
unit = {
|
||||
ingredients = {
|
||||
{"automation-science-pack", 1},
|
||||
{"logistic-science-pack", 1}
|
||||
},
|
||||
count = 300,
|
||||
time = 30
|
||||
},
|
||||
order = "c-g-c"
|
||||
}
|
||||
19
mtc/scripts/constants.lua
Normal file
19
mtc/scripts/constants.lua
Normal file
@@ -0,0 +1,19 @@
|
||||
--By Mami
|
||||
|
||||
SIGNAL_PRIORITY = "cybersyn-priority"
|
||||
REQUEST_THRESHOLD = "cybersyn-request-threshold"
|
||||
PROVIDE_THRESHOLD = "cybersyn-provide-threshold"
|
||||
|
||||
STATION_IN_NAME = "cybersyn-station-in"
|
||||
STATION_OUT_NAME = "cybersyn-station-out"
|
||||
BUFFER_STATION_NAME = "cybersyn-station"
|
||||
DEPOT_STATION_NAME = "cybersyn-depot"
|
||||
|
||||
DELTA = 1/2048
|
||||
|
||||
STATUS_D = 0
|
||||
STATUS_D_TO_P = 1
|
||||
STATUS_P = 2
|
||||
STATUS_P_TO_R = 3
|
||||
STATUS_R = 4
|
||||
STATUS_R_TO_D = 5
|
||||
@@ -1,4 +1,4 @@
|
||||
--By Monica Moniot
|
||||
--By Mami
|
||||
local get_distance = require("__flib__.misc").get_distance
|
||||
local math = math
|
||||
local INF = math.huge
|
||||
@@ -22,7 +22,8 @@ local function icpairs(a, start_i)
|
||||
end
|
||||
end
|
||||
|
||||
local function create_loading_order(stop, manifest)
|
||||
local create_loading_order_condition = {type = "inactivity", compare_type = "and", ticks = 120}
|
||||
function create_loading_order(stop, manifest)
|
||||
local condition = {}
|
||||
for _, item in ipairs(manifest) do
|
||||
local cond_type
|
||||
@@ -32,23 +33,24 @@ local function create_loading_order(stop, manifest)
|
||||
cond_type = "item_count"
|
||||
end
|
||||
|
||||
condition[#condition + 1] = {
|
||||
condition[1] = {
|
||||
type = cond_type,
|
||||
compare_type = "and",
|
||||
condition = {comparator = "≥", first_signal = {type = item.type, name = item.name}, constant = item.count}
|
||||
}
|
||||
condition[2] = create_loading_order_condition
|
||||
end
|
||||
return {station = stop.backer_name, wait_conditions = condition}
|
||||
end
|
||||
|
||||
local create_unloading_order_condition = {type = "empty", compare_type = "and"}
|
||||
local function create_unloading_order(stop, manifest)
|
||||
function create_unloading_order(stop)
|
||||
return {station = stop.backer_name, wait_conditions = create_unloading_order_condition}
|
||||
end
|
||||
|
||||
local create_inactivity_order_condition = {type = "inactivity", compare_type = "and", ticks = 3}
|
||||
local function create_inactivity_order(stop)
|
||||
return {station = stop.backer_name, wait_conditions = create_inactivity_order_condition}
|
||||
local create_inactivity_order_condition = create_loading_order_condition
|
||||
function create_inactivity_order(depot_name)
|
||||
return {station = depot_name, wait_conditions = create_inactivity_order_condition}
|
||||
end
|
||||
|
||||
local create_direct_to_station_order_condition = {{type = "time", compare_type = "and", ticks = 0}}
|
||||
@@ -58,18 +60,23 @@ end
|
||||
|
||||
|
||||
|
||||
local function get_signals(stations, station_id)
|
||||
return {}
|
||||
local function get_signals(station)
|
||||
local signals = station.entity_in.get_merged_signals()
|
||||
return signals
|
||||
end
|
||||
|
||||
local function get_stop_dist(stop0, stop1)
|
||||
return get_distance(stop0.position, stop1.position)
|
||||
end
|
||||
|
||||
local function get_valid_train(stations, r_station_id, p_station_id, available_trains, item_type)
|
||||
local function station_accepts_layout(station, layout_id)
|
||||
return true
|
||||
end
|
||||
|
||||
local function get_valid_train(map_data, r_station_id, p_station_id, item_type)
|
||||
--NOTE: this code is the critical section for run-time optimization
|
||||
local r_station = stations[r_station_id]
|
||||
local p_station = stations[p_station_id]
|
||||
local r_station = map_data.stations[r_station_id]
|
||||
local p_station = map_data.stations[p_station_id]
|
||||
|
||||
local p_to_r_dist = get_stop_dist(p_station.entity, r_station.entity)
|
||||
if p_to_r_dist == INF then
|
||||
@@ -81,14 +88,15 @@ local function get_valid_train(stations, r_station_id, p_station_id, available_t
|
||||
local valid_train_exists = false
|
||||
|
||||
local is_fluid = item_type == "fluid"
|
||||
for train_id, _ in pairs(available_trains) do
|
||||
for train_id, _ in pairs(map_data.trains_available) do
|
||||
local train = map_data.trains[train_id]
|
||||
--check cargo capabilities
|
||||
--check layout validity for both stations
|
||||
if
|
||||
((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 train.entity.station
|
||||
((is_fluid and train.fluid_capacity > 0) or (not is_fluid and train.item_slot_capacity > 0))
|
||||
and station_accepts_layout(r_station, train.layout_id)
|
||||
and station_accepts_layout(p_station, train.layout_id)
|
||||
and train.entity.station
|
||||
then
|
||||
valid_train_exists = true
|
||||
--check if exists valid path
|
||||
@@ -110,14 +118,14 @@ local function get_valid_train(stations, r_station_id, p_station_id, available_t
|
||||
end
|
||||
end
|
||||
|
||||
local function send_train_between(stations, r_station_id, p_station_id, train, available_trains, primary_item_name, economy)
|
||||
local r_station = stations[r_station_id]
|
||||
local p_station = stations[p_station_id]
|
||||
local function send_train_between(map_data, r_station_id, p_station_id, train, primary_item_name, economy)
|
||||
local r_station = map_data.stations[r_station_id]
|
||||
local p_station = map_data.stations[p_station_id]
|
||||
|
||||
local requests = {}
|
||||
local manifest = {}
|
||||
|
||||
local r_signals = get_signals(r_station_id)
|
||||
local r_signals = get_signals(r_station)
|
||||
for k, v in pairs(r_signals) do
|
||||
local item_name = v.signal.name
|
||||
local item_count = v.count
|
||||
@@ -130,7 +138,7 @@ local function send_train_between(stations, r_station_id, p_station_id, train, a
|
||||
end
|
||||
end
|
||||
|
||||
local p_signals = get_signals(r_station_id)
|
||||
local p_signals = get_signals(r_station)
|
||||
for k, v in pairs(p_signals) do
|
||||
local item_name = v.signal.name
|
||||
local item_count = v.count
|
||||
@@ -193,8 +201,8 @@ local function send_train_between(stations, r_station_id, p_station_id, train, a
|
||||
for _, item in ipairs(manifest) do
|
||||
assert(item.count > 0, "main.lua error, transfer amount was not positive")
|
||||
|
||||
r_station.deliveries[item.name] = r_station.deliveries[item.name] + item.count
|
||||
p_station.deliveries[item.name] = p_station.deliveries[item.name] - item.count
|
||||
r_station.deliveries[item.name] = (r_station.deliveries[item.name] or 0) + item.count
|
||||
p_station.deliveries[item.name] = (p_station.deliveries[item.name] or 0) - item.count
|
||||
|
||||
local r_stations = economy.r_stations_all[item.name]
|
||||
local p_stations = economy.p_stations_all[item.name]
|
||||
@@ -212,22 +220,20 @@ local function send_train_between(stations, r_station_id, p_station_id, train, a
|
||||
end
|
||||
end
|
||||
|
||||
available_trains[train.entity.id] = nil
|
||||
map_data.trains_available[train.entity.id] = nil
|
||||
train.status = STATUS_D_TO_P
|
||||
train.p_station_id = p_station_id
|
||||
train.r_station_id = r_station_id
|
||||
train.manifest = manifest
|
||||
|
||||
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 records = {
|
||||
create_inactivity_order(train.depot_name),
|
||||
create_direct_to_station_order(p_station.entity),
|
||||
create_loading_order(p_station.entity, manifest),
|
||||
create_direct_to_station_order(r_station.entity),
|
||||
create_unloading_order(r_station.entity),
|
||||
}
|
||||
local schedule = {current = 1, records = records}
|
||||
|
||||
train.entity.schedule = schedule
|
||||
@@ -235,7 +241,9 @@ local function send_train_between(stations, r_station_id, p_station_id, train, a
|
||||
end
|
||||
|
||||
|
||||
function tick(stations, available_trains, ticks_total)
|
||||
function tick(map_data, mod_settings)
|
||||
local ticks_total = map_data.ticks_total
|
||||
local stations = map_data.stations
|
||||
local economy = {
|
||||
r_stations_all = {},
|
||||
p_stations_all = {},
|
||||
@@ -248,10 +256,10 @@ function tick(stations, available_trains, ticks_total)
|
||||
|
||||
for station_id, station in pairs(stations) do
|
||||
if station.deliveries_total < station.train_limit then
|
||||
station.r_threshold = 0
|
||||
station.p_threshold = 0
|
||||
station.r_threshold = mod_settings.r_threshold
|
||||
station.p_threshold = mod_settings.p_threshold
|
||||
station.priority = 0
|
||||
local signals = get_signals(station_id)
|
||||
local signals = get_signals(station)
|
||||
for k, v in pairs(signals) do
|
||||
local item_name = v.signal.name
|
||||
local item_count = v.count
|
||||
@@ -316,7 +324,7 @@ function tick(stations, available_trains, ticks_total)
|
||||
local highest_prior = -INF
|
||||
local could_have_been_serviced = false
|
||||
for j, p_station_id in ipairs(p_stations) do
|
||||
local train, d = get_valid_train(stations, r_station_id, p_station_id, available_trains)
|
||||
local train, d = get_valid_train(map_data, r_station_id, p_station_id)
|
||||
local prior = stations[p_station_id].priority
|
||||
if prior > highest_prior or (prior == highest_prior and d < best_dist) then
|
||||
if train then
|
||||
@@ -330,7 +338,7 @@ function tick(stations, available_trains, ticks_total)
|
||||
end
|
||||
end
|
||||
if best > 0 then
|
||||
send_train_between(stations, r_station_id, p_stations[best], best_train, available_trains, item_name, economy)
|
||||
send_train_between(map_data, r_station_id, p_stations[best], best_train, item_name, economy)
|
||||
elseif could_have_been_serviced then
|
||||
failed_because_missing_trains_total = failed_because_missing_trains_total + 1
|
||||
end
|
||||
@@ -350,7 +358,7 @@ function tick(stations, available_trains, ticks_total)
|
||||
local r_station = stations[r_station_id]
|
||||
local prior = r_station.priority
|
||||
if prior > highest_prior or (prior == highest_prior and r_station.last_delivery_tick < lowest_tick) then
|
||||
local train, d = get_valid_train(stations, r_station_id, p_station_id, available_trains)
|
||||
local train, d = get_valid_train(map_data, r_station_id, p_station_id)
|
||||
if train then
|
||||
best = i
|
||||
best_train = train
|
||||
@@ -362,7 +370,7 @@ function tick(stations, available_trains, ticks_total)
|
||||
end
|
||||
end
|
||||
if best > 0 then
|
||||
send_train_between(stations, r_stations[best], p_station_id, best_train, available_trains, item_name, economy)
|
||||
send_train_between(map_data, r_stations[best], p_station_id, best_train, item_name, economy)
|
||||
elseif could_have_been_serviced then
|
||||
failed_because_missing_trains_total = failed_because_missing_trains_total + 1
|
||||
end
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
--By Monica Moniot
|
||||
--By Mami
|
||||
|
||||
--[[
|
||||
global: {
|
||||
@@ -21,13 +21,15 @@ Station: {
|
||||
deliveries: {
|
||||
[item_name]: int
|
||||
}
|
||||
train_layout: [char]
|
||||
--train_layout: [char]
|
||||
accepted_layouts: {
|
||||
[layout_id]: bool
|
||||
}
|
||||
}
|
||||
Train: {
|
||||
entity: LuaEntity
|
||||
entity_in: LuaEntity
|
||||
entity_out: LuaEntity
|
||||
layout_id: int
|
||||
item_slot_capacity: int
|
||||
fluid_capacity: int
|
||||
@@ -44,6 +46,11 @@ Train: {
|
||||
Layout: string
|
||||
]]
|
||||
--TODO: only init once
|
||||
mod_settings = {}
|
||||
mod_settings.tps = settings.global["cybersyn-ticks-per-second"]
|
||||
mod_settings.r_threshold = settings.global["cybersyn-requester-threshold"]
|
||||
mod_settings.p_threshold = settings.global["cybersyn-provider-threshold"]
|
||||
|
||||
global.total_ticks = 0
|
||||
global.stations = {}
|
||||
global.trains = {}
|
||||
@@ -51,10 +58,3 @@ global.trains_available = {}
|
||||
global.layouts = {}
|
||||
global.layout_train_count = {}
|
||||
global.layout_top_id = 1
|
||||
|
||||
STATUS_D = 0
|
||||
STATUS_D_TO_P = 1
|
||||
STATUS_P = 2
|
||||
STATUS_P_TO_R = 3
|
||||
STATUS_R = 4
|
||||
STATUS_R_TO_D = 5
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
--By Monica Moniot
|
||||
--By Mami
|
||||
|
||||
|
||||
|
||||
local function on_failed_delivery(map_data, train)
|
||||
--NOTE: must change train status to STATUS_D or remove it from tracked trains after this call
|
||||
local is_p_delivery_made = train.status ~= STATUS_D_TO_P and train.status ~= STATUS_P
|
||||
if not is_p_delivery_made then
|
||||
local station = map_data.stations[train.p_station_id]
|
||||
@@ -13,6 +14,10 @@ local function on_failed_delivery(map_data, train)
|
||||
end
|
||||
end
|
||||
station.deliveries_total = station.deliveries_total - 1
|
||||
if train.status == STATUS_P then
|
||||
--change circuit outputs
|
||||
station.entity_out.get_control_behavior().parameters = nil
|
||||
end
|
||||
end
|
||||
local is_r_delivery_made = train.status == STATUS_R_TO_D
|
||||
if not is_r_delivery_made then
|
||||
@@ -24,12 +29,14 @@ local function on_failed_delivery(map_data, train)
|
||||
end
|
||||
end
|
||||
station.deliveries_total = station.deliveries_total - 1
|
||||
if train.status == STATUS_R then
|
||||
--change circuit outputs
|
||||
station.entity_out.get_control_behavior().parameters = nil
|
||||
end
|
||||
end
|
||||
--TODO: change circuit outputs
|
||||
train.r_station_id = 0
|
||||
train.p_station_id = 0
|
||||
train.manifest = nil
|
||||
--NOTE: must change train status to STATUS_D or remove it from tracked trains after call
|
||||
end
|
||||
|
||||
local function remove_train(map_data, train, train_id)
|
||||
@@ -49,22 +56,104 @@ local function remove_train(map_data, train, train_id)
|
||||
end
|
||||
|
||||
local function on_station_built(map_data, stop)
|
||||
--TODO: update station stats
|
||||
local pos_x = stop.position.x
|
||||
local pos_y = stop.position.y
|
||||
|
||||
local in_pos
|
||||
local out_pos
|
||||
local direction
|
||||
local search_area
|
||||
if stop.direction == 0 then
|
||||
direction = 0
|
||||
in_pos = {pos_x, pos_y - 1}
|
||||
out_pos = {pos_x - 1, pos_y - 1}
|
||||
search_area = {
|
||||
{pos_x + DELTA - 1, pos_y + DELTA - 1},
|
||||
{pos_x - DELTA + 1, pos_y - DELTA}
|
||||
}
|
||||
elseif stop.direction == 2 then
|
||||
direction = 2
|
||||
in_pos = {pos_x, pos_y}
|
||||
out_pos = {pos_x, pos_y - 1}
|
||||
search_area = {
|
||||
{pos_x + DELTA, pos_y + DELTA - 1},
|
||||
{pos_x - DELTA + 1, pos_y - DELTA + 1}
|
||||
}
|
||||
elseif stop.direction == 4 then
|
||||
direction = 4
|
||||
in_pos = {pos_x - 1, pos_y}
|
||||
out_pos = {pos_x, pos_y}
|
||||
search_area = {
|
||||
{pos_x + DELTA - 1, pos_y + DELTA},
|
||||
{pos_x - DELTA + 1, pos_y - DELTA + 1}
|
||||
}
|
||||
elseif stop.direction == 6 then
|
||||
direction = 6
|
||||
in_pos = {pos_x - 1, pos_y - 1}
|
||||
out_pos = {pos_x - 1, pos_y}
|
||||
search_area = {
|
||||
{pos_x + DELTA - 1, pos_y + DELTA - 1},
|
||||
{pos_x - DELTA, pos_y - DELTA + 1}
|
||||
}
|
||||
else
|
||||
assert(false, "cybersyn: invalid direction of train stop")
|
||||
end
|
||||
|
||||
local entity_in = nil
|
||||
local entity_out = nil
|
||||
local entities = stop.surface.find_entities(search_area)
|
||||
for _, cur_entity in pairs (entities) do
|
||||
if cur_entity.valid then
|
||||
if cur_entity.name == "entity-ghost" then
|
||||
if cur_entity.ghost_name == STATION_IN_NAME then
|
||||
_, entity_in = cur_entity.revive()
|
||||
elseif cur_entity.ghost_name == STATION_OUT_NAME then
|
||||
_, entity_out = cur_entity.revive()
|
||||
end
|
||||
elseif cur_entity.name == STATION_IN_NAME then
|
||||
entity_in = cur_entity
|
||||
elseif cur_entity.name == STATION_OUT_NAME then
|
||||
entity_out = cur_entity
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if entity_in == nil then -- create new
|
||||
entity_in = stop.surface.create_entity({
|
||||
name = STATION_IN_NAME,
|
||||
position = in_pos,
|
||||
force = stop.force
|
||||
})
|
||||
end
|
||||
entity_in.operable = false
|
||||
entity_in.minable = false
|
||||
entity_in.destructible = false
|
||||
|
||||
if entity_out == nil then -- create new
|
||||
entity_out = stop.surface.create_entity({
|
||||
name = STATION_OUT_NAME,
|
||||
position = out_pos,
|
||||
direction = direction,
|
||||
force = stop.force
|
||||
})
|
||||
end
|
||||
entity_out.operable = false
|
||||
entity_out.minable = false
|
||||
entity_out.destructible = false
|
||||
|
||||
local station = {
|
||||
entity = stop,
|
||||
entity_in = entity_in,
|
||||
entity_out = entity_out,
|
||||
deliveries_total = 0,
|
||||
train_limit = 100,
|
||||
priority = 0,
|
||||
last_delivery_tick = 0,
|
||||
r_threshold = 0,
|
||||
p_threshold = 0,
|
||||
entity = stop,
|
||||
--train_layout: [ [ {
|
||||
-- [car_type]: true|nil
|
||||
--} ] ]
|
||||
accepted_layouts = {
|
||||
--[layout_id]: true|nil
|
||||
}
|
||||
accepted_layouts = {}
|
||||
}
|
||||
|
||||
map_data.stations[stop.unit_number] = station
|
||||
end
|
||||
local function on_station_broken(map_data, stop)
|
||||
@@ -92,6 +181,33 @@ local function on_station_broken(map_data, stop)
|
||||
map_data.stations[station_id] = nil
|
||||
end
|
||||
|
||||
local function on_station_rename(map_data, stop)
|
||||
--search for trains coming to the renamed station
|
||||
local station_id = stop.unit_number
|
||||
local station = map_data.stations[station_id]
|
||||
for train_id, train in pairs(map_data.trains) do
|
||||
if station.deliveries_total <= 0 then
|
||||
break
|
||||
end
|
||||
local is_p = train.r_station_id == station_id
|
||||
local is_r = train.p_station_id == station_id
|
||||
if is_p or is_r then
|
||||
local is_p_delivery_made = train.status ~= STATUS_D_TO_P and train.status ~= STATUS_P
|
||||
local is_r_delivery_made = train.status == STATUS_R_TO_D
|
||||
if (is_r and not is_r_delivery_made) or (is_p and not is_p_delivery_made) then
|
||||
--train is attempting delivery to a stop that was renamed
|
||||
--TODO: test to make sure this code actually works
|
||||
local record = train.entity.schedule.records
|
||||
if is_p then
|
||||
record[3] = create_loading_order(station.entity, train.manifest)
|
||||
else
|
||||
record[5] = create_unloading_order(station.entity)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
local function find_and_add_all_stations(map_data)
|
||||
for _, surface in pairs(game.surfaces) do
|
||||
@@ -141,35 +257,35 @@ local function update_train_layout(map_data, train)
|
||||
|
||||
map_data.layouts[layout_id] = layout
|
||||
map_data.layout_train_count[layout_id] = 1
|
||||
for station_id, station in pairs(map_data.stations) do
|
||||
if #layout >= #station.train_layout then
|
||||
local is_approved = true
|
||||
for i, v in ipairs(station.train_layout) do
|
||||
local c = string.sub(layout, i, i)
|
||||
if v == "C" then
|
||||
if c ~= "C" and c ~= "?" then
|
||||
is_approved = false
|
||||
break
|
||||
end
|
||||
elseif v == "F" then
|
||||
if c ~= "F" then
|
||||
is_approved = false
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
for i = #station.train_layout, #layout do
|
||||
local c = string.sub(layout, i, i)
|
||||
if c ~= "?" then
|
||||
is_approved = false
|
||||
break
|
||||
end
|
||||
end
|
||||
if is_approved then
|
||||
station.accepted_layouts[layout_id] = true
|
||||
end
|
||||
end
|
||||
end
|
||||
--for station_id, station in pairs(map_data.stations) do
|
||||
-- if #layout >= #station.train_layout then
|
||||
-- local is_approved = true
|
||||
-- for i, v in ipairs(station.train_layout) do
|
||||
-- local c = string.sub(layout, i, i)
|
||||
-- if v == "C" then
|
||||
-- if c ~= "C" and c ~= "?" then
|
||||
-- is_approved = false
|
||||
-- break
|
||||
-- end
|
||||
-- elseif v == "F" then
|
||||
-- if c ~= "F" then
|
||||
-- is_approved = false
|
||||
-- break
|
||||
-- end
|
||||
-- end
|
||||
-- end
|
||||
-- for i = #station.train_layout, #layout do
|
||||
-- local c = string.sub(layout, i, i)
|
||||
-- if c ~= "?" then
|
||||
-- is_approved = false
|
||||
-- break
|
||||
-- end
|
||||
-- end
|
||||
-- if is_approved then
|
||||
-- station.accepted_layouts[layout_id] = true
|
||||
-- end
|
||||
-- end
|
||||
--end
|
||||
else
|
||||
map_data.layout_train_count[layout_id] = map_data.layout_train_count[layout_id] + 1
|
||||
end
|
||||
@@ -229,12 +345,24 @@ local function on_train_arrives_buffer(map_data, station_id, train)
|
||||
if train.status == STATUS_D_TO_P then
|
||||
if train.p_station_id == station_id then
|
||||
train.status = STATUS_P
|
||||
--TODO: change circuit outputs
|
||||
--change circuit outputs
|
||||
local station = map_data.stations[station_id]
|
||||
local signals = {}
|
||||
for i, item in ipairs(train.manifest) do
|
||||
signals[i] = {index = i, signal = {type = item.type, name = item.name}, count = item.count}
|
||||
end
|
||||
station.entity_out.get_control_behavior().parameters = signals
|
||||
end
|
||||
elseif train.status == STATUS_P_TO_R then
|
||||
if train.r_station_id == station_id then
|
||||
train.status = STATUS_R
|
||||
--TODO: change circuit outputs
|
||||
--change circuit outputs
|
||||
local station = map_data.stations[station_id]
|
||||
local signals = {}
|
||||
for i, item in ipairs(train.manifest) do
|
||||
signals[i] = {index = i, signal = {type = item.type, name = item.name}, count = -1}
|
||||
end
|
||||
station.entity_out.get_control_behavior().parameters = signals
|
||||
end
|
||||
else
|
||||
on_failed_delivery(map_data, train)
|
||||
@@ -258,7 +386,8 @@ local function on_train_leaves_station(map_data, train)
|
||||
end
|
||||
end
|
||||
station.deliveries_total = station.deliveries_total - 1
|
||||
--TODO: change circuit outputs
|
||||
--change circuit outputs
|
||||
station.entity_out.get_control_behavior().parameters = nil
|
||||
elseif train.status == STATUS_R then
|
||||
train.status = STATUS_R_TO_D
|
||||
local station = map_data.stations[train.r_station_id]
|
||||
@@ -269,7 +398,8 @@ local function on_train_leaves_station(map_data, train)
|
||||
end
|
||||
end
|
||||
station.deliveries_total = station.deliveries_total - 1
|
||||
--TODO: change circuit outputs
|
||||
--change circuit outputs
|
||||
station.entity_out.get_control_behavior().parameters = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -301,8 +431,10 @@ local function on_train_modified(map_data, pre_train_id, train_entity)
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
local function on_tick(event)
|
||||
tick(global.stations, global.trains_available, global.total_ticks)
|
||||
tick(global, mod_settings)
|
||||
global.total_ticks = global.total_ticks + 1
|
||||
end
|
||||
|
||||
@@ -313,6 +445,9 @@ local function on_built(event)
|
||||
on_station_built(global, entity)
|
||||
elseif entity.type == "inserter" then
|
||||
elseif entity.type == "pump" then
|
||||
if entity.pump_rail_target then
|
||||
|
||||
end
|
||||
end
|
||||
end
|
||||
local function on_broken(event)
|
||||
@@ -371,6 +506,12 @@ local function on_surface_removed(event)
|
||||
end
|
||||
end
|
||||
|
||||
local function on_rename(event)
|
||||
if event.entity.name == BUFFER_STATION_NAME then
|
||||
on_station_rename(global, event.entity)
|
||||
end
|
||||
end
|
||||
|
||||
local filter_built = {
|
||||
{filter = "type", type = "train-stop"},
|
||||
{filter = "type", type = "inserter"},
|
||||
@@ -383,6 +524,7 @@ local filter_broken = {
|
||||
{filter = "rolling-stock"},
|
||||
}
|
||||
local function register_events()
|
||||
--NOTE: I have no idea if this correctly registers all events once in all situations
|
||||
script.on_event(defines.events.on_built_entity, on_built, filter_built)
|
||||
script.on_event(defines.events.on_robot_built_entity, on_built, filter_built)
|
||||
script.on_event({defines.events.script_raised_built, defines.events.script_raised_revive, defines.events.on_entity_cloned}, on_built)
|
||||
@@ -394,11 +536,14 @@ local function register_events()
|
||||
|
||||
script.on_event({defines.events.on_pre_surface_deleted, defines.events.on_pre_surface_cleared}, on_surface_removed)
|
||||
|
||||
-- script.on_nth_tick(nil)
|
||||
script.on_nth_tick(controller_nth_tick, on_tick)
|
||||
local nth_tick = math.ceil(60/mod_settings.tps);
|
||||
script.on_nth_tick(nil)
|
||||
script.on_nth_tick(nth_tick, on_tick)
|
||||
|
||||
script.on_event(defines.events.on_train_created, on_train_built)
|
||||
script.on_event(defines.events.on_train_changed_state, on_train_changed)
|
||||
|
||||
script.on_event(defines.events.on_entity_renamed, on_rename)
|
||||
end
|
||||
|
||||
script.on_load(function()
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
--By cybersyn
|
||||
data:extend({
|
||||
{
|
||||
type = "int-setting",
|
||||
name = "cybersyn-ticks-per-second",
|
||||
order = "aa",
|
||||
setting_type = "runtime-global",
|
||||
default_value = 10,
|
||||
minimum_value = 1,
|
||||
maximum_value = 60,
|
||||
},
|
||||
{
|
||||
type = "int-setting",
|
||||
name = "cybersyn-requester-threshold",
|
||||
order = "ab",
|
||||
setting_type = "runtime-global",
|
||||
default_value = 1000000000,
|
||||
minimum_value = 1,
|
||||
maximum_value = 2147483647,
|
||||
},
|
||||
{
|
||||
type = "int-setting",
|
||||
name = "cybersyn-provider-threshold",
|
||||
order = "ac",
|
||||
setting_type = "runtime-global",
|
||||
default_value = 1000000000,
|
||||
minimum_value = 1,
|
||||
maximum_value = 2147483647,
|
||||
},
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user