mirror of
https://github.com/metrostroi-repo/MetrostroiAddon.git
synced 2026-05-02 00:42:29 +00:00
1093 lines
56 KiB
Lua
1093 lines
56 KiB
Lua
--------------------------------------------------------------------------------
|
||
-- 81-722 BMCIK-01 system
|
||
--------------------------------------------------------------------------------
|
||
-- Copyright (C) 2013-2018 Metrostroi Team & FoxWorks Aerospace s.r.o.
|
||
-- Contains proprietary code. See license.txt for additional information.
|
||
--------------------------------------------------------------------------------
|
||
Metrostroi.DefineSystem("81_722_BMCIK")
|
||
TRAIN_SYSTEM.DontAccelerateSimulation = true
|
||
|
||
function TRAIN_SYSTEM:Initialize()
|
||
self.Train:LoadSystem("SarmatUp","Relay","Switch")
|
||
self.Train:LoadSystem("SarmatDown","Relay","Switch")
|
||
self.Train:LoadSystem("SarmatEnter","Relay","Switch")
|
||
self.Train:LoadSystem("SarmatEsc","Relay","Switch")
|
||
self.Train:LoadSystem("SarmatF1","Relay","Switch")
|
||
self.Train:LoadSystem("SarmatF2","Relay","Switch")
|
||
self.Train:LoadSystem("SarmatF3","Relay","Switch")
|
||
self.Train:LoadSystem("SarmatF4","Relay","Switch")
|
||
self.Train:LoadSystem("SarmatPath","Relay","Switch")
|
||
self.Train:LoadSystem("SarmatLine","Relay","Switch")
|
||
self.Train:LoadSystem("SarmatZero","Relay","Switch")
|
||
self.Train:LoadSystem("SarmatStart","Relay","Switch")
|
||
self.TriggerNames = {
|
||
"SarmatUp",
|
||
"SarmatDown",
|
||
"SarmatEnter",
|
||
"SarmatEsc",
|
||
"SarmatF1",
|
||
"SarmatF2",
|
||
"SarmatF3",
|
||
"SarmatF4",
|
||
"SarmatPath",
|
||
"SarmatLine",
|
||
"SarmatZero",
|
||
"SarmatStart",
|
||
}
|
||
self.Triggers = {}
|
||
for k,v in pairs(self.TriggerNames) do
|
||
if self.Train[v] then self.Triggers[v] = self.Train[v].Value > 0.5 end
|
||
end
|
||
self.SarmatState = 0
|
||
self.SarmatAnnState = 1
|
||
self.SarmatCamState = 1
|
||
|
||
self.Line = 1
|
||
self.Path = false
|
||
self.Station = 1
|
||
self.Arrived = true
|
||
|
||
self.Selected = 0
|
||
|
||
self.LineEnabled = false
|
||
|
||
self.UPOActive = 0
|
||
self.LineOut = 0
|
||
end
|
||
|
||
function TRAIN_SYSTEM:Outputs()
|
||
return {"UPOActive","LineOut"}
|
||
end
|
||
|
||
function TRAIN_SYSTEM:Inputs()
|
||
return {"CheckUPO"}
|
||
end
|
||
if TURBOSTROI then return end
|
||
function TRAIN_SYSTEM:TriggerInput(name,value)
|
||
if name == "CheckUPO" then
|
||
local UPOActive = (math.random()>0.05 and not self.Arrived or self.Arrived and not self.Depeating) and self.LineOut==0
|
||
if UPOActive then
|
||
if self.Arrived and not self.Depeating then
|
||
--self.Train.BUKP.CloseRing = self.Train.BUKP.CloseRing or CurTime()+3
|
||
self.Depeating = true
|
||
elseif not self.Arrived then
|
||
self.Arrived = true
|
||
|
||
local stbl = Metrostroi.SarmatUPOSetup[self.Train:GetNW2Int("Announcer",1)]
|
||
local stbll = stbl[self.Line]
|
||
local last = (self.Path and not stbll.Loop) and self.StartStation or self.EndStation
|
||
self.Last = self.Station == last
|
||
end
|
||
self:UpdateSarmat()
|
||
end
|
||
self.UPOActive = UPOActive and 1 or 0
|
||
self.UPOLock = UPOActive and CurTime()
|
||
return UPOActive
|
||
end
|
||
end
|
||
TRAIN_SYSTEM.Specials = {[-4]="Еду на море",[-3]="На порезку",[-2]="Обкатка",[-1]="Перегонка",[0]="В депо"}
|
||
if SERVER then
|
||
local function InRange(x,y,px,py,pw,ph)
|
||
local hpw,hph = pw/2,ph/2
|
||
return (px-hpw < x and x < px+hpw) and (py-hph < y and y < py+hph)
|
||
end
|
||
function TRAIN_SYSTEM:Touch(value,x,y)
|
||
local Train = self.Train
|
||
if self.SarmatCamState == 1 and value then
|
||
local WagNum = #Train.WagonList
|
||
if InRange(x,y,124,140,113,40,"Левые") then
|
||
self.Cam1,self.Cam1E = CurTime()+math.Rand(0.4,4),Train
|
||
self.Cam2,self.Cam2E = CurTime()+math.Rand(0.4,4),Train.WagonList[WagNum]
|
||
self.Cam3,self.Cam4 = false,false
|
||
self.SarmatCamState,self.SarmatCamCount,self.SarmatCamType = 2,2,1
|
||
end
|
||
if InRange(x,y,242,140,113,40,"Передние") then
|
||
self.Cam1,self.Cam1E = CurTime()+math.Rand(0.4,4),Train
|
||
self.Cam2,self.Cam2E = CurTime()+math.Rand(0.4,4),Train
|
||
self.Cam3,self.Cam4 = false,false
|
||
self.SarmatCamState,self.SarmatCamCount,self.SarmatCamType = 2,2,2
|
||
end
|
||
if InRange(x,y,360,140,113,40,"Вокруг") then
|
||
self.Cam1,self.Cam1E = CurTime()+math.Rand(0.4,4),Train
|
||
self.Cam2,self.Cam2E = CurTime()+math.Rand(0.4,4),Train
|
||
self.Cam3,self.Cam3E = CurTime()+math.Rand(0.4,4),Train.WagonList[WagNum]
|
||
self.Cam4,self.Cam4E = CurTime()+math.Rand(0.4,4),Train.WagonList[WagNum]
|
||
self.SarmatCamState,self.SarmatCamCount,self.SarmatCamType = 4,4,3
|
||
end
|
||
if InRange(x,y,478,140,113,40,"Задние") then
|
||
self.Cam1,self.Cam1E = CurTime()+math.Rand(0.4,4),Train.WagonList[WagNum]
|
||
self.Cam2,self.Cam2E = CurTime()+math.Rand(0.4,4),Train.WagonList[WagNum]
|
||
self.Cam3,self.Cam4 = false,false
|
||
self.SarmatCamState,self.SarmatCamCount,self.SarmatCamType = 3,2,4
|
||
end
|
||
if InRange(x,y,596,140,113,40,"Правые") then
|
||
self.Cam1,self.Cam1E = CurTime()+math.Rand(0.4,4),Train
|
||
self.Cam2,self.Cam2E = CurTime()+math.Rand(0.4,4),Train.WagonList[WagNum]
|
||
self.Cam3,self.Cam4 = false,false
|
||
self.SarmatCamState,self.SarmatCamCount,self.SarmatCamType = 3,2,5
|
||
end
|
||
|
||
for i=1+self.Selected,math.min(WagNum,6+self.Selected) do
|
||
if InRange(x,y,65+(i-1-self.Selected)*118+118*math.max(0,6-WagNum)/2 ,235,113,40,"Вагон "..i) then
|
||
self.Cam1,self.Cam1E = CurTime()+math.Rand(0.4,4),Train.WagonList[i]
|
||
self.Cam2,self.Cam2E = CurTime()+math.Rand(0.4,4),Train.WagonList[i]
|
||
self.Cam3,self.Cam3E = CurTime()+math.Rand(0.4,4),Train.WagonList[i]
|
||
self.Cam4,self.Cam4E = CurTime()+math.Rand(0.4,4),Train.WagonList[i]
|
||
self.SarmatCamState,self.SarmatCamCount,self.SarmatCamType = 5,4,6
|
||
end
|
||
end
|
||
|
||
if InRange(x,y,220,350,113,40,"Вагон 1") then
|
||
self.Cam1,self.Cam1E = CurTime()+math.Rand(0.4,4),Train
|
||
self.Cam2,self.Cam3,self.Cam4 = false,false
|
||
self.SarmatCamState,self.SarmatCamCount,self.SarmatCamType = 6,1,7
|
||
end
|
||
if InRange(x,y,500,350,113,40,"Вагон "..WagNum) then
|
||
self.Cam1,self.Cam1E = CurTime()+math.Rand(0.4,4),Train.WagonList[WagNum]
|
||
self.Cam2,self.Cam3,self.Cam4 = false,false
|
||
self.SarmatCamState,self.SarmatCamCount,self.SarmatCamType = 6,1,8
|
||
end
|
||
|
||
if InRange(x,y,220,465,113,40,"Вагон 1") then
|
||
self.Cam1,self.Cam1E = CurTime()+math.Rand(0.4,4),Train
|
||
self.Cam2,self.Cam3,self.Cam4 = false,false
|
||
self.SarmatCamState,self.SarmatCamCount,self.SarmatCamType = 7,1,9
|
||
end
|
||
if InRange(x,y,500,465,113,40,"Вагон "..WagNum) then
|
||
self.Cam1,self.Cam1E = CurTime()+math.Rand(0.4,4),Train.WagonList[WagNum]
|
||
self.Cam2,self.Cam3,self.Cam4 = false,false
|
||
self.SarmatCamState,self.SarmatCamCount,self.SarmatCamType = 7,1,10
|
||
end
|
||
--surface.DrawTexturedRectRotated(110,590,200,40,0)
|
||
--draw.SimpleText("Esc","Metrostroi_Arial20",110,590, Color(200,200,200),TEXT_ALIGN_CENTER,TEXT_ALIGN_CENTER)
|
||
|
||
|
||
if InRange(x,y,320,590,200,40,"<-") then
|
||
self.Selected = math.max(self.Selected - 1,0)
|
||
end
|
||
if InRange(x,y,530,590,200,40,"->") then
|
||
self.Selected = math.Clamp(self.Selected + 1,0,#Train.WagonList-6)
|
||
end
|
||
end
|
||
if self.SarmatCamState > 1 and value then
|
||
if InRange(x,y,110,590,200,40,"Esc") then
|
||
self.SarmatCamState = 1
|
||
self.Cam1 = false
|
||
self.Cam2 = false
|
||
self.Cam3 = false
|
||
self.Cam4 = false
|
||
self.Selected = 0
|
||
end
|
||
end
|
||
Train:SetNW2Int("SarmatCamSelected",self.Selected)
|
||
end
|
||
|
||
function TRAIN_SYSTEM:Zero()
|
||
local stbl = Metrostroi.SarmatUPOSetup[self.Train:GetNW2Int("Announcer",1)]
|
||
local stbll = stbl[self.Line]
|
||
if not stbll then
|
||
self:UpdateSarmat()
|
||
return
|
||
end
|
||
if stbll.Loop then
|
||
self.Station = self.Path and #stbll or 1
|
||
else
|
||
self.Station = self.Path and self.EndStation or self.StartStation
|
||
end
|
||
self.Arrived = true
|
||
self.Depeating = false
|
||
self:UpdateSarmat()
|
||
end
|
||
|
||
function TRAIN_SYSTEM:Next()
|
||
local stbl = Metrostroi.SarmatUPOSetup[self.Train:GetNW2Int("Announcer",1)]
|
||
local stbll = stbl[self.Line]
|
||
if not stbll then return end
|
||
local last = (self.Path and not stbll.Loop) and self.StartStation or self.EndStation
|
||
if stbll.Loop then
|
||
if self.Arrived then
|
||
if self.Path then
|
||
self.Station = math.max(0,self.Station - 1)
|
||
if self.Station <= 0 then self.Station = #stbll end
|
||
else
|
||
local max = #stbll
|
||
if self.Station >= max then self.Station = 0 end
|
||
self.Station = math.min(max,self.Station + 1)
|
||
end
|
||
self.Arrived = false
|
||
else
|
||
if self.Station ~= (self.EndStation > 0 and self.EndStation or -1) then
|
||
self.Arrived = true
|
||
end
|
||
end
|
||
else
|
||
if self.Last then
|
||
self.Station = self.Path and self.EndStation or self.StartStation
|
||
self.Arrived = true
|
||
elseif self.Arrived then
|
||
if self.Path then
|
||
self.Station = math.max(self.StartStation,self.Station - 1)
|
||
else
|
||
self.Station = math.min(self.EndStation,self.Station + 1)
|
||
end
|
||
self.Arrived = false
|
||
else
|
||
if self.Station ~= (self.Path and self.StartStation or self.EndStation) then
|
||
self.Arrived = true
|
||
end
|
||
end
|
||
end
|
||
self.Last = self.Station == last
|
||
self.Depeating = false
|
||
self:UpdateSarmat()
|
||
end
|
||
function TRAIN_SYSTEM:Prev()
|
||
local stbl = Metrostroi.SarmatUPOSetup[self.Train:GetNW2Int("Announcer",1)]
|
||
local stbll = stbl[self.Line]
|
||
if not stbll then return end
|
||
if stbll.Loop then
|
||
if not self.Arrived then
|
||
if self.Path then
|
||
if self.Station >= #stbll then self.Station = 0 end
|
||
self.Station = math.min(#stbll,self.Station + 1)
|
||
else
|
||
self.Station = math.max(0,self.Station - 1)
|
||
if self.Station <= 0 then self.Station = #stbll end
|
||
if self.Station == self.EndStation then
|
||
self:Prev()
|
||
end
|
||
end
|
||
self.Arrived = true
|
||
else
|
||
self.Arrived = false
|
||
end
|
||
else
|
||
if not self.Arrived then
|
||
if self.Path then
|
||
self.Station = math.min(self.EndStation,self.Station + 1)
|
||
else
|
||
self.Station = math.max(self.StartStation,self.Station - 1)
|
||
end
|
||
self.Arrived = true
|
||
else
|
||
if self.Station ~= (self.Path and self.EndStation or self.StartStation) then
|
||
self.Arrived = false
|
||
end
|
||
end
|
||
end
|
||
self.Last = self.Station == last
|
||
self.Depeating = false
|
||
self:UpdateSarmat()
|
||
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)
|
||
local ltbl = Metrostroi.SarmatUPOSetup[self.Train:GetNW2Int("Announcer",1)][self.Line]
|
||
if not ltbl then return end
|
||
local stbl = ltbl[self.Station]
|
||
local last = (self.Path and not ltbl.Loop) and self.StartStation or self.EndStation
|
||
local lastst = self.Station == last
|
||
if dep then
|
||
local message = stbl.dep[self.Path and 2 or 1]
|
||
if message and not lastst then
|
||
self.Train.Announcer:TriggerInput("Reset","AnnouncementsSarmatUPO")
|
||
self:AnnQueue("tone")
|
||
if stbl.odz then self:AnnQueue(stbl.odz) end
|
||
self:AnnQueue(message)
|
||
end
|
||
else
|
||
local message
|
||
if lastst then
|
||
message = stbl.arrlast[self.Path and 2 or 1]
|
||
else
|
||
message = stbl.arr[self.Path and 2 or 1]
|
||
end
|
||
if message then
|
||
self.Train.Announcer:TriggerInput("Reset","AnnouncementsSarmatUPO")
|
||
self:AnnQueue("tone")
|
||
if lastst and not stbl.ignorelast then self:AnnQueue(-1) end
|
||
self:AnnQueue(message)
|
||
end
|
||
end
|
||
self.Last = lastst
|
||
self:UpdateSarmat()
|
||
end
|
||
|
||
function TRAIN_SYSTEM:UpdateSarmat()
|
||
if not self.Active then return end
|
||
local tbl = Metrostroi.SarmatUPOSetup[self.Train:GetNW2Int("Announcer",1)][self.Line]
|
||
if not tbl then
|
||
self.Train:CANWrite("BMCIK",self.Train:GetWagonNumber(),"BNT",nil,"Current",0)
|
||
self.Train:CANWrite("BMCIK",self.Train:GetWagonNumber(),"BNT",nil,"Arrival",32)
|
||
self.Train:CANWrite("BMCIK",self.Train:GetWagonNumber(),"BNT",nil,"Path",self.Path)
|
||
|
||
self.Train:CANWrite("BMCIK",self.Train:GetWagonNumber(),"Tickers",nil,"Prev",self.Specials[self.Line])
|
||
self.Train:CANWrite("BMCIK",self.Train:GetWagonNumber(),"Tickers",nil,"PrevEn",false)
|
||
self.Train:CANWrite("BMCIK",self.Train:GetWagonNumber(),"Tickers",nil,"Next",self.Specials[self.Line])
|
||
self.Train:CANWrite("BMCIK",self.Train:GetWagonNumber(),"Tickers",nil,"NextEn",false)
|
||
self.Train:CANWrite("BMCIK",self.Train:GetWagonNumber(),"Tickers",nil,"NextRight",false)
|
||
self.Train:CANWrite("BMCIK",self.Train:GetWagonNumber(),"Tickers",nil,"Curr",self.Specials[self.Line])
|
||
self.Train:CANWrite("BMCIK",self.Train:GetWagonNumber(),"Tickers",nil,"CurrEn",false)
|
||
self.Train:CANWrite("BMCIK",self.Train:GetWagonNumber(),"Tickers",nil,"CurrRight",false)
|
||
self.Train:CANWrite("BMCIK",self.Train:GetWagonNumber(),"Tickers",nil,"Arrived",true)
|
||
self.Train:CANWrite("BMCIK",self.Train:GetWagonNumber(),"Tickers",nil,"Last",false)
|
||
self.Train:CANWrite("BMCIK",self.Train:GetWagonNumber(),"Tickers",nil,"Closing",false)
|
||
if self.Specials[self.Line] then
|
||
self.Train:CANWrite("BMCIK",self.Train:GetWagonNumber(),"Tickers",nil,"Special","%g"..self.Specials[self.Line].."\n%r"..self.Specials[self.Line])
|
||
end
|
||
return
|
||
end
|
||
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+(self.Depeating and 0 or 1),-1 do curr = curr + stbl[i] end
|
||
else
|
||
for i=1,self.Station-(self.Depeating and 0 or 1) do curr = curr + stbl[i] end
|
||
end
|
||
local nxt = 0
|
||
if self.Arrived and not self.Depeating then
|
||
curr = curr + stbl[self.Station]
|
||
else
|
||
nxt = stbl[self.Station]
|
||
end
|
||
self.Train:CANWrite("BMCIK",self.Train:GetWagonNumber(),"BNT",nil,"Current",curr)
|
||
self.Train:CANWrite("BMCIK",self.Train:GetWagonNumber(),"BNT",nil,"Arrival",nxt)
|
||
self.Train:CANWrite("BMCIK",self.Train:GetWagonNumber(),"BNT",nil,"Path",self.Path)
|
||
|
||
local curr,prev,nxt = tbl[self.Station],tbl[self.Station-(self.Path and -1 or 1)],tbl[self.Station-(self.Path and 1 or -1)]
|
||
if not self.Arrived then prev = curr nxt = curr end
|
||
self.Train:CANWrite("BMCIK",self.Train:GetWagonNumber(),"BIT",nil,"Prev",prev and prev[2])
|
||
self.Train:CANWrite("BMCIK",self.Train:GetWagonNumber(),"BIT",nil,"PrevEn",prev and prev[3])
|
||
self.Train:CANWrite("BMCIK",self.Train:GetWagonNumber(),"BIT",nil,"Next",nxt and nxt[2])
|
||
self.Train:CANWrite("BMCIK",self.Train:GetWagonNumber(),"BIT",nil,"NextEn",nxt and nxt[3])
|
||
self.Train:CANWrite("BMCIK",self.Train:GetWagonNumber(),"BIT",nil,"NextRight",nxt and nxt.right_doors)
|
||
self.Train:CANWrite("BMCIK",self.Train:GetWagonNumber(),"BIT",nil,"Curr",curr and curr[2])
|
||
self.Train:CANWrite("BMCIK",self.Train:GetWagonNumber(),"BIT",nil,"CurrEn",curr and curr[3])
|
||
self.Train:CANWrite("BMCIK",self.Train:GetWagonNumber(),"BIT",nil,"CurrRight",curr and curr.right_doors)
|
||
self.Train:CANWrite("BMCIK",self.Train:GetWagonNumber(),"BIT",nil,"Arrived",self.Arrived and not self.Depeating)
|
||
self.Train:CANWrite("BMCIK",self.Train:GetWagonNumber(),"BIT",nil,"Last",self.Last)
|
||
self.Train:CANWrite("BMCIK",self.Train:GetWagonNumber(),"BIT",nil,"Closing",self.Depeating)
|
||
self.Train:CANWrite("BMCIK",self.Train:GetWagonNumber(),"BIT",nil,"Special",not self.Last and (self.Arrived and (self.Depeating and curr.messagedep or not self.Depeating and curr.messagearr) or not self.Arrived and prev.messagedep))
|
||
end
|
||
|
||
function TRAIN_SYSTEM:Trigger(name,value)
|
||
local Train = self.Train
|
||
if self.SarmatAnnState == 1 then
|
||
if name == "SarmatZero" and value then
|
||
self:Zero()
|
||
if self.ZeroTimer then
|
||
if CurTime()-self.ZeroTimer < 0.3 then self.SarmatAnnState = 2 end
|
||
self.ZeroTimer = nil
|
||
end
|
||
if not self.ZeroTimer then self.ZeroTimer = CurTime() end
|
||
end
|
||
if name == "SarmatLine" and value then
|
||
self.LineEnabled = not self.LineEnabled
|
||
end
|
||
if name == "SarmatStart" and value and self.LineOut==0 then
|
||
if not self.Arrived then
|
||
self:Play(false)
|
||
elseif self.Arrived then
|
||
self:Play(true)
|
||
end
|
||
end
|
||
local stbl = Metrostroi.SarmatUPOSetup[self.Train:GetNW2Int("Announcer",1)]
|
||
if name == "SarmatPath" and value then
|
||
self.Path = not self.Path
|
||
if not stbl[self.Line] then
|
||
self.LastStationName = self.Specials[self.Line]
|
||
elseif self.EndStation == 0 then
|
||
self.LastStationName = "Кольцевой"
|
||
else
|
||
self.LastStationName = stbl[self.Line][self.Path and not stbl[self.Line].Loop and self.StartStation or self.EndStation][2]
|
||
end
|
||
self:Zero()
|
||
end
|
||
if name == "SarmatF1" and value and stbl[self.Line] then
|
||
self.SarmatAnnState = 3
|
||
self.Select = 1
|
||
end
|
||
if name == "SarmatF2" and value and stbl[self.Line] then
|
||
self.SarmatAnnState = 4
|
||
self.Select = 1
|
||
end
|
||
if name == "SarmatF3" and value and stbl[self.Line] then
|
||
self.SarmatAnnState = 5
|
||
self.Select = 1
|
||
end
|
||
if name == "SarmatF4" and value then
|
||
self.SarmatAnnState = 6
|
||
self.Select = 1
|
||
end
|
||
if name == "SarmatDown" and value then
|
||
self:Next()
|
||
end
|
||
if name == "SarmatUp" and value then
|
||
self:Prev()
|
||
end
|
||
end
|
||
if self.SarmatAnnState == 2 then
|
||
local stbl = Metrostroi.SarmatUPOSetup[self.Train:GetNW2Int("Announcer",1)]
|
||
if name == "SarmatDown" and value then
|
||
self.Line = math.min(#stbl,self.Line + 1)
|
||
end
|
||
if name == "SarmatUp" and value then
|
||
self.Line = math.max(-4,self.Line - 1)
|
||
end
|
||
if name == "SarmatEnter" and value then
|
||
self.SarmatAnnState = 1
|
||
self.StartStation = 1
|
||
if stbl[self.Line] then
|
||
if stbl[self.Line].Loop then
|
||
self.EndStation = 0
|
||
else
|
||
self.EndStation = #stbl[self.Line]
|
||
end
|
||
if self.EndStation == 0 then
|
||
self.LastStationName = "Кольцевой"
|
||
else
|
||
self.LastStationName = stbl[self.Line][self.Path and not stbl[self.Line].Loop and self.StartStation or self.EndStation][2]
|
||
end
|
||
else
|
||
self.EndStation = 0
|
||
self.LastStationName = self.Specials[self.Line]
|
||
end
|
||
self:Zero()
|
||
end
|
||
end
|
||
if self.SarmatAnnState == 3 then
|
||
local stbl = Metrostroi.SarmatUPOSetup[self.Train:GetNW2Int("Announcer",1)]
|
||
local stbll = stbl[self.Line]
|
||
if name == "SarmatDown" and value then
|
||
for i=self.Select+1,#stbll do
|
||
if i==1 or i==#stbll or stbll[i].arrlast then
|
||
self.Select = i
|
||
break
|
||
end
|
||
end
|
||
end
|
||
if name == "SarmatUp" and value then
|
||
local selected = false
|
||
for i=self.Select-1,1,-1 do
|
||
if i==1 or i==#stbll or stbll[i].arrlast then
|
||
self.Select = i
|
||
selected = true
|
||
break
|
||
end
|
||
end
|
||
if stbll.Loop and not selected then
|
||
self.Select = 0
|
||
end
|
||
end
|
||
if name == "SarmatF1" and value and not stbll.Loop then
|
||
if self.Select < self.EndStation then
|
||
self.StartStation = self.Select
|
||
self.LastStationName = stbl[self.Line][self.Path and not stbl[self.Line].Loop and self.StartStation or self.EndStation][2]
|
||
self:Zero()
|
||
end
|
||
end
|
||
if name == "SarmatF2" and value then
|
||
if self.Select > self.StartStation or stbll.Loop then
|
||
self.EndStation = self.Select
|
||
if self.EndStation == 0 then
|
||
self.LastStationName = "Кольцевой"
|
||
else
|
||
self.LastStationName = stbl[self.Line][self.Path and not stbl[self.Line].Loop and self.StartStation or self.EndStation][2]
|
||
end
|
||
self:Zero()
|
||
end
|
||
end
|
||
if (name == "SarmatEnter" or name == "SarmatEsc") and value then
|
||
self.SarmatAnnState = 1
|
||
self:Zero()
|
||
end
|
||
end
|
||
if self.SarmatAnnState == 4 then
|
||
if (name == "SarmatEnter" or name == "SarmatEsc") and value then
|
||
self.SarmatAnnState = 1
|
||
end
|
||
end
|
||
if self.SarmatAnnState == 5 then
|
||
if (name == "SarmatEnter" or name == "SarmatEsc") and value then
|
||
self.SarmatAnnState = 1
|
||
end
|
||
end
|
||
if self.SarmatAnnState == 6 then
|
||
if (name == "SarmatEnter" or name == "SarmatEsc") and value then
|
||
self.SarmatAnnState = 1
|
||
end
|
||
end
|
||
Train:SetNW2Int("SarmatSelect",self.Select)
|
||
end
|
||
function TRAIN_SYSTEM:Think(dT)
|
||
local Train = self.Train
|
||
local Power = Train.Electric.Power > 0 and Train.SF17.Value > 0
|
||
|
||
if not Power and self.SarmatState ~= 0 then
|
||
self.SarmatState = 0
|
||
self.SarmatTimer = nil
|
||
if self.LineOut>0 then self:AnnQueue(-2) end
|
||
end
|
||
if Power and self.SarmatState == 0 then
|
||
self.SarmatState = -1
|
||
self.SarmatTimer = CurTime()-math.Rand(-0.5,1)
|
||
self.SarmatAnnState = 1
|
||
self.SarmatCamState = 1
|
||
self.Cam1,self.Cam1E = false,NULL
|
||
self.Cam2,self.Cam2E = false,NULL
|
||
self.Cam3,self.Cam3E = false,NULL
|
||
self.Cam4,self.Cam4E = false,NULL
|
||
self.Selected = 0
|
||
Train:SetNW2Int("SarmatCamSelected",self.Selected)
|
||
end
|
||
if self.SarmatState == -1 and self.SarmatTimer and CurTime()-self.SarmatTimer > 2 then
|
||
self.SarmatState = -2
|
||
self.SarmatTimer = CurTime()-math.Rand(-0.5,1.5)
|
||
end
|
||
if self.SarmatState == -2 and self.SarmatTimer and CurTime()-self.SarmatTimer > 14 then
|
||
self.SarmatState = -3
|
||
self.SarmatTimer = CurTime()-math.Rand(-0.3,0.5)
|
||
end
|
||
if self.SarmatState == -3 and self.SarmatTimer and CurTime()-self.SarmatTimer > 1 then
|
||
if Metrostroi.SarmatUPOSetup and Metrostroi.SarmatUPOSetup[self.Train:GetNW2Int("Announcer",1)] then
|
||
self.SarmatState = 1
|
||
else
|
||
self.SarmatState = -4
|
||
return
|
||
end
|
||
|
||
local stbl = Metrostroi.SarmatUPOSetup[self.Train:GetNW2Int("Announcer",1)]
|
||
self.StartStation = self.StartStation or 1
|
||
if stbl[self.Line].Loop then
|
||
self.EndStation = self.EndStation or 0
|
||
else
|
||
self.EndStation = self.EndStation or #stbl[self.Line]
|
||
end
|
||
if self.EndStation == 0 then
|
||
self.LastStationName = "Кольцевой"
|
||
else
|
||
self.LastStationName = stbl[self.Line][self.Path and not stbl[self.Line].Loop and self.StartStation or self.EndStation][2]
|
||
end
|
||
self:Zero()
|
||
end
|
||
if self.SarmatState > 0 and Train.BUKP.Active > 0 then
|
||
if self.SarmatCamState > 1 then
|
||
Train:SetNW2Int("SarmatCamType",self.SarmatCamType)
|
||
local cam1,cam2,cam3,cam4 = false,false,false,false
|
||
for i=1,#Train.WagonList do
|
||
local train = Train.WagonList[i]
|
||
if self.Cam1 and self.Cam1E == train then cam1 = true end
|
||
if self.Cam2 and self.Cam2E == train then cam2 = true end
|
||
if self.Cam3 and self.Cam3E == train then cam3 = true end
|
||
if self.Cam4 and self.Cam4E == train then cam4 = true end
|
||
end
|
||
if self.Cam1 == true and (not IsValid(self.Cam1E) or not cam1) then self.Cam1 = false end
|
||
if self.Cam2 == true and (not IsValid(self.Cam2E) or not cam2) then self.Cam2 = false end
|
||
if self.Cam3 == true and (not IsValid(self.Cam3E) or not cam3) then self.Cam3 = false end
|
||
if self.Cam4 == true and (not IsValid(self.Cam4E) or not cam4) then self.Cam4 = false end
|
||
if self.Cam1 == true then
|
||
Train:SetNW2Bool("SarmatCam1C",true)
|
||
Train:SetNW2Entity("SarmatCam1E",self.Cam1E)
|
||
else
|
||
if self.Cam1 and self.Cam1 ~= true and CurTime()-self.Cam1 > 0 then self.Cam1 = true end
|
||
Train:SetNW2Bool("SarmatCam1C",false)
|
||
end
|
||
if IsValid(self.Cam1E) then Train:SetNW2Int("SarmatCam1EN",self.Cam1E:GetWagonNumber()) end
|
||
if self.Cam2 == true then
|
||
Train:SetNW2Bool("SarmatCam2C",true)
|
||
Train:SetNW2Entity("SarmatCam2E",self.Cam2E)
|
||
else
|
||
if self.Cam2 and self.Cam2 ~= true and CurTime()-self.Cam2 > 0 then self.Cam2 = true end
|
||
Train:SetNW2Bool("SarmatCam2C",false)
|
||
end
|
||
if IsValid(self.Cam2E) then Train:SetNW2Int("SarmatCam2EN",self.Cam2E:GetWagonNumber()) end
|
||
if self.Cam3 == true then
|
||
Train:SetNW2Bool("SarmatCam3C",true)
|
||
Train:SetNW2Entity("SarmatCam3E",self.Cam3E)
|
||
else
|
||
if self.Cam3 and self.Cam3 ~= true and CurTime()-self.Cam3 > 0 then self.Cam3 = true end
|
||
Train:SetNW2Bool("SarmatCam3C",false)
|
||
end
|
||
if IsValid(self.Cam3E) then Train:SetNW2Int("SarmatCam3EN",self.Cam3E:GetWagonNumber()) end
|
||
if self.Cam4 == true then
|
||
Train:SetNW2Bool("SarmatCam4C",true)
|
||
Train:SetNW2Entity("SarmatCam4E",self.Cam4E)
|
||
else
|
||
if self.Cam4 and self.Cam4 ~= true and CurTime()-self.Cam4 > 0 then self.Cam4 = true end
|
||
Train:SetNW2Bool("SarmatCam4C",false)
|
||
end
|
||
if IsValid(self.Cam4E) then Train:SetNW2Int("SarmatCam4EN",self.Cam4E:GetWagonNumber()) end
|
||
Train:SetNW2Int("SarmatCamC",self.SarmatCamCount)
|
||
end
|
||
|
||
|
||
Train:SetNW2Int("SarmatCamState",self.SarmatCamState)
|
||
else
|
||
Train:SetNW2Int("SarmatCamState",0)
|
||
Train:SetNW2Bool("SarmatCam1C",false)
|
||
Train:SetNW2Bool("SarmatCam2C",false)
|
||
Train:SetNW2Bool("SarmatCam3C",false)
|
||
Train:SetNW2Bool("SarmatCam4C",false)
|
||
end
|
||
if self.SarmatState > 0 and Train.BUKP.Active > 0 then
|
||
if not self.Active then self.Active = true self:UpdateSarmat() end
|
||
for k,v in pairs(self.TriggerNames) do
|
||
if Train[v] and (Train[v].Value > 0.5) ~= self.Triggers[v] then
|
||
self:Trigger(v,Train[v].Value > 0.5)
|
||
--print(v,self.Train[v].Value > 0.5)
|
||
self.Triggers[v] = Train[v].Value > 0.5
|
||
end
|
||
end
|
||
local OpenDoors = Train.BUKP.OpenLeft or Train.BUKP.OpenRight
|
||
local CloseDoors = not not Train.BUKP.CloseRing
|
||
local UPOPlaying = self.UPOActive>0 and Train.UPO.LineOut>0
|
||
if not self.Depeating and (OpenDoors or UPOPlaying) and not self.Arrived then
|
||
self.Arrived = true
|
||
if self.UPOActive==0 then self:Play(false) end
|
||
end
|
||
if OpenDoors and self.Depeating then
|
||
self.Depeating = false
|
||
self:UpdateSarmat()
|
||
end
|
||
if self.Arrived and (CloseDoors~=self.CloseDoors and CloseDoors or UPOPlaying) then
|
||
--local ltbl = Metrostroi.SarmatUPOSetup[self.Train:GetNW2Int("Announcer",1)][self.Line]
|
||
if self.UPOActive==0 and not self.Depeating then
|
||
self.Depeating = true
|
||
self:Play(true)
|
||
end
|
||
--self:UpdateSarmat()
|
||
end
|
||
self.CloseDoors = CloseDoors
|
||
if self.UPOActive>0 and not UPOPlaying and (not self.UPOLock or CurTime()-self.UPOLock)>0.5 then
|
||
self.UPOActive = 0
|
||
self.UPOLock = false
|
||
end
|
||
if self.Depeating and Train.BUKP.Speed>3 then
|
||
self:Next()
|
||
end
|
||
else
|
||
if self.Depeating then
|
||
self:Next()
|
||
end
|
||
self.UPOActive = 0
|
||
self.UPOLock = false
|
||
self.CloseDoors = false
|
||
self.Active = false
|
||
--self.CloseTimer = CurTime()
|
||
end
|
||
Train:SetNW2Bool("SarmatMonitor",Train.Electric.Power>0 and Train.SF16.Value > 0)
|
||
Train:SetNW2Int("SarmatState",self.SarmatState)
|
||
Train:SetNW2Int("WagNum",#Train.WagonList)
|
||
|
||
Train:SetNW2Int("SarmatAnnState",self.SarmatAnnState)
|
||
|
||
Train:SetNW2Int("SarmatLine",self.Line)
|
||
Train:SetNW2Bool("SarmatPath",self.Path)
|
||
Train:SetNW2Int("SarmatStation",self.Station)
|
||
Train:SetNW2Bool("SarmatStationArr",self.Arrived)
|
||
|
||
Train:SetNW2Bool("SarmatLineEnabled",self.LineEnabled)
|
||
|
||
Train:SetNW2Int("SarmatStartStation",self.StartStation)
|
||
Train:SetNW2Int("SarmatEndStation",self.EndStation)
|
||
|
||
local Ann = Train.Announcer
|
||
self.LineOut = (Ann.AnnTable=="AnnouncementsSarmatUPO" and Ann.AnnounceTimer) and 1 or 0
|
||
end
|
||
else
|
||
local function createFont(name,font,size,weight)
|
||
surface.CreateFont("Metrostroi_"..name, {
|
||
font = font,
|
||
size = size,
|
||
weight = weight or 400,
|
||
blursize = 0,
|
||
antialias = true,
|
||
underline = false,
|
||
italic = false,
|
||
strikeout = false,
|
||
symbol = false,
|
||
rotary = false,
|
||
shadow = false,
|
||
additive = false,
|
||
outline = false,
|
||
extended = true,
|
||
})
|
||
end
|
||
--createFont("BUKPSpeed","Eurostar Metrostroi",80)
|
||
createFont("Arial15","Arial",15,800)
|
||
createFont("Arial20","Arial",20,800)
|
||
createFont("Arial22","Arial",22,400)
|
||
createFont("Arial25","Arial",25,400)
|
||
createFont("Arial30","Arial",30,400)
|
||
local ubuntu_load = surface.GetTextureID("models/metrostroi_train/81-722/screens/sarmat_upo/ubuntu_load")
|
||
local button = surface.GetTextureID("models/metrostroi_train/81-722/screens/sarmat_upo/button")
|
||
|
||
|
||
|
||
function TRAIN_SYSTEM:ClientInitialize()
|
||
self.Cam1 = self.Train:CreateRT("720SarmatC1",256,256,true)
|
||
self.Cam2 = self.Train:CreateRT("720SarmatC2",256,256,true)
|
||
self.Cam3 = self.Train:CreateRT("720SarmatC3",256,256,true)
|
||
self.Cam4 = self.Train:CreateRT("720SarmatC4",256,256,true)
|
||
end
|
||
local CamRT = surface.GetTextureID( "pp/rt" )
|
||
local CamRTM = Material( "pp/rt" )
|
||
local SarPos = Vector(470,41,-6)
|
||
function TRAIN_SYSTEM:ClientThink()
|
||
if not self.Train:ShouldDrawPanel("Sarmat") then return end
|
||
local train = self.Train
|
||
local state = train:GetNW2Int("SarmatState",0)
|
||
local camstate = train:GetNW2Int("SarmatCamState",1)
|
||
local Cam1,Cam1E = train:GetNW2Bool("SarmatCam1C"),train:GetNW2Entity("SarmatCam1E")
|
||
local Cam2,Cam2E = train:GetNW2Bool("SarmatCam2C"),train:GetNW2Entity("SarmatCam2E")
|
||
local Cam3,Cam3E = train:GetNW2Bool("SarmatCam3C"),train:GetNW2Entity("SarmatCam3E")
|
||
local Cam4,Cam4E = train:GetNW2Bool("SarmatCam4C"),train:GetNW2Entity("SarmatCam4E")
|
||
if state > 0 then
|
||
if camstate == 2 then
|
||
if Cam1 then Metrostroi.RenderCamOnRT(train,SarPos,"Cam1",math.Rand(0.2,0.5),self.Cam1,Cam1E,Vector(425,65,40),Angle(5,180-5,0),256,256,2,64,64) end
|
||
if Cam2 then Metrostroi.RenderCamOnRT(train,SarPos,"Cam2",math.Rand(0.2,0.5),self.Cam2,Cam2E,Vector(425,-65,40),Angle(5,180+5,0),256,256,2,64,64) end
|
||
end
|
||
if camstate == 3 then
|
||
if Cam1 then Metrostroi.RenderCamOnRT(train,SarPos,"Cam1",math.Rand(0.2,0.5),self.Cam1,Cam1E,Vector(425,-65,40),Angle(5,180+5,0),256,256,2,64,64) end
|
||
if Cam2 then Metrostroi.RenderCamOnRT(train,SarPos,"Cam2",math.Rand(0.2,0.5),self.Cam2,Cam2E,Vector(425,65,40),Angle(5,180-5,0),256,256,2,64,64) end
|
||
end
|
||
if camstate == 4 then
|
||
if Cam1 then Metrostroi.RenderCamOnRT(train,SarPos,"Cam1",math.Rand(0.2,0.5),self.Cam1,Cam1E,Vector(425,65,40),Angle(5,180-5,0),256,256,2,64,64) end
|
||
if Cam2 then Metrostroi.RenderCamOnRT(train,SarPos,"Cam2",math.Rand(0.2,0.5),self.Cam2,Cam2E,Vector(425,-65,40),Angle(5,180+5,0),256,256,2,64,64) end
|
||
if Cam3 then Metrostroi.RenderCamOnRT(train,SarPos,"Cam3",math.Rand(0.2,0.5),self.Cam3,Cam3E,Vector(425,-65,40),Angle(5,180+5,0),256,256,2,64,64) end
|
||
if Cam4 then Metrostroi.RenderCamOnRT(train,SarPos,"Cam4",math.Rand(0.2,0.5),self.Cam4,Cam4E,Vector(425,65,40),Angle(5,180-5,0),256,256,2,64,64) end
|
||
end
|
||
if camstate == 5 then
|
||
if Cam1 then Metrostroi.RenderCamOnRT(train,SarPos,"Cam1",math.Rand(0.2,0.5),self.Cam1,Cam1E,Vector(360,-45,30),Angle(15,180-15,0),256,256,1) end
|
||
if Cam2 then Metrostroi.RenderCamOnRT(train,SarPos,"Cam2",math.Rand(0.2,0.5),self.Cam2,Cam2E,Vector(360,45,30),Angle(15,180+15,0),256,256,1) end
|
||
if Cam3 then Metrostroi.RenderCamOnRT(train,SarPos,"Cam3",math.Rand(0.2,0.5),self.Cam3,Cam3E,Vector(-360,-45,30),Angle(15,15,0),256,256) end
|
||
if Cam4 then Metrostroi.RenderCamOnRT(train,SarPos,"Cam4",math.Rand(0.2,0.5),self.Cam4,Cam4E,Vector(-360,45,30),Angle(15,-15,0),256,256) end
|
||
end
|
||
if camstate == 6 then
|
||
if Cam1 then Metrostroi.RenderCamOnRT(train,SarPos,"Cam1",math.Rand(0.2,0.5),self.Cam1,Cam1E,Vector(408,35,37),Angle(25,-15,0),256,256,1) end
|
||
end
|
||
if camstate == 7 then
|
||
if Cam1 then Metrostroi.RenderCamOnRT(train,SarPos,"Cam1",math.Rand(0.2,0.5),self.Cam1,Cam1E,Vector(490,6,-7),Angle(0,0,0),256,256,1) end
|
||
end
|
||
end
|
||
--debugoverlay.Sphere(self.Train:LocalToWorld(Vector(425,-65,46)),2,1,Color( 255, 255, 255 ),true)
|
||
render.PushRenderTarget(self.Train.Sarmat,0,0,1024, 1024)
|
||
render.Clear(0, 0, 0, 0)
|
||
cam.Start2D()
|
||
surface.SetDrawColor(0,0,0)
|
||
surface.DrawRect(0,0,1024,640)
|
||
self:SarmatMonitor(self.Train)
|
||
cam.End2D()
|
||
render.PopRenderTarget()
|
||
end
|
||
|
||
local function drawButton(x,y,w,h,text)
|
||
surface.DrawTexturedRectRotated(x,y,w,h,0)
|
||
draw.SimpleText(text,"Metrostroi_Arial20",x,y, Color(200,200,200),TEXT_ALIGN_CENTER,TEXT_ALIGN_CENTER)
|
||
end
|
||
local names = {
|
||
"Левые камеры",
|
||
"Передние камеры",
|
||
"Все левые/правые камеры",
|
||
"Задние камеры",
|
||
"Правые камеры",
|
||
"Салонные камеры",
|
||
"Камера на посте машиниста",
|
||
"Камера на посте машиниста",
|
||
"Путевая камера",
|
||
"Путевая камера",
|
||
}
|
||
local types = {
|
||
{"Левая камера 1 вагона","Левая камера %d вагона"},
|
||
{"Левая камера 1 вагона","Правая камера 1 вагона"},
|
||
{"Левая камера 1 вагона","Правая камера 1 вагона","Левая камера %d вагона","Правая камера %d вагона"},
|
||
{"Левая камера %d вагона","Правая камера %d вагона"},
|
||
{"Правая камера 1 вагона","Правая камера %d вагона"},
|
||
{"Передняя правая камера салона","Передняя левая камера салона","Задняя правая камера салона","Задняя левая камера салона"},
|
||
{"Камера кабины 1 вагона"},
|
||
{"Камера кабины %d вагона"},
|
||
{"Путевая камера 1 вагона"},
|
||
{"Путевая камера %d вагона"},
|
||
}
|
||
local inverts = {
|
||
{true,false},
|
||
{true,true},
|
||
{true,true,false,false},
|
||
{false,false},
|
||
{true,false},
|
||
{true,true,false,false},
|
||
{false},
|
||
{false},
|
||
{false},
|
||
{false},
|
||
}
|
||
--SarmatCam2T
|
||
function TRAIN_SYSTEM:SarmatMonitor(Train)
|
||
local state = Train:GetNW2Int("SarmatState",0)
|
||
local annstate = Train:GetNW2Int("SarmatAnnState",1)
|
||
local camstate = Train:GetNW2Int("SarmatCamState",1)
|
||
local WagNum = Train:GetNW2Int("WagNum",0)
|
||
if not Train:GetNW2Bool("SarmatMonitor") then return end
|
||
if state == -2 then
|
||
surface.SetDrawColor(255,255,255)
|
||
surface.DrawRect(0,0,1024,640)
|
||
surface.SetDrawColor(220,83,13)
|
||
surface.DrawRect(450+math.ceil(CurTime()%4-1)*32,341,6,6)
|
||
surface.SetTexture(ubuntu_load)
|
||
surface.SetDrawColor(255,255,255)
|
||
surface.DrawTexturedRectRotated(512,512,1024,1024,0)
|
||
elseif state == 1 then
|
||
surface.SetDrawColor(15,15,15)
|
||
surface.DrawRect(0,0,1024,640)
|
||
|
||
local line = Train:GetNW2Int("SarmatLine")
|
||
local path = Train:GetNW2Bool("SarmatPath")
|
||
local station = Train:GetNW2Int("SarmatStation",1)
|
||
local stationarr = Train:GetNW2Bool("SarmatStationArr")
|
||
|
||
local st = Train:GetNW2Int("SarmatStartStation")
|
||
local en = Train:GetNW2Int("SarmatEndStation")
|
||
|
||
local lineenabled = Train:GetNW2Bool("SarmatLineEnabled")
|
||
local sel = Train:GetNW2Int("SarmatSelect",1)
|
||
local stbl = Metrostroi.SarmatUPOSetup[Train:GetNW2Int("Announcer",1)]
|
||
Metrostroi.DrawRectOutline(820,5,96,26,lineenabled and Color(0,200,0) or Color(50,50,50),3)
|
||
draw.SimpleText("ЛИНИЯ","Metrostroi_Arial15",868,17, lineenabled and Color(0,200,0) or Color(50,50,50),TEXT_ALIGN_CENTER,TEXT_ALIGN_CENTER)
|
||
Metrostroi.DrawRectOutline(916,5,96,26,Color(200,200,200),3)
|
||
draw.SimpleText("ПУТЬ "..(path and 2 or 1),"Metrostroi_Arial15",964,17, Color(200,200,200),TEXT_ALIGN_CENTER,TEXT_ALIGN_CENTER)
|
||
|
||
if annstate == 1 then
|
||
local ann = stbl[line]
|
||
|
||
|
||
--render.DrawTextureToScreenRect(self.Cam3,0,260,260,260)
|
||
--render.DrawTextureToScreenRect(self.Cam4,260,260,260,260)
|
||
if not ann then
|
||
draw.SimpleText(Format("Линия: -%s-",self.Specials[line]),"Metrostroi_Arial20",870,60, Color(200,200,200),TEXT_ALIGN_CENTER,TEXT_ALIGN_CENTER)
|
||
else
|
||
draw.SimpleText(Format("Линия: %s-%s%s",ann[1][2],ann[#ann][2],ann.Loop and "[кол]" or ""),"Metrostroi_Arial20",870,60, Color(200,200,200),TEXT_ALIGN_CENTER,TEXT_ALIGN_CENTER)
|
||
local count = stationarr and 0.5 or 1
|
||
local last
|
||
if ann.Loop then
|
||
last = path and station-16 or 16+station
|
||
else
|
||
last = (path and st or en)
|
||
end
|
||
for i=station,last,path and -1 or 1 do
|
||
i = (i-1)%(#ann)+1
|
||
local stat = ann[i]
|
||
if ann.Loop and en > 0 and count > 1 and i == en+(path and -1 or 1) then
|
||
break
|
||
end
|
||
if ann.Loop or (path and i < station or i > station) or not stationarr then
|
||
if count > 9 and stationarr then
|
||
draw.SimpleText("...","Metrostroi_Arial22",760,30+count*54, Color(200,200,200),TEXT_ALIGN_LEFT,TEXT_ALIGN_CENTER)
|
||
break
|
||
elseif count >= 1 then
|
||
draw.SimpleText(stat[2],"Metrostroi_Arial22",760,30+count*54, Color(200,200,200),TEXT_ALIGN_LEFT,TEXT_ALIGN_CENTER)
|
||
end
|
||
end
|
||
if count > 8 and not stationarr then
|
||
draw.SimpleText("...","Metrostroi_Arial22",760,57+count*54, Color(200,200,200),TEXT_ALIGN_LEFT,TEXT_ALIGN_CENTER)
|
||
break
|
||
end
|
||
if (path and not ann.Loop and i~=st or (not path or ann.Loop and en > 0) and i~=en or ann.Loop and en == 0) then
|
||
draw.SimpleText(stat[2].." отпр.","Metrostroi_Arial22",760,57+count*54, Color(200,200,200),TEXT_ALIGN_LEFT,TEXT_ALIGN_CENTER)
|
||
else
|
||
draw.SimpleText(stat[2].." кон.","Metrostroi_Arial22",760,57+count*54, Color(200,200,200),TEXT_ALIGN_LEFT,TEXT_ALIGN_CENTER)
|
||
end
|
||
count = count + 1
|
||
end
|
||
end
|
||
end
|
||
if annstate == 2 then
|
||
draw.SimpleText("Выбор линии:","Metrostroi_Arial20",870,60, Color(200,200,200),TEXT_ALIGN_CENTER,TEXT_ALIGN_CENTER)
|
||
|
||
for cline=-4,#stbl do
|
||
if cline>0 then
|
||
local ann = stbl[cline]
|
||
draw.SimpleText(Format("%s-%s%s",ann[1][2],ann[#ann][2],ann.Loop and "[кол]" or ""),"Metrostroi_Arial22",760,60+(cline+5)*30, cline == line and Color(80,120,150) or Color(200,200,200),TEXT_ALIGN_LEFT,TEXT_ALIGN_CENTER)
|
||
else
|
||
draw.SimpleText(Format("-%s-",self.Specials[cline]),"Metrostroi_Arial22",760,60+(cline+5)*30, cline == line and Color(80,120,150) or Color(200,200,200),TEXT_ALIGN_LEFT,TEXT_ALIGN_CENTER)
|
||
end
|
||
end
|
||
end
|
||
if annstate == 3 then
|
||
draw.SimpleText("Выбор начальной и конечной:","Metrostroi_Arial20",870,60, Color(200,200,200),TEXT_ALIGN_CENTER,TEXT_ALIGN_CENTER)
|
||
local count = stbl[line].Loop and 2 or 1
|
||
if stbl[line].Loop then
|
||
draw.SimpleText("Кольцевой","Metrostroi_Arial22",760,60+30, 0 == sel and Color(80,120,150) or Color(200,200,200),TEXT_ALIGN_LEFT,TEXT_ALIGN_CENTER)
|
||
if en == 0 then
|
||
draw.SimpleText("К","Metrostroi_Arial22",750,60+30, Color(200,0,0),TEXT_ALIGN_CENTER,TEXT_ALIGN_CENTER)
|
||
end
|
||
end
|
||
for i=1,#stbl[line] do
|
||
local ann = stbl[line][i]
|
||
if i==1 or i==#stbl[line] or ann.arrlast then
|
||
draw.SimpleText(ann[2],"Metrostroi_Arial22",760,60+count*30, i == sel and Color(80,120,150) or Color(200,200,200),TEXT_ALIGN_LEFT,TEXT_ALIGN_CENTER)
|
||
if not stbl[line].Loop and st==i then
|
||
draw.SimpleText("Н","Metrostroi_Arial22",750,60+count*30, Color(0,200,0),TEXT_ALIGN_CENTER,TEXT_ALIGN_CENTER)
|
||
elseif en == i then
|
||
draw.SimpleText("К","Metrostroi_Arial22",750,60+count*30, Color(200,0,0),TEXT_ALIGN_CENTER,TEXT_ALIGN_CENTER)
|
||
end
|
||
count = count + 1
|
||
end
|
||
end
|
||
end
|
||
|
||
surface.SetDrawColor(127,127,127)
|
||
surface.SetTexture(button)
|
||
if camstate == 0 then
|
||
draw.SimpleText("Система видеонаблюдения","Metrostroi_Arial25",360 ,25, Color(200,200,200),TEXT_ALIGN_CENTER,TEXT_ALIGN_CENTER)
|
||
draw.SimpleText("Не активна","Metrostroi_Arial20",360,85, Color(200,200,200),TEXT_ALIGN_CENTER,TEXT_ALIGN_CENTER)
|
||
end
|
||
if camstate == 1 then
|
||
local selected = Train:GetNW2Int("SarmatCamSelected",0)
|
||
draw.SimpleText("Система видеонаблюдения","Metrostroi_Arial25",360 ,25, Color(200,200,200),TEXT_ALIGN_CENTER,TEXT_ALIGN_CENTER)
|
||
draw.SimpleText("Наружные камеры","Metrostroi_Arial20",360,85, Color(200,200,200),TEXT_ALIGN_CENTER,TEXT_ALIGN_CENTER)
|
||
|
||
drawButton(124,140,113,40,"Левые")
|
||
draw.SimpleText("Вагон 1","Metrostroi_Arial20",235,106, Color(200,200,200),TEXT_ALIGN_CENTER,TEXT_ALIGN_CENTER)
|
||
drawButton(242,140,113,40,"Передние")
|
||
draw.SimpleText("Все вагоны","Metrostroi_Arial20",360,106, Color(200,200,200),TEXT_ALIGN_CENTER,TEXT_ALIGN_CENTER)
|
||
drawButton(360,140,113,40,"Вокруг")
|
||
draw.SimpleText("Вагон "..WagNum,"Metrostroi_Arial20",485,106, Color(200,200,200),TEXT_ALIGN_CENTER,TEXT_ALIGN_CENTER)
|
||
drawButton(478,140,113,40,"Задние")
|
||
drawButton(596,140,113,40,"Правые")
|
||
|
||
draw.SimpleText("Камеры в салоне","Metrostroi_Arial20",360,200, Color(200,200,200),TEXT_ALIGN_CENTER,TEXT_ALIGN_CENTER)
|
||
for i=1+selected,math.min(WagNum,6+selected) do
|
||
drawButton(65+(i-1-selected)*118+118*math.max(0,6-WagNum)/2 ,235,113,40,"Вагон "..i)
|
||
end
|
||
|
||
draw.SimpleText("Камеры на постах машиниста","Metrostroi_Arial20",360,315, Color(200,200,200),TEXT_ALIGN_CENTER,TEXT_ALIGN_CENTER)
|
||
drawButton(220,350,113,40,"Вагон 1")
|
||
drawButton(500,350,113,40,"Вагон "..WagNum)
|
||
|
||
draw.SimpleText("Путевые камеры","Metrostroi_Arial20",360,430, Color(200,200,200),TEXT_ALIGN_CENTER,TEXT_ALIGN_CENTER)
|
||
drawButton(220,465,113,40,"Вагон 1")
|
||
drawButton(500,465,113,40,"Вагон "..WagNum)
|
||
--surface.DrawTexturedRectRotated(110,590,200,40,0)
|
||
--draw.SimpleText("Esc","Metrostroi_Arial20",110,590, Color(200,200,200),TEXT_ALIGN_CENTER,TEXT_ALIGN_CENTER)
|
||
|
||
if selected ~= 0 then drawButton(320,590,200,40,"<-") end
|
||
if 6+selected < WagNum then drawButton(530,590,200,40,"->") end
|
||
--render.DrawTextureToScreenRect(self.Cam1,15,50,690,510)
|
||
end
|
||
if camstate > 1 then
|
||
local camtype = Train:GetNW2Int("SarmatCamType")
|
||
draw.SimpleText(names[camtype] or "Система видеонаблюдения","Metrostroi_Arial25",15 ,25, Color(200,200,200),TEXT_ALIGN_LEFT,TEXT_ALIGN_CENTER)
|
||
local CamCount = Train:GetNW2Int("SarmatCamC")
|
||
local Cam1 = Train:GetNW2Bool("SarmatCam1C")
|
||
local Cam2 = Train:GetNW2Bool("SarmatCam2C")
|
||
local Cam3 = Train:GetNW2Bool("SarmatCam3C")
|
||
local Cam4 = Train:GetNW2Bool("SarmatCam4C")
|
||
if CamCount > 0 then
|
||
local invert = inverts[camtype][1]
|
||
local w,h = 340,250
|
||
if CamCount < 2 then w = 690 end
|
||
if CamCount < 3 then h = 510 end
|
||
if Cam1 then
|
||
surface.SetDrawColor(255,255,255,255)
|
||
if invert then render.DrawTextureToScreenRect(self.Cam1,15+w,50,-w,h) else render.DrawTextureToScreenRect(self.Cam1,15,50,w,h) end
|
||
draw.SimpleText("связь","Metrostroi_Arial20",15+w-5,50+h-10, Color(50,200,50),TEXT_ALIGN_RIGHT,TEXT_ALIGN_CENTER)
|
||
else
|
||
surface.SetDrawColor(0,0,0,255)
|
||
surface.DrawRect(15,50,w,h)
|
||
draw.SimpleText("Подключение к камере...","Metrostroi_Arial30",15+w/2,50+h/2, Color(200,200,200),TEXT_ALIGN_CENTER,TEXT_ALIGN_CENTER)
|
||
draw.SimpleText("нет связи","Metrostroi_Arial20",15+w-5,50+h-10, Color(200,50,50),TEXT_ALIGN_RIGHT,TEXT_ALIGN_CENTER)
|
||
end
|
||
draw.SimpleText("[1]"..Format(types[camtype][1],WagNum),"Metrostroi_Arial20",15+5,50+10, Color(200,150,50),TEXT_ALIGN_LEFT,TEXT_ALIGN_CENTER)
|
||
draw.SimpleText(Format("Вагон №%d",Train:GetNW2Int("SarmatCam1EN")),"Metrostroi_Arial20",15+5,50+30, Color(200,150,50),TEXT_ALIGN_LEFT,TEXT_ALIGN_CENTER)
|
||
Metrostroi.DrawRectOutline(15,50,w,h,Color(40,40,40),2)
|
||
end
|
||
if CamCount > 1 then
|
||
local h = 250
|
||
if CamCount < 3 then h = 510 end
|
||
if Cam2 then
|
||
local invert = inverts[camtype][2]
|
||
surface.SetDrawColor(255,255,255,255)
|
||
if invert then render.DrawTextureToScreenRect(self.Cam2,340+15+10+340,50,-340,h) else render.DrawTextureToScreenRect(self.Cam2,340+15+10,50,340,h) end
|
||
draw.SimpleText("связь","Metrostroi_Arial20",365+340-5,50+h-10, Color(50,200,50),TEXT_ALIGN_RIGHT,TEXT_ALIGN_CENTER)
|
||
else
|
||
surface.SetDrawColor(0,0,0,255)
|
||
surface.DrawRect(340+15+10,50,340,h)
|
||
draw.SimpleText("Подключение к камере...","Metrostroi_Arial30",365+340/2,50+h/2, Color(200,200,200),TEXT_ALIGN_CENTER,TEXT_ALIGN_CENTER)
|
||
draw.SimpleText("нет связи","Metrostroi_Arial20",365+340-5,50+h-10, Color(200,50,50),TEXT_ALIGN_RIGHT,TEXT_ALIGN_CENTER)
|
||
end
|
||
draw.SimpleText("[2]"..Format(types[camtype][2],WagNum),"Metrostroi_Arial20",365+5,50+10, Color(200,150,50),TEXT_ALIGN_LEFT,TEXT_ALIGN_CENTER)
|
||
draw.SimpleText(Format("Вагон №%d",Train:GetNW2Int("SarmatCam2EN")),"Metrostroi_Arial20",365+5,50+30, Color(200,150,50),TEXT_ALIGN_LEFT,TEXT_ALIGN_CENTER)
|
||
Metrostroi.DrawRectOutline(340+15+10,50,340,h,Color(40,40,40),2)
|
||
end
|
||
if CamCount > 2 then
|
||
if Cam3 then
|
||
local invert = inverts[camtype][3]
|
||
surface.SetDrawColor(255,255,255,255)
|
||
if invert then render.DrawTextureToScreenRect(self.Cam3,15+340,50+250+10,-340,250) else render.DrawTextureToScreenRect(self.Cam3,15,50+250+10,340,250) end
|
||
draw.SimpleText("связь","Metrostroi_Arial20",15+340-5,300+250, Color(50,200,50),TEXT_ALIGN_RIGHT,TEXT_ALIGN_CENTER)
|
||
else
|
||
surface.SetDrawColor(0,0,0,255)
|
||
surface.DrawRect(15,50+250+10,340,250)
|
||
draw.SimpleText("Подключение к камере...","Metrostroi_Arial30",15+340/2,310+250/2, Color(200,200,200),TEXT_ALIGN_CENTER,TEXT_ALIGN_CENTER)
|
||
draw.SimpleText("нет связи","Metrostroi_Arial20",15+340-5,300+250, Color(200,50,50),TEXT_ALIGN_RIGHT,TEXT_ALIGN_CENTER)
|
||
end
|
||
draw.SimpleText("[3]"..Format(types[camtype][3],WagNum),"Metrostroi_Arial20",15+5,310+10, Color(200,150,50),TEXT_ALIGN_LEFT,TEXT_ALIGN_CENTER)
|
||
draw.SimpleText(Format("Вагон №%d",Train:GetNW2Int("SarmatCam3EN")),"Metrostroi_Arial20",15+5,310+30, Color(200,150,50),TEXT_ALIGN_LEFT,TEXT_ALIGN_CENTER)
|
||
Metrostroi.DrawRectOutline(15,50+250+10,340,250,Color(40,40,40),2)
|
||
end
|
||
if CamCount > 3 then
|
||
local invert = inverts[camtype][4]
|
||
if Cam4 then
|
||
surface.SetDrawColor(255,255,255,255)
|
||
if invert then render.DrawTextureToScreenRect(self.Cam4,340+15+10+340,50+250+10,-340,250) else render.DrawTextureToScreenRect(self.Cam4,340+15+10,50+250+10,340,250) end
|
||
draw.SimpleText("связь","Metrostroi_Arial20",365+340-5,300+250, Color(50,200,50),TEXT_ALIGN_RIGHT,TEXT_ALIGN_CENTER)
|
||
else
|
||
surface.SetDrawColor(0,0,0,255)
|
||
surface.DrawRect(340+15+10,50+250+10,340,250)
|
||
draw.SimpleText("Подключение к камере...","Metrostroi_Arial30",365+340/2,310+250/2, Color(200,200,200),TEXT_ALIGN_CENTER,TEXT_ALIGN_CENTER)
|
||
draw.SimpleText("нет связи","Metrostroi_Arial20",365+340-5,300+250, Color(200,50,50),TEXT_ALIGN_RIGHT,TEXT_ALIGN_CENTER)
|
||
end
|
||
draw.SimpleText("[4]"..Format(types[camtype][4],WagNum),"Metrostroi_Arial20",365+5,310+10, Color(200,150,50),TEXT_ALIGN_LEFT,TEXT_ALIGN_CENTER)
|
||
draw.SimpleText(Format("Вагон №%d",Train:GetNW2Int("SarmatCam4EN")),"Metrostroi_Arial20",365+5,310+30, Color(200,150,50),TEXT_ALIGN_LEFT,TEXT_ALIGN_CENTER)
|
||
Metrostroi.DrawRectOutline(340+15+10,50+250+10,340,250,Color(40,40,40),2)
|
||
end
|
||
surface.SetDrawColor(127,127,127)
|
||
surface.SetTexture(button)
|
||
drawButton(110,590,200,40,"Esc")
|
||
--drawButton(320,590,200,40,"<-")
|
||
--drawButton(530,590,200,40,"->")
|
||
end
|
||
--surface.SetTexture( self.Cam1 )
|
||
--surface.SetDrawColor( 255, 0, 0, 255 )
|
||
--[[
|
||
|
||
|
||
|
||
--]
|
||
--[[
|
||
render.DrawTextureToScreenRect(self.Cam1,15,50,340,510)
|
||
render.DrawTextureToScreenRect(self.Cam2,340+15+10,50,340,510)--]]
|
||
--[[
|
||
for i=1,#Metrostroi.WorkingStations[line] do
|
||
local st = Metrostroi.WorkingStations[line][i]
|
||
draw.SimpleText(Metrostroi.AnnouncerTranslate[st],"Metrostroi_Arial25",760,80+i*30, Color(200,200,200),TEXT_ALIGN_LEFT,TEXT_ALIGN_CENTER)
|
||
end]]
|
||
--draw.SimpleText("Блок неактивен","Metrostroi_Arial25",870,100, Color(200,200,200),TEXT_ALIGN_CENTER,TEXT_ALIGN_CENTER)
|
||
end
|
||
if state ~= 0 then
|
||
surface.SetDrawColor(0,0,20,100)
|
||
surface.DrawRect(0,0,1024,640)
|
||
end
|
||
end
|
||
end
|