mirror of
https://github.com/metrostroi-repo/MetrostroiAddon.git
synced 2026-05-02 00:42:29 +00:00
1215 lines
42 KiB
Lua
1215 lines
42 KiB
Lua
--------------------------------------------------------------------------------
|
|
-- ПА-КСД Поездная Аппаратура-Комплексная Система Движения
|
|
--------------------------------------------------------------------------------
|
|
Metrostroi.DefineSystem("PA-KSD")
|
|
TRAIN_SYSTEM.DontAccelerateSimulation = true
|
|
|
|
function TRAIN_SYSTEM:Initialize()
|
|
self.Train:LoadSystem("Indicate","Relay","Switch",{bass = true,maxvalue = 3,defaultvalue = 1})
|
|
self.Train:LoadSystem("VPA","Relay","Switch",{bass = true,defaultvalue = 1,maxvalue = 2})
|
|
self.Train:LoadSystem("BCCD","Relay","Switch",{bass = true})
|
|
self.Train:LoadSystem("VZP","Relay","Switch",{bass = true})
|
|
self.Train:LoadSystem("B7","Relay","Switch",{bass = true})
|
|
self.Train:LoadSystem("B8","Relay","Switch",{bass = true})
|
|
self.Train:LoadSystem("B9","Relay","Switch",{bass = true})
|
|
self.Train:LoadSystem("B4","Relay","Switch",{bass = true})
|
|
self.Train:LoadSystem("B5","Relay","Switch",{bass = true})
|
|
self.Train:LoadSystem("B6","Relay","Switch",{bass = true})
|
|
self.Train:LoadSystem("BUp","Relay","Switch",{bass = true})
|
|
self.Train:LoadSystem("B1","Relay","Switch",{bass = true})
|
|
self.Train:LoadSystem("B2","Relay","Switch",{bass = true})
|
|
self.Train:LoadSystem("B3","Relay","Switch",{bass = true})
|
|
self.Train:LoadSystem("BDown","Relay","Switch",{bass = true})
|
|
self.Train:LoadSystem("BLeft","Relay","Switch",{bass = true})
|
|
self.Train:LoadSystem("B0","Relay","Switch",{bass = true})
|
|
self.Train:LoadSystem("BMinus","Relay","Switch",{bass = true})
|
|
self.Train:LoadSystem("BPlus","Relay","Switch",{bass = true})
|
|
self.Train:LoadSystem("BEnter","Relay","Switch",{bass = true})
|
|
|
|
self.Train:LoadSystem("R25p","Relay","KPD-110E", { bass = true })
|
|
|
|
self.TriggerNames = {
|
|
"B7",
|
|
"B8",
|
|
"B9",
|
|
"BLeft",
|
|
"B4",
|
|
"B5",
|
|
"B6",
|
|
"BUp",
|
|
"B1",
|
|
"B2",
|
|
"B3",
|
|
"BDown",
|
|
"B0",
|
|
"BMinus",
|
|
"BPlus",
|
|
"BEnter",
|
|
}
|
|
self.Triggers = {}
|
|
self.Pass = "31173"
|
|
self.EnteredPass = ""
|
|
self.Timer = CurTime()
|
|
self.Line = 1
|
|
self.State = 0
|
|
self.RealState = 99
|
|
self.RouteNumber = ""
|
|
self.State4Choosed = 1
|
|
self.FirstStation = ""
|
|
self.LastStation = ""
|
|
self.KSZD = false
|
|
self.AutoTimer = false
|
|
self.State74 = 1
|
|
self.State75 = 1
|
|
end
|
|
function TRAIN_SYSTEM:ClientInitialize()
|
|
self.STR1r = {}
|
|
self.STR2r = {}
|
|
self.STR1x = 1
|
|
self.STR2x = 1
|
|
self.Positions = {
|
|
[-3] = "T2",
|
|
[-2] = "T1a",
|
|
[-1] = "T1",
|
|
[0] = "0",
|
|
[1] = "X1",
|
|
[2] = "X2",
|
|
[3] = "X3",
|
|
--[4] = "RR0",
|
|
[5] = "0XT",
|
|
[6] = "T2",
|
|
}
|
|
self.Positions2 = {"PS","PP","PT",}
|
|
self.Types = {
|
|
[0] = "EPV",
|
|
[1] = "AV",
|
|
[2] = "OD",
|
|
[3] = "KV",
|
|
[4] = "UA",
|
|
[5] = "SL",
|
|
}
|
|
self.StataionData =
|
|
{
|
|
[0] = "ERR",
|
|
[108] = "AV",
|
|
[109] = "IND",
|
|
[110] = "MOSK",
|
|
[111] = "OKT",
|
|
[112] = "PLMI",
|
|
[113] = "NOV",
|
|
[114] = "VOK",
|
|
[115] = "KOM",
|
|
[116] = "ELE",
|
|
[117] = "TEPL",
|
|
[118] = "PP",
|
|
[119] = "SINE",
|
|
[120] = "LES X",
|
|
[121] = "MNSK",
|
|
[122] = "TSVO",
|
|
[123] = "MZHD",
|
|
[321] = "MUSK",
|
|
[322] = "AVUZ",
|
|
[1215] = "LEN",
|
|
--ORANGE LINE
|
|
[401] = "SLS",
|
|
[402] = "LITE",
|
|
[403] = "PA",
|
|
[404] = "MAST",
|
|
[405] = "GFC",
|
|
[406] = "UB",
|
|
[407] = "VHE",
|
|
[408] = "TGM",
|
|
[501] = "AERO",
|
|
[502] = "SENT",
|
|
[503] = "LIT",
|
|
}
|
|
self.Train.Autodrive.AutodriveEnabled = false
|
|
self.KSZD = false
|
|
self.AutoTimer = false
|
|
end
|
|
|
|
if TURBOSTROI then return end
|
|
CreateConVar("metrostroi_paksd_autoopen",0,{FCVAR_ARCHIVE},"PA-KSD:Auto open doors")
|
|
function TRAIN_SYSTEM:Inputs()
|
|
return { "Press" }
|
|
end
|
|
|
|
function TRAIN_SYSTEM:PAKSD1(train)
|
|
--print(self,train,self==train)
|
|
if train:GetPackedBool("Indicate3") then return end
|
|
if train:GetPackedBool("Indicate2") then return end
|
|
for y = 0,#self.STR1r-1 do
|
|
local xmin = 0
|
|
local blink = false
|
|
local checked = false
|
|
for x = 0,math.min(19,#self.STR1r[y+1]-1) do
|
|
local char = self.STR1r[y+1][x+1]
|
|
if char == "@" then
|
|
blink = true
|
|
xmin = xmin + 1
|
|
elseif char == "$" then
|
|
checked = true
|
|
xmin = xmin + 1
|
|
elseif blink then
|
|
if CurTime()%1<=0.5 then
|
|
surface.SetDrawColor(0,255,127)
|
|
surface.DrawRect((x-xmin)*16+1,y*28+5,14,20)
|
|
surface.SetDrawColor(0,0,0)
|
|
draw.DrawText(char,"MetrostroiSubway_IGLA",(x-xmin)*16,y*28, Color(0,0,0))
|
|
--xmin = xmin + 1
|
|
else
|
|
draw.DrawText(char,"MetrostroiSubway_IGLA",(x-xmin)*16,y*28, Color(0,255,127))
|
|
--xmin = xmin + 1
|
|
end
|
|
elseif checked then
|
|
surface.SetDrawColor(0,255,127)
|
|
surface.DrawRect((x-xmin)*16+1,y*28+5,14,20)
|
|
surface.SetDrawColor(0,0,0)
|
|
draw.DrawText(self.STR1r[y+1][x+1],"MetrostroiSubway_IGLA",(x-xmin)*16,y*28, Color(0,0,0))
|
|
elseif char == "_" then
|
|
if CurTime()%0.65<=0.4 then
|
|
surface.SetDrawColor(0,255,127)
|
|
surface.DrawRect((x-xmin)*16,y*28+5,16,20)
|
|
end
|
|
elseif char == "#" then
|
|
surface.SetDrawColor(0,255,127)
|
|
surface.DrawRect(x*16+1,y*28+5,14,20)
|
|
elseif self.STR1r[y+1][x+2] == "%" then
|
|
if CurTime()%0.5<=0.25 then
|
|
surface.SetDrawColor(0,255,127)
|
|
surface.DrawRect((x-xmin)*16+1,y*28+5,14,20)
|
|
surface.SetDrawColor(0,0,0)
|
|
draw.DrawText(self.STR1r[y+1][x+1],"MetrostroiSubway_IGLA",(x-xmin)*16,y*28, Color(0,0,0))
|
|
xmin = xmin + 1
|
|
else
|
|
draw.DrawText(char,"MetrostroiSubway_IGLA",(x-xmin)*16,y*28, Color(0,255,127))
|
|
xmin = xmin + 1
|
|
end
|
|
elseif char ~= "%" then
|
|
draw.DrawText(char,"MetrostroiSubway_IGLA",(x-xmin)*16,y*28, Color(0,255,127))
|
|
end
|
|
end
|
|
end
|
|
surface.SetAlphaMultiplier(1)
|
|
end
|
|
function TRAIN_SYSTEM:PAKSD2(train)
|
|
if train:GetPackedBool("Indicate3") then return end
|
|
if not train:GetPackedBool("Indicate1") and not train:GetPackedBool("Indicate2") then return end
|
|
for y = 0,#self.STR2r-1 do
|
|
for x = 0,math.min(19,#self.STR2r[y+1]-1) do
|
|
local char = self.STR2r[y+1][x+1]
|
|
if char == "_" then
|
|
if CurTime()%0.5>0.25 then
|
|
char = ""
|
|
else
|
|
surface.SetDrawColor(0,255,127)
|
|
surface.DrawRect(x*16-3,y*40 + 15,16,28)
|
|
end
|
|
end
|
|
draw.DrawText(char,"MetrostroiSubway_IGLA",x*16-3,y*40 + 15, Color(0,255,127))
|
|
end
|
|
end
|
|
surface.SetAlphaMultiplier(1)
|
|
end
|
|
|
|
function TRAIN_SYSTEM:STR1(str,notchange)
|
|
if SERVER then return end
|
|
if str == true then
|
|
for i = 1,4 do
|
|
self.STR1r[i] = ""
|
|
end
|
|
self.STR1x = 1
|
|
else
|
|
if self.STR1x > 4 then print("STR1:ERR:MAX",str) return end
|
|
if notchange then
|
|
self.STR1r[self.STR1x-1] = self.STR1r[self.STR1x-1]..str
|
|
else
|
|
self.STR1r[self.STR1x] = str or ""
|
|
self.STR1x = self.STR1x + 1
|
|
end
|
|
end
|
|
end
|
|
function TRAIN_SYSTEM:STR2(str,notchange)
|
|
if SERVER then return end
|
|
if str == true then
|
|
for i = 1,2 do
|
|
self.STR2r[i] = ""
|
|
end
|
|
self.STR2x = 1
|
|
else
|
|
if self.STR2x > 2 then print("STR2:ERR:MAX",str) return end
|
|
if notchange then
|
|
self.STR2r[self.STR2x] = self.STR2r[self.STR2x]..(str or "")
|
|
else
|
|
self.STR2r[self.STR2x] = str or ""
|
|
self.STR2x = self.STR2x + 1
|
|
end
|
|
end
|
|
end
|
|
function TRAIN_SYSTEM:ClientThink()
|
|
if not self.Train.Blok or self.Train.Blok ~= 2 then return end
|
|
self.Time = self.Time or CurTime()
|
|
if (CurTime() - self.Time) > 0.1 then
|
|
--print(1)
|
|
self.Time = CurTime()
|
|
--self.STR1 = string.Explode("\n",self.Train:GetNW2String("PAKSD1"))
|
|
--self.STR2 = string.Explode("\n",self.Train:GetNW2String("PAKSD2"))
|
|
self:STR1(true)
|
|
self:STR2(true)
|
|
local State = self.Train:GetNW2Int("PAKSD:State",0)
|
|
if State == -1 or State == -9 or State >= 1 and State < 6 then
|
|
self:STR2("<*>")
|
|
end
|
|
local Announcer = self.Train.Announcer
|
|
if State == 8 then
|
|
self:STR1("<*>")
|
|
self:STR2("<*>")
|
|
elseif State == -2 then
|
|
self:STR2("_")
|
|
elseif State == 1 then
|
|
self:STR1("+INITIAL TEST")
|
|
self:STR1("+INITIAL SETUP")
|
|
self:STR1("V 0.3")
|
|
self:STR1(" PRESS ENTER")
|
|
elseif State == 2 then
|
|
self:STR1("ENTER PASSWORD")
|
|
self:STR1("TO ENTER SYSTEM>")
|
|
self:STR1(self.Train:GetNW2Int("PAKSD:Pass",0) ~= -1 and string.rep("*",self.Train:GetNW2Int("PAKSD:Pass",0)) or "ACCESS ERROR")
|
|
elseif State == 3 then
|
|
self:STR1(" 1 GO TO LINE")
|
|
if self.Train:GetNW2Bool("PAKSD:Restart",false) then self:STR1(" 2 RESTART") end
|
|
--if self.FirstStation ~= "" and self.LastStation ~= "" then self:STR1("\n 2 RESTART" end
|
|
elseif State == 4 then
|
|
local State4Choosed = self.Train:GetNW2Int("PAKSD:State4",1)
|
|
if State4Choosed < 4 then
|
|
local Line = self.Train:GetNW2Int("PAKSD:Line",0)
|
|
local FirstStation = self.Train:GetNW2Int("PAKSD:FirstStation",-1)
|
|
local LastStation = self.Train:GetNW2Int("PAKSD:LastStation",-1)
|
|
local tbl = Metrostroi.EndStations
|
|
self:STR1("LINE "..Line..(State4Choosed == 1 and "_" or " ").." ")
|
|
if tbl[Line] then
|
|
local Routelength = #Metrostroi.EndStations[Line]
|
|
self:STR1("<"..tbl[Line][1].."->"..tbl[Line][Routelength]..">",true)
|
|
else
|
|
self:STR1("<ERR->ERR>",true)
|
|
end
|
|
local st = ""
|
|
if tbl[Line] and tbl[Line][FirstStation] and Metrostroi.AnnouncerData[FirstStation] then
|
|
st = Metrostroi.AnnouncerData[FirstStation][1]:sub(1,10)
|
|
end
|
|
self:STR1("FIRST "..(FirstStation ~= -1 and FirstStation or "")..(State4Choosed == 2 and "_" or " ")..st:upper())
|
|
st = ""
|
|
if tbl[Line] and tbl[Line][LastStation] and Metrostroi.AnnouncerData[LastStation] then
|
|
st = Metrostroi.AnnouncerData[LastStation][1]:sub(1,10)
|
|
end
|
|
self:STR1("LAST "..(LastStation ~= -1 and LastStation or "")..(State4Choosed == 3 and "_" or " ")..st:upper())
|
|
self:STR1(" VVVV ")
|
|
else
|
|
local RouteNumber = self.Train:GetNW2Int("PAKSD:RouteNumber",-1)
|
|
self:STR1("ROUTEn "..(RouteNumber ~= -1 and RouteNumber or "").."_")
|
|
self:STR1("\"ENTER\" FOR CONFIRM")
|
|
end
|
|
elseif State == 49 then
|
|
local State4Choosed = self.Train:GetNW2Int("PAKSD:State4",1)
|
|
local Line = self.Train:GetNW2Int("PAKSD:Line",0)
|
|
local LastStation = self.Train:GetNW2Int("PAKSD:LastStation",-1)
|
|
local RouteNumber = self.Train:GetNW2Int("PAKSD:RouteNumber",-1)
|
|
local tbl = Metrostroi.EndStations
|
|
self:STR1("LINE "..Line..(State4Choosed == 1 and "_" or " ").." ")
|
|
if tbl[Line] then
|
|
local Routelength = #Metrostroi.EndStations[Line]
|
|
self:STR1("<"..tbl[Line][1].."->"..tbl[Line][Routelength]..">",true)
|
|
else
|
|
self:STR1("<ERR->ERR>",true)
|
|
end
|
|
local st = ""
|
|
if tbl[Line] and tbl[Line][LastStation] and Metrostroi.AnnouncerData[LastStation] then
|
|
st = Metrostroi.AnnouncerData[LastStation][1]:sub(1,10)
|
|
end
|
|
self:STR1("LAST "..(LastStation ~= -1 and LastStation or "")..(State4Choosed == 2 and "_" or " ")..st:upper())
|
|
self:STR1("ROUTEn "..(RouteNumber ~= -1 and RouteNumber or "")..(State4Choosed == 3 and "_" or " "))
|
|
self:STR1("\"ENTER\" FOR CONFIRM")
|
|
elseif State == 48 or State == 45 then
|
|
self:STR1("ERROR WHEN ENTER")
|
|
self:STR1("SOURCE DATA")
|
|
self:STR1("FOR CONTINUE")
|
|
self:STR1("PRESS ENTER")
|
|
elseif State == 5 then
|
|
self:STR1(" TRAIN CHECK")
|
|
self:STR1(" APPROVED")
|
|
self:STR1(" WHEN CHECK")
|
|
self:STR1(" PRESS ENTER")
|
|
elseif State == 6 then
|
|
self:STR1("ENTER")
|
|
self:STR1("TO WORKING MODE?")
|
|
self:STR1("")
|
|
self:STR1("YES-\"ENTER\" NO-\"<-\"")
|
|
elseif State > 6 then
|
|
|
|
local speed = math.floor(self.Train:GetPackedRatio(3)*100.0)
|
|
local station = self.Train:GetNW2Int("PAKSD:Station",0)
|
|
local spd = self.Train:GetNW2Bool("PAKSD:UOS", false) and 35 or self.Train:GetNW2Bool("PAKSD:VRD",false) and 20 or self.Train:GetPackedBool(46) and 80 or self.Train:GetPackedBool(45) and 70 or self.Train:GetPackedBool(44) and 60 or self.Train:GetPackedBool(43) and 40 or self.Train:GetPackedBool(42) and "00" or "H4"
|
|
local VZ = (self.Train:GetNW2Bool("PAKSD:VZ1",false) and "B1" or "").." "..(self.Train:GetNW2Bool("PAKSD:VZ2",false) and "B2" or "")
|
|
if self.OldVRD ~= self.Train:GetNW2Bool("PAKSD:VRD",false) then
|
|
self.OldVRD = self.Train:GetNW2Bool("PAKSD:VRD",false)
|
|
if self.OldVRD then
|
|
self.VRDTimer = CurTime() + 7
|
|
end
|
|
end
|
|
local distance = self.Train:GetNW2Int("PAKSD:Distance",-99)
|
|
local pos =self.Positions[self.Train:GetNW2Int("PAKSD:KV",0)]
|
|
local typ = self.Types[self.Train:GetNW2Int("PAKSD:Type",0)]
|
|
local RK = (self.Positions2[self.Train:GetNW2Int("PAKSD:PPT",1)]).."="..tostring(self.Train:GetNW2Int("PAKSD:RK",0))
|
|
if speed < 10 then
|
|
speed = "0"..speed
|
|
end
|
|
if State == 71 then
|
|
self:STR1("CONFIRM")
|
|
self:STR1("Autodrive MODE?")
|
|
self:STR1()
|
|
self:STR1("YES-\"ENTER\" NO-\"<-\"")
|
|
elseif State == 72 then
|
|
self:STR1("CONFIRM")
|
|
self:STR1("SC MODE? ")
|
|
self:STR1()
|
|
self:STR1("YES-\"ENTER\" NO-\"<-\"")
|
|
elseif State == 73 then
|
|
self:STR1("CONFIRM")
|
|
self:STR1("SL MODE? ")
|
|
self:STR1()
|
|
self:STR1("YES-\"ENTER\" NO-\"<-\"")
|
|
elseif State == 74 then
|
|
local State74 = self.Train:GetNW2Int("PAKSD:State74",1)
|
|
local SD = self.Train:GetNW2Bool("PAKSD:KD",false)
|
|
if State74 < 4 then
|
|
self:STR1("1"..(State74 == 1 and "%" or "")..":"..(State74 == 1 and "$" or "").."ROLLING CHECK")
|
|
self:STR1("2"..(State74 == 2 and "%" or "")..":"..(State74 == 2 and "$" or "").."DRIVE "..(SD and "WITH" or "WITHOUT").." SD")
|
|
self:STR1("3"..(State74 == 3 and "%" or "")..":"..(State74 == 3 and "$" or "").."SETTINGS CHANGE")
|
|
self:STR1(" VVVV ")
|
|
elseif State74 < 7 then
|
|
self:STR1("4"..(State74 == 4 and "%" or "")..":"..(State74 == 4 and "$" or "")..(self.Train:GetNW2Bool("PAKSD:Transit",false) and "DIS " or "").."TRANSIT MODE")
|
|
self:STR1("5"..(State74 == 5 and "%" or "")..":"..(State74 == 5 and "$" or "").."DRIVE WITH Vd=0")
|
|
self:STR1("6"..(State74 == 6 and "%" or "")..":"..(State74 == 6 and "$" or "").."ZONED TURN")
|
|
self:STR1(" VVVV ")
|
|
else
|
|
self:STR1("7"..(State74 == 7 and "%" or "")..":"..(State74 == 7 and "$" or "").."FIX STATION")
|
|
self:STR1("8"..(State74 == 8 and "%" or "")..":"..(State74 == 8 and "$" or "").."STATION MODE")
|
|
end
|
|
elseif State == 75 then
|
|
local State75 = self.Train:GetNW2Int("PAKSD:State75",1)
|
|
self:STR1("1"..(State75 == 1 and "%" or "")..":"..(State75 == 1 and "$" or "").."GO OUT FROM TRAIN")
|
|
self:STR1("2"..(State75 == 2 and "%" or "")..":"..(State75 == 2 and "$" or "").."ENTRY FASTER")
|
|
self:STR1("3"..(State75 == 3 and "%" or "")..":"..(State75 == 3 and "$" or "").."RELEASE DOORS")
|
|
self:STR1("4"..(State75 == 4 and "%" or "")..":"..(State75 == 4 and "$" or "").."TRAIN DEPEAT SOON")
|
|
elseif State == 76 then
|
|
self:STR1("CONTINUE MOVEMENT")
|
|
self:STR1("WITH VD=0? ")
|
|
self:STR1()
|
|
self:STR1("YES-\"ENTER\" NO-\"<-\"")
|
|
elseif State == 77 then
|
|
self:STR1("ACCEPT")
|
|
self:STR1("ROLLING CHECK?")
|
|
self:STR1()
|
|
self:STR1("YES-\"ENTER\" NO-\"<-\"")
|
|
--self:STR1("5:DRIVE WITH Vd = 0")
|
|
--self:STR1("6:ZONED TURN")
|
|
--[[
|
|
elseif State == 79 then
|
|
self:STR1("FOR TRANSIT MODE")
|
|
self:STR1("PRESS ENTER")
|
|
self:STR1("FOR CANCEL")
|
|
self:STR1("PRESS \"-\"")
|
|
elseif State == 75 then
|
|
self:STR1("FOR ROLL MODE")
|
|
self:STR1("PRESS ENTER")
|
|
self:STR1("FOR CANCEL")
|
|
self:STR1("PRESS \"-\"")
|
|
elseif State == 77 then
|
|
self:STR1("FOR STATION GO MODE")
|
|
self:STR1("PRESS ENTER")
|
|
self:STR1("FOR CANCEL")
|
|
self:STR1("PRESS \"-\"")
|
|
]]
|
|
elseif self.Train:GetNW2Bool("PAKSD:Nakat",false) then
|
|
self:STR1("ROLLING CHECK")
|
|
self:STR1("DISTANCE:"..Format("%.2f",self.Train:GetNW2Float("PAKSD:Meters",0)))
|
|
self:STR1("DIRECTION:"..(self.Train:GetNW2Bool("PAKSD:Sign",false) and "BACKWARD" or "FORWARD"))
|
|
self:STR1(typ.."="..pos..string.rep(" ",6-#typ-#pos)..VZ..string.rep(" ",20-5-#VZ-6-1).."Vf="..speed)
|
|
else
|
|
local State7 = self.Train:GetNW2Int("PAKSD:State7",0)
|
|
if State7 == 0 then
|
|
self:STR1(" EXIT TO THE LINE")
|
|
local date = os.date("!*t",os_time)
|
|
self:STR1(" Tm="..Format("%02d:%02d:%02d",date.hour,date.min,date.sec))
|
|
self:STR1()
|
|
if self.VRDTimer and CurTime() - self.VRDTimer < 0 then
|
|
self:STR1("@ACC MOV WITH Vd=0")
|
|
elseif self.Train:GetNW2Bool("PAKSD:Transit",false) then
|
|
self:STR1("TRANSIT MODE")
|
|
else
|
|
self:STR1(typ.."="..pos..string.rep(" ",6-#typ-#pos)..VZ..string.rep(" ",20-5-#VZ-6-1).."Vd="..spd)
|
|
self.VRDTimer = nil
|
|
end
|
|
elseif State7 == 1 and Metrostroi.AnnouncerData then
|
|
local path = self.Train:GetNW2Int("PAKSD:Path",0)
|
|
local bt = tostring(self.Train:GetNW2Int("PAKSD:BoardTime",0))
|
|
local date = os.date("!*t",os_time)
|
|
local tm = Format("%02d:%02d:%02d",date.hour,date.min,date.sec)
|
|
self:STR1((Metrostroi.AnnouncerData[station] and Metrostroi.AnnouncerData[station][1]) and Metrostroi.AnnouncerData[station][1]:upper() or "UNK")
|
|
self:STR1("TO "..Metrostroi.AnnouncerData[self.Train:GetNW2Int("PAKSD:LastStation",108)][1]:upper())
|
|
self:STR1("ST "..bt..string.rep(" ",20-8-3-#bt)..tm)
|
|
if self.VRDTimer and CurTime() - self.VRDTimer < 0 then
|
|
self:STR1("@ACC MOV WITH Vd=0")
|
|
elseif self.Train:GetNW2Bool("PAKSD:Transit",false) then
|
|
self:STR1("TRANSIT MODE")
|
|
else
|
|
self:STR1(typ.."="..pos..string.rep(" ",6-#typ-#pos)..VZ..string.rep(" ",20-6-4-#VZ)..(path == 1 and "I " or "II" ).."P")
|
|
self.VRDTimer = nil
|
|
end
|
|
else
|
|
local name = self.Train:GetNW2String("PAKSD:SName","ERR")
|
|
local curr = string.rep("#",speed/4.7-1)
|
|
local max = string.rep("-",(spd ~= "H4" and spd or 0)/4.7-1)
|
|
self:STR1(curr.."<"..string.rep(" ",20-#curr-3)..speed)
|
|
self:STR1(max.."^"..string.rep(" ",20-#max-3)..spd)
|
|
self:STR1("TC="..name..string.rep(" ",20-9-#name)..math.min(9999,math.floor(distance)).." m")
|
|
if self.VRDTimer and CurTime() - self.VRDTimer < 0 then
|
|
self:STR1("@ACC MOV WITH Vd=0")
|
|
elseif self.Train:GetNW2Bool("PAKSD:Transit",false) then
|
|
self:STR1("TRANSIT MODE")
|
|
else
|
|
self:STR1(typ.."="..pos..string.rep(" ",6-#typ-#pos)..VZ..string.rep(" ",20-2-6-1-#VZ-math.max(4,#self.StataionData[station])).."<"..self.StataionData[station]..">")
|
|
self.VRDTimer = nil
|
|
end
|
|
end
|
|
end
|
|
self:STR2("V+= "..speed.." Vd= "..spd.." S= "..(station == 0 and "unk" or math.min(999,math.floor(distance))))
|
|
self:STR2(typ.."= "..pos..string.rep(" ",6-#typ-#pos)..RK..string.rep(" ",20-7-4-3-#RK).."T= "..(self.Train:GetPackedRatio(3)*100.0 > 0.25 and math.min(999,math.floor(distance/(speed*1000/3600))) or "inf"))
|
|
end
|
|
end
|
|
end
|
|
|
|
function TRAIN_SYSTEM:UpdateUPO()
|
|
for k,v in pairs(self.Train.WagonList) do
|
|
if v.UPO then v.UPO:SetStations(self.Line,self.FirstStation,self.LastStation,v == self.Train) end
|
|
v:OnButtonPress("RouteNumberUpdate",self.RouteNumber)
|
|
end
|
|
end
|
|
|
|
function TRAIN_SYSTEM:Trigger(name,nosnd)
|
|
local Announcer = self.Train.Announcer
|
|
if self.State == 1 and name == "BEnter" then
|
|
self:SetState(2)
|
|
elseif self.State == 2 then
|
|
if name == "BEnter" then
|
|
if self.Pass ~= self.EnteredPass then
|
|
self.EnteredPass = "/"
|
|
else
|
|
self:SetState(3)
|
|
end
|
|
else
|
|
if self.EnteredPass == "/" then self.EnteredPass = "" end
|
|
local Char = tonumber(name:sub(2,2))
|
|
if Char and #self.EnteredPass < 6 then self.EnteredPass = self.EnteredPass..tonumber(name:sub(2,2)) end
|
|
end
|
|
elseif self.State == 3 then
|
|
if name == "B1" then
|
|
self:SetState(4)
|
|
end
|
|
if name == "B2" and self.FirstStation ~= "" and self.LastStation ~= "" then
|
|
self:SetState(49)
|
|
end
|
|
elseif self.State == 4 then
|
|
--print(name)
|
|
if name == "BDown" then
|
|
self.State4Choosed = math.min(4,self.State4Choosed + 1)
|
|
end
|
|
if name == "BUp" then
|
|
self.State4Choosed = math.max(1,self.State4Choosed - 1)
|
|
end
|
|
if name == "BLeft" then
|
|
if self.State4Choosed == 2 then
|
|
self.FirstStation= self.FirstStation:sub(1,-2)
|
|
end
|
|
if self.State4Choosed == 3 then
|
|
self.LastStation= self.LastStation:sub(1,-2)
|
|
end
|
|
if self.State4Choosed == 4 then
|
|
self.RouteNumber= self.RouteNumber:sub(1,-2)
|
|
end
|
|
self:UpdateUPO()
|
|
end
|
|
if name == "BEnter" then
|
|
if not Metrostroi.EndStations[self.Line] or
|
|
not Metrostroi.EndStations[self.Line][tonumber(self.FirstStation)] or
|
|
not Metrostroi.AnnouncerData[tonumber(self.FirstStation)] or
|
|
not Metrostroi.EndStations[self.Line][tonumber(self.LastStation)] or
|
|
not Metrostroi.AnnouncerData[tonumber(self.LastStation)] or
|
|
#self.RouteNumber < 3 then
|
|
self:SetState(45)
|
|
else
|
|
self:SetState(5)
|
|
end
|
|
end
|
|
local Char = tonumber(name:sub(2,2))
|
|
if Char then
|
|
if self.State4Choosed == 1 then
|
|
self.Line = Char
|
|
if Metrostroi.EndStations[self.Line] then
|
|
local Routelength = #Metrostroi.EndStations[self.Line]
|
|
self.FirstStation = tostring(Metrostroi.EndStations[self.Line][1])
|
|
self.LastStation = tostring(Metrostroi.EndStations[self.Line][Routelength])
|
|
end
|
|
end
|
|
if self.State4Choosed == 2 and #self.FirstStation < 3 then
|
|
self.FirstStation= self.FirstStation..tostring(Char)
|
|
end
|
|
if self.State4Choosed == 3 and #self.LastStation < 3 then
|
|
self.LastStation= self.LastStation..tostring(Char)
|
|
end
|
|
if self.State4Choosed == 4 and #self.RouteNumber < 3 then
|
|
self.RouteNumber= self.RouteNumber..tostring(Char)
|
|
end
|
|
self:UpdateUPO()
|
|
end
|
|
elseif self.State == 49 then
|
|
if name == "BDown" then
|
|
self.State4Choosed = math.min(3,self.State4Choosed + 1)
|
|
end
|
|
if name == "BUp" then
|
|
self.State4Choosed = math.max(1,self.State4Choosed - 1)
|
|
end
|
|
if name == "BLeft" then
|
|
if self.State4Choosed == 2 then
|
|
self.LastStation= self.LastStation:sub(1,-2)
|
|
end
|
|
if self.State4Choosed == 3 then
|
|
self.RouteNumber= self.RouteNumber:sub(1,-2)
|
|
end
|
|
self:UpdateUPO()
|
|
end
|
|
if name == "BEnter" then
|
|
if not Metrostroi.EndStations[self.Line] or
|
|
not Metrostroi.EndStations[self.Line][tonumber(self.LastStation)] or
|
|
not Metrostroi.AnnouncerData[tonumber(self.LastStation)] or
|
|
#self.RouteNumber < 3 then
|
|
self:SetState(48)
|
|
else
|
|
self:SetState(7)
|
|
end
|
|
end
|
|
local Char = tonumber(name:sub(2,2))
|
|
if Char then
|
|
if self.State4Choosed == 1 then
|
|
self.Line = Char
|
|
if Metrostroi.EndStations[self.Line] then
|
|
local Routelength = #Metrostroi.EndStations[self.Line]
|
|
self.FirstStation = self.FirstStation ~= "" and self.FirstStation or tostring(Metrostroi.EndStations[self.Line][1])
|
|
self.LastStation = tostring(Metrostroi.EndStations[self.Line][Routelength])
|
|
if tonumber(self.LastStation) < tonumber(self.FirstStation) then
|
|
local temp = self.FirstStation
|
|
self.FirstStation = self.LastStation
|
|
self.LastStation = temp
|
|
end
|
|
end
|
|
end
|
|
if self.State4Choosed == 2 and #self.LastStation < 3 then
|
|
self.LastStation= self.LastStation..tostring(Char)
|
|
end
|
|
if self.State4Choosed == 3 and #self.RouteNumber < 3 then
|
|
self.RouteNumber= self.RouteNumber..tostring(Char)
|
|
end
|
|
self:UpdateUPO()
|
|
end
|
|
elseif self.State == 45 then
|
|
if name == "BEnter" then
|
|
self:SetState(4,nil,true)
|
|
end
|
|
elseif self.State == 48 then
|
|
if name == "BEnter" then
|
|
self:SetState(49,nil,true)
|
|
end
|
|
elseif self.State == 5 then
|
|
if name == "BEnter" and self.Check == false then
|
|
self:SetState(6)
|
|
end
|
|
elseif self.State == 6 then
|
|
if name == "BLeft" then
|
|
self:SetState(3)
|
|
end
|
|
if name == "BEnter" then
|
|
self:SetState(7)
|
|
end
|
|
elseif self.State == 7 and not self.Nakat then
|
|
if name == "B1" then
|
|
if not self.AutodriveWorking and self.Train.ALS_ARS["33G"] < 0.5 then
|
|
self:SetState(71)
|
|
end
|
|
elseif name == "B2" then
|
|
if (self.AutodriveWorking or self.VRD or self.UOS) and not self.Trainsit then
|
|
self:SetState(72)
|
|
end
|
|
elseif name == "B3" then
|
|
--print(self.Train.ALS_ARS.Signal0,self.Train.ALS_ARS.RealNoFreq)
|
|
if not self.UOS and not self.Train.ALS_ARS.EnableARS then
|
|
self:SetState(73)
|
|
end
|
|
elseif name == "BEnter" then
|
|
self:SetState(74)
|
|
elseif name == "BPlus" then
|
|
self:SetState(75)
|
|
end
|
|
--[[
|
|
elseif name == "B5" then
|
|
if not self.Transit and not self.VRD then
|
|
self:SetState(74)
|
|
end
|
|
elseif name == "B6" then
|
|
if not self.Nakat and not self.VRD then
|
|
self:SetState(75)
|
|
end
|
|
elseif name == "B7" then
|
|
if not self.Stancionniy and not self.VRD then
|
|
self:SetState(77)
|
|
end
|
|
elseif name == "BUp" then
|
|
self:AnnII(4)
|
|
elseif name == "BDown" then
|
|
self:AnnII(3)
|
|
elseif name == "BPlus" then
|
|
self:AnnII(2)
|
|
elseif name == "BMinus" then
|
|
self:AnnII(1)
|
|
end
|
|
]]
|
|
elseif self.State == 7 and self.Nakat then
|
|
self.Nakat = false
|
|
if self.Train:ReadTrainWire(1) < 1 then
|
|
self.Train.ALS_ARS.Nakat = false
|
|
end
|
|
elseif self.State == 71 then
|
|
if name == "BEnter" then
|
|
self.AutodriveWorking = true
|
|
self.UOS = false
|
|
self:SetState(7,nil,true)
|
|
end
|
|
if name == "BLeft" then
|
|
self:SetState(7,nil,true)
|
|
end
|
|
elseif self.State == 72 then
|
|
if name == "BEnter" then
|
|
self.AutodriveWorking = false
|
|
self.UOS = false
|
|
self:SetState(7,nil,true)
|
|
end
|
|
if name == "BLeft" then
|
|
self:SetState(7,nil,true)
|
|
end
|
|
elseif self.State == 73 then
|
|
if name == "BEnter" then
|
|
self.AutodriveWorking = false
|
|
self.UOS = true
|
|
self:SetState(7,nil,true)
|
|
end
|
|
if name == "BLeft" then
|
|
self:SetState(7,nil,true)
|
|
end
|
|
elseif self.State == 74 then
|
|
if name == "BUp" then
|
|
self.State74 = math.max(1,self.State74 - 1)
|
|
--if self.State74 == 4 and self.Transit then
|
|
--self:Trigger("BUp",true)
|
|
--else
|
|
if self.State74 == 5 and (self.VRD or not (self.Train.ALS_ARS.Signal0 and not self.Train.ALS_ARS.RealNoFreq and not self.Train.ALS_ARS.Signal40 and not self.Train.ALS_ARS.Signal60 and not self.Train.ALS_ARS.Signal70 and not self.Train.ALS_ARS.Signal80)) then
|
|
self:Trigger("BUp",true)
|
|
elseif self.State74 == 6 then
|
|
if self.LastStation == tostring(self.Train.UPO.Station) then
|
|
self:Trigger("BUp",true)
|
|
end
|
|
elseif self.State74 == 7 then
|
|
if self.FirstStation == tostring(self.Train.UPO.Station) then
|
|
self:Trigger("BUp",true)
|
|
end
|
|
end
|
|
end
|
|
if name == "BDown" then
|
|
self.State74 = math.min(8,self.State74 + 1)
|
|
--if self.State74 == 4 and self.Transit then
|
|
--self:Trigger("BDown",true)
|
|
--else
|
|
if self.State74 == 5 and (self.VRD or not (self.Train.ALS_ARS.Signal0 and not self.Train.ALS_ARS.RealNoFreq and not self.Train.ALS_ARS.Signal40 and not self.Train.ALS_ARS.Signal60 and not self.Train.ALS_ARS.Signal70 and not self.Train.ALS_ARS.Signal80)) then
|
|
self:Trigger("BDown",true)
|
|
elseif self.State74 == 6 then
|
|
if self.LastStation == tostring(self.Train.UPO.Station) then
|
|
self:Trigger("BDown",true)
|
|
end
|
|
elseif self.State74 == 7 then
|
|
if self.FirstStation == tostring(self.Train.UPO.Station) then
|
|
self:Trigger("BDown",true)
|
|
end
|
|
end
|
|
end
|
|
if name == "BLeft" then
|
|
self:SetState(7,nil,true)
|
|
end
|
|
if name == "BEnter" then
|
|
if self.State74 == 1 and self.Train.Speed < 0.5 and self.Train.ALS_ARS.SpeedLimit > 20 then
|
|
self:SetState(77)
|
|
elseif self.State74 == 2 then
|
|
self.KD = not self.KD
|
|
elseif self.State74 == 3 then
|
|
self:SetState(3)
|
|
elseif self.State74 == 4 then
|
|
self.Transit = not self.Transit
|
|
self.AutodriveWorking = false
|
|
elseif self.State74 == 5 then
|
|
self:SetState(76)
|
|
elseif self.State74 == 6 then
|
|
if Metrostroi.EndStations[self.Line][self.Train.UPO.Station] then
|
|
self.LastStation = tostring(self.Train.UPO.Station)
|
|
end
|
|
elseif self.State74 == 7 then
|
|
if Metrostroi.EndStations[self.Line][self.Train.UPO.Station] then
|
|
self.FirstStation = tostring(self.Train.UPO.Station)
|
|
end
|
|
elseif self.State74 == 8 and not self.Arrived then
|
|
self.Arrived = true
|
|
end
|
|
if self.State > 6 and self.State ~= 76 and self.State ~= 77 then self:SetState(7,nil,true) end
|
|
end
|
|
if self.State74 > 6 then
|
|
if name == "B7" then
|
|
if Metrostroi.EndStations[self.Line][self.Train.UPO.Station] then
|
|
self.FirstStation = tostring(self.Train.UPO.Station)
|
|
if self.State > 6 and self.State ~= 76 and self.State ~= 77 then self:SetState(7,nil,true) end
|
|
end
|
|
end
|
|
if name == "B8" and not self.Arrived == nil then
|
|
self.Arrived = true
|
|
if self.State > 6 and self.State ~= 76 and self.State ~= 77 then self:SetState(7,nil,true) end
|
|
end
|
|
elseif self.State74 > 3 then
|
|
if name == "B4" then
|
|
self.Transit = not self.Transit
|
|
self.AutodriveWorking = false
|
|
if self.State > 6 and self.State ~= 76 and self.State ~= 77 then self:SetState(7,nil,true) end
|
|
end
|
|
if name == "B5" then
|
|
self:SetState(76)
|
|
if self.State > 6 and self.State ~= 76 and self.State ~= 77 then self:SetState(7,nil,true) end
|
|
end
|
|
if name == "B6" then
|
|
if Metrostroi.EndStations[self.Line][self.Train.UPO.Station] then
|
|
self.LastStation = tostring(self.Train.UPO.Station)
|
|
if self.State > 6 and self.State ~= 76 and self.State ~= 77 then self:SetState(7,nil,true) end
|
|
end
|
|
end
|
|
else
|
|
if name == "B1" and self.Train.Speed < 0.5 and self.Train.ALS_ARS.SpeedLimit > 20 then
|
|
self:SetState(77)
|
|
if self.State > 6 and self.State ~= 76 and self.State ~= 77 then self:SetState(7,nil,true) end
|
|
end
|
|
if name == "B2" then
|
|
self.KD = not self.KD
|
|
if self.State > 6 and self.State ~= 76 and self.State ~= 77 then self:SetState(7,nil,true) end
|
|
end
|
|
if name == "B3" then
|
|
self:SetState(3)
|
|
if self.State > 6 and self.State ~= 76 and self.State ~= 77 then self:SetState(7,nil,true) end
|
|
end
|
|
end
|
|
elseif self.State == 75 then
|
|
if name == "BUp" then
|
|
self.State75 = math.max(1,self.State75 - 1)
|
|
end
|
|
if name == "BDown" then
|
|
self.State75 = math.min(4,self.State75 + 1)
|
|
end
|
|
if name == "BLeft" then
|
|
self:SetState(7,nil,true)
|
|
end
|
|
if name == "BEnter" then
|
|
self.Train.UPO:II(self.State75)
|
|
self:SetState(7,nil,true)
|
|
end
|
|
local Char = tonumber(name:sub(2,2))
|
|
if Char and Char > 0 and Char < 5 then
|
|
self.Train.UPO:II(Char)
|
|
self:SetState(7,nil,true)
|
|
end
|
|
elseif self.State == 76 then
|
|
if name == "BEnter" then
|
|
self.AutodriveWorking = false
|
|
self.VRD = true
|
|
self:SetState(7,nil,true)
|
|
end
|
|
if name == "BLeft" then
|
|
self:SetState(7,nil,true)
|
|
end
|
|
elseif self.State == 77 then
|
|
if name == "BEnter" then
|
|
if self.Train.Speed < 0.5 and self.Train.ALS_ARS.SpeedLimit > 20 then
|
|
self.AutodriveWorking = false
|
|
self.VRD = false
|
|
self.Nakat = true
|
|
end
|
|
self:SetState(7,nil,true)
|
|
end
|
|
if name == "BLeft" then
|
|
self:SetState(7,nil,true)
|
|
end
|
|
|
|
--[[
|
|
elseif self.State == 74 then
|
|
if name == "BEnter" then
|
|
self.AutodriveWorking = false
|
|
self.UOS = false
|
|
self.VRD = false
|
|
self.Transit = true
|
|
self.Nakat = false
|
|
self.Stancionniy = false
|
|
self:SetState(7,nil,true)
|
|
end
|
|
if name == "BMinus" then
|
|
self:SetState(7,nil,true)
|
|
end
|
|
elseif self.State == 75 then
|
|
if name == "BEnter" then
|
|
self.AutodriveWorking = false
|
|
self.UOS = false
|
|
self.VRD = false
|
|
self.Transit = false
|
|
self.Nakat = true
|
|
self.Stancionniy = false
|
|
self:SetState(7,nil,true)
|
|
end
|
|
if name == "BMinus" then
|
|
self:SetState(7,nil,true)
|
|
end
|
|
elseif self.State == 77 then
|
|
if name == "BEnter" then
|
|
self.AutodriveWorking = false
|
|
self.UOS = false
|
|
self.VRD = false
|
|
self.Transit = false
|
|
self.Nakat = false
|
|
self.Stancionniy = true
|
|
self:SetState(7,nil,true)
|
|
end
|
|
if name == "BMinus" then
|
|
self:SetState(7,nil,true)
|
|
end
|
|
]]
|
|
end
|
|
end
|
|
--[[
|
|
function TRAIN_SYSTEM:PAKSD1()
|
|
surface.SetDrawColor(0,255,127)
|
|
for x = 1,20 do
|
|
for y = 0,3 do
|
|
for x1 = 1,5 do
|
|
for y1 = 1,7 do
|
|
self.Train:DrawCircle(5+x1*2 + x*12,5+y1*2 + y*16,1)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
function TRAIN_SYSTEM:PAKSD2()
|
|
surface.SetDrawColor(0,255,127)
|
|
for i = 0,1 do
|
|
for x = 1,5 do
|
|
for y = 1,7 do
|
|
self.Train:DrawCircle(5+x*2,5+y*2 + i*16,1)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
]]
|
|
|
|
function TRAIN_SYSTEM:SetState(state,state7,noupd)
|
|
local Train = self.Train
|
|
local ARS = Train.ALS_ARS
|
|
local Announcer = Train.Announcer
|
|
if state and self.State ~= state then
|
|
self.State = state
|
|
if noupd then return end
|
|
self:SetTimer()
|
|
if state == -2 then
|
|
self.Train:PlayOnce("paksd","cabin",0.75,200.0)
|
|
end
|
|
if state == 2 then
|
|
self.EnteredPass = ""
|
|
end
|
|
if state == 4 then
|
|
self.Line = self.Train.UPO.Line or 1
|
|
self.RouteNumber = ""
|
|
self.State4Choosed = 1
|
|
if Metrostroi.EndStations[self.Line] then
|
|
self.FirstStation = self.Train.UPO.FirstStation or tostring(self.Train.UPO.Path == 2 and Metrostroi.EndStations[self.Line][#Metrostroi.EndStations[self.Line]] or Metrostroi.EndStations[self.Line][1])
|
|
self.LastStation = self.Train.UPO.LastStation or tostring(self.Train.UPO.Path == 1 and Metrostroi.EndStations[self.Line][#Metrostroi.EndStations[self.Line]] or Metrostroi.EndStations[self.Line][1])
|
|
else
|
|
self.FirstStation = "111"
|
|
self.LastStation = "123"
|
|
end
|
|
self:UpdateUPO()
|
|
end
|
|
if state == 49 then
|
|
self.State4Choosed = 1
|
|
end
|
|
if state == 5 then
|
|
self.Check = nil
|
|
else
|
|
self.Train.ALS_ARS:TriggerInput("Ring",0)
|
|
end
|
|
if state == 7 then
|
|
if not state7 then
|
|
for k,v in pairs(self.Train.WagonList) do
|
|
if v ~= self.Train and v["PA-KSD"] then
|
|
v["PA-KSD"]:SetState(7,true)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
if state == 74 then
|
|
self.State74 = 1
|
|
end
|
|
if state == 75 then
|
|
self.State75 = 1
|
|
end
|
|
end
|
|
end
|
|
|
|
function TRAIN_SYSTEM:GetTimer(val)
|
|
return self.TimerMod and (CurTime() - self.Timer) > val
|
|
end
|
|
function TRAIN_SYSTEM:SetTimer(mod)
|
|
if mod then
|
|
if self.TimerMod == mod then return end
|
|
self.TimerMod = mod
|
|
else
|
|
self.TimerMod = nil
|
|
end
|
|
self.Timer = CurTime()
|
|
end
|
|
|
|
function TRAIN_SYSTEM:Think(dT)
|
|
--print(self.Train.PAKSD_VUD.Value)
|
|
if self.Train.Blok ~= 2 then self:SetState(0) return end
|
|
if self.VPA and self.Train.VPA.Value < 1 and not self.OffTimer then
|
|
self.OffTimer = CurTime() + 1
|
|
self.OnTimer = nil
|
|
end
|
|
if self.Train.VPA.Value == 1 and self.OffTimer then
|
|
self.OffTimer = nil
|
|
self.OnTimer = nil
|
|
end
|
|
if not self.VPA and self.Train.VPA.Value > 1 and not self.OnTimer then
|
|
self.OffTimer = nil
|
|
self.OnTimer = CurTime() + 1
|
|
end
|
|
if self.OnTimer and (CurTime() - self.OnTimer) > 0 then
|
|
for k,v in pairs(self.Train.WagonList) do
|
|
if v["PA-KSD"] then v["PA-KSD"].VPA = true end
|
|
end
|
|
self.OnTimer = nil
|
|
end
|
|
if self.OffTimer and (CurTime() - self.OffTimer) > 0 then
|
|
for k,v in pairs(self.Train.WagonList) do
|
|
if v["PA-KSD"] then v["PA-KSD"].VPA = false end
|
|
end
|
|
self.OffTimer = nil
|
|
end
|
|
if self.Train.VB.Value > 0.5 and self.Train.Battery.Voltage > 55 and self.VPA and self.State >= -1 then
|
|
for k,v in pairs(self.TriggerNames) do
|
|
if self.Train[v] and (self.Train[v].Value > 0.5) ~= self.Triggers[v] then
|
|
if self.Train[v].Value > 0.5 then
|
|
self:Trigger(v)
|
|
self.Train:PlayOnce("paksd","cabin",0.75,160.0)
|
|
end
|
|
--print(v,self.Train[v].Value > 0.5)
|
|
self.Triggers[v] = self.Train[v].Value > 0.5
|
|
end
|
|
end
|
|
end
|
|
--print(self.Train.Owner)
|
|
local ARS = self.Train.ALS_ARS
|
|
local Announcer = self.Train.Announcer
|
|
--self.Train.UPO.Station = self.Train:ReadCell(49160) > 0 and self.Train:ReadCell(49160) or self.Train:ReadCell(49161)
|
|
--self.Train.UPO.Path = Metrostroi.PathConverter[self.Train:ReadCell(65510)] or 0
|
|
--self.Train.UPO.Distance = self.Train:ReadCell(49165) + (self.Train.Autodrive.Corrections[self.Train.UPO.Station] or 0)
|
|
--print(self.Train.VB.Value < 0.5 or self.Train.Battery.Voltage < 55)
|
|
if self.Train.VB.Value < 0.5 or self.Train.Battery.Voltage < 55 or not self.VPA then self:SetState(0) elseif self.State == 0 then self:SetState(-2) end
|
|
--if not ARS.EnableARS and self.State > 6 then self.State = -1 end
|
|
if self.Train.KV.ReverserPosition == 0 and self.State > 6 and self.State ~= 8 then self:SetState(8) end
|
|
if self.Train.KV.ReverserPosition == 0 and self.State > 0 and self.State < 6 and self.State ~= -9 then self:SetState(-9) end
|
|
if self.Train.KV.ReverserPosition ~= 0 and self.State == -9 then self:SetState(1) end
|
|
if self.Train.KV.ReverserPosition ~= 0 and self.State == 8 then
|
|
self:SetState(7,nil,true)
|
|
end
|
|
if self.State == -2 then
|
|
self:SetTimer(0.5)
|
|
if self:GetTimer(5) then
|
|
self.State = -1
|
|
return
|
|
end
|
|
elseif self.State == -1 then
|
|
if self.Train.KV.ReverserPosition == 0 then
|
|
self:SetState(1)
|
|
else
|
|
self:SetState(-9)
|
|
end
|
|
elseif self.State == 5 then
|
|
if self.Check == nil then ARS:TriggerInput("Ring",1) end
|
|
--print(ARS.KVT)
|
|
if ARS.KVT and self.Check == nil then
|
|
self.Check = true
|
|
self:SetTimer(4)
|
|
end
|
|
if not ARS.KVT and self.Check ~= false then
|
|
self.Check = nil
|
|
self:SetTimer()
|
|
end
|
|
if ARS.KVT and self:GetTimer(1) then
|
|
self.Check = false
|
|
ARS:TriggerInput("Ring",0)
|
|
self:SetTimer()
|
|
end
|
|
elseif self.State > 6 and self.State ~= 8 and self.State ~= 49 and self.State ~= 45 and self.State ~= 48 then
|
|
if self.VRD and (not ARS.Signal0 or ARS.Signal0 and (ARS.Signal40 or ARS.Signal60 or ARS.Signal70 or ARS.Signal80)) then self.VRD = false end
|
|
if self.Train.UPO.Distance > 40 and (self.Train.UPO.Distance) < (160+35*self.Train.Autodrive.MU - (ARS.SpeedLimit == 40 and 30 or 0)) then
|
|
self.Train.UPO.StationAutodrive = true
|
|
end
|
|
if (self.Train.UPO:GetSTNum(self.LastStation) > self.Train.UPO:GetSTNum(self.FirstStation) and self.Train.UPO.Path == 2) or (self.Train.UPO:GetSTNum(self.FirstStation) > self.Train.UPO:GetSTNum(self.LastStation) and self.Train.UPO.Path == 1) then
|
|
local old = self.LastStation
|
|
self.LastStation = self.FirstStation
|
|
self.FirstStation = old
|
|
self:UpdateUPO()
|
|
end
|
|
self.State7 = (self.Train.UPO:End(self.Train.UPO.Station,self.Train.UPO.Path,true) or self.Train.UPO:GetSTNum(self.LastStation) > self.Train.UPO:GetSTNum(self.Train.UPO.Station) and self.Train.UPO.Path == 2 or self.Train.UPO:GetSTNum(self.Train.UPO.Station) < self.Train.UPO:GetSTNum(self.FirstStation) and self.Train.UPO.Path == 1) and 0 or self.Arrived ~= nil and 1 or 2
|
|
if self.State7 ~= 0 then
|
|
if (self.RealState == 8 or self.RealState == 6 or self.RealState == 49) and not self.Transit then
|
|
if self.Train.UPO.Distance < 75 and not self.Arrived and Metrostroi.WorkingStations[self.Line][self.Train.UPO.Station] and ARS.Speed <= 1 then
|
|
self.Arrived = true
|
|
end
|
|
end
|
|
if not self.Transit and 45 < self.Train.UPO.Distance and self.Train.UPO.Distance < 75 and not self.Arrived and Metrostroi.WorkingStations[self.Line][self.Train.UPO.Station] then
|
|
self.Arrived = true
|
|
end
|
|
if self.Transit then self.Arrived = nil end
|
|
if self.Train.UPO.Distance > 75 then
|
|
self.Arrived = nil
|
|
else
|
|
--if self.Train.Panel.SD < 0.5 then self.Arrived = true end
|
|
end
|
|
if self.Arrived then
|
|
if self.Train.UPO.BoardTime and math.floor((self.Train.UPO.BoardTime or CurTime()) - CurTime()) < (self.Train.Horlift and 15 or 8) and self.Arrived then
|
|
self.Arrived = false
|
|
end
|
|
end
|
|
if self.Nakat then
|
|
if not self.Meters then self.Meters = 0 end
|
|
self.Meters = self.Meters + ARS.Speed*self.Train.SpeedSign/3600*1000*dT
|
|
if math.abs(self.Meters) > 2.5 then
|
|
self.Nakat = false
|
|
if self.Train:ReadTrainWire(1) < 1 then
|
|
ARS.Nakat = true
|
|
end
|
|
end
|
|
else
|
|
self.Meters = nil
|
|
end
|
|
end
|
|
end
|
|
if self.State ~= self.RealState then
|
|
self.RealState = self.State
|
|
self.TimeOverride = true
|
|
end
|
|
|
|
self.Time = self.Time or CurTime()
|
|
if (CurTime() - self.Time) > 0.1 or self.TimeOverride then
|
|
self.TimeOverride = nil
|
|
--print(1)
|
|
self.Time = CurTime()
|
|
--if self.STR1 ~= self.STR1Real then
|
|
--self.Train:SetNW2String("PAKSD1",self.STR1)
|
|
--self.STR1 = self.STR1Real
|
|
--end
|
|
--if self.STR2 ~= self.STR2Real then
|
|
--self.Train:SetNW2String("PAKSD2",self.STR2)
|
|
--self.STR2 = self.STR2Real
|
|
--end
|
|
--self.Train:SetNW2String("PAKSD2","V+= 59 VD= 70 self.Train.UPO.Distance= 307\nKB=T1 Tx= -2c")
|
|
self.Train:SetNW2Int("PAKSD:State",self.State)
|
|
if self.State == 2 then self.Train:SetNW2Int("PAKSD:Pass",self.EnteredPass ~= "/" and #self.EnteredPass or -1)
|
|
elseif self.State == 3 then self.Train:SetNW2Bool("PAKSD:Restart",self.FirstStation ~= "" and self.LastStation ~= "")
|
|
elseif self.State == 4 then
|
|
self.Train:SetNW2Int("PAKSD:State4",self.State4Choosed)
|
|
if self.State4Choosed < 4 then
|
|
self.Train:SetNW2Int("PAKSD:FirstStation",tonumber(self.FirstStation) or -1)
|
|
self.Train:SetNW2Int("PAKSD:LastStation",tonumber(self.LastStation) or -1)
|
|
self.Train:SetNW2Int("PAKSD:Line",self.Line)
|
|
else
|
|
self.Train:SetNW2Int("PAKSD:RouteNumber",tonumber(self.RouteNumber ~= "" and self.RouteNumber or -1))
|
|
end
|
|
elseif self.State == 49 then
|
|
self.Train:SetNW2Int("PAKSD:State4",self.State4Choosed)
|
|
self.Train:SetNW2Int("PAKSD:LastStation",tonumber(self.LastStation) or -1)
|
|
self.Train:SetNW2Int("PAKSD:Line",self.Line)
|
|
self.Train:SetNW2Int("PAKSD:RouteNumber",tonumber(self.RouteNumber ~= "" and self.RouteNumber or -1))
|
|
elseif self.State == 7 then
|
|
self.Train:SetNW2Int("PAKSD:LastStation",tonumber(self.LastStation))
|
|
self.Train:SetNW2Int("PAKSD:State7",self.State7)
|
|
self.Train:SetNW2Int("PAKSD:Nakat",self.Nakat)
|
|
self.Train:SetNW2Bool("PAKSD:VRD",self.VRD)
|
|
self.Train:SetNW2Bool("PAKSD:Transit",self.Transit)
|
|
self.Train:SetNW2Int("PAKSD:Station",self.Train.UPO.Station)
|
|
self.Train:SetNW2Int("PAKSD:Distance",self.Train.UPO.Distance)
|
|
self.Train:SetNW2Int("PAKSD:Type",(self.Train.Pneumatic.EmergencyValveEPK and 0 or self.Train.ALS_ARS.UAVAContacts and 4 or self.UOS and 5 or self.VRD and 2 or (self.Train.AutodriveEnabled or self.Train.UPO.StationAutodrive) and 1 or 3))
|
|
self.Train:SetNW2Int("PAKSD:PPT",math.Clamp(math.floor(self.Train.PositionSwitch.Position + 0.5),1,3))
|
|
self.Train:SetNW2Int("PAKSD:RK",math.floor(self.Train.RheostatController.Position+0.5))
|
|
self.Train:SetNW2Int("PAKSD:KV",self.Train.Autodrive.AutodriveEnabled and (self.Rotating and -3 or self.Brake and -1 or self.Accelerate and 3 or 0) or (ARS["33G"] > 0 or (self.UOS and (ARS["8"] + (1-self.Train.RPB.Value)) > 0)) and 5 or self.Train.KV.RealControllerPosition)
|
|
self.Train:SetNW2Bool("PAKSD:VZ1", self.Train:ReadTrainWire(29) > 0)
|
|
self.Train:SetNW2Bool("PAKSD:VZ2", self.Train.PneumaticNo2.Value > 0)
|
|
self.Train:SetNW2Bool("PAKSD:UOS", self.UOS)
|
|
|
|
--self.Train:SetNW2Int("PAKSD:ARS",ARS.Signal80 and 80 or ARS.Signal70 and 70 or ARS.Signal60 and 60 or ARS.Signal40 and 40 or ARS.Signal0 and 0 or -1)
|
|
--local speed = tostring(math.floor(ARS.Speed))
|
|
|
|
if self.State7 == 1 then
|
|
self.Train:SetNW2Int("PAKSD:BoardTime",math.floor((self.Train.UPO.BoardTime or CurTime()) - CurTime()))
|
|
self.Train:SetNW2Int("PAKSD:Path",self.Train.UPO.Path)
|
|
elseif self.State7 == 2 then
|
|
self.Train:SetNW2String("PAKSD:SName",ARS.Signal and ARS.Signal.RealName or "ERR")
|
|
end
|
|
if self.Nakat then
|
|
self.Train:SetNW2Float("PAKSD:Meters",math.Round(math.abs(self.Meters or 0),1))
|
|
self.Train:SetNW2Bool("PAKSD:Sign",ARS.Speed > 0.5 and self.Train.SpeedSign < 0)
|
|
end
|
|
elseif self.State == 74 then
|
|
self.Train:SetNW2Int("PAKSD:State74",self.State74)
|
|
self.Train:SetNW2Bool("PAKSD:KD",self.KD)
|
|
self.Train:SetNW2Bool("PAKSD:Transit",self.Transit)
|
|
elseif self.State == 75 then
|
|
self.Train:SetNW2Int("PAKSD:State75",self.State75)
|
|
elseif self.State == 8 then
|
|
self.Train:SetNW2Bool("PAKSD:VRD",self.VRD)
|
|
self.AutodriveWorking = false
|
|
self.UOS = false
|
|
self.VRD = false
|
|
self.Transit = false
|
|
self.Nakat = false
|
|
self.Stancionniy = false
|
|
end
|
|
end
|
|
if self.Train.VZP.Value > 0.5 and self.AutodriveWorking then
|
|
self.Train.Autodrive:Enable()
|
|
end
|
|
self.RouteNumber = string.gsub(self.Train.RouteNumber or "","^(0+)","")
|
|
if self.State > 4 and self.State ~= 49 then
|
|
self.Line = self.Train.UPO.Line
|
|
self.FirstStation = tostring(self.Train.UPO.FirstStation or "")
|
|
self.LastStation = tostring(self.Train.UPO.LastStation or "")
|
|
end
|
|
end
|