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 /*
24 =======================================================================
25 
26 CD KEY MENU
27 
28 =======================================================================
29 */
30 
31 
32 #include "ui_local.h"
33 
34 
35 #define ART_FRAME		"menu/art/cut_frame"
36 #define ART_ACCEPT0		"menu/art/accept_0"
37 #define ART_ACCEPT1		"menu/art/accept_1"
38 #define ART_BACK0		"menu/art/back_0"
39 #define ART_BACK1		"menu/art/back_1"
40 
41 #define ID_CDKEY		10
42 #define ID_ACCEPT		11
43 #define ID_BACK			12
44 
45 
46 typedef struct {
47 	menuframework_s	menu;
48 
49 	menutext_s		banner;
50 	menubitmap_s	frame;
51 
52 	menufield_s		cdkey;
53 
54 	menubitmap_s	accept;
55 	menubitmap_s	back;
56 } cdkeyMenuInfo_t;
57 
58 static cdkeyMenuInfo_t	cdkeyMenuInfo;
59 
60 
61 /*
62 ===============
63 UI_CDKeyMenu_Event
64 ===============
65 */
UI_CDKeyMenu_Event(void * ptr,int event)66 static void UI_CDKeyMenu_Event( void *ptr, int event ) {
67 	if( event != QM_ACTIVATED ) {
68 		return;
69 	}
70 
71 	switch( ((menucommon_s*)ptr)->id ) {
72 	case ID_ACCEPT:
73 		if( cdkeyMenuInfo.cdkey.field.buffer[0] ) {
74 			trap_SetCDKey( cdkeyMenuInfo.cdkey.field.buffer );
75 		}
76 		UI_PopMenu();
77 		break;
78 
79 	case ID_BACK:
80 		UI_PopMenu();
81 		break;
82 	}
83 }
84 
85 
86 /*
87 =================
88 UI_CDKeyMenu_PreValidateKey
89 =================
90 */
UI_CDKeyMenu_PreValidateKey(const char * key)91 static int UI_CDKeyMenu_PreValidateKey( const char *key ) {
92 	char	ch;
93 
94 	if( strlen( key ) != 16 ) {
95 		return 1;
96 	}
97 
98 	while( ( ch = *key++ ) ) {
99 		switch( ch ) {
100 		case '2':
101 		case '3':
102 		case '7':
103 		case 'a':
104 		case 'b':
105 		case 'c':
106 		case 'd':
107 		case 'g':
108 		case 'h':
109 		case 'j':
110 		case 'l':
111 		case 'p':
112 		case 'r':
113 		case 's':
114 		case 't':
115 		case 'w':
116 			continue;
117 		default:
118 			return -1;
119 		}
120 	}
121 
122 	return 0;
123 }
124 
125 
126 /*
127 =================
128 UI_CDKeyMenu_DrawKey
129 =================
130 */
UI_CDKeyMenu_DrawKey(void * self)131 static void UI_CDKeyMenu_DrawKey( void *self ) {
132 	menufield_s		*f;
133 	qboolean		focus;
134 	int				style;
135 	char			c;
136 	float			*color;
137 	int				x, y;
138 	int				val;
139 
140 	f = (menufield_s *)self;
141 
142 	focus = (f->generic.parent->cursor == f->generic.menuPosition);
143 
144 	style = UI_LEFT;
145 	if( focus ) {
146 		color = color_yellow;
147 	}
148 	else {
149 		color = color_orange;
150 	}
151 
152 	x = 320 - 8 * BIGCHAR_WIDTH;
153 	y = 240 - BIGCHAR_HEIGHT / 2;
154 	UI_FillRect( x, y, 16 * BIGCHAR_WIDTH, BIGCHAR_HEIGHT, listbar_color );
155 	UI_DrawString( x, y, f->field.buffer, style, color );
156 
157 	// draw cursor if we have focus
158 	if( focus ) {
159 		if ( trap_Key_GetOverstrikeMode() ) {
160 			c = 11;
161 		} else {
162 			c = 10;
163 		}
164 
165 		style &= ~UI_PULSE;
166 		style |= UI_BLINK;
167 
168 		UI_DrawChar( x + f->field.cursor * BIGCHAR_WIDTH, y, c, style, color_white );
169 	}
170 
171 	val = UI_CDKeyMenu_PreValidateKey( f->field.buffer );
172 	if( val == 1 ) {
173 		UI_DrawProportionalString( 320, 376, "Please enter your CD Key", UI_CENTER|UI_SMALLFONT, color_yellow );
174 	}
175 	else if ( val == 0 ) {
176 		UI_DrawProportionalString( 320, 376, "The CD Key appears to be valid, thank you", UI_CENTER|UI_SMALLFONT, color_white );
177 	}
178 	else {
179 		UI_DrawProportionalString( 320, 376, "The CD Key is not valid", UI_CENTER|UI_SMALLFONT, color_red );
180 	}
181 }
182 
183 
184 /*
185 ===============
186 UI_CDKeyMenu_Init
187 ===============
188 */
UI_CDKeyMenu_Init(void)189 static void UI_CDKeyMenu_Init( void ) {
190 	trap_Cvar_Set( "ui_cdkeychecked", "1" );
191 
192 	UI_CDKeyMenu_Cache();
193 
194 	memset( &cdkeyMenuInfo, 0, sizeof(cdkeyMenuInfo) );
195 	cdkeyMenuInfo.menu.wrapAround = qtrue;
196 	cdkeyMenuInfo.menu.fullscreen = qtrue;
197 
198 	cdkeyMenuInfo.banner.generic.type				= MTYPE_BTEXT;
199 	cdkeyMenuInfo.banner.generic.x					= 320;
200 	cdkeyMenuInfo.banner.generic.y					= 16;
201 	cdkeyMenuInfo.banner.string						= "CD KEY";
202 	cdkeyMenuInfo.banner.color						= color_white;
203 	cdkeyMenuInfo.banner.style						= UI_CENTER;
204 
205 	cdkeyMenuInfo.frame.generic.type				= MTYPE_BITMAP;
206 	cdkeyMenuInfo.frame.generic.name				= ART_FRAME;
207 	cdkeyMenuInfo.frame.generic.flags				= QMF_INACTIVE;
208 	cdkeyMenuInfo.frame.generic.x					= 142;
209 	cdkeyMenuInfo.frame.generic.y					= 118;
210 	cdkeyMenuInfo.frame.width  						= 359;
211 	cdkeyMenuInfo.frame.height  					= 256;
212 
213 	cdkeyMenuInfo.cdkey.generic.type				= MTYPE_FIELD;
214 	cdkeyMenuInfo.cdkey.generic.name				= "CD Key:";
215 	cdkeyMenuInfo.cdkey.generic.flags				= QMF_LOWERCASE;
216 	cdkeyMenuInfo.cdkey.generic.x					= 320 - BIGCHAR_WIDTH * 2.5;
217 	cdkeyMenuInfo.cdkey.generic.y					= 240 - BIGCHAR_HEIGHT / 2;
218 	cdkeyMenuInfo.cdkey.field.widthInChars			= 16;
219 	cdkeyMenuInfo.cdkey.field.maxchars				= 16;
220 	cdkeyMenuInfo.cdkey.generic.ownerdraw			= UI_CDKeyMenu_DrawKey;
221 
222 	cdkeyMenuInfo.accept.generic.type				= MTYPE_BITMAP;
223 	cdkeyMenuInfo.accept.generic.name				= ART_ACCEPT0;
224 	cdkeyMenuInfo.accept.generic.flags				= QMF_RIGHT_JUSTIFY|QMF_PULSEIFFOCUS;
225 	cdkeyMenuInfo.accept.generic.id					= ID_ACCEPT;
226 	cdkeyMenuInfo.accept.generic.callback			= UI_CDKeyMenu_Event;
227 	cdkeyMenuInfo.accept.generic.x					= 640;
228 	cdkeyMenuInfo.accept.generic.y					= 480-64;
229 	cdkeyMenuInfo.accept.width						= 128;
230 	cdkeyMenuInfo.accept.height						= 64;
231 	cdkeyMenuInfo.accept.focuspic					= ART_ACCEPT1;
232 
233 	cdkeyMenuInfo.back.generic.type					= MTYPE_BITMAP;
234 	cdkeyMenuInfo.back.generic.name					= ART_BACK0;
235 	cdkeyMenuInfo.back.generic.flags				= QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS;
236 	cdkeyMenuInfo.back.generic.id					= ID_BACK;
237 	cdkeyMenuInfo.back.generic.callback				= UI_CDKeyMenu_Event;
238 	cdkeyMenuInfo.back.generic.x					= 0;
239 	cdkeyMenuInfo.back.generic.y					= 480-64;
240 	cdkeyMenuInfo.back.width						= 128;
241 	cdkeyMenuInfo.back.height						= 64;
242 	cdkeyMenuInfo.back.focuspic						= ART_BACK1;
243 
244 	Menu_AddItem( &cdkeyMenuInfo.menu, &cdkeyMenuInfo.banner );
245 	Menu_AddItem( &cdkeyMenuInfo.menu, &cdkeyMenuInfo.frame );
246 	Menu_AddItem( &cdkeyMenuInfo.menu, &cdkeyMenuInfo.cdkey );
247 	Menu_AddItem( &cdkeyMenuInfo.menu, &cdkeyMenuInfo.accept );
248 	if( uis.menusp ) {
249 		Menu_AddItem( &cdkeyMenuInfo.menu, &cdkeyMenuInfo.back );
250 	}
251 
252 	trap_GetCDKey( cdkeyMenuInfo.cdkey.field.buffer, cdkeyMenuInfo.cdkey.field.maxchars + 1 );
253 	if( trap_VerifyCDKey( cdkeyMenuInfo.cdkey.field.buffer, NULL ) == qfalse ) {
254 		cdkeyMenuInfo.cdkey.field.buffer[0] = 0;
255 	}
256 }
257 
258 
259 /*
260 =================
261 UI_CDKeyMenu_Cache
262 =================
263 */
UI_CDKeyMenu_Cache(void)264 void UI_CDKeyMenu_Cache( void ) {
265 	trap_R_RegisterShaderNoMip( ART_ACCEPT0 );
266 	trap_R_RegisterShaderNoMip( ART_ACCEPT1 );
267 	trap_R_RegisterShaderNoMip( ART_BACK0 );
268 	trap_R_RegisterShaderNoMip( ART_BACK1 );
269 	trap_R_RegisterShaderNoMip( ART_FRAME );
270 }
271 
272 
273 /*
274 ===============
275 UI_CDKeyMenu
276 ===============
277 */
UI_CDKeyMenu(void)278 void UI_CDKeyMenu( void ) {
279 	UI_CDKeyMenu_Init();
280 	UI_PushMenu( &cdkeyMenuInfo.menu );
281 }
282 
283 
284 /*
285 ===============
286 UI_CDKeyMenu_f
287 ===============
288 */
UI_CDKeyMenu_f(void)289 void UI_CDKeyMenu_f( void ) {
290 	UI_CDKeyMenu();
291 }
292