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