void CG_MissionFailed(void) { char text[1024]={0}; int w; int y = 230; cgi_SP_GetStringTextString( "INGAME_MISSIONFAILED", text, sizeof(text) ); w = cgi_R_Font_StrLenPixels(text, cgs.media.qhFontMedium, 1.2f); cgi_R_Font_DrawString(320 - w/2, y, text, colorTable[CT_HUD_RED], cgs.media.qhFontMedium, -1, 1.2f); switch (statusTextIndex) { case -1: //Our HERO DIED!!! cgi_SP_GetStringTextString( "INGAME_MISSIONFAILED_KYLE", text, sizeof(text) ); break; case MISSIONFAILED_JAN: cgi_SP_GetStringTextString( "INGAME_MISSIONFAILED_JAN", text, sizeof(text) ); break; case MISSIONFAILED_LUKE: cgi_SP_GetStringTextString( "INGAME_MISSIONFAILED_LUKE", text, sizeof(text) ); break; case MISSIONFAILED_LANDO: cgi_SP_GetStringTextString( "INGAME_MISSIONFAILED_LANDO", text, sizeof(text) ); break; case MISSIONFAILED_R5D2: cgi_SP_GetStringTextString( "INGAME_MISSIONFAILED_R5D2", text, sizeof(text) ); break; case MISSIONFAILED_WARDEN: cgi_SP_GetStringTextString( "INGAME_MISSIONFAILED_WARDEN", text, sizeof(text) ); break; case MISSIONFAILED_PRISONERS: cgi_SP_GetStringTextString( "INGAME_MISSIONFAILED_PRISONERS", text, sizeof(text) ); break; case MISSIONFAILED_EMPLACEDGUNS: cgi_SP_GetStringTextString( "INGAME_MISSIONFAILED_EMPLACEDGUNS", text, sizeof(text) ); break; case MISSIONFAILED_LADYLUCK: cgi_SP_GetStringTextString( "INGAME_MISSIONFAILED_LADYLUCK", text, sizeof(text) ); break; case MISSIONFAILED_KYLECAPTURE: cgi_SP_GetStringTextString( "INGAME_MISSIONFAILED_KYLECAPTURE", text, sizeof(text) ); break; case MISSIONFAILED_TOOMANYALLIESDIED: cgi_SP_GetStringTextString( "INGAME_MISSIONFAILED_TOOMANYALLIESDIED", text, sizeof(text) ); break; default: cgi_SP_GetStringTextString( "INGAME_MISSIONFAILED_UNKNOWN", text, sizeof(text) ); break; } w = cgi_R_Font_StrLenPixels(text, cgs.media.qhFontMedium, 1.2f); cgi_R_Font_DrawString(320 - w/2, y+30, text, colorTable[CT_HUD_RED], cgs.media.qhFontMedium, -1, 1.2f); cgi_SP_GetStringTextString( "INGAME_RELOADMISSION", text, sizeof(text) ); w = cgi_R_Font_StrLenPixels(text, cgs.media.qhFontSmall, 1.0f); cgi_R_Font_DrawString(320 - w/2, 450, text, colorTable[CT_CYAN], cgs.media.qhFontSmall, -1, 1.0f); }
/* ==================== MissionInformation_Draw ==================== */ void MissionInformation_Draw( centity_t *cent ) { int i,totalY; int iYPixelsPerLine = cgi_R_Font_HeightPixels(cgs.media.qhFontMedium, 1.0f) * (cgi_Language_IsAsian() ? 1.2f : 1.0f ); missionInfo_Updated = qfalse; // This will stop the text from flashing cg.missionInfoFlashTime = 0; // Frame char text[1024]={0}; cgi_SP_GetStringTextString( "INGAME_OBJECTIVES", text, sizeof(text) ); cgi_R_Font_DrawString (96, missionYpos-23, text, colorTable[CT_WHITE], cgs.media.qhFontMedium, -1, 1.0f); int missionYcnt = 0; obj_graphics[0] = obj_graphics[1] = obj_graphics[2] = obj_graphics[3] = qfalse; // Print active objectives cgi_R_SetColor(colorTable[CT_BLUE3]); for (i=0;i<MAX_OBJECTIVES;++i) { if (cent->gent->client->sess.mission_objectives[i].display) { totalY = missionYpos + (iYPixelsPerLine * (missionYcnt))+(iYPixelsPerLine/2); if (obj_graphics[0]) { totalY += 32 + 4; } if (obj_graphics[1]) { totalY += 32 + 4; } if (obj_graphics[2]) { totalY += 32 + 4; } if (obj_graphics[3]) { totalY += 32 + 4; } // OBJECTIVE_STAT_PENDING CG_DrawPic( 88, totalY, 16, 16, cgs.media.messageObjCircle); // Circle in front if (cent->gent->client->sess.mission_objectives[i].status == OBJECTIVE_STAT_SUCCEEDED) { CG_DrawPic( 88, totalY, 16, 16, cgs.media.messageLitOn); // Center Dot } MissionPrint_Line(CT_BLUE3, i, missionYcnt ); } } if (!missionYcnt) { cgi_SP_GetStringTextString( "INGAME_OBJNONE", text, sizeof(text) ); // CG_DrawProportionalString(108, missionYpos, text, CG_SMALLFONT, colorTable[CT_LTBLUE1] ); cgi_R_Font_DrawString (108, missionYpos, text, colorTable[CT_LTBLUE1], cgs.media.qhFontMedium, -1, 1.0f); } }
/* ================= CG_MissionCompletion ================= */ void CG_MissionCompletion(void) { char text[1024]={0}; int w,x,y; const int pad = 18; cgi_SP_GetStringTextString( "INGAME_MISSIONCOMPLETION", text, sizeof(text) ); w = cgi_R_Font_StrLenPixels(text, cgs.media.qhFontMedium, 1.2f); cgi_R_Font_DrawString(320 - w/2, 53, text, colorTable[CT_LTGOLD1], cgs.media.qhFontMedium, -1, 1.2f); x = 75; y =86; cgi_SP_GetStringTextString( "INGAME_SECRETAREAS", text, sizeof(text) ); w = cgi_R_Font_StrLenPixels(text, cgs.media.qhFontSmall, 0.8f); cgi_R_Font_DrawString(x, y, text, colorTable[CT_LTGOLD1], cgs.media.qhFontSmall, -1, 0.8f); cgi_SP_GetStringTextString( "INGAME_SECRETAREAS_OF", text, sizeof(text) ); cgi_R_Font_DrawString(x+w, y, va("%d %s %d", cg_entities[0].gent->client->sess.missionStats.secretsFound, text, cg_entities[0].gent->client->sess.missionStats.totalSecrets ), colorTable[CT_WHITE], cgs.media.qhFontSmall, -1, 0.8f); y +=pad; cgi_SP_GetStringTextString( "INGAME_ENEMIESKILLED", text, sizeof(text) ); w = cgi_R_Font_StrLenPixels(text, cgs.media.qhFontSmall, 0.8f); cgi_R_Font_DrawString(x, y, text, colorTable[CT_LTGOLD1], cgs.media.qhFontSmall, -1, 0.8f); cgi_R_Font_DrawString(x+w,y, va("%d",cg_entities[0].gent->client->sess.missionStats.enemiesKilled), colorTable[CT_WHITE], cgs.media.qhFontSmall, -1, 0.8f); /* cgi_SP_GetStringTextString( "INGAME_SECRETAREAS_OF", text, sizeof(text) ); cgi_R_Font_DrawString(x+w,y, va("%d %s %d", cg_entities[0].gent->client->sess.missionStats.enemiesKilled, text, cg_entities[0].gent->client->sess.missionStats.enemiesSpawned ), colorTable[CT_WHITE], cgs.media.qhFontSmall, -1, 0.8f); */ y +=pad; y +=pad; cgi_SP_GetStringTextString( "INGAME_FAVORITEWEAPON", text, sizeof(text) ); w = cgi_R_Font_StrLenPixels(text, cgs.media.qhFontSmall, 0.8f); cgi_R_Font_DrawString(x, y, text, colorTable[CT_LTGOLD1], cgs.media.qhFontSmall, -1, 0.8f); int wpn=0,i; int max_wpn = cg_entities[0].gent->client->sess.missionStats.weaponUsed[0]; for (i = 1; i<WP_NUM_WEAPONS; i++) { if (cg_entities[0].gent->client->sess.missionStats.weaponUsed[i] > max_wpn) { max_wpn = cg_entities[0].gent->client->sess.missionStats.weaponUsed[i]; wpn = i; } } if ( wpn ) { gitem_t *wItem= FindItemForWeapon( (weapon_t)wpn); cgi_SP_GetStringTextString( va("INGAME_%s",wItem->classname ), text, sizeof( text )); // cgi_R_Font_DrawString(x+w, y, va("%d",wpn), colorTable[CT_WHITE], cgs.media.qhFontSmall, -1, 0.8f); cgi_R_Font_DrawString(x+w, y, text, colorTable[CT_WHITE], cgs.media.qhFontSmall, -1, 0.8f); } x = 334+70; y = 86; cgi_SP_GetStringTextString( "INGAME_SHOTSFIRED", text, sizeof(text) ); w = cgi_R_Font_StrLenPixels(text, cgs.media.qhFontSmall, 0.8f); cgi_R_Font_DrawString(x, y, text, colorTable[CT_LTGOLD1], cgs.media.qhFontSmall, -1, 0.8f); cgi_R_Font_DrawString(x+w, y, va("%d",cg_entities[0].gent->client->sess.missionStats.shotsFired), colorTable[CT_WHITE], cgs.media.qhFontSmall, -1, 0.8f); y +=pad; cgi_SP_GetStringTextString( "INGAME_HITS", text, sizeof(text) ); w = cgi_R_Font_StrLenPixels(text, cgs.media.qhFontSmall, 0.8f); cgi_R_Font_DrawString(x, y, text, colorTable[CT_LTGOLD1], cgs.media.qhFontSmall, -1, 0.8f); cgi_R_Font_DrawString(x+w, y, va("%d",cg_entities[0].gent->client->sess.missionStats.hits), colorTable[CT_WHITE], cgs.media.qhFontSmall, -1, 0.8f); y +=pad; cgi_SP_GetStringTextString( "INGAME_ACCURACY", text, sizeof(text) ); w = cgi_R_Font_StrLenPixels(text, cgs.media.qhFontSmall, 0.8f); cgi_R_Font_DrawString(x, y, text, colorTable[CT_LTGOLD1], cgs.media.qhFontSmall, -1, 0.8f); const float percent = cg_entities[0].gent->client->sess.missionStats.shotsFired? 100.0f * (float)cg_entities[0].gent->client->sess.missionStats.hits / cg_entities[0].gent->client->sess.missionStats.shotsFired : 0; cgi_R_Font_DrawString(x+w, y, va("%.2f%%",percent), colorTable[CT_WHITE], cgs.media.qhFontSmall, -1, 0.8f); if ( cg_entities[0].gent->client->sess.missionStats.weaponUsed[WP_SABER] <= 0 ) { return; //don't have saber yet, so don't print any stats } //first column, FORCE POWERS y =180; cgi_SP_GetStringTextString( "INGAME_FORCEUSE", text, sizeof(text) ); cgi_R_Font_DrawString(x, y, text, colorTable[CT_WHITE], cgs.media.qhFontSmall, -1, 0.8f); y +=pad; cgi_SP_GetStringTextString( "INGAME_HEAL", text, sizeof(text) ); w = cgi_R_Font_StrLenPixels(text, cgs.media.qhFontSmall, 0.8f); cgi_R_Font_DrawString(x, y, text, colorTable[CT_LTGOLD1], cgs.media.qhFontSmall, -1, 0.8f); cgi_R_Font_DrawString(x+w, y, va("%d",cg_entities[0].gent->client->sess.missionStats.forceUsed[FP_HEAL]), colorTable[CT_WHITE], cgs.media.qhFontSmall, -1, 0.8f); y +=pad; cgi_SP_GetStringTextString( "INGAME_SPEED", text, sizeof(text) ); w = cgi_R_Font_StrLenPixels(text, cgs.media.qhFontSmall, 0.8f); cgi_R_Font_DrawString(x, y, text, colorTable[CT_LTGOLD1], cgs.media.qhFontSmall, -1, 0.8f); cgi_R_Font_DrawString(x+w, y, va("%d",cg_entities[0].gent->client->sess.missionStats.forceUsed[FP_SPEED]), colorTable[CT_WHITE], cgs.media.qhFontSmall, -1, 0.8f); y +=pad; cgi_SP_GetStringTextString( "INGAME_PULL", text, sizeof(text) ); w = cgi_R_Font_StrLenPixels(text, cgs.media.qhFontSmall, 0.8f); cgi_R_Font_DrawString(x, y, text, colorTable[CT_LTGOLD1], cgs.media.qhFontSmall, -1, 0.8f); cgi_R_Font_DrawString(x+w, y, va("%d",cg_entities[0].gent->client->sess.missionStats.forceUsed[FP_PULL]), colorTable[CT_WHITE], cgs.media.qhFontSmall, -1, 0.8f); y +=pad; cgi_SP_GetStringTextString( "INGAME_PUSH", text, sizeof(text) ); w = cgi_R_Font_StrLenPixels(text, cgs.media.qhFontSmall, 0.8f); cgi_R_Font_DrawString(x, y, text, colorTable[CT_LTGOLD1], cgs.media.qhFontSmall, -1, 0.8f); cgi_R_Font_DrawString(x+w, y, va("%d",cg_entities[0].gent->client->sess.missionStats.forceUsed[FP_PUSH]), colorTable[CT_WHITE], cgs.media.qhFontSmall, -1, 0.8f); y +=pad; cgi_SP_GetStringTextString("INGAME_MINDTRICK", text, sizeof(text) ); w = cgi_R_Font_StrLenPixels(text, cgs.media.qhFontSmall, 0.8f); cgi_R_Font_DrawString(x, y, text, colorTable[CT_LTGOLD1], cgs.media.qhFontSmall, -1, 0.8f); cgi_R_Font_DrawString(x+w, y, va("%d",cg_entities[0].gent->client->sess.missionStats.forceUsed[FP_TELEPATHY]), colorTable[CT_WHITE], cgs.media.qhFontSmall, -1, 0.8f); y +=pad; cgi_SP_GetStringTextString( "INGAME_GRIP", text, sizeof(text) ); w = cgi_R_Font_StrLenPixels(text, cgs.media.qhFontSmall, 0.8f); cgi_R_Font_DrawString(x, y, text, colorTable[CT_LTGOLD1], cgs.media.qhFontSmall, -1, 0.8f); cgi_R_Font_DrawString(x+w, y, va("%d",cg_entities[0].gent->client->sess.missionStats.forceUsed[FP_GRIP]), colorTable[CT_WHITE], cgs.media.qhFontSmall, -1, 0.8f); y +=pad; cgi_SP_GetStringTextString( "INGAME_LIGHTNING", text, sizeof(text) ); w = cgi_R_Font_StrLenPixels(text, cgs.media.qhFontSmall, 0.8f); cgi_R_Font_DrawString(x, y, text, colorTable[CT_LTGOLD1], cgs.media.qhFontSmall, -1, 0.8f); cgi_R_Font_DrawString(x+w, y, va("%d",cg_entities[0].gent->client->sess.missionStats.forceUsed[FP_LIGHTNING]), colorTable[CT_WHITE], cgs.media.qhFontSmall, -1, 0.8f); //second column, LIGHT SABER y = 180; x = 140; cgi_SP_GetStringTextString( "INGAME_LIGHTSABERUSE", text, sizeof(text) ); cgi_R_Font_DrawString(x, y, text, colorTable[CT_WHITE], cgs.media.qhFontSmall, -1, 0.8f); y +=pad; cgi_SP_GetStringTextString( "INGAME_THROWN", text, sizeof(text) ); w = cgi_R_Font_StrLenPixels(text, cgs.media.qhFontSmall, 0.8f); cgi_R_Font_DrawString(x, y, text, colorTable[CT_LTGOLD1], cgs.media.qhFontSmall, -1, 0.8f); cgi_R_Font_DrawString(x+w, y, va("%d",cg_entities[0].gent->client->sess.missionStats.saberThrownCnt), colorTable[CT_WHITE], cgs.media.qhFontSmall, -1, 0.8f); y +=pad; cgi_SP_GetStringTextString( "INGAME_BLOCKS", text, sizeof(text) ); w = cgi_R_Font_StrLenPixels(text, cgs.media.qhFontSmall, 0.8f); cgi_R_Font_DrawString(x, y, text, colorTable[CT_LTGOLD1], cgs.media.qhFontSmall, -1, 0.8f); cgi_R_Font_DrawString(x+w, y, va("%d",cg_entities[0].gent->client->sess.missionStats.saberBlocksCnt), colorTable[CT_WHITE], cgs.media.qhFontSmall, -1, 0.8f); y +=pad; cgi_SP_GetStringTextString( "INGAME_LEGATTACKS", text, sizeof(text) ); w = cgi_R_Font_StrLenPixels(text, cgs.media.qhFontSmall, 0.8f); cgi_R_Font_DrawString(x, y, text, colorTable[CT_LTGOLD1], cgs.media.qhFontSmall, -1, 0.8f); cgi_R_Font_DrawString(x+w, y, va("%d",cg_entities[0].gent->client->sess.missionStats.legAttacksCnt), colorTable[CT_WHITE], cgs.media.qhFontSmall, -1, 0.8f); y +=pad; cgi_SP_GetStringTextString( "INGAME_ARMATTACKS", text, sizeof(text) ); w = cgi_R_Font_StrLenPixels(text, cgs.media.qhFontSmall, 0.8f); cgi_R_Font_DrawString(x, y, text, colorTable[CT_LTGOLD1], cgs.media.qhFontSmall, -1, 0.8f); cgi_R_Font_DrawString(x+w, y, va("%d",cg_entities[0].gent->client->sess.missionStats.armAttacksCnt), colorTable[CT_WHITE], cgs.media.qhFontSmall, -1, 0.8f); y +=pad; cgi_SP_GetStringTextString( "INGAME_BODYATTACKS", text, sizeof(text) ); w = cgi_R_Font_StrLenPixels(text, cgs.media.qhFontSmall, 0.8f); cgi_R_Font_DrawString(x, y, text, colorTable[CT_LTGOLD1], cgs.media.qhFontSmall, -1, 0.8f); cgi_R_Font_DrawString(x+w, y, va("%d",cg_entities[0].gent->client->sess.missionStats.torsoAttacksCnt), colorTable[CT_WHITE], cgs.media.qhFontSmall, -1, 0.8f); y +=pad; cgi_SP_GetStringTextString( "INGAME_OTHERATTACKS", text, sizeof(text) ); w = cgi_R_Font_StrLenPixels(text, cgs.media.qhFontSmall, 0.8f); cgi_R_Font_DrawString(x, y, text, colorTable[CT_LTGOLD1], cgs.media.qhFontSmall, -1, 0.8f); cgi_R_Font_DrawString(x+w, y, va("%d",cg_entities[0].gent->client->sess.missionStats.otherAttacksCnt), colorTable[CT_WHITE], cgs.media.qhFontSmall, -1, 0.8f); }
/* ================= CG_DrawProportionalString ================= */ void CG_DrawProportionalString( int x, int y, const char* str, int style, vec4_t color ) { //assert(!style);//call this directly if you need style (OR it into the font handle) cgi_R_Font_DrawString (x, y, str, color, cgs.media.qhFontMedium, -1, 1.0f); }
/* ==================== CG_DrawInformation Draw all the status / pacifier stuff during level loading ==================== */ void CG_DrawInformation( void ) { int y; // draw the dialog background const char *info = CG_ConfigString( CS_SERVERINFO ); const char *s = Info_ValueForKey( info, "mapname" ); qhandle_t levelshot; extern SavedGameJustLoaded_e g_eSavedGameJustLoaded; // hack! (hey, it's the last week of coding, ok? // if ( g_eSavedGameJustLoaded == eFULL ) // { // levelshot = 0; //use the loaded thumbnail instead of the levelshot // } // else { levelshot = cgi_R_RegisterShaderNoMip( va( "levelshots/%s", s ) ); #ifndef FINAL_BUILD if (!levelshot && !strncmp(s, "work/",5) ) { levelshot = cgi_R_RegisterShaderNoMip( va( "levelshots/%s", s+5 ) ); } #endif if (!levelshot) { levelshot = cgi_R_RegisterShaderNoMip( "menu/art/unknownmap" ); } } if ( g_eSavedGameJustLoaded != eFULL && !strcmp(s,"yavin1") )//special case for first map! { char text[1024]={0}; // cgi_R_SetColor( colorTable[CT_BLACK] ); CG_DrawPic( 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, cgs.media.whiteShader ); cgi_SP_GetStringTextString( "SP_INGAME_ALONGTIME", text, sizeof(text) ); int w = cgi_R_Font_StrLenPixels(text,cgs.media.qhFontMedium, 1.0f); cgi_R_Font_DrawString((320)-(w/2), 140, text, colorTable[CT_ICON_BLUE], cgs.media.qhFontMedium, -1, 1.0f); } else { CG_DrawLoadingScreen(levelshot, s); cgi_UI_Menu_Paint( cgi_UI_GetMenuByName( "loadscreen" ), qtrue ); //cgi_UI_MenuPaintAll(); } CG_LoadBar(); // the first 150 rows are reserved for the client connection // screen to write into // if ( cg.processedSnapshotNum == 0 ) { // still loading // print the current item being loaded #ifdef _DEBUG cgi_R_Font_DrawString( 40, 416, va("LOADING ... %s",cg.infoScreenText),colorTable[CT_LTGOLD1], cgs.media.qhFontSmall, -1, 1.0f ); #endif } // draw info string information y = 20; // map-specific message (long map name) s = CG_ConfigString( CS_MESSAGE ); if ( s[0] ) { if (s[0] == '@') { char text[1024]={0}; cgi_SP_GetStringTextString( s+1, text, sizeof(text) ); cgi_R_Font_DrawString( 15, y, va("\"%s\"",text),colorTable[CT_WHITE],cgs.media.qhFontMedium, -1, 1.0f ); } else { cgi_R_Font_DrawString( 15, y, va("\"%s\"",s),colorTable[CT_WHITE],cgs.media.qhFontMedium, -1, 1.0f ); } y += 20; } }
/* ==================== ObjectivePrint_Line Print a single mission objective ==================== */ static void ObjectivePrint_Line(const int color, const int objectIndex, int &missionYcnt) { char *str,*strBegin; int y,pixelLen,charLen,i; const int maxHoldText = 1024; char holdText[maxHoldText]; char finalText[2048]; qhandle_t graphic; int iYPixelsPerLine = cgi_R_Font_HeightPixels(cgs.media.qhFontMedium, 1.0f); cgi_SP_GetStringTextString( va("OBJECTIVES_%s",objectiveTable[objectIndex].name) , finalText, sizeof(finalText) ); // A hack to be able to count prisoners if (objectIndex==T2_RANCOR_OBJ5) { char value[64]; int currTotal, minTotal; gi.Cvar_VariableStringBuffer("ui_prisonerobj_currtotal",value,sizeof(value)); currTotal = atoi(value); gi.Cvar_VariableStringBuffer("ui_prisonerobj_maxtotal",value,sizeof(value)); minTotal = atoi(value); Q_strncpyz(finalText, va(finalText,currTotal,minTotal), sizeof(finalText)); } pixelLen = cgi_R_Font_StrLenPixels(finalText, cgs.media.qhFontMedium, 1.0f); str = finalText; if (cgi_Language_IsAsian()) { // this is execrable, and should NOT have had to've been done now, but... // extern const char *CG_DisplayBoxedText( int iBoxX, int iBoxY, int iBoxWidth, int iBoxHeight, const char *psText, int iFontHandle, float fScale, const vec4_t v4Color); extern int giLinesOutput; extern float gfAdvanceHack; gfAdvanceHack = 1.0f; // override internal vertical advance y = objectiveStartingYpos + (iYPixelsPerLine * missionYcnt); // Advance line if a graphic has printed for (i=0;i<MAX_OBJ_GRAPHICS;i++) { if (obj_graphics[i]) { y += OBJ_GRAPHIC_SIZE + 4; } } CG_DisplayBoxedText( objectiveStartingXpos, y, objectiveTextBoxWidth, objectiveTextBoxHeight, finalText, // int iBoxX, int iBoxY, int iBoxWidth, int iBoxHeight, const char *psText cgs.media.qhFontMedium, // int iFontHandle, 1.0f, // float fScale, colorTable[color] // const vec4_t v4Color ); gfAdvanceHack = 0.0f; // restore missionYcnt += giLinesOutput; } else { // western... // if (pixelLen < objectiveTextBoxWidth) // One shot - small enough to print entirely on one line { y =objectiveStartingYpos + (iYPixelsPerLine * (missionYcnt)); cgi_R_Font_DrawString ( objectiveStartingXpos, y, str, colorTable[color], cgs.media.qhFontMedium, -1, 1.0f); ++missionYcnt; } // Text is too long, break into lines. else { char holdText2[2]; pixelLen = 0; charLen = 0; holdText2[1] = '\0'; strBegin = str; while( *str ) { holdText2[0] = *str; pixelLen += cgi_R_Font_StrLenPixels(holdText2, cgs.media.qhFontMedium, 1.0f); pixelLen += 2; // For kerning ++charLen; if (pixelLen > objectiveTextBoxWidth ) { //Reached max length of this line //step back until we find a space while ((charLen>10) && (*str != ' ' )) { --str; --charLen; } if (*str==' ') { ++str; // To get past space } assert( charLen<maxHoldText ); // Too big? Q_strncpyz( holdText, strBegin, charLen); holdText[charLen] = '\0'; strBegin = str; pixelLen = 0; charLen = 1; y = objectiveStartingYpos + (iYPixelsPerLine * missionYcnt); CG_DrawProportionalString( objectiveStartingXpos, y, holdText, CG_SMALLFONT, colorTable[color] ); ++missionYcnt; } else if (*(str+1) == '\0') { ++charLen; assert( charLen<maxHoldText ); // Too big? y = objectiveStartingYpos + (iYPixelsPerLine * missionYcnt); Q_strncpyz( holdText, strBegin, charLen); CG_DrawProportionalString( objectiveStartingXpos, y, holdText, CG_SMALLFONT, colorTable[color] ); ++missionYcnt; break; } ++str; } } } if (objectIndex == T3_BOUNTY_OBJ1) { y =objectiveStartingYpos + (iYPixelsPerLine * missionYcnt); if (obj_graphics[1]) { y += OBJ_GRAPHIC_SIZE + 4; } if (obj_graphics[2]) { y += OBJ_GRAPHIC_SIZE + 4; } graphic = cgi_R_RegisterShaderNoMip("textures/system/viewscreen1"); CG_DrawPic( 355, 50, OBJ_GRAPHIC_SIZE, OBJ_GRAPHIC_SIZE, graphic ); obj_graphics[3] = qtrue; } }
/* ==================== CG_DrawDataPadObjectives Draw routine for the objective info screen of the data pad. ==================== */ void CG_DrawDataPadObjectives(const centity_t *cent ) { int i,totalY; int iYPixelsPerLine = cgi_R_Font_HeightPixels(cgs.media.qhFontMedium, 1.0f); const short titleXPos = objectiveStartingXpos - 22; // X starting position for title text const short titleYPos = objectiveStartingYpos - 23; // Y starting position for title text const short graphic_size = 16; // Size (width and height) of graphic used to show status of objective const short graphicXpos = objectiveStartingXpos - graphic_size - 8; // Amount of X to backup from text starting position const short graphicYOffset = (iYPixelsPerLine - graphic_size)/2; // Amount of Y to raise graphic so it's in the center of the text line missionInfo_Updated = qfalse; // This will stop the text from flashing cg.missionInfoFlashTime = 0; // zero out objective graphics for (i=0;i<MAX_OBJ_GRAPHICS;i++) { obj_graphics[i] = qfalse; } // Title Text at the top char text[1024]={0}; cgi_SP_GetStringTextString( "SP_INGAME_OBJECTIVES", text, sizeof(text) ); cgi_R_Font_DrawString (titleXPos, titleYPos, text, colorTable[CT_TITLE], cgs.media.qhFontMedium, -1, 1.0f); int missionYcnt = 0; // Print all active objectives for (i=0;i<MAX_OBJECTIVES;i++) { // Is there an objective to see? if (cent->gent->client->sess.mission_objectives[i].display) { // Calculate the Y position totalY = objectiveStartingYpos + (iYPixelsPerLine * (missionYcnt))+(iYPixelsPerLine/2); // Draw graphics that show if mission has been accomplished or not cgi_R_SetColor(colorTable[CT_BLUE3]); CG_DrawPic( (graphicXpos), (totalY-graphicYOffset), graphic_size, graphic_size, cgs.media.messageObjCircle); // Circle in front if (cent->gent->client->sess.mission_objectives[i].status == OBJECTIVE_STAT_SUCCEEDED) { CG_DrawPic( (graphicXpos), (totalY-graphicYOffset), graphic_size, graphic_size, cgs.media.messageLitOn); // Center Dot } // Print current objective text ObjectivePrint_Line(CT_WHITE, i, missionYcnt ); } } // No mission text? if (!missionYcnt) { // Set the message a quarter of the way down and in the center of the text box int messageYPosition = objectiveStartingYpos + (objectiveTextBoxHeight / 4); cgi_SP_GetStringTextString( "SP_INGAME_OBJNONE", text, sizeof(text) ); int messageXPosition = objectiveStartingXpos + (objectiveTextBoxWidth/2) - (cgi_R_Font_StrLenPixels(text, cgs.media.qhFontMedium, 1.0f) /2); cgi_R_Font_DrawString ( messageXPosition, messageYPosition, text, colorTable[CT_WHITE], cgs.media.qhFontMedium, -1, 1.0f); } }
/* ==================== CG_DrawInformation Draw all the status / pacifier stuff during level loading overylays UI_DrawConnectText from ui_connect.cpp ==================== */ void CG_DrawInformation( void ) { int y; // draw the dialog background const char *info = CG_ConfigString( CS_SERVERINFO ); const char *s = Info_ValueForKey( info, "mapname" ); const qhandle_t levelshot = cgi_R_RegisterShaderNoMip( va( "levelshots/%s", s ) ); extern SavedGameJustLoaded_e g_eSavedGameJustLoaded; // hack! (hey, it's the last week of coding, ok? if ( !levelshot || g_eSavedGameJustLoaded == eFULL ) { // keep whatever's in the screen buffer so far (either the last ingame rendered-image (eg for maptransition) // or the screenshot built-in to a loaded save game... // cgi_R_DrawScreenShot( 0, 480, 640, -480 ); } else { // put up the pre-defined levelshot for this map... // cgi_R_SetColor( NULL ); CG_DrawPic( 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, levelshot ); } if ( g_eSavedGameJustLoaded != eFULL && !strcmp(s,"kejim_post") )//special case for first map! { char text[1024]={0}; cgi_SP_GetStringTextString( "INGAME_ALONGTIME", text, sizeof(text) ); int w = cgi_R_Font_StrLenPixels(text,cgs.media.qhFontMedium, 1.0f); cgi_R_Font_DrawString((320)-(w/2), 140, text, colorTable[CT_ICON_BLUE], cgs.media.qhFontMedium, -1, 1.0f); } else if (cg_missionstatusscreen.integer ) { CG_MissionCompletion(); } CG_LoadBar(); // the first 150 rows are reserved for the client connection // screen to write into if ( cg.processedSnapshotNum == 0 ) { // still loading // print the current item being loaded #ifndef NDEBUG cgi_R_Font_DrawString( 48, 398, va("LOADING ... %s",cg.infoScreenText),colorTable[CT_LTGOLD1], cgs.media.qhFontSmall, -1, 1.0f ); #endif } // draw info string information y = 20; // map-specific message (long map name) s = CG_ConfigString( CS_MESSAGE ); if ( s[0] ) { if (s[0] == '@') { char text[1024]={0}; cgi_SP_GetStringTextString( s+1, text, sizeof(text) ); cgi_R_Font_DrawString( 15, y, va("\"%s\"",text),colorTable[CT_WHITE],cgs.media.qhFontMedium, -1, 1.0f ); } else { cgi_R_Font_DrawString( 15, y, va("\"%s\"",s),colorTable[CT_WHITE],cgs.media.qhFontMedium, -1, 1.0f ); } y += 20; } }
/* ==================== MissionPrint_Line ==================== */ static void MissionPrint_Line(const int color, const int objectIndex, int &missionYcnt) { char *str,*strBegin; int y,pixelLen,charLen; char holdText[1024] ; char finalText[2048]; qhandle_t graphic; int iYPixelsPerLine = cgi_R_Font_HeightPixels(cgs.media.qhFontMedium, 1.0f) * (cgi_Language_IsAsian() ? 1.2f : 1.0f ); #ifndef __NO_JKA if( gi.Cvar_VariableIntegerValue("com_demo") ) { cgi_SP_GetStringTextString( va("OBJECTIVES_DEMO_%s",objectiveTable[objectIndex].name) , finalText, sizeof(finalText) ); } else { cgi_SP_GetStringTextString( va("OBJECTIVES_%s",objectiveTable[objectIndex].name) , finalText, sizeof(finalText) ); } #else cgi_SP_GetStringText( PACKAGE_OBJECTIVES<<8|objectIndex , finalText, sizeof(finalText) ); #endif pixelLen = cgi_R_Font_StrLenPixels(finalText, cgs.media.qhFontMedium, 1.0f); str = finalText; /* CG_DisplayBoxedText(70,50,500,300,finalText, cgs.media.qhFontSmall, 1.0f, colorTable[color] ); */ if (pixelLen < 500) // One shot - small enough to print entirely on one line { y =missionYpos + (iYPixelsPerLine * (missionYcnt)); if (obj_graphics[0]) { y += 32 + 4; } if (obj_graphics[1]) { y += 32 + 4; } if (obj_graphics[2]) { y += 32 + 4; } //CG_DrawProportionalString(108, y,str, CG_SMALLFONT, colorTable[color] ); cgi_R_Font_DrawString (108, y, str, colorTable[color], cgs.media.qhFontMedium, -1, 1.0f); ++missionYcnt; } // Text is too long, break into lines. else { char holdText2[2]; pixelLen = 0; charLen = 0; holdText2[1] = NULL; strBegin = str; while( *str ) { holdText2[0] = *str; pixelLen += cgi_R_Font_StrLenPixels(holdText2, cgs.media.qhFontMedium, 1.0f); pixelLen += 2; // For kerning ++charLen; if (pixelLen > 500 ) { //Reached max length of this line //step back until we find a space while ((charLen) && (*str != ' ' )) { --str; --charLen; } if (*str==' ') { ++str; // To get past space } Q_strncpyz( holdText, strBegin, charLen); holdText[charLen] = NULL; strBegin = str; pixelLen = 0; charLen = 1; y = missionYpos + (iYPixelsPerLine * missionYcnt); CG_DrawProportionalString(108, y, holdText, CG_SMALLFONT, colorTable[color] ); ++missionYcnt; } else if (*(str+1) == NULL) { ++charLen; y = missionYpos + (iYPixelsPerLine * missionYcnt); Q_strncpyz( holdText, strBegin, charLen); CG_DrawProportionalString(108, y, holdText, CG_SMALLFONT, colorTable[color] ); ++missionYcnt; break; } ++str; } } // Special case hack if (objectIndex == DOOM_COMM_OBJ4) { y = missionYpos + (iYPixelsPerLine * missionYcnt); graphic = cgi_R_RegisterShaderNoMip("textures/system/securitycode"); CG_DrawPic( 320 - (128/2), y+8, 128, 32, graphic ); obj_graphics[0] = qtrue; } else if (objectIndex == KEJIM_POST_OBJ3) { y = missionYpos + (iYPixelsPerLine * missionYcnt); graphic = cgi_R_RegisterShaderNoMip("textures/system/securitycode_red"); CG_DrawPic( 320 - (32/2), y+8, 32, 32, graphic ); obj_graphics[1] = qtrue; } else if (objectIndex == KEJIM_POST_OBJ4) { y =missionYpos + (iYPixelsPerLine * missionYcnt); if (obj_graphics[1]) { y += 32 + 4; } graphic = cgi_R_RegisterShaderNoMip("textures/system/securitycode_green"); CG_DrawPic( 320 - (32/2), y+8, 32, 32, graphic ); obj_graphics[2] = qtrue; } else if (objectIndex == KEJIM_POST_OBJ5) { y =missionYpos + (iYPixelsPerLine * missionYcnt); if (obj_graphics[1]) { y += 32 + 4; } if (obj_graphics[2]) { y += 32 + 4; } graphic = cgi_R_RegisterShaderNoMip("textures/system/securitycode_blue"); CG_DrawPic( 320 - (32/2), y+8, 32, 32, graphic ); obj_graphics[3] = qtrue; } }