diff options
author | Singularis <singularis@volny.cz> | 2025-03-22 16:35:18 +0100 |
---|---|---|
committer | orwell <orwell@bleipb.de> | 2025-05-27 20:22:01 +0200 |
commit | 0d641f4b3b1b0208a6f127d6ad8dc552da0ea699 (patch) | |
tree | aae47c12140dd09082fed37dbc2893fe12f28f34 /advtrains_line_automation/line_functions.lua | |
parent | 4f2bb527d47524fc39460b8a8ce8457af5adc1e7 (diff) | |
download | advtrains-0d641f4b3b1b0208a6f127d6ad8dc552da0ea699.tar.gz advtrains-0d641f4b3b1b0208a6f127d6ad8dc552da0ea699.tar.bz2 advtrains-0d641f4b3b1b0208a6f127d6ad8dc552da0ea699.zip |
[advtrains_line_automation,ch_overrides_gplv3] implementován jízdní řád (ve dvou variantách)
Diffstat (limited to 'advtrains_line_automation/line_functions.lua')
-rw-r--r-- | advtrains_line_automation/line_functions.lua | 141 |
1 files changed, 139 insertions, 2 deletions
diff --git a/advtrains_line_automation/line_functions.lua b/advtrains_line_automation/line_functions.lua index 41776c3..43bde50 100644 --- a/advtrains_line_automation/line_functions.lua +++ b/advtrains_line_automation/line_functions.lua @@ -502,6 +502,18 @@ function al.get_delay_description(line_status, linevar_def, rwtime) end end +-- Test na módy MODE_FINAL* +function al.is_final_mode(stop_mode) + return stop_mode ~= nil and simple_modes[stop_mode] == MODE_FINAL +end +local is_final_mode = al.is_final_mode + +-- Test na skrytou zastávku. Vrací true, pokud zadaný mód neodpovídá skryté zastávce. +function al.is_visible_mode(stop_mode) + return stop_mode == nil or (stop_mode ~= MODE_HIDDEN and stop_mode ~= MODE_FINAL_HIDDEN) +end +local is_visible_mode = al.is_visible_mode + -- Pokud zadaná varianta linky existuje, vrátí: -- linevar_def, linevar_station -- Jinak vrací: @@ -1027,9 +1039,16 @@ end --[[ Zadaný vlak musí být linkový. - Vrací: + Parametry: + line_status = table, + linevar_def = table, + rwtime = int, + allow_continue = bool, + Vrací *pole* následujících záznamů: { - stn = string, track = string, delay = int, + stn = string, + track = string, + delay = int, stdata = table or nil, dep = int or nil, dep_linevar_def = table or nil, dep_index = int or nil, arr = int or nil, arr_linevar_def = table or nil, arr_index = int or nil, @@ -1114,6 +1133,124 @@ function al.predict_train(line_status, linevar_def, rwtime, allow_continue) return result end +--[[ + Parametry: + linevar_def = table, -- definice linevar, z něhož se má analýza provádět + linevar_index = int, + rwtime = int or nil, -- (aktuální žel. čas; nepovinné) + trains = {train_table...} or nil, -- je-li zadáno, bude zkoumat pouze vlaky v tomto seznamu + Vrací *pole* záznamů (stejných jako al.predict_train) vztahujících se k odjezdu + z požadované zastávky, seřazené od nejbližšího odjezdu po nejvzdálenější. +]] +function al.predict_station_departures(linevar_def, linevar_index, rwtime, trains) + assert(linevar_def) + assert(linevar_index) + local linevar = linevar_def.name + local stop = assert(linevar_def.stops[linevar_index]) + if trains == nil then + trains = al.get_trains_by_linevar()[linevar] or {} + end + if rwtime == nil then + rwtime = rwt.to_secs(rwt.get_time()) + end + local result = {} + for _, train in ipairs(trains) do + local ls, lvdef = al.get_line_status(train) + if ls.linevar == linevar and ls.linevar_index <= linevar_index then + local prediction = al.predict_train(ls, linevar_def, rwtime, true) + for _, pr in ipairs(prediction) do + if + pr.dep ~= nil and pr.dep_linevar_def ~= nil and pr.dep_index ~= nil and + pr.dep_linevar_def.name == linevar and + pr.dep_index == linevar_index and + pr.dep > rwtime + then + table.insert(result, pr) + break + end + end + end + end + table.sort(result, function(a, b) return a.dep < b.dep end) + return result +end + +--[[ + => {{ + linevar = string, + indices = {int,...}, + linevar_def = linevar_def, + }...} +]] +function al.get_linevars_by_station(stn, track, options) + if options == nil then + options = {} + end + local include_hidden_stops = options.include_hidden_stops + local ignore_first_stop = options.ignore_first_stop + local ignore_last_stop = options.ignore_last_stop + local result = {} + assert(stn) + for lvstn, stdata in pairs(advtrains.lines.stations) do + if stdata.linevars ~= nil then + for linevar, linevar_def in pairs(stdata.linevars) do + local first_stop_index = al.get_first_stop(linevar_def, include_hidden_stops) + local last_stop_index = al.get_last_stop(linevar_def, include_hidden_stops) + if not (ignore_first_stop or ignore_last_stop) or (first_stop_index ~= nil and last_stop_index ~= nil) then + for i, stop in ipairs(linevar_def.stops) do + if + stop.stn == stn and + (track == nil or tostring(stop.track) == track) and + (include_hidden_stops or is_visible_mode(stop.mode)) and + ((not ignore_first_stop) or i ~= 1) and + ((not ignore_last_stop) or (not is_final_mode(stop.mode))) + then + if ld == nil then + ld = {linevar = linevar, linevar_def = linevar_def, indices = {i}} + table.insert(result, ld) + else + table.insert(ld.indices, i) + end + end + end + end + end + end + end + if #result > 1 then + table.sort(result, function(a, b) return a.linevar < b.linevar end) + end + return result +end + +--[[ + => { + [linevar] = {train...}, -- generuje jen neprázdné seznamy + } +]] +function al.get_trains_by_linevar() + local result = {} + for train_id, train in pairs(advtrains.trains) do + local ls, linevar_def = al.get_line_status(train) + if linevar_def ~= nil then + local linevar = linevar_def.name + local list = result[linevar] + if list ~= nil then + table.insert(list, train) + else + list = {train} + result[linevar] = list + end + end + end + for linevar, list in pairs(result) do + if list[2] ~= nil then + table.sort(list, function(a, b) return a.id < b.id end) + end + end + return result +end + local function vlaky(param, past_trains_too) local result = {} if param:match("/") then |