aboutsummaryrefslogtreecommitdiff
path: root/advtrains/trainhud.lua
Commit message (Expand)AuthorAge
* Make "Line" property accessible from OBC and gettable via LATC, change subway...orwell962018-11-20
* Prevent any user control except "Brake" when an ATC override is presentorwell962018-10-17
* Improve ATC-LZB-User control interaction, smoothen LZB control operationsorwell962018-10-17
* Properly handle speed restrictionsorwell962018-10-10
* Remote Routesetting from Onboard Computerorwell962018-10-10
* Add signal safety control override, restructure control systemorwell962018-10-10
* Fix path_dir to actually be an angle, path item deletion and orientation of w...orwell962018-06-14
* Bugfixes part 1orwell962018-06-14
* Occupation System, new train steps, still incompleteorwell962018-06-14
* Change controls for trains (again)orwell962018-01-07
* Merge remote-tracking branch 'lemon-melon-repo/master'orwell962017-10-11
|\
* | Remove zip release files, move mod to root, exclude assets from Makefile (#92)rubenwardy2017-09-20
|/
* Restructure mod directoryorwell962017-01-04
* Add Automatic Train Control systemorwell962017-01-04
* remove train type concept and calculate train's capabilities based on used wa...orwell962016-12-22
* Turning mod into a modpack and separating the trains from the core modorwell962016-12-20
routingcode matchers (or comments, those are ignored) The first matching rule determines the route to set. - or - ars = {default = true} this means that all trains that no other rule matches on should use this route Compound ("and") conjunctions are not supported (--TODO should they?) For editing, those tables are transformed into lines in a text area: {ln=...} -> LN ... {rc=...} -> RC ... {c=...} -> #... {default=true} -> * See also route_ui.lua ]] local il = advtrains.interlocking -- The ARS data are saved in a table format, but are entered in text format. Utility functions to transform between both. function il.ars_to_text(arstab) if not arstab then return "" end local txt = {} for i, arsent in ipairs(arstab) do local n = "" if arsent.n then n = "!" end if arsent.ln then txt[#txt+1] = n.."LN "..arsent.ln elseif arsent.rc then txt[#txt+1] = n.."RC "..arsent.rc elseif arsent.c then txt[#txt+1] = "#"..arsent.c end end if arstab.default then return "*\n" .. table.concat(txt, "\n") end return table.concat(txt, "\n") end function il.text_to_ars(t) if t=="" then return nil elseif t=="*" then return {default=true} end local arstab = {} for line in string.gmatch(t, "[^\r\n]+") do if line=="*" then arstab.default = true else local c, v = string.match(line, "^(...?)%s(.*)$") if c and v then local n = nil if string.sub(c,1,1) == "!" then n = true c = string.sub(c,2) end local tt=string.upper(c) if tt=="LN" then arstab[#arstab+1] = {ln=v, n=n} elseif tt=="RC" then arstab[#arstab+1] = {rc=v, n=n} end else local ct = string.match(line, "^#(.*)$") if ct then arstab[#arstab+1] = {c = ct} end end end end return arstab end local function find_rtematch(routes, train) local default for rteid, route in ipairs(routes) do if route.ars then if route.ars.default then default = rteid else if il.ars_check_rule_match(route.ars, train) then return rteid end end end end return default end -- Checks whether ARS rule explicitly matches. This does not take into account the "default" field, since a wider context is required for this. -- Returns the rule number that matched, or nil if nothing matched function il.ars_check_rule_match(ars, train) if not ars then return nil end local line = train.line local routingcode = train.routingcode for arskey, arsent in ipairs(ars) do --atdebug(arsent, line, routingcode) if arsent.n then -- rule is inverse... if arsent.ln and (not line or arsent.ln ~= line) then return arskey elseif arsent.rc and (not routingcode or not string.find(" "..routingcode.." ", " "..arsent.rc.." ", nil, true)) then return arskey end return nil end if arsent.ln and line and arsent.ln == line then return arskey elseif arsent.rc and routingcode and string.find(" "..routingcode.." ", " "..arsent.rc.." ", nil, true) then return arskey end end return nil end function advtrains.interlocking.ars_check(sigd, train) local tcbs = il.db.get_tcbs(sigd) if not tcbs or not tcbs.routes then return end if tcbs.ars_disabled then -- No-ARS mode of signal. -- ignore... return end if tcbs.routeset then -- ARS is not in effect when a route is already set -- just "punch" routesetting, just in case callback got lost. minetest.after(0, il.route.update_route, sigd, tcbs, nil, nil) return end local rteid = find_rtematch(tcbs.routes, train) if rteid then --delay routesetting, it should not occur inside train step -- using after here is OK because that gets called on every path recalculation minetest.after(0, il.route.update_route, sigd, tcbs, rteid, nil) end end