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