Subversion Repositories eduke32

Rev

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