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_722_routenumber.lua
kosmik641 b3a49de7cf 81-722.
Переписана система номера маршрута. (ТНМ-01)
2025-05-30 12:57:24 +03:00

269 lines
11 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
--------------------------------------------------------------------------------
-- 81-722 route number
--------------------------------------------------------------------------------
-- Copyright (C) 2013-2018 Metrostroi Team & FoxWorks Aerospace s.r.o.
-- Contains proprietary code. See license.txt for additional information.
--------------------------------------------------------------------------------
Metrostroi.DefineSystem("81_722_TNM")
TRAIN_SYSTEM.DontAccelerateSimulation = true
function TRAIN_SYSTEM:Initialize()
self.Train:LoadSystem("RouteNumber1","Relay")
self.Train:LoadSystem("RouteNumber2","Relay")
self.Train:LoadSystem("RouteNumber3","Relay")
self.TriggerNames = {
"RouteNumber1",
"RouteNumber2",
"RouteNumber3",
}
self.Triggers = {}
for k,v in pairs(self.TriggerNames) do
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.Number = IsValid(self.Train.Owner) and tonumber(self.Train.Owner:GetInfo("metrostroi_route_number","61")) or 777
end
end
if TURBOSTROI then return end
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:Think(dT)
local Train = self.Train
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.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 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.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
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:SetNW2Int("TNM:State",self.State)
end
else
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
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()
self:TNM(Train)
cam.End2D()
render.PopRenderTarget()
self.NeedUpdate = false
end
end
local numbers = {
[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.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: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