mirror of
https://github.com/metrostroi-repo/MetrostroiAddon.git
synced 2026-05-02 00:42:29 +00:00
946 lines
31 KiB
Lua
946 lines
31 KiB
Lua
--------------------------------------------------------------------------------
|
||
-- 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
|