1 /*
2 Copyright (C) 1997-2001 Id Software, Inc.
3 
4 This program is free software; you can redistribute it and/or
5 modify it under the terms of the GNU General Public License
6 as published by the Free Software Foundation; either version 2
7 of the License, or (at your option) any later version.
8 
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12 
13 See the GNU General Public License for more details.
14 
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 */
19 
20 //
21 // m_opts_gloom.c
22 //
23 
24 #include "m_local.h"
25 
26 /*
27 =======================================================================
28 
29 	GLOOM OPTIONS MENU
30 
31 =======================================================================
32 */
33 
34 typedef struct m_gloomOptionsMenu_s {
35 	// Menu items
36 	uiFrameWork_t	frameWork;
37 
38 	uiImage_t		banner;
39 	uiAction_t		header;
40 
41 	uiList_t		advgas_toggle;
42 	uiList_t		advstingfire_toggle;
43 	uiList_t		bluestingfire_toggle;
44 	uiList_t		blobtype_list;
45 
46 	uiList_t		flashpred_toggle;
47 	uiList_t		flashwhite_toggle;
48 
49 	uiList_t		forcecache_toggle;
50 
51 	uiList_t		jumppred_toggle;
52 
53 	uiList_t		classdisplay_toggle;
54 
55 	uiAction_t		back_action;
56 } m_gloomOptionsMenu_t;
57 
58 static m_gloomOptionsMenu_t	m_gloomOptionsMenu;
59 
GlmAdvGasFunc(void * unused)60 static void GlmAdvGasFunc (void *unused)
61 {
62 	cgi.Cvar_SetValue ("glm_advgas", m_gloomOptionsMenu.advgas_toggle.curValue, qFalse);
63 }
64 
GlmAdvStingerFireFunc(void * unused)65 static void GlmAdvStingerFireFunc (void *unused)
66 {
67 	cgi.Cvar_SetValue ("glm_advstingfire", m_gloomOptionsMenu.advstingfire_toggle.curValue, qFalse);
68 }
69 
GlmBlueStingerFireFunc(void * unused)70 static void GlmBlueStingerFireFunc (void *unused)
71 {
72 	cgi.Cvar_SetValue ("glm_bluestingfire", m_gloomOptionsMenu.bluestingfire_toggle.curValue, qFalse);
73 }
74 
GlmBlobTypeFunc(void * unused)75 static void GlmBlobTypeFunc (void *unused)
76 {
77 	cgi.Cvar_SetValue ("glm_blobtype", m_gloomOptionsMenu.blobtype_list.curValue, qFalse);
78 }
79 
GlmFlashPredFunc(void * unused)80 static void GlmFlashPredFunc (void *unused)
81 {
82 	cgi.Cvar_SetValue ("glm_flashpred", m_gloomOptionsMenu.flashpred_toggle.curValue, qFalse);
83 }
84 
GlmFlWhiteFunc(void * unused)85 static void GlmFlWhiteFunc (void *unused)
86 {
87 	cgi.Cvar_SetValue ("glm_flwhite", m_gloomOptionsMenu.flashwhite_toggle.curValue, qFalse);
88 }
89 
GlmForceCacheFunc(void * unused)90 static void GlmForceCacheFunc (void *unused)
91 {
92 	cgi.Cvar_SetValue ("glm_forcecache", m_gloomOptionsMenu.forcecache_toggle.curValue, qFalse);
93 }
94 
GlmJumpPredFunc(void * unused)95 static void GlmJumpPredFunc (void *unused)
96 {
97 	cgi.Cvar_SetValue ("glm_jumppred", m_gloomOptionsMenu.jumppred_toggle.curValue, qFalse);
98 }
99 
GlmClassDispFunc(void * unused)100 static void GlmClassDispFunc (void *unused)
101 {
102 	cgi.Cvar_SetValue ("glm_showclass", m_gloomOptionsMenu.classdisplay_toggle.curValue, qFalse);
103 }
104 
105 
106 /*
107 =============
108 GloomMenu_SetValues
109 =============
110 */
GloomMenu_SetValues(void)111 static void GloomMenu_SetValues (void)
112 {
113 	cgi.Cvar_SetValue ("glm_advgas",		clamp (cgi.Cvar_GetIntegerValue ("glm_advgas"), 0, 1), qFalse);
114 	m_gloomOptionsMenu.advgas_toggle.curValue	= cgi.Cvar_GetIntegerValue ("glm_advgas");
115 
116 	cgi.Cvar_SetValue ("glm_advstingfire",		clamp (cgi.Cvar_GetIntegerValue ("glm_advstingfire"), 0, 1), qFalse);
117 	m_gloomOptionsMenu.advstingfire_toggle.curValue	= cgi.Cvar_GetIntegerValue ("glm_advstingfire");
118 
119 	cgi.Cvar_SetValue ("glm_bluestingfire",		clamp (cgi.Cvar_GetIntegerValue ("glm_bluestingfire"), 0, 1), qFalse);
120 	m_gloomOptionsMenu.bluestingfire_toggle.curValue	= cgi.Cvar_GetIntegerValue ("glm_bluestingfire");
121 
122 	cgi.Cvar_SetValue ("glm_blobtype",			clamp (cgi.Cvar_GetIntegerValue ("glm_blobtype"), 0, 1), qFalse);
123 	m_gloomOptionsMenu.blobtype_list.curValue		= cgi.Cvar_GetIntegerValue ("glm_blobtype");
124 
125 	cgi.Cvar_SetValue ("glm_flashpred",			clamp (cgi.Cvar_GetIntegerValue ("glm_flashpred"), 0, 1), qFalse);
126 	m_gloomOptionsMenu.flashpred_toggle.curValue	= cgi.Cvar_GetIntegerValue ("glm_flashpred");
127 
128 	cgi.Cvar_SetValue ("glm_flwhite",			clamp (cgi.Cvar_GetIntegerValue ("glm_flwhite"), 0, 1), qFalse);
129 	m_gloomOptionsMenu.flashwhite_toggle.curValue	= cgi.Cvar_GetIntegerValue ("glm_flwhite");
130 
131 	cgi.Cvar_SetValue ("glm_forcecache",		clamp (cgi.Cvar_GetIntegerValue ("glm_forcecache"), 0, 1), qFalse);
132 	m_gloomOptionsMenu.forcecache_toggle.curValue	= cgi.Cvar_GetIntegerValue ("glm_forcecache");
133 
134 	cgi.Cvar_SetValue ("glm_jumppred",			clamp (cgi.Cvar_GetIntegerValue ("glm_jumppred"), 0, 1), qFalse);
135 	m_gloomOptionsMenu.jumppred_toggle.curValue		= cgi.Cvar_GetIntegerValue ("glm_jumppred");
136 
137 	cgi.Cvar_SetValue ("glm_showclass",			clamp (cgi.Cvar_GetIntegerValue ("glm_showclass"), 0, 1), qFalse);
138 	m_gloomOptionsMenu.classdisplay_toggle.curValue	= cgi.Cvar_GetIntegerValue ("glm_showclass");
139 }
140 
141 
142 /*
143 =============
144 GloomMenu_Init
145 =============
146 */
GloomMenu_Init(void)147 static void GloomMenu_Init (void)
148 {
149 	static char *blobtype_names[] = {
150 		"normal",
151 		"spiral",
152 		0
153 	};
154 
155 	static char *nicenorm_names[] = {
156 		"normal",
157 		"nicer",
158 		0
159 	};
160 
161 	static char *onoff_names[] = {
162 		"off",
163 		"on",
164 		0
165 	};
166 
167 	static char *yesno_names[] = {
168 		"no",
169 		"yes",
170 		0
171 	};
172 
173 	UI_StartFramework (&m_gloomOptionsMenu.frameWork, FWF_CENTERHEIGHT);
174 
175 	m_gloomOptionsMenu.banner.generic.type		= UITYPE_IMAGE;
176 	m_gloomOptionsMenu.banner.generic.flags		= UIF_NOSELECT|UIF_CENTERED;
177 	m_gloomOptionsMenu.banner.generic.name		= NULL;
178 	m_gloomOptionsMenu.banner.shader			= uiMedia.banners.options;
179 
180 	m_gloomOptionsMenu.header.generic.type		= UITYPE_ACTION;
181 	m_gloomOptionsMenu.header.generic.flags		= UIF_NOSELECT|UIF_CENTERED|UIF_MEDIUM|UIF_SHADOW;
182 	m_gloomOptionsMenu.header.generic.name		= "Gloom Settings";
183 
184 	m_gloomOptionsMenu.advgas_toggle.generic.type		= UITYPE_SPINCONTROL;
185 	m_gloomOptionsMenu.advgas_toggle.generic.name		= "Advanced gas";
186 	m_gloomOptionsMenu.advgas_toggle.generic.callBack	= GlmAdvGasFunc;
187 	m_gloomOptionsMenu.advgas_toggle.itemNames			= onoff_names;
188 	m_gloomOptionsMenu.advgas_toggle.generic.statusBar	= "Better Stinger/Shock Trooper particles in Gloom";
189 
190 	m_gloomOptionsMenu.advstingfire_toggle.generic.type			= UITYPE_SPINCONTROL;
191 	m_gloomOptionsMenu.advstingfire_toggle.generic.name			= "Advanced stinger fire";
192 	m_gloomOptionsMenu.advstingfire_toggle.generic.callBack		= GlmAdvStingerFireFunc;
193 	m_gloomOptionsMenu.advstingfire_toggle.itemNames			= nicenorm_names;
194 	m_gloomOptionsMenu.advstingfire_toggle.generic.statusBar	= "Better Stinger fire particles in Gloom";
195 
196 	m_gloomOptionsMenu.bluestingfire_toggle.generic.type		= UITYPE_SPINCONTROL;
197 	m_gloomOptionsMenu.bluestingfire_toggle.generic.name		= "Blue stinger fire";
198 	m_gloomOptionsMenu.bluestingfire_toggle.generic.callBack	= GlmBlueStingerFireFunc;
199 	m_gloomOptionsMenu.bluestingfire_toggle.itemNames			= onoff_names;
200 	m_gloomOptionsMenu.bluestingfire_toggle.generic.statusBar	= "Blue Stinger fire particles in Gloom (requires nicer stinger fire above)";
201 
202 	m_gloomOptionsMenu.blobtype_list.generic.type		= UITYPE_SPINCONTROL;
203 	m_gloomOptionsMenu.blobtype_list.generic.name		= "Blob trail type";
204 	m_gloomOptionsMenu.blobtype_list.generic.callBack	= GlmBlobTypeFunc;
205 	m_gloomOptionsMenu.blobtype_list.itemNames			= blobtype_names;
206 	m_gloomOptionsMenu.blobtype_list.generic.statusBar	= "Gloom homing blob trail type selection";
207 
208 	m_gloomOptionsMenu.flashpred_toggle.generic.type		= UITYPE_SPINCONTROL;
209 	m_gloomOptionsMenu.flashpred_toggle.generic.name		= "Flashlight prediction";
210 	m_gloomOptionsMenu.flashpred_toggle.generic.callBack	= GlmFlashPredFunc;
211 	m_gloomOptionsMenu.flashpred_toggle.itemNames			= yesno_names;
212 	m_gloomOptionsMenu.flashpred_toggle.generic.statusBar	= "Gloom Flashlight Prediction";
213 
214 	m_gloomOptionsMenu.flashwhite_toggle.generic.type		= UITYPE_SPINCONTROL;
215 	m_gloomOptionsMenu.flashwhite_toggle.generic.name		= "Whiter flashlight";
216 	m_gloomOptionsMenu.flashwhite_toggle.generic.callBack	= GlmFlWhiteFunc;
217 	m_gloomOptionsMenu.flashwhite_toggle.itemNames			= yesno_names;
218 	m_gloomOptionsMenu.flashwhite_toggle.generic.statusBar	= "Makes the Gloom flashlight whiter";
219 
220 	m_gloomOptionsMenu.forcecache_toggle.generic.type		= UITYPE_SPINCONTROL;
221 	m_gloomOptionsMenu.forcecache_toggle.generic.name		= "Forced Caching";
222 	m_gloomOptionsMenu.forcecache_toggle.generic.callBack	= GlmForceCacheFunc;
223 	m_gloomOptionsMenu.forcecache_toggle.itemNames			= onoff_names;
224 	m_gloomOptionsMenu.forcecache_toggle.generic.statusBar	= "Forces caching of common Gloom models";
225 
226 	m_gloomOptionsMenu.jumppred_toggle.generic.type			= UITYPE_SPINCONTROL;
227 	m_gloomOptionsMenu.jumppred_toggle.generic.name			= "Jump prediction";
228 	m_gloomOptionsMenu.jumppred_toggle.generic.callBack		= GlmJumpPredFunc;
229 	m_gloomOptionsMenu.jumppred_toggle.itemNames			= onoff_names;
230 	m_gloomOptionsMenu.jumppred_toggle.generic.statusBar	= "Gloom per-class jump prediction";
231 
232 	m_gloomOptionsMenu.classdisplay_toggle.generic.type			= UITYPE_SPINCONTROL;
233 	m_gloomOptionsMenu.classdisplay_toggle.generic.name			= "Class display";
234 	m_gloomOptionsMenu.classdisplay_toggle.generic.callBack		= GlmClassDispFunc;
235 	m_gloomOptionsMenu.classdisplay_toggle.itemNames			= onoff_names;
236 	m_gloomOptionsMenu.classdisplay_toggle.generic.statusBar	= "Gloom on-screen class display";
237 
238 	m_gloomOptionsMenu.back_action.generic.type			= UITYPE_ACTION;
239 	m_gloomOptionsMenu.back_action.generic.flags		= UIF_CENTERED|UIF_LARGE|UIF_SHADOW;
240 	m_gloomOptionsMenu.back_action.generic.name			= "< Back";
241 	m_gloomOptionsMenu.back_action.generic.callBack		= Menu_Pop;
242 	m_gloomOptionsMenu.back_action.generic.statusBar	= "Back a menu";
243 
244 	GloomMenu_SetValues ();
245 
246 	UI_AddItem (&m_gloomOptionsMenu.frameWork,		&m_gloomOptionsMenu.banner);
247 	UI_AddItem (&m_gloomOptionsMenu.frameWork,		&m_gloomOptionsMenu.header);
248 
249 	UI_AddItem (&m_gloomOptionsMenu.frameWork,		&m_gloomOptionsMenu.advgas_toggle);
250 	UI_AddItem (&m_gloomOptionsMenu.frameWork,		&m_gloomOptionsMenu.advstingfire_toggle);
251 	UI_AddItem (&m_gloomOptionsMenu.frameWork,		&m_gloomOptionsMenu.bluestingfire_toggle);
252 	UI_AddItem (&m_gloomOptionsMenu.frameWork,		&m_gloomOptionsMenu.blobtype_list);
253 
254 	UI_AddItem (&m_gloomOptionsMenu.frameWork,		&m_gloomOptionsMenu.flashpred_toggle);
255 	UI_AddItem (&m_gloomOptionsMenu.frameWork,		&m_gloomOptionsMenu.flashwhite_toggle);
256 
257 	UI_AddItem (&m_gloomOptionsMenu.frameWork,		&m_gloomOptionsMenu.forcecache_toggle);
258 
259 	UI_AddItem (&m_gloomOptionsMenu.frameWork,		&m_gloomOptionsMenu.jumppred_toggle);
260 
261 	UI_AddItem (&m_gloomOptionsMenu.frameWork,		&m_gloomOptionsMenu.classdisplay_toggle);
262 
263 	UI_AddItem (&m_gloomOptionsMenu.frameWork,		&m_gloomOptionsMenu.back_action);
264 
265 	UI_FinishFramework (&m_gloomOptionsMenu.frameWork, qTrue);
266 }
267 
268 
269 /*
270 =============
271 GloomMenu_Close
272 =============
273 */
GloomMenu_Close(void)274 static struct sfx_s *GloomMenu_Close (void)
275 {
276 	return uiMedia.sounds.menuOut;
277 }
278 
279 
280 /*
281 =============
282 GloomMenu_Draw
283 =============
284 */
GloomMenu_Draw(void)285 static void GloomMenu_Draw (void)
286 {
287 	float	y;
288 
289 	// Initialize if necessary
290 	if (!m_gloomOptionsMenu.frameWork.initialized)
291 		GloomMenu_Init ();
292 
293 	// Dynamically position
294 	m_gloomOptionsMenu.frameWork.x			= cg.refConfig.vidWidth * 0.5;
295 	m_gloomOptionsMenu.frameWork.y			= 0;
296 
297 	m_gloomOptionsMenu.banner.generic.x		= 0;
298 	m_gloomOptionsMenu.banner.generic.y		= 0;
299 
300 	y = m_gloomOptionsMenu.banner.height * UI_SCALE;
301 
302 	m_gloomOptionsMenu.header.generic.x					= 0;
303 	m_gloomOptionsMenu.header.generic.y					= y += UIFT_SIZEINC;
304 	m_gloomOptionsMenu.advgas_toggle.generic.x			= 0;
305 	m_gloomOptionsMenu.advgas_toggle.generic.y			= y += UIFT_SIZEINC + UIFT_SIZEINCMED;
306 	m_gloomOptionsMenu.advstingfire_toggle.generic.x	= 0;
307 	m_gloomOptionsMenu.advstingfire_toggle.generic.y	= y += UIFT_SIZEINC;
308 	m_gloomOptionsMenu.bluestingfire_toggle.generic.x	= 0;
309 	m_gloomOptionsMenu.bluestingfire_toggle.generic.y	= y += UIFT_SIZEINC;
310 	m_gloomOptionsMenu.blobtype_list.generic.x			= 0;
311 	m_gloomOptionsMenu.blobtype_list.generic.y			= y += UIFT_SIZEINC;
312 	m_gloomOptionsMenu.flashpred_toggle.generic.x		= 0;
313 	m_gloomOptionsMenu.flashpred_toggle.generic.y		= y += UIFT_SIZEINC*2;
314 	m_gloomOptionsMenu.flashwhite_toggle.generic.x		= 0;
315 	m_gloomOptionsMenu.flashwhite_toggle.generic.y		= y += UIFT_SIZEINC;
316 	m_gloomOptionsMenu.forcecache_toggle.generic.x		= 0;
317 	m_gloomOptionsMenu.forcecache_toggle.generic.y		= y += UIFT_SIZEINC*2;
318 	m_gloomOptionsMenu.jumppred_toggle.generic.x		= 0;
319 	m_gloomOptionsMenu.jumppred_toggle.generic.y		= y += UIFT_SIZEINC*2;
320 	m_gloomOptionsMenu.classdisplay_toggle.generic.x	= 0;
321 	m_gloomOptionsMenu.classdisplay_toggle.generic.y	= y += (UIFT_SIZEINC*2);
322 	m_gloomOptionsMenu.back_action.generic.x			= 0;
323 	m_gloomOptionsMenu.back_action.generic.y			= y += UIFT_SIZEINC + UIFT_SIZEINCLG;
324 
325 	// Render
326 	UI_DrawInterface (&m_gloomOptionsMenu.frameWork);
327 }
328 
329 
330 /*
331 =============
332 UI_GloomMenu_f
333 =============
334 */
UI_GloomMenu_f(void)335 void UI_GloomMenu_f (void)
336 {
337 	GloomMenu_Init ();
338 	M_PushMenu (&m_gloomOptionsMenu.frameWork, GloomMenu_Draw, GloomMenu_Close, M_KeyHandler);
339 }
340