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