Subversion Repositories eduke32

Rev

Rev 4976 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
5 Plagman 1
//-------------------------------------------------------------------------
2
/*
1652 terminx 3
Copyright (C) 2010 EDuke32 developers and contributors
5 Plagman 4
 
1652 terminx 5
This file is part of EDuke32.
5 Plagman 6
 
7
EDuke32 is free software; you can redistribute it and/or
8
modify it under the terms of the GNU General Public License version 2
9
as published by the Free Software Foundation.
10
 
11
This program is distributed in the hope that it will be useful,
12
but WITHOUT ANY WARRANTY; without even the implied warranty of
13
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14
 
15
See the GNU General Public License for more details.
16
 
17
You should have received a copy of the GNU General Public License
18
along with this program; if not, write to the Free Software
4541 hendricks2 19
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
5 Plagman 20
*/
21
//-------------------------------------------------------------------------
22
 
23
#include "duke3d.h"
4818 hendricks2 24
#include "renderlayer.h"
2290 helixhorne 25
#include "net.h"
26
#include "player.h"
5 Plagman 27
#include "mouse.h"
2728 hendricks2 28
#include "joystick.h"
5 Plagman 29
#include "osd.h"
911 terminx 30
#include "osdcmds.h"
1215 terminx 31
#include "gamedef.h"
1677 terminx 32
#include "gameexec.h"
33
#include "savegame.h"
34
#include "premap.h"
1678 terminx 35
#include "demo.h"
4387 terminx 36
#include "xxhash.h"
2556 helixhorne 37
#include "common.h"
2726 hendricks2 38
#include "common_game.h"
2728 hendricks2 39
#include "input.h"
3084 terminx 40
#include "menus.h"
1707 terminx 41
 
5 Plagman 42
#include <sys/stat.h>
43
 
4686 hendricks2 44
// common positions
45
#define MENU_MARGIN_REGULAR 40
46
#define MENU_MARGIN_WIDE    32
47
#define MENU_MARGIN_CENTER  160
48
#define MENU_HEIGHT_CENTER  100
49
 
4449 helixhorne 50
int32_t g_skillSoundVoice = -1;
5 Plagman 51
 
1205 terminx 52
extern int32_t voting;
147 terminx 53
 
921 terminx 54
#define USERMAPENTRYLENGTH 25
55
 
4686 hendricks2 56
#define mgametext(x,y,t) G_ScreenText(STARTALPHANUM, x, y, 65536, 0, 0, t, 0, 0, 2|8|16|ROTATESPRITE_FULL16, 0, (5<<16), (8<<16), (-1<<16), 0, TEXT_GAMETEXTNUMHACK, 0, 0, xdim-1, ydim-1)
4914 hendricks2 57
#define mgametextcenter(x,y,t) G_ScreenText(STARTALPHANUM, (MENU_MARGIN_CENTER<<16) + (x), y, 65536, 0, 0, t, 0, 0, 2|8|16|ROTATESPRITE_FULL16, 0, (5<<16), (8<<16), (-1<<16), (1<<16), TEXT_GAMETEXTNUMHACK|TEXT_XCENTER, 0, 0, xdim-1, ydim-1)
4686 hendricks2 58
#define mminitext(x,y,t,p) minitext_(x, y, t, 0, p, 2|8|16|ROTATESPRITE_FULL16)
59
#define mmenutext(x,y,t) G_ScreenText(BIGALPHANUM, x, (y) - (12<<16), 65536L, 0, 0, (const char *)OSD_StripColors(menutextbuf,t), 0, 0, 2|8|16|ROTATESPRITE_FULL16, 0, 5<<16, 16<<16, 0, 0, TEXT_BIGALPHANUM|TEXT_UPPERCASE|TEXT_LITERALESCAPE, 0, 0, xdim-1, ydim-1)
60
#define mmenutextcenter(x,y,t) G_ScreenText(BIGALPHANUM, (MENU_MARGIN_CENTER<<16) + (x), (y) - (12<<16), 65536L, 0, 0, (const char *)OSD_StripColors(menutextbuf,t), 0, 0, 2|8|16|ROTATESPRITE_FULL16, 0, 5<<16, 16<<16, 0, 0, TEXT_BIGALPHANUM|TEXT_UPPERCASE|TEXT_LITERALESCAPE|TEXT_XCENTER, 0, 0, xdim-1, ydim-1)
1037 terminx 61
 
4686 hendricks2 62
static void shadowminitext(int32_t x, int32_t y, const char *t, int32_t p)
63
{
64
    int32_t f = 0;
4496 hendricks2 65
 
4686 hendricks2 66
    if (!minitext_lowercase)
67
        f |= TEXT_UPPERCASE;
4496 hendricks2 68
 
4686 hendricks2 69
    G_ScreenTextShadow(1, 1, MINIFONT, x, y, 65536, 0, 0, t, 0, p, 2|8|16|ROTATESPRITE_FULL16, 0, 4<<16, 8<<16, 1<<16, 0, f, 0, 0, xdim-1, ydim-1);
70
}
71
static void creditsminitext(int32_t x, int32_t y, const char *t, int32_t p)
5 Plagman 72
{
4686 hendricks2 73
    int32_t f = TEXT_XCENTER;
74
 
75
    if (!minitext_lowercase)
76
        f |= TEXT_UPPERCASE;
77
 
78
    G_ScreenTextShadow(1, 1, MINIFONT, x, y, 65536, 0, 0, t, 0, p, 2|8|16|ROTATESPRITE_FULL16, 0, 4<<16, 8<<16, 1<<16, 0, f, 0, 0, xdim-1, ydim-1);
79
}
80
 
81
int32_t menutext_(int32_t x, int32_t y, int32_t s, int32_t p, char *t, int32_t bits)
82
{
4496 hendricks2 83
    vec2_t dim;
84
    int32_t f = TEXT_BIGALPHANUM|TEXT_UPPERCASE|TEXT_LITERALESCAPE;
5 Plagman 85
 
4686 hendricks2 86
    if (!(bits & ROTATESPRITE_FULL16))
87
    {
88
        x<<=16;
89
        y<<=16;
90
    }
91
 
92
    if (x == (160<<16))
4496 hendricks2 93
        f |= TEXT_XCENTER;
3101 hendricks2 94
 
4686 hendricks2 95
    dim = G_ScreenText(BIGALPHANUM, x, y - (12<<16), 65536L, 0, 0, t, s, p, bits|ROTATESPRITE_FULL16, 0, 5<<16, 16<<16, 0, 0, f, 0, 0, xdim-1, ydim-1);
3101 hendricks2 96
 
4686 hendricks2 97
    if (!(bits & ROTATESPRITE_FULL16))
98
        x >>= 16;
99
 
4496 hendricks2 100
    return dim.x;
3101 hendricks2 101
}
3084 terminx 102
 
4496 hendricks2 103
#pragma pack(push,1)
104
static savehead_t savehead;
105
#pragma pack(pop)
106
 
4686 hendricks2 107
static void M_DrawBackground(const vec2_t origin)
3101 hendricks2 108
{
4686 hendricks2 109
    rotatesprite_fs(origin.x + (MENU_MARGIN_CENTER<<16), origin.y + (100<<16), 65536L,0,MENUSCREEN,16,0,10+64);
4496 hendricks2 110
}
3101 hendricks2 111
 
4686 hendricks2 112
static void M_DrawTopBar(const vec2_t origin)
4549 hendricks2 113
{
4686 hendricks2 114
    rotatesprite_fs(origin.x + (MENU_MARGIN_CENTER<<16), origin.y + (19<<16), 65536L,0,MENUBAR,16,0,10);
4549 hendricks2 115
}
3101 hendricks2 116
 
4686 hendricks2 117
static void M_DrawTopBarCaption(const char *caption, const vec2_t origin)
4496 hendricks2 118
{
4624 terminx 119
    char *s = Bstrdup(caption), p = Bstrlen(caption)-1;
120
    if (s[p] == ':') s[p] = 0;
4686 hendricks2 121
    mmenutextcenter(origin.x, origin.y + (24<<16), s);
4624 terminx 122
    Bfree(s);
5 Plagman 123
}
124
 
4496 hendricks2 125
extern int32_t g_quitDeadline;
5 Plagman 126
 
127
 
128
 
129
 
1631 terminx 130
 
2728 hendricks2 131
 
5 Plagman 132
 
2313 helixhorne 133
 
5 Plagman 134
 
2313 helixhorne 135
 
136
 
137
 
138
 
4496 hendricks2 139
/*
140
All MAKE_* macros are generally for the purpose of keeping state initialization
141
separate from actual data. Alternatively, they can serve to factor out repetitive
142
stuff and keep the important bits from getting lost to our eyes.
4506 hendricks2 143
 
144
They serve as a stand-in for C++ default value constructors, since we're using C89.
4778 hendricks2 145
 
146
Note that I prefer to include a space on the inside of the macro parentheses, since
147
they effectively stand in for curly braces as struct initializers.
4496 hendricks2 148
*/
2313 helixhorne 149
 
150
 
4496 hendricks2 151
// common font types
152
// tilenums are set after namesdyn runs
4778 hendricks2 153
static MenuFont_t MF_Null             = { -1, 10,  0,  0,     0,      0,      0,     0, 0 };
154
static MenuFont_t MF_Redfont          = { -1, 10,  0,  1, 5<<16, 15<<16,  0<<16, 0<<16, TEXT_BIGALPHANUM | TEXT_UPPERCASE };
155
static MenuFont_t MF_RedfontBlue      = { -1, 10,  1,  1, 5<<16, 15<<16,  0<<16, 0<<16, TEXT_BIGALPHANUM | TEXT_UPPERCASE };
156
static MenuFont_t MF_RedfontGreen     = { -1, 10,  8,  1, 5<<16, 15<<16,  0<<16, 0<<16, TEXT_BIGALPHANUM | TEXT_UPPERCASE };
157
static MenuFont_t MF_Bluefont         = { -1, 10,  0, 16, 5<<16,  7<<16, -1<<16, 0<<16, 0 };
158
static MenuFont_t MF_BluefontRed      = { -1, 10, 10, 16, 5<<16,  7<<16, -1<<16, 0<<16, 0 };
159
static MenuFont_t MF_Minifont         = { -1, 10,  0, 16, 4<<16,  5<<16,  1<<16, 1<<16, 0 };
160
static MenuFont_t MF_MinifontRed      = { -1, 16, 21, 16, 4<<16,  5<<16,  1<<16, 1<<16, 0 };
161
static MenuFont_t MF_MinifontDarkGray = { -1, 10, 13, 16, 4<<16,  5<<16,  1<<16, 1<<16, 0 };
2313 helixhorne 162
 
163
 
4778 hendricks2 164
static MenuMenuFormat_t MMF_Top_Main =             { {  MENU_MARGIN_CENTER<<16, 55<<16, }, -170<<16 };
165
static MenuMenuFormat_t MMF_Top_Episode =          { {  MENU_MARGIN_CENTER<<16, 48<<16, }, -190<<16 };
166
static MenuMenuFormat_t MMF_Top_Skill =            { {  MENU_MARGIN_CENTER<<16, 58<<16, }, -190<<16 };
167
static MenuMenuFormat_t MMF_Top_Options =          { {  MENU_MARGIN_CENTER<<16, 38<<16, }, -190<<16 };
168
static MenuMenuFormat_t MMF_Top_Joystick_Network = { {  MENU_MARGIN_CENTER<<16, 70<<16, }, -190<<16 };
169
static MenuMenuFormat_t MMF_BigOptions =           { {    MENU_MARGIN_WIDE<<16, 38<<16, }, -190<<16 };
170
static MenuMenuFormat_t MMF_SmallOptions =         { {    MENU_MARGIN_WIDE<<16, 37<<16, },  160<<16 };
171
static MenuMenuFormat_t MMF_Macros =               { {                  26<<16, 40<<16, },  160<<16 };
172
static MenuMenuFormat_t MMF_SmallOptionsNarrow  =  { { MENU_MARGIN_REGULAR<<16, 38<<16, }, -190<<16 };
173
static MenuMenuFormat_t MMF_KeyboardSetupFuncs =   { {                  70<<16, 34<<16, },  151<<16 };
174
static MenuMenuFormat_t MMF_MouseJoySetupBtns =    { {                  76<<16, 34<<16, },  143<<16 };
175
static MenuMenuFormat_t MMF_FuncList =             { {                 100<<16, 51<<16, },  152<<16 };
176
static MenuMenuFormat_t MMF_ColorCorrect =         { { MENU_MARGIN_REGULAR<<16, 86<<16, },  190<<16 };
177
static MenuMenuFormat_t MMF_BigSliders =           { {    MENU_MARGIN_WIDE<<16, 37<<16, },  190<<16 };
178
static MenuMenuFormat_t MMF_LoadSave =             { {                 223<<16, 48<<16, },  320<<16 };
179
static MenuMenuFormat_t MMF_NetSetup =             { {                  36<<16, 38<<16, },  190<<16 };
4851 hendricks2 180
static MenuMenuFormat_t MMF_FileSelectLeft =       { {                  40<<16, 45<<16, },  162<<16 };
181
static MenuMenuFormat_t MMF_FileSelectRight =      { {                 164<<16, 45<<16, },  162<<16 };
4778 hendricks2 182
 
183
static MenuEntryFormat_t MEF_Null =             {     0,      0,        0,  20<<16, 65536 };
184
static MenuEntryFormat_t MEF_MainMenu =         { 4<<16,      0,        0, 110<<16, 65536 };
185
static MenuEntryFormat_t MEF_CenterMenu =       { 7<<16,      0,        0, 110<<16, 65536 };
186
static MenuEntryFormat_t MEF_BigOptions =       { 4<<16,      0,  190<<16,  20<<16, 65536 };
187
static MenuEntryFormat_t MEF_BigOptions_Apply = { 4<<16, 16<<16,  190<<16,  20<<16, 65536 };
188
static MenuEntryFormat_t MEF_BigOptionsRt =     { 4<<16,      0, -260<<16,  20<<16, 65536 };
189
#if defined USE_OPENGL || !defined DROIDMENU
190
static MenuEntryFormat_t MEF_SmallOptions =     { 1<<16,      0,  216<<16,  10<<16, 32768 };
4647 hendricks2 191
#endif
4778 hendricks2 192
static MenuEntryFormat_t MEF_PlayerNarrow =     { 1<<16,      0,   90<<16,  10<<16, 32768 };
4856 hendricks2 193
static MenuEntryFormat_t MEF_Macros =           { 2<<16,     -1,  268<<16,  10<<16, 32768 };
4778 hendricks2 194
static MenuEntryFormat_t MEF_VideoSetup =       { 4<<16,      0,  168<<16,  20<<16, 65536 };
195
static MenuEntryFormat_t MEF_FuncList =         { 3<<16,      0,  100<<16,  10<<16, 32768 };
196
static MenuEntryFormat_t MEF_ColorCorrect =     { 2<<16,      0, -240<<16,  20<<16, 65536 };
197
static MenuEntryFormat_t MEF_BigSliders =       { 2<<16,      0,  170<<16,  20<<16, 65536 };
4856 hendricks2 198
static MenuEntryFormat_t MEF_LoadSave =         { 7<<16,     -1,   78<<16,  20<<16, 65536 };
4778 hendricks2 199
static MenuEntryFormat_t MEF_NetSetup =         { 4<<16,      0,    2<<16,  20<<16, 65536 };
2313 helixhorne 200
 
4496 hendricks2 201
// common menu option sets
4778 hendricks2 202
#define MAKE_MENUOPTIONSET(optionNames, optionValues, features) { optionNames, optionValues, &MMF_FuncList, &MEF_FuncList, &MF_Minifont, ARRAY_SIZE(optionNames), -1, 0, features }
203
#define MAKE_MENUOPTIONSETDYN(optionNames, optionValues, numOptions, features) { optionNames, optionValues, &MMF_FuncList, &MEF_FuncList, &MF_Minifont, numOptions, -1, 0, features }
2313 helixhorne 204
 
4496 hendricks2 205
static char *MEOSN_OffOn[] = { "Off", "On", };
4778 hendricks2 206
static MenuOptionSet_t MEOS_OffOn = MAKE_MENUOPTIONSET( MEOSN_OffOn, NULL, 0x3 );
4496 hendricks2 207
static char *MEOSN_OnOff[] = { "On", "Off", };
4778 hendricks2 208
static MenuOptionSet_t MEOS_OnOff = MAKE_MENUOPTIONSET( MEOSN_OnOff, NULL, 0x3 );
4496 hendricks2 209
static char *MEOSN_NoYes[] = { "No", "Yes", };
4778 hendricks2 210
static MenuOptionSet_t MEOS_NoYes = MAKE_MENUOPTIONSET( MEOSN_NoYes, NULL, 0x3 );
4496 hendricks2 211
static char *MEOSN_YesNo[] = { "Yes", "No", };
4778 hendricks2 212
static MenuOptionSet_t MEOS_YesNo = MAKE_MENUOPTIONSET( MEOSN_YesNo, NULL, 0x3 );
2313 helixhorne 213
 
5 Plagman 214
 
4496 hendricks2 215
static char MenuGameFuncs[NUMGAMEFUNCTIONS][MAXGAMEFUNCLEN];
216
static char *MenuGameFuncNone = "  -None-";
217
static char *MEOSN_Gamefuncs[NUMGAMEFUNCTIONS+1];
4778 hendricks2 218
static MenuOptionSet_t MEOS_Gamefuncs = MAKE_MENUOPTIONSET( MEOSN_Gamefuncs, NULL, 0x1 );
2313 helixhorne 219
 
5 Plagman 220
 
221
 
4496 hendricks2 222
/*
4778 hendricks2 223
MenuEntry_t is passed in arrays of pointers so that the callback function
4496 hendricks2 224
that is called when an entry is modified or activated can test equality of the current
4778 hendricks2 225
entry pointer directly against the known ones, instead of relying on an ID number.
5 Plagman 226
 
4778 hendricks2 227
That way, individual menu entries can be ifdef'd out painlessly.
4496 hendricks2 228
*/
2728 hendricks2 229
 
4688 hendricks2 230
static MenuLink_t MEO_NULL = { MENU_NULL, MA_None, };
4496 hendricks2 231
static const char* MenuCustom = "Custom";
2728 hendricks2 232
 
4778 hendricks2 233
#define MAKE_MENUSTRING(...) { NULL, __VA_ARGS__, }
4496 hendricks2 234
#define MAKE_MENUOPTION(...) { __VA_ARGS__, -1, }
235
#define MAKE_MENURANGE(...) { __VA_ARGS__, }
236
#define MAKE_MENUENTRY(...) { __VA_ARGS__, 0, 0, 0, }
2728 hendricks2 237
 
4778 hendricks2 238
 
239
#define MAKE_SPACER( EntryName, Height ) \
240
static MenuSpacer_t MEO_ ## EntryName = { Height };\
241
static MenuEntry_t ME_ ## EntryName = MAKE_MENUENTRY( NULL, &MF_Null, &MEF_Null, &MEO_ ## EntryName, Spacer )
242
 
243
MAKE_SPACER( Space2, 2<<16 ); // bigoptions
244
MAKE_SPACER( Space4, 4<<16 ); // usermap, smalloptions, anything else non-top
245
MAKE_SPACER( Space6, 6<<16 ); // videosetup
246
MAKE_SPACER( Space8, 8<<16 ); // colcorr, redslide
247
 
248
 
249
#define MAKE_MENU_TOP_ENTRYLINK( Title, Format, EntryName, LinkID ) \
4688 hendricks2 250
static MenuLink_t MEO_ ## EntryName = { LinkID, MA_Advance, };\
4778 hendricks2 251
static MenuEntry_t ME_ ## EntryName = MAKE_MENUENTRY( Title, &MF_Redfont, &Format, &MEO_ ## EntryName, Link )
2728 hendricks2 252
 
253
 
4778 hendricks2 254
MAKE_MENU_TOP_ENTRYLINK( "New Game", MEF_MainMenu, MAIN_NEWGAME, MENU_EPISODE );
255
MAKE_MENU_TOP_ENTRYLINK( "New Game", MEF_MainMenu, MAIN_NEWGAME_INGAME, MENU_NEWVERIFY );
4688 hendricks2 256
static MenuLink_t MEO_MAIN_NEWGAME_NETWORK = { MENU_NETWORK, MA_Advance, };
4778 hendricks2 257
MAKE_MENU_TOP_ENTRYLINK( "Save Game", MEF_MainMenu, MAIN_SAVEGAME, MENU_SAVE );
258
MAKE_MENU_TOP_ENTRYLINK( "Load Game", MEF_MainMenu, MAIN_LOADGAME, MENU_LOAD );
259
MAKE_MENU_TOP_ENTRYLINK( "Options", MEF_MainMenu, MAIN_OPTIONS, MENU_OPTIONS );
4682 hendricks2 260
#ifndef DROIDMENU
4778 hendricks2 261
MAKE_MENU_TOP_ENTRYLINK( "Help", MEF_MainMenu, MAIN_HELP, MENU_STORY );
4682 hendricks2 262
#endif
4778 hendricks2 263
MAKE_MENU_TOP_ENTRYLINK( "Credits", MEF_MainMenu, MAIN_CREDITS, MENU_CREDITS );
264
MAKE_MENU_TOP_ENTRYLINK( "Quit To Title", MEF_MainMenu, MAIN_QUITTOTITLE, MENU_QUITTOTITLE );
265
MAKE_MENU_TOP_ENTRYLINK( "Quit", MEF_MainMenu, MAIN_QUIT, MENU_QUIT );
266
MAKE_MENU_TOP_ENTRYLINK( "Quit Game", MEF_MainMenu, MAIN_QUITGAME, MENU_QUIT );
2728 hendricks2 267
 
4496 hendricks2 268
static MenuEntry_t *MEL_MAIN[] = {
269
    &ME_MAIN_NEWGAME,
270
    &ME_MAIN_OPTIONS,
271
    &ME_MAIN_LOADGAME,
4609 terminx 272
#ifndef DROIDMENU
4496 hendricks2 273
    &ME_MAIN_HELP,
4609 terminx 274
#endif
4496 hendricks2 275
    &ME_MAIN_CREDITS,
276
    &ME_MAIN_QUIT,
277
};
4609 terminx 278
 
4496 hendricks2 279
static MenuEntry_t *MEL_MAIN_INGAME[] = {
280
    &ME_MAIN_NEWGAME_INGAME,
281
    &ME_MAIN_SAVEGAME,
282
    &ME_MAIN_LOADGAME,
283
    &ME_MAIN_OPTIONS,
4609 terminx 284
#ifndef DROIDMENU
4496 hendricks2 285
    &ME_MAIN_HELP,
4609 terminx 286
#endif
4496 hendricks2 287
    &ME_MAIN_QUITTOTITLE,
288
    &ME_MAIN_QUITGAME,
289
};
2728 hendricks2 290
 
4496 hendricks2 291
// Episode and Skill will be dynamically generated after CONs are parsed
4688 hendricks2 292
static MenuLink_t MEO_EPISODE = { MENU_SKILL, MA_Advance, };
293
static MenuLink_t MEO_EPISODE_SHAREWARE = { MENU_BUYDUKE, MA_Advance, };
4778 hendricks2 294
static MenuEntry_t ME_EPISODE_TEMPLATE = MAKE_MENUENTRY( NULL, &MF_Redfont, &MEF_CenterMenu, &MEO_EPISODE, Link );
4496 hendricks2 295
static MenuEntry_t ME_EPISODE[MAXVOLUMES];
4688 hendricks2 296
static MenuLink_t MEO_EPISODE_USERMAP = { MENU_USERMAP, MA_Advance, };
4778 hendricks2 297
static MenuEntry_t ME_EPISODE_USERMAP = MAKE_MENUENTRY( "User Map", &MF_Redfont, &MEF_CenterMenu, &MEO_EPISODE_USERMAP, Link );
298
static MenuEntry_t *MEL_EPISODE[MAXVOLUMES+2]; // +2 for spacer and User Map
398 terminx 299
 
4778 hendricks2 300
static MenuEntry_t ME_SKILL_TEMPLATE = MAKE_MENUENTRY( NULL, &MF_Redfont, &MEF_CenterMenu, &MEO_NULL, Link );
4496 hendricks2 301
static MenuEntry_t ME_SKILL[MAXSKILLS];
302
static MenuEntry_t *MEL_SKILL[MAXSKILLS];
5 Plagman 303
 
4818 hendricks2 304
#if defined STARTUP_SETUP_WINDOW && !defined DROIDMENU
4778 hendricks2 305
static MenuOption_t MEO_GAMESETUP_STARTWIN = MAKE_MENUOPTION( &MF_Redfont, &MEOS_OffOn, &ud.config.ForceSetup );
306
static MenuEntry_t ME_GAMESETUP_STARTWIN = MAKE_MENUENTRY( "Startup window:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_GAMESETUP_STARTWIN, Option );
4682 hendricks2 307
#endif
4609 terminx 308
 
4688 hendricks2 309
static char *MEOSN_GAMESETUP_AIM_AUTO[] = { "None", "Regular", "Bullets only",
4609 terminx 310
#ifdef DROIDMENU
4688 hendricks2 311
"Extra wide"
4609 terminx 312
#endif
313
};
314
static int32_t MEOSV_GAMESETUP_AIM_AUTO[] = { 0, 1, 2,
315
#ifdef DROIDMENU
316
3,
317
#endif
318
};
319
 
4778 hendricks2 320
static MenuOptionSet_t MEOS_GAMESETUP_AIM_AUTO = MAKE_MENUOPTIONSET( MEOSN_GAMESETUP_AIM_AUTO, MEOSV_GAMESETUP_AIM_AUTO, 0x2 );
321
static MenuOption_t MEO_GAMESETUP_AIM_AUTO = MAKE_MENUOPTION( &MF_Redfont, &MEOS_GAMESETUP_AIM_AUTO, &ud.config.AutoAim );
322
static MenuEntry_t ME_GAMESETUP_AIM_AUTO = MAKE_MENUENTRY( "Auto aim:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_GAMESETUP_AIM_AUTO, Option );
4609 terminx 323
 
324
static char *MEOSN_GAMESETUP_WEAPSWITCH_PICKUP[] = { "Never", "If new", "By rating", };
4778 hendricks2 325
static MenuOptionSet_t MEOS_GAMESETUP_WEAPSWITCH_PICKUP = MAKE_MENUOPTIONSET( MEOSN_GAMESETUP_WEAPSWITCH_PICKUP, NULL, 0x2 );
326
static MenuOption_t MEO_GAMESETUP_WEAPSWITCH_PICKUP = MAKE_MENUOPTION( &MF_Redfont, &MEOS_GAMESETUP_WEAPSWITCH_PICKUP, NULL );
327
static MenuEntry_t ME_GAMESETUP_WEAPSWITCH_PICKUP = MAKE_MENUENTRY( "Equip pickups:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_GAMESETUP_WEAPSWITCH_PICKUP, Option );
4609 terminx 328
 
4496 hendricks2 329
static char *MEOSN_DemoRec[] = { "Off", "Running", };
4778 hendricks2 330
static MenuOptionSet_t MEOS_DemoRec = MAKE_MENUOPTIONSET( MEOSN_DemoRec, NULL, 0x3 );
331
static MenuOption_t MEO_GAMESETUP_DEMOREC = MAKE_MENUOPTION( &MF_Redfont, &MEOS_OffOn, &ud.m_recstat );
332
static MenuEntry_t ME_GAMESETUP_DEMOREC = MAKE_MENUENTRY( "Record demo:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_GAMESETUP_DEMOREC, Option );
4609 terminx 333
 
4496 hendricks2 334
#ifdef _WIN32
4778 hendricks2 335
static MenuOption_t MEO_GAMESETUP_UPDATES = MAKE_MENUOPTION( &MF_Redfont, &MEOS_NoYes, &ud.config.CheckForUpdates );
336
static MenuEntry_t ME_GAMESETUP_UPDATES = MAKE_MENUENTRY( "Online updates:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_GAMESETUP_UPDATES, Option );
4496 hendricks2 337
#endif
2728 hendricks2 338
 
4778 hendricks2 339
static MenuOption_t MEO_ADULTMODE = MAKE_MENUOPTION(&MF_Redfont, &MEOS_OffOn, &ud.lockout);
340
static MenuEntry_t ME_ADULTMODE = MAKE_MENUENTRY( "Parental lock:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_ADULTMODE, Option );
4688 hendricks2 341
// static MenuLink_t MEO_ADULTMODE_PASSWORD = { MENU_ADULTPASSWORD, MA_None, };
4778 hendricks2 342
// static MenuEntry_t ME_ADULTMODE_PASSWORD = MAKE_MENUENTRY( "Enter Password", &MF_Redfont, &, &MEO_ADULTMODE_PASSWORD, Link );
4609 terminx 343
 
4778 hendricks2 344
static MenuEntry_t *MEL_GAMESETUP[] = {
4850 hendricks2 345
    &ME_ADULTMODE,
4818 hendricks2 346
#if defined STARTUP_SETUP_WINDOW && !defined DROIDMENU
4496 hendricks2 347
    &ME_GAMESETUP_STARTWIN,
4609 terminx 348
#endif
4850 hendricks2 349
    &ME_GAMESETUP_AIM_AUTO,
350
    &ME_GAMESETUP_WEAPSWITCH_PICKUP,
4609 terminx 351
#ifndef DROIDMENU
4496 hendricks2 352
    &ME_GAMESETUP_DEMOREC,
353
#ifdef _WIN32
4850 hendricks2 354
    &ME_GAMESETUP_UPDATES,
4609 terminx 355
#endif
356
#endif
4496 hendricks2 357
};
2728 hendricks2 358
 
4778 hendricks2 359
MAKE_MENU_TOP_ENTRYLINK( "Game Setup", MEF_CenterMenu, OPTIONS_GAMESETUP, MENU_GAMESETUP );
360
MAKE_MENU_TOP_ENTRYLINK( "Sound Setup", MEF_CenterMenu, OPTIONS_SOUNDSETUP, MENU_SOUND );
361
MAKE_MENU_TOP_ENTRYLINK( "Display Setup", MEF_CenterMenu, OPTIONS_DISPLAYSETUP, MENU_DISPLAYSETUP );
362
MAKE_MENU_TOP_ENTRYLINK( "Player Setup", MEF_CenterMenu, OPTIONS_PLAYERSETUP, MENU_PLAYER );
363
MAKE_MENU_TOP_ENTRYLINK( "Control Setup", MEF_CenterMenu, OPTIONS_CONTROLS, MENU_CONTROLS );
364
MAKE_MENU_TOP_ENTRYLINK( "Keyboard Setup", MEF_CenterMenu, OPTIONS_KEYBOARDSETUP, MENU_KEYBOARDSETUP );
365
MAKE_MENU_TOP_ENTRYLINK( "Mouse Setup", MEF_CenterMenu, OPTIONS_MOUSESETUP, MENU_MOUSESETUP );
366
MAKE_MENU_TOP_ENTRYLINK( "Joystick Setup", MEF_CenterMenu, OPTIONS_JOYSTICKSETUP, MENU_JOYSTICKSETUP );
2728 hendricks2 367
 
5 Plagman 368
 
4496 hendricks2 369
static int32_t newresolution, newrendermode, newfullscreen;
5 Plagman 370
 
4496 hendricks2 371
enum resflags_t {
372
    RES_FS  = 0x1,
373
    RES_WIN = 0x2,
374
};
5 Plagman 375
 
4496 hendricks2 376
#define MAXRESOLUTIONSTRINGLENGTH 16
5 Plagman 377
 
4496 hendricks2 378
typedef struct resolution_t {
379
    int32_t xdim, ydim;
380
    int32_t flags;
381
    int32_t bppmax;
382
    char name[MAXRESOLUTIONSTRINGLENGTH];
383
} resolution_t;
2358 helixhorne 384
 
4496 hendricks2 385
resolution_t resolution[MAXVALIDMODES];
5 Plagman 386
 
4496 hendricks2 387
static char *MEOSN_VIDEOSETUP_RESOLUTION[MAXVALIDMODES];
4778 hendricks2 388
static MenuOptionSet_t MEOS_VIDEOSETUP_RESOLUTION = MAKE_MENUOPTIONSETDYN( MEOSN_VIDEOSETUP_RESOLUTION, NULL, 0, 0x0 );
389
static MenuOption_t MEO_VIDEOSETUP_RESOLUTION = MAKE_MENUOPTION( &MF_Redfont, &MEOS_VIDEOSETUP_RESOLUTION, &newresolution );
390
static MenuEntry_t ME_VIDEOSETUP_RESOLUTION = MAKE_MENUENTRY( "Resolution:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_VIDEOSETUP_RESOLUTION, Option );
5 Plagman 391
 
4496 hendricks2 392
#ifdef USE_OPENGL
393
#ifdef POLYMER
4976 hendricks2 394
static char *MEOSN_VIDEOSETUP_RENDERER[] = { "Classic", "Polymost", "Polymer", };
4496 hendricks2 395
static int32_t MEOSV_VIDEOSETUP_RENDERER[] = { REND_CLASSIC, REND_POLYMOST, REND_POLYMER, };
396
#else
4609 terminx 397
static char *MEOSN_VIDEOSETUP_RENDERER[] = { "Classic", "OpenGL", };
4496 hendricks2 398
static int32_t MEOSV_VIDEOSETUP_RENDERER[] = { REND_CLASSIC, REND_POLYMOST, };
399
#endif
5 Plagman 400
 
4778 hendricks2 401
static MenuOptionSet_t MEOS_VIDEOSETUP_RENDERER = MAKE_MENUOPTIONSET( MEOSN_VIDEOSETUP_RENDERER, MEOSV_VIDEOSETUP_RENDERER, 0x2 );
5 Plagman 402
 
4778 hendricks2 403
static MenuOption_t MEO_VIDEOSETUP_RENDERER = MAKE_MENUOPTION( &MF_Redfont, &MEOS_VIDEOSETUP_RENDERER, &newrendermode );
404
static MenuEntry_t ME_VIDEOSETUP_RENDERER = MAKE_MENUENTRY( "Renderer:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_VIDEOSETUP_RENDERER, Option );
4823 hendricks2 405
#endif
406
 
4778 hendricks2 407
static MenuOption_t MEO_VIDEOSETUP_FULLSCREEN = MAKE_MENUOPTION( &MF_Redfont, &MEOS_NoYes, &newfullscreen );
408
static MenuEntry_t ME_VIDEOSETUP_FULLSCREEN = MAKE_MENUENTRY( "Fullscreen:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_VIDEOSETUP_FULLSCREEN, Option );
409
static MenuEntry_t ME_VIDEOSETUP_APPLY = MAKE_MENUENTRY( "Apply Changes", &MF_Redfont, &MEF_BigOptions_Apply, &MEO_NULL, Link );
4609 terminx 410
 
411
 
4823 hendricks2 412
static MenuLink_t MEO_DISPLAYSETUP_COLORCORR = { MENU_COLCORR, MA_Advance, };
4856 hendricks2 413
static MenuEntry_t ME_DISPLAYSETUP_COLORCORR = MAKE_MENUENTRY( "Color Correction", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_COLORCORR, Link );
4609 terminx 414
static MenuOption_t MEO_DISPLAYSETUP_PIXELDOUBLING = MAKE_MENUOPTION( &MF_Redfont, &MEOS_OnOff, &ud.detail );
4823 hendricks2 415
static MenuEntry_t ME_DISPLAYSETUP_PIXELDOUBLING = MAKE_MENUENTRY( "Pixel Doubling:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_PIXELDOUBLING, Option );
4609 terminx 416
 
417
 
4496 hendricks2 418
#ifdef USE_OPENGL
4609 terminx 419
static MenuOption_t MEO_DISPLAYSETUP_ASPECTRATIO = MAKE_MENUOPTION(&MF_Redfont, &MEOS_OffOn, NULL);
420
#else
421
static MenuOption_t MEO_DISPLAYSETUP_ASPECTRATIO = MAKE_MENUOPTION(&MF_Redfont, &MEOS_OffOn, &r_usenewaspect);
4496 hendricks2 422
#endif
4823 hendricks2 423
static MenuEntry_t ME_DISPLAYSETUP_ASPECTRATIO = MAKE_MENUENTRY( "Widescreen:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_ASPECTRATIO, Option );
4609 terminx 424
#ifdef POLYMER
425
static char *MEOSN_DISPLAYSETUP_ASPECTRATIO_POLYMER[] = { "Auto", "4:3", "16:10", "5:3", "16:9", "1.85:1", "2.39:1", };
426
static double MEOSV_DISPLAYSETUP_ASPECTRATIO_POLYMER[] = { 0., 1.33, 1.6, 1.66, 1.78, 1.85, 2.39, };
4778 hendricks2 427
static MenuOptionSet_t MEOS_DISPLAYSETUP_ASPECTRATIO_POLYMER = MAKE_MENUOPTIONSET( MEOSN_DISPLAYSETUP_ASPECTRATIO_POLYMER, NULL, 0x1 );
4609 terminx 428
static MenuOption_t MEO_DISPLAYSETUP_ASPECTRATIO_POLYMER = MAKE_MENUOPTION(&MF_Redfont, &MEOS_DISPLAYSETUP_ASPECTRATIO_POLYMER, NULL);
4823 hendricks2 429
static MenuEntry_t ME_DISPLAYSETUP_ASPECTRATIO_POLYMER = MAKE_MENUENTRY( "Aspect ratio:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_ASPECTRATIO_POLYMER, Option );
4609 terminx 430
#endif
5 Plagman 431
 
4609 terminx 432
 
433
#ifdef USE_OPENGL
434
static char *MEOSN_DISPLAYSETUP_TEXFILTER[] = { "Classic", "Filtered" };
4778 hendricks2 435
static MenuOptionSet_t MEOS_DISPLAYSETUP_TEXFILTER = MAKE_MENUOPTIONSET( MEOSN_DISPLAYSETUP_TEXFILTER, NULL, 0x2 );
4609 terminx 436
int32_t menufiltermode;
437
static MenuOption_t MEO_DISPLAYSETUP_TEXFILTER = MAKE_MENUOPTION( &MF_Redfont, &MEOS_DISPLAYSETUP_TEXFILTER, &menufiltermode );
4823 hendricks2 438
static MenuEntry_t ME_DISPLAYSETUP_TEXFILTER = MAKE_MENUENTRY( "Texture Mode:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_TEXFILTER, Option );
4609 terminx 439
 
440
static char *MEOSN_DISPLAYSETUP_ANISOTROPY[] = { "None", "2x", "4x", "8x", "16x", };
4868 hendricks2 441
static int32_t MEOSV_DISPLAYSETUP_ANISOTROPY[] = { 1, 2, 4, 8, 16, };
4778 hendricks2 442
static MenuOptionSet_t MEOS_DISPLAYSETUP_ANISOTROPY = MAKE_MENUOPTIONSET( MEOSN_DISPLAYSETUP_ANISOTROPY, MEOSV_DISPLAYSETUP_ANISOTROPY, 0x0 );
4609 terminx 443
static MenuOption_t MEO_DISPLAYSETUP_ANISOTROPY = MAKE_MENUOPTION(&MF_Redfont, &MEOS_DISPLAYSETUP_ANISOTROPY, &glanisotropy);
4823 hendricks2 444
static MenuEntry_t ME_DISPLAYSETUP_ANISOTROPY = MAKE_MENUENTRY( "Anisotropy:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_ANISOTROPY, Option );
445
static char *MEOSN_DISPLAYSETUP_VSYNC[] = { "Adaptive", "Off", "On", };
4609 terminx 446
static int32_t MEOSV_DISPLAYSETUP_VSYNC[] = { -1, 0, 1, };
4778 hendricks2 447
static MenuOptionSet_t MEOS_DISPLAYSETUP_VSYNC = MAKE_MENUOPTIONSET( MEOSN_DISPLAYSETUP_VSYNC, MEOSV_DISPLAYSETUP_VSYNC, 0x2 );
4609 terminx 448
static MenuOption_t MEO_DISPLAYSETUP_VSYNC = MAKE_MENUOPTION(&MF_Redfont, &MEOS_DISPLAYSETUP_VSYNC, &vsync);
4823 hendricks2 449
static MenuEntry_t ME_DISPLAYSETUP_VSYNC = MAKE_MENUENTRY( "VSync:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_VSYNC, Option );
4609 terminx 450
 
451
#endif
452
 
453
static MenuOption_t MEO_SCREENSETUP_CROSSHAIR = MAKE_MENUOPTION(&MF_Redfont, &MEOS_OffOn, &ud.crosshair);
4778 hendricks2 454
static MenuEntry_t ME_SCREENSETUP_CROSSHAIR = MAKE_MENUENTRY( "Crosshair:", &MF_Redfont, &MEF_BigOptions, &MEO_SCREENSETUP_CROSSHAIR, Option );
455
static MenuRangeInt32_t MEO_SCREENSETUP_CROSSHAIRSIZE = MAKE_MENURANGE( &ud.crosshairscale, &MF_Redfont, 25, 100, 0, 16, 2 );
456
static MenuEntry_t ME_SCREENSETUP_CROSSHAIRSIZE = MAKE_MENUENTRY( "Size:", &MF_Redfont, &MEF_BigOptions, &MEO_SCREENSETUP_CROSSHAIRSIZE, RangeInt32 );
4609 terminx 457
 
458
static int32_t vpsize;
4866 hendricks2 459
static MenuRangeInt32_t MEO_SCREENSETUP_SCREENSIZE = MAKE_MENURANGE( &vpsize, &MF_Redfont, 12, 0, 0, 4, EnforceIntervals );
4778 hendricks2 460
static MenuEntry_t ME_SCREENSETUP_SCREENSIZE = MAKE_MENUENTRY( "Screen size:", &MF_Redfont, &MEF_BigOptions, &MEO_SCREENSETUP_SCREENSIZE, RangeInt32 );
461
static MenuRangeInt32_t MEO_SCREENSETUP_TEXTSIZE = MAKE_MENURANGE( &ud.textscale, &MF_Redfont, 100, 400, 0, 7, 2 );
462
static MenuEntry_t ME_SCREENSETUP_TEXTSIZE = MAKE_MENUENTRY( "Size:", &MF_Redfont, &MEF_BigOptions, &MEO_SCREENSETUP_TEXTSIZE, RangeInt32 );
4609 terminx 463
static MenuOption_t MEO_SCREENSETUP_LEVELSTATS = MAKE_MENUOPTION(&MF_Redfont, &MEOS_OffOn, &ud.levelstats);
4778 hendricks2 464
static MenuEntry_t ME_SCREENSETUP_LEVELSTATS = MAKE_MENUENTRY( "Level stats:", &MF_Redfont, &MEF_BigOptions, &MEO_SCREENSETUP_LEVELSTATS, Option );
4609 terminx 465
 
466
 
467
static MenuOption_t MEO_SCREENSETUP_SHOWPICKUPMESSAGES = MAKE_MENUOPTION(&MF_Redfont, &MEOS_OffOn, &ud.fta_on);
4778 hendricks2 468
static MenuEntry_t ME_SCREENSETUP_SHOWPICKUPMESSAGES = MAKE_MENUENTRY( "Pickup messages:", &MF_Redfont, &MEF_BigOptions, &MEO_SCREENSETUP_SHOWPICKUPMESSAGES, Option );
4609 terminx 469
 
4688 hendricks2 470
static char *MEOSN_SCREENSETUP_NEWSTATUSBAR[] = { "Classic", "New",
4609 terminx 471
#ifdef DROIDMENU
4688 hendricks2 472
"On top",
4609 terminx 473
#endif
474
};
475
 
476
static int32_t MEOSV_SCREENSETUP_NEWSTATUSBAR[] = { 0, 1,
477
#ifdef DROIDMENU
478
2,
479
#endif
480
};
481
 
4778 hendricks2 482
static MenuOptionSet_t MEOS_SCREENSETUP_NEWSTATUSBAR = MAKE_MENUOPTIONSET( MEOSN_SCREENSETUP_NEWSTATUSBAR, MEOSV_SCREENSETUP_NEWSTATUSBAR, 0x2 );
4609 terminx 483
static MenuOption_t MEO_SCREENSETUP_NEWSTATUSBAR = MAKE_MENUOPTION(&MF_Redfont, &MEOS_SCREENSETUP_NEWSTATUSBAR, &ud.althud);
4778 hendricks2 484
static MenuEntry_t ME_SCREENSETUP_NEWSTATUSBAR = MAKE_MENUENTRY( "Status bar:", &MF_Redfont, &MEF_BigOptions, &MEO_SCREENSETUP_NEWSTATUSBAR, Option );
4609 terminx 485
 
486
 
487
 
4778 hendricks2 488
static MenuRangeInt32_t MEO_SCREENSETUP_SBARSIZE = MAKE_MENURANGE( &ud.statusbarscale, &MF_Redfont, 36, 100, 0, 17, 2 );
489
static MenuEntry_t ME_SCREENSETUP_SBARSIZE = MAKE_MENUENTRY( "Size:", &MF_Redfont, &MEF_BigOptions, &MEO_SCREENSETUP_SBARSIZE, RangeInt32 );
4609 terminx 490
 
491
 
4688 hendricks2 492
static MenuLink_t MEO_DISPLAYSETUP_SCREENSETUP = { MENU_SCREENSETUP, MA_Advance, };
4856 hendricks2 493
static MenuEntry_t ME_DISPLAYSETUP_SCREENSETUP = MAKE_MENUENTRY( "On-screen displays", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_SCREENSETUP, Link );
4609 terminx 494
 
495
 
4682 hendricks2 496
#ifndef DROIDMENU
4823 hendricks2 497
#ifdef USE_OPENGL
498
static MenuLink_t MEO_DISPLAYSETUP_ADVANCED_GL = { MENU_RENDERERSETUP, MA_Advance, };
4856 hendricks2 499
static MenuEntry_t ME_DISPLAYSETUP_ADVANCED_GL = MAKE_MENUENTRY( "Advanced", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_ADVANCED_GL, Link );
4823 hendricks2 500
#endif
4609 terminx 501
 
4688 hendricks2 502
static MenuLink_t MEO_DISPLAYSETUP_VIDEOSETUP = { MENU_VIDEOSETUP, MA_Advance, };
4856 hendricks2 503
static MenuEntry_t ME_DISPLAYSETUP_VIDEOSETUP = MAKE_MENUENTRY( "Video mode", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_VIDEOSETUP, Link );
4682 hendricks2 504
#endif
4609 terminx 505
 
4496 hendricks2 506
static MenuEntry_t *MEL_OPTIONS[] = {
507
    &ME_OPTIONS_GAMESETUP,
508
    &ME_OPTIONS_SOUNDSETUP,
4609 terminx 509
    &ME_OPTIONS_DISPLAYSETUP,
510
#ifndef DROIDMENU
4496 hendricks2 511
    &ME_OPTIONS_PLAYERSETUP,
4609 terminx 512
#endif
513
    &ME_OPTIONS_CONTROLS,
4496 hendricks2 514
};
5 Plagman 515
 
4609 terminx 516
static MenuEntry_t *MEL_CONTROLS[] = {
4850 hendricks2 517
    &ME_OPTIONS_KEYBOARDSETUP,
518
    &ME_OPTIONS_MOUSESETUP,
519
    &ME_OPTIONS_JOYSTICKSETUP,
4609 terminx 520
};
521
 
522
 
4778 hendricks2 523
static MenuEntry_t *MEL_VIDEOSETUP[] = {
4496 hendricks2 524
    &ME_VIDEOSETUP_RESOLUTION,
4823 hendricks2 525
#ifdef USE_OPENGL
4496 hendricks2 526
    &ME_VIDEOSETUP_RENDERER,
4823 hendricks2 527
#endif
4496 hendricks2 528
    &ME_VIDEOSETUP_FULLSCREEN,
4778 hendricks2 529
    &ME_Space6,
4496 hendricks2 530
    &ME_VIDEOSETUP_APPLY,
531
};
4609 terminx 532
static MenuEntry_t *MEL_DISPLAYSETUP[] = {
533
    &ME_DISPLAYSETUP_SCREENSETUP,
534
    &ME_DISPLAYSETUP_COLORCORR,
535
#ifndef DROIDMENU
4850 hendricks2 536
    &ME_DISPLAYSETUP_VIDEOSETUP,
4609 terminx 537
#endif
4850 hendricks2 538
    &ME_DISPLAYSETUP_ASPECTRATIO,
539
    &ME_DISPLAYSETUP_PIXELDOUBLING,
4496 hendricks2 540
};
4609 terminx 541
 
4496 hendricks2 542
#ifdef USE_OPENGL
4609 terminx 543
static MenuEntry_t *MEL_DISPLAYSETUP_GL[] = {
4850 hendricks2 544
    &ME_DISPLAYSETUP_SCREENSETUP,
4609 terminx 545
    &ME_DISPLAYSETUP_COLORCORR,
546
#ifndef DROIDMENU
4850 hendricks2 547
    &ME_DISPLAYSETUP_VIDEOSETUP,
4609 terminx 548
#endif
4850 hendricks2 549
    &ME_DISPLAYSETUP_ASPECTRATIO,
550
    &ME_DISPLAYSETUP_TEXFILTER,
4609 terminx 551
#ifndef DROIDMENU
4850 hendricks2 552
    &ME_DISPLAYSETUP_ANISOTROPY,
553
    &ME_DISPLAYSETUP_VSYNC,
4823 hendricks2 554
    &ME_DISPLAYSETUP_ADVANCED_GL,
4609 terminx 555
#endif
4496 hendricks2 556
};
4609 terminx 557
 
558
#ifdef POLYMER
559
static MenuEntry_t *MEL_DISPLAYSETUP_GL_POLYMER[] = {
4850 hendricks2 560
    &ME_DISPLAYSETUP_SCREENSETUP,
561
    &ME_DISPLAYSETUP_COLORCORR,
4609 terminx 562
#ifndef DROIDMENU
4850 hendricks2 563
    &ME_DISPLAYSETUP_VIDEOSETUP,
4496 hendricks2 564
#endif
4850 hendricks2 565
    &ME_DISPLAYSETUP_ASPECTRATIO_POLYMER,
566
    &ME_DISPLAYSETUP_TEXFILTER,
4609 terminx 567
#ifndef DROIDMENU
4850 hendricks2 568
    &ME_DISPLAYSETUP_ANISOTROPY,
569
    &ME_DISPLAYSETUP_VSYNC,
570
    &ME_DISPLAYSETUP_ADVANCED_GL,
4609 terminx 571
#endif
572
};
5 Plagman 573
 
4609 terminx 574
#endif
575
#endif
576
 
577
 
578
 
4496 hendricks2 579
static char *MenuKeyNone = "  -";
580
static char *MEOSN_Keys[NUMKEYS];
5 Plagman 581
 
4778 hendricks2 582
static MenuCustom2Col_t MEO_KEYBOARDSETUPFUNCS_TEMPLATE = { { NULL, NULL, }, MEOSN_Keys, &MF_MinifontRed, NUMKEYS, 54<<16, 0 };
4496 hendricks2 583
static MenuCustom2Col_t MEO_KEYBOARDSETUPFUNCS[NUMGAMEFUNCTIONS];
4778 hendricks2 584
static MenuEntry_t ME_KEYBOARDSETUPFUNCS_TEMPLATE = MAKE_MENUENTRY( NULL, &MF_Minifont, &MEF_FuncList, &MEO_KEYBOARDSETUPFUNCS_TEMPLATE, Custom2Col );
4496 hendricks2 585
static MenuEntry_t ME_KEYBOARDSETUPFUNCS[NUMGAMEFUNCTIONS];
586
static MenuEntry_t *MEL_KEYBOARDSETUPFUNCS[NUMGAMEFUNCTIONS];
5 Plagman 587
 
4823 hendricks2 588
static MenuLink_t MEO_KEYBOARDSETUP_KEYS = { MENU_KEYBOARDKEYS, MA_Advance, };
4778 hendricks2 589
static MenuEntry_t ME_KEYBOARDSETUP_KEYS = MAKE_MENUENTRY( "Configure Keys", &MF_Redfont, &MEF_CenterMenu, &MEO_KEYBOARDSETUP_KEYS, Link );
590
static MenuEntry_t ME_KEYBOARDSETUP_RESET = MAKE_MENUENTRY( "Reset To Defaults", &MF_Redfont, &MEF_CenterMenu, &MEO_NULL, Link );
591
static MenuEntry_t ME_KEYBOARDSETUP_RESETCLASSIC = MAKE_MENUENTRY( "Reset To Classic", &MF_Redfont, &MEF_CenterMenu, &MEO_NULL, Link );
5 Plagman 592
 
4496 hendricks2 593
static MenuEntry_t *MEL_KEYBOARDSETUP[] = {
594
    &ME_KEYBOARDSETUP_KEYS,
595
    &ME_KEYBOARDSETUP_RESET,
596
    &ME_KEYBOARDSETUP_RESETCLASSIC,
597
};
5 Plagman 598
 
599
 
4496 hendricks2 600
// There is no better way to do this than manually.
4399 hendricks2 601
 
4496 hendricks2 602
#define MENUMOUSEFUNCTIONS 12
78 terminx 603
 
4496 hendricks2 604
static char *MenuMouseNames[MENUMOUSEFUNCTIONS] = {
605
    "Button 1",
606
    "Double Button 1",
607
    "Button 2",
608
    "Double Button 2",
609
    "Button 3",
610
    "Double Button 3",
5 Plagman 611
 
4496 hendricks2 612
    "Wheel Up",
613
    "Wheel Down",
5 Plagman 614
 
4496 hendricks2 615
    "Button 4",
616
    "Double Button 4",
617
    "Button 5",
618
    "Double Button 5",
619
};
620
static int32_t MenuMouseDataIndex[MENUMOUSEFUNCTIONS][2] = {
621
    { 0, 0, },
622
    { 0, 1, },
623
    { 1, 0, },
624
    { 1, 1, },
625
    { 2, 0, },
626
    { 2, 1, },
1677 terminx 627
 
4496 hendricks2 628
    // note the mouse wheel
629
    { 4, 0, },
630
    { 5, 0, },
5 Plagman 631
 
4496 hendricks2 632
    { 3, 0, },
633
    { 3, 1, },
634
    { 6, 0, },
635
    { 6, 1, },
636
};
3084 terminx 637
 
4496 hendricks2 638
static MenuOption_t MEO_MOUSEJOYSETUPBTNS_TEMPLATE = MAKE_MENUOPTION( &MF_Minifont, &MEOS_Gamefuncs, NULL );
639
static MenuOption_t MEO_MOUSESETUPBTNS[MENUMOUSEFUNCTIONS];
4778 hendricks2 640
static MenuEntry_t ME_MOUSEJOYSETUPBTNS_TEMPLATE = MAKE_MENUENTRY( NULL, &MF_Minifont, &MEF_FuncList, NULL, Option );
4496 hendricks2 641
static MenuEntry_t ME_MOUSESETUPBTNS[MENUMOUSEFUNCTIONS];
642
static MenuEntry_t *MEL_MOUSESETUPBTNS[MENUMOUSEFUNCTIONS];
3084 terminx 643
 
4823 hendricks2 644
static MenuLink_t MEO_MOUSESETUP_BTNS = { MENU_MOUSEBTNS, MA_Advance, };
4778 hendricks2 645
static MenuEntry_t ME_MOUSESETUP_BTNS = MAKE_MENUENTRY( "Button assignment", &MF_Redfont, &MEF_BigOptionsRt, &MEO_MOUSESETUP_BTNS, Link );
646
static MenuRangeFloat_t MEO_MOUSESETUP_SENSITIVITY = MAKE_MENURANGE( &CONTROL_MouseSensitivity, &MF_Redfont, .5f, 16.f, 0.f, 32, 1 );
647
static MenuEntry_t ME_MOUSESETUP_SENSITIVITY = MAKE_MENUENTRY( "Sensitivity:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_MOUSESETUP_SENSITIVITY, RangeFloat );
648
static MenuOption_t MEO_MOUSESETUP_MOUSEAIMING = MAKE_MENUOPTION( &MF_Redfont, &MEOS_NoYes, &g_myAimMode );
649
static MenuEntry_t ME_MOUSESETUP_MOUSEAIMING = MAKE_MENUENTRY( "Vertical aiming:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_MOUSESETUP_MOUSEAIMING, Option );
650
static MenuOption_t MEO_MOUSESETUP_INVERT = MAKE_MENUOPTION( &MF_Redfont, &MEOS_YesNo, &ud.mouseflip );
651
static MenuEntry_t ME_MOUSESETUP_INVERT = MAKE_MENUENTRY( "Invert aiming:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_MOUSESETUP_INVERT, Option );
652
static MenuOption_t MEO_MOUSESETUP_SMOOTH = MAKE_MENUOPTION( &MF_Redfont, &MEOS_NoYes, &ud.config.SmoothInput );
653
static MenuEntry_t ME_MOUSESETUP_SMOOTH = MAKE_MENUENTRY( "Filter input:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_MOUSESETUP_SMOOTH, Option );
4823 hendricks2 654
static MenuLink_t MEO_MOUSESETUP_ADVANCED = { MENU_MOUSEADVANCED, MA_Advance, };
4778 hendricks2 655
static MenuEntry_t ME_MOUSESETUP_ADVANCED = MAKE_MENUENTRY( "Advanced setup", &MF_Redfont, &MEF_BigOptionsRt, &MEO_MOUSESETUP_ADVANCED, Link );
3084 terminx 656
 
4778 hendricks2 657
static MenuEntry_t *MEL_MOUSESETUP[] = {
4496 hendricks2 658
    &ME_MOUSESETUP_SENSITIVITY,
4850 hendricks2 659
    &ME_MOUSESETUP_BTNS,
4778 hendricks2 660
    &ME_Space2,
4850 hendricks2 661
    &ME_MOUSESETUP_MOUSEAIMING,
662
    &ME_MOUSESETUP_INVERT,
663
    &ME_MOUSESETUP_SMOOTH,
664
    &ME_MOUSESETUP_ADVANCED,
4609 terminx 665
};
666
 
4778 hendricks2 667
MAKE_MENU_TOP_ENTRYLINK( "Edit Buttons", MEF_CenterMenu, JOYSTICK_EDITBUTTONS, MENU_JOYSTICKBTNS );
668
MAKE_MENU_TOP_ENTRYLINK( "Edit Axes", MEF_CenterMenu, JOYSTICK_EDITAXES, MENU_JOYSTICKAXES );
5 Plagman 669
 
4496 hendricks2 670
static MenuEntry_t *MEL_JOYSTICKSETUP[] = {
671
    &ME_JOYSTICK_EDITBUTTONS,
672
    &ME_JOYSTICK_EDITAXES,
673
};
5 Plagman 674
 
4496 hendricks2 675
#define MAXJOYBUTTONSTRINGLENGTH 32
5 Plagman 676
 
4826 hendricks2 677
static char MenuJoystickNames[MAXJOYBUTTONSANDHATS*2][MAXJOYBUTTONSTRINGLENGTH];
5 Plagman 678
 
4826 hendricks2 679
static MenuOption_t MEO_JOYSTICKBTNS[MAXJOYBUTTONSANDHATS*2];
680
static MenuEntry_t ME_JOYSTICKBTNS[MAXJOYBUTTONSANDHATS*2];
681
static MenuEntry_t *MEL_JOYSTICKBTNS[MAXJOYBUTTONSANDHATS*2];
59 terminx 682
 
4688 hendricks2 683
static MenuLink_t MEO_JOYSTICKAXES = { MENU_JOYSTICKAXIS, MA_Advance, };
4778 hendricks2 684
static MenuEntry_t ME_JOYSTICKAXES_TEMPLATE = MAKE_MENUENTRY( NULL, &MF_Redfont, &MEF_BigSliders, &MEO_JOYSTICKAXES, Link );
4496 hendricks2 685
static MenuEntry_t ME_JOYSTICKAXES[MAXJOYAXES];
686
static char MenuJoystickAxes[MAXJOYAXES][MAXJOYBUTTONSTRINGLENGTH];
59 terminx 687
 
4496 hendricks2 688
static MenuEntry_t *MEL_JOYSTICKAXES[MAXJOYAXES];
2188 helixhorne 689
 
4778 hendricks2 690
static MenuRangeInt32_t MEO_MOUSEADVANCED_SCALEX = MAKE_MENURANGE( &ud.config.MouseAnalogueScale[0], &MF_Bluefont, -262144, 262144, 65536, 65, 3 );
691
static MenuEntry_t ME_MOUSEADVANCED_SCALEX = MAKE_MENUENTRY( "X-Axis Scale", &MF_Redfont, &MEF_BigSliders, &MEO_MOUSEADVANCED_SCALEX, RangeInt32 );
692
static MenuRangeInt32_t MEO_MOUSEADVANCED_SCALEY = MAKE_MENURANGE( &ud.config.MouseAnalogueScale[1], &MF_Bluefont, -262144, 262144, 65536, 65, 3 );
693
static MenuEntry_t ME_MOUSEADVANCED_SCALEY = MAKE_MENUENTRY( "Y-Axis Scale", &MF_Redfont, &MEF_BigSliders, &MEO_MOUSEADVANCED_SCALEY, RangeInt32 );
2188 helixhorne 694
 
4609 terminx 695
static MenuOption_t MEO_MOUSEADVANCED_DAXES_UP = MAKE_MENUOPTION( &MF_BluefontRed, &MEOS_Gamefuncs, &ud.config.MouseDigitalFunctions[1][0] );
4778 hendricks2 696
static MenuEntry_t ME_MOUSEADVANCED_DAXES_UP = MAKE_MENUENTRY( "Digital Up", &MF_Redfont, &MEF_BigSliders, &MEO_MOUSEADVANCED_DAXES_UP, Option );
4609 terminx 697
static MenuOption_t MEO_MOUSEADVANCED_DAXES_DOWN = MAKE_MENUOPTION( &MF_BluefontRed, &MEOS_Gamefuncs, &ud.config.MouseDigitalFunctions[1][1] );
4778 hendricks2 698
static MenuEntry_t ME_MOUSEADVANCED_DAXES_DOWN = MAKE_MENUENTRY( "Digital Down", &MF_Redfont, &MEF_BigSliders, &MEO_MOUSEADVANCED_DAXES_DOWN, Option );
4609 terminx 699
static MenuOption_t MEO_MOUSEADVANCED_DAXES_LEFT = MAKE_MENUOPTION( &MF_BluefontRed, &MEOS_Gamefuncs, &ud.config.MouseDigitalFunctions[0][0] );
4778 hendricks2 700
static MenuEntry_t ME_MOUSEADVANCED_DAXES_LEFT = MAKE_MENUENTRY( "Digital Left", &MF_Redfont, &MEF_BigSliders, &MEO_MOUSEADVANCED_DAXES_LEFT, Option );
4609 terminx 701
static MenuOption_t MEO_MOUSEADVANCED_DAXES_RIGHT = MAKE_MENUOPTION( &MF_BluefontRed, &MEOS_Gamefuncs, &ud.config.MouseDigitalFunctions[0][1] );
4778 hendricks2 702
static MenuEntry_t ME_MOUSEADVANCED_DAXES_RIGHT = MAKE_MENUENTRY( "Digital Right", &MF_Redfont, &MEF_BigSliders, &MEO_MOUSEADVANCED_DAXES_RIGHT, Option );
2188 helixhorne 703
 
4778 hendricks2 704
static MenuEntry_t *MEL_MOUSEADVANCED[] = {
705
    &ME_MOUSEADVANCED_SCALEX,
706
    &ME_MOUSEADVANCED_SCALEY,
707
    &ME_Space8,
4496 hendricks2 708
    &ME_MOUSEADVANCED_DAXES_UP,
709
    &ME_MOUSEADVANCED_DAXES_DOWN,
710
    &ME_MOUSEADVANCED_DAXES_LEFT,
711
    &ME_MOUSEADVANCED_DAXES_RIGHT,
712
};
3084 terminx 713
 
4778 hendricks2 714
static MenuEntry_t *MEL_INTERNAL_MOUSEADVANCED_DAXES[] = {
715
    &ME_MOUSEADVANCED_DAXES_UP,
716
    &ME_MOUSEADVANCED_DAXES_DOWN,
717
    &ME_MOUSEADVANCED_DAXES_LEFT,
718
    &ME_MOUSEADVANCED_DAXES_RIGHT,
719
};
720
 
4496 hendricks2 721
static const char *MenuJoystickHatDirections[] = { "Up", "Right", "Down", "Left", };
3084 terminx 722
 
4609 terminx 723
static char *MEOSN_JOYSTICKAXIS_ANALOG[] = { "  -None-", "Turning", "Strafing", "Looking", "Moving", };
4496 hendricks2 724
static int32_t MEOSV_JOYSTICKAXIS_ANALOG[] = { -1, analog_turning, analog_strafing, analog_lookingupanddown, analog_moving, };
4778 hendricks2 725
static MenuOptionSet_t MEOS_JOYSTICKAXIS_ANALOG = MAKE_MENUOPTIONSET( MEOSN_JOYSTICKAXIS_ANALOG, MEOSV_JOYSTICKAXIS_ANALOG, 0x0 );
4496 hendricks2 726
static MenuOption_t MEO_JOYSTICKAXIS_ANALOG = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_JOYSTICKAXIS_ANALOG, NULL );
4778 hendricks2 727
static MenuEntry_t ME_JOYSTICKAXIS_ANALOG = MAKE_MENUENTRY( "Analog", &MF_Redfont, &MEF_BigSliders, &MEO_JOYSTICKAXIS_ANALOG, Option );
728
static MenuRangeInt32_t MEO_JOYSTICKAXIS_SCALE = MAKE_MENURANGE( NULL, &MF_Bluefont, -262144, 262144, 65536, 65, 3 );
729
static MenuEntry_t ME_JOYSTICKAXIS_SCALE = MAKE_MENUENTRY( "Scale", &MF_Redfont, &MEF_BigSliders, &MEO_JOYSTICKAXIS_SCALE, RangeInt32 );
730
static MenuRangeInt32_t MEO_JOYSTICKAXIS_DEAD = MAKE_MENURANGE( NULL, &MF_Bluefont, 0, 1000000, 0, 33, 2 );
731
static MenuEntry_t ME_JOYSTICKAXIS_DEAD = MAKE_MENUENTRY( "Dead Zone", &MF_Redfont, &MEF_BigSliders, &MEO_JOYSTICKAXIS_DEAD, RangeInt32 );
732
static MenuRangeInt32_t MEO_JOYSTICKAXIS_SATU = MAKE_MENURANGE( NULL, &MF_Bluefont, 0, 1000000, 0, 33, 2 );
733
static MenuEntry_t ME_JOYSTICKAXIS_SATU = MAKE_MENUENTRY( "Saturation", &MF_Redfont, &MEF_BigSliders, &MEO_JOYSTICKAXIS_SATU, RangeInt32 );
3084 terminx 734
 
4496 hendricks2 735
static MenuOption_t MEO_JOYSTICKAXIS_DIGITALNEGATIVE = MAKE_MENUOPTION( &MF_Minifont, &MEOS_Gamefuncs, NULL );
4778 hendricks2 736
static MenuEntry_t ME_JOYSTICKAXIS_DIGITALNEGATIVE = MAKE_MENUENTRY( "Digital -", &MF_BluefontRed, &MEF_BigSliders, &MEO_JOYSTICKAXIS_DIGITALNEGATIVE, Option );
4496 hendricks2 737
static MenuOption_t MEO_JOYSTICKAXIS_DIGITALPOSITIVE = MAKE_MENUOPTION( &MF_Minifont, &MEOS_Gamefuncs, NULL );
4778 hendricks2 738
static MenuEntry_t ME_JOYSTICKAXIS_DIGITALPOSITIVE = MAKE_MENUENTRY( "Digital +", &MF_BluefontRed, &MEF_BigSliders, &MEO_JOYSTICKAXIS_DIGITALPOSITIVE, Option );
3084 terminx 739
 
4496 hendricks2 740
static MenuEntry_t *MEL_JOYSTICKAXIS[] = {
741
    &ME_JOYSTICKAXIS_ANALOG,
742
    &ME_JOYSTICKAXIS_SCALE,
743
    &ME_JOYSTICKAXIS_DEAD,
744
    &ME_JOYSTICKAXIS_SATU,
4778 hendricks2 745
    &ME_Space8,
746
    &ME_JOYSTICKAXIS_DIGITALNEGATIVE,
747
    &ME_JOYSTICKAXIS_DIGITALPOSITIVE,
4496 hendricks2 748
};
3084 terminx 749
 
4778 hendricks2 750
static MenuEntry_t *MEL_INTERNAL_JOYSTICKAXIS_DIGITAL[] = {
4496 hendricks2 751
    &ME_JOYSTICKAXIS_DIGITALNEGATIVE,
752
    &ME_JOYSTICKAXIS_DIGITALPOSITIVE,
753
};
3084 terminx 754
 
4496 hendricks2 755
#ifdef USE_OPENGL
756
static MenuOption_t MEO_RENDERERSETUP_HIGHTILE = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_NoYes, &usehightile );
4778 hendricks2 757
static MenuEntry_t ME_RENDERERSETUP_HIGHTILE = MAKE_MENUENTRY( "Hires textures:", &MF_BluefontRed, &MEF_SmallOptions, &MEO_RENDERERSETUP_HIGHTILE, Option );
758
static MenuRangeInt32_t MEO_RENDERERSETUP_TEXQUALITY = MAKE_MENURANGE( &r_downsize, &MF_Bluefont, 2, 0, 0, 3, 0 );
759
static MenuEntry_t ME_RENDERERSETUP_TEXQUALITY = MAKE_MENUENTRY( "Hires texture quality", &MF_BluefontRed, &MEF_SmallOptions, &MEO_RENDERERSETUP_TEXQUALITY, RangeInt32 );
4496 hendricks2 760
static MenuOption_t MEO_RENDERERSETUP_PRECACHE = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_OffOn, &ud.config.useprecache );
4778 hendricks2 761
static MenuEntry_t ME_RENDERERSETUP_PRECACHE = MAKE_MENUENTRY( "Pre-load map textures", &MF_BluefontRed, &MEF_SmallOptions, &MEO_RENDERERSETUP_PRECACHE, Option );
4496 hendricks2 762
static char *MEOSN_RENDERERSETUP_TEXCACHE[] = { "Off", "On", "Compress", };
4778 hendricks2 763
static MenuOptionSet_t MEOS_RENDERERSETUP_TEXCACHE = MAKE_MENUOPTIONSET( MEOSN_RENDERERSETUP_TEXCACHE, NULL, 0x2 );
4496 hendricks2 764
static MenuOption_t MEO_RENDERERSETUP_TEXCACHE = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_RENDERERSETUP_TEXCACHE, &glusetexcache );
4778 hendricks2 765
static MenuEntry_t ME_RENDERERSETUP_TEXCACHE = MAKE_MENUENTRY( "On disk texture cache", &MF_BluefontRed, &MEF_SmallOptions, &MEO_RENDERERSETUP_TEXCACHE, Option );
4496 hendricks2 766
static MenuOption_t MEO_RENDERERSETUP_DETAILTEX = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_NoYes, &r_detailmapping );
4778 hendricks2 767
static MenuEntry_t ME_RENDERERSETUP_DETAILTEX = MAKE_MENUENTRY( "Detail textures:", &MF_BluefontRed, &MEF_SmallOptions, &MEO_RENDERERSETUP_DETAILTEX, Option );
4496 hendricks2 768
static MenuOption_t MEO_RENDERERSETUP_MODELS = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_NoYes, &usemodels );
4778 hendricks2 769
static MenuEntry_t ME_RENDERERSETUP_MODELS = MAKE_MENUENTRY( "Models:", &MF_BluefontRed, &MEF_SmallOptions, &MEO_RENDERERSETUP_MODELS, Option );
4496 hendricks2 770
#endif
3084 terminx 771
 
4496 hendricks2 772
#ifdef USE_OPENGL
4778 hendricks2 773
static MenuEntry_t *MEL_RENDERERSETUP[] = {
4496 hendricks2 774
    &ME_RENDERERSETUP_HIGHTILE,
775
    &ME_RENDERERSETUP_TEXQUALITY,
776
    &ME_RENDERERSETUP_PRECACHE,
777
    &ME_RENDERERSETUP_TEXCACHE,
778
    &ME_RENDERERSETUP_DETAILTEX,
4778 hendricks2 779
    &ME_Space4,
4496 hendricks2 780
    &ME_RENDERERSETUP_MODELS,
781
};
782
#endif
3084 terminx 783
 
4609 terminx 784
#ifdef DROIDMENU
4778 hendricks2 785
static MenuRangeFloat_t MEO_COLCORR_GAMMA = MAKE_MENURANGE( &vid_gamma, &MF_Bluefont, 1.f, 2.5f, 0.f, 39, 1 );
4609 terminx 786
#else
4778 hendricks2 787
static MenuRangeFloat_t MEO_COLCORR_GAMMA = MAKE_MENURANGE( &vid_gamma, &MF_Bluefont, 0.2f, 4.f, 0.f, 39, 1 );
4609 terminx 788
#endif
4778 hendricks2 789
static MenuEntry_t ME_COLCORR_GAMMA = MAKE_MENUENTRY( "Gamma:", &MF_Redfont, &MEF_ColorCorrect, &MEO_COLCORR_GAMMA, RangeFloat );
790
static MenuRangeFloat_t MEO_COLCORR_CONTRAST = MAKE_MENURANGE( &vid_contrast, &MF_Bluefont, 0.1f, 2.7f, 0.f, 53, 1 );
791
static MenuEntry_t ME_COLCORR_CONTRAST = MAKE_MENUENTRY( "Contrast:", &MF_Redfont, &MEF_ColorCorrect, &MEO_COLCORR_CONTRAST, RangeFloat );
792
static MenuRangeFloat_t MEO_COLCORR_BRIGHTNESS = MAKE_MENURANGE( &vid_brightness, &MF_Bluefont, -0.8f, 0.8f, 0.f, 33, 1 );
793
static MenuEntry_t ME_COLCORR_BRIGHTNESS = MAKE_MENUENTRY( "Brightness:", &MF_Redfont, &MEF_ColorCorrect, &MEO_COLCORR_BRIGHTNESS, RangeFloat );
794
static MenuEntry_t ME_COLCORR_RESET = MAKE_MENUENTRY( "Reset To Defaults", &MF_Redfont, &MEF_ColorCorrect, &MEO_NULL, Link );
795
static MenuRangeFloat_t MEO_COLCORR_AMBIENT = MAKE_MENURANGE( &r_ambientlight, &MF_Bluefont, 0.125f, 4.f, 0.f, 32, 1 );
796
static MenuEntry_t ME_COLCORR_AMBIENT = MAKE_MENUENTRY( "Visibility:", &MF_Redfont, &MEF_ColorCorrect, &MEO_COLCORR_AMBIENT, RangeFloat );
3084 terminx 797
 
4496 hendricks2 798
static MenuEntry_t *MEL_COLCORR[] = {
799
    &ME_COLCORR_GAMMA,
4609 terminx 800
#ifndef DROIDMENU
4496 hendricks2 801
    &ME_COLCORR_CONTRAST,
802
    &ME_COLCORR_BRIGHTNESS,
4609 terminx 803
#endif
4850 hendricks2 804
    &ME_COLCORR_AMBIENT,
4778 hendricks2 805
    &ME_Space8,
4496 hendricks2 806
    &ME_COLCORR_RESET,
807
};
3084 terminx 808
 
4778 hendricks2 809
static MenuEntry_t *MEL_SCREENSETUP[] = {
4682 hendricks2 810
#ifndef DROIDMENU
4850 hendricks2 811
    &ME_SCREENSETUP_SCREENSIZE,
4682 hendricks2 812
#endif
4609 terminx 813
 
4850 hendricks2 814
    &ME_SCREENSETUP_NEWSTATUSBAR,
815
    &ME_SCREENSETUP_SBARSIZE,
4609 terminx 816
 
4850 hendricks2 817
    &ME_SCREENSETUP_CROSSHAIR,
818
    &ME_SCREENSETUP_CROSSHAIRSIZE,
4609 terminx 819
 
4850 hendricks2 820
    &ME_SCREENSETUP_LEVELSTATS,
821
    &ME_SCREENSETUP_TEXTSIZE,
4609 terminx 822
 
4850 hendricks2 823
    &ME_SCREENSETUP_SHOWPICKUPMESSAGES,
4609 terminx 824
};
825
 
4496 hendricks2 826
// Save and load will be filled in before every viewing of the save/load screen.
4688 hendricks2 827
static MenuLink_t MEO_LOAD = { MENU_NULL, MA_None, };
828
static MenuLink_t MEO_LOAD_VALID = { MENU_LOADVERIFY, MA_None, };
4778 hendricks2 829
static MenuEntry_t ME_LOAD_TEMPLATE = MAKE_MENUENTRY( NULL, &MF_MinifontRed, &MEF_LoadSave, &MEO_LOAD, Link );
4496 hendricks2 830
static MenuEntry_t ME_LOAD[MAXSAVEGAMES];
831
static MenuEntry_t *MEL_LOAD[MAXSAVEGAMES];
3084 terminx 832
 
4778 hendricks2 833
static MenuString_t MEO_SAVE_TEMPLATE = MAKE_MENUSTRING( NULL, &MF_MinifontRed, MAXSAVEGAMENAME, 0 );
4496 hendricks2 834
static MenuString_t MEO_SAVE[MAXSAVEGAMES];
4778 hendricks2 835
static MenuEntry_t ME_SAVE_TEMPLATE = MAKE_MENUENTRY( NULL, &MF_MinifontRed, &MEF_LoadSave, &MEO_SAVE_TEMPLATE, String );
4496 hendricks2 836
static MenuEntry_t ME_SAVE[MAXSAVEGAMES];
837
static MenuEntry_t *MEL_SAVE[MAXSAVEGAMES];
3084 terminx 838
 
4496 hendricks2 839
static int32_t soundrate, soundbits, soundvoices;
4778 hendricks2 840
static MenuOption_t MEO_SOUND = MAKE_MENUOPTION( &MF_Redfont, &MEOS_OffOn, &ud.config.SoundToggle );
841
static MenuEntry_t ME_SOUND = MAKE_MENUENTRY( "Sound:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SOUND, Option );
4609 terminx 842
 
4778 hendricks2 843
static MenuOption_t MEO_SOUND_MUSIC = MAKE_MENUOPTION( &MF_Redfont, &MEOS_OffOn, &ud.config.MusicToggle );
844
static MenuEntry_t ME_SOUND_MUSIC = MAKE_MENUENTRY( "Music:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SOUND_MUSIC, Option );
4609 terminx 845
 
4778 hendricks2 846
static MenuRangeInt32_t MEO_SOUND_VOLUME_MASTER = MAKE_MENURANGE( &ud.config.MasterVolume, &MF_Redfont, 0, 255, 0, 33, 2 );
847
static MenuEntry_t ME_SOUND_VOLUME_MASTER = MAKE_MENUENTRY( "Volume:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SOUND_VOLUME_MASTER, RangeInt32 );
4609 terminx 848
 
4778 hendricks2 849
static MenuRangeInt32_t MEO_SOUND_VOLUME_EFFECTS = MAKE_MENURANGE( &ud.config.FXVolume, &MF_Redfont, 0, 255, 0, 33, 2 );
850
static MenuEntry_t ME_SOUND_VOLUME_EFFECTS = MAKE_MENUENTRY( "Effects:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SOUND_VOLUME_EFFECTS, RangeInt32 );
4609 terminx 851
 
4778 hendricks2 852
static MenuRangeInt32_t MEO_SOUND_VOLUME_MUSIC = MAKE_MENURANGE( &ud.config.MusicVolume, &MF_Redfont, 0, 255, 0, 33, 2 );
853
static MenuEntry_t ME_SOUND_VOLUME_MUSIC = MAKE_MENUENTRY( "Music:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SOUND_VOLUME_MUSIC, RangeInt32 );
4609 terminx 854
 
4778 hendricks2 855
static MenuOption_t MEO_SOUND_DUKETALK = MAKE_MENUOPTION(&MF_Redfont, &MEOS_NoYes, NULL);
856
static MenuEntry_t ME_SOUND_DUKETALK = MAKE_MENUENTRY( "Duke talk:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SOUND_DUKETALK, Option );
4609 terminx 857
 
858
static char *MEOSN_SOUND_SAMPLINGRATE[] = { "22050Hz", "44100Hz", "48000Hz", };
859
static int32_t MEOSV_SOUND_SAMPLINGRATE[] = { 22050, 44100, 48000, };
4778 hendricks2 860
static MenuOptionSet_t MEOS_SOUND_SAMPLINGRATE = MAKE_MENUOPTIONSET( MEOSN_SOUND_SAMPLINGRATE, MEOSV_SOUND_SAMPLINGRATE, 0x3 );
861
static MenuOption_t MEO_SOUND_SAMPLINGRATE = MAKE_MENUOPTION( &MF_Redfont, &MEOS_SOUND_SAMPLINGRATE, &soundrate );
862
static MenuEntry_t ME_SOUND_SAMPLINGRATE = MAKE_MENUENTRY( "Sample rate:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SOUND_SAMPLINGRATE, Option );
4609 terminx 863
 
4496 hendricks2 864
static char *MEOSN_SOUND_SAMPLESIZE[] = { "8-bit", "16-bit", };
865
static int32_t MEOSV_SOUND_SAMPLESIZE[] = { 8, 16, };
4778 hendricks2 866
static MenuOptionSet_t MEOS_SOUND_SAMPLESIZE = MAKE_MENUOPTIONSET( MEOSN_SOUND_SAMPLESIZE, MEOSV_SOUND_SAMPLESIZE, 0x3 );
867
static MenuOption_t MEO_SOUND_SAMPLESIZE = MAKE_MENUOPTION( &MF_Redfont, &MEOS_SOUND_SAMPLESIZE, &soundbits );
868
static MenuEntry_t ME_SOUND_SAMPLESIZE = MAKE_MENUENTRY( "Sample size:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SOUND_SAMPLESIZE, Option );
3084 terminx 869
 
4778 hendricks2 870
static MenuRangeInt32_t MEO_SOUND_NUMVOICES = MAKE_MENURANGE( &soundvoices, &MF_Redfont, 16, 256, 0, 16, 1 );
871
static MenuEntry_t ME_SOUND_NUMVOICES = MAKE_MENUENTRY( "Voices:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SOUND_NUMVOICES, RangeInt32 );
4609 terminx 872
 
4778 hendricks2 873
static MenuEntry_t ME_SOUND_RESTART = MAKE_MENUENTRY( "Restart sound system", &MF_Redfont, &MEF_BigOptionsRt, &MEO_NULL, Link );
4609 terminx 874
 
4682 hendricks2 875
#ifndef DROIDMENU
4688 hendricks2 876
static MenuLink_t MEO_ADVSOUND = { MENU_ADVSOUND, MA_Advance, };
4778 hendricks2 877
static MenuEntry_t ME_SOUND_ADVSOUND = MAKE_MENUENTRY( "Advanced", &MF_Redfont, &MEF_BigOptionsRt, &MEO_ADVSOUND, Link );
4645 hendricks2 878
#endif
4609 terminx 879
 
4778 hendricks2 880
static MenuEntry_t *MEL_SOUND[] = {
4496 hendricks2 881
    &ME_SOUND,
882
    &ME_SOUND_MUSIC,
4778 hendricks2 883
    &ME_Space2,
4850 hendricks2 884
    &ME_SOUND_VOLUME_MASTER,
885
    &ME_SOUND_VOLUME_EFFECTS,
886
    &ME_SOUND_VOLUME_MUSIC,
4778 hendricks2 887
    &ME_Space2,
4496 hendricks2 888
    &ME_SOUND_DUKETALK,
4609 terminx 889
#ifndef DROIDMENU
4850 hendricks2 890
    &ME_SOUND_ADVSOUND,
4609 terminx 891
#endif
4496 hendricks2 892
};
3084 terminx 893
 
4778 hendricks2 894
static MenuEntry_t *MEL_ADVSOUND[] = {
4850 hendricks2 895
    &ME_SOUND_SAMPLINGRATE,
896
    &ME_SOUND_SAMPLESIZE,
4778 hendricks2 897
    &ME_Space2,
4850 hendricks2 898
    &ME_SOUND_NUMVOICES,
4778 hendricks2 899
    &ME_Space2,
4850 hendricks2 900
    &ME_SOUND_RESTART,
4609 terminx 901
};
902
 
4778 hendricks2 903
MAKE_MENU_TOP_ENTRYLINK( "Player Setup", MEF_CenterMenu, NETWORK_PLAYERSETUP, MENU_PLAYER );
904
MAKE_MENU_TOP_ENTRYLINK( "Join Game", MEF_CenterMenu, NETWORK_JOINGAME, MENU_NETJOIN );
905
MAKE_MENU_TOP_ENTRYLINK( "Host Game", MEF_CenterMenu, NETWORK_HOSTGAME, MENU_NETHOST );
4399 hendricks2 906
 
4496 hendricks2 907
static MenuEntry_t *MEL_NETWORK[] = {
908
    &ME_NETWORK_PLAYERSETUP,
909
    &ME_NETWORK_JOINGAME,
910
    &ME_NETWORK_HOSTGAME,
911
};
4399 hendricks2 912
 
4778 hendricks2 913
static MenuString_t MEO_PLAYER_NAME = MAKE_MENUSTRING( szPlayerName, &MF_Bluefont, MAXPLAYERNAME, 0 );
914
static MenuEntry_t ME_PLAYER_NAME = MAKE_MENUENTRY( "Name", &MF_BluefontRed, &MEF_PlayerNarrow, &MEO_PLAYER_NAME, String );
4496 hendricks2 915
static char *MEOSN_PLAYER_COLOR[] = { "Auto", "Blue", "Red", "Green", "Gray", "Dark gray", "Dark green", "Brown", "Dark blue", "Bright red", "Yellow", };
4822 hendricks2 916
static int32_t MEOSV_PLAYER_COLOR[] = { 0, 9, 10, 11, 12, 13, 14, 15, 16, 21, 23, };
4778 hendricks2 917
static MenuOptionSet_t MEOS_PLAYER_COLOR = MAKE_MENUOPTIONSET( MEOSN_PLAYER_COLOR, MEOSV_PLAYER_COLOR, 0x2 );
4496 hendricks2 918
static MenuOption_t MEO_PLAYER_COLOR = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_PLAYER_COLOR, &ud.color );
4778 hendricks2 919
static MenuEntry_t ME_PLAYER_COLOR = MAKE_MENUENTRY( "Color", &MF_BluefontRed, &MEF_PlayerNarrow, &MEO_PLAYER_COLOR, Option );
4496 hendricks2 920
static char *MEOSN_PLAYER_TEAM[] = { "Blue", "Red", "Green", "Gray", };
4778 hendricks2 921
static MenuOptionSet_t MEOS_PLAYER_TEAM = MAKE_MENUOPTIONSET( MEOSN_PLAYER_TEAM, NULL, 0x2 );
4496 hendricks2 922
static MenuOption_t MEO_PLAYER_TEAM = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_PLAYER_TEAM, &ud.team );
4778 hendricks2 923
static MenuEntry_t ME_PLAYER_TEAM = MAKE_MENUENTRY( "Team", &MF_BluefontRed, &MEF_PlayerNarrow, &MEO_PLAYER_TEAM, Option );
4682 hendricks2 924
#ifndef DROIDMENU
4688 hendricks2 925
static MenuLink_t MEO_PLAYER_MACROS = { MENU_MACROS, MA_Advance, };
4778 hendricks2 926
static MenuEntry_t ME_PLAYER_MACROS = MAKE_MENUENTRY( "Multiplayer macros", &MF_BluefontRed, &MEF_SmallOptions, &MEO_PLAYER_MACROS, Link );
4682 hendricks2 927
#endif
5 Plagman 928
 
4778 hendricks2 929
static MenuEntry_t *MEL_PLAYER[] = {
4496 hendricks2 930
    &ME_PLAYER_NAME,
4778 hendricks2 931
    &ME_Space4,
4496 hendricks2 932
    &ME_PLAYER_COLOR,
4778 hendricks2 933
    &ME_Space4,
4496 hendricks2 934
    &ME_PLAYER_TEAM,
4682 hendricks2 935
#ifndef DROIDMENU
4778 hendricks2 936
    &ME_Space8,
4496 hendricks2 937
    &ME_PLAYER_MACROS,
4778 hendricks2 938
#endif
4496 hendricks2 939
};
5 Plagman 940
 
4778 hendricks2 941
static MenuString_t MEO_MACROS_TEMPLATE = MAKE_MENUSTRING( NULL, &MF_Bluefont, MAXRIDECULELENGTH, 0 );
4496 hendricks2 942
static MenuString_t MEO_MACROS[MAXSAVEGAMES];
4778 hendricks2 943
static MenuEntry_t ME_MACROS_TEMPLATE = MAKE_MENUENTRY( NULL, &MF_Bluefont, &MEF_Macros, &MEO_MACROS_TEMPLATE, String );
4496 hendricks2 944
static MenuEntry_t ME_MACROS[MAXRIDECULE];
945
static MenuEntry_t *MEL_MACROS[MAXRIDECULE];
5 Plagman 946
 
4496 hendricks2 947
static char *MenuUserMap = "User Map";
948
static char *MenuSkillNone = "None";
5 Plagman 949
 
4496 hendricks2 950
static char *MEOSN_NetGametypes[MAXGAMETYPES];
951
static char *MEOSN_NetEpisodes[MAXVOLUMES+1];
952
static char *MEOSN_NetLevels[MAXVOLUMES][MAXLEVELS];
953
static char *MEOSN_NetSkills[MAXSKILLS+1];
5 Plagman 954
 
4823 hendricks2 955
static MenuLink_t MEO_NETHOST_OPTIONS = { MENU_NETOPTIONS, MA_Advance, };
4778 hendricks2 956
static MenuEntry_t ME_NETHOST_OPTIONS = MAKE_MENUENTRY( "Game Options", &MF_Redfont, &MEF_VideoSetup, &MEO_NETHOST_OPTIONS, Link );
957
static MenuEntry_t ME_NETHOST_LAUNCH = MAKE_MENUENTRY( "Launch Game", &MF_Redfont, &MEF_VideoSetup, &MEO_NULL, Link );
5 Plagman 958
 
4496 hendricks2 959
static MenuEntry_t *MEL_NETHOST[] = {
960
    &ME_NETHOST_OPTIONS,
961
    &ME_NETHOST_LAUNCH,
962
};
471 terminx 963
 
4778 hendricks2 964
static MenuOptionSet_t MEOS_NETOPTIONS_GAMETYPE = MAKE_MENUOPTIONSET( MEOSN_NetGametypes, NULL, 0x0 );
4496 hendricks2 965
static MenuOption_t MEO_NETOPTIONS_GAMETYPE = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_NETOPTIONS_GAMETYPE, &ud.m_coop );
4778 hendricks2 966
static MenuEntry_t ME_NETOPTIONS_GAMETYPE = MAKE_MENUENTRY( "Game Type", &MF_Redfont, &MEF_NetSetup, &MEO_NETOPTIONS_GAMETYPE, Option );
967
static MenuOptionSet_t MEOS_NETOPTIONS_EPISODE = MAKE_MENUOPTIONSET( MEOSN_NetEpisodes, NULL, 0x0 );
4496 hendricks2 968
static MenuOption_t MEO_NETOPTIONS_EPISODE = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_NETOPTIONS_EPISODE, NULL );
4778 hendricks2 969
static MenuEntry_t ME_NETOPTIONS_EPISODE = MAKE_MENUENTRY( "Episode", &MF_Redfont, &MEF_NetSetup, &MEO_NETOPTIONS_EPISODE, Option );
4496 hendricks2 970
static MenuOptionSet_t MEOS_NETOPTIONS_LEVEL[MAXVOLUMES];
971
static MenuOption_t MEO_NETOPTIONS_LEVEL = MAKE_MENUOPTION( &MF_Bluefont, NULL, &ud.m_level_number );
4778 hendricks2 972
static MenuEntry_t ME_NETOPTIONS_LEVEL = MAKE_MENUENTRY( "Level", &MF_Redfont, &MEF_NetSetup, &MEO_NETOPTIONS_LEVEL, Option );
4823 hendricks2 973
static MenuLink_t MEO_NETOPTIONS_USERMAP = { MENU_NETUSERMAP, MA_Advance, };
4778 hendricks2 974
static MenuEntry_t ME_NETOPTIONS_USERMAP = MAKE_MENUENTRY( "User Map", &MF_Redfont, &MEF_NetSetup, &MEO_NETOPTIONS_USERMAP, Link );
975
static MenuOptionSet_t MEOS_NETOPTIONS_MONSTERS = MAKE_MENUOPTIONSET( MEOSN_NetSkills, NULL, 0x0 );
4496 hendricks2 976
static MenuOption_t MEO_NETOPTIONS_MONSTERS = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_NETOPTIONS_MONSTERS, NULL );
4778 hendricks2 977
static MenuEntry_t ME_NETOPTIONS_MONSTERS = MAKE_MENUENTRY( "Monsters", &MF_Redfont, &MEF_NetSetup, &MEO_NETOPTIONS_MONSTERS, Option );
4496 hendricks2 978
static MenuOption_t MEO_NETOPTIONS_MARKERS = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_OffOn, &ud.m_marker );
4778 hendricks2 979
static MenuEntry_t ME_NETOPTIONS_MARKERS = MAKE_MENUENTRY( "Markers", &MF_Redfont, &MEF_NetSetup, &MEO_NETOPTIONS_MARKERS, Option );
980
static MenuEntry_t ME_NETOPTIONS_MARKERS_DISABLED = MAKE_MENUENTRY( "Markers", &MF_RedfontBlue, &MEF_NetSetup, NULL, Dummy );
4496 hendricks2 981
static MenuOption_t MEO_NETOPTIONS_MAPEXITS = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_OnOff, &ud.m_noexits );
4778 hendricks2 982
static MenuEntry_t ME_NETOPTIONS_MAPEXITS = MAKE_MENUENTRY( "Map Exits", &MF_Redfont, &MEF_NetSetup, &MEO_NETOPTIONS_MAPEXITS, Option );
4496 hendricks2 983
static MenuOption_t MEO_NETOPTIONS_FRFIRE = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_OffOn, &ud.m_ffire );
4778 hendricks2 984
static MenuEntry_t ME_NETOPTIONS_FRFIRE = MAKE_MENUENTRY( "Fr. Fire", &MF_Redfont, &MEF_NetSetup, &MEO_NETOPTIONS_FRFIRE, Option );
985
static MenuEntry_t ME_NETOPTIONS_ACCEPT = MAKE_MENUENTRY( "Accept", &MF_RedfontGreen, &MEF_NetSetup, &MEO_NULL, Link );
471 terminx 986
 
4496 hendricks2 987
static MenuEntry_t *MEL_NETOPTIONS[] = {
988
    &ME_NETOPTIONS_GAMETYPE,
989
    &ME_NETOPTIONS_EPISODE,
990
    &ME_NETOPTIONS_LEVEL,
991
    &ME_NETOPTIONS_MONSTERS,
992
    &ME_NETOPTIONS_MARKERS,
993
    &ME_NETOPTIONS_MAPEXITS,
994
    &ME_NETOPTIONS_ACCEPT,
995
};
5 Plagman 996
 
4496 hendricks2 997
static char MenuServer[BMAX_PATH] = "localhost";
4778 hendricks2 998
static MenuString_t MEO_NETJOIN_SERVER = MAKE_MENUSTRING( MenuServer, &MF_Bluefont, BMAX_PATH, 0 );
999
static MenuEntry_t ME_NETJOIN_SERVER = MAKE_MENUENTRY( "Server", &MF_Redfont, &MEF_VideoSetup, &MEO_NETJOIN_SERVER, String );
4496 hendricks2 1000
#define MAXPORTSTRINGLENGTH 6 // unsigned 16-bit integer
1001
static char MenuPort[MAXPORTSTRINGLENGTH] = "19014";
4778 hendricks2 1002
static MenuString_t MEO_NETJOIN_PORT = MAKE_MENUSTRING( MenuPort, &MF_Bluefont, MAXPORTSTRINGLENGTH, INPUT_NUMERIC );
1003
static MenuEntry_t ME_NETJOIN_PORT = MAKE_MENUENTRY( "Port", &MF_Redfont, &MEF_VideoSetup, &MEO_NETJOIN_PORT, String );
1004
static MenuEntry_t ME_NETJOIN_CONNECT = MAKE_MENUENTRY( "Connect", &MF_RedfontGreen, &MEF_VideoSetup, &MEO_NULL, Link );
471 terminx 1005
 
4496 hendricks2 1006
static MenuEntry_t *MEL_NETJOIN[] = {
1007
    &ME_NETJOIN_SERVER,
1008
    &ME_NETJOIN_PORT,
1009
    &ME_NETJOIN_CONNECT,
1010
};
5 Plagman 1011
 
1012
 
4496 hendricks2 1013
#define NoTitle NULL
91 terminx 1014
 
4778 hendricks2 1015
#define MAKE_MENUMENU(Title, Format, Entries) { Title, Format, Entries, ARRAY_SIZE(Entries), 0, 0, 0, 0 }
91 terminx 1016
 
4778 hendricks2 1017
static MenuMenu_t M_MAIN = MAKE_MENUMENU( NoTitle, &MMF_Top_Main, MEL_MAIN );
1018
static MenuMenu_t M_MAIN_INGAME = MAKE_MENUMENU( NoTitle, &MMF_Top_Main, MEL_MAIN_INGAME );
1019
static MenuMenu_t M_EPISODE = MAKE_MENUMENU( "Select An Episode", &MMF_Top_Episode, MEL_EPISODE );
1020
static MenuMenu_t M_SKILL = MAKE_MENUMENU( "Select Skill", &MMF_Top_Skill, MEL_SKILL );
1021
static MenuMenu_t M_GAMESETUP = MAKE_MENUMENU( "Game Setup", &MMF_BigOptions, MEL_GAMESETUP );
1022
static MenuMenu_t M_OPTIONS = MAKE_MENUMENU( "Options", &MMF_Top_Options, MEL_OPTIONS );
1023
static MenuMenu_t M_VIDEOSETUP = MAKE_MENUMENU( "Video Mode", &MMF_BigOptions, MEL_VIDEOSETUP );
1024
static MenuMenu_t M_KEYBOARDSETUP = MAKE_MENUMENU( "Keyboard Setup", &MMF_Top_Options, MEL_KEYBOARDSETUP );
1025
static MenuMenu_t M_CONTROLS = MAKE_MENUMENU( "Control Setup", &MMF_Top_Options, MEL_CONTROLS );
1026
static MenuMenu_t M_MOUSESETUP = MAKE_MENUMENU( "Mouse Setup", &MMF_BigOptions, MEL_MOUSESETUP );
1027
static MenuMenu_t M_JOYSTICKSETUP = MAKE_MENUMENU( "Joystick Setup", &MMF_Top_Joystick_Network, MEL_JOYSTICKSETUP );
1028
static MenuMenu_t M_JOYSTICKBTNS = MAKE_MENUMENU( "Joystick Buttons", &MMF_MouseJoySetupBtns, MEL_JOYSTICKBTNS );
1029
static MenuMenu_t M_JOYSTICKAXES = MAKE_MENUMENU( "Joystick Axes", &MMF_BigSliders, MEL_JOYSTICKAXES );
1030
static MenuMenu_t M_KEYBOARDKEYS = MAKE_MENUMENU( "Keyboard Keys", &MMF_KeyboardSetupFuncs, MEL_KEYBOARDSETUPFUNCS );
1031
static MenuMenu_t M_MOUSEBTNS = MAKE_MENUMENU( "Mouse Buttons", &MMF_MouseJoySetupBtns, MEL_MOUSESETUPBTNS );
1032
static MenuMenu_t M_MOUSEADVANCED = MAKE_MENUMENU( "Advanced Mouse", &MMF_BigSliders, MEL_MOUSEADVANCED );
1033
static MenuMenu_t M_JOYSTICKAXIS = MAKE_MENUMENU( NULL, &MMF_BigSliders, MEL_JOYSTICKAXIS );
4609 terminx 1034
#ifdef USE_OPENGL
4778 hendricks2 1035
static MenuMenu_t M_RENDERERSETUP = MAKE_MENUMENU( "Advanced Video", &MMF_SmallOptions, MEL_RENDERERSETUP );
4609 terminx 1036
#endif
4778 hendricks2 1037
static MenuMenu_t M_COLCORR = MAKE_MENUMENU( "Color Correction", &MMF_ColorCorrect, MEL_COLCORR );
1038
static MenuMenu_t M_SCREENSETUP = MAKE_MENUMENU( "On-Screen Displays", &MMF_BigOptions, MEL_SCREENSETUP );
1039
static MenuMenu_t M_DISPLAYSETUP = MAKE_MENUMENU( "Display Setup", &MMF_BigOptions, MEL_DISPLAYSETUP );
1040
static MenuMenu_t M_LOAD = MAKE_MENUMENU( "Load Game", &MMF_LoadSave, MEL_LOAD );
1041
static MenuMenu_t M_SAVE = MAKE_MENUMENU( "Save Game", &MMF_LoadSave, MEL_SAVE );
1042
static MenuMenu_t M_SOUND = MAKE_MENUMENU( "Sound Setup", &MMF_BigOptions, MEL_SOUND );
4823 hendricks2 1043
static MenuMenu_t M_ADVSOUND = MAKE_MENUMENU( "Advanced Sound", &MMF_BigOptions, MEL_ADVSOUND );
4778 hendricks2 1044
static MenuMenu_t M_NETWORK = MAKE_MENUMENU( "Network Game", &MMF_Top_Joystick_Network, MEL_NETWORK );
1045
static MenuMenu_t M_PLAYER = MAKE_MENUMENU( "Player Setup", &MMF_SmallOptions, MEL_PLAYER );
1046
static MenuMenu_t M_MACROS = MAKE_MENUMENU( "Multiplayer Macros", &MMF_Macros, MEL_MACROS );
1047
static MenuMenu_t M_NETHOST = MAKE_MENUMENU( "Host Network Game", &MMF_SmallOptionsNarrow, MEL_NETHOST );
1048
static MenuMenu_t M_NETOPTIONS = MAKE_MENUMENU( "Net Game Options", &MMF_NetSetup, MEL_NETOPTIONS );
1049
static MenuMenu_t M_NETJOIN = MAKE_MENUMENU( "Join Network Game", &MMF_SmallOptionsNarrow, MEL_NETJOIN );
88 terminx 1050
 
4609 terminx 1051
#ifdef DROIDMENU
4688 hendricks2 1052
static MenuPanel_t M_STORY = { NoTitle, MENU_STORY, MA_Return, MENU_STORY, MA_Advance, };
4609 terminx 1053
#else
4688 hendricks2 1054
static MenuPanel_t M_STORY = { NoTitle, MENU_F1HELP, MA_Return, MENU_F1HELP, MA_Advance, };
4609 terminx 1055
#endif
1056
 
4688 hendricks2 1057
static MenuPanel_t M_F1HELP = { NoTitle, MENU_STORY, MA_Return, MENU_STORY, MA_Advance, };
4496 hendricks2 1058
static const char* MenuCredits = "Credits";
4688 hendricks2 1059
static MenuPanel_t M_CREDITS = { NoTitle, MENU_CREDITS5, MA_Return, MENU_CREDITS2, MA_Advance, };
1060
static MenuPanel_t M_CREDITS2 = { NoTitle, MENU_CREDITS, MA_Return, MENU_CREDITS3, MA_Advance, };
1061
static MenuPanel_t M_CREDITS3 = { NoTitle, MENU_CREDITS2, MA_Return, MENU_CREDITS4, MA_Advance, };
4609 terminx 1062
#ifdef DROIDMENU
4688 hendricks2 1063
static MenuPanel_t M_CREDITS4 = { "Meltdown Collection", MENU_CREDITS3, MA_Return, MENU_CREDITS5, MA_Advance, };
4609 terminx 1064
#else
4688 hendricks2 1065
static MenuPanel_t M_CREDITS4 = { "About EDuke32", MENU_CREDITS3, MA_Return, MENU_CREDITS5, MA_Advance, };
4609 terminx 1066
#endif
4688 hendricks2 1067
static MenuPanel_t M_CREDITS5 = { "About EDuke32", MENU_CREDITS4, MA_Return, MENU_CREDITS, MA_Advance, };
5 Plagman 1068
 
4686 hendricks2 1069
#define CURSOR_CENTER_2LINE { MENU_MARGIN_CENTER<<16, 120<<16, }
1070
#define CURSOR_CENTER_3LINE { MENU_MARGIN_CENTER<<16, 129<<16, }
4496 hendricks2 1071
#define CURSOR_BOTTOMRIGHT { 304<<16, 186<<16, }
5 Plagman 1072
 
4688 hendricks2 1073
static MenuVerify_t M_QUIT = { CURSOR_CENTER_2LINE, MENU_CLOSE, MA_None, };
1074
static MenuVerify_t M_QUITTOTITLE = { CURSOR_CENTER_2LINE, MENU_CLOSE, MA_None, };
1075
static MenuVerify_t M_LOADVERIFY = { CURSOR_CENTER_3LINE, MENU_CLOSE, MA_None, };
1076
static MenuVerify_t M_NEWVERIFY = { CURSOR_CENTER_2LINE, MENU_EPISODE, MA_Advance, };
1077
static MenuVerify_t M_SAVEVERIFY = { CURSOR_CENTER_2LINE, MENU_SAVE, MA_None, };
1078
static MenuVerify_t M_RESETPLAYER = { CURSOR_CENTER_3LINE, MENU_CLOSE, MA_None, };
5 Plagman 1079
 
4688 hendricks2 1080
static MenuMessage_t M_NETWAITMASTER = { CURSOR_BOTTOMRIGHT, MENU_NULL, MA_None, };
1081
static MenuMessage_t M_NETWAITVOTES = { CURSOR_BOTTOMRIGHT, MENU_NULL, MA_None, };
1082
static MenuMessage_t M_BUYDUKE = { CURSOR_BOTTOMRIGHT, MENU_EPISODE, MA_Return, };
5 Plagman 1083
 
4778 hendricks2 1084
static MenuPassword_t M_ADULTPASSWORD = { NULL, MAXPWLOCKOUT };
5 Plagman 1085
 
4851 hendricks2 1086
#define MAKE_MENUFILESELECT(a, b, c) { a, { &MMF_FileSelectLeft, &MMF_FileSelectRight }, { &MF_Minifont, &MF_MinifontRed }, b, c, { NULL, NULL }, { 0, 0 }, { 3<<16, 3<<16 }, FNLIST_INITIALIZER, 0 }
337 terminx 1087
 
4851 hendricks2 1088
static MenuFileSelect_t M_USERMAP = MAKE_MENUFILESELECT( "Select A User Map", "*.map", boardfilename );
337 terminx 1089
 
4496 hendricks2 1090
// MUST be in ascending order of MenuID enum values due to binary search
1091
static Menu_t Menus[] = {
4778 hendricks2 1092
    { &M_MAIN, MENU_MAIN, MENU_CLOSE, MA_None, Menu },
1093
    { &M_MAIN_INGAME, MENU_MAIN_INGAME, MENU_CLOSE, MA_None, Menu },
1094
    { &M_EPISODE, MENU_EPISODE, MENU_MAIN, MA_Return, Menu },
1095
    { &M_USERMAP, MENU_USERMAP, MENU_EPISODE, MA_Return, FileSelect },
1096
    { &M_SKILL, MENU_SKILL, MENU_EPISODE, MA_Return, Menu },
1097
    { &M_GAMESETUP, MENU_GAMESETUP, MENU_OPTIONS, MA_Return, Menu },
1098
    { &M_OPTIONS, MENU_OPTIONS, MENU_MAIN, MA_Return, Menu },
1099
    { &M_VIDEOSETUP, MENU_VIDEOSETUP, MENU_DISPLAYSETUP, MA_Return, Menu },
1100
    { &M_KEYBOARDSETUP, MENU_KEYBOARDSETUP, MENU_CONTROLS, MA_Return, Menu },
1101
    { &M_MOUSESETUP, MENU_MOUSESETUP, MENU_CONTROLS, MA_Return, Menu },
1102
    { &M_JOYSTICKSETUP, MENU_JOYSTICKSETUP, MENU_CONTROLS, MA_Return, Menu },
1103
    { &M_JOYSTICKBTNS, MENU_JOYSTICKBTNS, MENU_JOYSTICKSETUP, MA_Return, Menu },
1104
    { &M_JOYSTICKAXES, MENU_JOYSTICKAXES, MENU_JOYSTICKSETUP, MA_Return, Menu },
1105
    { &M_KEYBOARDKEYS, MENU_KEYBOARDKEYS, MENU_KEYBOARDSETUP, MA_Return, Menu },
1106
    { &M_MOUSEBTNS, MENU_MOUSEBTNS, MENU_MOUSESETUP, MA_Return, Menu },
1107
    { &M_MOUSEADVANCED, MENU_MOUSEADVANCED, MENU_MOUSESETUP, MA_Return, Menu },
1108
    { &M_JOYSTICKAXIS, MENU_JOYSTICKAXIS, MENU_JOYSTICKAXES, MA_Return, Menu },
1109
    { &M_CONTROLS, MENU_CONTROLS, MENU_OPTIONS, MA_Return, Menu },
4609 terminx 1110
#ifdef USE_OPENGL
4778 hendricks2 1111
    { &M_RENDERERSETUP, MENU_RENDERERSETUP, MENU_DISPLAYSETUP, MA_Return, Menu },
4609 terminx 1112
#endif
4778 hendricks2 1113
    { &M_COLCORR, MENU_COLCORR, MENU_DISPLAYSETUP, MA_Return, Menu },
1114
    { &M_COLCORR, MENU_COLCORR_INGAME, MENU_CLOSE, MA_Return, Menu },
1115
    { &M_SCREENSETUP, MENU_SCREENSETUP, MENU_DISPLAYSETUP, MA_Return, Menu },
1116
    { &M_DISPLAYSETUP, MENU_DISPLAYSETUP, MENU_OPTIONS, MA_Return, Menu },
1117
    { &M_LOAD, MENU_LOAD, MENU_MAIN, MA_Return, Menu },
1118
    { &M_SAVE, MENU_SAVE, MENU_MAIN, MA_Return, Menu },
1119
    { &M_STORY, MENU_STORY, MENU_MAIN, MA_Return, Panel },
1120
    { &M_F1HELP, MENU_F1HELP, MENU_MAIN, MA_Return, Panel },
1121
    { &M_QUIT, MENU_QUIT, MENU_PREVIOUS, MA_Return, Verify },
1122
    { &M_QUITTOTITLE, MENU_QUITTOTITLE, MENU_PREVIOUS, MA_Return, Verify },
1123
    { &M_QUIT, MENU_QUIT_INGAME, MENU_CLOSE, MA_None, Verify },
1124
    { &M_NETHOST, MENU_NETSETUP, MENU_MAIN, MA_Return, Menu },
1125
    { &M_NETWAITMASTER, MENU_NETWAITMASTER, MENU_MAIN, MA_Return, Message },
1126
    { &M_NETWAITVOTES, MENU_NETWAITVOTES, MENU_MAIN, MA_Return, Message },
1127
    { &M_SOUND, MENU_SOUND, MENU_OPTIONS, MA_Return, Menu },
1128
    { &M_SOUND, MENU_SOUND_INGAME, MENU_CLOSE, MA_Return, Menu },
1129
    { &M_ADVSOUND, MENU_ADVSOUND, MENU_SOUND, MA_Return, Menu },
1130
    { &M_CREDITS, MENU_CREDITS, MENU_MAIN, MA_Return, Panel },
1131
    { &M_CREDITS2, MENU_CREDITS2, MENU_MAIN, MA_Return, Panel },
1132
    { &M_CREDITS3, MENU_CREDITS3, MENU_MAIN, MA_Return, Panel },
1133
    { &M_CREDITS4, MENU_CREDITS4, MENU_MAIN, MA_Return, Panel },
1134
    { &M_CREDITS5, MENU_CREDITS5, MENU_MAIN, MA_Return, Panel },
1135
    { &M_LOADVERIFY, MENU_LOADVERIFY, MENU_LOAD, MA_None, Verify },
1136
    { &M_NEWVERIFY, MENU_NEWVERIFY, MENU_MAIN, MA_Return, Verify },
1137
    { &M_SAVEVERIFY, MENU_SAVEVERIFY, MENU_SAVE, MA_None, Verify },
1138
    { &M_ADULTPASSWORD, MENU_ADULTPASSWORD, MENU_GAMESETUP, MA_None, Password },
1139
    { &M_RESETPLAYER, MENU_RESETPLAYER, MENU_CLOSE, MA_None, Verify },
1140
    { &M_BUYDUKE, MENU_BUYDUKE, MENU_EPISODE, MA_Return, Message },
1141
    { &M_NETWORK, MENU_NETWORK, MENU_MAIN, MA_Return, Menu },
1142
    { &M_PLAYER, MENU_PLAYER, MENU_OPTIONS, MA_Return, Menu },
1143
    { &M_MACROS, MENU_MACROS, MENU_PLAYER, MA_Return, Menu },
1144
    { &M_NETHOST, MENU_NETHOST, MENU_NETWORK, MA_Return, Menu },
1145
    { &M_NETOPTIONS, MENU_NETOPTIONS, MENU_NETWORK, MA_Return, Menu },
1146
    { &M_USERMAP, MENU_NETUSERMAP, MENU_NETOPTIONS, MA_Return, FileSelect },
1147
    { &M_NETJOIN, MENU_NETJOIN, MENU_NETWORK, MA_Return, Menu },
4496 hendricks2 1148
};
337 terminx 1149
 
4496 hendricks2 1150
static const size_t numMenus = ARRAY_SIZE(Menus);
337 terminx 1151
 
4496 hendricks2 1152
Menu_t *m_currentMenu = &Menus[0];
1153
static Menu_t *m_previousMenu = &Menus[0];
5 Plagman 1154
 
4496 hendricks2 1155
MenuID_t g_currentMenu;
1156
static MenuID_t g_previousMenu;
337 terminx 1157
 
5 Plagman 1158
 
4778 hendricks2 1159
#define MenuMenu_ChangeEntryList(m, el)\
4496 hendricks2 1160
    do {\
4778 hendricks2 1161
        m.entrylist = el;\
1162
        m.numEntries = ARRAY_SIZE(el);\
4496 hendricks2 1163
    } while (0)
5 Plagman 1164
 
4855 hendricks2 1165
static void MenuEntry_DisableOnCondition(MenuEntry_t * const entry, const int32_t condition)
1166
{
1167
    if (condition)
1168
        entry->flags |= Disabled;
1169
    else
1170
        entry->flags &= ~Disabled;
1171
}
5 Plagman 1172
 
4496 hendricks2 1173
/*
1174
This function prepares data after ART and CON have been processed.
1175
It also initializes some data in loops rather than statically at compile time.
1176
*/
1177
void M_Init(void)
1178
{
1179
    int32_t i, j, k;
5 Plagman 1180
 
4496 hendricks2 1181
    // prepare menu fonts
4778 hendricks2 1182
    MF_Redfont.tilenum = MF_RedfontBlue.tilenum = MF_RedfontGreen.tilenum = BIGALPHANUM;
4496 hendricks2 1183
    MF_Bluefont.tilenum = MF_BluefontRed.tilenum = STARTALPHANUM;
1184
    MF_Minifont.tilenum = MF_MinifontRed.tilenum = MF_MinifontDarkGray.tilenum = MINIFONT;
1185
    if (!minitext_lowercase)
1186
    {
1187
        MF_Minifont.textflags |= TEXT_UPPERCASE;
1188
        MF_MinifontRed.textflags |= TEXT_UPPERCASE;
1189
        MF_MinifontDarkGray.textflags |= TEXT_UPPERCASE;
1190
    }
5 Plagman 1191
 
4496 hendricks2 1192
    // prepare gamefuncs and keys
1193
    for (i = 0; i < NUMGAMEFUNCTIONS; ++i)
1194
    {
1195
        Bstrcpy(MenuGameFuncs[i], gamefunctions[i]);
5 Plagman 1196
 
4496 hendricks2 1197
        for (j = 0; j < MAXGAMEFUNCLEN; ++j)
1198
            if (MenuGameFuncs[i][j] == '_')
1199
                MenuGameFuncs[i][j] = ' ';
5 Plagman 1200
 
4496 hendricks2 1201
        MEOSN_Gamefuncs[i] = MenuGameFuncs[i];
1202
    }
1203
    MEOSN_Gamefuncs[NUMGAMEFUNCTIONS] = MenuGameFuncNone;
1204
    for (i = 0; i < NUMKEYS; ++i)
1205
        MEOSN_Keys[i] = key_names[i];
1206
    MEOSN_Keys[NUMKEYS-1] = MenuKeyNone;
5 Plagman 1207
 
1208
 
4496 hendricks2 1209
    // prepare episodes
1210
    k = -1;
4778 hendricks2 1211
    for (i = 0; i < g_numVolumes; ++i)
4496 hendricks2 1212
    {
1213
        if (EpisodeNames[i][0])
337 terminx 1214
        {
4496 hendricks2 1215
            MEL_EPISODE[i] = &ME_EPISODE[i];
1216
            ME_EPISODE[i] = ME_EPISODE_TEMPLATE;
1217
            ME_EPISODE[i].name = EpisodeNames[i];
1218
 
1219
            MEOSN_NetEpisodes[i] = EpisodeNames[i];
1220
 
1221
            k = i;
337 terminx 1222
        }
5 Plagman 1223
 
4496 hendricks2 1224
        // prepare levels
1225
        for (j = 0; j < MAXLEVELS; ++j)
337 terminx 1226
        {
4496 hendricks2 1227
            MEOSN_NetLevels[i][j] = MapInfo[MAXLEVELS*i+j].name;
1228
            if (MapInfo[i*MAXLEVELS+j].filename != NULL)
1229
                MEOS_NETOPTIONS_LEVEL[i].numOptions = j+1;
337 terminx 1230
        }
4496 hendricks2 1231
        MEOS_NETOPTIONS_LEVEL[i].optionNames = MEOSN_NetLevels[i];
1232
    }
1233
    ++k;
4778 hendricks2 1234
    M_EPISODE.numEntries = g_numVolumes+2; // k;
1235
    MEL_EPISODE[g_numVolumes] = &ME_Space4;
1236
    MEL_EPISODE[g_numVolumes+1] = &ME_EPISODE_USERMAP;
4496 hendricks2 1237
    MEOS_NETOPTIONS_EPISODE.numOptions = g_numVolumes + 1; // k+1;
1238
    MEOSN_NetEpisodes[g_numVolumes] = MenuUserMap;
4778 hendricks2 1239
    MMF_Top_Episode.pos.y = (48-(g_numVolumes*2))<<16;
4977 hendricks2 1240
    if (g_numSkills == 0)
1241
        MEO_EPISODE.linkID = MENU_NULL;
5 Plagman 1242
 
4496 hendricks2 1243
    // prepare skills
1244
    k = -1;
1245
    for (i = 0; i < g_numSkills && SkillNames[i][0]; ++i)
1246
    {
1247
        MEL_SKILL[i] = &ME_SKILL[i];
1248
        ME_SKILL[i] = ME_SKILL_TEMPLATE;
1249
        ME_SKILL[i].name = SkillNames[i];
5 Plagman 1250
 
4496 hendricks2 1251
        MEOSN_NetSkills[i] = SkillNames[i];
5 Plagman 1252
 
4496 hendricks2 1253
        k = i;
1254
    }
1255
    ++k;
4778 hendricks2 1256
    M_SKILL.numEntries = g_numSkills; // k;
4496 hendricks2 1257
    MEOS_NETOPTIONS_MONSTERS.numOptions = g_numSkills + 1; // k+1;
1258
    MEOSN_NetSkills[g_numSkills] = MenuSkillNone;
4778 hendricks2 1259
    MMF_Top_Skill.pos.y = (58 + (4-g_numSkills)*6)<<16;
1260
    M_SKILL.currentEntry = 1;
5 Plagman 1261
 
4496 hendricks2 1262
    // prepare multiplayer gametypes
1263
    k = -1;
1264
    for (i = 0; i < MAXGAMETYPES; ++i)
1265
        if (GametypeNames[i][0])
1266
        {
1267
            MEOSN_NetGametypes[i] = GametypeNames[i];
1268
            k = i;
1269
        }
1270
    ++k;
1271
    MEOS_NETOPTIONS_GAMETYPE.numOptions = k;
5 Plagman 1272
 
4496 hendricks2 1273
    // prepare savegames
1274
    for (i = 0; i < MAXSAVEGAMES; ++i)
1275
    {
1276
        MEL_LOAD[i] = &ME_LOAD[i];
1277
        MEL_SAVE[i] = &ME_SAVE[i];
1278
        ME_LOAD[i] = ME_LOAD_TEMPLATE;
1279
        ME_SAVE[i] = ME_SAVE_TEMPLATE;
1280
        ME_SAVE[i].entry = &MEO_SAVE[i];
1281
        MEO_SAVE[i] = MEO_SAVE_TEMPLATE;
5 Plagman 1282
 
4496 hendricks2 1283
        ME_LOAD[i].name = ud.savegame[i];
1284
        MEO_SAVE[i].variable = ud.savegame[i];
1285
    }
5 Plagman 1286
 
4496 hendricks2 1287
    // prepare text chat macros
1288
    for (i = 0; i < MAXRIDECULE; ++i)
1289
    {
1290
        MEL_MACROS[i] = &ME_MACROS[i];
1291
        ME_MACROS[i] = ME_MACROS_TEMPLATE;
1292
        ME_MACROS[i].entry = &MEO_MACROS[i];
1293
        MEO_MACROS[i] = MEO_MACROS_TEMPLATE;
5 Plagman 1294
 
4496 hendricks2 1295
        MEO_MACROS[i].variable = ud.ridecule[i];
1296
    }
1297
 
1298
    // prepare input
1299
    for (i = 0; i < NUMGAMEFUNCTIONS; ++i)
1300
    {
1301
        MEL_KEYBOARDSETUPFUNCS[i] = &ME_KEYBOARDSETUPFUNCS[i];
1302
        ME_KEYBOARDSETUPFUNCS[i] = ME_KEYBOARDSETUPFUNCS_TEMPLATE;
1303
        ME_KEYBOARDSETUPFUNCS[i].name = MenuGameFuncs[i];
1304
        ME_KEYBOARDSETUPFUNCS[i].entry = &MEO_KEYBOARDSETUPFUNCS[i];
1305
        MEO_KEYBOARDSETUPFUNCS[i] = MEO_KEYBOARDSETUPFUNCS_TEMPLATE;
1306
        MEO_KEYBOARDSETUPFUNCS[i].column[0] = &ud.config.KeyboardKeys[i][0];
1307
        MEO_KEYBOARDSETUPFUNCS[i].column[1] = &ud.config.KeyboardKeys[i][1];
1308
    }
1309
    for (i = 0; i < MENUMOUSEFUNCTIONS; ++i)
1310
    {
1311
        MEL_MOUSESETUPBTNS[i] = &ME_MOUSESETUPBTNS[i];
1312
        ME_MOUSESETUPBTNS[i] = ME_MOUSEJOYSETUPBTNS_TEMPLATE;
1313
        ME_MOUSESETUPBTNS[i].name = MenuMouseNames[i];
1314
        ME_MOUSESETUPBTNS[i].entry = &MEO_MOUSESETUPBTNS[i];
1315
        MEO_MOUSESETUPBTNS[i] = MEO_MOUSEJOYSETUPBTNS_TEMPLATE;
1316
        MEO_MOUSESETUPBTNS[i].data = &ud.config.MouseFunctions[MenuMouseDataIndex[i][0]][MenuMouseDataIndex[i][1]];
1317
    }
4828 hendricks2 1318
    for (i = 0; i < 2*joynumbuttons + 8*joynumhats; ++i)
4496 hendricks2 1319
    {
1320
        if (i < 2*joynumbuttons)
337 terminx 1321
        {
4496 hendricks2 1322
            if (i & 1)
1323
                Bsnprintf(MenuJoystickNames[i], MAXJOYBUTTONSTRINGLENGTH, "Double %s", getjoyname(1, i>>1));
1324
            else
1325
                Bstrncpy(MenuJoystickNames[i], getjoyname(1, i>>1), MAXJOYBUTTONSTRINGLENGTH);
337 terminx 1326
        }
1327
        else
1328
        {
4496 hendricks2 1329
            Bsnprintf(MenuJoystickNames[i], MAXJOYBUTTONSTRINGLENGTH, (i & 1) ? "Double Hat %d %s" : "Hat %d %s", ((i - 2*joynumbuttons)>>3), MenuJoystickHatDirections[((i - 2*joynumbuttons)>>1) % 4]);
337 terminx 1330
        }
5 Plagman 1331
 
4496 hendricks2 1332
        MEL_JOYSTICKBTNS[i] = &ME_JOYSTICKBTNS[i];
1333
        ME_JOYSTICKBTNS[i] = ME_MOUSEJOYSETUPBTNS_TEMPLATE;
1334
        ME_JOYSTICKBTNS[i].name = MenuJoystickNames[i];
1335
        ME_JOYSTICKBTNS[i].entry = &MEO_JOYSTICKBTNS[i];
1336
        MEO_JOYSTICKBTNS[i] = MEO_MOUSEJOYSETUPBTNS_TEMPLATE;
1337
        MEO_JOYSTICKBTNS[i].data = &ud.config.JoystickFunctions[i>>1][i&1];
4399 hendricks2 1338
    }
4828 hendricks2 1339
    M_JOYSTICKBTNS.numEntries = 2*joynumbuttons + 8*joynumhats;
4496 hendricks2 1340
    for (i = 0; i < joynumaxes; ++i)
1341
    {
1342
        ME_JOYSTICKAXES[i] = ME_JOYSTICKAXES_TEMPLATE;
1343
        Bstrncpy(MenuJoystickAxes[i], getjoyname(0, i), MAXJOYBUTTONSTRINGLENGTH);
1344
        ME_JOYSTICKAXES[i].name = MenuJoystickAxes[i];
1345
        MEL_JOYSTICKAXES[i] = &ME_JOYSTICKAXES[i];
1346
    }
4778 hendricks2 1347
    M_JOYSTICKAXES.numEntries = joynumaxes;
5 Plagman 1348
 
4496 hendricks2 1349
    // prepare video setup
1350
    for (i = 0; i < validmodecnt; ++i)
1351
    {
1352
        int32_t *const r = &MEOS_VIDEOSETUP_RESOLUTION.numOptions;
5 Plagman 1353
 
4496 hendricks2 1354
        for (j = 0; j < *r; ++j)
337 terminx 1355
        {
4496 hendricks2 1356
            if (validmode[i].xdim == resolution[j].xdim && validmode[i].ydim == resolution[j].ydim)
335 terminx 1357
            {
4496 hendricks2 1358
                resolution[j].flags |= validmode[i].fs ? RES_FS : RES_WIN;
1359
                if (validmode[i].bpp > resolution[j].bppmax)
1360
                    resolution[j].bppmax = validmode[i].bpp;
1361
                break;
335 terminx 1362
            }
337 terminx 1363
        }
4496 hendricks2 1364
 
1365
        if (j == *r) // no match found
337 terminx 1366
        {
4496 hendricks2 1367
            resolution[j].xdim = validmode[i].xdim;
1368
            resolution[j].ydim = validmode[i].ydim;
1369
            resolution[j].bppmax = validmode[i].bpp;
1370
            resolution[j].flags = validmode[i].fs ? RES_FS : RES_WIN;
1371
            Bsnprintf(resolution[j].name, MAXRESOLUTIONSTRINGLENGTH, "%d x %d", resolution[j].xdim, resolution[j].ydim);
1372
            MEOSN_VIDEOSETUP_RESOLUTION[j] = resolution[j].name;
1373
            ++*r;
1374
        }
1375
    }
337 terminx 1376
 
4496 hendricks2 1377
    // prepare shareware
1378
    if (VOLUMEONE)
1379
    {
1380
        // blue out episodes beyond the first
4778 hendricks2 1381
        for (i = 1; i < g_numVolumes; ++i)
337 terminx 1382
        {
4496 hendricks2 1383
            if (MEL_EPISODE[i])
335 terminx 1384
            {
4496 hendricks2 1385
                ME_EPISODE[i].font = &MF_RedfontBlue;
1386
                ME_EPISODE[i].entry = &MEO_EPISODE_SHAREWARE;
5 Plagman 1387
            }
337 terminx 1388
        }
4778 hendricks2 1389
        M_EPISODE.numEntries = g_numVolumes; // remove User Map (and spacer)
4496 hendricks2 1390
        MEOS_NETOPTIONS_EPISODE.numOptions = 1;
4855 hendricks2 1391
        MenuEntry_DisableOnCondition(&ME_NETOPTIONS_EPISODE, 1);
4496 hendricks2 1392
    }
5 Plagman 1393
 
4496 hendricks2 1394
    // prepare pre-Atomic
1395
    if (!VOLUMEALL || !PLUTOPAK)
1396
    {
1397
        // prepare credits
1398
        M_CREDITS.title = M_CREDITS2.title = M_CREDITS3.title = MenuCredits;
1399
    }
1400
}
5 Plagman 1401
 
4686 hendricks2 1402
static void M_RunMenu(Menu_t *cm, vec2_t origin);
5 Plagman 1403
 
1404
 
1405
 
4496 hendricks2 1406
/*
1407
At present, no true difference is planned between M_PreMenu() and M_PreMenuDraw().
1408
They are separate for purposes of organization.
1409
*/
5 Plagman 1410
 
4496 hendricks2 1411
static void M_PreMenu(MenuID_t cm)
1412
{
1413
    int32_t i;
1414
    DukePlayer_t *ps = g_player[myconnectindex].ps;
5 Plagman 1415
 
4496 hendricks2 1416
    switch (cm)
1417
    {
1418
    case MENU_MAIN_INGAME:
4855 hendricks2 1419
        MenuEntry_DisableOnCondition(&ME_MAIN_SAVEGAME, ud.recstat == 2);
1420
        MenuEntry_DisableOnCondition(&ME_MAIN_QUITTOTITLE, g_netServer || numplayers > 1);
4496 hendricks2 1421
    case MENU_MAIN:
1422
        if ((g_netServer || ud.multimode > 1) && ud.recstat != 2)
1423
        {
1424
            ME_MAIN_NEWGAME.entry = &MEO_MAIN_NEWGAME_NETWORK;
1425
            ME_MAIN_NEWGAME_INGAME.entry = &MEO_MAIN_NEWGAME_NETWORK;
1426
        }
1427
        else
1428
        {
1429
            ME_MAIN_NEWGAME.entry = &MEO_MAIN_NEWGAME;
1430
            ME_MAIN_NEWGAME_INGAME.entry = &MEO_MAIN_NEWGAME_INGAME;
1431
        }
1432
        break;
4399 hendricks2 1433
 
4496 hendricks2 1434
    case MENU_GAMESETUP:
1435
        MEO_GAMESETUP_DEMOREC.options = (ps->gm&MODE_GAME) ? &MEOS_DemoRec : &MEOS_OffOn;
4855 hendricks2 1436
        MenuEntry_DisableOnCondition(&ME_GAMESETUP_DEMOREC, (ps->gm&MODE_GAME) && ud.m_recstat != 1);
4496 hendricks2 1437
        break;
5 Plagman 1438
 
4496 hendricks2 1439
#ifdef USE_OPENGL
4850 hendricks2 1440
    case MENU_DISPLAYSETUP:
4496 hendricks2 1441
        if (getrendermode() == REND_CLASSIC)
4778 hendricks2 1442
            MenuMenu_ChangeEntryList(M_DISPLAYSETUP, MEL_DISPLAYSETUP);
4496 hendricks2 1443
#ifdef POLYMER
1444
        else if (getrendermode() == REND_POLYMER)
4778 hendricks2 1445
            MenuMenu_ChangeEntryList(M_DISPLAYSETUP, MEL_DISPLAYSETUP_GL_POLYMER);
4496 hendricks2 1446
#endif
1447
        else
4778 hendricks2 1448
            MenuMenu_ChangeEntryList(M_DISPLAYSETUP, MEL_DISPLAYSETUP_GL);
5 Plagman 1449
 
4976 hendricks2 1450
        vpsize = ud.screen_size + 4*(ud.screen_size>=8 && ud.statusbarmode==0);
1451
 
4496 hendricks2 1452
        if (getrendermode() != REND_CLASSIC)
4869 hendricks2 1453
        {
4609 terminx 1454
            for (i = (int32_t) ARRAY_SIZE(MEOSV_DISPLAYSETUP_ANISOTROPY) - 1; i >= 0; --i)
5 Plagman 1455
            {
4609 terminx 1456
                if (MEOSV_DISPLAYSETUP_ANISOTROPY[i] <= glinfo.maxanisotropy)
4496 hendricks2 1457
                {
4609 terminx 1458
                    MEOS_DISPLAYSETUP_ANISOTROPY.numOptions = i + 1;
4496 hendricks2 1459
                    break;
1460
                }
337 terminx 1461
            }
4869 hendricks2 1462
        }
4850 hendricks2 1463
        break;
5 Plagman 1464
 
4850 hendricks2 1465
    case MENU_RENDERERSETUP:
4855 hendricks2 1466
        MenuEntry_DisableOnCondition(&ME_RENDERERSETUP_TEXQUALITY, !usehightile);
1467
        MenuEntry_DisableOnCondition(&ME_RENDERERSETUP_PRECACHE, !usehightile);
1468
        MenuEntry_DisableOnCondition(&ME_RENDERERSETUP_TEXCACHE, !(glusetexcompr && usehightile));
1469
        MenuEntry_DisableOnCondition(&ME_RENDERERSETUP_DETAILTEX, !usehightile);
4496 hendricks2 1470
        break;
1471
#endif
5 Plagman 1472
 
4496 hendricks2 1473
    case MENU_VIDEOSETUP:
4836 helixhorne 1474
    {
1475
        const int32_t nr = newresolution;
1476
 
4855 hendricks2 1477
        MenuEntry_DisableOnCondition(&ME_VIDEOSETUP_APPLY,
1478
             (xdim == resolution[nr].xdim && ydim == resolution[nr].ydim &&
4836 helixhorne 1479
              getrendermode() == newrendermode && fullscreen == newfullscreen)
1480
             || (newfullscreen ? !(resolution[nr].flags & RES_FS) : !(resolution[nr].flags & RES_WIN))
1481
             || (newrendermode != REND_CLASSIC && resolution[nr].bppmax <= 8));
4496 hendricks2 1482
        break;
4836 helixhorne 1483
    }
5 Plagman 1484
 
4496 hendricks2 1485
    case MENU_SOUND:
4676 terminx 1486
    case MENU_SOUND_INGAME:
4850 hendricks2 1487
    case MENU_ADVSOUND:
4855 hendricks2 1488
        MenuEntry_DisableOnCondition(&ME_SOUND, ud.config.FXDevice < 0);
1489
        MenuEntry_DisableOnCondition(&ME_SOUND_MUSIC, ud.config.MusicDevice < 0);
1490
        MenuEntry_DisableOnCondition(&ME_SOUND_VOLUME_MASTER, (!ud.config.SoundToggle || ud.config.FXDevice < 0) && (!ud.config.MusicToggle || ud.config.MusicDevice < 0));
1491
        MenuEntry_DisableOnCondition(&ME_SOUND_VOLUME_EFFECTS, !ud.config.SoundToggle || ud.config.FXDevice < 0);
1492
        MenuEntry_DisableOnCondition(&ME_SOUND_VOLUME_MUSIC, !ud.config.MusicToggle || ud.config.MusicDevice < 0);
1493
        MenuEntry_DisableOnCondition(&ME_SOUND_DUKETALK, !ud.config.SoundToggle || ud.config.FXDevice < 0);
1494
        MenuEntry_DisableOnCondition(&ME_SOUND_SAMPLINGRATE, (!ud.config.SoundToggle || ud.config.FXDevice < 0) && (!ud.config.MusicToggle || ud.config.MusicDevice < 0));
1495
        MenuEntry_DisableOnCondition(&ME_SOUND_SAMPLESIZE, (!ud.config.SoundToggle || ud.config.FXDevice < 0) && (!ud.config.MusicToggle || ud.config.MusicDevice < 0));
1496
        MenuEntry_DisableOnCondition(&ME_SOUND_NUMVOICES, !ud.config.SoundToggle || ud.config.FXDevice < 0);
1497
        MenuEntry_DisableOnCondition(&ME_SOUND_RESTART, soundrate == ud.config.MixRate && soundvoices == ud.config.NumVoices && soundbits == ud.config.NumBits);
4496 hendricks2 1498
        break;
1499
 
1500
    case MENU_MOUSESETUP:
4855 hendricks2 1501
        MenuEntry_DisableOnCondition(&ME_MOUSESETUP_MOUSEAIMING, ud.mouseaiming);
4496 hendricks2 1502
        break;
1503
 
1504
    case MENU_NETOPTIONS:
1505
        if (MEO_NETOPTIONS_EPISODE.currentOption == MEOS_NETOPTIONS_EPISODE.numOptions-1)
1506
            MEL_NETOPTIONS[2] = &ME_NETOPTIONS_USERMAP;
1507
        else
337 terminx 1508
        {
4496 hendricks2 1509
            MEL_NETOPTIONS[2] = &ME_NETOPTIONS_LEVEL;
1510
            MEO_NETOPTIONS_LEVEL.options = &MEOS_NETOPTIONS_LEVEL[MEO_NETOPTIONS_EPISODE.currentOption];
1511
        }
1512
        MEL_NETOPTIONS[4] = (GametypeFlags[ud.m_coop] & GAMETYPE_MARKEROPTION) ? &ME_NETOPTIONS_MARKERS : &ME_NETOPTIONS_MARKERS_DISABLED;
1513
        MEL_NETOPTIONS[5] = (GametypeFlags[ud.m_coop] & (GAMETYPE_PLAYERSFRIENDLY|GAMETYPE_TDM)) ? &ME_NETOPTIONS_FRFIRE : &ME_NETOPTIONS_MAPEXITS;
1514
        break;
2728 hendricks2 1515
 
4496 hendricks2 1516
    case MENU_OPTIONS:
4855 hendricks2 1517
        MenuEntry_DisableOnCondition(&ME_OPTIONS_PLAYERSETUP, ud.recstat == 1);
1518
        MenuEntry_DisableOnCondition(&ME_OPTIONS_JOYSTICKSETUP, CONTROL_JoyPresent == 0);
4496 hendricks2 1519
        break;
337 terminx 1520
 
4496 hendricks2 1521
    case MENU_LOAD:
1522
        for (i = 0; i < MAXSAVEGAMES; ++i)
1523
        {
4609 terminx 1524
            ME_LOAD[i].entry = (ud.savegame[i][0] /*&& !g_oldverSavegame[i]*/) ? &MEO_LOAD_VALID : &MEO_LOAD;
4496 hendricks2 1525
            ME_LOAD[i].font = g_oldverSavegame[i] ? &MF_MinifontDarkGray : &MF_MinifontRed;
337 terminx 1526
        }
4496 hendricks2 1527
        break;
5 Plagman 1528
 
4496 hendricks2 1529
    case MENU_SAVE:
1530
        for (i = 0; i < MAXSAVEGAMES; ++i)
1531
            MEO_SAVE[i].font = (g_oldverSavegame[i] && MEO_SAVE[i].editfield == NULL) ? &MF_MinifontDarkGray : &MF_MinifontRed;
337 terminx 1532
        break;
1533
 
4496 hendricks2 1534
    default:
1535
        break;
1536
    }
1537
}
337 terminx 1538
 
4549 hendricks2 1539
 
4686 hendricks2 1540
static void M_PreMenuDrawBackground(MenuID_t cm, const vec2_t origin)
4549 hendricks2 1541
{
1542
    switch (cm)
1543
    {
1544
    case MENU_CREDITS:
1545
    case MENU_CREDITS2:
1546
    case MENU_CREDITS3:
1547
        if (!VOLUMEALL || !PLUTOPAK)
4686 hendricks2 1548
            M_DrawBackground(origin);
4549 hendricks2 1549
        else
4688 hendricks2 1550
            rotatesprite_fs(origin.x + (MENU_MARGIN_CENTER<<16), origin.y + (100<<16), 65536L,0,2504+cm-MENU_CREDITS,0,0,10+64);
4549 hendricks2 1551
        break;
1552
 
1553
    case MENU_LOAD:
1554
    case MENU_SAVE:
1555
    case MENU_CREDITS4:
1556
    case MENU_CREDITS5:
4686 hendricks2 1557
        M_DrawBackground(origin);
4549 hendricks2 1558
        break;
1559
 
1560
    case MENU_STORY:
4686 hendricks2 1561
        rotatesprite_fs(origin.x + (MENU_MARGIN_CENTER<<16), origin.y + (100<<16), 65536L,0,TEXTSTORY,0,0,10+64);
4549 hendricks2 1562
        break;
1563
 
1564
    case MENU_F1HELP:
4686 hendricks2 1565
        rotatesprite_fs(origin.x + (MENU_MARGIN_CENTER<<16), origin.y + (100<<16), 65536L,0,F1HELP,0,0,10+64);
4549 hendricks2 1566
        break;
1567
    }
1568
}
1569
 
1570
 
4778 hendricks2 1571
static void M_PreMenuDraw(MenuID_t cm, MenuEntry_t *entry, const vec2_t origin)
4496 hendricks2 1572
{
1573
    int32_t i, j, l = 0, m;
5 Plagman 1574
 
4496 hendricks2 1575
    switch (cm)
1576
    {
1577
    case MENU_MAIN_INGAME:
1578
        l += 4;
1579
    case MENU_MAIN:
4686 hendricks2 1580
        rotatesprite_fs(origin.x + (MENU_MARGIN_CENTER<<16), origin.y + ((28+l)<<16), 65536L,0,INGAMEDUKETHREEDEE,0,0,10);
4496 hendricks2 1581
        if (PLUTOPAK)   // JBF 20030804
4686 hendricks2 1582
            rotatesprite_fs(origin.x + ((MENU_MARGIN_CENTER+100)<<16), origin.y + (36<<16), 65536L,0,PLUTOPAKSPRITE+2,(sintable[(totalclock<<4)&2047]>>11),0,2+8);
4496 hendricks2 1583
        break;
5 Plagman 1584
 
4496 hendricks2 1585
    case MENU_PLAYER:
4686 hendricks2 1586
        rotatesprite_fs(origin.x + (260<<16), origin.y + ((24+(tilesiz[APLAYER].y>>1))<<16), 49152L,0,1441-((((4-(totalclock>>4)))&3)*5),0,entry == &ME_PLAYER_TEAM ? G_GetTeamPalette(ud.team) : ud.color,10);
4496 hendricks2 1587
        break;
1588
 
1589
    case MENU_MACROS:
4686 hendricks2 1590
        mgametextcenter(origin.x, origin.y + (144<<16), "Activate in-game with Shift-F#");
4496 hendricks2 1591
        break;
1592
 
1593
    case MENU_COLCORR:
1594
    case MENU_COLCORR_INGAME:
4686 hendricks2 1595
        // center panel
1596
        rotatesprite_fs(origin.x + (120<<16), origin.y + (32<<16), 16384, 0, 3290, 0, 0, 2|8|16);
1597
        rotatesprite_fs(origin.x + (160<<16) - (tilesiz[BOTTOMSTATUSBAR].x<<13), origin.y + (82<<16) - (tilesiz[BOTTOMSTATUSBAR].y<<14), 16384, 0, BOTTOMSTATUSBAR, 0, 0, 2|8|16);
1598
 
1599
        // left panel
1600
        rotatesprite_fs(origin.x + (40<<16), origin.y + (32<<16), 16384, 0, BONUSSCREEN, 0, 0, 2|8|16);
1601
 
1602
        // right panel
1603
        rotatesprite_fs(origin.x + (200<<16), origin.y + (32<<16), 16384, 0, LOADSCREEN, 0, 0, 2|8|16);
4496 hendricks2 1604
        break;
1605
 
1606
    case MENU_NETSETUP:
1607
    case MENU_NETHOST:
4686 hendricks2 1608
        mminitext(origin.x + (90<<16), origin.y + (90<<16), "Game Type", 2);
1609
        mminitext(origin.x + (90<<16), origin.y + ((90+8)<<16), "Episode", 2);
1610
        mminitext(origin.x + (90<<16), origin.y + ((90+8+8)<<16), "Level", 2);
1611
        mminitext(origin.x + (90<<16), origin.y + ((90+8+8+8)<<16), "Monsters", 2);
4496 hendricks2 1612
        if (ud.m_coop == 0)
4686 hendricks2 1613
            mminitext(origin.x + (90<<16), origin.y + ((90+8+8+8+8)<<16), "Markers", 2);
4496 hendricks2 1614
        else if (ud.m_coop == 1)
4686 hendricks2 1615
            mminitext(origin.x + (90<<16), origin.y + ((90+8+8+8+8)<<16), "Friendly Fire", 2);
1616
        mminitext(origin.x + (90<<16), origin.y + ((90+8+8+8+8+8)<<16), "User Map", 2);
4496 hendricks2 1617
 
4686 hendricks2 1618
        mminitext(origin.x + ((90+60)<<16), origin.y + (90<<16), GametypeNames[ud.m_coop], 0);
4496 hendricks2 1619
 
4686 hendricks2 1620
        mminitext(origin.x + ((90+60)<<16), origin.y + ((90+8)<<16), EpisodeNames[ud.m_volume_number], 0);
1621
        mminitext(origin.x + ((90+60)<<16), origin.y + ((90+8+8)<<16), MapInfo[MAXLEVELS*ud.m_volume_number+ud.m_level_number].name, 0);
4496 hendricks2 1622
        if (ud.m_monsters_off == 0 || ud.m_player_skill > 0)
4686 hendricks2 1623
            mminitext(origin.x + ((90+60)<<16), origin.y + ((90+8+8+8)<<16), SkillNames[ud.m_player_skill], 0);
1624
        else mminitext(origin.x + ((90+60)<<16), origin.y + ((90+8+8+8)<<16), "None", 0);
4496 hendricks2 1625
        if (ud.m_coop == 0)
337 terminx 1626
        {
4686 hendricks2 1627
            if (ud.m_marker) mminitext(origin.x + ((90+60)<<16), origin.y + ((90+8+8+8+8)<<16), "On", 0);
1628
            else mminitext(origin.x + ((90+60)<<16), origin.y + ((90+8+8+8+8)<<16), "Off", 0);
337 terminx 1629
        }
4496 hendricks2 1630
        else if (ud.m_coop == 1)
337 terminx 1631
        {
4686 hendricks2 1632
            if (ud.m_ffire) mminitext(origin.x + ((90+60)<<16), origin.y + ((90+8+8+8+8)<<16), "On", 0);
1633
            else mminitext(origin.x + ((90+60)<<16), origin.y + ((90+8+8+8+8)<<16), "Off", 0);
4496 hendricks2 1634
        }
1635
        break;
4467 hendricks2 1636
 
4496 hendricks2 1637
    case MENU_KEYBOARDKEYS:
4914 hendricks2 1638
        mgametextcenter(origin.x, origin.y + (156<<16), "Up/Down = Select Action\n"
1639
                                                        "Left/Right = Select List\n"
1640
                                                        "Enter = Modify   Delete = Clear");
4496 hendricks2 1641
        break;
335 terminx 1642
 
4496 hendricks2 1643
    case MENU_MOUSESETUP:
1644
        if (entry == &ME_MOUSESETUP_MOUSEAIMING)
1645
        {
4855 hendricks2 1646
            if (entry->flags & Disabled)
337 terminx 1647
            {
4914 hendricks2 1648
                mgametextcenter(origin.x, origin.y + (167<<16), "Set mouse aim type to toggle on/off\n"
1649
                                                                "in the Player Setup menu to enable");
337 terminx 1650
            }
1651
        }
4496 hendricks2 1652
        break;
5 Plagman 1653
 
4496 hendricks2 1654
    case MENU_MOUSEBTNS:
4914 hendricks2 1655
        mgametextcenter(origin.x, origin.y + (169<<16), "Up/Down = Select Button\n"
1656
                                                        "Enter = Modify");
337 terminx 1657
        break;
5 Plagman 1658
 
4496 hendricks2 1659
    case MENU_MOUSEADVANCED:
4778 hendricks2 1660
    {
1661
        size_t i;
1662
        for (i = 0; i < ARRAY_SIZE(MEL_INTERNAL_MOUSEADVANCED_DAXES); i++)
1663
            if (entry == MEL_INTERNAL_MOUSEADVANCED_DAXES[i])
1664
            {
4914 hendricks2 1665
                mgametextcenter(origin.x, origin.y + (162<<16), "Digital axes are not for mouse look\n"
1666
                                                                "or for aiming up and down");
4778 hendricks2 1667
            }
1668
    }
4496 hendricks2 1669
        break;
5 Plagman 1670
 
4496 hendricks2 1671
    case MENU_JOYSTICKBTNS:
4914 hendricks2 1672
        mgametextcenter(origin.x, origin.y + (149<<16), "Up/Down = Select Button\n"
1673
                                                        "Enter = Modify");
4496 hendricks2 1674
        break;
5 Plagman 1675
 
4496 hendricks2 1676
    case MENU_RESETPLAYER:
4850 hendricks2 1677
        fade_screen_black(1);
4686 hendricks2 1678
        mgametextcenter(origin.x, origin.y + (90<<16), "Load last game:");
5 Plagman 1679
 
4496 hendricks2 1680
        Bsprintf(tempbuf,"\"%s\"",ud.savegame[g_lastSaveSlot]);
4686 hendricks2 1681
        mgametextcenter(origin.x, origin.y + (99<<16), tempbuf);
5 Plagman 1682
 
4609 terminx 1683
#ifndef DROIDMENU
4686 hendricks2 1684
        mgametextcenter(origin.x, origin.y + ((99+9)<<16), "(Y/N)");
4609 terminx 1685
#endif
4496 hendricks2 1686
        break;
5 Plagman 1687
 
4496 hendricks2 1688
    case MENU_LOAD:
1689
        for (i = 0; i <= 108; i += 12)
4686 hendricks2 1690
            rotatesprite_fs(origin.x + ((160+64+91-64)<<16), origin.y + ((i+56)<<16), 65536L,0,TEXTBOX,24,0,10);
337 terminx 1691
 
4686 hendricks2 1692
        rotatesprite_fs(origin.x + (22<<16), origin.y + (97<<16), 65536L,0,WINDOWBORDER2,24,0,10);
1693
        rotatesprite_fs(origin.x + (180<<16), origin.y + (97<<16), 65536L,1024,WINDOWBORDER2,24,0,10);
1694
        rotatesprite_fs(origin.x + (99<<16), origin.y + (50<<16), 65536L,512,WINDOWBORDER1,24,0,10);
1695
        rotatesprite_fs(origin.x + (103<<16), origin.y + (144<<16), 65536L,1024+512,WINDOWBORDER1,24,0,10);
2728 hendricks2 1696
 
4778 hendricks2 1697
        if (ud.savegame[M_LOAD.currentEntry][0])
337 terminx 1698
        {
4686 hendricks2 1699
            rotatesprite_fs(origin.x + (101<<16), origin.y + (97<<16), 65536>>1,512,TILE_LOADSHOT,-32,0,4+10+64);
2728 hendricks2 1700
 
4778 hendricks2 1701
            if (g_oldverSavegame[M_LOAD.currentEntry])
4496 hendricks2 1702
            {
4686 hendricks2 1703
                mmenutext(origin.x + (53<<16), origin.y + (70<<16), "Previous");
1704
                mmenutext(origin.x + (58<<16), origin.y + (90<<16), "Version");
337 terminx 1705
 
4609 terminx 1706
#ifndef DROIDMENU
4496 hendricks2 1707
                Bsprintf(tempbuf,"Saved: %d.%d.%d %d-bit", savehead.majorver, savehead.minorver,
1708
                         savehead.bytever, 8*savehead.ptrsize);
4686 hendricks2 1709
                mgametext(origin.x + (31<<16), origin.y + (104<<16), tempbuf);
4496 hendricks2 1710
                Bsprintf(tempbuf,"Our: %d.%d.%d %d-bit", SV_MAJOR_VER, SV_MINOR_VER, BYTEVERSION,
1711
                         (int32_t)(8*sizeof(intptr_t)));
4686 hendricks2 1712
                mgametext(origin.x + ((31+16)<<16), origin.y + (114<<16), tempbuf);
4609 terminx 1713
#endif
337 terminx 1714
            }
5 Plagman 1715
 
4850 hendricks2 1716
            if (savehead.numplayers > 1)
1717
            {
1718
                Bsprintf(tempbuf, "Players: %-2d                      ", savehead.numplayers);
1719
                mgametextcenter(origin.x, origin.y + (156<<16), tempbuf);
1720
            }
4609 terminx 1721
 
4712 helixhorne 1722
            {
1723
                const char *name = MapInfo[(savehead.volnum*MAXLEVELS) + savehead.levnum].name;
1724
                Bsprintf(tempbuf, "%s / %s", name ? name : "^10unnamed^0", SkillNames[savehead.skill-1]);
1725
            }
1726
 
4686 hendricks2 1727
            mgametextcenter(origin.x, origin.y + (168<<16), tempbuf);
4496 hendricks2 1728
            if (savehead.volnum == 0 && savehead.levnum == 7)
4686 hendricks2 1729
                mgametextcenter(origin.x, origin.y + (180<<16), savehead.boardfn);
337 terminx 1730
        }
4496 hendricks2 1731
        else
4686 hendricks2 1732
            mmenutext(origin.x + (69<<16), origin.y + (70<<16), "Empty");
4496 hendricks2 1733
        break;
410 terminx 1734
 
4496 hendricks2 1735
    case MENU_SAVE:
1736
        for (i = 0; i <= 108; i += 12)
4686 hendricks2 1737
            rotatesprite_fs(origin.x + ((160+64+91-64)<<16), origin.y + ((i+56)<<16), 65536L,0,TEXTBOX,24,0,10);
337 terminx 1738
 
4686 hendricks2 1739
        rotatesprite_fs(origin.x + (22<<16), origin.y + (97<<16), 65536L,0,WINDOWBORDER2,24,0,10);
1740
        rotatesprite_fs(origin.x + (180<<16), origin.y + (97<<16), 65536L,1024,WINDOWBORDER2,24,0,10);
1741
        rotatesprite_fs(origin.x + (99<<16), origin.y + (50<<16), 65536L,512,WINDOWBORDER1,24,0,10);
1742
        rotatesprite_fs(origin.x + (103<<16), origin.y + (144<<16), 65536L,1024+512,WINDOWBORDER1,24,0,10);
337 terminx 1743
 
4780 hendricks2 1744
        j = 0;
1745
        for (i = 0; i < 10; ++i)
1746
            if (((MenuString_t*)M_SAVE.entrylist[i]->entry)->editfield)
1747
                j |= 1;
2728 hendricks2 1748
 
4780 hendricks2 1749
        if (j)
1750
            rotatesprite_fs(origin.x + (101<<16), origin.y + (97<<16), 65536L>>1,512,TILE_SAVESHOT,-32,0,4+10+64);
1751
        else if (ud.savegame[M_SAVE.currentEntry][0])
1752
            rotatesprite_fs(origin.x + (101<<16), origin.y + (97<<16), 65536L>>1,512,TILE_LOADSHOT,-32,0,4+10+64);
1753
        else
1754
            mmenutext(origin.x + (69<<16), origin.y + (70<<16), "Empty");
4496 hendricks2 1755
 
4780 hendricks2 1756
        if (ud.savegame[M_SAVE.currentEntry][0] && g_oldverSavegame[M_SAVE.currentEntry])
1757
        {
1758
            mmenutext(origin.x + (53<<16), origin.y + (70<<16), "Previous");
1759
            mmenutext(origin.x + (58<<16), origin.y + (90<<16), "Version");
4496 hendricks2 1760
 
4609 terminx 1761
#ifndef DROIDMENU
4780 hendricks2 1762
            Bsprintf(tempbuf,"Saved: %d.%d.%d %d-bit", savehead.majorver, savehead.minorver,
1763
                     savehead.bytever, 8*savehead.ptrsize);
1764
            mgametext(origin.x + (31<<16), origin.y + (104<<16), tempbuf);
1765
            Bsprintf(tempbuf,"Our: %d.%d.%d %d-bit", SV_MAJOR_VER, SV_MINOR_VER, BYTEVERSION,
1766
                     (int32_t)(8*sizeof(intptr_t)));
1767
            mgametext(origin.x + ((31+16)<<16), origin.y + (114<<16), tempbuf);
4609 terminx 1768
#endif
337 terminx 1769
        }
5 Plagman 1770
 
4850 hendricks2 1771
        if (ud.multimode > 1)
1772
        {
1773
            Bsprintf(tempbuf, "Players: %-2d                      ", ud.multimode);
1774
            mgametextcenter(origin.x, origin.y + (156<<16), tempbuf);
1775
        }
4609 terminx 1776
 
1777
        Bsprintf(tempbuf,"%s / %s",MapInfo[(ud.volume_number*MAXLEVELS) + ud.level_number].name, SkillNames[ud.player_skill-1]);
4686 hendricks2 1778
        mgametextcenter(origin.x, origin.y + (168<<16), tempbuf);
337 terminx 1779
        if (ud.volume_number == 0 && ud.level_number == 7)
4686 hendricks2 1780
            mgametextcenter(origin.x, origin.y + (180<<16), currentboardfilename);
4496 hendricks2 1781
        break;
5 Plagman 1782
 
4609 terminx 1783
#ifdef DROIDMENU
1784
    case MENU_SKILL:
1785
    {
4778 hendricks2 1786
        static const char *s[] = { "EASY - Few enemies, and lots of stuff.", "MEDIUM - Normal difficulty.", "HARD - For experienced players.", "EXPERTS - Lots of enemies, plus they respawn!" };
1787
        if ((size_t)M_SKILL.currentEntry < ARRAY_SIZE(s))
1788
            mgametextcenter(origin.x, origin.y + (168<<16), s[M_SKILL.currentEntry]);
4609 terminx 1789
    }
1790
        break;
1791
#endif
1792
 
4496 hendricks2 1793
    case MENU_LOADVERIFY:
4850 hendricks2 1794
        fade_screen_black(1);
1795
        if (g_oldverSavegame[M_LOAD.currentEntry])
1796
        {
1797
            mgametextcenter(origin.x, origin.y + (90<<16), "Start new game:");
1798
            Bsprintf(tempbuf,"%s / %s",MapInfo[(ud.volume_number*MAXLEVELS) + ud.level_number].name, SkillNames[ud.player_skill-1]);
1799
            mgametextcenter(origin.x, origin.y + (99<<16), tempbuf);
1800
        }
1801
        else
1802
        {
1803
            mgametextcenter(origin.x, origin.y + (90<<16), "Load game:");
1804
            Bsprintf(tempbuf, "\"%s\"", ud.savegame[M_LOAD.currentEntry]);
1805
            mgametextcenter(origin.x, origin.y + (99<<16), tempbuf);
1806
        }
4609 terminx 1807
#ifndef DROIDMENU
4686 hendricks2 1808
        mgametextcenter(origin.x, origin.y + ((99+9)<<16), "(Y/N)");
4609 terminx 1809
#endif
4496 hendricks2 1810
        break;
5 Plagman 1811
 
4496 hendricks2 1812
    case MENU_SAVEVERIFY:
4850 hendricks2 1813
        fade_screen_black(1);
4686 hendricks2 1814
        mgametextcenter(origin.x, origin.y + (90<<16), "Overwrite previous saved game?");
4609 terminx 1815
#ifndef DROIDMENU
4686 hendricks2 1816
        mgametextcenter(origin.x, origin.y + ((90+9)<<16), "(Y/N)");
4609 terminx 1817
#endif
4496 hendricks2 1818
        break;
5 Plagman 1819
 
4496 hendricks2 1820
    case MENU_NEWVERIFY:
4850 hendricks2 1821
        fade_screen_black(1);
4686 hendricks2 1822
        mgametextcenter(origin.x, origin.y + (90<<16), "Abort this game?");
4609 terminx 1823
#ifndef DROIDMENU
4686 hendricks2 1824
        mgametextcenter(origin.x, origin.y + ((90+9)<<16), "(Y/N)");
4609 terminx 1825
#endif
4496 hendricks2 1826
        break;
2728 hendricks2 1827
 
4496 hendricks2 1828
    case MENU_QUIT:
1829
    case MENU_QUIT_INGAME:
4850 hendricks2 1830
        fade_screen_black(1);
4686 hendricks2 1831
        mgametextcenter(origin.x, origin.y + (90<<16), "Are you sure you want to quit?");
4609 terminx 1832
#ifndef DROIDMENU
4686 hendricks2 1833
        mgametextcenter(origin.x, origin.y + (99<<16), "(Y/N)");
4609 terminx 1834
#endif
4496 hendricks2 1835
        break;
2728 hendricks2 1836
 
4496 hendricks2 1837
    case MENU_QUITTOTITLE:
4850 hendricks2 1838
        fade_screen_black(1);
4686 hendricks2 1839
        mgametextcenter(origin.x, origin.y + (90<<16), "Quit to Title?");
4609 terminx 1840
#ifndef DROIDMENU
4686 hendricks2 1841
        mgametextcenter(origin.x, origin.y + (99<<16), "(Y/N)");
4609 terminx 1842
#endif
4496 hendricks2 1843
        break;
5 Plagman 1844
 
4496 hendricks2 1845
    case MENU_NETWAITMASTER:
1846
        G_DrawFrags();
4914 hendricks2 1847
        mgametextcenter(origin.x, origin.y + (50<<16), "Waiting for master\n"
1848
                                                       "to select level");
4496 hendricks2 1849
        break;
5 Plagman 1850
 
4496 hendricks2 1851
    case MENU_NETWAITVOTES:
1852
        G_DrawFrags();
4686 hendricks2 1853
        mgametextcenter(origin.x, origin.y + (90<<16), "Waiting for votes");
4496 hendricks2 1854
        break;
5 Plagman 1855
 
4496 hendricks2 1856
    case MENU_BUYDUKE:
4914 hendricks2 1857
        mgametextcenter(origin.x, origin.y + (33<<16), "You are playing the shareware\n"
1858
                                                       "version of Duke Nukem 3D.  While\n"
1859
                                                       "this version is really cool, you\n"
1860
                                                       "are missing over 75% of the total\n"
1861
                                                       "game, along with other great extras\n"
1862
                                                       "which you'll get when you order\n"
1863
                                                       "the complete version and get\n"
1864
                                                       "the final three episodes.");
4496 hendricks2 1865
 
4609 terminx 1866
#ifndef DROIDMENU
4914 hendricks2 1867
        mgametextcenter(origin.x, origin.y + (112<<16), "Please visit Steam and purchase\n"
1868
                                                        "Duke Nukem 3D: Megaton Edition\n"
4921 terminx 1869
                                                        "to upgrade to the full registered\n"
1870
                                                        "version of Duke Nukem 3D.");
4609 terminx 1871
#else
4942 hendricks2 1872
# if defined EDUKE32_IOS
4914 hendricks2 1873
        mgametextcenter(origin.x, origin.y + (121<<16), "Please visit the App Store\n"
4921 terminx 1874
                                                        "to upgrade to the full registered\n"
1875
                                                        "version of Duke Nukem 3D.");
4852 hendricks2 1876
# else
4914 hendricks2 1877
        mgametextcenter(origin.x, origin.y + (121<<16), "Please visit the Play Store\n"
4921 terminx 1878
                                                        "to upgrade to the full registered\n"
1879
                                                        "version of Duke Nukem 3D.");
4852 hendricks2 1880
# endif
4609 terminx 1881
#endif
4686 hendricks2 1882
        mgametextcenter(origin.x, origin.y + ((148+16)<<16), "Press any key or button...");
4496 hendricks2 1883
        break;
1884
 
3084 terminx 1885
    case MENU_CREDITS:
1886
    case MENU_CREDITS2:
1887
    case MENU_CREDITS3:
337 terminx 1888
        if (!VOLUMEALL || !PLUTOPAK)
1889
        {