1
0
mirror of https://github.com/metrostroi-repo/MetrostroiAddon.git synced 2026-05-02 00:42:29 +00:00
Files
MetrostroiAddon/lua/metrostroi/systems/sys_81_718_bup.lua
g_brzhezinskiy 1d05caf866 init
2021-01-02 12:51:45 +03:00

237 lines
6.1 KiB
Lua

--------------------------------------------------------------------------------
-- 81-718 train control unit
--------------------------------------------------------------------------------
-- Copyright (C) 2013-2018 Metrostroi Team & FoxWorks Aerospace s.r.o.
-- Contains proprietary code. See license.txt for additional information.
--------------------------------------------------------------------------------
Metrostroi.DefineSystem("81_718_BUP")
function TRAIN_SYSTEM:Initialize()
self.Power = 0
self.IV = 0
self.IN = 0
self.IX3 = 0
self.IX2 = 0
self.IX1 = 0
self.I0 = 0
self.IT1 = 0
self.IT2 = 0
self.IT3 = 0
self.IBX3 = 0
self.IBX2 = 0
self.IBX1 = 0
self.IB0 = 0
self.IBT1 = 0
self.IBT2 = 0
self.IBT3 = 0
self.IX = 0
self.IT = 0
self.IKDV = 0
self.INKDV = 0
self.IBKDV = 0
self.IBBUP = 0
self.IPB = 0
self.IARS = 0
self.IAVT = 0
self.IPVU = 0
self.IRPB = 0
self.IV = 0
self.IN = 0
self.IROT = 0
self.ISOT = 0
self.BBUP = 0
self.V0 = 0
self.EKV = 0
self.EBAV = 0
self.EKR = 0
self.EARS = 0
self.OX = 0
self.OXp = 0
self.OT = 0
self.OU1 = 0
self.OU2 = 0
self.OV = 0
self.ON = 0
self.O0 = 0
self.OZPT = 0
self.OBBAV = 0
self.OBBUP = 0
self.BlockX = 1
end
function TRAIN_SYSTEM:Inputs()
return { }
end
local outputs = {
"Power",
"IPB","IV","IN",
"IX3","IX2","IX1","I0","IT1","IT2","IT3",
"IBX3","IBX2","IBX1","IB0","IBT1","IBT2","IBT3",
"IX","IT","IKDV","INKDV","IBKDV","IPB","IARS",
"IAVT","IPVU","IRPB","IROT","ISOT",
"BBUP","V0","EKV","EBAV","EKR","EARS",
"OX","OT","OU1","OU2","OV","ON","O0","OZPT","OBBAV","OBBUP",
}
function TRAIN_SYSTEM:Outputs()
return outputs
end
function TRAIN_SYSTEM:TriggerInput(name,value)
end
function TRAIN_SYSTEM:Think()
self.CurTime = self.CurTime or CurTime()
if CurTime()-self.CurTime < 0.05 then return end
self.DeltaTime = CurTime()-self.CurTime
self.CurTime = CurTime()
local Train = self.Train
local BKBD = Train.BKBD
local BKCU = Train.BKCU
if self.Power > 0 then
--Обработка сигналов контроллера
self.IX3 = Train.BKCU.Controller == 3 and 1 or 0
self.IX2 = Train.BKCU.Controller == 2 and 1 or 0
self.IX1 = Train.BKCU.Controller == 1 and 1 or 0
self.I0 = Train.BKCU.Controller == 0 and 1 or 0
self.IB0 = 1
self.IT1 = Train.BKCU.Controller == -1 and 1 or 0
self.IT2 = Train.BKCU.Controller == -2 and 1 or 0
self.IT3 = Train.BKCU.Controller == -3 and 1 or 0
self.BBUP = math.min(1,self.IBBUP*(1-self.OBBUP)+self.BBUP+self.LastBlock)
if self.BBUP == 0 then
self.EKV = (self.IX3+self.IX2+self.IX1+self.I0+self.IT1+self.IT2+self.IT3)>1 and 1 or 0
self.EKR = (self.IV+self.IN) > 1 and 1 or 0
self.EARS = (self.IX+self.IT) > 1 and 1 or 0
if self.EKV > 0 or self.EKR>0 then
self.OX = 0
self.OT = 0
else
local CanDrive = (self.IKDV+self.IBKDV)--*self.IPB
if Train.BKCU.Controller > 0 then
self.OX = (1-self.EARS)*(1-self.EKV)*CanDrive*(1-self.BlockX)*self.IX*(1-self.IT)*(1-self.IAVT) --501Г
self.BlockX = self.BlockX+(1-CanDrive)
else
self.OX = 0
self.BlockX = 0
end
self.OT = Train.BKCU.Controller < 0 and 1 or 0 --502
end
if self.EKR > 0 then
self.OV = 0
self.ON = 0
else
self.OV = self.IV--505
self.ON = self.IN--506
end
self.O0 = (1-self.OX)*(1-self.OT) --545
if self.OX > 0 or self.OT > 0 then
self.OU1 = math.abs(Train.BKCU.Controller) > 1 and 1 or 0 --503
self.OU2 = math.abs(Train.BKCU.Controller) > 2 and 1 or 0 --504
else
self.OU1 = 0
self.OU2 = 0
end
if self.IT>0 or self.IAVT>0 or self.OT > 0 and self.V0 == 0 then
if not self.BrakeTimer then self.BrakeTimer = CurTime() end
elseif self.BrakeTimer then
self.BrakeTimer = false
end
if self.IT>0 then
self.OT = 1
self.OU1=1
self.OU2=1
end
self.OZPT = self.BrakeTimer and CurTime()-self.BrakeTimer > 2.2 and math.min(1,self.OU2+self.IT) or 0
self.OBBAV = self.OX+self.OT
self.EBAV = (self.IBX3+self.IBX2+self.IBX1+self.IB0+self.IBT1+self.IBT2+self.IBT3)>1 and 1 or 0
self.OBBUP = 1
else
self.EKV = 0
self.EKR = 0
self.EARS = 0
self.OX = 0
self.OT = 0
self.OU1 = 0
self.OU2 = 0
self.OV = 0
self.ON = 0
self.O0 = 0
self.OZPT = 0
self.OBBAV = 0
self.EBAV = 0
self.OBBUP = 1
end
else
self.BlockX = 1
--self.IV = 0
--self.IN = 0
self.IX3 = 0
self.IX2 = 0
self.IX1 = 0
self.I0 = 0
self.IT1 = 0
self.IT2 = 0
self.IT3 = 0
self.IBX3 = 0
self.IBX2 = 0
self.IBX1 = 0
self.IB0 = 0
self.IBT1 = 0
self.IBT2 = 0
self.IBT3 = 0
--self.IX = 0
--self.IT = 0
--self.IKDV = 0
--self.IBKDV = 0
--self.IPB = 0
self.IARS = 0
--self.IAVT = 0
self.IPVU = 0
self.IRPB = 0
self.IROT = 0
self.ISOT = 0
self.BBUP = 0
self.LastBlock = self.IBBUP
--self.V0 = 0
self.EKV = 0
self.EBAV = 0
self.EKR = 0
self.EARS = 0
self.OX = 0
self.OXp = 0
self.OT = 0
self.OU1 = 0
self.OU2 = 0
self.OV = 0
self.ON = 0
self.O0 = 0
self.OZPT = 0
self.OBBAV = 0
self.OBBUP = 0
end
end