From d4aabb65611edc9b923ad52d6edf34af42e882e9 Mon Sep 17 00:00:00 2001 From: Moon Horse Date: Thu, 20 Mar 2025 21:19:53 +0300 Subject: [PATCH] Trying to make a system for km334 --- .../gmod_subway_81-714_mvm/cl_init.lua | 28 +-- lua/entities/gmod_subway_81-714_mvm/init.lua | 2 +- .../gmod_subway_81-714_mvm/shared.lua | 1 + .../gmod_subway_81-717_mvm/cl_init.lua | 32 +-- lua/entities/gmod_subway_81-717_mvm/init.lua | 2 +- .../gmod_subway_81-717_mvm/shared.lua | 6 + .../systems/sys_81_714_new_pneumatic.lua | 94 +------- .../systems/sys_81_717_new_pneumatic.lua | 104 ++------- lua/metrostroi/systems/sys_km-334.lua | 218 ++++++++++++++++++ 9 files changed, 283 insertions(+), 204 deletions(-) create mode 100644 lua/metrostroi/systems/sys_km-334.lua diff --git a/lua/entities/gmod_subway_81-714_mvm/cl_init.lua b/lua/entities/gmod_subway_81-714_mvm/cl_init.lua index f0ee77d..f0ede06 100644 --- a/lua/entities/gmod_subway_81-714_mvm/cl_init.lua +++ b/lua/entities/gmod_subway_81-714_mvm/cl_init.lua @@ -1568,20 +1568,20 @@ function ENT:Think() end self:SetSoundState("crane013_brake2",math.Clamp(-self.CraneRamp*1.5-0.95,0,1.5)^2,1.0) else - self:SetSoundState("crane013_brake",0,1.0) - self:SetSoundState("crane013_release",0,1.0) - --self:SetSoundState("crane013_brake2",0,1.0) - - self.CraneRamp = math.Clamp(self.CraneRamp + 8.0*((1*self:GetPackedRatio("Crane_dPdT",0))-self.CraneRamp)*dT,-1,1) - - self:SetSoundState("crane334_brake_low",math.Clamp((-self.CraneRamp)*2,0,1)^2,1) - local high = math.Clamp(((-self.CraneRamp)-0.5)/0.5,0,1)^1 - self:SetSoundState("crane334_brake_high",high,1.0) - self:SetSoundState("crane013_brake2",high*2,1.0) - self:SetSoundState("crane334_brake_eq_high",--[[ math.Clamp(-self.CraneRamp*0,0,1)---]] math.Clamp(-self:GetPackedRatio("ReservoirPressure_dPdT")-0.2,0,1)^0.8*1,1) - self:SetSoundState("crane334_brake_eq_low",--[[ math.Clamp(-self.CraneRamp*0,0,1)---]] math.Clamp(-self:GetPackedRatio("ReservoirPressure_dPdT")-0.4,0,1)^0.8*1.3,1) - - self:SetSoundState("crane334_release",math.Clamp(self.CraneRamp,0,1)^2,1.0) + --self:SetSoundState("crane013_brake",0,1.0) + --self:SetSoundState("crane013_release",0,1.0) + ----self:SetSoundState("crane013_brake2",0,1.0) +-- + --self.CraneRamp = math.Clamp(self.CraneRamp + 8.0*((1*self:GetPackedRatio("Crane_dPdT",0))-self.CraneRamp)*dT,-1,1) +-- + --self:SetSoundState("crane334_brake_low",math.Clamp((-self.CraneRamp)*2,0,1)^2,1) + --local high = math.Clamp(((-self.CraneRamp)-0.5)/0.5,0,1)^1 + --self:SetSoundState("crane334_brake_high",high,1.0) + --self:SetSoundState("crane013_brake2",high*2,1.0) + --self:SetSoundState("crane334_brake_eq_high",--[[ math.Clamp(-self.CraneRamp*0,0,1)---]] math.Clamp(-self:GetPackedRatio("ReservoirPressure_dPdT")-0.2,0,1)^0.8*1,1) + --self:SetSoundState("crane334_brake_eq_low",--[[ math.Clamp(-self.CraneRamp*0,0,1)---]] math.Clamp(-self:GetPackedRatio("ReservoirPressure_dPdT")-0.4,0,1)^0.8*1.3,1) +-- + --self:SetSoundState("crane334_release",math.Clamp(self.CraneRamp,0,1)^2,1.0) end local emergencyBrakeValve = self:GetPackedRatio("EmergencyBrakeValve_dPdT", 0) self.EmergencyBrakeValveRamp = math.Clamp(self.EmergencyBrakeValveRamp + (emergencyBrakeValve-self.EmergencyBrakeValveRamp)*dT*8,0,1) diff --git a/lua/entities/gmod_subway_81-714_mvm/init.lua b/lua/entities/gmod_subway_81-714_mvm/init.lua index ceccdf4..9e76237 100644 --- a/lua/entities/gmod_subway_81-714_mvm/init.lua +++ b/lua/entities/gmod_subway_81-714_mvm/init.lua @@ -404,7 +404,7 @@ function ENT:Think() --self:SetPackedRatio("Crane", Pneumatic.RealDriverValvePosition) --self:SetPackedRatio("Controller", (self.KV.ControllerPosition+3)/7) if Pneumatic.ValveType == 1 then - self:SetPackedRatio("BLPressure", Pneumatic.ReservoirPressure/16.0) + self:SetPackedRatio("BLPressure", self.KM334.ResvPres/16.0) else self:SetPackedRatio("BLPressure", Pneumatic.BrakeLinePressure/16.0) end diff --git a/lua/entities/gmod_subway_81-714_mvm/shared.lua b/lua/entities/gmod_subway_81-714_mvm/shared.lua index 9afa4a9..5fb3f1c 100644 --- a/lua/entities/gmod_subway_81-714_mvm/shared.lua +++ b/lua/entities/gmod_subway_81-714_mvm/shared.lua @@ -370,6 +370,7 @@ function ENT:InitializeSystems() -- Панель управления 81-710 self:LoadSystem("Panel","81_714_Panel") -- Пневмосистема 81-710 + self:LoadSystem("KM334") self:LoadSystem("Pneumatic","81_714_NewPneumatic",{br013_1 = true}) -- Everything else self:LoadSystem("Battery") diff --git a/lua/entities/gmod_subway_81-717_mvm/cl_init.lua b/lua/entities/gmod_subway_81-717_mvm/cl_init.lua index dd15526..3a477d7 100644 --- a/lua/entities/gmod_subway_81-717_mvm/cl_init.lua +++ b/lua/entities/gmod_subway_81-717_mvm/cl_init.lua @@ -1809,7 +1809,7 @@ ENT.ButtonMap["DriverValveBLDisconnect"] = { buttons = { {ID = "DriverValveBLDisconnectToggle", x=0, y=0, w=200, h=100, tooltip="", model = { var="DriverValveBLDisconnect",sndid="brake_disconnect", - sndvol = 1, snd = function(val) return "disconnect_valve" end, + sndvol = 1, snd = function(val) return val and "pneumo_TL_connect" or "pneumo_TL_disconnect" end, sndmin = 90, sndmax = 1e3, sndang = Angle(-90,0,0), states={"Train.Buttons.Closed","Train.Buttons.Opened"}, }}, @@ -1825,7 +1825,7 @@ ENT.ButtonMap["DriverValveTLDisconnect"] = { buttons = { {ID = "DriverValveTLDisconnectToggle", x=0, y=0, w=200, h=90, tooltip="", model = { var="DriverValveTLDisconnect",sndid="train_disconnect", - sndvol = 1, snd = function(val) return val and "pneumo_TL_open" or "pneumo_TL_disconnect" end, + sndvol = 1, snd = function(val) return val and "pneumo_TL_connect" or "pneumo_TL_disconnect" end, sndmin = 90, sndmax = 1e3, sndang = Angle(-90,0,0), states={"Train.Buttons.Closed","Train.Buttons.Opened"}, }}, @@ -3621,20 +3621,20 @@ function ENT:Think() end self:SetSoundState("crane013_brake2",math.Clamp(-self.CraneRamp*1.5-0.95,0,1.5)^2,1.0) else - self:SetSoundState("crane013_brake",0,1.0) - self:SetSoundState("crane013_release",0,1.0) - --self:SetSoundState("crane013_brake2",0,1.0) - - self.CraneRamp = math.Clamp(self.CraneRamp + 8.0*((1*self:GetPackedRatio("Crane_dPdT",0))-self.CraneRamp)*dT,-1,1) - - self:SetSoundState("crane334_brake_low",math.Clamp((-self.CraneRamp)*2,0,1)^2,1) - local high = math.Clamp(((-self.CraneRamp)-0.5)/0.5,0,1)^1 - self:SetSoundState("crane334_brake_high",high,1.0) - self:SetSoundState("crane013_brake2",high*2,1.0) - self:SetSoundState("crane334_brake_eq_high",--[[ math.Clamp(-self.CraneRamp*0,0,1)---]] math.Clamp(-self:GetPackedRatio("ReservoirPressure_dPdT")-0.2,0,1)^0.8*1,1) - self:SetSoundState("crane334_brake_eq_low",--[[ math.Clamp(-self.CraneRamp*0,0,1)---]] math.Clamp(-self:GetPackedRatio("ReservoirPressure_dPdT")-0.4,0,1)^0.8*1.3,1) - - self:SetSoundState("crane334_release",math.Clamp(self.CraneRamp,0,1)^2,1.0) + --self:SetSoundState("crane013_brake",0,1.0) + --self:SetSoundState("crane013_release",0,1.0) + ----self:SetSoundState("crane013_brake2",0,1.0) +-- + --self.CraneRamp = math.Clamp(self.CraneRamp + 8.0*((1*self:GetPackedRatio("Crane_dPdT",0))-self.CraneRamp)*dT,-1,1) +-- + --self:SetSoundState("crane334_brake_low",math.Clamp((-self.CraneRamp)*2,0,1)^2,1) + --local high = math.Clamp(((-self.CraneRamp)-0.5)/0.5,0,1)^1 + --self:SetSoundState("crane334_brake_high",high,1.0) + --self:SetSoundState("crane013_brake2",high*2,1.0) + --self:SetSoundState("crane334_brake_eq_high",--[[ math.Clamp(-self.CraneRamp*0,0,1)---]] math.Clamp(-self:GetPackedRatio("ReservoirPressure_dPdT")-0.2,0,1)^0.8*1,1) + --self:SetSoundState("crane334_brake_eq_low",--[[ math.Clamp(-self.CraneRamp*0,0,1)---]] math.Clamp(-self:GetPackedRatio("ReservoirPressure_dPdT")-0.4,0,1)^0.8*1.3,1) +-- + --self:SetSoundState("crane334_release",math.Clamp(self.CraneRamp,0,1)^2,1.0) end local emergencyValveEPK = self:GetPackedRatio("EmergencyValveEPK_dPdT",0) self.EmergencyValveEPKRamp = math.Clamp(self.EmergencyValveEPKRamp + 1.0*((0.5*emergencyValveEPK)-self.EmergencyValveEPKRamp)*12*dT,0,1) diff --git a/lua/entities/gmod_subway_81-717_mvm/init.lua b/lua/entities/gmod_subway_81-717_mvm/init.lua index 95e810a..700b896 100644 --- a/lua/entities/gmod_subway_81-717_mvm/init.lua +++ b/lua/entities/gmod_subway_81-717_mvm/init.lua @@ -727,7 +727,7 @@ function ENT:Think() self:SetNW2Int("KRUPosition", self.KRU.Position) if Pneumatic.ValveType == 1 then - self:SetPackedRatio("BLPressure", Pneumatic.ReservoirPressure/16.0) + self:SetPackedRatio("BLPressure", self.KM334.ResvPres/16.0) else self:SetPackedRatio("BLPressure", Pneumatic.BrakeLinePressure/16.0) end diff --git a/lua/entities/gmod_subway_81-717_mvm/shared.lua b/lua/entities/gmod_subway_81-717_mvm/shared.lua index 29d43c7..7927784 100644 --- a/lua/entities/gmod_subway_81-717_mvm/shared.lua +++ b/lua/entities/gmod_subway_81-717_mvm/shared.lua @@ -410,10 +410,14 @@ function ENT:InitializeSounds() "subway_trains/ezh3/pneumatic/brake_line_on.mp3", "subway_trains/ezh3/pneumatic/brake_line_on2.mp3", } + self.SoundNames["pneumo_TL_connect"] = { + "subway_trains/common/334/334_open.mp3", + } self.SoundNames["pneumo_TL_disconnect"] = { "subway_trains/common/334/334_close.mp3", } self.SoundPositions["pneumo_TL_open"] = {60,1e9,Vector(431.8,-24.1+1.5,-33.7),0.7} + self.SoundPositions["pneumo_TL_connect"] = {60,1e9,Vector(431.8,-24.1+1.5,-33.7),0.7} self.SoundPositions["pneumo_TL_disconnect"] = {60,1e9,Vector(431.8,-24.1+1.5,-33.7),0.7} self.SoundNames["pneumo_BL_disconnect"] = { "subway_trains/common/334/334_close.mp3", @@ -835,7 +839,9 @@ function ENT:InitializeSystems() self:LoadSystem("PR_14X_Panels") -- Пневмосистема 81-710 + self:LoadSystem("KM334") self:LoadSystem("Pneumatic","81_717_NewPneumatic") + -- Панель управления 81-710 self:LoadSystem("Panel","81_717_Panel") -- Everything else diff --git a/lua/metrostroi/systems/sys_81_714_new_pneumatic.lua b/lua/metrostroi/systems/sys_81_714_new_pneumatic.lua index 69b8358..4a69557 100644 --- a/lua/metrostroi/systems/sys_81_714_new_pneumatic.lua +++ b/lua/metrostroi/systems/sys_81_714_new_pneumatic.lua @@ -407,90 +407,16 @@ function TRAIN_SYSTEM:Think(dT) if self.ValveType == 1 then self.BLDisconnect = Train.DriverValveBLDisconnect.Value > 0 self.TLDisconnect = Train.DriverValveTLDisconnect.Value > 0 and self.RealDriverValvePosition ~= 3 - pr_speed = 1*6--wagc--*((self.BrakeLinePressure-self.ReservoirPressure)/0.6) --2 - if self.TLDisconnect then self.TLDisconnectPressure = self.TrainLinePressure end - if self.BLDisconnect then self.BLDisconnectPressure = self.BrakeLinePressure end - if self.Leak or self.BrakeLineOpen then pr_speed = pr_speed*0.3 end - -- 334: 1 Fill reservoir from train line, fill brake line from train line - if (self.RealDriverValvePosition == 1) then - if self.TLDisconnect or self.ReservoirPressure ~= self.TLDisconnectPressure or self.ReservoirPressure ~= self.BLDisconnectPressure then - if self.BLDisconnect then - if self.TLDisconnect then - self:equalizePressure(dT,"ReservoirPressure", self.TLDisconnectPressure, 0, 1.0,nil,2) - self:equalizePressure(dT,"BrakeLinePressure", self.TLDisconnectPressure, 0, 6.0,nil,0.2) - end - if not self.TLDisconnect then - self:equalizePressure(dT,"TLDisconnectPressure", self.BrakeLinePressure, 16, 0,nil,2) - self:equalizePressure(dT,"ReservoirPressure", self.BrakeLinePressure, 0.4, 0.06,nil,2) - self:equalizePressure(dT,"BrakeLinePressure", self.ReservoirPressure, 6.5, 0,nil,0.2) - end - else - self:equalizePressure(dT,"ReservoirPressure", self.TLDisconnectPressure, 0, self.TLDisconnect and 3.55 or 2.0,nil,2) - self:equalizePressure(dT,"TLDisconnectPressure", self.ReservoirPressure, 16, 0,nil,2) - end - end - end - - -- 334: 2 Brake line, reservoir replenished from brake line reductor - if (self.RealDriverValvePosition == 2) then - if self.TLDisconnect then - local a = 1 - if self.EmergencyValve or Train.EmergencyBrakeValve.Value > 0.5 then a = 4 end - if self.BLDisconnect then - --self.ReservoirPressure = self.BrakeLinePressure - self:equalizePressure(dT,"ReservoirPressure", self.BrakeLinePressure,6,0.8,nil,2) - self:equalizePressure(dT,"BrakeLinePressure", self.TrainToBrakeReducedPressure, pr_speed*0, pr_speed*0.3*a, nil, 1.6) - self.ReservoirPressure_dPdT = self.BrakeLinePressure_dPdT*0.8 - else - self:equalizePressure(dT,"ReservoirPressure", self.TrainToBrakeReducedPressure,0,1.55,nil,2) - end - end - end - - -- 334: 3 Close all valves - if (self.RealDriverValvePosition == 3) then - -- Typical leak - self:equalizePressure(dT,"ReservoirPressure", 0.00, 0.001) - end - - local res_dischrg_rate4 = 0.28 - local res_dischrg_rate5 = self.BLDisconnect and 1.12 or 8 - -- 334: 4 Reservoir open to atmosphere, brake line equalizes with reservoir - if (self.RealDriverValvePosition == 4) then - self:equalizePressure(dT,"ReservoirPressure", 0.0, res_dischrg_rate4, nil,nil,1)--0.35)-0.55 - end - - -- 334: 5 Reservoir and brake line open to atmosphere - if (self.RealDriverValvePosition == 5) then - self:equalizePressure(dT,"ReservoirPressure", 0.0, res_dischrg_rate5)--,nil,nil,2)--1.70 - local pr_speed = 1.25*6--wagc - if self.Leak or self.BrakeLineOpen then pr_speed = pr_speed*0.3 end - if self.BLDisconnect then - if self.Leak then pr_speed = pr_speed*6.2 end - self:equalizePressure(dT,"BrakeLinePressure", 0.0, pr_speed,nil,nil,2) - end - end - -- утечка через неплотность уравнительного поршня - if self.BLDisconnect then self:equalizePressure(dT, "ReservoirPressure", self.BrakeLinePressure, 0.06, 0) end - - if (self.RealDriverValvePosition > 1) and (self.RealDriverValvePosition < 5) then - local pr_speed = 1.25*6--wagc - if self.Leak or self.BrakeLineOpen then pr_speed = pr_speed*0.3 end - local _a = 0 - for k,v in ipairs(Train.WagonList) do - if v.Pneumatic.TLDisconnect and v.Pneumatic.BLDisconnect and (v.Pneumatic.RealDriverValvePosition == 2 or v.Pneumatic.RealDriverValvePosition == 1) then - _a = _a + 1 - end - if _a > 1 then break end - end - if _a > 1 then pr_speed = pr_speed*0.1 end - if self.BLDisconnect and self.BrakeLinePressure - self.ReservoirPressure > (self.RealDriverValvePosition == 3 and 0 or 0.2) then --0.2 bar is a piston sensitivity - self:equalizePressure(dT, "BrakeLinePressure", 0, pr_speed*math.abs(self.BrakeLinePressure - self.ReservoirPressure), nil, nil, 6) - end - end - - self.ReservoirPressure_dPdT = self.ReservoirPressure_dPdT + self.BrakeLinePressure_dPdT*0.2 - Train:SetPackedRatio("ReservoirPressure_dPdT",self.ReservoirPressure_dPdT/wagc*2) + Train.KM334:TriggerInput("InputPres",self.TrainLinePressure) + Train.KM334:TriggerInput("HandlePosition",self.RealDriverValvePosition) + Train.KM334:TriggerInput("ReduSetpoint",self.KM013offset) + Train.KM334:TriggerInput("TLineVol",420*Train:GetTLConnectedWagonCount()) + Train.KM334:TriggerInput("BLineVol",29*wagc) + --Train.KM334:TriggerInput("EqResVol",self.ResevoirVolume) + Train.KM334:TriggerInput("ValvT",self.TLDisconnect and 1 or 0) + Train.KM334:TriggerInput("ValvB",self.BLDisconnect and 1 or 0) + + self.BrakeLinePressure = self.BLDisconnect and Train.KM334.OutPres or self.BrakeLinePressure --[[ ---------------debug--------------------- self.dlreadtimer = self.dlreadtimer or CurTime() diff --git a/lua/metrostroi/systems/sys_81_717_new_pneumatic.lua b/lua/metrostroi/systems/sys_81_717_new_pneumatic.lua index 3fac011..8ba46c6 100644 --- a/lua/metrostroi/systems/sys_81_717_new_pneumatic.lua +++ b/lua/metrostroi/systems/sys_81_717_new_pneumatic.lua @@ -451,94 +451,16 @@ function TRAIN_SYSTEM:Think(dT) if self.ValveType == 1 then self.BLDisconnect = Train.DriverValveBLDisconnect.Value > 0 self.TLDisconnect = Train.DriverValveTLDisconnect.Value > 0 and self.RealDriverValvePosition ~= 3 - pr_speed = 1*6--wagc--*((self.BrakeLinePressure-self.ReservoirPressure)/0.6) - if self.TLDisconnect then self.TLDisconnectPressure = self.TrainLinePressure end - if self.BLDisconnect then self.BLDisconnectPressure = self.BrakeLinePressure end - if self.Leak or self.BrakeLineOpen then pr_speed = pr_speed*0.3 end - -- 334: 1 Fill reservoir from train line, fill brake line from train line - if (self.RealDriverValvePosition == 1) then - if self.TLDisconnect or self.ReservoirPressure ~= self.TLDisconnectPressure or self.ReservoirPressure ~= self.BLDisconnectPressure then - if self.BLDisconnect then - if self.TLDisconnect then - self:equalizePressure(dT,"ReservoirPressure", self.TLDisconnectPressure, 0, 1.0,nil,2) - self:equalizePressure(dT,"BrakeLinePressure", self.TLDisconnectPressure, 0, 6.0,nil,0.2) - end - if not self.TLDisconnect then - self:equalizePressure(dT,"TLDisconnectPressure", self.BrakeLinePressure, 16, 0,nil,2) - self:equalizePressure(dT,"ReservoirPressure", self.BrakeLinePressure, 0.4, 0.06,nil,2) - self:equalizePressure(dT,"BrakeLinePressure", self.ReservoirPressure, 6.5, 0,nil,0.2) - end - --self:equalizePressure(dT,"BrakeLinePressure", self.TLDisconnectPressure, pr_speed*(pr_speed < wagc and 1 or 1.35),nil,nil,2) - else - self:equalizePressure(dT,"ReservoirPressure", self.TLDisconnectPressure, 0, self.TLDisconnect and 3.55 or 2.0,nil,2) - self:equalizePressure(dT,"TLDisconnectPressure", self.ReservoirPressure, 16, 0,nil,2) - end - end - end - - -- 334: 2 Brake line, reservoir replenished from brake line reductor - if (self.RealDriverValvePosition == 2) then - if self.TLDisconnect then - local a = 1 - if self.EmergencyValve or Train.EmergencyBrakeValve.Value > 0.5 then a = 4 end - if self.BLDisconnect then - --self.ReservoirPressure = self.BrakeLinePressure - self:equalizePressure(dT,"ReservoirPressure", self.BrakeLinePressure,6,0.8,nil,2) - self:equalizePressure(dT,"BrakeLinePressure", self.TrainToBrakeReducedPressure, pr_speed*0, pr_speed*0.3*a, nil, 1.6) - self.ReservoirPressure_dPdT = self.BrakeLinePressure_dPdT*0.8 - else - self:equalizePressure(dT,"ReservoirPressure", self.TrainToBrakeReducedPressure,0,1.55,nil,2) - end - end - end - - -- 334: 3 Close all valves - if (self.RealDriverValvePosition == 3) then - -- Typical leak - self:equalizePressure(dT,"ReservoirPressure", 0.00, 0.001) - end - - local res_dischrg_rate4 = 0.28--self.BLDisconnect and 0.55 or 1 - local res_dischrg_rate5 = self.BLDisconnect and 1.12 or 8 - -- 334: 4 Reservoir open to atmosphere, brake line equalizes with reservoir - if (self.RealDriverValvePosition == 4) then - self:equalizePressure(dT,"ReservoirPressure", 0.0, res_dischrg_rate4, nil,nil,1)--0.35)-0.55 - end - - -- 334: 5 Reservoir and brake line open to atmosphere - if (self.RealDriverValvePosition == 5) then - self:equalizePressure(dT,"ReservoirPressure", 0.0, res_dischrg_rate5)--,nil,nil,2)--1.70 - local pr_speed = 1.25*6--wagc - if self.Leak or self.BrakeLineOpen then pr_speed = pr_speed*0.3 end - if self.BLDisconnect then - if self.Leak then pr_speed = pr_speed*6.2 end - self:equalizePressure(dT,"BrakeLinePressure", 0.0, pr_speed,nil,nil,2) - end - end - -- утечка через неплотность уравнительного поршня - if self.BLDisconnect then self:equalizePressure(dT, "ReservoirPressure", self.BrakeLinePressure, 0.06, 0) end - - if (self.RealDriverValvePosition > 1) and (self.RealDriverValvePosition < 5) then - local pr_speed = 1.25*6--wagc - if self.Leak or self.BrakeLineOpen then pr_speed = pr_speed*0.3 end - local _a = 0 - for k,v in ipairs(Train.WagonList) do - if v.Pneumatic.TLDisconnect and v.Pneumatic.BLDisconnect and (v.Pneumatic.RealDriverValvePosition == 2 or v.Pneumatic.RealDriverValvePosition == 1) then - _a = _a + 1 - end - if _a > 1 then break end - end - if _a > 1 then pr_speed = pr_speed*0.1 end - if self.BLDisconnect and self.BrakeLinePressure - self.ReservoirPressure > (self.RealDriverValvePosition == 3 and 0 or 0.2) then --0.2 bar is a piston sensitivity - self:equalizePressure(dT, "BrakeLinePressure", 0, pr_speed*math.abs(self.BrakeLinePressure - self.ReservoirPressure), nil, nil, 6) - end - end - - --[[if not self.TLDisconnect then - self.TLDisconnectPressure = math.max(0,self.TLDisconnectPressure - math.abs(self.ReservoirPressure_dPdT)*0.8) - end]] - self.ReservoirPressure_dPdT = self.ReservoirPressure_dPdT + self.BrakeLinePressure_dPdT*0.2 - Train:SetPackedRatio("ReservoirPressure_dPdT",self.ReservoirPressure_dPdT/wagc*2) + Train.KM334:TriggerInput("InputPres",self.TrainLinePressure) + Train.KM334:TriggerInput("HandlePosition",self.RealDriverValvePosition) + Train.KM334:TriggerInput("ReduSetpoint",self.KM013offset) + Train.KM334:TriggerInput("TLineVol",420*Train:GetTLConnectedWagonCount()) + Train.KM334:TriggerInput("BLineVol",29*wagc) + --Train.KM334:TriggerInput("EqResVol",self.ResevoirVolume) + Train.KM334:TriggerInput("ValvT",self.TLDisconnect and 1 or 0) + Train.KM334:TriggerInput("ValvB",self.BLDisconnect and 1 or 0) + + self.BrakeLinePressure = self.BLDisconnect and Train.KM334.OutPres or self.BrakeLinePressure --[[ ---------------debug--------------------- self.dlreadtimer = self.dlreadtimer or CurTime() @@ -987,6 +909,12 @@ function TRAIN_SYSTEM:Think(dT) Train.SQ3:TriggerInput("Set", Train.PassengerDoor and 0 or 1) ---------------------------------------------------------------------------- + if self.DriverValveTLDisconnectPrevious ~= Train.DriverValveTLDisconnect.Value then + self.DriverValveTLDisconnectPrevious = Train.DriverValveTLDisconnect.Value + if self.DriverValveTLDisconnectPrevious == 1 and self.TrainLinePressure > 0.5 then + Train:PlayOnce("pneumo_TL_open","cabin",math.min(0.9,self.TrainLinePressure/5), math.min(1,self.TrainLinePressure/4.5)) + end + end if self.DriverValveDisconnectPrevious ~= Train.DriverValveDisconnect.Value then self.DriverValveDisconnectPrevious = Train.DriverValveDisconnect.Value if self.DriverValveDisconnectPrevious == 0 then diff --git a/lua/metrostroi/systems/sys_km-334.lua b/lua/metrostroi/systems/sys_km-334.lua new file mode 100644 index 0000000..9d9f40a --- /dev/null +++ b/lua/metrostroi/systems/sys_km-334.lua @@ -0,0 +1,218 @@ +-------------------------------------------------------------------------------- +-- KM 334 (Author: Blue Snooty) +-------------------------------------------------------------------------------- +-- Copyright (C) 2013-2018 Metrostroi Team & FoxWorks Aerospace s.r.o. +-- Contains proprietary code. See license.txt for additional information. +-------------------------------------------------------------------------------- +Metrostroi.DefineSystem("KM334") +TRAIN_SYSTEM.DontAccelerateSimulation = true + +function TRAIN_SYSTEM:Initialize() + self.PistonSens = 0.2 -- bar + self.PistonState = 0 -- 0 - down (shut); 1 - up (opened) + self.HandlePosition = 1 + self.InputPres = 0.0 + self.ReduOutPres = 0.0 + self.OutPres = 0.0 + self.ReduInpPres = 0.0 + self.ResvPres = 0.0 + self.ValvT = 0 -- TLDisconnect repeater + self.ValvB = 0 -- BLDisconnect repeater + self.TLineVol = 420 -- volume in litres + self.BLineVol = 29 -- 81-717(714) — 29 l, E type — 38 l + self.EqResVol = 9.5 + self.ReduSetpoint = 5.0 + + self.Cham_H = { + pressure = 0.0, + volume = 0.1, + mass = 0, + dP = 0.0, + } + self.Cham_T = { + pressure = 0.0, + volume = 0.1, + mass = 0, + dP = 0.0, + } + self.Cham_UR = { + pressure = 0.0, + volume = 9.5, + mass = 0, + dP = 0.0, + } + self.Cham_3K = { + pressure = 0.0, + volume = 0.2, + mass = 0, + dP = 0.0, + } + self.Cham_Ex = { + pressure = 0.0, + volume = 1e12, + mass = 0, + dP = 0.0, + } + + self.OldHandlePosition = self.HandlePosition +end + +-- slide valve matrix +TRAIN_SYSTEM.SlideValve = { + [1] = {"Cham_H Cham_T 0.002", "Cham_H Cham_UR 0.0005"--[["Cham_H Cham_3K 0.01"]]}, + [2] = {--[["Cham_H Cham_3K 0.05",]] "Cham_T Cham_UR 0.08"}, + [3] = {}, + [4] = {"Cham_UR Cham_Ex 0.05"}, + [5] = {"Cham_T Cham_Ex 0.2","Cham_UR Cham_Ex 0.25","Cham_3K Cham_Ex 0.2"}, +} + +function TRAIN_SYSTEM:Outputs() + return {"OutPres", "ReduInpPres", "MainRelease", "SideRelease", "ResvPres", "PistonState"} +end + +function TRAIN_SYSTEM:Inputs() + return {"InputPres", "HandlePosition", "ReduSetpoint", "ReduOutPres", "TLineVol", "BLineVol", "EqResVol", "ValvT", "ValvB"} +end + +function TRAIN_SYSTEM:TriggerInput(name,value) + if self[name] then + self[name] = value + end +end + +function TRAIN_SYSTEM:Think(dT) + local Train = self.Train + + if Train.Pneumatic.ValveType ~= 1 then + if not self.KMSndOff then + SetSoundState("crane334_brake_eq_high",0,1) + SetSoundState("crane334_brake_eq_low",0,1) + SetSoundState("crane334_release",0,1) + SetSoundState("crane334_release_2",0,1) + self.KMSndOff = true + end + return + end + + self.KMSndOff = false + self.Cham_H.dP = 0.0 + self.Cham_T.dP = 0.0 + self.Cham_UR.dP = 0.0 + self.Cham_3K.dP = 0.0 + self.Cham_H.dP = 0.0 + + if self.HandlePosition ~= self.OldHandlePosition then + -- reset working chambers pointers tables + self.ch1 = {} + self.ch2 = {} + self.ch3 = {} + for k,v in ipairs(self.SlideValve[self.HandlePosition]) do + local cp, p = v:match("(%g+)()") + self.ch1[k] = self[cp] + cp, p = v:match("(%g+)()", p) + self.ch2[k] = self[cp] + self.ch3[k] = tonumber(v:match("%d+%.%d+",p)) + end + self.OldHandlePosition = self.HandlePosition + end + + -- main chambers process (through sliding valve) + self.Cham_H.pressure = self.ValvT > 0 and self.InputPres or self.Cham_H.pressure + self.Cham_H.volume = self.ValvT > 0 and self.TLineVol or 0.1 + self.Cham_T.pressure = self.ValvB > 0 and self.OutPres or self.Cham_T.pressure + self.Cham_T.volume = self.ValvB > 0 and self.BLineVol or 0.1 + self.Cham_UR.volume = self.EqResVol + self.Cham_Ex.pressure = 0 + for i = 1,#self.ch1 do + local dP = self.ch1[i].pressure - self.ch2[i].pressure + self.ch1[i].dP = dP + if dP > 0.1 then + self.ch1[i].mass = self.ch1[i].pressure*self.ch1[i].volume + local dPV = self.ch1[i].mass*dT*dP*self.ch3[i] + self.ch1[i].mass = math.max(0,self.ch1[i].mass - dPV) + self.ch2[i].mass = math.max(0,self.ch2[i].mass + dPV) + elseif dP < -0.1 then + self.ch2[i].mass = self.ch2[i].pressure*self.ch2[i].volume + local dPV = self.ch2[i].mass*dT*dP*self.ch3[i] + self.ch2[i].mass = math.max(0,self.ch2[i].mass + dPV) + self.ch1[i].mass = math.max(0,self.ch1[i].mass - dPV) + end + self.ch1[i].pressure = math.min(self.InputPres,self.ch1[i].mass/self.ch1[i].volume) + self.ch2[i].pressure = math.min(self.InputPres,self.ch2[i].mass/self.ch2[i].volume) + end + --[[ + ---------------debug--------------------- + self.dlreadtimer = self.dlreadtimer or CurTime() + if CurTime() - self.dlreadtimer > 0.5 then + self.dlreadtimer = CurTime() + if Train:GetDriver() then + for i = 1,#self.ch1 do + PrintMessage(HUD_PRINTTALK, Format("Cham_3K.mass = %.2f; Cham_T.mass = %.2f; Cham_UR.mass = %.2f",self.Cham_3K.mass,self.Cham_T.mass,self.Cham_UR.mass)) + PrintMessage(HUD_PRINTTALK, Format("Cham_3K.pressure = %.2f; Cham_T.pressure = %.2f; Cham_UR.pressure = %.2f",self.Cham_3K.pressure,self.Cham_T.pressure,self.Cham_UR.pressure)) + end + PrintMessage(HUD_PRINTTALK, "-------------------------------------------------------------------------------") + end + end + ---------------debug---------------------]] + local dPiston = self.Cham_T.pressure - self.Cham_UR.pressure + if dPiston >= 0.2 then + self.PistonState = 1 + elseif dPiston < 0.08 then + self.PistonState = 0 + end + + -- braking chamber discharge through side release valve + if self.PistonState == 1 and self.Cham_T.pressure > 0 then + local dP = 15*self.Cham_T.pressure*dT/self.Cham_T.volume + self.Cham_T.pressure = math.max(0,self.Cham_T.pressure - dP) + self.Cham_T.dP = self.Cham_T.dP + dP + end + + -- pneumatic reducer 348 work + if self.HandlePosition == 2 then + if self.Cham_T.pressure - self.ReduSetpoint < 0 then + local dP = self.Cham_H.pressure - self.Cham_T.pressure + if dP > 0 then + --self.ch1[i].mass = self.ch1[i].pressure*self.ch1[i].volume + local dPV = self.Cham_H.mass*dT*dP*0.001 + self.Cham_H.mass = math.max(0,self.Cham_H.mass - dPV) + self.Cham_T.mass = math.max(0,self.Cham_T.mass + dPV) + end + self.Cham_H.pressure = math.min(self.InputPres,self.Cham_H.mass/self.Cham_H.volume) + self.Cham_T.pressure = math.min(self.InputPres,self.Cham_T.mass/self.Cham_T.volume) + end + end + ---[[ + ---------------debug--------------------- + self.dlreadtimer = self.dlreadtimer or CurTime() + if CurTime() - self.dlreadtimer > 0.5 then + self.dlreadtimer = CurTime() + if Train:GetDriver() then + PrintMessage(HUD_PRINTTALK, Format("Cham_UR.pressure = %.2f; Cham_T.pressure = %.2f; OutPres = %.2f; Piston: %u",self.Cham_UR.pressure,self.Cham_T.pressure,self.OutPres,self.PistonState)) + end + end + ---------------debug---------------------]] + --[[ + ---------------debug--------------------- + self.dlreadtimer2 = self.dlreadtimer2 or CurTime() + PrintMessage(HUD_PRINTTALK, Format("Вагон %u; BLineVol = %.2f;",Train:GetWagonNumber(),self.BLineVol)) + end + end + ---------------debug---------------------]] + + -- Piston leak + local dP = self.Cham_UR.pressure - self.Cham_T.pressure + local Pavg = (self.Cham_UR.pressure + self.Cham_T.pressure)/2 + if dP > 0 and self.Cham_UR.pressure > Pavg or dP < 0 and self.Cham_T.pressure < Pavg then + self.Cham_UR.pressure = self.Cham_UR.pressure - 0.003*dP*dT/self.Cham_UR.volume + self.Cham_T.pressure = self.Cham_T.pressure + 0.003*dP*dT/self.Cham_T.volume + end + + self.OutPres = self.Cham_T.pressure + self.ResvPres = self.Cham_UR.pressure + + Train:SetSoundState("crane334_brake_eq_high",self.Cham_UR.dP,1) + Train:SetSoundState("crane334_brake_eq_low",self.Cham_H.dP,1) + Train:SetSoundState("crane334_release",self.Cham_T.dP,1) + Train:SetSoundState("crane334_release_2",self.Cham_3K.dP,1) +end \ No newline at end of file