diff options
Diffstat (limited to 'source')
56 files changed, 1384 insertions, 1282 deletions
diff --git a/source/cl_aastat.c b/source/cl_aastat.c new file mode 100644 index 0000000..f864a97 --- /dev/null +++ b/source/cl_aastat.c @@ -0,0 +1,360 @@ +/* +Copyright (C) 1997-2001 Id Software, Inc. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#include "cl_local.h" + +/* +=============================================================================== + +STAT PROGRAMS TO TEXT + +=============================================================================== +*/ + +#define TH_WIDTH 80 +#define TH_HEIGHT 40 + +static void TH_DrawString( char *dst, int x, int y, char *src, size_t len ) { + int c; + + if( x + len > TH_WIDTH ) { + len = TH_WIDTH - x; + } + + dst += y * ( TH_WIDTH + 1 ) + x; + while( len-- ) { + c = *src++; + c &= 127; + switch( c ) { + case 13: c = '>'; break; + case 16: c = '['; break; + case 17: c = ']'; break; + case 29: c = '<'; break; + case 30: c = '='; break; + case 31: c = '>'; break; + default: + if( c < 32 ) { + c = 32; + } + break; + } + *dst++ = c; + } +} + +static void TH_DrawCenterString( char *dst, int x, int y, char *src, size_t len ) { + x -= len / 2; + if( x < 0 ) { + src -= x; + x = 0; + } + + TH_DrawString( dst, x, y, src, len ); +} + +static void TH_DrawNumber( char *dst, int x, int y, int width, int value ) { + char num[16]; + int l; + + if( width < 1 ) + return; + + // draw number string + if( width > 5 ) + width = 5; + + l = Com_sprintf( num, sizeof( num ), "%d", value ); + if( l > width ) + l = width; + x += width - l; + + TH_DrawString( dst, x, y, num, l ); +} + +static void TH_DrawLayoutString( char *dst, const char *s ) { + char buffer[MAX_QPATH]; + int x, y; + int value; + char *token; + size_t len; + int width, index; + clientinfo_t *ci; + + if( !s[0] ) + return; + + x = 0; + y = 0; + width = 3; + + while( s ) { + token = COM_Parse( &s ); + if( token[2] == 0 ) { + if( token[0] == 'x' ) { + if( token[1] == 'l' ) { + token = COM_Parse( &s ); + x = atoi( token ) / 8; + continue; + } + + if( token[1] == 'r' ) { + token = COM_Parse( &s ); + x = TH_WIDTH + atoi( token ) / 8; + continue; + } + + if( token[1] == 'v' ) { + token = COM_Parse( &s ); + x = TH_WIDTH / 2 - 20 + atoi( token ) / 8; + continue; + } + } + + if( token[0] == 'y' ) { + if( token[1] == 't' ) { + token = COM_Parse( &s ); + y = atoi( token ) / 8; + continue; + } + + if( token[1] == 'b' ) { + token = COM_Parse( &s ); + y = TH_HEIGHT + atoi( token ) / 8; + continue; + } + + if( token[1] == 'v' ) { + token = COM_Parse( &s ); + y = TH_HEIGHT / 2 - 15 + atoi( token ) / 8; + continue; + } + } + } + + if( !strcmp( token, "pic" ) ) { + // draw a pic from a stat number + COM_Parse( &s ); + continue; + } + + if( !strcmp( token, "client" ) ) { + // draw a deathmatch client block + int score, ping, time; + + token = COM_Parse( &s ); + x = TH_WIDTH / 2 - 20 + atoi( token ) / 8; + token = COM_Parse( &s ); + y = TH_HEIGHT / 2 - 15 + atoi( token ) / 8; + + token = COM_Parse( &s ); + value = atoi( token ); + if( value < 0 || value >= MAX_CLIENTS ) { + Com_Error( ERR_DROP, "%s: invalid client index", __func__ ); + } + ci = &cl.clientinfo[value]; + + token = COM_Parse( &s ); + score = atoi( token ); + + token = COM_Parse( &s ); + ping = atoi( token ); + + token = COM_Parse( &s ); + time = atoi( token ); + + len = strlen( ci->name ); + TH_DrawString( dst, x + 4, y, ci->name, len ); + len = Com_sprintf( buffer, sizeof( buffer ), "Score: %i", score ); + TH_DrawString( dst, x + 4, y + 1, buffer, len ); + len = Com_sprintf( buffer, sizeof( buffer ), "Ping: %i", ping ); + TH_DrawString( dst, x + 4, y + 2, buffer, len ); + len = Com_sprintf( buffer, sizeof( buffer ), "Time: %i", time ); + TH_DrawString( dst, x + 4, y + 3, buffer, len ); + continue; + } + + if( !strcmp( token, "ctf" ) ) { + // draw a ctf client block + int score, ping; + + token = COM_Parse( &s ); + x = TH_WIDTH / 2 - 20 + atoi( token ) / 8; + token = COM_Parse( &s ); + y = TH_HEIGHT / 2 - 15 + atoi( token ) / 8; + + token = COM_Parse( &s ); + value = atoi( token ); + if( value < 0 || value >= MAX_CLIENTS ) { + Com_Error( ERR_DROP, "%s: invalid client index", __func__ ); + } + ci = &cl.clientinfo[value]; + + token = COM_Parse( &s ); + score = atoi( token ); + + token = COM_Parse( &s ); + ping = atoi( token ); + if( ping > 999 ) + ping = 999; + + len = Com_sprintf( buffer, sizeof( buffer ), "%3d %3d %-12.12s", + score, ping, ci->name ); + TH_DrawString( dst, x, y, buffer, len ); + continue; + } + + if( !strcmp( token, "picn" ) ) { + // draw a pic from a name + COM_Parse( &s ); + continue; + } + + if( !strcmp( token, "num" ) ) { + // draw a number + token = COM_Parse( &s ); + width = atoi( token ); + token = COM_Parse( &s ); + value = atoi( token ); + if( value < 0 || value >= MAX_STATS ) { + Com_Error( ERR_DROP, "%s: invalid stat index", __func__ ); + } + value = cl.frame.ps.stats[value]; + TH_DrawNumber( dst, x, y, width, value ); + continue; + } + + if( !strcmp( token, "stat_string" ) ) { + token = COM_Parse( &s ); + index = atoi( token ); + if( index < 0 || index >= MAX_STATS ) { + Com_Error( ERR_DROP, "%s: invalid string index", __func__ ); + } + index = cl.frame.ps.stats[index]; + if( index < 0 || index >= MAX_CONFIGSTRINGS ) { + Com_Error( ERR_DROP, "%s: invalid string index", __func__ ); + } + len = strlen( cl.configstrings[index] ); + TH_DrawString( dst, x, y, cl.configstrings[index], len ); + continue; + } + + if( !strncmp( token, "cstring", 7 ) ) { + token = COM_Parse( &s ); + len = strlen( token ); + TH_DrawCenterString( dst, x + 40 / 2, y, token, len ); + continue; + } + + if( !strncmp( token, "string", 6 ) ) { + token = COM_Parse( &s ); + len = strlen( token ); + TH_DrawString( dst, x, y, token, len ); + continue; + } + + if( !strcmp( token, "if" ) ) { + token = COM_Parse( &s ); + value = atoi( token ); + if( value < 0 || value >= MAX_STATS ) { + Com_Error( ERR_DROP, "%s: invalid stat index", __func__ ); + } + value = cl.frame.ps.stats[value]; + if( !value ) { // skip to endif + while( strcmp( token, "endif" ) ) { + token = COM_Parse( &s ); + if( !s ) { + break; + } + } + } + continue; + } + } +} + +static void SCR_ScoreShot_f( void ) { + char buffer[( TH_WIDTH + 1 ) * TH_HEIGHT]; + char path[MAX_QPATH]; + fileHandle_t f; + int i; + + if( cls.state != ca_active ) { + Com_Printf( "Must be in a level.\n" ); + return; + } + + if( Cmd_Argc() > 1 ) { + Q_concat( path, sizeof( path ), SCORESHOTS_DIRECTORY "/", Cmd_Argv( 1 ), NULL ); + COM_AppendExtension( path, ".txt", sizeof( path ) ); + } else { + for( i = 0; i < 1000; i++ ) { + Com_sprintf( path, sizeof( path ), SCORESHOTS_DIRECTORY "/quake%03d.txt", i ); + if( FS_LoadFileEx( path, NULL, FS_PATH_GAME, TAG_FREE ) == INVALID_LENGTH ) { + break; // file doesn't exist + } + } + + if( i == 1000 ) { + Com_Printf( "All scoreshot slots are full.\n" ); + return; + } + } + + FS_FOpenFile( path, &f, FS_MODE_WRITE ); + if( !f ) { + Com_EPrintf( "Couldn't open %s for writing.\n", path ); + return; + } + + memset( buffer, ' ', sizeof( buffer ) ); + for( i = 0; i < TH_HEIGHT; i++ ) { + buffer[ i * ( TH_WIDTH + 1 ) + TH_WIDTH ] = '\n'; + } + + TH_DrawLayoutString( buffer, cl.configstrings[CS_STATUSBAR] ); + TH_DrawLayoutString( buffer, cl.layout ); + + FS_Write( buffer, sizeof( buffer ), f ); + + FS_FCloseFile( f ); + + Com_Printf( "Wrote %s.\n", path ); +} + +static void SCR_ScoreDump_f( void ) { + char buffer[( TH_WIDTH + 1 ) * TH_HEIGHT]; + int i; + + memset( buffer, ' ', sizeof( buffer ) ); + for( i = 0; i < TH_HEIGHT; i++ ) { + buffer[ i * ( TH_WIDTH + 1 ) + TH_WIDTH ] = '\n'; + } + + TH_DrawLayoutString( buffer, cl.configstrings[CS_STATUSBAR] ); + TH_DrawLayoutString( buffer, cl.layout ); + + Com_Printf( "%s", buffer ); +} + +void CL_InitAscii( void ) { + Cmd_AddCommand( "aashot", SCR_ScoreShot_f ); + Cmd_AddCommand( "aadump", SCR_ScoreDump_f ); +} + diff --git a/source/cl_console.c b/source/cl_console.c index aed69d4..a7833d1 100644 --- a/source/cl_console.c +++ b/source/cl_console.c @@ -58,7 +58,7 @@ typedef struct console_s { // for transparent notify lines qboolean skipNotify; - qhandle_t conbackImage; + qhandle_t backImage; qhandle_t charsetImage; float currentHeight; // aproaches scr_conlines at scr_conspeed @@ -107,7 +107,7 @@ Con_ClearTyping void Con_ClearTyping( void ) { // clear any typing IF_Clear( &con.prompt.inputLine ); - con.prompt.tooMany = qfalse; + Prompt_ClearState( &con.prompt ); } /* @@ -361,7 +361,7 @@ static void Con_CheckTop( void ) { static void con_param_changed( cvar_t *self ) { if( con.initialized && cls.ref_initialized ) { - Con_SetupDC(); + Con_RegisterMedia(); } } @@ -576,21 +576,24 @@ void Con_Printf( const char *fmt, ... ) { /* ================ -Con_SetupDC +Con_RegisterMedia ================ */ -void Con_SetupDC( void ) { - if( !( con.charsetImage = ref.RegisterFont( con_font->string ) ) ) { - /* fall back to default */ - Com_WPrintf( "Couldn't load %s, falling back to default...\n", con_font->string ); +void Con_RegisterMedia( void ) { + con.charsetImage = ref.RegisterFont( con_font->string ); + if( !con.charsetImage && strcmp( con_font->string, "conchars" ) ) { + Com_WPrintf( "Couldn't load console font: %s\n", con_font->string ); con.charsetImage = ref.RegisterFont( "conchars" ); } if( !con.charsetImage ) { Com_Error( ERR_FATAL, "Couldn't load pics/conchars.pcx" ); } - con.conbackImage = ref.RegisterPic( con_background->string ); - + con.backImage = ref.RegisterPic( con_background->string ); + if( !con.backImage && strcmp( con_background->string, "conback" ) ) { + Com_WPrintf( "Couldn't load console background: %s\n", con_background->string ); + con.backImage = ref.RegisterFont( "conback" ); + } } /* @@ -722,10 +725,9 @@ void Con_DrawSolidConsole( void ) { // draw the background if( cls.state != ca_active || ( cls.key_dest & KEY_MENU ) || con_alpha->value ) { ref.DrawStretchPic( 0, vislines - con.vidHeight, - con.vidWidth, con.vidHeight, con.conbackImage ); + con.vidWidth, con.vidHeight, con.backImage ); } - // draw the text y = vislines - CON_PRESTEP; rows = y / CHAR_HEIGHT + 1; // rows of text to draw @@ -1085,7 +1087,9 @@ void Key_Console( int key ) { return; } - IF_KeyEvent( &con.prompt.inputLine, key ); + if( IF_KeyEvent( &con.prompt.inputLine, key ) ) { + Prompt_ClearState( &con.prompt ); + } scroll: if( con_scroll->integer & 1 ) { @@ -1124,6 +1128,16 @@ void Key_Message( int key ) { return; } + if( key == 'r' && Key_IsDown( K_CTRL ) ) { + Prompt_CompleteHistory( &con.chatPrompt, qfalse ); + return; + } + + if( key == 's' && Key_IsDown( K_CTRL ) ) { + Prompt_CompleteHistory( &con.chatPrompt, qtrue ); + return; + } + if( key == K_UPARROW || ( key == 'p' && Key_IsDown( K_CTRL ) ) ) { Prompt_HistoryUp( &con.chatPrompt ); return; @@ -1134,7 +1148,9 @@ void Key_Message( int key ) { return; } - IF_KeyEvent( &con.chatPrompt.inputLine, key ); + if( IF_KeyEvent( &con.chatPrompt.inputLine, key ) ) { + Prompt_ClearState( &con.chatPrompt ); + } } void Char_Message( int key ) { diff --git a/source/cl_draw.c b/source/cl_draw.c index eed8b0a..338fb9b 100644 --- a/source/cl_draw.c +++ b/source/cl_draw.c @@ -61,324 +61,6 @@ void SCR_LoadingString( const char *string ) { /* =============================================================================== -STAT PROGRAMS TO TEXT - -=============================================================================== -*/ - -#define TH_WIDTH 80 -#define TH_HEIGHT 40 - -static void TH_DrawString( char *dst, int x, int y, char *src, size_t len ) { - int c; - - if( x + len > TH_WIDTH ) { - len = TH_WIDTH - x; - } - - dst += y * ( TH_WIDTH + 1 ) + x; - while( len-- ) { - c = *src++; - c &= 127; - switch( c ) { - case 16: c = '['; break; - case 17: c = ']'; break; - case 29: c = '<'; break; - case 30: c = '='; break; - case 31: c = '>'; break; - default: - if( c < 32 ) { - c = 32; - } - break; - } - *dst++ = c; - } -} - -static void TH_DrawCenterString( char *dst, int x, int y, char *src, size_t len ) { - x -= len / 2; - if( x < 0 ) { - src -= x; - x = 0; - } - - TH_DrawString( dst, x, y, src, len ); -} - -static void TH_DrawNumber( char *dst, int x, int y, int width, int value ) { - char num[16]; - int l; - - if( width < 1 ) - return; - - // draw number string - if( width > 5 ) - width = 5; - - l = Com_sprintf( num, sizeof( num ), "%d", value ); - if( l > width ) - l = width; - x += width - l; - - TH_DrawString( dst, x, y, num, l ); -} - -static void TH_DrawLayoutString( char *dst, const char *s ) { - char buffer[MAX_QPATH]; - int x, y; - int value; - char *token; - size_t len; - int width, index; - clientinfo_t *ci; - - if( !s[0] ) - return; - - x = 0; - y = 0; - width = 3; - - while( s ) { - token = COM_Parse( &s ); - if( token[2] == 0 ) { - if( token[0] == 'x' ) { - if( token[1] == 'l' ) { - token = COM_Parse( &s ); - x = atoi( token ) / 8; - continue; - } - - if( token[1] == 'r' ) { - token = COM_Parse( &s ); - x = TH_WIDTH + atoi( token ) / 8; - continue; - } - - if( token[1] == 'v' ) { - token = COM_Parse( &s ); - x = TH_WIDTH / 2 - 20 + atoi( token ) / 8; - continue; - } - } - - if( token[0] == 'y' ) { - if( token[1] == 't' ) { - token = COM_Parse( &s ); - y = atoi( token ) / 8; - continue; - } - - if( token[1] == 'b' ) { - token = COM_Parse( &s ); - y = TH_HEIGHT + atoi( token ) / 8; - continue; - } - - if( token[1] == 'v' ) { - token = COM_Parse( &s ); - y = TH_HEIGHT / 2 - 15 + atoi( token ) / 8; - continue; - } - } - } - - if( !strcmp( token, "pic" ) ) { - // draw a pic from a stat number - COM_Parse( &s ); - continue; - } - - if( !strcmp( token, "client" ) ) { - // draw a deathmatch client block - int score, ping, time; - - token = COM_Parse( &s ); - x = TH_WIDTH / 2 - 20 + atoi( token ) / 8; - token = COM_Parse( &s ); - y = TH_HEIGHT / 2 - 15 + atoi( token ) / 8; - - token = COM_Parse( &s ); - value = atoi( token ); - if( value < 0 || value >= MAX_CLIENTS ) { - Com_Error( ERR_DROP, "%s: invalid client index", __func__ ); - } - ci = &cl.clientinfo[value]; - - token = COM_Parse( &s ); - score = atoi( token ); - - token = COM_Parse( &s ); - ping = atoi( token ); - - token = COM_Parse( &s ); - time = atoi( token ); - - len = strlen( ci->name ); - TH_DrawString( dst, x + 4, y, ci->name, len ); - len = Com_sprintf( buffer, sizeof( buffer ), "Score: %i", score ); - TH_DrawString( dst, x + 4, y + 1, buffer, len ); - len = Com_sprintf( buffer, sizeof( buffer ), "Ping: %i", ping ); - TH_DrawString( dst, x + 4, y + 2, buffer, len ); - len = Com_sprintf( buffer, sizeof( buffer ), "Time: %i", time ); - TH_DrawString( dst, x + 4, y + 3, buffer, len ); - continue; - } - - if( !strcmp( token, "ctf" ) ) { - // draw a ctf client block - int score, ping; - - token = COM_Parse( &s ); - x = TH_WIDTH / 2 - 20 + atoi( token ) / 8; - token = COM_Parse( &s ); - y = TH_HEIGHT / 2 - 15 + atoi( token ) / 8; - - token = COM_Parse( &s ); - value = atoi( token ); - if( value < 0 || value >= MAX_CLIENTS ) { - Com_Error( ERR_DROP, "%s: invalid client index", __func__ ); - } - ci = &cl.clientinfo[value]; - - token = COM_Parse( &s ); - score = atoi( token ); - - token = COM_Parse( &s ); - ping = atoi( token ); - if( ping > 999 ) - ping = 999; - - len = Com_sprintf( buffer, sizeof( buffer ), "%3d %3d %-12.12s", - score, ping, ci->name ); - TH_DrawString( dst, x, y, buffer, len ); - continue; - } - - if( !strcmp( token, "picn" ) ) { - // draw a pic from a name - COM_Parse( &s ); - continue; - } - - if( !strcmp( token, "num" ) ) { - // draw a number - token = COM_Parse( &s ); - width = atoi( token ); - token = COM_Parse( &s ); - value = atoi( token ); - if( value < 0 || value >= MAX_STATS ) { - Com_Error( ERR_DROP, "%s: invalid stat index", __func__ ); - } - value = cl.frame.ps.stats[value]; - TH_DrawNumber( dst, x, y, width, value ); - continue; - } - - if( !strcmp( token, "stat_string" ) ) { - token = COM_Parse( &s ); - index = atoi( token ); - if( index < 0 || index >= MAX_STATS ) { - Com_Error( ERR_DROP, "%s: invalid string index", __func__ ); - } - index = cl.frame.ps.stats[index]; - if( index < 0 || index >= MAX_CONFIGSTRINGS ) { - Com_Error( ERR_DROP, "%s: invalid string index", __func__ ); - } - len = strlen( cl.configstrings[index] ); - TH_DrawString( dst, x, y, cl.configstrings[index], len ); - continue; - } - - if( !strncmp( token, "cstring", 7 ) ) { - token = COM_Parse( &s ); - len = strlen( token ); - TH_DrawCenterString( dst, x + 40 / 2, y, token, len ); - continue; - } - - if( !strncmp( token, "string", 6 ) ) { - token = COM_Parse( &s ); - len = strlen( token ); - TH_DrawString( dst, x, y, token, len ); - continue; - } - - if( !strcmp( token, "if" ) ) { - token = COM_Parse( &s ); - value = atoi( token ); - if( value < 0 || value >= MAX_STATS ) { - Com_Error( ERR_DROP, "%s: invalid stat index", __func__ ); - } - value = cl.frame.ps.stats[value]; - if( !value ) { // skip to endif - while( strcmp( token, "endif" ) ) { - token = COM_Parse( &s ); - if( !s ) { - break; - } - } - } - continue; - } - } -} - -static void SCR_ScoreShot_f( void ) { - char buffer[( TH_WIDTH + 1 ) * TH_HEIGHT]; - char path[MAX_QPATH]; - fileHandle_t f; - int i; - - if( cls.state != ca_active ) { - Com_Printf( "Must be in a level.\n" ); - return; - } - - if( Cmd_Argc() > 1 ) { - Q_concat( path, sizeof( path ), SCORESHOTS_DIRECTORY "/", Cmd_Argv( 1 ), NULL ); - COM_AppendExtension( path, ".txt", sizeof( path ) ); - } else { - for( i = 0; i < 1000; i++ ) { - Com_sprintf( path, sizeof( path ), SCORESHOTS_DIRECTORY "/quake%03d.txt", i ); - if( FS_LoadFileEx( path, NULL, FS_PATH_GAME ) == INVALID_LENGTH ) { - break; // file doesn't exist - } - } - - if( i == 1000 ) { - Com_Printf( "All scoreshot slots are full.\n" ); - return; - } - } - - FS_FOpenFile( path, &f, FS_MODE_WRITE ); - if( !f ) { - Com_EPrintf( "Couldn't open %s for writing.\n", path ); - return; - } - - memset( buffer, ' ', sizeof( buffer ) ); - for( i = 0; i < TH_HEIGHT; i++ ) { - buffer[ i * ( TH_WIDTH + 1 ) + TH_WIDTH ] = '\n'; - } - - TH_DrawLayoutString( buffer, cl.configstrings[CS_STATUSBAR] ); - TH_DrawLayoutString( buffer, cl.layout ); - - FS_Write( buffer, sizeof( buffer ), f ); - - FS_FCloseFile( f ); - - Com_Printf( "Wrote %s.\n", path ); -} - - -/* -=============================================================================== - LAGOMETER =============================================================================== @@ -467,16 +149,13 @@ DRAW OBJECTS typedef struct { list_t entry; int x, y; - //int type; - //union { - cvar_t *cvar; - cmd_macro_t *macro; - // int stat; - //}; - unsigned color; + cvar_t *cvar; + cmd_macro_t *macro; + int flags; + color_t color; } drawobj_t; -static list_t scr_objects; +static LIST_DECL( scr_objects ); static void SCR_Color_g( genctx_t *ctx ) { int color; @@ -504,7 +183,8 @@ static void SCR_Draw_f( void ) { drawobj_t *obj; cmd_macro_t *macro; // int stat; - int color = COLOR_RESET; + color_t color = { 0, 0, 0, 0 }; + int flags = UI_IGNORECOLOR; int argc = Cmd_Argc(); if( argc == 1 ) { @@ -528,46 +208,37 @@ static void SCR_Draw_f( void ) { s = Cmd_Argv( 1 ); x = atoi( Cmd_Argv( 2 ) ); + if( x < 0 ) { + flags |= UI_RIGHT; + } y = atoi( Cmd_Argv( 3 ) ); if( argc > 4 ) { c = Cmd_Argv( 4 ); - for( color = 0; color < 10; color++ ) { - if( !strcmp( colorNames[color], c ) ) { - break; + if( !strcmp( c, "alt" ) ) { + flags |= UI_ALTCOLOR; + } else { + if( !COM_ParseColor( c, color ) ) { + Com_Printf( "Unknown color '%s'\n", c ); + return; } - } - if( color == 10 ) { - Com_Printf( "Unknown color '%s'\n", c ); - return; + flags &= ~UI_IGNORECOLOR; } } obj = Z_Malloc( sizeof( *obj ) ); obj->x = x; obj->y = y; - obj->color = color; + obj->flags = flags; + *( uint32_t * )obj->color = *( uint32_t * )color; -#if 0 - if( *s == '!' || *s == '#' ) { - stat = atoi( s + 1 ); - if( stat < 0 || stat >= MAX_STATS ) { - Com_Printf( "Invalid stat index: %d\n", stat ); - } - obj->stat = stat; + macro = Cmd_FindMacro( s ); + if( macro ) { obj->cvar = NULL; + obj->macro = macro; + } else { + obj->cvar = Cvar_Get( s, NULL, CVAR_USER_CREATED ); obj->macro = NULL; - } else -#endif - { - macro = Cmd_FindMacro( s ); - if( macro ) { - obj->cvar = NULL; - obj->macro = macro; - } else { - obj->cvar = Cvar_Get( s, NULL, CVAR_USER_CREATED ); - obj->macro = NULL; - } } List_Append( &scr_objects, &obj->entry ); @@ -646,30 +317,26 @@ static void SCR_UnDraw_f( void ) { static void draw_objects( void ) { char buffer[MAX_QPATH]; - int x, y, flags; + int x, y; drawobj_t *obj; LIST_FOR_EACH( drawobj_t, obj, &scr_objects, entry ) { x = obj->x; y = obj->y; - flags = 0; if( x < 0 ) { x += scr_hudWidth + 1; - flags |= UI_RIGHT; } if( y < 0 ) { y += scr_hudHeight - CHAR_HEIGHT + 1; } - if( obj->color == 8 ) { - flags |= UI_ALTCOLOR; - } else if( obj->color < 8 ) { - ref.SetColor( DRAW_COLOR_RGB, colorTable[obj->color] ); + if( !( obj->flags & UI_IGNORECOLOR ) ) { + ref.SetColor( DRAW_COLOR_RGBA, obj->color ); } if( obj->macro ) { obj->macro->function( buffer, sizeof( buffer ) ); - SCR_DrawString( x, y, flags, buffer ); + SCR_DrawString( x, y, obj->flags, buffer ); } else { - SCR_DrawString( x, y, flags, obj->cvar->string ); + SCR_DrawString( x, y, obj->flags, obj->cvar->string ); } ref.SetColor( DRAW_COLOR_CLEAR, NULL ); } @@ -970,13 +637,12 @@ void SCR_Draw2D( void ) { } } -cmdreg_t scr_drawcmds[] = { +static const cmdreg_t scr_drawcmds[] = { #if USE_CHATHUD { "clearchat", SCR_ClearChatHUD_f }, #endif { "draw", SCR_Draw_f, SCR_Draw_c }, { "undraw", SCR_UnDraw_f, SCR_UnDraw_c }, - { "scoreshot", SCR_ScoreShot_f }, { NULL } }; @@ -986,8 +652,6 @@ SCR_InitDraw ================ */ void SCR_InitDraw( void ) { - List_Init( &scr_objects ); - scr_draw2d = Cvar_Get( "scr_draw2d", "2", 0 ); scr_showturtle = Cvar_Get( "scr_showturtle", "1", 0 ); scr_showfollowing = Cvar_Get( "scr_showfollowing", "1", 0 ); @@ -1001,3 +665,8 @@ void SCR_InitDraw( void ) { Cmd_Register( scr_drawcmds ); } +void SCR_ShutdownDraw( void ) { + Cmd_Deregister( scr_drawcmds ); +} + + diff --git a/source/cl_fx.c b/source/cl_fx.c index f959ff9..5336ba2 100644 --- a/source/cl_fx.c +++ b/source/cl_fx.c @@ -1682,27 +1682,35 @@ void CL_OldRailTrail (vec3_t start, vec3_t end) } } +static color_t railcore_color; +static color_t railspiral_color; -void CL_RailTrail( vec3_t start, vec3_t end ) { - vec3_t move; - vec3_t vec; - float len; - int j; - cparticle_t *p; -// float dec; - vec3_t right, up; - int i; - float d, c, s; - vec3_t dir; - laser_t *l; - color_t color; +static cvar_t *cl_railtrail_type; +static cvar_t *cl_railtrail_time; +static cvar_t *cl_railcore_color; +static cvar_t *cl_railcore_width; +static cvar_t *cl_railspiral_color; +static cvar_t *cl_railspiral_radius; - if( !cl_railtrail_type->integer || scr_glconfig.renderer == GL_RENDERER_SOFTWARE ) { - CL_OldRailTrail( start, end ); - return; - } - if( !( l = CL_AllocLaser() ) ) { +static void cl_railcore_color_changed( cvar_t *self ) { + if( !COM_ParseColor( self->string, railcore_color ) ) { + Com_WPrintf( "Invalid value '%s' for '%s'\n", self->string, self->name ); + *( uint32_t *)railcore_color = *( uint32_t * )colorRed; + } +} + +static void cl_railspiral_color_changed( cvar_t *self ) { + if( !COM_ParseColor( self->string, railspiral_color ) ) { + Com_WPrintf( "Invalid value '%s' for '%s'\n", self->string, self->name ); + *( uint32_t *)railspiral_color = *( uint32_t * )colorBlue; + } +} + +static void CL_NewRailCore( vec3_t start, vec3_t end ) { + laser_t *l = CL_AllocLaser(); + + if( !l ) { return; } @@ -1712,58 +1720,68 @@ void CL_RailTrail( vec3_t start, vec3_t end ) { l->lifeTime = 1000 * cl_railtrail_time->value; l->indexed = qfalse; l->width = cl_railcore_width->value; + *( uint32_t * )l->color = *( uint32_t * )railcore_color; +} - l->color[0] = ( cl_railcore_color->integer >> 16 ) & 0xff; - l->color[1] = ( cl_railcore_color->integer >> 8 ) & 0xff; - l->color[2] = ( cl_railcore_color->integer ) & 0xff; - l->color[3] = 255 * cl_railtrail_alpha->value; - - color[0] = ( cl_railspiral_color->integer >> 16 ) & 0xff; - color[1] = ( cl_railspiral_color->integer >> 8 ) & 0xff; - color[2] = ( cl_railspiral_color->integer ) & 0xff; - color[3] = 255; - - VectorCopy( start, move ); - VectorSubtract( end, start, vec ); - len = VectorNormalize( vec ); - - MakeNormalVectors( vec, right, up ); - - if( cl_railtrail_type->integer > 1 ) { - for( i=0 ; i<len ; i++ ) { - if( !free_particles ) - return; - - p = free_particles; - free_particles = p->next; - p->next = active_particles; - active_particles = p; - - p->time = cl.time; - VectorClear( p->accel ); - - d = i * 0.1; - c = cos( d ); - s = sin( d ); - - VectorScale( right, c, dir ); - VectorMA( dir, s, up, dir ); - - p->alpha = cl_railtrail_alpha->value; - p->alphavel = -1.0 / ( cl_railtrail_time->value + frand() * 0.2 ); - p->color = 0xff; - *( uint32_t * )p->rgb = *( uint32_t * )color; - for( j=0 ; j<3 ; j++ ) { - p->org[j] = move[j] + dir[j] * cl_railspiral_radius->value; - p->vel[j] = dir[j] * 6; - } +static void CL_NewRailSpiral( vec3_t start, vec3_t end ) { + vec3_t move; + vec3_t vec; + float len; + int j; + cparticle_t *p; +// float dec; + vec3_t right, up; + int i; + float d, c, s; + vec3_t dir; - VectorAdd( move, vec, move ); - } - } - + VectorCopy( start, move ); + VectorSubtract( end, start, vec ); + len = VectorNormalize( vec ); + + MakeNormalVectors( vec, right, up ); + + for( i=0 ; i<len ; i++ ) { + if( !free_particles ) + return; + + p = free_particles; + free_particles = p->next; + p->next = active_particles; + active_particles = p; + + p->time = cl.time; + VectorClear( p->accel ); + + d = i * 0.1; + c = cos( d ); + s = sin( d ); + + VectorScale( right, c, dir ); + VectorMA( dir, s, up, dir ); + + p->alpha = railspiral_color[3] / 255.0f; + p->alphavel = -1.0 / ( cl_railtrail_time->value + frand() * 0.2 ); + p->color = 0xff; + *( uint32_t * )p->rgb = *( uint32_t * )railspiral_color; + for( j=0 ; j<3 ; j++ ) { + p->org[j] = move[j] + dir[j] * cl_railspiral_radius->value; + p->vel[j] = dir[j] * 6; + } + + VectorAdd( move, vec, move ); + } +} - +void CL_RailTrail( vec3_t start, vec3_t end ) { + if( !cl_railtrail_type->integer || scr_glconfig.renderer == GL_RENDERER_SOFTWARE ) { + CL_OldRailTrail( start, end ); + } else { + CL_NewRailCore( start, end ); + if( cl_railtrail_type->integer > 1 ) { + CL_NewRailSpiral( start, end ); + } + } } @@ -2385,3 +2403,19 @@ void CL_ClearEffects (void) CL_ClearDlights (); CL_ClearLightStyles (); } + +void CL_InitEffects( void ) { + cl_railtrail_type = Cvar_Get( "cl_railtrail_type", "0", 0 ); + cl_railtrail_time = Cvar_Get( "cl_railtrail_time", "1.0", 0 ); + cl_railcore_color = Cvar_Get( "cl_railcore_color", "red", 0 ); + cl_railcore_color->changed = cl_railcore_color_changed; + cl_railcore_color->generator = Com_Color_g; + cl_railcore_color_changed( cl_railcore_color ); + cl_railcore_width = Cvar_Get( "cl_railcore_width", "2", 0 ); + cl_railspiral_color = Cvar_Get( "cl_railspiral_color", "blue", 0 ); + cl_railspiral_color->changed = cl_railspiral_color_changed; + cl_railspiral_color->generator = Com_Color_g; + cl_railspiral_color_changed( cl_railspiral_color ); + cl_railspiral_radius = Cvar_Get( "cl_railspiral_radius", "3", 0 ); +} + diff --git a/source/cl_input.c b/source/cl_input.c index bfbd8e8..77184f6 100644 --- a/source/cl_input.c +++ b/source/cl_input.c @@ -68,23 +68,23 @@ typedef struct inputDriver_s { void (*FillAPI)( inputAPI_t *api ); } inputDriver_t; -#ifdef USE_DINPUT +#if USE_DINPUT void DI_FillAPI( inputAPI_t *api ); #endif -#ifdef USE_EVDEV +#if USE_EVDEV void Evdev_FillAPI( inputAPI_t *api ); #endif static inputDriver_t in_driverTable[] = { - /* fallback driver should be present on all systems */ + // fallback driver should be present on all systems { "video", Video_FillInputAPI }, /* DirectInput driver */ -#ifdef USE_DINPUT +#if USE_DINPUT { "dinput", DI_FillAPI }, #endif -#ifdef USE_EVDEV +#if USE_EVDEV { "evdev", Evdev_FillAPI }, #endif }; diff --git a/source/cl_keys.c b/source/cl_keys.c index 166146b..4539bb6 100644 --- a/source/cl_keys.c +++ b/source/cl_keys.c @@ -56,7 +56,7 @@ typedef struct keyname_s { int keynum; } keyname_t; -static keyname_t keynames[] = { +static const keyname_t keynames[] = { {"TAB", K_TAB}, {"ENTER", K_ENTER}, {"ESCAPE", K_ESCAPE}, @@ -273,7 +273,7 @@ the K_* names are matched up. =================== */ int Key_StringToKeynum( const char *str ) { - keyname_t *kn; + const keyname_t *kn; if( !str || !str[0] ) return -1; @@ -297,8 +297,8 @@ FIXME: handle quote special (general escape sequence?) =================== */ char *Key_KeynumToString( int keynum ) { - keyname_t *kn; - static char tinystr[2]; + const keyname_t *kn; + static char tinystr[2]; if( keynum == -1 ) return "<KEY NOT FOUND>"; @@ -309,7 +309,7 @@ char *Key_KeynumToString( int keynum ) { return tinystr; } - for( kn=keynames ; kn->name ; kn++ ) + for( kn = keynames; kn->name; kn++ ) if( keynum == kn->keynum ) return kn->name; @@ -366,7 +366,7 @@ void Key_SetBinding( int keynum, const char *binding ) { if( keynum < 0 || keynum > 255 ) return; -// free old bindings +// free old binding if( keybindings[keynum] ) { Z_Free( keybindings[keynum] ); } @@ -376,15 +376,29 @@ void Key_SetBinding( int keynum, const char *binding ) { } static void Key_Name_g( genctx_t *ctx ) { - keyname_t *k; + const keyname_t *k; + ctx->ignorecase = qtrue; for( k = keynames; k->name; k++ ) { - if( !Prompt_AddMatchCase( ctx, k->name ) ) { + if( !Prompt_AddMatch( ctx, k->name ) ) { break; } } } +static void Key_Bound_g( genctx_t *ctx ) { + int i; + + ctx->ignorecase = qtrue; + for( i = 0; i < 256; i++ ) { + if( keybindings[i] ) { + if( !Prompt_AddMatch( ctx, Key_KeynumToString( i ) ) ) { + break; + } + } + } +} + static void Key_Bind_c( genctx_t *ctx, int argnum ) { if( argnum == 1 ) { Key_Name_g( ctx ); @@ -395,7 +409,7 @@ static void Key_Bind_c( genctx_t *ctx, int argnum ) { static void Key_Unbind_c( genctx_t *ctx, int argnum ) { if( argnum == 1 ) { - Key_Name_g( ctx ); + Key_Bound_g( ctx ); } } diff --git a/source/cl_local.h b/source/cl_local.h index 6baaf50..9b57cef 100644 --- a/source/cl_local.h +++ b/source/cl_local.h @@ -316,14 +316,6 @@ extern cvar_t *cl_showclamp; extern cvar_t *cl_vwep; -extern cvar_t *cl_railtrail_type; -extern cvar_t *cl_railtrail_time; -extern cvar_t *cl_railtrail_alpha; -extern cvar_t *cl_railcore_color; -extern cvar_t *cl_railcore_width; -extern cvar_t *cl_railspiral_color; -extern cvar_t *cl_railspiral_radius; - extern cvar_t *cl_disable_particles; extern cvar_t *cl_disable_explosions; @@ -434,6 +426,7 @@ typedef struct cparticle_s // PGM // ======== +void CL_InitEffects (void); void CL_ClearEffects (void); void CL_ClearTEnts (void); void CL_BlasterTrail (vec3_t start, vec3_t end); @@ -541,7 +534,8 @@ void CL_DeltaFrame( void ); extern int gun_frame; extern qhandle_t gun_model; -void V_Init (void); +void V_Init( void ); +void V_Shutdown( void ); void V_RenderView( void ); void V_AddEntity (entity_t *ent); void V_AddParticle( particle_t *p ); @@ -632,7 +626,7 @@ void Con_ClearNotify_f( void ); void Con_ToggleConsole_f (void); void Con_Close( void ); void Con_SkipNotify( qboolean skip ); -void Con_SetupDC( void ); +void Con_RegisterMedia( void ); void Key_Console( int key ); void Key_Message( int key ); @@ -672,6 +666,7 @@ extern int scr_hudWidth; extern int scr_hudHeight; void SCR_Init (void); +void SCR_Shutdown( void ); void SCR_UpdateScreen (void); void SCR_SizeUp( void ); void SCR_SizeDown( void ); @@ -703,6 +698,7 @@ void SCR_FinishCinematic( void ); // cl_draw.c // void SCR_InitDraw( void ); +void SCR_ShutdownDraw( void ); void SCR_Draw2D( void ); void SCR_LoadingString( const char *string ); float SCR_FadeAlpha( unsigned startTime, unsigned visTime, unsigned fadeTime ); @@ -739,6 +735,10 @@ int Key_EnumBindings( int key, const char *binding ); void Key_FillAPI( keyAPI_t *api ); +// +// cl_aastat.c +// +void CL_InitAscii( void ); diff --git a/source/cl_locs.c b/source/cl_locs.c index d17897a..cb5b8c9 100644 --- a/source/cl_locs.c +++ b/source/cl_locs.c @@ -30,7 +30,7 @@ typedef struct { char name[1]; } location_t; -static list_t cl_locations = { &cl_locations, &cl_locations }; +static LIST_DECL( cl_locations ); static cvar_t *loc_draw; static cvar_t *loc_trace; diff --git a/source/cl_main.c b/source/cl_main.c index 39202e8..6ddf6f2 100644 --- a/source/cl_main.c +++ b/source/cl_main.c @@ -58,14 +58,6 @@ cvar_t *cl_thirdperson; cvar_t *cl_thirdperson_angle; cvar_t *cl_thirdperson_range; -cvar_t *cl_railtrail_type; -cvar_t *cl_railtrail_time; -cvar_t *cl_railtrail_alpha; -cvar_t *cl_railcore_color; -cvar_t *cl_railcore_width; -cvar_t *cl_railspiral_color; -cvar_t *cl_railspiral_radius; - cvar_t *cl_disable_particles; cvar_t *cl_disable_explosions; cvar_t *cl_chat_notify; @@ -1559,6 +1551,22 @@ static void CL_Snd_Restart_f ( void ) { CL_RegisterSounds (); } +static void CL_RegisterModels( void ) { + int i; + char *name; + + for ( i = 1; i < MAX_MODELS; i++ ) { + name = cl.configstrings[CS_MODELS+i]; + if( !name[0] ) { + break; + } + if( name[0] == '*' ) + cl.model_clip[i] = CM_InlineModel( &cl.cm, name ); + else + cl.model_clip[i] = NULL; + } +} + static int precache_check; // for autodownload of precache items static int precache_spawncount; static int precache_tex; @@ -1843,6 +1851,7 @@ void CL_RequestNextDownload ( void ) { SCR_LoadingString( "sounds" ); CL_RegisterSounds (); + CL_RegisterModels(); CL_PrepRefresh (); LOC_LoadLocations(); @@ -1887,6 +1896,7 @@ static void CL_Precache_f( void ) { CM_LOAD_CLIENT, &map_checksum ); SCR_LoadingString( "sounds" ); CL_RegisterSounds(); + CL_RegisterModels(); CL_PrepRefresh(); cls.state = ca_precached; return; @@ -2181,20 +2191,25 @@ void CL_RestartFilesystem( void ) { S_StopAllSounds(); S_FreeAllSounds(); - ref.Shutdown( qfalse ); + if( cls.ref_initialized ) { + ref.Shutdown( qfalse ); - FS_Restart(); + FS_Restart(); - ref.Init( qfalse ); + ref.Init( qfalse ); - SCR_RegisterMedia(); - Con_SetupDC(); - CL_InitUI(); + SCR_RegisterMedia(); + Con_RegisterMedia(); + CL_InitUI(); + } else { + FS_Restart(); + } if ( cls_state == ca_disconnected ) { UI_OpenMenu( UIMENU_MAIN ); } else if ( cls_state >= ca_loading ) { CL_RegisterSounds(); + CL_RegisterModels(); CL_PrepRefresh(); } @@ -2211,6 +2226,10 @@ CL_RestartRefresh static void CL_RestartRefresh_f( void ) { int cls_state; + if( !cls.ref_initialized ) { + return; + } + // temporary switch to loading state cls_state = cls.state; if ( cls.state >= ca_precached ) { @@ -2228,10 +2247,6 @@ static void CL_RestartRefresh_f( void ) { CL_InitRefresh(); CL_InitInput(); - SCR_RegisterMedia(); - Con_SetupDC(); - CL_InitUI(); - if ( cls_state == ca_disconnected ) { UI_OpenMenu( UIMENU_MAIN ); } else if ( cls_state >= ca_loading ) { @@ -2353,15 +2368,14 @@ static void CL_InitLocal ( void ) { int i; cls.state = ca_disconnected; - cls.realtime = 0xffffffff-15*1000; CL_FillAPI( &client ); CL_RegisterInput(); - CL_InitDemos(); - LOC_Init(); + CL_InitAscii(); + CL_InitEffects(); Cmd_Register( c_client ); @@ -2403,14 +2417,6 @@ static void CL_InitLocal ( void ) { cl_thirdperson_angle = Cvar_Get( "cl_thirdperson_angle", "0", 0 ); cl_thirdperson_range = Cvar_Get( "cl_thirdperson_range", "60", 0 ); - cl_railtrail_type = Cvar_Get( "cl_railtrail_type", "0", 0 ); - cl_railtrail_time = Cvar_Get( "cl_railtrail_time", "1.0", 0 ); - cl_railtrail_alpha = Cvar_Get( "cl_railtrail_alpha", "1.0", 0 ); - cl_railcore_color = Cvar_Get( "cl_railcore_color", "0xFF0000", 0 ); - cl_railcore_width = Cvar_Get( "cl_railcore_width", "2", 0 ); - cl_railspiral_color = Cvar_Get( "cl_railspiral_color", "0x0000FF", 0 ); - cl_railspiral_radius = Cvar_Get( "cl_railspiral_radius", "3", 0 ); - cl_disable_particles = Cvar_Get( "cl_disable_particles", "0", 0 ); cl_disable_explosions = Cvar_Get( "cl_disable_explosions", "0", 0 ); cl_gibs = Cvar_Get( "cl_gibs", "1", 0 ); @@ -2815,13 +2821,8 @@ void CL_Init( void ) { CL_InitRefresh(); #endif - V_Init(); - SCR_Init(); CL_InitLocal(); CL_InitInput(); - SCR_RegisterMedia(); - Con_SetupDC(); - CL_InitUI(); #if USE_ZLIB if( inflateInit2( &cls.z, -15 ) != Z_OK ) { diff --git a/source/cl_parse.c b/source/cl_parse.c index 63ecb31..32a01b0 100644 --- a/source/cl_parse.c +++ b/source/cl_parse.c @@ -920,6 +920,8 @@ static void CL_ParseServerData( void ) { Con_Printf( "\n\n\35\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\37\n\n" ); Con_Printf( S_COLOR_ALT "%s\n\n", str ); + Sys_Printf( "\n\n%s\n", str ); + // make sure clientNum is in range if( cl.clientNum < 0 || cl.clientNum >= MAX_CLIENTS ) { cl.clientNum = CLIENTNUM_NONE; @@ -970,103 +972,97 @@ void CL_LoadClientinfo( clientinfo_t *ci, char *s ) { s = t + 1; } - if( cl_noskins->integer || *s == 0 ) { -noskin: - strcpy( model_filename, "players/male/tris.md2" ); - strcpy( weapon_filename, "players/male/weapon.md2" ); - strcpy( skin_filename, "players/male/grunt.pcx" ); - strcpy( icon_filename, "/players/male/grunt_i.pcx" ); - ci->model = ref.RegisterModel( model_filename ); - for( i = 0; i < cl.numWeaponModels; i++ ) { - Q_concat( weapon_filename, sizeof( weapon_filename ), - "players/male/", cl.weaponModels[i], NULL ); - ci->weaponmodel[i] = ref.RegisterModel( weapon_filename ); - } - ci->skin = ref.RegisterSkin( skin_filename ); - ci->icon = ref.RegisterPic( icon_filename ); - strcpy( ci->model_name, "male" ); - } else { - strcpy( model_name, s ); - - // isolate the model name - t = strchr( model_name, '/' ); - if( !t ) - t = strchr( model_name, '\\' ); - if( !t ) - t = model_name; - if( t == model_name ) { - goto noskin; - } - *t = 0; - - // isolate the skin name - strcpy( skin_name, t + 1 ); - - // model file - Q_concat( model_filename, sizeof( model_filename ), - "players/", model_name, "/tris.md2", NULL ); - ci->model = ref.RegisterModel( model_filename ); - if( !ci->model && Q_stricmp( model_name, "male" ) ) { - strcpy( model_name, "male" ); - strcpy( model_filename, "players/male/tris.md2" ); - ci->model = ref.RegisterModel( model_filename ); - } - - // skin file - Q_concat( skin_filename, sizeof( skin_filename ), - "players/", model_name, "/", skin_name, ".pcx", NULL ); - ci->skin = ref.RegisterSkin( skin_filename ); + strcpy( model_name, s ); + + // isolate the model name + t = strchr( model_name, '/' ); + if( !t ) + t = strchr( model_name, '\\' ); + if( !t ) + t = model_name; + if( t == model_name ) { + strcpy( model_name, "male" ); + strcpy( skin_name, "grunt" ); + } else { + *t = 0; - // if we don't have the skin and the model was female, - // see if athena skin exists - if( !ci->skin && !Q_stricmp( model_name, "female" ) ) { + // apply restictions on skins + if( cl_noskins->integer == 2 && !Q_stricmp( model_name, "female" ) ) { + strcpy( model_name, "female" ); strcpy( skin_name, "athena" ); - strcpy( skin_filename, "players/female/athena.pcx" ); - ci->skin = ref.RegisterSkin( skin_filename ); + } else if( cl_noskins->integer ) { + strcpy( model_name, "male" ); + strcpy( skin_name, "grunt" ); + } else { + // isolate the skin name + strcpy( skin_name, t + 1 ); } + } - // if we don't have the skin and the model wasn't male, - // see if the male has it (this is for CTF's skins) - if( !ci->skin && Q_stricmp( model_name, "male" ) ) { - // change model to male - strcpy( model_name, "male" ); - strcpy( model_filename, "players/male/tris.md2" ); - ci->model = ref.RegisterModel( model_filename ); - - // see if the skin exists for the male model - Q_concat( skin_filename, sizeof( skin_filename ), - "players/male/", skin_name, ".pcx", NULL ); - ci->skin = ref.RegisterSkin( skin_filename ); - } + // model file + Q_concat( model_filename, sizeof( model_filename ), + "players/", model_name, "/tris.md2", NULL ); + ci->model = ref.RegisterModel( model_filename ); + if( !ci->model && Q_stricmp( model_name, "male" ) ) { + strcpy( model_name, "male" ); + strcpy( model_filename, "players/male/tris.md2" ); + ci->model = ref.RegisterModel( model_filename ); + } - // if we still don't have a skin, it means that the male model - // didn't have it, so default to grunt - if( !ci->skin ) { - // see if the skin exists for the male model - strcpy( skin_filename, "players/male/grunt.pcx" ); - ci->skin = ref.RegisterSkin( skin_filename ); - } + // skin file + Q_concat( skin_filename, sizeof( skin_filename ), + "players/", model_name, "/", skin_name, ".pcx", NULL ); + ci->skin = ref.RegisterSkin( skin_filename ); + + // if we don't have the skin and the model was female, + // see if athena skin exists + if( !ci->skin && !Q_stricmp( model_name, "female" ) ) { + strcpy( skin_name, "athena" ); + strcpy( skin_filename, "players/female/athena.pcx" ); + ci->skin = ref.RegisterSkin( skin_filename ); + } - // weapon file - for( i = 0; i < cl.numWeaponModels; i++ ) { - Q_concat( weapon_filename, sizeof( weapon_filename ), - "players/", model_name, "/", cl.weaponModels[i], NULL ); - ci->weaponmodel[i] = ref.RegisterModel( weapon_filename ); - if( !ci->weaponmodel[i] && Q_stricmp( model_name, "male" ) ) { - // try male - Q_concat( weapon_filename, sizeof( weapon_filename ), - "players/male/", cl.weaponModels[i], NULL ); - ci->weaponmodel[i] = ref.RegisterModel( weapon_filename ); - } - } + // if we don't have the skin and the model wasn't male, + // see if the male has it (this is for CTF's skins) + if( !ci->skin && Q_stricmp( model_name, "male" ) ) { + // change model to male + strcpy( model_name, "male" ); + strcpy( model_filename, "players/male/tris.md2" ); + ci->model = ref.RegisterModel( model_filename ); + + // see if the skin exists for the male model + Q_concat( skin_filename, sizeof( skin_filename ), + "players/male/", skin_name, ".pcx", NULL ); + ci->skin = ref.RegisterSkin( skin_filename ); + } + + // if we still don't have a skin, it means that the male model + // didn't have it, so default to grunt + if( !ci->skin ) { + // see if the skin exists for the male model + strcpy( skin_filename, "players/male/grunt.pcx" ); + ci->skin = ref.RegisterSkin( skin_filename ); + } + + // weapon file + for( i = 0; i < cl.numWeaponModels; i++ ) { + Q_concat( weapon_filename, sizeof( weapon_filename ), + "players/", model_name, "/", cl.weaponModels[i], NULL ); + ci->weaponmodel[i] = ref.RegisterModel( weapon_filename ); + if( !ci->weaponmodel[i] && Q_stricmp( model_name, "male" ) ) { + // try male + Q_concat( weapon_filename, sizeof( weapon_filename ), + "players/male/", cl.weaponModels[i], NULL ); + ci->weaponmodel[i] = ref.RegisterModel( weapon_filename ); + } + } - // icon file - Q_concat( icon_filename, sizeof( icon_filename ), - "/players/", model_name, "/", skin_name, "_i.pcx", NULL ); - ci->icon = ref.RegisterPic( icon_filename ); + // icon file + Q_concat( icon_filename, sizeof( icon_filename ), + "/players/", model_name, "/", skin_name, "_i.pcx", NULL ); + ci->icon = ref.RegisterPic( icon_filename ); - strcpy( ci->model_name, model_name ); - } + strcpy( ci->model_name, model_name ); // must have loaded all data types to be valid if( !ci->skin || !ci->icon || !ci->model || !ci->weaponmodel[0] ) { diff --git a/source/cl_pred.c b/source/cl_pred.c index 36e4e9b..f79d3de 100644 --- a/source/cl_pred.c +++ b/source/cl_pred.c @@ -109,7 +109,6 @@ static void CL_ClipMoveToEntities ( vec3_t start, vec3_t mins, vec3_t maxs, vec3 int i, x, zd, zu; trace_t trace; cnode_t *headnode; - float *angles; entity_state_t *ent; cmodel_t *cmodel; vec3_t bmins, bmaxs; @@ -123,7 +122,6 @@ static void CL_ClipMoveToEntities ( vec3_t start, vec3_t mins, vec3_t maxs, vec3 if (!cmodel) continue; headnode = cmodel->headnode; - angles = ent->angles; } else { // encoded bbox x = 8*(ent->solid & 31); @@ -136,7 +134,6 @@ static void CL_ClipMoveToEntities ( vec3_t start, vec3_t mins, vec3_t maxs, vec3 bmaxs[2] = zu; headnode = CM_HeadnodeForBox (bmins, bmaxs); - angles = vec3_origin; // boxes don't rotate } if (tr->allsolid) @@ -144,18 +141,9 @@ static void CL_ClipMoveToEntities ( vec3_t start, vec3_t mins, vec3_t maxs, vec3 CM_TransformedBoxTrace (&trace, start, end, mins, maxs, headnode, MASK_PLAYERSOLID, - ent->origin, angles); - - tr->allsolid |= trace.allsolid; - tr->startsolid |= trace.startsolid; - if( trace.fraction < tr->fraction ) { - tr->fraction = trace.fraction; - VectorCopy( trace.endpos, tr->endpos ); - tr->plane = trace.plane; - tr->surface = trace.surface; - tr->contents |= trace.contents; - tr->ent = ( struct edict_s * )ent; - } + ent->origin, ent->angles); + + CM_ClipEntity( tr, &trace, ( struct edict_s * )ent ); } } diff --git a/source/cl_ref.c b/source/cl_ref.c index 6fcc92a..bcce301 100644 --- a/source/cl_ref.c +++ b/source/cl_ref.c @@ -393,7 +393,7 @@ void CL_InitRefresh( void ) { Cvar_Set( "_vid_fullscreen", "1" ); } -#ifdef REF_HARD_LINKED +#if REF_HARD_LINKED vid_ref = Cvar_Get( "vid_ref", DEFAULT_REFRESH_DRIVER, CVAR_ROM ); if( !CL_LoadRefresh( "ref_" DEFAULT_REFRESH_DRIVER ) ) { Com_Error( ERR_FATAL, "Couldn't load built-in video driver!" ); @@ -417,16 +417,22 @@ void CL_InitRefresh( void ) { Com_Printf( "Falling back to default refresh...\n" ); Cvar_Set( "vid_ref", DEFAULT_REFRESH_DRIVER ); } -#endif + vid_ref->changed = vid_ref_changed; +#endif vid_placement->changed = vid_placement_changed; vid_fullscreen->changed = vid_fullscreen_changed; vid_modelist->changed = vid_modelist_changed; -#ifndef REF_HARD_LINKED - vid_ref->changed = vid_ref_changed; -#endif mode_changed = 0; + + // Initialize the rest of graphics subsystems + V_Init(); + SCR_Init(); + CL_InitUI(); + + SCR_RegisterMedia(); + Con_RegisterMedia(); } /* @@ -439,10 +445,15 @@ void CL_ShutdownRefresh( void ) { return; } + // Shutdown the rest of graphics subsystems + V_Shutdown(); + SCR_Shutdown(); + CL_ShutdownUI(); + vid_placement->changed = NULL; vid_fullscreen->changed = NULL; vid_modelist->changed = NULL; -#ifndef REF_HARD_LINKED +#if !REF_HARD_LINKED vid_ref->changed = NULL; #endif @@ -450,6 +461,7 @@ void CL_ShutdownRefresh( void ) { CL_FreeRefresh(); Z_LeakTest( TAG_RENDERER ); + } diff --git a/source/cl_scrn.c b/source/cl_scrn.c index 8ec5d46..c36f2b0 100644 --- a/source/cl_scrn.c +++ b/source/cl_scrn.c @@ -77,7 +77,6 @@ static qhandle_t sb_field; #define DIGIT_WIDTH 16 #define ICON_SPACE 8 -void SCR_TimeRefresh_f (void); void SCR_Loading_f (void); @@ -102,6 +101,9 @@ void CL_AddNetgraph (void) int in; int ping; + if (!scr_initialized) + return; + // if using the debuggraph for something else, don't // add the net lines if (scr_debuggraph->integer || scr_timegraph->integer) @@ -334,12 +336,10 @@ SCR_SizeUp_f Keybinding command ================= */ -void SCR_SizeUp_f (void) -{ - Cvar_SetInteger("viewsize",scr_viewsize->integer+10); +static void SCR_SizeUp_f( void ) { + Cvar_SetInteger( "viewsize", scr_viewsize->integer + 10 ); } - /* ================= SCR_SizeDown_f @@ -347,9 +347,8 @@ SCR_SizeDown_f Keybinding command ================= */ -void SCR_SizeDown_f (void) -{ - Cvar_SetInteger ("viewsize",scr_viewsize->integer-10); +static void SCR_SizeDown_f( void ) { + Cvar_SetInteger( "viewsize", scr_viewsize->integer - 10 ); } /* @@ -359,36 +358,68 @@ SCR_Sky_f Set a specific sky and rotation speed ================= */ -void SCR_Sky_f (void) -{ - float rotate; - vec3_t axis; +static void SCR_Sky_f( void ) { + float rotate = 0; + vec3_t axis = { 0, 0, 1 }; + int argc = Cmd_Argc(); - if (Cmd_Argc() < 2) - { + if( argc < 2 ) { Com_Printf ("Usage: sky <basename> [rotate] [axis x y z]\n"); return; } - if (Cmd_Argc() > 2) + + if( argc > 2 ) rotate = atof(Cmd_Argv(2)); - else - rotate = 0; - if (Cmd_Argc() == 6) - { + if( argc == 6 ) { axis[0] = atof(Cmd_Argv(3)); axis[1] = atof(Cmd_Argv(4)); axis[2] = atof(Cmd_Argv(5)); } - else - { - axis[0] = 0; - axis[1] = 0; - axis[2] = 1; - } ref.SetSky (Cmd_Argv(1), rotate, axis); } +/* +================ +SCR_TimeRefresh_f +================ +*/ +static void SCR_TimeRefresh_f (void) { + int i; + unsigned start, stop; + float time; + + if( cls.state != ca_active ) { + Com_Printf( "No map loaded.\n" ); + return; + } + + start = Sys_Milliseconds (); + + if (Cmd_Argc() == 2) { + // run without page flipping + ref.BeginFrame(); + for (i=0 ; i<128 ; i++) { + cl.refdef.viewangles[1] = i/128.0f*360.0f; + ref.RenderFrame (&cl.refdef); + } + ref.EndFrame(); + } else { + for (i=0 ; i<128 ; i++) { + cl.refdef.viewangles[1] = i/128.0f*360.0f; + + ref.BeginFrame(); + ref.RenderFrame (&cl.refdef); + ref.EndFrame(); + } + } + + stop = Sys_Milliseconds(); + time = (stop-start)*0.001f; + Com_Printf ("%f seconds (%f fps)\n", time, 128.0f/time); +} + + //============================================================================ /* @@ -447,13 +478,20 @@ static void scr_fontvar_changed( cvar_t *self ) { scr_font = ref.RegisterFont( self->string ); } +static const cmdreg_t scr_cmds[] = { + { "timerefresh", SCR_TimeRefresh_f }, + { "sizeup", SCR_SizeUp_f }, + { "sizedown", SCR_SizeDown_f }, + { "sky", SCR_Sky_f }, + { NULL } +}; + /* ================== SCR_Init ================== */ -void SCR_Init (void) -{ +void SCR_Init( void ) { scr_viewsize = Cvar_Get ("viewsize", "100", CVAR_ARCHIVE); scr_showpause = Cvar_Get ("scr_showpause", "1", 0); scr_centertime = Cvar_Get ("scr_centertime", "2.5", 0); @@ -468,25 +506,25 @@ void SCR_Init (void) scr_fontvar = Cvar_Get( "scr_font", "conchars", CVAR_ARCHIVE ); scr_fontvar->changed = scr_fontvar_changed; scr_scale = Cvar_Get( "scr_scale", "1", CVAR_ARCHIVE ); + crosshair = Cvar_Get ("crosshair", "0", CVAR_ARCHIVE); - SCR_InitDraw(); + Cmd_Register( scr_cmds ); -// -// register our commands -// - Cmd_AddCommand ("timerefresh",SCR_TimeRefresh_f); - Cmd_AddCommand ("sizeup",SCR_SizeUp_f); - Cmd_AddCommand ("sizedown",SCR_SizeDown_f); - Cmd_AddCommand ("sky",SCR_Sky_f); + SCR_InitDraw(); - scr_glconfig.vidWidth = 320; - scr_glconfig.vidHeight = 240; + scr_glconfig.vidWidth = 640; + scr_glconfig.vidHeight = 480; scr_initialized = qtrue; } +void SCR_Shutdown( void ) { + Cmd_Deregister( scr_cmds ); + SCR_ShutdownDraw(); + scr_initialized = qfalse; +} /* ============== @@ -534,50 +572,6 @@ void SCR_EndLoadingPlaque( void ) { Con_ClearNotify_f(); } - -/* -================ -SCR_TimeRefresh_f -================ -*/ -void SCR_TimeRefresh_f (void) -{ - int i; - unsigned start, stop; - float time; - - if( cls.state != ca_active ) { - Com_Printf( "No map loaded.\n" ); - return; - } - - start = Sys_Milliseconds (); - - if (Cmd_Argc() == 2) { - // run without page flipping - ref.BeginFrame(); - for (i=0 ; i<128 ; i++) { - cl.refdef.viewangles[1] = i/128.0f*360.0f; - ref.RenderFrame (&cl.refdef); - } - ref.EndFrame(); - } else { - for (i=0 ; i<128 ; i++) { - cl.refdef.viewangles[1] = i/128.0f*360.0f; - - ref.BeginFrame(); - ref.RenderFrame (&cl.refdef); - ref.EndFrame(); - } - } - - stop = Sys_Milliseconds(); - time = (stop-start)*0.001f; - Com_Printf ("%f seconds (%f fps)\n", time, 128.0f/time); -} - - - /* ============== SCR_TileClear @@ -585,7 +579,7 @@ SCR_TileClear Clear any parts of the tiled background that were drawn on last frame ============== */ -void SCR_TileClear( void ) { +static void SCR_TileClear( void ) { int top, bottom, left, right; //if( con.currentHeight == 1 ) diff --git a/source/cl_view.c b/source/cl_view.c index acd3ba4..93d5c95 100644 --- a/source/cl_view.c +++ b/source/cl_view.c @@ -56,8 +56,7 @@ V_ClearScene Specifies the model that will be used as the world ==================== */ -void V_ClearScene (void) -{ +static void V_ClearScene (void) { r_numdlights = 0; r_numentities = 0; r_numparticles = 0; @@ -70,8 +69,7 @@ V_AddEntity ===================== */ -void V_AddEntity (entity_t *ent) -{ +void V_AddEntity (entity_t *ent) { if (r_numentities >= MAX_ENTITIES) return; @@ -85,12 +83,10 @@ V_AddParticle ===================== */ -void V_AddParticle( particle_t *p ) -{ +void V_AddParticle( particle_t *p ) { if (r_numparticles >= MAX_PARTICLES) return; r_particles[r_numparticles++] = *p; - } /* @@ -99,8 +95,7 @@ V_AddLight ===================== */ -void V_AddLight (vec3_t org, float intensity, float r, float g, float b) -{ +void V_AddLight (vec3_t org, float intensity, float r, float g, float b) { dlight_t *dl; if (r_numdlights >= MAX_DLIGHTS) @@ -120,8 +115,7 @@ V_AddLightStyle ===================== */ -void V_AddLightStyle (int style, vec4_t value) -{ +void V_AddLightStyle (int style, vec4_t value) { lightstyle_t *ls; if (style < 0 || style > MAX_LIGHTSTYLES) @@ -142,8 +136,7 @@ V_TestParticles If cl_testparticles is set, create 4096 particles in the view ================ */ -void V_TestParticles (void) -{ +static void V_TestParticles (void) { particle_t *p; int i, j; float d, r, u; @@ -172,8 +165,7 @@ V_TestEntities If cl_testentities is set, create 32 player models ================ */ -void V_TestEntities (void) -{ +static void V_TestEntities (void) { int i, j; float f, r; entity_t *ent; @@ -204,8 +196,7 @@ V_TestLights If cl_testlights is set, create 32 lights models ================ */ -void V_TestLights (void) -{ +static void V_TestLights (void) { int i, j; float f, r; dlight_t *dl; @@ -249,14 +240,16 @@ CL_PrepRefresh Call before entering a new level, or after changing dlls ================= */ -void CL_PrepRefresh (void) -{ +void CL_PrepRefresh (void) { int i; char *name; float rotate; vec3_t axis; unsigned time_start, time_map, time_models, time_clients, time_total; + if( !cls.ref_initialized ) { + return; + } if (!cl.mapname[0]) return; // no map loaded @@ -293,10 +286,6 @@ void CL_PrepRefresh (void) } } else { cl.model_draw[i] = ref.RegisterModel( name ); - if( name[0] == '*' ) - cl.model_clip[i] = CM_InlineModel( &cl.cm, name ); - else - cl.model_clip[i] = NULL; } } time_models = Sys_Milliseconds(); @@ -311,8 +300,7 @@ void CL_PrepRefresh (void) } SCR_LoadingString( "clients" ); - for (i=0 ; i<MAX_CLIENTS ; i++) - { + for (i=0 ; i<MAX_CLIENTS ; i++) { name = cl.configstrings[CS_PLAYERSKINS+i]; if( !name[0] ) continue; @@ -351,26 +339,22 @@ void CL_PrepRefresh (void) //============================================================================ // gun frame debugging functions -void V_Gun_Next_f (void) -{ +static void V_Gun_Next_f (void) { gun_frame++; Com_Printf ("frame %i\n", gun_frame); } -void V_Gun_Prev_f (void) -{ +static void V_Gun_Prev_f (void) { gun_frame--; if (gun_frame < 0) gun_frame = 0; Com_Printf ("frame %i\n", gun_frame); } -void V_Gun_Model_f (void) -{ +static void V_Gun_Model_f (void) { char name[MAX_QPATH]; - if (Cmd_Argc() != 2) - { + if (Cmd_Argc() != 2) { gun_model = 0; return; } @@ -395,7 +379,7 @@ static int QDECL entitycmpfnc( const entity_t *a, const entity_t *b ) } } -void V_SetLightLevel( void ) { +static void V_SetLightLevel( void ) { vec3_t shadelight; // save off light value for server to look at (BIG HACK!) @@ -509,27 +493,27 @@ void V_RenderView( void ) { V_Viewpos_f ============= */ -void V_Viewpos_f (void) -{ +static void V_Viewpos_f (void) { Com_Printf ("(%i %i %i) : %i\n", (int)cl.refdef.vieworg[0], (int)cl.refdef.vieworg[1], (int)cl.refdef.vieworg[2], (int)cl.refdef.viewangles[YAW]); } +static const cmdreg_t v_cmds[] = { + { "gun_next", V_Gun_Next_f }, + { "gun_prev", V_Gun_Prev_f }, + { "gun_model", V_Gun_Model_f }, + { "viewpos", V_Viewpos_f }, + { NULL } +}; + /* ============= V_Init ============= */ -void V_Init (void) -{ - Cmd_AddCommand ("gun_next", V_Gun_Next_f); - Cmd_AddCommand ("gun_prev", V_Gun_Prev_f); - Cmd_AddCommand ("gun_model", V_Gun_Model_f); - - Cmd_AddCommand ("viewpos", V_Viewpos_f); - - crosshair = Cvar_Get ("crosshair", "0", CVAR_ARCHIVE); +void V_Init( void ) { + Cmd_Register( v_cmds ); cl_testblend = Cvar_Get ("cl_testblend", "0", 0); cl_testparticles = Cvar_Get ("cl_testparticles", "0", 0); @@ -539,4 +523,9 @@ void V_Init (void) cl_stats = Cvar_Get ("cl_stats", "0", 0); } +void V_Shutdown( void ) { + Cmd_Deregister( v_cmds ); +} + + diff --git a/source/cmodel.c b/source/cmodel.c index d65ca67..999186b 100644 --- a/source/cmodel.c +++ b/source/cmodel.c @@ -32,7 +32,7 @@ static int floodvalid; static int checkcount; static cvar_t *map_noareas; -static cvar_t *map_load_entities; +static cvar_t *map_override; void CM_FloodAreaConnections( cm_t *cm ); @@ -466,130 +466,6 @@ CM_FUNC( EntityString ) { return qtrue; } -#if 0 -/* -================== -CM_Concat -================== -*/ -static void CM_Concat( const char *text ) { - int len = strlen( text ); - - if( numEntityChars + len >= sizeof( cache->entitystring ) ) { - Com_Error( ERR_DROP, "CM_Concat: oversize entity lump" ); - } - - memcpy( cache->entitystring + numEntityChars, text, len ); - numEntityChars += len; -} - -/* -================== -CM_ParseMap - -Parses complete *.map file -================== -*/ -static qboolean CM_ParseMap( const char *data ) { - char *token; - int numInlineModels; - qboolean inlineModel; - char buffer[MAX_STRING_CHARS]; - - numInlineModels = 0; - - while( 1 ) { - token = COM_Parse( &data ); - if( !data ) { - break; - } - - if( *token != '{' ) { - Com_WPrintf( "%s: expected '{', found '%s'\n", __func__, token ); - return qfalse; - } - - CM_Concat( "{ " ); - - inlineModel = qfalse; - - // Parse entity - while( 1 ) { - token = COM_Parse( &data ); - if( !data ) { - Com_WPrintf( "%s: expected key, found EOF\n", __func__ ); - return qfalse; - } - - if( *token == '}' ) { - // FIXME HACK: restore inline model number - // This may not work properly if the entity order is different!!! - if( inlineModel && numInlineModels ) { - Com_sprintf( buffer, sizeof( buffer ), "\"model\" \"*%i\" } ", numInlineModels ); - CM_Concat( buffer ); - } else { - CM_Concat( "} " ); - } - - numInlineModels += inlineModel; - break; - } - - if( *token == '{' ) { - inlineModel = qtrue; - - // Parse brush - while( 1 ) { - token = COM_Parse( &data ); - if( !data ) { - Com_WPrintf( "%s: expected brush data, found EOF\n", __func__ ); - return qfalse; - } - - if( *token == '}' ) { - break; - } - - if( *token == '{' ) { - Com_WPrintf( "%s: expected brush data, found '{'\n", __func__ ); - return qfalse; - } - - } - continue; - } - - CM_Concat( "\"" ); - CM_Concat( token ); - CM_Concat( "\" \"" ); - - token = COM_Parse( &data ); - if( !data ) { - Com_WPrintf( "%s: expected value, found EOF\n", __func__ ); - return qfalse; - } - - if( *token == '}' || *token == '{' ) { - Com_WPrintf( "%s: expected value, found '%s'\n", __func__, token ); - return qfalse; - } - - CM_Concat( token ); - CM_Concat( "\" " ); - } - } - - cmod->entitystring[numEntityChars] = 0; - - if( numInlineModels != numcmodels + 1 ) { - Com_WPrintf( "%s: inline models count mismatch\n", __func__ ); - return qfalse; - } - - return qtrue; -} -#endif - #define CM_CACHESIZE 16 static cmcache_t cm_cache[CM_CACHESIZE]; @@ -686,8 +562,6 @@ const char *CM_LoadMapEx( cm_t *cm, const char *name, int flags, uint32_t *check const lump_load_t *load; size_t length, endpos, fileofs, filelen; char *error; -// char *entstring; -// char buffer[MAX_QPATH]; if( !name || !name[0] ) { Com_Error( ERR_FATAL, "CM_LoadMap: NULL name" ); @@ -728,7 +602,7 @@ const char *CM_LoadMapEx( cm_t *cm, const char *name, int flags, uint32_t *check // // load the file // - length = FS_LoadFileEx( name, (void **)&buf, FS_FLAG_CACHE ); + length = FS_LoadFileEx( name, (void **)&buf, FS_FLAG_CACHE, TAG_FREE ); if( !buf ) { return "file not found"; } @@ -787,28 +661,24 @@ const char *CM_LoadMapEx( cm_t *cm, const char *name, int flags, uint32_t *check } } -#if 0 - // Load the entity string from file, if specified - entstring = NULL; - if( cm_override_entities->integer && !( flags & CM_LOAD_CLIENT ) ) { - COM_StripExtension( name, buffer, sizeof( buffer ) ); - Q_strcat( buffer, sizeof( buffer ), ".map" ); - FS_LoadFile( buffer, ( void ** )&entstring ); - } + // optionally load the entity string from external source + if( map_override->integer && !( flags & CM_LOAD_CLIENT ) ) { + char *entstring; + char buffer[MAX_QPATH]; - if( entstring ) { - Com_Printf( "Loading entity string from %s...\n", buffer ); - cm - if( !CM_ParseMapFile( entstring ) ) { - CM_LOAD( EntityString, ENTITIES ); + COM_StripExtension( name, buffer, sizeof( buffer ) ); + Q_strcat( buffer, sizeof( buffer ), ".ent" ); + length = FS_LoadFileEx( buffer, ( void ** )&entstring, 0, TAG_CMODEL ); + if( entstring ) { + Com_DPrintf( "Loaded entity string from %s\n", buffer ); + cache->entitystring = entstring; + cache->numEntityChars = length; + } else { + CM_LoadEntityString( cache, &lumps[LUMP_ENTITIES] ); } - FS_FreeFile( entstring ); } else { - CM_LOAD( EntityString, ENTITIES ); + CM_LoadEntityString( cache, &lumps[LUMP_ENTITIES] ); } -#else - CM_LoadEntityString( cache, &lumps[LUMP_ENTITIES] ); -#endif FS_FreeFile( buf ); @@ -845,14 +715,14 @@ cmodel_t *CM_InlineModel( cm_t *cm, const char *name ) { cmodel_t *cmodel; if( !name || name[0] != '*' ) { - Com_Error( ERR_DROP, "CM_InlineModel: bad name: %s", name ); + Com_Error( ERR_DROP, "%s: bad name: %s", __func__, name ); } if( !cm->cache ) { - Com_Error( ERR_DROP, "CM_InlineModel: NULL cache" ); + Com_Error( ERR_DROP, "%s: NULL cache", __func__ ); } num = atoi( name + 1 ); if( num < 1 || num >= cm->cache->numcmodels ) { - Com_Error ( ERR_DROP, "CM_InlineModel: bad number: %d", num ); + Com_Error ( ERR_DROP, "%s: bad number: %d", __func__, num ); } cmodel = &cm->cache->cmodels[num]; @@ -886,23 +756,23 @@ char *CM_EntityString( cm_t *cm ) { cnode_t *CM_NodeNum( cm_t *cm, int number ) { if( !cm->cache ) { - Com_Error( ERR_DROP, "CM_NodeNum: NULL cache" ); + Com_Error( ERR_DROP, "%s: NULL cache", __func__ ); } if( number == -1 ) { return ( cnode_t * )cm->cache->leafs; // special case for solid leaf } if( number < 0 || number >= cm->cache->numnodes ) { - Com_Error( ERR_DROP, "CM_NodeNum: bad number: %d", number ); + Com_Error( ERR_DROP, "%s: bad number: %d", __func__, number ); } return cm->cache->nodes + number; } cleaf_t *CM_LeafNum( cm_t *cm, int number ) { if( !cm->cache ) { - Com_Error( ERR_DROP, "CM_LeafNum: NULL cache" ); + Com_Error( ERR_DROP, "%s: NULL cache", __func__ ); } if( number < 0 || number >= cm->cache->numleafs ) { - Com_Error( ERR_DROP, "CM_LeafNum: bad number: %d", number ); + Com_Error( ERR_DROP, "%s: bad number: %d", __func__, number ); } return cm->cache->leafs + number; } @@ -1673,6 +1543,21 @@ void CM_TransformedBoxTrace ( trace_t *trace, vec3_t start, vec3_t end, trace->endpos[2] = start[2] + trace->fraction * (end[2] - start[2]); } + +void CM_ClipEntity( trace_t *dst, trace_t *src, struct edict_s *ent ) { + dst->allsolid |= src->allsolid; + dst->startsolid |= src->startsolid; + if( src->fraction < dst->fraction ) { + dst->fraction = src->fraction; + VectorCopy( src->endpos, dst->endpos ); + dst->plane = src->plane; + dst->surface = src->surface; + dst->contents |= src->contents; + dst->ent = ent; + } +} + + /* =============================================================================== @@ -2013,6 +1898,6 @@ void CM_Init( void ) { CM_InitBoxHull(); map_noareas = Cvar_Get( "map_noareas", "0", 0 ); - map_load_entities = Cvar_Get( "map_load_entities", "0", 0 ); + map_override = Cvar_Get( "map_override", "0", 0 ); } diff --git a/source/com_local.h b/source/com_local.h index 9e8be04..bcc6903 100644 --- a/source/com_local.h +++ b/source/com_local.h @@ -20,7 +20,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // qcommon.h -- definitions common between client and server, but not game.dll -#include "config.h" +#include <config.h> #include "q_shared.h" #include "q_files.h" #include "com_public.h" @@ -777,6 +777,7 @@ void CM_TransformedBoxTrace( trace_t *trace, vec3_t start, vec3_t end, vec3_t mins, vec3_t maxs, cnode_t * headnode, int brushmask, vec3_t origin, vec3_t angles ); +void CM_ClipEntity( trace_t *dst, trace_t *src, struct edict_s *ent ); byte *CM_ClusterPVS( cm_t *cm, int cluster); byte *CM_ClusterPHS( cm_t *cm, int cluster ); @@ -862,7 +863,7 @@ size_t FS_FOpenFile( const char *filename, fileHandle_t *f, int mode ); void FS_FCloseFile( fileHandle_t hFile ); size_t FS_LoadFile( const char *path, void **buffer ); -size_t FS_LoadFileEx( const char *path, void **buffer, int flags ); +size_t FS_LoadFileEx( const char *path, void **buffer, int flags, memtag_t tag ); void *FS_AllocTempMem( size_t length ); void FS_FreeFile( void *buffer ); // a null buffer will just return the file length without loading @@ -948,9 +949,9 @@ void Com_ProcessEvents( void ); void Com_Address_g( genctx_t *ctx ); void Com_Generic_c( genctx_t *ctx, int argnum ); +void Com_Color_g( genctx_t *ctx ); qboolean Prompt_AddMatch( genctx_t *ctx, const char *s ); -qboolean Prompt_AddMatchCase( genctx_t *ctx, const char *s ); size_t Com_Time_m( char *buffer, size_t size ); size_t Com_Uptime_m( char *buffer, size_t size ); @@ -1047,6 +1048,7 @@ void Sys_AddDefaultConfig( void ); void Sys_RunConsole( void ); void Sys_ConsoleOutput( const char *string ); void Sys_SetConsoleTitle( const char *title ); +void Sys_Printf( const char *fmt, ... ) q_printf( 1, 2 ); void Sys_Error( const char *error, ... ) q_noreturn q_printf( 1, 2 ); void Sys_Quit( void ); diff --git a/source/com_public.h b/source/com_public.h index 9ac3fb5..c387b54 100644 --- a/source/com_public.h +++ b/source/com_public.h @@ -26,6 +26,50 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. /* ============================================================== +COMMON + +============================================================== +*/ + +#define MAXPRINTMSG 4096 + +// memory tags to allow dynamic memory to be cleaned up +typedef enum memtag_e { + TAG_FREE, // should have never been set + TAG_STATIC, + + TAG_GENERAL, + TAG_CMD, + TAG_CVAR, + TAG_FILESYSTEM, + TAG_RENDERER, + TAG_UI, + TAG_SERVER, + TAG_MVD, + TAG_SOUND, + TAG_CMODEL, + + TAG_MAX, + + TAG_GAME = 765, // clear when unloading the dll + TAG_LEVEL = 766 // clear when loading a new level +} memtag_t; + +typedef struct commonAPI_s { + void (* q_noreturn Error)( comErrorType_t code, const char *str ); + void (*Print)( comPrintType_t type, const char *str ); + + void *(*TagMalloc)( size_t size, memtag_t tag ); + void *(*Realloc)( void *ptr, size_t size ); + void (*Free)( void *ptr ); +} commonAPI_t; + +extern commonAPI_t com; + + +/* +============================================================== + CMD ============================================================== @@ -48,6 +92,7 @@ typedef struct genctx_s { char **matches; int count, size; void *data; + qboolean ignorecase; } genctx_t; typedef struct cmdreg_s { @@ -177,7 +222,7 @@ typedef struct fsAPI_s { int (*Tell)( fileHandle_t f ); int (*RawTell)( fileHandle_t f ); size_t (*LoadFile)( const char *path, void **buffer ); - size_t (*LoadFileEx)( const char *path, void **buffer, int flags ); + size_t (*LoadFileEx)( const char *path, void **buffer, int flags, memtag_t tag ); void *(*AllocTempMem)( size_t length ); void (*FreeFile)( void *buffer ); void **(*ListFiles)( const char *path, const char *extension, int flags, int *numFiles ); @@ -189,49 +234,6 @@ extern fsAPI_t fs; /* ============================================================== -COMMON - -============================================================== -*/ - -#define MAXPRINTMSG 4096 - -// memory tags to allow dynamic memory to be cleaned up -typedef enum memtag_e { - TAG_FREE, // should have never been set - TAG_STATIC, - - TAG_GENERAL, - TAG_CMD, - TAG_CVAR, - TAG_FILESYSTEM, - TAG_RENDERER, - TAG_UI, - TAG_SERVER, - TAG_MVD, - TAG_SOUND, - TAG_CMODEL, - - TAG_MAX, - - TAG_GAME = 765, // clear when unloading the dll - TAG_LEVEL = 766 // clear when loading a new level -} memtag_t; - -typedef struct commonAPI_s { - void (* q_noreturn Error)( comErrorType_t code, const char *str ); - void (*Print)( comPrintType_t type, const char *str ); - - void *(*TagMalloc)( size_t size, memtag_t tag ); - void *(*Realloc)( void *ptr, size_t size ); - void (*Free)( void *ptr ); -} commonAPI_t; - -extern commonAPI_t com; - -/* -============================================================== - SYSTEM ============================================================== diff --git a/source/common.c b/source/common.c index e1a2cfb..1510696 100644 --- a/source/common.c +++ b/source/common.c @@ -443,7 +443,15 @@ do the apropriate things. ============= */ void Com_Quit( void ) { - SV_Shutdown( "Server quit\n", KILL_DROP ); + if( Cmd_Argc() > 1 ) { + char buffer[MAX_STRING_TOKENS]; + + Com_sprintf( buffer, sizeof( buffer ), + "Server quit: %s\n", Cmd_Args() ); + SV_Shutdown( buffer, KILL_DROP ); + } else { + SV_Shutdown( "Server quit\n", KILL_DROP ); + } CL_Shutdown(); Qcommon_Shutdown( qfalse ); @@ -487,17 +495,17 @@ static zhead_t z_chain; static cvar_t *z_perturb; -#pragma pack( push, 1 ) typedef struct { zhead_t z; char data[2]; uint16_t tail; } zstatic_t; -#pragma pack( pop ) - -#define Z_STATIC( x ) { { Z_MAGIC, TAG_STATIC, sizeof( zstatic_t ) }, x, Z_TAIL } static const zstatic_t z_static[] = { +#define Z_STATIC( x ) \ + { { Z_MAGIC, TAG_STATIC, q_offsetof( zstatic_t, tail ) + \ + sizeof( uint16_t ) }, x, Z_TAIL } + Z_STATIC( "0" ), Z_STATIC( "1" ), Z_STATIC( "2" ), @@ -509,11 +517,11 @@ static const zstatic_t z_static[] = { Z_STATIC( "8" ), Z_STATIC( "9" ), Z_STATIC( "" ) -}; #undef Z_STATIC +}; -typedef struct zstats_s { +typedef struct { size_t count; size_t bytes; } zstats_t; @@ -830,29 +838,30 @@ Cvar_CopyString ================ */ char *Cvar_CopyString( const char *in ) { - size_t len; + size_t len; zstatic_t *z; + zstats_t *s; + int i; if( !in ) { return NULL; } if( !in[0] ) { - z = ( zstatic_t * )&z_static[10]; - z_stats[TAG_STATIC].count++; - z_stats[TAG_STATIC].bytes += z->z.size; - return z->data; - } - - if( !in[1] && Q_isdigit( in[0] ) ) { - z = ( zstatic_t * )&z_static[ in[0] - '0' ]; - z_stats[TAG_STATIC].count++; - z_stats[TAG_STATIC].bytes += z->z.size; - return z->data; - } + i = 10; + } else if( !in[1] && Q_isdigit( in[0] ) ) { + i = in[0] - '0'; + } else { + len = strlen( in ) + 1; + return memcpy( Z_TagMalloc( len, TAG_CVAR ), in, len ); + } - len = strlen( in ) + 1; - return memcpy( Z_TagMalloc( len, TAG_CVAR ), in, len ); + // return static storage + z = ( zstatic_t * )&z_static[i]; + s = &z_stats[TAG_STATIC]; + s->count++; + s->bytes += z->z.size; + return z->data; } /* @@ -1095,6 +1104,7 @@ void Com_Address_g( genctx_t *ctx ) { void Com_Generic_c( genctx_t *ctx, int argnum ) { xcompleter_t c; xgenerator_t g; + cvar_t *var; char *s; // complete command, alias or cvar name @@ -1110,8 +1120,22 @@ void Com_Generic_c( genctx_t *ctx, int argnum ) { // complete command argument or cvar value if( ( c = Cmd_FindCompleter( s ) ) != NULL ) { c( ctx, argnum ); - } else if( argnum == 1 && ( g = Cvar_FindGenerator( s ) ) != NULL ) { - g( ctx ); + } else if( argnum == 1 && ( var = Cvar_FindVar( s ) ) != NULL ) { + g = var->generator; + if( g ) { + ctx->data = var; + g( ctx ); + } + } +} + +void Com_Color_g( genctx_t *ctx ) { + int color; + + for( color = 0; color < 8; color++ ) { + if( !Prompt_AddMatch( ctx, colorNames[color] ) ) { + break; + } } } @@ -1278,9 +1302,6 @@ void Qcommon_Init( int argc, char **argv ) { // the settings of the config files Com_AddEarlyCommands( qfalse ); - // do not accept CVAR_NOSET variable changes anymore - com_initialized = qtrue; - Sys_Init(); Sys_RunConsole(); @@ -1289,6 +1310,9 @@ void Qcommon_Init( int argc, char **argv ) { Sys_RunConsole(); + // do not accept CVAR_NOSET variable changes anymore + com_initialized = qtrue; + // after FS is initialized, open logfile logfile_active->changed = logfile_active_changed; logfile_flush->changed = logfile_param_changed; diff --git a/source/cvar.c b/source/cvar.c index cf09eca..2d22ea4 100644 --- a/source/cvar.c +++ b/source/cvar.c @@ -43,7 +43,7 @@ Cvar_FindVar */ cvar_t *Cvar_FindVar( const char *var_name ) { cvar_t *var; - int hash; + unsigned hash; hash = Com_HashString( var_name, CVARHASH_SIZE ); @@ -235,6 +235,8 @@ cvar_t *Cvar_Get( const char *var_name, const char *var_value, int flags ) { && strcmp( var_value, var->string ) ) { // reset cvar back to default value + Com_DPrintf( "Cvar '%s' was reset from '%s' to default '%s'\n", + var->name, var->string, var->default_string ); Cvar_UpdateString( var, var_value, CVAR_SET_DIRECT ); } var->flags &= ~CVAR_USER_CREATED; @@ -648,14 +650,19 @@ void Cvar_Command( cvar_t *v ) { static void Cvar_Set_c( genctx_t *ctx, int argnum ) { char *s; + cvar_t *var; xgenerator_t g; if( argnum == 1 ) { Cvar_Variable_g( ctx ); } else if( argnum == 2 ) { s = Cmd_Argv( ctx->argnum - 1 ); - if( ( g = Cvar_FindGenerator( s ) ) != NULL ) { - g( ctx ); + if( ( var = Cvar_FindVar( s ) ) != NULL ) { + g = var->generator; + if( g ) { + ctx->data = var; + g( ctx ); + } } } } @@ -991,7 +998,7 @@ static void Cvar_Inc_f( void ) { return; } - if( !COM_IsNumeric( var->string ) ) { + if( !COM_IsFloat( var->string ) ) { Com_Printf( "\"%s\" is \"%s\", can't %s\n", var->name, var->string, Cmd_Argv( 0 ) ); return; diff --git a/source/files.c b/source/files.c index 88c7684..34a07d5 100644 --- a/source/files.c +++ b/source/files.c @@ -989,11 +989,11 @@ Filenames are relative to the quake search path a null buffer will just return the file length without loading ============ */ -size_t FS_LoadFileEx( const char *path, void **buffer, int flags ) { +size_t FS_LoadFileEx( const char *path, void **buffer, int flags, memtag_t tag ) { fsFile_t *file; fileHandle_t f; byte *buf; - size_t length; + size_t len; if( !path ) { Com_Error( ERR_FATAL, "FS_LoadFile: NULL" ); @@ -1024,31 +1024,45 @@ size_t FS_LoadFileEx( const char *path, void **buffer, int flags ) { file->mode = flags | FS_MODE_READ; // look for it in the filesystem or pack files - length = FS_FOpenFileRead( file, path, qfalse ); - if( length == INVALID_LENGTH ) { - return length; + len = FS_FOpenFileRead( file, path, qfalse ); + if( len == INVALID_LENGTH ) { + return len; } if( buffer ) { #if USE_ZLIB if( file->type == FS_GZIP ) { - length = INVALID_LENGTH; // unknown length + len = INVALID_LENGTH; // unknown length } else #endif { - *buffer = buf = FS_AllocTempMem( length + 1 ); - FS_Read( buf, length, f ); - buf[length] = 0; + if( tag == TAG_FREE ) { + buf = FS_AllocTempMem( len + 1 ); + } else { + buf = Z_TagMalloc( len + 1, tag ); + } + if( FS_Read( buf, len, f ) == len ) { + *buffer = buf; + buf[len] = 0; + } else { + Com_EPrintf( "FS_LoadFile: error reading file: %s\n", path ); + if( tag == TAG_FREE ) { + FS_FreeFile( buf ); + } else { + Z_Free( buf ); + } + len = INVALID_LENGTH; + } } } FS_FCloseFile( f ); - return length; + return len; } size_t FS_LoadFile( const char *path, void **buffer ) { - return FS_LoadFileEx( path, buffer, 0 ); + return FS_LoadFileEx( path, buffer, 0, TAG_FREE ); } void *FS_AllocTempMem( size_t length ) { diff --git a/source/gl_local.h b/source/gl_local.h index 5d91611..d42e908 100644 --- a/source/gl_local.h +++ b/source/gl_local.h @@ -18,7 +18,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#include "config.h" +#include <config.h> #include "qgl_local.h" #include "q_shared.h" #include "q_files.h" diff --git a/source/gl_main.c b/source/gl_main.c index 02b9b74..5c1e7fc 100644 --- a/source/gl_main.c +++ b/source/gl_main.c @@ -542,7 +542,7 @@ static char *screenshot_path( char *buffer, const char *ext ) { // for( i = 0; i < 1000; i++ ) { Com_sprintf( buffer, MAX_OSPATH, SCREENSHOTS_DIRECTORY"/quake%03d%s", i, ext ); - if( fs.LoadFileEx( buffer, NULL, FS_PATH_GAME ) == INVALID_LENGTH ) { + if( fs.LoadFileEx( buffer, NULL, FS_PATH_GAME, TAG_FREE ) == INVALID_LENGTH ) { return buffer; // file doesn't exist } } diff --git a/source/ioapi.c b/source/ioapi.c index 9282aae..d66025b 100644 --- a/source/ioapi.c +++ b/source/ioapi.c @@ -5,7 +5,7 @@ Copyright (C) 1998-2002 Gilles Vollant */ -#include "config.h" +#include <config.h> #include <stdio.h> #include <stdlib.h> diff --git a/source/m_flash.c b/source/m_flash.c index 75e537b..cf14046 100644 --- a/source/m_flash.c +++ b/source/m_flash.c @@ -19,13 +19,13 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ // m_flash.c -#include "config.h" +#include <config.h> #include "q_shared.h" // this file is included in both the game dll and quake2 }, // the game needs it to source shot locations, the client // needs it to position muzzle flashes -vec3_t monster_flash_offset[255] = +const vec3_t monster_flash_offset[255] = { // flash 0 is not used { 0.0, 0.0, 0.0 }, diff --git a/source/mdfour.c b/source/mdfour.c index 320351b..933a02b 100644 --- a/source/mdfour.c +++ b/source/mdfour.c @@ -25,7 +25,7 @@ Boston, MA 02111-1307, USA */ -#include "config.h" +#include <config.h> #include "q_shared.h" #include "mdfour.h" diff --git a/source/mod_ui.rc b/source/mod_ui.rc index 5154c3e..ed36bbd 100644 --- a/source/mod_ui.rc +++ b/source/mod_ui.rc @@ -1,4 +1,4 @@ -#include "config.h" +#include <config.h> #include <windows.h> LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US diff --git a/source/mvd_client.c b/source/mvd_client.c index c5a436d..ba68ec6 100644 --- a/source/mvd_client.c +++ b/source/mvd_client.c @@ -26,8 +26,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "mvd_local.h" #include <setjmp.h> -list_t mvd_channels; -list_t mvd_ready; +LIST_DECL( mvd_channels ); +LIST_DECL( mvd_ready ); + mvd_t mvd_waitingRoom; qboolean mvd_dirty; int mvd_chanid; @@ -227,7 +228,7 @@ static void MVD_EmitGamestate( mvd_t *mvd ) { entity_state_t *es; player_state_t *ps; size_t length; - uint16_t *patch; + uint8_t *patch; int flags, extra, portalbytes; byte portalbits[MAX_MAP_AREAS/8]; @@ -302,7 +303,9 @@ static void MVD_EmitGamestate( mvd_t *mvd ) { // TODO: write private layouts/configstrings - *patch = LittleShort( msg_write.cursize - 2 ); + length = msg_write.cursize - 2; + patch[0] = length & 255; + patch[1] = ( length >> 8 ) & 255; } void MVD_SendGamestate( tcpClient_t *client ) { @@ -806,7 +809,7 @@ mvd_t *MVD_SetChannel( int arg ) { return NULL; } - if( COM_IsNumeric( s ) ) { + if( COM_IsUint( s ) ) { id = atoi( s ); LIST_FOR_EACH( mvd_t, mvd, &mvd_channels, entry ) { if( mvd->id == id ) { @@ -1398,8 +1401,5 @@ void MVD_Register( void ) { mvd_wait_percent = Cvar_Get( "mvd_wait_percent", "50", 0 ); Cmd_Register( c_mvd ); - - List_Init( &mvd_channels ); - List_Init( &mvd_ready ); } diff --git a/source/pmove.c b/source/pmove.c index 331a800..bc6b925 100644 --- a/source/pmove.c +++ b/source/pmove.c @@ -18,7 +18,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#include "config.h" +#include <config.h> #include "com_local.h" diff --git a/source/prompt.c b/source/prompt.c index 2e349b2..8386ef3 100644 --- a/source/prompt.c +++ b/source/prompt.c @@ -124,20 +124,17 @@ static void Prompt_ShowIndividualMatches( } qboolean Prompt_AddMatch( genctx_t *ctx, const char *s ) { - if( ctx->count >= ctx->size ) { - return qfalse; - } - if( !strncmp( ctx->partial, s, ctx->length ) ) { - ctx->matches[ctx->count++] = Z_CopyString( s ); - } - return qtrue; -} + int r; -qboolean Prompt_AddMatchCase( genctx_t *ctx, const char *s ) { if( ctx->count >= ctx->size ) { return qfalse; } - if( !Q_strncasecmp( ctx->partial, s, ctx->length ) ) { + if( ctx->ignorecase ) { + r = Q_strncasecmp( ctx->partial, s, ctx->length ); + } else { + r = strncmp( ctx->partial, s, ctx->length ); + } + if( !r ) { ctx->matches[ctx->count++] = Z_CopyString( s ); } return qtrue; @@ -260,7 +257,8 @@ void Prompt_CompleteCommand( commandPrompt_t *prompt, qboolean backslash ) { for( i = 0; i < ctx.count; i++ ) { sortedMatches[i] = matches[i]; } - qsort( sortedMatches, ctx.count, sizeof( sortedMatches[0] ), SortStrcmp ); + qsort( sortedMatches, ctx.count, sizeof( sortedMatches[0] ), + ctx.ignorecase ? SortStricmp : SortStrcmp ); // copy matching part first = sortedMatches[0]; @@ -268,7 +266,9 @@ void Prompt_CompleteCommand( commandPrompt_t *prompt, qboolean backslash ) { len = 0; do { if( *first != *last ) { - break; + if( !ctx.ignorecase || Q_tolower( *first ) != Q_tolower( *last ) ) { + break; + } } text[len++] = *first; if( len == size - 1 ) { @@ -322,37 +322,27 @@ finish: } void Prompt_CompleteHistory( commandPrompt_t *prompt, qboolean forward ) { - inputField_t *inputLine = &prompt->inputLine; - int i, j, k; - char *s, *text, *first, *last; - size_t len; - char *matches[HISTORY_SIZE], *sortedMatches[HISTORY_SIZE]; - int numMatches = 0; - - text = inputLine->text; - len = strlen( text ); + char *s, *m = NULL; + int i, j; - if( *text != '\\' && *text != '/' ) { - memmove( text + 1, text, len + 1 ); - *text = '\\'; - len++; + if( !prompt->search ) { + s = prompt->inputLine.text; + if( *s == '/' || *s == '\\' ) { + s++; + } + if( !*s ) { + return; + } + prompt->search = Z_CopyString( s ); } if( forward ) { - i = prompt->inputLineNum - HISTORY_SIZE; - if( i < 0 ) { - i = 0; - } - for( ; i < prompt->inputLineNum; i++ ) { + for( i = prompt->historyLineNum + 1; i < prompt->inputLineNum; i++ ) { s = prompt->history[i & HISTORY_MASK]; - if( s && !strncmp( text, s, len ) ) { - for( k = 0; k < numMatches; k++ ) { - if( !strcmp( matches[k], s ) ) { - break; - } - } - if( k == numMatches ) { - matches[numMatches++] = s; + if( s && strstr( s, prompt->search ) ) { + if( strcmp( s, prompt->inputLine.text ) ) { + m = s; + break; } } } @@ -361,57 +351,31 @@ void Prompt_CompleteHistory( commandPrompt_t *prompt, qboolean forward ) { if( j < 0 ) { j = 0; } - for( i = prompt->inputLineNum - 1; i >= j; i-- ) { + for( i = prompt->historyLineNum - 1; i >= j; i-- ) { s = prompt->history[i & HISTORY_MASK]; - if( s && !strncmp( text, s, len ) ) { - for( k = 0; k < numMatches; k++ ) { - if( !strcmp( matches[k], s ) ) { - break; - } - } - if( k == numMatches ) { - matches[numMatches++] = s; + if( s && strstr( s, prompt->search ) ) { + if( strcmp( s, prompt->inputLine.text ) ) { + m = s; + break; } } } } - if( !numMatches ) { - inputLine->cursorPos = len; - return; // nothing found - } - - if( numMatches == 1 ) { - // we have finished completion! - memcpy( text, s, len + 1 ); - inputLine->cursorPos = len; + if( !m ) { return; } - // sort matches alphabethically - for( i = 0; i < numMatches; i++ ) { - sortedMatches[i] = matches[i]; - } - qsort( sortedMatches, numMatches, sizeof( sortedMatches[0] ), SortStrcmp ); - - // copy matching part - first = sortedMatches[0]; - last = sortedMatches[ numMatches - 1 ]; - len = 0; - do { - if( *first != *last ) { - break; - } - text[len++] = *first; - - first++; - last++; - } while( *first ); - - text[len] = 0; - inputLine->cursorPos = len; + prompt->historyLineNum = i; + IF_Replace( &prompt->inputLine, prompt->history[i & HISTORY_MASK] ); +} - Prompt_ShowMatches( prompt, matches, 0, numMatches ); +void Prompt_ClearState( commandPrompt_t *prompt ) { + prompt->tooMany = qfalse; + if( prompt->search ) { + Z_Free( prompt->search ); + prompt->search = NULL; + } } /* @@ -425,7 +389,7 @@ char *Prompt_Action( commandPrompt_t *prompt ) { char *s = prompt->inputLine.text; int i, j; - prompt->tooMany = qfalse; + Prompt_ClearState( prompt ); if( s[0] == 0 || ( ( s[0] == '/' || s[0] == '\\' ) && s[1] == 0 ) ) { IF_Clear( &prompt->inputLine ); return NULL; // empty line @@ -460,6 +424,8 @@ Prompt_HistoryUp void Prompt_HistoryUp( commandPrompt_t *prompt ) { int i; + Prompt_ClearState( prompt ); + if( prompt->historyLineNum == prompt->inputLineNum ) { // save current line in history i = prompt->inputLineNum & HISTORY_MASK; @@ -487,6 +453,8 @@ Prompt_HistoryDown void Prompt_HistoryDown( commandPrompt_t *prompt ) { int i; + Prompt_ClearState( prompt ); + if( prompt->historyLineNum == prompt->inputLineNum ) { return; } @@ -504,6 +472,8 @@ Prompt_Clear */ void Prompt_Clear( commandPrompt_t *prompt ) { int i; + + Prompt_ClearState( prompt ); for( i = 0; i < HISTORY_SIZE; i++ ) { if( prompt->history[i] ) { diff --git a/source/prompt.h b/source/prompt.h index ce0e2d1..33d0426 100644 --- a/source/prompt.h +++ b/source/prompt.h @@ -34,6 +34,7 @@ typedef struct commandPrompt_s { inputField_t inputLine; char *history[HISTORY_SIZE]; + char *search; int widthInChars; qboolean tooMany; @@ -45,6 +46,7 @@ typedef struct commandPrompt_s { void Prompt_Init( void ); void Prompt_CompleteCommand( commandPrompt_t *prompt, qboolean backslash ); void Prompt_CompleteHistory( commandPrompt_t *prompt, qboolean forward ); +void Prompt_ClearState( commandPrompt_t *prompt ); char *Prompt_Action( commandPrompt_t *prompt ); void Prompt_HistoryUp( commandPrompt_t *prompt ); void Prompt_HistoryDown( commandPrompt_t *prompt ); diff --git a/source/q2pro.rc b/source/q2pro.rc index 8047518..ef5ff27 100644 --- a/source/q2pro.rc +++ b/source/q2pro.rc @@ -1,4 +1,4 @@ -#include "config.h" +#include <config.h> #include <windows.h> LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US diff --git a/source/q2proded.rc b/source/q2proded.rc index 878b095..0f4e8a3 100644 --- a/source/q2proded.rc +++ b/source/q2proded.rc @@ -1,4 +1,4 @@ -#include "config.h" +#include <config.h> #include <windows.h> LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US diff --git a/source/q_field.c b/source/q_field.c index 7400434..664448f 100644 --- a/source/q_field.c +++ b/source/q_field.c @@ -22,7 +22,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // field.c // -#include "config.h" +#include <config.h> #include "q_shared.h" #include "com_public.h" #include "key_public.h" diff --git a/source/q_msg.c b/source/q_msg.c index 69bb044..d78fb25 100644 --- a/source/q_msg.c +++ b/source/q_msg.c @@ -18,7 +18,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#include "config.h" +#include <config.h> #include "q_shared.h" #include "com_public.h" #include "protocol.h" diff --git a/source/q_shared.c b/source/q_shared.c index 4d830f7..2e6b523 100644 --- a/source/q_shared.c +++ b/source/q_shared.c @@ -18,7 +18,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#include "config.h" +#include <config.h> #include "q_shared.h" static const char hexchars[] = "0123456789ABCDEF"; @@ -846,51 +846,61 @@ void COM_AppendExtension( char *path, const char *extension, int pathSize ) { /* ================== -COM_IsNumeric +COM_IsFloat Returns true if the given string is valid representation -of floating point or integer number. +of floating point number. ================== */ -qboolean COM_IsNumeric( const char *string ) { - int c; +qboolean COM_IsFloat( const char *s ) { + int c, dot = '.'; - if( !string ) { + if( *s == '-' ) { + s++; + } + if( !*s ) { return qfalse; } - if( !*string ) { + do { + c = *s++; + if( c == dot ) { + dot = 0; + } else if( !Q_isdigit( c ) ) { + return qfalse; + } + } while( *s ); + + return qtrue; +} + +qboolean COM_IsUint( const char *s ) { + int c; + + if( !*s ) { return qfalse; } do { - c = *string++; - if( Q_isdigit( c ) ) { - continue; - } - if( c != '-' && c != '.' && c != ' ' ) { + c = *s++; + if( !Q_isdigit( c ) ) { return qfalse; } - } while( *string ); + } while( *s ); return qtrue; - } -qboolean COM_HasSpaces( const char *string ) { - while( *string ) { - if( *string <= 32 ) { +qboolean COM_HasSpaces( const char *s ) { + while( *s ) { + if( *s <= 32 ) { return qtrue; } - string++; + s++; } return qfalse; } -/* Parses hexadecimal number until it encounters - * illegible symbol or end of string. - * Does not check for overflow. - */ unsigned COM_ParseHex( const char *s ) { int c; unsigned result; @@ -899,24 +909,80 @@ unsigned COM_ParseHex( const char *s ) { if( ( c = Q_charhex( *s ) ) == -1 ) { break; } + if( result & ~( UINT_MAX >> 4 ) ) { + return UINT_MAX; + } result = c | ( result << 4 ); } return result; } +qboolean COM_ParseColor( const char *s, color_t color ) { + int i; + int c[8]; + + if( *s == '#' ) { + s++; + for( i = 0; s[i]; i++ ) { + c[i] = Q_charhex( s[i] ); + if( c[i] == -1 ) { + return qfalse; + } + } + switch( i ) { + case 3: + color[0] = c[0] | ( c[0] << 4 ); + color[1] = c[1] | ( c[1] << 4 ); + color[2] = c[2] | ( c[2] << 4 ); + color[3] = 255; + break; + case 6: + color[0] = c[1] | ( c[0] << 4 ); + color[1] = c[3] | ( c[2] << 4 ); + color[2] = c[5] | ( c[4] << 4 ); + color[3] = 255; + break; + case 8: + color[0] = c[1] | ( c[0] << 4 ); + color[1] = c[3] | ( c[2] << 4 ); + color[2] = c[5] | ( c[4] << 4 ); + color[3] = c[7] | ( c[6] << 4 ); + break; + default: + return qfalse; + } + return qtrue; + } else { + for( i = 0; i < 8; i++ ) { + if( !strcmp( colorNames[i], s ) ) { + *( uint32_t * )color = *( uint32_t * )colorTable[i]; + return qtrue; + } + } + return qfalse; + } +} + /* ================= SortStrcmp ================= */ int QDECL SortStrcmp( const void *p1, const void *p2 ) { - const char *s1 = *(const char **)p1; - const char *s2 = *(const char **)p2; + const char *s1 = *( const char ** )p1; + const char *s2 = *( const char ** )p2; return strcmp( s1, s2 ); } +int QDECL SortStricmp( const void *p1, const void *p2 ) { + const char *s1 = *( const char ** )p1; + const char *s2 = *( const char ** )p2; + + return Q_stricmp( s1, s2 ); +} + /* ================= Com_WildCmp @@ -1194,51 +1260,64 @@ char *Q_FormatString( const char *string ) { return buffer; } +#if 0 + +typedef enum { + ESC_CHR = ( 1 << 0 ), + ESC_CLR = ( 1 << 1 ) +} escape_t; + /* ================ Q_UnescapeString ================ */ -char *Q_UnescapeString( const char *string ) { - static char buffer[MAX_STRING_CHARS]; +size_t Q_UnescapeString( char *out, const char *in, size_t bufsize, escape_t flags ) { char *dst, *last; int c; - dst = buffer; - last = buffer + MAX_STRING_CHARS - 1; - while( *string && dst != last ) { - c = *string++; - - if( c != '\\' ) { - *dst++ = c; - continue; - } + if( bufsize < 1 ) { + Com_Error( ERR_FATAL, "%s: bad bufsize: %d", __func__, bufsize ); + } - c = *string++; - if( c == 0 ) { - break; - } - switch( c ) { - case 't': - c = '\t'; - break; - case 'b': - c = '\b'; - break; - case 'r': - c = '\r'; - break; - case 'n': - c = '\n'; - break; - case '\\': - c = '\\'; - break; - default: - break; - } + p = out; + m = out + bufsize - 1; + while( *in && p < m ) { + c = *in++; + + if( ( flags & ESC_CHR ) && c == '\\' ) { + c = *in++; + switch( c ) { + case 0: + goto breakOut; + case 't': + c = '\t'; + break; + case 'b': + c = '\b'; + break; + case 'r': + c = '\r'; + break; + case 'n': + c = '\n'; + break; + case '\\': + c = '\\'; + break; + case 'x': + if( ( c = Q_charhex( in[0] ) ) == -1 ) { + goto breakOut; + } + result = c | ( r << 4 ); + } + break; + default: + break; + } - *dst++ = c; + *p++ = c; + } } *dst = 0; @@ -1246,6 +1325,7 @@ char *Q_UnescapeString( const char *string ) { return buffer; } +#endif int Q_EscapeMarkup( char *out, const char *in, int bufsize ) { char *p, *m, *s; diff --git a/source/q_shared.h b/source/q_shared.h index 197ef8f..625daef 100644 --- a/source/q_shared.h +++ b/source/q_shared.h @@ -27,8 +27,11 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include <string.h> #include <stdlib.h> #include <stdint.h> +#include <limits.h> #include <time.h> +#if HAVE_ENDIAN_H #include <endian.h> +#endif #ifdef __GNUC__ @@ -153,7 +156,7 @@ typedef vec_t vec5_t[5]; typedef float mat4_t[16]; -typedef byte color_t[4]; +typedef unsigned char color_t[4]; typedef int fixed4_t; typedef int fixed8_t; @@ -473,8 +476,9 @@ void COM_DefaultExtension( char *path, const char *extension, int pathSize ); void COM_AppendExtension( char *path, const char *extension, int pathSize ); char *COM_FileExtension( const char *in ); -qboolean COM_IsNumeric( const char *string ); -qboolean COM_HasSpaces( const char *string ); +qboolean COM_IsFloat( const char *s ); +qboolean COM_IsUint( const char *s ); +qboolean COM_HasSpaces( const char *s ); char *COM_SimpleParse( const char **data_p, int *length ); char *COM_Parse( const char **data_p ); @@ -483,6 +487,7 @@ int COM_Compress( char *data ); int Com_WildCmp( const char *filter, const char *string, qboolean ignoreCase ); int QDECL SortStrcmp( const void *p1, const void *p2 ); +int QDECL SortStricmp( const void *p1, const void *p2 ); unsigned Com_HashString( const char *string, int hashSize ); unsigned Com_HashPath( const char *string, int hashSize ); @@ -497,6 +502,7 @@ size_t Q_vsnprintf( char *dest, size_t destsize, const char *fmt, va_list argptr void Com_PageInMemory (void *buffer, int size); unsigned COM_ParseHex( const char *string ); +qboolean COM_ParseColor( const char *s, color_t color ); char *va( const char *format, ... ) q_printf( 1, 2 ); @@ -1222,7 +1228,7 @@ typedef struct // ROGUE -extern vec3_t monster_flash_offset []; +extern const vec3_t monster_flash_offset []; // temp entity events diff --git a/source/q_uis.c b/source/q_uis.c index 5fac151..26d4801 100644 --- a/source/q_uis.c +++ b/source/q_uis.c @@ -22,7 +22,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // ui_shared.c - basic UI support for client modules // -#include "config.h" +#include <config.h> #include "q_shared.h" #include "com_public.h" #include "ref_public.h" diff --git a/source/qgl_api.c b/source/qgl_api.c index 3eb3298..122a45b 100644 --- a/source/qgl_api.c +++ b/source/qgl_api.c @@ -28,7 +28,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** QGL_Shutdown() - unloads libraries, NULLs function pointers */ -#include "config.h" +#include <config.h> #include "qgl_local.h" #include "q_shared.h" #include "com_public.h" diff --git a/source/r_bsp.c b/source/r_bsp.c index 82d2372..2c10438 100644 --- a/source/r_bsp.c +++ b/source/r_bsp.c @@ -22,7 +22,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // r_bsp.c -- map loading functions common for both renderers // -#include "config.h" +#include <config.h> #include "q_shared.h" #include "com_public.h" #include "q_files.h" @@ -589,7 +589,7 @@ void Bsp_LoadWorld( const char *path ) { byte *data; size_t length, endpos; - length = fs.LoadFileEx( path, ( void ** )&data, FS_FLAG_CACHE ); + length = fs.LoadFileEx( path, ( void ** )&data, FS_FLAG_CACHE, TAG_FREE ); if( !data ) { Com_Error( ERR_DROP, "%s: couldn't load %s", __func__, path ); } diff --git a/source/ref_gl.rc b/source/ref_gl.rc index 4571ad5..09ac880 100644 --- a/source/ref_gl.rc +++ b/source/ref_gl.rc @@ -1,4 +1,4 @@ -#include "config.h" +#include <config.h> #include <windows.h> LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US diff --git a/source/ref_soft.rc b/source/ref_soft.rc index af603e8..d355539 100644 --- a/source/ref_soft.rc +++ b/source/ref_soft.rc @@ -1,4 +1,4 @@ -#include "config.h" +#include <config.h> #include <windows.h> LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US diff --git a/source/snd_main.c b/source/snd_main.c index 2e72247..48317f5 100644 --- a/source/snd_main.c +++ b/source/snd_main.c @@ -312,7 +312,9 @@ void S_Shutdown( void ) { void S_Activate( qboolean active ) { if( sound_started ) { - S_StopAllSounds(); +#ifdef _WIN32 + S_StopAllSounds(); // FIXME +#endif snddma.Activate( active ); } } diff --git a/source/snd_oss.c b/source/snd_oss.c index 182cb38..10b092f 100644 --- a/source/snd_oss.c +++ b/source/snd_oss.c @@ -106,7 +106,7 @@ static sndinitstat_t OSS_Init ( void ) { break; } if ( i == sizeof ( tryrates ) / 4 ) { - Com_WPrintf ( "%s supports no valid bitrates", snddevice->string ); + Com_WPrintf ( "%s supports no valid bitrates\n", snddevice->string ); goto fail; } dma.speed = tryrates[i]; @@ -121,7 +121,7 @@ static sndinitstat_t OSS_Init ( void ) { tmp = 1; rc = ioctl ( audio_fd, SNDCTL_DSP_STEREO, &tmp ); if ( rc < 0 ) { - Com_WPrintf ( "Could not set %s to %d channels: %s", snddevice->string, + Com_WPrintf ( "Could not set %s to %d channels: %s\n", snddevice->string, dma.channels, strerror ( errno ) ); goto fail; } @@ -132,7 +132,7 @@ static sndinitstat_t OSS_Init ( void ) { rc = ioctl ( audio_fd, SNDCTL_DSP_SPEED, &dma.speed ); if ( rc < 0 ) { - Com_WPrintf ( "Could not set %s speed to %d: %s", snddevice->string, + Com_WPrintf ( "Could not set %s speed to %d: %s\n", snddevice->string, dma.speed, strerror ( errno ) ); goto fail; } @@ -152,7 +152,7 @@ static sndinitstat_t OSS_Init ( void ) { goto fail; } } else { - Com_WPrintf ( "%d-bit sound not supported.", dma.samplebits ); + Com_WPrintf ( "%d-bit sound not supported.\n", dma.samplebits ); goto fail; } diff --git a/source/sv_ac.c b/source/sv_ac.c index d01eae8..fae15df 100644 --- a/source/sv_ac.c +++ b/source/sv_ac.c @@ -131,8 +131,8 @@ typedef struct { static ac_locals_t ac; static ac_static_t acs; -static list_t ac_required_list; -static list_t ac_exempt_list; +static LIST_DECL( ac_required_list ); +static LIST_DECL( ac_exempt_list ); static byte ac_send_buffer[AC_SEND_SIZE]; static byte ac_recv_buffer[AC_RECV_SIZE]; @@ -1466,7 +1466,7 @@ void AC_Info_f( void ) { substring = Cmd_Argv( 1 ); filesubstring = Cmd_Argv( 2 ); - if( COM_IsNumeric( substring ) ) { + if( COM_IsUint( substring ) ) { clientID = atoi( substring ); if( clientID < 0 || clientID >= sv_maxclients->integer ) { Com_Printf( "Invalid client ID.\n" ); @@ -1609,9 +1609,6 @@ void AC_Register( void ) { ac_disable_play->changed = ac_disable_play_changed; Cmd_Register( c_ac ); - - List_Init( &ac_required_list ); - List_Init( &ac_exempt_list ); } diff --git a/source/sv_ccmds.c b/source/sv_ccmds.c index 6380ddf..2031639 100644 --- a/source/sv_ccmds.c +++ b/source/sv_ccmds.c @@ -121,7 +121,6 @@ Sets sv_client and sv_player to the player with idnum Cmd_Argv(1) */ static qboolean SV_SetPlayer( void ) { client_t *cl; - int i; int idnum; char *s; @@ -130,13 +129,14 @@ static qboolean SV_SetPlayer( void ) { return qfalse; } + // allow numeric value escape + if( *s == '\\' ) { + s++; + goto namecmp; + } + // numeric values are just slot numbers - for( i = 0; s[i]; i++ ) { - if( !Q_isdigit( s[i] ) ) { - break; - } - } - if( !s[i] ) { + if( COM_IsUint( s ) ) { idnum = atoi( s ); if( idnum < 0 || idnum >= sv_maxclients->integer ) { Com_Printf( "Bad client slot: %i\n", idnum ); @@ -152,6 +152,7 @@ static qboolean SV_SetPlayer( void ) { return qtrue; } +namecmp: // check for a name match FOR_EACH_CLIENT( cl ) { if( !strcmp( cl->name, s ) ) { @@ -231,6 +232,39 @@ static void SV_Map_c( genctx_t *ctx, int argnum ) { } } +static void SV_DumpEnts_f( void ) { + cmcache_t *c = sv.cm.cache; + fileHandle_t f; + char *s, buffer[MAX_QPATH]; + + if( !c || !c->entitystring ) { + Com_Printf( "No map loaded.\n" ); + return; + } + + if( Cmd_Argc() != 2 ) { + Com_Printf( "Usage: %s <entname>\n", Cmd_Argv( 0 ) ); + return; + } + + s = Cmd_Argv( 1 ); + if( *s == '/' ) { + Q_strncpyz( buffer, s + 1, sizeof( buffer ) ); + } else { + Q_concat( buffer, sizeof( buffer ), "maps/", s, NULL ); + COM_AppendExtension( buffer, ".ent", sizeof( buffer ) ); + } + + FS_FOpenFile( buffer, &f, FS_MODE_WRITE ); + if( f ) { + FS_Write( c->entitystring, c->numEntityChars, f ); + FS_FCloseFile( f ); + Com_Printf( "Dumped entity string to %s\n", buffer ); + } else { + Com_Printf( "Failed to dump entity string to %s\n", buffer ); + } +} + //=============================================================== /* @@ -919,6 +953,7 @@ static const cmdreg_t c_server[] = { { "map", SV_Map_f, SV_Map_c }, { "demomap", SV_DemoMap_f }, { "gamemap", SV_GameMap_f, SV_Map_c }, + { "dumpents", SV_DumpEnts_f }, { "setmaster", SV_SetMaster_f }, { "killserver", SV_KillServer_f }, { "sv", SV_ServerCommand_f }, diff --git a/source/sv_game.c b/source/sv_game.c index 9a12d2a..db1b72a 100644 --- a/source/sv_game.c +++ b/source/sv_game.c @@ -795,22 +795,21 @@ void SV_InitGameProgs ( void ) { if( !entry ) #endif { - // try refdir first for development purposes - Q_concat( path, sizeof( path ), sys_refdir->string, - PATH_SEP_STRING GAMELIB, NULL ); - entry = Sys_LoadLibrary( path, "GetGameAPI", &game_library ); + // try gamedir first + if( fs_game->string[0] ) { + Q_concat( path, sizeof( path ), sys_libdir->string, + PATH_SEP_STRING, fs_game->string, PATH_SEP_STRING GAMELIB, NULL ); + entry = Sys_LoadLibrary( path, "GetGameAPI", &game_library ); + } if( !entry ) { - // try gamedir - if( fs_game->string[0] ) { - Q_concat( path, sizeof( path ), sys_libdir->string, - PATH_SEP_STRING, fs_game->string, PATH_SEP_STRING GAMELIB, NULL ); - entry = Sys_LoadLibrary( path, "GetGameAPI", &game_library ); - } - + // then try baseq2 + Q_concat( path, sizeof( path ), sys_libdir->string, + PATH_SEP_STRING BASEGAME PATH_SEP_STRING GAMELIB, NULL ); + entry = Sys_LoadLibrary( path, "GetGameAPI", &game_library ); if( !entry ) { - // try baseq2 - Q_concat( path, sizeof( path ), sys_libdir->string, - PATH_SEP_STRING BASEGAME PATH_SEP_STRING GAMELIB, NULL ); + // then try to fall back to refdir + Q_concat( path, sizeof( path ), sys_refdir->string, + PATH_SEP_STRING GAMELIB, NULL ); entry = Sys_LoadLibrary( path, "GetGameAPI", &game_library ); if( !entry ) { Com_Error( ERR_DROP, "Failed to load game DLL" ); diff --git a/source/sv_main.c b/source/sv_main.c index a046439..425d14c 100644 --- a/source/sv_main.c +++ b/source/sv_main.c @@ -135,7 +135,7 @@ void SV_CleanClient( client_t *client ) { #endif if( client->download ) { - FS_FreeFile( client->download ); + Z_Free( client->download ); client->download = NULL; } diff --git a/source/sv_mvd.c b/source/sv_mvd.c index 535a0ba..446a7fe 100644 --- a/source/sv_mvd.c +++ b/source/sv_mvd.c @@ -660,7 +660,7 @@ static void SV_MvdEmitGamestate( void ) { player_state_t *ps; entity_state_t *es; size_t length; - uint16_t *patch; + uint8_t *patch; int flags, extra, portalbytes; byte portalbits[MAX_MAP_AREAS/8]; @@ -731,7 +731,9 @@ static void SV_MvdEmitGamestate( void ) { } MSG_WriteShort( 0 ); - *patch = LittleShort( msg_write.cursize - 2 ); + length = msg_write.cursize - 2; + patch[0] = length & 255; + patch[1] = ( length >> 8 ) & 255; } void SV_MvdClientNew( tcpClient_t *client ) { diff --git a/source/sv_user.c b/source/sv_user.c index 38a9807..ebe3137 100644 --- a/source/sv_user.c +++ b/source/sv_user.c @@ -146,7 +146,7 @@ static void write_compressed_gamestate( void ) { entity_state_t *base; int i, j; size_t length; - uint16_t *patch; + uint8_t *patch; char *string; MSG_WriteByte( svc_gamestate ); @@ -204,7 +204,8 @@ static void write_compressed_gamestate( void ) { sv_client->name, svs.z.total_in, svs.z.total_out ); } - *patch = LittleShort( svs.z.total_out ); + patch[0] = svs.z.total_out & 255; + patch[1] = ( svs.z.total_out >> 8 ) & 255; buf->cursize += svs.z.total_out; } @@ -531,7 +532,7 @@ static void SV_NextDownload_f( void ) { MSG_WriteData( sv_client->download + sv_client->downloadcount - r, r ); if( sv_client->downloadcount == sv_client->downloadsize ) { - FS_FreeFile( sv_client->download ); + Z_Free( sv_client->download ); sv_client->download = NULL; } @@ -615,7 +616,7 @@ static void SV_BeginDownload_f( void ) { filename = name; - downloadsize = FS_LoadFileEx( filename, NULL, FS_FLAG_RAW ); + downloadsize = FS_LoadFileEx( filename, NULL, FS_FLAG_RAW, TAG_SERVER ); if( downloadsize == INVALID_LENGTH || downloadsize == 0 // special check for maps, if it came from a pak file, don't allow @@ -648,7 +649,8 @@ static void SV_BeginDownload_f( void ) { return; } - sv_client->downloadsize = FS_LoadFileEx( filename, ( void ** )&sv_client->download, FS_FLAG_RAW ); + sv_client->downloadsize = FS_LoadFileEx( filename, + ( void ** )&sv_client->download, FS_FLAG_RAW, TAG_SERVER ); sv_client->downloadcount = offset; Com_DPrintf( "Downloading %s to %s\n", name, sv_client->name ); @@ -676,7 +678,7 @@ static void SV_StopDownload_f( void ) { SV_ClientAddMessage( sv_client, MSG_RELIABLE|MSG_CLEAR ); Com_DPrintf( "Download for %s stopped by user request\n", sv_client->name ); - FS_FreeFile( sv_client->download ); + Z_Free( sv_client->download ); sv_client->download = NULL; } @@ -935,7 +937,7 @@ static void SV_NewClientExecuteMove( int c, int net_drop ) { numDups = c >> SVCMD_BITS; c &= SVCMD_MASK; - if( numDups > MAX_PACKET_FRAMES - 1 ) { + if( numDups >= MAX_PACKET_FRAMES ) { SV_DropClient( sv_client, "too many frames in packet" ); return; } diff --git a/source/sv_world.c b/source/sv_world.c index ca0a039..52c6b8b 100644 --- a/source/sv_world.c +++ b/source/sv_world.c @@ -113,7 +113,7 @@ void SV_ClearWorld( void ) { SV_CreateAreaNode( 0, cm->mins, cm->maxs ); } - /* make sure all entities are unlinked */ + // make sure all entities are unlinked for( i = 0; i < MAX_EDICTS; i++ ) { ent = EDICT_NUM( i ); ent->area.prev = ent->area.next = NULL; @@ -475,8 +475,7 @@ SV_ClipMoveToEntities ==================== */ -void SV_ClipMoveToEntities ( moveclip_t *clip ) -{ +static void SV_ClipMoveToEntities( moveclip_t *clip ) { int i, num; edict_t *touchlist[MAX_EDICTS], *touch; trace_t trace; @@ -515,16 +514,7 @@ void SV_ClipMoveToEntities ( moveclip_t *clip ) clip->mins, clip->maxs, headnode, clip->contentmask, touch->s.origin, touch->s.angles); - clip->trace->allsolid |= trace.allsolid; - clip->trace->startsolid |= trace.startsolid; - if( trace.fraction < clip->trace->fraction ) { - clip->trace->fraction = trace.fraction; - VectorCopy( trace.endpos, clip->trace->endpos ); - clip->trace->plane = trace.plane; - clip->trace->surface = trace.surface; - clip->trace->contents |= trace.contents; - clip->trace->ent = touch; - } + CM_ClipEntity( clip->trace, &trace, touch ); } } diff --git a/source/sys_unix.c b/source/sys_unix.c index 2f48063..293f2ca 100644 --- a/source/sys_unix.c +++ b/source/sys_unix.c @@ -73,8 +73,6 @@ static struct termios tty_orig; static commandPrompt_t tty_prompt; static int tty_hidden; -void Sys_Printf( const char *fmt, ... ); - /* =============================================================================== @@ -150,6 +148,8 @@ static void Sys_InitTTY( void ) { #endif tty_prompt.printf = Sys_Printf; tty_enabled = qtrue; + + Sys_ConsoleWrite( " ", 1 ); } static void Sys_ShutdownTTY( void ) { @@ -727,19 +727,17 @@ void Sys_AddDefaultConfig( void ) { struct stat st; char *text; - if( stat( DEFCFG, &st ) == -1 ) { - return; - } - fp = fopen( DEFCFG, "r" ); if( !fp ) { return; } - Com_Printf( "Execing " DEFCFG "\n" ); - text = Cbuf_Alloc( &cmd_buffer, st.st_size ); - if( text ) { - fread( text, st.st_size, 1, fp ); + if( fstat( fileno( fp ), &st ) == 0 ) { + text = Cbuf_Alloc( &cmd_buffer, st.st_size ); + if( text ) { + Com_Printf( "Execing " DEFCFG "\n" ); + fread( text, st.st_size, 1, fp ); + } } fclose( fp ); @@ -748,8 +746,8 @@ void Sys_AddDefaultConfig( void ) { void Sys_Sleep( int msec ) { struct timespec req; - req.tv_sec = msec / 1000; msec %= 1000; - req.tv_nsec = msec * 1000000; + req.tv_sec = msec / 1000; + req.tv_nsec = ( msec % 1000 ) * 1000000; nanosleep( &req, NULL ); } diff --git a/source/sys_win.c b/source/sys_win.c index 06d6ebd..b1c4c09 100644 --- a/source/sys_win.c +++ b/source/sys_win.c @@ -631,7 +631,7 @@ MISC static inline time_t Sys_FileTimeToUnixTime( FILETIME *f ) { ULARGE_INTEGER u = *( ULARGE_INTEGER * )f; - return ( time_t )( ( u.QuadPart - 116444736000000000U ) / 10000000 ); + return ( time_t )( ( u.QuadPart - 116444736000000000ULL ) / 10000000 ); } unsigned Sys_Milliseconds( void ) { diff --git a/source/ui_menu.c b/source/ui_menu.c index 44795a8..510f037 100644 --- a/source/ui_menu.c +++ b/source/ui_menu.c @@ -575,20 +575,21 @@ MenuList_Key ================= */ static int MenuList_Key( menuList_t *l, int key ) { - int i; + //int i; if( !l->items ) { return QMS_NOTHANDLED; } - if( keys.IsDown( K_CTRL ) && key >= '1' && key <= '9' ) { - int col = key - '0' - 1; + if( keys.IsDown( K_ALT ) && Q_isdigit( key ) ) { + int col = key == '0' ? 9 : key - '0' - 1; if( l->sortdir && col < l->numcolumns ) { return MenuList_SetColumn( l, col ); } return QMS_NOTHANDLED; } +#if 0 if( key > 32 && key < 127 ) { if( uis.realtime > l->scratchTime + 1300 ) { l->scratchCount = 0; @@ -620,11 +621,13 @@ static int MenuList_Key( menuList_t *l, int key ) { return QMS_NOTHANDLED; } +#endif l->scratchCount = 0; switch( key ) { case K_LEFTARROW: + case 'h': if( l->sortdir ) { if( l->sortcol > 0 ) { return MenuList_SetColumn( l, l->sortcol - 1 ); @@ -633,6 +636,7 @@ static int MenuList_Key( menuList_t *l, int key ) { } break; case K_RIGHTARROW: + case 'l': if( l->sortdir ) { if( l->sortcol < l->numcolumns - 1 ) { return MenuList_SetColumn( l, l->sortcol + 1 ); @@ -642,6 +646,7 @@ static int MenuList_Key( menuList_t *l, int key ) { break; case K_UPARROW: case K_KP_UPARROW: + case 'k': if( l->curvalue > 0 ) { l->curvalue--; UI_CALLBACK( l, QM_CHANGE, l->curvalue ); @@ -652,6 +657,7 @@ static int MenuList_Key( menuList_t *l, int key ) { case K_DOWNARROW: case K_KP_DOWNARROW: + case 'j': if( l->curvalue < l->numItems - 1 ) { l->curvalue++; UI_CALLBACK( l, QM_CHANGE, l->curvalue ); diff --git a/source/ui_multiplayer.c b/source/ui_multiplayer.c index 61aa0f5..7139c66 100644 --- a/source/ui_multiplayer.c +++ b/source/ui_multiplayer.c @@ -58,9 +58,7 @@ typedef struct m_joinServer_s { static m_joinServer_t m_join; static void UpdateSelection( void ) { - serverSlot_t *s; - - s = &m_join.servers[m_join.list.curvalue]; + serverSlot_t *s = &m_join.servers[m_join.list.curvalue]; if( s->valid ) { m_join.info.generic.flags &= ~QMF_HIDDEN; @@ -108,7 +106,7 @@ static void ClearSlot( serverSlot_t *slot ) { void UI_AddToServerList( const serverStatus_t *status ) { serverSlot_t *slot; - int i, j; + int i, j, k; char *host, *map; const char *info = status->infostring; char key[MAX_STRING_CHARS]; @@ -149,10 +147,19 @@ void UI_AddToServerList( const serverStatus_t *status ) { map = Info_ValueForKey( info, "mapname" ); if( !map[0] ) { map = "???"; + } else { + Com_sprintf( value, sizeof( value ), "maps/%s.bsp", map ); + if( fs.LoadFile( value, NULL ) == INVALID_LENGTH ) { + Q_concat( value, sizeof( value ), S_COLOR_RED, map, NULL ); + map = value; + } } j = atoi( Info_ValueForKey( info, "maxclients" ) ); - Com_sprintf( key, sizeof( key ), "%d/%d", status->numPlayers, j ); + k = atoi( Info_ValueForKey( info, "needpass" ) ); + Com_sprintf( key, sizeof( key ), "%s%d/%d", + status->numPlayers < j ? k > 0 ? S_COLOR_YELLOW : "" : S_COLOR_RED, + status->numPlayers, j ); if( m_join.names[i] ) { com.Free( m_join.names[i] ); @@ -180,25 +187,25 @@ void UI_AddToServerList( const serverStatus_t *status ) { slot->valid = qtrue; - UpdateSelection(); + UpdateSelection(); } static void PingSelected( void ) { - serverSlot_t *slot = &m_join.servers[m_join.list.curvalue]; + serverSlot_t *s = &m_join.servers[m_join.list.curvalue]; if( m_join.names[m_join.list.curvalue] ) { com.Free( m_join.names[m_join.list.curvalue] ); } m_join.names[m_join.list.curvalue] = UI_FormatColumns( 0, - slot->address, "???", "?/?", NULL ); + s->address, "???", "?/?", NULL ); - ClearSlot( slot ); + ClearSlot( s ); UpdateSelection(); m_join.menu.statusbar = "Pinging servers, please wait..."; client.UpdateScreen(); - client.SendStatusRequest( slot->realAddress, 0 ); + client.SendStatusRequest( s->realAddress, 0 ); UpdateSelection(); } @@ -325,51 +332,47 @@ static void Resize( void ) { } static int JoinServer_MenuCallback( int id, int msg, int param ) { + serverSlot_t *s = &m_join.servers[m_join.list.curvalue]; + switch( msg ) { case QM_ACTIVATE: - if( id != ID_LIST ) { - break; - } - cmd.ExecuteText( EXEC_APPEND, va( "connect \"%s\"\n", - m_join.servers[m_join.list.curvalue].realAddress ) ); - UI_PopMenu(); - return QMS_IN; - + if( id == ID_LIST ) { + cmd.ExecuteText( EXEC_APPEND, + va( "connect \"%s\"\n", s->realAddress ) ); + UI_PopMenu(); + return QMS_IN; + } + break; case QM_KEY: if( param == 'r' ) { - cvar.Set( "rcon_address", m_join.servers[m_join.list.curvalue].realAddress ); - break; + cvar.Set( "rcon_address", s->realAddress ); + return QMS_SILENT; } - if( param != 32 ) { - break; - } - if( !keys.IsDown( K_ALT ) ) { - PingSelected(); - } else { - PingServers(); + if( param == ' ' ) { + if( !keys.IsDown( K_ALT ) ) { + PingSelected(); + } else { + PingServers(); + } + return QMS_SILENT; } - return QMS_SILENT; - + break; case QM_CHANGE: - if( id != ID_LIST ) { - break; - } - UpdateSelection(); - return QMS_MOVE; - + if( id == ID_LIST ) { + UpdateSelection(); + return QMS_MOVE; + } + break; case QM_DESTROY: FreeListedServers(); break; - case QM_DESTROY_CHILD: FreeListedServers(); AddUnlistedServers(); break; - case QM_SIZE: Resize(); break; - default: break; } diff --git a/source/vid_sdl.c b/source/vid_sdl.c index ee15282..7e48223 100644 --- a/source/vid_sdl.c +++ b/source/vid_sdl.c @@ -80,7 +80,7 @@ static qboolean QSDL_SetMode( int flags, int forcedepth ) { sdl.flags |= QVF_FULLSCREEN; goto success; } - Com_EPrintf( "FS video mode failed: %s\n", SDL_GetError() ); + Com_EPrintf( "Fullscreen video mode failed: %s\n", SDL_GetError() ); Cvar_Set( "vid_fullscreen", "0" ); } @@ -99,6 +99,13 @@ success: return qtrue; } +static void QSDL_Activate( SDL_Event *event ) { + // state is actually a bitmask! + if( event->active.state & SDL_APPACTIVE ) { + CL_AppActivate( event->active.gain ? qtrue : qfalse ); + } +} + void Video_ModeChanged( void ) { SDL_Event event; @@ -106,8 +113,17 @@ void Video_ModeChanged( void ) { Com_Error( ERR_FATAL, "Couldn't change video mode: %s", SDL_GetError() ); } - while( SDL_PollEvent( &event ) ) - ; + // ignore any pending resize events + while( SDL_PollEvent( &event ) ) { + switch( event.type ) { + case SDL_ACTIVEEVENT: + QSDL_Activate( &event ); + break; + case SDL_QUIT: + Com_Quit(); + break; + } + } } static qboolean QSDL_InitVideo( void ) { @@ -319,20 +335,11 @@ void Video_PumpEvents( void ) { while( SDL_PollEvent( &event ) ) { switch( event.type ) { case SDL_ACTIVEEVENT: - // state is actually a bitmask! - if( event.active.state & SDL_APPACTIVE ) { - if( event.active.gain ) { - CL_AppActivate( qtrue ); - } else { - CL_AppActivate( qfalse ); - } - } + QSDL_Activate( &event ); break; - case SDL_QUIT: Com_Quit(); break; - case SDL_VIDEORESIZE: if( sdl.surface->flags & SDL_RESIZABLE ) { event.resize.w &= ~7; @@ -343,19 +350,15 @@ void Video_PumpEvents( void ) { return; } break; - case SDL_KEYDOWN: QSDL_KeyEvent( &event.key.keysym, qtrue ); break; - case SDL_KEYUP: QSDL_KeyEvent( &event.key.keysym, qfalse ); break; - case SDL_MOUSEBUTTONDOWN: QSDL_MouseButtonEvent( event.button.button, qtrue ); break; - case SDL_MOUSEBUTTONUP: QSDL_MouseButtonEvent( event.button.button, qfalse ); break; diff --git a/source/win_glimp.c b/source/win_glimp.c index a05babe..caffca5 100644 --- a/source/win_glimp.c +++ b/source/win_glimp.c @@ -158,7 +158,7 @@ static qboolean GLimp_InitGL( void ) { return qtrue; fail1: - Com_DPrintf( "failed with error %#x\n", GetLastError() ); + Com_DPrintf( "failed with error %#lx\n", GetLastError() ); fail2: if( glw.hGLRC && qwglDeleteContext ) { qwglDeleteContext( glw.hGLRC ); |