1
0
mirror of https://github.com/metrostroi-repo/MetrostroiAddon.git synced 2026-05-02 00:42:29 +00:00
Files
MetrostroiAddon/lua/metrostroi/systems/sys_81_71_asnp.lua
2022-07-12 00:28:18 +03:00

850 lines
34 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
--------------------------------------------------------------------------------
-- ASNP announcer and announcer-related code for 81-70*/81-71* trains
--------------------------------------------------------------------------------
-- Copyright (C) 2013-2018 Metrostroi Team & FoxWorks Aerospace s.r.o.
-- Contains proprietary code. See license.txt for additional information.
--------------------------------------------------------------------------------
Metrostroi.DefineSystem("81_71_ASNP")
TRAIN_SYSTEM.DontAccelerateSimulation = true
function TRAIN_SYSTEM:Initialize()
self.LineOut = 0
self.TriggerNames = {
"R_ASNPMenu",
"R_ASNPUp",
"R_ASNPDown",
"R_ASNPOn",
"R_Program1",
"R_Program2",
"R_Program1H",
"R_Program2H",
"R_ASNPPath",
"R_Radio"
--R_Announcer
--R_Line
}
self.Triggers = {}
self.State = 0
self.Line = 1
self.Path = false
self.Station = 1
self.Arrived = true
self.RouteNumber = 0
self.Line = 1
if not self.Train.R_ASNPOn then
self.Train:LoadSystem("R_ASNPOn","Relay","Switch",{ normally_closed = true, bass = true })
self.Train:LoadSystem("R_ASNPMenu","Relay","Switch",{bass = true })
self.Train:LoadSystem("R_ASNPUp","Relay","Switch",{bass = true })
self.Train:LoadSystem("R_ASNPDown","Relay","Switch",{bass = true })
self.Train:LoadSystem("R_ASNPPath","Relay","Switch",{normally_closed = false, bass = true })
end
self.K1 = 0
self.K2 = 0
--self.Train:LoadSystem("R_Program1","Relay","Switch",{bass = true })
--self.Train:LoadSystem("R_Program2","Relay","Switch",{bass = true })
end
if TURBOSTROI then return end
function TRAIN_SYSTEM:Inputs()
return {"Disable"}
end
function TRAIN_SYSTEM:Outputs()
return {"K1","K2","LineOut"}
end
function TRAIN_SYSTEM:TriggerInput(name,value)
if name == "Disable" then
self.Disable = value>0
if self.Disable then self:Initialize() end
end
end
if CLIENT then
local function createFont(name,font,size)
surface.CreateFont("Metrostroi_"..name, {
font = font,
size = size,
weight = 500,
blursize = false,
antialias = true,
underline = false,
italic = false,
strikeout = false,
symbol = false,
rotary = false,
shadow = false,
additive = false,
outline = false,
extended = true,
scanlines = false,
})
end
createFont("ASNP","Liquid Crystal Display",30,400)
function TRAIN_SYSTEM:ClientThink()
if not self.Train:ShouldDrawPanel("ASNPScreen") then return end
--RunConsoleCommand("say","президент!!!")
if not self.DrawTimer then
render.PushRenderTarget(self.Train.ASNP,0,0,512, 128)
render.Clear(0, 0, 0, 0)
render.PopRenderTarget()
end
if self.DrawTimer and CurTime()-self.DrawTimer < 0.1 then return end
self.DrawTimer = CurTime()
render.PushRenderTarget(self.Train.ASNP,0,0,512, 128)
--render.Clear(0, 0, 0, 0)
cam.Start2D()
self:ASNPScreen(self.Train)
cam.End2D()
render.PopRenderTarget()
end
function TRAIN_SYSTEM:PrintText(x,y,text,inverse)
if text == "II" then
self:PrintText(x-0.2,y,"I",inverse)
self:PrintText(x+0.2,y,"I",inverse)
return
end
local str = {utf8.codepoint(text,1,-1)}
for i=1,#str do
local char = utf8.char(str[i])
if inverse then
draw.SimpleText(string.char(0x7f),"Metrostroi_ASNP",(x+i)*20.5+5,y*40+40,Color(0,0,0),TEXT_ALIGN_CENTER,TEXT_ALIGN_CENTER)
draw.SimpleText(char,"Metrostroi_ASNP",(x+i)*20.5+5,y*40+40,Color(140,190,0,150),TEXT_ALIGN_CENTER,TEXT_ALIGN_CENTER)
else
draw.SimpleText(char,"Metrostroi_ASNP",(x+i)*20.5+5,y*40+40,Color(0,0,0),TEXT_ALIGN_CENTER,TEXT_ALIGN_CENTER)
end
end
end
TRAIN_SYSTEM.LoadSeq = "/-\\|"
function TRAIN_SYSTEM:ASNPScreen(Train)
local State = self.Train:GetNW2Int("ASNP:State",-1)
if State ~= 0 then
surface.SetDrawColor(140,190,0,self.Warm and 130 or 255)
self.Warm = true
else
surface.SetDrawColor(20,50,0,230)
self.Warm = false
end
surface.DrawRect(0,0,512,128)
if State == 0 then
return
end
if State == -2 then
self:PrintText(0,0,"Map not supported")
self:PrintText(0,1,"Карта не поддерживается")
return
end
if State == 1 then
self:PrintText(0,0,"Нажмите \"MENU\"")
self:PrintText(0 ,1,"для начала настройки")
end
if State > 1 and not Metrostroi.ASNPSetup then
self:PrintText(0,0,"Client error")
self:PrintText(0,1,"No announcer at client")
return
end
if State == 2 then
local RouteNumber = Format("%2d",Train:GetNW2Int("ASNP:RouteNumber",0))
local sel = Train:GetNW2Int("ASNP:Selected",0)
self:PrintText(0,0,"Выбор N маршрута")
self:PrintText(0,1,RouteNumber)
end
local stbl = Metrostroi.ASNPSetup and Metrostroi.ASNPSetup[Train:GetNW2Int("Announcer",1)]
if State > 2 and not stbl then
self:PrintText(0,0,"Client error")
self:PrintText(0,1,"No line at client")
return
end
if State == 3 then
local Line = self.Train:GetNW2Int("ASNP:Line",1)
local ltbl = stbl[Line]
local St,En = ltbl[1],ltbl[#ltbl]
self:PrintText(0,0,ltbl.Loop and "Выбор линии (кол)" or "Выбор линии -")
-- self:PrintText(20,0,"-")
-- if RealTime()%0.8 > 0.4 then
-- self:PrintText(17,0,Format("%03d",St[1]))
-- self:PrintText(21,0,Format("%03d",En[1]))
-- end
-- local timer = math.ceil(RealTime()%6/1.5)
self:PrintText(0,1,(ltbl.Name or "Нет названия"))
-- if timer == 1 then self:PrintText(0,1,(ltbl.Name or "Нет названия"))
-- elseif timer == 2 then self:PrintText(0,1,"От:") self:PrintText(3,1,St[2])
-- elseif timer == 3 then self:PrintText(0,1,"До:") self:PrintText(3,1,En[2])
-- elseif timer == 4 then self:PrintText(0,1,"\"+-\" выбор \"MENU\" ввод") end
end
if State == 4 then
local Line = Train:GetNW2Int("ASNP:Line",1)
local ltbl = stbl[Line]
if ltbl.Loop then
local Path = Train:GetNW2Bool("ASNP:Path")
self:PrintText(0,0,"Выбор пути")
self:PrintText(0,1,Path and "II" or "I")
else
local St = ltbl[Train:GetNW2Int("ASNP:Station",1)]
self:PrintText(0,0,"Текущая станция -")
self:PrintText(0,1,St[2])
end
end
if State == 5 then
local Line = Train:GetNW2Int("ASNP:Line",1)
local ltbl = stbl[Line]
if ltbl.Loop then
local station = Train:GetNW2Int("ASNP:LastStation",1)
local En = ltbl[station]
self:PrintText(0,0,"Выбор ст. оборота -")
if station == 0 then
self:PrintText(0,1,"Кольцевой")
else
self:PrintText(0,1,En[2])
end
-- self:PrintText(20,0,"-")
-- if RealTime()%0.8 > 0.4 then
-- if En then
-- self:PrintText(21,0,Format("%03d",En[1]))
-- else
-- self:PrintText(22,0,Path)
-- end
-- end
else
local St = ltbl[Train:GetNW2Int("ASNP:FirstStation",1)]
local En = ltbl[Train:GetNW2Int("ASNP:LastStation",1)]
self:PrintText(0,0,"Выбор ст. оборота -")
self:PrintText(0,1,En[2])
-- self:PrintText(20,0,"-")
-- self:PrintText(17,0,Format("%03d",St[1]))
-- if RealTime()%0.8 > 0.4 then
-- self:PrintText(21,0,Format("%03d",En[1]))
-- end
end
end
if State == 6 then
local Line = Train:GetNW2Int("ASNP:Line",1)
local ltbl = stbl[Line]
local Arrived = Train:GetNW2Bool("ASNP:Arrived")
self:PrintText(0,0,"Выбор приб / отпр")
self:PrintText(0,1,Arrived and "Отпр." or "Приб.")
end
if State == 7 then
if Train:GetNW2Bool("ASNP:StopMessage",false) then
self:PrintText(3,0,"ПЕРЕД ОТПРАВЛЕНИЕМ")
self:PrintText(0,1,"НАЖМИ КНОПКУ ОБЪЯВИТЬ")
return
end
local Line = Train:GetNW2Int("ASNP:Line",1)
local ltbl = stbl[Line]
local Path = Train:GetNW2Bool("ASNP:Path")
local St = ltbl[Train:GetNW2Int("ASNP:FirstStation",1)]
local En
if Path and not ltbl.Loop then
En = ltbl[Train:GetNW2Int("ASNP:FirstStation",1)]
else
En = ltbl[Train:GetNW2Int("ASNP:LastStation",1)]
end
local Station = ltbl[Train:GetNW2Int("ASNP:Station",1)]
if not Station then return end
local Dep = self.Train:GetNW2Bool("ASNP:Arrived",false)
if Dep then self:PrintText(0,0,"Отпр.") else self:PrintText(0,0,"Приб.") end
self:PrintText(6,0,Station[2])
if Train:GetNW2Bool("ASNP:Playing",false) then
self:PrintText(0,1,"<<< ИДЕТ ОБЪЯВЛЕНИЕ >>>")
--elseif Station == En then
-- self:PrintText(0,1,"<<< КОНЕЧАЯ >>>")
else
--self:PrintText(0,1,string.rep("I",Path and 2 or 1))
local findE = Train.SubwayTrain.Type=="E"
if not findE and Path then
self:PrintText(-0.2,1,"I")
self:PrintText( 0.2,1,"I")
elseif not findE then
self:PrintText(0,1,"I")
end
self:PrintText(findE and 0 or 2,1,string.format("%2d",Train:GetNW2Int("ASNP:RouteNumber",0)))
if ltbl.Loop and Train:GetNW2Int("ASNP:LastStation",1) == 0 then
self:PrintText(6,1,"Кольцевой")
else
self:PrintText(6,1,En[2]:upper())
end
if Train:GetNW2Bool("ASNP:CanLocked",false) then
if Train:GetNW2Bool("ASNP:LockedL",false) then self:PrintText(20,0,"Бл.Л") end
if Train:GetNW2Bool("ASNP:LockedR",false) then self:PrintText(20,1,"Бл.П") end
end
end
end
end
return
end
function TRAIN_SYSTEM:Zero()
self.Station = self.Path and self.LastStation or self.FirstStation
self.Arrived = true
self:UpdateBoards()
end
function TRAIN_SYSTEM:Next()
local tbl = Metrostroi.ASNPSetup[self.Train:GetNW2Int("Announcer",1)][self.Line]
if tbl.Loop then
if self.Arrived then
if self.Path then
self.Station = self.Station - 1
else
self.Station = self.Station + 1
end
if self.Station == 0 or self.Station > #tbl then
self.Station = self.Station == 0 and #tbl or 1
end
if self.Station == 0 or self.Station > #tbl then
self.Station = self.Station == 0 and (self.LastStation > 0 and self.LastStation or #tbl) or 1
end
self.Arrived = false
--self.Station = 1
else
self.Arrived = true
end
else
if self.Arrived then
if self.Station ~= (self.Path and self.FirstStation or self.LastStation) then
if self.Path then
self.Station = math.max(self.FirstStation,self.Station - 1)
else
self.Station = math.min(self.LastStation,self.Station + 1)
end
self.Arrived = false
end
else
self.Arrived = true
end
end
self:UpdateBoards()
end
function TRAIN_SYSTEM:Prev()
local tbl = Metrostroi.ASNPSetup[self.Train:GetNW2Int("Announcer",1)][self.Line]
if tbl.Loop then
if not self.Arrived then
if self.Path then
self.Station = self.Station + 1
else
self.Station = self.Station - 1
end
if self.Station == 0 or self.Station > #tbl then
self.Station = self.Station == 0 and (self.LastStation > 0 and self.LastStation or #tbl) or 1
end
--self.Station = 1
self.Arrived = true
else
self.Arrived = false
end
else
if not self.Arrived then
if self.Path then
self.Station = math.min(self.LastStation,self.Station + 1)
else
self.Station = math.max(self.FirstStation,self.Station - 1)
end
self.Arrived = true
else
if self.Station ~= (self.Path and self.LastStation or self.FirstStation) then
self.Arrived = false
end
end
end
self:UpdateBoards()
end
function TRAIN_SYSTEM:AnnQueue(msg)
local Announcer = self.Train.Announcer
if msg and type(msg) ~= "table" then
Announcer:Queue{msg}
else
Announcer:Queue(msg)
end
end
function TRAIN_SYSTEM:Play(dep,not_last)
local message
local tbl = Metrostroi.ASNPSetup[self.Train:GetNW2Int("Announcer",1)][self.Line]
local stbl = tbl[self.Station]
local last,lastst
local path = self.Path and 2 or 1
if tbl.Loop then
last = self.LastStation
lastst = not dep and self.LastStation > 0 and self.Station == last and tbl[last].arrlast
else
last = self.Path and self.FirstStation or self.LastStation
lastst = not dep and self.Station == last and tbl[last].arrlast
end
if dep then
message = stbl.dep[path]
else
if lastst then
message = stbl.arrlast[path]
else
message = stbl.arr[path]
end
end
self:AnnQueue{"click1","buzz_start"}
if lastst and not stbl.ignorelast then self:AnnQueue(-1) end
self:AnnQueue(message)
--local stbl = Metrostroi.ASNPSetup[self.Train:GetNW2Int("Announcer",1)][self.Line][self.Station]
if self.LastStation > 0 and not dep and self.Station ~= last and tbl[last].not_last and (stbl.have_interchange or math.abs(last-self.Station) <= 3) then
local ltbl = tbl[last]
if stbl.not_last_c then
local patt = stbl.not_last_c[path]
self:AnnQueue(ltbl[patt] or ltbl.not_last)
else
self:AnnQueue(ltbl.not_last)
end
end
self:AnnQueue{"buzz_end","click2"}
self:UpdateBoards()
end
function TRAIN_SYSTEM:CANReceive(source,sourceid,target,targetid,textdata,numdata)
if sourceid == self.Train:GetWagonNumber() then return end
if textdata == "RouteNumber" then self.RouteNumber = numdata end
if textdata == "Path" then self.Path = numdata > 0 end
if textdata == "Line" then self.Line = numdata end
if textdata == "FirstStation" then self.FirstStation = numdata end
if textdata == "LastStation" then self.LastStation = numdata end
if textdata == "Activate" then
local tbl = Metrostroi.ASNPSetup[self.Train:GetNW2Int("Announcer",1)][self.Line]
self.Station = tbl.Loop and 1 or self.Path and self.LastStation or self.FirstStation
self.Arrived = true
self.State = 7
--[[local last = self.Path and not tbl.Loop and self.FirstStation or self.LastStation
local lastst = tbl[last] and tbl[last][1]
if lastst then self.Train:SetNW2Int("LastStation",lastst) end
self.Train:SetNW2Int("RouteNumber",self.RouteNumber)]]
end
end
function TRAIN_SYSTEM:SyncASNP()
--[[ local tbl = Metrostroi.ASNPSetup[self.Train:GetNW2Int("Announcer",1)][self.Line]
local last = self.Path and self.FirstStation or self.LastStation
local lastst = tbl[last] and tbl[last][1]
if lastst then self.Train:SetNW2Int("LastStation",lastst) end
self.Train:SetNW2Int("RouteNumber",self.RouteNumber)]]
self.Train:CANWrite("ASNP",self.Train:GetWagonNumber(),"ASNP",nil,"RouteNumber",self.RouteNumber)
self.Train:CANWrite("ASNP",self.Train:GetWagonNumber(),"ASNP",nil,"Path",self.Path and 0 or 1)
self.Train:CANWrite("ASNP",self.Train:GetWagonNumber(),"ASNP",nil,"Line",self.Line)
self.Train:CANWrite("ASNP",self.Train:GetWagonNumber(),"ASNP",nil,"FirstStation",self.FirstStation)
self.Train:CANWrite("ASNP",self.Train:GetWagonNumber(),"ASNP",nil,"LastStation",self.LastStation)
self.Train:CANWrite("ASNP",self.Train:GetWagonNumber(),"ASNP",nil,"Activate")
end
function TRAIN_SYSTEM:UpdateBoards()
if not self.PassSchemeWork then return end
local tbl = Metrostroi.ASNPSetup[self.Train:GetNW2Int("Announcer",1)][self.Line]
local stbl = tbl.LED
local last = self.Path and self.FirstStation or self.LastStation
local curr = 0
if self.Path then
for i=#stbl,self.Station+1,-1 do
if stbl[i] then
curr = curr + stbl[i]
end
end
else
for i=1,self.Station-1 do
if stbl[i] then
curr = curr + stbl[i]
end
end
end
local nxt = 0
if self.Arrived then
curr = curr + stbl[self.Station]
else
nxt = stbl[self.Station]
end
self.Train:CANWrite("ASNP",self.Train:GetWagonNumber(),"PassSchemes",nil,"Current",curr)
self.Train:CANWrite("ASNP",self.Train:GetWagonNumber(),"PassSchemes",nil,"Arrival",nxt)
self.Train:CANWrite("ASNP",self.Train:GetWagonNumber(),"PassSchemes",nil,"Path",self.Path)
self.Train:CANWrite("ASNP",self.Train:GetWagonNumber(),"Tickers",nil,"Next",not self.Arrived)
self.Train:CANWrite("ASNP",self.Train:GetWagonNumber(),"Tickers",nil,"Curr",tbl[self.Station][2])
self.Train:CANWrite("ASNP",self.Train:GetWagonNumber(),"Tickers",nil,"Last",tbl[last] and tbl[last].not_last and tbl[last][2])
end
function TRAIN_SYSTEM:Trigger(name,value)
local tbl = Metrostroi.ASNPSetup[self.Train:GetNW2Int("Announcer",1)]
if name=="R_ASNPPath" then
self.Train.Announcer:Reset()
self.Path = value
self.Arrived = true
self.FirstStation = 1
self.LastStation = self.Path and 1 or #tbl[self.Line]
self.Station = self.Path and #tbl[self.Line] or 1
self.PlayNextArmed = false
return
end
if name:find("R_ASNP") then
self.TriggerButton = value and false or name
self.TriggerButtonTime = value and false or CurTime()
end
if (not self.Train.R_Radio or self.Train.R_Radio.Value>0) and (name == "R_Program2" or name == "R_Program2H") and value and self.LineOut==0 then
if self.State ~= 7 and tbl[self.Line] and tbl[self.Line].spec_last then
self:AnnQueue{"click1","buzz_start"}
self:AnnQueue(-1)
self:AnnQueue(tbl[self.Line].spec_last)
self:AnnQueue{"buzz_end","click2"}
elseif self.State == 7 then
local ltbl = Metrostroi.ASNPSetup[self.Train:GetNW2Int("Announcer",1)][self.Line]
local stbl = ltbl[self.Station]
local last,lastst
if self.Arrived then
if tbl.Loop then
ltbl = self.LastStation
lastst = self.LastStation > 0 and self.Station == last and ltbl[last].arrlast
else
last = self.Path and self.FirstStation or self.LastStation
lastst = self.Station == last and ltbl[last].arrlast
end
end
if self.LineOut>0 then self:AnnQueue{-2,"buzz_end","click2"} end
if lastst and not ltbl[last].ignorelast then
self:AnnQueue{"click1","buzz_start"}
self:AnnQueue(-1)
if stbl.spec_last_c then
local patt = stbl.spec_last_c[self.Path and 2 or 1]
self:AnnQueue(ltbl[patt] or ltbl.spec_last)
else
self:AnnQueue(ltbl.spec_last)
end
self:AnnQueue{"buzz_end","click2"}
else
self.StopMessage = not self.StopMessage
self:AnnQueue{"click1","buzz_start"}
if stbl.spec_wait_c then
local patt = stbl.spec_wait_c[self.Path and 2 or 1]
self:AnnQueue((ltbl[patt] or ltbl.spec_wait)[self.StopMessage and 1 or 2])
else
self:AnnQueue(ltbl.spec_wait[self.StopMessage and 1 or 2])
end
self:AnnQueue{"buzz_end","click2"}
end
end
end
if name == "R_Radio" and not value and self.LineOut>0 then
self.Train.Announcer:Reset()
self.PlayNextArmed = false
return
end
if self.State == 1 and name == "R_ASNPMenu" and value then
self.State = 2
-- self.Selected = 0
elseif self.State == 2 and value then
local stbl = Metrostroi.ASNPSetup[self.Train:GetNW2Int("Announcer",1)]
if name == "R_ASNPMenu" then
self.State = #stbl>1 and 3 or 4
end
if (name == "R_ASNPUp" or name == "R_ASNPDown") then
local num = Format("%02d",self.RouteNumber)
if name == "R_ASNPUp" then self.RouteNumber = tonumber(self.RouteNumber)>=99 and 99 or self.RouteNumber+1 end
if name == "R_ASNPDown" then self.RouteNumber = tonumber(self.RouteNumber)<=0 and 0 or self.RouteNumber-1 end
end
if (name == "R_ASNPUp" or name == "R_ASNPDown") and self.Selected == 2 then self.Selected = 0 end
elseif self.State == 3 and value then
local stbl = Metrostroi.ASNPSetup[self.Train:GetNW2Int("Announcer",1)]
if name == "R_ASNPDown" and value then
self.Line =self.Line + 1
if self.Line > #tbl then self.Line = 1 end
end
if name == "R_ASNPUp" and value then
self.Line = math.max(1,self.Line - 1)
if self.Line < 1 then self.Line = #tbl end
end
if name == "R_ASNPMenu" and value then
if not tbl[self.Line].Loop then
self.FirstStation = 1
end
self.State = 4
end
elseif self.State == 4 and value and not tbl[self.Line].Loop then --Не кольцевой
local stbl = Metrostroi.ASNPSetup[self.Train:GetNW2Int("Announcer",1)][self.Line]
if name == "R_ASNPDown" then
self.Station = math.min(#stbl,self.Station+1)
end
if name == "R_ASNPUp" then
self.Station = math.max(1,self.Station-1)
end
if name == "R_ASNPMenu" then
self.State = 5
-- self.LastStation = 1
-- while stbl[self.LastStation] and not stbl[self.LastStation].arrlast or self.LastStation == self.Station do
-- self.LastStation = self.LastStation - 1
-- if self.LastStation < 1 then self.LastStation = #stbl end
-- end
self.FirstStation = self.Path and #stbl or 1
end
elseif self.State == 4 and value and tbl[self.Line].Loop then --Кольцевой
if name == "R_ASNPDown" or name == "R_ASNPUp" then
self.Path = not self.Path
end
if name == "R_ASNPMenu" then
self.LastStation = 0
self.FirstStation = 0
self.State = 5
end
elseif self.State == 5 and value and not tbl[self.Line].Loop then --Не кольцевой
local stbl = Metrostroi.ASNPSetup[self.Train:GetNW2Int("Announcer",1)][self.Line]
if name == "R_ASNPDown" then
for i=math.min(#stbl,self.LastStation+1),#stbl do
if i ~= self.Station and stbl[i].arrlast then self.LastStation = i;found=true;break end
end
end
if name == "R_ASNPUp" then
for i=math.max(1,self.LastStation-1),1,-1 do
if i ~= self.Station and stbl[i].arrlast then self.LastStation = i;found=true;break end
end
end
if name == "R_ASNPMenu" then
self.Path = self.Station > self.LastStation
-- self.Station = self.FirstStation
-- if (self.Path and self.Station==#stbl) or (not self.Path and self.Station==1) then
self.AnnounceLast = self.Path and (self.LastStation~=#stbl) or self.LastStation~=1
-- end
if self.Path then
local first = self.LastStation
self.LastStation = self.FirstStation
self.FirstStation = first
end
self.Arrived = true
self.State = 6
end
elseif self.State == 5 and value and tbl[self.Line].Loop then --Кольцевой
local stbl = Metrostroi.ASNPSetup[self.Train:GetNW2Int("Announcer",1)][self.Line]
if name == "R_ASNPDown" then
local found = false
for i=self.LastStation+1,#stbl do
if stbl[i].arrlast then self.LastStation = i;found=true;break end
end
if not found and self.LastStation ~= 0 then
self.LastStation = 0
end
end
if name == "R_ASNPUp" then
local found = false
if self.LastStation == 1 then
self.LastStation = 0
found = true
end
for i=self.LastStation-1,1,-1 do
if stbl[i].arrlast and stbl[i].arrlast[self.Path and 2 or 1] then self.LastStation = i;found=true;break end
end
if not found then
for i=#stbl,1,-1 do
if stbl[i].arrlast and stbl[i].arrlast[self.Path and 2 or 1] then self.LastStation = i;break end
end
end
end
if name == "R_ASNPMenu" then
self.AnnounceLast = self.LastStation>0
self.State = 6
self.Station = 1
self.Arrived = true
end
elseif self.State == 6 and value then
if name == "R_ASNPDown" or name == "R_ASNPUp" then
self.Arrived = not self.Arrived
end
if name == "R_ASNPMenu" then
-- if self.FirstStation ~= 0 then
-- if self.LineOut>0 then self:AnnQueue{-2,"buzz_end","click2"} end
-- if self.Path then
-- self:AnnQueue{"click1","buzz_start","announcer_ready",stbl[self.LastStation].arrlast[3],stbl[self.FirstStation].arrlast[3],"buzz_end","click2"}
-- else
-- self:AnnQueue{"click1","buzz_start","announcer_ready",stbl[self.FirstStation].arrlast[3],stbl[self.LastStation].arrlast[3],"buzz_end","click2"}
-- end
-- end
self.State = 7
self:UpdateBoards()
self:SyncASNP()
self.StopMessage = false
end
elseif self.State == 7 then
local stbl = Metrostroi.ASNPSetup[self.Train:GetNW2Int("Announcer",1)][self.Line]
-- if name == "R_ASNPMenu" and value then self.ReturnTimer = CurTime() end
-- if name == "R_ASNPMenu" and not value and self.ReturnTimer and self.ReturnTimer - CurTime() < 0.0 then
-- self.ReturnTimer = nil
-- end
if name == "R_ASNPMenu" and value and self.LineOut==0 then
self.State = 2
self.PlayNextArmed = false
self.AnnounceLast = false
end
-- if name == "R_ASNPDown" and value then self:Next() end
-- if name == "R_ASNPUp" and value then self:Prev() end
if (name == "R_Program1" or name == "R_Program1H") and value and (not self.Train.R_Radio or self.Train.R_Radio.Value>0) and self.LineOut==0 then
if self.Arrived and self.Station == (self.Path and self.FirstStation or self.LastStation) then
-- self:Zero()
return
end
self.StopMessage = false
if self.AnnounceLast then
self.AnnounceLast = false
local last = stbl.Loop and self.LastStation or self.Path and self.FirstStation or self.LastStation
local ltbl = stbl[last]
local ltbl_station = stbl[self.Station]
if ltbl_station.not_last_c and ltbl_station.not_last_c[self.Path and 2 or 1] then
self:AnnQueue{"click1","buzz_start"}
self:AnnQueue(ltbl[ltbl_station.not_last_c[self.Path and 2 or 1]] or ltbl.not_last)
self:AnnQueue{"buzz_end","click2"}
return
elseif ltbl.not_last then
self:AnnQueue{"click1","buzz_start"}
self:AnnQueue(ltbl.not_last)
self:AnnQueue{"buzz_end","click2"}
return
end
end
self:Play(self.Arrived)
self.StopMessage = false
self.PlayNextArmed = true
end
end
end
--States:
-- -2 - Loaded in another cab
-- -1 - Starting up
--nil - First setUp and get settings from last
--1 - Welcome Screen
--2 - Route Choose
--3 - Choose start station
--4 - Choose end station
--5 - Choose path
--6 - Choose style of playing
--7 - Normal state
--8 - Confim a settings (on last stations)
function TRAIN_SYSTEM:Think()
if self.Disable then return end
local Train = self.Train
local VV = Train.ASNP_VV
local Power = VV.Power > 0.5
if not Power and self.State ~= 0 then
self.State = 0
self.ASNPTimer = nil
if self.LineOut>0 then self:AnnQueue{-2,"buzz_end","click2"} end
end
if Power and self.State == 0 then
self.State = -1
self.ASNPTimer = CurTime()-math.Rand(-0.3,0.3)
end
if self.State == -1 and self.ASNPTimer and CurTime()-self.ASNPTimer > 1 then
self.State = Metrostroi.ASNPSetup and #Metrostroi.ASNPSetup > 0 and 7 or -2
end
if Power and self.State > -1 then
for k,v in pairs(self.TriggerNames) do
if Train[v] and (Train[v].Value > 0.5) ~= self.Triggers[v] then
self.StateTime = false
self:Trigger(v,Train[v].Value > 0.5)
self.Triggers[v] = Train[v].Value > 0.5
end
end
end
if (not Metrostroi.ASNPSetup or Metrostroi.ASNPSetup and #Metrostroi.ASNPSetup == 0) and self.State > 0 then
self.State = -2
end
local PSWork = Train.Panel.PassSchemeControl and Train.Panel.PassSchemeControl>0 and self.State==7
if PSWork~=self.PassSchemeWork then
self.PassSchemeWork = PSWork
if self.PassSchemeWork then self:UpdateBoards() end
end
local LineOut = #Train.Announcer.Schedule>0 and 1 or 0
if self.PlayNextArmed and self.LineOut~=LineOut and self.LineOut==1 and LineOut==0 then
self:Next()
end
if self.TriggerButton and CurTime()>self.TriggerButtonTime+0.2 and Train[self.TriggerButton].Value>0 then
self:Trigger(self.TriggerButton,true)
end
-- if self.ReturnTimer and CurTime()-self.ReturnTimer > 0.7 then
-- if self.State == 7 then
-- self.State = 6
-- if self.LineOut>0 then self:AnnQueue{-2,"buzz_end","click2"} end
-- end
-- self.ReturnTimer = nil
-- end
Train:SetNW2Int("ASNP:State",self.State)
Train:SetNW2Int("ASNP:RouteNumber",self.RouteNumber)
Train:SetNW2Int("ASNP:Selected",self.Selected)
Train:SetNW2Int("ASNP:Line",self.Line)
Train:SetNW2Int("ASNP:FirstStation",self.FirstStation)
Train:SetNW2Int("ASNP:LastStation",self.LastStation)
Train:SetNW2Bool("ASNP:Path",self.Path)
Train:SetNW2Bool("ASNP:StopMessage",self.StopMessage)
if self.State>1 and self.State~=7 then
self.StateTime = self.StateTime or CurTime()+10
if self.StateTime and CurTime()>self.StateTime then
for i=self.State,6 do
self:Trigger("R_ASNPMenu",true)
end
self.StateTime = false
end
end
Train:SetNW2Bool("ASNP:Station",self.Station)
Train:SetNW2Bool("ASNP:Arrived",self.Arrived)
self.LineOut = LineOut
Train:SetNW2Bool("ASNP:Playing",self.LineOut>0)
if Train.VBD and self.State>0 then
Train:SetNW2Bool("ASNP:CanLocked",true)
if Train.ALSCoil.Speed>1 then
self.K1 = 0
self.K2 = 0
self.StopTimer = nil
else
if self.StopTimer==nil then self.StopTimer = CurTime() end
if self.StopTimer and CurTime()-self.StopTimer >= 10 then
self.StopTimer = false
end
local tbl = Metrostroi.ASNPSetup[self.Train:GetNW2Int("Announcer",1)]
local stbl = tbl[self.Line] and tbl[self.Line][self.Station]
if not stbl or not tbl[self.Line].BlockDoors or self.Arrived or (not self.Arrived and self.PlayNextArmed) and self.Station == (self.Path and self.FirstStation or self.LastStation) then
self.K1 = 1
self.K2 = 1
elseif self.Arrived or (not self.Arrived and self.PlayNextArmed) then
self.K1 = (stbl.both_doors or not stbl.right_doors) and 1 or 0
self.K2 = (stbl.both_doors or stbl.right_doors) and 1 or 0
elseif self.StopTimer~=false then
self.K1 = 0
self.K2 = 0
else
self.K1 = 1
self.K2 = 1
end
end
Train:SetNW2Bool("ASNP:LockedL",self.K1==0)
Train:SetNW2Bool("ASNP:LockedR",self.K2==0)
else
Train:SetNW2Bool("ASNP:CanLocked",false)
self.K1 = 0
self.K2 = 0
self.StopTimer = false
end
end