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 	SPECIFY SERVER
27 *********************************************************************************/
28 
29 #define SPECIFYSERVER_FRAMEL	"menu/art/frame2_l"
30 #define SPECIFYSERVER_FRAMER	"menu/art/frame1_r"
31 #define SPECIFYSERVER_BACK0		"menu/art/back_0"
32 #define SPECIFYSERVER_BACK1		"menu/art/back_1"
33 #define SPECIFYSERVER_FIGHT0	"menu/art/fight_0"
34 #define SPECIFYSERVER_FIGHT1	"menu/art/fight_1"
35 
36 #define ID_SPECIFYSERVERBACK	102
37 #define ID_SPECIFYSERVERGO		103
38 
39 static char* specifyserver_artlist[] =
40 {
41 	SPECIFYSERVER_FRAMEL,
42 	SPECIFYSERVER_FRAMER,
43 	SPECIFYSERVER_BACK0,
44 	SPECIFYSERVER_BACK1,
45 	SPECIFYSERVER_FIGHT0,
46 	SPECIFYSERVER_FIGHT1,
47 	NULL
48 };
49 
50 typedef struct
51 {
52 	menuframework_s	menu;
53 	menutext_s		banner;
54 	menubitmap_s	framel;
55 	menubitmap_s	framer;
56 	menufield_s		domain;
57 	menufield_s		port;
58 	menubitmap_s	go;
59 	menubitmap_s	back;
60 } specifyserver_t;
61 
62 static specifyserver_t	s_specifyserver;
63 
64 /*
65 =================
66 SpecifyServer_Event
67 =================
68 */
SpecifyServer_Event(void * ptr,int event)69 static void SpecifyServer_Event( void* ptr, int event )
70 {
71 	char	buff[256];
72 
73 	switch (((menucommon_s*)ptr)->id)
74 	{
75 		case ID_SPECIFYSERVERGO:
76 			if (event != QM_ACTIVATED)
77 				break;
78 
79 			if (s_specifyserver.domain.field.buffer[0])
80 			{
81 				strcpy(buff,s_specifyserver.domain.field.buffer);
82 				if (s_specifyserver.port.field.buffer[0])
83 					Com_sprintf( buff+strlen(buff), 128, ":%s", s_specifyserver.port.field.buffer );
84 
85 				trap_Cmd_ExecuteText( EXEC_APPEND, va( "connect %s\n", buff ) );
86 			}
87 			break;
88 
89 		case ID_SPECIFYSERVERBACK:
90 			if (event != QM_ACTIVATED)
91 				break;
92 
93 			UI_PopMenu();
94 			break;
95 	}
96 }
97 
98 /*
99 =================
100 SpecifyServer_MenuInit
101 =================
102 */
SpecifyServer_MenuInit(void)103 void SpecifyServer_MenuInit( void )
104 {
105 	// zero set all our globals
106 	memset( &s_specifyserver, 0 ,sizeof(specifyserver_t) );
107 
108 	SpecifyServer_Cache();
109 
110 	s_specifyserver.menu.wrapAround = qtrue;
111 	s_specifyserver.menu.fullscreen = qtrue;
112 
113 	s_specifyserver.banner.generic.type	 = MTYPE_BTEXT;
114 	s_specifyserver.banner.generic.x     = 320;
115 	s_specifyserver.banner.generic.y     = 16;
116 	s_specifyserver.banner.string		 = "SPECIFY SERVER";
117 	s_specifyserver.banner.color  		 = color_white;
118 	s_specifyserver.banner.style  		 = UI_CENTER;
119 
120 	s_specifyserver.framel.generic.type  = MTYPE_BITMAP;
121 	s_specifyserver.framel.generic.name  = SPECIFYSERVER_FRAMEL;
122 	s_specifyserver.framel.generic.flags = QMF_INACTIVE;
123 	s_specifyserver.framel.generic.x	 = 0;
124 	s_specifyserver.framel.generic.y	 = 78;
125 	s_specifyserver.framel.width  	     = 256;
126 	s_specifyserver.framel.height  	     = 329;
127 
128 	s_specifyserver.framer.generic.type  = MTYPE_BITMAP;
129 	s_specifyserver.framer.generic.name  = SPECIFYSERVER_FRAMER;
130 	s_specifyserver.framer.generic.flags = QMF_INACTIVE;
131 	s_specifyserver.framer.generic.x	 = 376;
132 	s_specifyserver.framer.generic.y	 = 76;
133 	s_specifyserver.framer.width  	     = 256;
134 	s_specifyserver.framer.height  	     = 334;
135 
136 	s_specifyserver.domain.generic.type       = MTYPE_FIELD;
137 	s_specifyserver.domain.generic.name       = "Address:";
138 	s_specifyserver.domain.generic.flags      = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
139 	s_specifyserver.domain.generic.x	      = 206;
140 	s_specifyserver.domain.generic.y	      = 220;
141 	s_specifyserver.domain.field.widthInChars = 38;
142 	s_specifyserver.domain.field.maxchars     = 80;
143 
144 	s_specifyserver.port.generic.type       = MTYPE_FIELD;
145 	s_specifyserver.port.generic.name	    = "Port:";
146 	s_specifyserver.port.generic.flags	    = QMF_PULSEIFFOCUS|QMF_SMALLFONT|QMF_NUMBERSONLY;
147 	s_specifyserver.port.generic.x	        = 206;
148 	s_specifyserver.port.generic.y	        = 250;
149 	s_specifyserver.port.field.widthInChars = 6;
150 	s_specifyserver.port.field.maxchars     = 5;
151 
152 	s_specifyserver.go.generic.type	    = MTYPE_BITMAP;
153 	s_specifyserver.go.generic.name     = SPECIFYSERVER_FIGHT0;
154 	s_specifyserver.go.generic.flags    = QMF_RIGHT_JUSTIFY|QMF_PULSEIFFOCUS;
155 	s_specifyserver.go.generic.callback = SpecifyServer_Event;
156 	s_specifyserver.go.generic.id	    = ID_SPECIFYSERVERGO;
157 	s_specifyserver.go.generic.x		= 640;
158 	s_specifyserver.go.generic.y		= 480-64;
159 	s_specifyserver.go.width  		    = 128;
160 	s_specifyserver.go.height  		    = 64;
161 	s_specifyserver.go.focuspic         = SPECIFYSERVER_FIGHT1;
162 
163 	s_specifyserver.back.generic.type	  = MTYPE_BITMAP;
164 	s_specifyserver.back.generic.name     = SPECIFYSERVER_BACK0;
165 	s_specifyserver.back.generic.flags    = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS;
166 	s_specifyserver.back.generic.callback = SpecifyServer_Event;
167 	s_specifyserver.back.generic.id	      = ID_SPECIFYSERVERBACK;
168 	s_specifyserver.back.generic.x		  = 0;
169 	s_specifyserver.back.generic.y		  = 480-64;
170 	s_specifyserver.back.width  		  = 128;
171 	s_specifyserver.back.height  		  = 64;
172 	s_specifyserver.back.focuspic         = SPECIFYSERVER_BACK1;
173 
174 	Menu_AddItem( &s_specifyserver.menu, &s_specifyserver.banner );
175 	Menu_AddItem( &s_specifyserver.menu, &s_specifyserver.framel );
176 	Menu_AddItem( &s_specifyserver.menu, &s_specifyserver.framer );
177 	Menu_AddItem( &s_specifyserver.menu, &s_specifyserver.domain );
178 	Menu_AddItem( &s_specifyserver.menu, &s_specifyserver.port );
179 	Menu_AddItem( &s_specifyserver.menu, &s_specifyserver.go );
180 	Menu_AddItem( &s_specifyserver.menu, &s_specifyserver.back );
181 
182 	Com_sprintf( s_specifyserver.port.field.buffer, 6, "%i", 27960 );
183 }
184 
185 /*
186 =================
187 SpecifyServer_Cache
188 =================
189 */
SpecifyServer_Cache(void)190 void SpecifyServer_Cache( void )
191 {
192 	int	i;
193 
194 	// touch all our pics
195 	for (i=0; ;i++)
196 	{
197 		if (!specifyserver_artlist[i])
198 			break;
199 		trap_R_RegisterShaderNoMip(specifyserver_artlist[i]);
200 	}
201 }
202 
203 /*
204 =================
205 UI_SpecifyServerMenu
206 =================
207 */
UI_SpecifyServerMenu(void)208 void UI_SpecifyServerMenu( void )
209 {
210 	SpecifyServer_MenuInit();
211 	UI_PushMenu( &s_specifyserver.menu );
212 }
213 
214