diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/cgame/cg_draw.c | 8 | ||||
-rw-r--r-- | src/cgame/cg_main.c | 1 | ||||
-rw-r--r-- | src/ui/ui_atoms.c | 264 | ||||
-rw-r--r-- | src/ui/ui_gameinfo.c | 7 | ||||
-rw-r--r-- | src/ui/ui_local.h | 887 | ||||
-rw-r--r-- | src/ui/ui_main.c | 3707 | ||||
-rw-r--r-- | src/ui/ui_players.c | 1288 | ||||
-rw-r--r-- | src/ui/ui_public.h | 8 | ||||
-rw-r--r-- | src/ui/ui_shared.c | 52 | ||||
-rw-r--r-- | src/ui/ui_shared.h | 2 |
10 files changed, 880 insertions, 5344 deletions
diff --git a/src/cgame/cg_draw.c b/src/cgame/cg_draw.c index 56d25c9c..47e7d477 100644 --- a/src/cgame/cg_draw.c +++ b/src/cgame/cg_draw.c @@ -2406,14 +2406,6 @@ int CG_ClientNumFromName( const char *p ) void CG_RunMenuScript( char **args ) { } - - -void CG_GetTeamColor( vec4_t *color ) -{ - (*color)[ 0 ] = (*color)[ 2 ] = 0.0f; - (*color)[ 1 ] = 0.17f; - (*color)[ 3 ] = 0.25f; -} //END TA UI diff --git a/src/cgame/cg_main.c b/src/cgame/cg_main.c index b3452371..bbaf914f 100644 --- a/src/cgame/cg_main.c +++ b/src/cgame/cg_main.c @@ -1669,7 +1669,6 @@ void CG_LoadHudMenu( void ) cgDC.getValue = &CG_GetValue; cgDC.ownerDrawVisible = &CG_OwnerDrawVisible; cgDC.runScript = &CG_RunMenuScript; - cgDC.getTeamColor = &CG_GetTeamColor; cgDC.setCVar = trap_Cvar_Set; cgDC.getCVarString = trap_Cvar_VariableStringBuffer; cgDC.getCVarValue = CG_Cvar_Get; diff --git a/src/ui/ui_atoms.c b/src/ui/ui_atoms.c index 7d9185f7..a5c15c25 100644 --- a/src/ui/ui_atoms.c +++ b/src/ui/ui_atoms.c @@ -91,209 +91,11 @@ char *UI_Cvar_VariableString( const char *var_name ) { return buffer; } - - -void UI_SetBestScores(postGameInfo_t *newInfo, qboolean postGame) { - trap_Cvar_Set("ui_scoreAccuracy", va("%i%%", newInfo->accuracy)); - trap_Cvar_Set("ui_scoreImpressives", va("%i", newInfo->impressives)); - trap_Cvar_Set("ui_scoreExcellents", va("%i", newInfo->excellents)); - trap_Cvar_Set("ui_scoreDefends", va("%i", newInfo->defends)); - trap_Cvar_Set("ui_scoreAssists", va("%i", newInfo->assists)); - trap_Cvar_Set("ui_scoreGauntlets", va("%i", newInfo->gauntlets)); - trap_Cvar_Set("ui_scoreScore", va("%i", newInfo->score)); - trap_Cvar_Set("ui_scorePerfect", va("%i", newInfo->perfects)); - trap_Cvar_Set("ui_scoreTeam", va("%i to %i", newInfo->redScore, newInfo->blueScore)); - trap_Cvar_Set("ui_scoreBase", va("%i", newInfo->baseScore)); - trap_Cvar_Set("ui_scoreTimeBonus", va("%i", newInfo->timeBonus)); - trap_Cvar_Set("ui_scoreSkillBonus", va("%i", newInfo->skillBonus)); - trap_Cvar_Set("ui_scoreShutoutBonus", va("%i", newInfo->shutoutBonus)); - trap_Cvar_Set("ui_scoreTime", va("%02i:%02i", newInfo->time / 60, newInfo->time % 60)); - trap_Cvar_Set("ui_scoreCaptures", va("%i", newInfo->captures)); - if (postGame) { - trap_Cvar_Set("ui_scoreAccuracy2", va("%i%%", newInfo->accuracy)); - trap_Cvar_Set("ui_scoreImpressives2", va("%i", newInfo->impressives)); - trap_Cvar_Set("ui_scoreExcellents2", va("%i", newInfo->excellents)); - trap_Cvar_Set("ui_scoreDefends2", va("%i", newInfo->defends)); - trap_Cvar_Set("ui_scoreAssists2", va("%i", newInfo->assists)); - trap_Cvar_Set("ui_scoreGauntlets2", va("%i", newInfo->gauntlets)); - trap_Cvar_Set("ui_scoreScore2", va("%i", newInfo->score)); - trap_Cvar_Set("ui_scorePerfect2", va("%i", newInfo->perfects)); - trap_Cvar_Set("ui_scoreTeam2", va("%i to %i", newInfo->redScore, newInfo->blueScore)); - trap_Cvar_Set("ui_scoreBase2", va("%i", newInfo->baseScore)); - trap_Cvar_Set("ui_scoreTimeBonus2", va("%i", newInfo->timeBonus)); - trap_Cvar_Set("ui_scoreSkillBonus2", va("%i", newInfo->skillBonus)); - trap_Cvar_Set("ui_scoreShutoutBonus2", va("%i", newInfo->shutoutBonus)); - trap_Cvar_Set("ui_scoreTime2", va("%02i:%02i", newInfo->time / 60, newInfo->time % 60)); - trap_Cvar_Set("ui_scoreCaptures2", va("%i", newInfo->captures)); - } -} - -void UI_LoadBestScores(const char *map, int game) { - char fileName[MAX_QPATH]; - fileHandle_t f; - postGameInfo_t newInfo; - memset(&newInfo, 0, sizeof(postGameInfo_t)); - Com_sprintf(fileName, MAX_QPATH, "games/%s_%i.game", map, game); - if (trap_FS_FOpenFile(fileName, &f, FS_READ) >= 0) { - int size = 0; - trap_FS_Read(&size, sizeof(int), f); - if (size == sizeof(postGameInfo_t)) { - trap_FS_Read(&newInfo, sizeof(postGameInfo_t), f); - } - trap_FS_FCloseFile(f); - } - UI_SetBestScores(&newInfo, qfalse); - - Com_sprintf(fileName, MAX_QPATH, "demos/%s_%d.dm_%d", map, game, (int)trap_Cvar_VariableValue("protocol")); - uiInfo.demoAvailable = qfalse; - if (trap_FS_FOpenFile(fileName, &f, FS_READ) >= 0) { - uiInfo.demoAvailable = qtrue; - trap_FS_FCloseFile(f); - } -} - -/* -=============== -UI_ClearScores -=============== -*/ -void UI_ClearScores( void ) { - char gameList[4096]; - char *gameFile; - int i, len, count, size; - fileHandle_t f; - postGameInfo_t newInfo; - - count = trap_FS_GetFileList( "games", "game", gameList, sizeof(gameList) ); - - size = sizeof(postGameInfo_t); - memset(&newInfo, 0, size); - - if (count > 0) { - gameFile = gameList; - for ( i = 0; i < count; i++ ) { - len = strlen(gameFile); - if (trap_FS_FOpenFile(va("games/%s",gameFile), &f, FS_WRITE) >= 0) { - trap_FS_Write(&size, sizeof(int), f); - trap_FS_Write(&newInfo, size, f); - trap_FS_FCloseFile(f); - } - gameFile += len + 1; - } - } - - UI_SetBestScores(&newInfo, qfalse); - -} - - - static void UI_Cache_f( void ) { Display_CacheAll(); } /* -======================= -UI_CalcPostGameStats -======================= -*/ -static void UI_CalcPostGameStats( void ) { - char map[MAX_QPATH]; - char fileName[MAX_QPATH]; - char info[MAX_INFO_STRING]; - fileHandle_t f; - int size, game, time, adjustedTime; - postGameInfo_t oldInfo; - postGameInfo_t newInfo; - qboolean newHigh = qfalse; - - trap_GetConfigString( CS_SERVERINFO, info, sizeof(info) ); - Q_strncpyz( map, Info_ValueForKey( info, "mapname" ), sizeof(map) ); - game = atoi(Info_ValueForKey(info, "g_gametype")); - - // compose file name - Com_sprintf(fileName, MAX_QPATH, "games/%s_%i.game", map, game); - // see if we have one already - memset(&oldInfo, 0, sizeof(postGameInfo_t)); - if (trap_FS_FOpenFile(fileName, &f, FS_READ) >= 0) { - // if so load it - size = 0; - trap_FS_Read(&size, sizeof(int), f); - if (size == sizeof(postGameInfo_t)) { - trap_FS_Read(&oldInfo, sizeof(postGameInfo_t), f); - } - trap_FS_FCloseFile(f); - } - - newInfo.accuracy = atoi(UI_Argv(3)); - newInfo.impressives = atoi(UI_Argv(4)); - newInfo.excellents = atoi(UI_Argv(5)); - newInfo.defends = atoi(UI_Argv(6)); - newInfo.assists = atoi(UI_Argv(7)); - newInfo.gauntlets = atoi(UI_Argv(8)); - newInfo.baseScore = atoi(UI_Argv(9)); - newInfo.perfects = atoi(UI_Argv(10)); - newInfo.redScore = atoi(UI_Argv(11)); - newInfo.blueScore = atoi(UI_Argv(12)); - time = atoi(UI_Argv(13)); - newInfo.captures = atoi(UI_Argv(14)); - - newInfo.time = (time - trap_Cvar_VariableValue("ui_matchStartTime")) / 1000; - adjustedTime = uiInfo.mapList[ui_currentMap.integer].timeToBeat[game]; - if (newInfo.time < adjustedTime) { - newInfo.timeBonus = (adjustedTime - newInfo.time) * 10; - } else { - newInfo.timeBonus = 0; - } - - if (newInfo.redScore > newInfo.blueScore && newInfo.blueScore <= 0) { - newInfo.shutoutBonus = 100; - } else { - newInfo.shutoutBonus = 0; - } - - newInfo.skillBonus = trap_Cvar_VariableValue("g_spSkill"); - if (newInfo.skillBonus <= 0) { - newInfo.skillBonus = 1; - } - newInfo.score = newInfo.baseScore + newInfo.shutoutBonus + newInfo.timeBonus; - newInfo.score *= newInfo.skillBonus; - - // see if the score is higher for this one - newHigh = (newInfo.redScore > newInfo.blueScore && newInfo.score > oldInfo.score); - - if (newHigh) { - // if so write out the new one - uiInfo.newHighScoreTime = uiInfo.uiDC.realTime + 20000; - if (trap_FS_FOpenFile(fileName, &f, FS_WRITE) >= 0) { - size = sizeof(postGameInfo_t); - trap_FS_Write(&size, sizeof(int), f); - trap_FS_Write(&newInfo, sizeof(postGameInfo_t), f); - trap_FS_FCloseFile(f); - } - } - - if (newInfo.time < oldInfo.time) { - uiInfo.newBestTime = uiInfo.uiDC.realTime + 20000; - } - - // put back all the ui overrides - trap_Cvar_Set("capturelimit", UI_Cvar_VariableString("ui_saveCaptureLimit")); - trap_Cvar_Set("fraglimit", UI_Cvar_VariableString("ui_saveFragLimit")); - trap_Cvar_Set("cg_drawTimer", UI_Cvar_VariableString("ui_drawTimer")); - trap_Cvar_Set("g_doWarmup", UI_Cvar_VariableString("ui_doWarmup")); - trap_Cvar_Set("g_Warmup", UI_Cvar_VariableString("ui_Warmup")); - trap_Cvar_Set("sv_pure", UI_Cvar_VariableString("ui_pure")); - trap_Cvar_Set("g_friendlyFire", UI_Cvar_VariableString("ui_friendlyFire")); - - UI_SetBestScores(&newInfo, qtrue); - UI_ShowPostGame(newHigh); - - -} - - -/* ================= UI_ConsoleCommand @@ -313,10 +115,6 @@ qboolean UI_ConsoleCommand( int realTime ) // ensure minimum menu data is available //Menu_Cache(); - if ( Q_stricmp (cmd, "ui_test") == 0 ) { - UI_ShowPostGame(qtrue); - } - if ( Q_stricmp (cmd, "ui_report") == 0 ) { UI_Report(); return qtrue; @@ -338,11 +136,6 @@ qboolean UI_ConsoleCommand( int realTime ) } } - if ( Q_stricmp (cmd, "postgame") == 0 ) { - UI_CalcPostGameStats(); - return qtrue; - } - if ( Q_stricmp (cmd, "ui_cache") == 0 ) { UI_Cache_f(); return qtrue; @@ -404,14 +197,6 @@ qboolean UI_ConsoleCommand( int realTime ) return qfalse; } -/* -================= -UI_Shutdown -================= -*/ -void UI_Shutdown( void ) { -} - void UI_DrawNamedPic( float x, float y, float width, float height, const char *picname ) { qhandle_t hShader; @@ -466,55 +251,6 @@ void UI_FillRect( float x, float y, float width, float height, const float *colo trap_R_SetColor( NULL ); } -void UI_DrawSides(float x, float y, float w, float h) { - UI_AdjustFrom640( &x, &y, &w, &h ); - trap_R_DrawStretchPic( x, y, 1, h, 0, 0, 0, 0, uiInfo.uiDC.whiteShader ); - trap_R_DrawStretchPic( x + w - 1, y, 1, h, 0, 0, 0, 0, uiInfo.uiDC.whiteShader ); -} - -void UI_DrawTopBottom(float x, float y, float w, float h) { - UI_AdjustFrom640( &x, &y, &w, &h ); - trap_R_DrawStretchPic( x, y, w, 1, 0, 0, 0, 0, uiInfo.uiDC.whiteShader ); - trap_R_DrawStretchPic( x, y + h - 1, w, 1, 0, 0, 0, 0, uiInfo.uiDC.whiteShader ); -} -/* -================ -UI_DrawRect - -Coordinates are 640*480 virtual values -================= -*/ -void UI_DrawRect( float x, float y, float width, float height, const float *color ) { - trap_R_SetColor( color ); - - UI_DrawTopBottom(x, y, width, height); - UI_DrawSides(x, y, width, height); - - trap_R_SetColor( NULL ); -} - void UI_SetColor( const float *rgba ) { trap_R_SetColor( rgba ); } - -void UI_UpdateScreen( void ) { - trap_UpdateScreen(); -} - - -void UI_DrawTextBox (int x, int y, int width, int lines) -{ - UI_FillRect( x + BIGCHAR_WIDTH/2, y + BIGCHAR_HEIGHT/2, ( width + 1 ) * BIGCHAR_WIDTH, ( lines + 1 ) * BIGCHAR_HEIGHT, colorBlack ); - UI_DrawRect( x + BIGCHAR_WIDTH/2, y + BIGCHAR_HEIGHT/2, ( width + 1 ) * BIGCHAR_WIDTH, ( lines + 1 ) * BIGCHAR_HEIGHT, colorWhite ); -} - -qboolean UI_CursorInRect (int x, int y, int width, int height) -{ - if (uiInfo.uiDC.cursorx < x || - uiInfo.uiDC.cursory < y || - uiInfo.uiDC.cursorx > x+width || - uiInfo.uiDC.cursory > y+height) - return qfalse; - - return qtrue; -} diff --git a/src/ui/ui_gameinfo.c b/src/ui/ui_gameinfo.c index ad31218e..f6d0d4d3 100644 --- a/src/ui/ui_gameinfo.c +++ b/src/ui/ui_gameinfo.c @@ -173,11 +173,6 @@ void UI_LoadArenas( void ) { type = Info_ValueForKey( ui_arenaInfos[ n ], "type" ); // if no type specified, it will be treated as "ffa" - if( *type && strstr( type, "tremulous" ) ) - uiInfo.mapList[ uiInfo.mapCount ].typeBits |= ( 1 << 0 ); - else - continue; //not a trem map - uiInfo.mapList[uiInfo.mapCount].cinematic = -1; uiInfo.mapList[uiInfo.mapCount].mapLoadName = String_Alloc(Info_ValueForKey(ui_arenaInfos[n], "map")); uiInfo.mapList[uiInfo.mapCount].mapName = String_Alloc(Info_ValueForKey(ui_arenaInfos[n], "longname")); @@ -293,7 +288,7 @@ char *UI_GetBotInfoByName( const char *name ) { return NULL; } -int UI_GetNumBots() { +int UI_GetNumBots( void ) { return ui_numBots; } diff --git a/src/ui/ui_local.h b/src/ui/ui_local.h index 450a4e44..5c404227 100644 --- a/src/ui/ui_local.h +++ b/src/ui/ui_local.h @@ -21,8 +21,8 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA =========================================================================== */ -#ifndef __UI_LOCAL_H__ -#define __UI_LOCAL_H__ +#ifndef UI_LOCAL_H +#define UI_LOCAL_H #include "../qcommon/q_shared.h" #include "../renderer/tr_types.h" @@ -31,653 +31,41 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include "../game/bg_public.h" #include "ui_shared.h" -// global display context - -extern vmCvar_t ui_ffa_fraglimit; -extern vmCvar_t ui_ffa_timelimit; - -extern vmCvar_t ui_tourney_fraglimit; -extern vmCvar_t ui_tourney_timelimit; - -extern vmCvar_t ui_team_fraglimit; -extern vmCvar_t ui_team_timelimit; -extern vmCvar_t ui_team_friendly; - -extern vmCvar_t ui_ctf_capturelimit; -extern vmCvar_t ui_ctf_timelimit; -extern vmCvar_t ui_ctf_friendly; - -extern vmCvar_t ui_arenasFile; -extern vmCvar_t ui_botsFile; -extern vmCvar_t ui_spScores1; -extern vmCvar_t ui_spScores2; -extern vmCvar_t ui_spScores3; -extern vmCvar_t ui_spScores4; -extern vmCvar_t ui_spScores5; -extern vmCvar_t ui_spAwards; -extern vmCvar_t ui_spVideos; -extern vmCvar_t ui_spSkill; - -extern vmCvar_t ui_spSelection; - -extern vmCvar_t ui_browserMaster; -extern vmCvar_t ui_browserGameType; -extern vmCvar_t ui_browserSortKey; -extern vmCvar_t ui_browserShowFull; -extern vmCvar_t ui_browserShowEmpty; - -extern vmCvar_t ui_brassTime; -extern vmCvar_t ui_drawCrosshair; -extern vmCvar_t ui_drawCrosshairNames; -extern vmCvar_t ui_marks; - -extern vmCvar_t ui_server1; -extern vmCvar_t ui_server2; -extern vmCvar_t ui_server3; -extern vmCvar_t ui_server4; -extern vmCvar_t ui_server5; -extern vmCvar_t ui_server6; -extern vmCvar_t ui_server7; -extern vmCvar_t ui_server8; -extern vmCvar_t ui_server9; -extern vmCvar_t ui_server10; -extern vmCvar_t ui_server11; -extern vmCvar_t ui_server12; -extern vmCvar_t ui_server13; -extern vmCvar_t ui_server14; -extern vmCvar_t ui_server15; -extern vmCvar_t ui_server16; - -extern vmCvar_t ui_captureLimit; -extern vmCvar_t ui_fragLimit; -extern vmCvar_t ui_gameType; -extern vmCvar_t ui_netGameType; -extern vmCvar_t ui_actualNetGameType; -extern vmCvar_t ui_joinGameType; -extern vmCvar_t ui_netSource; -extern vmCvar_t ui_serverFilterType; -extern vmCvar_t ui_dedicated; -extern vmCvar_t ui_opponentName; -extern vmCvar_t ui_menuFiles; -extern vmCvar_t ui_currentTier; -extern vmCvar_t ui_currentMap; -extern vmCvar_t ui_currentNetMap; -extern vmCvar_t ui_mapIndex; -extern vmCvar_t ui_currentOpponent; -extern vmCvar_t ui_selectedPlayer; -extern vmCvar_t ui_selectedPlayerName; -extern vmCvar_t ui_lastServerRefresh_0; -extern vmCvar_t ui_lastServerRefresh_1; -extern vmCvar_t ui_lastServerRefresh_2; -extern vmCvar_t ui_lastServerRefresh_3; -extern vmCvar_t ui_singlePlayerActive; -extern vmCvar_t ui_scoreAccuracy; -extern vmCvar_t ui_scoreImpressives; -extern vmCvar_t ui_scoreExcellents; -extern vmCvar_t ui_scoreDefends; -extern vmCvar_t ui_scoreAssists; -extern vmCvar_t ui_scoreGauntlets; -extern vmCvar_t ui_scoreScore; -extern vmCvar_t ui_scorePerfect; -extern vmCvar_t ui_scoreTeam; -extern vmCvar_t ui_scoreBase; -extern vmCvar_t ui_scoreTimeBonus; -extern vmCvar_t ui_scoreSkillBonus; -extern vmCvar_t ui_scoreShutoutBonus; -extern vmCvar_t ui_scoreTime; -extern vmCvar_t ui_smallFont; -extern vmCvar_t ui_bigFont; -extern vmCvar_t ui_serverStatusTimeOut; -extern vmCvar_t ui_textWrapCache; -extern vmCvar_t ui_developer; - - - -// -// ui_qmenu.c -// - -#define RCOLUMN_OFFSET ( BIGCHAR_WIDTH ) -#define LCOLUMN_OFFSET (-BIGCHAR_WIDTH ) - -#define SLIDER_RANGE 10 -#define MAX_EDIT_LINE 256 - -#define MAX_MENUDEPTH 8 -#define MAX_MENUITEMS 128 - -#define MTYPE_NULL 0 -#define MTYPE_SLIDER 1 -#define MTYPE_ACTION 2 -#define MTYPE_SPINCONTROL 3 -#define MTYPE_FIELD 4 -#define MTYPE_RADIOBUTTON 5 -#define MTYPE_BITMAP 6 -#define MTYPE_TEXT 7 -#define MTYPE_SCROLLLIST 8 -#define MTYPE_PTEXT 9 -#define MTYPE_BTEXT 10 - -#define QMF_BLINK 0x00000001 -#define QMF_SMALLFONT 0x00000002 -#define QMF_LEFT_JUSTIFY 0x00000004 -#define QMF_CENTER_JUSTIFY 0x00000008 -#define QMF_RIGHT_JUSTIFY 0x00000010 -#define QMF_NUMBERSONLY 0x00000020 // edit field is only numbers -#define QMF_HIGHLIGHT 0x00000040 -#define QMF_HIGHLIGHT_IF_FOCUS 0x00000080 // steady focus -#define QMF_PULSEIFFOCUS 0x00000100 // pulse if focus -#define QMF_HASMOUSEFOCUS 0x00000200 -#define QMF_NOONOFFTEXT 0x00000400 -#define QMF_MOUSEONLY 0x00000800 // only mouse input allowed -#define QMF_HIDDEN 0x00001000 // skips drawing -#define QMF_GRAYED 0x00002000 // grays and disables -#define QMF_INACTIVE 0x00004000 // disables any input -#define QMF_NODEFAULTINIT 0x00008000 // skip default initialization -#define QMF_OWNERDRAW 0x00010000 -#define QMF_PULSE 0x00020000 -#define QMF_LOWERCASE 0x00040000 // edit field is all lower case -#define QMF_UPPERCASE 0x00080000 // edit field is all upper case -#define QMF_SILENT 0x00100000 - -// callback notifications -#define QM_GOTFOCUS 1 -#define QM_LOSTFOCUS 2 -#define QM_ACTIVATED 3 - -typedef struct _tag_menuframework -{ - int cursor; - int cursor_prev; - - int nitems; - void *items[MAX_MENUITEMS]; - - void (*draw) (void); - sfxHandle_t (*key) (int key); - - qboolean wrapAround; - qboolean fullscreen; - qboolean showlogo; -} menuframework_s; - -typedef struct -{ - int type; - const char *name; - int id; - int x, y; - int left; - int top; - int right; - int bottom; - menuframework_s *parent; - int menuPosition; - unsigned flags; - - void (*callback)( void *self, int event ); - void (*statusbar)( void *self ); - void (*ownerdraw)( void *self ); -} menucommon_s; - -typedef struct { - int cursor; - int scroll; - int widthInChars; - char buffer[MAX_EDIT_LINE]; - int maxchars; -} mfield_t; - -typedef struct -{ - menucommon_s generic; - mfield_t field; -} menufield_s; - -typedef struct -{ - menucommon_s generic; - - float minvalue; - float maxvalue; - float curvalue; - - float range; -} menuslider_s; - -typedef struct -{ - menucommon_s generic; - - int oldvalue; - int curvalue; - int numitems; - int top; - - const char **itemnames; - - int width; - int height; - int columns; - int seperation; -} menulist_s; - -typedef struct -{ - menucommon_s generic; -} menuaction_s; - -typedef struct -{ - menucommon_s generic; - int curvalue; -} menuradiobutton_s; - -typedef struct -{ - menucommon_s generic; - char* focuspic; - char* errorpic; - qhandle_t shader; - qhandle_t focusshader; - int width; - int height; - float* focuscolor; -} menubitmap_s; - -typedef struct -{ - menucommon_s generic; - char* string; - int style; - float* color; -} menutext_s; - -extern void Menu_Cache( void ); -extern void Menu_Focus( menucommon_s *m ); -extern void Menu_AddItem( menuframework_s *menu, void *item ); -extern void Menu_AdjustCursor( menuframework_s *menu, int dir ); -extern void Menu_Draw( menuframework_s *menu ); -extern void *Menu_ItemAtCursor( menuframework_s *m ); -extern sfxHandle_t Menu_ActivateItem( menuframework_s *s, menucommon_s* item ); -extern void Menu_SetCursor( menuframework_s *s, int cursor ); -extern void Menu_SetCursorToItem( menuframework_s *m, void* ptr ); -extern sfxHandle_t Menu_DefaultKey( menuframework_s *s, int key ); -extern void Bitmap_Init( menubitmap_s *b ); -extern void Bitmap_Draw( menubitmap_s *b ); -extern void ScrollList_Draw( menulist_s *l ); -extern sfxHandle_t ScrollList_Key( menulist_s *l, int key ); -extern sfxHandle_t menu_in_sound; -extern sfxHandle_t menu_move_sound; -extern sfxHandle_t menu_out_sound; -extern sfxHandle_t menu_buzz_sound; -extern sfxHandle_t menu_null_sound; -extern sfxHandle_t weaponChangeSound; -extern vec4_t menu_text_color; -extern vec4_t menu_grayed_color; -extern vec4_t menu_dark_color; -extern vec4_t menu_highlight_color; -extern vec4_t menu_red_color; -extern vec4_t menu_black_color; -extern vec4_t menu_dim_color; -extern vec4_t color_black; -extern vec4_t color_white; -extern vec4_t color_yellow; -extern vec4_t color_blue; -extern vec4_t color_orange; -extern vec4_t color_red; -extern vec4_t color_dim; -extern vec4_t name_color; -extern vec4_t list_color; -extern vec4_t listbar_color; -extern vec4_t text_color_disabled; -extern vec4_t text_color_normal; -extern vec4_t text_color_highlight; - -extern char *ui_medalNames[]; -extern char *ui_medalPicNames[]; -extern char *ui_medalSounds[]; - -// -// ui_mfield.c -// -extern void MField_Clear( mfield_t *edit ); -extern void MField_KeyDownEvent( mfield_t *edit, int key ); -extern void MField_CharEvent( mfield_t *edit, int ch ); -extern void MField_Draw( mfield_t *edit, int x, int y, int style, vec4_t color ); -extern void MenuField_Init( menufield_s* m ); -extern void MenuField_Draw( menufield_s *f ); -extern sfxHandle_t MenuField_Key( menufield_s* m, int* key ); - // // ui_main.c // void UI_Report( void ); void UI_Load( void ); void UI_LoadMenus(const char *menuFile, qboolean reset); -void _UI_SetActiveMenu( uiMenuCommand_t menu ); int UI_AdjustTimeByGame(int time); -void UI_ShowPostGame(qboolean newHigh); void UI_ClearScores( void ); void UI_LoadArenas(void); void UI_ServerInfo(void); -// -// ui_menu.c -// -extern void MainMenu_Cache( void ); -extern void UI_MainMenu(void); -extern void UI_RegisterCvars( void ); -extern void UI_UpdateCvars( void ); - -// -// ui_credits.c -// -extern void UI_CreditMenu( void ); - -// -// ui_ingame.c -// -extern void InGame_Cache( void ); -extern void UI_InGameMenu(void); - -// -// ui_confirm.c -// -extern void ConfirmMenu_Cache( void ); -extern void UI_ConfirmMenu( const char *question, void (*draw)( void ), void (*action)( qboolean result ) ); - -// -// ui_setup.c -// -extern void UI_SetupMenu_Cache( void ); -extern void UI_SetupMenu(void); - -// -// ui_team.c -// -extern void UI_TeamMainMenu( void ); -extern void TeamMain_Cache( void ); - -// -// ui_connect.c -// -extern void UI_DrawConnectScreen( qboolean overlay ); - -// -// ui_controls2.c -// -extern void UI_ControlsMenu( void ); -extern void Controls_Cache( void ); - -// -// ui_demo2.c -// -extern void UI_DemosMenu( void ); -extern void Demos_Cache( void ); - -// -// ui_cinematics.c -// -extern void UI_CinematicsMenu( void ); -extern void UI_CinematicsMenu_f( void ); -extern void UI_CinematicsMenu_Cache( void ); - -// -// ui_mods.c -// -extern void UI_ModsMenu( void ); -extern void UI_ModsMenu_Cache( void ); - -// -// ui_playermodel.c -// -extern void UI_PlayerModelMenu( void ); -extern void PlayerModel_Cache( void ); - -// -// ui_playersettings.c -// -extern void UI_PlayerSettingsMenu( void ); -extern void PlayerSettings_Cache( void ); - -// -// ui_preferences.c -// -extern void UI_PreferencesMenu( void ); -extern void Preferences_Cache( void ); - -// -// ui_specifyleague.c -// -extern void UI_SpecifyLeagueMenu( void ); -extern void SpecifyLeague_Cache( void ); - -// -// ui_specifyserver.c -// -extern void UI_SpecifyServerMenu( void ); -extern void SpecifyServer_Cache( void ); - -// -// ui_servers2.c -// -#define MAX_FAVORITESERVERS 16 - -extern void UI_ArenaServersMenu( void ); -extern void ArenaServers_Cache( void ); - -// -// ui_startserver.c -// -extern void UI_StartServerMenu( qboolean multiplayer ); -extern void StartServer_Cache( void ); -extern void ServerOptions_Cache( void ); -extern void UI_BotSelectMenu( char *bot ); -extern void UI_BotSelectMenu_Cache( void ); - -// -// ui_serverinfo.c -// -extern void UI_ServerInfoMenu( void ); -extern void ServerInfo_Cache( void ); - -// -// ui_video.c -// -extern void UI_GraphicsOptionsMenu( void ); -extern void GraphicsOptions_Cache( void ); -extern void DriverInfo_Cache( void ); - -// -// ui_players.c -// - -//FIXME ripped from cg_local.h -typedef struct { - int oldFrame; - int oldFrameTime; // time when ->oldFrame was exactly on - - int frame; - int frameTime; // time when ->frame will be exactly on - - float backlerp; - - float yawAngle; - qboolean yawing; - float pitchAngle; - qboolean pitching; - - int animationNumber; // may include ANIM_TOGGLEBIT - animation_t *animation; - int animationTime; // time when the first frame of the animation will be exact -} lerpFrame_t; - -typedef struct { - // model info - qhandle_t legsModel; - qhandle_t legsSkin; - lerpFrame_t legs; - - qhandle_t torsoModel; - qhandle_t torsoSkin; - lerpFrame_t torso; - - qhandle_t headModel; - qhandle_t headSkin; - - animation_t animations[MAX_PLAYER_TOTALANIMATIONS]; - - qhandle_t weaponModel; - qhandle_t barrelModel; - qhandle_t flashModel; - vec3_t flashDlightColor; - int muzzleFlashTime; - - // currently in use drawing parms - vec3_t viewAngles; - vec3_t moveAngles; - weapon_t currentWeapon; - int legsAnim; - int torsoAnim; - - // animation vars - weapon_t weapon; - weapon_t lastWeapon; - weapon_t pendingWeapon; - int weaponTimer; - int pendingLegsAnim; - int torsoAnimationTimer; - - int pendingTorsoAnim; - int legsAnimationTimer; - - qboolean chat; - qboolean newModel; - - qboolean barrelSpinning; - float barrelAngle; - int barrelTime; - - int realWeapon; -} playerInfo_t; - -void UI_DrawPlayer( float x, float y, float w, float h, playerInfo_t *pi, int time ); -void UI_PlayerInfo_SetModel( playerInfo_t *pi, const char *model, const char *headmodel, char *teamName ); -void UI_PlayerInfo_SetInfo( playerInfo_t *pi, int legsAnim, int torsoAnim, vec3_t viewAngles, vec3_t moveAngles, weapon_t weaponNum, qboolean chat ); -qboolean UI_RegisterClientModelname( playerInfo_t *pi, const char *modelSkinName , const char *headName, const char *teamName); - -// -// ui_atoms.c -// -// this is only used in the old ui, the new ui has it's own version -typedef struct { - int frametime; - int realtime; - int cursorx; - int cursory; - glconfig_t glconfig; - qboolean debug; - qhandle_t whiteShader; - qhandle_t charset; - qhandle_t charsetProp; - qhandle_t charsetPropGlow; - qhandle_t charsetPropB; - qhandle_t cursor; - qhandle_t rb_on; - qhandle_t rb_off; - float scale; - float bias; - qboolean demoversion; - qboolean firstdraw; -} uiStatic_t; - +void UI_RegisterCvars( void ); +void UI_UpdateCvars( void ); +void UI_DrawConnectScreen( qboolean overlay ); // new ui stuff -#define UI_NUMFX 7 -#define MAX_HEADS 64 -#define MAX_ALIASES 64 -#define MAX_HEADNAME 32 -#define MAX_TEAMS 64 -#define MAX_GAMETYPES 16 #define MAX_MAPS 128 -#define MAX_SPMAPS 16 -#define PLAYERS_PER_TEAM 5 -#define MAX_PINGREQUESTS 32 -#define MAX_ADDRESSLENGTH 64 -#define MAX_HOSTNAMELENGTH 22 -#define MAX_MAPNAMELENGTH 16 -#define MAX_STATUSLENGTH 64 -#define MAX_LISTBOXWIDTH 59 -#define UI_FONT_THRESHOLD 0.1 -#define MAX_DISPLAY_SERVERS 2048 -#define MAX_SERVERSTATUS_LINES 128 -#define MAX_SERVERSTATUS_TEXT 1024 -#define MAX_FOUNDPLAYER_SERVERS 16 -#define TEAM_MEMBERS 5 -#define GAMES_ALL 0 -#define GAMES_FFA 1 -#define GAMES_TEAMPLAY 2 -#define GAMES_TOURNEY 3 -#define GAMES_CTF 4 -#define MAPS_PER_TIER 3 -#define MAX_TIERS 16 +#define MAX_PINGREQUESTS 32 +#define MAX_ADDRESSLENGTH 64 +#define MAX_DISPLAY_SERVERS 2048 +#define MAX_SERVERSTATUS_LINES 128 +#define MAX_SERVERSTATUS_TEXT 1024 +#define MAX_FOUNDPLAYER_SERVERS 16 #define MAX_MODS 64 #define MAX_DEMOS 256 #define MAX_MOVIES 256 -#define MAX_PLAYERMODELS 256 - - -typedef struct { - const char *name; - const char *imageName; - qhandle_t headImage; - const char *base; - qboolean active; - int reference; -} characterInfo; - -typedef struct { - const char *name; - const char *ai; - const char *action; -} aliasInfo; - -typedef struct { - const char *teamName; - const char *imageName; - const char *teamMembers[TEAM_MEMBERS]; - qhandle_t teamIcon; - qhandle_t teamIcon_Metal; - qhandle_t teamIcon_Name; - int cinematic; -} teamInfo; - -typedef struct { - const char *gameType; - int gtEnum; -} gameTypeInfo; typedef struct { const char *mapName; const char *mapLoadName; const char *imageName; - const char *opponentName; - int teamMembers; - int typeBits; int cinematic; - int timeToBeat[MAX_GAMETYPES]; qhandle_t levelShot; - qboolean active; } mapInfo; -typedef struct { - const char *tierName; - const char *maps[MAPS_PER_TIER]; - int gameTypes[MAPS_PER_TIER]; - qhandle_t mapHandles[MAPS_PER_TIER]; -} tierInfo; - typedef struct serverFilter_s { const char *description; const char *basedir; @@ -772,39 +160,15 @@ typedef struct typedef struct { displayContextDef_t uiDC; - int newHighScoreTime; - int newBestTime; - int showPostGameTime; - qboolean newHighScore; - qboolean demoAvailable; - qboolean soundHighScore; - - int characterCount; - int botIndex; - characterInfo characterList[MAX_HEADS]; - - int aliasCount; - aliasInfo aliasList[MAX_ALIASES]; - - int teamCount; - teamInfo teamList[MAX_TEAMS]; - - int numGameTypes; - gameTypeInfo gameTypes[MAX_GAMETYPES]; - - int numJoinGameTypes; - gameTypeInfo joinGameTypes[MAX_GAMETYPES]; - int redBlue; int playerCount; int myTeamCount; - int teamIndex; + int teamPlayerIndex; int playerRefresh; int playerIndex; int playerNumber; int myPlayerIndex; int ignoreIndex; - qboolean teamLeader; char playerNames[MAX_CLIENTS][MAX_NAME_LENGTH]; char rawPlayerNames[MAX_CLIENTS][MAX_NAME_LENGTH]; char teamNames[MAX_CLIENTS][MAX_NAME_LENGTH]; @@ -816,12 +180,6 @@ typedef struct { int mapCount; mapInfo mapList[MAX_MAPS]; - - int tierCount; - tierInfo tierList[MAX_TIERS]; - - int skillIndex; - modInfo_t modList[MAX_MODS]; int modCount; int modIndex; @@ -835,9 +193,9 @@ typedef struct { int movieIndex; int previewMovie; - menuItem_t tremTeamList[ 4 ]; - int tremTeamCount; - int tremTeamIndex; + menuItem_t teamList[ 4 ]; + int teamCount; + int teamIndex; menuItem_t alienClassList[ 3 ]; int alienClassCount; @@ -886,17 +244,6 @@ typedef struct { int numFoundPlayerServers; int nextFindPlayerRefresh; - int currentCrosshair; - int startPostGameTime; - sfxHandle_t newHighScoreSound; - - int q3HeadCount; - char q3HeadNames[MAX_PLAYERMODELS][64]; - qhandle_t q3HeadIcons[MAX_PLAYERMODELS]; - int q3SelectedHead; - - int effectsColor; - qboolean inGameLoad; qboolean chatTeam; @@ -906,69 +253,13 @@ typedef struct { extern uiInfo_t uiInfo; -extern void UI_Init( void ); -extern void UI_Shutdown( void ); -extern void UI_KeyEvent( int key ); -extern void UI_MouseEvent( int dx, int dy ); -extern void UI_Refresh( int realtime ); -extern qboolean UI_ConsoleCommand( int realTime ); -extern float UI_ClampCvar( float min, float max, float value ); -extern void UI_DrawNamedPic( float x, float y, float width, float height, const char *picname ); -extern void UI_DrawHandlePic( float x, float y, float w, float h, qhandle_t hShader ); -extern void UI_FillRect( float x, float y, float width, float height, const float *color ); -extern void UI_DrawRect( float x, float y, float width, float height, const float *color ); -extern void UI_DrawTopBottom(float x, float y, float w, float h); -extern void UI_DrawSides(float x, float y, float w, float h); -extern void UI_UpdateScreen( void ); -extern void UI_SetColor( const float *rgba ); -extern void UI_LerpColor(vec4_t a, vec4_t b, vec4_t c, float t); -extern void UI_DrawBannerString( int x, int y, const char* str, int style, vec4_t color ); -extern float UI_ProportionalSizeScale( int style ); -extern void UI_DrawProportionalString( int x, int y, const char* str, int style, vec4_t color ); -extern int UI_ProportionalStringWidth( const char* str ); -extern void UI_DrawString( int x, int y, const char* str, int style, vec4_t color ); -extern void UI_DrawChar( int x, int y, int ch, int style, vec4_t color ); -extern qboolean UI_CursorInRect (int x, int y, int width, int height); -extern void UI_AdjustFrom640( float *x, float *y, float *w, float *h ); -extern void UI_DrawTextBox (int x, int y, int width, int lines); -extern qboolean UI_IsFullscreen( void ); -extern void UI_SetActiveMenu( uiMenuCommand_t menu ); -extern void UI_PushMenu ( menuframework_s *menu ); -extern void UI_PopMenu (void); -extern void UI_ForceMenuOff (void); -extern char *UI_Argv( int arg ); -extern char *UI_Cvar_VariableString( const char *var_name ); -extern void UI_Refresh( int time ); -extern void UI_KeyEvent( int key ); -extern void UI_StartDemoLoop( void ); -extern qboolean m_entersound; -void UI_LoadBestScores(const char *map, int game); -extern uiStatic_t uis; - -// -// ui_spLevel.c -// -void UI_SPLevelMenu_Cache( void ); -void UI_SPLevelMenu( void ); -void UI_SPLevelMenu_f( void ); -void UI_SPLevelMenu_ReInit( void ); - -// -// ui_spArena.c -// -void UI_SPArena_Start( const char *arenaInfo ); - -// -// ui_spPostgame.c -// -void UI_SPPostgameMenu_Cache( void ); -void UI_SPPostgameMenu_f( void ); - -// -// ui_spSkill.c -// -void UI_SPSkillMenu( const char *arenaInfo ); -void UI_SPSkillMenu_Cache( void ); +qboolean UI_ConsoleCommand( int realTime ); +char *UI_Cvar_VariableString( const char *var_name ); +void UI_SetColor( const float *rgba ); +void UI_AdjustFrom640( float *x, float *y, float *w, float *h ); +void UI_Refresh( int time ); +void UI_DrawHandlePic( float x, float y, float w, float h, qhandle_t hShader ); +void UI_FillRect( float x, float y, float width, float height, const float *color ); // // ui_syscalls.c @@ -1054,138 +345,4 @@ void trap_R_RemapShader( const char *oldShader, const char *newShader, cons void trap_SetPbClStatus( int status ); -// -// ui_addbots.c -// -void UI_AddBots_Cache( void ); -void UI_AddBotsMenu( void ); - -// -// ui_removebots.c -// -void UI_RemoveBots_Cache( void ); -void UI_RemoveBotsMenu( void ); - -// -// ui_teamorders.c -// -extern void UI_TeamOrdersMenu( void ); -extern void UI_TeamOrdersMenu_f( void ); -extern void UI_TeamOrdersMenu_Cache( void ); - -// -// ui_loadconfig.c -// -void UI_LoadConfig_Cache( void ); -void UI_LoadConfigMenu( void ); - -// -// ui_saveconfig.c -// -void UI_SaveConfigMenu_Cache( void ); -void UI_SaveConfigMenu( void ); - -// -// ui_display.c -// -void UI_DisplayOptionsMenu_Cache( void ); -void UI_DisplayOptionsMenu( void ); - -// -// ui_sound.c -// -void UI_SoundOptionsMenu_Cache( void ); -void UI_SoundOptionsMenu( void ); - -// -// ui_network.c -// -void UI_NetworkOptionsMenu_Cache( void ); -void UI_NetworkOptionsMenu( void ); - -// -// ui_gameinfo.c -// -typedef enum { - AWARD_ACCURACY, - AWARD_IMPRESSIVE, - AWARD_EXCELLENT, - AWARD_GAUNTLET, - AWARD_FRAGS, - AWARD_PERFECT -} awardType_t; - -const char *UI_GetArenaInfoByNumber( int num ); -const char *UI_GetArenaInfoByMap( const char *map ); -const char *UI_GetSpecialArenaInfo( const char *tag ); -int UI_GetNumArenas( void ); -int UI_GetNumSPArenas( void ); -int UI_GetNumSPTiers( void ); - -char *UI_GetBotInfoByNumber( int num ); -char *UI_GetBotInfoByName( const char *name ); -int UI_GetNumBots( void ); -void UI_LoadBots( void ); -char *UI_GetBotNameByNumber( int num ); - -void UI_GetBestScore( int level, int *score, int *skill ); -void UI_SetBestScore( int level, int score ); -int UI_TierCompleted( int levelWon ); -qboolean UI_ShowTierVideo( int tier ); -qboolean UI_CanShowTierVideo( int tier ); -int UI_GetCurrentGame( void ); -void UI_NewGame( void ); -void UI_LogAwardData( int award, int data ); -int UI_GetAwardLevel( int award ); - -void UI_SPUnlock_f( void ); -void UI_SPUnlockMedals_f( void ); - -void UI_InitGameinfo( void ); - -// -// ui_login.c -// -void Login_Cache( void ); -void UI_LoginMenu( void ); - -// -// ui_signup.c -// -void Signup_Cache( void ); -void UI_SignupMenu( void ); - -// -// ui_rankstatus.c -// -void RankStatus_Cache( void ); -void UI_RankStatusMenu( void ); - - -// new ui - -#define ASSET_BACKGROUND "uiBackground" - -// for tracking sp game info in Team Arena -typedef struct postGameInfo_s { - int score; - int redScore; - int blueScore; - int perfects; - int accuracy; - int impressives; - int excellents; - int defends; - int assists; - int gauntlets; - int captures; - int time; - int timeBonus; - int shutoutBonus; - int skillBonus; - int baseScore; -} postGameInfo_t; - - - #endif diff --git a/src/ui/ui_main.c b/src/ui/ui_main.c index 25462a86..61ce1d91 100644 --- a/src/ui/ui_main.c +++ b/src/ui/ui_main.c @@ -40,18 +40,6 @@ static const char *MonthAbbrev[] = { "Oct","Nov","Dec" }; - -static const char *skillLevels[] = { - "I Can Win", - "Bring It On", - "Hurt Me Plenty", - "Hardcore", - "Nightmare" -}; - -static const int numSkillLevels = sizeof(skillLevels) / sizeof(const char*); - - static const char *netSources[] = { "Internet", "Mplayer", @@ -60,82 +48,73 @@ static const char *netSources[] = { }; static const int numNetSources = sizeof(netSources) / sizeof(const char*); -static const serverFilter_t serverFilters[] = { - {"All", "" }, - {"Quake 3 Arena", "" }, - {"Team Arena", "missionpack" }, - {"Rocket Arena", "arena" }, - {"Alliance", "alliance20" }, - {"Weapons Factory Arena", "wfa" }, - {"OSP", "osp" }, -}; - -static const char *teamArenaGameTypes[] = { - "FFA", - "TOURNAMENT", - "SP", - "TEAM DM", - "CTF", - "1FCTF", - "OVERLOAD", - "HARVESTER", - "TEAMTOURNAMENT" +static char* netnames[] = { + "???", + "UDP", + "IPX", + NULL }; -static int const numTeamArenaGameTypes = sizeof(teamArenaGameTypes) / sizeof(const char*); - +/* +================ +cvars +================ +*/ -static const char *teamArenaGameNames[] = { - "Free For All", - "Tournament", - "Single Player", - "Team Deathmatch", - "Capture the Flag", - "One Flag CTF", - "Overload", - "Harvester", - "Team Tournament", -}; +typedef struct { + vmCvar_t *vmCvar; + char *cvarName; + char *defaultString; + int cvarFlags; +} cvarTable_t; -static int const numTeamArenaGameNames = sizeof(teamArenaGameNames) / sizeof(const char*); +vmCvar_t ui_browserShowFull; +vmCvar_t ui_browserShowEmpty; +vmCvar_t ui_dedicated; +vmCvar_t ui_netSource; +vmCvar_t ui_selectedMap; +vmCvar_t ui_lastServerRefresh_0; +vmCvar_t ui_lastServerRefresh_1; +vmCvar_t ui_lastServerRefresh_2; +vmCvar_t ui_lastServerRefresh_3; +vmCvar_t ui_lastServerRefresh_0_time; +vmCvar_t ui_lastServerRefresh_1_time; +vmCvar_t ui_lastServerRefresh_2_time; +vmCvar_t ui_lastServerRefresh_3_time; +vmCvar_t ui_smallFont; +vmCvar_t ui_bigFont; +vmCvar_t ui_findPlayer; +vmCvar_t ui_serverStatusTimeOut; +vmCvar_t ui_textWrapCache; +vmCvar_t ui_developer; -static const int numServerFilters = sizeof(serverFilters) / sizeof(serverFilter_t); +vmCvar_t ui_winner; -static const char *sortKeys[] = { - "Server Name", - "Map Name", - "Open Player Spots", - "Game Type", - "Ping Time" -}; -static const int numSortKeys = sizeof(sortKeys) / sizeof(const char*); +static cvarTable_t cvarTable[] = { + { &ui_browserShowFull, "ui_browserShowFull", "1", CVAR_ARCHIVE }, + { &ui_browserShowEmpty, "ui_browserShowEmpty", "1", CVAR_ARCHIVE }, -static char* netnames[] = { - "???", - "UDP", - "IPX", - NULL + { &ui_dedicated, "ui_dedicated", "0", CVAR_ARCHIVE }, + { &ui_netSource, "ui_netSource", "0", CVAR_ARCHIVE }, + { &ui_selectedMap, "ui_selectedMap", "0", CVAR_ARCHIVE }, + { &ui_lastServerRefresh_0, "ui_lastServerRefresh_0", "", CVAR_ARCHIVE}, + { &ui_lastServerRefresh_1, "ui_lastServerRefresh_1", "", CVAR_ARCHIVE}, + { &ui_lastServerRefresh_2, "ui_lastServerRefresh_2", "", CVAR_ARCHIVE}, + { &ui_lastServerRefresh_3, "ui_lastServerRefresh_3", "", CVAR_ARCHIVE}, + { &ui_lastServerRefresh_0, "ui_lastServerRefresh_0_time", "", CVAR_ARCHIVE}, + { &ui_lastServerRefresh_1, "ui_lastServerRefresh_1_time", "", CVAR_ARCHIVE}, + { &ui_lastServerRefresh_2, "ui_lastServerRefresh_2_time", "", CVAR_ARCHIVE}, + { &ui_lastServerRefresh_3, "ui_lastServerRefresh_3_time", "", CVAR_ARCHIVE}, + { &ui_smallFont, "ui_smallFont", "0.2", CVAR_ARCHIVE}, + { &ui_bigFont, "ui_bigFont", "0.5", CVAR_ARCHIVE}, + { &ui_findPlayer, "ui_findPlayer", "", CVAR_ARCHIVE}, + { &ui_serverStatusTimeOut, "ui_serverStatusTimeOut", "7000", CVAR_ARCHIVE}, + { &ui_textWrapCache, "ui_textWrapCache", "1", CVAR_ARCHIVE }, + { &ui_developer, "ui_developer", "0", CVAR_ARCHIVE | CVAR_CHEAT }, }; -static int gamecodetoui[] = {4,2,3,0,5,1,6}; - - -static void UI_StartServerRefresh(qboolean full); -static void UI_StopServerRefresh( void ); -static void UI_DoServerRefresh( void ); -static void UI_FeederSelection(float feederID, int index); -static void UI_BuildServerDisplayList(qboolean force); -static void UI_BuildServerStatus(qboolean force); -static void UI_BuildFindPlayerList(qboolean force); -static int QDECL UI_ServersQsortCompare( const void *arg1, const void *arg2 ); -static int UI_MapCountByGameType(qboolean singlePlayer); -static int UI_HeadCountByTeam( void ); -static const char *UI_SelectedMap(int index, int *actual); -static const char *UI_SelectedHead(int index, int *actual); -static int UI_GetIndexFromSelection(int actual); - -int ProcessNewUI( int command, int arg0, int arg1, int arg2, int arg3, int arg4, int arg5, int arg6 ); +static int cvarTableSize = sizeof(cvarTable) / sizeof(cvarTable[0]); /* ================ @@ -145,17 +124,13 @@ This is the only way control passes into the module. This must be the very first function compiled into the .qvm file ================ */ -vmCvar_t ui_new; -vmCvar_t ui_debug; -vmCvar_t ui_initialized; -vmCvar_t ui_teamArenaFirstRun; - -void _UI_Init( qboolean ); -void _UI_Shutdown( void ); -void _UI_KeyEvent( int key, qboolean down ); -void _UI_MouseEvent( int dx, int dy ); -void _UI_Refresh( int realtime ); -qboolean _UI_IsFullscreen( void ); +void UI_Init( qboolean ); +void UI_Shutdown( void ); +void UI_KeyEvent( int key, qboolean down ); +void UI_MouseEvent( int dx, int dy ); +void UI_Refresh( int realtime ); +qboolean UI_IsFullscreen( void ); +void UI_SetActiveMenu( uiMenuCommand_t menu ); intptr_t vmMain( int command, int arg0, int arg1, int arg2, int arg3, int arg4, int arg5, int arg6, int arg7, int arg8, int arg9, int arg10, int arg11 ) { @@ -164,30 +139,30 @@ intptr_t vmMain( int command, int arg0, int arg1, int arg2, int arg3, return UI_API_VERSION; case UI_INIT: - _UI_Init(arg0); + UI_Init(arg0); return 0; case UI_SHUTDOWN: - _UI_Shutdown(); + UI_Shutdown(); return 0; case UI_KEY_EVENT: - _UI_KeyEvent( arg0, arg1 ); + UI_KeyEvent( arg0, arg1 ); return 0; case UI_MOUSE_EVENT: - _UI_MouseEvent( arg0, arg1 ); + UI_MouseEvent( arg0, arg1 ); return 0; case UI_REFRESH: - _UI_Refresh( arg0 ); + UI_Refresh( arg0 ); return 0; case UI_IS_FULLSCREEN: - return _UI_IsFullscreen(); + return UI_IsFullscreen(); case UI_SET_ACTIVE_MENU: - _UI_SetActiveMenu( arg0 ); + UI_SetActiveMenu( arg0 ); return 0; case UI_CONSOLE_COMMAND: @@ -215,14 +190,14 @@ void AssetCache( void ) { uiInfo.uiDC.Assets.sliderThumb = trap_R_RegisterShaderNoMip( ASSET_SLIDER_THUMB ); } -void _UI_DrawSides(float x, float y, float w, float h, float size) { +void UI_DrawSides(float x, float y, float w, float h, float size) { UI_AdjustFrom640( &x, &y, &w, &h ); size *= uiInfo.uiDC.xscale; trap_R_DrawStretchPic( x, y, size, h, 0, 0, 0, 0, uiInfo.uiDC.whiteShader ); trap_R_DrawStretchPic( x + w - size, y, size, h, 0, 0, 0, 0, uiInfo.uiDC.whiteShader ); } -void _UI_DrawTopBottom(float x, float y, float w, float h, float size) { +void UI_DrawTopBottom(float x, float y, float w, float h, float size) { UI_AdjustFrom640( &x, &y, &w, &h ); size *= uiInfo.uiDC.yscale; trap_R_DrawStretchPic( x, y, w, size, 0, 0, 0, 0, uiInfo.uiDC.whiteShader ); @@ -235,40 +210,685 @@ UI_DrawRect Coordinates are 640*480 virtual values ================= */ -void _UI_DrawRect( float x, float y, float width, float height, float size, const float *color ) { +void UI_DrawRect( float x, float y, float width, float height, float size, const float *color ) { trap_R_SetColor( color ); - _UI_DrawTopBottom(x, y, width, height, size); - _UI_DrawSides(x, y, width, height, size); + UI_DrawTopBottom(x, y, width, height, size); + UI_DrawSides(x, y, width, height, size); trap_R_SetColor( NULL ); } -void UI_ShowPostGame(qboolean newHigh) { - trap_Cvar_Set ("cg_cameraOrbit", "0"); - trap_Cvar_Set("cg_thirdPerson", "0"); - trap_Cvar_Set( "sv_killserver", "1" ); - uiInfo.soundHighScore = newHigh; - _UI_SetActiveMenu(UIMENU_POSTGAME); +/* +================== +UI_InsertServerIntoDisplayList +================== +*/ +static void UI_InsertServerIntoDisplayList(int num, int position) { + int i; + + if (position < 0 || position > uiInfo.serverStatus.numDisplayServers ) { + return; + } + // + uiInfo.serverStatus.numDisplayServers++; + for (i = uiInfo.serverStatus.numDisplayServers; i > position; i--) { + uiInfo.serverStatus.displayServers[i] = uiInfo.serverStatus.displayServers[i-1]; + } + uiInfo.serverStatus.displayServers[position] = num; +} + +/* +================== +UI_RemoveServerFromDisplayList +================== +*/ +static void UI_RemoveServerFromDisplayList(int num) { + int i, j; + + for (i = 0; i < uiInfo.serverStatus.numDisplayServers; i++) { + if (uiInfo.serverStatus.displayServers[i] == num) { + uiInfo.serverStatus.numDisplayServers--; + for (j = i; j < uiInfo.serverStatus.numDisplayServers; j++) { + uiInfo.serverStatus.displayServers[j] = uiInfo.serverStatus.displayServers[j+1]; + } + return; + } + } +} + +/* +================== +UI_BinaryServerInsertion +================== +*/ +static void UI_BinaryServerInsertion(int num) { + int mid, offset, res, len; + + // use binary search to insert server + len = uiInfo.serverStatus.numDisplayServers; + mid = len; + offset = 0; + res = 0; + while(mid > 0) { + mid = len >> 1; + // + res = trap_LAN_CompareServers( ui_netSource.integer, uiInfo.serverStatus.sortKey, + uiInfo.serverStatus.sortDir, num, uiInfo.serverStatus.displayServers[offset+mid]); + // if equal + if (res == 0) { + UI_InsertServerIntoDisplayList(num, offset+mid); + return; + } + // if larger + else if (res == 1) { + offset += mid; + len -= mid; + } + // if smaller + else { + len -= mid; + } + } + if (res == 1) { + offset++; + } + UI_InsertServerIntoDisplayList(num, offset); +} + +typedef struct +{ + char *name, *altName; +} serverStatusCvar_t; + +serverStatusCvar_t serverStatusCvars[] = { + {"sv_hostname", "Name"}, + {"Address", ""}, + {"gamename", "Game name"}, + {"mapname", "Map"}, + {"version", ""}, + {"protocol", ""}, + {"timelimit", ""}, + {NULL, NULL} +}; + +/* +================== +UI_SortServerStatusInfo +================== +*/ +static void UI_SortServerStatusInfo( serverStatusInfo_t *info ) { + int i, j, index; + char *tmp1, *tmp2; + + index = 0; + for (i = 0; serverStatusCvars[i].name; i++) { + for (j = 0; j < info->numLines; j++) { + if ( !info->lines[j][1] || info->lines[j][1][0] ) { + continue; + } + if ( !Q_stricmp(serverStatusCvars[i].name, info->lines[j][0]) ) { + // swap lines + tmp1 = info->lines[index][0]; + tmp2 = info->lines[index][3]; + info->lines[index][0] = info->lines[j][0]; + info->lines[index][3] = info->lines[j][3]; + info->lines[j][0] = tmp1; + info->lines[j][3] = tmp2; + // + if ( strlen(serverStatusCvars[i].altName) ) { + info->lines[index][0] = serverStatusCvars[i].altName; + } + index++; + } + } + } +} + +/* +================== +UI_GetServerStatusInfo +================== +*/ +static int UI_GetServerStatusInfo( const char *serverAddress, serverStatusInfo_t *info ) { + char *p, *score, *ping, *name; + int i, len; + + if (!info) { + trap_LAN_ServerStatus( serverAddress, NULL, 0); + return qfalse; + } + memset(info, 0, sizeof(*info)); + if ( trap_LAN_ServerStatus( serverAddress, info->text, sizeof(info->text)) ) { + Q_strncpyz(info->address, serverAddress, sizeof(info->address)); + p = info->text; + info->numLines = 0; + info->lines[info->numLines][0] = "Address"; + info->lines[info->numLines][1] = ""; + info->lines[info->numLines][2] = ""; + info->lines[info->numLines][3] = info->address; + info->numLines++; + // get the cvars + while (p && *p) { + p = strchr(p, '\\'); + if (!p) break; + *p++ = '\0'; + if (*p == '\\') + break; + info->lines[info->numLines][0] = p; + info->lines[info->numLines][1] = ""; + info->lines[info->numLines][2] = ""; + p = strchr(p, '\\'); + if (!p) break; + *p++ = '\0'; + info->lines[info->numLines][3] = p; + + info->numLines++; + if (info->numLines >= MAX_SERVERSTATUS_LINES) + break; + } + // get the player list + if (info->numLines < MAX_SERVERSTATUS_LINES-3) { + // empty line + info->lines[info->numLines][0] = ""; + info->lines[info->numLines][1] = ""; + info->lines[info->numLines][2] = ""; + info->lines[info->numLines][3] = ""; + info->numLines++; + // header + info->lines[info->numLines][0] = "num"; + info->lines[info->numLines][1] = "score"; + info->lines[info->numLines][2] = "ping"; + info->lines[info->numLines][3] = "name"; + info->numLines++; + // parse players + i = 0; + len = 0; + while (p && *p) { + if (*p == '\\') + *p++ = '\0'; + if (!p) + break; + score = p; + p = strchr(p, ' '); + if (!p) + break; + *p++ = '\0'; + ping = p; + p = strchr(p, ' '); + if (!p) + break; + *p++ = '\0'; + name = p; + Com_sprintf(&info->pings[len], sizeof(info->pings)-len, "%d", i); + info->lines[info->numLines][0] = &info->pings[len]; + len += strlen(&info->pings[len]) + 1; + info->lines[info->numLines][1] = score; + info->lines[info->numLines][2] = ping; + info->lines[info->numLines][3] = name; + info->numLines++; + if (info->numLines >= MAX_SERVERSTATUS_LINES) + break; + p = strchr(p, '\\'); + if (!p) + break; + *p++ = '\0'; + // + i++; + } + } + UI_SortServerStatusInfo( info ); + return qtrue; + } + return qfalse; +} + +/* +================== +stristr +================== +*/ +static char *stristr(char *str, char *charset) { + int i; + + while(*str) { + for (i = 0; charset[i] && str[i]; i++) { + if (toupper(charset[i]) != toupper(str[i])) break; + } + if (!charset[i]) return str; + str++; + } + return NULL; +} + +/* +================== +UI_BuildFindPlayerList +================== +*/ +static void UI_FeederSelection(float feederID, int index); + +static void UI_BuildFindPlayerList(qboolean force) { + static int numFound, numTimeOuts; + int i, j, k, resend; + serverStatusInfo_t info; + char name[MAX_NAME_LENGTH+2]; + char infoString[MAX_STRING_CHARS]; + qboolean duplicate; + + if (!force) { + if (!uiInfo.nextFindPlayerRefresh || uiInfo.nextFindPlayerRefresh > uiInfo.uiDC.realTime) { + return; + } + } + else { + memset(&uiInfo.pendingServerStatus, 0, sizeof(uiInfo.pendingServerStatus)); + uiInfo.numFoundPlayerServers = 0; + uiInfo.currentFoundPlayerServer = 0; + trap_Cvar_VariableStringBuffer( "ui_findPlayer", uiInfo.findPlayerName, sizeof(uiInfo.findPlayerName)); + Q_CleanStr(uiInfo.findPlayerName); + // should have a string of some length + if (!strlen(uiInfo.findPlayerName)) { + uiInfo.nextFindPlayerRefresh = 0; + return; + } + // set resend time + resend = ui_serverStatusTimeOut.integer / 2 - 10; + if (resend < 50) { + resend = 50; + } + trap_Cvar_Set("cl_serverStatusResendTime", va("%d", resend)); + // reset all server status requests + trap_LAN_ServerStatus( NULL, NULL, 0); + // + uiInfo.numFoundPlayerServers = 1; + Com_sprintf(uiInfo.foundPlayerServerNames[uiInfo.numFoundPlayerServers-1], + sizeof(uiInfo.foundPlayerServerNames[uiInfo.numFoundPlayerServers-1]), + "searching %d...", uiInfo.pendingServerStatus.num); + numFound = 0; + numTimeOuts++; + } + for (i = 0; i < MAX_SERVERSTATUSREQUESTS; i++) { + // if this pending server is valid + if (uiInfo.pendingServerStatus.server[i].valid) { + // try to get the server status for this server + if (UI_GetServerStatusInfo( uiInfo.pendingServerStatus.server[i].adrstr, &info ) ) { + // + numFound++; + // parse through the server status lines + for (j = 0; j < info.numLines; j++) { + // should have ping info + if ( !info.lines[j][2] || !info.lines[j][2][0] ) { + continue; + } + // clean string first + Q_strncpyz(name, info.lines[j][3], sizeof(name)); + Q_CleanStr(name); + + duplicate = qfalse; + for( k = 0; k < uiInfo.numFoundPlayerServers - 1; k++ ) + { + if( Q_strncmp( uiInfo.foundPlayerServerAddresses[ k ], + uiInfo.pendingServerStatus.server[ i ].adrstr, + MAX_ADDRESSLENGTH ) == 0 ) + duplicate = qtrue; + } + + // if the player name is a substring + if( stristr( name, uiInfo.findPlayerName ) && !duplicate ) { + // add to found server list if we have space (always leave space for a line with the number found) + if (uiInfo.numFoundPlayerServers < MAX_FOUNDPLAYER_SERVERS-1) { + // + Q_strncpyz(uiInfo.foundPlayerServerAddresses[uiInfo.numFoundPlayerServers-1], + uiInfo.pendingServerStatus.server[i].adrstr, + sizeof(uiInfo.foundPlayerServerAddresses[0])); + Q_strncpyz(uiInfo.foundPlayerServerNames[uiInfo.numFoundPlayerServers-1], + uiInfo.pendingServerStatus.server[i].name, + sizeof(uiInfo.foundPlayerServerNames[0])); + uiInfo.numFoundPlayerServers++; + } + else { + // can't add any more so we're done + uiInfo.pendingServerStatus.num = uiInfo.serverStatus.numDisplayServers; + } + } + } + Com_sprintf(uiInfo.foundPlayerServerNames[uiInfo.numFoundPlayerServers-1], + sizeof(uiInfo.foundPlayerServerNames[uiInfo.numFoundPlayerServers-1]), + "searching %d/%d...", numFound, uiInfo.pendingServerStatus.num ); + // retrieved the server status so reuse this spot + uiInfo.pendingServerStatus.server[i].valid = qfalse; + } + } + // if empty pending slot or timed out + if (!uiInfo.pendingServerStatus.server[i].valid || + uiInfo.pendingServerStatus.server[i].startTime < uiInfo.uiDC.realTime - ui_serverStatusTimeOut.integer) { + if (uiInfo.pendingServerStatus.server[i].valid) { + numTimeOuts++; + } + // reset server status request for this address + UI_GetServerStatusInfo( uiInfo.pendingServerStatus.server[i].adrstr, NULL ); + // reuse pending slot + uiInfo.pendingServerStatus.server[i].valid = qfalse; + // if we didn't try to get the status of all servers in the main browser yet + if (uiInfo.pendingServerStatus.num < uiInfo.serverStatus.numDisplayServers) { + uiInfo.pendingServerStatus.server[i].startTime = uiInfo.uiDC.realTime; + trap_LAN_GetServerAddressString(ui_netSource.integer, uiInfo.serverStatus.displayServers[uiInfo.pendingServerStatus.num], + uiInfo.pendingServerStatus.server[i].adrstr, sizeof(uiInfo.pendingServerStatus.server[i].adrstr)); + trap_LAN_GetServerInfo(ui_netSource.integer, uiInfo.serverStatus.displayServers[uiInfo.pendingServerStatus.num], infoString, sizeof(infoString)); + Q_strncpyz(uiInfo.pendingServerStatus.server[i].name, Info_ValueForKey(infoString, "hostname"), sizeof(uiInfo.pendingServerStatus.server[0].name)); + uiInfo.pendingServerStatus.server[i].valid = qtrue; + uiInfo.pendingServerStatus.num++; + Com_sprintf(uiInfo.foundPlayerServerNames[uiInfo.numFoundPlayerServers-1], + sizeof(uiInfo.foundPlayerServerNames[uiInfo.numFoundPlayerServers-1]), + "searching %d/%d...", numFound, uiInfo.pendingServerStatus.num ); + } + } + } + for (i = 0; i < MAX_SERVERSTATUSREQUESTS; i++) { + if (uiInfo.pendingServerStatus.server[i].valid) { + break; + } + } + // if still trying to retrieve server status info + if (i < MAX_SERVERSTATUSREQUESTS) { + uiInfo.nextFindPlayerRefresh = uiInfo.uiDC.realTime + 25; + } + else { + // add a line that shows the number of servers found + if (!uiInfo.numFoundPlayerServers) { + Com_sprintf(uiInfo.foundPlayerServerNames[uiInfo.numFoundPlayerServers-1], sizeof(uiInfo.foundPlayerServerAddresses[0]), "no servers found"); + } + else { + Com_sprintf(uiInfo.foundPlayerServerNames[uiInfo.numFoundPlayerServers-1], sizeof(uiInfo.foundPlayerServerAddresses[0]), + "%d server%s found with player %s", uiInfo.numFoundPlayerServers-1, + uiInfo.numFoundPlayerServers == 2 ? "":"s", uiInfo.findPlayerName); + } + uiInfo.nextFindPlayerRefresh = 0; + // show the server status info for the selected server + UI_FeederSelection(FEEDER_FINDPLAYER, uiInfo.currentFoundPlayerServer); + } +} + +/* +================== +UI_BuildServerStatus +================== +*/ +static void UI_BuildServerStatus(qboolean force) { + + if (uiInfo.nextFindPlayerRefresh) { + return; + } + if (!force) { + if (!uiInfo.nextServerStatusRefresh || uiInfo.nextServerStatusRefresh > uiInfo.uiDC.realTime) { + return; + } + } + else { + Menu_SetFeederSelection(NULL, FEEDER_SERVERSTATUS, 0, NULL); + uiInfo.serverStatusInfo.numLines = 0; + // reset all server status requests + trap_LAN_ServerStatus( NULL, NULL, 0); + } + if (uiInfo.serverStatus.currentServer < 0 || uiInfo.serverStatus.currentServer > uiInfo.serverStatus.numDisplayServers || uiInfo.serverStatus.numDisplayServers == 0) { + return; + } + if (UI_GetServerStatusInfo( uiInfo.serverStatusAddress, &uiInfo.serverStatusInfo ) ) { + uiInfo.nextServerStatusRefresh = 0; + UI_GetServerStatusInfo( uiInfo.serverStatusAddress, NULL ); + } + else { + uiInfo.nextServerStatusRefresh = uiInfo.uiDC.realTime + 500; + } } + +/* +================== +UI_BuildServerDisplayList +================== +*/ +static void UI_BuildServerDisplayList(qboolean force) { + int i, count, clients, maxClients, ping, len, visible; + char info[MAX_STRING_CHARS]; + static int numinvisible; + + if (!(force || uiInfo.uiDC.realTime > uiInfo.serverStatus.nextDisplayRefresh)) { + return; + } + // if we shouldn't reset + if ( force == 2 ) { + force = 0; + } + + // do motd updates here too + trap_Cvar_VariableStringBuffer( "cl_motdString", uiInfo.serverStatus.motd, sizeof(uiInfo.serverStatus.motd) ); + len = strlen(uiInfo.serverStatus.motd); + if (len != uiInfo.serverStatus.motdLen) { + uiInfo.serverStatus.motdLen = len; + uiInfo.serverStatus.motdWidth = -1; + } + + if (force) { + numinvisible = 0; + // clear number of displayed servers + uiInfo.serverStatus.numDisplayServers = 0; + uiInfo.serverStatus.numPlayersOnServers = 0; + // set list box index to zero + Menu_SetFeederSelection(NULL, FEEDER_SERVERS, 0, NULL); + // mark all servers as visible so we store ping updates for them + trap_LAN_MarkServerVisible(ui_netSource.integer, -1, qtrue); + } + + // get the server count (comes from the master) + count = trap_LAN_GetServerCount(ui_netSource.integer); + if (count == -1 || (ui_netSource.integer == AS_LOCAL && count == 0) ) { + // still waiting on a response from the master + uiInfo.serverStatus.numDisplayServers = 0; + uiInfo.serverStatus.numPlayersOnServers = 0; + uiInfo.serverStatus.nextDisplayRefresh = uiInfo.uiDC.realTime + 500; + return; + } + + visible = qfalse; + for (i = 0; i < count; i++) { + // if we already got info for this server + if (!trap_LAN_ServerIsVisible(ui_netSource.integer, i)) { + continue; + } + visible = qtrue; + // get the ping for this server + ping = trap_LAN_GetServerPing(ui_netSource.integer, i); + if (ping > 0 || ui_netSource.integer == AS_FAVORITES) { + + trap_LAN_GetServerInfo(ui_netSource.integer, i, info, MAX_STRING_CHARS); + + clients = atoi(Info_ValueForKey(info, "clients")); + uiInfo.serverStatus.numPlayersOnServers += clients; + + if (ui_browserShowEmpty.integer == 0) { + if (clients == 0) { + trap_LAN_MarkServerVisible(ui_netSource.integer, i, qfalse); + continue; + } + } + + if (ui_browserShowFull.integer == 0) { + maxClients = atoi(Info_ValueForKey(info, "sv_maxclients")); + if (clients == maxClients) { + trap_LAN_MarkServerVisible(ui_netSource.integer, i, qfalse); + continue; + } + } + + // make sure we never add a favorite server twice + if (ui_netSource.integer == AS_FAVORITES) { + UI_RemoveServerFromDisplayList(i); + } + // insert the server into the list + UI_BinaryServerInsertion(i); + // done with this server + if (ping > 0) { + trap_LAN_MarkServerVisible(ui_netSource.integer, i, qfalse); + numinvisible++; + } + } + } + + uiInfo.serverStatus.refreshtime = uiInfo.uiDC.realTime; + + // if there were no servers visible for ping updates + if (!visible) { +// UI_StopServerRefresh(); +// uiInfo.serverStatus.nextDisplayRefresh = 0; + } +} + + +/* +================= +UI_StopServerRefresh +================= +*/ +static void UI_StopServerRefresh( void ) +{ + int count; + + if (!uiInfo.serverStatus.refreshActive) { + // not currently refreshing + return; + } + uiInfo.serverStatus.refreshActive = qfalse; + Com_Printf("%d servers listed in browser with %d players.\n", + uiInfo.serverStatus.numDisplayServers, + uiInfo.serverStatus.numPlayersOnServers); + count = trap_LAN_GetServerCount(ui_netSource.integer); + if (count - uiInfo.serverStatus.numDisplayServers > 0) { + Com_Printf("%d servers not listed due to packet loss or pings higher than %d\n", + count - uiInfo.serverStatus.numDisplayServers, + (int) trap_Cvar_VariableValue("cl_maxPing")); + } + +} + +/* +================= +UI_DoServerRefresh +================= +*/ +static void UI_DoServerRefresh( void ) +{ + qboolean wait = qfalse; + + if (!uiInfo.serverStatus.refreshActive) { + return; + } + if (ui_netSource.integer != AS_FAVORITES) { + if (ui_netSource.integer == AS_LOCAL) { + if (!trap_LAN_GetServerCount(ui_netSource.integer)) { + wait = qtrue; + } + } else { + if (trap_LAN_GetServerCount(ui_netSource.integer) < 0) { + wait = qtrue; + } + } + } + + if (uiInfo.uiDC.realTime < uiInfo.serverStatus.refreshtime) { + if (wait) { + return; + } + } + + // if still trying to retrieve pings + if (trap_LAN_UpdateVisiblePings(ui_netSource.integer)) { + uiInfo.serverStatus.refreshtime = uiInfo.uiDC.realTime + 1000; + } else if (!wait) { + // get the last servers in the list + UI_BuildServerDisplayList(2); + // stop the refresh + UI_StopServerRefresh(); + } + // + UI_BuildServerDisplayList(qfalse); +} + /* ================= -_UI_Refresh +UI_UpdatePendingPings ================= */ +static void UI_UpdatePendingPings( void ) { + trap_LAN_ResetPings(ui_netSource.integer); + uiInfo.serverStatus.refreshActive = qtrue; + uiInfo.serverStatus.refreshtime = uiInfo.uiDC.realTime + 1000; + +} + +/* +================= +UI_StartServerRefresh +================= +*/ +static void UI_StartServerRefresh(qboolean full) +{ + int i; + char *ptr; + int time; + qtime_t q; + + time = trap_RealTime(&q); + trap_Cvar_Set( va("ui_lastServerRefresh_%i_time", ui_netSource.integer ), + va( "%i", time ) ); + trap_Cvar_Set( va("ui_lastServerRefresh_%i", ui_netSource.integer), + va("%s-%i, %i at %i:%02i", MonthAbbrev[q.tm_mon],q.tm_mday, 1900+q.tm_year,q.tm_hour,q.tm_min)); + + if (!full) { + UI_UpdatePendingPings(); + return; + } + + uiInfo.serverStatus.refreshActive = qtrue; + uiInfo.serverStatus.nextDisplayRefresh = uiInfo.uiDC.realTime + 1000; + // clear number of displayed servers + uiInfo.serverStatus.numDisplayServers = 0; + uiInfo.serverStatus.numPlayersOnServers = 0; + // mark all servers as visible so we store ping updates for them + trap_LAN_MarkServerVisible(ui_netSource.integer, -1, qtrue); + // reset all the pings + trap_LAN_ResetPings(ui_netSource.integer); + // + if( ui_netSource.integer == AS_LOCAL ) { + trap_Cmd_ExecuteText( EXEC_NOW, "localservers\n" ); + uiInfo.serverStatus.refreshtime = uiInfo.uiDC.realTime + 1000; + return; + } + + uiInfo.serverStatus.refreshtime = uiInfo.uiDC.realTime + 5000; + if( ui_netSource.integer == AS_GLOBAL || ui_netSource.integer == AS_MPLAYER ) { + if( ui_netSource.integer == AS_GLOBAL ) { + i = 0; + } + else { + i = 1; + } -void UI_DrawCenteredPic(qhandle_t image, int w, int h) { - int x, y; - x = (SCREEN_WIDTH - w) / 2; - y = (SCREEN_HEIGHT - h) / 2; - UI_DrawHandlePic(x, y, w, h, image); + ptr = UI_Cvar_VariableString("debug_protocol"); + if (strlen(ptr)) { + trap_Cmd_ExecuteText( EXEC_NOW, va( "globalservers %d %s full empty\n", i, ptr)); + } + else { + trap_Cmd_ExecuteText( EXEC_NOW, va( "globalservers %d %d full empty\n", i, (int)trap_Cvar_VariableValue( "protocol" ) ) ); + } + } } int frameCount = 0; int startTime; #define UI_FPS_FRAMES 4 -void _UI_Refresh( int realtime ) +void UI_Refresh( int realtime ) { static int index; static int previousTimes[UI_FPS_FRAMES]; @@ -321,39 +941,13 @@ void _UI_Refresh( int realtime ) /* ================= -_UI_Shutdown +UI_Shutdown ================= */ -void _UI_Shutdown( void ) { +void UI_Shutdown( void ) { trap_LAN_SaveCachedServers(); } -char *defaultMenu = NULL; - -char *GetMenuBuffer(const char *filename) { - int len; - fileHandle_t f; - static char buf[MAX_MENUFILE]; - - len = trap_FS_FOpenFile( filename, &f, FS_READ ); - if ( !f ) { - trap_Print( va( S_COLOR_RED "menu file not found: %s, using default\n", filename ) ); - return defaultMenu; - } - if ( len >= MAX_MENUFILE ) { - trap_Print( va( S_COLOR_RED "menu file too large: %s is %i, max allowed is %i", filename, len, MAX_MENUFILE ) ); - trap_FS_FCloseFile( f ); - return defaultMenu; - } - - trap_FS_Read( buf, len, f ); - buf[len] = 0; - trap_FS_FCloseFile( f ); - //COM_Compress(buf); - return buf; - -} - qboolean Asset_Parse(int handle) { pc_token_t token; const char *tempStr; @@ -505,27 +1099,14 @@ qboolean Asset_Parse(int handle) { return qfalse; } -void Font_Report( void ) { - int i; - Com_Printf("Font Info\n"); - Com_Printf("=========\n"); - for ( i = 32; i < 96; i++) { - Com_Printf("Glyph handle %i: %i\n", i, uiInfo.uiDC.Assets.textFont.glyphs[i].glyph); - } -} - void UI_Report( void ) { String_Report(); - //Font_Report(); - } void UI_ParseMenu(const char *menuFile) { int handle; pc_token_t token; - /*Com_Printf("Parsing menu file:%s\n", menuFile);*/ - handle = trap_Parse_LoadSource(menuFile); if (!handle) { return; @@ -606,8 +1187,6 @@ void UI_LoadMenus(const char *menuFile, qboolean reset) { trap_Error( va( S_COLOR_RED "default menu file not found: ui/menus.txt, unable to continue!\n" ) ); } - ui_new.integer = 1; - if (reset) { Menu_Reset(); } @@ -654,130 +1233,6 @@ void UI_Load( void ) { } -static const char *handicapValues[] = {"None","95","90","85","80","75","70","65","60","55","50","45","40","35","30","25","20","15","10","5",NULL}; - -static void UI_DrawHandicap(rectDef_t *rect, float scale, vec4_t color, int textStyle) { - int i, h; - - h = Com_Clamp( 5, 100, trap_Cvar_VariableValue("handicap") ); - i = 20 - h / 5; - - UI_Text_Paint(rect->x, rect->y, scale, color, handicapValues[i], 0, 0, textStyle); -} - -static void UI_DrawClanName(rectDef_t *rect, float scale, vec4_t color, int textStyle) { - UI_Text_Paint(rect->x, rect->y, scale, color, UI_Cvar_VariableString("ui_teamName"), 0, 0, textStyle); -} - - -static void UI_SetCapFragLimits(qboolean uiVars) { - int cap = 5; - int frag = 10; - if (uiVars) { - trap_Cvar_Set("ui_captureLimit", va("%d", cap)); - trap_Cvar_Set("ui_fragLimit", va("%d", frag)); - } else { - trap_Cvar_Set("capturelimit", va("%d", cap)); - trap_Cvar_Set("fraglimit", va("%d", frag)); - } -} -// ui_gameType assumes gametype 0 is -1 ALL and will not show -static void UI_DrawGameType(rectDef_t *rect, float scale, vec4_t color, int textStyle) { - UI_Text_Paint(rect->x, rect->y, scale, color, uiInfo.gameTypes[ui_gameType.integer].gameType, 0, 0, textStyle); -} - -static void UI_DrawNetGameType(rectDef_t *rect, float scale, vec4_t color, int textStyle) { - if (ui_netGameType.integer < 0 || ui_netGameType.integer > uiInfo.numGameTypes) { - trap_Cvar_Set("ui_netGameType", "0"); - trap_Cvar_Set("ui_actualNetGameType", "0"); - } - UI_Text_Paint(rect->x, rect->y, scale, color, uiInfo.gameTypes[ui_netGameType.integer].gameType , 0, 0, textStyle); -} - -static void UI_DrawJoinGameType(rectDef_t *rect, float scale, vec4_t color, int textStyle) { - if (ui_joinGameType.integer < 0 || ui_joinGameType.integer > uiInfo.numJoinGameTypes) { - trap_Cvar_Set("ui_joinGameType", "0"); - } - UI_Text_Paint(rect->x, rect->y, scale, color, uiInfo.joinGameTypes[ui_joinGameType.integer].gameType , 0, 0, textStyle); -} - - - -static int UI_TeamIndexFromName(const char *name) { - int i; - - if (name && *name) { - for (i = 0; i < uiInfo.teamCount; i++) { - if (Q_stricmp(name, uiInfo.teamList[i].teamName) == 0) { - return i; - } - } - } - - return 0; - -} - -static void UI_DrawClanLogo(rectDef_t *rect, float scale, vec4_t color) { - int i; - i = UI_TeamIndexFromName(UI_Cvar_VariableString("ui_teamName")); - if (i >= 0 && i < uiInfo.teamCount) { - trap_R_SetColor( color ); - - if (uiInfo.teamList[i].teamIcon == -1) { - uiInfo.teamList[i].teamIcon = trap_R_RegisterShaderNoMip(uiInfo.teamList[i].imageName); - uiInfo.teamList[i].teamIcon_Metal = trap_R_RegisterShaderNoMip(va("%s_metal",uiInfo.teamList[i].imageName)); - uiInfo.teamList[i].teamIcon_Name = trap_R_RegisterShaderNoMip(va("%s_name", uiInfo.teamList[i].imageName)); - } - - UI_DrawHandlePic( rect->x, rect->y, rect->w, rect->h, uiInfo.teamList[i].teamIcon); - trap_R_SetColor(NULL); - } -} - -static void UI_DrawClanCinematic(rectDef_t *rect, float scale, vec4_t color) { - int i; - i = UI_TeamIndexFromName(UI_Cvar_VariableString("ui_teamName")); - if (i >= 0 && i < uiInfo.teamCount) { - - if (uiInfo.teamList[i].cinematic >= -2) { - if (uiInfo.teamList[i].cinematic == -1) { - uiInfo.teamList[i].cinematic = trap_CIN_PlayCinematic(va("%s.roq", uiInfo.teamList[i].imageName), 0, 0, 0, 0, (CIN_loop | CIN_silent) ); - } - if (uiInfo.teamList[i].cinematic >= 0) { - trap_CIN_RunCinematic(uiInfo.teamList[i].cinematic); - trap_CIN_SetExtents(uiInfo.teamList[i].cinematic, rect->x, rect->y, rect->w, rect->h); - trap_CIN_DrawCinematic(uiInfo.teamList[i].cinematic); - } else { - trap_R_SetColor( color ); - UI_DrawHandlePic( rect->x, rect->y, rect->w, rect->h, uiInfo.teamList[i].teamIcon_Metal); - trap_R_SetColor(NULL); - uiInfo.teamList[i].cinematic = -2; - } - } else { - trap_R_SetColor( color ); - UI_DrawHandlePic( rect->x, rect->y, rect->w, rect->h, uiInfo.teamList[i].teamIcon); - trap_R_SetColor(NULL); - } - } - -} - -static void UI_DrawPreviewCinematic(rectDef_t *rect, float scale, vec4_t color) { - if (uiInfo.previewMovie > -2) { - uiInfo.previewMovie = trap_CIN_PlayCinematic(va("%s.roq", uiInfo.movieList[uiInfo.movieIndex]), 0, 0, 0, 0, (CIN_loop | CIN_silent) ); - if (uiInfo.previewMovie >= 0) { - trap_CIN_RunCinematic(uiInfo.previewMovie); - trap_CIN_SetExtents(uiInfo.previewMovie, rect->x, rect->y, rect->w, rect->h); - trap_CIN_DrawCinematic(uiInfo.previewMovie); - } else { - uiInfo.previewMovie = -2; - } - } - -} - - /* =============== UI_DrawInfoPane @@ -882,98 +1337,24 @@ static void UI_DrawInfoPane( menuItem_t *item, rectDef_t *rect, float text_x, fl } -static void UI_DrawSkill(rectDef_t *rect, float scale, vec4_t color, int textStyle) { - int i; - i = trap_Cvar_VariableValue( "g_spSkill" ); - if (i < 1 || i > numSkillLevels) { - i = 1; - } - UI_Text_Paint(rect->x, rect->y, scale, color, skillLevels[i-1],0, 0, textStyle); -} - - -static void UI_DrawTeamName(rectDef_t *rect, float scale, vec4_t color, qboolean blue, int textStyle) { - int i; - i = UI_TeamIndexFromName(UI_Cvar_VariableString((blue) ? "ui_blueTeam" : "ui_redTeam")); - if (i >= 0 && i < uiInfo.teamCount) { - UI_Text_Paint(rect->x, rect->y, scale, color, va("%s: %s", (blue) ? "Blue" : "Red", uiInfo.teamList[i].teamName),0, 0, textStyle); - } -} - -static void UI_DrawTeamMember(rectDef_t *rect, float scale, vec4_t color, qboolean blue, int num, int textStyle) { - // 0 - None - // 1 - Human - // 2..NumCharacters - Bot - int value = trap_Cvar_VariableValue(va(blue ? "ui_blueteam%i" : "ui_redteam%i", num)); - const char *text; - if (value <= 0) { - text = "Closed"; - } else if (value == 1) { - text = "Human"; - } else { - value -= 2; - - if( value >= UI_GetNumBots( ) ) - value = 0; - - text = UI_GetBotNameByNumber(value); - } - UI_Text_Paint(rect->x, rect->y, scale, color, text, 0, 0, textStyle); -} - -static void UI_DrawMapPreview(rectDef_t *rect, float scale, vec4_t color, qboolean net) { - int map = (net) ? ui_currentNetMap.integer : ui_currentMap.integer; - if (map < 0 || map > uiInfo.mapCount) { - if (net) { - ui_currentNetMap.integer = 0; - trap_Cvar_Set("ui_currentNetMap", "0"); - } else { - ui_currentMap.integer = 0; - trap_Cvar_Set("ui_currentMap", "0"); - } - map = 0; - } - - if (uiInfo.mapList[map].levelShot == -1) { - uiInfo.mapList[map].levelShot = trap_R_RegisterShaderNoMip(uiInfo.mapList[map].imageName); - } - - if (uiInfo.mapList[map].levelShot > 0) { - UI_DrawHandlePic( rect->x, rect->y, rect->w, rect->h, uiInfo.mapList[map].levelShot); +static void UI_DrawServerMapPreview(rectDef_t *rect, float scale, vec4_t color) { + if (uiInfo.serverStatus.currentServerCinematic >= 0) { + trap_CIN_RunCinematic(uiInfo.serverStatus.currentServerCinematic); + trap_CIN_SetExtents(uiInfo.serverStatus.currentServerCinematic, rect->x, rect->y, rect->w, rect->h); + trap_CIN_DrawCinematic(uiInfo.serverStatus.currentServerCinematic); + } else if (uiInfo.serverStatus.currentServerPreview > 0) { + UI_DrawHandlePic( rect->x, rect->y, rect->w, rect->h, uiInfo.serverStatus.currentServerPreview); } else { UI_DrawHandlePic( rect->x, rect->y, rect->w, rect->h, trap_R_RegisterShaderNoMip("gfx/2d/load_screen")); } } +static void UI_DrawSelectedMapPreview(rectDef_t *rect, float scale, vec4_t color) { + int map = ui_selectedMap.integer; -static void UI_DrawMapTimeToBeat(rectDef_t *rect, float scale, vec4_t color, int textStyle) { - int minutes, seconds, time; - if (ui_currentMap.integer < 0 || ui_currentMap.integer > uiInfo.mapCount) { - ui_currentMap.integer = 0; - trap_Cvar_Set("ui_currentMap", "0"); - } - - time = uiInfo.mapList[ui_currentMap.integer].timeToBeat[uiInfo.gameTypes[ui_gameType.integer].gtEnum]; - - minutes = time / 60; - seconds = time % 60; - - UI_Text_Paint(rect->x, rect->y, scale, color, va("%02i:%02i", minutes, seconds), 0, 0, textStyle); -} - - - -static void UI_DrawMapCinematic(rectDef_t *rect, float scale, vec4_t color, qboolean net) { - - int map = (net) ? ui_currentNetMap.integer : ui_currentMap.integer; if (map < 0 || map > uiInfo.mapCount) { - if (net) { - ui_currentNetMap.integer = 0; - trap_Cvar_Set("ui_currentNetMap", "0"); - } else { - ui_currentMap.integer = 0; - trap_Cvar_Set("ui_currentMap", "0"); - } + ui_selectedMap.integer = 0; + trap_Cvar_Set("ui_selectedMap", "0"); map = 0; } @@ -989,329 +1370,25 @@ static void UI_DrawMapCinematic(rectDef_t *rect, float scale, vec4_t color, qboo uiInfo.mapList[map].cinematic = -2; } } else { - UI_DrawMapPreview(rect, scale, color, net); - } -} - - - -static qboolean updateModel = qtrue; -static qboolean q3Model = qfalse; - -static void UI_DrawPlayerModel(rectDef_t *rect) { - static playerInfo_t info; - char model[MAX_QPATH]; - char team[256]; - char head[256]; - vec3_t viewangles; - vec3_t moveangles; - - if (trap_Cvar_VariableValue("ui_Q3Model")) { - strcpy(model, UI_Cvar_VariableString("model")); - strcpy(head, UI_Cvar_VariableString("headmodel")); - if (!q3Model) { - q3Model = qtrue; - updateModel = qtrue; - } - team[0] = '\0'; - } else { - - strcpy(team, UI_Cvar_VariableString("ui_teamName")); - strcpy(model, UI_Cvar_VariableString("team_model")); - strcpy(head, UI_Cvar_VariableString("team_headmodel")); - if (q3Model) { - q3Model = qfalse; - updateModel = qtrue; - } - } - if (updateModel) { - memset( &info, 0, sizeof(playerInfo_t) ); - viewangles[YAW] = 180 - 10; - viewangles[PITCH] = 0; - viewangles[ROLL] = 0; - VectorClear( moveangles ); - UI_PlayerInfo_SetModel( &info, model, head, team); - UI_PlayerInfo_SetInfo( &info, LEGS_IDLE, TORSO_STAND, viewangles, vec3_origin, WP_MACHINEGUN, qfalse ); -// UI_RegisterClientModelname( &info, model, head, team); - updateModel = qfalse; - } - - UI_DrawPlayer( rect->x, rect->y, rect->w, rect->h, &info, uiInfo.uiDC.realTime / 2); - -} - -static void UI_DrawNetMapPreview(rectDef_t *rect, float scale, vec4_t color) { - - if (uiInfo.serverStatus.currentServerPreview > 0) { - UI_DrawHandlePic( rect->x, rect->y, rect->w, rect->h, uiInfo.serverStatus.currentServerPreview); - } else { - UI_DrawHandlePic( rect->x, rect->y, rect->w, rect->h, trap_R_RegisterShaderNoMip("gfx/2d/load_screen")); - } -} - -static void UI_DrawNetMapCinematic(rectDef_t *rect, float scale, vec4_t color) { - if (ui_currentNetMap.integer < 0 || ui_currentNetMap.integer > uiInfo.mapCount) { - ui_currentNetMap.integer = 0; - trap_Cvar_Set("ui_currentNetMap", "0"); - } - - if (uiInfo.serverStatus.currentServerCinematic >= 0) { - trap_CIN_RunCinematic(uiInfo.serverStatus.currentServerCinematic); - trap_CIN_SetExtents(uiInfo.serverStatus.currentServerCinematic, rect->x, rect->y, rect->w, rect->h); - trap_CIN_DrawCinematic(uiInfo.serverStatus.currentServerCinematic); - } else { - UI_DrawNetMapPreview(rect, scale, color); - } -} - - - -static void UI_DrawTier(rectDef_t *rect, float scale, vec4_t color, int textStyle) { - int i; - i = trap_Cvar_VariableValue( "ui_currentTier" ); - if (i < 0 || i >= uiInfo.tierCount) { - i = 0; - } - UI_Text_Paint(rect->x, rect->y, scale, color, va("Tier: %s", uiInfo.tierList[i].tierName),0, 0, textStyle); -} - -static void UI_DrawTierMap(rectDef_t *rect, int index) { - int i; - i = trap_Cvar_VariableValue( "ui_currentTier" ); - if (i < 0 || i >= uiInfo.tierCount) { - i = 0; - } - - if (uiInfo.tierList[i].mapHandles[index] == -1) { - uiInfo.tierList[i].mapHandles[index] = trap_R_RegisterShaderNoMip(va("levelshots/%s", uiInfo.tierList[i].maps[index])); - } - - UI_DrawHandlePic( rect->x, rect->y, rect->w, rect->h, uiInfo.tierList[i].mapHandles[index]); -} - -static const char *UI_EnglishMapName(const char *map) { - int i; - for (i = 0; i < uiInfo.mapCount; i++) { - if (Q_stricmp(map, uiInfo.mapList[i].mapLoadName) == 0) { - return uiInfo.mapList[i].mapName; - } - } - return ""; -} - -static void UI_DrawTierMapName(rectDef_t *rect, float scale, vec4_t color, int textStyle) { - int i, j; - i = trap_Cvar_VariableValue( "ui_currentTier" ); - if (i < 0 || i >= uiInfo.tierCount) { - i = 0; - } - j = trap_Cvar_VariableValue("ui_currentMap"); - if (j < 0 || j > MAPS_PER_TIER) { - j = 0; - } - - UI_Text_Paint(rect->x, rect->y, scale, color, UI_EnglishMapName(uiInfo.tierList[i].maps[j]), 0, 0, textStyle); -} - -static void UI_DrawTierGameType(rectDef_t *rect, float scale, vec4_t color, int textStyle) { - int i, j; - i = trap_Cvar_VariableValue( "ui_currentTier" ); - if (i < 0 || i >= uiInfo.tierCount) { - i = 0; - } - j = trap_Cvar_VariableValue("ui_currentMap"); - if (j < 0 || j > MAPS_PER_TIER) { - j = 0; - } - - UI_Text_Paint(rect->x, rect->y, scale, color, uiInfo.gameTypes[uiInfo.tierList[i].gameTypes[j]].gameType , 0, 0, textStyle); -} - - -static const char *UI_AIFromName(const char *name) { - int j; - for (j = 0; j < uiInfo.aliasCount; j++) { - if (Q_stricmp(uiInfo.aliasList[j].name, name) == 0) { - return uiInfo.aliasList[j].ai; - } - } - return ""; -} - -static qboolean updateOpponentModel = qtrue; -static void UI_DrawOpponent(rectDef_t *rect) { - static playerInfo_t info2; - char model[MAX_QPATH]; - char headmodel[MAX_QPATH]; - char team[256]; - vec3_t viewangles; - vec3_t moveangles; - - if (updateOpponentModel) { - - strcpy(model, UI_Cvar_VariableString("ui_opponentModel")); - strcpy(headmodel, UI_Cvar_VariableString("ui_opponentModel")); - team[0] = '\0'; - - memset( &info2, 0, sizeof(playerInfo_t) ); - viewangles[YAW] = 180 - 10; - viewangles[PITCH] = 0; - viewangles[ROLL] = 0; - VectorClear( moveangles ); - UI_PlayerInfo_SetModel( &info2, model, headmodel, ""); - UI_PlayerInfo_SetInfo( &info2, LEGS_IDLE, TORSO_STAND, viewangles, vec3_origin, WP_MACHINEGUN, qfalse ); - UI_RegisterClientModelname( &info2, model, headmodel, team); - updateOpponentModel = qfalse; - } - - UI_DrawPlayer( rect->x, rect->y, rect->w, rect->h, &info2, uiInfo.uiDC.realTime / 2); - -} - -static void UI_NextOpponent( void ) { - int i = UI_TeamIndexFromName(UI_Cvar_VariableString("ui_opponentName")); - int j = UI_TeamIndexFromName(UI_Cvar_VariableString("ui_teamName")); - i++; - if (i >= uiInfo.teamCount) { - i = 0; - } - if (i == j) { - i++; - if ( i >= uiInfo.teamCount) { - i = 0; + if (uiInfo.mapList[map].levelShot == -1) { + uiInfo.mapList[map].levelShot = trap_R_RegisterShaderNoMip(uiInfo.mapList[map].imageName); } - } - trap_Cvar_Set( "ui_opponentName", uiInfo.teamList[i].teamName ); -} -static void UI_PriorOpponent( void ) { - int i = UI_TeamIndexFromName(UI_Cvar_VariableString("ui_opponentName")); - int j = UI_TeamIndexFromName(UI_Cvar_VariableString("ui_teamName")); - i--; - if (i < 0) { - i = uiInfo.teamCount - 1; - } - if (i == j) { - i--; - if ( i < 0) { - i = uiInfo.teamCount - 1; + if (uiInfo.mapList[map].levelShot > 0) { + UI_DrawHandlePic( rect->x, rect->y, rect->w, rect->h, uiInfo.mapList[map].levelShot); + } else { + UI_DrawHandlePic( rect->x, rect->y, rect->w, rect->h, trap_R_RegisterShaderNoMip("gfx/2d/load_screen")); } } - trap_Cvar_Set( "ui_opponentName", uiInfo.teamList[i].teamName ); -} - -static void UI_DrawPlayerLogo(rectDef_t *rect, vec3_t color) { - int i = UI_TeamIndexFromName(UI_Cvar_VariableString("ui_teamName")); - - if (uiInfo.teamList[i].teamIcon == -1) { - uiInfo.teamList[i].teamIcon = trap_R_RegisterShaderNoMip(uiInfo.teamList[i].imageName); - uiInfo.teamList[i].teamIcon_Metal = trap_R_RegisterShaderNoMip(va("%s_metal",uiInfo.teamList[i].imageName)); - uiInfo.teamList[i].teamIcon_Name = trap_R_RegisterShaderNoMip(va("%s_name", uiInfo.teamList[i].imageName)); - } - - trap_R_SetColor( color ); - UI_DrawHandlePic( rect->x, rect->y, rect->w, rect->h, uiInfo.teamList[i].teamIcon ); - trap_R_SetColor( NULL ); -} - -static void UI_DrawPlayerLogoMetal(rectDef_t *rect, vec3_t color) { - int i = UI_TeamIndexFromName(UI_Cvar_VariableString("ui_teamName")); - if (uiInfo.teamList[i].teamIcon == -1) { - uiInfo.teamList[i].teamIcon = trap_R_RegisterShaderNoMip(uiInfo.teamList[i].imageName); - uiInfo.teamList[i].teamIcon_Metal = trap_R_RegisterShaderNoMip(va("%s_metal",uiInfo.teamList[i].imageName)); - uiInfo.teamList[i].teamIcon_Name = trap_R_RegisterShaderNoMip(va("%s_name", uiInfo.teamList[i].imageName)); - } - - trap_R_SetColor( color ); - UI_DrawHandlePic( rect->x, rect->y, rect->w, rect->h, uiInfo.teamList[i].teamIcon_Metal ); - trap_R_SetColor( NULL ); -} - -static void UI_DrawPlayerLogoName(rectDef_t *rect, vec3_t color) { - int i = UI_TeamIndexFromName(UI_Cvar_VariableString("ui_teamName")); - if (uiInfo.teamList[i].teamIcon == -1) { - uiInfo.teamList[i].teamIcon = trap_R_RegisterShaderNoMip(uiInfo.teamList[i].imageName); - uiInfo.teamList[i].teamIcon_Metal = trap_R_RegisterShaderNoMip(va("%s_metal",uiInfo.teamList[i].imageName)); - uiInfo.teamList[i].teamIcon_Name = trap_R_RegisterShaderNoMip(va("%s_name", uiInfo.teamList[i].imageName)); - } - - trap_R_SetColor( color ); - UI_DrawHandlePic( rect->x, rect->y, rect->w, rect->h, uiInfo.teamList[i].teamIcon_Name ); - trap_R_SetColor( NULL ); } -static void UI_DrawOpponentLogo(rectDef_t *rect, vec3_t color) { - int i = UI_TeamIndexFromName(UI_Cvar_VariableString("ui_opponentName")); - if (uiInfo.teamList[i].teamIcon == -1) { - uiInfo.teamList[i].teamIcon = trap_R_RegisterShaderNoMip(uiInfo.teamList[i].imageName); - uiInfo.teamList[i].teamIcon_Metal = trap_R_RegisterShaderNoMip(va("%s_metal",uiInfo.teamList[i].imageName)); - uiInfo.teamList[i].teamIcon_Name = trap_R_RegisterShaderNoMip(va("%s_name", uiInfo.teamList[i].imageName)); - } - - trap_R_SetColor( color ); - UI_DrawHandlePic( rect->x, rect->y, rect->w, rect->h, uiInfo.teamList[i].teamIcon ); - trap_R_SetColor( NULL ); -} - -static void UI_DrawOpponentLogoMetal(rectDef_t *rect, vec3_t color) { - int i = UI_TeamIndexFromName(UI_Cvar_VariableString("ui_opponentName")); - if (uiInfo.teamList[i].teamIcon == -1) { - uiInfo.teamList[i].teamIcon = trap_R_RegisterShaderNoMip(uiInfo.teamList[i].imageName); - uiInfo.teamList[i].teamIcon_Metal = trap_R_RegisterShaderNoMip(va("%s_metal",uiInfo.teamList[i].imageName)); - uiInfo.teamList[i].teamIcon_Name = trap_R_RegisterShaderNoMip(va("%s_name", uiInfo.teamList[i].imageName)); - } - - trap_R_SetColor( color ); - UI_DrawHandlePic( rect->x, rect->y, rect->w, rect->h, uiInfo.teamList[i].teamIcon_Metal ); - trap_R_SetColor( NULL ); -} - -static void UI_DrawOpponentLogoName(rectDef_t *rect, vec3_t color) { - int i = UI_TeamIndexFromName(UI_Cvar_VariableString("ui_opponentName")); - if (uiInfo.teamList[i].teamIcon == -1) { - uiInfo.teamList[i].teamIcon = trap_R_RegisterShaderNoMip(uiInfo.teamList[i].imageName); - uiInfo.teamList[i].teamIcon_Metal = trap_R_RegisterShaderNoMip(va("%s_metal",uiInfo.teamList[i].imageName)); - uiInfo.teamList[i].teamIcon_Name = trap_R_RegisterShaderNoMip(va("%s_name", uiInfo.teamList[i].imageName)); - } - - trap_R_SetColor( color ); - UI_DrawHandlePic( rect->x, rect->y, rect->w, rect->h, uiInfo.teamList[i].teamIcon_Name ); - trap_R_SetColor( NULL ); -} - -static void UI_DrawAllMapsSelection(rectDef_t *rect, float scale, vec4_t color, int textStyle, qboolean net) { - int map = (net) ? ui_currentNetMap.integer : ui_currentMap.integer; +static void UI_DrawSelectedMapName(rectDef_t *rect, float scale, vec4_t color, int textStyle) { + int map = ui_selectedMap.integer; if (map >= 0 && map < uiInfo.mapCount) { UI_Text_Paint(rect->x, rect->y, scale, color, uiInfo.mapList[map].mapName, 0, 0, textStyle); } } -static void UI_DrawPlayerListSelection( rectDef_t *rect, float scale, - vec4_t color, int textStyle ) -{ - if( uiInfo.playerIndex >= 0 && uiInfo.playerIndex < uiInfo.playerCount ) - { - UI_Text_Paint(rect->x, rect->y, scale, color, - uiInfo.rawPlayerNames[ uiInfo.playerIndex ], - 0, 0, textStyle); - } -} - -static void UI_DrawTeamListSelection( rectDef_t *rect, float scale, - vec4_t color, int textStyle ) -{ - if( uiInfo.teamIndex >= 0 && uiInfo.teamIndex < uiInfo.myTeamCount ) - { - UI_Text_Paint(rect->x, rect->y, scale, color, - uiInfo.rawTeamNames[ uiInfo.teamIndex ], - 0, 0, textStyle); - } -} - -static void UI_DrawOpponentName(rectDef_t *rect, float scale, vec4_t color, int textStyle) { - UI_Text_Paint(rect->x, rect->y, scale, color, UI_Cvar_VariableString("ui_opponentName"), 0, 0, textStyle); -} - static const char *UI_OwnerDrawText(int ownerDraw) { const char *s = NULL; @@ -1324,13 +1401,6 @@ static const char *UI_OwnerDrawText(int ownerDraw) { s = netSources[ui_netSource.integer]; break; - case UI_NETFILTER: - if (ui_serverFilterType.integer < 0 || ui_serverFilterType.integer > numServerFilters) { - ui_serverFilterType.integer = 0; - } - s = serverFilters[ui_serverFilterType.integer].description; - break; - case UI_KEYBINDSTATUS: if (Display_KeyBindPending()) { s = "Waiting for new key... Press ESCAPE to cancel"; @@ -1371,101 +1441,17 @@ static const char *UI_OwnerDrawText(int ownerDraw) { } static int UI_OwnerDrawWidth(int ownerDraw, float scale) { - int i, h, value; - const char *text; const char *s = NULL; switch( ownerDraw ) { - case UI_HANDICAP: - h = Com_Clamp( 5, 100, trap_Cvar_VariableValue("handicap") ); - i = 20 - h / 5; - s = handicapValues[i]; - break; - case UI_CLANNAME: - s = UI_Cvar_VariableString("ui_teamName"); - break; - case UI_GAMETYPE: - s = uiInfo.gameTypes[ui_gameType.integer].gameType; - break; - case UI_SKILL: - i = trap_Cvar_VariableValue( "g_spSkill" ); - if (i < 1 || i > numSkillLevels) { - i = 1; - } - s = skillLevels[i-1]; - break; - case UI_BLUETEAMNAME: - i = UI_TeamIndexFromName(UI_Cvar_VariableString("ui_blueTeam")); - if (i >= 0 && i < uiInfo.teamCount) { - s = va("%s: %s", "Blue", uiInfo.teamList[i].teamName); - } - break; - case UI_REDTEAMNAME: - i = UI_TeamIndexFromName(UI_Cvar_VariableString("ui_redTeam")); - if (i >= 0 && i < uiInfo.teamCount) { - s = va("%s: %s", "Red", uiInfo.teamList[i].teamName); - } - break; - case UI_BLUETEAM1: - case UI_BLUETEAM2: - case UI_BLUETEAM3: - case UI_BLUETEAM4: - case UI_BLUETEAM5: - value = trap_Cvar_VariableValue(va("ui_blueteam%i", ownerDraw-UI_BLUETEAM1 + 1)); - if (value <= 0) { - text = "Closed"; - } else if (value == 1) { - text = "Human"; - } else { - value -= 2; - if (value >= uiInfo.aliasCount) { - value = 0; - } - text = uiInfo.aliasList[value].name; - } - s = va("%i. %s", ownerDraw-UI_BLUETEAM1 + 1, text); - break; - case UI_REDTEAM1: - case UI_REDTEAM2: - case UI_REDTEAM3: - case UI_REDTEAM4: - case UI_REDTEAM5: - value = trap_Cvar_VariableValue(va("ui_redteam%i", ownerDraw-UI_REDTEAM1 + 1)); - if (value <= 0) { - text = "Closed"; - } else if (value == 1) { - text = "Human"; - } else { - value -= 2; - if (value >= uiInfo.aliasCount) { - value = 0; - } - text = uiInfo.aliasList[value].name; - } - s = va("%i. %s", ownerDraw-UI_REDTEAM1 + 1, text); - break; case UI_NETSOURCE: - case UI_NETFILTER: case UI_KEYBINDSTATUS: case UI_SERVERREFRESHDATE: case UI_SERVERMOTD: s = UI_OwnerDrawText( ownerDraw ); break; - case UI_TIER: - break; - case UI_TIER_MAPNAME: - break; - case UI_TIER_GAMETYPE: - break; - case UI_ALLMAPS_SELECTION: - break; - case UI_PLAYERLIST_SELECTION: - break; - case UI_TEAMLIST_SELECTION: - break; - case UI_OPPONENT_NAME: - break; + default: break; } @@ -1476,28 +1462,6 @@ static int UI_OwnerDrawWidth(int ownerDraw, float scale) { return 0; } -static void UI_DrawBotName(rectDef_t *rect, float scale, vec4_t color, int textStyle) { - int value = uiInfo.botIndex; - const char *text = ""; - - if( value >= UI_GetNumBots( ) ) - value = 0; - - text = UI_GetBotNameByNumber( value ); - - UI_Text_Paint(rect->x, rect->y, scale, color, text, 0, 0, textStyle); -} - -static void UI_DrawBotSkill(rectDef_t *rect, float scale, vec4_t color, int textStyle) { - if (uiInfo.skillIndex >= 0 && uiInfo.skillIndex < numSkillLevels) { - UI_Text_Paint(rect->x, rect->y, scale, color, skillLevels[uiInfo.skillIndex], 0, 0, textStyle); - } -} - -static void UI_DrawRedBlue(rectDef_t *rect, float scale, vec4_t color, int textStyle) { - UI_Text_Paint(rect->x, rect->y, scale, color, (uiInfo.redBlue == 0) ? "Red" : "Blue", 0, 0, textStyle); -} - /* =============== UI_BuildPlayerList @@ -1511,7 +1475,6 @@ static void UI_BuildPlayerList( void ) { trap_GetClientState( &cs ); trap_GetConfigString( CS_PLAYERS + cs.clientNum, info, MAX_INFO_STRING ); uiInfo.playerNumber = cs.clientNum; - uiInfo.teamLeader = atoi(Info_ValueForKey(info, "tl")); team = atoi(Info_ValueForKey(info, "t")); trap_GetConfigString( CS_SERVERINFO, info, sizeof(info) ); count = atoi( Info_ValueForKey( info, "sv_maxclients" ) ); @@ -1549,35 +1512,6 @@ static void UI_BuildPlayerList( void ) { } } } - - if (!uiInfo.teamLeader) { - trap_Cvar_Set("cg_selectedPlayer", va("%d", playerTeamNumber)); - } - - n = trap_Cvar_VariableValue("cg_selectedPlayer"); - if (n < 0 || n > uiInfo.myTeamCount) { - n = 0; - } - if (n < uiInfo.myTeamCount) { - trap_Cvar_Set("cg_selectedPlayerName", uiInfo.teamNames[n]); - } -} - - -static void UI_DrawSelectedPlayer(rectDef_t *rect, float scale, vec4_t color, int textStyle) { - char name[ MAX_NAME_LENGTH ]; - char *s; - - if (uiInfo.uiDC.realTime > uiInfo.playerRefresh) { - uiInfo.playerRefresh = uiInfo.uiDC.realTime + 3000; - UI_BuildPlayerList(); - } - if( uiInfo.teamLeader ) - s = UI_Cvar_VariableString("cg_selectedPlayerName"); - else - s = UI_Cvar_VariableString("name"); - Q_strncpyz( name, s, sizeof( name ) ); - UI_Text_Paint(rect->x, rect->y, scale, color, name, 0, 0, textStyle); } static void UI_DrawGLInfo( rectDef_t *rect, float scale, int textalign, int textvalign, @@ -1612,7 +1546,7 @@ static void UI_OwnerDraw( float x, float y, float w, float h, switch( ownerDraw ) { case UI_TEAMINFOPANE: - UI_DrawInfoPane( &uiInfo.tremTeamList[ uiInfo.tremTeamIndex ], + UI_DrawInfoPane( &uiInfo.teamList[ uiInfo.teamIndex ], &rect, text_x, text_y, scale, textalign, textvalign, color, textStyle ); break; @@ -1651,140 +1585,18 @@ static void UI_OwnerDraw( float x, float y, float w, float h, &rect, text_x, text_y, scale, textalign, textvalign, color, textStyle ); break; - case UI_HANDICAP: - UI_DrawHandicap(&rect, scale, color, textStyle); - break; - case UI_PLAYERMODEL: - UI_DrawPlayerModel(&rect); - break; - case UI_CLANNAME: - UI_DrawClanName(&rect, scale, color, textStyle); - break; - case UI_CLANLOGO: - UI_DrawClanLogo(&rect, scale, color); - break; - case UI_CLANCINEMATIC: - UI_DrawClanCinematic(&rect, scale, color); - break; - case UI_PREVIEWCINEMATIC: - UI_DrawPreviewCinematic(&rect, scale, color); - break; - case UI_GAMETYPE: - UI_DrawGameType(&rect, scale, color, textStyle); - break; - case UI_NETGAMETYPE: - UI_DrawNetGameType(&rect, scale, color, textStyle); - break; - case UI_JOINGAMETYPE: - UI_DrawJoinGameType(&rect, scale, color, textStyle); - break; - case UI_MAPPREVIEW: - UI_DrawMapPreview(&rect, scale, color, qtrue); - break; - case UI_MAP_TIMETOBEAT: - UI_DrawMapTimeToBeat(&rect, scale, color, textStyle); - break; - case UI_MAPCINEMATIC: - UI_DrawMapCinematic(&rect, scale, color, qfalse); - break; - case UI_STARTMAPCINEMATIC: - UI_DrawMapCinematic(&rect, scale, color, qtrue); - break; - case UI_SKILL: - UI_DrawSkill(&rect, scale, color, textStyle); - break; - case UI_BLUETEAMNAME: - UI_DrawTeamName(&rect, scale, color, qtrue, textStyle); - break; - case UI_REDTEAMNAME: - UI_DrawTeamName(&rect, scale, color, qfalse, textStyle); - break; - case UI_BLUETEAM1: - case UI_BLUETEAM2: - case UI_BLUETEAM3: - case UI_BLUETEAM4: - case UI_BLUETEAM5: - UI_DrawTeamMember(&rect, scale, color, qtrue, ownerDraw - UI_BLUETEAM1 + 1, textStyle); - break; - case UI_REDTEAM1: - case UI_REDTEAM2: - case UI_REDTEAM3: - case UI_REDTEAM4: - case UI_REDTEAM5: - UI_DrawTeamMember(&rect, scale, color, qfalse, ownerDraw - UI_REDTEAM1 + 1, textStyle); - break; case UI_NETMAPPREVIEW: - UI_DrawNetMapPreview(&rect, scale, color); - break; - case UI_NETMAPCINEMATIC: - UI_DrawNetMapCinematic(&rect, scale, color); - break; - case UI_TIER: - UI_DrawTier(&rect, scale, color, textStyle); - break; - case UI_OPPONENTMODEL: - UI_DrawOpponent(&rect); - break; - case UI_TIERMAP1: - UI_DrawTierMap(&rect, 0); - break; - case UI_TIERMAP2: - UI_DrawTierMap(&rect, 1); - break; - case UI_TIERMAP3: - UI_DrawTierMap(&rect, 2); - break; - case UI_PLAYERLOGO: - UI_DrawPlayerLogo(&rect, color); - break; - case UI_PLAYERLOGO_METAL: - UI_DrawPlayerLogoMetal(&rect, color); - break; - case UI_PLAYERLOGO_NAME: - UI_DrawPlayerLogoName(&rect, color); - break; - case UI_OPPONENTLOGO: - UI_DrawOpponentLogo(&rect, color); - break; - case UI_OPPONENTLOGO_METAL: - UI_DrawOpponentLogoMetal(&rect, color); - break; - case UI_OPPONENTLOGO_NAME: - UI_DrawOpponentLogoName(&rect, color); - break; - case UI_TIER_MAPNAME: - UI_DrawTierMapName(&rect, scale, color, textStyle); - break; - case UI_TIER_GAMETYPE: - UI_DrawTierGameType(&rect, scale, color, textStyle); - break; - case UI_ALLMAPS_SELECTION: - UI_DrawAllMapsSelection(&rect, scale, color, textStyle, qtrue); - break; - case UI_MAPS_SELECTION: - UI_DrawAllMapsSelection(&rect, scale, color, textStyle, qfalse); - break; - case UI_PLAYERLIST_SELECTION: - UI_DrawPlayerListSelection(&rect, scale, color, textStyle); + UI_DrawServerMapPreview(&rect, scale, color); break; - case UI_TEAMLIST_SELECTION: - UI_DrawTeamListSelection(&rect, scale, color, textStyle); - break; - case UI_OPPONENT_NAME: - UI_DrawOpponentName(&rect, scale, color, textStyle); - break; - case UI_BOTNAME: - UI_DrawBotName(&rect, scale, color, textStyle); - break; - case UI_BOTSKILL: - UI_DrawBotSkill(&rect, scale, color, textStyle); - break; - case UI_REDBLUE: - UI_DrawRedBlue(&rect, scale, color, textStyle); + + case UI_SELECTEDMAPPREVIEW: + UI_DrawSelectedMapPreview(&rect, scale, color); break; - case UI_SELECTEDPLAYER: - UI_DrawSelectedPlayer(&rect, scale, color, textStyle); + + case UI_SELECTEDMAPNAME: + UI_DrawSelectedMapName(&rect, scale, color, textStyle); break; + case UI_GLINFO: UI_DrawGLInfo(&rect, scale, textalign, textvalign, color, textStyle, text_x, text_y); break; @@ -1863,29 +1675,6 @@ static qboolean UI_OwnerDrawVisible(int flags) { flags &= ~UI_SHOW_CANTEAMVOTE; } - if (flags & UI_SHOW_LEADER) { - // these need to show when this client can give orders to a player or a group - if (!uiInfo.teamLeader) { - vis = qfalse; - } else { - // if showing yourself - if (ui_selectedPlayer.integer < uiInfo.myTeamCount && uiInfo.teamClientNums[ui_selectedPlayer.integer] == uiInfo.playerNumber) { - vis = qfalse; - } - } - flags &= ~UI_SHOW_LEADER; - } - if (flags & UI_SHOW_NOTLEADER) { - // these need to show when this client is assigning their own status or they are NOT the leader - if (uiInfo.teamLeader) { - // if not showing yourself - if (!(ui_selectedPlayer.integer < uiInfo.myTeamCount && uiInfo.teamClientNums[ui_selectedPlayer.integer] == uiInfo.playerNumber)) { - vis = qfalse; - } - // these need to show when this client can give orders to a player or a group - } - flags &= ~UI_SHOW_NOTLEADER; - } if (flags & UI_SHOW_FAVORITESERVERS) { // this assumes you only put this type of display flag on something showing in the proper context if (ui_netSource.integer != AS_FAVORITES) { @@ -1893,38 +1682,13 @@ static qboolean UI_OwnerDrawVisible(int flags) { } flags &= ~UI_SHOW_FAVORITESERVERS; } + if (flags & UI_SHOW_NOTFAVORITESERVERS) { // this assumes you only put this type of display flag on something showing in the proper context if (ui_netSource.integer == AS_FAVORITES) { vis = qfalse; } flags &= ~UI_SHOW_NOTFAVORITESERVERS; - } - if (flags & UI_SHOW_NEWHIGHSCORE) { - if (uiInfo.newHighScoreTime < uiInfo.uiDC.realTime) { - vis = qfalse; - } else { - if (uiInfo.soundHighScore) { - if (trap_Cvar_VariableValue("sv_killserver") == 0) { - // wait on server to go down before playing sound - trap_S_StartLocalSound(uiInfo.newHighScoreSound, CHAN_ANNOUNCER); - uiInfo.soundHighScore = qfalse; - } - } - } - flags &= ~UI_SHOW_NEWHIGHSCORE; - } - if (flags & UI_SHOW_NEWBESTTIME) { - if (uiInfo.newBestTime < uiInfo.uiDC.realTime) { - vis = qfalse; - } - flags &= ~UI_SHOW_NEWBESTTIME; - } - if (flags & UI_SHOW_DEMOAVAILABLE) { - if (!uiInfo.demoAvailable) { - vis = qfalse; - } - flags &= ~UI_SHOW_DEMOAVAILABLE; } else { flags = 0; } @@ -1932,208 +1696,6 @@ static qboolean UI_OwnerDrawVisible(int flags) { return vis; } -static qboolean UI_Handicap_HandleKey(int flags, float *special, int key) { - if (key == K_MOUSE1 || key == K_MOUSE2 || key == K_ENTER || key == K_KP_ENTER) { - int h; - h = Com_Clamp( 5, 100, trap_Cvar_VariableValue("handicap") ); - if (key == K_MOUSE2) { - h -= 5; - } else { - h += 5; - } - if (h > 100) { - h = 5; - } else if (h < 0) { - h = 100; - } - trap_Cvar_Set( "handicap", va( "%i", h) ); - return qtrue; - } - return qfalse; -} - -static qboolean UI_ClanName_HandleKey(int flags, float *special, int key) { - if (key == K_MOUSE1 || key == K_MOUSE2 || key == K_ENTER || key == K_KP_ENTER) { - int i; - i = UI_TeamIndexFromName(UI_Cvar_VariableString("ui_teamName")); - if (uiInfo.teamList[i].cinematic >= 0) { - trap_CIN_StopCinematic(uiInfo.teamList[i].cinematic); - uiInfo.teamList[i].cinematic = -1; - } - if (key == K_MOUSE2) { - i--; - } else { - i++; - } - if (i >= uiInfo.teamCount) { - i = 0; - } else if (i < 0) { - i = uiInfo.teamCount - 1; - } - trap_Cvar_Set( "ui_teamName", uiInfo.teamList[i].teamName); - UI_HeadCountByTeam(); - UI_FeederSelection(FEEDER_HEADS, 0); - updateModel = qtrue; - return qtrue; - } - return qfalse; -} - -static qboolean UI_GameType_HandleKey(int flags, float *special, int key, qboolean resetMap) { - if (key == K_MOUSE1 || key == K_MOUSE2 || key == K_ENTER || key == K_KP_ENTER) { - int oldCount = UI_MapCountByGameType(qtrue); - - // hard coded mess here - if (key == K_MOUSE2) { - ui_gameType.integer--; - if (ui_gameType.integer == 2) { - ui_gameType.integer = 1; - } else if (ui_gameType.integer < 2) { - ui_gameType.integer = uiInfo.numGameTypes - 1; - } - } else { - ui_gameType.integer++; - if (ui_gameType.integer >= uiInfo.numGameTypes) { - ui_gameType.integer = 1; - } else if (ui_gameType.integer == 2) { - ui_gameType.integer = 3; - } - } - - trap_Cvar_Set("ui_Q3Model", "0"); - - trap_Cvar_Set("ui_gameType", va("%d", ui_gameType.integer)); - UI_SetCapFragLimits(qtrue); - UI_LoadBestScores(uiInfo.mapList[ui_currentMap.integer].mapLoadName, uiInfo.gameTypes[ui_gameType.integer].gtEnum); - if (resetMap && oldCount != UI_MapCountByGameType(qtrue)) { - trap_Cvar_Set( "ui_currentMap", "0"); - Menu_SetFeederSelection(NULL, FEEDER_MAPS, 0, NULL); - } - return qtrue; - } - return qfalse; -} - -static qboolean UI_NetGameType_HandleKey(int flags, float *special, int key) { - if (key == K_MOUSE1 || key == K_MOUSE2 || key == K_ENTER || key == K_KP_ENTER) { - - if (key == K_MOUSE2) { - ui_netGameType.integer--; - } else { - ui_netGameType.integer++; - } - - if (ui_netGameType.integer < 0) { - ui_netGameType.integer = uiInfo.numGameTypes - 1; - } else if (ui_netGameType.integer >= uiInfo.numGameTypes) { - ui_netGameType.integer = 0; - } - - trap_Cvar_Set( "ui_netGameType", va("%d", ui_netGameType.integer)); - trap_Cvar_Set( "ui_actualnetGameType", va("%d", uiInfo.gameTypes[ui_netGameType.integer].gtEnum)); - trap_Cvar_Set( "ui_currentNetMap", "0"); - UI_MapCountByGameType(qfalse); - Menu_SetFeederSelection(NULL, FEEDER_ALLMAPS, 0, NULL); - return qtrue; - } - return qfalse; -} - -static qboolean UI_JoinGameType_HandleKey(int flags, float *special, int key) { - if (key == K_MOUSE1 || key == K_MOUSE2 || key == K_ENTER || key == K_KP_ENTER) { - - if (key == K_MOUSE2) { - ui_joinGameType.integer--; - } else { - ui_joinGameType.integer++; - } - - if (ui_joinGameType.integer < 0) { - ui_joinGameType.integer = uiInfo.numJoinGameTypes - 1; - } else if (ui_joinGameType.integer >= uiInfo.numJoinGameTypes) { - ui_joinGameType.integer = 0; - } - - trap_Cvar_Set( "ui_joinGameType", va("%d", ui_joinGameType.integer)); - UI_BuildServerDisplayList(qtrue); - return qtrue; - } - return qfalse; -} - - - -static qboolean UI_Skill_HandleKey(int flags, float *special, int key) { - if (key == K_MOUSE1 || key == K_MOUSE2 || key == K_ENTER || key == K_KP_ENTER) { - int i = trap_Cvar_VariableValue( "g_spSkill" ); - - if (key == K_MOUSE2) { - i--; - } else { - i++; - } - - if (i < 1) { - i = numSkillLevels; - } else if (i > numSkillLevels) { - i = 1; - } - - trap_Cvar_Set("g_spSkill", va("%i", i)); - return qtrue; - } - return qfalse; -} - -static qboolean UI_TeamName_HandleKey(int flags, float *special, int key, qboolean blue) { - if (key == K_MOUSE1 || key == K_MOUSE2 || key == K_ENTER || key == K_KP_ENTER) { - int i; - i = UI_TeamIndexFromName(UI_Cvar_VariableString((blue) ? "ui_blueTeam" : "ui_redTeam")); - - if (key == K_MOUSE2) { - i--; - } else { - i++; - } - - if (i >= uiInfo.teamCount) { - i = 0; - } else if (i < 0) { - i = uiInfo.teamCount - 1; - } - - trap_Cvar_Set( (blue) ? "ui_blueTeam" : "ui_redTeam", uiInfo.teamList[i].teamName); - - return qtrue; - } - return qfalse; -} - -static qboolean UI_TeamMember_HandleKey(int flags, float *special, int key, qboolean blue, int num) { - if (key == K_MOUSE1 || key == K_MOUSE2 || key == K_ENTER || key == K_KP_ENTER) { - // 0 - None - // 1 - Human - // 2..NumCharacters - Bot - char *cvar = va(blue ? "ui_blueteam%i" : "ui_redteam%i", num); - int value = trap_Cvar_VariableValue(cvar); - - if (key == K_MOUSE2) { - value--; - } else { - value++; - } - - if( value >= UI_GetNumBots( ) + 2 ) - value = 0; - else if( value < 0 ) - value = UI_GetNumBots( ) + 2 - 1; - - trap_Cvar_Set(cvar, va("%i", value)); - return qtrue; - } - return qfalse; -} - static qboolean UI_NetSource_HandleKey(int flags, float *special, int key) { if (key == K_MOUSE1 || key == K_MOUSE2 || key == K_ENTER || key == K_KP_ENTER) { @@ -2163,181 +1725,12 @@ static qboolean UI_NetSource_HandleKey(int flags, float *special, int key) { return qfalse; } -static qboolean UI_NetFilter_HandleKey(int flags, float *special, int key) { - if (key == K_MOUSE1 || key == K_MOUSE2 || key == K_ENTER || key == K_KP_ENTER) { - - if (key == K_MOUSE2) { - ui_serverFilterType.integer--; - } else { - ui_serverFilterType.integer++; - } - - if (ui_serverFilterType.integer >= numServerFilters) { - ui_serverFilterType.integer = 0; - } else if (ui_serverFilterType.integer < 0) { - ui_serverFilterType.integer = numServerFilters - 1; - } - UI_BuildServerDisplayList(qtrue); - return qtrue; - } - return qfalse; -} - -static qboolean UI_OpponentName_HandleKey(int flags, float *special, int key) { - if (key == K_MOUSE1 || key == K_MOUSE2 || key == K_ENTER || key == K_KP_ENTER) { - if (key == K_MOUSE2) { - UI_PriorOpponent(); - } else { - UI_NextOpponent(); - } - return qtrue; - } - return qfalse; -} - -static qboolean UI_BotName_HandleKey(int flags, float *special, int key) { - if (key == K_MOUSE1 || key == K_MOUSE2 || key == K_ENTER || key == K_KP_ENTER) { - int value = uiInfo.botIndex; - - if (key == K_MOUSE2) { - value--; - } else { - value++; - } - - - if( value >= UI_GetNumBots( ) + 2 ) - value = 0; - else if( value < 0 ) - value = UI_GetNumBots( ) + 2 - 1; - - uiInfo.botIndex = value; - return qtrue; - } - return qfalse; -} - -static qboolean UI_BotSkill_HandleKey(int flags, float *special, int key) { - if (key == K_MOUSE1 || key == K_MOUSE2 || key == K_ENTER || key == K_KP_ENTER) { - if (key == K_MOUSE2) { - uiInfo.skillIndex--; - } else { - uiInfo.skillIndex++; - } - if (uiInfo.skillIndex >= numSkillLevels) { - uiInfo.skillIndex = 0; - } else if (uiInfo.skillIndex < 0) { - uiInfo.skillIndex = numSkillLevels-1; - } - return qtrue; - } - return qfalse; -} - -static qboolean UI_RedBlue_HandleKey(int flags, float *special, int key) { - if (key == K_MOUSE1 || key == K_MOUSE2 || key == K_ENTER || key == K_KP_ENTER) { - uiInfo.redBlue ^= 1; - return qtrue; - } - return qfalse; -} - - - -static qboolean UI_SelectedPlayer_HandleKey(int flags, float *special, int key) { - if (key == K_MOUSE1 || key == K_MOUSE2 || key == K_ENTER || key == K_KP_ENTER) { - int selected; - - UI_BuildPlayerList(); - if (!uiInfo.teamLeader) { - return qfalse; - } - selected = trap_Cvar_VariableValue("cg_selectedPlayer"); - - if (key == K_MOUSE2) { - selected--; - } else { - selected++; - } - - if (selected > uiInfo.myTeamCount) { - selected = 0; - } else if (selected < 0) { - selected = uiInfo.myTeamCount; - } - - if (selected == uiInfo.myTeamCount) { - trap_Cvar_Set( "cg_selectedPlayerName", "Everyone"); - } else { - trap_Cvar_Set( "cg_selectedPlayerName", uiInfo.teamNames[selected]); - } - trap_Cvar_Set( "cg_selectedPlayer", va("%d", selected)); - } - return qfalse; -} - - static qboolean UI_OwnerDrawHandleKey(int ownerDraw, int flags, float *special, int key) { switch (ownerDraw) { - case UI_HANDICAP: - return UI_Handicap_HandleKey(flags, special, key); - break; - case UI_CLANNAME: - return UI_ClanName_HandleKey(flags, special, key); - break; - case UI_GAMETYPE: - return UI_GameType_HandleKey(flags, special, key, qtrue); - break; - case UI_NETGAMETYPE: - return UI_NetGameType_HandleKey(flags, special, key); - break; - case UI_JOINGAMETYPE: - return UI_JoinGameType_HandleKey(flags, special, key); - break; - case UI_SKILL: - return UI_Skill_HandleKey(flags, special, key); - break; - case UI_BLUETEAMNAME: - return UI_TeamName_HandleKey(flags, special, key, qtrue); - break; - case UI_REDTEAMNAME: - return UI_TeamName_HandleKey(flags, special, key, qfalse); - break; - case UI_BLUETEAM1: - case UI_BLUETEAM2: - case UI_BLUETEAM3: - case UI_BLUETEAM4: - case UI_BLUETEAM5: - UI_TeamMember_HandleKey(flags, special, key, qtrue, ownerDraw - UI_BLUETEAM1 + 1); - break; - case UI_REDTEAM1: - case UI_REDTEAM2: - case UI_REDTEAM3: - case UI_REDTEAM4: - case UI_REDTEAM5: - UI_TeamMember_HandleKey(flags, special, key, qfalse, ownerDraw - UI_REDTEAM1 + 1); - break; case UI_NETSOURCE: UI_NetSource_HandleKey(flags, special, key); break; - case UI_NETFILTER: - UI_NetFilter_HandleKey(flags, special, key); - break; - case UI_OPPONENT_NAME: - UI_OpponentName_HandleKey(flags, special, key); - break; - case UI_BOTNAME: - return UI_BotName_HandleKey(flags, special, key); - break; - case UI_BOTSKILL: - return UI_BotSkill_HandleKey(flags, special, key); - break; - case UI_REDBLUE: - UI_RedBlue_HandleKey(flags, special, key); - break; - case UI_SELECTEDPLAYER: - UI_SelectedPlayer_HandleKey(flags, special, key); - break; + default: break; } @@ -2346,10 +1739,6 @@ static qboolean UI_OwnerDrawHandleKey(int ownerDraw, int flags, float *special, } -static float UI_GetValue(int ownerDraw) { - return 0; -} - /* ================= UI_ServersQsortCompare @@ -2417,22 +1806,22 @@ UI_LoadTeams */ static void UI_LoadTeams( void ) { - uiInfo.tremTeamCount = 4; + uiInfo.teamCount = 4; - uiInfo.tremTeamList[ 0 ].text = String_Alloc( "Aliens" ); - uiInfo.tremTeamList[ 0 ].cmd = String_Alloc( "cmd team aliens\n" ); - uiInfo.tremTeamList[ 0 ].type = INFOTYPE_TEXT; - uiInfo.tremTeamList[ 0 ].v.text = + uiInfo.teamList[ 0 ].text = String_Alloc( "Aliens" ); + uiInfo.teamList[ 0 ].cmd = String_Alloc( "cmd team aliens\n" ); + uiInfo.teamList[ 0 ].type = INFOTYPE_TEXT; + uiInfo.teamList[ 0 ].v.text = "The Alien Team\n\n" "The Aliens' strengths are in movement and the ability to " "quickly construct new bases quickly. They possess a range " "of abilities including basic melee attacks, movement-" "crippling poisons and more."; - uiInfo.tremTeamList[ 1 ].text = String_Alloc( "Humans" ); - uiInfo.tremTeamList[ 1 ].cmd = String_Alloc( "cmd team humans\n" ); - uiInfo.tremTeamList[ 1 ].type = INFOTYPE_TEXT; - uiInfo.tremTeamList[ 1 ].v.text = + uiInfo.teamList[ 1 ].text = String_Alloc( "Humans" ); + uiInfo.teamList[ 1 ].cmd = String_Alloc( "cmd team humans\n" ); + uiInfo.teamList[ 1 ].type = INFOTYPE_TEXT; + uiInfo.teamList[ 1 ].v.text = "The Human Team\n\n" "The humans are the masters of technology. Although their " "bases take long to construct, their automated defense " @@ -2440,15 +1829,15 @@ static void UI_LoadTeams( void ) "weapons are available to the humans, each contributing " "to eradicate the alien threat."; - uiInfo.tremTeamList[ 2 ].text = String_Alloc( "Spectate" ); - uiInfo.tremTeamList[ 2 ].cmd = String_Alloc( "cmd team spectate\n" ); - uiInfo.tremTeamList[ 2 ].type = INFOTYPE_TEXT; - uiInfo.tremTeamList[ 2 ].v.text = "Watch the game without playing."; + uiInfo.teamList[ 2 ].text = String_Alloc( "Spectate" ); + uiInfo.teamList[ 2 ].cmd = String_Alloc( "cmd team spectate\n" ); + uiInfo.teamList[ 2 ].type = INFOTYPE_TEXT; + uiInfo.teamList[ 2 ].v.text = "Watch the game without playing."; - uiInfo.tremTeamList[ 3 ].text = String_Alloc( "Auto select" ); - uiInfo.tremTeamList[ 3 ].cmd = String_Alloc( "cmd team auto\n" ); - uiInfo.tremTeamList[ 3 ].type = INFOTYPE_TEXT; - uiInfo.tremTeamList[ 3 ].v.text = "Join the team with the least players."; + uiInfo.teamList[ 3 ].text = String_Alloc( "Auto select" ); + uiInfo.teamList[ 3 ].cmd = String_Alloc( "cmd team auto\n" ); + uiInfo.teamList[ 3 ].type = INFOTYPE_TEXT; + uiInfo.teamList[ 3 ].v.text = "Join the team with the least players."; } /* @@ -2921,102 +2310,6 @@ static void UI_LoadDemos( void ) { } - -static qboolean UI_SetNextMap(int actual, int index) { - int i; - for (i = actual + 1; i < uiInfo.mapCount; i++) { - if (uiInfo.mapList[i].active) { - Menu_SetFeederSelection(NULL, FEEDER_MAPS, index + 1, "skirmish"); - return qtrue; - } - } - return qfalse; -} - - -static void UI_StartSkirmish(qboolean next) { - int i, k, g, delay, temp; - float skill; - char buff[MAX_STRING_CHARS]; - - if (next) { - int actual; - int index = trap_Cvar_VariableValue("ui_mapIndex"); - UI_MapCountByGameType(qtrue); - UI_SelectedMap(index, &actual); - if (UI_SetNextMap(actual, index)) { - } else { - UI_GameType_HandleKey(0, NULL, K_MOUSE1, qfalse); - UI_MapCountByGameType(qtrue); - Menu_SetFeederSelection(NULL, FEEDER_MAPS, 0, "skirmish"); - } - } - - g = uiInfo.gameTypes[ui_gameType.integer].gtEnum; - trap_Cvar_SetValue( "g_gametype", g ); - trap_Cmd_ExecuteText( EXEC_APPEND, va( "wait ; wait ; map %s\n", uiInfo.mapList[ui_currentMap.integer].mapLoadName) ); - skill = trap_Cvar_VariableValue( "g_spSkill" ); - trap_Cvar_Set("ui_scoreMap", uiInfo.mapList[ui_currentMap.integer].mapName); - - k = UI_TeamIndexFromName(UI_Cvar_VariableString("ui_opponentName")); - - trap_Cvar_Set("ui_singlePlayerActive", "1"); - - // set up sp overrides, will be replaced on postgame - temp = trap_Cvar_VariableValue( "capturelimit" ); - trap_Cvar_Set("ui_saveCaptureLimit", va("%i", temp)); - temp = trap_Cvar_VariableValue( "fraglimit" ); - trap_Cvar_Set("ui_saveFragLimit", va("%i", temp)); - - UI_SetCapFragLimits(qfalse); - - temp = trap_Cvar_VariableValue( "cg_drawTimer" ); - trap_Cvar_Set("ui_drawTimer", va("%i", temp)); - temp = trap_Cvar_VariableValue( "g_doWarmup" ); - trap_Cvar_Set("ui_doWarmup", va("%i", temp)); - temp = trap_Cvar_VariableValue( "g_friendlyFire" ); - trap_Cvar_Set("ui_friendlyFire", va("%i", temp)); - temp = trap_Cvar_VariableValue( "sv_maxClients" ); - trap_Cvar_Set("ui_maxClients", va("%i", temp)); - temp = trap_Cvar_VariableValue( "g_warmup" ); - trap_Cvar_Set("ui_Warmup", va("%i", temp)); - temp = trap_Cvar_VariableValue( "sv_pure" ); - trap_Cvar_Set("ui_pure", va("%i", temp)); - - trap_Cvar_Set("cg_cameraOrbit", "0"); - trap_Cvar_Set("cg_thirdPerson", "0"); - trap_Cvar_Set("cg_drawTimer", "1"); - trap_Cvar_Set("g_doWarmup", "1"); - trap_Cvar_Set("g_warmup", "15"); - trap_Cvar_Set("sv_pure", "0"); - trap_Cvar_Set("g_friendlyFire", "0"); - trap_Cvar_Set("g_redTeam", UI_Cvar_VariableString("ui_teamName")); - trap_Cvar_Set("g_blueTeam", UI_Cvar_VariableString("ui_opponentName")); - - if (trap_Cvar_VariableValue("ui_recordSPDemo")) { - Com_sprintf(buff, MAX_STRING_CHARS, "%s_%i", uiInfo.mapList[ui_currentMap.integer].mapLoadName, g); - trap_Cvar_Set("ui_recordSPDemoName", buff); - } - - delay = 500; - - { - temp = uiInfo.mapList[ui_currentMap.integer].teamMembers * 2; - trap_Cvar_Set("sv_maxClients", va("%d", temp)); - for (i =0; i < uiInfo.mapList[ui_currentMap.integer].teamMembers; i++) { - Com_sprintf( buff, sizeof(buff), "addbot %s %f %s %i %s\n", UI_AIFromName(uiInfo.teamList[k].teamMembers[i]), skill, "", delay, uiInfo.teamList[k].teamMembers[i]); - trap_Cmd_ExecuteText( EXEC_APPEND, buff ); - delay += 500; - } - k = UI_TeamIndexFromName(UI_Cvar_VariableString("ui_teamName")); - for (i =0; i < uiInfo.mapList[ui_currentMap.integer].teamMembers-1; i++) { - Com_sprintf( buff, sizeof(buff), "addbot %s %f %s %i %s\n", UI_AIFromName(uiInfo.teamList[k].teamMembers[i]), skill, "", delay, uiInfo.teamList[k].teamMembers[i]); - trap_Cmd_ExecuteText( EXEC_APPEND, buff ); - delay += 500; - } - } -} - static void UI_Update(const char *name) { int val = trap_Cvar_VariableValue(name); @@ -3065,14 +2358,12 @@ static void UI_Update(const char *name) { } else if (Q_stricmp(name, "ui_glCustom") == 0) { switch (val) { case 0: // high quality - trap_Cvar_SetValue( "r_fullScreen", 1 ); trap_Cvar_SetValue( "r_subdivisions", 4 ); trap_Cvar_SetValue( "r_vertexlight", 0 ); trap_Cvar_SetValue( "r_lodbias", 0 ); trap_Cvar_SetValue( "r_colorbits", 32 ); trap_Cvar_SetValue( "r_depthbits", 24 ); trap_Cvar_SetValue( "r_picmip", 0 ); - trap_Cvar_SetValue( "r_mode", 4 ); trap_Cvar_SetValue( "r_texturebits", 32 ); trap_Cvar_SetValue( "r_fastSky", 0 ); trap_Cvar_SetValue( "r_inGameVideo", 1 ); @@ -3082,14 +2373,12 @@ static void UI_Update(const char *name) { trap_Cvar_Set( "r_texturemode", "GL_LINEAR_MIPMAP_LINEAR" ); break; case 1: // normal - trap_Cvar_SetValue( "r_fullScreen", 1 ); trap_Cvar_SetValue( "r_subdivisions", 12 ); trap_Cvar_SetValue( "r_vertexlight", 0 ); trap_Cvar_SetValue( "r_lodbias", 0 ); trap_Cvar_SetValue( "r_colorbits", 0 ); trap_Cvar_SetValue( "r_depthbits", 24 ); trap_Cvar_SetValue( "r_picmip", 1 ); - trap_Cvar_SetValue( "r_mode", 3 ); trap_Cvar_SetValue( "r_texturebits", 0 ); trap_Cvar_SetValue( "r_fastSky", 0 ); trap_Cvar_SetValue( "r_inGameVideo", 1 ); @@ -3099,14 +2388,12 @@ static void UI_Update(const char *name) { trap_Cvar_SetValue( "cg_bounceParticles", 0 ); break; case 2: // fast - trap_Cvar_SetValue( "r_fullScreen", 1 ); trap_Cvar_SetValue( "r_subdivisions", 8 ); trap_Cvar_SetValue( "r_vertexlight", 0 ); trap_Cvar_SetValue( "r_lodbias", 1 ); trap_Cvar_SetValue( "r_colorbits", 0 ); trap_Cvar_SetValue( "r_depthbits", 0 ); trap_Cvar_SetValue( "r_picmip", 1 ); - trap_Cvar_SetValue( "r_mode", 3 ); trap_Cvar_SetValue( "r_texturebits", 0 ); trap_Cvar_SetValue( "cg_shadows", 0 ); trap_Cvar_SetValue( "r_fastSky", 1 ); @@ -3116,13 +2403,11 @@ static void UI_Update(const char *name) { trap_Cvar_Set( "r_texturemode", "GL_LINEAR_MIPMAP_NEAREST" ); break; case 3: // fastest - trap_Cvar_SetValue( "r_fullScreen", 1 ); trap_Cvar_SetValue( "r_subdivisions", 20 ); trap_Cvar_SetValue( "r_vertexlight", 1 ); trap_Cvar_SetValue( "r_lodbias", 2 ); trap_Cvar_SetValue( "r_colorbits", 16 ); trap_Cvar_SetValue( "r_depthbits", 16 ); - trap_Cvar_SetValue( "r_mode", 3 ); trap_Cvar_SetValue( "r_picmip", 2 ); trap_Cvar_SetValue( "r_texturebits", 16 ); trap_Cvar_SetValue( "cg_shadows", 0 ); @@ -3150,60 +2435,8 @@ static void UI_RunMenuScript(char **args) { if (String_Parse(args, &name)) { if (Q_stricmp(name, "StartServer") == 0) { - int i, clients, oldclients; - float skill; - trap_Cvar_Set("cg_thirdPerson", "0"); - trap_Cvar_Set("cg_cameraOrbit", "0"); - trap_Cvar_Set("ui_singlePlayerActive", "0"); trap_Cvar_SetValue( "dedicated", Com_Clamp( 0, 2, ui_dedicated.integer ) ); - trap_Cvar_SetValue( "g_gametype", Com_Clamp( 0, 8, uiInfo.gameTypes[ui_netGameType.integer].gtEnum ) ); - trap_Cvar_Set("g_redTeam", UI_Cvar_VariableString("ui_teamName")); - trap_Cvar_Set("g_blueTeam", UI_Cvar_VariableString("ui_opponentName")); - trap_Cmd_ExecuteText( EXEC_APPEND, va( "wait ; wait ; map %s\n", uiInfo.mapList[ui_currentNetMap.integer].mapLoadName ) ); - skill = trap_Cvar_VariableValue( "g_spSkill" ); - // set max clients based on spots - oldclients = trap_Cvar_VariableValue( "sv_maxClients" ); - clients = 0; - for (i = 0; i < PLAYERS_PER_TEAM; i++) { - int bot = trap_Cvar_VariableValue( va("ui_blueteam%i", i+1)); - if (bot >= 0) { - clients++; - } - bot = trap_Cvar_VariableValue( va("ui_redteam%i", i+1)); - if (bot >= 0) { - clients++; - } - } - if (clients == 0) { - clients = 8; - } - - if (oldclients > clients) { - clients = oldclients; - } - - trap_Cvar_Set("sv_maxClients", va("%d",clients)); - - for (i = 0; i < PLAYERS_PER_TEAM; i++) { - int bot = trap_Cvar_VariableValue( va("ui_blueteam%i", i+1)); - if (bot > 1) { - Com_sprintf( buff, sizeof(buff), "addbot %s %f \n", UI_GetBotNameByNumber(bot-2), skill); - trap_Cmd_ExecuteText( EXEC_APPEND, buff ); - } - bot = trap_Cvar_VariableValue( va("ui_redteam%i", i+1)); - if (bot > 1) { - Com_sprintf( buff, sizeof(buff), "addbot %s %f \n", UI_GetBotNameByNumber(bot-2), skill); - trap_Cmd_ExecuteText( EXEC_APPEND, buff ); - } - } - } else if (Q_stricmp(name, "updateSPMenu") == 0) { - UI_SetCapFragLimits(qtrue); - UI_MapCountByGameType(qtrue); - ui_mapIndex.integer = UI_GetIndexFromSelection(ui_currentMap.integer); - trap_Cvar_Set("ui_mapIndex", va("%d", ui_mapIndex.integer)); - Menu_SetFeederSelection(NULL, FEEDER_MAPS, ui_mapIndex.integer, "skirmish"); - UI_GameType_HandleKey(0, NULL, K_MOUSE1, qfalse); - UI_GameType_HandleKey(0, NULL, K_MOUSE2, qfalse); + trap_Cmd_ExecuteText( EXEC_APPEND, va( "wait ; wait ; map %s\n", uiInfo.mapList[ui_selectedMap.integer].mapLoadName ) ); } else if (Q_stricmp(name, "resetDefaults") == 0) { trap_Cmd_ExecuteText( EXEC_APPEND, "exec default.cfg\n"); trap_Cmd_ExecuteText( EXEC_APPEND, "cvar_restart\n"); @@ -3212,8 +2445,7 @@ static void UI_RunMenuScript(char **args) { trap_Cmd_ExecuteText( EXEC_APPEND, "vid_restart\n" ); } else if (Q_stricmp(name, "loadArenas") == 0) { UI_LoadArenas(); - UI_MapCountByGameType(qfalse); - Menu_SetFeederSelection(NULL, FEEDER_ALLMAPS, 0, "createserver"); + Menu_SetFeederSelection(NULL, FEEDER_MAPS, 0, "createserver"); } else if (Q_stricmp(name, "loadServerInfo") == 0) { UI_ServerInfo(); } else if (Q_stricmp(name, "saveControls") == 0) { @@ -3222,11 +2454,6 @@ static void UI_RunMenuScript(char **args) { Controls_GetConfig(); } else if (Q_stricmp(name, "clearError") == 0) { trap_Cvar_Set("com_errorMessage", ""); - } else if (Q_stricmp(name, "loadGameInfo") == 0) { -/* UI_ParseGameInfo("gameinfo.txt"); - UI_LoadBestScores(uiInfo.mapList[ui_currentMap.integer].mapLoadName, uiInfo.gameTypes[ui_gameType.integer].gtEnum);*/ - } else if (Q_stricmp(name, "resetScores") == 0) { - UI_ClearScores(); } else if (Q_stricmp(name, "RefreshServers") == 0) { UI_StartServerRefresh(qtrue); UI_BuildServerDisplayList(qtrue); @@ -3239,12 +2466,12 @@ static void UI_RunMenuScript(char **args) { if(!uiInfo.serverStatus.sorted && Int_Parse(args, &sortColumn)) { uiInfo.serverStatus.sortKey = sortColumn; - uiInfo.serverStatus.sortDir = 0; + uiInfo.serverStatus.sortDir = 0; } // refresh if older than 3 days or if list is empty last = atoi( UI_Cvar_VariableString( va( "ui_lastServerRefresh_%i_time", - ui_netSource.integer ) ) ); + ui_netSource.integer ) ) ); if( trap_LAN_GetServerCount( ui_netSource.integer ) < 1 || ( time - last ) > 3600 ) { @@ -3254,10 +2481,6 @@ static void UI_RunMenuScript(char **args) { } else if (Q_stricmp(name, "RefreshFilter") == 0) { UI_StartServerRefresh(qfalse); UI_BuildServerDisplayList(qtrue); - } else if (Q_stricmp(name, "RunSPDemo") == 0) { - if (uiInfo.demoAvailable) { - trap_Cmd_ExecuteText( EXEC_APPEND, va("demo %s_%i\n", uiInfo.mapList[ui_currentMap.integer].mapLoadName, uiInfo.gameTypes[ui_gameType.integer].gtEnum)); - } } else if (Q_stricmp(name, "LoadDemos") == 0) { UI_LoadDemos(); } else if (Q_stricmp(name, "LoadMovies") == 0) { @@ -3269,7 +2492,7 @@ static void UI_RunMenuScript(char **args) { UI_LoadTeams( ); else if( Q_stricmp( name, "JoinTeam" ) == 0 ) { - if( ( cmd = uiInfo.tremTeamList[ uiInfo.tremTeamIndex ].cmd ) ) + if( ( cmd = uiInfo.teamList[ uiInfo.teamIndex ].cmd ) ) trap_Cmd_ExecuteText( EXEC_APPEND, cmd ); } else if( Q_stricmp( name, "LoadHumanItems" ) == 0 ) @@ -3412,26 +2635,16 @@ static void UI_RunMenuScript(char **args) { uiInfo.serverStatusInfo.numLines = 0; Menu_SetFeederSelection(NULL, FEEDER_FINDPLAYER, 0, NULL); } else if (Q_stricmp(name, "JoinServer") == 0) { - trap_Cvar_Set("cg_thirdPerson", "0"); - trap_Cvar_Set("cg_cameraOrbit", "0"); - trap_Cvar_Set("ui_singlePlayerActive", "0"); if (uiInfo.serverStatus.currentServer >= 0 && uiInfo.serverStatus.currentServer < uiInfo.serverStatus.numDisplayServers) { trap_LAN_GetServerAddressString(ui_netSource.integer, uiInfo.serverStatus.displayServers[uiInfo.serverStatus.currentServer], buff, 1024); trap_Cmd_ExecuteText( EXEC_APPEND, va( "connect %s\n", buff ) ); } } else if (Q_stricmp(name, "FoundPlayerJoinServer") == 0) { - trap_Cvar_Set("ui_singlePlayerActive", "0"); if (uiInfo.currentFoundPlayerServer >= 0 && uiInfo.currentFoundPlayerServer < uiInfo.numFoundPlayerServers) { trap_Cmd_ExecuteText( EXEC_APPEND, va( "connect %s\n", uiInfo.foundPlayerServerAddresses[uiInfo.currentFoundPlayerServer] ) ); } } else if (Q_stricmp(name, "Quit") == 0) { - trap_Cvar_Set("ui_singlePlayerActive", "0"); trap_Cmd_ExecuteText( EXEC_NOW, "quit"); - } else if (Q_stricmp(name, "Controls") == 0) { - trap_Cvar_Set( "cl_paused", "1" ); - trap_Key_SetCatcher( KEYCATCH_UI ); - Menus_CloseAll(); - Menus_ActivateByName("setup_menu2"); } else if (Q_stricmp(name, "Leave") == 0) { trap_Cmd_ExecuteText( EXEC_APPEND, "disconnect\n" ); trap_Key_SetCatcher( KEYCATCH_UI ); @@ -3448,18 +2661,14 @@ static void UI_RunMenuScript(char **args) { UI_ServersSort(sortColumn, qtrue); uiInfo.serverStatus.sorted = qtrue; } - } else if (Q_stricmp(name, "nextSkirmish") == 0) { - UI_StartSkirmish(qtrue); - } else if (Q_stricmp(name, "SkirmishStart") == 0) { - UI_StartSkirmish(qfalse); } else if (Q_stricmp(name, "closeingame") == 0) { trap_Key_SetCatcher( trap_Key_GetCatcher() & ~KEYCATCH_UI ); trap_Key_ClearStates(); trap_Cvar_Set( "cl_paused", "0" ); Menus_CloseAll(); } else if (Q_stricmp(name, "voteMap") == 0) { - if (ui_currentNetMap.integer >=0 && ui_currentNetMap.integer < uiInfo.mapCount) { - trap_Cmd_ExecuteText( EXEC_APPEND, va("callvote map %s\n",uiInfo.mapList[ui_currentNetMap.integer].mapLoadName) ); + if (ui_selectedMap.integer >=0 && ui_selectedMap.integer < uiInfo.mapCount) { + trap_Cmd_ExecuteText( EXEC_APPEND, va("callvote map %s\n",uiInfo.mapList[ui_selectedMap.integer].mapLoadName) ); } } else if( Q_stricmp( name, "voteKick" ) == 0 ) @@ -3488,26 +2697,26 @@ static void UI_RunMenuScript(char **args) { } else if( Q_stricmp( name, "voteTeamKick" ) == 0 ) { - if( uiInfo.teamIndex >= 0 && uiInfo.teamIndex < uiInfo.myTeamCount ) + if( uiInfo.teamPlayerIndex >= 0 && uiInfo.teamPlayerIndex < uiInfo.myTeamCount ) { trap_Cmd_ExecuteText( EXEC_APPEND, va( "callteamvote kick %d\n", - uiInfo.teamClientNums[ uiInfo.teamIndex ] ) ); + uiInfo.teamClientNums[ uiInfo.teamPlayerIndex ] ) ); } } else if( Q_stricmp( name, "voteTeamDenyBuild" ) == 0 ) { - if( uiInfo.teamIndex >= 0 && uiInfo.teamIndex < uiInfo.myTeamCount ) + if( uiInfo.teamPlayerIndex >= 0 && uiInfo.teamPlayerIndex < uiInfo.myTeamCount ) { trap_Cmd_ExecuteText( EXEC_APPEND, va( "callteamvote denybuild %d\n", - uiInfo.teamClientNums[ uiInfo.teamIndex ] ) ); + uiInfo.teamClientNums[ uiInfo.teamPlayerIndex ] ) ); } } else if( Q_stricmp( name, "voteTeamAllowBuild" ) == 0 ) { - if( uiInfo.teamIndex >= 0 && uiInfo.teamIndex < uiInfo.myTeamCount ) + if( uiInfo.teamPlayerIndex >= 0 && uiInfo.teamPlayerIndex < uiInfo.myTeamCount ) { trap_Cmd_ExecuteText( EXEC_APPEND, va( "callteamvote allowbuild %d\n", - uiInfo.teamClientNums[ uiInfo.teamIndex ] ) ); + uiInfo.teamClientNums[ uiInfo.teamPlayerIndex ] ) ); } } else if (Q_stricmp(name, "addFavorite") == 0) { @@ -3571,57 +2780,6 @@ static void UI_RunMenuScript(char **args) { } } } - } else if (Q_stricmp(name, "orders") == 0) { - const char *orders; - if (String_Parse(args, &orders)) { - int selectedPlayer = trap_Cvar_VariableValue("cg_selectedPlayer"); - if (selectedPlayer < uiInfo.myTeamCount) { - strcpy(buff, orders); - trap_Cmd_ExecuteText( EXEC_APPEND, va(buff, uiInfo.teamClientNums[selectedPlayer]) ); - trap_Cmd_ExecuteText( EXEC_APPEND, "\n" ); - } else { - int i; - for (i = 0; i < uiInfo.myTeamCount; i++) { - if (Q_stricmp(UI_Cvar_VariableString("name"), uiInfo.teamNames[i]) == 0) { - continue; - } - strcpy(buff, orders); - trap_Cmd_ExecuteText( EXEC_APPEND, va(buff, uiInfo.teamNames[i]) ); - trap_Cmd_ExecuteText( EXEC_APPEND, "\n" ); - } - } - trap_Key_SetCatcher( trap_Key_GetCatcher() & ~KEYCATCH_UI ); - trap_Key_ClearStates(); - trap_Cvar_Set( "cl_paused", "0" ); - Menus_CloseAll(); - } - } else if (Q_stricmp(name, "voiceOrdersTeam") == 0) { - const char *orders; - if (String_Parse(args, &orders)) { - int selectedPlayer = trap_Cvar_VariableValue("cg_selectedPlayer"); - if (selectedPlayer == uiInfo.myTeamCount) { - trap_Cmd_ExecuteText( EXEC_APPEND, orders ); - trap_Cmd_ExecuteText( EXEC_APPEND, "\n" ); - } - trap_Key_SetCatcher( trap_Key_GetCatcher() & ~KEYCATCH_UI ); - trap_Key_ClearStates(); - trap_Cvar_Set( "cl_paused", "0" ); - Menus_CloseAll(); - } - } else if (Q_stricmp(name, "voiceOrders") == 0) { - const char *orders; - if (String_Parse(args, &orders)) { - int selectedPlayer = trap_Cvar_VariableValue("cg_selectedPlayer"); - if (selectedPlayer < uiInfo.myTeamCount) { - strcpy(buff, orders); - trap_Cmd_ExecuteText( EXEC_APPEND, va(buff, uiInfo.teamClientNums[selectedPlayer]) ); - trap_Cmd_ExecuteText( EXEC_APPEND, "\n" ); - } - trap_Key_SetCatcher( trap_Key_GetCatcher() & ~KEYCATCH_UI ); - trap_Key_ClearStates(); - trap_Cvar_Set( "cl_paused", "0" ); - Menus_CloseAll(); - } } else if (Q_stricmp(name, "glCustom") == 0) { trap_Cvar_Set("ui_glCustom", "4"); } else if (Q_stricmp(name, "update") == 0) { @@ -3672,10 +2830,6 @@ static void UI_RunMenuScript(char **args) { uiInfo.clientNums[ uiInfo.ignoreIndex ] ) ); } } - } else if (Q_stricmp(name, "setPbClStatus") == 0) { - int stat; - if ( Int_Parse( args, &stat ) ) - trap_SetPbClStatus( stat ); } else { Com_Printf("unknown UI script %s\n", name); @@ -3683,645 +2837,6 @@ static void UI_RunMenuScript(char **args) { } } -static void UI_GetTeamColor(vec4_t *color) { -} - -/* -================== -UI_MapCountByGameType -================== -*/ -static int UI_MapCountByGameType(qboolean singlePlayer) { - int i, c, game; - c = 0; - game = singlePlayer ? uiInfo.gameTypes[ui_gameType.integer].gtEnum : uiInfo.gameTypes[ui_netGameType.integer].gtEnum; - - for (i = 0; i < uiInfo.mapCount; i++) { - uiInfo.mapList[i].active = qfalse; - if ( uiInfo.mapList[i].typeBits & (1 << game)) { - if (singlePlayer) { - if (!(uiInfo.mapList[i].typeBits & (1 << 2))) { - continue; - } - } - c++; - uiInfo.mapList[i].active = qtrue; - } - } - return c; -} - -qboolean UI_hasSkinForBase(const char *base, const char *team) { - char test[1024]; - - Com_sprintf( test, sizeof( test ), "models/players/%s/%s/lower_default.skin", base, team ); - - if (trap_FS_FOpenFile(test, NULL, FS_READ)) { - return qtrue; - } - Com_sprintf( test, sizeof( test ), "models/players/characters/%s/%s/lower_default.skin", base, team ); - - if (trap_FS_FOpenFile(test, NULL, FS_READ)) { - return qtrue; - } - return qfalse; -} - -/* -================== -UI_MapCountByTeam -================== -*/ -static int UI_HeadCountByTeam( void ) { - static int init = 0; - int i, j, k, c, tIndex; - - c = 0; - if (!init) { - for (i = 0; i < uiInfo.characterCount; i++) { - uiInfo.characterList[i].reference = 0; - for (j = 0; j < uiInfo.teamCount; j++) { - if (UI_hasSkinForBase(uiInfo.characterList[i].base, uiInfo.teamList[j].teamName)) { - uiInfo.characterList[i].reference |= (1<<j); - } - } - } - init = 1; - } - - tIndex = UI_TeamIndexFromName(UI_Cvar_VariableString("ui_teamName")); - - // do names - for (i = 0; i < uiInfo.characterCount; i++) { - uiInfo.characterList[i].active = qfalse; - for(j = 0; j < TEAM_MEMBERS; j++) { - if (uiInfo.teamList[tIndex].teamMembers[j] != NULL) { - if (uiInfo.characterList[i].reference&(1<<tIndex)) {// && Q_stricmp(uiInfo.teamList[tIndex].teamMembers[j], uiInfo.characterList[i].name)==0) { - uiInfo.characterList[i].active = qtrue; - c++; - break; - } - } - } - } - - // and then aliases - for(j = 0; j < TEAM_MEMBERS; j++) { - for(k = 0; k < uiInfo.aliasCount; k++) { - if (uiInfo.aliasList[k].name != NULL) { - if (Q_stricmp(uiInfo.teamList[tIndex].teamMembers[j], uiInfo.aliasList[k].name)==0) { - for (i = 0; i < uiInfo.characterCount; i++) { - if (uiInfo.characterList[i].headImage != -1 && uiInfo.characterList[i].reference&(1<<tIndex) && Q_stricmp(uiInfo.aliasList[k].ai, uiInfo.characterList[i].name)==0) { - if (uiInfo.characterList[i].active == qfalse) { - uiInfo.characterList[i].active = qtrue; - c++; - } - break; - } - } - } - } - } - } - return c; -} - -/* -================== -UI_InsertServerIntoDisplayList -================== -*/ -static void UI_InsertServerIntoDisplayList(int num, int position) { - int i; - - if (position < 0 || position > uiInfo.serverStatus.numDisplayServers ) { - return; - } - // - uiInfo.serverStatus.numDisplayServers++; - for (i = uiInfo.serverStatus.numDisplayServers; i > position; i--) { - uiInfo.serverStatus.displayServers[i] = uiInfo.serverStatus.displayServers[i-1]; - } - uiInfo.serverStatus.displayServers[position] = num; -} - -/* -================== -UI_RemoveServerFromDisplayList -================== -*/ -static void UI_RemoveServerFromDisplayList(int num) { - int i, j; - - for (i = 0; i < uiInfo.serverStatus.numDisplayServers; i++) { - if (uiInfo.serverStatus.displayServers[i] == num) { - uiInfo.serverStatus.numDisplayServers--; - for (j = i; j < uiInfo.serverStatus.numDisplayServers; j++) { - uiInfo.serverStatus.displayServers[j] = uiInfo.serverStatus.displayServers[j+1]; - } - return; - } - } -} - -/* -================== -UI_BinaryServerInsertion -================== -*/ -static void UI_BinaryServerInsertion(int num) { - int mid, offset, res, len; - - // use binary search to insert server - len = uiInfo.serverStatus.numDisplayServers; - mid = len; - offset = 0; - res = 0; - while(mid > 0) { - mid = len >> 1; - // - res = trap_LAN_CompareServers( ui_netSource.integer, uiInfo.serverStatus.sortKey, - uiInfo.serverStatus.sortDir, num, uiInfo.serverStatus.displayServers[offset+mid]); - // if equal - if (res == 0) { - UI_InsertServerIntoDisplayList(num, offset+mid); - return; - } - // if larger - else if (res == 1) { - offset += mid; - len -= mid; - } - // if smaller - else { - len -= mid; - } - } - if (res == 1) { - offset++; - } - UI_InsertServerIntoDisplayList(num, offset); -} - -/* -================== -UI_BuildServerDisplayList -================== -*/ -static void UI_BuildServerDisplayList(qboolean force) { - int i, count, clients, maxClients, ping, game, len, visible; - char info[MAX_STRING_CHARS]; - static int numinvisible; - - if (!(force || uiInfo.uiDC.realTime > uiInfo.serverStatus.nextDisplayRefresh)) { - return; - } - // if we shouldn't reset - if ( force == 2 ) { - force = 0; - } - - // do motd updates here too - trap_Cvar_VariableStringBuffer( "cl_motdString", uiInfo.serverStatus.motd, sizeof(uiInfo.serverStatus.motd) ); - len = strlen(uiInfo.serverStatus.motd); - if (len != uiInfo.serverStatus.motdLen) { - uiInfo.serverStatus.motdLen = len; - uiInfo.serverStatus.motdWidth = -1; - } - - if (force) { - numinvisible = 0; - // clear number of displayed servers - uiInfo.serverStatus.numDisplayServers = 0; - uiInfo.serverStatus.numPlayersOnServers = 0; - // set list box index to zero - Menu_SetFeederSelection(NULL, FEEDER_SERVERS, 0, NULL); - // mark all servers as visible so we store ping updates for them - trap_LAN_MarkServerVisible(ui_netSource.integer, -1, qtrue); - } - - // get the server count (comes from the master) - count = trap_LAN_GetServerCount(ui_netSource.integer); - if (count == -1 || (ui_netSource.integer == AS_LOCAL && count == 0) ) { - // still waiting on a response from the master - uiInfo.serverStatus.numDisplayServers = 0; - uiInfo.serverStatus.numPlayersOnServers = 0; - uiInfo.serverStatus.nextDisplayRefresh = uiInfo.uiDC.realTime + 500; - return; - } - - visible = qfalse; - for (i = 0; i < count; i++) { - // if we already got info for this server - if (!trap_LAN_ServerIsVisible(ui_netSource.integer, i)) { - continue; - } - visible = qtrue; - // get the ping for this server - ping = trap_LAN_GetServerPing(ui_netSource.integer, i); - if (ping > 0 || ui_netSource.integer == AS_FAVORITES) { - - trap_LAN_GetServerInfo(ui_netSource.integer, i, info, MAX_STRING_CHARS); - - clients = atoi(Info_ValueForKey(info, "clients")); - uiInfo.serverStatus.numPlayersOnServers += clients; - - if (ui_browserShowEmpty.integer == 0) { - if (clients == 0) { - trap_LAN_MarkServerVisible(ui_netSource.integer, i, qfalse); - continue; - } - } - - if (ui_browserShowFull.integer == 0) { - maxClients = atoi(Info_ValueForKey(info, "sv_maxclients")); - if (clients == maxClients) { - trap_LAN_MarkServerVisible(ui_netSource.integer, i, qfalse); - continue; - } - } - - if (uiInfo.joinGameTypes[ui_joinGameType.integer].gtEnum != -1) { - game = atoi(Info_ValueForKey(info, "gametype")); - if (game != uiInfo.joinGameTypes[ui_joinGameType.integer].gtEnum) { - trap_LAN_MarkServerVisible(ui_netSource.integer, i, qfalse); - continue; - } - } - - // make sure we never add a favorite server twice - if (ui_netSource.integer == AS_FAVORITES) { - UI_RemoveServerFromDisplayList(i); - } - // insert the server into the list - UI_BinaryServerInsertion(i); - // done with this server - if (ping > 0) { - trap_LAN_MarkServerVisible(ui_netSource.integer, i, qfalse); - numinvisible++; - } - } - } - - uiInfo.serverStatus.refreshtime = uiInfo.uiDC.realTime; - - // if there were no servers visible for ping updates - if (!visible) { -// UI_StopServerRefresh(); -// uiInfo.serverStatus.nextDisplayRefresh = 0; - } -} - -typedef struct -{ - char *name, *altName; -} serverStatusCvar_t; - -serverStatusCvar_t serverStatusCvars[] = { - {"sv_hostname", "Name"}, - {"Address", ""}, - {"gamename", "Game name"}, - {"g_gametype", "Game type"}, - {"mapname", "Map"}, - {"version", ""}, - {"protocol", ""}, - {"timelimit", ""}, - {"fraglimit", ""}, - {NULL, NULL} -}; - -/* -================== -UI_SortServerStatusInfo -================== -*/ -static void UI_SortServerStatusInfo( serverStatusInfo_t *info ) { - int i, j, index; - char *tmp1, *tmp2; - - // FIXME: if "gamename" == "baseq3" or "missionpack" then - // replace the gametype number by FFA, CTF etc. - // - index = 0; - for (i = 0; serverStatusCvars[i].name; i++) { - for (j = 0; j < info->numLines; j++) { - if ( !info->lines[j][1] || info->lines[j][1][0] ) { - continue; - } - if ( !Q_stricmp(serverStatusCvars[i].name, info->lines[j][0]) ) { - // swap lines - tmp1 = info->lines[index][0]; - tmp2 = info->lines[index][3]; - info->lines[index][0] = info->lines[j][0]; - info->lines[index][3] = info->lines[j][3]; - info->lines[j][0] = tmp1; - info->lines[j][3] = tmp2; - // - if ( strlen(serverStatusCvars[i].altName) ) { - info->lines[index][0] = serverStatusCvars[i].altName; - } - index++; - } - } - } -} - -/* -================== -UI_GetServerStatusInfo -================== -*/ -static int UI_GetServerStatusInfo( const char *serverAddress, serverStatusInfo_t *info ) { - char *p, *score, *ping, *name; - int i, len; - - if (!info) { - trap_LAN_ServerStatus( serverAddress, NULL, 0); - return qfalse; - } - memset(info, 0, sizeof(*info)); - if ( trap_LAN_ServerStatus( serverAddress, info->text, sizeof(info->text)) ) { - Q_strncpyz(info->address, serverAddress, sizeof(info->address)); - p = info->text; - info->numLines = 0; - info->lines[info->numLines][0] = "Address"; - info->lines[info->numLines][1] = ""; - info->lines[info->numLines][2] = ""; - info->lines[info->numLines][3] = info->address; - info->numLines++; - // get the cvars - while (p && *p) { - p = strchr(p, '\\'); - if (!p) break; - *p++ = '\0'; - if (*p == '\\') - break; - info->lines[info->numLines][0] = p; - info->lines[info->numLines][1] = ""; - info->lines[info->numLines][2] = ""; - p = strchr(p, '\\'); - if (!p) break; - *p++ = '\0'; - info->lines[info->numLines][3] = p; - - info->numLines++; - if (info->numLines >= MAX_SERVERSTATUS_LINES) - break; - } - // get the player list - if (info->numLines < MAX_SERVERSTATUS_LINES-3) { - // empty line - info->lines[info->numLines][0] = ""; - info->lines[info->numLines][1] = ""; - info->lines[info->numLines][2] = ""; - info->lines[info->numLines][3] = ""; - info->numLines++; - // header - info->lines[info->numLines][0] = "num"; - info->lines[info->numLines][1] = "score"; - info->lines[info->numLines][2] = "ping"; - info->lines[info->numLines][3] = "name"; - info->numLines++; - // parse players - i = 0; - len = 0; - while (p && *p) { - if (*p == '\\') - *p++ = '\0'; - if (!p) - break; - score = p; - p = strchr(p, ' '); - if (!p) - break; - *p++ = '\0'; - ping = p; - p = strchr(p, ' '); - if (!p) - break; - *p++ = '\0'; - name = p; - Com_sprintf(&info->pings[len], sizeof(info->pings)-len, "%d", i); - info->lines[info->numLines][0] = &info->pings[len]; - len += strlen(&info->pings[len]) + 1; - info->lines[info->numLines][1] = score; - info->lines[info->numLines][2] = ping; - info->lines[info->numLines][3] = name; - info->numLines++; - if (info->numLines >= MAX_SERVERSTATUS_LINES) - break; - p = strchr(p, '\\'); - if (!p) - break; - *p++ = '\0'; - // - i++; - } - } - UI_SortServerStatusInfo( info ); - return qtrue; - } - return qfalse; -} - -/* -================== -stristr -================== -*/ -static char *stristr(char *str, char *charset) { - int i; - - while(*str) { - for (i = 0; charset[i] && str[i]; i++) { - if (toupper(charset[i]) != toupper(str[i])) break; - } - if (!charset[i]) return str; - str++; - } - return NULL; -} - -/* -================== -UI_BuildFindPlayerList -================== -*/ -static void UI_BuildFindPlayerList(qboolean force) { - static int numFound, numTimeOuts; - int i, j, k, resend; - serverStatusInfo_t info; - char name[MAX_NAME_LENGTH+2]; - char infoString[MAX_STRING_CHARS]; - qboolean duplicate; - - if (!force) { - if (!uiInfo.nextFindPlayerRefresh || uiInfo.nextFindPlayerRefresh > uiInfo.uiDC.realTime) { - return; - } - } - else { - memset(&uiInfo.pendingServerStatus, 0, sizeof(uiInfo.pendingServerStatus)); - uiInfo.numFoundPlayerServers = 0; - uiInfo.currentFoundPlayerServer = 0; - trap_Cvar_VariableStringBuffer( "ui_findPlayer", uiInfo.findPlayerName, sizeof(uiInfo.findPlayerName)); - Q_CleanStr(uiInfo.findPlayerName); - // should have a string of some length - if (!strlen(uiInfo.findPlayerName)) { - uiInfo.nextFindPlayerRefresh = 0; - return; - } - // set resend time - resend = ui_serverStatusTimeOut.integer / 2 - 10; - if (resend < 50) { - resend = 50; - } - trap_Cvar_Set("cl_serverStatusResendTime", va("%d", resend)); - // reset all server status requests - trap_LAN_ServerStatus( NULL, NULL, 0); - // - uiInfo.numFoundPlayerServers = 1; - Com_sprintf(uiInfo.foundPlayerServerNames[uiInfo.numFoundPlayerServers-1], - sizeof(uiInfo.foundPlayerServerNames[uiInfo.numFoundPlayerServers-1]), - "searching %d...", uiInfo.pendingServerStatus.num); - numFound = 0; - numTimeOuts++; - } - for (i = 0; i < MAX_SERVERSTATUSREQUESTS; i++) { - // if this pending server is valid - if (uiInfo.pendingServerStatus.server[i].valid) { - // try to get the server status for this server - if (UI_GetServerStatusInfo( uiInfo.pendingServerStatus.server[i].adrstr, &info ) ) { - // - numFound++; - // parse through the server status lines - for (j = 0; j < info.numLines; j++) { - // should have ping info - if ( !info.lines[j][2] || !info.lines[j][2][0] ) { - continue; - } - // clean string first - Q_strncpyz(name, info.lines[j][3], sizeof(name)); - Q_CleanStr(name); - - duplicate = qfalse; - for( k = 0; k < uiInfo.numFoundPlayerServers - 1; k++ ) - { - if( Q_strncmp( uiInfo.foundPlayerServerAddresses[ k ], - uiInfo.pendingServerStatus.server[ i ].adrstr, - MAX_ADDRESSLENGTH ) == 0 ) - duplicate = qtrue; - } - - // if the player name is a substring - if( stristr( name, uiInfo.findPlayerName ) && !duplicate ) { - // add to found server list if we have space (always leave space for a line with the number found) - if (uiInfo.numFoundPlayerServers < MAX_FOUNDPLAYER_SERVERS-1) { - // - Q_strncpyz(uiInfo.foundPlayerServerAddresses[uiInfo.numFoundPlayerServers-1], - uiInfo.pendingServerStatus.server[i].adrstr, - sizeof(uiInfo.foundPlayerServerAddresses[0])); - Q_strncpyz(uiInfo.foundPlayerServerNames[uiInfo.numFoundPlayerServers-1], - uiInfo.pendingServerStatus.server[i].name, - sizeof(uiInfo.foundPlayerServerNames[0])); - uiInfo.numFoundPlayerServers++; - } - else { - // can't add any more so we're done - uiInfo.pendingServerStatus.num = uiInfo.serverStatus.numDisplayServers; - } - } - } - Com_sprintf(uiInfo.foundPlayerServerNames[uiInfo.numFoundPlayerServers-1], - sizeof(uiInfo.foundPlayerServerNames[uiInfo.numFoundPlayerServers-1]), - "searching %d/%d...", numFound, uiInfo.pendingServerStatus.num ); - // retrieved the server status so reuse this spot - uiInfo.pendingServerStatus.server[i].valid = qfalse; - } - } - // if empty pending slot or timed out - if (!uiInfo.pendingServerStatus.server[i].valid || - uiInfo.pendingServerStatus.server[i].startTime < uiInfo.uiDC.realTime - ui_serverStatusTimeOut.integer) { - if (uiInfo.pendingServerStatus.server[i].valid) { - numTimeOuts++; - } - // reset server status request for this address - UI_GetServerStatusInfo( uiInfo.pendingServerStatus.server[i].adrstr, NULL ); - // reuse pending slot - uiInfo.pendingServerStatus.server[i].valid = qfalse; - // if we didn't try to get the status of all servers in the main browser yet - if (uiInfo.pendingServerStatus.num < uiInfo.serverStatus.numDisplayServers) { - uiInfo.pendingServerStatus.server[i].startTime = uiInfo.uiDC.realTime; - trap_LAN_GetServerAddressString(ui_netSource.integer, uiInfo.serverStatus.displayServers[uiInfo.pendingServerStatus.num], - uiInfo.pendingServerStatus.server[i].adrstr, sizeof(uiInfo.pendingServerStatus.server[i].adrstr)); - trap_LAN_GetServerInfo(ui_netSource.integer, uiInfo.serverStatus.displayServers[uiInfo.pendingServerStatus.num], infoString, sizeof(infoString)); - Q_strncpyz(uiInfo.pendingServerStatus.server[i].name, Info_ValueForKey(infoString, "hostname"), sizeof(uiInfo.pendingServerStatus.server[0].name)); - uiInfo.pendingServerStatus.server[i].valid = qtrue; - uiInfo.pendingServerStatus.num++; - Com_sprintf(uiInfo.foundPlayerServerNames[uiInfo.numFoundPlayerServers-1], - sizeof(uiInfo.foundPlayerServerNames[uiInfo.numFoundPlayerServers-1]), - "searching %d/%d...", numFound, uiInfo.pendingServerStatus.num ); - } - } - } - for (i = 0; i < MAX_SERVERSTATUSREQUESTS; i++) { - if (uiInfo.pendingServerStatus.server[i].valid) { - break; - } - } - // if still trying to retrieve server status info - if (i < MAX_SERVERSTATUSREQUESTS) { - uiInfo.nextFindPlayerRefresh = uiInfo.uiDC.realTime + 25; - } - else { - // add a line that shows the number of servers found - if (!uiInfo.numFoundPlayerServers) { - Com_sprintf(uiInfo.foundPlayerServerNames[uiInfo.numFoundPlayerServers-1], sizeof(uiInfo.foundPlayerServerAddresses[0]), "no servers found"); - } - else { - Com_sprintf(uiInfo.foundPlayerServerNames[uiInfo.numFoundPlayerServers-1], sizeof(uiInfo.foundPlayerServerAddresses[0]), - "%d server%s found with player %s", uiInfo.numFoundPlayerServers-1, - uiInfo.numFoundPlayerServers == 2 ? "":"s", uiInfo.findPlayerName); - } - uiInfo.nextFindPlayerRefresh = 0; - // show the server status info for the selected server - UI_FeederSelection(FEEDER_FINDPLAYER, uiInfo.currentFoundPlayerServer); - } -} - -/* -================== -UI_BuildServerStatus -================== -*/ -static void UI_BuildServerStatus(qboolean force) { - - if (uiInfo.nextFindPlayerRefresh) { - return; - } - if (!force) { - if (!uiInfo.nextServerStatusRefresh || uiInfo.nextServerStatusRefresh > uiInfo.uiDC.realTime) { - return; - } - } - else { - Menu_SetFeederSelection(NULL, FEEDER_SERVERSTATUS, 0, NULL); - uiInfo.serverStatusInfo.numLines = 0; - // reset all server status requests - trap_LAN_ServerStatus( NULL, NULL, 0); - } - if (uiInfo.serverStatus.currentServer < 0 || uiInfo.serverStatus.currentServer > uiInfo.serverStatus.numDisplayServers || uiInfo.serverStatus.numDisplayServers == 0) { - return; - } - if (UI_GetServerStatusInfo( uiInfo.serverStatusAddress, &uiInfo.serverStatusInfo ) ) { - uiInfo.nextServerStatusRefresh = 0; - UI_GetServerStatusInfo( uiInfo.serverStatusAddress, NULL ); - } - else { - uiInfo.nextServerStatusRefresh = uiInfo.uiDC.realTime + 500; - } -} - /* ================== UI_FeederCount @@ -4329,14 +2844,10 @@ UI_FeederCount */ static int UI_FeederCount(float feederID) { - if (feederID == FEEDER_HEADS) { - return UI_HeadCountByTeam(); - } else if (feederID == FEEDER_Q3HEADS) { - return uiInfo.q3HeadCount; - } else if (feederID == FEEDER_CINEMATICS) { + if (feederID == FEEDER_CINEMATICS) { return uiInfo.movieCount; - } else if (feederID == FEEDER_MAPS || feederID == FEEDER_ALLMAPS) { - return UI_MapCountByGameType(feederID == FEEDER_MAPS ? qtrue : qfalse); + } else if (feederID == FEEDER_MAPS) { + return uiInfo.mapCount; } else if (feederID == FEEDER_SERVERS) { return uiInfo.serverStatus.numDisplayServers; } else if (feederID == FEEDER_SERVERSTATUS) { @@ -4363,7 +2874,7 @@ static int UI_FeederCount(float feederID) { return uiInfo.demoCount; } else if( feederID == FEEDER_TREMTEAMS ) - return uiInfo.tremTeamCount; + return uiInfo.teamCount; else if( feederID == FEEDER_TREMHUMANITEMS ) return uiInfo.humanItemCount; else if( feederID == FEEDER_TREMALIENCLASSES ) @@ -4387,56 +2898,16 @@ static const char *UI_SelectedMap(int index, int *actual) { c = 0; *actual = 0; for (i = 0; i < uiInfo.mapCount; i++) { - if (uiInfo.mapList[i].active) { - if (c == index) { - *actual = i; - return uiInfo.mapList[i].mapName; - } else { - c++; - } - } - } - return ""; -} - -static const char *UI_SelectedHead(int index, int *actual) { - int i, c; - c = 0; - *actual = 0; - for (i = 0; i < uiInfo.characterCount; i++) { - if (uiInfo.characterList[i].active) { - if (c == index) { - *actual = i; - return uiInfo.characterList[i].name; - } else { - c++; - } + if (c == index) { + *actual = i; + return uiInfo.mapList[i].mapName; + } else { + c++; } } return ""; } -static int UI_GetIndexFromSelection(int actual) { - int i, c; - c = 0; - for (i = 0; i < uiInfo.mapCount; i++) { - if (uiInfo.mapList[i].active) { - if (i == actual) { - return c; - } - c++; - } - } - return 0; -} - -static void UI_UpdatePendingPings( void ) { - trap_LAN_ResetPings(ui_netSource.integer); - uiInfo.serverStatus.refreshActive = qtrue; - uiInfo.serverStatus.refreshtime = uiInfo.uiDC.realTime + 1000; - -} - static const char *UI_FeederItemText(float feederID, int index, int column, qhandle_t *handle) { static char info[MAX_STRING_CHARS]; static char hostname[1024]; @@ -4444,14 +2915,7 @@ static const char *UI_FeederItemText(float feederID, int index, int column, qhan static int lastColumn = -1; static int lastTime = 0; *handle = -1; - if (feederID == FEEDER_HEADS) { - int actual; - return UI_SelectedHead(index, &actual); - } else if (feederID == FEEDER_Q3HEADS) { - if (index >= 0 && index < uiInfo.q3HeadCount) { - return uiInfo.q3HeadNames[index]; - } - } else if (feederID == FEEDER_MAPS || feederID == FEEDER_ALLMAPS) { + if (feederID == FEEDER_MAPS) { int actual; return UI_SelectedMap(index, &actual); } else if (feederID == FEEDER_SERVERS) { @@ -4560,8 +3024,8 @@ static const char *UI_FeederItemText(float feederID, int index, int column, qhan } else if( feederID == FEEDER_TREMTEAMS ) { - if( index >= 0 && index < uiInfo.tremTeamCount ) - return uiInfo.tremTeamList[ index ].text; + if( index >= 0 && index < uiInfo.teamCount ) + return uiInfo.teamList[ index ].text; } else if( feederID == FEEDER_TREMHUMANITEMS ) { @@ -4604,21 +3068,7 @@ static const char *UI_FeederItemText(float feederID, int index, int column, qhan static qhandle_t UI_FeederItemImage(float feederID, int index) { - if (feederID == FEEDER_HEADS) { - int actual; - UI_SelectedHead(index, &actual); - index = actual; - if (index >= 0 && index < uiInfo.characterCount) { - if (uiInfo.characterList[index].headImage == -1) { - uiInfo.characterList[index].headImage = trap_R_RegisterShaderNoMip(uiInfo.characterList[index].imageName); - } - return uiInfo.characterList[index].headImage; - } - } else if (feederID == FEEDER_Q3HEADS) { - if (index >= 0 && index < uiInfo.q3HeadCount) { - return uiInfo.q3HeadIcons[index]; - } - } else if (feederID == FEEDER_ALLMAPS || feederID == FEEDER_MAPS) { + if (feederID == FEEDER_MAPS) { int actual; UI_SelectedMap(index, &actual); index = actual; @@ -4634,45 +3084,18 @@ static qhandle_t UI_FeederItemImage(float feederID, int index) { static void UI_FeederSelection(float feederID, int index) { static char info[MAX_STRING_CHARS]; - if (feederID == FEEDER_HEADS) { - int actual; - UI_SelectedHead(index, &actual); - index = actual; - if (index >= 0 && index < uiInfo.characterCount) { - trap_Cvar_Set( "team_model", va("%s", uiInfo.characterList[index].base)); - trap_Cvar_Set( "team_headmodel", va("*%s", uiInfo.characterList[index].name)); - updateModel = qtrue; - } - } else if (feederID == FEEDER_Q3HEADS) { - if (index >= 0 && index < uiInfo.q3HeadCount) { - trap_Cvar_Set( "model", uiInfo.q3HeadNames[index]); - trap_Cvar_Set( "headmodel", uiInfo.q3HeadNames[index]); - updateModel = qtrue; - } - } else if (feederID == FEEDER_MAPS || feederID == FEEDER_ALLMAPS) { + if (feederID == FEEDER_MAPS) { int actual, map; - map = (feederID == FEEDER_ALLMAPS) ? ui_currentNetMap.integer : ui_currentMap.integer; + map = ui_selectedMap.integer; if (uiInfo.mapList[map].cinematic >= 0) { trap_CIN_StopCinematic(uiInfo.mapList[map].cinematic); uiInfo.mapList[map].cinematic = -1; } UI_SelectedMap(index, &actual); - trap_Cvar_Set("ui_mapIndex", va("%d", index)); - ui_mapIndex.integer = index; - - if (feederID == FEEDER_MAPS) { - ui_currentMap.integer = actual; - trap_Cvar_Set("ui_currentMap", va("%d", actual)); - uiInfo.mapList[ui_currentMap.integer].cinematic = trap_CIN_PlayCinematic(va("%s.roq", uiInfo.mapList[ui_currentMap.integer].mapLoadName), 0, 0, 0, 0, (CIN_loop | CIN_silent) ); - UI_LoadBestScores(uiInfo.mapList[ui_currentMap.integer].mapLoadName, uiInfo.gameTypes[ui_gameType.integer].gtEnum); - trap_Cvar_Set("ui_opponentModel", uiInfo.mapList[ui_currentMap.integer].opponentName); - updateOpponentModel = qtrue; - } else { - ui_currentNetMap.integer = actual; - trap_Cvar_Set("ui_currentNetMap", va("%d", actual)); - uiInfo.mapList[ui_currentNetMap.integer].cinematic = trap_CIN_PlayCinematic(va("%s.roq", uiInfo.mapList[ui_currentNetMap.integer].mapLoadName), 0, 0, 0, 0, (CIN_loop | CIN_silent) ); - } + ui_selectedMap.integer = actual; + trap_Cvar_Set("ui_selectedMap", va("%d", actual)); + uiInfo.mapList[ui_selectedMap.integer].cinematic = trap_CIN_PlayCinematic(va("%s.roq", uiInfo.mapList[ui_selectedMap.integer].mapLoadName), 0, 0, 0, 0, (CIN_loop | CIN_silent) ); } else if (feederID == FEEDER_SERVERS) { const char *mapName = NULL; uiInfo.serverStatus.currentServer = index; @@ -4700,7 +3123,7 @@ static void UI_FeederSelection(float feederID, int index) { } else if (feederID == FEEDER_PLAYER_LIST) { uiInfo.playerIndex = index; } else if (feederID == FEEDER_TEAM_LIST) { - uiInfo.teamIndex = index; + uiInfo.teamPlayerIndex = index; } else if (feederID == FEEDER_IGNORE_LIST) { uiInfo.ignoreIndex = index; } else if (feederID == FEEDER_MODS) { @@ -4715,7 +3138,7 @@ static void UI_FeederSelection(float feederID, int index) { uiInfo.demoIndex = index; } else if( feederID == FEEDER_TREMTEAMS ) - uiInfo.tremTeamIndex = index; + uiInfo.teamIndex = index; else if( feederID == FEEDER_TREMHUMANITEMS ) uiInfo.humanItemIndex = index; else if( feederID == FEEDER_TREMALIENCLASSES ) @@ -4754,24 +3177,11 @@ static void UI_StopCinematic(int handle) { trap_CIN_StopCinematic(handle); } else { handle = abs(handle); - if (handle == UI_MAPCINEMATIC) { - if (uiInfo.mapList[ui_currentMap.integer].cinematic >= 0) { - trap_CIN_StopCinematic(uiInfo.mapList[ui_currentMap.integer].cinematic); - uiInfo.mapList[ui_currentMap.integer].cinematic = -1; - } - } else if (handle == UI_NETMAPCINEMATIC) { + if (handle == UI_NETMAPCINEMATIC) { if (uiInfo.serverStatus.currentServerCinematic >= 0) { trap_CIN_StopCinematic(uiInfo.serverStatus.currentServerCinematic); uiInfo.serverStatus.currentServerCinematic = -1; } - } else if (handle == UI_CLANCINEMATIC) { - int i = UI_TeamIndexFromName(UI_Cvar_VariableString("ui_teamName")); - if (i >= 0 && i < uiInfo.teamCount) { - if (uiInfo.teamList[i].cinematic >= 0) { - trap_CIN_StopCinematic(uiInfo.teamList[i].cinematic); - uiInfo.teamList[i].cinematic = -1; - } - } } } } @@ -4785,19 +3195,24 @@ static void UI_RunCinematicFrame(int handle) { trap_CIN_RunCinematic(handle); } +static float UI_GetValue( int ownerDraw ) +{ + return 0.0f; +} + /* ================= UI_Init ================= */ -void _UI_Init( qboolean inGameLoad ) { +void UI_Init( qboolean inGameLoad ) { int start; BG_InitClassOverrides( ); BG_InitAllowedGameElements( ); - //uiInfo.inGameLoad = inGameLoad; + uiInfo.inGameLoad = inGameLoad; UI_RegisterCvars(); UI_InitMemory(); @@ -4820,11 +3235,11 @@ void _UI_Init( qboolean inGameLoad ) { uiInfo.uiDC.registerModel = &trap_R_RegisterModel; uiInfo.uiDC.modelBounds = &trap_R_ModelBounds; uiInfo.uiDC.fillRect = &UI_FillRect; - uiInfo.uiDC.drawRect = &_UI_DrawRect; - uiInfo.uiDC.drawSides = &_UI_DrawSides; - uiInfo.uiDC.drawTopBottom = &_UI_DrawTopBottom; + uiInfo.uiDC.drawRect = &UI_DrawRect; + uiInfo.uiDC.drawSides = &UI_DrawSides; + uiInfo.uiDC.drawTopBottom = &UI_DrawTopBottom; uiInfo.uiDC.clearScene = &trap_R_ClearScene; - uiInfo.uiDC.drawSides = &_UI_DrawSides; + uiInfo.uiDC.drawSides = &UI_DrawSides; uiInfo.uiDC.addRefEntityToScene = &trap_R_AddRefEntityToScene; uiInfo.uiDC.renderScene = &trap_R_RenderScene; uiInfo.uiDC.registerFont = &trap_R_RegisterFont; @@ -4832,7 +3247,6 @@ void _UI_Init( qboolean inGameLoad ) { uiInfo.uiDC.getValue = &UI_GetValue; uiInfo.uiDC.ownerDrawVisible = &UI_OwnerDrawVisible; uiInfo.uiDC.runScript = &UI_RunMenuScript; - uiInfo.uiDC.getTeamColor = &UI_GetTeamColor; uiInfo.uiDC.setCVar = trap_Cvar_Set; uiInfo.uiDC.getCVarString = trap_Cvar_VariableStringBuffer; uiInfo.uiDC.getCVarValue = trap_Cvar_VariableValue; @@ -4871,10 +3285,6 @@ void _UI_Init( qboolean inGameLoad ) { start = trap_Milliseconds(); - uiInfo.teamCount = 0; - uiInfo.characterCount = 0; - uiInfo.aliasCount = 0; - UI_LoadMenus("ui/menus.txt", qtrue); UI_LoadMenus("ui/ingame.txt", qfalse); UI_LoadMenus("ui/tremulous.txt", qfalse); @@ -4882,25 +3292,14 @@ void _UI_Init( qboolean inGameLoad ) { Menus_CloseAll(); trap_LAN_LoadCachedServers(); - UI_LoadBestScores(uiInfo.mapList[ui_currentMap.integer].mapLoadName, uiInfo.gameTypes[ui_gameType.integer].gtEnum); // sets defaults for ui temp cvars - uiInfo.effectsColor = gamecodetoui[(int)trap_Cvar_VariableValue("color1")-1]; - uiInfo.currentCrosshair = (int)trap_Cvar_VariableValue("cg_drawCrosshair"); trap_Cvar_Set("ui_mousePitch", (trap_Cvar_VariableValue("m_pitch") >= 0) ? "0" : "1"); uiInfo.serverStatus.currentServerCinematic = -1; uiInfo.previewMovie = -1; - if (trap_Cvar_VariableValue("ui_TeamArenaFirstRun") == 0) { - trap_Cvar_Set("s_volume", "0.8"); - trap_Cvar_Set("s_musicvolume", "0.5"); - trap_Cvar_Set("ui_TeamArenaFirstRun", "1"); - } - trap_Cvar_Register(NULL, "debug_protocol", "", 0 ); - - trap_Cvar_Set("ui_actualNetGameType", va("%d", ui_netGameType.integer)); } @@ -4909,7 +3308,7 @@ void _UI_Init( qboolean inGameLoad ) { UI_KeyEvent ================= */ -void _UI_KeyEvent( int key, qboolean down ) { +void UI_KeyEvent( int key, qboolean down ) { if (Menu_Count() > 0) { menuDef_t *menu = Menu_GetFocused(); @@ -4925,10 +3324,6 @@ void _UI_KeyEvent( int key, qboolean down ) { trap_Cvar_Set( "cl_paused", "0" ); } } - - //if ((s > 0) && (s != menu_null_sound)) { - // trap_S_StartLocalSound( s, CHAN_LOCAL_SOUND ); - //} } /* @@ -4936,7 +3331,7 @@ void _UI_KeyEvent( int key, qboolean down ) { UI_MouseEvent ================= */ -void _UI_MouseEvent( int dx, int dy ) +void UI_MouseEvent( int dx, int dy ) { // update mouse screen position uiInfo.uiDC.cursorx += ( dx * uiInfo.uiDC.aspectScale ); @@ -4959,12 +3354,7 @@ void _UI_MouseEvent( int dx, int dy ) } -void UI_LoadNonIngame( void ) { - UI_LoadMenus("ui/menus.txt", qfalse); - uiInfo.inGameLoad = qfalse; -} - -void _UI_SetActiveMenu( uiMenuCommand_t menu ) { +void UI_SetActiveMenu( uiMenuCommand_t menu ) { char buf[256]; // this should be the ONLY way the menu system is brought up @@ -4983,37 +3373,15 @@ void _UI_SetActiveMenu( uiMenuCommand_t menu ) { case UIMENU_MAIN: trap_Cvar_Set( "sv_killserver", "1" ); trap_Key_SetCatcher( KEYCATCH_UI ); - //trap_S_StartLocalSound( trap_S_RegisterSound("sound/misc/menu_background.wav", qfalse) , CHAN_LOCAL_SOUND ); - //trap_S_StartBackgroundTrack("sound/misc/menu_background.wav", NULL); - if (uiInfo.inGameLoad) { - UI_LoadNonIngame(); - } Menus_CloseAll(); Menus_ActivateByName("main"); trap_Cvar_VariableStringBuffer("com_errorMessage", buf, sizeof(buf)); if (strlen(buf)) { - if (!ui_singlePlayerActive.integer) { - if( trap_Cvar_VariableValue( "com_errorCode" ) == ERR_SERVERDISCONNECT ) - Menus_ActivateByName("drop_popmenu"); - else - Menus_ActivateByName("error_popmenu"); - } else { - trap_Cvar_Set("com_errorMessage", ""); - } - } - return; - case UIMENU_TEAM: - trap_Key_SetCatcher( KEYCATCH_UI ); - Menus_ActivateByName("team"); - return; - case UIMENU_POSTGAME: - trap_Cvar_Set( "sv_killserver", "1" ); - trap_Key_SetCatcher( KEYCATCH_UI ); - if (uiInfo.inGameLoad) { - UI_LoadNonIngame(); + if( trap_Cvar_VariableValue( "com_errorCode" ) == ERR_SERVERDISCONNECT ) + Menus_ActivateByName("drop_popmenu"); + else + Menus_ActivateByName("error_popmenu"); } - Menus_CloseAll(); - Menus_ActivateByName("endofgame"); return; case UIMENU_INGAME: trap_Cvar_Set( "cl_paused", "1" ); @@ -5026,7 +3394,7 @@ void _UI_SetActiveMenu( uiMenuCommand_t menu ) { } } -qboolean _UI_IsFullscreen( void ) { +qboolean UI_IsFullscreen( void ) { return Menus_AnyFullScreenVisible(); } @@ -5065,6 +3433,7 @@ static void UI_PrintTime ( char *buf, int bufsize, int time ) { } } +// FIXME: move to ui_shared.c? void Text_PaintCenter(float x, float y, float scale, vec4_t color, const char *text, float adjust) { int len = UI_Text_Width(text, scale, 0); UI_Text_Paint(x - len / 2, y, scale, color, text, 0, 0, ITEM_TEXTSTYLE_SHADOWEDMORE); @@ -5199,9 +3568,6 @@ static void UI_DisplayDownloadInfo( const char *downloadName, float centerPoint, /* ======================== UI_DrawConnectScreen - -This will also be overlaid on the cgame info screen during loading -to prevent it from blinking away too rapidly on local or lan games. ======================== */ void UI_DrawConnectScreen( qboolean overlay ) { @@ -5291,274 +3657,6 @@ void UI_DrawConnectScreen( qboolean overlay ) { // password required / connection rejected information goes here } - -/* -================ -cvars -================ -*/ - -typedef struct { - vmCvar_t *vmCvar; - char *cvarName; - char *defaultString; - int cvarFlags; -} cvarTable_t; - -vmCvar_t ui_ffa_fraglimit; -vmCvar_t ui_ffa_timelimit; - -vmCvar_t ui_tourney_fraglimit; -vmCvar_t ui_tourney_timelimit; - -vmCvar_t ui_team_fraglimit; -vmCvar_t ui_team_timelimit; -vmCvar_t ui_team_friendly; - -vmCvar_t ui_ctf_capturelimit; -vmCvar_t ui_ctf_timelimit; -vmCvar_t ui_ctf_friendly; - -vmCvar_t ui_arenasFile; -vmCvar_t ui_botsFile; -vmCvar_t ui_spScores1; -vmCvar_t ui_spScores2; -vmCvar_t ui_spScores3; -vmCvar_t ui_spScores4; -vmCvar_t ui_spScores5; -vmCvar_t ui_spAwards; -vmCvar_t ui_spVideos; -vmCvar_t ui_spSkill; - -vmCvar_t ui_spSelection; - -vmCvar_t ui_browserMaster; -vmCvar_t ui_browserGameType; -vmCvar_t ui_browserSortKey; -vmCvar_t ui_browserShowFull; -vmCvar_t ui_browserShowEmpty; - -vmCvar_t ui_brassTime; -vmCvar_t ui_drawCrosshair; -vmCvar_t ui_drawCrosshairNames; -vmCvar_t ui_marks; - -vmCvar_t ui_server1; -vmCvar_t ui_server2; -vmCvar_t ui_server3; -vmCvar_t ui_server4; -vmCvar_t ui_server5; -vmCvar_t ui_server6; -vmCvar_t ui_server7; -vmCvar_t ui_server8; -vmCvar_t ui_server9; -vmCvar_t ui_server10; -vmCvar_t ui_server11; -vmCvar_t ui_server12; -vmCvar_t ui_server13; -vmCvar_t ui_server14; -vmCvar_t ui_server15; -vmCvar_t ui_server16; - -vmCvar_t ui_redteam; -vmCvar_t ui_redteam1; -vmCvar_t ui_redteam2; -vmCvar_t ui_redteam3; -vmCvar_t ui_redteam4; -vmCvar_t ui_redteam5; -vmCvar_t ui_blueteam; -vmCvar_t ui_blueteam1; -vmCvar_t ui_blueteam2; -vmCvar_t ui_blueteam3; -vmCvar_t ui_blueteam4; -vmCvar_t ui_blueteam5; -vmCvar_t ui_teamName; -vmCvar_t ui_dedicated; -vmCvar_t ui_gameType; -vmCvar_t ui_netGameType; -vmCvar_t ui_actualNetGameType; -vmCvar_t ui_joinGameType; -vmCvar_t ui_netSource; -vmCvar_t ui_serverFilterType; -vmCvar_t ui_opponentName; -vmCvar_t ui_menuFiles; -vmCvar_t ui_currentTier; -vmCvar_t ui_currentMap; -vmCvar_t ui_currentNetMap; -vmCvar_t ui_mapIndex; -vmCvar_t ui_currentOpponent; -vmCvar_t ui_selectedPlayer; -vmCvar_t ui_selectedPlayerName; -vmCvar_t ui_lastServerRefresh_0; -vmCvar_t ui_lastServerRefresh_1; -vmCvar_t ui_lastServerRefresh_2; -vmCvar_t ui_lastServerRefresh_3; -vmCvar_t ui_lastServerRefresh_0_time; -vmCvar_t ui_lastServerRefresh_1_time; -vmCvar_t ui_lastServerRefresh_2_time; -vmCvar_t ui_lastServerRefresh_3_time; -vmCvar_t ui_singlePlayerActive; -vmCvar_t ui_scoreAccuracy; -vmCvar_t ui_scoreImpressives; -vmCvar_t ui_scoreExcellents; -vmCvar_t ui_scoreCaptures; -vmCvar_t ui_scoreDefends; -vmCvar_t ui_scoreAssists; -vmCvar_t ui_scoreGauntlets; -vmCvar_t ui_scoreScore; -vmCvar_t ui_scorePerfect; -vmCvar_t ui_scoreTeam; -vmCvar_t ui_scoreBase; -vmCvar_t ui_scoreTimeBonus; -vmCvar_t ui_scoreSkillBonus; -vmCvar_t ui_scoreShutoutBonus; -vmCvar_t ui_scoreTime; -vmCvar_t ui_captureLimit; -vmCvar_t ui_fragLimit; -vmCvar_t ui_smallFont; -vmCvar_t ui_bigFont; -vmCvar_t ui_findPlayer; -vmCvar_t ui_Q3Model; -vmCvar_t ui_hudFiles; -vmCvar_t ui_recordSPDemo; -vmCvar_t ui_realCaptureLimit; -vmCvar_t ui_realWarmUp; -vmCvar_t ui_serverStatusTimeOut; -vmCvar_t ui_textWrapCache; -vmCvar_t ui_developer; - -vmCvar_t ui_winner; - -static cvarTable_t cvarTable[] = { - { &ui_ffa_fraglimit, "ui_ffa_fraglimit", "20", CVAR_ARCHIVE }, - { &ui_ffa_timelimit, "ui_ffa_timelimit", "0", CVAR_ARCHIVE }, - - { &ui_tourney_fraglimit, "ui_tourney_fraglimit", "0", CVAR_ARCHIVE }, - { &ui_tourney_timelimit, "ui_tourney_timelimit", "15", CVAR_ARCHIVE }, - - { &ui_team_fraglimit, "ui_team_fraglimit", "0", CVAR_ARCHIVE }, - { &ui_team_timelimit, "ui_team_timelimit", "20", CVAR_ARCHIVE }, - { &ui_team_friendly, "ui_team_friendly", "1", CVAR_ARCHIVE }, - - { &ui_ctf_capturelimit, "ui_ctf_capturelimit", "8", CVAR_ARCHIVE }, - { &ui_ctf_timelimit, "ui_ctf_timelimit", "30", CVAR_ARCHIVE }, - { &ui_ctf_friendly, "ui_ctf_friendly", "0", CVAR_ARCHIVE }, - - { &ui_arenasFile, "g_arenasFile", "", CVAR_INIT|CVAR_ROM }, - { &ui_botsFile, "g_botsFile", "", CVAR_INIT|CVAR_ROM }, - { &ui_spScores1, "g_spScores1", "", CVAR_ARCHIVE | CVAR_ROM }, - { &ui_spScores2, "g_spScores2", "", CVAR_ARCHIVE | CVAR_ROM }, - { &ui_spScores3, "g_spScores3", "", CVAR_ARCHIVE | CVAR_ROM }, - { &ui_spScores4, "g_spScores4", "", CVAR_ARCHIVE | CVAR_ROM }, - { &ui_spScores5, "g_spScores5", "", CVAR_ARCHIVE | CVAR_ROM }, - { &ui_spAwards, "g_spAwards", "", CVAR_ARCHIVE | CVAR_ROM }, - { &ui_spVideos, "g_spVideos", "", CVAR_ARCHIVE | CVAR_ROM }, - { &ui_spSkill, "g_spSkill", "2", CVAR_ARCHIVE }, - - { &ui_spSelection, "ui_spSelection", "", CVAR_ROM }, - { &ui_winner, "ui_winner", "", CVAR_ROM }, - - { &ui_browserMaster, "ui_browserMaster", "0", CVAR_ARCHIVE }, - { &ui_browserGameType, "ui_browserGameType", "0", CVAR_ARCHIVE }, - { &ui_browserSortKey, "ui_browserSortKey", "4", CVAR_ARCHIVE }, - { &ui_browserShowFull, "ui_browserShowFull", "1", CVAR_ARCHIVE }, - { &ui_browserShowEmpty, "ui_browserShowEmpty", "1", CVAR_ARCHIVE }, - - { &ui_brassTime, "cg_brassTime", "2500", CVAR_ARCHIVE }, - { &ui_drawCrosshair, "cg_drawCrosshair", "4", CVAR_ARCHIVE }, - { &ui_drawCrosshairNames, "cg_drawCrosshairNames", "1", CVAR_ARCHIVE }, - { &ui_marks, "cg_marks", "1", CVAR_ARCHIVE }, - - { &ui_server1, "server1", "", CVAR_ARCHIVE }, - { &ui_server2, "server2", "", CVAR_ARCHIVE }, - { &ui_server3, "server3", "", CVAR_ARCHIVE }, - { &ui_server4, "server4", "", CVAR_ARCHIVE }, - { &ui_server5, "server5", "", CVAR_ARCHIVE }, - { &ui_server6, "server6", "", CVAR_ARCHIVE }, - { &ui_server7, "server7", "", CVAR_ARCHIVE }, - { &ui_server8, "server8", "", CVAR_ARCHIVE }, - { &ui_server9, "server9", "", CVAR_ARCHIVE }, - { &ui_server10, "server10", "", CVAR_ARCHIVE }, - { &ui_server11, "server11", "", CVAR_ARCHIVE }, - { &ui_server12, "server12", "", CVAR_ARCHIVE }, - { &ui_server13, "server13", "", CVAR_ARCHIVE }, - { &ui_server14, "server14", "", CVAR_ARCHIVE }, - { &ui_server15, "server15", "", CVAR_ARCHIVE }, - { &ui_server16, "server16", "", CVAR_ARCHIVE }, - { &ui_new, "ui_new", "0", CVAR_TEMP }, - { &ui_debug, "ui_debug", "0", CVAR_TEMP }, - { &ui_initialized, "ui_initialized", "0", CVAR_TEMP }, - { &ui_teamName, "ui_teamName", "Pagans", CVAR_ARCHIVE }, - { &ui_opponentName, "ui_opponentName", "Stroggs", CVAR_ARCHIVE }, - { &ui_redteam, "ui_redteam", "Pagans", CVAR_ARCHIVE }, - { &ui_blueteam, "ui_blueteam", "Stroggs", CVAR_ARCHIVE }, - { &ui_dedicated, "ui_dedicated", "0", CVAR_ARCHIVE }, - { &ui_gameType, "ui_gametype", "3", CVAR_ARCHIVE }, - { &ui_joinGameType, "ui_joinGametype", "0", CVAR_ARCHIVE }, - { &ui_netGameType, "ui_netGametype", "3", CVAR_ARCHIVE }, - { &ui_actualNetGameType, "ui_actualNetGametype", "3", CVAR_ARCHIVE }, - { &ui_redteam1, "ui_redteam1", "0", CVAR_ARCHIVE }, - { &ui_redteam2, "ui_redteam2", "0", CVAR_ARCHIVE }, - { &ui_redteam3, "ui_redteam3", "0", CVAR_ARCHIVE }, - { &ui_redteam4, "ui_redteam4", "0", CVAR_ARCHIVE }, - { &ui_redteam5, "ui_redteam5", "0", CVAR_ARCHIVE }, - { &ui_blueteam1, "ui_blueteam1", "0", CVAR_ARCHIVE }, - { &ui_blueteam2, "ui_blueteam2", "0", CVAR_ARCHIVE }, - { &ui_blueteam3, "ui_blueteam3", "0", CVAR_ARCHIVE }, - { &ui_blueteam4, "ui_blueteam4", "0", CVAR_ARCHIVE }, - { &ui_blueteam5, "ui_blueteam5", "0", CVAR_ARCHIVE }, - { &ui_netSource, "ui_netSource", "0", CVAR_ARCHIVE }, - { &ui_menuFiles, "ui_menuFiles", "ui/menus.txt", CVAR_ARCHIVE }, - { &ui_currentTier, "ui_currentTier", "0", CVAR_ARCHIVE }, - { &ui_currentMap, "ui_currentMap", "0", CVAR_ARCHIVE }, - { &ui_currentNetMap, "ui_currentNetMap", "0", CVAR_ARCHIVE }, - { &ui_mapIndex, "ui_mapIndex", "0", CVAR_ARCHIVE }, - { &ui_currentOpponent, "ui_currentOpponent", "0", CVAR_ARCHIVE }, - { &ui_selectedPlayer, "cg_selectedPlayer", "0", CVAR_ARCHIVE}, - { &ui_selectedPlayerName, "cg_selectedPlayerName", "", CVAR_ARCHIVE}, - { &ui_lastServerRefresh_0, "ui_lastServerRefresh_0", "", CVAR_ARCHIVE}, - { &ui_lastServerRefresh_1, "ui_lastServerRefresh_1", "", CVAR_ARCHIVE}, - { &ui_lastServerRefresh_2, "ui_lastServerRefresh_2", "", CVAR_ARCHIVE}, - { &ui_lastServerRefresh_3, "ui_lastServerRefresh_3", "", CVAR_ARCHIVE}, - { &ui_lastServerRefresh_0, "ui_lastServerRefresh_0_time", "", CVAR_ARCHIVE}, - { &ui_lastServerRefresh_1, "ui_lastServerRefresh_1_time", "", CVAR_ARCHIVE}, - { &ui_lastServerRefresh_2, "ui_lastServerRefresh_2_time", "", CVAR_ARCHIVE}, - { &ui_lastServerRefresh_3, "ui_lastServerRefresh_3_time", "", CVAR_ARCHIVE}, - { &ui_singlePlayerActive, "ui_singlePlayerActive", "0", 0}, - { &ui_scoreAccuracy, "ui_scoreAccuracy", "0", CVAR_ARCHIVE}, - { &ui_scoreImpressives, "ui_scoreImpressives", "0", CVAR_ARCHIVE}, - { &ui_scoreExcellents, "ui_scoreExcellents", "0", CVAR_ARCHIVE}, - { &ui_scoreCaptures, "ui_scoreCaptures", "0", CVAR_ARCHIVE}, - { &ui_scoreDefends, "ui_scoreDefends", "0", CVAR_ARCHIVE}, - { &ui_scoreAssists, "ui_scoreAssists", "0", CVAR_ARCHIVE}, - { &ui_scoreGauntlets, "ui_scoreGauntlets", "0",CVAR_ARCHIVE}, - { &ui_scoreScore, "ui_scoreScore", "0", CVAR_ARCHIVE}, - { &ui_scorePerfect, "ui_scorePerfect", "0", CVAR_ARCHIVE}, - { &ui_scoreTeam, "ui_scoreTeam", "0 to 0", CVAR_ARCHIVE}, - { &ui_scoreBase, "ui_scoreBase", "0", CVAR_ARCHIVE}, - { &ui_scoreTime, "ui_scoreTime", "00:00", CVAR_ARCHIVE}, - { &ui_scoreTimeBonus, "ui_scoreTimeBonus", "0", CVAR_ARCHIVE}, - { &ui_scoreSkillBonus, "ui_scoreSkillBonus", "0", CVAR_ARCHIVE}, - { &ui_scoreShutoutBonus, "ui_scoreShutoutBonus", "0", CVAR_ARCHIVE}, - { &ui_fragLimit, "ui_fragLimit", "10", 0}, - { &ui_captureLimit, "ui_captureLimit", "5", 0}, - { &ui_smallFont, "ui_smallFont", "0.2", CVAR_ARCHIVE}, - { &ui_bigFont, "ui_bigFont", "0.5", CVAR_ARCHIVE}, - { &ui_findPlayer, "ui_findPlayer", "", CVAR_ARCHIVE}, - { &ui_Q3Model, "ui_q3model", "0", CVAR_ARCHIVE}, - { &ui_hudFiles, "cg_hudFiles", "ui/hud.txt", CVAR_ARCHIVE}, - { &ui_recordSPDemo, "ui_recordSPDemo", "0", CVAR_ARCHIVE}, - { &ui_teamArenaFirstRun, "ui_teamArenaFirstRun", "0", CVAR_ARCHIVE}, - { &ui_realWarmUp, "g_warmup", "20", CVAR_ARCHIVE}, - { &ui_realCaptureLimit, "capturelimit", "8", CVAR_SERVERINFO | CVAR_ARCHIVE | CVAR_NORESTART}, - { &ui_serverStatusTimeOut, "ui_serverStatusTimeOut", "7000", CVAR_ARCHIVE}, - { &ui_textWrapCache, "ui_textWrapCache", "1", CVAR_ARCHIVE }, - { &ui_developer, "ui_developer", "0", CVAR_ARCHIVE | CVAR_CHEAT }, -}; - -static int cvarTableSize = sizeof(cvarTable) / sizeof(cvarTable[0]); - - /* ================= UI_RegisterCvars @@ -5586,132 +3684,3 @@ void UI_UpdateCvars( void ) { trap_Cvar_Update( cv->vmCvar ); } } - - -/* -================= -ArenaServers_StopRefresh -================= -*/ -static void UI_StopServerRefresh( void ) -{ - int count; - - if (!uiInfo.serverStatus.refreshActive) { - // not currently refreshing - return; - } - uiInfo.serverStatus.refreshActive = qfalse; - Com_Printf("%d servers listed in browser with %d players.\n", - uiInfo.serverStatus.numDisplayServers, - uiInfo.serverStatus.numPlayersOnServers); - count = trap_LAN_GetServerCount(ui_netSource.integer); - if (count - uiInfo.serverStatus.numDisplayServers > 0) { - Com_Printf("%d servers not listed due to packet loss or pings higher than %d\n", - count - uiInfo.serverStatus.numDisplayServers, - (int) trap_Cvar_VariableValue("cl_maxPing")); - } - -} - -/* -================= -UI_DoServerRefresh -================= -*/ -static void UI_DoServerRefresh( void ) -{ - qboolean wait = qfalse; - - if (!uiInfo.serverStatus.refreshActive) { - return; - } - if (ui_netSource.integer != AS_FAVORITES) { - if (ui_netSource.integer == AS_LOCAL) { - if (!trap_LAN_GetServerCount(ui_netSource.integer)) { - wait = qtrue; - } - } else { - if (trap_LAN_GetServerCount(ui_netSource.integer) < 0) { - wait = qtrue; - } - } - } - - if (uiInfo.uiDC.realTime < uiInfo.serverStatus.refreshtime) { - if (wait) { - return; - } - } - - // if still trying to retrieve pings - if (trap_LAN_UpdateVisiblePings(ui_netSource.integer)) { - uiInfo.serverStatus.refreshtime = uiInfo.uiDC.realTime + 1000; - } else if (!wait) { - // get the last servers in the list - UI_BuildServerDisplayList(2); - // stop the refresh - UI_StopServerRefresh(); - } - // - UI_BuildServerDisplayList(qfalse); -} - -/* -================= -UI_StartServerRefresh -================= -*/ -static void UI_StartServerRefresh(qboolean full) -{ - int i; - char *ptr; - int time; - qtime_t q; - - time = trap_RealTime(&q); - trap_Cvar_Set( va("ui_lastServerRefresh_%i_time", ui_netSource.integer ), - va( "%i", time ) ); - trap_Cvar_Set( va("ui_lastServerRefresh_%i", ui_netSource.integer), - va("%s-%i, %i at %i:%02i", MonthAbbrev[q.tm_mon],q.tm_mday, 1900+q.tm_year,q.tm_hour,q.tm_min)); - - if (!full) { - UI_UpdatePendingPings(); - return; - } - - uiInfo.serverStatus.refreshActive = qtrue; - uiInfo.serverStatus.nextDisplayRefresh = uiInfo.uiDC.realTime + 1000; - // clear number of displayed servers - uiInfo.serverStatus.numDisplayServers = 0; - uiInfo.serverStatus.numPlayersOnServers = 0; - // mark all servers as visible so we store ping updates for them - trap_LAN_MarkServerVisible(ui_netSource.integer, -1, qtrue); - // reset all the pings - trap_LAN_ResetPings(ui_netSource.integer); - // - if( ui_netSource.integer == AS_LOCAL ) { - trap_Cmd_ExecuteText( EXEC_NOW, "localservers\n" ); - uiInfo.serverStatus.refreshtime = uiInfo.uiDC.realTime + 1000; - return; - } - - uiInfo.serverStatus.refreshtime = uiInfo.uiDC.realTime + 5000; - if( ui_netSource.integer == AS_GLOBAL || ui_netSource.integer == AS_MPLAYER ) { - if( ui_netSource.integer == AS_GLOBAL ) { - i = 0; - } - else { - i = 1; - } - - ptr = UI_Cvar_VariableString("debug_protocol"); - if (strlen(ptr)) { - trap_Cmd_ExecuteText( EXEC_NOW, va( "globalservers %d %s full empty\n", i, ptr)); - } - else { - trap_Cmd_ExecuteText( EXEC_NOW, va( "globalservers %d %d full empty\n", i, (int)trap_Cvar_VariableValue( "protocol" ) ) ); - } - } -} - diff --git a/src/ui/ui_players.c b/src/ui/ui_players.c deleted file mode 100644 index 282fc74b..00000000 --- a/src/ui/ui_players.c +++ /dev/null @@ -1,1288 +0,0 @@ -/* -=========================================================================== -Copyright (C) 1999-2005 Id Software, Inc. -Copyright (C) 2000-2006 Tim Angus - -This file is part of Tremulous. - -Tremulous 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. - -Tremulous 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 Tremulous; if not, write to the Free Software -Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -=========================================================================== -*/ - -// ui_players.c - -#include "ui_local.h" - - -#define UI_TIMER_GESTURE 2300 -#define UI_TIMER_JUMP 1000 -#define UI_TIMER_LAND 130 -#define UI_TIMER_WEAPON_SWITCH 300 -#define UI_TIMER_ATTACK 500 -#define UI_TIMER_MUZZLE_FLASH 20 -#define UI_TIMER_WEAPON_DELAY 250 - -#define JUMP_HEIGHT 56 - -#define SWINGSPEED 0.3f - -#define SPIN_SPEED 0.9f -#define COAST_TIME 1000 - - -static int dp_realtime; -static float jumpHeight; -sfxHandle_t weaponChangeSound; - - -/* -=============== -UI_PlayerInfo_SetWeapon -=============== -*/ -static void UI_PlayerInfo_SetWeapon( playerInfo_t *pi, weapon_t weaponNum ) -{ -} - - -/* -=============== -UI_ForceLegsAnim -=============== -*/ -static void UI_ForceLegsAnim( playerInfo_t *pi, int anim ) { - pi->legsAnim = ( ( pi->legsAnim & ANIM_TOGGLEBIT ) ^ ANIM_TOGGLEBIT ) | anim; - - if ( anim == LEGS_JUMP ) { - pi->legsAnimationTimer = UI_TIMER_JUMP; - } -} - - -/* -=============== -UI_SetLegsAnim -=============== -*/ -static void UI_SetLegsAnim( playerInfo_t *pi, int anim ) { - if ( pi->pendingLegsAnim ) { - anim = pi->pendingLegsAnim; - pi->pendingLegsAnim = 0; - } - UI_ForceLegsAnim( pi, anim ); -} - - -/* -=============== -UI_ForceTorsoAnim -=============== -*/ -static void UI_ForceTorsoAnim( playerInfo_t *pi, int anim ) { - pi->torsoAnim = ( ( pi->torsoAnim & ANIM_TOGGLEBIT ) ^ ANIM_TOGGLEBIT ) | anim; - - if ( anim == TORSO_GESTURE ) { - pi->torsoAnimationTimer = UI_TIMER_GESTURE; - } - - if ( anim == TORSO_ATTACK || anim == TORSO_ATTACK2 ) { - pi->torsoAnimationTimer = UI_TIMER_ATTACK; - } -} - - -/* -=============== -UI_SetTorsoAnim -=============== -*/ -static void UI_SetTorsoAnim( playerInfo_t *pi, int anim ) { - if ( pi->pendingTorsoAnim ) { - anim = pi->pendingTorsoAnim; - pi->pendingTorsoAnim = 0; - } - - UI_ForceTorsoAnim( pi, anim ); -} - - -/* -=============== -UI_TorsoSequencing -=============== -*/ -static void UI_TorsoSequencing( playerInfo_t *pi ) { - int currentAnim; - - currentAnim = pi->torsoAnim & ~ANIM_TOGGLEBIT; - - if ( pi->weapon != pi->currentWeapon ) { - if ( currentAnim != TORSO_DROP ) { - pi->torsoAnimationTimer = UI_TIMER_WEAPON_SWITCH; - UI_ForceTorsoAnim( pi, TORSO_DROP ); - } - } - - if ( pi->torsoAnimationTimer > 0 ) { - return; - } - - if( currentAnim == TORSO_GESTURE ) { - UI_SetTorsoAnim( pi, TORSO_STAND ); - return; - } - - if( currentAnim == TORSO_ATTACK || currentAnim == TORSO_ATTACK2 ) { - UI_SetTorsoAnim( pi, TORSO_STAND ); - return; - } - - if ( currentAnim == TORSO_DROP ) { - UI_PlayerInfo_SetWeapon( pi, pi->weapon ); - pi->torsoAnimationTimer = UI_TIMER_WEAPON_SWITCH; - UI_ForceTorsoAnim( pi, TORSO_RAISE ); - return; - } - - if ( currentAnim == TORSO_RAISE ) { - UI_SetTorsoAnim( pi, TORSO_STAND ); - return; - } -} - - -/* -=============== -UI_LegsSequencing -=============== -*/ -static void UI_LegsSequencing( playerInfo_t *pi ) { - int currentAnim; - - currentAnim = pi->legsAnim & ~ANIM_TOGGLEBIT; - - if ( pi->legsAnimationTimer > 0 ) { - if ( currentAnim == LEGS_JUMP ) { - jumpHeight = JUMP_HEIGHT * sin( M_PI * ( UI_TIMER_JUMP - pi->legsAnimationTimer ) / UI_TIMER_JUMP ); - } - return; - } - - if ( currentAnim == LEGS_JUMP ) { - UI_ForceLegsAnim( pi, LEGS_LAND ); - pi->legsAnimationTimer = UI_TIMER_LAND; - jumpHeight = 0; - return; - } - - if ( currentAnim == LEGS_LAND ) { - UI_SetLegsAnim( pi, LEGS_IDLE ); - return; - } -} - - -/* -====================== -UI_PositionEntityOnTag -====================== -*/ -static void UI_PositionEntityOnTag( refEntity_t *entity, const refEntity_t *parent, - clipHandle_t parentModel, char *tagName ) { - int i; - orientation_t lerped; - - // lerp the tag - trap_CM_LerpTag( &lerped, parentModel, parent->oldframe, parent->frame, - 1.0 - parent->backlerp, tagName ); - - // FIXME: allow origin offsets along tag? - VectorCopy( parent->origin, entity->origin ); - for ( i = 0 ; i < 3 ; i++ ) { - VectorMA( entity->origin, lerped.origin[i], parent->axis[i], entity->origin ); - } - - // cast away const because of compiler problems - MatrixMultiply( lerped.axis, ((refEntity_t*)parent)->axis, entity->axis ); - entity->backlerp = parent->backlerp; -} - - -/* -====================== -UI_PositionRotatedEntityOnTag -====================== -*/ -static void UI_PositionRotatedEntityOnTag( refEntity_t *entity, const refEntity_t *parent, - clipHandle_t parentModel, char *tagName ) { - int i; - orientation_t lerped; - vec3_t tempAxis[3]; - - // lerp the tag - trap_CM_LerpTag( &lerped, parentModel, parent->oldframe, parent->frame, - 1.0 - parent->backlerp, tagName ); - - // FIXME: allow origin offsets along tag? - VectorCopy( parent->origin, entity->origin ); - for ( i = 0 ; i < 3 ; i++ ) { - VectorMA( entity->origin, lerped.origin[i], parent->axis[i], entity->origin ); - } - - // cast away const because of compiler problems - MatrixMultiply( entity->axis, ((refEntity_t *)parent)->axis, tempAxis ); - MatrixMultiply( lerped.axis, tempAxis, entity->axis ); -} - - -/* -=============== -UI_SetLerpFrameAnimation -=============== -*/ -static void UI_SetLerpFrameAnimation( playerInfo_t *ci, lerpFrame_t *lf, int newAnimation ) { - animation_t *anim; - - lf->animationNumber = newAnimation; - newAnimation &= ~ANIM_TOGGLEBIT; - - if ( newAnimation < 0 || newAnimation >= MAX_PLAYER_ANIMATIONS ) { - trap_Error( va("Bad animation number: %i", newAnimation) ); - } - - anim = &ci->animations[ newAnimation ]; - - lf->animation = anim; - lf->animationTime = lf->frameTime + anim->initialLerp; -} - - -/* -=============== -UI_RunLerpFrame -=============== -*/ -static void UI_RunLerpFrame( playerInfo_t *ci, lerpFrame_t *lf, int newAnimation ) { - int f; - animation_t *anim; - - // see if the animation sequence is switching - if ( newAnimation != lf->animationNumber || !lf->animation ) { - UI_SetLerpFrameAnimation( ci, lf, newAnimation ); - } - - // if we have passed the current frame, move it to - // oldFrame and calculate a new frame - if ( dp_realtime >= lf->frameTime ) { - lf->oldFrame = lf->frame; - lf->oldFrameTime = lf->frameTime; - - // get the next frame based on the animation - anim = lf->animation; - if ( dp_realtime < lf->animationTime ) { - lf->frameTime = lf->animationTime; // initial lerp - } else { - lf->frameTime = lf->oldFrameTime + anim->frameLerp; - } - f = ( lf->frameTime - lf->animationTime ) / anim->frameLerp; - if ( f >= anim->numFrames ) { - f -= anim->numFrames; - if ( anim->loopFrames ) { - f %= anim->loopFrames; - f += anim->numFrames - anim->loopFrames; - } else { - f = anim->numFrames - 1; - // the animation is stuck at the end, so it - // can immediately transition to another sequence - lf->frameTime = dp_realtime; - } - } - lf->frame = anim->firstFrame + f; - if ( dp_realtime > lf->frameTime ) { - lf->frameTime = dp_realtime; - } - } - - if ( lf->frameTime > dp_realtime + 200 ) { - lf->frameTime = dp_realtime; - } - - if ( lf->oldFrameTime > dp_realtime ) { - lf->oldFrameTime = dp_realtime; - } - // calculate current lerp value - if ( lf->frameTime == lf->oldFrameTime ) { - lf->backlerp = 0; - } else { - lf->backlerp = 1.0 - (float)( dp_realtime - lf->oldFrameTime ) / ( lf->frameTime - lf->oldFrameTime ); - } -} - - -/* -=============== -UI_PlayerAnimation -=============== -*/ -static void UI_PlayerAnimation( playerInfo_t *pi, int *legsOld, int *legs, float *legsBackLerp, - int *torsoOld, int *torso, float *torsoBackLerp ) { - - // legs animation - pi->legsAnimationTimer -= uiInfo.uiDC.frameTime; - if ( pi->legsAnimationTimer < 0 ) { - pi->legsAnimationTimer = 0; - } - - UI_LegsSequencing( pi ); - - if ( pi->legs.yawing && ( pi->legsAnim & ~ANIM_TOGGLEBIT ) == LEGS_IDLE ) { - UI_RunLerpFrame( pi, &pi->legs, LEGS_TURN ); - } else { - UI_RunLerpFrame( pi, &pi->legs, pi->legsAnim ); - } - *legsOld = pi->legs.oldFrame; - *legs = pi->legs.frame; - *legsBackLerp = pi->legs.backlerp; - - // torso animation - pi->torsoAnimationTimer -= uiInfo.uiDC.frameTime; - if ( pi->torsoAnimationTimer < 0 ) { - pi->torsoAnimationTimer = 0; - } - - UI_TorsoSequencing( pi ); - - UI_RunLerpFrame( pi, &pi->torso, pi->torsoAnim ); - *torsoOld = pi->torso.oldFrame; - *torso = pi->torso.frame; - *torsoBackLerp = pi->torso.backlerp; -} - - -/* -================== -UI_SwingAngles -================== -*/ -static void UI_SwingAngles( float destination, float swingTolerance, float clampTolerance, - float speed, float *angle, qboolean *swinging ) { - float swing; - float move; - float scale; - - if ( !*swinging ) { - // see if a swing should be started - swing = AngleSubtract( *angle, destination ); - if ( swing > swingTolerance || swing < -swingTolerance ) { - *swinging = qtrue; - } - } - - if ( !*swinging ) { - return; - } - - // modify the speed depending on the delta - // so it doesn't seem so linear - swing = AngleSubtract( destination, *angle ); - scale = fabs( swing ); - if ( scale < swingTolerance * 0.5 ) { - scale = 0.5; - } else if ( scale < swingTolerance ) { - scale = 1.0; - } else { - scale = 2.0; - } - - // swing towards the destination angle - if ( swing >= 0 ) { - move = uiInfo.uiDC.frameTime * scale * speed; - if ( move >= swing ) { - move = swing; - *swinging = qfalse; - } - *angle = AngleMod( *angle + move ); - } else if ( swing < 0 ) { - move = uiInfo.uiDC.frameTime * scale * -speed; - if ( move <= swing ) { - move = swing; - *swinging = qfalse; - } - *angle = AngleMod( *angle + move ); - } - - // clamp to no more than tolerance - swing = AngleSubtract( destination, *angle ); - if ( swing > clampTolerance ) { - *angle = AngleMod( destination - (clampTolerance - 1) ); - } else if ( swing < -clampTolerance ) { - *angle = AngleMod( destination + (clampTolerance - 1) ); - } -} - - -/* -====================== -UI_MovedirAdjustment -====================== -*/ -static float UI_MovedirAdjustment( playerInfo_t *pi ) { - vec3_t relativeAngles; - vec3_t moveVector; - - VectorSubtract( pi->viewAngles, pi->moveAngles, relativeAngles ); - AngleVectors( relativeAngles, moveVector, NULL, NULL ); - if ( Q_fabs( moveVector[0] ) < 0.01 ) { - moveVector[0] = 0.0; - } - if ( Q_fabs( moveVector[1] ) < 0.01 ) { - moveVector[1] = 0.0; - } - - if ( moveVector[1] == 0 && moveVector[0] > 0 ) { - return 0; - } - if ( moveVector[1] < 0 && moveVector[0] > 0 ) { - return 22; - } - if ( moveVector[1] < 0 && moveVector[0] == 0 ) { - return 45; - } - if ( moveVector[1] < 0 && moveVector[0] < 0 ) { - return -22; - } - if ( moveVector[1] == 0 && moveVector[0] < 0 ) { - return 0; - } - if ( moveVector[1] > 0 && moveVector[0] < 0 ) { - return 22; - } - if ( moveVector[1] > 0 && moveVector[0] == 0 ) { - return -45; - } - - return -22; -} - - -/* -=============== -UI_PlayerAngles -=============== -*/ -static void UI_PlayerAngles( playerInfo_t *pi, vec3_t legs[3], vec3_t torso[3], vec3_t head[3] ) { - vec3_t legsAngles, torsoAngles, headAngles; - float dest; - float adjust; - - VectorCopy( pi->viewAngles, headAngles ); - headAngles[YAW] = AngleMod( headAngles[YAW] ); - VectorClear( legsAngles ); - VectorClear( torsoAngles ); - - // --------- yaw ------------- - - // allow yaw to drift a bit - if ( ( pi->legsAnim & ~ANIM_TOGGLEBIT ) != LEGS_IDLE - || ( pi->torsoAnim & ~ANIM_TOGGLEBIT ) != TORSO_STAND ) { - // if not standing still, always point all in the same direction - pi->torso.yawing = qtrue; // always center - pi->torso.pitching = qtrue; // always center - pi->legs.yawing = qtrue; // always center - } - - // adjust legs for movement dir - adjust = UI_MovedirAdjustment( pi ); - legsAngles[YAW] = headAngles[YAW] + adjust; - torsoAngles[YAW] = headAngles[YAW] + 0.25 * adjust; - - - // torso - UI_SwingAngles( torsoAngles[YAW], 25, 90, SWINGSPEED, &pi->torso.yawAngle, &pi->torso.yawing ); - UI_SwingAngles( legsAngles[YAW], 40, 90, SWINGSPEED, &pi->legs.yawAngle, &pi->legs.yawing ); - - torsoAngles[YAW] = pi->torso.yawAngle; - legsAngles[YAW] = pi->legs.yawAngle; - - // --------- pitch ------------- - - // only show a fraction of the pitch angle in the torso - if ( headAngles[PITCH] > 180 ) { - dest = (-360 + headAngles[PITCH]) * 0.75; - } else { - dest = headAngles[PITCH] * 0.75; - } - UI_SwingAngles( dest, 15, 30, 0.1f, &pi->torso.pitchAngle, &pi->torso.pitching ); - torsoAngles[PITCH] = pi->torso.pitchAngle; - - // pull the angles back out of the hierarchial chain - AnglesSubtract( headAngles, torsoAngles, headAngles ); - AnglesSubtract( torsoAngles, legsAngles, torsoAngles ); - AnglesToAxis( legsAngles, legs ); - AnglesToAxis( torsoAngles, torso ); - AnglesToAxis( headAngles, head ); -} - - -/* -=============== -UI_PlayerFloatSprite -=============== -*/ -static void UI_PlayerFloatSprite( playerInfo_t *pi, vec3_t origin, qhandle_t shader ) { - refEntity_t ent; - - memset( &ent, 0, sizeof( ent ) ); - VectorCopy( origin, ent.origin ); - ent.origin[2] += 48; - ent.reType = RT_SPRITE; - ent.customShader = shader; - ent.radius = 10; - ent.renderfx = 0; - trap_R_AddRefEntityToScene( &ent ); -} - - -/* -====================== -UI_MachinegunSpinAngle -====================== -*/ -float UI_MachinegunSpinAngle( playerInfo_t *pi ) { - int delta; - float angle; - float speed; - int torsoAnim; - - delta = dp_realtime - pi->barrelTime; - if ( pi->barrelSpinning ) { - angle = pi->barrelAngle + delta * SPIN_SPEED; - } else { - if ( delta > COAST_TIME ) { - delta = COAST_TIME; - } - - speed = 0.5 * ( SPIN_SPEED + (float)( COAST_TIME - delta ) / COAST_TIME ); - angle = pi->barrelAngle + delta * speed; - } - - torsoAnim = pi->torsoAnim & ~ANIM_TOGGLEBIT; - if( torsoAnim == TORSO_ATTACK2 ) { - torsoAnim = TORSO_ATTACK; - } - if ( pi->barrelSpinning == !(torsoAnim == TORSO_ATTACK) ) { - pi->barrelTime = dp_realtime; - pi->barrelAngle = AngleMod( angle ); - pi->barrelSpinning = !!(torsoAnim == TORSO_ATTACK); - } - - return angle; -} - - -/* -=============== -UI_DrawPlayer -=============== -*/ -void UI_DrawPlayer( float x, float y, float w, float h, playerInfo_t *pi, int time ) { - refdef_t refdef; - refEntity_t legs; - refEntity_t torso; - refEntity_t head; - refEntity_t gun; - refEntity_t barrel; - refEntity_t flash; - vec3_t origin; - int renderfx; - vec3_t mins = {-16, -16, -24}; - vec3_t maxs = {16, 16, 32}; - float len; - float xx; - - if ( !pi->legsModel || !pi->torsoModel || !pi->headModel || !pi->animations[0].numFrames ) { - return; - } - - // this allows the ui to cache the player model on the main menu - if (w == 0 || h == 0) { - return; - } - - dp_realtime = time; - - if ( pi->pendingWeapon != -1 && dp_realtime > pi->weaponTimer ) { - pi->weapon = pi->pendingWeapon; - pi->lastWeapon = pi->pendingWeapon; - pi->pendingWeapon = -1; - pi->weaponTimer = 0; - if( pi->currentWeapon != pi->weapon ) { - trap_S_StartLocalSound( weaponChangeSound, CHAN_LOCAL ); - } - } - - UI_AdjustFrom640( &x, &y, &w, &h ); - - y -= jumpHeight; - - memset( &refdef, 0, sizeof( refdef ) ); - memset( &legs, 0, sizeof(legs) ); - memset( &torso, 0, sizeof(torso) ); - memset( &head, 0, sizeof(head) ); - - refdef.rdflags = RDF_NOWORLDMODEL; - - AxisClear( refdef.viewaxis ); - - refdef.x = x; - refdef.y = y; - refdef.width = w; - refdef.height = h; - - refdef.fov_x = (int)((float)refdef.width / 640.0f * 90.0f); - xx = refdef.width / tan( refdef.fov_x / 360 * M_PI ); - refdef.fov_y = atan2( refdef.height, xx ); - refdef.fov_y *= ( 360 / (float)M_PI ); - - // calculate distance so the player nearly fills the box - len = 0.7 * ( maxs[2] - mins[2] ); - origin[0] = len / tan( DEG2RAD(refdef.fov_x) * 0.5 ); - origin[1] = 0.5 * ( mins[1] + maxs[1] ); - origin[2] = -0.5 * ( mins[2] + maxs[2] ); - - refdef.time = dp_realtime; - - trap_R_ClearScene(); - - // get the rotation information - UI_PlayerAngles( pi, legs.axis, torso.axis, head.axis ); - - // get the animation state (after rotation, to allow feet shuffle) - UI_PlayerAnimation( pi, &legs.oldframe, &legs.frame, &legs.backlerp, - &torso.oldframe, &torso.frame, &torso.backlerp ); - - renderfx = RF_LIGHTING_ORIGIN | RF_NOSHADOW; - - // - // add the legs - // - legs.hModel = pi->legsModel; - legs.customSkin = pi->legsSkin; - - VectorCopy( origin, legs.origin ); - - VectorCopy( origin, legs.lightingOrigin ); - legs.renderfx = renderfx; - VectorCopy (legs.origin, legs.oldorigin); - - trap_R_AddRefEntityToScene( &legs ); - - if (!legs.hModel) { - return; - } - - // - // add the torso - // - torso.hModel = pi->torsoModel; - if (!torso.hModel) { - return; - } - - torso.customSkin = pi->torsoSkin; - - VectorCopy( origin, torso.lightingOrigin ); - - UI_PositionRotatedEntityOnTag( &torso, &legs, pi->legsModel, "tag_torso"); - - torso.renderfx = renderfx; - - trap_R_AddRefEntityToScene( &torso ); - - // - // add the head - // - head.hModel = pi->headModel; - if (!head.hModel) { - return; - } - head.customSkin = pi->headSkin; - - VectorCopy( origin, head.lightingOrigin ); - - UI_PositionRotatedEntityOnTag( &head, &torso, pi->torsoModel, "tag_head"); - - head.renderfx = renderfx; - - trap_R_AddRefEntityToScene( &head ); - - // - // add the gun - // - if ( pi->currentWeapon != WP_NONE ) { - memset( &gun, 0, sizeof(gun) ); - gun.hModel = pi->weaponModel; - VectorCopy( origin, gun.lightingOrigin ); - UI_PositionEntityOnTag( &gun, &torso, pi->torsoModel, "tag_weapon"); - gun.renderfx = renderfx; - trap_R_AddRefEntityToScene( &gun ); - } - - // - // add the spinning barrel - // - if ( pi->realWeapon == WP_MACHINEGUN ) { - vec3_t angles; - - memset( &barrel, 0, sizeof(barrel) ); - VectorCopy( origin, barrel.lightingOrigin ); - barrel.renderfx = renderfx; - - barrel.hModel = pi->barrelModel; - angles[YAW] = 0; - angles[PITCH] = 0; - angles[ROLL] = UI_MachinegunSpinAngle( pi ); -/* if( pi->realWeapon == WP_GAUNTLET || pi->realWeapon == WP_BFG ) { - angles[PITCH] = angles[ROLL]; - angles[ROLL] = 0; - }*/ - AnglesToAxis( angles, barrel.axis ); - - UI_PositionRotatedEntityOnTag( &barrel, &gun, pi->weaponModel, "tag_barrel"); - - trap_R_AddRefEntityToScene( &barrel ); - } - - // - // add muzzle flash - // - if ( dp_realtime <= pi->muzzleFlashTime ) { - if ( pi->flashModel ) { - memset( &flash, 0, sizeof(flash) ); - flash.hModel = pi->flashModel; - VectorCopy( origin, flash.lightingOrigin ); - UI_PositionEntityOnTag( &flash, &gun, pi->weaponModel, "tag_flash"); - flash.renderfx = renderfx; - trap_R_AddRefEntityToScene( &flash ); - } - - // make a dlight for the flash - if ( pi->flashDlightColor[0] || pi->flashDlightColor[1] || pi->flashDlightColor[2] ) { - trap_R_AddLightToScene( flash.origin, 200 + (rand()&31), pi->flashDlightColor[0], - pi->flashDlightColor[1], pi->flashDlightColor[2] ); - } - } - - // - // add the chat icon - // - if ( pi->chat ) { - UI_PlayerFloatSprite( pi, origin, trap_R_RegisterShaderNoMip( "sprites/balloon3" ) ); - } - - // - // add an accent light - // - origin[0] -= 100; // + = behind, - = in front - origin[1] += 100; // + = left, - = right - origin[2] += 100; // + = above, - = below - trap_R_AddLightToScene( origin, 500, 1.0, 1.0, 1.0 ); - - origin[0] -= 100; - origin[1] -= 100; - origin[2] -= 100; - trap_R_AddLightToScene( origin, 500, 1.0, 0.0, 0.0 ); - - trap_R_RenderScene( &refdef ); -} - -/* -========================== -UI_FileExists -========================== -*/ -static qboolean UI_FileExists(const char *filename) { - int len; - - len = trap_FS_FOpenFile( filename, NULL, FS_READ ); - if (len>0) { - return qtrue; - } - return qfalse; -} - -/* -========================== -UI_FindClientHeadFile -========================== -*/ -static qboolean UI_FindClientHeadFile( char *filename, int length, const char *teamName, const char *headModelName, const char *headSkinName, const char *base, const char *ext ) { - char *team, *headsFolder; - int i; - - team = "default"; - - if ( headModelName[0] == '*' ) { - headsFolder = "heads/"; - headModelName++; - } - else { - headsFolder = ""; - } - while(1) { - for ( i = 0; i < 2; i++ ) { - if ( i == 0 && teamName && *teamName ) { - Com_sprintf( filename, length, "models/players/%s%s/%s/%s%s_%s.%s", headsFolder, headModelName, headSkinName, teamName, base, team, ext ); - } - else { - Com_sprintf( filename, length, "models/players/%s%s/%s/%s_%s.%s", headsFolder, headModelName, headSkinName, base, team, ext ); - } - if ( UI_FileExists( filename ) ) { - return qtrue; - } - if ( i == 0 && teamName && *teamName ) { - Com_sprintf( filename, length, "models/players/%s%s/%s%s_%s.%s", headsFolder, headModelName, teamName, base, headSkinName, ext ); - } - else { - Com_sprintf( filename, length, "models/players/%s%s/%s_%s.%s", headsFolder, headModelName, base, headSkinName, ext ); - } - if ( UI_FileExists( filename ) ) { - return qtrue; - } - if ( !teamName || !*teamName ) { - break; - } - } - // if tried the heads folder first - if ( headsFolder[0] ) { - break; - } - headsFolder = "heads/"; - } - - return qfalse; -} - -/* -========================== -UI_RegisterClientSkin -========================== -*/ -static qboolean UI_RegisterClientSkin( playerInfo_t *pi, const char *modelName, const char *skinName, const char *headModelName, const char *headSkinName , const char *teamName) { - char filename[MAX_QPATH*2]; - - if (teamName && *teamName) { - Com_sprintf( filename, sizeof( filename ), "models/players/%s/%s/lower_%s.skin", modelName, teamName, skinName ); - } else { - Com_sprintf( filename, sizeof( filename ), "models/players/%s/lower_%s.skin", modelName, skinName ); - } - pi->legsSkin = trap_R_RegisterSkin( filename ); - if (!pi->legsSkin) { - if (teamName && *teamName) { - Com_sprintf( filename, sizeof( filename ), "models/players/characters/%s/%s/lower_%s.skin", modelName, teamName, skinName ); - } else { - Com_sprintf( filename, sizeof( filename ), "models/players/characters/%s/lower_%s.skin", modelName, skinName ); - } - pi->legsSkin = trap_R_RegisterSkin( filename ); - } - - if (teamName && *teamName) { - Com_sprintf( filename, sizeof( filename ), "models/players/%s/%s/upper_%s.skin", modelName, teamName, skinName ); - } else { - Com_sprintf( filename, sizeof( filename ), "models/players/%s/upper_%s.skin", modelName, skinName ); - } - pi->torsoSkin = trap_R_RegisterSkin( filename ); - if (!pi->torsoSkin) { - if (teamName && *teamName) { - Com_sprintf( filename, sizeof( filename ), "models/players/characters/%s/%s/upper_%s.skin", modelName, teamName, skinName ); - } else { - Com_sprintf( filename, sizeof( filename ), "models/players/characters/%s/upper_%s.skin", modelName, skinName ); - } - pi->torsoSkin = trap_R_RegisterSkin( filename ); - } - - if ( UI_FindClientHeadFile( filename, sizeof(filename), teamName, headModelName, headSkinName, "head", "skin" ) ) { - pi->headSkin = trap_R_RegisterSkin( filename ); - } - - if ( !pi->legsSkin || !pi->torsoSkin || !pi->headSkin ) { - return qfalse; - } - - return qtrue; -} - - -/* -====================== -UI_ParseAnimationFile -====================== -*/ -static qboolean UI_ParseAnimationFile( const char *filename, animation_t *animations ) { - char *text_p, *prev; - int len; - int i; - char *token; - float fps; - int skip; - char text[20000]; - fileHandle_t f; - - memset( animations, 0, sizeof( animation_t ) * MAX_PLAYER_ANIMATIONS ); - - // load the file - len = trap_FS_FOpenFile( filename, &f, FS_READ ); - if ( len <= 0 ) { - return qfalse; - } - if ( len >= ( sizeof( text ) - 1 ) ) { - Com_Printf( "File %s too long\n", filename ); - trap_FS_FCloseFile( f ); - return qfalse; - } - trap_FS_Read( text, len, f ); - text[len] = 0; - trap_FS_FCloseFile( f ); - - COM_Compress(text); - - // parse the text - text_p = text; - skip = 0; // quite the compiler warning - - // read optional parameters - while ( 1 ) { - prev = text_p; // so we can unget - token = COM_Parse( &text_p ); - if ( !token ) { - break; - } - if ( !Q_stricmp( token, "footsteps" ) ) { - token = COM_Parse( &text_p ); - if ( !token ) { - break; - } - continue; - } else if ( !Q_stricmp( token, "headoffset" ) ) { - for ( i = 0 ; i < 3 ; i++ ) { - token = COM_Parse( &text_p ); - if ( !token ) { - break; - } - } - continue; - } else if ( !Q_stricmp( token, "sex" ) ) { - token = COM_Parse( &text_p ); - if ( !token ) { - break; - } - continue; - } - - // if it is a number, start parsing animations - if ( token[0] >= '0' && token[0] <= '9' ) { - text_p = prev; // unget the token - break; - } - - Com_Printf( "unknown token '%s' is %s\n", token, filename ); - } - - // read information for each frame - for ( i = 0 ; i < MAX_PLAYER_ANIMATIONS ; i++ ) { - - token = COM_Parse( &text_p ); - if ( !token ) { - break; - } - animations[i].firstFrame = atoi( token ); - // leg only frames are adjusted to not count the upper body only frames - if ( i == LEGS_WALKCR ) { - skip = animations[LEGS_WALKCR].firstFrame - animations[TORSO_GESTURE].firstFrame; - } - if ( i >= LEGS_WALKCR ) { - animations[i].firstFrame -= skip; - } - - token = COM_Parse( &text_p ); - if ( !token ) { - break; - } - animations[i].numFrames = atoi( token ); - - token = COM_Parse( &text_p ); - if ( !token ) { - break; - } - animations[i].loopFrames = atoi( token ); - - token = COM_Parse( &text_p ); - if ( !token ) { - break; - } - fps = atof( token ); - if ( fps == 0 ) { - fps = 1; - } - animations[i].frameLerp = 1000 / fps; - animations[i].initialLerp = 1000 / fps; - } - - if ( i != MAX_PLAYER_ANIMATIONS ) { - Com_Printf( "Error parsing animation file: %s", filename ); - return qfalse; - } - - return qtrue; -} - -/* -========================== -UI_RegisterClientModelname -========================== -*/ -qboolean UI_RegisterClientModelname( playerInfo_t *pi, const char *modelSkinName, const char *headModelSkinName, const char *teamName ) { - char modelName[MAX_QPATH]; - char skinName[MAX_QPATH]; - char headModelName[MAX_QPATH]; - char headSkinName[MAX_QPATH]; - char filename[MAX_QPATH]; - char *slash; - - pi->torsoModel = 0; - pi->headModel = 0; - - if ( !modelSkinName[0] ) { - return qfalse; - } - - Q_strncpyz( modelName, modelSkinName, sizeof( modelName ) ); - - slash = strchr( modelName, '/' ); - if ( !slash ) { - // modelName did not include a skin name - Q_strncpyz( skinName, "default", sizeof( skinName ) ); - } else { - Q_strncpyz( skinName, slash + 1, sizeof( skinName ) ); - *slash = '\0'; - } - - Q_strncpyz( headModelName, headModelSkinName, sizeof( headModelName ) ); - slash = strchr( headModelName, '/' ); - if ( !slash ) { - // modelName did not include a skin name - Q_strncpyz( headSkinName, "default", sizeof( skinName ) ); - } else { - Q_strncpyz( headSkinName, slash + 1, sizeof( skinName ) ); - *slash = '\0'; - } - - // load cmodels before models so filecache works - - Com_sprintf( filename, sizeof( filename ), "models/players/%s/lower.md3", modelName ); - pi->legsModel = trap_R_RegisterModel( filename ); - if ( !pi->legsModel ) { - Com_sprintf( filename, sizeof( filename ), "models/players/characters/%s/lower.md3", modelName ); - pi->legsModel = trap_R_RegisterModel( filename ); - if ( !pi->legsModel ) { - Com_Printf( "Failed to load model file %s\n", filename ); - return qfalse; - } - } - - Com_sprintf( filename, sizeof( filename ), "models/players/%s/upper.md3", modelName ); - pi->torsoModel = trap_R_RegisterModel( filename ); - if ( !pi->torsoModel ) { - Com_sprintf( filename, sizeof( filename ), "models/players/characters/%s/upper.md3", modelName ); - pi->torsoModel = trap_R_RegisterModel( filename ); - if ( !pi->torsoModel ) { - Com_Printf( "Failed to load model file %s\n", filename ); - return qfalse; - } - } - - if (headModelName && headModelName[0] == '*' ) { - Com_sprintf( filename, sizeof( filename ), "models/players/heads/%s/%s.md3", &headModelName[1], &headModelName[1] ); - } - else { - Com_sprintf( filename, sizeof( filename ), "models/players/%s/head.md3", headModelName ); - } - pi->headModel = trap_R_RegisterModel( filename ); - if ( !pi->headModel && headModelName[0] != '*') { - Com_sprintf( filename, sizeof( filename ), "models/players/heads/%s/%s.md3", headModelName, headModelName ); - pi->headModel = trap_R_RegisterModel( filename ); - } - - if (!pi->headModel) { - Com_Printf( "Failed to load model file %s\n", filename ); - return qfalse; - } - - // if any skins failed to load, fall back to default - if ( !UI_RegisterClientSkin( pi, modelName, skinName, headModelName, headSkinName, teamName) ) { - if ( !UI_RegisterClientSkin( pi, modelName, "default", headModelName, "default", teamName ) ) { - Com_Printf( "Failed to load skin file: %s : %s\n", modelName, skinName ); - return qfalse; - } - } - - // load the animations - Com_sprintf( filename, sizeof( filename ), "models/players/%s/animation.cfg", modelName ); - if ( !UI_ParseAnimationFile( filename, pi->animations ) ) { - Com_sprintf( filename, sizeof( filename ), "models/players/characters/%s/animation.cfg", modelName ); - if ( !UI_ParseAnimationFile( filename, pi->animations ) ) { - Com_Printf( "Failed to load animation file %s\n", filename ); - return qfalse; - } - } - - return qtrue; -} - - -/* -=============== -UI_PlayerInfo_SetModel -=============== -*/ -void UI_PlayerInfo_SetModel( playerInfo_t *pi, const char *model, const char *headmodel, char *teamName ) { - memset( pi, 0, sizeof(*pi) ); - UI_RegisterClientModelname( pi, model, headmodel, teamName ); - pi->weapon = WP_MACHINEGUN; - pi->currentWeapon = pi->weapon; - pi->lastWeapon = pi->weapon; - pi->pendingWeapon = -1; - pi->weaponTimer = 0; - pi->chat = qfalse; - pi->newModel = qtrue; - UI_PlayerInfo_SetWeapon( pi, pi->weapon ); -} - - -/* -=============== -UI_PlayerInfo_SetInfo -=============== -*/ -void UI_PlayerInfo_SetInfo( playerInfo_t *pi, int legsAnim, int torsoAnim, vec3_t viewAngles, vec3_t moveAngles, weapon_t weaponNumber, qboolean chat ) { - int currentAnim; - weapon_t weaponNum; - - pi->chat = chat; - - // view angles - VectorCopy( viewAngles, pi->viewAngles ); - - // move angles - VectorCopy( moveAngles, pi->moveAngles ); - - if ( pi->newModel ) { - pi->newModel = qfalse; - - jumpHeight = 0; - pi->pendingLegsAnim = 0; - UI_ForceLegsAnim( pi, legsAnim ); - pi->legs.yawAngle = viewAngles[YAW]; - pi->legs.yawing = qfalse; - - pi->pendingTorsoAnim = 0; - UI_ForceTorsoAnim( pi, torsoAnim ); - pi->torso.yawAngle = viewAngles[YAW]; - pi->torso.yawing = qfalse; - - if ( weaponNumber != -1 ) { - pi->weapon = weaponNumber; - pi->currentWeapon = weaponNumber; - pi->lastWeapon = weaponNumber; - pi->pendingWeapon = -1; - pi->weaponTimer = 0; - UI_PlayerInfo_SetWeapon( pi, pi->weapon ); - } - - return; - } - - // weapon - if ( weaponNumber == -1 ) { - pi->pendingWeapon = -1; - pi->weaponTimer = 0; - } - else if ( weaponNumber != WP_NONE ) { - pi->pendingWeapon = weaponNumber; - pi->weaponTimer = dp_realtime + UI_TIMER_WEAPON_DELAY; - } - weaponNum = pi->lastWeapon; - pi->weapon = weaponNum; - - if ( torsoAnim == BOTH_DEATH1 || legsAnim == BOTH_DEATH1 ) { - torsoAnim = legsAnim = BOTH_DEATH1; - pi->weapon = pi->currentWeapon = WP_NONE; - UI_PlayerInfo_SetWeapon( pi, pi->weapon ); - - jumpHeight = 0; - pi->pendingLegsAnim = 0; - UI_ForceLegsAnim( pi, legsAnim ); - - pi->pendingTorsoAnim = 0; - UI_ForceTorsoAnim( pi, torsoAnim ); - - return; - } - - // leg animation - currentAnim = pi->legsAnim & ~ANIM_TOGGLEBIT; - if ( legsAnim != LEGS_JUMP && ( currentAnim == LEGS_JUMP || currentAnim == LEGS_LAND ) ) { - pi->pendingLegsAnim = legsAnim; - } - else if ( legsAnim != currentAnim ) { - jumpHeight = 0; - pi->pendingLegsAnim = 0; - UI_ForceLegsAnim( pi, legsAnim ); - } - - // torso animation - if ( torsoAnim == TORSO_STAND || torsoAnim == TORSO_STAND2 ) { - if ( weaponNum == WP_NONE ) { - torsoAnim = TORSO_STAND2; - } - else { - torsoAnim = TORSO_STAND; - } - } - - if ( torsoAnim == TORSO_ATTACK || torsoAnim == TORSO_ATTACK2 ) { - if ( weaponNum == WP_NONE ) { - torsoAnim = TORSO_ATTACK2; - } - else { - torsoAnim = TORSO_ATTACK; - } - pi->muzzleFlashTime = dp_realtime + UI_TIMER_MUZZLE_FLASH; - //FIXME play firing sound here - } - - currentAnim = pi->torsoAnim & ~ANIM_TOGGLEBIT; - - if ( weaponNum != pi->currentWeapon || currentAnim == TORSO_RAISE || currentAnim == TORSO_DROP ) { - pi->pendingTorsoAnim = torsoAnim; - } - else if ( ( currentAnim == TORSO_GESTURE || currentAnim == TORSO_ATTACK ) && ( torsoAnim != currentAnim ) ) { - pi->pendingTorsoAnim = torsoAnim; - } - else if ( torsoAnim != currentAnim ) { - pi->pendingTorsoAnim = 0; - UI_ForceTorsoAnim( pi, torsoAnim ); - } -} diff --git a/src/ui/ui_public.h b/src/ui/ui_public.h index 3f26a8ba..5936319f 100644 --- a/src/ui/ui_public.h +++ b/src/ui/ui_public.h @@ -21,8 +21,8 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA =========================================================================== */ -#ifndef __UI_PUBLIC_H__ -#define __UI_PUBLIC_H__ +#ifndef UI_PUBLIC_H +#define UI_PUBLIC_H #define UI_API_VERSION 6 @@ -138,9 +138,7 @@ typedef enum { typedef enum { UIMENU_NONE, UIMENU_MAIN, - UIMENU_INGAME, - UIMENU_TEAM, - UIMENU_POSTGAME + UIMENU_INGAME } uiMenuCommand_t; typedef enum diff --git a/src/ui/ui_shared.c b/src/ui/ui_shared.c index 52aa1fc4..d587651f 100644 --- a/src/ui/ui_shared.c +++ b/src/ui/ui_shared.c @@ -928,11 +928,6 @@ static void Window_Paint(Window *w, float fadeAmount, float fadeClamp, float fad } DC->drawHandlePic(fillRect.x, fillRect.y, fillRect.w, fillRect.h, w->background); DC->setColor(NULL); - } else if (w->style == WINDOW_STYLE_TEAMCOLOR) { - if (DC->getTeamColor) { - DC->getTeamColor(&color); - DC->fillRect(fillRect.x, fillRect.y, fillRect.w, fillRect.h, color); - } } else if (w->style == WINDOW_STYLE_CINEMATIC) { if (w->cinematic == -1) { w->cinematic = DC->playCinematic(w->cinematicName, fillRect.x, fillRect.y, fillRect.w, fillRect.h); @@ -948,30 +943,13 @@ static void Window_Paint(Window *w, float fadeAmount, float fadeClamp, float fad } static void Border_Paint(Window *w) { - vec4_t color; - if (w == NULL || (w->style == 0 && w->border == 0)) { return; } if (w->border == WINDOW_BORDER_FULL) { // full - // HACK HACK HACK - if (w->style == WINDOW_STYLE_TEAMCOLOR) { - if (color[0] > 0) { - // red - color[0] = 1; - color[1] = color[2] = .5; - - } else { - color[2] = 1; - color[0] = color[1] = .5; - } - color[3] = 1; - DC->drawRect(w->rect.x, w->rect.y, w->rect.w, w->rect.h, w->borderSize, color); - } else { - DC->drawRect(w->rect.x, w->rect.y, w->rect.w, w->rect.h, w->borderSize, w->borderColor); - } + DC->drawRect(w->rect.x, w->rect.y, w->rect.w, w->rect.h, w->borderSize, w->borderColor); } else if (w->border == WINDOW_BORDER_HORZ) { // top/bottom DC->setColor(w->borderColor); @@ -1251,17 +1229,6 @@ itemDef_t *Menu_FindItemByName(menuDef_t *menu, const char *p) { return NULL; } -void Script_SetTeamColor(itemDef_t *item, char **args) { - if (DC->getTeamColor) { - int i; - vec4_t color; - DC->getTeamColor(&color); - for (i = 0; i < 4; i++) { - item->window.backColor[i] = color[i]; - } - } -} - void Script_SetItemColor(itemDef_t *item, char **args) { const char *itemname; const char *name; @@ -2079,7 +2046,6 @@ commandDef_t commandList[] = {"setasset", &Script_SetAsset}, // works on this {"setbackground", &Script_SetBackground}, // works on this {"setitemcolor", &Script_SetItemColor}, // group/name - {"setteamcolor", &Script_SetTeamColor}, // sets this background color to team color {"setfocus", &Script_SetFocus}, // sets this background color to team color {"reset", &Script_Reset}, // resets the state of the item argument {"setplayermodel", &Script_SetPlayerModel}, // sets this background color to team color @@ -4901,7 +4867,7 @@ void Item_ListBox_Paint(itemDef_t *item) { // default is vertical if horizontal flag is not here if (item->window.flags & WINDOW_HORIZONTAL) { //FIXME: unmaintained cruft? - if( !listPtr->notselectable ) + if( !listPtr->noscrollbar ) { // draw scrollbar in bottom of the window // bar @@ -4955,7 +4921,7 @@ void Item_ListBox_Paint(itemDef_t *item) { // } } else { - if( !listPtr->notselectable ) + if( !listPtr->noscrollbar ) { // draw scrollbar to right side of the window x = item->window.rect.x + item->window.rect.w - SCROLLBAR_WIDTH - one; @@ -5852,6 +5818,17 @@ qboolean ItemParse_notselectable( itemDef_t *item, int handle ) { return qtrue; } +// noscrollbar +qboolean ItemParse_noscrollbar( itemDef_t *item, int handle ) { + listBoxDef_t *listPtr; + Item_ValidateTypeData(item); + listPtr = (listBoxDef_t*)item->typeData; + if (item->type == ITEM_TYPE_LISTBOX && listPtr) { + listPtr->noscrollbar = qtrue; + } + return qtrue; +} + // auto wrapped qboolean ItemParse_wrapped( itemDef_t *item, int handle ) { item->window.flags |= WINDOW_WRAPPED; @@ -6446,6 +6423,7 @@ keywordHash_t itemParseKeywords[] = { {"style", ItemParse_style, NULL}, {"decoration", ItemParse_decoration, NULL}, {"notselectable", ItemParse_notselectable, NULL}, + {"noscrollbar", ItemParse_noscrollbar, NULL}, {"wrapped", ItemParse_wrapped, NULL}, {"horizontalscroll", ItemParse_horizontalscroll, NULL}, {"type", ItemParse_type, NULL}, diff --git a/src/ui/ui_shared.h b/src/ui/ui_shared.h index 30568e85..58bd2b6f 100644 --- a/src/ui/ui_shared.h +++ b/src/ui/ui_shared.h @@ -188,6 +188,7 @@ typedef struct listBoxDef_s { columnInfo_t columnInfo[MAX_LB_COLUMNS]; const char *doubleClick; qboolean notselectable; + qboolean noscrollbar; } listBoxDef_t; typedef struct editFieldDef_s { @@ -337,7 +338,6 @@ typedef struct { float (*getValue) (int ownerDraw); qboolean (*ownerDrawVisible) (int flags); void (*runScript)(char **p); - void (*getTeamColor)(vec4_t *color); void (*getCVarString)(const char *cvar, char *buffer, int bufsize); float (*getCVarValue)(const char *cvar); void (*setCVar)(const char *cvar, const char *value); |