@@ -27,6 +27,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
27
27
#include " keydefs.h"
28
28
#include " MenuStrings.h"
29
29
#include " PlayerIntroduceDialog.h"
30
+ #include " gameinfo.h"
30
31
31
32
#define ART_MINIMIZE_N " gfx/shell/min_n"
32
33
#define ART_MINIMIZE_F " gfx/shell/min_f"
@@ -35,6 +36,16 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
35
36
#define ART_CLOSEBTN_F " gfx/shell/cls_f"
36
37
#define ART_CLOSEBTN_D " gfx/shell/cls_d"
37
38
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
+
38
49
class CMenuMain : public CMenuFramework
39
50
{
40
51
public:
@@ -58,7 +69,58 @@ class CMenuMain: public CMenuFramework
58
69
class CMenuMainBanner : public CMenuBannerBitmap
59
70
{
60
71
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;
62
124
} banner;
63
125
64
126
CMenuPicButton resumeGame;
@@ -83,9 +145,126 @@ class CMenuMain: public CMenuFramework
83
145
bool bCustomGame;
84
146
};
85
147
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
+
86
262
void CMenuMain::CMenuMainBanner::Draw ()
87
263
{
88
- if ( !CMenuBackgroundBitmap::ShouldDrawLogoMovie () )
264
+ if ( useAnimatedTitle )
265
+ AnimatedTitleDraw ();
266
+
267
+ if ( !CMenuBackgroundBitmap::ShouldDrawLogoMovie ( ))
89
268
return ; // no logos for steam background
90
269
91
270
if ( EngFuncs::GetLogoLength () <= 0 .05f || EngFuncs::GetLogoWidth () <= 32 )
@@ -105,6 +284,136 @@ void CMenuMain::CMenuMainBanner::Draw()
105
284
EngFuncs::DrawLogo ( " logo.avi" , 0 , logoPosY, logoWidth, logoHeight );
106
285
}
107
286
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
+
108
417
void CMenuMain::QuitDialog (void *pExtra)
109
418
{
110
419
if ( CL_IsActive () && EngFuncs::GetCvarFloat ( " host_serverstate" ) && EngFuncs::GetCvarFloat ( " maxplayers" ) == 1 .0f )
0 commit comments