1
0
mirror of https://github.com/metrostroi-repo/MetrostroiAddon.git synced 2026-05-02 00:42:29 +00:00
Переписана система номера маршрута. (ТНМ-01)
This commit is contained in:
kosmik641
2022-05-10 15:55:18 +03:00
parent 7e9b1b732f
commit b3a49de7cf
4 changed files with 238 additions and 188 deletions

View File

@@ -4,7 +4,7 @@
-- Copyright (C) 2013-2018 Metrostroi Team & FoxWorks Aerospace s.r.o.
-- Contains proprietary code. See license.txt for additional information.
--------------------------------------------------------------------------------
Metrostroi.DefineSystem("81_722_RouteNumber")
Metrostroi.DefineSystem("81_722_TNM")
TRAIN_SYSTEM.DontAccelerateSimulation = true
function TRAIN_SYSTEM:Initialize()
@@ -21,211 +21,248 @@ function TRAIN_SYSTEM:Initialize()
if self.Train[v] then self.Triggers[v] = self.Train[v].Value > 0.5 end
end
self.State = 0
self.Brightness = 100
self.BrightKeys = 0
self.NumberState = 42
if not TURBOSTROI then
self.RouteNumber = IsValid(self.Train.Owner) and Format("%03d",tonumber(self.Train.Owner:GetInfo("metrostroi_route_number","61")) or 0) or "000"
self.CurrentRouteNumber = self.RouteNumber
self.RouteNumberState = 42
self.Number = IsValid(self.Train.Owner) and tonumber(self.Train.Owner:GetInfo("metrostroi_route_number","61")) or 777
end
end
function TRAIN_SYSTEM:Outputs()
return {}
end
function TRAIN_SYSTEM:Inputs()
return {}
end
if TURBOSTROI then return end
function TRAIN_SYSTEM:TriggerInput(name,value)
function TRAIN_SYSTEM:Trigger(name,value)
if value then
if self.State == 1 then
if name == "RouteNumber1" then self.BrightKeys = self.BrightKeys + 1 end
if name == "RouteNumber3" then self.BrightKeys = self.BrightKeys + 1 end
elseif self.State == 2 then
if name == "RouteNumber1" then
self.BrightKeys = self.BrightKeys + 1
elseif name == "RouteNumber3" then
self.BrightKeys = self.BrightKeys + 1
end
end
else
if self.State == 1 then
if not self.NewNumber then self.NewNumber = self.Number end
local rNum = self.NewNumber
local rNum1,rNum2,rNum3 = math.floor(rNum/100)%10,math.floor(rNum/10)%10,math.floor(rNum)%10
if name == "RouteNumber1" then
self.BrightKeys = math.max(0,self.BrightKeys-1)
if self.BrightKeys < 1 and not self.KeysLock then
rNum1 = rNum1 + 1
if rNum1 > 9 then rNum1 = 0 end
end
elseif name == "RouteNumber2" then
if self.BrightKeys < 1 and not self.KeysLock then
rNum2 = rNum2 + 1
if rNum2 > 9 then rNum2 = 0 end
end
elseif name == "RouteNumber3" then
self.BrightKeys = math.max(0,self.BrightKeys-1)
if self.BrightKeys < 1 and not self.KeysLock then
rNum3 = rNum3 + 1
if rNum3 > 9 then rNum3 = 0 end
end
end
self.NewNumber = rNum1*100+rNum2*10+rNum3
if self.NewNumber ~= self.Number then self.NewNumberTimer = CurTime()+5 end
elseif self.State == 2 then
local bright = self.Brightness
local bright1,bright2,bright3 = math.floor(bright/100)%10,math.floor(bright/10)%10,math.floor(bright)%10
if name == "RouteNumber1" then
self.BrightKeys = math.max(0,self.BrightKeys-1)
if self.BrightKeys < 1 and not self.KeysLock then
bright1 = bright1 + 1
if bright1 > 1 then bright1 = 0 end
end
elseif name == "RouteNumber2" then
if self.BrightKeys < 1 and not self.KeysLock then
bright2 = bright2 + 1
if bright2 > 9 then bright2 = 0 end
end
elseif name == "RouteNumber3" then
self.BrightKeys = math.max(0,self.BrightKeys-1)
if self.BrightKeys < 1 and not self.KeysLock then
bright3 = bright3 + 1
if bright3 > 9 then bright3 = 0 end
end
end
self.Brightness = math.min(100,bright1*100+bright2*10+bright3)
end
if self.KeysLock and self.BrightKeys == 0 then self.KeysLock = false end
end
end
if SERVER then
function TRAIN_SYSTEM:Trigger(name,value)
local Train = self.Train
if value then
if not self.NextRouteNumberTimer then
self.NextRouteNumber = Format("%03d",self.CurrentRouteNumber)
end
self.NextRouteNumberTimer = CurTime()
end
if name == "RouteNumber1" and value then
local num = tonumber(self.NextRouteNumber[1]+1)
if num > 9 then num = 0 end
self.NextRouteNumber = self.NextRouteNumber:SetChar(1,num)
end
if name == "RouteNumber2" and value then
local num = tonumber(self.NextRouteNumber[2]+1)
if num > 9 then num = 0 end
self.NextRouteNumber = self.NextRouteNumber:SetChar(2,num)
end
if name == "RouteNumber3" and value then
local num = tonumber(self.NextRouteNumber[3]+1)
if num > 9 then num = 0 end
self.NextRouteNumber = self.NextRouteNumber:SetChar(3,num)
end
end
function TRAIN_SYSTEM:Think(dT)
local Train = self.Train
local Panel = Train.Panel
local Work = Train.Electric.Power --and Train.SF19.Value > 0
if Work then
local Power = Train.Electric.Power > 0
if Power then
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)
self.Triggers[v] = Train[v].Value > 0.5
end
end
if self.NextRouteNumberTimer and CurTime()-self.NextRouteNumberTimer > 5 and self.RouteNumberState == 42 then
self.NextRouteNumberTimer = nil
self.CurrentRouteNumber = tonumber(self.NextRouteNumber)
if self.State == 1 then
if self.BrightKeys > 1 then
if not self.BrightTimer then self.BrightTimer = CurTime()+1 end
if CurTime() > self.BrightTimer then self.State=2 self.BrightTimer=nil self.KeysLock = true end
else
if self.BrightTimer then self.BrightTimer = nil end
end
Train:SetNW2Int("TNM:Number",self.NewNumber or self.Number)
elseif self.State == 0 then
self.State = 1
elseif self.State == 2 then
if self.BrightKeys > 1 and not self.KeysLock then
self.State = 1
self.KeysLock = true
end
Train:SetNW2Int("TNM:Number",self.Brightness)
end
if not self.RouteNumberUpdateDelay or self.RouteNumberUpdateDelay and CurTime()-self.RouteNumberUpdateDelay > 0.1 then
if self.RouteNumberState >= 0 and self.RouteNumber ~= self.CurrentRouteNumber then
self.RouteNumberState = self.RouteNumberState-1
Train:PlayOnce("blinker_off"..(self.RouteNumberState%2+1),"bass",0.6+math.random()*0.3,1)
if self.State > 0 then
if self.NewNumberTimer and CurTime()>self.NewNumberTimer then
if not self.NumberUpdate then self.NumberUpdate = CurTime()+0.1 end
self.NewNumberTimer = nil
end
if self.RouteNumberState < 42 and self.RouteNumber == self.CurrentRouteNumber then
self.RouteNumberState = self.RouteNumberState+1
Train:PlayOnce("blinker_on"..(self.RouteNumberState%2+1),"bass",0.6+math.random()*0.3,1)
if self.NumberUpdate and CurTime() > self.NumberUpdate then
self.NumberUpdate = CurTime()+0.1
if self.Number ~= self.NewNumber then
self.NumberState = math.max(0,self.NumberState - 1)
Train:PlayOnce("blinker_off"..(self.NumberState%2+1),"bass",0.6+math.random()*0.3,1)
if self.NumberState == 0 then self.Number = self.NewNumber end
elseif self.Number == self.NewNumber then
self.NumberState = math.min(42,self.NumberState + 1)
Train:PlayOnce("blinker_on"..(self.NumberState%2+1),"bass",0.6+math.random()*0.3,1)
if self.NumberState == 42 then self.NewNumber = nil self.NumberUpdate = nil end
end
end
if self.RouteNumberState < 0 and self.RouteNumber ~= self.CurrentRouteNumber then
self.RouteNumber = self.CurrentRouteNumber
self.RouteNumberState = self.RouteNumberState+1
Train:PlayOnce("blinker_on"..(self.RouteNumberState%2+1),"bass",0.6+math.random()*0.3,1)
end
self.RouteNumberUpdateDelay = CurTime()
Train:SetNW2Int("TNM:Number2",self.Number)
end
Train:SetNW2Int("TNM:NumberState",self.NumberState)
Train:SetNW2Int("TNM:Bright",self.NumberUpdate and 0 or self.Brightness)
else
if self.State ~= 0 then
self.BrightTimer = nil
self.NewNumber = nil
self.NewNumberTimer = nil
self.NumberUpdate = nil
self.State = 0
end
end
Train:SetNW2Bool("RouteNumberWork",Work)
Train:SetNW2Int("RouteNumberBright",10)
Train:SetNW2Int("RouteNumberState",self.RouteNumberState)
Train:SetNW2String("RouteNumberLastStation",Train.SarmatUPO.LastStationName)
Train:SetNW2Bool("RouteNumberLastStationWork",Work and Train.SF18.Value > 0 and Train.SarmatUPO.SarmatState > 0)
Train:SetNW2Int("RouteNumber",self.RouteNumber)
Train:SetNW2Int("RouteNumberSet",self.NextRouteNumber or self.RouteNumber)
Train:SetNW2Int("TNM:State",self.State)
end
else
function TRAIN_SYSTEM:ClientInitialize()
self.CurrentRouteNumber = 0
self.RouteNumberState = 42
self.RouteNumberNeedUpdate = true
self.Work = false
self.RouteNumberBright = 0
local function createFont(name,font,size)
surface.CreateFont("Metrostroi_"..name, {
font = font,
size = size,
weight = 800,
blursize = 0,
antialias = false,
underline = false,
italic = false,
strikeout = false,
symbol = false,
rotary = false,
shadow = false,
additive = false,
outline = false,
extended = true,
})
end
function TRAIN_SYSTEM:ClientThink()
if self.Train:ShouldDrawPanel("RouteNumber") and self.RouteNumberNeedUpdate then
render.PushRenderTarget(self.Train.RouteNumber,0,0,256, 128)
local TNMPixels = surface.GetTextureID("models/metrostroi_train/81-722/screens/sarmat_upo/tnm")
function TRAIN_SYSTEM:ClientInitialize()
self.Brightness = 100
self.NumberState = 42
self.Number = 61
self.NeedUpdate = true
end
function TRAIN_SYSTEM:ClientThink(dT)
-- ТНМ-1.02 АВДБ.687240.049-10
local Train = self.Train
local bright = (4.5-(Train:GetNW2Int("TNM:Bright",1)/100)*math.min(1,Train:GetNW2Int("TNM:State",0))*3.5)
local number = Train:GetNW2Int("TNM:Number2",777)
local rnState = Train:GetNW2Int("TNM:NumberState",42)
if self.Brightness ~= bright then
self.Brightness = bright
self.NeedUpdate = true
end
if self.NumberState ~= rnState then
self.NumberState = rnState
self.NeedUpdate = true
end
if self.Number ~= number then
self.Number = number
self.NeedUpdate = true
end
-- self.NeedUpdate = true
if self.NeedUpdate then
render.PushRenderTarget(Train.TNMScr,0,0,256,128)
render.Clear(0, 0, 0, 0)
cam.Start2D()
surface.SetDrawColor(0,0,0)
--surface.DrawRect(0,0,54,32)
self:RouteNumber(self.Train)
self:TNM(Train)
cam.End2D()
render.PopRenderTarget()
self.RouteNumberNeedUpdate = false
end
if self.LastStationNeedUpdate then
render.PushRenderTarget(self.Train.LastStation,0,0,512, 64)
render.Clear(0, 0, 0, 0)
cam.Start2D()
surface.SetDrawColor(0,0,0)
--surface.DrawRect(0,0,54,32)
self:LastStation(self.Train)
cam.End2D()
render.PopRenderTarget()
self.LastStationNeedUpdate = false
end
local number = self.Train:GetNW2Int("RouteNumber",0)
local work = self.Train:GetNW2Bool("RouteNumberWork",false)
if not work and self.CurrentRouteNumber == number then
if work ~= self.Work then
self.RouteNumberBright = 0
self.Work = false
self.RouteNumberNeedUpdate = true
end
else
local state = self.Train:GetNW2Int("RouteNumberState",0)
local bright = self.Train:GetNW2Int("RouteNumberBright",0)
if self.RouteNumberState ~= state or self.CurrentRouteNumber ~= number or work ~= self.Work or bright ~= self.RouteNumberBright then
self.RouteNumberNeedUpdate = true
self.Work = work
self.RouteNumberBright = bright
self.RouteNumberState = state
self.CurrentRouteNumber = number
end
end
local lswork = self.Train:GetNW2Bool("RouteNumberLastStationWork")
if not lswork then
if lswork ~= self.LastStationWork then
self.LastStationWork = false
self.LastStationNeedUpdate = true
end
else
local laststation = self.Train:GetNW2String("RouteNumberLastStation","")
if self.LastStationName ~= laststation or self.LastStationWork ~= lswork then
self.LastStationWork = lswork
self.LastStationName = laststation
self.LastStationNeedUpdate = true
end
self.NeedUpdate = false
end
end
local numbers = {
["0"] = {"0111110","1111111","1100011","1100011","1100011","1100011","1100011","1100011","1100011","1100011","1100011","1100011","1111111","0111110",},
["1"] = {"0001100","0011100","0111100","0001100","0001100","0001100","0001100","0001100","0001100","0001100","0001100","0001100","0111111","0111111",},
["2"] = {"0222220","2222222","2200022","0000022","0000022","0000022","0000220","0002200","0022000","0220000","2200000","2200000","2222222","2222222",},
["3"] = {"0333330","3333333","3300033","0000033","0000033","0000033","0033330","0033330","0000033","0000033","0000033","3300033","3333333","0333330",},
["4"] = {"4400044","4400044","4400044","4400044","4400044","4400044","4400044","4444444","4444444","0000044","0000044","0000044","0000044","0000044",},
["5"] = {"5555555","5555555","5500000","5500000","5500000","5500000","5555550","5555555","0000055","0000055","0000055","5500055","5555555","0555550",},
["6"] = {"0666660","6666666","6600066","6600000","6600000","6600000","6666660","6666666","6600066","6600066","6600066","6600066","6666666","0666660",},
["7"] = {"7777777","7777777","7700077","0000077","0000770","0007700","0077000","0770000","7700000","7700000","7700000","7700000","7700000","7700000",},
["8"] = {"0888880","8888888","8800088","8800088","8800088","8800088","0888880","0888888","8800088","8800088","8800088","8800088","8888888","0888880",},
["9"] = {"0999990","9999999","9900099","9900099","9900099","9900099","9999999","0999999","0000099","0000099","0000099","9900099","9999999","0999990",},
[0] = {0x3E,0x7F,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x7F,0x3E},
[1] = {0x0C,0x1C,0x3C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x3F,0x3F},
[2] = {0x3E,0x7F,0x63,0x03,0x03,0x03,0x06,0x0C,0x18,0x30,0x60,0x60,0x7F,0x7F},
[3] = {0x3E,0x7F,0x63,0x03,0x03,0x03,0x1E,0x1E,0x03,0x03,0x03,0x63,0x7F,0x3E},
[4] = {0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x7F,0x7F,0x03,0x03,0x03,0x03,0x03},
[5] = {0x7F,0x7F,0x60,0x60,0x60,0x60,0x7E,0x7F,0x03,0x03,0x03,0x63,0x7F,0x3E},
[6] = {0x3E,0x7F,0x63,0x60,0x60,0x60,0x7E,0x7F,0x63,0x63,0x63,0x63,0x7F,0x3E},
[7] = {0x7F,0x7F,0x63,0x03,0x03,0x06,0x0C,0x18,0x30,0x60,0x60,0x60,0x60,0x60},
[8] = {0x3E,0x7F,0x63,0x63,0x63,0x63,0x3E,0x3E,0x63,0x63,0x63,0x63,0x7F,0x3E},
[9] = {0x3E,0x7F,0x63,0x63,0x63,0x63,0x7F,0x3F,0x03,0x03,0x03,0x63,0x7F,0x3E},
}
TRAIN_SYSTEM.RouteNumberFont = {}
for i,num in pairs(numbers) do
if not TRAIN_SYSTEM.RouteNumberFont[i] then TRAIN_SYSTEM.RouteNumberFont[i] = {} end
local numtbl = TRAIN_SYSTEM.RouteNumberFont[i]
for ir,row in pairs(num) do
if not numtbl[ir] then numtbl[ir] = {} end
local rowtbl = numtbl[ir]
for ic=1,#row do
rowtbl[ic] = (row[ic] ~= "0")
TRAIN_SYSTEM.TNMFont = {}
for i=0,9 do
TRAIN_SYSTEM.TNMFont[i] = {}
for iy=0,13 do
TRAIN_SYSTEM.TNMFont[i][iy] = {}
for ix=0,6 do
TRAIN_SYSTEM.TNMFont[i][iy][ix] = bit.band(bit.rshift(numbers[i][iy+1],6-ix),1) > 0
end
end
end
function TRAIN_SYSTEM:LastStation(Train)
if self.LastStationWork then
draw.SimpleText(self.LastStationName,"Metrostroi_722LastStation",256, 24,Color(255,100,60),TEXT_ALIGN_CENTER,TEXT_ALIGN_CENTER)
end
end
function TRAIN_SYSTEM:RouteNumber(Train)
local bright = (5-self.RouteNumberBright*0.4)
if self.RouteNumberState < 42 or not self.Work then bright = 5 end
surface.SetDrawColor(150,255,50,255)
surface.SetDrawColor(150/bright,255/bright,50/bright,255)
--surface.SetDrawColor(150,220,50,255)
local num = Format("%03d",self.CurrentRouteNumber)
--print(self.RouteNumberState,math.ceil(self.RouteNumberState/2),self.CurrentRouteNumber,num,type(num),bright)
local rnstate = math.ceil(self.RouteNumberState/2)*2
local rnstate2 = math.floor(self.RouteNumberState/2)*2
local half = self.RouteNumberState ~= rnstate
for i=1,3 do
local rnstate = math.ceil((self.RouteNumberState-(i-1)*14)/2)*2
local rnstate2 = math.floor((self.RouteNumberState-(i-1)*14)/2)*2
local number = self.RouteNumberFont[num[i]]
if number then
--print(number)
for x=0,6 do
for y=0,13 do
if number[y+1][x+1] and ((14-rnstate2) <= y or ((14-rnstate) <= y and (x%2 > 0 and y%2 == 0 or x%2 == 0 and y%2 > 0))) then
surface.DrawRect((i-1)*64+x*8,1+y*8,7,7)
end
function TRAIN_SYSTEM:TNM(Train)
local rNum = self.Number
local bright = self.Brightness
local tnmState = self.NumberState
for i=0,2 do
local rnstate = math.ceil((tnmState-i*14)/2)*2
local rnstate2 = math.floor((tnmState-i*14)/2)*2
local rNum = math.floor(rNum/10^(2-i))%10
for ix=0,6 do
for iy=0,13 do
if self.TNMFont[rNum][iy][ix] and ((14-rnstate2) <= iy or ((14-rnstate) <= iy and (ix%2 > 0 and iy%2 == 0 or ix%2 == 0 and iy%2 > 0))) then
surface.SetDrawColor(150/bright,255/bright,50/bright)
else
surface.SetDrawColor(0,0,0,120)
end
surface.DrawRect(2+ix*8+i*72,2+iy*8,7,7)
end
end
end
-- Pixels mask
render.OverrideBlend(true,BLEND_ZERO,BLEND_ONE,BLENDFUNC_MIN)
surface.SetDrawColor(255,255,255)
surface.SetTexture(TNMPixels)
surface.DrawTexturedRectRotated(130,66,256,128,0)
render.OverrideBlend(false)
end
end