1 /*
2 ===========================================================================
3 Copyright (C) 1999-2005 Id Software, Inc.
4 
5 This file is part of Quake III Arena source code.
6 
7 Quake III Arena source code is free software; you can redistribute it
8 and/or modify it under the terms of the GNU General Public License as
9 published by the Free Software Foundation; either version 2 of the License,
10 or (at your option) any later version.
11 
12 Quake III Arena source code is distributed in the hope that it will be
13 useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16 
17 You should have received a copy of the GNU General Public License
18 along with Quake III Arena source code; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
20 ===========================================================================
21 */
22 //
23 #include "ui_local.h"
24 
25 
26 #define ART_BACK0		"menu/art/back_0"
27 #define ART_BACK1		"menu/art/back_1"
28 #define ART_FRAMEL		"menu/art/frame2_l"
29 #define ART_FRAMER		"menu/art/frame1_r"
30 
31 #define VERTICAL_SPACING	30
32 
33 #define ID_BACK			10
34 #define ID_CIN_IDLOGO	11
35 #define ID_CIN_INTRO	12
36 #define ID_CIN_TIER1	13
37 #define ID_CIN_TIER2	14
38 #define ID_CIN_TIER3	15
39 #define ID_CIN_TIER4	16
40 #define ID_CIN_TIER5	17
41 #define ID_CIN_TIER6	18
42 #define ID_CIN_TIER7	19
43 #define ID_CIN_END		20
44 
45 
46 typedef struct {
47 	menuframework_s	menu;
48 	menutext_s		banner;
49 	menubitmap_s	framel;
50 	menubitmap_s	framer;
51 	menutext_s		cin_idlogo;
52 	menutext_s		cin_intro;
53 	menutext_s		cin_tier1;
54 	menutext_s		cin_tier2;
55 	menutext_s		cin_tier3;
56 	menutext_s		cin_tier4;
57 	menutext_s		cin_tier5;
58 	menutext_s		cin_tier6;
59 	menutext_s		cin_tier7;
60 	menutext_s		cin_end;
61 	menubitmap_s	back;
62 } cinematicsMenuInfo_t;
63 
64 static cinematicsMenuInfo_t	cinematicsMenuInfo;
65 
66 static char *cinematics[] = {
67 	"idlogo",
68 	"intro",
69 	"tier1",
70 	"tier2",
71 	"tier3",
72 	"tier4",
73 	"tier5",
74 	"tier6",
75 	"tier7",
76 	"end"
77 };
78 
79 /*
80 ===============
81 UI_CinematicsMenu_BackEvent
82 ===============
83 */
UI_CinematicsMenu_BackEvent(void * ptr,int event)84 static void UI_CinematicsMenu_BackEvent( void *ptr, int event ) {
85 	if( event != QM_ACTIVATED ) {
86 		return;
87 	}
88 	UI_PopMenu();
89 }
90 
91 
92 /*
93 ===============
94 UI_CinematicsMenu_Event
95 ===============
96 */
UI_CinematicsMenu_Event(void * ptr,int event)97 static void UI_CinematicsMenu_Event( void *ptr, int event ) {
98 	int		n;
99 
100 	if (event != QM_ACTIVATED)
101 		return;
102 
103 	n = ((menucommon_s*)ptr)->id - ID_CIN_IDLOGO;
104 	trap_Cvar_Set( "nextmap", va( "ui_cinematics %i", n ) );
105 	if( uis.demoversion && ((menucommon_s*)ptr)->id == ID_CIN_END ) {
106 		trap_Cmd_ExecuteText( EXEC_APPEND, "disconnect; cinematic demoEnd.RoQ 1\n" );
107 	}
108 	else {
109 		trap_Cmd_ExecuteText( EXEC_APPEND, va( "disconnect; cinematic %s.RoQ\n", cinematics[n] ) );
110 	}
111 }
112 
113 
114 /*
115 ===============
116 UI_CinematicsMenu_Init
117 ===============
118 */
UI_CinematicsMenu_Init(void)119 static void UI_CinematicsMenu_Init( void ) {
120 	int		y;
121 
122 	UI_CinematicsMenu_Cache();
123 
124 	memset( &cinematicsMenuInfo, 0, sizeof(cinematicsMenuInfo) );
125 	cinematicsMenuInfo.menu.fullscreen = qtrue;
126 
127 	cinematicsMenuInfo.banner.generic.type		= MTYPE_BTEXT;
128 	cinematicsMenuInfo.banner.generic.x			= 320;
129 	cinematicsMenuInfo.banner.generic.y			= 16;
130 	cinematicsMenuInfo.banner.string			= "CINEMATICS";
131 	cinematicsMenuInfo.banner.color				= color_white;
132 	cinematicsMenuInfo.banner.style				= UI_CENTER;
133 
134 	cinematicsMenuInfo.framel.generic.type		= MTYPE_BITMAP;
135 	cinematicsMenuInfo.framel.generic.name		= ART_FRAMEL;
136 	cinematicsMenuInfo.framel.generic.flags		= QMF_INACTIVE;
137 	cinematicsMenuInfo.framel.generic.x			= 0;
138 	cinematicsMenuInfo.framel.generic.y			= 78;
139 	cinematicsMenuInfo.framel.width  			= 256;
140 	cinematicsMenuInfo.framel.height  			= 329;
141 
142 	cinematicsMenuInfo.framer.generic.type		= MTYPE_BITMAP;
143 	cinematicsMenuInfo.framer.generic.name		= ART_FRAMER;
144 	cinematicsMenuInfo.framer.generic.flags		= QMF_INACTIVE;
145 	cinematicsMenuInfo.framer.generic.x			= 376;
146 	cinematicsMenuInfo.framer.generic.y			= 76;
147 	cinematicsMenuInfo.framer.width  			= 256;
148 	cinematicsMenuInfo.framer.height  			= 334;
149 
150 	y = 100;
151 	cinematicsMenuInfo.cin_idlogo.generic.type		= MTYPE_PTEXT;
152 	cinematicsMenuInfo.cin_idlogo.generic.flags		= QMF_CENTER_JUSTIFY|QMF_PULSEIFFOCUS;
153 	cinematicsMenuInfo.cin_idlogo.generic.x			= 320;
154 	cinematicsMenuInfo.cin_idlogo.generic.y			= y;
155 	cinematicsMenuInfo.cin_idlogo.generic.id		= ID_CIN_IDLOGO;
156 	cinematicsMenuInfo.cin_idlogo.generic.callback	= UI_CinematicsMenu_Event;
157 	cinematicsMenuInfo.cin_idlogo.string			= "ID LOGO";
158 	cinematicsMenuInfo.cin_idlogo.color				= color_red;
159 	cinematicsMenuInfo.cin_idlogo.style				= UI_CENTER;
160 
161 	y += VERTICAL_SPACING;
162 	cinematicsMenuInfo.cin_intro.generic.type		= MTYPE_PTEXT;
163 	cinematicsMenuInfo.cin_intro.generic.flags		= QMF_CENTER_JUSTIFY|QMF_PULSEIFFOCUS;
164 	cinematicsMenuInfo.cin_intro.generic.x			= 320;
165 	cinematicsMenuInfo.cin_intro.generic.y			= y;
166 	cinematicsMenuInfo.cin_intro.generic.id			= ID_CIN_INTRO;
167 	cinematicsMenuInfo.cin_intro.generic.callback	= UI_CinematicsMenu_Event;
168 	cinematicsMenuInfo.cin_intro.string				= "INTRO";
169 	cinematicsMenuInfo.cin_intro.color				= color_red;
170 	cinematicsMenuInfo.cin_intro.style				= UI_CENTER;
171 	if( uis.demoversion ) {
172 		cinematicsMenuInfo.cin_intro.generic.flags |= QMF_GRAYED;
173 	}
174 
175 	y += VERTICAL_SPACING;
176 	cinematicsMenuInfo.cin_tier1.generic.type		= MTYPE_PTEXT;
177 	cinematicsMenuInfo.cin_tier1.generic.flags		= QMF_CENTER_JUSTIFY|QMF_PULSEIFFOCUS;
178 	cinematicsMenuInfo.cin_tier1.generic.x			= 320;
179 	cinematicsMenuInfo.cin_tier1.generic.y			= y;
180 	cinematicsMenuInfo.cin_tier1.generic.id			= ID_CIN_TIER1;
181 	cinematicsMenuInfo.cin_tier1.generic.callback	= UI_CinematicsMenu_Event;
182 	cinematicsMenuInfo.cin_tier1.string				= "Tier 1";
183 	cinematicsMenuInfo.cin_tier1.color				= color_red;
184 	cinematicsMenuInfo.cin_tier1.style				= UI_CENTER;
185 	if( !UI_CanShowTierVideo( 1 ) ) {
186 		cinematicsMenuInfo.cin_tier1.generic.flags |= QMF_GRAYED;
187 	}
188 
189 	y += VERTICAL_SPACING;
190 	cinematicsMenuInfo.cin_tier2.generic.type		= MTYPE_PTEXT;
191 	cinematicsMenuInfo.cin_tier2.generic.flags		= QMF_CENTER_JUSTIFY|QMF_PULSEIFFOCUS;
192 	cinematicsMenuInfo.cin_tier2.generic.x			= 320;
193 	cinematicsMenuInfo.cin_tier2.generic.y			= y;
194 	cinematicsMenuInfo.cin_tier2.generic.id			= ID_CIN_TIER2;
195 	cinematicsMenuInfo.cin_tier2.generic.callback	= UI_CinematicsMenu_Event;
196 	cinematicsMenuInfo.cin_tier2.string				= "Tier 2";
197 	cinematicsMenuInfo.cin_tier2.color				= color_red;
198 	cinematicsMenuInfo.cin_tier2.style				= UI_CENTER;
199 	if( !UI_CanShowTierVideo( 2 ) ) {
200 		cinematicsMenuInfo.cin_tier2.generic.flags |= QMF_GRAYED;
201 	}
202 
203 	y += VERTICAL_SPACING;
204 	cinematicsMenuInfo.cin_tier3.generic.type		= MTYPE_PTEXT;
205 	cinematicsMenuInfo.cin_tier3.generic.flags		= QMF_CENTER_JUSTIFY|QMF_PULSEIFFOCUS;
206 	cinematicsMenuInfo.cin_tier3.generic.x			= 320;
207 	cinematicsMenuInfo.cin_tier3.generic.y			= y;
208 	cinematicsMenuInfo.cin_tier3.generic.id			= ID_CIN_TIER3;
209 	cinematicsMenuInfo.cin_tier3.generic.callback	= UI_CinematicsMenu_Event;
210 	cinematicsMenuInfo.cin_tier3.string				= "Tier 3";
211 	cinematicsMenuInfo.cin_tier3.color				= color_red;
212 	cinematicsMenuInfo.cin_tier3.style				= UI_CENTER;
213 	if( !UI_CanShowTierVideo( 3 ) ) {
214 		cinematicsMenuInfo.cin_tier3.generic.flags |= QMF_GRAYED;
215 	}
216 
217 	y += VERTICAL_SPACING;
218 	cinematicsMenuInfo.cin_tier4.generic.type		= MTYPE_PTEXT;
219 	cinematicsMenuInfo.cin_tier4.generic.flags		= QMF_CENTER_JUSTIFY|QMF_PULSEIFFOCUS;
220 	cinematicsMenuInfo.cin_tier4.generic.x			= 320;
221 	cinematicsMenuInfo.cin_tier4.generic.y			= y;
222 	cinematicsMenuInfo.cin_tier4.generic.id			= ID_CIN_TIER4;
223 	cinematicsMenuInfo.cin_tier4.generic.callback	= UI_CinematicsMenu_Event;
224 	cinematicsMenuInfo.cin_tier4.string				= "Tier 4";
225 	cinematicsMenuInfo.cin_tier4.color				= color_red;
226 	cinematicsMenuInfo.cin_tier4.style				= UI_CENTER;
227 	if( !UI_CanShowTierVideo( 4 ) ) {
228 		cinematicsMenuInfo.cin_tier4.generic.flags |= QMF_GRAYED;
229 	}
230 
231 	y += VERTICAL_SPACING;
232 	cinematicsMenuInfo.cin_tier5.generic.type		= MTYPE_PTEXT;
233 	cinematicsMenuInfo.cin_tier5.generic.flags		= QMF_CENTER_JUSTIFY|QMF_PULSEIFFOCUS;
234 	cinematicsMenuInfo.cin_tier5.generic.x			= 320;
235 	cinematicsMenuInfo.cin_tier5.generic.y			= y;
236 	cinematicsMenuInfo.cin_tier5.generic.id			= ID_CIN_TIER5;
237 	cinematicsMenuInfo.cin_tier5.generic.callback	= UI_CinematicsMenu_Event;
238 	cinematicsMenuInfo.cin_tier5.string				= "Tier 5";
239 	cinematicsMenuInfo.cin_tier5.color				= color_red;
240 	cinematicsMenuInfo.cin_tier5.style				= UI_CENTER;
241 	if( !UI_CanShowTierVideo( 5 ) ) {
242 		cinematicsMenuInfo.cin_tier5.generic.flags |= QMF_GRAYED;
243 	}
244 
245 	y += VERTICAL_SPACING;
246 	cinematicsMenuInfo.cin_tier6.generic.type		= MTYPE_PTEXT;
247 	cinematicsMenuInfo.cin_tier6.generic.flags		= QMF_CENTER_JUSTIFY|QMF_PULSEIFFOCUS;
248 	cinematicsMenuInfo.cin_tier6.generic.x			= 320;
249 	cinematicsMenuInfo.cin_tier6.generic.y			= y;
250 	cinematicsMenuInfo.cin_tier6.generic.id			= ID_CIN_TIER6;
251 	cinematicsMenuInfo.cin_tier6.generic.callback	= UI_CinematicsMenu_Event;
252 	cinematicsMenuInfo.cin_tier6.string				= "Tier 6";
253 	cinematicsMenuInfo.cin_tier6.color				= color_red;
254 	cinematicsMenuInfo.cin_tier6.style				= UI_CENTER;
255 	if( !UI_CanShowTierVideo( 6 ) ) {
256 		cinematicsMenuInfo.cin_tier6.generic.flags |= QMF_GRAYED;
257 	}
258 
259 	y += VERTICAL_SPACING;
260 	cinematicsMenuInfo.cin_tier7.generic.type		= MTYPE_PTEXT;
261 	cinematicsMenuInfo.cin_tier7.generic.flags		= QMF_CENTER_JUSTIFY|QMF_PULSEIFFOCUS;
262 	cinematicsMenuInfo.cin_tier7.generic.x			= 320;
263 	cinematicsMenuInfo.cin_tier7.generic.y			= y;
264 	cinematicsMenuInfo.cin_tier7.generic.id			= ID_CIN_TIER7;
265 	cinematicsMenuInfo.cin_tier7.generic.callback	= UI_CinematicsMenu_Event;
266 	cinematicsMenuInfo.cin_tier7.string				= "Tier 7";
267 	cinematicsMenuInfo.cin_tier7.color				= color_red;
268 	cinematicsMenuInfo.cin_tier7.style				= UI_CENTER;
269 	if( !UI_CanShowTierVideo( 7 ) ) {
270 		cinematicsMenuInfo.cin_tier7.generic.flags |= QMF_GRAYED;
271 	}
272 
273 	y += VERTICAL_SPACING;
274 	cinematicsMenuInfo.cin_end.generic.type			= MTYPE_PTEXT;
275 	cinematicsMenuInfo.cin_end.generic.flags		= QMF_CENTER_JUSTIFY|QMF_PULSEIFFOCUS;
276 	cinematicsMenuInfo.cin_end.generic.x			= 320;
277 	cinematicsMenuInfo.cin_end.generic.y			= y;
278 	cinematicsMenuInfo.cin_end.generic.id			= ID_CIN_END;
279 	cinematicsMenuInfo.cin_end.generic.callback		= UI_CinematicsMenu_Event;
280 	cinematicsMenuInfo.cin_end.string				= "END";
281 	cinematicsMenuInfo.cin_end.color				= color_red;
282 	cinematicsMenuInfo.cin_end.style				= UI_CENTER;
283 	if( !UI_CanShowTierVideo( 8 ) ) {
284 		cinematicsMenuInfo.cin_end.generic.flags |= QMF_GRAYED;
285 	}
286 
287 	cinematicsMenuInfo.back.generic.type		= MTYPE_BITMAP;
288 	cinematicsMenuInfo.back.generic.name		= ART_BACK0;
289 	cinematicsMenuInfo.back.generic.flags		= QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS;
290 	cinematicsMenuInfo.back.generic.id			= ID_BACK;
291 	cinematicsMenuInfo.back.generic.callback	= UI_CinematicsMenu_BackEvent;
292 	cinematicsMenuInfo.back.generic.x			= 0;
293 	cinematicsMenuInfo.back.generic.y			= 480-64;
294 	cinematicsMenuInfo.back.width				= 128;
295 	cinematicsMenuInfo.back.height				= 64;
296 	cinematicsMenuInfo.back.focuspic			= ART_BACK1;
297 
298 	Menu_AddItem( &cinematicsMenuInfo.menu, &cinematicsMenuInfo.banner );
299 	Menu_AddItem( &cinematicsMenuInfo.menu, &cinematicsMenuInfo.framel );
300 	Menu_AddItem( &cinematicsMenuInfo.menu, &cinematicsMenuInfo.framer );
301 	Menu_AddItem( &cinematicsMenuInfo.menu, &cinematicsMenuInfo.cin_idlogo );
302 	Menu_AddItem( &cinematicsMenuInfo.menu, &cinematicsMenuInfo.cin_intro );
303 	Menu_AddItem( &cinematicsMenuInfo.menu, &cinematicsMenuInfo.cin_tier1 );
304 	Menu_AddItem( &cinematicsMenuInfo.menu, &cinematicsMenuInfo.cin_tier2 );
305 	Menu_AddItem( &cinematicsMenuInfo.menu, &cinematicsMenuInfo.cin_tier3 );
306 	Menu_AddItem( &cinematicsMenuInfo.menu, &cinematicsMenuInfo.cin_tier4 );
307 	Menu_AddItem( &cinematicsMenuInfo.menu, &cinematicsMenuInfo.cin_tier5 );
308 	Menu_AddItem( &cinematicsMenuInfo.menu, &cinematicsMenuInfo.cin_tier6 );
309 	Menu_AddItem( &cinematicsMenuInfo.menu, &cinematicsMenuInfo.cin_tier7 );
310 	Menu_AddItem( &cinematicsMenuInfo.menu, &cinematicsMenuInfo.cin_end );
311 	Menu_AddItem( &cinematicsMenuInfo.menu, &cinematicsMenuInfo.back );
312 }
313 
314 
315 /*
316 =================
317 UI_CinematicsMenu_Cache
318 =================
319 */
UI_CinematicsMenu_Cache(void)320 void UI_CinematicsMenu_Cache( void ) {
321 	trap_R_RegisterShaderNoMip( ART_BACK0 );
322 	trap_R_RegisterShaderNoMip( ART_BACK1 );
323 	trap_R_RegisterShaderNoMip( ART_FRAMEL );
324 	trap_R_RegisterShaderNoMip( ART_FRAMER );
325 }
326 
327 
328 /*
329 ===============
330 UI_CinematicsMenu
331 ===============
332 */
UI_CinematicsMenu(void)333 void UI_CinematicsMenu( void ) {
334 	UI_CinematicsMenu_Init();
335 	UI_PushMenu( &cinematicsMenuInfo.menu );
336 }
337 
338 
339 /*
340 ===============
341 UI_CinematicsMenu_f
342 ===============
343 */
UI_CinematicsMenu_f(void)344 void UI_CinematicsMenu_f( void ) {
345 	int		n;
346 
347 	n = atoi( UI_Argv( 1 ) );
348 	UI_CinematicsMenu();
349 	Menu_SetCursorToItem( &cinematicsMenuInfo.menu, cinematicsMenuInfo.menu.items[n + 3] );
350 }
351