Skip to content

Commit 019469e

Browse files
committed
add virtual train signals and support for it in the dispatcher
1 parent 4ff9d0c commit 019469e

File tree

10 files changed

+411
-36
lines changed

10 files changed

+411
-36
lines changed

data-final-fixes.lua

Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,138 @@
77
local flib = require('__flib__.data-util')
88

99
local icon_encoded_position = { { icon = "__LogisticTrainNetwork__/graphics/icons/encoded-position.png", icon_size = 64, tint = {r=1, g=1, b=1, a=1} } }
10+
local icon_empty = { { icon = "__core__/graphics/empty.png", icon_size = 1, tint = {r=1, g=1, b=1, a=1} } }
11+
local proto_empty = { icons = icon_empty }
12+
13+
local function is_hidden(proto)
14+
if proto.flags then
15+
for _,flag in pairs(proto.flags) do
16+
if (flag == "hidden") then
17+
return true
18+
end
19+
end
20+
end
21+
return false
22+
end
23+
24+
local function scaled_icon(icon, second)
25+
local size = icon.icon_size or 32
26+
local shift = icon.shift or {x = 0, y = 0}
27+
-- empty icon scales things up 32 times bigger and we want half size
28+
local scale = (icon.scale or 32 / size) / 64
29+
local dx
30+
if second then
31+
dx = 0.25
32+
else
33+
dx = -0.25
34+
end
35+
return {
36+
icon = icon.icon,
37+
icon_size = size,
38+
icon_mipmaps = icon.icon_mipmaps or 0,
39+
tint = icon.tint,
40+
scale = scale,
41+
-- empty icon scales things up 32 times bigger and we want half size
42+
shift = {
43+
x = shift.x / 64 + dx,
44+
y = shift.y / 64,
45+
},
46+
}
47+
end
48+
49+
local function scale_icons(icons, proto, second)
50+
if proto.icon then
51+
local icon = {
52+
icon = proto.icon,
53+
icon_size = proto.icon_size,
54+
icon_mipmaps = proto.icon_mipmaps,
55+
tint = {r=1, g=1, b=1, a=1}
56+
}
57+
icons[#icons+1] = scaled_icon(icon, second)
58+
elseif proto.icons then
59+
for _, v in pairs(proto.icons) do
60+
icons[#icons+1] = scaled_icon(v, second)
61+
end
62+
end
63+
end
64+
65+
local function train_signal(loco, wagon, order, suffix)
66+
local wagoncount = 0
67+
if not is_hidden(wagon) then
68+
wagoncount = wagoncount + 1
69+
-- scale icons
70+
local icons = {}
71+
scale_icons(icons, loco, false)
72+
scale_icons(icons, wagon, true)
73+
-- create signal
74+
local localised_name
75+
local loco_name = loco.localized_name or loco.name
76+
local wagon_name = wagon.localized_name or wagon.name
77+
78+
if loco.type == "virtual-signal" then
79+
if wagon.type == "virtual-signal" then
80+
localised_name = {"virtual-signal-name.ltn-train-any-any", suffix}
81+
else
82+
localised_name = {"virtual-signal-name.ltn-train-any", wagon_name}
83+
end
84+
else
85+
if wagon.type == "virtual-signal" then
86+
localised_name = {"virtual-signal-name.ltn-train-any", loco_name}
87+
else
88+
localised_name = {"virtual-signal-name.ltn-train", loco_name, wagon_name}
89+
end
90+
end
91+
92+
local signal = {
93+
type = "virtual-signal",
94+
name = "ltn-train-"..suffix.."-"..loco.name.."-"..wagon.name,
95+
icons = flib.create_icons(proto_empty, icons) or empty_icon,
96+
icon_size = nil,
97+
subgroup = "ltn-train-signal-"..suffix,
98+
order = order,
99+
localised_name = localised_name,
100+
}
101+
data:extend({signal})
102+
end
103+
end
104+
105+
local function train_signals(loco, lococount)
106+
if not is_hidden(loco) then
107+
-- add cargo wagons to train
108+
local wagoncount = 0
109+
for _, wagon in pairs(data.raw["cargo-wagon"]) do
110+
wagoncount = wagoncount + 1
111+
local order = "a-cargo-"..string.format("%02d", lococount)..string.format("%02d", wagoncount)
112+
train_signal(loco, wagon, order, "cargo")
113+
end
114+
if wagoncount > 1 then
115+
local order = "a-cargo-"..string.format("%02d", lococount).."00"
116+
train_signal(loco, data.raw["virtual-signal"]["ltn-position-any-cargo-wagon"], oder, "cargo")
117+
end
118+
-- add fluid wagons to train
119+
wagoncount = 0
120+
for _, wagon in pairs(data.raw["fluid-wagon"]) do
121+
wagoncount = wagoncount + 1
122+
local order = "a-fluid-"..string.format("%02d", lococount)..string.format("%02d", wagoncount)
123+
train_signal(loco, wagon, order, "fluid")
124+
end
125+
if wagoncount > 1 then
126+
local order = "a-cargo-"..string.format("%02d", lococount).."00"
127+
train_signal(loco, data.raw["virtual-signal"]["ltn-position-any-fluid-wagon"], order, "fluid")
128+
end
129+
-- add fluid wagons to train
130+
wagoncount = 0
131+
for _, wagon in pairs(data.raw["artillery-wagon"]) do
132+
wagoncount = wagoncount + 1
133+
local order = "a-artillery-"..string.format("%02d", lococount)..string.format("%02d", wagoncount)
134+
train_signal(loco, wagon, order, "artillery")
135+
end
136+
if wagoncount > 1 then
137+
local order = "a-artillery-"..string.format("%02d", lococount).."00"
138+
train_signal(loco, data.raw["virtual-signal"]["ltn-position-any-artillery-wagon"], order, "artillery")
139+
end
140+
end
141+
end
10142

11143
local lococount = 0
12144
for _, loco in pairs(data.raw["locomotive"]) do
@@ -21,6 +153,10 @@ for _, loco in pairs(data.raw["locomotive"]) do
21153
localised_name = {"virtual-signal-name.ltn-position", loco.localised_name or {"entity-name." .. loco.name}}
22154
}
23155
data:extend({signal})
156+
train_signals(loco, lococount)
157+
end
158+
if lococount > 1 then
159+
train_signals(data.raw["virtual-signal"]["ltn-position-any-locomotive"], 0)
24160
end
25161

26162
local wagoncount = 0
@@ -87,3 +223,5 @@ end
87223
data.raw["constant-combinator"]["logistic-train-stop-output"].item_slot_count = 4 + lococount + wagoncount + wagoncount_fluid + wagoncount_artillery + itemcount + fluidcount
88224
log("[LTN] found "..tostring(itemcount).." items, "..tostring(fluidcount).." fluids, "..tostring(lococount).." locomotives, "..tostring(wagoncount + wagoncount_fluid + wagoncount_artillery).." wagons")
89225

226+
for _, loco in pairs(data.raw["locomotive"]) do
227+
end

locale/en/base.cfg

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,9 @@ ltn-provider-stack-threshold=Provide Stack Threshold
4949
ltn-provider-priority=Provide Priority
5050
ltn-locked-slots=Locked Slots per Wagon
5151
ltn-disable-warnings=Disable Warning Messages
52+
ltn-train=Train with __1__ and __2__
53+
ltn-train-any=Any train with __1__
54+
ltn-train-any-any=Any __1__ train
5255

5356
[ltn-message]
5457
error-duplicated-unit-number=[LTN] Error: Duplicated unit_number __1__.
@@ -64,6 +67,7 @@ warning-dispatcher-disabled=[LTN] Warning: Dispatcher disabled. No deliveries wi
6467
6568
empty-depot-item=[LTN] No train to transport items found in depots. Skipping item processing.
6669
empty-depot-fluid=[LTN] No train to transport fluids found in depots. Skipping fluid processing.
70+
empty-depot-artillery=[LTN] No artillery train found in depots. Skipping artillery processing.
6771
no-provider-found=[LTN] Requester __1__: No station supplying __2__ found in networks __3__.
6872
provider-found=[LTN] Provider __1__: priority: __2__, deliveries: __3__, available: __4__ __5__.
6973
no-train-found=[LTN] No train to transport from __1__ to __2__ in networks __3__ with length between __4__ and __5__ found in Depot.

prototypes/signals.lua

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,24 @@ data:extend({
148148
group = "signals",
149149
order = "ltn4[ltn-position-signal-artillery-wagon]"
150150
},
151+
{
152+
type = "item-subgroup",
153+
name = "ltn-train-signal-cargo",
154+
group = "signals",
155+
order = "ltn4[ltn-train-signal-cargo]"
156+
},
157+
{
158+
type = "item-subgroup",
159+
name = "ltn-train-signal-fluid",
160+
group = "signals",
161+
order = "ltn4[ltn-train-signal-fluid]"
162+
},
163+
{
164+
type = "item-subgroup",
165+
name = "ltn-train-signal-artillery",
166+
group = "signals",
167+
order = "ltn4[ltn-train-signal-artillery]"
168+
},
151169
{
152170
type = "virtual-signal",
153171
name = "ltn-position-any-locomotive",

script/constants.lua

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,4 +72,9 @@ match_string = "([^,]+),([^,]+)"
7272
btest = bit32.btest
7373
band = bit32.band
7474
ceil = math.ceil
75-
sort = table.sort
75+
sort = table.sort
76+
77+
-- train signals types
78+
TRAIN_CARGO = "ltn-train-cargo"
79+
TRAIN_FLUID = "ltn-train-fluid"
80+
TRAIN_ARTILLERY = "ltn-train-artillery"

0 commit comments

Comments
 (0)