-- ars.lua-- automatic routesetting--[[ The "ARS table" and its effects: Every route has (or can have) an associated ARS table: ars = { [n] = { ln = "<line>" -- either line rc = "<routingcode>" -- or routingcode tl = {min=1, max=2} -- or train length in meters n = true/false -- true = logical not (matches everything that does not have this line/rc) conj = { -- and conjunction, optional. This must be true in addition to the main rule ln=... / rc=... / n=... -- like toplevel conj=... -- can be nested -- note that conj cannot have prio, in inherits the prio from main rule } prio = <num> -- optional, a priority number. If set, enables "multi-ARS" where train can wait for multiple routes at once -- or c="<a comment>" } default = true -- Route is the default route for trains default_prio -- optional, priority for multi-ars with default route default_conj = {...} -- optional, conditions (conjunction) that need to be fulfilled for this to be considered default route } In case a train matches the ARS rules of multiple routes, precedence is as follows: 1. train matches rules without priority in one or more routes -> first matching route is unconditionally set 2. train matches rules with priority in one or more routes -> all of the matching routes are set (multi-ars) in the order given by priority, first available route is set 3. route is default=true, default_prio=nil and train matches default_conj (if present) -> first default route is set 4. one or more routes are default=true, with default_prio set,and train matches default_conj (if present) -> all of the matching routes are set (multi-ars) in the order given by priority, first available route is set For editing, those tables are transformed into lines in a text area: {ln=...} -> LN ... {rc=...} -> RC ... {c=...} -> #... {default=true} -> * n -> ! (e.g. ln=..., n=true -> !LN ...) prio -> <num> (e.g. ln=..., prio=1 -> 1 LN ...) conj -> goes on the next line, with an & prepended, e.g.: {ln="S1", conj={rc="Left"}} -> LN S1 & RC Left Example combining everything: ars = { [1] = { ln = "S1" n = true prio = 4 conj = { rc = "R4" } } default = true default_prio = 2 default_conj = { rc = "R5" n = true } } -> 4 !LN S1 & RC R4 2 * & !RC R5]]local il = advtrains.interlocking
local functionparse_trainlen(tlstr)
mins, maxs =string.match(tlstr,"^(%d*)%-(%d+)$")if mins and maxs thenreturn{min=tonumber(mins),max=tonumber(maxs)}endreturn{min=tonumber(tlstr)}-- if it's not parseable at all it will return an empty table which means invalidendlocal functiontrainlen_to_str(tl)if tl.minand tl.maxthenreturn tl.min.."-"..tl.maxelseif tl.minthenreturn tl.minelseif tl.maxthenreturn"0-"..tl.maxelsereturn"?"endendlocal functionconj_to_text(conj, txt)