Subversion Repositories eduke32

Rev

Rev 4951 | 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
4609 terminx 394
static char *MEOSN_VIDEOSETUP_RENDERER[] = { "Classic", "Polymost.f", "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;
5 Plagman 1240
 
4496 hendricks2 1241
    // prepare skills
1242
    k = -1;
1243
    for (i = 0; i < g_numSkills && SkillNames[i][0]; ++i)
1244
    {
1245
        MEL_SKILL[i] = &ME_SKILL[i];
1246
        ME_SKILL[i] = ME_SKILL_TEMPLATE;
1247
        ME_SKILL[i].name = SkillNames[i];
5 Plagman 1248
 
4496 hendricks2 1249
        MEOSN_NetSkills[i] = SkillNames[i];
5 Plagman 1250
 
4496 hendricks2 1251
        k = i;
1252
    }
1253
    ++k;
4778 hendricks2 1254
    M_SKILL.numEntries = g_numSkills; // k;
4496 hendricks2 1255
    MEOS_NETOPTIONS_MONSTERS.numOptions = g_numSkills + 1; // k+1;
1256
    MEOSN_NetSkills[g_numSkills] = MenuSkillNone;
4778 hendricks2 1257
    MMF_Top_Skill.pos.y = (58 + (4-g_numSkills)*6)<<16;
1258
    M_SKILL.currentEntry = 1;
5 Plagman 1259
 
4496 hendricks2 1260
    // prepare multiplayer gametypes
1261
    k = -1;
1262
    for (i = 0; i < MAXGAMETYPES; ++i)
1263
        if (GametypeNames[i][0])
1264
        {
1265
            MEOSN_NetGametypes[i] = GametypeNames[i];
1266
            k = i;
1267
        }
1268
    ++k;
1269
    MEOS_NETOPTIONS_GAMETYPE.numOptions = k;
5 Plagman 1270
 
4496 hendricks2 1271
    // prepare savegames
1272
    for (i = 0; i < MAXSAVEGAMES; ++i)
1273
    {
1274
        MEL_LOAD[i] = &ME_LOAD[i];
1275
        MEL_SAVE[i] = &ME_SAVE[i];
1276
        ME_LOAD[i] = ME_LOAD_TEMPLATE;
1277
        ME_SAVE[i] = ME_SAVE_TEMPLATE;
1278
        ME_SAVE[i].entry = &MEO_SAVE[i];
1279
        MEO_SAVE[i] = MEO_SAVE_TEMPLATE;
5 Plagman 1280
 
4496 hendricks2 1281
        ME_LOAD[i].name = ud.savegame[i];
1282
        MEO_SAVE[i].variable = ud.savegame[i];
1283
    }
5 Plagman 1284
 
4496 hendricks2 1285
    // prepare text chat macros
1286
    for (i = 0; i < MAXRIDECULE; ++i)
1287
    {
1288
        MEL_MACROS[i] = &ME_MACROS[i];
1289
        ME_MACROS[i] = ME_MACROS_TEMPLATE;
1290
        ME_MACROS[i].entry = &MEO_MACROS[i];
1291
        MEO_MACROS[i] = MEO_MACROS_TEMPLATE;
5 Plagman 1292
 
4496 hendricks2 1293
        MEO_MACROS[i].variable = ud.ridecule[i];
1294
    }
1295
 
1296
    // prepare input
1297
    for (i = 0; i < NUMGAMEFUNCTIONS; ++i)
1298
    {
1299
        MEL_KEYBOARDSETUPFUNCS[i] = &ME_KEYBOARDSETUPFUNCS[i];
1300
        ME_KEYBOARDSETUPFUNCS[i] = ME_KEYBOARDSETUPFUNCS_TEMPLATE;
1301
        ME_KEYBOARDSETUPFUNCS[i].name = MenuGameFuncs[i];
1302
        ME_KEYBOARDSETUPFUNCS[i].entry = &MEO_KEYBOARDSETUPFUNCS[i];
1303
        MEO_KEYBOARDSETUPFUNCS[i] = MEO_KEYBOARDSETUPFUNCS_TEMPLATE;
1304
        MEO_KEYBOARDSETUPFUNCS[i].column[0] = &ud.config.KeyboardKeys[i][0];
1305
        MEO_KEYBOARDSETUPFUNCS[i].column[1] = &ud.config.KeyboardKeys[i][1];
1306
    }
1307
    for (i = 0; i < MENUMOUSEFUNCTIONS; ++i)
1308
    {
1309
        MEL_MOUSESETUPBTNS[i] = &ME_MOUSESETUPBTNS[i];
1310
        ME_MOUSESETUPBTNS[i] = ME_MOUSEJOYSETUPBTNS_TEMPLATE;
1311
        ME_MOUSESETUPBTNS[i].name = MenuMouseNames[i];
1312
        ME_MOUSESETUPBTNS[i].entry = &MEO_MOUSESETUPBTNS[i];
1313
        MEO_MOUSESETUPBTNS[i] = MEO_MOUSEJOYSETUPBTNS_TEMPLATE;
1314
        MEO_MOUSESETUPBTNS[i].data = &ud.config.MouseFunctions[MenuMouseDataIndex[i][0]][MenuMouseDataIndex[i][1]];
1315
    }
4828 hendricks2 1316
    for (i = 0; i < 2*joynumbuttons + 8*joynumhats; ++i)
4496 hendricks2 1317
    {
1318
        if (i < 2*joynumbuttons)
337 terminx 1319
        {
4496 hendricks2 1320
            if (i & 1)
1321
                Bsnprintf(MenuJoystickNames[i], MAXJOYBUTTONSTRINGLENGTH, "Double %s", getjoyname(1, i>>1));
1322
            else
1323
                Bstrncpy(MenuJoystickNames[i], getjoyname(1, i>>1), MAXJOYBUTTONSTRINGLENGTH);
337 terminx 1324
        }
1325
        else
1326
        {
4496 hendricks2 1327
            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 1328
        }
5 Plagman 1329
 
4496 hendricks2 1330
        MEL_JOYSTICKBTNS[i] = &ME_JOYSTICKBTNS[i];
1331
        ME_JOYSTICKBTNS[i] = ME_MOUSEJOYSETUPBTNS_TEMPLATE;
1332
        ME_JOYSTICKBTNS[i].name = MenuJoystickNames[i];
1333
        ME_JOYSTICKBTNS[i].entry = &MEO_JOYSTICKBTNS[i];
1334
        MEO_JOYSTICKBTNS[i] = MEO_MOUSEJOYSETUPBTNS_TEMPLATE;
1335
        MEO_JOYSTICKBTNS[i].data = &ud.config.JoystickFunctions[i>>1][i&1];
4399 hendricks2 1336
    }
4828 hendricks2 1337
    M_JOYSTICKBTNS.numEntries = 2*joynumbuttons + 8*joynumhats;
4496 hendricks2 1338
    for (i = 0; i < joynumaxes; ++i)
1339
    {
1340
        ME_JOYSTICKAXES[i] = ME_JOYSTICKAXES_TEMPLATE;
1341
        Bstrncpy(MenuJoystickAxes[i], getjoyname(0, i), MAXJOYBUTTONSTRINGLENGTH);
1342
        ME_JOYSTICKAXES[i].name = MenuJoystickAxes[i];
1343
        MEL_JOYSTICKAXES[i] = &ME_JOYSTICKAXES[i];
1344
    }
4778 hendricks2 1345
    M_JOYSTICKAXES.numEntries = joynumaxes;
5 Plagman 1346
 
4496 hendricks2 1347
    // prepare video setup
1348
    for (i = 0; i < validmodecnt; ++i)
1349
    {
1350
        int32_t *const r = &MEOS_VIDEOSETUP_RESOLUTION.numOptions;
5 Plagman 1351
 
4496 hendricks2 1352
        for (j = 0; j < *r; ++j)
337 terminx 1353
        {
4496 hendricks2 1354
            if (validmode[i].xdim == resolution[j].xdim && validmode[i].ydim == resolution[j].ydim)
335 terminx 1355
            {
4496 hendricks2 1356
                resolution[j].flags |= validmode[i].fs ? RES_FS : RES_WIN;
1357
                if (validmode[i].bpp > resolution[j].bppmax)
1358
                    resolution[j].bppmax = validmode[i].bpp;
1359
                break;
335 terminx 1360
            }
337 terminx 1361
        }
4496 hendricks2 1362
 
1363
        if (j == *r) // no match found
337 terminx 1364
        {
4496 hendricks2 1365
            resolution[j].xdim = validmode[i].xdim;
1366
            resolution[j].ydim = validmode[i].ydim;
1367
            resolution[j].bppmax = validmode[i].bpp;
1368
            resolution[j].flags = validmode[i].fs ? RES_FS : RES_WIN;
1369
            Bsnprintf(resolution[j].name, MAXRESOLUTIONSTRINGLENGTH, "%d x %d", resolution[j].xdim, resolution[j].ydim);
1370
            MEOSN_VIDEOSETUP_RESOLUTION[j] = resolution[j].name;
1371
            ++*r;
1372
        }
1373
    }
337 terminx 1374
 
4496 hendricks2 1375
    // prepare shareware
1376
    if (VOLUMEONE)
1377
    {
1378
        // blue out episodes beyond the first
4778 hendricks2 1379
        for (i = 1; i < g_numVolumes; ++i)
337 terminx 1380
        {
4496 hendricks2 1381
            if (MEL_EPISODE[i])
335 terminx 1382
            {
4496 hendricks2 1383
                ME_EPISODE[i].font = &MF_RedfontBlue;
1384
                ME_EPISODE[i].entry = &MEO_EPISODE_SHAREWARE;
5 Plagman 1385
            }
337 terminx 1386
        }
4778 hendricks2 1387
        M_EPISODE.numEntries = g_numVolumes; // remove User Map (and spacer)
4496 hendricks2 1388
        MEOS_NETOPTIONS_EPISODE.numOptions = 1;
4855 hendricks2 1389
        MenuEntry_DisableOnCondition(&ME_NETOPTIONS_EPISODE, 1);
4496 hendricks2 1390
    }
5 Plagman 1391
 
4496 hendricks2 1392
    // prepare pre-Atomic
1393
    if (!VOLUMEALL || !PLUTOPAK)
1394
    {
1395
        // prepare credits
1396
        M_CREDITS.title = M_CREDITS2.title = M_CREDITS3.title = MenuCredits;
1397
    }
1398
}
5 Plagman 1399
 
4686 hendricks2 1400
static void M_RunMenu(Menu_t *cm, vec2_t origin);
5 Plagman 1401
 
1402
 
1403
 
4496 hendricks2 1404
/*
1405
At present, no true difference is planned between M_PreMenu() and M_PreMenuDraw().
1406
They are separate for purposes of organization.
1407
*/
5 Plagman 1408
 
4496 hendricks2 1409
static void M_PreMenu(MenuID_t cm)
1410
{
1411
    int32_t i;
1412
    DukePlayer_t *ps = g_player[myconnectindex].ps;
5 Plagman 1413
 
4496 hendricks2 1414
    switch (cm)
1415
    {
1416
    case MENU_MAIN_INGAME:
4855 hendricks2 1417
        MenuEntry_DisableOnCondition(&ME_MAIN_SAVEGAME, ud.recstat == 2);
1418
        MenuEntry_DisableOnCondition(&ME_MAIN_QUITTOTITLE, g_netServer || numplayers > 1);
4496 hendricks2 1419
    case MENU_MAIN:
1420
        if ((g_netServer || ud.multimode > 1) && ud.recstat != 2)
1421
        {
1422
            ME_MAIN_NEWGAME.entry = &MEO_MAIN_NEWGAME_NETWORK;
1423
            ME_MAIN_NEWGAME_INGAME.entry = &MEO_MAIN_NEWGAME_NETWORK;
1424
        }
1425
        else
1426
        {
1427
            ME_MAIN_NEWGAME.entry = &MEO_MAIN_NEWGAME;
1428
            ME_MAIN_NEWGAME_INGAME.entry = &MEO_MAIN_NEWGAME_INGAME;
1429
        }
1430
        break;
4399 hendricks2 1431
 
4496 hendricks2 1432
    case MENU_GAMESETUP:
1433
        MEO_GAMESETUP_DEMOREC.options = (ps->gm&MODE_GAME) ? &MEOS_DemoRec : &MEOS_OffOn;
4855 hendricks2 1434
        MenuEntry_DisableOnCondition(&ME_GAMESETUP_DEMOREC, (ps->gm&MODE_GAME) && ud.m_recstat != 1);
4496 hendricks2 1435
        break;
5 Plagman 1436
 
4496 hendricks2 1437
#ifdef USE_OPENGL
4850 hendricks2 1438
    case MENU_DISPLAYSETUP:
4496 hendricks2 1439
        if (getrendermode() == REND_CLASSIC)
4778 hendricks2 1440
            MenuMenu_ChangeEntryList(M_DISPLAYSETUP, MEL_DISPLAYSETUP);
4496 hendricks2 1441
#ifdef POLYMER
1442
        else if (getrendermode() == REND_POLYMER)
4778 hendricks2 1443
            MenuMenu_ChangeEntryList(M_DISPLAYSETUP, MEL_DISPLAYSETUP_GL_POLYMER);
4496 hendricks2 1444
#endif
1445
        else
4778 hendricks2 1446
            MenuMenu_ChangeEntryList(M_DISPLAYSETUP, MEL_DISPLAYSETUP_GL);
5 Plagman 1447
 
4496 hendricks2 1448
        if (getrendermode() != REND_CLASSIC)
4869 hendricks2 1449
        {
1450
            vpsize = ud.screen_size + 4*(ud.screen_size>=8 && ud.statusbarmode==0);
1451
 
4609 terminx 1452
            for (i = (int32_t) ARRAY_SIZE(MEOSV_DISPLAYSETUP_ANISOTROPY) - 1; i >= 0; --i)
5 Plagman 1453
            {
4609 terminx 1454
                if (MEOSV_DISPLAYSETUP_ANISOTROPY[i] <= glinfo.maxanisotropy)
4496 hendricks2 1455
                {
4609 terminx 1456
                    MEOS_DISPLAYSETUP_ANISOTROPY.numOptions = i + 1;
4496 hendricks2 1457
                    break;
1458
                }
337 terminx 1459
            }
4869 hendricks2 1460
        }
4850 hendricks2 1461
        break;
5 Plagman 1462
 
4850 hendricks2 1463
    case MENU_RENDERERSETUP:
4855 hendricks2 1464
        MenuEntry_DisableOnCondition(&ME_RENDERERSETUP_TEXQUALITY, !usehightile);
1465
        MenuEntry_DisableOnCondition(&ME_RENDERERSETUP_PRECACHE, !usehightile);
1466
        MenuEntry_DisableOnCondition(&ME_RENDERERSETUP_TEXCACHE, !(glusetexcompr && usehightile));
1467
        MenuEntry_DisableOnCondition(&ME_RENDERERSETUP_DETAILTEX, !usehightile);
4496 hendricks2 1468
        break;
1469
#endif
5 Plagman 1470
 
4496 hendricks2 1471
    case MENU_VIDEOSETUP:
4836 helixhorne 1472
    {
1473
        const int32_t nr = newresolution;
1474
 
4855 hendricks2 1475
        MenuEntry_DisableOnCondition(&ME_VIDEOSETUP_APPLY,
1476
             (xdim == resolution[nr].xdim && ydim == resolution[nr].ydim &&
4836 helixhorne 1477
              getrendermode() == newrendermode && fullscreen == newfullscreen)
1478
             || (newfullscreen ? !(resolution[nr].flags & RES_FS) : !(resolution[nr].flags & RES_WIN))
1479
             || (newrendermode != REND_CLASSIC && resolution[nr].bppmax <= 8));
4496 hendricks2 1480
        break;
4836 helixhorne 1481
    }
5 Plagman 1482
 
4496 hendricks2 1483
    case MENU_SOUND:
4676 terminx 1484
    case MENU_SOUND_INGAME:
4850 hendricks2 1485
    case MENU_ADVSOUND:
4855 hendricks2 1486
        MenuEntry_DisableOnCondition(&ME_SOUND, ud.config.FXDevice < 0);
1487
        MenuEntry_DisableOnCondition(&ME_SOUND_MUSIC, ud.config.MusicDevice < 0);
1488
        MenuEntry_DisableOnCondition(&ME_SOUND_VOLUME_MASTER, (!ud.config.SoundToggle || ud.config.FXDevice < 0) && (!ud.config.MusicToggle || ud.config.MusicDevice < 0));
1489
        MenuEntry_DisableOnCondition(&ME_SOUND_VOLUME_EFFECTS, !ud.config.SoundToggle || ud.config.FXDevice < 0);
1490
        MenuEntry_DisableOnCondition(&ME_SOUND_VOLUME_MUSIC, !ud.config.MusicToggle || ud.config.MusicDevice < 0);
1491
        MenuEntry_DisableOnCondition(&ME_SOUND_DUKETALK, !ud.config.SoundToggle || ud.config.FXDevice < 0);
1492
        MenuEntry_DisableOnCondition(&ME_SOUND_SAMPLINGRATE, (!ud.config.SoundToggle || ud.config.FXDevice < 0) && (!ud.config.MusicToggle || ud.config.MusicDevice < 0));
1493
        MenuEntry_DisableOnCondition(&ME_SOUND_SAMPLESIZE, (!ud.config.SoundToggle || ud.config.FXDevice < 0) && (!ud.config.MusicToggle || ud.config.MusicDevice < 0));
1494
        MenuEntry_DisableOnCondition(&ME_SOUND_NUMVOICES, !ud.config.SoundToggle || ud.config.FXDevice < 0);
1495
        MenuEntry_DisableOnCondition(&ME_SOUND_RESTART, soundrate == ud.config.MixRate && soundvoices == ud.config.NumVoices && soundbits == ud.config.NumBits);
4496 hendricks2 1496
        break;
1497
 
1498
    case MENU_MOUSESETUP:
4855 hendricks2 1499
        MenuEntry_DisableOnCondition(&ME_MOUSESETUP_MOUSEAIMING, ud.mouseaiming);
4496 hendricks2 1500
        break;
1501
 
1502
    case MENU_NETOPTIONS:
1503
        if (MEO_NETOPTIONS_EPISODE.currentOption == MEOS_NETOPTIONS_EPISODE.numOptions-1)
1504
            MEL_NETOPTIONS[2] = &ME_NETOPTIONS_USERMAP;
1505
        else
337 terminx 1506
        {
4496 hendricks2 1507
            MEL_NETOPTIONS[2] = &ME_NETOPTIONS_LEVEL;
1508
            MEO_NETOPTIONS_LEVEL.options = &MEOS_NETOPTIONS_LEVEL[MEO_NETOPTIONS_EPISODE.currentOption];
1509
        }
1510
        MEL_NETOPTIONS[4] = (GametypeFlags[ud.m_coop] & GAMETYPE_MARKEROPTION) ? &ME_NETOPTIONS_MARKERS : &ME_NETOPTIONS_MARKERS_DISABLED;
1511
        MEL_NETOPTIONS[5] = (GametypeFlags[ud.m_coop] & (GAMETYPE_PLAYERSFRIENDLY|GAMETYPE_TDM)) ? &ME_NETOPTIONS_FRFIRE : &ME_NETOPTIONS_MAPEXITS;
1512
        break;
2728 hendricks2 1513
 
4496 hendricks2 1514
    case MENU_OPTIONS:
4855 hendricks2 1515
        MenuEntry_DisableOnCondition(&ME_OPTIONS_PLAYERSETUP, ud.recstat == 1);
1516
        MenuEntry_DisableOnCondition(&ME_OPTIONS_JOYSTICKSETUP, CONTROL_JoyPresent == 0);
4496 hendricks2 1517
        break;
337 terminx 1518
 
4496 hendricks2 1519
    case MENU_LOAD:
1520
        for (i = 0; i < MAXSAVEGAMES; ++i)
1521
        {
4609 terminx 1522
            ME_LOAD[i].entry = (ud.savegame[i][0] /*&& !g_oldverSavegame[i]*/) ? &MEO_LOAD_VALID : &MEO_LOAD;
4496 hendricks2 1523
            ME_LOAD[i].font = g_oldverSavegame[i] ? &MF_MinifontDarkGray : &MF_MinifontRed;
337 terminx 1524
        }
4496 hendricks2 1525
        break;
5 Plagman 1526
 
4496 hendricks2 1527
    case MENU_SAVE:
1528
        for (i = 0; i < MAXSAVEGAMES; ++i)
1529
            MEO_SAVE[i].font = (g_oldverSavegame[i] && MEO_SAVE[i].editfield == NULL) ? &MF_MinifontDarkGray : &MF_MinifontRed;
337 terminx 1530
        break;
1531
 
4496 hendricks2 1532
    default:
1533
        break;
1534
    }
1535
}
337 terminx 1536
 
4549 hendricks2 1537
 
4686 hendricks2 1538
static void M_PreMenuDrawBackground(MenuID_t cm, const vec2_t origin)
4549 hendricks2 1539
{
1540
    switch (cm)
1541
    {
1542
    case MENU_CREDITS:
1543
    case MENU_CREDITS2:
1544
    case MENU_CREDITS3:
1545
        if (!VOLUMEALL || !PLUTOPAK)
4686 hendricks2 1546
            M_DrawBackground(origin);
4549 hendricks2 1547
        else
4688 hendricks2 1548
            rotatesprite_fs(origin.x + (MENU_MARGIN_CENTER<<16), origin.y + (100<<16), 65536L,0,2504+cm-MENU_CREDITS,0,0,10+64);
4549 hendricks2 1549
        break;
1550
 
1551
    case MENU_LOAD:
1552
    case MENU_SAVE:
1553
    case MENU_CREDITS4:
1554
    case MENU_CREDITS5:
4686 hendricks2 1555
        M_DrawBackground(origin);
4549 hendricks2 1556
        break;
1557
 
1558
    case MENU_STORY:
4686 hendricks2 1559
        rotatesprite_fs(origin.x + (MENU_MARGIN_CENTER<<16), origin.y + (100<<16), 65536L,0,TEXTSTORY,0,0,10+64);
4549 hendricks2 1560
        break;
1561
 
1562
    case MENU_F1HELP:
4686 hendricks2 1563
        rotatesprite_fs(origin.x + (MENU_MARGIN_CENTER<<16), origin.y + (100<<16), 65536L,0,F1HELP,0,0,10+64);
4549 hendricks2 1564
        break;
1565
    }
1566
}
1567
 
1568
 
4778 hendricks2 1569
static void M_PreMenuDraw(MenuID_t cm, MenuEntry_t *entry, const vec2_t origin)
4496 hendricks2 1570
{
1571
    int32_t i, j, l = 0, m;
5 Plagman 1572
 
4496 hendricks2 1573
    switch (cm)
1574
    {
1575
    case MENU_MAIN_INGAME:
1576
        l += 4;
1577
    case MENU_MAIN:
4686 hendricks2 1578
        rotatesprite_fs(origin.x + (MENU_MARGIN_CENTER<<16), origin.y + ((28+l)<<16), 65536L,0,INGAMEDUKETHREEDEE,0,0,10);
4496 hendricks2 1579
        if (PLUTOPAK)   // JBF 20030804
4686 hendricks2 1580
            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 1581
        break;
5 Plagman 1582
 
4496 hendricks2 1583
    case MENU_PLAYER:
4686 hendricks2 1584
        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 1585
        break;
1586
 
1587
    case MENU_MACROS:
4686 hendricks2 1588
        mgametextcenter(origin.x, origin.y + (144<<16), "Activate in-game with Shift-F#");
4496 hendricks2 1589
        break;
1590
 
1591
    case MENU_COLCORR:
1592
    case MENU_COLCORR_INGAME:
4686 hendricks2 1593
        // center panel
1594
        rotatesprite_fs(origin.x + (120<<16), origin.y + (32<<16), 16384, 0, 3290, 0, 0, 2|8|16);
1595
        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);
1596
 
1597
        // left panel
1598
        rotatesprite_fs(origin.x + (40<<16), origin.y + (32<<16), 16384, 0, BONUSSCREEN, 0, 0, 2|8|16);
1599
 
1600
        // right panel
1601
        rotatesprite_fs(origin.x + (200<<16), origin.y + (32<<16), 16384, 0, LOADSCREEN, 0, 0, 2|8|16);
4496 hendricks2 1602
        break;
1603
 
1604
    case MENU_NETSETUP:
1605
    case MENU_NETHOST:
4686 hendricks2 1606
        mminitext(origin.x + (90<<16), origin.y + (90<<16), "Game Type", 2);
1607
        mminitext(origin.x + (90<<16), origin.y + ((90+8)<<16), "Episode", 2);
1608
        mminitext(origin.x + (90<<16), origin.y + ((90+8+8)<<16), "Level", 2);
1609
        mminitext(origin.x + (90<<16), origin.y + ((90+8+8+8)<<16), "Monsters", 2);
4496 hendricks2 1610
        if (ud.m_coop == 0)
4686 hendricks2 1611
            mminitext(origin.x + (90<<16), origin.y + ((90+8+8+8+8)<<16), "Markers", 2);
4496 hendricks2 1612
        else if (ud.m_coop == 1)
4686 hendricks2 1613
            mminitext(origin.x + (90<<16), origin.y + ((90+8+8+8+8)<<16), "Friendly Fire", 2);
1614
        mminitext(origin.x + (90<<16), origin.y + ((90+8+8+8+8+8)<<16), "User Map", 2);
4496 hendricks2 1615
 
4686 hendricks2 1616
        mminitext(origin.x + ((90+60)<<16), origin.y + (90<<16), GametypeNames[ud.m_coop], 0);
4496 hendricks2 1617
 
4686 hendricks2 1618
        mminitext(origin.x + ((90+60)<<16), origin.y + ((90+8)<<16), EpisodeNames[ud.m_volume_number], 0);
1619
        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 1620
        if (ud.m_monsters_off == 0 || ud.m_player_skill > 0)
4686 hendricks2 1621
            mminitext(origin.x + ((90+60)<<16), origin.y + ((90+8+8+8)<<16), SkillNames[ud.m_player_skill], 0);
1622
        else mminitext(origin.x + ((90+60)<<16), origin.y + ((90+8+8+8)<<16), "None", 0);
4496 hendricks2 1623
        if (ud.m_coop == 0)
337 terminx 1624
        {
4686 hendricks2 1625
            if (ud.m_marker) mminitext(origin.x + ((90+60)<<16), origin.y + ((90+8+8+8+8)<<16), "On", 0);
1626
            else mminitext(origin.x + ((90+60)<<16), origin.y + ((90+8+8+8+8)<<16), "Off", 0);
337 terminx 1627
        }
4496 hendricks2 1628
        else if (ud.m_coop == 1)
337 terminx 1629
        {
4686 hendricks2 1630
            if (ud.m_ffire) mminitext(origin.x + ((90+60)<<16), origin.y + ((90+8+8+8+8)<<16), "On", 0);
1631
            else mminitext(origin.x + ((90+60)<<16), origin.y + ((90+8+8+8+8)<<16), "Off", 0);
4496 hendricks2 1632
        }
1633
        break;
4467 hendricks2 1634
 
4496 hendricks2 1635
    case MENU_KEYBOARDKEYS:
4914 hendricks2 1636
        mgametextcenter(origin.x, origin.y + (156<<16), "Up/Down = Select Action\n"
1637
                                                        "Left/Right = Select List\n"
1638
                                                        "Enter = Modify   Delete = Clear");
4496 hendricks2 1639
        break;
335 terminx 1640
 
4496 hendricks2 1641
    case MENU_MOUSESETUP:
1642
        if (entry == &ME_MOUSESETUP_MOUSEAIMING)
1643
        {
4855 hendricks2 1644
            if (entry->flags & Disabled)
337 terminx 1645
            {
4914 hendricks2 1646
                mgametextcenter(origin.x, origin.y + (167<<16), "Set mouse aim type to toggle on/off\n"
1647
                                                                "in the Player Setup menu to enable");
337 terminx 1648
            }
1649
        }
4496 hendricks2 1650
        break;
5 Plagman 1651
 
4496 hendricks2 1652
    case MENU_MOUSEBTNS:
4914 hendricks2 1653
        mgametextcenter(origin.x, origin.y + (169<<16), "Up/Down = Select Button\n"
1654
                                                        "Enter = Modify");
337 terminx 1655
        break;
5 Plagman 1656
 
4496 hendricks2 1657
    case MENU_MOUSEADVANCED:
4778 hendricks2 1658
    {
1659
        size_t i;
1660
        for (i = 0; i < ARRAY_SIZE(MEL_INTERNAL_MOUSEADVANCED_DAXES); i++)
1661
            if (entry == MEL_INTERNAL_MOUSEADVANCED_DAXES[i])
1662
            {
4914 hendricks2 1663
                mgametextcenter(origin.x, origin.y + (162<<16), "Digital axes are not for mouse look\n"
1664
                                                                "or for aiming up and down");
4778 hendricks2 1665
            }
1666
    }
4496 hendricks2 1667
        break;
5 Plagman 1668
 
4496 hendricks2 1669
    case MENU_JOYSTICKBTNS:
4914 hendricks2 1670
        mgametextcenter(origin.x, origin.y + (149<<16), "Up/Down = Select Button\n"
1671
                                                        "Enter = Modify");
4496 hendricks2 1672
        break;
5 Plagman 1673
 
4496 hendricks2 1674
    case MENU_RESETPLAYER:
4850 hendricks2 1675
        fade_screen_black(1);
4686 hendricks2 1676
        mgametextcenter(origin.x, origin.y + (90<<16), "Load last game:");
5 Plagman 1677
 
4496 hendricks2 1678
        Bsprintf(tempbuf,"\"%s\"",ud.savegame[g_lastSaveSlot]);
4686 hendricks2 1679
        mgametextcenter(origin.x, origin.y + (99<<16), tempbuf);
5 Plagman 1680
 
4609 terminx 1681
#ifndef DROIDMENU
4686 hendricks2 1682
        mgametextcenter(origin.x, origin.y + ((99+9)<<16), "(Y/N)");
4609 terminx 1683
#endif
4496 hendricks2 1684
        break;
5 Plagman 1685
 
4496 hendricks2 1686
    case MENU_LOAD:
1687
        for (i = 0; i <= 108; i += 12)
4686 hendricks2 1688
            rotatesprite_fs(origin.x + ((160+64+91-64)<<16), origin.y + ((i+56)<<16), 65536L,0,TEXTBOX,24,0,10);
337 terminx 1689
 
4686 hendricks2 1690
        rotatesprite_fs(origin.x + (22<<16), origin.y + (97<<16), 65536L,0,WINDOWBORDER2,24,0,10);
1691
        rotatesprite_fs(origin.x + (180<<16), origin.y + (97<<16), 65536L,1024,WINDOWBORDER2,24,0,10);
1692
        rotatesprite_fs(origin.x + (99<<16), origin.y + (50<<16), 65536L,512,WINDOWBORDER1,24,0,10);
1693
        rotatesprite_fs(origin.x + (103<<16), origin.y + (144<<16), 65536L,1024+512,WINDOWBORDER1,24,0,10);
2728 hendricks2 1694
 
4778 hendricks2 1695
        if (ud.savegame[M_LOAD.currentEntry][0])
337 terminx 1696
        {
4686 hendricks2 1697
            rotatesprite_fs(origin.x + (101<<16), origin.y + (97<<16), 65536>>1,512,TILE_LOADSHOT,-32,0,4+10+64);
2728 hendricks2 1698
 
4778 hendricks2 1699
            if (g_oldverSavegame[M_LOAD.currentEntry])
4496 hendricks2 1700
            {
4686 hendricks2 1701
                mmenutext(origin.x + (53<<16), origin.y + (70<<16), "Previous");
1702
                mmenutext(origin.x + (58<<16), origin.y + (90<<16), "Version");
337 terminx 1703
 
4609 terminx 1704
#ifndef DROIDMENU
4496 hendricks2 1705
                Bsprintf(tempbuf,"Saved: %d.%d.%d %d-bit", savehead.majorver, savehead.minorver,
1706
                         savehead.bytever, 8*savehead.ptrsize);
4686 hendricks2 1707
                mgametext(origin.x + (31<<16), origin.y + (104<<16), tempbuf);
4496 hendricks2 1708
                Bsprintf(tempbuf,"Our: %d.%d.%d %d-bit", SV_MAJOR_VER, SV_MINOR_VER, BYTEVERSION,
1709
                         (int32_t)(8*sizeof(intptr_t)));
4686 hendricks2 1710
                mgametext(origin.x + ((31+16)<<16), origin.y + (114<<16), tempbuf);
4609 terminx 1711
#endif
337 terminx 1712
            }
5 Plagman 1713
 
4850 hendricks2 1714
            if (savehead.numplayers > 1)
1715
            {
1716
                Bsprintf(tempbuf, "Players: %-2d                      ", savehead.numplayers);
1717
                mgametextcenter(origin.x, origin.y + (156<<16), tempbuf);
1718
            }
4609 terminx 1719
 
4712 helixhorne 1720
            {
1721
                const char *name = MapInfo[(savehead.volnum*MAXLEVELS) + savehead.levnum].name;
1722
                Bsprintf(tempbuf, "%s / %s", name ? name : "^10unnamed^0", SkillNames[savehead.skill-1]);
1723
            }
1724
 
4686 hendricks2 1725
            mgametextcenter(origin.x, origin.y + (168<<16), tempbuf);
4496 hendricks2 1726
            if (savehead.volnum == 0 && savehead.levnum == 7)
4686 hendricks2 1727
                mgametextcenter(origin.x, origin.y + (180<<16), savehead.boardfn);
337 terminx 1728
        }
4496 hendricks2 1729
        else
4686 hendricks2 1730
            mmenutext(origin.x + (69<<16), origin.y + (70<<16), "Empty");
4496 hendricks2 1731
        break;
410 terminx 1732
 
4496 hendricks2 1733
    case MENU_SAVE:
1734
        for (i = 0; i <= 108; i += 12)
4686 hendricks2 1735
            rotatesprite_fs(origin.x + ((160+64+91-64)<<16), origin.y + ((i+56)<<16), 65536L,0,TEXTBOX,24,0,10);
337 terminx 1736
 
4686 hendricks2 1737
        rotatesprite_fs(origin.x + (22<<16), origin.y + (97<<16), 65536L,0,WINDOWBORDER2,24,0,10);
1738
        rotatesprite_fs(origin.x + (180<<16), origin.y + (97<<16), 65536L,1024,WINDOWBORDER2,24,0,10);
1739
        rotatesprite_fs(origin.x + (99<<16), origin.y + (50<<16), 65536L,512,WINDOWBORDER1,24,0,10);
1740
        rotatesprite_fs(origin.x + (103<<16), origin.y + (144<<16), 65536L,1024+512,WINDOWBORDER1,24,0,10);
337 terminx 1741
 
4780 hendricks2 1742
        j = 0;
1743
        for (i = 0; i < 10; ++i)
1744
            if (((MenuString_t*)M_SAVE.entrylist[i]->entry)->editfield)
1745
                j |= 1;
2728 hendricks2 1746
 
4780 hendricks2 1747
        if (j)
1748
            rotatesprite_fs(origin.x + (101<<16), origin.y + (97<<16), 65536L>>1,512,TILE_SAVESHOT,-32,0,4+10+64);
1749
        else if (ud.savegame[M_SAVE.currentEntry][0])
1750
            rotatesprite_fs(origin.x + (101<<16), origin.y + (97<<16), 65536L>>1,512,TILE_LOADSHOT,-32,0,4+10+64);
1751
        else
1752
            mmenutext(origin.x + (69<<16), origin.y + (70<<16), "Empty");
4496 hendricks2 1753
 
4780 hendricks2 1754
        if (ud.savegame[M_SAVE.currentEntry][0] && g_oldverSavegame[M_SAVE.currentEntry])
1755
        {
1756
            mmenutext(origin.x + (53<<16), origin.y + (70<<16), "Previous");
1757
            mmenutext(origin.x + (58<<16), origin.y + (90<<16), "Version");
4496 hendricks2 1758
 
4609 terminx 1759
#ifndef DROIDMENU
4780 hendricks2 1760
            Bsprintf(tempbuf,"Saved: %d.%d.%d %d-bit", savehead.majorver, savehead.minorver,
1761
                     savehead.bytever, 8*savehead.ptrsize);
1762
            mgametext(origin.x + (31<<16), origin.y + (104<<16), tempbuf);
1763
            Bsprintf(tempbuf,"Our: %d.%d.%d %d-bit", SV_MAJOR_VER, SV_MINOR_VER, BYTEVERSION,
1764
                     (int32_t)(8*sizeof(intptr_t)));
1765
            mgametext(origin.x + ((31+16)<<16), origin.y + (114<<16), tempbuf);
4609 terminx 1766
#endif
337 terminx 1767
        }
5 Plagman 1768
 
4850 hendricks2 1769
        if (ud.multimode > 1)
1770
        {
1771
            Bsprintf(tempbuf, "Players: %-2d                      ", ud.multimode);
1772
            mgametextcenter(origin.x, origin.y + (156<<16), tempbuf);
1773
        }
4609 terminx 1774
 
1775
        Bsprintf(tempbuf,"%s / %s",MapInfo[(ud.volume_number*MAXLEVELS) + ud.level_number].name, SkillNames[ud.player_skill-1]);
4686 hendricks2 1776
        mgametextcenter(origin.x, origin.y + (168<<16), tempbuf);
337 terminx 1777
        if (ud.volume_number == 0 && ud.level_number == 7)
4686 hendricks2 1778
            mgametextcenter(origin.x, origin.y + (180<<16), currentboardfilename);
4496 hendricks2 1779
        break;
5 Plagman 1780
 
4609 terminx 1781
#ifdef DROIDMENU
1782
    case MENU_SKILL:
1783
    {
4778 hendricks2 1784
        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!" };
1785
        if ((size_t)M_SKILL.currentEntry < ARRAY_SIZE(s))
1786
            mgametextcenter(origin.x, origin.y + (168<<16), s[M_SKILL.currentEntry]);
4609 terminx 1787
    }
1788
        break;
1789
#endif
1790
 
4496 hendricks2 1791
    case MENU_LOADVERIFY:
4850 hendricks2 1792
        fade_screen_black(1);
1793
        if (g_oldverSavegame[M_LOAD.currentEntry])
1794
        {
1795
            mgametextcenter(origin.x, origin.y + (90<<16), "Start new game:");
1796
            Bsprintf(tempbuf,"%s / %s",MapInfo[(ud.volume_number*MAXLEVELS) + ud.level_number].name, SkillNames[ud.player_skill-1]);
1797
            mgametextcenter(origin.x, origin.y + (99<<16), tempbuf);
1798
        }
1799
        else
1800
        {
1801
            mgametextcenter(origin.x, origin.y + (90<<16), "Load game:");
1802
            Bsprintf(tempbuf, "\"%s\"", ud.savegame[M_LOAD.currentEntry]);
1803
            mgametextcenter(origin.x, origin.y + (99<<16), tempbuf);
1804
        }
4609 terminx 1805
#ifndef DROIDMENU
4686 hendricks2 1806
        mgametextcenter(origin.x, origin.y + ((99+9)<<16), "(Y/N)");
4609 terminx 1807
#endif
4496 hendricks2 1808
        break;
5 Plagman 1809
 
4496 hendricks2 1810
    case MENU_SAVEVERIFY:
4850 hendricks2 1811
        fade_screen_black(1);
4686 hendricks2 1812
        mgametextcenter(origin.x, origin.y + (90<<16), "Overwrite previous saved game?");
4609 terminx 1813
#ifndef DROIDMENU
4686 hendricks2 1814
        mgametextcenter(origin.x, origin.y + ((90+9)<<16), "(Y/N)");
4609 terminx 1815
#endif
4496 hendricks2 1816
        break;
5 Plagman 1817
 
4496 hendricks2 1818
    case MENU_NEWVERIFY:
4850 hendricks2 1819
        fade_screen_black(1);
4686 hendricks2 1820
        mgametextcenter(origin.x, origin.y + (90<<16), "Abort this game?");
4609 terminx 1821
#ifndef DROIDMENU
4686 hendricks2 1822
        mgametextcenter(origin.x, origin.y + ((90+9)<<16), "(Y/N)");
4609 terminx 1823
#endif
4496 hendricks2 1824
        break;
2728 hendricks2 1825
 
4496 hendricks2 1826
    case MENU_QUIT:
1827
    case MENU_QUIT_INGAME:
4850 hendricks2 1828
        fade_screen_black(1);
4686 hendricks2 1829
        mgametextcenter(origin.x, origin.y + (90<<16), "Are you sure you want to quit?");
4609 terminx 1830
#ifndef DROIDMENU
4686 hendricks2 1831
        mgametextcenter(origin.x, origin.y + (99<<16), "(Y/N)");
4609 terminx 1832
#endif
4496 hendricks2 1833
        break;
2728 hendricks2 1834
 
4496 hendricks2 1835
    case MENU_QUITTOTITLE:
4850 hendricks2 1836
        fade_screen_black(1);
4686 hendricks2 1837
        mgametextcenter(origin.x, origin.y + (90<<16), "Quit to Title?");
4609 terminx 1838
#ifndef DROIDMENU
4686 hendricks2 1839
        mgametextcenter(origin.x, origin.y + (99<<16), "(Y/N)");
4609 terminx 1840
#endif
4496 hendricks2 1841
        break;
5 Plagman 1842
 
4496 hendricks2 1843
    case MENU_NETWAITMASTER:
1844
        G_DrawFrags();
4914 hendricks2 1845
        mgametextcenter(origin.x, origin.y + (50<<16), "Waiting for master\n"
1846
                                                       "to select level");
4496 hendricks2 1847
        break;
5 Plagman 1848
 
4496 hendricks2 1849
    case MENU_NETWAITVOTES:
1850
        G_DrawFrags();
4686 hendricks2 1851
        mgametextcenter(origin.x, origin.y + (90<<16), "Waiting for votes");
4496 hendricks2 1852
        break;
5 Plagman 1853
 
4496 hendricks2 1854
    case MENU_BUYDUKE:
4914 hendricks2 1855
        mgametextcenter(origin.x, origin.y + (33<<16), "You are playing the shareware\n"
1856
                                                       "version of Duke Nukem 3D.  While\n"
1857
                                                       "this version is really cool, you\n"
1858
                                                       "are missing over 75% of the total\n"
1859
                                                       "game, along with other great extras\n"
1860
                                                       "which you'll get when you order\n"
1861
                                                       "the complete version and get\n"
1862
                                                       "the final three episodes.");
4496 hendricks2 1863
 
4609 terminx 1864
#ifndef DROIDMENU
4914 hendricks2 1865
        mgametextcenter(origin.x, origin.y + (112<<16), "Please visit Steam and purchase\n"
1866
                                                        "Duke Nukem 3D: Megaton Edition\n"
4921 terminx 1867
                                                        "to upgrade to the full registered\n"
1868
                                                        "version of Duke Nukem 3D.");
4609 terminx 1869
#else
4942 hendricks2 1870
# if defined EDUKE32_IOS
4914 hendricks2 1871
        mgametextcenter(origin.x, origin.y + (121<<16), "Please visit the App Store\n"
4921 terminx 1872
                                                        "to upgrade to the full registered\n"
1873
                                                        "version of Duke Nukem 3D.");
4852 hendricks2 1874
# else
4914 hendricks2 1875
        mgametextcenter(origin.x, origin.y + (121<<16), "Please visit the Play Store\n"
4921 terminx 1876
                                                        "to upgrade to the full registered\n"
1877
                                                        "version of Duke Nukem 3D.");
4852 hendricks2 1878
# endif
4609 terminx 1879
#endif
4686 hendricks2 1880
        mgametextcenter(origin.x, origin.y + ((148+16)<<16), "Press any key or button...");
4496 hendricks2 1881
        break;
1882
 
3084 terminx 1883
    case MENU_CREDITS:
1884
    case MENU_CREDITS2:
1885
    case MENU_CREDITS3:
337 terminx 1886
        if (!VOLUMEALL || !PLUTOPAK)
1887
        {
4549 hendricks2 1888
            switch (cm)
335 terminx 1889
            {