// Copyright (C) 1999-2000 Id Software, Inc. // // cg_scoreboard -- draw the scoreboard on top of the game screen #include "cg_local.h" #include "cg_text.h" #define SCOREBOARD_X (37) //Before RPG-X: (13) //(53) //Header info of scoreboard #define SB_HEADER 40 //Before RPG-X: 105 //40 #define SB_TOP (SB_HEADER+32) #define SB_HEADERTEXT (SB_HEADER + 8) #define SB_TOPLINE_LENGTH 550 //Before RPG-X: 590 //530 // Where the status bar starts, so we don't overwrite it #define SB_STATUSBAR 420 //Scoreboard height #define SB_NORMAL_HEIGHT_BIG 14 //RPG-X: RedTechie - Spacing between names #define SB_NORMAL_HEIGHT 22 #define SB_INTER_HEIGHT 16 //interleaved height #define SB_RPG_X_FIXHEIGHT 350 //RPG-X: RedTechie - Fixed background height 350 before new health bar #define SB_MAXCLIENTS_BIG ((SB_STATUSBAR - SB_TOP) / SB_NORMAL_HEIGHT_BIG) #define SB_MAXCLIENTS_NORMAL ((SB_STATUSBAR - SB_TOP) / SB_NORMAL_HEIGHT) #define SB_MAXCLIENTS_INTER ((SB_STATUSBAR - SB_TOP) / SB_INTER_HEIGHT - 1) // Used when interleaved #define SB_LEFT_BOTICON_X (SCOREBOARD_X+0) #define SB_LEFT_HEAD_X (SCOREBOARD_X+12) #define SB_RIGHT_BOTICON_X (SCOREBOARD_X+64) #define SB_RIGHT_HEAD_X (SCOREBOARD_X+96) // Normal #define SB_BOTICON_X (SCOREBOARD_X+10) //Before RPG-X - This is for positioning of class icon: (SCOREBOARD_X+20) #define SB_HEAD_X (SCOREBOARD_X+10) //Before RPG-X - This is for positioning of head icon: (SCOREBOARD_X+50) //Intermission text alignment #define SB_SCORELINE_X (SCOREBOARD_X + 76) #define SB_CHAR_WIDTH 8 #define SB_NAME_X (SB_SCORELINE_X + 12) #define SB_SCORE_X (SB_SCORELINE_X + 112) #define SB_KILLEDCNT_X (SB_SCORELINE_X + 155) #define SB_TIME_X (SB_SCORELINE_X + 212) #define SB_PING_X (SB_SCORELINE_X + 251) #define SB_WORSTENEMY_X (SB_SCORELINE_X + 294) #define SB_FAVEWEAPON_X (SB_SCORELINE_X + 398) #define SB_FAVETARGET_X (SB_SCORELINE_X + 182) //Scoreboard text alignment #define SB_SCORELINE_X_BIG ( SCOREBOARD_X /*+ 13*/ ) //Before RPG-X: - This is the first leading space in the score line (SCOREBOARD_X + 125) #define SB_RANK_X_BIG ( SB_SCORELINE_X_BIG + 6 ) //Before RPG-X: (SB_SCORELINE_X_BIG + 6) = 43 #define SB_RPGCLASS_X_BIG ( SB_RANK_X_BIG + 78 ) //70 = 121 #define SB_NAME_X_BIG ( SB_RPGCLASS_X_BIG + 46 ) //132 = 167 #define SB_LOC_X_BIG ( SB_NAME_X_BIG + 188 ) #define SB_SCORE_X_BIG ( SB_LOC_X_BIG + 148 ) //405 = 464 //335 //332 #define SB_TIME_X_BIG ( SB_SCORE_X_BIG + 44 ) // = 493 #define SB_PING_X_BIG ( SB_TIME_X_BIG + 35 ) //491 = 528 #define AWARD_Y 50 // height of awards medals on screen // The new and improved score board // // In cases where the number of clients is high, the score board heads are interleaved // here's the layout // // 0 32 80 112 144 240 320 400 <-- pixel position // bot head bot head score ping time name // // wins/losses are drawn on bot icon now static qboolean localClient; // true if local client has been displayed static void CG_ClipString(char *buffer,char *name,int pixelCnt,int font) { char str[2]; int length; str[1] = '\0'; length = 0; while (*name) { str[0] = *name; length += UI_ProportionalStringWidth(str,font ); if (font == UI_TINYFONT) { length += PROP_GAP_TINY_WIDTH; } else { length += PROP_GAP_WIDTH; } if (length > pixelCnt) { *buffer = '\0'; return; } else { *buffer = *name; } name++; buffer++; } *buffer = '\0'; } /* #define crewman 1 #define cadet1 2 #define cadet2 4 #define cadet3 8 #define cadet4 16 #define ensign 32 #define ltjg 64 #define lt 128 #define ltcmdr 256 #define cmdr 512 #define cpt 1024 #define cmmdr 2048 #define adm2 4096 #define adm3 8192 #define adm4 16384 #define adm5 32768 */ //Modified by TiM for the new rank system static void CG_DrawRank(int x, int y, pclass_t pClass, int score) { int classno; int score_log; rankMenuData_t* ScoreMenuData; //Q_log2 if ( ( score_log = score ) < 0 ) { //The log function takes the score and turns it into a useful score_log = 0; //array value: ie 1024 -> 10. :) Hoorah for logarithms! } classno = cgs.classData[pClass].iconColor-1; /*if ( !Q_stricmp( cgs.classData[pClass].iconColor, "r" ) ) { classno = CLR_RED; } else if ( !Q_stricmp( cgs.classData[pClass].iconColor, "y" ) ) { classno = CLR_GOLD; } else if ( !Q_stricmp( cgs.classData[pClass].iconColor, "t" ) ) { classno = CLR_TEAL; } else if ( !Q_stricmp( cgs.classData[pClass].iconColor, "g" ) ) { classno = CLR_GREEN; } else classno = -1;*/ //based on class, choose our right color. /*switch(pClass) { //Redshirt... heh heh case PC_COMMAND: case PC_ADMIN: classno = CLR_RED; break; //Yellowshirt case PC_SECURITY: case PC_ENGINEER: classno = CLR_GOLD; break; //Blueshirt case PC_MEDICAL: case PC_SCIENCE: classno = CLR_TEAL; break; //Marine case PC_ALPHAOMEGA22: classno = CLR_GREEN; break; //N/A case PC_NOCLASS: case PC_N00B: case PC_ALIEN: default: { classno = -1; //CG_DrawPic(x, y, 65, 14, cgs.media.ri_Civ ); //return; } } */ //CG_Printf( "%i\n", classno ); //if we have a valid class and/or color if ( classno >= 0 && cgs.ranksData[score_log].rankMenuData[classno].graphic ) { ScoreMenuData = &cgs.ranksData[score_log].rankMenuData[classno]; } else { //else use our default data ScoreMenuData = &cgs.defaultRankData.rankMenuData; } //Finally, render our rank using the carefully crafted trap_R_DrawStretchPic API function :) CG_DrawStretchPic( x, y, ScoreMenuData->w, ScoreMenuData->h, (float)ScoreMenuData->s1/(float)ScoreMenuData->gWidth, (float)ScoreMenuData->t1/(float)ScoreMenuData->gHeight, (float)ScoreMenuData->s2/(float)ScoreMenuData->gWidth, (float)ScoreMenuData->t2/(float)ScoreMenuData->gHeight, ScoreMenuData->graphic ); /*switch(score) { default: case crewman: CG_DrawPic(x, y, 65, 14, cgs.media.ri_Crewman[classno] ); break; case cadet1: CG_DrawPic(x, y, 65, 14, cgs.media.ri_Cadet1[classno] ); break; case cadet2: CG_DrawPic(x, y, 65, 14, cgs.media.ri_Cadet2[classno] ); break; case cadet3: CG_DrawPic(x, y, 65, 14, cgs.media.ri_Cadet3[classno] ); break; case cadet4: CG_DrawPic(x, y, 65, 14, cgs.media.ri_Cadet4[classno] ); break; case ensign: CG_DrawPic(x, y, 65, 14, cgs.media.ri_Ensign[classno]); break; case ltjg: CG_DrawPic(x, y, 65, 14, cgs.media.ri_Ltjg[classno]); break; case lt: CG_DrawPic(x, y, 65, 14, cgs.media.ri_Lt[classno]); break; case ltcmdr: CG_DrawPic(x, y, 65, 14, cgs.media.ri_Ltcmdr[classno]); break; case cmdr: CG_DrawPic(x, y, 65, 14, cgs.media.ri_Cmdr[classno]); break; case cpt: CG_DrawPic(x, y, 65, 14, cgs.media.ri_Capt[classno]); break; case cmmdr: CG_DrawPic(x, y, 65, 14, cgs.media.ri_Cmmdr[classno]); break; case adm2: CG_DrawPic(x, y, 65, 14, cgs.media.ri_Admr2[classno]); break; case adm3: CG_DrawPic(x, y, 65, 14, cgs.media.ri_Admr3[classno]); break; case adm4: CG_DrawPic(x, y, 65, 14, cgs.media.ri_Admr4[classno]); break; case adm5: CG_DrawPic(x, y, 65, 14, cgs.media.ri_Admr5[classno]); break; }*/ } static qboolean AW_Draw( void ); /* ======================= CG_DrawClientScoreboard_Big ======================= */ static void CG_DrawClientScore_Big( int y, score_t *score, float *color, float fade, qboolean largeFormat ) { char string[1024]; char string2[1024]; //RPG-X: Not Needed without a head //vec3_t headAngles; clientInfo_t *ci; int picSize; float hcolor[4]; char *rpg_class; vec4_t rpg_color; vec_t *ping_txtcolor = NULL; int intClamp; ci = &cgs.clientinfo[score->client]; // Black background /*if (cgs.gametype < GT_TEAM) { hcolor[0] = 0; hcolor[1] = 0; hcolor[2] = 0; hcolor[3] = fade * 0.7; if (cg.numScores > SB_MAXCLIENTS_BIG) { //CG_FillRect( SCOREBOARD_X, y,SB_TOPLINE_LENGTH , SB_NORMAL_HEIGHT+20, hcolor ); } else { //CG_FillRect( SCOREBOARD_X, y,SB_TOPLINE_LENGTH , SB_NORMAL_HEIGHT_BIG+200, hcolor ); } }*/ //RPG-X: RedTechie - Side Strips CG_FillRect( SCOREBOARD_X-15, SB_HEADER+20, 15, SB_RPG_X_FIXHEIGHT-4, colorTable[CT_DKBLUE1] ); //RPG-X: RedTechie - Left Strip CG_FillRect( SB_TOPLINE_LENGTH+53, SB_HEADER+20, 15, SB_RPG_X_FIXHEIGHT-4, colorTable[CT_DKBLUE1] ); //RPG-X: RedTechie - Right Strip picSize = (SB_NORMAL_HEIGHT_BIG * .75); // draw the handicap or bot skill marker (unless player has flag) //RPG-X: RedTechie - Dont need this in RPG /*if ( ci->powerups & ( 1 << PW_REDFLAG ) ) { CG_DrawFlagModel( SB_BOTICON_X, y, picSize, picSize, TEAM_RED ); } else if ( ci->powerups & ( 1 << PW_BORG_ADAPT ) ) { CG_DrawFlagModel( SB_BOTICON_X, y, picSize, picSize, TEAM_BLUE ); } else { if ( ci->pClass > PC_NOCLASS ) { qhandle_t icon; //Special hack: if it's Borg who has regen going, must be Borg queen if ( ci->pClass == PC_BORG && (ci->powerups&(1<pClass > PC_NOCLASS ) //{ //icon = cgs.media.pClassShaders[ci->pClass]; //RPG-X: RedTechie - New class output //VectorSet( rpg_color, 1.0, 1.0, 1.0 ); rpg_class = cgs.classData[ci->pClass].formalName; rpg_color[0] = (float)cgs.classData[ci->pClass].radarColor[0] / 255.0f; rpg_color[1] = (float)cgs.classData[ci->pClass].radarColor[1] / 255.0f; rpg_color[2] = (float)cgs.classData[ci->pClass].radarColor[2] / 255.0f; rpg_color[3] = 1.0f; /*switch(ci->pClass){ case PC_COMMAND: rpg_class = va("COMMAND"); //VectorSet( rpg_color, 0.604, 0, 0 ); rpg_color = colorTable[CT_RED]; break; case PC_SECURITY: rpg_class = va("SECURITY"); //VectorSet( rpg_color, 0.761, 0.537, 0.024 ); rpg_color = colorTable[CT_YELLOW]; break; case PC_MEDICAL: rpg_class = va("MEDICAL"); //VectorSet( rpg_color, 0.082, 0.337, 0.357 ); rpg_color = colorTable[CT_BLUE]; break; case PC_ADMIN: rpg_class = va("ADMIN"); rpg_color = colorTable[CT_LTORANGE]; //VectorCopy( colorTable[CT_LTORANGE], rpg_color ); break; case PC_N00B: rpg_class = va("N00b"); rpg_color = colorTable[CT_LTORANGE]; //VectorCopy( colorTable[CT_LTORANGE], rpg_color ); break; case PC_SCIENCE: rpg_class = va("SCIENCE"); rpg_color = colorTable[CT_BLUE]; //VectorSet( rpg_color, 0.082, 0.337, 0.357 ); break; case PC_ENGINEER: rpg_class = va("ENGINEER"); rpg_color = colorTable[CT_YELLOW]; //VectorSet( rpg_color, 0.761, 0.537, 0.024 ); break; case PC_ALIEN: rpg_class = va("ALIEN"); rpg_color = colorTable[CT_LTORANGE]; //VectorCopy( colorTable[CT_LTORANGE], rpg_color ); break; case PC_ALPHAOMEGA22: rpg_class = va("MARINE"); rpg_color = colorTable[CT_GREEN]; //VectorSet( rpg_color, 0.012, 0.443, 0.047 ); break; case PC_NOCLASS: rpg_class = va(""); rpg_color = colorTable[CT_WHITE]; //VectorCopy( colorTable[CT_WHITE], rpg_color ); break; }*/ //rpg_color[3] = 1.0f; //100% alpha //} //} //RPG-X: RedTechie - Dont need this in RPG /*else if ( ci->botSkill > 0 && ci->botSkill <= 5 ) { if ( cg_drawIcons.integer ) { CG_DrawPic( SB_BOTICON_X, y, picSize, picSize, cgs.media.botSkillShaders[ ci->botSkill - 1 ] ); } } else if ( ci->handicap < 100 ) { Com_sprintf( string, sizeof( string ), "%i", ci->handicap ); if ( cgs.gametype == GT_TOURNAMENT ) { // CG_DrawSmallStringColor( iconx, y - SMALLCHAR_HEIGHT/2, string, color ); UI_DrawProportionalString( SB_BOTICON_X, y - SMALLCHAR_HEIGHT/2, string, UI_SMALLFONT, color); } else { // CG_DrawSmallStringColor( iconx, y, string, color ); UI_DrawProportionalString( SB_BOTICON_X, y , string, UI_SMALLFONT, color); } } // draw the wins / losses if ( cgs.gametype == GT_TOURNAMENT ) { Com_sprintf( string, sizeof( string ), "%i/%i", ci->wins, ci->losses ); if( ci->handicap < 100 && !ci->botSkill ) { // CG_DrawSmallStringColor( iconx, y + SMALLCHAR_HEIGHT/2, string, color ); UI_DrawProportionalString( SB_BOTICON_X, y + SMALLCHAR_HEIGHT/2 , string, UI_SMALLFONT, color); } else { // CG_DrawSmallStringColor( iconx, y, string, color ); UI_DrawProportionalString( SB_BOTICON_X, y , string, UI_SMALLFONT, color); } } }*/ //RPG-X: No face needed in new scoreboard // draw the face //VectorClear( headAngles ); //headAngles[YAW] = 180; //CG_DrawHead( SB_HEAD_X, y, picSize, picSize, score->client, headAngles ); // highlight your position if ( score->client == cg.snap->ps.clientNum ) { int rank; localClient = qtrue; if ( cg.snap->ps.persistant[PERS_TEAM] == TEAM_SPECTATOR || cgs.gametype >= GT_TEAM ) { rank = -1; } else { rank = cg.snap->ps.persistant[PERS_RANK] & ~RANK_TIED_FLAG; } if ( rank == 0 ) { hcolor[0] = 0; hcolor[1] = 0; hcolor[2] = 0.7; } else if ( rank == 1 ) { hcolor[0] = 0.7; hcolor[1] = 0; hcolor[2] = 0; } else if ( rank == 2 ) { hcolor[0] = 0.7; hcolor[1] = 0.7; hcolor[2] = 0; } else { hcolor[0] = 0.7; hcolor[1] = 0.7; hcolor[2] = 0.7; } hcolor[3] = fade * 0.7; //RPG-X: RedTechie No highlighting player info in rpg /* CG_FillRect( SB_SCORELINE_X_BIG - SMALLCHAR_WIDTH, y, SB_TOPLINE_LENGTH - ((SB_SCORELINE_X_BIG - SMALLCHAR_WIDTH) - SCOREBOARD_X), BIGCHAR_HEIGHT+1, hcolor ); */ } // draw the score line //RPG-X: Redtechie - Ping color if(score->ping >= 501){ ping_txtcolor = colorTable[CT_RED]; }else if(score->ping >= 230){ ping_txtcolor = colorTable[CT_DKRED1]; }else if(score->ping >= 118){ ping_txtcolor = colorTable[CT_YELLOW]; }else if(score->ping <= 117){ ping_txtcolor = colorTable[CT_WHITE]; } //TiM : Re-structured slightly for lesser redundancy. //Player is connecting if ( score->ping == -1 ) { Com_sprintf(string,sizeof(string),"(%s)%s",ingame_text[IGT_CONNECTING],ci->name); UI_DrawProportionalString( SB_NAME_X_BIG, y , string, UI_TINYFONT, colorTable[CT_WHITE]); } else { int clipLength; //draw rank image CG_DrawRank( SB_RANK_X_BIG, y-2,ci->pClass, score->score); //draw player class name if(rpg_class){ UI_DrawProportionalString( SB_RPGCLASS_X_BIG, y , rpg_class, UI_TINYFONT | UI_LEFT, rpg_color); //CT_VLTPURPLE1 CT_WHITE } //if we have locations, change the cliplength of the name field if ( cgs.locations ) { clipLength = 185; } else { clipLength = 327; } //draw player name with varying instances //If spect, concat a spect msg next to it if ( ci->team == TEAM_SPECTATOR ) { Com_sprintf(string,sizeof(string),"(%s)%s",ingame_text[IGT_SPECTABBREV],ci->name); CG_ClipString(string2,string,clipLength,UI_TINYFONT); //RPG-X ADDED: RedTechie - 200 pixels in the name column use to be 184 UI_DrawProportionalString( SB_NAME_X_BIG, y , string2, UI_TINYFONT | UI_LEFT, colorTable[CT_WHITE]); } //if lagged out, add a lagged out msg else if ( score->ping >= 827 ) { Com_sprintf(string,sizeof(string),"(%s)%s",ingame_text[IGT_PINGEDOUT],ci->name); CG_ClipString(string2,string,clipLength,UI_TINYFONT); //RPG-X ADDED: RedTechie - 200 pixels in the name column use to be 184 UI_DrawProportionalString( SB_NAME_X_BIG, y , string2, UI_TINYFONT | UI_LEFT, colorTable[CT_WHITE]); } //else, draw the name normally else { CG_ClipString(string,ci->name,clipLength,UI_TINYFONT); //RPG-X ADDED: RedTechie - 200 pixels in the name column use to be 184 UI_DrawProportionalString( SB_NAME_X_BIG, y , string, UI_TINYFONT | UI_LEFT, colorTable[CT_WHITE]); } //Player locations if ( cgs.locations ) { CG_ClipString(string, va("%s", CG_ConfigString( CS_LOCATIONS + ci->location ) ), 495, UI_TINYFONT); //RPG-X ADDED: RedTechie - 200 pixels in the name column use to be 184 UI_DrawProportionalString( SB_LOC_X_BIG, y , string, UI_TINYFONT | UI_LEFT, colorTable[CT_WHITE]); } //player client Num //Com_sprintf(string,sizeof(string), "%i", intClamp); //RPG-X: J2J Switched Scoore to Client No. intClamp = Com_Clamp( 0, 128, cg_entities[score->client].currentState.clientNum ); UI_DrawProportionalString( SB_SCORE_X_BIG, y , va("%i", intClamp), UI_TINYFONT | UI_LEFT, colorTable[CT_WHITE]); //player time //If someone actually hits this limit, they officially have no life. //Com_sprintf(string,sizeof(string),"%i", intClamp); intClamp = Com_Clamp( 0, 99999, score->time ); UI_DrawProportionalString( SB_TIME_X_BIG, y , va("%i", intClamp), UI_TINYFONT | UI_LEFT, colorTable[CT_WHITE]); //player ping //Com_sprintf(string,sizeof(string),"%i",score->ping); intClamp = Com_Clamp( 0, 999, score->ping ); UI_DrawProportionalString( SB_PING_X_BIG, y, va("%i", intClamp), UI_TINYFONT | UI_LEFT, ping_txtcolor); } /*//RPG-X: RedTechie - Connecting if ( score->ping == -1 ) { Com_sprintf(string,sizeof(string),"(%s)%s",ingame_text[IGT_CONNECTING],ci->name); UI_DrawProportionalString( SB_NAME_X_BIG, y , string, UI_TINYFONT, colorTable[CT_WHITE]); } //J2J Book //RPG-X: RedTechie - Spectator else if ( ci->team == TEAM_SPECTATOR ) { Com_sprintf(string,sizeof(string),"(%s)%s",ingame_text[IGT_SPECTABBREV],ci->name); CG_NamePrep(string2,string,200,UI_TINYFONT); //RPG-X ADDED: RedTechie - 200 pixels in the name column use to be 184 UI_DrawProportionalString( SB_NAME_X_BIG, y , string2, UI_TINYFONT, colorTable[CT_WHITE]); if(rpg_class && rpg_color){ UI_DrawProportionalString( SB_RPGCLASS_X_BIG, y , rpg_class, UI_TINYFONT, rpg_color); //CT_VLTPURPLE1 CT_WHITE } Com_sprintf(string,sizeof(string),"%5i",cg_entities[score->client].currentState.clientNum); //RPG-X: J2J Switched Scoore to Client No. UI_DrawProportionalString( SB_SCORE_X_BIG, y , string, UI_TINYFONT, colorTable[CT_WHITE]); Com_sprintf(string,sizeof(string),"%5i",score->time); UI_DrawProportionalString( SB_TIME_X_BIG, y , string, UI_TINYFONT, colorTable[CT_WHITE]); Com_sprintf(string,sizeof(string),"%5i",score->ping); UI_DrawProportionalString( SB_PING_X_BIG, y, string, UI_TINYFONT, ping_txtcolor); CG_DrawRank(SB_RANK_X_BIG, y-2,ci->pClass, score->score); } //RPG-X: RedTechie - Pinged out else if ( score->ping >= 827 ) { Com_sprintf(string,sizeof(string),"(%s)%s",ingame_text[IGT_PINGEDOUT],ci->name); CG_NamePrep(string2,string,200,UI_TINYFONT); //RPG-X ADDED: RedTechie - 200 pixels in the name column use to be 184 UI_DrawProportionalString( SB_NAME_X_BIG, y , string2, UI_TINYFONT, colorTable[CT_WHITE]); if(rpg_class && rpg_color){ UI_DrawProportionalString( SB_RPGCLASS_X_BIG, y , rpg_class, UI_TINYFONT, rpg_color); //CT_VLTPURPLE1 CT_WHITE } Com_sprintf(string,sizeof(string),"%5i",cg_entities[score->client].currentState.clientNum); //RPG-X: J2J Switched Scoore to Client No. UI_DrawProportionalString( SB_SCORE_X_BIG, y , string, UI_TINYFONT, colorTable[CT_WHITE]); Com_sprintf(string,sizeof(string),"%5i",score->time); UI_DrawProportionalString( SB_TIME_X_BIG, y , string, UI_TINYFONT, colorTable[CT_WHITE]); Com_sprintf(string,sizeof(string),"%5i",score->ping); UI_DrawProportionalString( SB_PING_X_BIG, y, string, UI_TINYFONT, ping_txtcolor); CG_DrawRank(SB_RANK_X_BIG, y-2,ci->pClass, score->score); } //RPG-X: RedTechie - Regular else { //draw rank image CG_DrawRank( SB_RANK_X_BIG, y-2,ci->pClass, score->score); //draw player class name if(rpg_class && rpg_color){ UI_DrawProportionalString( SB_RPGCLASS_X_BIG, y , rpg_class, UI_TINYFONT, rpg_color); //CT_VLTPURPLE1 CT_WHITE } //prep name and then render it CG_NamePrep(string,ci->name,200,UI_TINYFONT); //RPG-X ADDED: RedTechie - 200 pixels in the name column use to be 184 UI_DrawProportionalString( SB_NAME_X_BIG, y , string, UI_TINYFONT, colorTable[CT_WHITE]); //player client Num Com_sprintf(string,sizeof(string),"%3i",cg_entities[score->client].currentState.clientNum); //RPG-X: J2J Switched Scoore to Client No. UI_DrawProportionalString( SB_SCORE_X_BIG, y , string, UI_TINYFONT, colorTable[CT_WHITE]); //player time Com_sprintf(string,sizeof(string),"%5i",score->time); UI_DrawProportionalString( SB_TIME_X_BIG, y , string, UI_TINYFONT, colorTable[CT_WHITE]); //player ping Com_sprintf(string,sizeof(string),"%3i",score->ping); UI_DrawProportionalString( SB_PING_X_BIG, y, string, UI_TINYFONT, ping_txtcolor); }*/ //RPG-X: RedTechie - Draw live divider after every client CG_FillRect( SB_NAME_X_BIG, y+11, SB_TOPLINE_LENGTH-119, 1, colorTable[CT_VDKBLUE2] ); // y off - 10, thickness - 2 //150 } /* ======================= CG_DrawClientScoreboard ======================= */ static void CG_DrawClientScore( int y, score_t *score, float *color, float fade, qboolean largeFormat ) { //char string[1024]; //char string2[1024]; //vec3_t headAngles; clientInfo_t *ci; //int picSize; //char /**worstEnemy,*/*faveWeapon=0; //float hcolor[4]; //gitem_t * item; int inIntermission/*,length*/; inIntermission = ( (cg.snap->ps.pm_type==PM_INTERMISSION) || (cg.intermissionStarted) || (cg.predictedPlayerState.pm_type==PM_INTERMISSION) ); if ( score->client < 0 || score->client >= cgs.maxclients ) { Com_Printf( "Bad score->client: %i\n", score->client ); return; } ci = &cgs.clientinfo[score->client]; if (!ci->infoValid) { Com_Printf( "Bad clientInfo: %i\n", score->client ); return; } /*trap_R_SetColor( colorTable[CT_DKBLUE1] ); CG_DrawPic( SCOREBOARD_X-15, y-28, 25, 28, cgs.media.scoreboardtopleft ); //RPG-X: - RedTechie Top Left CG_DrawPic( SB_TOPLINE_LENGTH+43, y-28, 25, 28, cgs.media.scoreboardtopright ); //RPG-X: - RedTechie Top Right CG_DrawPic( SCOREBOARD_X-15, y+325, 36, 28, cgs.media.scoreboardbotleft ); //RPG-X: - RedTechie Bottom Left CG_DrawPic( SB_TOPLINE_LENGTH+32, y+321, 36, 32, cgs.media.scoreboardbotright ); //RPG-X: - RedTechie Bottom Right */ //RPG-X: - RedTechie Fixed intermissions scoreboard if ( !inIntermission ) { //RPG-X BOOKMARK CG_DrawClientScore_Big(y, score, color, fade, largeFormat ); return; }else{ CG_DrawClientScore_Big(y, score, color, fade, largeFormat ); return; } //TiM : From the looks of this, nothing after this is acctually called O_o //Save graphics then // Black background /*if (cgs.gametype < GT_TEAM) { hcolor[0] = 0; hcolor[1] = 0; hcolor[2] = 0; hcolor[3] = fade * 0.7; CG_FillRect( SCOREBOARD_X, y,SB_TOPLINE_LENGTH , SB_NORMAL_HEIGHT, hcolor ); }*/ // Left Side of scoreboard //CG_FillRect( SCOREBOARD_X, y - 16 , 12, 48, colorTable[CT_DKORANGE]); /* picSize = 20; // draw the handicap or bot skill marker (unless player has flag) if ( ci->powerups & ( 1 << PW_REDFLAG ) ) { CG_DrawFlagModel( SB_BOTICON_X, y, picSize, picSize, TEAM_RED ); } else if ( ci->powerups & ( 1 << PW_BORG_ADAPT ) ) { CG_DrawFlagModel( SB_BOTICON_X, y, picSize, picSize, TEAM_BLUE ); } else { if ( ci->botSkill > 0 && ci->botSkill <= 5 ) { if ( cg_drawIcons.integer ) { CG_DrawPic( SB_BOTICON_X, y+2, picSize, picSize, cgs.media.botSkillShaders[ ci->botSkill - 1 ] ); } } else if ( ci->handicap < 100 ) { Com_sprintf( string, sizeof( string ), "%i", ci->handicap ); if ( cgs.gametype == GT_TOURNAMENT ) { // CG_DrawSmallStringColor( iconx, y - SMALLCHAR_HEIGHT/2, string, color ); UI_DrawProportionalString( SB_BOTICON_X+2, y - SMALLCHAR_HEIGHT/2, string, UI_SMALLFONT, color); } else { // CG_DrawSmallStringColor( iconx, y, string, color ); UI_DrawProportionalString( SB_BOTICON_X+2, y , string, UI_SMALLFONT, color); } } // draw the wins / losses if ( cgs.gametype == GT_TOURNAMENT ) { Com_sprintf( string, sizeof( string ), "%i/%i", ci->wins, ci->losses ); if( ci->handicap < 100 && !ci->botSkill ) { // CG_DrawSmallStringColor( iconx, y + SMALLCHAR_HEIGHT/2, string, color ); UI_DrawProportionalString( SB_BOTICON_X, y + SMALLCHAR_HEIGHT/2 , string, UI_SMALLFONT, color); } else { // CG_DrawSmallStringColor( iconx, y, string, color ); UI_DrawProportionalString( SB_BOTICON_X, y , string, UI_SMALLFONT, color); } } }*/ // draw the face /*VectorClear( headAngles ); headAngles[YAW] = 180; CG_DrawHead( SB_HEAD_X+14, y, picSize, picSize, score->client, headAngles );//Before RPG-X: CG_DrawHead( SB_HEAD_X+14, y, picSize, picSize, score->client, headAngles ); // highlight your position if ( score->client == cg.snap->ps.clientNum ) { int rank; localClient = qtrue; if ( cg.snap->ps.persistant[PERS_TEAM] == TEAM_SPECTATOR || cgs.gametype >= GT_TEAM ) { rank = -1; } else { rank = cg.snap->ps.persistant[PERS_RANK] & ~RANK_TIED_FLAG; } if ( rank == 0 ) { hcolor[0] = 0; hcolor[1] = 0; hcolor[2] = 0.7; } else if ( rank == 1 ) { hcolor[0] = 0.7; hcolor[1] = 0; hcolor[2] = 0; } else if ( rank == 2 ) { hcolor[0] = 0.7; hcolor[1] = 0.7; hcolor[2] = 0; } else { hcolor[0] = 0.7; hcolor[1] = 0.7; hcolor[2] = 0.7; } hcolor[3] = fade * 0.7; CG_FillRect( SB_SCORELINE_X - TINYCHAR_WIDTH, y, SB_TOPLINE_LENGTH - ((SB_SCORELINE_X - TINYCHAR_WIDTH) - SCOREBOARD_X), BIGCHAR_HEIGHT+1, hcolor ); } // draw the score line if ( score->ping == -1 ) { Com_sprintf(string, sizeof(string), " connecting %s", ci->name); UI_DrawProportionalString( SB_SCORELINE_X, y, string, UI_TINYFONT, colorTable[CT_LTGOLD1]); } else if ( ci->team == TEAM_SPECTATOR ) { CG_NamePrep(string,ci->name,100,UI_TINYFONT); //100 pixels in the name column Com_sprintf(string,sizeof(string),"%s (%s)", string, ingame_text[IGT_SPECTATOR]); UI_DrawProportionalString( SB_NAME_X, y + (TINYCHAR_HEIGHT/2), string, UI_TINYFONT, colorTable[CT_LTGOLD1]); // Don't show other stats for Spectators // Com_sprintf(string,sizeof(string),"%5i",score->score); // UI_DrawProportionalString( SB_SCORE_X, y + (TINYCHAR_HEIGHT/2), string, UI_TINYFONT, colorTable[CT_YELLOW]); // Com_sprintf(string,sizeof(string),"%5i",score->time); // UI_DrawProportionalString( SB_TIME_X, y + (TINYCHAR_HEIGHT/2), string, UI_TINYFONT, colorTable[CT_LTGOLD1]); // Com_sprintf(string,sizeof(string),"%5i",score->ping); // UI_DrawProportionalString( SB_PING_X, y + (TINYCHAR_HEIGHT/2), string, UI_TINYFONT, colorTable[CT_LTGOLD1]); // Com_sprintf(string,sizeof(string),"%5i",score->killedCnt); // UI_DrawProportionalString( SB_KILLEDCNT_X, y + (TINYCHAR_HEIGHT/2), string, UI_TINYFONT, colorTable[CT_RED]); } else {*/ /* if (score->faveTarget >= 0) { faveTarget = cgs.clientinfo[score->faveTarget].name; } else { faveTarget = ingame_text[IGT_NONE]; } */ /*if (score->worstEnemy >= 0) { worstEnemy = cgs.clientinfo[score->worstEnemy].name; } else { worstEnemy = ingame_text[IGT_NONE]; } if (score->faveWeapon > 0) { faveWeapon = ingame_text[IGT_NONE]; // Find weapon for ( item = bg_itemlist + 1 ; item->classname ; item++ ) { if ( item->giType != IT_WEAPON ) { continue; } if (item->giTag == score->faveWeapon) { faveWeapon = item->pickup_name; break; } } } // Com_sprintf(string, sizeof(string), // "%-20s %5i %5i %-20s (%5i) %-20s (%5i)",ci->name, score->score, score->time, // faveTarget, score->faveTargetKills, // worstEnemy, score->worstEnemyKills); CG_NamePrep(string,ci->name,100,UI_TINYFONT); //100 pixels in the name column //RPG-X: J2J (NOTE TO CODERS)- Heading for score board -DO NOT EDIT- Text for these are in mp_ingametext.dat Com_sprintf(string,sizeof(string),"%5i", score->client); UI_DrawProportionalString( SB_NAME_X-20, y + (TINYCHAR_HEIGHT/2), string, UI_TINYFONT, colorTable[CT_WHITE]); UI_DrawProportionalString( SB_NAME_X, y + (TINYCHAR_HEIGHT/2), string, UI_TINYFONT, colorTable[CT_WHITE]); Com_sprintf(string,sizeof(string),"%5i",score->score); UI_DrawProportionalString( SB_SCORE_X, y + (TINYCHAR_HEIGHT/2), string, UI_TINYFONT, colorTable[CT_YELLOW]); Com_sprintf(string,sizeof(string),"%5i",score->time); UI_DrawProportionalString( SB_TIME_X, y + (TINYCHAR_HEIGHT/2), string, UI_TINYFONT, colorTable[CT_LTGOLD1]); Com_sprintf(string,sizeof(string),"%5i",score->ping); UI_DrawProportionalString( SB_PING_X, y + (TINYCHAR_HEIGHT/2), string, UI_TINYFONT, colorTable[CT_LTGOLD1]); Com_sprintf(string,sizeof(string),"%5i",score->killedCnt); UI_DrawProportionalString( SB_KILLEDCNT_X, y + (TINYCHAR_HEIGHT/2), string, UI_TINYFONT, colorTable[CT_RED]); if (worstEnemy) { Com_sprintf(string2,sizeof(string2)," (%i)",score->worstEnemyKills); length = UI_ProportionalStringWidth(string2,UI_TINYFONT ); CG_NamePrep(string,worstEnemy,(100-length),UI_TINYFONT); //100 pixels in the worst enemy column Com_sprintf(string,sizeof(string),"%s%s",string, string2); UI_DrawProportionalString( SB_WORSTENEMY_X, y + (TINYCHAR_HEIGHT/2), string, UI_TINYFONT, colorTable[CT_RED]); } if (faveWeapon) { UI_DrawProportionalString( SB_FAVEWEAPON_X, y + (TINYCHAR_HEIGHT/2), faveWeapon, UI_TINYFONT, colorTable[CT_LTGOLD1]); } } //CG_DrawSmallString( SB_SCORELINE_X, y, string, fade ); // add the "ready" marker for intermission exiting, if not a bot, and if a team type game if ( inIntermission ) { qhandle_t h = trap_R_RegisterShader("icons/icon_ready_on"), h2 = trap_R_RegisterShader("icons/icon_ready_off"); if ( ci->botSkill > 0 && ci->botSkill <= 5 ) { // i'm a bot. i'm always ready. trap_R_SetColor( colorTable[CT_VLTGOLD1]); CG_DrawPic( SB_BOTICON_X+26,y+2, 16, 16,h); } else { if ( cg.snap->ps.stats[ STAT_CLIENTS_READY ] & ( 1 << score->client ) ) { //trap_R_SetColor( colorTable[CT_VLTGOLD1]); //CG_DrawPic( SB_BOTICON_X+26,y+2, 16, 16,h); } else// if (score->client) { //trap_R_SetColor( colorTable[CT_VLTGOLD1]); //CG_DrawPic( SB_BOTICON_X+26,y+2, 16, 16,h2); } } }*/ } /*static int CG_GetTeamCount(team_t team, int maxClients) { int i = 0; int count = 0; score_t *score = NULL; clientInfo_t *ci = NULL; for ( i = 0 ; i < cg.numScores && count < maxClients ; i++ ) { score = &cg.scores[i]; ci = &cgs.clientinfo[ score->client ]; if ( team!=ci->team || !ci->infoValid ) { continue; } count++; } return count; }*/ /* ================= CG_TeamScoreboard ================= */ static int CG_TeamScoreboard( int y, team_t team, float fade, int maxClients, int lineHeight ) { int i; score_t *score; float color[4]; int count; clientInfo_t *ci; color[0] = color[1] = color[2] = 1.0; color[3] = fade; count = 0; for ( i = 0 ; i < cg.numScores && count < maxClients ; i++ ) { score = &cg.scores[i]; ci = &cgs.clientinfo[ score->client ]; if ( team != ci->team ) { continue; } if (ci->infoValid) { //RPG-X BOOKMARK //UI_DrawProportionalString(60,y + lineHeight * count,va("%i",cg_entities[i].currentState.clientNum), UI_TINYFONT, colorTable[CT_LTGOLD1]); CG_DrawClientScore( y + lineHeight * count, score, color, fade, lineHeight == SB_NORMAL_HEIGHT ); count++; } } return count; } void CG_AddGameModNameToGameName( char *gamename ) { //Primary Mod if ( cgs.pModElimination ) { strcat( gamename, ": " ); strcat( gamename, ingame_text[IGT_GAME_ELIMINATION] ); } else if ( cgs.pModAssimilation ) { strcat( gamename, ": " ); strcat( gamename, ingame_text[IGT_GAME_ASSIMILATION] ); } else if ( cgs.pModActionHero ) { strcat( gamename, ": " ); strcat( gamename, ingame_text[IGT_GAME_ACTIONHERO] ); } //Secondary Mod if ( cgs.pModSpecialties ) { strcat( gamename, " (" ); strcat( gamename, ingame_text[IGT_GAME_SPECIALTIES] ); strcat( gamename, ")" ); } else if ( cgs.pModDisintegration ) { strcat( gamename, " (" ); strcat( gamename, ingame_text[IGT_GAME_DISINTEGRATION] ); strcat( gamename, ")" ); } } /* ================= CG_DrawScoreboard Draw the normal in-game scoreboard ================= */ qboolean CG_DrawScoreboard( void ) { int y, i, n1 = 0, n2 = 0; // n3 = 0; float fade; float *fadeColor; char *s; //RPG-X: RedTechie dont need buf with all the print team code commented out //char buf[64]; int maxClients; int lineHeight; int topBorderSize, bottomBorderSize; int rankOfClient; int tTeam/*, bTeam*/; float hcolor[4]; int inIntermission; char gamename[1024]; //int gOffset = 20; inIntermission = ( (cg.snap->ps.pm_type==PM_INTERMISSION) || (cg.intermissionStarted) || (cg.predictedPlayerState.pm_type==PM_INTERMISSION) ); // DO NOT SHOW THE SCOREBOARD IF: //////////////////////////////////////////////////////////////// // 1) Menu or Console is Up if ( cg_paused.integer ) { cg.deferredPlayerLoading = 0; return qfalse; } // // 2) Awards Ceremony is not finished during Intermisison if (inIntermission && !AW_Draw()) { return qfalse; } // // 3) If we are doing a warmup if (cg.warmup && !cg.showScores) return qfalse; //RPG-X: RedTechie - Hacked so scoreboard dosnt show when players die if(cg.predictedPlayerState.pm_type==PM_DEAD){ return qfalse; } tTeam = TEAM_RED; // Compiler needed initialization here for some reason... // FADE SETUP... ?? if ( cg.showScores || cg.predictedPlayerState.pm_type == PM_DEAD || inIntermission ) { fade = 1.0; fadeColor = colorWhite; } else { fadeColor = CG_FadeColor( cg.scoreFadeTime, FADE_TIME ); if ( !fadeColor ) { // next time scoreboard comes up, don't print killer cg.deferredPlayerLoading = 0; cg.killerName[0] = 0; return qfalse; } fade = *fadeColor; } // IN GAME SCOREBOARD HEADER STUFF //--------------------------------- rankOfClient = cg.snap->ps.persistant[PERS_RANK]; if ( !inIntermission && cg.snap->ps.persistant[PERS_TEAM]!=TEAM_SPECTATOR) { // Display Your Rank / Your Team //----------------------------------------------- //RPG-X: RedTechie Dont need this for rpg This code prints out what team your on and if your winning when you call the scoreboard just takes up to much room (i'll probly muck it all up but here it goes /*if (cgs.gametype<=GT_SINGLE_PLAYER) { if (rankOfClient & RANK_TIED_FLAG) Com_sprintf( buf, sizeof(buf), "%s %i", ingame_text[IGT_TIED_FOR], (rankOfClient&~RANK_TIED_FLAG)+1); else Com_sprintf( buf, sizeof(buf), "%s %i", ingame_text[IGT_YOUR_RANK], (rankOfClient&~RANK_TIED_FLAG)+1); UI_DrawProportionalString( 14, AWARD_Y, buf, UI_BIGFONT|UI_LEFT, colorTable[CT_LTGOLD1] ); } if (cgs.gametype>GT_SINGLE_PLAYER) { if ( cg.teamScores[0] == cg.teamScores[1] ) s = va("%s %i", ingame_text[IGT_TEAMSARETIED],cg.teamScores[0] ); else if ( cg.teamScores[0] >= cg.teamScores[1] ) s = va("%s %i %s %i",ingame_text[IGT_REDTEAMLEADS],cg.teamScores[0],ingame_text[IGT_TO], cg.teamScores[1] ); else s = va("%s %i %s %i",ingame_text[IGT_BLUETEAMLEADS],cg.teamScores[1],ingame_text[IGT_TO], cg.teamScores[0] ); UI_DrawProportionalString(14, AWARD_Y, s, UI_BIGFONT|UI_LEFT, colorTable[CT_LTGOLD1]); }*/ // Display Who Killed You //----------------------------------------------- if ( cg.killerName[0] ) { if ( cg.mod == MOD_ASSIMILATE ) { s = va("%s %s",ingame_text[IGT_ASSIMILATEDBY], cg.killerName ); } else { s = va("%s %s",ingame_text[IGT_FRAGGEDBY], cg.killerName ); } UI_DrawProportionalString((SCREEN_WIDTH/2), 438, s, UI_BIGFONT|UI_CENTER, colorTable[CT_CYAN]);//RPG-X: - RedTechie Y axis use to be 75 } } // scoreboard y = SB_HEADER; // Top of scoreboard //trap_R_SetColor( colorTable[CT_DKORANGE] ); // CG_DrawPic( SCOREBOARD_X, y + 27, 16, -32, cgs.media.corner_12_24 ); // Corner // CG_DrawPic( SCOREBOARD_X, y, 16, 32, cgs.media.corner_12_24 ); // Corner //RPG-X: Bookmark //CG_FillRect( SCOREBOARD_X, y, SB_TOPLINE_LENGTH, 24, colorTable[CT_DKORANGE]); // Black background //if (cgs.gametype < GT_TEAM) //{ hcolor[0] = 0; hcolor[1] = 0; hcolor[2] = 0; hcolor[3] = fade * 0.7; //CG_FillRect( SCOREBOARD_X, y + 20,SB_TOPLINE_LENGTH, 12, hcolor ); //RPG-X: RedTechie - Fixed black background height CG_FillRect( SCOREBOARD_X, y + 5,SB_TOPLINE_LENGTH + 26, SB_RPG_X_FIXHEIGHT+15, hcolor );//RPG-X: RedTechie - Before CG_FillRect( SCOREBOARD_X, y + 20,SB_TOPLINE_LENGTH, SB_RPG_X_FIXHEIGHT, hcolor ); //} trap_R_SetColor( colorTable[CT_DKBLUE1] ); CG_DrawPic( SCOREBOARD_X-15, SB_TOP-28, 25, 28, cgs.media.scoreboardtopleft ); //RPG-X: - RedTechie Top Left CG_DrawPic( SB_TOPLINE_LENGTH+43, SB_TOP-28, 25, 28, cgs.media.scoreboardtopright ); //RPG-X: - RedTechie Top Right CG_DrawPic( SCOREBOARD_X-15, SB_TOP+325, 36, 28, cgs.media.scoreboardbotleft ); //RPG-X: - RedTechie Bottom Left CG_DrawPic( SB_TOPLINE_LENGTH+32, SB_TOP+321, 36, 32, cgs.media.scoreboardbotright ); //RPG-X: - RedTechie Bottom Right /*#define SB_RANK_X_BIG ( SB_SCORELINE_X_BIG + 6 ) //Before RPG-X: (SB_SCORELINE_X_BIG + 6) = 43 #define SB_RPGCLASS_X_BIG ( SB_RANK_X_BIG + 78 ) //70 = 121 #define SB_NAME_X_BIG ( SB_RPGCLASS_X_BIG + 46 ) //132 = 167 #define SB_LOC_X_BIG ( SB_NAME_X_BIG + 187 ) #define SB_SCORE_X_BIG ( SB_LOC_X_BIG + 148 ) //405 = 464 //335 //332 #define SB_TIME_X_BIG ( SB_SCORE_X_BIG + 44 ) // = 493 #define SB_PING_X_BIG ( SB_TIME_X_BIG + 35 ) //491 = 528*/ CG_FillRect( SCOREBOARD_X, y+5, ( SB_RPGCLASS_X_BIG - 5 ) - SCOREBOARD_X, 15, colorTable[CT_DKBLUE1]); //RPG-X: Rank Bar //75 //79 CG_FillRect( SB_RPGCLASS_X_BIG - 3, y+5, ( SB_NAME_X_BIG - 5 ) - ( SB_RPGCLASS_X_BIG - 3 ), 15, colorTable[CT_DKBLUE1]); //RPG-X: Class Bar //46 - 60 if ( cgs.locations ) { CG_FillRect( SB_NAME_X_BIG - 3, y+5, ( SB_LOC_X_BIG - 5 ) - ( SB_NAME_X_BIG - 3 ), 15, colorTable[CT_DKBLUE1]); //RPG-X: Name Bar //269 CG_FillRect( SB_LOC_X_BIG - 3, y+5, ( SB_SCORE_X_BIG - 5 ) - ( SB_LOC_X_BIG - 3 ), 15, colorTable[CT_DKBLUE1]); //RPG-X: Locations Bar //269 } else { CG_FillRect( SB_NAME_X_BIG - 3, y+5, ( SB_SCORE_X_BIG - 5 ) - ( SB_NAME_X_BIG - 3 ), 15, colorTable[CT_DKBLUE1]); //RPG-X: Name Bar //269 } CG_FillRect( SB_SCORE_X_BIG - 3, y+5, ( SB_TIME_X_BIG - 5 ) - ( SB_SCORE_X_BIG - 3 ), 15, colorTable[CT_DKBLUE1]); //RPG-X: Client ID Bar //47 CG_FillRect( SB_TIME_X_BIG - 3, y+5, ( SB_PING_X_BIG - 5 ) - ( SB_TIME_X_BIG - 3 ), 15, colorTable[CT_DKBLUE1]); //RPG-X: Time Bar //34 CG_FillRect( SB_PING_X_BIG - 3, y+5, 602 - ( SB_PING_X_BIG - 3 ), 15, colorTable[CT_DKBLUE1]); //RPG-X: Ping Bar //35 //if ( inIntermission ) // { // UI_DrawProportionalString( SB_BOTICON_X+26, SB_HEADERTEXT, ingame_text[IGT_READY],UI_TINYFONT, colorTable[CT_BLACK] ); // UI_DrawProportionalString( SB_NAME_X, SB_HEADERTEXT, ingame_text[IGT_SB_NAME],UI_TINYFONT, colorTable[CT_BLACK] ); // UI_DrawProportionalString( SB_SCORE_X, SB_HEADERTEXT, ingame_text[IGT_SB_SCORE],UI_TINYFONT, colorTable[CT_BLACK] ); // UI_DrawProportionalString( SB_TIME_X, SB_HEADERTEXT, ingame_text[IGT_SB_TIME],UI_TINYFONT, colorTable[CT_BLACK] ); // UI_DrawProportionalString( SB_PING_X, SB_HEADERTEXT, ingame_text[IGT_SB_PING],UI_TINYFONT, colorTable[CT_BLACK] ); // UI_DrawProportionalString( SB_KILLEDCNT_X, SB_HEADERTEXT,ingame_text[IGT_TITLEELIMINATED],UI_TINYFONT, colorTable[CT_BLACK] ); // UI_DrawProportionalString( SB_WORSTENEMY_X, SB_HEADERTEXT,ingame_text[IGT_WORSTENEMY],UI_TINYFONT, colorTable[CT_BLACK] ); // UI_DrawProportionalString( SB_FAVEWEAPON_X, SB_HEADERTEXT,ingame_text[IGT_FAVORITEWEAPON],UI_TINYFONT, colorTable[CT_BLACK] ); //} //else //{ //RPG-X: RedTechie (Rank BookMark) UI_DrawProportionalString( SB_RANK_X_BIG, SB_HEADERTEXT, ingame_text[IGT_SB_RANK], UI_TINYFONT | UI_LEFT, colorTable[CT_BLACK] ); UI_DrawProportionalString( SB_RPGCLASS_X_BIG, SB_HEADERTEXT, ingame_text[IGT_SB_RPGCLASS],UI_TINYFONT | UI_LEFT, colorTable[CT_BLACK] ); UI_DrawProportionalString( SB_NAME_X_BIG, SB_HEADERTEXT, ingame_text[IGT_SB_NAME], UI_TINYFONT | UI_LEFT, colorTable[CT_BLACK] ); if ( cgs.locations ) { UI_DrawProportionalString( SB_LOC_X_BIG, SB_HEADERTEXT, ingame_text[IGT_SB_LOC], UI_TINYFONT | UI_LEFT, colorTable[CT_BLACK] ); } UI_DrawProportionalString( SB_SCORE_X_BIG, SB_HEADERTEXT, ingame_text[IGT_SB_SCORE], UI_TINYFONT | UI_LEFT, colorTable[CT_BLACK] ); UI_DrawProportionalString( SB_TIME_X_BIG, SB_HEADERTEXT, ingame_text[IGT_SB_TIME], UI_TINYFONT | UI_LEFT, colorTable[CT_BLACK] ); UI_DrawProportionalString( SB_PING_X_BIG, SB_HEADERTEXT, ingame_text[IGT_SB_PING], UI_TINYFONT | UI_LEFT, colorTable[CT_BLACK] ); //} //trap_R_SetColor( colorTable[CT_DKORANGE] ); //CG_DrawPic( 605, y, 16, 32, cgs.media.scoreboardEndcap ); /*trap_R_SetColor( colorTable[CT_DKBLUE1] ); CG_DrawPic( SCOREBOARD_X-15, y-28, 25, 28, cgs.media.scoreboardtopleft ); //RPG-X: - RedTechie Top Left CG_DrawPic( SB_TOPLINE_LENGTH+43, y-28, 25, 28, cgs.media.scoreboardtopright ); //RPG-X: - RedTechie Top Right CG_DrawPic( SCOREBOARD_X-15, y+325, 36, 28, cgs.media.scoreboardbotleft ); //RPG-X: - RedTechie Bottom Left CG_DrawPic( SB_TOPLINE_LENGTH+32, y+321, 36, 32, cgs.media.scoreboardbotright ); //RPG-X: - RedTechie Bottom Right */ y = SB_TOP; // SET UP SIZES //-------------- if ( (inIntermission) || (cg.numScores>SB_MAXCLIENTS_BIG) ) {// POSTGAME maxClients = SB_MAXCLIENTS_NORMAL; lineHeight = SB_NORMAL_HEIGHT; topBorderSize = 16; bottomBorderSize = 16; } else {// INGAME maxClients = SB_MAXCLIENTS_BIG; lineHeight = SB_NORMAL_HEIGHT_BIG; topBorderSize = 16; bottomBorderSize = 16; } localClient = qfalse; //TiM /*if ( cgs.gametype >= GT_TEAM ) { y-=6; // TEAM PLAY //---------- if ( cg.teamScores[0] >= cg.teamScores[1] ) { tTeam = TEAM_RED; bTeam = TEAM_BLUE; } else { tTeam = TEAM_BLUE; bTeam = TEAM_RED; } // TOP TEAM n1 = CG_GetTeamCount(tTeam, maxClients); CG_DrawTeamBackground( SCOREBOARD_X+15, y, SB_TOPLINE_LENGTH - 14, n1*lineHeight, 0.33, tTeam, qtrue ); CG_TeamScoreboard( y, tTeam, fade, maxClients, lineHeight ); if(tTeam==TEAM_BLUE) CG_FillRect( SCOREBOARD_X+12, y, 2, (n1*lineHeight), colorTable[CT_BLUE]); else CG_FillRect( SCOREBOARD_X+12, y, 2, (n1*lineHeight), colorTable[CT_RED]); y += (n1*lineHeight); maxClients -= n1; // BOTTOM TEAM n2 = CG_GetTeamCount(bTeam, maxClients); CG_DrawTeamBackground( SCOREBOARD_X+15, y, SB_TOPLINE_LENGTH - 14, n2*lineHeight, 0.33, bTeam, qtrue ); CG_TeamScoreboard( y, bTeam, fade, maxClients, lineHeight ); if(bTeam==TEAM_BLUE) CG_FillRect( SCOREBOARD_X+12, y, 2, (n2*lineHeight), colorTable[CT_BLUE]); else CG_FillRect( SCOREBOARD_X+12, y, 2, (n2*lineHeight), colorTable[CT_RED]); y += (n2*lineHeight); maxClients -= n2; // SPECTATOR TEAM n3 = CG_TeamScoreboard( y, TEAM_SPECTATOR, fade, maxClients, lineHeight ); y += (n3 * lineHeight); maxClients -= n3; } else {*/ // FREE FOR ALL //------------- n1 = CG_TeamScoreboard( y, TEAM_FREE, fade, maxClients, lineHeight ); y += (n1 * lineHeight); maxClients -= n1; n2 = CG_TeamScoreboard( y, TEAM_SPECTATOR, fade, maxClients, lineHeight ); y += (n2 * lineHeight); maxClients -= n2; //} //LOCAL CLIENT AT BOTTOM OF SCOREBOARD //------------------------------------ // // If we didn't draw the local client in the scoreboard (because ranked lower than maxClients) // Look for him and display him at the bottom // // BUT not for 'GT_SINGLE_PLAYER' (shouldn't happen anyway, right?) // if (cgs.gametype==GT_SINGLE_PLAYER) localClient = qtrue; i=0; while (!localClient && ips.clientNum ) // it's me!! { CG_DrawClientScore( y, &cg.scores[i], colorYellow, 0.0, lineHeight==SB_NORMAL_HEIGHT ); y += lineHeight; localClient = qtrue; } i++; } // Bottom of scoreboard //trap_R_SetColor( colorTable[CT_DKORANGE] ); //CG_DrawPic( 13, y-3, 16, 32, cgs.media.corner_12_24 ); // Corner //RPG-X BookMark Bottum bar CG_FillRect( SCOREBOARD_X, SB_RPG_X_FIXHEIGHT+60, SB_TOPLINE_LENGTH, 15, colorTable[CT_DKBLUE1]); //trap_R_SetColor( colorTable[CT_DKORANGE] ); //CG_DrawPic( 605, y, 16, 32, cgs.media.scoreboardEndcap ); //RPG-X: - RedTechie no PRESS FIRE TO CONTINUE! /*if ( inIntermission ) { if ( cgs.gametype != GT_SINGLE_PLAYER) { static int flashTime = 0; static int flashColor = CT_RED; if ( cg.time - flashTime >= 500 ) { flashTime = cg.time; if ( flashColor == CT_RED ) { flashColor = CT_BLACK; } else { flashColor = CT_RED; } } UI_DrawProportionalString( SB_TOPLINE_LENGTH, y+10+BIGCHAR_HEIGHT, ingame_text[IGT_CLICK_PLAY_AGAIN], UI_RIGHT, colorTable[flashColor] ); } }*/ //if (cgs.gametype < GT_TEAM) s = va("%s: %i", ingame_text[IGT_PLAYERS], cg.numScores); // Number of Players //} //RPG-X: - RedTechie Dont need extra crap //TiM: Yeah.... crap suxx. ;P /*else { n1=n2=n3=0; for (i=0; i 10) ) CG_LoadDeferredPlayers(); return qtrue; } //================================================================================ /* ================ CG_CenterGiantLine ================ */ static void CG_CenterGiantLine( float y, const char *string ) { float x; vec4_t color; color[0] = 1; color[1] = 1; color[2] = 1; color[3] = 1; // x = 0.5 * ( 640 - GIANT_WIDTH * CG_DrawStrlen( string ) ); // CG_DrawStringExt( x, y, string, color, qtrue, qtrue, GIANT_WIDTH, GIANT_HEIGHT, 0 ); x = 0.5 * ( 640 - UI_ProportionalStringWidth(string,UI_BIGFONT) ); UI_DrawProportionalString( x, y, string, UI_BIGFONT|UI_DROPSHADOW, color); } /* ================= CG_DrawTourneyScoreboard Draw the oversize scoreboard for tournements ================= */ void CG_DrawTourneyScoreboard( void ) { const char *s; vec4_t color; int min, tens, ones; clientInfo_t *ci; int y; int i,w; // request more scores regularly if ( cg.scoresRequestTime + 2000 < cg.time ) { cg.scoresRequestTime = cg.time; trap_SendClientCommand( "score" ); } color[0] = 1; color[1] = 1; color[2] = 1; color[3] = 1; // draw the dialog background color[0] = color[1] = color[2] = 0; color[3] = 1; CG_FillRect( 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, color ); // print the mesage of the day s = CG_ConfigString( CS_MOTD ); if ( !s[0] ) { s = "Scoreboard"; } // print optional title CG_CenterGiantLine( 8, s ); // print server time ones = cg.time / 1000; min = ones / 60; ones %= 60; tens = ones / 10; ones %= 10; s = va("%i:%i%i", min, tens, ones ); CG_CenterGiantLine( 64, s ); // print the two scores y = 160; if ( cgs.gametype >= GT_TEAM ) { // // teamplay scoreboard // // CG_DrawStringExt( 8, y, ingame_text[IGT_REDTEAM], color, qtrue, qtrue, GIANT_WIDTH, GIANT_HEIGHT, 0 ); UI_DrawProportionalString( 8, y, ingame_text[IGT_REDTEAM], UI_BIGFONT|UI_DROPSHADOW, color); s = va("%i", cg.teamScores[0] ); // CG_DrawStringExt( 632 - GIANT_WIDTH * strlen(s), y, s, color, qtrue, qtrue, GIANT_WIDTH, GIANT_HEIGHT, 0 ); w = UI_ProportionalStringWidth(s,UI_BIGFONT); UI_DrawProportionalString(632 - w, y, s, UI_BIGFONT|UI_DROPSHADOW, color); y += 64; // CG_DrawStringExt( 8, y, ingame_text[IGT_BLUETEAM], color, qtrue, qtrue, GIANT_WIDTH, GIANT_HEIGHT, 0 ); UI_DrawProportionalString(8, y, ingame_text[IGT_BLUETEAM], UI_BIGFONT|UI_DROPSHADOW, color); s = va("%i", cg.teamScores[1] ); // CG_DrawStringExt( 632 - GIANT_WIDTH * strlen(s), y, s, color, qtrue, qtrue, GIANT_WIDTH, GIANT_HEIGHT, 0 ); w = UI_ProportionalStringWidth(s,UI_BIGFONT); UI_DrawProportionalString(632 - w, y, s, UI_BIGFONT|UI_DROPSHADOW, color); } else { // // free for all scoreboard // for ( i = 0 ; i < MAX_CLIENTS ; i++ ) { ci = &cgs.clientinfo[i]; if ( !ci->infoValid ) { continue; } if ( ci->team != TEAM_FREE ) { continue; } // CG_DrawStringExt( 8, y, ci->name, color, qtrue, qtrue, GIANT_WIDTH, GIANT_HEIGHT, 0 ); UI_DrawProportionalString( 8, y, ci->name, UI_BIGFONT|UI_DROPSHADOW, color); s = va("%i", ci->score ); // CG_DrawStringExt( 632 - GIANT_WIDTH * strlen(s), y, s, color, qtrue, qtrue, GIANT_WIDTH, GIANT_HEIGHT, 0 ); w = UI_ProportionalStringWidth(s,UI_BIGFONT); UI_DrawProportionalString(632 - w, y, s, UI_BIGFONT|UI_DROPSHADOW, color); y += 64; } } } /* ============================================================================= AWARDS PRESENTATION The following code was ripped from ui_sppostgame.c and has been modified to show the awards presentation for all game types FROM ????Server???? AW_SPPostgameMenu_f() -Parse award information and store in struct FROM DrawScoreboard() AW_Draw() -PHASE I Play Sounds -PHASE II AW_DrawAwardsPresentation(timer) AW_DrawAwards(max) -PHASE III AW_DrawAwards(ALL) -PHASE IV Draw the New Scoreboard ============================================================================= */ #define AWARD_PRESENTATION_TIME 2000 // time each medal is shown typedef struct { int phase; int ignoreKeysTime; int starttime; int scoreboardtime; int serverId; int playerGameRank; qboolean playersTeamWon; int playerTied; char placeNames[3][64]; char winTeamText[64]; char losTeamText[64]; char winTeamMVPText[64]; char nameOfMVP[64]; int scoreOfMVP; int totalCaptures; int totalPoints; int losCaptures; int losPoints; int secondPlaceTied; int level; int numClients; int won; int numAwards; int awardsEarned[9]; int awardsLevels[9]; qboolean playedSound[9]; int lastTier; sfxHandle_t winnerSound; int winnerDelay; sfxHandle_t youPlacedSound; sfxHandle_t commendationsSound; vec3_t intermission_origin; vec3_t intermission_angle; } postgameMenuInfo_t; static postgameMenuInfo_t postgameMenuInfo; static qboolean postGameMenuStructInited = qfalse; void InitPostGameMenuStruct() { if (qfalse == postGameMenuStructInited) { memset( &postgameMenuInfo, 0, sizeof(postgameMenuInfo) ); postGameMenuStructInited = qtrue; } } /* char *cg_medalNames[AWARD_MAX] = { "Efficiency", // AWARD_EFFICIENCY, Accuracy "Sharpshooter", // AWARD_SHARPSHOOTER, Most compression rifle frags "Untouchable", // AWARD_UNTOUCHABLE, Perfect (no deaths) "Logistics", // AWARD_LOGISTICS, Most pickups "Tactician", // AWARD_TACTICIAN, Kills with all weapons "Demolitionist", // AWARD_DEMOLITIONIST, Most explosive damage kills "Streak", // AWARD_STREAK, Ace/Expert/Master/Champion "Role", // AWARD_TEAM, MVP/Defender/Warrior/Carrier/Interceptor/Bravery "Section 31" // AWARD_SECTION31 All-around god }; */ int cg_medalNames[AWARD_MAX] = { IGT_EFFICIENCY, // AWARD_EFFICIENCY, Accuracy IGT_SHARPSHOOTER, // AWARD_SHARPSHOOTER, Most compression rifle frags IGT_UNTOUCHABLE, // AWARD_UNTOUCHABLE, Perfect (no deaths) IGT_LOGISTICS, // AWARD_LOGISTICS, Most pickups IGT_TACTICIAN, // AWARD_TACTICIAN, Kills with all weapons IGT_DEMOLITIONIST, // AWARD_DEMOLITIONIST, Most explosive damage kills IGT_ROLE, // AWARD_STREAK, Ace/Expert/Master/Champion IGT_STREAK, // AWARD_TEAM, MVP/Defender/Warrior/Carrier/Interceptor/Bravery IGT_SECTION31 // AWARD_SECTION31 All-around god }; char *cg_medalPicNames[AWARD_MAX] = { "menu/medals/medal_efficiency", // AWARD_EFFICIENCY, "menu/medals/medal_sharpshooter", // AWARD_SHARPSHOOTER, "menu/medals/medal_untouchable", // AWARD_UNTOUCHABLE, "menu/medals/medal_logistics", // AWARD_LOGISTICS, "menu/medals/medal_tactician", // AWARD_TACTICIAN, "menu/medals/medal_demolitionist", // AWARD_DEMOLITIONIST, "menu/medals/medal_ace", // AWARD_STREAK, "menu/medals/medal_teammvp", // AWARD_TEAM, "menu/medals/medal_section31" // AWARD_SECTION31 }; char *cg_medalSounds[AWARD_MAX] = { "sound/voice/computer/misc/effic.wav", // AWARD_EFFICIENCY, "sound/voice/computer/misc/sharp.wav", // AWARD_SHARPSHOOTER, "sound/voice/computer/misc/untouch.wav", // AWARD_UNTOUCHABLE, "sound/voice/computer/misc/log.wav", // AWARD_LOGISTICS, "sound/voice/computer/misc/tact.wav", // AWARD_TACTICIAN, "sound/voice/computer/misc/demo.wav", // AWARD_DEMOLITIONIST, "sound/voice/computer/misc/ace.wav", // AWARD_STREAK, "",/*shouldn't use. use cg_medalTeamSounds instead*/ // AWARD_TEAM, "sound/voice/computer/misc/sec31.wav" // AWARD_SECTION31 }; char *cg_medalTeamPicNames[TEAM_MAX] = { "", // TEAM_NONE "menu/medals/medal_teammvp", // TEAM_MVP, "menu/medals/medal_teamdefender", // TEAM_DEFENDER, "menu/medals/medal_teamwarrior", // TEAM_WARRIOR, "menu/medals/medal_teamcarrier", // TEAM_CARRIER, "menu/medals/medal_teaminterceptor",// TEAM_INTERCEPTOR, "menu/medals/medal_teambravery" // TEAM_BRAVERY, }; char *cg_medalTeamSounds[TEAM_MAX] = { "", // TEAM_NONE "sound/voice/computer/misc/mvp.wav", // TEAM_MVP, "sound/voice/computer/misc/defender.wav", // TEAM_DEFENDER, "sound/voice/computer/misc/warrior.wav", // TEAM_WARRIOR, "sound/voice/computer/misc/carrier.wav", // TEAM_CARRIER, "sound/voice/computer/misc/intercept.wav", // TEAM_INTERCEPTOR, "sound/voice/computer/misc/bravery.wav" // TEAM_BRAVERY, }; char *cg_medalStreakPicNames[AWARD_STREAK_MAX] = { "", // AWARD_NONE "menu/medals/medal_ace", // AWARD_STREAK_ACE, "menu/medals/medal_expert", // AWARD_STREAK_EXPERT, "menu/medals/medal_master", // AWARD_STREAK_MASTER, "menu/medals/medal_champion" // AWARD_STREAK_CHAMPION, }; char *cg_medalStreakSounds[AWARD_STREAK_MAX] = { "", // AWARD_NONE "sound/voice/computer/misc/ace.wav", // AWARD_STREAK_ACE, "sound/voice/computer/misc/expert.wav", // AWARD_STREAK_EXPERT, "sound/voice/computer/misc/master.wav", // AWARD_STREAK_MASTER, "sound/voice/computer/misc/champion.wav" // AWARD_STREAK_CHAMPION, }; /* char *cg_medalStreakNames[AWARD_STREAK_MAX] = { "", // AWARD_NONE "Ace", // AWARD_STREAK_ACE, "Expert", // AWARD_STREAK_EXPERT, "Master", // AWARD_STREAK_MASTER, "Champion" // AWARD_STREAK_CHAMPION, }; */ int cg_medalStreakNames[AWARD_STREAK_MAX] = { IGT_NONE, // AWARD_NONE IGT_ACE, // AWARD_STREAK_ACE, IGT_EXPERT, // AWARD_STREAK_EXPERT, IGT_MASTER, // AWARD_STREAK_MASTER, IGT_CHAMPION // AWARD_STREAK_CHAMPION, }; int cg_medalTeamNames[TEAM_MAX] = { IGT_NONE, // AWARD_NONE IGT_MVP, // TEAM_MVP, IGT_DEFENDER, // TEAM_DEFENDER, IGT_WARRIOR, // TEAM_WARRIOR, IGT_CARRIER, // TEAM_CARRIER, IGT_INTERCEPTOR, // TEAM_INTERCEPTOR IGT_BRAVERY // TEAM_BRAVERY }; // spaced by 70 pixels apart //static int medalLocations[6] = {570, 500, 430, 360, 290}; /*static void AW_DrawMedal( int medal, int amount, int x, int y ) { char buf[20]; qhandle_t hShader; vec4_t yellow; // RED GREEN BLUE ALPHA //----------------------------------------------------------------------- yellow[0]=1.0f; yellow[1]=1.0f; yellow[2]=0.5f; yellow[3]=1.0f; if (medal == AWARD_STREAK) { hShader = trap_R_RegisterShaderNoMip( cg_medalStreakPicNames[amount/5] ); } else if (medal == AWARD_TEAM) { hShader = trap_R_RegisterShaderNoMip( cg_medalTeamPicNames[amount] ); } else { hShader = trap_R_RegisterShaderNoMip( cg_medalPicNames[medal] ); } CG_DrawPic( x, y, 48, 48, hShader); if (postgameMenuInfo.phase<4) { //--------------------------------------------------------------- NAME OF THE AWARD Com_sprintf( buf, sizeof(buf), "%s", ingame_text[cg_medalNames[medal]]); if (medal== AWARD_STREAK) Com_sprintf( buf, sizeof(buf), "%s", ingame_text[cg_medalStreakNames[amount/5]]); if (medal== AWARD_TEAM) Com_sprintf( buf, sizeof(buf), "%s", ingame_text[cg_medalTeamNames[amount]]); // Q_CleanStr( buf ); UI_DrawProportionalString( x+24, y+50, buf, UI_TINYFONT|UI_CENTER, yellow ); //--------------------------------------------------------------- NAME OF THE AWARD } }*/ //======================== // DrawTheMedals(int max) // // This function cycles from 0 to max and calls some functions to Draw the Picture and // the text below for efficency. // //======================== //RPG-X: RedTechie - No awards /*static int presentedTeamAward[TEAM_MAX]; static void AW_DrawTheMedals( int max ) { int n, i; int medal; int amount; int x, y; int extraAwardOffset = 0; for( n = 0; n < max; n++ ) { x = medalLocations[n] - extraAwardOffset; y = AWARD_Y; medal = postgameMenuInfo.awardsEarned[n]; amount = postgameMenuInfo.awardsLevels[n]; if (medal == AWARD_TEAM) {//amount is going to be a bitflag field... for( i = TEAM_MVP; i < TEAM_MAX; i++ ) { if ( amount & (1<= postgameMenuInfo.numAwards ) { awardNum = (postgameMenuInfo.numAwards-1); } medal = postgameMenuInfo.awardsEarned[awardNum]; amount = postgameMenuInfo.awardsLevels[awardNum]; if ( medal == AWARD_TEAM ) {//amount is going to be a bitflag field... if ( !allTeamAwardsAnnounced ) { for( i = TEAM_MVP; i < TEAM_MAX; i++ ) { if ( amount & (1< cg.time ) {//already announced this award AW_PresentMedal( AWARD_TEAM, i, timer, awardNum ); } teamAward++; } } } } else { AW_PresentMedal( medal, amount, timer, awardNum ); } AW_DrawTheMedals( awardNum + 1 ); // Draw the awards if ( !awardNextDebounceTime ) { awardNextDebounceTime = cg.time + AWARD_PRESENTATION_TIME; } else if ( awardNextDebounceTime <= cg.time ) { awardNextDebounceTime = cg.time + AWARD_PRESENTATION_TIME; if ( i == TEAM_MAX ) { //finished loop? Then we announced all these allTeamAwardsAnnounced = qtrue; } if ( !extraAwardTime || allTeamAwardsAnnounced ) { awardNum++; } else { nextTeamAward++; } } } */ /* ================= AW_Draw ================= */ static qboolean AW_Draw( void ) { char buf[64]; int timer; int y=0, yfrom=0; int len; vec4_t white, red, blue, yellow, blueA; // new colors // RED GREEN BLUE ALPHA //----------------------------------------------------------------------- white[0] = white[1] = white[2] = 1.0f; white[3] = 1.0f; red[0] = 1.0f; red[1] = 0.5f; red[2] = 0.5f; red[3] = 1.0f; blue[0] = 0.5f; blue[1] = 0.5f; blue[2] = 1.0f; blue[3] = 1.0f; yellow[0]= 1.0f; yellow[1]= 1.0f; yellow[2]= 0.5f; yellow[3]= 1.0f; blueA[0] = 0.367f; blueA[1] = 0.261f;blueA[2] = 0.722f; blueA[3] = 0.5f; // REASONS NOT TO SHOW THE AWARDS CEREMONY: //-------------------------------------------- // if scoreboardtime is not set, we set it to current time plus five seconds slop time if (postgameMenuInfo.scoreboardtime == 0) { postgameMenuInfo.scoreboardtime = cg.time+5000; return qfalse; } // if scoreboardtime is greater than current time, we don't draw anything (including no scoreboard) // This should only happen if the scoreboard time had not been set properly to current time by // the setup function below if (postgameMenuInfo.scoreboardtime > cg.time+10) return qfalse; // OK, so we've given the slop time and a chance for the information to be set properly in // case of network lag. if .starttime is still not set properly, we have no right to show // anything in the awards ceremony and go straight to the spiffy scoreboard... if (postgameMenuInfo.starttime==0) return qtrue; //RPG-X: RedTechie Dont need this aswell this also prints out what team your on and if your winning just takes up to much room // ALL PHASES // Display Your Rank / Your Team Wins //----------------------------------------------- /*if (cg.snap->ps.persistant[PERS_TEAM]!=TEAM_SPECTATOR) { if (cgs.gametype <= GT_SINGLE_PLAYER ) { if (postgameMenuInfo.playerTied) Com_sprintf( buf, sizeof(buf), "%s %i", ingame_text[IGT_TIED_FOR], postgameMenuInfo.playerTied); else Com_sprintf( buf, sizeof(buf), "%s %i", ingame_text[IGT_YOUR_RANK], postgameMenuInfo.playerGameRank+1); UI_DrawProportionalString( 14, AWARD_Y, buf, UI_BIGFONT|UI_LEFT, white ); } else { char *teamName = NULL; switch ( cg.snap->ps.persistant[PERS_TEAM] ) { case TEAM_RED: teamName = (char *)CG_ConfigString( CS_RED_GROUP ); break; case TEAM_BLUE: teamName = (char *)CG_ConfigString( CS_BLUE_GROUP ); break; } if ( teamName == NULL || teamName[0] == 0 ) { teamName = ingame_text[IGT_YOUR_TEAM]; } if (postgameMenuInfo.playersTeamWon) Com_sprintf( buf, sizeof(buf), "%s %s", teamName, ingame_text[IGT_WON]); else Com_sprintf( buf, sizeof(buf), "%s %s", teamName, ingame_text[IGT_LOST]); if (postgameMenuInfo.playerGameRank == 2) Com_sprintf( buf, sizeof(buf), "%s", ingame_text[IGT_TEAMS_TIED]); UI_DrawProportionalString( 14, AWARD_Y, buf, UI_BIGFONT|UI_LEFT, white ); } }*/ // PHASES I & II & III // Draw Character / Team names by podiums //----------------------------------------------- if (postgameMenuInfo.phase < 4) { if (cgs.gametype <= GT_SINGLE_PLAYER ) { // NON TEAM GAMES // We want the top three player's names and their ranks below the podium if ( postgameMenuInfo.numClients > 2 ) { UI_DrawProportionalString( 510, 480 - 64 - PROP_HEIGHT, postgameMenuInfo.placeNames[2], UI_CENTER, white ); if (postgameMenuInfo.secondPlaceTied) UI_DrawProportionalString( 510, 480 - 38 - PROP_HEIGHT, ingame_text[IGT_2ND], UI_CENTER, yellow ); else UI_DrawProportionalString( 510, 480 - 38 - PROP_HEIGHT, ingame_text[IGT_3RD], UI_CENTER, yellow ); } if ( postgameMenuInfo.numClients > 1) { UI_DrawProportionalString( 130, 480 - 64 - PROP_HEIGHT, postgameMenuInfo.placeNames[1], UI_CENTER, white ); UI_DrawProportionalString( 130, 480 - 38 - PROP_HEIGHT, ingame_text[IGT_2ND], UI_CENTER, yellow ); } UI_DrawProportionalString( 320, 480 - 64 - 2 * PROP_HEIGHT, postgameMenuInfo.placeNames[0], UI_CENTER, white ); UI_DrawProportionalString( 320, 480 - 38 - 2 * PROP_HEIGHT, ingame_text[IGT_1ST], UI_CENTER, yellow ); } else //if (cg.snap->ps.persistant[PERS_TEAM]!=TEAM_SPECTATOR) { // TEAM // We want the winning team character's name, a line explaining "Klingon MVP" UI_DrawProportionalString( 320, 480 - 64 - 2 * PROP_HEIGHT, postgameMenuInfo.nameOfMVP, UI_CENTER, white ); UI_DrawProportionalString( 320, 480 - 34 - 2 * PROP_HEIGHT, postgameMenuInfo.winTeamMVPText, UI_CENTER, yellow ); Com_sprintf( buf, sizeof(buf), "%s %i", ingame_text[IGT_POINTS], postgameMenuInfo.scoreOfMVP); UI_DrawProportionalString( 320, 480 - 14 - 2 * PROP_HEIGHT, buf, UI_CENTER, yellow ); // SPECIAL TEAM STATS BAR ON RIGHT SIDE OF SCREEN //----------------------------------------------- // // THE TOP BAR y=130; if (cgs.gametype == GT_CTF) Com_sprintf( buf, sizeof(buf), ingame_text[IGT_GAME_CAPTUREFLAG] ); else Com_sprintf( buf, sizeof(buf), ingame_text[IGT_GAME_TEAMHOLOMATCH] ); len = UI_ProportionalStringWidth( buf, UI_SMALLFONT ); trap_R_SetColor( colorTable[CT_DKORANGE] ); CG_DrawPic( 640-32, y+20, 16, -32, cgs.media.corner_8_16_b ); CG_FillRect(640-80, y+1, 48, 15, colorTable[CT_DKORANGE]); UI_DrawProportionalString( 640-82, y, buf, UI_RIGHT, colorTable[CT_DKORANGE] ); trap_R_SetColor( colorTable[CT_DKORANGE] ); CG_DrawPic( 640-80-len-5, y+1, -14, 20, cgs.media.scoreboardEndcap ); yfrom = y+20; y+=20; Com_sprintf( buf, sizeof(buf), "%s", postgameMenuInfo.winTeamText); UI_DrawProportionalString( 640-34, y, buf, UI_BIGFONT|UI_RIGHT, yellow ); y+=35; if (cgs.gametype == GT_CTF) { // HOW MANY CAPUTRES??? Com_sprintf( buf, sizeof(buf), "%s %i", ingame_text[IGT_CAPTURES], postgameMenuInfo.totalCaptures); UI_DrawProportionalString( 640-34, y, buf, UI_RIGHT, white ); y+=20; } // AND THE POINTS??? Com_sprintf( buf, sizeof(buf), "%s %i", ingame_text[IGT_POINTS], postgameMenuInfo.totalPoints); UI_DrawProportionalString( 640-34, y, buf, UI_RIGHT, white ); y+=30; // THE SIDE BAR CG_FillRect( 640-16-12, yfrom, 8, y-yfrom, colorTable[CT_DKORANGE]); // THE MIDDLE BARS CG_FillRect( 640-115, y, 95, 20, colorTable[CT_DKORANGE]); y+=3; if (postgameMenuInfo.playerGameRank==2) Com_sprintf( buf, sizeof(buf), "%s", ingame_text[IGT_TEAMS_TIED]); else Com_sprintf( buf, sizeof(buf), "%s", ingame_text[IGT_VICTOR]); UI_DrawProportionalString( 640-34, y, buf, UI_RIGHT, colorTable[CT_BLACK] ); y+=20; y+=30; yfrom=y; CG_FillRect( 640-115, y, 95, 20, colorTable[CT_DKORANGE]); y+=3; if (postgameMenuInfo.playerGameRank==2) Com_sprintf( buf, sizeof(buf), "%s", ingame_text[IGT_TEAMS_TIED]); else Com_sprintf( buf, sizeof(buf), "%s", ingame_text[IGT_DEFEATED]); UI_DrawProportionalString( 640-34, y, buf, UI_RIGHT, colorTable[CT_BLACK] ); y+=25; // LOSING TEAM NAME Com_sprintf( buf, sizeof(buf), "%s", postgameMenuInfo.losTeamText); UI_DrawProportionalString( 640-34, y, buf, UI_BIGFONT|UI_RIGHT, yellow ); y+=35; if (cgs.gametype == GT_CTF) { // HOW MANY CAPUTRES??? Com_sprintf( buf, sizeof(buf), "%s %i", ingame_text[IGT_CAPTURES], postgameMenuInfo.losCaptures); UI_DrawProportionalString( 640-34, y, buf, UI_RIGHT, white ); y+=20; } // AND THE POINTS??? Com_sprintf( buf, sizeof(buf), "%s %i", ingame_text[IGT_POINTS], postgameMenuInfo.losPoints); UI_DrawProportionalString( 640-34, y, buf, UI_RIGHT, white ); y+=20; // THE SIDE BAR CG_FillRect( 640-16-12, yfrom, 8, y-yfrom, colorTable[CT_DKORANGE]); // THE BOTTOM BAR trap_R_SetColor( colorTable[CT_DKORANGE] ); CG_DrawPic( 640-32, y, 16, 32, cgs.media.corner_8_16_b ); CG_FillRect(640-100, y+4, 68, 15, colorTable[CT_DKORANGE]); trap_R_SetColor( colorTable[CT_DKORANGE] ); CG_DrawPic( 640-100-2, y+4, -14, 20, cgs.media.scoreboardEndcap ); yfrom = y+20; y+=20; } } // if we are arriving as a spectator, there are no awards for you (not even sure that spectators // will get the awards string that sets the whole thing up...) // if (cg.snap->ps.persistant[PERS_TEAM]==TEAM_SPECTATOR) // return qtrue; // PHASE I // Play Winner sound //----------------------------------------------- if( postgameMenuInfo.phase == 1 ) { timer = cg.time - postgameMenuInfo.starttime; // set up the timer //RPG-X: RedTechie - No winner /*if( postgameMenuInfo.winnerSound ) // if havn't played yet { trap_S_StartLocalSound( postgameMenuInfo.winnerSound, CHAN_ANNOUNCER ); // play the sound postgameMenuInfo.winnerSound = 0; // don't play again // force another wait since we played a sound here postgameMenuInfo.starttime = cg.time + postgameMenuInfo.winnerDelay; timer = 0; }*/ if( timer < 2000 ) { return qfalse; } //RPG-X: RedTechie - No ranking sound /*if (cg.snap->ps.persistant[PERS_TEAM]!=TEAM_SPECTATOR) { if (postgameMenuInfo.youPlacedSound) { trap_S_StartLocalSound( postgameMenuInfo.youPlacedSound, CHAN_ANNOUNCER ); postgameMenuInfo.youPlacedSound = 0; // force another wait since we played a sound here postgameMenuInfo.starttime = cg.time; timer = 0; } }*/ // if we didn't play a youPlaced sound, this won't slow us up at all if( timer < 2000 ) { return qfalse; } // play "commendations" sound //RPG-X: RedTechie - No commendations /*if (postgameMenuInfo.commendationsSound) { trap_S_StartLocalSound( postgameMenuInfo.commendationsSound, CHAN_ANNOUNCER ); postgameMenuInfo.commendationsSound = 0; // force another wait since we played a sound here postgameMenuInfo.starttime = cg.time; }*/ if( timer < 2500 ) { return qfalse; } // After 7 seconds, go on to phase II postgameMenuInfo.phase = 2; // Setup PHASE II postgameMenuInfo.starttime = cg.time; // // memset( presentedTeamAward, 0, sizeof( presentedTeamAward ) ); // extraAwardTime = 0; // allTeamAwardsAnnounced = qfalse; // awardNextDebounceTime = 0; // awardNum = 0; // nextTeamAward = 0; return qfalse; } // PHASE II // Introduce each medal on a timer //----------------------------------------------- //RPG-X: RedTechie - No awards if( postgameMenuInfo.phase == 2 ) { timer = cg.time - postgameMenuInfo.starttime;// - extraAwardTime; // Setup Timer if( timer >= ( postgameMenuInfo.numAwards * AWARD_PRESENTATION_TIME ) ) { postgameMenuInfo.phase = 3; //AW_DrawTheMedals( postgameMenuInfo.numAwards ); // Draw All Medals for this frame } else { //AW_DrawAwardsPresentation( timer ); // Draw Some Medals } return qfalse; } // PHASE III // Just draw all the awards medals //----------------------------------------------- //RPG-X: RedTechie - No awards if( postgameMenuInfo.phase == 3 ) { //AW_DrawTheMedals( postgameMenuInfo.numAwards ); timer = cg.time - postgameMenuInfo.starttime; // Setup Timer if (timer >= 5000) postgameMenuInfo.phase = 4; // Got To Phase IV after 5 seconds return qfalse; } // PHASE IV // Draw Medals & Draw the scoreboard //----------------------------------------------- //RPG-X: RedTechie - No awards postgameMenuInfo.phase = 4; //AW_DrawTheMedals( postgameMenuInfo.numAwards ); return qtrue; } /* ================= AW_SPPostgameMenu_Cache ================= void AW_SPPostgameMenu_Cache( void ) { int n; qboolean buildscript; buildscript = trap_Cvar_VariableValue("com_buildscript"); for( n = 0; n < AWARD_MAX; n++ ) { trap_R_RegisterShaderNoMip( ui_medalPicNames[n] ); trap_S_RegisterSound( ui_medalSounds[n] ); } if( buildscript ) { trap_Cmd_ExecuteText( EXEC_APPEND, "music music/win\n" ); trap_Cmd_ExecuteText( EXEC_APPEND, "music music/loss\n" ); trap_S_RegisterSound( "sound/player/announce/youwin.wav" ); } } */ /* ================= AW_SPPostgameMenu_Cache This function writes the winning the winning team name if we are in a team game. ================= */ static void AW_Prepname( int index) { // int len; char name[64]; // The winning team's name.. Red/Blue/ Klingon... char MVPname[64]; char otherName[64]; const char *redPtr = NULL; const char *bluePtr = NULL; char *red_team; char *blue_team; red_team = ingame_text[IGT_REDTEAM]; blue_team = ingame_text[IGT_BLUETEAM]; redPtr = CG_ConfigString( CS_RED_GROUP ); bluePtr= CG_ConfigString( CS_BLUE_GROUP); if (!Q_stricmp(redPtr, "")) redPtr = red_team; if (!Q_stricmp(bluePtr, "")) bluePtr = blue_team; if (postgameMenuInfo.playerGameRank == 1) // Blue Team Won { Com_sprintf(name, sizeof(name), "%s", bluePtr); //Winners Com_sprintf(otherName, sizeof(otherName), "%s", redPtr); //Losers Com_sprintf(MVPname, sizeof(name), "%s %s", bluePtr, ingame_text[IGT_MVP]); } else if (postgameMenuInfo.playerGameRank == 0) // Red Team Won { Com_sprintf(name, sizeof(name), "%s", redPtr); //Winners Com_sprintf(otherName, sizeof(otherName), "%s", bluePtr); //Losers Com_sprintf(MVPname, sizeof(name), "%s %s", redPtr, ingame_text[IGT_MVP]); } else // Teams Tied { Com_sprintf(name, sizeof(name), "%s", ingame_text[IGT_TEAMS_TIED]); Com_sprintf(otherName, sizeof(otherName), "%s", ingame_text[IGT_TEAMS_TIED]); Com_sprintf(MVPname, sizeof(name), "%s %s", ingame_text[IGT_OVERALL], ingame_text[IGT_MVP]); } Q_strncpyz( postgameMenuInfo.winTeamText, name, sizeof(postgameMenuInfo.winTeamText) ); Q_strncpyz( postgameMenuInfo.losTeamText, otherName, sizeof(postgameMenuInfo.losTeamText) ); Q_strncpyz( postgameMenuInfo.winTeamMVPText, MVPname, sizeof(postgameMenuInfo.winTeamMVPText) ); } /* ================= AW_SPPostgameMenu_f This function essentially initializes the SPPostgameMenu_t structure Is called by the server command "awards ..." ================= */ void AW_SPPostgameMenu_f( void ) { int playerGameRank; int playerClientNum; int playerTeam; int n, clNum[3] = {0,0,0}; int awardFlags; int numNames; char temp_string[200]; memset( &postgameMenuInfo, 0, sizeof(postgameMenuInfo) ); // IMPORT AWARDS INFORMATION FROM SERVER AND CMD STRING //___________________________________________________________________________________________ // playerClientNum = (cg.snap->ps.clientNum); playerGameRank = (cg.snap->ps.persistant[PERS_RANK]&~RANK_TIED_FLAG); //playerTeam = (cg.snap->ps.persistant[PERS_TEAM]); playerTeam = (cgs.clientinfo[playerClientNum].team);//this should be more accurate postgameMenuInfo.starttime = cg.time; // Initialize Timers postgameMenuInfo.scoreboardtime = cg.time; postgameMenuInfo.numAwards = 0; // Initialize Awards Count postgameMenuInfo.playerGameRank = playerGameRank; // Store Player Rank postgameMenuInfo.numClients = atoi( CG_Argv( 1 ) ); // Store Number Of Clients postgameMenuInfo.playerTied = (cg.snap->ps.persistant[PERS_RANK] & RANK_TIED_FLAG); if (playerTeam == playerGameRank+1 || playerGameRank==2) postgameMenuInfo.playersTeamWon = qtrue; else postgameMenuInfo.playersTeamWon = qfalse; for (n=0; (n>1; } Q_strncpyz( postgameMenuInfo.nameOfMVP, (CG_Argv(numNames + postgameMenuInfo.numAwards + 3)), sizeof(postgameMenuInfo.nameOfMVP) ); postgameMenuInfo.scoreOfMVP = atoi( CG_Argv(numNames + postgameMenuInfo.numAwards + 4)); postgameMenuInfo.totalCaptures = atoi( CG_Argv(numNames + postgameMenuInfo.numAwards + 5)); postgameMenuInfo.totalPoints = atoi( CG_Argv(numNames + postgameMenuInfo.numAwards + 6)); if (cgs.gametype <= GT_SINGLE_PLAYER) { postgameMenuInfo.playerGameRank = atoi( CG_Argv(numNames + postgameMenuInfo.numAwards + 7)); playerGameRank = postgameMenuInfo.playerGameRank; } postgameMenuInfo.playerTied = atoi( CG_Argv(numNames + postgameMenuInfo.numAwards + 8)); postgameMenuInfo.losCaptures = atoi( CG_Argv(numNames + postgameMenuInfo.numAwards + 9)); postgameMenuInfo.losPoints = atoi( CG_Argv(numNames + postgameMenuInfo.numAwards + 10)); postgameMenuInfo.secondPlaceTied = atoi( CG_Argv(numNames + postgameMenuInfo.numAwards + 11)); VectorSet(postgameMenuInfo.intermission_origin, atoi( CG_Argv(numNames + postgameMenuInfo.numAwards + 12)), atoi( CG_Argv(numNames + postgameMenuInfo.numAwards + 13)), atoi( CG_Argv(numNames + postgameMenuInfo.numAwards + 14))); VectorSet(postgameMenuInfo.intermission_angle, atoi( CG_Argv(numNames + postgameMenuInfo.numAwards + 15)), atoi( CG_Argv(numNames + postgameMenuInfo.numAwards + 16)), atoi( CG_Argv(numNames + postgameMenuInfo.numAwards + 17))); cg.predictedPlayerState.pm_type = PM_INTERMISSION; VectorCopy(postgameMenuInfo.intermission_origin, cg.predictedPlayerState.origin); VectorCopy(postgameMenuInfo.intermission_angle, cg.predictedPlayerState.viewangles); // SOUNDS //___________________________________________________________________________________________ // if (postgameMenuInfo.numAwards) { postgameMenuInfo.commendationsSound = trap_S_RegisterSound("sound/voice/computer/misc/commendations.wav"); } else { postgameMenuInfo.commendationsSound = 0; } if (cgs.gametype <= GT_SINGLE_PLAYER) // for FFA, TOURNAMENT, and SINGLE_PLAYER TOURNAMENT: { if ( playerGameRank != 0 ) { // Someone else wins char *skin; skin = cgs.clientinfo[clNum[0]].skinName; if( Q_stricmp( skin, "default" ) == 0 ) { skin = cgs.clientinfo[clNum[0]].modelName; } if( Q_stricmp( skin, "red" ) == 0 ) { skin = cgs.clientinfo[clNum[0]].modelName; } if( Q_stricmp( skin, "blue" ) == 0 ) { skin = cgs.clientinfo[clNum[0]].modelName; } postgameMenuInfo.winnerSound = trap_S_RegisterSound( va( "sound/voice/computer/misc/%s_wins.wav", skin ) ); if (0 == postgameMenuInfo.winnerSound) { postgameMenuInfo.winnerSound = trap_S_RegisterSound( va( "sound/voice/computer/misc/progcomp.wav", skin ) ); } postgameMenuInfo.winnerDelay = 2500; if (1 == playerGameRank || postgameMenuInfo.playerTied==2) { postgameMenuInfo.youPlacedSound = trap_S_RegisterSound("sound/voice/computer/misc/2nd.wav"); } else if (2 == playerGameRank || postgameMenuInfo.playerTied==3) { postgameMenuInfo.youPlacedSound = trap_S_RegisterSound("sound/voice/computer/misc/3rd.wav"); } else { postgameMenuInfo.youPlacedSound = trap_S_RegisterSound("sound/voice/computer/misc/notPlace.wav"); } // You lost, you get to listen to loser music. // This might be a bit of a downer in FFA, since far more often than not you are not the winner... // However, in this case the track is NOT a funeral march with an opera singer bellowing "LOSER, LOSER, LOSER, HA HA". // SOOOOOO for consistency's sake, you will always hear the "loss" track when you don't win. --Pat trap_S_StartBackgroundTrack( "music/loss", "music/loss" ); } else { // You win postgameMenuInfo.winnerSound = trap_S_RegisterSound( "sound/voice/computer/misc/youwin.wav" ); postgameMenuInfo.youPlacedSound = 0; postgameMenuInfo.winnerDelay = 500; // You won, you get to listen to the winner music. trap_S_StartBackgroundTrack( "music/win", "music/win" ); } } else // for TEAM, and CAPTURE THE FLAG: { qboolean bRaceSound = qfalse; AW_Prepname( 0); // Set Up "xxxx Team Wins" text // THE VOICE //__________________________________________________ if (playerGameRank == 1) { Com_sprintf(temp_string, sizeof(temp_string), "sound/voice/computer/misc/%s_wins.wav" , CG_ConfigString( CS_BLUE_GROUP )); postgameMenuInfo.winnerSound = trap_S_RegisterSound(temp_string); if (!postgameMenuInfo.winnerSound) { postgameMenuInfo.winnerSound = trap_S_RegisterSound( "sound/voice/computer/misc/blueteam_wins.wav" ); } else { bRaceSound = qtrue; } } else if (playerGameRank == 0) { Com_sprintf(temp_string, sizeof(temp_string), "sound/voice/computer/misc/%s_wins.wav" , CG_ConfigString( CS_RED_GROUP )); postgameMenuInfo.winnerSound = trap_S_RegisterSound(temp_string); if (!postgameMenuInfo.winnerSound) { postgameMenuInfo.winnerSound = trap_S_RegisterSound( "sound/voice/computer/misc/redteam_wins.wav" ); } else { bRaceSound = qtrue; } } else if (playerGameRank == 2) { postgameMenuInfo.winnerSound = trap_S_RegisterSound( "sound/voice/computer/misc/teamstied.wav" ); } if (!bRaceSound && (playerTeam == playerGameRank+1) ) { postgameMenuInfo.winnerSound = trap_S_RegisterSound( "sound/voice/computer/misc/yourteam_wins.wav" ); } if (bRaceSound) { postgameMenuInfo.winnerDelay = 4000; } else { postgameMenuInfo.winnerDelay = 1000; } // THE MUSIC //__________________________________________________ if (postgameMenuInfo.playersTeamWon) { trap_S_StartBackgroundTrack( "music/win", "music/win" ); } else { trap_S_StartBackgroundTrack( "music/loss", "music/loss" ); } } //Set To Phase I postgameMenuInfo.phase = 1; }