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

257 lines
10 KiB
Lua
Raw Blame History

--------------------------------------------------------------------------------
-- <20><><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
--------------------------------------------------------------------------------
Metrostroi.DefineSystem("UPO")
TRAIN_SYSTEM.DontAccelerateSimulation = true
function TRAIN_SYSTEM:Initialize()
self.Bloks = {
"PUAV",
"PA-KSD",
"PA-M",
"PA-KSD-M",
}
end
function TRAIN_SYSTEM:Outputs()
return {}
end
function TRAIN_SYSTEM:Inputs()
return {}
end
function TRAIN_SYSTEM:TriggerInput(name,value)
end
function TRAIN_SYSTEM:NotLast(path)
local Announcer = self.Train.Announcer
return self:GetSTNum(self.Last) > 1
end
function TRAIN_SYSTEM:GetSTNum(station)
local Announcer = self.Train.Announcer
local station = tonumber(station)
if not Metrostroi.WorkingStations then return 0 end
if not Metrostroi.WorkingStations[self.Line] then return 0 end
if not Metrostroi.WorkingStations[self.Line][station] and station ~= 120 then return 0 end
return station == 120 and 12 or Metrostroi.WorkingStations[self.Line][station]
end
function TRAIN_SYSTEM:End(station,path,next)
if not station or station == 0 or not Metrostroi.AnnouncerData[station] then return true end
if next then
return (not Metrostroi.AnnouncerData[station][9])
and (((self:GetSTNum(self.LastStation) > self:GetSTNum(station) or self:GetSTNum(station) > self:GetSTNum(self.FirstStation)) and path == 2)
or ((self:GetSTNum(self.FirstStation) < self:GetSTNum(station) and self:GetSTNum(station) > self:GetSTNum(self.LastStation)) and path == 1)),Metrostroi.AnnouncerData[station][9]
else
return (not Metrostroi.AnnouncerData[station][9])
and (((self:GetSTNum(self.LastStation) >= self:GetSTNum(station) or self:GetSTNum(station) > self:GetSTNum(self.FirstStation)) and path == 2)
or ((self:GetSTNum(self.FirstStation) < self:GetSTNum(station) and self:GetSTNum(station) >= self:GetSTNum(self.LastStation)) and path == 1))
end
end
function TRAIN_SYSTEM:PlayArriving(station,next,path)
local Announcer = self.Train.Announcer
Announcer:MultiQueue(0005,0003)
if self:End(station,path) then
Announcer:MultiQueue(0230,0222,0002,0221,station)
if Metrostroi.AnnouncerData[station][2] then
Announcer:MultiQueue(0215)
end
--Announcer:MultiQueue(0006)
self.AnnState = 7
Announcer:MultiQueue(0006)
return
end
Announcer:MultiQueue(Metrostroi.AnnouncerData[station][6] and 0220 or nil,station)
if Metrostroi.AnnouncerData[station][2] then
Announcer:MultiQueue(0215)
end
if type(Metrostroi.AnnouncerData[station][7]) == "table" then
Announcer:MultiQueue(0202,Metrostroi.AnnouncerData[Metrostroi.AnnouncerData[station][7][2]] and 0203 or nil,Metrostroi.AnnouncerData[station][7][2])
elseif Metrostroi.AnnouncerData[station][7] > 0 then
Announcer:MultiQueue(0202,Metrostroi.AnnouncerData[Metrostroi.AnnouncerData[station][7]] and 0203 or nil,Metrostroi.AnnouncerData[station][7])
end
if Metrostroi.AnnouncerData[station][8] and path == Metrostroi.AnnouncerData[station][8] then
Announcer:MultiQueue(0230,0233,0210,path == 1 and self.LastStation or self.FirstStation)
end
if nextNonWorkingStation then
Announcer:MultiQueue(0230,nextNonWorkingStation)
end
Announcer:MultiQueue(0002,0219,next)
if Metrostroi.AnnouncerData[next][2] then
Announcer:MultiQueue(0215)
end
if type(Metrostroi.AnnouncerData[next][7]) == "table" then
Announcer:MultiQueue(0202,Metrostroi.AnnouncerData[Metrostroi.AnnouncerData[next][7][2]] and 0203 or nil,Metrostroi.AnnouncerData[next][7][2])
elseif Metrostroi.AnnouncerData[next][7] > 0 then
Announcer:MultiQueue(0202,Metrostroi.AnnouncerData[Metrostroi.AnnouncerData[next][7]] and 0203 or nil,Metrostroi.AnnouncerData[next][7])
end
if Metrostroi.AnnouncerData[next][8] and path == Metrostroi.AnnouncerData[next][8] then
Announcer:MultiQueue(0230,0233,0210,path == 1 and self.LastStation or self.FirstStation)
end
Announcer:MultiQueue(0006)
end
function TRAIN_SYSTEM:PlayDepeate(station,next,path)
local Announcer = self.Train.Announcer
Announcer:MultiQueue(0005,0003)
if self:NotLast(path) then
Announcer:MultiQueue(0210,path == 1 and self.LastStation or self.FirstStation,0002)
elseif Metrostroi.AnnouncerData[station][8] and path == Metrostroi.AnnouncerData[station][8] then
Announcer:MultiQueue(0230,0233,0210,path == 1 and self.LastStation or self.FirstStation,0002)
end
Announcer:MultiQueue(0218)
if self.NextNonWorkingStation then
Announcer:MultiQueue(0230,self.NextNonWorkingStation)
end
Announcer:MultiQueue(0219,next)
if Metrostroi.AnnouncerData[next][2] then
Announcer:MultiQueue(0215)
end
if type(Metrostroi.AnnouncerData[next][7]) == "table" then
Announcer:MultiQueue(0202,Metrostroi.AnnouncerData[Metrostroi.AnnouncerData[next][7][2]] and 0203 or nil,Metrostroi.AnnouncerData[next][7][2])
elseif Metrostroi.AnnouncerData[next][7] > 0 then
Announcer:MultiQueue(0202,Metrostroi.AnnouncerData[Metrostroi.AnnouncerData[next][7]] and 0203 or nil,Metrostroi.AnnouncerData[next][7])
end
if Metrostroi.AnnouncerData[next][8] and path == Metrostroi.AnnouncerData[next][8] then
Announcer:MultiQueue(0230,0233,0210,path == 1 and self.LastStation or self.FirstStation)
end
Announcer:MultiQueue(0006)
end
function TRAIN_SYSTEM:II(ann)
if self.Train.R_UPO.Value < 0.5 then return end
local Announcer = self.Train.Announcer
Announcer:MultiQueue(0005,0003)
if ann == 1 then
Announcer:MultiQueue(math.random() > 0.5 and 0207 or 0206)
elseif ann == 2 then
Announcer:MultiQueue(math.random() > 0.5 and 0209 or 0208)
elseif ann == 3 then
Announcer:MultiQueue(math.random() > 0.5 and 0204 or 0205)
else
if not self.IIalr then
Announcer:MultiQueue(self.Type == 1 and 0229 or 0217)
self.IIalr = true
else
Announcer:MultiQueue(0228)
self.IIalr = false
end
end
Announcer:MultiQueue(0006)
end
function TRAIN_SYSTEM:ReloadSigns()
self.Train:PrepareSigns()
if self.Train.SignsList[tonumber(self.LastStation)] then
self.Train.SignsIndex = self.Train.SignsList[tonumber(self.LastStation)] or 1
if self.Train.SignsList[self.Train.SignsIndex] then self.Train:SetNW2String("FrontText",self.Train.SignsList[self.Train.SignsIndex][2]) end
end
if #self.Train.WagonList > 1 then
local LastTrain = self.Train.WagonList[#self.Train.WagonList]
LastTrain:PrepareSigns()
if LastTrain.SignsList[tonumber(self.FirstStation)] then
LastTrain.SignsIndex = self.Train.SignsList[tonumber(self.FirstStation)] or 1
if self.Train.SignsList[self.Train.SignsIndex] then LastTrain:SetNW2String("FrontText",self.Train.SignsList[self.Train.SignsIndex][2]) end
end
end
end
function TRAIN_SYSTEM:SetStations(line,first,last)
self.Line = tonumber(line)
self.FirstStation = tonumber(first)
self.LastStation = tonumber(last)
self:ReloadSigns()
end
function TRAIN_SYSTEM:Think()
self.Path = self.Train:ReadCell(49170)--Metrostroi.PathConverter[self.Train:ReadCell(65510)] or 0
self.Station = self.Train:ReadCell(49169)
if self.Train.Autodrive.Corrections[self.Path or 0] then
self.Distance = math.min(3072,self.Train:ReadCell(49165) + (self.Train.Autodrive.Corrections[self.Path or 0][self.Station] or -3.21))
end
if not self.Train.R_UPO or self.Train.R_UPO.Value < 0.5 or self.Blocks == 2 and self["PA-KSD"].Trainsit or (self.Train.KV.ReverserPosition == 0 and self.Train.KRU.Position == 0) then return end
if (self:GetSTNum(self.LastStation) > self:GetSTNum(self.FirstStation) and self.Path == 2) or (self:GetSTNum(self.FirstStation) > self:GetSTNum(self.LastStation) and self.Path == 1) then
local old = self.LastStation
self.LastStation = self.FirstStation
self.FirstStation = old
self:ReloadSigns()
end
if not self.FirstStation or not self.LastStation or self.FirstStation == 0 or self.LastStation == 0 or self.Station == 0 then return end
if (self:End(self.Station,self.Path,true) or self:GetSTNum(self.LastStation) > self:GetSTNum(self.Station) and self.Path == 2 or self:GetSTNum(self.Station) < self:GetSTNum(self.FirstStation) and self.Path == 1) then return end
if self.Distance < 75 and self.Arrived == nil and Metrostroi.WorkingStations[self.Line][self.Station] then
self.Arrived = true
local tbl = Metrostroi.WorkingStations[self.Line]
self:PlayArriving(self.Station,tbl[tbl[self.Station] + (self.Path == 1 and 1 or -1)],self.Path)
end
if self.Arrived and self.Train.Panel.SD < 0.5 and not self.BoardTime then
self.BoardTime = CurTime() + (self.Train.BoardTime or 0) + (20-(#self.Train.WagonList)*4) + (self.Train.Horlift and 7 or 0)
self.Ring = false
end
if (self.Arrived == nil or self.Train.Panel.SD > 0.5) and self.BoardTime then
self.BoardTime = nil
--self.Ring = nil
end
if self.Arrived and self.BoardTime and math.floor((self.BoardTime or CurTime()) - CurTime()) < (self.Train.Horlift and 15 or 8) and self.Arrived then
if self:End(self.Station,self.Path) then
self.Ring = 2
else
local tbl = Metrostroi.WorkingStations[self.Line]
self:PlayDepeate(self.Station,tbl[tbl[self.Station] + (self.Path == 1 and 1 or -1)],self.Path)
end
self.ODZ = true
self.Arrived = false
end
if self.Distance > 75 then self.Arrived = nil end
if self.Arrived == nil then
self.Ring = nil
end
if self.Ring == false and self.Train.Panel.SD > 0.5 and self.ODZ == nil then
self.Ring = 1
end
if self.Ring == false and self.Train.Panel.SD > 0.5 and self.ODZ ~= nil then
self.Ring = 0
end
if self.Train:ReadCell(48) == 218 then
--self.ODZ = true
end
if self.ODZ and self.BoardTime and self.BoardTime - CurTime() < 0 then
self.ODZ = false
self.Ring = 2
end
if self.Ring == 2 and self.Train.Panel.SD > 0.5 then
self.Ring = 0
end
if (self.Ring or self.Ring ~= 0) and self.Train.ALS_ARS.KVT then
self.Ring = 0
end
if self.Ring == 0 and self.Arrived == nil then
self.Ring = nil
end
if (self.Ring and self.Ring > 0) and not self.Train.ALS_ARS.Ring then
self.Train.ALS_ARS:TriggerInput("Ring",1)
end
if (not self.Ring or self.Ring == 0) and self.Train.ALS_ARS.Ring then
if not self.Train["PA-KSD"].Check and not self.Train["PA-M"].Check and not self.Train["PA-KSD-M"].Check then self.Train.ALS_ARS:TriggerInput("Ring",0) end
end
--[[
if self.FirstStation and self.LastStation then
if not self:End(self.Station,self.Path) then
if self.Train.R_UPO.Value > 0 then
local tbl = Metrostroi.WorkingStations[self.Line]
self:PlayDepeate(self.Station,tbl[tbl[self.Station] + (self.Path == 1 and 1 or -1)],self.Path)
end
end
end
]]
end