Subversion Repositories eduke32

Rev

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