Skip to content

Commit 9963ffa

Browse files
Bishop-333NeonKnightOA
authored and
NeonKnightOA
committed
Add dmflags menu
1 parent d08efbe commit 9963ffa

File tree

4 files changed

+374
-2
lines changed

4 files changed

+374
-2
lines changed

Makefile

+1
Original file line numberDiff line numberDiff line change
@@ -2526,6 +2526,7 @@ Q3UIOBJ_ = \
25262526
$(B)/$(BASEGAME)/ui/ui_mods.o \
25272527
$(B)/$(BASEGAME)/ui/ui_network.o \
25282528
$(B)/$(BASEGAME)/ui/ui_hud.o \
2529+
$(B)/$(BASEGAME)/ui/ui_dmflags.o \
25292530
$(B)/$(BASEGAME)/ui/ui_password.o \
25302531
$(B)/$(BASEGAME)/ui/ui_playermodel.o \
25312532
$(B)/$(BASEGAME)/ui/ui_players.o \

code/q3_ui/ui_dmflags.c

+347
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,347 @@
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+
GAME OPTIONS MENU
27+
28+
=======================================================================
29+
*/
30+
31+
32+
#include "ui_local.h"
33+
34+
35+
#define ART_FRAMEL "menu/" MENU_ART_DIR "/frame2_l"
36+
#define ART_FRAMER "menu/" MENU_ART_DIR "/frame1_r"
37+
#define ART_BACK0 "menu/" MENU_ART_DIR "/back_0"
38+
#define ART_BACK1 "menu/" MENU_ART_DIR "/back_1"
39+
40+
#define DMFLAGS_X_POS 320
41+
42+
#define ID_BACK 127
43+
#define ID_NO_FALLING 128
44+
#define ID_FIXED_FOV 129
45+
#define ID_NO_FOOTSTEPS 130
46+
#define ID_INSTANT_WEAPON_CHANGE 131
47+
#define ID_NO_BUNNY 132
48+
#define ID_INVIS 133
49+
#define ID_LIGHT_VOTING 134
50+
#define ID_NO_SELF_DAMAGE 135
51+
52+
53+
typedef struct {
54+
menuframework_s menu;
55+
56+
menutext_s banner;
57+
menubitmap_s framel;
58+
menubitmap_s framer;
59+
60+
menuradiobutton_s noFalling;
61+
menuradiobutton_s fixedFOV;
62+
menuradiobutton_s noFootsteps;
63+
menuradiobutton_s instantWeaponChange;
64+
menuradiobutton_s noBunny;
65+
menuradiobutton_s invis;
66+
menuradiobutton_s lightVoting;
67+
menuradiobutton_s noSelfDamage;
68+
menutext_s bitfield;
69+
70+
menubitmap_s back;
71+
} dmflagsOptions_t;
72+
73+
static dmflagsOptions_t dmflagsOptions_s;
74+
75+
static void DMFlags_DrawBitfield( void *self ) {
76+
menufield_s *f;
77+
float *color;
78+
int x, y;
79+
80+
f = (menufield_s*)self;
81+
x = f->generic.x;
82+
y = f->generic.y;
83+
84+
if ( trap_Cvar_VariableValue( "dmflags" ) ) {
85+
color = text_color_normal;
86+
} else {
87+
color = text_color_disabled;
88+
}
89+
90+
UI_DrawString( x - 8, y, f->generic.name, UI_RIGHT|UI_SMALLFONT, color );
91+
UI_DrawString( x + 48, y, UI_Cvar_VariableString( "dmflags" ), UI_SMALLFONT|UI_RIGHT, color );
92+
}
93+
94+
static void DMflagsOptions_Event( void* ptr, int notification ) {
95+
int bitfield;
96+
97+
bitfield = trap_Cvar_VariableValue( "dmflags" );
98+
99+
if( notification != QM_ACTIVATED ) {
100+
return;
101+
}
102+
103+
switch( ((menucommon_s*)ptr)->id ) {
104+
case ID_NO_FALLING:
105+
if ( dmflagsOptions_s.noFalling.curvalue ) {
106+
bitfield |= DF_NO_FALLING;
107+
} else {
108+
bitfield &= ~DF_NO_FALLING;
109+
}
110+
trap_Cvar_SetValue( "dmflags", bitfield );
111+
break;
112+
113+
case ID_FIXED_FOV:
114+
if ( dmflagsOptions_s.fixedFOV.curvalue ) {
115+
bitfield |= DF_FIXED_FOV;
116+
} else {
117+
bitfield &= ~DF_FIXED_FOV;
118+
}
119+
trap_Cvar_SetValue( "dmflags", bitfield );
120+
break;
121+
122+
case ID_NO_FOOTSTEPS:
123+
if ( dmflagsOptions_s.noFootsteps.curvalue ) {
124+
bitfield |= DF_NO_FOOTSTEPS;
125+
} else {
126+
bitfield &= ~DF_NO_FOOTSTEPS;
127+
}
128+
trap_Cvar_SetValue( "dmflags", bitfield );
129+
break;
130+
131+
case ID_INSTANT_WEAPON_CHANGE:
132+
if ( dmflagsOptions_s.instantWeaponChange.curvalue ) {
133+
bitfield |= DF_INSTANT_WEAPON_CHANGE;
134+
} else {
135+
bitfield &= ~DF_INSTANT_WEAPON_CHANGE;
136+
}
137+
trap_Cvar_SetValue( "dmflags", bitfield );
138+
break;
139+
140+
case ID_NO_BUNNY:
141+
if ( dmflagsOptions_s.noBunny.curvalue ) {
142+
bitfield |= DF_NO_BUNNY;
143+
} else {
144+
bitfield &= ~DF_NO_BUNNY;
145+
}
146+
trap_Cvar_SetValue( "dmflags", bitfield );
147+
break;
148+
149+
case ID_INVIS:
150+
if ( dmflagsOptions_s.invis.curvalue ) {
151+
bitfield |= DF_INVIS;
152+
} else {
153+
bitfield &= ~DF_INVIS;
154+
}
155+
trap_Cvar_SetValue( "dmflags", bitfield );
156+
break;
157+
158+
case ID_LIGHT_VOTING:
159+
if ( dmflagsOptions_s.lightVoting.curvalue ) {
160+
bitfield |= DF_LIGHT_VOTING;
161+
} else {
162+
bitfield &= ~DF_LIGHT_VOTING;
163+
}
164+
trap_Cvar_SetValue( "dmflags", bitfield );
165+
break;
166+
167+
case ID_NO_SELF_DAMAGE:
168+
if ( dmflagsOptions_s.noSelfDamage.curvalue ) {
169+
bitfield |= DF_NO_SELF_DAMAGE;
170+
} else {
171+
bitfield &= ~DF_NO_SELF_DAMAGE;
172+
}
173+
trap_Cvar_SetValue( "dmflags", bitfield );
174+
break;
175+
176+
case ID_BACK:
177+
UI_PopMenu();
178+
break;
179+
}
180+
}
181+
182+
static void DMflagsOptions_MenuInit( void ) {
183+
int bitfield;
184+
185+
bitfield = trap_Cvar_VariableValue( "dmflags" );
186+
187+
memset( &dmflagsOptions_s, 0 ,sizeof(dmflagsOptions_t) );
188+
189+
UI_DMflagsOptionsMenu_Cache();
190+
191+
dmflagsOptions_s.menu.wrapAround = qtrue;
192+
dmflagsOptions_s.menu.fullscreen = qtrue;
193+
194+
dmflagsOptions_s.banner.generic.type = MTYPE_BTEXT;
195+
dmflagsOptions_s.banner.generic.x = 320;
196+
dmflagsOptions_s.banner.generic.y = 16;
197+
dmflagsOptions_s.banner.string = "DMFLAGS";
198+
dmflagsOptions_s.banner.color = color_white;
199+
dmflagsOptions_s.banner.style = UI_CENTER;
200+
201+
dmflagsOptions_s.framel.generic.type = MTYPE_BITMAP;
202+
dmflagsOptions_s.framel.generic.name = ART_FRAMEL;
203+
dmflagsOptions_s.framel.generic.flags = QMF_INACTIVE;
204+
dmflagsOptions_s.framel.generic.x = 0;
205+
dmflagsOptions_s.framel.generic.y = 78;
206+
dmflagsOptions_s.framel.width = 256;
207+
dmflagsOptions_s.framel.height = 329;
208+
209+
dmflagsOptions_s.framer.generic.type = MTYPE_BITMAP;
210+
dmflagsOptions_s.framer.generic.name = ART_FRAMER;
211+
dmflagsOptions_s.framer.generic.flags = QMF_INACTIVE;
212+
dmflagsOptions_s.framer.generic.x = 376;
213+
dmflagsOptions_s.framer.generic.y = 76;
214+
dmflagsOptions_s.framer.width = 256;
215+
dmflagsOptions_s.framer.height = 334;
216+
217+
dmflagsOptions_s.noFalling.generic.type = MTYPE_RADIOBUTTON;
218+
dmflagsOptions_s.noFalling.generic.name = "No Falling Damage:";
219+
dmflagsOptions_s.noFalling.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
220+
dmflagsOptions_s.noFalling.generic.callback = DMflagsOptions_Event;
221+
dmflagsOptions_s.noFalling.generic.id = ID_NO_FALLING;
222+
dmflagsOptions_s.noFalling.generic.x = DMFLAGS_X_POS;
223+
dmflagsOptions_s.noFalling.generic.y = 240 - 6.5 * (BIGCHAR_HEIGHT+2);
224+
225+
dmflagsOptions_s.fixedFOV.generic.type = MTYPE_RADIOBUTTON;
226+
dmflagsOptions_s.fixedFOV.generic.name = "Fixed FOV:";
227+
dmflagsOptions_s.fixedFOV.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
228+
dmflagsOptions_s.fixedFOV.generic.callback = DMflagsOptions_Event;
229+
dmflagsOptions_s.fixedFOV.generic.id = ID_FIXED_FOV;
230+
dmflagsOptions_s.fixedFOV.generic.x = DMFLAGS_X_POS;
231+
dmflagsOptions_s.fixedFOV.generic.y = 240 - 5.5 * (BIGCHAR_HEIGHT+2);
232+
233+
dmflagsOptions_s.noFootsteps.generic.type = MTYPE_RADIOBUTTON;
234+
dmflagsOptions_s.noFootsteps.generic.name = "No Footsteps:";
235+
dmflagsOptions_s.noFootsteps.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
236+
dmflagsOptions_s.noFootsteps.generic.callback = DMflagsOptions_Event;
237+
dmflagsOptions_s.noFootsteps.generic.id = ID_NO_FOOTSTEPS;
238+
dmflagsOptions_s.noFootsteps.generic.x = DMFLAGS_X_POS;
239+
dmflagsOptions_s.noFootsteps.generic.y = 240 - 4.5 * (BIGCHAR_HEIGHT+2);
240+
241+
dmflagsOptions_s.instantWeaponChange.generic.type = MTYPE_RADIOBUTTON;
242+
dmflagsOptions_s.instantWeaponChange.generic.name = "Instant Weapon Change:";
243+
dmflagsOptions_s.instantWeaponChange.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
244+
dmflagsOptions_s.instantWeaponChange.generic.callback = DMflagsOptions_Event;
245+
dmflagsOptions_s.instantWeaponChange.generic.id = ID_INSTANT_WEAPON_CHANGE;
246+
dmflagsOptions_s.instantWeaponChange.generic.x = DMFLAGS_X_POS;
247+
dmflagsOptions_s.instantWeaponChange.generic.y = 240 - 3.5 * (BIGCHAR_HEIGHT+2);
248+
249+
dmflagsOptions_s.noBunny.generic.type = MTYPE_RADIOBUTTON;
250+
dmflagsOptions_s.noBunny.generic.name = "No Strafe Jumping:";
251+
dmflagsOptions_s.noBunny.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
252+
dmflagsOptions_s.noBunny.generic.callback = DMflagsOptions_Event;
253+
dmflagsOptions_s.noBunny.generic.id = ID_NO_BUNNY;
254+
dmflagsOptions_s.noBunny.generic.x = DMFLAGS_X_POS;
255+
dmflagsOptions_s.noBunny.generic.y = 240 - 2.5 * (BIGCHAR_HEIGHT+2);
256+
257+
dmflagsOptions_s.invis.generic.type = MTYPE_RADIOBUTTON;
258+
dmflagsOptions_s.invis.generic.name = "Total Invisibility:";
259+
dmflagsOptions_s.invis.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
260+
dmflagsOptions_s.invis.generic.callback = DMflagsOptions_Event;
261+
dmflagsOptions_s.invis.generic.id = ID_INVIS;
262+
dmflagsOptions_s.invis.generic.x = DMFLAGS_X_POS;
263+
dmflagsOptions_s.invis.generic.y = 240 - 1.5 * (BIGCHAR_HEIGHT+2);
264+
265+
dmflagsOptions_s.lightVoting.generic.type = MTYPE_RADIOBUTTON;
266+
dmflagsOptions_s.lightVoting.generic.name = "Light Voting:";
267+
dmflagsOptions_s.lightVoting.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
268+
dmflagsOptions_s.lightVoting.generic.callback = DMflagsOptions_Event;
269+
dmflagsOptions_s.lightVoting.generic.id = ID_LIGHT_VOTING;
270+
dmflagsOptions_s.lightVoting.generic.x = DMFLAGS_X_POS;
271+
dmflagsOptions_s.lightVoting.generic.y = 240 - 0.5 * (BIGCHAR_HEIGHT+2);
272+
273+
dmflagsOptions_s.noSelfDamage.generic.type = MTYPE_RADIOBUTTON;
274+
dmflagsOptions_s.noSelfDamage.generic.name = "No Self Damage from Weapons:";
275+
dmflagsOptions_s.noSelfDamage.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
276+
dmflagsOptions_s.noSelfDamage.generic.callback = DMflagsOptions_Event;
277+
dmflagsOptions_s.noSelfDamage.generic.id = ID_NO_SELF_DAMAGE;
278+
dmflagsOptions_s.noSelfDamage.generic.x = DMFLAGS_X_POS;
279+
dmflagsOptions_s.noSelfDamage.generic.y = 240 + 0.5 * (BIGCHAR_HEIGHT+2);
280+
281+
dmflagsOptions_s.bitfield.generic.type = MTYPE_TEXT;
282+
dmflagsOptions_s.bitfield.generic.name = "DMFlags:";
283+
dmflagsOptions_s.bitfield.generic.ownerdraw = DMFlags_DrawBitfield;
284+
dmflagsOptions_s.bitfield.generic.x = DMFLAGS_X_POS;
285+
dmflagsOptions_s.bitfield.generic.y = 240 + 2.5 * (BIGCHAR_HEIGHT+2);
286+
287+
dmflagsOptions_s.back.generic.type = MTYPE_BITMAP;
288+
dmflagsOptions_s.back.generic.name = ART_BACK0;
289+
dmflagsOptions_s.back.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS;
290+
dmflagsOptions_s.back.generic.callback = DMflagsOptions_Event;
291+
dmflagsOptions_s.back.generic.id = ID_BACK;
292+
dmflagsOptions_s.back.generic.x = 0;
293+
dmflagsOptions_s.back.generic.y = 480-64;
294+
dmflagsOptions_s.back.width = 128;
295+
dmflagsOptions_s.back.height = 64;
296+
dmflagsOptions_s.back.focuspic = ART_BACK1;
297+
298+
Menu_AddItem( &dmflagsOptions_s.menu, &dmflagsOptions_s.banner );
299+
Menu_AddItem( &dmflagsOptions_s.menu, &dmflagsOptions_s.framel );
300+
Menu_AddItem( &dmflagsOptions_s.menu, &dmflagsOptions_s.framer );
301+
302+
Menu_AddItem( &dmflagsOptions_s.menu, &dmflagsOptions_s.noFalling );
303+
Menu_AddItem( &dmflagsOptions_s.menu, &dmflagsOptions_s.fixedFOV );
304+
Menu_AddItem( &dmflagsOptions_s.menu, &dmflagsOptions_s.noFootsteps );
305+
Menu_AddItem( &dmflagsOptions_s.menu, &dmflagsOptions_s.instantWeaponChange );
306+
Menu_AddItem( &dmflagsOptions_s.menu, &dmflagsOptions_s.noBunny );
307+
Menu_AddItem( &dmflagsOptions_s.menu, &dmflagsOptions_s.invis );
308+
Menu_AddItem( &dmflagsOptions_s.menu, &dmflagsOptions_s.lightVoting );
309+
Menu_AddItem( &dmflagsOptions_s.menu, &dmflagsOptions_s.noSelfDamage );
310+
Menu_AddItem( &dmflagsOptions_s.menu, &dmflagsOptions_s.bitfield );
311+
312+
Menu_AddItem( &dmflagsOptions_s.menu, &dmflagsOptions_s.back );
313+
314+
dmflagsOptions_s.noFalling.curvalue = bitfield&DF_NO_FALLING ? 1 : 0;
315+
dmflagsOptions_s.fixedFOV.curvalue = bitfield&DF_FIXED_FOV ? 1 : 0;
316+
dmflagsOptions_s.noFootsteps.curvalue = bitfield&DF_NO_FOOTSTEPS ? 1 : 0;
317+
dmflagsOptions_s.instantWeaponChange.curvalue = bitfield&DF_INSTANT_WEAPON_CHANGE ? 1 : 0;
318+
dmflagsOptions_s.noBunny.curvalue = bitfield&DF_NO_BUNNY ? 1 : 0;
319+
dmflagsOptions_s.invis.curvalue = bitfield&DF_INVIS ? 1 : 0;
320+
dmflagsOptions_s.lightVoting.curvalue = bitfield&DF_LIGHT_VOTING ? 1 : 0;
321+
dmflagsOptions_s.noSelfDamage.curvalue = bitfield&DF_NO_SELF_DAMAGE ? 1 : 0;
322+
}
323+
324+
325+
/*
326+
===============
327+
UI_DMflagsOptionsMenu_Cache
328+
===============
329+
*/
330+
void UI_DMflagsOptionsMenu_Cache( void ) {
331+
332+
trap_R_RegisterShaderNoMip( ART_FRAMEL );
333+
trap_R_RegisterShaderNoMip( ART_FRAMER );
334+
trap_R_RegisterShaderNoMip( ART_BACK0 );
335+
trap_R_RegisterShaderNoMip( ART_BACK1 );
336+
}
337+
338+
339+
/*
340+
===============
341+
UI_DMflagsOptionsMenu
342+
===============
343+
*/
344+
void UI_DMflagsOptionsMenu( void ) {
345+
DMflagsOptions_MenuInit();
346+
UI_PushMenu( &dmflagsOptions_s.menu );
347+
}

code/q3_ui/ui_local.h

+6
Original file line numberDiff line numberDiff line change
@@ -838,6 +838,12 @@ void UI_NetworkOptionsMenu( void );
838838
void UI_HUDOptionsMenu_Cache( void );
839839
void UI_HUDOptionsMenu( void );
840840

841+
//
842+
// ui_dmflags.c
843+
//
844+
void UI_DMflagsOptionsMenu_Cache( void );
845+
void UI_DMflagsOptionsMenu( void );
846+
841847
//
842848
// ui_gameinfo.c
843849
//

0 commit comments

Comments
 (0)