summaryrefslogtreecommitdiff
path: root/durt/init_code.lua
blob: 85776a41ee7edc293d9bbf28193098ff5714d5ae (plain)
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