Skip to content

Commit 9b65bd9

Browse files
committed
Main: add original Half-Life logo.avi simulation based on assets in HL25
1 parent 6e0e123 commit 9b65bd9

File tree

2 files changed

+314
-5
lines changed

2 files changed

+314
-5
lines changed

Image.h

+3-3
Original file line numberDiff line numberDiff line change
@@ -91,9 +91,9 @@ class CImage
9191
return a.m_hPic == b.m_hPic;
9292
}
9393

94-
bool IsValid() { return m_hPic != 0; }
95-
const char *Path() { return m_szPath; }
96-
HIMAGE Handle() { return m_hPic; }
94+
bool IsValid() const { return m_hPic != 0; }
95+
const char *Path() const { return m_szPath; }
96+
HIMAGE Handle() const { return m_hPic; }
9797
private:
9898
const char *m_szPath;
9999
HIMAGE m_hPic;

menus/Main.cpp

+311-2
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
2727
#include "keydefs.h"
2828
#include "MenuStrings.h"
2929
#include "PlayerIntroduceDialog.h"
30+
#include "gameinfo.h"
3031

3132
#define ART_MINIMIZE_N "gfx/shell/min_n"
3233
#define ART_MINIMIZE_F "gfx/shell/min_f"
@@ -35,6 +36,16 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
3536
#define ART_CLOSEBTN_F "gfx/shell/cls_f"
3637
#define ART_CLOSEBTN_D "gfx/shell/cls_d"
3738

39+
#define ART_LOGO "resource/logo.tga"
40+
41+
#define ART_BLIP1 "resource/logo_blip.tga"
42+
#define ART_BLIP2 "resource/logo_blip2.tga"
43+
#define ART_BLIP_NUM 2
44+
45+
#define ART_BLUR "resource/logo_big_blurred_%i"
46+
#define ART_BLUR_BLIP "resource/logo_big_blurred_blip_%i"
47+
#define ART_BLUR_NUM 4
48+
3849
class CMenuMain: public CMenuFramework
3950
{
4051
public:
@@ -58,7 +69,58 @@ class CMenuMain: public CMenuFramework
5869
class CMenuMainBanner : public CMenuBannerBitmap
5970
{
6071
public:
61-
virtual void Draw();
72+
virtual void Init() override;
73+
virtual void VidInit() override;
74+
virtual void Draw() override;
75+
virtual void Think() override;
76+
77+
void AnimatedTitleDraw();
78+
79+
void RandomizeGoalTime( float time );
80+
void RandomizeSpeed( float initial_speed );
81+
void RandomizeBlipTime( float time );
82+
void RandomizeBlip( void );
83+
private:
84+
bool useAnimatedTitle;
85+
float scale;
86+
87+
CImage logo;
88+
CImage logoBlip[ART_BLIP_NUM];
89+
90+
CImage logoBlur[ART_BLUR_NUM];
91+
CImage logoBlurBlip[ART_BLUR_NUM];
92+
93+
int m_nLogoImageXMin;
94+
int m_nLogoImageXMax;
95+
int m_nLogoImageXGoal;
96+
float m_flPrevFrameTime;
97+
float m_flTimeLogoNewGoal;
98+
float m_flTimeLogoNewGoalMin;
99+
float m_flTimeLogoNewGoalMax;
100+
float m_flTimeUntilLogoBlipMin;
101+
float m_flTimeUntilLogoBlipMax;
102+
float m_flTimeLogoBlip;
103+
int m_nLogoBlipType;
104+
int m_nLogoImageY;
105+
float m_fLogoImageX;
106+
float m_fLogoSpeedMin;
107+
float m_fLogoSpeedMax;
108+
float m_fLogoSpeed;
109+
int m_nLogoBGOffsetX;
110+
int m_nLogoBGOffsetY;
111+
112+
enum LogoBlip_t
113+
{
114+
E_LOGO_BLIP_BOTH,
115+
E_LOGO_BLIP_JUST_LOGO,
116+
E_LOGO_BLIP_JUST_BG,
117+
E_LOGO_BLIP_STAGGER,
118+
E_LOGO_BLIP_BOTH_SHOW_BLIP_LOGO_ONLY
119+
} m_nNextLogoBlipType;
120+
121+
// not referenced
122+
bool drawBlip[ART_BLIP_NUM];
123+
bool drawBgBlip;
62124
} banner;
63125

64126
CMenuPicButton resumeGame;
@@ -83,9 +145,126 @@ class CMenuMain: public CMenuFramework
83145
bool bCustomGame;
84146
};
85147

148+
void CMenuMain::CMenuMainBanner::Init()
149+
{
150+
useAnimatedTitle = false;
151+
152+
if( !FBitSet( gMenu.m_gameinfo.flags, GFL_ANIMATED_TITLE ))
153+
return;
154+
155+
logo.Load( ART_LOGO );
156+
if( !logo.IsValid( ))
157+
return;
158+
159+
logoBlip[0].Load( ART_BLIP1 );
160+
logoBlip[1].Load( ART_BLIP2 );
161+
for( int i = 0; i < ART_BLIP_NUM; i++ )
162+
{
163+
if( !logoBlip[i].IsValid( ))
164+
return;
165+
}
166+
167+
for( int i = 0; i < ART_BLUR_NUM; i++ )
168+
{
169+
char name[256];
170+
snprintf( name, sizeof( name ), ART_BLUR, i );
171+
logoBlur[i].Load( name );
172+
if( !logoBlur[i].IsValid( ))
173+
return;
174+
175+
snprintf( name, sizeof( name ), ART_BLUR_BLIP, i );
176+
logoBlurBlip[i].Load( name );
177+
if( !logoBlurBlip[i].IsValid( ))
178+
return;
179+
}
180+
181+
useAnimatedTitle = true;
182+
}
183+
184+
void CMenuMain::CMenuMainBanner::RandomizeGoalTime( float time )
185+
{
186+
const float randval = rand() / (float)RAND_MAX;
187+
const float range = ( m_flTimeLogoNewGoalMax - m_flTimeLogoNewGoalMin );
188+
189+
m_flTimeLogoNewGoal = time + randval * range;
190+
}
191+
192+
void CMenuMain::CMenuMainBanner::RandomizeSpeed( float initial_speed )
193+
{
194+
const float range = m_fLogoSpeedMax - m_fLogoSpeedMin;
195+
const float randval = rand() / (float)RAND_MAX;
196+
197+
m_fLogoSpeed = initial_speed + randval * range;
198+
}
199+
200+
void CMenuMain::CMenuMainBanner::RandomizeBlipTime( float time )
201+
{
202+
const float range = m_flTimeUntilLogoBlipMax - m_flTimeUntilLogoBlipMin;
203+
const float randval = rand() / (float)RAND_MAX;
204+
205+
m_flTimeLogoBlip = time + randval * range;
206+
}
207+
208+
void CMenuMain::CMenuMainBanner::RandomizeBlip()
209+
{
210+
// why tho
211+
const float randval = rand() / (float)RAND_MAX;
212+
213+
if( randval >= 0.6f )
214+
m_nLogoBlipType = E_LOGO_BLIP_BOTH;
215+
else if( randval > 0.4f )
216+
m_nLogoBlipType = E_LOGO_BLIP_STAGGER;
217+
else if( randval >= 0.25f )
218+
m_nLogoBlipType = E_LOGO_BLIP_JUST_LOGO;
219+
else if( randval > 0.1f )
220+
m_nLogoBlipType = E_LOGO_BLIP_BOTH_SHOW_BLIP_LOGO_ONLY;
221+
else
222+
m_nLogoBlipType = E_LOGO_BLIP_JUST_BG;
223+
}
224+
225+
void CMenuMain::CMenuMainBanner::VidInit()
226+
{
227+
if( !useAnimatedTitle )
228+
return;
229+
230+
// in hardware mode, it's scaled by screen width
231+
// in software mode, scale must be 1.0f
232+
scale = ScreenWidth / 1024.0f;
233+
234+
Size logoSz = EngFuncs::PIC_Size(logo.Handle());
235+
236+
logoSz = logoSz * scale;
237+
m_nLogoImageXMin = (ScreenWidth / 2.0f - logoSz.w / 2.0f) - scale * 88.0f;
238+
m_nLogoImageXMax = (ScreenWidth / 2.0f - logoSz.w / 2.0f) + scale * 32.0f;
239+
m_nLogoImageXGoal = m_nLogoImageXMax;
240+
m_nNextLogoBlipType = E_LOGO_BLIP_BOTH;
241+
m_flTimeLogoNewGoalMin = 0.4f;
242+
m_flTimeLogoNewGoalMax = 1.95f;
243+
m_flTimeUntilLogoBlipMin = 0.5f;
244+
m_flTimeUntilLogoBlipMax = 1.4f;
245+
246+
m_fLogoImageX = m_nLogoImageXMin + ((m_nLogoImageXMax - m_nLogoImageXMin) / 2.0f);
247+
if( ScreenHeight > 600 )
248+
m_nLogoImageY = 60 * uiStatic.scaleY;
249+
else m_nLogoImageY = 20 * uiStatic.scaleY;
250+
251+
m_nLogoBGOffsetX = scale * -320.0f;
252+
m_nLogoBGOffsetY = m_nLogoImageY - scale * 54.0f;
253+
m_fLogoSpeedMin = scale * 13.0f;
254+
m_fLogoSpeedMax = scale * 65.0f;
255+
m_flPrevFrameTime = gpGlobals->time;
256+
257+
RandomizeGoalTime( gpGlobals->time + m_flTimeLogoNewGoalMin );
258+
RandomizeSpeed( m_fLogoSpeedMin );
259+
RandomizeBlipTime( gpGlobals->time + m_flTimeUntilLogoBlipMin );
260+
}
261+
86262
void CMenuMain::CMenuMainBanner::Draw()
87263
{
88-
if( !CMenuBackgroundBitmap::ShouldDrawLogoMovie() )
264+
if( useAnimatedTitle )
265+
AnimatedTitleDraw();
266+
267+
if( !CMenuBackgroundBitmap::ShouldDrawLogoMovie( ))
89268
return; // no logos for steam background
90269

91270
if( EngFuncs::GetLogoLength() <= 0.05f || EngFuncs::GetLogoWidth() <= 32 )
@@ -105,6 +284,136 @@ void CMenuMain::CMenuMainBanner::Draw()
105284
EngFuncs::DrawLogo( "logo.avi", 0, logoPosY, logoWidth, logoHeight );
106285
}
107286

287+
void CMenuMain::CMenuMainBanner::Think()
288+
{
289+
if( !useAnimatedTitle )
290+
return;
291+
292+
// m_fLogoImageX = uiStatic.cursorX;
293+
// return;
294+
295+
float deltatime = gpGlobals->time - m_flPrevFrameTime;
296+
deltatime = bound( 0.0001, deltatime, 0.3 );
297+
298+
m_flPrevFrameTime = gpGlobals->time;
299+
300+
float deltaX = deltatime * m_fLogoSpeed;
301+
302+
if( m_fLogoImageX >= m_nLogoImageXGoal )
303+
{
304+
m_fLogoImageX -= deltaX;
305+
306+
if( m_fLogoImageX <= m_nLogoImageXGoal || gpGlobals->time >= m_flTimeLogoNewGoal )
307+
{
308+
RandomizeGoalTime( gpGlobals->time + m_flTimeLogoNewGoalMin );
309+
RandomizeSpeed( m_fLogoSpeedMin );
310+
311+
m_nLogoImageXGoal = m_nLogoImageXMax;
312+
}
313+
}
314+
else
315+
{
316+
m_fLogoImageX += deltaX;
317+
318+
if( m_fLogoImageX >= m_nLogoImageXGoal || gpGlobals->time >= m_flTimeLogoNewGoal )
319+
{
320+
RandomizeGoalTime( gpGlobals->time + m_flTimeLogoNewGoalMin );
321+
RandomizeSpeed( m_fLogoSpeedMin );
322+
323+
m_nLogoImageXGoal = m_nLogoImageXMin;
324+
}
325+
}
326+
327+
drawBlip[0] = drawBlip[1] = false;
328+
drawBgBlip = false;
329+
330+
if( gpGlobals->time > m_flTimeLogoBlip )
331+
{
332+
RandomizeBlipTime( gpGlobals->time + m_flTimeUntilLogoBlipMin );
333+
RandomizeBlip();
334+
}
335+
else
336+
{
337+
float timeToBlip;
338+
339+
if( m_nLogoBlipType == E_LOGO_BLIP_STAGGER )
340+
timeToBlip = 0.09f; // TODO
341+
else if( m_nLogoBlipType == E_LOGO_BLIP_BOTH_SHOW_BLIP_LOGO_ONLY )
342+
timeToBlip = 0.07f;
343+
else
344+
timeToBlip = 0.06f;
345+
346+
if( gpGlobals->time + timeToBlip > m_flTimeLogoBlip )
347+
{
348+
switch( m_nLogoBlipType )
349+
{
350+
case E_LOGO_BLIP_BOTH:
351+
drawBgBlip = true;
352+
drawBlip[0] = true;
353+
break;
354+
case E_LOGO_BLIP_JUST_LOGO:
355+
drawBlip[0] = true;
356+
break;
357+
case E_LOGO_BLIP_JUST_BG:
358+
drawBgBlip = true;
359+
break;
360+
case E_LOGO_BLIP_STAGGER:
361+
drawBgBlip = true;
362+
drawBlip[0] = gpGlobals->time + ( timeToBlip / 2.0f ) <= m_flTimeLogoBlip;
363+
break;
364+
case E_LOGO_BLIP_BOTH_SHOW_BLIP_LOGO_ONLY:
365+
drawBgBlip = true;
366+
drawBlip[0] = true;
367+
drawBlip[1] = true;
368+
break;
369+
}
370+
}
371+
}
372+
}
373+
374+
void CMenuMain::CMenuMainBanner::AnimatedTitleDraw()
375+
{
376+
Point logoPt( m_fLogoImageX, m_nLogoImageY );
377+
Size logoSz = EngFuncs::PIC_Size( logo.Handle( )) * scale;
378+
379+
EngFuncs::PIC_Set( logo.Handle(), 255, 255, 255 );
380+
EngFuncs::PIC_DrawTrans( logoPt, logoSz );
381+
382+
for( int i = 0; i < ART_BLIP_NUM; i++ )
383+
{
384+
if( drawBlip[i] )
385+
{
386+
EngFuncs::PIC_Set( logoBlip[i], 255, 255, 255 );
387+
EngFuncs::PIC_DrawTrans( logoPt, logoSz );
388+
}
389+
}
390+
391+
#if 0
392+
// makes big logo centered but in original it's a bit offset
393+
logoPt.x = m_fLogoImageX + m_nLogoBGOffsetX;
394+
#else
395+
logoPt.x = 0;
396+
#endif
397+
398+
float t1 = m_nLogoImageXMax - m_nLogoImageXMin;
399+
float t2 = m_nLogoBGOffsetX - t1 * 1.85f;
400+
float t3 = t2 + ( t1 * 3.7f ) * (( m_fLogoImageX - m_nLogoImageXMin ) / t1 );
401+
402+
logoPt.x += t3;
403+
logoPt.y = m_nLogoBGOffsetY;
404+
405+
const CImage *images = drawBgBlip ? logoBlurBlip : logoBlur;
406+
for( int i = 0; i < ART_BLUR_NUM; i++ )
407+
{
408+
logoSz = EngFuncs::PIC_Size( logoBlur[i].Handle( )) * scale;
409+
410+
EngFuncs::PIC_Set( images[i].Handle( ), 255, 255, 255 );
411+
EngFuncs::PIC_DrawTrans( logoPt, logoSz );
412+
413+
logoPt.x += logoSz.w;
414+
}
415+
}
416+
108417
void CMenuMain::QuitDialog(void *pExtra)
109418
{
110419
if( CL_IsActive() && EngFuncs::GetCvarFloat( "host_serverstate" ) && EngFuncs::GetCvarFloat( "maxplayers" ) == 1.0f )

0 commit comments

Comments
 (0)