Skip to content

Commit 6d4067c

Browse files
Vladislav4KZa1batross
authored andcommitted
client: implement in-game hints support (autohelp)
1 parent b5fdef5 commit 6d4067c

File tree

2 files changed

+110
-37
lines changed

2 files changed

+110
-37
lines changed

cl_dll/hud.h

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -632,6 +632,14 @@ struct message_parms_t
632632
float fadeTime;
633633
};
634634

635+
struct hud_message_t
636+
{
637+
client_textmessage_t *pMessage;
638+
// unsigned int font;
639+
char args[4][256]; // 1024 bytes
640+
int arg_count;
641+
};
642+
635643
//
636644
//-----------------------------------------------------
637645
//
@@ -666,8 +674,8 @@ class CHudMessage: public CHudBase
666674
int XPosition( float x, int width, int lineWidth );
667675
int YPosition( float y, int height );
668676

669-
void MessageAdd( const char *pName, float time );
670-
void MessageAdd(client_textmessage_t * newMessage );
677+
void MessageAdd( const char *pName, float time, qboolean hintMessage = 0/*, unsigned int font = 0 */ );
678+
void MessageAdd( client_textmessage_t *newMessage );
671679
void MessageDrawScan( client_textmessage_t *pMessage, float time );
672680
void MessageScanStart( void );
673681
void MessageScanNextChar( void );
@@ -676,7 +684,7 @@ class CHudMessage: public CHudBase
676684
client_textmessage_t *AllocMessage( const char *text = NULL, client_textmessage_t *copyFrom = NULL );
677685

678686
private:
679-
client_textmessage_t *m_pMessages[maxHUDMessages];
687+
hud_message_t m_pMessages[maxHUDMessages];
680688
float m_startTime[maxHUDMessages];
681689
message_parms_t m_parms;
682690
float m_gameTitleTime;

cl_dll/message.cpp

Lines changed: 99 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ int CHudMessage::VidInit( void )
5151

5252
void CHudMessage::Reset( void )
5353
{
54-
memset( m_pMessages, 0, sizeof( m_pMessages[0] ) * maxHUDMessages );
54+
memset( m_pMessages, 0, sizeof( m_pMessages[0] ) * maxHUDMessages );
5555
memset( m_startTime, 0, sizeof( m_startTime[0] ) * maxHUDMessages );
5656

5757
m_gameTitleTime = 0;
@@ -241,7 +241,7 @@ void CHudMessage::MessageDrawScan( client_textmessage_t *pMessage, float time )
241241
{
242242
int i, j, length, width;
243243
const char *pText;
244-
unsigned char line[80];
244+
unsigned char line[512];
245245

246246
pText = pMessage->pMessage;
247247
// Count lines
@@ -369,19 +369,19 @@ int CHudMessage::Draw( float fTime )
369369
for ( i = 0; i < maxHUDMessages; i++ )
370370
{
371371
// Assume m_parms.time contains last time
372-
if ( m_pMessages[i] )
372+
if ( m_pMessages[i].pMessage )
373373
{
374-
pMessage = m_pMessages[i];
374+
pMessage = m_pMessages[i].pMessage;
375375
if ( m_startTime[i] > gHUD.m_flTime )
376376
m_startTime[i] = gHUD.m_flTime + m_parms.time - m_startTime[i] + 0.2; // Server takes 0.2 seconds to spawn, adjust for this
377377
}
378378
}
379379

380380
for ( i = 0; i < maxHUDMessages; i++ )
381381
{
382-
if ( m_pMessages[i] )
382+
if ( m_pMessages[i].pMessage )
383383
{
384-
pMessage = m_pMessages[i];
384+
pMessage = m_pMessages[i].pMessage;
385385

386386
// This is when the message is over
387387
switch( pMessage->effect )
@@ -414,11 +414,11 @@ int CHudMessage::Draw( float fTime )
414414
else
415415
{
416416
// The message is over
417-
if( !strcmp( m_pMessages[i]->pName, "Custom" ) )
417+
if( !strcmp( m_pMessages[i].pMessage->pName, "Custom" ) )
418418
{
419-
delete[] m_pMessages[i]->pMessage;
419+
delete[] m_pMessages[i].pMessage->pMessage;
420420
}
421-
m_pMessages[i] = NULL;
421+
m_pMessages[i].pMessage = NULL;
422422
}
423423
}
424424
}
@@ -433,22 +433,22 @@ int CHudMessage::Draw( float fTime )
433433
}
434434

435435

436-
void CHudMessage::MessageAdd( const char *pName, float time )
436+
void CHudMessage::MessageAdd( const char *pName, float time, qboolean hintMessage/*, unsigned int font */ )
437437
{
438-
int i,j;
438+
int i, j;
439439
client_textmessage_t *tempMessage;
440+
client_textmessage_t *message;
440441

441442
for ( i = 0; i < maxHUDMessages; i++ )
442443
{
443-
if ( !m_pMessages[i] )
444+
if ( !m_pMessages[i].pMessage )
444445
{
445446
// Trim off a leading # if it's there
446447
if ( pName[0] == '#' )
447448
tempMessage = TextMessageGet( pName+1 );
448449
else
449450
tempMessage = TextMessageGet( pName );
450451

451-
client_textmessage_t *message;
452452
if( tempMessage )
453453
{
454454
if( tempMessage->pMessage[0] == '#' )
@@ -466,13 +466,14 @@ void CHudMessage::MessageAdd( const char *pName, float time )
466466
}
467467
else
468468
{
469+
char *localized = (char *)pName;
469470
if( pName[0] == '#' )
470471
{
471-
pName = Localize( pName + 1 );
472+
localized = (char *)Localize( pName + 1 );
472473
}
473474

474475
// If we couldnt find it in the titles.txt, just create it
475-
message = AllocMessage( pName );
476+
message = AllocMessage( localized );
476477

477478
message->effect = 2;
478479
message->r1 = message->g1 = message->b1 = message->a1 = 100;
@@ -488,11 +489,46 @@ void CHudMessage::MessageAdd( const char *pName, float time )
488489
message->holdtime = 5;
489490
}
490491

492+
if ( message && hintMessage )
493+
{
494+
message->effect = 2;
495+
message->r1 = 40;
496+
message->g1 = 255;
497+
message->b1 = 40;
498+
message->a1 = 200;
499+
message->r2 = 0;
500+
message->g2 = 255;
501+
message->b2 = 0;
502+
message->a2 = 200;
503+
message->x = -1.0;
504+
message->y = 0.7;
505+
message->fadein = 0.01;
506+
message->fadeout = 0.7;
507+
message->fxtime = 0.07;
508+
message->holdtime = 5.0;
509+
510+
if ( !strcmp( pName, "#Spec_Duck" ) )
511+
{
512+
message->holdtime = 6.0;
513+
}
514+
else if ( message->pMessage )
515+
{
516+
float lengthHold = (float)strlen( message->pMessage ) / 25.0f;
517+
if ( lengthHold < 1.0f )
518+
lengthHold = 1.0f;
519+
message->holdtime = lengthHold;
520+
}
521+
else
522+
{
523+
message->holdtime = 1.0;
524+
}
525+
}
526+
491527
// safety check - don't add empty messages
492-
if ( !message->pMessage || message->pMessage[0] == '\0' )
528+
if ( !message || !message->pMessage || message->pMessage[0] == '\0' )
493529
{
494530
// clean up custom messages
495-
if ( !strcmp(message->pName, "Custom") )
531+
if ( message && !strcmp(message->pName, "Custom") )
496532
{
497533
delete[] message->pMessage;
498534
}
@@ -501,10 +537,10 @@ void CHudMessage::MessageAdd( const char *pName, float time )
501537

502538
for ( j = 0; j < maxHUDMessages; j++ )
503539
{
504-
if ( m_pMessages[j] )
540+
if ( m_pMessages[j].pMessage )
505541
{
506542
// is this message already in the list
507-
if ( !strcmp( message->pMessage, m_pMessages[j]->pMessage ) )
543+
if ( !strcmp( message->pMessage, m_pMessages[j].pMessage->pMessage ) )
508544
{
509545
if( !strcmp( message->pName, "Custom" ) )
510546
{
@@ -514,18 +550,19 @@ void CHudMessage::MessageAdd( const char *pName, float time )
514550
}
515551

516552
// get rid of any other messages in same location (only one displays at a time)
517-
if ( fabs( message->y - m_pMessages[j]->y ) < 0.0001 && fabs( message->x - m_pMessages[j]->x ) < 0.0001 )
553+
if ( fabs( message->y - m_pMessages[j].pMessage->y ) < 0.0001 && fabs( message->x - m_pMessages[j].pMessage->x ) < 0.0001 )
518554
{
519-
if( !strcmp( m_pMessages[j]->pName, "Custom" ) )
555+
if( !strcmp( m_pMessages[j].pMessage->pName, "Custom" ) )
520556
{
521-
delete[] m_pMessages[j]->pMessage;
557+
delete[] m_pMessages[j].pMessage->pMessage;
522558
}
523-
m_pMessages[j] = NULL;
559+
m_pMessages[j].pMessage = NULL;
524560
}
525561
}
526562
}
527563

528-
m_pMessages[i] = message;
564+
m_pMessages[i].pMessage = message;
565+
// m_pMessages[i].font = font;
529566
m_startTime[i] = time;
530567
return;
531568
}
@@ -584,9 +621,9 @@ void CHudMessage::MessageAdd(client_textmessage_t * newMessage )
584621

585622
for ( int i = 0; i < maxHUDMessages; i++ )
586623
{
587-
if ( !m_pMessages[i] )
624+
if ( !m_pMessages[i].pMessage )
588625
{
589-
m_pMessages[i] = message;
626+
m_pMessages[i].pMessage = message;
590627
m_startTime[i] = gHUD.m_flTime;
591628
return;
592629
}
@@ -598,12 +635,12 @@ void CHudMessage::MessageAdd(client_textmessage_t * newMessage )
598635
int CHudMessage::MsgFunc_HudTextPro( const char *pszName, int iSize, void *pbuf )
599636
{
600637
const char *sz;
601-
int hint;
638+
qboolean hintMessage;
602639
BufferReader reader( pszName, pbuf, iSize );
603640
sz = reader.ReadString();
604-
hint = reader.ReadByte();
641+
hintMessage = reader.ReadByte();
605642

606-
MessageAdd(sz, gHUD.m_flTime/*, hint, Newfont*/); // TODO
643+
MessageAdd(sz, gHUD.m_flTime, hintMessage/*, Newfont*/ ); // TODO
607644

608645
// Remember the time -- to fix up level transitions
609646
m_parms.time = gHUD.m_flTime;
@@ -615,19 +652,47 @@ int CHudMessage::MsgFunc_HudTextPro( const char *pszName, int iSize, void *pbuf
615652

616653
int CHudMessage::MsgFunc_HudTextArgs( const char *pszName, int iSize, void *pbuf )
617654
{
618-
/*BufferReader reader( pszName, pbuf, iSize );
655+
BufferReader reader( pszName, pbuf, iSize );
619656

620657
const char *sz = reader.ReadString();
621-
int hint = reader.ReadByte();
658+
qboolean hintMessage = reader.ReadByte();
659+
660+
MessageAdd( sz, gHUD.m_flTime, hintMessage/*, Newfont*/ ); // TODO
661+
662+
int slot = -1;
663+
for ( int i = 0; i < maxHUDMessages; i++ )
664+
{
665+
if ( m_pMessages[i].pMessage && m_startTime[i] == gHUD.m_flTime )
666+
{
667+
slot = i;
668+
break;
669+
}
670+
}
622671

623-
MessageAdd(sz, gHUD.m_flTime, hint, Newfont); // TODO
672+
if ( slot != -1 )
673+
{
674+
int argCount = reader.ReadByte();
675+
if ( argCount > 4 ) argCount = 4;
676+
if ( argCount < 0 ) argCount = 0;
677+
678+
m_pMessages[slot].arg_count = argCount;
679+
680+
for ( int i = 0; i < argCount; i++ )
681+
{
682+
const char *arg = reader.ReadString();
683+
if ( !arg ) arg = "";
684+
685+
const char *localizedArg = Localize( arg );
686+
strncpy( m_pMessages[slot].args[i], localizedArg, 128 );
687+
m_pMessages[slot].args[i][127] = 0;
688+
}
689+
}
624690

625691
// Remember the time -- to fix up level transitions
626692
m_parms.time = gHUD.m_flTime;
627693

628694
// Turn on drawing
629-
if ( !(m_iFlags & HUD_ACTIVE) )
630-
m_iFlags |= HUD_ACTIVE;*/
695+
m_iFlags |= HUD_DRAW;
631696

632697
return 1;
633698
}

0 commit comments

Comments
 (0)