mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-16 13:23:46 +03:00
175 lines
3.3 KiB
Lua
175 lines
3.3 KiB
Lua
--[[
|
|
| This file was obtained through the combined efforts
|
|
| of Madbluntz & Plymouth Antiquarian Society.
|
|
|
|
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
|
| Maloy, DrPepper10 @ RIP, Atle!
|
|
|
|
|
| Visit for more: https://plymouth.thetwilightzone.ru/
|
|
--]]
|
|
|
|
|
|
local MenuGradient = Material( "html/img/gradient.png", "nocull smooth" )
|
|
|
|
local FreeMaterial = nil
|
|
|
|
local function CreateBackgroundMaterial( path )
|
|
if ( FreeMaterial ) then
|
|
FreeMaterial:SetDynamicImage( path )
|
|
|
|
local ret = FreeMaterial
|
|
FreeMaterial = nil
|
|
return ret
|
|
end
|
|
|
|
return DynamicMaterial( path, "0100010" ) -- nocull smooth
|
|
end
|
|
|
|
local function FreeBackgroundMaterial( mat )
|
|
if ( FreeMaterial ) then
|
|
MsgN( "Warning! Menu shouldn't be releasing a material when one is already queued for use!" )
|
|
end
|
|
|
|
FreeMaterial = mat
|
|
end
|
|
|
|
local Images = {}
|
|
|
|
local Active = nil
|
|
local Outgoing = nil
|
|
|
|
local function Think( tbl )
|
|
|
|
tbl.Angle = tbl.Angle + ( tbl.AngleVel * FrameTime() )
|
|
tbl.Size = tbl.Size + ( ( tbl.SizeVel / tbl.Size) * FrameTime() )
|
|
|
|
if ( tbl.AlphaVel ) then
|
|
tbl.Alpha = tbl.Alpha - tbl.AlphaVel * FrameTime()
|
|
end
|
|
|
|
if ( tbl.DieTime > 0 ) then
|
|
tbl.DieTime = tbl.DieTime - FrameTime()
|
|
|
|
if ( tbl.DieTime <= 0 ) then
|
|
ChangeBackground()
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
local function Render( tbl )
|
|
|
|
if ( !tbl.mat ) then return end
|
|
|
|
surface.SetMaterial( tbl.mat )
|
|
surface.SetDrawColor( 255, 255, 255, tbl.Alpha )
|
|
|
|
local w = ScrH() * tbl.Size * tbl.Ratio
|
|
local h = ScrH() * tbl.Size
|
|
|
|
local x = ScrW() * 0.5
|
|
local y = ScrH() * 0.5
|
|
|
|
surface.DrawTexturedRectRotated( x, y, w, h, tbl.Angle )
|
|
|
|
end
|
|
|
|
local function ShouldBackgroundUpdate()
|
|
|
|
return !IsInGame() && !IsInLoading()
|
|
|
|
end
|
|
|
|
function DrawBackground()
|
|
|
|
if ( ShouldBackgroundUpdate() ) then
|
|
|
|
if ( Active ) then
|
|
Think( Active )
|
|
Render( Active )
|
|
end
|
|
|
|
if ( Outgoing ) then
|
|
Think( Outgoing )
|
|
Render( Outgoing )
|
|
end
|
|
|
|
end
|
|
|
|
surface.SetMaterial( MenuGradient )
|
|
surface.SetDrawColor( 255, 255, 255, 255 )
|
|
surface.DrawTexturedRect( 0, 0, 1024, ScrH() )
|
|
|
|
end
|
|
|
|
function ClearBackgroundImages( img )
|
|
|
|
Images = {}
|
|
|
|
end
|
|
|
|
function AddBackgroundImage( img )
|
|
|
|
table.insert( Images, img )
|
|
|
|
end
|
|
|
|
local LastGamemode = "none"
|
|
|
|
function ChangeBackground( currentgm )
|
|
|
|
if ( !ShouldBackgroundUpdate() ) then return end -- Don't try to load new images while in-game or loading
|
|
|
|
if ( currentgm && currentgm == LastGamemode ) then return end
|
|
if ( currentgm ) then LastGamemode = currentgm end
|
|
|
|
local img = table.Random( Images )
|
|
if ( !img ) then
|
|
print( "No main menu backgrounds found!" )
|
|
return
|
|
end
|
|
|
|
-- We just rolled the same image, no thank you, reroll
|
|
if ( Active && img == Active.Name && #Images > 1 ) then
|
|
ChangeBackground()
|
|
return
|
|
end
|
|
|
|
if ( Outgoing ) then
|
|
FreeBackgroundMaterial( Outgoing.mat )
|
|
Outgoing.mat = nil
|
|
end
|
|
|
|
Outgoing = Active
|
|
if ( Outgoing ) then
|
|
Outgoing.AlphaVel = 255
|
|
end
|
|
|
|
local mat = CreateBackgroundMaterial( img )
|
|
if ( !mat || mat:IsError() ) then
|
|
print( "Failed to create material for background ", img )
|
|
table.RemoveByValue( Images, img )
|
|
ChangeBackground()
|
|
return
|
|
end
|
|
|
|
Active = {
|
|
Ratio = mat:GetInt( "$realwidth" ) / mat:GetInt( "$realheight" ),
|
|
Size = 1,
|
|
Angle = 0,
|
|
AngleVel = -( 5 / 30 ),
|
|
SizeVel = 0.3 / 30,
|
|
Alpha = 255,
|
|
DieTime = 30,
|
|
mat = mat,
|
|
Name = img
|
|
}
|
|
|
|
if ( Active.Ratio < ScrW() / ScrH() ) then
|
|
|
|
Active.Size = Active.Size + ( ( ScrW() / ScrH() ) - Active.Ratio )
|
|
|
|
end
|
|
|
|
end
|