static int WM_TeamScoreboard( int x, int y, team_t team, float fade, int maxrows ) { vec4_t hcolor; float tempx, tempy; int height, width; int i, rows; height = SMALLCHAR_HEIGHT * maxrows; width = INFO_PLAYER_WIDTH + INFO_CLASS_WIDTH + INFO_SCORE_WIDTH + INFO_LATENCY_WIDTH; rows = height / SMALLCHAR_HEIGHT - 2; hcolor[0] = hcolor[1] = hcolor[2] = 1; hcolor[3] = 1.f; trap_R_SetColor( hcolor ); CG_DrawPic( x - 15, y - 4, width + 30, height + 1, trap_R_RegisterShaderNoMip( "ui_mp/assets/mp_score_team.tga" ) ); trap_R_SetColor( NULL ); if ( team == TEAM_RED ) { VectorSet( hcolor, ( 68.f / 255.f ), ( 0.f / 255.f ), ( 0.f / 255.f ) ); } else if ( team == TEAM_BLUE ) { VectorSet( hcolor, ( 0.f / 255.f ), ( 45.f / 255.f ), ( 68.f / 255.f ) ); } hcolor[3] = 1 * fade; // draw header if ( team == TEAM_RED ) { CG_DrawSmallString( x, y, va( "%s [%d] (%d %s)", CG_TranslateString( "Axis" ), cg.teamScores[0], cg.teamPlayers[team], CG_TranslateString( "players" ) ), fade ); } else if ( team == TEAM_BLUE ) { CG_DrawSmallString( x, y, va( "%s [%d] (%d %s)", CG_TranslateString( "Allies" ), cg.teamScores[1], cg.teamPlayers[team], CG_TranslateString( "players" ) ), fade ); } y += SMALLCHAR_HEIGHT + 4; // save off y val tempy = y; // draw color bands for ( i = 0; i < rows; i++ ) { hcolor[3] = fade * 0.3; if ( i % 2 == 0 ) { VectorSet( hcolor, ( 0.f / 255.f ), ( 163.f / 255.f ), ( 113.f / 255.f ) ); // LIGHT BLUE } else { VectorSet( hcolor, ( 0.f / 255.f ), ( 133.f / 255.f ), ( 92.f / 255.f ) ); // DARK BLUE } hcolor[3] = 0; CG_FillRect( x, y, width, SMALLCHAR_HEIGHT, hcolor ); y += SMALLCHAR_HEIGHT; } hcolor[3] = 1; y = tempy; tempx = x; // draw player info headings CG_DrawSmallString( tempx, y, CG_TranslateString( "Name" ), fade ); tempx += INFO_PLAYER_WIDTH; CG_DrawSmallString( tempx, y, CG_TranslateString( "Class" ), fade ); tempx += INFO_CLASS_WIDTH; CG_DrawSmallString( tempx, y, CG_TranslateString( "Score" ), fade ); tempx += INFO_SCORE_WIDTH; CG_DrawSmallString( tempx, y, CG_TranslateString( "Ping" ), fade ); tempx += INFO_LATENCY_WIDTH; y += SMALLCHAR_HEIGHT; // draw player info VectorSet( hcolor, 1, 1, 1 ); hcolor[3] = fade; cg.teamPlayers[team] = 0; // JPW NERVE for ( i = 0; i < cg.numScores; i++ ) { if ( team != cgs.clientinfo[ cg.scores[i].client ].team ) { continue; } cg.teamPlayers[team]++; // JPW NERVE // one frame latency, but who cares? WM_DrawClientScore( x, y, &cg.scores[i], hcolor, fade ); y += SMALLCHAR_HEIGHT; } // draw spectators y += SMALLCHAR_HEIGHT; for ( i = 0; i < cg.numScores; i++ ) { if ( cgs.clientinfo[ cg.scores[i].client ].team != TEAM_SPECTATOR ) { continue; } if ( team == TEAM_RED && ( i % 2 ) ) { continue; } if ( team == TEAM_BLUE && ( ( i + 1 ) % 2 ) ) { continue; } WM_DrawClientScore( x, y, &cg.scores[i], hcolor, fade ); y += SMALLCHAR_HEIGHT; } return y; }
void UI_DrawNamedPic( float x, float y, float width, float height, const char *picname ) { qhandle_t hShader; hShader = trap_R_RegisterShaderNoMip( picname ); trap_R_DrawStretchPic( x, y, width, height, 0, 0, 1, 1, hShader ); }
void CG_InitPMGraphics( void ) { cgs.media.pmImages[PM_DYNAMITE] = trap_R_RegisterShaderNoMip( "gfx/limbo/cm_dynamite" ); cgs.media.pmImages[PM_CONSTRUCTION] = trap_R_RegisterShaderNoMip( "sprites/voiceChat" ); cgs.media.pmImages[PM_MINES] = trap_R_RegisterShaderNoMip( "sprites/voiceChat" ); cgs.media.pmImages[PM_DEATH] = trap_R_RegisterShaderNoMip( "gfx/hud/pm_death" ); cgs.media.pmImages[PM_MESSAGE] = trap_R_RegisterShaderNoMip( "sprites/voiceChat" ); cgs.media.pmImages[PM_OBJECTIVE] = trap_R_RegisterShaderNoMip( "sprites/objective" ); cgs.media.pmImages[PM_DESTRUCTION] = trap_R_RegisterShaderNoMip( "sprites/voiceChat" ); cgs.media.pmImages[PM_TEAM] = trap_R_RegisterShaderNoMip( "sprites/voiceChat" ); cgs.media.pmImageAlliesConstruct = trap_R_RegisterShaderNoMip( "gfx/hud/pm_constallied" ); cgs.media.pmImageAxisConstruct = trap_R_RegisterShaderNoMip( "gfx/hud/pm_constaxis" ); cgs.media.pmImageAlliesMine = trap_R_RegisterShaderNoMip( "gfx/hud/pm_mineallied" ); cgs.media.pmImageAxisMine = trap_R_RegisterShaderNoMip( "gfx/hud/pm_mineaxis" ); cgs.media.hintKey = trap_R_RegisterShaderNoMip( "gfx/hud/keyboardkey_old" ); }
/* =============== UI_NetworkOptionsMenu_Cache =============== */ void UI_NetworkOptionsMenu_Cache( void ) { trap_R_RegisterShaderNoMip( ART_FRAMEL ); trap_R_RegisterShaderNoMip( ART_FRAMER ); trap_R_RegisterShaderNoMip( ART_BACK0 ); trap_R_RegisterShaderNoMip( ART_BACK1 ); }
/* ================= Menu_Cache ================= */ void Menu_Cache( void ) { uis.charset = trap_R_RegisterShaderNoMip( "gfx/2d/bigchars" ); uis.charsetProp = trap_R_RegisterShaderNoMip( "menu/art/font1_prop.tga" ); uis.charsetPropGlow = trap_R_RegisterShaderNoMip( "menu/art/font1_prop_glo.tga" ); uis.charsetPropB = trap_R_RegisterShaderNoMip( "menu/art/font2_prop.tga" ); uis.cursor = trap_R_RegisterShaderNoMip( "menu/art/3_cursor2" ); uis.rb_on = trap_R_RegisterShaderNoMip( "menu/art/switch_on" ); uis.rb_off = trap_R_RegisterShaderNoMip( "menu/art/switch_off" ); uis.whiteShader = trap_R_RegisterShaderNoMip( "white" ); if ( uis.glconfig.hardwareType == GLHW_RAGEPRO ) { // the blend effect turns to shit with the normal uis.menuBackShader = trap_R_RegisterShaderNoMip( "menubackRagePro" ); } else { uis.menuBackShader = trap_R_RegisterShaderNoMip( "menuback" ); } uis.menuBackNoLogoShader = trap_R_RegisterShaderNoMip( "menubacknologo" ); uis.menuLoadingIcon = trap_R_RegisterShaderNoMip( "menu/art/loading" ); menu_in_sound = trap_S_RegisterSound( "sound/misc/menu1.wav", qfalse ); menu_move_sound = trap_S_RegisterSound( "sound/misc/menu2.wav", qfalse ); menu_out_sound = trap_S_RegisterSound( "sound/misc/menu3.wav", qfalse ); menu_buzz_sound = trap_S_RegisterSound( "sound/misc/menu4.wav", qfalse ); weaponChangeSound = trap_S_RegisterSound( "sound/weapons/change.wav", qfalse ); // need a nonzero sound, make an empty sound for this menu_null_sound = -1; sliderBar = trap_R_RegisterShaderNoMip( "menu/art/slider2" ); sliderButton_0 = trap_R_RegisterShaderNoMip( "menu/art/sliderbutt_0" ); sliderButton_1 = trap_R_RegisterShaderNoMip( "menu/art/sliderbutt_1" ); }
/* =============== Login_Cache =============== */ void Login_Cache( void ) { trap_R_RegisterShaderNoMip( LOGIN_FRAME ); }
/* ================= UI_TeamOrdersMenu_Cache ================= */ void UI_TeamOrdersMenu_Cache( void ) { trap_R_RegisterShaderNoMip( ART_FRAME ); trap_R_RegisterShaderNoMip( ART_BACK0 ); trap_R_RegisterShaderNoMip( ART_BACK1 ); }
void CG_DrawInformation( void ) { const char *s; const char *info; const char *sysInfo; int y; int value, valueNOFP; qhandle_t levelshot; char buf[1024]; int iPropHeight = 18; // I know, this is total crap, but as a post release asian-hack.... -Ste info = CG_ConfigString( CS_SERVERINFO ); sysInfo = CG_ConfigString( CS_SYSTEMINFO ); s = Info_ValueForKey( info, "mapname" ); levelshot = trap_R_RegisterShaderNoMip( va( "levelshots/%s", s ) ); if ( !levelshot ) { levelshot = trap_R_RegisterShaderNoMip( "menu/art/unknownmap_mp" ); } trap_R_SetColor( NULL ); CG_DrawPic( 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, levelshot ); CG_LoadBar(); // draw the icons of things as they are loaded // CG_DrawLoadingIcons(); // the first 150 rows are reserved for the client connection // screen to write into if ( cg.infoScreenText[0] ) { const char *psLoading = CG_GetStringEdString("MENUS", "LOADING_MAPNAME"); //[OverflowProtection] UI_DrawProportionalString( 320, 128-32, va(/*"Loading... %s"*/ (char*) psLoading, cg.infoScreenText), //UI_DrawProportionalString( 320, 128-32, va(/*"Loading... %s"*/ psLoading, cg.infoScreenText), //[/OverflowProtection] UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite ); } else { const char *psAwaitingSnapshot = CG_GetStringEdString("MENUS", "AWAITING_SNAPSHOT"); UI_DrawProportionalString( 320, 128-32, /*"Awaiting snapshot..."*/psAwaitingSnapshot, UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite ); } // draw info string information y = 180-32; // don't print server lines if playing a local game trap_Cvar_VariableStringBuffer( "sv_running", buf, sizeof( buf ) ); if ( !atoi( buf ) ) { // server hostname Q_strncpyz(buf, Info_ValueForKey( info, "sv_hostname" ), 1024); Q_CleanStr(buf); UI_DrawProportionalString( 320, y, buf, UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite ); y += iPropHeight; // pure server s = Info_ValueForKey( sysInfo, "sv_pure" ); if ( s[0] == '1' ) { const char *psPure = CG_GetStringEdString("MP_INGAME", "PURE_SERVER"); UI_DrawProportionalString( 320, y, psPure, UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite ); y += iPropHeight; } // server-specific message of the day s = CG_ConfigString( CS_MOTD ); if ( s[0] ) { UI_DrawProportionalString( 320, y, s, UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite ); y += iPropHeight; } { // display global MOTD at bottom (mirrors ui_main UI_DrawConnectScreen char motdString[1024]; trap_Cvar_VariableStringBuffer( "cl_motdString", motdString, sizeof( motdString ) ); if (motdString[0]) { UI_DrawProportionalString( 320, 425, motdString, UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite ); } } // some extra space after hostname and motd y += 10; } // map-specific message (long map name) s = CG_ConfigString( CS_MESSAGE ); if ( s[0] ) { UI_DrawProportionalString( 320, y, s, UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite ); y += iPropHeight; } // cheats warning s = Info_ValueForKey( sysInfo, "sv_cheats" ); if ( s[0] == '1' ) { UI_DrawProportionalString( 320, y, CG_GetStringEdString("MP_INGAME", "CHEATSAREENABLED"), UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite ); y += iPropHeight; } // game type switch ( cgs.gametype ) { case GT_FFA: s = CG_GetStringEdString("MENUS", "FREE_FOR_ALL");//"Free For All"; // s = "Free For All"; break; case GT_HOLOCRON: s = CG_GetStringEdString("MENUS", "HOLOCRON_FFA");//"Holocron FFA"; // s = "Holocron FFA"; break; case GT_JEDIMASTER: //[OLDGAMETYPES] //s = CG_GetStringEdString("MENUS", "SAGA");//"Jedi Master";?? s = CG_GetStringEdString("OJP_MENUS", "JEDIMASTER");//"Jedi Master";?? //[/OLDGAMETYPES] // s = "Jedi Master"; break; case GT_SINGLE_PLAYER: //[CoOp] s = CG_GetStringEdString("OJP_MENUS", "COOP");//"Cooperative"; //s = CG_GetStringEdString("MENUS", "SAGA");//"Team FFA"; //[/CoOp] //s = "Single Player"; break; case GT_DUEL: s = CG_GetStringEdString("MENUS", "DUEL");//"Team FFA"; //s = "Duel"; break; case GT_POWERDUEL: s = CG_GetStringEdString("MENUS", "POWERDUEL");//"Team FFA"; //s = "Power Duel"; break; case GT_TEAM: s = CG_GetStringEdString("MENUS", "TEAM_FFA");//"Team FFA"; //s = "Team FFA"; break; case GT_SIEGE: s = CG_GetStringEdString("MENUS", "SIEGE");//"Siege"; //s = "Siege"; break; case GT_CTF: s = CG_GetStringEdString("MENUS", "CAPTURE_THE_FLAG");//"Capture the Flag"; //s = "Capture The Flag"; break; case GT_CTY: s = CG_GetStringEdString("MENUS", "CAPTURE_THE_YSALIMARI");//"Capture the Ysalamiri"; //s = "Capture The Ysalamiri"; break; default: s = CG_GetStringEdString("MENUS", "SAGA");//"Team FFA"; //s = "Unknown Gametype"; break; } UI_DrawProportionalString( 320, y, s, UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite ); y += iPropHeight; if (cgs.gametype != GT_SIEGE) { //[CoOp] if ( cgs.gametype != GT_SINGLE_PLAYER ) { value = atoi( Info_ValueForKey( info, "timelimit" ) ); if ( value ) { UI_DrawProportionalString( 320, y, va( "%s %i", CG_GetStringEdString("MP_INGAME", "TIMELIMIT"), value ), UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite ); y += iPropHeight; } } /*value = atoi( Info_ValueForKey( info, "timelimit" ) ); if ( value ) { UI_DrawProportionalString( 320, y, va( "%s %i", CG_GetStringEdString("MP_INGAME", "TIMELIMIT"), value ), UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite ); y += iPropHeight; }*/ //[/CoOp] //[CoOp] if ( cgs.gametype < GT_CTF && cgs.gametype != GT_SINGLE_PLAYER ) { //if (cgs.gametype < GT_CTF ) { //[/CoOp] value = atoi( Info_ValueForKey( info, "fraglimit" ) ); if ( value ) { UI_DrawProportionalString( 320, y, va( "%s %i", CG_GetStringEdString("MP_INGAME", "FRAGLIMIT"), value ), UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite ); y += iPropHeight; } if (cgs.gametype == GT_DUEL || cgs.gametype == GT_POWERDUEL) { value = atoi( Info_ValueForKey( info, "duel_fraglimit" ) ); if ( value ) { UI_DrawProportionalString( 320, y, va( "%s %i", CG_GetStringEdString("MP_INGAME", "WINLIMIT"), value ), UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite ); y += iPropHeight; } } } } if (cgs.gametype >= GT_CTF) { value = atoi( Info_ValueForKey( info, "capturelimit" ) ); if ( value ) { UI_DrawProportionalString( 320, y, va( "%s %i", CG_GetStringEdString("MP_INGAME", "CAPTURELIMIT"), value ), UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite ); y += iPropHeight; } } if (cgs.gametype >= GT_TEAM) { value = atoi( Info_ValueForKey( info, "g_forceBasedTeams" ) ); if ( value ) { UI_DrawProportionalString( 320, y, CG_GetStringEdString("MP_INGAME", "FORCEBASEDTEAMS"), UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite ); y += iPropHeight; } } if (cgs.gametype != GT_SIEGE) { valueNOFP = atoi( Info_ValueForKey( info, "g_forcePowerDisable" ) ); value = atoi( Info_ValueForKey( info, "g_maxForceRank" ) ); //[VARIOUSMENU] //if ( value && !valueNOFP && (value < NUM_FORCE_MASTERY_LEVELS) ) { if ( value && valueNOFP != FORCE_ALLOFF && (value < NUM_FORCE_MASTERY_LEVELS) ) { //[/VARIOUSMENU] char fmStr[1024]; trap_SP_GetStringTextString("MP_INGAME_MAXFORCERANK",fmStr, sizeof(fmStr)); UI_DrawProportionalString( 320, y, va( "%s %s", fmStr, CG_GetStringEdString("MP_INGAME", forceMasteryLevels[value]) ), UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite ); y += iPropHeight; } //[VARIOUSMENU] //else if (!valueNOFP) else if (valueNOFP != FORCE_ALLOFF) //[VARIOUSMENU] { char fmStr[1024]; trap_SP_GetStringTextString("MP_INGAME_MAXFORCERANK",fmStr, sizeof(fmStr)); UI_DrawProportionalString( 320, y, va( "%s %s", fmStr, (char *)CG_GetStringEdString("MP_INGAME", forceMasteryLevels[7]) ), UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite ); y += iPropHeight; } //[VARIOUSMENU] //Modifed Force Status Display. Used to be used below. //I moved it here to keep things clean. if ( valueNOFP == FORCE_ALLOFF ) { UI_DrawProportionalString( 320, y, va( "%s", (char *)CG_GetStringEdString("MP_INGAME", "NOFPSET") ), UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite ); y += iPropHeight; } else if ( valueNOFP == FORCE_JUMPONLY ) { UI_DrawProportionalString( 320, y, "Force Jump Only", UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite ); y += iPropHeight; } else if ( valueNOFP == FORCE_NEUTRALSONLY ) { UI_DrawProportionalString( 320, y, "Neutral Force Powers Only", UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite ); y += iPropHeight; } else if ( valueNOFP ) { UI_DrawProportionalString( 320, y, "Custom Force Setup", UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite ); y += iPropHeight; } if (cgs.gametype == GT_DUEL || cgs.gametype == GT_POWERDUEL) { value = atoi( Info_ValueForKey( info, "g_duelWeaponDisable" ) ); } else { value = atoi( Info_ValueForKey( info, "g_weaponDisable" ) ); } //[MOREWEAPOPTIONS] if ( cgs.gametype != GT_JEDIMASTER && value == WP_SABERSONLY ) { //if ( cgs.gametype != GT_JEDIMASTER && value ) { UI_DrawProportionalString( 320, y, va( "%s", (char *)CG_GetStringEdString("MP_INGAME", "SABERONLYSET") ), UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite ); y += iPropHeight; } else if ( value == WP_MELEEONLY ) { UI_DrawProportionalString( 320, y, "Melee Only", UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite ); y += iPropHeight; } else if ( value == WP_MELEESABERS ) { UI_DrawProportionalString( 320, y, "Sabers & Melee Only", UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite ); y += iPropHeight; } else if ( value == WP_NOEXPLOS ) { UI_DrawProportionalString( 320, y, "No Explosives", UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite ); y += iPropHeight; } else if ( value ) { UI_DrawProportionalString( 320, y, "Custom Weapon Setup", UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite ); y += iPropHeight; } //[/MOREWEAPOPTIONS] //[VARIOUSMENU] //Moved this up to be under the Force Mastery Level. /* if ( valueNOFP ) { UI_DrawProportionalString( 320, y, va( "%s", (char *)CG_GetStringEdString("MP_INGAME", "NOFPSET") ), UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite ); y += iPropHeight; } */ //[/VARIOUSMENU] } // Display the rules based on type y += iPropHeight; switch ( cgs.gametype ) { case GT_FFA: UI_DrawProportionalString( 320, y, va( "%s", (char *)CG_GetStringEdString("MP_INGAME", "RULES_FFA_1")), UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite ); y += iPropHeight; break; case GT_HOLOCRON: UI_DrawProportionalString( 320, y, va( "%s", (char *)CG_GetStringEdString("MP_INGAME", "RULES_HOLO_1")), UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite ); y += iPropHeight; UI_DrawProportionalString( 320, y, va( "%s", (char *)CG_GetStringEdString("MP_INGAME", "RULES_HOLO_2")), UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite ); y += iPropHeight; break; case GT_JEDIMASTER: UI_DrawProportionalString( 320, y, va( "%s", (char *)CG_GetStringEdString("MP_INGAME", "RULES_JEDI_1")), UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite ); y += iPropHeight; UI_DrawProportionalString( 320, y, va( "%s", (char *)CG_GetStringEdString("MP_INGAME", "RULES_JEDI_2")), UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite ); y += iPropHeight; break; case GT_SINGLE_PLAYER: break; case GT_DUEL: UI_DrawProportionalString( 320, y, va( "%s", (char *)CG_GetStringEdString("MP_INGAME", "RULES_DUEL_1")), UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite ); y += iPropHeight; UI_DrawProportionalString( 320, y, va( "%s", (char *)CG_GetStringEdString("MP_INGAME", "RULES_DUEL_2")), UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite ); y += iPropHeight; break; case GT_POWERDUEL: UI_DrawProportionalString( 320, y, va( "%s", (char *)CG_GetStringEdString("MP_INGAME", "RULES_POWERDUEL_1")), UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite ); y += iPropHeight; UI_DrawProportionalString( 320, y, va( "%s", (char *)CG_GetStringEdString("MP_INGAME", "RULES_POWERDUEL_2")), UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite ); y += iPropHeight; break; case GT_TEAM: UI_DrawProportionalString( 320, y, va( "%s", (char *)CG_GetStringEdString("MP_INGAME", "RULES_TEAM_1")), UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite ); y += iPropHeight; UI_DrawProportionalString( 320, y, va( "%s", (char *)CG_GetStringEdString("MP_INGAME", "RULES_TEAM_2")), UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite ); y += iPropHeight; break; case GT_SIEGE: break; case GT_CTF: UI_DrawProportionalString( 320, y, va( "%s", (char *)CG_GetStringEdString("MP_INGAME", "RULES_CTF_1")), UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite ); y += iPropHeight; UI_DrawProportionalString( 320, y, va( "%s", (char *)CG_GetStringEdString("MP_INGAME", "RULES_CTF_2")), UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite ); y += iPropHeight; break; case GT_CTY: UI_DrawProportionalString( 320, y, va( "%s", (char *)CG_GetStringEdString("MP_INGAME", "RULES_CTY_1")), UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite ); y += iPropHeight; UI_DrawProportionalString( 320, y, va( "%s", (char *)CG_GetStringEdString("MP_INGAME", "RULES_CTY_2")), UI_CENTER|UI_INFOFONT|UI_DROPSHADOW, colorWhite ); y += iPropHeight; break; default: break; } }
/* ================= PlayerIconhandle ================= */ static qhandle_t PlayerIconHandle( const char *modelAndSkin ) { char iconName[MAX_QPATH]; PlayerIcon( modelAndSkin, iconName, sizeof(iconName) ); return trap_R_RegisterShaderNoMip( iconName ); }
/* * UI_DrawPlayer */ void UI_DrawPlayer(float x, float y, float w, float h, Playerinfo *pi, int time) { Refdef refdef; Refent legs; Refent torso; Refent head; Refent gun; Refent barrel; Refent flash; Vec3 origin; int renderfx; Vec3 mins = {-16, -16, -24}; Vec3 maxs = {16, 16, 32}; float len; float xx; if(!pi->legsModel || !pi->torsoModel || !pi->headModel || !pi->animations[0].numFrames) 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_sndstartlocalsound(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; clearaxis(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 / 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; copyv3(origin, legs.origin); copyv3(origin, legs.lightingOrigin); legs.renderfx = renderfx; copyv3 (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; copyv3(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; copyv3(origin, head.lightingOrigin); UI_PositionRotatedEntityOnTag(&head, &torso, pi->torsoModel, "tag_head"); head.renderfx = renderfx; trap_R_AddRefEntityToScene(&head); /* * add the gun * */ if(pi->currentWeapon != Wnone){ memset(&gun, 0, sizeof(gun)); gun.hModel = pi->weaponModel; if(pi->currentWeapon == Wrailgun) byte4copy(pi->c1RGBA, gun.shaderRGBA); else byte4copy(colorWhite, gun.shaderRGBA); copyv3(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 == Wmachinegun || pi->realWeapon == Wmelee){ Vec3 angles; memset(&barrel, 0, sizeof(barrel)); copyv3(origin, barrel.lightingOrigin); barrel.renderfx = renderfx; barrel.hModel = pi->barrelModel; angles[YAW] = 0; angles[PITCH] = 0; angles[ROLL] = UI_MachinegunSpinAngle(pi); if(pi->realWeapon == Wmelee){ angles[PITCH] = angles[ROLL]; angles[ROLL] = 0; } eulertoaxis(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; if(pi->currentWeapon == Wrailgun) byte4copy(pi->c1RGBA, flash.shaderRGBA); else byte4copy(colorWhite, flash.shaderRGBA); copyv3(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/balloon4")); /* * 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); }
/* ================= ConfirmMenu_Cache ================= */ void ConfirmMenu_Cache( void ) { trap_R_RegisterShaderNoMip( ART_CONFIRM_FRAME ); }
void demoPlaybackInit(void) { char projectFile[MAX_OSPATH]; demo.length = trap_MME_DemoLength(); demo.initDone = qtrue; demo.autoLoad = qfalse; demo.play.time = 0; demo.play.lastTime = 0; demo.play.fraction = 0; demo.play.speed = 1.0; demo.play.paused = 0; demo.move.acceleration = 8; demo.move.friction = 8; demo.move.speed = 400; demo.line.locked = qfalse; demo.line.offset = 0; demo.line.speed = 1.0f; demo.line.points = 0; demo.loop.total = 0; demo.editType = editCamera; demo.viewType = viewChase; demo.camera.flags = CAM_ORIGIN | CAM_ANGLES; VectorClear( demo.chase.origin ); VectorClear( demo.chase.angles ); VectorClear( demo.chase.velocity ); demo.chase.distance = 0; demo.chase.locked = qfalse; demo.chase.target = -1; demo.dof.focus = 256.0f; demo.dof.radius = 5.0f; demo.dof.target = -1; demo.camera.target = -1; demo.camera.fov = 0; demo.camera.smoothPos = posBezier; demo.camera.smoothAngles = angleQuat; hudInitTables(); demoSynchMusic( -1, 0 ); demo.media.additiveWhiteShader = trap_R_RegisterShader( "mme_additiveWhite" ); demo.media.mouseCursor = trap_R_RegisterShaderNoMip( "menu/art/3_cursor2" ); demo.media.switchOn = trap_R_RegisterShaderNoMip( "menu/art/switch_on" ); demo.media.switchOff = trap_R_RegisterShaderNoMip( "menu/art/switch_off" ); trap_AddCommand("camera"); trap_AddCommand("edit"); trap_AddCommand("view"); trap_AddCommand("chase"); trap_AddCommand("dof"); trap_AddCommand("speed"); trap_AddCommand("pause"); trap_AddCommand("seek"); trap_AddCommand("demoSeek"); trap_AddCommand("find"); trap_AddCommand("capture"); trap_AddCommand("hudInit"); trap_AddCommand("hudToggle"); trap_AddCommand("line"); trap_AddCommand("save"); trap_AddCommand("load"); trap_AddCommand("effect"); trap_AddCommand("+seek"); trap_AddCommand("-seek"); trap_AddCommand("-seek"); trap_AddCommand("musicPlay"); trap_AddCommand("cut"); trap_SendConsoleCommand("exec mme.cfg\n"); trap_SendConsoleCommand("exec mmedemos.cfg\n"); trap_Cvar_Set( "mov_captureName", "" ); trap_Cvar_VariableStringBuffer( "mme_demoStartProject", projectFile, sizeof( projectFile )); if (projectFile[0]) { trap_Cvar_Set( "mme_demoStartProject", "" ); demo.autoLoad = demoProjectLoad( projectFile ); if (demo.autoLoad) { if (!demo.capture.start && !demo.capture.end) { trap_Error( "Loaded project file with empty capture range\n"); } /* Check if the project had a cvar for the name else use project */ if (!mov_captureName.string[0]) { trap_Cvar_Set( "mov_captureName", projectFile ); trap_Cvar_Update( &mov_captureName ); } trap_SendConsoleCommand("exec mmelist.cfg\n"); demo.play.time = demo.capture.start - 1000; demo.capture.locked = qtrue; demo.capture.active = qtrue; } else { trap_Error( va("Couldn't load project %s\n", projectFile )); } } }
/* =============== UI_DrawPlayerII A less FOV stretched version for drawing on the main menu =============== */ void UI_DrawPlayerII( 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 * 30.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.93 ); origin[1] = 1.0 * ( mins[1] + maxs[1] ); origin[2] = -2.7 * ( 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; // // 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 || pi->realWeapon == WP_GAUNTLET || pi->realWeapon == WP_BFG ) { 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, 0.3, 0.2, 0.8 ); origin[0] += 10; // + = behind, - = in front origin[1] += 80; // + = left, - = right origin[2] += 130; // + = above, - = below trap_R_AddLightToScene( origin, 250, 0.54, 0.89, 0.79 ); origin[0] -= 50; // + = behind, - = in front origin[1] -= 90; // + = left, - = right origin[2] -= 69; // + = above, - = below trap_R_AddLightToScene( origin, 350, 0.60, 0.03, 0.22 ); origin[0] -= 100; origin[1] -= 100; origin[2] -= 100; //trap_R_AddLightToScene( origin, 500, 0.8, 0.2, 0.1 ); // UI_ForceLegsAnim( pi, BOTH_POSE ); // leilei - pose hack // UI_ForceTorsoAnim( pi, BOTH_POSE ); trap_R_RenderScene( &refdef ); }
/* ================= CG_RegisterWeapon The server says this item is used on this level ================= */ void CG_RegisterWeapon( int weaponNum) { weaponInfo_t *weaponInfo; gitem_t *item, *ammo; char path[MAX_QPATH]; vec3_t mins, maxs; int i; weaponInfo = &cg_weapons[weaponNum]; if ( weaponNum == 0 ) { return; } if ( weaponInfo->registered ) { return; } memset( weaponInfo, 0, sizeof( *weaponInfo ) ); weaponInfo->registered = qtrue; for ( item = bg_itemlist + 1 ; item->classname ; item++ ) { if ( item->giType == IT_WEAPON && item->giTag == weaponNum ) { weaponInfo->item = item; break; } } if ( !item->classname ) { CG_Error( "Couldn't find weapon %i", weaponNum ); } CG_RegisterItemVisuals( item - bg_itemlist ); // load cmodel before model so filecache works weaponInfo->weaponModel = trap_R_RegisterModel( item->world_model[0] ); // load in-view model also weaponInfo->viewModel = trap_R_RegisterModel(item->view_model); // calc midpoint for rotation trap_R_ModelBounds( weaponInfo->weaponModel, mins, maxs ); for ( i = 0 ; i < 3 ; i++ ) { weaponInfo->weaponMidpoint[i] = mins[i] + 0.5 * ( maxs[i] - mins[i] ); } weaponInfo->weaponIcon = trap_R_RegisterShader( item->icon ); weaponInfo->ammoIcon = trap_R_RegisterShader( item->icon ); for ( ammo = bg_itemlist + 1 ; ammo->classname ; ammo++ ) { if ( ammo->giType == IT_AMMO && ammo->giTag == weaponNum ) { break; } } if ( ammo->classname && ammo->world_model[0] ) { weaponInfo->ammoModel = trap_R_RegisterModel( ammo->world_model[0] ); } // strcpy( path, item->view_model ); // COM_StripExtension( path, path ); // strcat( path, "_flash.md3" ); weaponInfo->flashModel = 0;//trap_R_RegisterModel( path ); if (weaponNum == WP_DISRUPTOR || weaponNum == WP_FLECHETTE || weaponNum == WP_REPEATER || weaponNum == WP_ROCKET_LAUNCHER) { strcpy( path, item->view_model ); COM_StripExtension( path, path ); strcat( path, "_barrel.md3" ); weaponInfo->barrelModel = trap_R_RegisterModel( path ); } else if (weaponNum == WP_STUN_BATON) { //only weapon with more than 1 barrel.. trap_R_RegisterModel("models/weapons2/stun_baton/baton_barrel.md3"); trap_R_RegisterModel("models/weapons2/stun_baton/baton_barrel2.md3"); trap_R_RegisterModel("models/weapons2/stun_baton/baton_barrel3.md3"); } else { weaponInfo->barrelModel = 0; } if (weaponNum != WP_SABER) { strcpy( path, item->view_model ); COM_StripExtension( path, path ); strcat( path, "_hand.md3" ); weaponInfo->handsModel = trap_R_RegisterModel( path ); } else { weaponInfo->handsModel = 0; } // if ( !weaponInfo->handsModel ) { // weaponInfo->handsModel = trap_R_RegisterModel( "models/weapons2/shotgun/shotgun_hand.md3" ); // } switch ( weaponNum ) { case WP_STUN_BATON: case WP_MELEE: /* MAKERGB( weaponInfo->flashDlightColor, 0.6f, 0.6f, 1.0f ); weaponInfo->firingSound = trap_S_RegisterSound( "sound/weapons/saber/saberhum.wav" ); // weaponInfo->flashSound[0] = trap_S_RegisterSound( "sound/weapons/melee/fstatck.wav" ); */ //trap_R_RegisterShader( "gfx/effects/stunPass" ); trap_FX_RegisterEffect( "stunBaton/flesh_impact" ); if (weaponNum == WP_STUN_BATON) { trap_S_RegisterSound( "sound/weapons/baton/idle.wav" ); weaponInfo->flashSound[0] = trap_S_RegisterSound( "sound/weapons/baton/fire.mp3" ); weaponInfo->altFlashSound[0] = trap_S_RegisterSound( "sound/weapons/baton/fire.mp3" ); } else { /* int j = 0; while (j < 4) { weaponInfo->flashSound[j] = trap_S_RegisterSound( va("sound/weapons/melee/swing%i", j+1) ); weaponInfo->altFlashSound[j] = weaponInfo->flashSound[j]; j++; } */ //No longer needed, animsound config plays them for us } break; case WP_SABER: MAKERGB( weaponInfo->flashDlightColor, 0.6f, 0.6f, 1.0f ); weaponInfo->firingSound = trap_S_RegisterSound( "sound/weapons/saber/saberhum1.wav" ); weaponInfo->missileModel = trap_R_RegisterModel( "models/weapons2/saber/saber_w.glm" ); break; case WP_CONCUSSION: weaponInfo->selectSound = trap_S_RegisterSound("sound/weapons/concussion/select.wav"); weaponInfo->flashSound[0] = NULL_SOUND; weaponInfo->firingSound = NULL_SOUND; weaponInfo->chargeSound = NULL_SOUND; weaponInfo->muzzleEffect = trap_FX_RegisterEffect( "concussion/muzzle_flash" ); weaponInfo->missileModel = NULL_HANDLE; weaponInfo->missileSound = NULL_SOUND; weaponInfo->missileDlight = 0; //weaponInfo->missileDlightColor= {0,0,0}; weaponInfo->missileHitSound = NULL_SOUND; weaponInfo->missileTrailFunc = FX_ConcussionProjectileThink; weaponInfo->altFlashSound[0] = NULL_SOUND; weaponInfo->altFiringSound = NULL_SOUND; weaponInfo->altChargeSound = trap_S_RegisterSound( "sound/weapons/bryar/altcharge.wav"); weaponInfo->altMuzzleEffect = trap_FX_RegisterEffect( "concussion/altmuzzle_flash" ); weaponInfo->altMissileModel = NULL_HANDLE; weaponInfo->altMissileSound = NULL_SOUND; weaponInfo->altMissileDlight = 0; //weaponInfo->altMissileDlightColor= {0,0,0}; weaponInfo->altMissileHitSound = NULL_SOUND; weaponInfo->altMissileTrailFunc = FX_ConcussionProjectileThink; cgs.effects.disruptorAltMissEffect = trap_FX_RegisterEffect( "disruptor/alt_miss" ); cgs.effects.concussionShotEffect = trap_FX_RegisterEffect( "concussion/shot" ); cgs.effects.concussionImpactEffect = trap_FX_RegisterEffect( "concussion/explosion" ); trap_R_RegisterShader("gfx/effects/blueLine"); trap_R_RegisterShader("gfx/misc/whiteline2"); break; case WP_BRYAR_PISTOL: case WP_BRYAR_OLD: weaponInfo->selectSound = trap_S_RegisterSound("sound/weapons/bryar/select.wav"); weaponInfo->flashSound[0] = trap_S_RegisterSound( "sound/weapons/bryar/fire.wav"); weaponInfo->firingSound = NULL_SOUND; weaponInfo->chargeSound = NULL_SOUND; weaponInfo->muzzleEffect = trap_FX_RegisterEffect( "bryar/muzzle_flash" ); weaponInfo->missileModel = NULL_HANDLE; weaponInfo->missileSound = NULL_SOUND; weaponInfo->missileDlight = 0; //weaponInfo->missileDlightColor= {0,0,0}; weaponInfo->missileHitSound = NULL_SOUND; weaponInfo->missileTrailFunc = FX_BryarProjectileThink; weaponInfo->altFlashSound[0] = trap_S_RegisterSound( "sound/weapons/bryar/alt_fire.wav"); weaponInfo->altFiringSound = NULL_SOUND; weaponInfo->altChargeSound = trap_S_RegisterSound( "sound/weapons/bryar/altcharge.wav"); weaponInfo->altMuzzleEffect = trap_FX_RegisterEffect( "bryar/muzzle_flash" ); weaponInfo->altMissileModel = NULL_HANDLE; weaponInfo->altMissileSound = NULL_SOUND; weaponInfo->altMissileDlight = 0; //weaponInfo->altMissileDlightColor= {0,0,0}; weaponInfo->altMissileHitSound = NULL_SOUND; weaponInfo->altMissileTrailFunc = FX_BryarAltProjectileThink; cgs.effects.bryarShotEffect = trap_FX_RegisterEffect( "bryar/shot" ); cgs.effects.bryarPowerupShotEffect = trap_FX_RegisterEffect( "bryar/crackleShot" ); cgs.effects.bryarWallImpactEffect = trap_FX_RegisterEffect( "bryar/wall_impact" ); cgs.effects.bryarWallImpactEffect2 = trap_FX_RegisterEffect( "bryar/wall_impact2" ); cgs.effects.bryarWallImpactEffect3 = trap_FX_RegisterEffect( "bryar/wall_impact3" ); cgs.effects.bryarFleshImpactEffect = trap_FX_RegisterEffect( "bryar/flesh_impact" ); cgs.effects.bryarDroidImpactEffect = trap_FX_RegisterEffect( "bryar/droid_impact" ); cgs.media.bryarFrontFlash = trap_R_RegisterShader( "gfx/effects/bryarFrontFlash" ); // Note these are temp shared effects trap_FX_RegisterEffect("blaster/wall_impact.efx"); trap_FX_RegisterEffect("blaster/flesh_impact.efx"); break; case WP_BLASTER: case WP_EMPLACED_GUN: //rww - just use the same as this for now.. weaponInfo->selectSound = trap_S_RegisterSound("sound/weapons/blaster/select.wav"); weaponInfo->flashSound[0] = trap_S_RegisterSound( "sound/weapons/blaster/fire.wav"); weaponInfo->firingSound = NULL_SOUND; weaponInfo->chargeSound = NULL_SOUND; weaponInfo->muzzleEffect = trap_FX_RegisterEffect( "blaster/muzzle_flash" ); weaponInfo->missileModel = NULL_HANDLE; weaponInfo->missileSound = NULL_SOUND; weaponInfo->missileDlight = 0; // weaponInfo->missileDlightColor = {0,0,0}; weaponInfo->missileHitSound = NULL_SOUND; weaponInfo->missileTrailFunc = FX_BlasterProjectileThink; weaponInfo->altFlashSound[0] = trap_S_RegisterSound( "sound/weapons/blaster/alt_fire.wav"); weaponInfo->altFiringSound = NULL_SOUND; weaponInfo->altChargeSound = NULL_SOUND; weaponInfo->altMuzzleEffect = trap_FX_RegisterEffect( "blaster/muzzle_flash" ); weaponInfo->altMissileModel = NULL_HANDLE; weaponInfo->altMissileSound = NULL_SOUND; weaponInfo->altMissileDlight = 0; // weaponInfo->altMissileDlightColor= {0,0,0}; weaponInfo->altMissileHitSound = NULL_SOUND; weaponInfo->altMissileTrailFunc = FX_BlasterProjectileThink; trap_FX_RegisterEffect( "blaster/deflect" ); cgs.effects.blasterShotEffect = trap_FX_RegisterEffect( "blaster/shot" ); cgs.effects.blasterWallImpactEffect = trap_FX_RegisterEffect( "blaster/wall_impact" ); cgs.effects.blasterFleshImpactEffect = trap_FX_RegisterEffect( "blaster/flesh_impact" ); cgs.effects.blasterDroidImpactEffect = trap_FX_RegisterEffect( "blaster/droid_impact" ); break; case WP_DISRUPTOR: weaponInfo->selectSound = trap_S_RegisterSound("sound/weapons/disruptor/select.wav"); weaponInfo->flashSound[0] = trap_S_RegisterSound( "sound/weapons/disruptor/fire.wav"); weaponInfo->firingSound = NULL_SOUND; weaponInfo->chargeSound = NULL_SOUND; weaponInfo->muzzleEffect = trap_FX_RegisterEffect( "disruptor/muzzle_flash" ); weaponInfo->missileModel = NULL_HANDLE; weaponInfo->missileSound = NULL_SOUND; weaponInfo->missileDlight = 0; // weaponInfo->missileDlightColor = {0,0,0}; weaponInfo->missileHitSound = NULL_SOUND; weaponInfo->missileTrailFunc = 0; weaponInfo->altFlashSound[0] = trap_S_RegisterSound( "sound/weapons/disruptor/alt_fire.wav"); weaponInfo->altFiringSound = NULL_SOUND; weaponInfo->altChargeSound = trap_S_RegisterSound("sound/weapons/disruptor/altCharge.wav"); weaponInfo->altMuzzleEffect = trap_FX_RegisterEffect( "disruptor/muzzle_flash" ); weaponInfo->altMissileModel = NULL_HANDLE; weaponInfo->altMissileSound = NULL_SOUND; weaponInfo->altMissileDlight = 0; // weaponInfo->altMissileDlightColor= {0,0,0}; weaponInfo->altMissileHitSound = NULL_SOUND; weaponInfo->altMissileTrailFunc = 0; cgs.effects.disruptorRingsEffect = trap_FX_RegisterEffect( "disruptor/rings" ); cgs.effects.disruptorProjectileEffect = trap_FX_RegisterEffect( "disruptor/shot" ); cgs.effects.disruptorWallImpactEffect = trap_FX_RegisterEffect( "disruptor/wall_impact" ); cgs.effects.disruptorFleshImpactEffect = trap_FX_RegisterEffect( "disruptor/flesh_impact" ); cgs.effects.disruptorAltMissEffect = trap_FX_RegisterEffect( "disruptor/alt_miss" ); cgs.effects.disruptorAltHitEffect = trap_FX_RegisterEffect( "disruptor/alt_hit" ); trap_R_RegisterShader( "gfx/effects/redLine" ); trap_R_RegisterShader( "gfx/misc/whiteline2" ); trap_R_RegisterShader( "gfx/effects/smokeTrail" ); trap_S_RegisterSound("sound/weapons/disruptor/zoomstart.wav"); trap_S_RegisterSound("sound/weapons/disruptor/zoomend.wav"); // Disruptor gun zoom interface cgs.media.disruptorMask = trap_R_RegisterShader( "gfx/2d/cropCircle2"); cgs.media.disruptorInsert = trap_R_RegisterShader( "gfx/2d/cropCircle"); cgs.media.disruptorLight = trap_R_RegisterShader( "gfx/2d/cropCircleGlow" ); cgs.media.disruptorInsertTick = trap_R_RegisterShader( "gfx/2d/insertTick" ); cgs.media.disruptorChargeShader = trap_R_RegisterShaderNoMip("gfx/2d/crop_charge"); cgs.media.disruptorZoomLoop = trap_S_RegisterSound( "sound/weapons/disruptor/zoomloop.wav" ); break; case WP_BOWCASTER: weaponInfo->selectSound = trap_S_RegisterSound("sound/weapons/bowcaster/select.wav"); weaponInfo->altFlashSound[0] = trap_S_RegisterSound( "sound/weapons/bowcaster/fire.wav"); weaponInfo->altFiringSound = NULL_SOUND; weaponInfo->altChargeSound = NULL_SOUND; weaponInfo->altMuzzleEffect = trap_FX_RegisterEffect( "bowcaster/muzzle_flash" ); weaponInfo->altMissileModel = NULL_HANDLE; weaponInfo->altMissileSound = NULL_SOUND; weaponInfo->altMissileDlight = 0; // weaponInfo->altMissileDlightColor = {0,0,0}; weaponInfo->altMissileHitSound = NULL_SOUND; weaponInfo->altMissileTrailFunc = FX_BowcasterProjectileThink; weaponInfo->flashSound[0] = trap_S_RegisterSound( "sound/weapons/bowcaster/fire.wav"); weaponInfo->firingSound = NULL_SOUND; weaponInfo->chargeSound = trap_S_RegisterSound( "sound/weapons/bowcaster/altcharge.wav"); weaponInfo->muzzleEffect = trap_FX_RegisterEffect( "bowcaster/muzzle_flash" ); weaponInfo->missileModel = NULL_HANDLE; weaponInfo->missileSound = NULL_SOUND; weaponInfo->missileDlight = 0; // weaponInfo->missileDlightColor= {0,0,0}; weaponInfo->missileHitSound = NULL_SOUND; weaponInfo->missileTrailFunc = FX_BowcasterAltProjectileThink; cgs.effects.bowcasterShotEffect = trap_FX_RegisterEffect( "bowcaster/shot" ); cgs.effects.bowcasterImpactEffect = trap_FX_RegisterEffect( "bowcaster/explosion" ); trap_FX_RegisterEffect( "bowcaster/deflect" ); cgs.media.greenFrontFlash = trap_R_RegisterShader( "gfx/effects/greenFrontFlash" ); break; case WP_REPEATER: weaponInfo->selectSound = trap_S_RegisterSound("sound/weapons/repeater/select.wav"); weaponInfo->flashSound[0] = trap_S_RegisterSound( "sound/weapons/repeater/fire.wav"); weaponInfo->firingSound = NULL_SOUND; weaponInfo->chargeSound = NULL_SOUND; weaponInfo->muzzleEffect = trap_FX_RegisterEffect( "repeater/muzzle_flash" ); weaponInfo->missileModel = NULL_HANDLE; weaponInfo->missileSound = NULL_SOUND; weaponInfo->missileDlight = 0; // weaponInfo->missileDlightColor = {0,0,0}; weaponInfo->missileHitSound = NULL_SOUND; weaponInfo->missileTrailFunc = FX_RepeaterProjectileThink; weaponInfo->altFlashSound[0] = trap_S_RegisterSound( "sound/weapons/repeater/alt_fire.wav"); weaponInfo->altFiringSound = NULL_SOUND; weaponInfo->altChargeSound = NULL_SOUND; weaponInfo->altMuzzleEffect = trap_FX_RegisterEffect( "repeater/muzzle_flash" ); weaponInfo->altMissileModel = NULL_HANDLE; weaponInfo->altMissileSound = NULL_SOUND; weaponInfo->altMissileDlight = 0; // weaponInfo->altMissileDlightColor= {0,0,0}; weaponInfo->altMissileHitSound = NULL_SOUND; weaponInfo->altMissileTrailFunc = FX_RepeaterAltProjectileThink; cgs.effects.repeaterProjectileEffect = trap_FX_RegisterEffect( "repeater/projectile" ); cgs.effects.repeaterAltProjectileEffect = trap_FX_RegisterEffect( "repeater/alt_projectile" ); cgs.effects.repeaterWallImpactEffect = trap_FX_RegisterEffect( "repeater/wall_impact" ); cgs.effects.repeaterFleshImpactEffect = trap_FX_RegisterEffect( "repeater/flesh_impact" ); //cgs.effects.repeaterAltWallImpactEffect = trap_FX_RegisterEffect( "repeater/alt_wall_impact" ); cgs.effects.repeaterAltWallImpactEffect = trap_FX_RegisterEffect( "repeater/concussion" ); break; case WP_DEMP2: weaponInfo->selectSound = trap_S_RegisterSound("sound/weapons/demp2/select.wav"); weaponInfo->flashSound[0] = trap_S_RegisterSound("sound/weapons/demp2/fire.wav"); weaponInfo->firingSound = NULL_SOUND; weaponInfo->chargeSound = NULL_SOUND; weaponInfo->muzzleEffect = trap_FX_RegisterEffect("demp2/muzzle_flash"); weaponInfo->missileModel = NULL_HANDLE; weaponInfo->missileSound = NULL_SOUND; weaponInfo->missileDlight = 0; // weaponInfo->missileDlightColor = {0,0,0}; weaponInfo->missileHitSound = NULL_SOUND; weaponInfo->missileTrailFunc = FX_DEMP2_ProjectileThink; weaponInfo->altFlashSound[0] = trap_S_RegisterSound("sound/weapons/demp2/altfire.wav"); weaponInfo->altFiringSound = NULL_SOUND; weaponInfo->altChargeSound = trap_S_RegisterSound("sound/weapons/demp2/altCharge.wav"); weaponInfo->altMuzzleEffect = trap_FX_RegisterEffect("demp2/muzzle_flash"); weaponInfo->altMissileModel = NULL_HANDLE; weaponInfo->altMissileSound = NULL_SOUND; weaponInfo->altMissileDlight = 0; // weaponInfo->altMissileDlightColor= {0,0,0}; weaponInfo->altMissileHitSound = NULL_SOUND; weaponInfo->altMissileTrailFunc = 0; cgs.effects.demp2ProjectileEffect = trap_FX_RegisterEffect( "demp2/projectile" ); cgs.effects.demp2WallImpactEffect = trap_FX_RegisterEffect( "demp2/wall_impact" ); cgs.effects.demp2FleshImpactEffect = trap_FX_RegisterEffect( "demp2/flesh_impact" ); cgs.media.demp2Shell = trap_R_RegisterModel( "models/items/sphere.md3" ); cgs.media.demp2ShellShader = trap_R_RegisterShader( "gfx/effects/demp2shell" ); cgs.media.lightningFlash = trap_R_RegisterShader("gfx/misc/lightningFlash"); break; case WP_FLECHETTE: weaponInfo->selectSound = trap_S_RegisterSound("sound/weapons/flechette/select.wav"); weaponInfo->flashSound[0] = trap_S_RegisterSound( "sound/weapons/flechette/fire.wav"); weaponInfo->firingSound = NULL_SOUND; weaponInfo->chargeSound = NULL_SOUND; weaponInfo->muzzleEffect = trap_FX_RegisterEffect( "flechette/muzzle_flash" ); weaponInfo->missileModel = trap_R_RegisterModel("models/weapons2/golan_arms/projectileMain.md3"); weaponInfo->missileSound = NULL_SOUND; weaponInfo->missileDlight = 0; // weaponInfo->missileDlightColor = {0,0,0}; weaponInfo->missileHitSound = NULL_SOUND; weaponInfo->missileTrailFunc = FX_FlechetteProjectileThink; weaponInfo->altFlashSound[0] = trap_S_RegisterSound( "sound/weapons/flechette/alt_fire.wav"); weaponInfo->altFiringSound = NULL_SOUND; weaponInfo->altChargeSound = NULL_SOUND; weaponInfo->altMuzzleEffect = trap_FX_RegisterEffect( "flechette/muzzle_flash" ); weaponInfo->altMissileModel = trap_R_RegisterModel( "models/weapons2/golan_arms/projectile.md3" ); weaponInfo->altMissileSound = NULL_SOUND; weaponInfo->altMissileDlight = 0; // weaponInfo->altMissileDlightColor= {0,0,0}; weaponInfo->altMissileHitSound = NULL_SOUND; weaponInfo->altMissileTrailFunc = FX_FlechetteAltProjectileThink; cgs.effects.flechetteShotEffect = trap_FX_RegisterEffect( "flechette/shot" ); cgs.effects.flechetteAltShotEffect = trap_FX_RegisterEffect( "flechette/alt_shot" ); cgs.effects.flechetteWallImpactEffect = trap_FX_RegisterEffect( "flechette/wall_impact" ); cgs.effects.flechetteFleshImpactEffect = trap_FX_RegisterEffect( "flechette/flesh_impact" ); break; case WP_ROCKET_LAUNCHER: weaponInfo->selectSound = trap_S_RegisterSound("sound/weapons/rocket/select.wav"); weaponInfo->flashSound[0] = trap_S_RegisterSound( "sound/weapons/rocket/fire.wav"); weaponInfo->firingSound = NULL_SOUND; weaponInfo->chargeSound = NULL_SOUND; weaponInfo->muzzleEffect = trap_FX_RegisterEffect( "rocket/muzzle_flash" ); //trap_FX_RegisterEffect( "rocket/muzzle_flash2" ); //flash2 still looks crappy with the fx bolt stuff. Because the fx bolt stuff doesn't work entirely right. weaponInfo->missileModel = trap_R_RegisterModel( "models/weapons2/merr_sonn/projectile.md3" ); weaponInfo->missileSound = trap_S_RegisterSound( "sound/weapons/rocket/missleloop.wav"); weaponInfo->missileDlight = 125; VectorSet(weaponInfo->missileDlightColor, 1.0, 1.0, 0.5); weaponInfo->missileHitSound = NULL_SOUND; weaponInfo->missileTrailFunc = FX_RocketProjectileThink; weaponInfo->altFlashSound[0] = trap_S_RegisterSound( "sound/weapons/rocket/alt_fire.wav"); weaponInfo->altFiringSound = NULL_SOUND; weaponInfo->altChargeSound = NULL_SOUND; weaponInfo->altMuzzleEffect = trap_FX_RegisterEffect( "rocket/altmuzzle_flash" ); weaponInfo->altMissileModel = trap_R_RegisterModel( "models/weapons2/merr_sonn/projectile.md3" ); weaponInfo->altMissileSound = trap_S_RegisterSound( "sound/weapons/rocket/missleloop.wav"); weaponInfo->altMissileDlight = 125; VectorSet(weaponInfo->altMissileDlightColor, 1.0, 1.0, 0.5); weaponInfo->altMissileHitSound = NULL_SOUND; weaponInfo->altMissileTrailFunc = FX_RocketAltProjectileThink; cgs.effects.rocketShotEffect = trap_FX_RegisterEffect( "rocket/shot" ); cgs.effects.rocketExplosionEffect = trap_FX_RegisterEffect( "rocket/explosion" ); trap_R_RegisterShaderNoMip( "gfx/2d/wedge" ); trap_R_RegisterShaderNoMip( "gfx/2d/lock" ); trap_S_RegisterSound( "sound/weapons/rocket/lock.wav" ); trap_S_RegisterSound( "sound/weapons/rocket/tick.wav" ); break; case WP_THERMAL: weaponInfo->selectSound = trap_S_RegisterSound("sound/weapons/thermal/select.wav"); weaponInfo->flashSound[0] = trap_S_RegisterSound( "sound/weapons/thermal/fire.wav"); weaponInfo->firingSound = NULL_SOUND; weaponInfo->chargeSound = trap_S_RegisterSound( "sound/weapons/thermal/charge.wav"); weaponInfo->muzzleEffect = NULL_FX; weaponInfo->missileModel = trap_R_RegisterModel( "models/weapons2/thermal/thermal_proj.md3" ); weaponInfo->missileSound = NULL_SOUND; weaponInfo->missileDlight = 0; // weaponInfo->missileDlightColor = {0,0,0}; weaponInfo->missileHitSound = NULL_SOUND; weaponInfo->missileTrailFunc = 0; weaponInfo->altFlashSound[0] = trap_S_RegisterSound( "sound/weapons/thermal/fire.wav"); weaponInfo->altFiringSound = NULL_SOUND; weaponInfo->altChargeSound = trap_S_RegisterSound( "sound/weapons/thermal/charge.wav"); weaponInfo->altMuzzleEffect = NULL_FX; weaponInfo->altMissileModel = trap_R_RegisterModel( "models/weapons2/thermal/thermal_proj.md3" ); weaponInfo->altMissileSound = NULL_SOUND; weaponInfo->altMissileDlight = 0; // weaponInfo->altMissileDlightColor= {0,0,0}; weaponInfo->altMissileHitSound = NULL_SOUND; weaponInfo->altMissileTrailFunc = 0; cgs.effects.thermalExplosionEffect = trap_FX_RegisterEffect( "thermal/explosion" ); cgs.effects.thermalShockwaveEffect = trap_FX_RegisterEffect( "thermal/shockwave" ); cgs.media.grenadeBounce1 = trap_S_RegisterSound( "sound/weapons/thermal/bounce1.wav" ); cgs.media.grenadeBounce2 = trap_S_RegisterSound( "sound/weapons/thermal/bounce2.wav" ); trap_S_RegisterSound( "sound/weapons/thermal/thermloop.wav" ); trap_S_RegisterSound( "sound/weapons/thermal/warning.wav" ); break; case WP_TRIP_MINE: weaponInfo->selectSound = trap_S_RegisterSound("sound/weapons/detpack/select.wav"); weaponInfo->flashSound[0] = trap_S_RegisterSound( "sound/weapons/laser_trap/fire.wav"); weaponInfo->firingSound = NULL_SOUND; weaponInfo->chargeSound = NULL_SOUND; weaponInfo->muzzleEffect = NULL_FX; weaponInfo->missileModel = 0;//trap_R_RegisterModel( "models/weapons2/laser_trap/laser_trap_w.md3" ); weaponInfo->missileSound = NULL_SOUND; weaponInfo->missileDlight = 0; // weaponInfo->missileDlightColor = {0,0,0}; weaponInfo->missileHitSound = NULL_SOUND; weaponInfo->missileTrailFunc = 0; weaponInfo->altFlashSound[0] = trap_S_RegisterSound( "sound/weapons/laser_trap/fire.wav"); weaponInfo->altFiringSound = NULL_SOUND; weaponInfo->altChargeSound = NULL_SOUND; weaponInfo->altMuzzleEffect = NULL_FX; weaponInfo->altMissileModel = 0;//trap_R_RegisterModel( "models/weapons2/laser_trap/laser_trap_w.md3" ); weaponInfo->altMissileSound = NULL_SOUND; weaponInfo->altMissileDlight = 0; // weaponInfo->altMissileDlightColor= {0,0,0}; weaponInfo->altMissileHitSound = NULL_SOUND; weaponInfo->altMissileTrailFunc = 0; cgs.effects.tripmineLaserFX = trap_FX_RegisterEffect("tripMine/laserMP.efx"); cgs.effects.tripmineGlowFX = trap_FX_RegisterEffect("tripMine/glowbit.efx"); trap_FX_RegisterEffect( "tripMine/explosion" ); // NOTENOTE temp stuff trap_S_RegisterSound( "sound/weapons/laser_trap/stick.wav" ); trap_S_RegisterSound( "sound/weapons/laser_trap/warning.wav" ); break; case WP_DET_PACK: weaponInfo->selectSound = trap_S_RegisterSound("sound/weapons/detpack/select.wav"); weaponInfo->flashSound[0] = trap_S_RegisterSound( "sound/weapons/detpack/fire.wav"); weaponInfo->firingSound = NULL_SOUND; weaponInfo->chargeSound = NULL_SOUND; weaponInfo->muzzleEffect = NULL_FX; weaponInfo->missileModel = trap_R_RegisterModel( "models/weapons2/detpack/det_pack.md3" ); weaponInfo->missileSound = NULL_SOUND; weaponInfo->missileDlight = 0; // weaponInfo->missileDlightColor = {0,0,0}; weaponInfo->missileHitSound = NULL_SOUND; weaponInfo->missileTrailFunc = 0; weaponInfo->altFlashSound[0] = trap_S_RegisterSound( "sound/weapons/detpack/fire.wav"); weaponInfo->altFiringSound = NULL_SOUND; weaponInfo->altChargeSound = NULL_SOUND; weaponInfo->altMuzzleEffect = NULL_FX; weaponInfo->altMissileModel = trap_R_RegisterModel( "models/weapons2/detpack/det_pack.md3" ); weaponInfo->altMissileSound = NULL_SOUND; weaponInfo->altMissileDlight = 0; // weaponInfo->altMissileDlightColor= {0,0,0}; weaponInfo->altMissileHitSound = NULL_SOUND; weaponInfo->altMissileTrailFunc = 0; trap_R_RegisterModel( "models/weapons2/detpack/det_pack.md3" ); trap_S_RegisterSound( "sound/weapons/detpack/stick.wav" ); trap_S_RegisterSound( "sound/weapons/detpack/warning.wav" ); trap_S_RegisterSound( "sound/weapons/explosions/explode5.wav" ); break; case WP_TURRET: weaponInfo->flashSound[0] = NULL_SOUND; weaponInfo->firingSound = NULL_SOUND; weaponInfo->chargeSound = NULL_SOUND; weaponInfo->muzzleEffect = NULL_HANDLE; weaponInfo->missileModel = NULL_HANDLE; weaponInfo->missileSound = NULL_SOUND; weaponInfo->missileDlight = 0; weaponInfo->missileHitSound = NULL_SOUND; weaponInfo->missileTrailFunc = FX_TurretProjectileThink; trap_FX_RegisterEffect("effects/blaster/wall_impact.efx"); trap_FX_RegisterEffect("effects/blaster/flesh_impact.efx"); break; default: MAKERGB( weaponInfo->flashDlightColor, 1, 1, 1 ); weaponInfo->flashSound[0] = trap_S_RegisterSound( "sound/weapons/rocket/rocklf1a.wav" ); break; } }
void BG_SiegeParseClassFile(const char *filename, siegeClassDesc_t *descBuffer) { fileHandle_t f; int len; int i; char classInfo[4096]; char parseBuf[4096]; len = trap_FS_FOpenFile(filename, &f, FS_READ); if (!f || len >= 4096) { return; } trap_FS_Read(classInfo, len, f); trap_FS_FCloseFile(f); classInfo[len] = 0; //first get the description if we have a buffer for it if (descBuffer) { if (!BG_SiegeGetPairedValue(classInfo, "description", descBuffer->desc)) { strcpy(descBuffer->desc, "DESCRIPTION UNAVAILABLE"); } //Hit this assert? Memory has already been trashed. Increase //SIEGE_CLASS_DESC_LEN. assert(strlen(descBuffer->desc) < SIEGE_CLASS_DESC_LEN); } BG_SiegeGetValueGroup(classInfo, "ClassInfo", classInfo); //Parse name if (BG_SiegeGetPairedValue(classInfo, "name", parseBuf)) { strcpy(bgSiegeClasses[bgNumSiegeClasses].name, parseBuf); } else { Com_Error(ERR_DROP, "Siege class without name entry"); } //Parse forced model if (BG_SiegeGetPairedValue(classInfo, "model", parseBuf)) { strcpy(bgSiegeClasses[bgNumSiegeClasses].forcedModel, parseBuf); } else { //It's ok if there isn't one, it's optional. bgSiegeClasses[bgNumSiegeClasses].forcedModel[0] = 0; } //Parse forced skin if (BG_SiegeGetPairedValue(classInfo, "skin", parseBuf)) { strcpy(bgSiegeClasses[bgNumSiegeClasses].forcedSkin, parseBuf); } else { //It's ok if there isn't one, it's optional. bgSiegeClasses[bgNumSiegeClasses].forcedSkin[0] = 0; } //Parse first saber if (BG_SiegeGetPairedValue(classInfo, "saber1", parseBuf)) { strcpy(bgSiegeClasses[bgNumSiegeClasses].saber1, parseBuf); } else { //It's ok if there isn't one, it's optional. bgSiegeClasses[bgNumSiegeClasses].saber1[0] = 0; } //Parse second saber if (BG_SiegeGetPairedValue(classInfo, "saber2", parseBuf)) { strcpy(bgSiegeClasses[bgNumSiegeClasses].saber2, parseBuf); } else { //It's ok if there isn't one, it's optional. bgSiegeClasses[bgNumSiegeClasses].saber2[0] = 0; } //Parse forced saber stance if (BG_SiegeGetPairedValue(classInfo, "saberstyle", parseBuf)) { bgSiegeClasses[bgNumSiegeClasses].saberStance = BG_SiegeTranslateGenericTable(parseBuf, StanceTable, qtrue); } else { //It's ok if there isn't one, it's optional. bgSiegeClasses[bgNumSiegeClasses].saberStance = 0; } //Parse forced saber color if (BG_SiegeGetPairedValue(classInfo, "sabercolor", parseBuf)) { bgSiegeClasses[bgNumSiegeClasses].forcedSaberColor = atoi(parseBuf); bgSiegeClasses[bgNumSiegeClasses].hasForcedSaberColor = qtrue; } else { //It's ok if there isn't one, it's optional. bgSiegeClasses[bgNumSiegeClasses].hasForcedSaberColor = qfalse; } //Parse forced saber2 color if (BG_SiegeGetPairedValue(classInfo, "saber2color", parseBuf)) { bgSiegeClasses[bgNumSiegeClasses].forcedSaber2Color = atoi(parseBuf); bgSiegeClasses[bgNumSiegeClasses].hasForcedSaber2Color = qtrue; } else { //It's ok if there isn't one, it's optional. bgSiegeClasses[bgNumSiegeClasses].hasForcedSaber2Color = qfalse; } //Parse weapons if (BG_SiegeGetPairedValue(classInfo, "weapons", parseBuf)) { bgSiegeClasses[bgNumSiegeClasses].weapons = BG_SiegeTranslateGenericTable(parseBuf, WPTable, qtrue); } else { Com_Error(ERR_DROP, "Siege class without weapons entry"); } if (!(bgSiegeClasses[bgNumSiegeClasses].weapons & (1 << WP_SABER))) { //make sure it has melee if there's no saber bgSiegeClasses[bgNumSiegeClasses].weapons |= (1 << WP_MELEE); //always give them this too if they are not a saber user //bgSiegeClasses[bgNumSiegeClasses].weapons |= (1 << WP_BRYAR_PISTOL); } //Parse forcepowers if (BG_SiegeGetPairedValue(classInfo, "forcepowers", parseBuf)) { BG_SiegeTranslateForcePowers(parseBuf, &bgSiegeClasses[bgNumSiegeClasses]); } else { //fine, clear out the powers. i = 0; while (i < NUM_FORCE_POWERS) { bgSiegeClasses[bgNumSiegeClasses].forcePowerLevels[i] = 0; i++; } } //Parse classflags if (BG_SiegeGetPairedValue(classInfo, "classflags", parseBuf)) { bgSiegeClasses[bgNumSiegeClasses].classflags = BG_SiegeTranslateGenericTable(parseBuf, bgSiegeClassFlagNames, qtrue); } else { //fine, we'll 0 it. bgSiegeClasses[bgNumSiegeClasses].classflags = 0; } //Parse maxhealth if (BG_SiegeGetPairedValue(classInfo, "maxhealth", parseBuf)) { bgSiegeClasses[bgNumSiegeClasses].maxhealth = atoi(parseBuf); } else { //It's alright, just default to 100 then. bgSiegeClasses[bgNumSiegeClasses].maxhealth = 100; } //Parse starthealth if (BG_SiegeGetPairedValue(classInfo, "starthealth", parseBuf)) { bgSiegeClasses[bgNumSiegeClasses].starthealth = atoi(parseBuf); } else { //It's alright, just default to 100 then. bgSiegeClasses[bgNumSiegeClasses].starthealth = bgSiegeClasses[bgNumSiegeClasses].maxhealth; } //Parse startarmor if (BG_SiegeGetPairedValue(classInfo, "maxarmor", parseBuf)) { bgSiegeClasses[bgNumSiegeClasses].maxarmor = atoi(parseBuf); } else { //It's alright, just default to 0 then. bgSiegeClasses[bgNumSiegeClasses].maxarmor = 0; } //Parse startarmor if (BG_SiegeGetPairedValue(classInfo, "startarmor", parseBuf)) { bgSiegeClasses[bgNumSiegeClasses].startarmor = atoi(parseBuf); if (!bgSiegeClasses[bgNumSiegeClasses].maxarmor) { //if they didn't specify a damn max armor then use this. bgSiegeClasses[bgNumSiegeClasses].maxarmor = bgSiegeClasses[bgNumSiegeClasses].startarmor; } } else { //default to maxarmor. bgSiegeClasses[bgNumSiegeClasses].startarmor = bgSiegeClasses[bgNumSiegeClasses].maxarmor; } //Parse speed (this is a multiplier value) if (BG_SiegeGetPairedValue(classInfo, "speed", parseBuf)) { bgSiegeClasses[bgNumSiegeClasses].speed = atof(parseBuf); } else { //It's alright, just default to 1 then. bgSiegeClasses[bgNumSiegeClasses].speed = 1.0f; } //Parse shader for ui to use if (BG_SiegeGetPairedValue(classInfo, "uishader", parseBuf)) { #ifdef QAGAME bgSiegeClasses[bgNumSiegeClasses].uiPortraitShader = 0; memset(bgSiegeClasses[bgNumSiegeClasses].uiPortrait,0,sizeof(bgSiegeClasses[bgNumSiegeClasses].uiPortrait)); #elif defined CGAME bgSiegeClasses[bgNumSiegeClasses].uiPortraitShader = 0; memset(bgSiegeClasses[bgNumSiegeClasses].uiPortrait,0,sizeof(bgSiegeClasses[bgNumSiegeClasses].uiPortrait)); #else //ui bgSiegeClasses[bgNumSiegeClasses].uiPortraitShader = trap_R_RegisterShaderNoMip(parseBuf); memcpy(bgSiegeClasses[bgNumSiegeClasses].uiPortrait,parseBuf,sizeof(bgSiegeClasses[bgNumSiegeClasses].uiPortrait)); #endif } else { //I guess this is an essential.. we don't want to render bad shaders or anything. Com_Error(ERR_DROP, "Siege class without uishader entry"); } //Parse shader for ui to use if (BG_SiegeGetPairedValue(classInfo, "class_shader", parseBuf)) { #ifdef QAGAME bgSiegeClasses[bgNumSiegeClasses].classShader = 0; #else //cgame, ui bgSiegeClasses[bgNumSiegeClasses].classShader = trap_R_RegisterShaderNoMip(parseBuf); assert( bgSiegeClasses[bgNumSiegeClasses].classShader ); if ( !bgSiegeClasses[bgNumSiegeClasses].classShader ) { //Com_Error( ERR_DROP, "ERROR: could not find class_shader %s for class %s\n", parseBuf, bgSiegeClasses[bgNumSiegeClasses].name ); Com_Printf( "ERROR: could not find class_shader %s for class %s\n", parseBuf, bgSiegeClasses[bgNumSiegeClasses].name ); } // A very hacky way to determine class . . . else #endif { // Find the base player class based on the icon name - very bad, I know. int titleLength,i,arrayTitleLength; char *holdBuf; titleLength = strlen(parseBuf); for (i=0;i<SPC_MAX;i++) { // Back up arrayTitleLength = strlen(classTitles[i]); if (arrayTitleLength>titleLength) // Too long { break; } holdBuf = parseBuf + ( titleLength - arrayTitleLength); if (!strcmp(holdBuf,classTitles[i])) { bgSiegeClasses[bgNumSiegeClasses].playerClass = i; break; } } // In case the icon name doesn't match up if (i>=SPC_MAX) { bgSiegeClasses[bgNumSiegeClasses].playerClass = SPC_INFANTRY; } } } else { //No entry! Bad bad bad //Com_Error( ERR_DROP, "ERROR: no class_shader defined for class %s\n", bgSiegeClasses[bgNumSiegeClasses].name ); Com_Printf( "ERROR: no class_shader defined for class %s\n", bgSiegeClasses[bgNumSiegeClasses].name ); } //Parse holdable items to use if (BG_SiegeGetPairedValue(classInfo, "holdables", parseBuf)) { bgSiegeClasses[bgNumSiegeClasses].invenItems = BG_SiegeTranslateGenericTable(parseBuf, HoldableTable, qtrue); } else { //Just don't start out with any then. bgSiegeClasses[bgNumSiegeClasses].invenItems = 0; } //Parse powerups to use if (BG_SiegeGetPairedValue(classInfo, "powerups", parseBuf)) { bgSiegeClasses[bgNumSiegeClasses].powerups = BG_SiegeTranslateGenericTable(parseBuf, PowerupTable, qtrue); } else { //Just don't start out with any then. bgSiegeClasses[bgNumSiegeClasses].powerups = 0; } //A successful read. bgNumSiegeClasses++; }
/* ================= UI_SPLevelMenu_Cache ================= */ void UI_SPLevelMenu_Cache( void ) { trap_R_RegisterShaderNoMip( ART_LEVELFRAME_FOCUS ); trap_R_RegisterShaderNoMip( ART_LEVELFRAME_SELECTED ); trap_R_RegisterShaderNoMip( ART_ARROW ); trap_R_RegisterShaderNoMip( ART_ARROW_FOCUS ); trap_R_RegisterShaderNoMip( ART_MAP_UNKNOWN ); trap_R_RegisterShaderNoMip( ART_MAP_COMPLETE1 ); trap_R_RegisterShaderNoMip( ART_MAP_COMPLETE2 ); trap_R_RegisterShaderNoMip( ART_MAP_COMPLETE3 ); trap_R_RegisterShaderNoMip( ART_MAP_COMPLETE4 ); trap_R_RegisterShaderNoMip( ART_MAP_COMPLETE5 ); trap_R_RegisterShaderNoMip( ART_BACK0 ); trap_R_RegisterShaderNoMip( ART_BACK1 ); trap_R_RegisterShaderNoMip( ART_FIGHT0 ); trap_R_RegisterShaderNoMip( ART_FIGHT1 ); trap_R_RegisterShaderNoMip( ART_RESET0 ); trap_R_RegisterShaderNoMip( ART_RESET1 ); trap_R_RegisterShaderNoMip( ART_CUSTOM0 ); trap_R_RegisterShaderNoMip( ART_CUSTOM1 ); UIE_AwardIcons_Cache(&levelMenuInfo.awards); levelMenuInfo.levelSelectedPic = trap_R_RegisterShaderNoMip( ART_LEVELFRAME_SELECTED ); levelMenuInfo.levelFocusPic = trap_R_RegisterShaderNoMip( ART_LEVELFRAME_FOCUS ); levelMenuInfo.levelCompletePic[0] = trap_R_RegisterShaderNoMip( ART_MAP_COMPLETE1 ); levelMenuInfo.levelCompletePic[1] = trap_R_RegisterShaderNoMip( ART_MAP_COMPLETE2 ); levelMenuInfo.levelCompletePic[2] = trap_R_RegisterShaderNoMip( ART_MAP_COMPLETE3 ); levelMenuInfo.levelCompletePic[3] = trap_R_RegisterShaderNoMip( ART_MAP_COMPLETE4 ); levelMenuInfo.levelCompletePic[4] = trap_R_RegisterShaderNoMip( ART_MAP_COMPLETE5 ); }
int WM_DrawObjectives(int x, int y, int width, float fade) { const char *s, *str; int tempy, rows; int msec, mins, seconds, tens; // JPW NERVE vec4_t tclr = { 0.6f, 0.6f, 0.6f, 1.0f }; if(cg.snap->ps.pm_type == PM_INTERMISSION) { const char *s, *buf, *shader = NULL, *flagshader = NULL, *nameshader = NULL; // Moved to CG_DrawIntermission /* static int doScreenshot = 0, doDemostop = 0; // OSP - End-of-level autoactions if(!cg.demoPlayback) { if(!cg.latchVictorySound) { if(cg_autoAction.integer & AA_SCREENSHOT) { doScreenshot = cg.time + 1000; } if(cg_autoAction.integer & AA_STATSDUMP) { CG_dumpStats_f(); } if((cg_autoAction.integer & AA_DEMORECORD) && (cgs.gametype == GT_WOLF_STOPWATCH && cgs.currentRound != 1)) { doDemostop = cg.time + 5000; // stats should show up within 5 seconds } } if(doScreenshot > 0 && doScreenshot < cg.time) { CG_autoScreenShot_f(); doScreenshot = 0; } if(doDemostop > 0 && doDemostop < cg.time) { trap_SendConsoleCommand("stoprecord\n"); doDemostop = 0; } } */ rows = 8; y += SMALLCHAR_HEIGHT * (rows - 1); s = CG_ConfigString(CS_MULTI_MAPWINNER); buf = Info_ValueForKey(s, "winner"); if(atoi(buf) == -1) { str = "ITS A TIE!"; } else if(atoi(buf)) { str = "ALLIES"; // shader = "ui/assets/portraits/allies_win"; flagshader = "ui/assets/portraits/allies_win_flag.tga"; nameshader = "ui/assets/portraits/text_allies.tga"; /* if ( !cg.latchVictorySound ) { cg.latchVictorySound = qtrue; trap_S_StartLocalSound( trap_S_RegisterSound( "sound/music/allies_win.wav", qtrue ), CHAN_LOCAL_SOUND ); // FIXME: stream }*/ } else { str = "AXIS"; // shader = "ui/assets/portraits/axis_win"; flagshader = "ui/assets/portraits/axis_win_flag.tga"; nameshader = "ui/assets/portraits/text_axis.tga"; /* if ( !cg.latchVictorySound ) { cg.latchVictorySound = qtrue; trap_S_StartLocalSound( trap_S_RegisterSound( "sound/music/axis_win.wav", qtrue ), CHAN_LOCAL_SOUND ); // FIXME: stream }*/ } y += SMALLCHAR_HEIGHT * ((rows - 2) / 2); if(flagshader) { CG_DrawPic(100, 10, 210, 136, trap_R_RegisterShaderNoMip(flagshader)); CG_DrawPic(325, 10, 210, 136, trap_R_RegisterShaderNoMip(flagshader)); } if(shader) { CG_DrawPic(229, 10, 182, 136, trap_R_RegisterShaderNoMip(shader)); } if(nameshader) { CG_DrawPic(140, 50, 127, 64, trap_R_RegisterShaderNoMip(nameshader)); CG_DrawPic(365, 50, 127, 64, trap_R_RegisterShaderNoMip("ui/assets/portraits/text_win.tga")); } return y; } // JPW NERVE -- mission time & reinforce time else { tempy = y; rows = 1; CG_FillRect(x - 5, y - 2, width + 5, 21, clrUiBack); CG_FillRect(x - 5, y - 2, width + 5, 21, clrUiBar); CG_DrawRect_FixedBorder(x - 5, y - 2, width + 5, 21, 1, colorBlack); y += SMALLCHAR_HEIGHT * (rows - 1); if(cgs.timelimit > 0.0f) { msec = (cgs.timelimit * 60.f * 1000.f) - (cg.time - cgs.levelStartTime); seconds = msec / 1000; mins = seconds / 60; seconds -= mins * 60; tens = seconds / 10; seconds -= tens * 10; } else { msec = mins = tens = seconds = 0; } if(cgs.gamestate != GS_PLAYING) { s = va("%s %s", CG_TranslateString("MISSION TIME:"), CG_TranslateString("WARMUP")); } else if(msec < 0 && cgs.timelimit > 0.0f) { if(cgs.gamestate == GS_WAITING_FOR_PLAYERS) { s = va("%s %s", CG_TranslateString("MISSION TIME:"), CG_TranslateString("GAME STOPPED")); } else { s = va("%s %s", CG_TranslateString("MISSION TIME:"), CG_TranslateString("SUDDEN DEATH")); } } else { s = va("%s %2.0f:%i%i", CG_TranslateString("MISSION TIME:"), (float)mins, tens, seconds); // float cast to line up with reinforce time } CG_Text_Paint_Ext(x, y + 13, 0.25f, 0.25f, tclr, s, 0, 0, 0, &cgs.media.limboFont1); if(cgs.gametype != GT_WOLF_LMS) { if(cgs.clientinfo[cg.snap->ps.clientNum].team == TEAM_AXIS || cgs.clientinfo[cg.snap->ps.clientNum].team == TEAM_ALLIES) { msec = CG_CalculateReinfTime(qfalse) * 1000; } else { // no team (spectator mode) msec = 0; } if(msec) { seconds = msec / 1000; mins = seconds / 60; seconds -= mins * 60; tens = seconds / 10; seconds -= tens * 10; s = va("%s %2.0f:%i%i", CG_TranslateString("REINFORCE TIME:"), (float)mins, tens, seconds); CG_Text_Paint_Ext(640 - 20 - CG_Text_Width_Ext(s, 0.25f, 0, &cgs.media.limboFont1), y + 13, 0.25f, 0.25f, tclr, s, 0, 0, 0, &cgs.media.limboFont1); } } // NERVE - SMF if(cgs.gametype == GT_WOLF_STOPWATCH) { int w; s = va("%s %i", CG_TranslateString("STOPWATCH ROUND"), cgs.currentRound + 1); w = CG_Text_Width_Ext(s, 0.25f, 0, &cgs.media.limboFont1); CG_Text_Paint_Ext(x + 300 - w * 0.5f, y + 13, 0.25f, 0.25f, tclr, s, 0, 0, 0, &cgs.media.limboFont1); } else if(cgs.gametype == GT_WOLF_LMS) { int w; s = va("%s %i %s %i-%i", CG_TranslateString("ROUND"), cgs.currentRound + 1, CG_TranslateString("SCORE"), cg.teamWonRounds[1], cg.teamWonRounds[0]); w = CG_Text_Width_Ext(s, 0.25f, 0, &cgs.media.limboFont1); CG_Text_Paint_Ext(x + 300 - w * 0.5f, y + 13, 0.25f, 0.25f, tclr, s, 0, 0, 0, &cgs.media.limboFont1); } else if(cgs.gametype == GT_WOLF_CAMPAIGN) { int w; s = va("MAP %i of %i", cgs.currentCampaignMap + 1, cgs.campaignData.mapCount); w = CG_Text_Width_Ext(s, 0.25f, 0, &cgs.media.limboFont1); CG_Text_Paint_Ext(x + 300 - w * 0.5f, y + 13, 0.25f, 0.25f, tclr, s, 0, 0, 0, &cgs.media.limboFont1); } y += SMALLCHAR_HEIGHT * 2; } // jpw return y; }
int WM_DrawObjectives(int x, int y, int width, float fade) { const char *s; int rows; if (cg.snap->ps.pm_type == PM_INTERMISSION) { const char *s, *buf, *shader = NULL, *flagshader = NULL, *nameshader = NULL; rows = 8; y += 16 * (rows - 1); s = CG_ConfigString(CS_MULTI_MAPWINNER); buf = Info_ValueForKey(s, "w"); if (atoi(buf) == -1) { // "ITS A TIE!"; } else if (atoi(buf)) { // "ALLIES"; flagshader = "ui/assets/portraits/allies_win_flag.tga"; nameshader = "ui/assets/portraits/text_allies.tga"; } else { // "AXIS"; flagshader = "ui/assets/portraits/axis_win_flag.tga"; nameshader = "ui/assets/portraits/text_axis.tga"; } y += 16 * ((rows - 2) / 2); if (flagshader) { CG_DrawPic(100 + cgs.wideXoffset, 10, 210, 136, trap_R_RegisterShaderNoMip(flagshader)); CG_DrawPic(325 + cgs.wideXoffset, 10, 210, 136, trap_R_RegisterShaderNoMip(flagshader)); } if (shader) { CG_DrawPic(229 + cgs.wideXoffset, 10, 182, 136, trap_R_RegisterShaderNoMip(shader)); } if (nameshader) { CG_DrawPic(140 + cgs.wideXoffset, 50, 127, 64, trap_R_RegisterShaderNoMip(nameshader)); CG_DrawPic(365 + cgs.wideXoffset, 50, 127, 64, trap_R_RegisterShaderNoMip("ui/assets/portraits/text_win.tga")); } return y; } // mission time & reinforce time else { int msec, mins, seconds, tens, w; rows = 1; y += 13; CG_FillRect(x - 5, y - 15, width + 5, 21, clrUiBar); CG_DrawRect_FixedBorder(x - 5, y - 15, width + 5, 21, 1, colorBlack); y += 3 * (rows - 1); if (CG_ConfigString(CS_CONFIGNAME)[0]) { CG_FillRect(x - 5, y + 5, width + 5, 18, clrUiBack); CG_DrawRect_FixedBorder(x - 5, y + 5, width + 5, 18, 1, colorBlack); } if (cgs.timelimit > 0.0f) { msec = (cgs.timelimit * 60.f * 1000.f) - (cg.time - cgs.levelStartTime); seconds = msec / 1000; mins = seconds / 60; seconds -= mins * 60; tens = seconds / 10; seconds -= tens * 10; } else { msec = mins = tens = seconds = 0; } if (cgs.gamestate != GS_PLAYING) { s = va("%s %s", CG_TranslateString("MISSION TIME:"), CG_TranslateString("WARMUP")); } else if (msec < 0 && cgs.timelimit > 0.0f) { if (cgs.gamestate == GS_WAITING_FOR_PLAYERS) { s = va("%s %s", CG_TranslateString("MISSION TIME:"), CG_TranslateString("GAME STOPPED")); } else { s = va("%s %s", CG_TranslateString("MISSION TIME:"), CG_TranslateString("SUDDEN DEATH")); } } else { s = va("%s %2.0f:%i%i", CG_TranslateString("MISSION TIME:"), (float)mins, tens, seconds); // float cast to line up with reinforce time } CG_Text_Paint_Ext(x, y, 0.25f, 0.25f, tclr, s, 0, 0, 0, &cgs.media.limboFont1); if (cg.warmup) { s = va("%s %i", CG_TranslateString("MATCH BEGINS IN:"), (cg.warmup - cg.time) / 1000 + 1); CG_Text_Paint_Ext(SCREEN_WIDTH - 20 - CG_Text_Width_Ext(s, 0.25f, 0, &cgs.media.limboFont1) + cgs.wideXoffset, y, 0.25f, 0.25f, tclr, s, 0, 0, 0, &cgs.media.limboFont1); } else if ((cgs.gamestate == GS_WARMUP && !cg.warmup) || cgs.gamestate == GS_WAITING_FOR_PLAYERS) { s = va(CG_TranslateString("WAITING ON %i %s"), cgs.minclients, cgs.minclients == 1 ? CG_TranslateString("PLAYER") : CG_TranslateString("PLAYERS")); CG_Text_Paint_Ext(SCREEN_WIDTH - 20 - CG_Text_Width_Ext(s, 0.25f, 0, &cgs.media.limboFont1) + cgs.wideXoffset, y, 0.25f, 0.25f, tclr, s, 0, 0, 0, &cgs.media.limboFont1); } else if (cgs.gametype != GT_WOLF_LMS && !cg.warmup) { if (cgs.clientinfo[cg.snap->ps.clientNum].team == TEAM_AXIS || cgs.clientinfo[cg.snap->ps.clientNum].team == TEAM_ALLIES) { msec = CG_CalculateReinfTime(qfalse) * 1000; } else // no team (spectator mode) { msec = 0; } if (msec) { seconds = msec / 1000; mins = seconds / 60; seconds -= mins * 60; tens = seconds / 10; seconds -= tens * 10; s = va("%s %2.0f:%i%i", CG_TranslateString("REINFORCE TIME:"), (float)mins, tens, seconds); CG_Text_Paint_Ext(SCREEN_WIDTH - 20 - CG_Text_Width_Ext(s, 0.25f, 0, &cgs.media.limboFont1) + cgs.wideXoffset, y, 0.25f, 0.25f, tclr, s, 0, 0, 0, &cgs.media.limboFont1); } } switch (cgs.gametype) { case GT_WOLF_STOPWATCH: s = va("%s %i", CG_TranslateString("STOPWATCH ROUND"), cgs.currentRound + 1); w = CG_Text_Width_Ext(s, 0.25f, 0, &cgs.media.limboFont1); CG_Text_Paint_Ext(x + 300 - w * 0.5f, y, 0.25f, 0.25f, tclr, s, 0, 0, 0, &cgs.media.limboFont1); break; case GT_WOLF_LMS: s = va("%s %i %s %i-%i", CG_TranslateString("ROUND"), cgs.currentRound + 1, CG_TranslateString("SCORE"), cg.teamWonRounds[1], cg.teamWonRounds[0]); w = CG_Text_Width_Ext(s, 0.25f, 0, &cgs.media.limboFont1); CG_Text_Paint_Ext(x + 300 - w * 0.5f, y, 0.25f, 0.25f, tclr, s, 0, 0, 0, &cgs.media.limboFont1); break; case GT_WOLF_CAMPAIGN: s = va(CG_TranslateString("MAP %i of %i"), cgs.currentCampaignMap + 1, cgs.campaignData.mapCount); w = CG_Text_Width_Ext(s, 0.25f, 0, &cgs.media.limboFont1); CG_Text_Paint_Ext(x + 300 - w * 0.5f, y, 0.25f, 0.25f, tclr, s, 0, 0, 0, &cgs.media.limboFont1); break; case GT_WOLF_MAPVOTE: s = (cgs.mapVoteMapY ? va(CG_TranslateString("MAP %i of %i"), cgs.mapVoteMapX + 1, cgs.mapVoteMapY) : ""); w = CG_Text_Width_Ext(s, 0.25f, 0, &cgs.media.limboFont1); CG_Text_Paint_Ext(x + 300 - w * 0.5f, y, 0.25f, 0.25f, tclr, s, 0, 0, 0, &cgs.media.limboFont1); break; default: break; } y += 18; if (CG_ConfigString(CS_CONFIGNAME)[0]) { s = va(CG_TranslateString("Config: ^7%s^7"), CG_ConfigString(CS_CONFIGNAME)); CG_Text_Paint_Ext(x, y, 0.24f, 0.28f, tclr, s, 0, 0, ITEM_TEXTSTYLE_SHADOWED, &cgs.media.limboFont2_lo); y += 18; } } return y; }
/* ================= Reset_Cache ================= */ void Reset_Cache( void ) { trap_R_RegisterShaderNoMip( ART_FRAME ); }
/* =============== TeamMain_Cache =============== */ void TeamMain_Cache( void ) { trap_R_RegisterShaderNoMip( TEAMMAIN_FRAME ); }
/* ================= InGame_Cache ================= */ void InGame_Cache( void ) { trap_R_RegisterShaderNoMip( INGAME_FRAME ); }
static void CG_DrawHotkeyBar ( menuDef_t *menuHUD, vec4_t opacity ) { itemDef_t *focusItem; int i; if (!menuHUD) { return; } focusItem = Menu_FindItemByName(menuHUD, "frame"); if (focusItem) { trap_R_SetColor(opacity); CG_DrawPic( focusItem->window.rect.x, focusItem->window.rect.y, focusItem->window.rect.w, focusItem->window.rect.h, focusItem->window.background ); } // Print background of the bars for (i=0; i<MAX_ACI_SLOTS; i++) { focusItem = Menu_FindItemByName(menuHUD, va("slot%i", i)); if (focusItem) { vec4_t col = {0.11f, 0.11f, 0.11f, 1.0f}; qhandle_t shader = cgs.media.whiteShader; //dummy col[3] *= cg.jkg_HUDOpacity; if ( i < MAX_ACI_SLOTS && cg.playerACI[i] >= 0 && cg.playerInventory[cg.playerACI[i]].id && cg.playerInventory[cg.playerACI[i]].id->itemID ) { int weapon, variation; if(cg.playerInventory[cg.playerACI[i]].id->itemType == ITEM_WEAPON) { if ( BG_GetWeaponByIndex (cg.playerInventory[cg.playerACI[i]].id->varID, &weapon, &variation) ) { const weaponInfo_t *weaponInfo = CG_WeaponInfo (weapon, variation); shader = weaponInfo->hudIcon; col[0] = 1.0f; col[1] = 1.0f; col[2] = 1.0f; /*trap_R_SetColor (colorTable[CT_MDGREY]); trap_R_DrawStretchPic(focusItem->window.rect.x, focusItem->window.rect.y, focusItem->window.rect.w, focusItem->window.rect.h, 0, 0, 1, 1, cgs.media.whiteShader);*/ if(i == cg.weaponSelect) { trap_R_SetColor (opacity); //TODO: precache me! trap_R_DrawStretchPic(focusItem->window.rect.x, focusItem->window.rect.y, focusItem->window.rect.w, focusItem->window.rect.h, 0, 0, 1, 1, trap_R_RegisterShaderNoMip("gfx/jkghud/aciselect")); } } } else { col[0] = 1.0f; col[1] = 1.0f; col[2] = 1.0f; shader = trap_R_RegisterShaderNoMip(cg.playerInventory[cg.playerACI[i]].id->itemIcon); } } if(shader != cgs.media.whiteShader) { trap_R_SetColor( col ); trap_R_DrawStretchPic(focusItem->window.rect.x, focusItem->window.rect.y, focusItem->window.rect.w, focusItem->window.rect.h, 0, 0, 1, 1, shader); } //CG_DrawRect(focusItem->window.rect.x, focusItem->window.rect.y, focusItem->window.rect.w, focusItem->window.rect.h, 1, colorWhite); } focusItem = Menu_FindItemByName(menuHUD, va("slotl%i", i)); if (focusItem) { trap_R_Font_DrawString(focusItem->window.rect.x, focusItem->window.rect.y, va("%i", i), opacity, cgDC.Assets.qhSmallFont, -1, 0.4f); } } focusItem = Menu_FindItemByName(menuHUD, "frame_overlay"); if(focusItem) { trap_R_SetColor(opacity); CG_DrawPic( focusItem->window.rect.x, focusItem->window.rect.y, focusItem->window.rect.w, focusItem->window.rect.h, focusItem->window.background ); } }
/* ================= ArenaServers_Cache ================= */ void ArenaServers_Cache( void ) { trap_R_RegisterShaderNoMip( ART_BACK0 ); trap_R_RegisterShaderNoMip( ART_BACK1 ); trap_R_RegisterShaderNoMip( ART_CREATE0 ); trap_R_RegisterShaderNoMip( ART_CREATE1 ); trap_R_RegisterShaderNoMip( ART_SPECIFY0 ); trap_R_RegisterShaderNoMip( ART_SPECIFY1 ); trap_R_RegisterShaderNoMip( ART_REFRESH0 ); trap_R_RegisterShaderNoMip( ART_REFRESH1 ); trap_R_RegisterShaderNoMip( ART_CONNECT0 ); trap_R_RegisterShaderNoMip( ART_CONNECT1 ); trap_R_RegisterShaderNoMip( ART_ARROWS0 ); trap_R_RegisterShaderNoMip( ART_ARROWS_UP ); trap_R_RegisterShaderNoMip( ART_ARROWS_DOWN ); trap_R_RegisterShaderNoMip( ART_UNKNOWNMAP ); trap_R_RegisterShaderNoMip( ART_PUNKBUSTER ); }
/* ================= InSelectPlayer_Cache ================= */ void InSelectPlayer_Cache( void ) { trap_R_RegisterShaderNoMip( INGAME_FRAME ); }
/* ================= Bitmap_Draw ================= */ void Bitmap_Draw( menubitmap_s *b ) { float x; float y; float w; float h; vec4_t tempcolor; float* color; x = b->generic.x; y = b->generic.y; w = b->width; h = b->height; if (b->generic.flags & QMF_RIGHT_JUSTIFY) { x = x - w; } else if (b->generic.flags & QMF_CENTER_JUSTIFY) { x = x - w/2; } // used to refresh shader if (b->generic.name && !b->shader) { b->shader = trap_R_RegisterShaderNoMip( b->generic.name ); if (!b->shader && b->errorpic) b->shader = trap_R_RegisterShaderNoMip( b->errorpic ); } if (b->focuspic && !b->focusshader) b->focusshader = trap_R_RegisterShaderNoMip( b->focuspic ); if (b->generic.flags & QMF_GRAYED) { if (b->shader) { trap_R_SetColor( colorMdGrey ); UI_DrawHandlePic( x, y, w, h, b->shader ); trap_R_SetColor( NULL ); } } else { if (b->shader) UI_DrawHandlePic( x, y, w, h, b->shader ); // bk001204 - parentheses if ( ( (b->generic.flags & QMF_PULSE) || (b->generic.flags & QMF_PULSEIFFOCUS) ) && (Menu_ItemAtCursor( b->generic.parent ) == b)) { if (b->focuscolor) { tempcolor[0] = b->focuscolor[0]; tempcolor[1] = b->focuscolor[1]; tempcolor[2] = b->focuscolor[2]; color = tempcolor; } else color = pulse_color; color[3] = 0.5+0.5*sin(uis.realtime/PULSE_DIVISOR); trap_R_SetColor( color ); UI_DrawHandlePic( x, y, w, h, b->focusshader ); trap_R_SetColor( NULL ); } else if ((b->generic.flags & QMF_HIGHLIGHT) || ((b->generic.flags & QMF_HIGHLIGHT_IF_FOCUS) && (Menu_ItemAtCursor( b->generic.parent ) == b))) { if (b->focuscolor) { trap_R_SetColor( b->focuscolor ); UI_DrawHandlePic( x, y, w, h, b->focusshader ); trap_R_SetColor( NULL ); } else UI_DrawHandlePic( x, y, w, h, b->focusshader ); } } }
/* ==================== CG_DrawInformation Draw all the status / pacifier stuff during level loading ==================== */ void CG_DrawInformation( void ) { const char *s; const char *info; const char *sysInfo; int y; int value; qhandle_t levelshot; qhandle_t detail; char buf[1024]; info = CG_ConfigString( CS_SERVERINFO ); sysInfo = CG_ConfigString( CS_SYSTEMINFO ); s = Info_ValueForKey( info, "mapname" ); levelshot = trap_R_RegisterShaderNoMip( va( "levelshots/%s.tga", s ) ); if ( !levelshot ) { levelshot = trap_R_RegisterShaderNoMip( "menu/art/unknownmap" ); } trap_R_SetColor( NULL ); CG_DrawPic( 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, levelshot ); // blend a detail texture over it detail = trap_R_RegisterShader( "levelShotDetail" ); trap_R_DrawStretchPic( 0, 0, cgs.glconfig.vidWidth, cgs.glconfig.vidHeight, 0, 0, 2.5, 2, detail ); // draw the icons of things as they are loaded CG_DrawLoadingIcons(); // the first 150 rows are reserved for the client connection // screen to write into if ( cg.infoScreenText[0] ) { UI_DrawProportionalString( 320, 128-32, va("Loading... %s", cg.infoScreenText), UI_CENTER|UI_SMALLFONT|UI_DROPSHADOW, colorWhite ); } else { UI_DrawProportionalString( 320, 128-32, "Awaiting snapshot...", UI_CENTER|UI_SMALLFONT|UI_DROPSHADOW, colorWhite ); } // draw info string information y = 180-32; // don't print server lines if playing a local game trap_Cvar_VariableStringBuffer( "sv_running", buf, sizeof( buf ) ); if ( !atoi( buf ) ) { // server hostname Q_strncpyz(buf, Info_ValueForKey( info, "sv_hostname" ), 1024); Q_CleanStr(buf); UI_DrawProportionalString( 320, y, buf, UI_CENTER|UI_SMALLFONT|UI_DROPSHADOW, colorWhite ); y += PROP_HEIGHT; // pure server s = Info_ValueForKey( sysInfo, "sv_pure" ); if ( s[0] == '1' ) { UI_DrawProportionalString( 320, y, "Pure Server", UI_CENTER|UI_SMALLFONT|UI_DROPSHADOW, colorWhite ); y += PROP_HEIGHT; } // server-specific message of the day s = CG_ConfigString( CS_MOTD ); if ( s[0] ) { UI_DrawProportionalString( 320, y, s, UI_CENTER|UI_SMALLFONT|UI_DROPSHADOW, colorWhite ); y += PROP_HEIGHT; } // some extra space after hostname and motd y += 10; } // map-specific message (long map name) s = CG_ConfigString( CS_MESSAGE ); if ( s[0] ) { UI_DrawProportionalString( 320, y, s, UI_CENTER|UI_SMALLFONT|UI_DROPSHADOW, colorWhite ); y += PROP_HEIGHT; } // cheats warning s = Info_ValueForKey( sysInfo, "sv_cheats" ); if ( s[0] == '1' ) { UI_DrawProportionalString( 320, y, "CHEATS ARE ENABLED", UI_CENTER|UI_SMALLFONT|UI_DROPSHADOW, colorWhite ); y += PROP_HEIGHT; } // game type switch ( cgs.gametype ) { case GT_FFA: s = "Free For All"; break; case GT_SINGLE_PLAYER: s = "Single Player"; break; case GT_TOURNAMENT: s = "Tournament"; break; case GT_TEAM: s = "Team Deathmatch"; break; case GT_CTF: s = "Capture The Flag"; break; #ifdef MISSIONPACK case GT_1FCTF: s = "One Flag CTF"; break; case GT_OBELISK: s = "Overload"; break; case GT_HARVESTER: s = "Harvester"; break; #endif default: s = "Unknown Gametype"; break; } UI_DrawProportionalString( 320, y, s, UI_CENTER|UI_SMALLFONT|UI_DROPSHADOW, colorWhite ); y += PROP_HEIGHT; value = atoi( Info_ValueForKey( info, "timelimit" ) ); if ( value ) { UI_DrawProportionalString( 320, y, va( "timelimit %i", value ), UI_CENTER|UI_SMALLFONT|UI_DROPSHADOW, colorWhite ); y += PROP_HEIGHT; } if (cgs.gametype < GT_CTF ) { value = atoi( Info_ValueForKey( info, "fraglimit" ) ); if ( value ) { UI_DrawProportionalString( 320, y, va( "fraglimit %i", value ), UI_CENTER|UI_SMALLFONT|UI_DROPSHADOW, colorWhite ); y += PROP_HEIGHT; } } if (cgs.gametype >= GT_CTF) { value = atoi( Info_ValueForKey( info, "capturelimit" ) ); if ( value ) { UI_DrawProportionalString( 320, y, va( "capturelimit %i", value ), UI_CENTER|UI_SMALLFONT|UI_DROPSHADOW, colorWhite ); y += PROP_HEIGHT; } } }
/* ================= PlayerSettings_Cache ================= */ void PlayerSettings_Cache(void) { trap_R_RegisterShaderNoMip(ART_FRAMEL); trap_R_RegisterShaderNoMip(ART_FRAMER); trap_R_RegisterShaderNoMip(ART_MODEL0); trap_R_RegisterShaderNoMip(ART_MODEL1); trap_R_RegisterShaderNoMip(ART_BACK0); trap_R_RegisterShaderNoMip(ART_BACK1); s_playersettings.fxBasePic = trap_R_RegisterShaderNoMip(ART_FX_BASE); s_playersettings.fxPic[0] = trap_R_RegisterShaderNoMip(ART_FX_RED); s_playersettings.fxPic[1] = trap_R_RegisterShaderNoMip(ART_FX_YELLOW); s_playersettings.fxPic[2] = trap_R_RegisterShaderNoMip(ART_FX_GREEN); s_playersettings.fxPic[3] = trap_R_RegisterShaderNoMip(ART_FX_TEAL); s_playersettings.fxPic[4] = trap_R_RegisterShaderNoMip(ART_FX_BLUE); s_playersettings.fxPic[5] = trap_R_RegisterShaderNoMip(ART_FX_CYAN); s_playersettings.fxPic[6] = trap_R_RegisterShaderNoMip(ART_FX_WHITE); }
void BG_SiegeParseTeamFile(const char *filename) { fileHandle_t f; int len; char teamInfo[2048]; char parseBuf[1024]; char lookString[256]; int i = 1; qboolean success = qtrue; len = trap_FS_FOpenFile(filename, &f, FS_READ); if (!f || len >= 2048) { return; } trap_FS_Read(teamInfo, len, f); trap_FS_FCloseFile(f); teamInfo[len] = 0; if (BG_SiegeGetPairedValue(teamInfo, "name", parseBuf)) { strcpy(bgSiegeTeams[bgNumSiegeTeams].name, parseBuf); } else { Com_Error(ERR_DROP, "Siege team with no name definition"); } //I don't entirely like doing things this way but it's the easiest way. #ifdef CGAME if (BG_SiegeGetPairedValue(teamInfo, "FriendlyShader", parseBuf)) { bgSiegeTeams[bgNumSiegeTeams].friendlyShader = trap_R_RegisterShaderNoMip(parseBuf); } #else bgSiegeTeams[bgNumSiegeTeams].friendlyShader = 0; #endif bgSiegeTeams[bgNumSiegeTeams].numClasses = 0; if (BG_SiegeGetValueGroup(teamInfo, "Classes", teamInfo)) { while (success && i < MAX_SIEGE_CLASSES) { //keep checking for group values named class# up to MAX_SIEGE_CLASSES until we can't find one. strcpy(lookString, va("class%i", i)); success = BG_SiegeGetPairedValue(teamInfo, lookString, parseBuf); if (!success) { break; } bgSiegeTeams[bgNumSiegeTeams].classes[bgSiegeTeams[bgNumSiegeTeams].numClasses] = BG_SiegeFindClassByName(parseBuf); if (!bgSiegeTeams[bgNumSiegeTeams].classes[bgSiegeTeams[bgNumSiegeTeams].numClasses]) { Com_Printf( "Invalid class specified: '%s'\n", parseBuf); } bgSiegeTeams[bgNumSiegeTeams].numClasses++; i++; } } if (!bgSiegeTeams[bgNumSiegeTeams].numClasses) { Com_Error(ERR_DROP, "Team defined with no allowable classes\n"); } //If we get here then it was a success, so increment the team number bgNumSiegeTeams++; }
/* ================= UI_SetupMenu_Cache ================= */ void UI_SetupMenu_Cache( void ) { trap_R_RegisterShaderNoMip( ART_BACK0 ); trap_R_RegisterShaderNoMip( ART_BACK1 ); trap_R_RegisterShaderNoMip( ART_FRAMEL ); trap_R_RegisterShaderNoMip( ART_FRAMER ); }
int WM_DrawObjectives( int x, int y, int width, float fade ) { const char *s, *buf, *str; char teamstr[32]; int i, height, tempy, rows; vec4_t hcolor; rows = 7; height = SMALLCHAR_HEIGHT * rows; hcolor[0] = hcolor[1] = hcolor[2] = 1; hcolor[3] = 1.f; trap_R_SetColor( hcolor ); if ( cg.snap->ps.pm_type != PM_INTERMISSION ) { CG_DrawPic( x - 10, y, width + 20, height + SMALLCHAR_HEIGHT + 10 + 1, trap_R_RegisterShaderNoMip( "ui_mp/assets/mp_score_objectives" ) ); } VectorSet( hcolor, 1, 1, 1 ); trap_R_SetColor( NULL ); VectorSet( hcolor, ( 68.f / 255.f ), ( 0.f / 255.f ), ( 0.f / 255.f ) ); hcolor[3] = 1 * fade; // draw header if ( cg.snap->ps.pm_type != PM_INTERMISSION ) { CG_DrawSmallString( x, y, CG_TranslateString( "Goals" ), fade ); } y += SMALLCHAR_HEIGHT + 3; // draw color bands tempy = y; if ( cg.snap->ps.pm_type != PM_INTERMISSION ) { for ( i = 0; i < rows; i++ ) { hcolor[3] = fade * 0.3; if ( i % 2 == 0 ) { VectorSet( hcolor, ( 0.f / 255.f ), ( 113.f / 255.f ), ( 163.f / 255.f ) ); // LIGHT BLUE } else { VectorSet( hcolor, ( 0.f / 255.f ), ( 92.f / 255.f ), ( 133.f / 255.f ) ); // DARK BLUE } hcolor[3] = 0; CG_FillRect( x, y, width, SMALLCHAR_HEIGHT, hcolor ); y += SMALLCHAR_HEIGHT; } } hcolor[3] = 1; y = tempy; if ( cg.snap->ps.pm_type == PM_INTERMISSION ) { const char *shader = NULL, *flagshader = NULL, *nameshader = NULL; s = CG_ConfigString( CS_MULTI_MAPWINNER ); buf = Info_ValueForKey( s, "winner" ); if ( atoi( buf ) == -1 ) { str = "ITS A TIE!"; } else if ( atoi( buf ) ) { str = "ALLIES"; shader = "ui_mp/assets/portraits/allies_win"; flagshader = "ui_mp/assets/portraits/allies_win_flag.tga"; nameshader = "ui_mp/assets/portraits/text_allies.tga"; if ( !cg.latchVictorySound ) { cg.latchVictorySound = qtrue; trap_S_StartLocalSound( trap_S_RegisterSound( "sound/multiplayer/music/l_complete_2.wav" ), CHAN_LOCAL_SOUND ); if ( cg_announcer.integer ) { trap_S_StartLocalSound( cgs.media.winAllies, CHAN_ANNOUNCER ); } } } else { str = "AXIS"; shader = "ui_mp/assets/portraits/axis_win"; flagshader = "ui_mp/assets/portraits/axis_win_flag.tga"; nameshader = "ui_mp/assets/portraits/text_axis.tga"; if ( !cg.latchVictorySound ) { cg.latchVictorySound = qtrue; trap_S_StartLocalSound( trap_S_RegisterSound( "sound/multiplayer/music/s_stinglow.wav" ), CHAN_LOCAL_SOUND ); if ( cg_announcer.integer ) { trap_S_StartLocalSound( cgs.media.winAxis, CHAN_ANNOUNCER ); } } } y += SMALLCHAR_HEIGHT * ( ( rows - 2 ) / 2 ); if ( flagshader ) { CG_DrawPic( 10, 10, 210, 136, trap_R_RegisterShaderNoMip( flagshader ) ); CG_DrawPic( 415, 10, 210, 136, trap_R_RegisterShaderNoMip( flagshader ) ); } if ( shader ) { CG_DrawPic( 229, 10, 182, 136, trap_R_RegisterShaderNoMip( shader ) ); } if ( nameshader ) { CG_DrawPic( 50, 50, 127, 64, trap_R_RegisterShaderNoMip( nameshader ) ); CG_DrawPic( 455, 50, 127, 64, trap_R_RegisterShaderNoMip( "ui_mp/assets/portraits/text_win.tga" ) ); } return y; } // JPW NERVE -- mission time & reinforce time else { int msec, mins, seconds, tens; tempy = y; y += SMALLCHAR_HEIGHT * ( rows - 1 ); msec = ( cgs.timelimit * 60.f * 1000.f ) - ( cg.time - cgs.levelStartTime ); seconds = msec / 1000; mins = seconds / 60; seconds -= mins * 60; tens = seconds / 10; seconds -= tens * 10; if ( msec < 0 ) { s = va( "%s %s", CG_TranslateString( "Mission time:" ), CG_TranslateString( "Sudden Death" ) ); } else { s = va( "%s %2.0f:%i%i", CG_TranslateString( "Mission time:" ), (float)mins, tens, seconds ); // float cast to line up with reinforce time } CG_DrawSmallString( x,y,s,fade ); if ( cgs.clientinfo[cg.snap->ps.clientNum].team == TEAM_RED ) { msec = cg_redlimbotime.integer - ( ( cgs.aReinfOffset[TEAM_RED] + cg.time - cgs.levelStartTime ) % cg_redlimbotime.integer ) + 1000; } else if ( cgs.clientinfo[cg.snap->ps.clientNum].team == TEAM_BLUE ) { msec = cg_bluelimbotime.integer - ( ( cgs.aReinfOffset[TEAM_BLUE] + cg.time - cgs.levelStartTime ) % cg_bluelimbotime.integer ) + 1000; } else { // no team (spectator mode) msec = 0; } if ( msec ) { seconds = msec / 1000; mins = seconds / 60; seconds -= mins * 60; tens = seconds / 10; seconds -= tens * 10; s = va( "%s %2.0f:%i%i", CG_TranslateString( "Reinforce time:" ), (float)mins, tens, seconds ); CG_DrawSmallString( x + 425,y,s,fade ); } // NERVE - SMF if ( cgs.gametype == GT_WOLF_STOPWATCH ) { int w; s = va( "%s %i", CG_TranslateString( "Stopwatch Round" ), cgs.currentRound + 1 ); w = CG_DrawStrlen( s ) * SMALLCHAR_WIDTH; CG_DrawSmallString( x + 300 - w / 2,y,s,fade ); } // -NERVE - SMF y = tempy; } // jpw // determine character's team if ( cg.snap->ps.persistant[PERS_TEAM] == TEAM_RED ) { strcpy( teamstr, "short_axis_desc" ); } else { strcpy( teamstr, "short_allied_desc" ); } s = CG_ConfigString( CS_MULTI_INFO ); buf = Info_ValueForKey( s, "numobjectives" ); if ( buf && atoi( buf ) ) { int num = atoi( buf ); int strwidth, status; for ( i = 0; i < num; i++ ) { s = CG_ConfigString( CS_MULTI_OBJECTIVE1 + i ); buf = Info_ValueForKey( s, teamstr ); if ( !buf || !strlen( buf ) ) { str = va( "%s %i", CG_TranslateString( "Objective" ), i + 1 ); } else { str = va( "%s", CG_TranslateString( buf ) ); } // draw text strwidth = CG_DrawStrlen( str ) * SMALLCHAR_WIDTH; CG_DrawSmallString( x + width / 2 - strwidth / 2 - 12, y, str, fade ); // draw status flags s = CG_ConfigString( CS_MULTI_OBJ1_STATUS + i ); status = atoi( Info_ValueForKey( s, "status" ) ); if ( status == 0 ) { CG_DrawPic( x, y + 1, 24, 14, trap_R_RegisterShaderNoMip( "ui_mp/assets/ger_flag.tga" ) ); } else if ( status == 1 ) { CG_DrawPic( x, y + 1, 24, 14, trap_R_RegisterShaderNoMip( "ui_mp/assets/usa_flag.tga" ) ); } y += SMALLCHAR_HEIGHT; } } return y; }