Page 1 of 1
API hooks into train pathfinding
Posted: Thu Jan 30, 2020 9:40 am
by Joriom
TL;DR
Way for modders to inject their pieces of code into train pathfinder or into the way train pathfinder graph is being built.
What ?
Most important case for me in this regard is adding ability for modders to convince pathfinding algorythm that two pieces of rail not connected physically are actually connected in some third party way - for example a teleport by an entity overseeing that piece of rail.
Why ?
There is already mod (although looks abbandoned) called Train Tunnels which works on basis of additional ("underground") game layer and "Tunel Entrances/Exits" (further called Interfaces) that teleport pieces of train between layers. I believe this mod is not without its flaws but with some improvements has potential to be great and fulfill dreams of many Factorio players about tunnels/viaducts. One of annoyances is inability of pahtfinder to actually consider those tunnels on its own. Currtnely, the Tunnel Interfaces are implemented as train stations that have to be added to train shedule without wait condition. Train reaches the Tunnel Interface and seeing lack of further tracks slows down but is still teleported to another surface. If modders would be a ble to convince pathfinder graph that end pieces of rail on two different layers are actually connected, it would be possible to make trains cross those tunnels without making a wierd trainstation workaround and would also allow trains to dynamically choose any tunnel, not just he one hardcoded in train shedule.
Video example
3:00 - 3:20 : working train tunnel (manual mode)
3:20 - 4:10 : explanation of automatic mode trainstation workaround for tunnels + display of working underground tunnel in automated mode
https://youtu.be/yVZi97ZCw4M?t=180
Re: API hools into train pathfinding
Posted: Thu Jan 30, 2020 9:51 am
by boskid
It is not going to be implemented, ever.
1/ Adding extra hooks to pathfinder would reduce performance a lot.
2/ Train pathfinder is limited to single surface.
3/ Nodes and edges are implicit by all entities placed on world, there is no simple way to attach here. It would require some rails to be marked as special and then it would complicate pathfinder logic a lot.
4/ Trains can not travel cross-surface
5/ Weird placement of nodes cross surface would violate distance heuristic and longer paths could be taken.
Re: API hools into train pathfinding
Posted: Thu Jan 30, 2020 9:54 am
by Joriom
boskid wrote: Thu Jan 30, 2020 9:51 am
It is not going to be implemented, ever.
4/ Trains can not travel cross-surface
I already see thats not true as per working mod Train Tunnels (also presented in a video I've attached).
https://mods.factorio.com/mod/traintunnels
This idea was already working, just needs some polishing.
Re: API hooks into train pathfinding
Posted: Thu Jan 30, 2020 9:58 am
by boskid
Quick look into code of linked mod. teleport.lua:
Code: Select all
local function teleportCarriage(trainToObserve, carriageIndex, sourceStop, targetStop, distance)
local carriage = trainToObserve.carriages[tonumber(carriageIndex)]
-- ...
local entity = game.surfaces[targetStop.surface.index].create_entity{
name = data.name,
force = game.forces.player,
snap_to_train_stop = false,
position = {x=(sp.x + ox), y=sp.y + oy},
direction = (targetStop.direction + data.is_flipped * 4) % 8
}
-- ...
if entity ~= nil then
-- game.print(entity.unit_number .. " - really am: " .. (entity.position.x) .. " direction: " .. entity.orientation)
-- entity.connect_rolling_stock(defines.rail_direction.front)
-- entity.connect_rolling_stock(defines.rail_direction.back)
if data.driver ~= nil then
local driver = carriage.get_driver().player.index;
if entity.surface.index ~= data.driver.surface.index then
game.players[driver].teleport(game.players[driver].position, entity.surface.index)
end
entity.set_driver(game.players[driver])
end
if data.color then
entity.color = data.color
end
if data.health then
entity.health = data.health
end
for inventory_id, inventory_data in pairs(data.inventories) do
deserialize_inventory(entity.get_inventory(inventory_id), inventory_data)
end
if data.fluids then
local fluidbox = entity.fluidbox
for i = 1, #data.fluids do
fluidbox[i] = data.fluids[i]
end
end
if data.energy > 0 then
entity.energy = data.energy
if entity.burner then
entity.burner.currently_burning = data.currently_burning
entity.burner.remaining_burning_fuel = data.remaining_burning_fuel
end
end
entity.train.schedule = trainToObserve.schedule
local train = carriage.train
local trainId = carriage.train.id
carriage.destroy()
script.raise_event(defines.events.script_raised_destroy, {train=train, trainId=trainId})
--trainToObserve.carriages[tonumber(carriageIndex)] = entity
else
-- game.print("cant teleport")
return false
end
return entity
end
They do not teleport. They are destroyed on old surface and created on new surface. This is illusion and you were fooled by it
Re: API hooks into train pathfinding
Posted: Thu Jan 30, 2020 10:09 am
by Joriom
boskid wrote: Thu Jan 30, 2020 9:58 am
They do not teleport. They are destroyed on old surface and created on new surface. This is illusion and you were fooled by it
What is teleportation if not desintegration and rebuilding exact copy at other location in real time? (thats why I would never want to be teleported in real life as its basically murder + clone)
Computer science is all about those "illusions". You're seeing numbers on your screen represented by colorfull lights and you are fooled you see a living world in front of your face. I find your argument invalid ab initio.
I actually don't mind if object is being destroyed and recreated, teleported, shifted to the dark realm where it fights for right to live and then moved back to different place in game... as long as it achieves certain objective of fooling the game that there is a train tunnel happening. Thats why in my suggestion I'm talking about "convincing" pathfinder (aka. cheating it) to think something is possible.
Re: API hooks into train pathfinding
Posted: Thu Jan 30, 2020 10:15 am
by boskid
Joriom wrote: Thu Jan 30, 2020 10:09 am
What is teleportation if not desintegration and rebuilding exact copy at other location in real time? (thats why I would never want to be teleported in real life as its basically murder + clone)
Computer science is all about those "illusions". You're seeing numbers on your screen represented by colorfull lights and you are fooled you see a living world in front of your face. I find your argument invalid ab initio.
I actually don't mind if object is being destroyed and recreated, teleported, shifted to the dark realm where it fights for right to live and then moved back to different place in game... as long as it achieves certain objective of fooling the game that there is a train tunnel happening. Thats why in my suggestion I'm talking about "convincing" pathfinder (aka. cheating it) to think something is possible.
teleport would preserve entityId, trainId, targeters and some other things. clone+destroy does not do that.
There is no really good reason for us to implement cross surface train pathfinding. It is a lot of complications everywhere and rewriting half of trains code base only to consider trains could change surface during its movement. It is not going to be implemented.