mirror of
https://github.com/metrostroi-repo/MetrostroiAddon.git
synced 2026-05-02 00:42:29 +00:00
232 lines
11 KiB
Lua
232 lines
11 KiB
Lua
--------------------------------------------------------------------------------
|
|
-- 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_RouteNumber")
|
|
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
|
|
|
|
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
|
|
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)
|
|
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
|
|
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)
|
|
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)
|
|
|
|
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)
|
|
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()
|
|
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)
|
|
end
|
|
else
|
|
function TRAIN_SYSTEM:ClientInitialize()
|
|
self.CurrentRouteNumber = 0
|
|
self.RouteNumberState = 42
|
|
self.RouteNumberNeedUpdate = true
|
|
self.Work = false
|
|
self.RouteNumberBright = 0
|
|
end
|
|
function TRAIN_SYSTEM:ClientThink()
|
|
if self.Train:ShouldDrawPanel("RouteNumber") and self.RouteNumberNeedUpdate then
|
|
render.PushRenderTarget(self.Train.RouteNumber,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)
|
|
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
|
|
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",},
|
|
}
|
|
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")
|
|
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
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|