60 lines
2.8 KiB
Plaintext
60 lines
2.8 KiB
Plaintext
-- PROTOTYPE: throwaway, lives only on branch prototype/vehicle-probe.
|
|
-- Every INTERVAL it logs every player-owned road vehicle (segment, lane, position, speed).
|
|
-- All experiments (timeToIgnore, jump, set-line, segment rebuild, GUI position flip) are in git history and
|
|
-- docs/research/vehicle-probe.md; none moved a vehicle past another on a single-lane road.
|
|
-- ponytail: module-local timer, not GameScriptState; fine for a probe (state resets between calls anyway).
|
|
|
|
local TAG = "[overtake_probe] "
|
|
local INTERVAL = 2.0
|
|
local elapsed = 0.0
|
|
local ticks = 0
|
|
|
|
local function p(s : string)
|
|
print(TAG .. s)
|
|
end
|
|
|
|
local function edgeAt(mp : Engine.Component.MovePath) : EdgeId, boolean
|
|
-- path.edges is 1-based, elements are EdgeIdDir userdata (tealdef says {EdgeId, boolean})
|
|
local e = (mp.path.edges as {any})[mp.dyn.pathPos.edgeIndex + 1] as UtilPathfinding.EdgeIdDir
|
|
if e == nil then return nil, nil end
|
|
return e.edgeId, e.dir
|
|
end
|
|
|
|
local function turnaround(edge : EdgeId) : integer
|
|
local tn = api.engine.getComponent(edge.entity, api.type.ComponentType.TRANSPORT_NETWORK) as Engine.Component.TransportNetwork
|
|
if tn == nil or tn.turnaroundEdges == nil then return nil end
|
|
return tn.turnaroundEdges[edge.index + 1]
|
|
end
|
|
|
|
local function dump(dt : number)
|
|
local player = api.engine.util.getPlayer()
|
|
local vehicles = api.engine.getEntitiesWithComponent(api.type.ComponentType.TRANSPORT_VEHICLE, { requireOwnedByPlayer = player })
|
|
p(string.format("tick=%d dt=%s playerVehicles=%d", ticks, tostring(dt), #vehicles))
|
|
for _, v in ipairs(vehicles) do
|
|
local lv = api.engine.getComponent(v, api.type.ComponentType.LAND_VEHICLE) as Engine.Component.LandVehicle
|
|
local mp = api.engine.getComponent(v, api.type.ComponentType.MOVE_PATH) as Engine.Component.MovePath
|
|
local tv = api.engine.getComponent(v, api.type.ComponentType.TRANSPORT_VEHICLE) as Engine.Component.TransportVehicle
|
|
if lv ~= nil and not lv.isTram and mp ~= nil then
|
|
local edge, dir = edgeAt(mp)
|
|
p(string.format(
|
|
"veh=%d seg=%d lane=%s dir=%s turnaround=%s edgeIndex=%d/%d pos=%.1f speed=%.2f state=%s tvState=%s line=%s standing=%.1f",
|
|
v, edge and edge.entity or -1, tostring(edge and edge.index), tostring(dir), tostring(edge and turnaround(edge)),
|
|
mp.dyn.pathPos.edgeIndex, #(mp.path.edges as {any}), mp.dyn.pathPos.pos, mp.dyn.speed, tostring(mp.state),
|
|
tostring(tv and tv.state), tostring(tv and tv.line), mp.dyn.timeStanding))
|
|
end
|
|
end
|
|
end
|
|
|
|
local ret : GameScript<table> = {
|
|
update = function(_userParams : table, _state : GameScriptState<table>, dt : number) : nil
|
|
ticks = ticks + 1
|
|
elapsed = elapsed + dt
|
|
if ticks == 1 then p("update running, first dt=" .. tostring(dt)) end
|
|
if elapsed < INTERVAL then return end
|
|
elapsed = 0.0
|
|
xpcall(dump, function(err : any) p("ERROR " .. tostring(err)) end, dt)
|
|
end,
|
|
}
|
|
|
|
return ret
|