diff options
Diffstat (limited to 'src/ui')
| -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 | 
8 files changed, 880 insertions, 5335 deletions
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);  | 
