1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
S.lines = {
S23 = {
termini = {
N = "Arc",
S = "Rew"
},
stations = {
Rew = {
name = "Redwood",
doors = "L",
next_station = {
N = "Thc",
S = false
},
},
Thc = {
name = "Tanh Cliffs",
doors = "L",
next_station = {
N = "Noi",
S = "Rew"
},
},
Noi = {
name = "No Idea",
doors = "L",
next_station = {
N = "Lzf",
S = "Thc"
},
},
Lzf = {
name = "Laza's Field",
doors = "L",
next_station = {
N = "Bbh",
S = "Noi"
},
},
Bbh = {
name = "Bamboo Hills",
doors = "L",
next_station = {
N = "Arc",
S = "Lzf"
},
},
Arc = {
name = "Arcadius",
doors = "L",
next_station = {
N = false,
S = "Bbh"
},
}
},
monitoring = {
N = {},
S = {}
}
},
U21 = {
termini = {
E = "Tro",
W = "Dbl"
},
stations = {
Dbl = {
name = "Dubulti",
doors = "R",
next_station = {
E = "Pav",
W = "Ghd"
}
},
Pav = {
name = "Pence Avenue",
doors = "L",
next_station = {
E = "Ghd",
W = "Dbl"
}
},
Ghd = {
name = "Greenhat Mountain",
doors = "L",
next_station = {
E = "Acm",
W = "Dbl"
}
},
Acm = {
name = "Acacia Mountains",
doors = "L",
next_station = {
E = "Ghb",
W = "Ghd"
}
},
Ghb = {
name = "Green Hill Beach",
doors = "L",
next_station = {
E = "Ged",
W = "Acm"
}
},
Ged = {
name = "Green Edge",
doors = "L",
next_station = {
E = "Dri",
W = "Ghb"
}
},
Dri = {
name = "Dry Island",
doors = "L",
next_station = {
E = "Gcl",
W = "Ged"
}
},
Gcl = {
name = "Green Cliffs",
doors = "R",
next_station = {
E ="Sfs",
W = "Dri"
}
},
Sfs = {
name = "South Forest",
doors = "R",
next_station = {
E = "Jms",
W = "Gcl"
}
},
Jms = {
name = "Jude Milhon Street",
doors = "R",
next_station = {
E = "Bam",
W = "Sfs"
}
},
Bam = {
name = "Bamboo Hills",
doors = "R",
next_station = {
E = "Cli",
W = "Jms"
}
},
Cli = {
name = "Clown Island",
doors = "R",
next_station = {
E = "Wat",
W = "Bam"
}
},
Wat = {
name = "Something in the Water",
doors = "L",
next_station = {
E = "Duf",
W = "Cli"
}
},
Duf = {
name = "Duff Rd",
doors = "R",
next_station = {
E = "Tro",
W = "Wat"
}
},
Tro = {
name = "Turtle Rock",
doors = "L",
next_station = {
E = false,
W = "Duf"
},
}
},
monitoring = {
E = {},
W = {},
S = {},
N = {}
}
}
}
S.runarounds = {
["TheStacks"] = {},
["M27_Quarry_runaround"] = {},
["M27_Breaker_Factory"] = {},
["DJnc_4"] = {},
}
---------------------------------------------------------------------
-- M27 Tracking
S.M27_tracking = {}
-- tracks for the above table are located at
-- -4003,12,-2766 Between Alieane and Trojan
-- -3766,15,-3562 EV_Beach<->Sinensis
-- -3592,18,-3907 Sinensis<->Willow Tunnel
-- -3602,18,-3961 Willow Tunnel <-> Djnc
-- -3602.18.-3961 Djnc<->Dcaves
-- -2345,15,-1336 Tanh Depot
-- -1986,13,-1699 x2 Foundry entry
F.M27_tracking = function(id)
if not event.train then return end
local rc = get_rc() or ""
if not rc:match("M27_tracking") then return end
S.M27_tracking.last = S.M27_tracking.now
S.M27_tracking.now = id
end
--Atlac Yard Operations
if event.init then
local list_of_yards = {
["WOA"] = {},
["S27"] = {},
}
S.yards = S.yards or list_of_yards
end
F.remove_rc = function(rc_list,arrow_mode)
-- rc_list MUST be a table of rc codes to remove
-- eg: {"rc1","rc2"}
-- Arrow Modes:
-- true: with arrow direction
-- false: against arrow direction
-- nil: ignores arrow direction
if not event.train then return end
if (arrow_mode == nil) or (atc_arrow == arrow_mode) then
local rc = get_rc() or ""
rc_list = rc_list or {}
-- ensure rc-remove table can be read
local rc_remove = {}
for _,v in pairs(rc_list) do
rc_remove[v] = true
end
-- remove codes from train's rc
local reinsert = {}
for token in rc:gmatch("[^%s]+") do
if not rc_remove[token] then
table.insert(reinsert,token)
end
end
-- insert new string to train's rc
rc = table.concat(reinsert," ")
set_rc(rc)
end
end
F.yard_road_count = function(yard,section_id,monitoring_light)
if not S.yards[yard][section_id] then S.yards[yard][section_id] = {['car_count'] = 0} end
local car_count = S.yards[yard][section_id].car_count
if event.train then
if atc_arrow then --arrow points into section, add to length
car_count = car_count + train_length()
else -- subtract from
car_count = car_count - train_length()
end
if car_count > 0 then -- light = on
setstate(monitoring_light,"on")
else
car_count = 0
setstate(monitoring_light,"off")
end
S.yards[yard][section_id].car_count = car_count
end
end
--stats counter from subway/il_timetable
F.stat=function(line, init)
--statistics
-- init
if init then
reftrain = atc_id
a_tbt = 30
a_tbtmax = 30
a_rtt = 500
a_not = 0
c_not = 0
c_tbtmax = 0
time_lt = os.time()
time_rt=os.time()
end
if not a_tbtmax then a_tbtmax = 30 end
if not c_tbtmax then c_tbtmax = 0 end
--real code
if event.train then
local time = os.time()
c_not = c_not + 1
a_tbt = (a_tbt + (time - time_lt)) / 2
c_tbtmax = math.max(c_tbtmax, (time - time_lt))
if atc_id == reftrain then
a_rtt = (a_rtt*0.2 + (time - time_rt)*0.8)
a_not = c_not
c_not = 0
a_tbtmax = (a_tbtmax + c_tbtmax) / 2
c_tbtmax = 0
end
digiline_send("stats", "Stat: "..line..
" NoT:"..a_not.."("..c_not..")"..
" TbT:"..math.floor(a_tbt).."("..(time-time_lt)..")"..
" Tmx:"..math.floor(a_tbtmax).."("..c_tbtmax..")"..
" R:"..math.floor(a_rtt).."("..(time - time_rt)..")"
)
time_lt = time
if atc_id == reftrain then
time_rt = time
end
end
end
---------------------------------------------------------------------
--defining the functions
F.arrive = function(stn_code,dir,line)
S.lines[line].monitoring[dir][stn_code] = atc_id
atc_send("B0 W O"..S.lines[line].stations[stn_code].doors)
atc_set_text_inside("Arrived at:\n"..S.lines[line].stations[stn_code].name.."\n \nNext Station:\n"..S.lines[line].stations[S.lines[line].stations[stn_code].next_station[dir]].name)
end
F.depart = function(stn_code,dir,line)
local pos = stn_code..dir
local inside_text = "Next Stop:\n"..S.lines[line].stations[S.lines[line].stations[stn_code].next_station[dir]].name
if can_set_route(pos,stn_code.."->"..S.lines[line].stations[stn_code].next_station[dir]) then
set_route(pos,stn_code.."->"..S.lines[line].stations[stn_code].next_station[dir])
atc_send("OC SM")
S.lines[line].monitoring[dir][stn_code] = nil
S.lines[line].monitoring[dir][S.lines[line].stations[stn_code].next_station[dir]] = atc_id
else
-- Wait another 5s before trying again
inside_text = inside_text.."\nWaiting to depart..."
interrupt(5, "depart")
end
atc_set_text_inside(inside_text)
end
F.set_desto = function(dir, line)
atc_set_text_outside("LINE " .. line .."\n---> " .. S.lines[line].stations[S.lines[line].termini[dir]].name)
end
---------------------------------------------------------------------
--LuaATC track functions
F.station = function(stn_code,dir,line)
-- temp until all SF LuaAtc tracks are changed-------------------------
if line == nil or line == "1" then
line = "U21"
end
---------------------------------------------------------------------
if event.train then
F.arrive(stn_code,dir,line)
interrupt(10,"depart")
elseif event.int and event.msg=="depart" then
F.depart(stn_code,dir,line)
end
end
F.terminus = function(stn_code, newdir, line)
if event.train then
S.lines[line].monitoring[newdir][stn_code] = atc_id
atc_send("B0 W R O"..S.lines[line].stations[stn_code].doors)
atc_set_text_inside("Arrived at:\n"..S.lines[line].stations[stn_code].name.."\n \nNext Station:\n"..S.lines[line].stations[S.lines[line].stations[stn_code].next_station[newdir]].name)
atc_set_text_outside("LINE " .. line .."\n---> " .. S.lines[line].stations[S.lines[line].termini[newdir]].name)
interrupt(10, "depart")
end
if event.int and event.msg == "depart" then
F.depart(stn_code, newdir,line)
end
end
|