From 39ed87570bdb2f86969d4be821c94b722dc71179 Mon Sep 17 00:00:00 2001 From: Joe Ludwig Date: Wed, 26 Jun 2013 15:22:04 -0700 Subject: First version of the SOurce SDK 2013 --- mp/src/game/client/text_message.cpp | 149 ++++++++++++++++++++++++++++++++++++ 1 file changed, 149 insertions(+) create mode 100644 mp/src/game/client/text_message.cpp (limited to 'mp/src/game/client/text_message.cpp') diff --git a/mp/src/game/client/text_message.cpp b/mp/src/game/client/text_message.cpp new file mode 100644 index 00000000..4363297c --- /dev/null +++ b/mp/src/game/client/text_message.cpp @@ -0,0 +1,149 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +// +//=============================================================================// +// +// text_message.cpp +// +// implementation of CHudTextMessage class +// +// this class routes messages through titles.txt for localisation +// +#include "cbase.h" +#include "text_message.h" +#include "client_textmessage.h" +#include "vgui_controls/Controls.h" +#include "vgui/ILocalize.h" + +// memdbgon must be the last include file in a .cpp file!!! +#include "tier0/memdbgon.h" + +//----------------------------------------------------------------------------- +// Purpose: Implements IHudTextMessage +//----------------------------------------------------------------------------- +class CHudTextMessage : public IHudTextMessage +{ +public: + virtual char *LocaliseTextString( const char *msg, char *dst_buffer, int buffer_size ); + virtual char *BufferedLocaliseTextString( const char *msg ); + virtual char *LookupString( const char *msg_name, int *msg_dest = NULL ); +}; + +// Singleton +static CHudTextMessage g_HudTextMessage; +IHudTextMessage *hudtextmessage = &g_HudTextMessage; + +//----------------------------------------------------------------------------- +// Purpose: Searches through the string for any msg names (indicated by a '#') +// any found are looked up in titles.txt and the new message substituted +// the new value is pushed into dst_buffer +// Input : *msg - +// *dst_buffer - +// buffer_size - +// Output : char +//----------------------------------------------------------------------------- +char *CHudTextMessage::LocaliseTextString( const char *msg, char *dst_buffer, int buffer_size ) +{ + char *dst = dst_buffer; + for ( char *src = (char*)msg; *src != 0 && buffer_size > 0; buffer_size-- ) + { + if ( *src == '#' ) + { + // cut msg name out of string + static char word_buf[255]; + char *wdst = word_buf, *word_start = src; + for ( ++src ; *src >= 'A' && *src <= 'z'; wdst++, src++ ) + { + *wdst = *src; + } + *wdst = 0; + + // lookup msg name in titles.txt + client_textmessage_t *clmsg = TextMessageGet( word_buf ); + if ( !clmsg || !(clmsg->pMessage) ) + { + src = word_start; + *dst = *src; + dst++, src++; + continue; + } + + // Does titles.txt want to lookup into cstrike_.txt? + wchar_t *pLocalizedStr; + if ( clmsg->pMessage[0] == '#' && ((pLocalizedStr = g_pVGuiLocalize->Find( clmsg->pMessage )) != NULL ) ) + { + g_pVGuiLocalize->ConvertUnicodeToANSI( pLocalizedStr, dst, buffer_size ); + } + else + { + // copy string into message over the msg name + for ( char *wsrc = (char*)clmsg->pMessage; *wsrc != 0; wsrc++, dst++ ) + { + *dst = *wsrc; + } + *dst = 0; + } + } + else + { + *dst = *src; + dst++, src++; + *dst = 0; + } + } + + // +// ensure null termination + dst_buffer[buffer_size-1] = 0; + return dst_buffer; +} + +//----------------------------------------------------------------------------- +// Purpose: As above, but with a local static buffer +// Input : *msg - +// Output : char +//----------------------------------------------------------------------------- +char *CHudTextMessage::BufferedLocaliseTextString( const char *msg ) +{ + static char dst_buffer[1024]; + return LocaliseTextString( msg, dst_buffer, 1024 ); +} + +//----------------------------------------------------------------------------- +// Purpose: Simplified version of LocaliseTextString; assumes string is only one word +// Input : *msg - +// *msg_dest - +// Output : char +//----------------------------------------------------------------------------- +char *CHudTextMessage::LookupString( const char *msg, int *msg_dest ) +{ + if ( !msg ) + return ""; + + // '#' character indicates this is a reference to a string in titles.txt, and not the string itself + if ( msg[0] == '#' ) + { + // this is a message name, so look up the real message + client_textmessage_t *clmsg = TextMessageGet( msg+1 ); + + if ( !clmsg || !(clmsg->pMessage) ) + return (char*)msg; // lookup failed, so return the original string + + if ( msg_dest ) + { + // check to see if titles.txt info overrides msg destination + // if clmsg->effect is less than 0, then clmsg->effect holds -1 * message_destination + if ( clmsg->effect < 0 ) // + *msg_dest = -clmsg->effect; + } + + return (char*)clmsg->pMessage; + } + else + { // nothing special about this message, so just return the same string + return (char*)msg; + } +} \ No newline at end of file -- cgit v1.2.3