1 /*
2 ===========================================================================
3 Copyright (C) 1999 - 2005, Id Software, Inc.
4 Copyright (C) 2000 - 2013, Raven Software, Inc.
5 Copyright (C) 2001 - 2013, Activision, Inc.
6 Copyright (C) 2013 - 2015, OpenJK contributors
7
8 This file is part of the OpenJK source code.
9
10 OpenJK is free software; you can redistribute it and/or modify it
11 under the terms of the GNU General Public License version 2 as
12 published by the Free Software Foundation.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, see <http://www.gnu.org/licenses/>.
21 ===========================================================================
22 */
23
24 #include "cg_headers.h"
25
26 #include "cg_media.h"
27 #include "../game/objectives.h"
28 #include "../game/b_local.h"
29
30 #define SCOREBOARD_WIDTH (26*BIGCHAR_WIDTH)
31
32
33 /*
34 static void Scoreboard_Draw( void )
35 {
36 vec4_t newColor;
37 /*
38 player = g_entities[0];
39 if( player->client->ps.persistant[PERS_ACCURACY_SHOTS] ) {
40 accuracy = player->client->ps.persistant[PERS_ACCURACY_HITS] * 100 / player->client->ps.persistant[PERS_ACCURACY_SHOTS];
41 }
42 */
43 /* cg.LCARSTextTime = 0; // Turn off LCARS screen
44
45 // Background
46 newColor[0] = colorTable[CT_BLACK][0];
47 newColor[1] = colorTable[CT_BLACK][1];
48 newColor[2] = colorTable[CT_BLACK][2];
49 newColor[3] = 0.5;
50 cgi_R_SetColor(newColor);
51 CG_DrawPic( 137, 73, 475, 300, cgs.media.whiteShader); // Background
52 CG_DrawPic( 120, 99, 18, 256, cgs.media.whiteShader); // Background
53 CG_DrawPic( 40, 94, 66, 266, cgs.media.whiteShader); // Background
54
55 // Right side box
56 cgi_R_SetColor( colorTable[CT_DKBROWN1]);
57 CG_DrawPic( 120, 354, 32, 32, cgs.media.status_corner_16_18);
58 CG_DrawPic( 94, 356, 16, 32, cgs.media.status_corner_8_16_b);
59 CG_DrawPic( 94, 73, 16, 32, cgs.media.status_corner_8_22);
60
61 CG_DrawPic(135,73, 302, 22, cgs.media.whiteShader); // Top
62
63 CG_DrawPic(120, 100, 18, 12, cgs.media.whiteShader); // Middle Top
64 CG_DrawPic(120, 353, 18, 4, cgs.media.whiteShader); // Middle Bottom
65
66 CG_DrawPic(130,357, 482, 18, cgs.media.whiteShader); // Bottom
67
68 // Left side box
69 cgi_R_SetColor( colorTable[CT_DKBROWN1]);
70 CG_DrawPic(40,73, 56, 22, cgs.media.whiteShader); // Top
71
72 CG_DrawPic(98,95, 8, 17, cgs.media.whiteShader); // Middle Top
73 CG_DrawPic(98,353, 8, 7, cgs.media.whiteShader); // Middle Bottom
74
75 CG_DrawPic(40,357, 58, 18, cgs.media.whiteShader); // Bottom
76
77 CG_DrawProportionalString( 356, 208, "%", UI_RIGHT | UI_SMALLFONT, colorTable[CT_LTPURPLE1] );
78 CG_DrawProportionalString( 610, 72, ingame_text[IGT_MISSIONANALYSIS],UI_RIGHT| CG_BIGFONT, colorTable[CT_LTORANGE] );
79
80 CG_PrintScreenGraphics(statsmenu_graphics,SMG_MAX);
81
82 }
83 */
84
85
86
87 /*
88 =================
89 CG_MissionFailed
90 =================
91 */
92 int statusTextIndex = -1;
CG_MissionFailed(void)93 void CG_MissionFailed(void)
94 {
95 char *text;
96
97 if (!cg.missionFailedScreen)
98 {
99 cgi_UI_SetActive_Menu("missionfailed_menu");
100 cg.missionFailedScreen = qtrue;
101
102 switch (statusTextIndex)
103 {
104 case -1: //Our HERO DIED!!!
105 text = "@SP_INGAME_MISSIONFAILED_PLAYER";
106 break;
107 case MISSIONFAILED_JAN:
108 text = "@SP_INGAME_MISSIONFAILED_JAN";
109 break;
110 case MISSIONFAILED_LUKE:
111 text = "@SP_INGAME_MISSIONFAILED_LUKE";
112 break;
113 case MISSIONFAILED_LANDO:
114 text = "@SP_INGAME_MISSIONFAILED_LANDO";
115 break;
116 case MISSIONFAILED_R5D2:
117 text = "@SP_INGAME_MISSIONFAILED_R5D2";
118 break;
119 case MISSIONFAILED_WARDEN:
120 text = "@SP_INGAME_MISSIONFAILED_WARDEN";
121 break;
122 case MISSIONFAILED_PRISONERS:
123 text = "@SP_INGAME_MISSIONFAILED_PRISONERS";
124 break;
125 case MISSIONFAILED_EMPLACEDGUNS:
126 text = "@SP_INGAME_MISSIONFAILED_EMPLACEDGUNS";
127 break;
128 case MISSIONFAILED_LADYLUCK:
129 text = "@SP_INGAME_MISSIONFAILED_LADYLUCK";
130 break;
131 case MISSIONFAILED_KYLECAPTURE:
132 text = "@SP_INGAME_MISSIONFAILED_KYLECAPTURE";
133 break;
134 case MISSIONFAILED_TOOMANYALLIESDIED:
135 text = "@SP_INGAME_MISSIONFAILED_TOOMANYALLIESDIED";
136 break;
137
138 case MISSIONFAILED_CHEWIE:
139 text = "@SP_INGAME_MISSIONFAILED_CHEWIE";
140 break;
141
142 case MISSIONFAILED_KYLE:
143 text = "@SP_INGAME_MISSIONFAILED_KYLE";
144 break;
145
146 case MISSIONFAILED_ROSH:
147 text = "@SP_INGAME_MISSIONFAILED_ROSH";
148 break;
149
150 case MISSIONFAILED_WEDGE:
151 text = "@SP_INGAME_MISSIONFAILED_WEDGE";
152 break;
153
154 case MISSIONFAILED_TURNED:
155 text = "@SP_INGAME_MISSIONFAILED_TURNED";
156 break;
157
158 default:
159 text = "@SP_INGAME_MISSIONFAILED_UNKNOWN";
160 break;
161 }
162
163 gi.cvar_set("ui_missionfailed_text", text);
164 }
165 // w = cgi_R_Font_StrLenPixels(text, cgs.media.qhFontMedium, 1.2f);
166 // cgi_R_Font_DrawString(320 - w/2, y+30, text, colorTable[CT_HUD_RED], cgs.media.qhFontMedium, -1, 1.2f);
167
168 // cgi_SP_GetStringTextString( "SP_INGAME_RELOADMISSION", text, sizeof(text) );
169 // w = cgi_R_Font_StrLenPixels(text, cgs.media.qhFontSmall, 1.0f);
170 // cgi_R_Font_DrawString(320 - w/2, 450, text, colorTable[CT_CYAN], cgs.media.qhFontSmall, -1, 1.0f);
171
172 }
173
174 /*
175 =================
176 CG_MissionCompletion
177 =================
178 */
179 #if 0
180 /*
181 void CG_MissionCompletion(void)
182 {
183 char text[1024]={0};
184 int w,x,y;
185 const int pad = 18;
186
187 cgi_SP_GetStringTextString( "SP_INGAME_MISSIONCOMPLETION", text, sizeof(text) );
188 w = cgi_R_Font_StrLenPixels(text, cgs.media.qhFontMedium, 1.2f);
189 cgi_R_Font_DrawString(320 - w/2, 53, text, colorTable[CT_LTGOLD1], cgs.media.qhFontMedium, -1, 1.2f);
190
191 x = 75;
192 y =86;
193 cgi_SP_GetStringTextString( "SP_INGAME_SECRETAREAS", text, sizeof(text) );
194 w = cgi_R_Font_StrLenPixels(text, cgs.media.qhFontSmall, 0.8f);
195 cgi_R_Font_DrawString(x, y, text, colorTable[CT_LTGOLD1], cgs.media.qhFontSmall, -1, 0.8f);
196 cgi_SP_GetStringTextString( "SP_INGAME_SECRETAREAS_OF", text, sizeof(text) );
197 cgi_R_Font_DrawString(x+w, y, va("%d %s %d",
198 cg_entities[0].gent->client->sess.missionStats.secretsFound,
199 text,
200 cg_entities[0].gent->client->sess.missionStats.totalSecrets
201 ),
202 colorTable[CT_WHITE], cgs.media.qhFontSmall, -1, 0.8f);
203
204 y +=pad;
205 cgi_SP_GetStringTextString( "SP_INGAME_ENEMIESKILLED", text, sizeof(text) );
206 w = cgi_R_Font_StrLenPixels(text, cgs.media.qhFontSmall, 0.8f);
207 cgi_R_Font_DrawString(x, y, text, colorTable[CT_LTGOLD1], cgs.media.qhFontSmall, -1, 0.8f);
208 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);
209 /*
210 cgi_SP_GetStringTextString( "SP_INGAME_SECRETAREAS_OF", text, sizeof(text) );
211 cgi_R_Font_DrawString(x+w,y, va("%d %s %d",
212 cg_entities[0].gent->client->sess.missionStats.enemiesKilled,
213 text,
214 cg_entities[0].gent->client->sess.missionStats.enemiesSpawned
215 ),
216 colorTable[CT_WHITE], cgs.media.qhFontSmall, -1, 0.8f);
217 */
218
219 y +=pad;
220 y +=pad;
221 cgi_SP_GetStringTextString( "SP_INGAME_FAVORITEWEAPON", text, sizeof(text) );
222 w = cgi_R_Font_StrLenPixels(text, cgs.media.qhFontSmall, 0.8f);
223 cgi_R_Font_DrawString(x, y, text, colorTable[CT_LTGOLD1], cgs.media.qhFontSmall, -1, 0.8f);
224
225 int wpn=0,i;
226 int max_wpn = cg_entities[0].gent->client->sess.missionStats.weaponUsed[0];
227 for (i = 1; i<WP_NUM_WEAPONS; i++)
228 {
229 if (cg_entities[0].gent->client->sess.missionStats.weaponUsed[i] > max_wpn)
230 {
231 max_wpn = cg_entities[0].gent->client->sess.missionStats.weaponUsed[i];
232 wpn = i;
233 }
234 }
235
236 if ( wpn )
237 {
238 gitem_t *wItem= FindItemForWeapon( (weapon_t)wpn);
239 cgi_SP_GetStringTextString( va("SP_INGAME_%s",wItem->classname ), text, sizeof( text ));
240 // cgi_R_Font_DrawString(x+w, y, va("%d",wpn), colorTable[CT_WHITE], cgs.media.qhFontSmall, -1, 0.8f);
241 cgi_R_Font_DrawString(x+w, y, text, colorTable[CT_WHITE], cgs.media.qhFontSmall, -1, 0.8f);
242 }
243
244 x = 334+70;
245 y = 86;
246 cgi_SP_GetStringTextString( "SP_INGAME_SHOTSFIRED", text, sizeof(text) );
247 w = cgi_R_Font_StrLenPixels(text, cgs.media.qhFontSmall, 0.8f);
248 cgi_R_Font_DrawString(x, y, text, colorTable[CT_LTGOLD1], cgs.media.qhFontSmall, -1, 0.8f);
249 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);
250
251
252 y +=pad;
253 cgi_SP_GetStringTextString( "SP_INGAME_HITS", text, sizeof(text) );
254 w = cgi_R_Font_StrLenPixels(text, cgs.media.qhFontSmall, 0.8f);
255 cgi_R_Font_DrawString(x, y, text, colorTable[CT_LTGOLD1], cgs.media.qhFontSmall, -1, 0.8f);
256 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);
257
258
259 y +=pad;
260 cgi_SP_GetStringTextString( "SP_INGAME_ACCURACY", text, sizeof(text) );
261 w = cgi_R_Font_StrLenPixels(text, cgs.media.qhFontSmall, 0.8f);
262 cgi_R_Font_DrawString(x, y, text, colorTable[CT_LTGOLD1], cgs.media.qhFontSmall, -1, 0.8f);
263 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;
264 cgi_R_Font_DrawString(x+w, y, va("%.2f%%",percent), colorTable[CT_WHITE], cgs.media.qhFontSmall, -1, 0.8f);
265
266 if ( cg_entities[0].gent->client->sess.missionStats.weaponUsed[WP_SABER] <= 0 )
267 {
268 return; //don't have saber yet, so don't print any stats
269 }
270 //first column, FORCE POWERS
271 y =180;
272 cgi_SP_GetStringTextString( "SP_INGAME_FORCEUSE", text, sizeof(text) );
273 cgi_R_Font_DrawString(x, y, text, colorTable[CT_WHITE], cgs.media.qhFontSmall, -1, 0.8f);
274
275 y +=pad;
276 cgi_SP_GetStringTextString( "SP_INGAME_HEAL", text, sizeof(text) );
277 w = cgi_R_Font_StrLenPixels(text, cgs.media.qhFontSmall, 0.8f);
278 cgi_R_Font_DrawString(x, y, text, colorTable[CT_LTGOLD1], cgs.media.qhFontSmall, -1, 0.8f);
279 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);
280
281 y +=pad;
282 cgi_SP_GetStringTextString( "SP_INGAME_SPEED", text, sizeof(text) );
283 w = cgi_R_Font_StrLenPixels(text, cgs.media.qhFontSmall, 0.8f);
284 cgi_R_Font_DrawString(x, y, text, colorTable[CT_LTGOLD1], cgs.media.qhFontSmall, -1, 0.8f);
285 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);
286
287 y +=pad;
288 cgi_SP_GetStringTextString( "SP_INGAME_PULL", text, sizeof(text) );
289 w = cgi_R_Font_StrLenPixels(text, cgs.media.qhFontSmall, 0.8f);
290 cgi_R_Font_DrawString(x, y, text, colorTable[CT_LTGOLD1], cgs.media.qhFontSmall, -1, 0.8f);
291 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);
292
293 y +=pad;
294 cgi_SP_GetStringTextString( "SP_INGAME_PUSH", text, sizeof(text) );
295 w = cgi_R_Font_StrLenPixels(text, cgs.media.qhFontSmall, 0.8f);
296 cgi_R_Font_DrawString(x, y, text, colorTable[CT_LTGOLD1], cgs.media.qhFontSmall, -1, 0.8f);
297 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);
298
299 y +=pad;
300 cgi_SP_GetStringTextString("SP_INGAME_MINDTRICK", text, sizeof(text) );
301 w = cgi_R_Font_StrLenPixels(text, cgs.media.qhFontSmall, 0.8f);
302 cgi_R_Font_DrawString(x, y, text, colorTable[CT_LTGOLD1], cgs.media.qhFontSmall, -1, 0.8f);
303 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);
304
305 y +=pad;
306 cgi_SP_GetStringTextString( "SP_INGAME_GRIP", text, sizeof(text) );
307 w = cgi_R_Font_StrLenPixels(text, cgs.media.qhFontSmall, 0.8f);
308 cgi_R_Font_DrawString(x, y, text, colorTable[CT_LTGOLD1], cgs.media.qhFontSmall, -1, 0.8f);
309 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);
310
311 y +=pad;
312 cgi_SP_GetStringTextString( "SP_INGAME_LIGHTNING", text, sizeof(text) );
313 w = cgi_R_Font_StrLenPixels(text, cgs.media.qhFontSmall, 0.8f);
314 cgi_R_Font_DrawString(x, y, text, colorTable[CT_LTGOLD1], cgs.media.qhFontSmall, -1, 0.8f);
315 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);
316
317 //second column, LIGHT SABER
318 y = 180;
319 x = 140;
320 cgi_SP_GetStringTextString( "SP_INGAME_LIGHTSABERUSE", text, sizeof(text) );
321 cgi_R_Font_DrawString(x, y, text, colorTable[CT_WHITE], cgs.media.qhFontSmall, -1, 0.8f);
322
323 y +=pad;
324 cgi_SP_GetStringTextString( "SP_INGAME_THROWN", text, sizeof(text) );
325 w = cgi_R_Font_StrLenPixels(text, cgs.media.qhFontSmall, 0.8f);
326 cgi_R_Font_DrawString(x, y, text, colorTable[CT_LTGOLD1], cgs.media.qhFontSmall, -1, 0.8f);
327 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);
328
329 y +=pad;
330 cgi_SP_GetStringTextString( "SP_INGAME_BLOCKS", text, sizeof(text) );
331 w = cgi_R_Font_StrLenPixels(text, cgs.media.qhFontSmall, 0.8f);
332 cgi_R_Font_DrawString(x, y, text, colorTable[CT_LTGOLD1], cgs.media.qhFontSmall, -1, 0.8f);
333 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);
334
335 y +=pad;
336 cgi_SP_GetStringTextString( "SP_INGAME_LEGATTACKS", text, sizeof(text) );
337 w = cgi_R_Font_StrLenPixels(text, cgs.media.qhFontSmall, 0.8f);
338 cgi_R_Font_DrawString(x, y, text, colorTable[CT_LTGOLD1], cgs.media.qhFontSmall, -1, 0.8f);
339 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);
340
341 y +=pad;
342 cgi_SP_GetStringTextString( "SP_INGAME_ARMATTACKS", text, sizeof(text) );
343 w = cgi_R_Font_StrLenPixels(text, cgs.media.qhFontSmall, 0.8f);
344 cgi_R_Font_DrawString(x, y, text, colorTable[CT_LTGOLD1], cgs.media.qhFontSmall, -1, 0.8f);
345 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);
346
347 y +=pad;
348 cgi_SP_GetStringTextString( "SP_INGAME_BODYATTACKS", text, sizeof(text) );
349 w = cgi_R_Font_StrLenPixels(text, cgs.media.qhFontSmall, 0.8f);
350 cgi_R_Font_DrawString(x, y, text, colorTable[CT_LTGOLD1], cgs.media.qhFontSmall, -1, 0.8f);
351 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);
352
353 y +=pad;
354 cgi_SP_GetStringTextString( "SP_INGAME_OTHERATTACKS", text, sizeof(text) );
355 w = cgi_R_Font_StrLenPixels(text, cgs.media.qhFontSmall, 0.8f);
356 cgi_R_Font_DrawString(x, y, text, colorTable[CT_LTGOLD1], cgs.media.qhFontSmall, -1, 0.8f);
357 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);
358 }
359 */
360 #endif
361
362 /*
363 =================
364 CG_DrawScoreboard
365
366 Draw the normal in-game scoreboard
367 return value is bool to NOT draw centerstring
368 =================
369 */
CG_DrawScoreboard(void)370 qboolean CG_DrawScoreboard( void )
371 {
372 // don't draw anything if the menu is up
373 if ( cg_paused.integer )
374 {
375 return qfalse;
376 }
377
378 // Character is either dead, or a script has brought up the screen
379 if (((cg.predicted_player_state.pm_type == PM_DEAD) && (cg.missionStatusDeadTime < level.time))
380 || (cg.missionStatusShow))
381 {
382 CG_MissionFailed();
383 return qtrue;
384 }
385
386 return qfalse;
387 }
388
ScoreBoardReset(void)389 void ScoreBoardReset(void)
390 {
391 }
392
393 //================================================================================
394
395