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