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/_obsolete/sys_asnp.lua
g_brzhezinskiy 1d05caf866 init
2021-01-02 12:51:45 +03:00

946 lines
31 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.
--------------------------------------------------------------------------------
-- Announcer and announcer-related code
--------------------------------------------------------------------------------
Metrostroi.DefineSystem("ASNP")
TRAIN_SYSTEM.DontAccelerateSimulation = true
if TURBOSTROI then return end
function table.GetLastKey(t)
local lk = -math.huge
for ki in pairs(t) do
lk = math.max(lk,ki)
end
return lk
end
function TRAIN_SYSTEM:Initialize()
self.TriggerNames = {
"Custom1",
"Custom2",
"Custom3",
"R_Program1",
"R_Program2",
}
self.Triggers = {}
self.State = 0
self.Style = 1
self.RealState = 99
self.RouteNumber = "00"
self.Depeat = false
self.Train:LoadSystem("ASNPOn","Relay","Switch",{ normally_closed = true, bass = true })
end
function TRAIN_SYSTEM:ClientInitialize()
self.STR1r = {}
self.STR1x = 1
self.End = false
self.Right = false
self.State = 0
self.Right = false
end
if TURBOSTROI then return end
function TRAIN_SYSTEM:Inputs()
return {}
end
function TRAIN_SYSTEM:Outputs()
return {}
end
function TRAIN_SYSTEM:TriggerInput(name,value)
end
Metrostroi.AnnButtons = {"-","+","Меню"}
function TRAIN_SYSTEM:AnnDisplay(train,ezh3)
-- Draw button labels
if not ezh3 then
for x=0,2 do
draw.Text({
text = string.Trim(Metrostroi.AnnButtons[x+1]),
font = "MetrostroiSubway_VerySmallText3",
pos = { 310+x*135,350+0*150},
xalign = TEXT_ALIGN_CENTER,yalign = TEXT_ALIGN_CENTER,color = Color(0,0,0,255)})
end
draw.Text({
text = "Manual",
font = "MetrostroiSubway_VerySmallText3",
pos = { 735,200},
xalign = TEXT_ALIGN_CENTER,yalign = TEXT_ALIGN_CENTER,color = Color(0,0,0,255)})
draw.Text({
text = "Auto",
font = "MetrostroiSubway_VerySmallText3",
pos = { 735,100},
xalign = TEXT_ALIGN_CENTER,yalign = TEXT_ALIGN_CENTER,color = Color(0,0,0,255)})
end
if not train:GetPackedBool(32) then return end
if false then
for i=1,25 do
surface.SetDrawColor(Color(53,91,25))
surface.DrawRect(235+(i-1)*18+1 - (ezh3 and 5 or 0),125+4,16,25)
--draw.DrawText(string.upper(text1[i] or ""),"MetrostroiSubway_IGLA",287+(i-1)*17.7,125+0,Color(0,0,0,210))
end
for i=1,25 do
surface.SetDrawColor(Color(53,91,25))
surface.DrawRect(235+(i-1)*18+1 - (ezh3 and 5 or 0),125+31+4,16,25)
--draw.DrawText(string.upper(text2[i] or ""),"MetrostroiSubway_IGLA",287+(i-1)*17.7,125+31,Color(0,0,0,210))
end
end
for y = 0,#self.STR1r-1 do
local xmin = 0
local blink = false
local checked = false
local x = 0
local iter = 0
while((x <= math.min(24+xmin,#self.STR1r[y+1]-1+xmin))) do
--for x = 0,math.min(19,#self.STR1r[y+1]-1)-xmin do
local char = self.STR1r[y+1][x+1]
if char == "|" then
Metrostroi.DrawLine(235+9+(x-xmin)*18 - (ezh3 and 5 or 0),141 + y*30-10,235+9+(x-xmin)*18,141+ y*30+9, Color(0,0,0),3)
elseif char == "_" then
if CurTime()%0.5<=0.25 then
draw.DrawText(char,"MetrostroiSubway_FixedSYS",236+(x-xmin)*18 - (ezh3 and 5 or 0),121 + y*30, Color(0,0,0))
end
xmin = xmin + 1
else
draw.DrawText(char,"MetrostroiSubway_FixedSYS",235+(x-xmin)*18 - (ezh3 and 5 or 0),125 + y*30, Color(0,0,0))
end
x = x + 1
end
end
surface.SetAlphaMultiplier(1)
end
function TRAIN_SYSTEM:STR1(str,notchange)
if type(str) == "number" then str = tostring(str) end
if SERVER then return end
if str == true then
for i = 1,2 do
self.STR1r[i] = ""
end
self.STR1x = 1
else
if self.STR1x > (notchange and 3 or 2) then print("STR1:ERR:MAX",str) return end
if notchange then
self.STR1r[self.STR1x-1] = self.STR1r[self.STR1x-1]..str:upper()
else
self.STR1r[self.STR1x] = str:upper() or ""
self.STR1x = self.STR1x + 1
end
end
end
function TRAIN_SYSTEM:DisplayStation(St,stay,max)
max = (max or 25)-1
local sz = stay and #self.STR1r[self.STR1x-1] or #self.STR1r[self.STR1x]
local Siz = stay and #self.STR1r[self.STR1x-1] or #self.STR1r[self.STR1x]
local StS = Metrostroi.AnnouncerData[St] and Metrostroi.AnnouncerData[St][1] or "Unknown"
local StT = string.Explode(" ",StS)
local str = ""
if #StT > 1 then
str = StT[1][1]..". "..table.concat(StT," ",2)
elseif #StS > 26-sz-(25-max) then
str = StS:sub(1,25-sz-2-(25-max)).."..."
else
str = StS
end
self:STR1(str,stay)
end
TRAIN_SYSTEM.LoadSeq = "/-\\|"
function TRAIN_SYSTEM:ClientThink()
local State = self.Train:GetNW2Int("Announcer:State",-1)
self:STR1(true)
if State == -2 then
self:STR1("ASNP Error")
self:STR1("Map not supported")
end
if State == 0 then
self:STR1("Welcome! ver 0.8")
self:STR1("loading:")
self:STR1(self.LoadSeq[math.floor(CurTime()%0.5*8)+1],true)
--self:STR1("ver 0.8")
end
if State == 1 then
self:STR1("Welcome")
if self.Train:GetNW2Bool("BPSNBuzzType",false) then
self:STR1(" pnm ",true)
else
self:STR1(" riu ",true)
end
self:STR1("ver 0.8",true)
self:STR1("press menu to start")
end
if State > 1 and (not Metrostroi.WorkingStations or not Metrostroi.EndStations) then
self:STR1("Client error")
self:STR1("WorkingStations nil")
return
end
if State == 2 then
local RouteNumber = self.Train:GetNW2String("Announcer:RouteNumber","00")
local Pos = self.Train:GetNW2Int("Announcer:State2Pos",1)
self:STR1("enter route number: ")
if Pos == 1 then
self:STR1("_",true)
end
self:STR1(RouteNumber[1],true)
if Pos == 2 then
self:STR1("_",true)
end
self:STR1(RouteNumber[2],true)
if Pos == 3 then
if CurTime()%3 > 1.5 then
self:STR1("accept: menu")
else
self:STR1("cancel: +/-")
end
else
self:STR1("confirm ")
self:STR1(Pos,true)
self:STR1(" digit: \"menu\"",true)
end
end
if State > 2 and not Metrostroi.EndStations[self.Train:GetNW2Int("Announcer:Line",1)] then
self:STR1("Client error")
self:STR1("EndStations")
return
end
if State > 2 and not Metrostroi.WorkingStations[self.Train:GetNW2Int("Announcer:Line",1)] then
self:STR1("Client error")
self:STR1("WorkingStations")
return
end
if State == 3 then
local Line = self.Train:GetNW2Int("Announcer:Line",1)
local St = Metrostroi.EndStations[Line][1]
local En = Metrostroi.EndStations[Line][#Metrostroi.EndStations[Line]]
self:STR1("choose route")
self:STR1("_")
self:STR1(Line, true)
local tim = CurTime()%4.5
if tim < 1.5 then
self:STR1(" ",true)
self:STR1(St,true)
self:STR1("->",true)
self:STR1(En,true)
elseif tim < 3 then
self:STR1(" ST:",true)
self:DisplayStation(St,true)
else
self:STR1(" EN:",true)
self:DisplayStation(En,true)
end
end
if State == 4 then
local Line = self.Train:GetNW2Int("Announcer:Line",1)
local StSt = self.Train:GetNW2Int("Announcer:FirstStation",1)
local St =Metrostroi.EndStations[Line][StSt]
self:STR1("Choose start station")
if not St then
self:STR1("Error, restart ASNP")
else
self:STR1(St )
local tim = CurTime()%4.5
self:STR1(":",true)
self:DisplayStation(St,true)
end
end
if State == 5 then
local Line = self.Train:GetNW2Int("Announcer:Line",1)
local StSt = self.Train:GetNW2Int("Announcer:LastStation",1)
local St =Metrostroi.EndStations[Line][StSt]
self:STR1("Choose end station")
if not St then
self:STR1("Error, restart ASNP")
else
self:STR1(St)
local tim = CurTime()%4.5
self:STR1(":",true)
self:DisplayStation(St,true)
end
end
if State == 6 then
local Style = self.Train:GetNW2Int("Announcer:Style",1)
self:STR1("Choose style")
self:STR1(Metrostroi.PlayingStyles[Style])
end
if State == 7 then
local Line = self.Train:GetNW2Int("Announcer:Line",1)
local StStF = self.Train:GetNW2Int("Announcer:FirstStation",1)
local StStL = self.Train:GetNW2Int("Announcer:LastStation",1)
local StF =Metrostroi.EndStations[Line][StStF]
local StL =Metrostroi.EndStations[Line][StStL]
local Style = self.Train:GetNW2Int("Announcer:Style",1)
self:STR1("Check settings")
local tim = CurTime()%6
if tim < 1.5 then
self:STR1("Line:")
self:STR1(Line,true)
elseif tim < 3 then
self:STR1("ST:")
self:DisplayStation(StF,true)
elseif tim < 4.5 then
self:STR1("EN:")
self:DisplayStation(StL,true)
else
self:STR1("Style:")
self:STR1(Metrostroi.PlayingStyles[Style],true)
end
end
if State < 8 then
self.Right = false
self.End = false
end
if State == 8 then
local Depeat = self.Train:GetNW2Bool("Announcer:Depeat",false)
local RouteNumber = self.Train:GetNW2String("Announcer:RouteNumber","00")
local Line = self.Train:GetNW2Int("Announcer:Line",1)
local StF = self.Train:GetNW2Int("Announcer:FirstStationW",1)
local Stl = self.Train:GetNW2Int("Announcer:LastStationW",1)
local StC = self.Train:GetNW2Int("Announcer:CurrentStation",2)
local add = Stl > StF and 1 or -1
local St =Metrostroi.WorkingStations[Line][StC]
--local StN =Metrostroi.WorkingStations[Line][StC+add]
local StL =Metrostroi.WorkingStations[Line][Stl]
if Depeat then self:STR1("Dep. ") else self:STR1("Arr. ") end
self:DisplayStation(St,true,22)
self:STR1(string.rep(" ",23-#self.STR1r[self.STR1x-1]),true)
--self.Right = Metrostroi.AnnouncerData[St][2]
--if self.Right then self:STR1("*R",true) else self:STR1("*L",true) end
if self.Train:GetNW2Int("Announcer:Locked",0) > 0 and self.Train:GetNW2Int("Announcer:Locked",0) ~= 2 then
self:STR1("*L",true)
else
self:STR1(" L",true)
end
if not self.Train:GetNW2Bool("Announcer:Playing1",false) then
if add > 0 then
self:STR1("I ")
else
self:STR1("II ")
end
self:STR1(string.format("%02d ",RouteNumber),true)
end
if self.Train:GetNW2Bool("Announcer:Playing1",false) then
self:STR1("<<< Goes Announce >>>")
--self:DisplayStation(St,true,23)
elseif add > 0 and StC >= Stl or add < 0 and StC <= Stl then
self:STR1("<<<LAST STATION>>>",true)
self.End = true
else
self:DisplayStation(StL,true,22)
self.End = false
end
self:STR1(string.rep(" ",23-#self.STR1r[self.STR1x-1]),true)
if add > 0 and StC < StL or add < 0 and StC > StL then
if not self.Train:GetNW2Bool("Announcer:Playing1",false) then
--if self.Right then self:STR1("R",true) else self:STR1("L",true) end
--else
--if Metrostroi.AnnouncerData[StL][2] then self:STR1("*R",true) else self:STR1("*L",true) end
if self.Train:GetNW2Int("Announcer:Locked",0) > 1 then
self:STR1("*R",true)
else
self:STR1(" R",true)
end
end
end
end
if State == 9 then
local Choosed = self.Train:GetNW2Int("Announcer:Choosed",0)
if Choosed == 0 then
self:STR1(">Back")
self:STR1(" Swap paths")
elseif Choosed == 1 then
self:STR1(">Swap paths")
self:STR1(" Reset")
else
self:STR1(" Swap paths")
self:STR1(">Reset")
end
end
end
Metrostroi.PlayingStyles = {"Moscow","Kiev"}
function TRAIN_SYSTEM:ReloadSigns()
if not self.Line or not Metrostroi.EndStations[self.Line] then return end
local StL = Metrostroi.EndStations[self.Line][self.LastStation]
if not StL then return end
self.Train:PrepareSigns()
if self.Train.SignsList[StL] then
self.Train.SignsIndex = self.Train.SignsList[StL] or 1
if self.Train.SignsList[self.Train.SignsIndex] then self.Train:SetNW2String("FrontText",self.Train.SignsList[self.Train.SignsIndex][2]) end
end
local StF= Metrostroi.EndStations[self.Line][self.FirstStation]
if #self.Train.WagonList <= 1 or not StF then return end
local LastTrain = self.Train.WagonList[#self.Train.WagonList]
LastTrain:PrepareSigns()
if LastTrain.SignsList[StF] then
LastTrain.SignsIndex = self.Train.SignsList[StF] or 1
if self.Train.SignsList[self.Train.SignsIndex] then LastTrain:SetNW2String("FrontText",self.Train.SignsList[self.Train.SignsIndex][2]) end
end
end
function TRAIN_SYSTEM:UpdateAnnouncer()
for k,v in pairs(self.Train.WagonList) do
if v.ASNP then
if v ~= self.Train then
if self.Line then v.ASNP.Line = self.Line end
if self.FirstStation then
v.ASNP.LastStation = self.FirstStation
v.ASNP.LastStationW = self.FirstStationW
end
if self.LastStation then
v.ASNP.CurrentStation = self.LastStationW
v.ASNP.FirstStation = self.LastStation
v.ASNP.FirstStationW= self.LastStationW
if Metrostroi.EndStations[self.Line] and Metrostroi.AnnouncerData[Metrostroi.EndStations[self.Line][self.LastStation]] and Metrostroi.AnnouncerData[Metrostroi.EndStations[self.Line][self.LastStation]][9] then
v.ASNP.LastStation = self.LastStation
v.ASNP.LastStationW = self.LastStationW
v.ASNP.CurrentStation = self.FirstStationW
v.ASNP.FirstStation = self.FirstStation
v.ASNP.FirstStationW= self.FirstStationW
end
end
v.ASNP.State = self.State
v.ASNP.Style = self.Style
v.ASNP.Depeat = true
v.ASNP.RouteNumber = self.RouteNumber
end
end
v:OnButtonPress("RouteNumberUpdate",self.RouteNumber)
end
self:ReloadSigns()
end
function TRAIN_SYSTEM:Trigger(name,nosnd)
if self.Train.KV.ReverserPosition == 0 and self.Train.KRU.Position == 0 then return end
if self.State == 1 and name == "Custom3" then self:SetState(2) return end
if self.State == 2 then
if name == "Custom1" and self.State2Pos < 3 then
local num = tonumber(self.RouteNumber[self.State2Pos]) - 1
if num < 0 then num = 9 end
self.RouteNumber = string.SetChar(self.RouteNumber,self.State2Pos,num)
self:UpdateAnnouncer()
end
if name == "Custom2" and self.State2Pos < 3 then
local num = tonumber(self.RouteNumber[self.State2Pos]) + 1
if num > 9 then num = 0 end
self.RouteNumber = string.SetChar(self.RouteNumber,self.State2Pos,num)
self:UpdateAnnouncer()
end
if (name == "Custom1" or name == "Custom2") and self.State2Pos == 3 then
self.State2Pos = 1
end
if name == "Custom3" then
if self.State2Pos < 3 then
self.State2Pos = self.State2Pos+1
else
self:SetState(3)
return
end
end
end
if self.State == 3 then
if name == "Custom1" then
self.Line = self.Line - 1
if self.Line < 1 then self.Line = #Metrostroi.WorkingStations end
self:UpdateAnnouncer()
end
if name == "Custom2" then
self.Line = self.Line + 1
if self.Line > #Metrostroi.WorkingStations then self.Line = 1 end
self:UpdateAnnouncer()
end
if name == "Custom3" then
self:SetState(4)
return
end
end
if self.State == 4 then
if name == "Custom1" then
self.FirstStation = self.FirstStation - 1
if self.FirstStation < 1 then self.FirstStation = #Metrostroi.EndStations[self.Line] end
self:UpdateAnnouncer()
end
if name == "Custom2" then
self.FirstStation = self.FirstStation + 1
if self.FirstStation > #Metrostroi.EndStations[self.Line] then self.FirstStation = 1 end
self:UpdateAnnouncer()
end
if name == "Custom3" then
self:SetState(5)
return
end
end
if self.State == 5 then
if name == "Custom1" then
self.LastStation = self.LastStation - 1
if self.LastStation < 1 then self.LastStation = #Metrostroi.EndStations[self.Line] end
if self.LastStation == self.FirstStation then self:Trigger("Custom1") return end
self:UpdateAnnouncer()
end
if name == "Custom2" then
self.LastStation = self.LastStation + 1
if self.LastStation > #Metrostroi.EndStations[self.Line] then self.LastStation = 1 end
if self.LastStation == self.FirstStation then self:Trigger("Custom2") return end
self:UpdateAnnouncer()
end
if name == "Custom3" and self.FirstStation ~= self.LastStation then
self:SetState(6)
return
end
end
if self.State == 6 then
if name == "Custom1" then
self.Style = self.Style - 1
if self.Style < 1 then self.Style = #Metrostroi.PlayingStyles end
self:UpdateAnnouncer()
end
if name == "Custom2" then
self.Style = self.Style + 1
if self.Style > #Metrostroi.PlayingStyles then self.Style = 1 end
self:UpdateAnnouncer()
end
if name == "Custom3" then
self:SetState(7)
return
end
end
if self.State == 7 then
if name == "Custom1" or name == "Custom2" then
self:SetState(2)
return
end
if name == "Custom3" and (self.Train.KV.ReverserPosition > 0 or self.Train.KRU.Position > 0) then
self:SetState(8)
self.Train.Announcer:MultiQueue(0006,0001,0005)
self.Train.Announcer:MultiQueue(0201,0211,Metrostroi.EndStations[self.Line][self.FirstStation]+1000,Metrostroi.EndStations[self.Line][self.LastStation]+1000)
self.Train.Announcer:MultiQueue(0006)
return
end
end
if self.State == 8 then
if name == "Custom1" then
if not self.Depeat then
if self.LastStation < self.FirstStation then
self.CurrentStation = math.min(self.FirstStationW,self.CurrentStation + 1)
else
self.CurrentStation = math.max(self.FirstStationW,self.CurrentStation - 1)
end
end
if self.LastStation < self.FirstStation and self.CurrentStation >= self.FirstStationW or self.LastStation > self.FirstStation and self.CurrentStation <= self.FirstStationW then
if Metrostroi.AnnouncerData[Metrostroi.WorkingStations[self.Line][self.CurrentStation]][9] then
self.CurrentStation = self.FirstStationW
local tem = self.FirstStation
self.FirstStation = self.LastStation
self.LastStation = tem
self.Depeat = not self.Depeat
else
self.Depeat = true
end
else
self.Depeat = not self.Depeat
end
end
if name == "Custom2" then
if self.Depeat then
if self.LastStation > self.FirstStation then
self.CurrentStation = math.min(self.LastStationW,self.CurrentStation + 1)
else
self.CurrentStation = math.max(self.LastStationW,self.CurrentStation - 1)
end
end
if self.LastStation < self.FirstStation and self.CurrentStation <= self.LastStationW or self.LastStation > self.FirstStation and self.CurrentStation >= self.LastStationW then
if Metrostroi.AnnouncerData[Metrostroi.WorkingStations[self.Line][self.CurrentStation]][9] then
self.CurrentStation = self.LastStationW
local tem = self.FirstStation
self.FirstStation = self.LastStation
self.LastStation = tem
self.Depeat = not self.Depeat
else
self.Depeat = false
end
else
self.Depeat = not self.Depeat
end
end
if name == "Custom3" then
self:SetState(9)
return
end
if name == "R_Program1" and #self.Train.Announcer.Schedule == 0 and (self.Train.CustomC.Value < 0.5 or
self.CurrentStation == math.Clamp(self.CurrentStation,path and self.LastStationW or self.FirstStationW,path and self.FirstStationW or self.LastStationW) and self.Depeat == true) then
self:PlayAnnounce1()
if self.Depeat and self.Train.CustomC.Value < 0.5 then
if self.LastStation > self.FirstStation then
self.CurrentStation = math.min(self.LastStationW,self.CurrentStation + 1)
else
self.CurrentStation = math.max(self.LastStationW,self.CurrentStation - 1)
end
end
if (self.LastStation < self.FirstStation and self.CurrentStation <= self.LastStationW or self.LastStation > self.FirstStation and self.CurrentStation >= self.LastStationW) and not self.Depeat then
self.Depeat = false
if Metrostroi.AnnouncerData[Metrostroi.WorkingStations[self.Line][self.CurrentStation]][9] then
self.CurrentStation = self.LastStationW
local tem = self.FirstStation
self.FirstStation = self.LastStation
self.LastStation = tem
self.Depeat = not self.Depeat
else
self.CurrentStation = self.FirstStationW
end
elseif self.Train.CustomC.Value < 0.5 or self.Depeat == true then
self.Depeat = not self.Depeat
end
end
end
if self.State == 9 then
if name == "Custom1" then
self.Choosed = math.max(0,self.Choosed-1)
end
if name == "Custom2" then
self.Choosed = math.min(2,self.Choosed+1)
end
if name == "Custom3" then
if self.Choosed == 0 then
self.State = 8
elseif self.Choosed == 1 then
local tmp = self.FirstStation
self.FirstStation = self.LastStation
self.LastStation = tmp
if self.FirstStation and self.Line and self.FirstStationW ~= self.FirstStation then
self.FirstStationW = Metrostroi.WorkingStations[self.Line][Metrostroi.EndStations[self.Line][self.FirstStation]]
end
if self.LastStation and self.Line and self.LastStationW ~= self.LastStation then
self.LastStationW = Metrostroi.WorkingStations[self.Line][Metrostroi.EndStations[self.Line][self.LastStation]]
end
if Metrostroi.AnnouncerData[Metrostroi.EndStations[self.Line][self.FirstStation]][9] then
local tem = self.FirstStation
self.FirstStation = self.LastStation
self.LastStation = tem
end
self:SetState(7)
else
self:SetState(7)
end
return
end
end
end
function TRAIN_SYSTEM:PlayAnnounce1(val)
local add = self.LastStation > self.FirstStation and 1 or -1
local curr = Metrostroi.WorkingStations[self.Line][self.CurrentStation]
local currt = Metrostroi.AnnouncerData[curr]
local next = Metrostroi.WorkingStations[self.Line][self.CurrentStation + add]
local nextt = Metrostroi.AnnouncerData[next]
--local uvpass = false
self.Train.Announcer:MultiQueue(0006,0001,0005) -- Щелчки и начало
if self.Depeat then -- Отправление
if Metrostroi.AnnouncerData[curr +add] and not Metrostroi.AnnouncerData[curr +add][1] then self.Train.Announcer:MultiQueue(0230,curr+add+1000,0001) end
self.Train.Announcer:MultiQueue(0218,0219,next+1000) -- ОДЗ СС
if nextt and nextt[2] then self.Train.Announcer:MultiQueue(self.Style == 2 and 0215 or 0231) end -- Платформа справа(или киевский вариант)
--[=[
if nextt[7] and nextt[7] ~= 0 then
if Metrostroi.AnnouncerData[nextt[7][1]] then
self.Train.Announcer:MultiQueue(0202, 0203,nextt[7][1])
else
self.Train.Announcer:MultiQueue(0202, nextt[7][1])
end
end -- Переход
]=]
if nextt and nextt[5] and self.Style == 3 then self.Train.Announcer:MultiQueue(0213) end -- Прислоняться
if nextt and nextt[3] then
--uvpass = true
if self.Style == 1 then self.Train.Announcer:MultiQueue(0230) end
self.Train.Announcer:MultiQueue(self.Style == 2 and 0214 or 0232) -- Вежливость
end
--if nextt[8] == (add > 0 and 1 or 2) then self.Train.Announcer:MultiQueue(0002,self.Style == 2 and 0210 or 0223,Metrostroi.EndStations[self.Line][self.LastStation]) end -- до станции
else
self.Train.Announcer:MultiQueue(0220,curr+1000) -- Станция
if currt[2] then self.Train.Announcer:MultiQueue(self.Style == 2 and 0215 or 0231) end -- Платформа справа(или киевский вариант)
if currt[7] and currt[7] ~= 0 then
if Metrostroi.AnnouncerData[currt[7][1]] then
self.Train.Announcer:MultiQueue(0202, 0203,currt[7][1]+1000)
else
self.Train.Announcer:MultiQueue(0202, currt[7][1])
end
end -- Переход
if self.LastStation < self.FirstStation and self.CurrentStation <= self.LastStationW or self.LastStation > self.FirstStation and self.CurrentStation >= self.LastStationW then
if not currt[9] then
if self.Style == 1 then
self.Train.Announcer:MultiQueue(0224,0002,0230,0226) -- Конечная
else
self.Train.Announcer:MultiQueue(0212) -- Конечная
end
self.Train.Announcer:MultiQueue(0006) -- Конечный щелчок
return
end
end
if currt[4] then
--uvpass = true
if self.Style == 1 then self.Train.Announcer:MultiQueue(0230) end
self.Train.Announcer:MultiQueue(0226+(currt[4] or 0)) -- Вещи
end
if add > 0 and self.LastStationW < #Metrostroi.WorkingStations[self.Line] or add < 0 and self.LastStationW > 1 then
self.Train.Announcer:MultiQueue(0002,self.Style == 2 and 0210 or 0223,Metrostroi.EndStations[self.Line][self.LastStation]+1000) -- Следует до станции
end
if currt[8] == (add > 0 and 1 or 2) then self.Train.Announcer:MultiQueue(0002,self.Style == 2 and 0210 or 0223,Metrostroi.EndStations[self.Line][self.LastStation]+1000) end -- до станции
end
self.Train.Announcer:MultiQueue(0006) -- Конечный щелчок
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: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 state == 1 or state == 1.1 then
self.NextState = add
end
self:SetTimer()
elseif not state then
state = self.NextState
self.State = self.NextState
else
return
end
if state == 0 then
self.LoadTimer = math.random(2,4)
end
if state == 2 then
self.State2Pos = 1
end
if state == 3 then
self.Line = self.Line or 1
end
if state == 4 then
self.FirstStation = self.FirstStation or 1
if self.FirstStation > #Metrostroi.EndStations[self.Line] then self.FirstStation = 1 end
self:UpdateAnnouncer()
end
if state == 5 then
self.LastStation = self.LastStation or self.LastStation ~= self.FirstStation and #Metrostroi.EndStations[self.Line] or 1
if self.LastStation > #Metrostroi.EndStations[self.Line] then self.LastStation = 1 end
self:UpdateAnnouncer()
end
if state == 6 then
self.Style = self.Style or 1
end
if state == 8 and (self.Train.KV.ReverserPosition > 0 or self.Train.KRU.Position > 0) then
if self.Train:ReadCell(49170) == 2 and false and self.LastStation > self.FirstStation then
local tem = self.FirstStation
self.FirstStation = self.LastStation
self.LastStation = tem
end
if self.Train:ReadCell(49170) == 1 and false and self.LastStation < self.FirstStation then
local tem = self.FirstStation
self.FirstStation = self.LastStation
self.LastStation = tem
end
if self.FirstStation and self.Line and self.FirstStationW ~= self.FirstStation then
self.FirstStationW = Metrostroi.WorkingStations[self.Line][Metrostroi.EndStations[self.Line][self.FirstStation]]
end
if self.LastStation and self.Line and self.LastStationW ~= self.LastStation then
self.LastStationW = Metrostroi.WorkingStations[self.Line][Metrostroi.EndStations[self.Line][self.LastStation]]
end
local curr = self.FirstStationW
print(curr)
local path = self.LastStation < self.FirstStation
local st = self.Train:ReadCell(49169) > 0 and Metrostroi.WorkingStations[self.Line][self.Train:ReadCell(49169)] or 0
if st > 0 then
curr = math.Clamp(st,path and self.LastStationW or self.FirstStationW,path and self.FirstStationW or self.LastStationW)
end
self:UpdateAnnouncer()
print(curr)
self.CurrentStation = curr
self.Depeat = true
end
if state < 8 then
self.Train.ASNP31:TriggerInput("Set",0)
self.Train.ASNP32:TriggerInput("Set",0)
end
if state == 9 then
self.Choosed = 0
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()
local Train = self.Train
if Train.VB.Value > 0.5 and Train.Battery.Voltage > 55 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
if Train[v].Value > 0.5 then
self:Trigger(v)
end
--print(v,self.Train[v].Value > 0.5)
self.Triggers[v] = Train[v].Value > 0.5
end
end
end
if self.Train.R_Radio.Value > 0.5 and self.State == -1 then
self:SetState(0)
end
if self.Train.R_Radio.Value < 0.5 and self.State ~= -1 then
self:SetState(-1)
return
end
if not Metrostroi.AnnouncerData and self.State ~= -2 then
if self.State ~= -2 then self:SetState(-2) end
return
end
if self.State == 0 then
self:SetTimer(0)
if self:GetTimer(self.LoadTimer) then
self.LoadTimer = nil
self:SetState(1)
end
end
if self.State >= 8 then
local Distance = math.min(3072,self.Train:ReadCell(49165))
--local st = self.Train:ReadCell(49169) > 0 and Metrostroi.AnnouncerData[self.Train:ReadCell(49169)] or false
local st = self.Train:ReadCell(49169)
local right = st and Metrostroi.AnnouncerData[st] and Metrostroi.AnnouncerData[st][2]
local unlock = Distance > 100 and self.Train.ALS_ARS.Speed <= 2
local lock = self.Train.ALS_ARS.Speed > 2
if self.Train.ASNPOn.Value > 0.5 and not unlock then
if right then
if self.Train.ASNP31.Value == 0 then self.Train.ASNP31:TriggerInput("Set",1) end
--if not lock and
if not lock and self.Train.ASNP32.Value == 1 then self.Train.ASNP32:TriggerInput("Set",0) end
if lock and self.Train.ASNP32.Value == 0 then self.Train.ASNP32:TriggerInput("Set",1) end
else
--if not lock and
if not lock and self.Train.ASNP31.Value == 1 then self.Train.ASNP31:TriggerInput("Set",0) end
if lock and self.Train.ASNP31.Value == 0 then self.Train.ASNP31:TriggerInput("Set",1) end
if self.Train.ASNP32.Value == 0 then self.Train.ASNP32:TriggerInput("Set",1) end
end
else
if self.Train.ASNP32.Value == 1 then self.Train.ASNP32:TriggerInput("Set",0) end
if self.Train.ASNP31.Value == 1 then self.Train.ASNP31:TriggerInput("Set",0) end
end
end
if self.State == 8 and (self.Train.KV.ReverserPosition > 0 or self.Train.KRU.Position > 0) then
if self.Train.CustomC.Value > 0.5 then
local Distance = math.min(3072,self.Train:ReadCell(49165))
local st = self.Train:ReadCell(49169) > 0 and Metrostroi.WorkingStations[self.Line][self.Train:ReadCell(49169)] or 0
if Distance < 25 and self.AutoStation ~= st and self.Train:ReadCell(49169) > 0 and st == math.Clamp(st,path and self.LastStationW or self.FirstStationW,path and self.FirstStationW or self.LastStationW) then
self.CurrentStation = math.Clamp(st,path and self.LastStationW or self.FirstStationW,path and self.FirstStationW or self.LastStationW)
self.Depeat = false
self:PlayAnnounce1()
self.Depeat = true
self.AutoStation = self.CurrentStation
end
end
end
self.Train:SetNW2Int("Announcer:State",self.State)
self.Train:SetNW2Int("Announcer:Line",self.Line)
self.Train:SetNW2Int("Announcer:FirstStation",self.FirstStation)
self.Train:SetNW2Int("Announcer:LastStation",self.LastStation)
self.Train:SetNW2String("Announcer:RouteNumber",self.RouteNumber)
if self.State == 2 then
self.Train:SetNW2Int("Announcer:State2Pos",self.State2Pos)
end
if self.State == 6 then
self.Train:SetNW2String("Announcer:Style",self.Style)
end
if self.State == 8 then
self.Train:SetNW2Int("Announcer:FirstStationW",self.FirstStationW)
self.Train:SetNW2Int("Announcer:LastStationW",self.LastStationW)
self.Train:SetNW2String("Announcer:CurrentStation",self.CurrentStation)
self.Train:SetNW2Bool("Announcer:Depeat",self.Depeat)
if self.Train.ASNP31.Value == 1 then
if self.Train.ASNP32.Value == 1 then
self.Train:SetNW2Int("Announcer:Locked",3)
else
self.Train:SetNW2Int("Announcer:Locked",1)
end
elseif self.Train.ASNP32.Value == 1 then
self.Train:SetNW2Int("Announcer:Locked",2)
else
self.Train:SetNW2Int("Announcer:Locked",0)
end
end
if self.State == 9 then
self.Train:SetNW2Int("Announcer:Choosed",self.Choosed)
end
self.Train:SetNW2Bool("Announcer:Playing", self.Train.Announcer.ScheduleAnnouncement > 2)
self.Train:SetNW2Bool("Announcer:Playing1", #self.Train.Announcer.Schedule > 0)
if self.FirstStation and self.Line and self.FirstStationW ~= self.FirstStation then
self.FirstStationW = Metrostroi.WorkingStations[self.Line][Metrostroi.EndStations[self.Line][self.FirstStation]]
end
if self.LastStation and self.Line and self.LastStationW ~= self.LastStation then
self.LastStationW = Metrostroi.WorkingStations[self.Line][Metrostroi.EndStations[self.Line][self.LastStation]]
end
end