Subversion Repositories eduke32

Rev

Rev 8764 | Rev 8771 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
5 Plagman 1
//-------------------------------------------------------------------------
2
/*
5611 terminx 3
Copyright (C) 2016 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
 
8760 terminx 23
#include "menus.h"
24
 
25
#include "al_midi.h"
7186 terminx 26
#include "cheats.h"
8114 terminx 27
#include "communityapi.h"
6074 hendricks2 28
#include "compat.h"
7186 terminx 29
#include "demo.h"
5 Plagman 30
#include "duke3d.h"
8760 terminx 31
#include "in_android.h"
7186 terminx 32
#include "input.h"
911 terminx 33
#include "osdcmds.h"
1677 terminx 34
#include "savegame.h"
4387 terminx 35
#include "xxhash.h"
8760 terminx 36
#include "music.h"
1707 terminx 37
 
4993 terminx 38
#ifndef __ANDROID__
39
droidinput_t droidinput;
40
#endif
41
 
4686 hendricks2 42
// common positions
43
#define MENU_MARGIN_REGULAR 40
44
#define MENU_MARGIN_WIDE    32
45
#define MENU_MARGIN_CENTER  160
46
#define MENU_HEIGHT_CENTER  100
47
 
921 terminx 48
#define USERMAPENTRYLENGTH 25
49
 
6665 hendricks2 50
static FORCE_INLINE void Menu_StartTextInput()
5325 helixhorne 51
{
6665 hendricks2 52
    KB_FlushKeyboardQueue();
53
    KB_ClearKeysDown();
5331 hendricks2 54
#if defined EDUKE32_TOUCH_DEVICES && defined SDL_MAJOR_VERSION && SDL_MAJOR_VERSION > 1
5634 hendricks2 55
# if defined __ANDROID__
5625 terminx 56
    AndroidShowKeyboard(1);
5634 hendricks2 57
# else
58
    SDL_StartTextInput();
59
# endif
5325 helixhorne 60
#endif
61
}
62
 
6665 hendricks2 63
static FORCE_INLINE void Menu_StopTextInput()
5325 helixhorne 64
{
5331 hendricks2 65
#if defined EDUKE32_TOUCH_DEVICES && defined SDL_MAJOR_VERSION && SDL_MAJOR_VERSION > 1
5634 hendricks2 66
# if defined __ANDROID__
5625 terminx 67
    AndroidShowKeyboard(0);
5634 hendricks2 68
# else
69
    SDL_StopTextInput();
70
# endif
5325 helixhorne 71
#endif
72
}
73
 
6463 hendricks2 74
static FORCE_INLINE void rotatesprite_ybounds(int32_t sx, int32_t sy, int32_t z, int16_t a, int16_t picnum, int8_t dashade, char dapalnum, int32_t dastat, int32_t ydim_upper, int32_t ydim_lower)
75
{
76
    rotatesprite_(sx, sy, z, a, picnum, dashade, dapalnum, dastat, 0, 0, 0, ydim_upper, xdim-1, ydim_lower);
77
}
78
 
6212 hendricks2 79
static void mgametext(int32_t x, int32_t y, char const * t)
80
{
8653 hendricks2 81
    G_ScreenText(MF_Bluefont.tilenum, x, y, MF_Bluefont.zoom, 0, 0, t, 0, MF_Bluefont.pal, 2|8|16, 0, MF_Bluefont.emptychar.x, MF_Bluefont.emptychar.y, MF_Bluefont.between.x, MF_Bluefont.between.y, MF_Bluefont.textflags, 0, 0, xdim-1, ydim-1);
6212 hendricks2 82
}
6613 hendricks2 83
 
7901 hendricks2 84
static vec2_t mgametextcenterat(int32_t x, int32_t y, char const * t, int32_t f = 0)
85
{
8653 hendricks2 86
    return G_ScreenText(MF_Bluefont.tilenum, x, y, MF_Bluefont.zoom, 0, 0, t, 0, MF_Bluefont.pal, 2|8|16, 0, MF_Bluefont.emptychar.x, MF_Bluefont.emptychar.y, MF_Bluefont.between.x, MF_Bluefont.between.y, MF_Bluefont.textflags|f|TEXT_XCENTER, 0, 0, xdim-1, ydim-1);
7901 hendricks2 87
}
6212 hendricks2 88
static vec2_t mgametextcenter(int32_t x, int32_t y, char const * t, int32_t f = 0)
89
{
7901 hendricks2 90
    return mgametextcenterat((MENU_MARGIN_CENTER<<16) + x, y, t, f);
6212 hendricks2 91
}
5452 hendricks2 92
 
4686 hendricks2 93
#define mminitext(x,y,t,p) minitext_(x, y, t, 0, p, 2|8|16|ROTATESPRITE_FULL16)
6208 hendricks2 94
#define mmenutext menutext
1037 terminx 95
 
6190 hendricks2 96
#ifndef EDUKE32_STANDALONE
4686 hendricks2 97
static void shadowminitext(int32_t x, int32_t y, const char *t, int32_t p)
98
{
99
    int32_t f = 0;
4496 hendricks2 100
 
4686 hendricks2 101
    if (!minitext_lowercase)
102
        f |= TEXT_UPPERCASE;
4496 hendricks2 103
 
8653 hendricks2 104
    G_ScreenTextShadow(1, 1, 4, MINIFONT, x, y, 65536, 0, 0, t, 0, p, 2|8|16, 0, 4<<16, 8<<16, 1<<16, 0, f, 0, 0, xdim-1, ydim-1);
4686 hendricks2 105
}
6190 hendricks2 106
#endif
4686 hendricks2 107
static void creditsminitext(int32_t x, int32_t y, const char *t, int32_t p)
5 Plagman 108
{
4686 hendricks2 109
    int32_t f = TEXT_XCENTER;
110
 
111
    if (!minitext_lowercase)
112
        f |= TEXT_UPPERCASE;
113
 
8653 hendricks2 114
    G_ScreenTextShadow(1, 1, 4, MINIFONT, x, y, 65536, 0, 0, t, 0, p, 2|8|16, 0, 4<<16, 8<<16, 1<<16, 0, f, 0, 0, xdim-1, ydim-1);
4686 hendricks2 115
}
116
 
4496 hendricks2 117
#pragma pack(push,1)
118
static savehead_t savehead;
119
#pragma pack(pop)
120
 
5923 terminx 121
static void Menu_DrawBackground(const vec2_t origin)
3101 hendricks2 122
{
4686 hendricks2 123
    rotatesprite_fs(origin.x + (MENU_MARGIN_CENTER<<16), origin.y + (100<<16), 65536L,0,MENUSCREEN,16,0,10+64);
4496 hendricks2 124
}
3101 hendricks2 125
 
5923 terminx 126
static void Menu_DrawTopBar(const vec2_t origin)
4549 hendricks2 127
{
6555 hendricks2 128
    if ((G_GetLogoFlags() & LOGO_NOTITLEBAR) == 0)
129
        rotatesprite_fs(origin.x + (MENU_MARGIN_CENTER<<16), origin.y + (19<<16), MF_Redfont.cursorScale, 0,MENUBAR,16,0,10);
4549 hendricks2 130
}
3101 hendricks2 131
 
5923 terminx 132
static void Menu_DrawTopBarCaption(const char *caption, const vec2_t origin)
4496 hendricks2 133
{
6613 hendricks2 134
    static char t[64];
135
    size_t const srclen = strlen(caption);
136
    size_t const dstlen = min(srclen, ARRAY_SIZE(t)-1);
137
    memcpy(t, caption, dstlen);
138
    t[dstlen] = '\0';
139
    char *p = &t[dstlen-1];
140
    if (*p == ':')
141
        *p = '\0';
7322 terminx 142
    captionmenutext(origin.x + (MENU_MARGIN_CENTER<<16), origin.y + (24<<16) + ((15>>1)<<16), t);
5 Plagman 143
}
144
 
6463 hendricks2 145
static FORCE_INLINE int32_t Menu_CursorShade(void)
146
{
8050 pogokeen 147
    return VM_OnEventWithReturn(EVENT_MENUCURSORSHADE, -1, myconnectindex, 4-(sintable[((int32_t) totalclock<<4)&2047]>>11));
6463 hendricks2 148
}
149
static void Menu_DrawCursorCommon(int32_t x, int32_t y, int32_t z, int32_t picnum, int32_t ydim_upper = 0, int32_t ydim_lower = ydim-1)
150
{
151
    rotatesprite_(x, y, z, 0, picnum, Menu_CursorShade(), 0, 2|8, 0, 0, 0, ydim_upper, xdim-1, ydim_lower);
152
}
153
static void Menu_DrawCursorLeft(int32_t x, int32_t y, int32_t z)
154
{
7808 terminx 155
    if (FURY) return;
8050 pogokeen 156
    Menu_DrawCursorCommon(x, y, z, VM_OnEventWithReturn(EVENT_MENUCURSORLEFT, -1, myconnectindex, SPINNINGNUKEICON+(((int32_t) totalclock>>3)%7)));
6463 hendricks2 157
}
158
static void Menu_DrawCursorRight(int32_t x, int32_t y, int32_t z)
159
{
7808 terminx 160
    if (FURY) return;
8050 pogokeen 161
    Menu_DrawCursorCommon(x, y, z, VM_OnEventWithReturn(EVENT_MENUCURSORRIGHT, -1, myconnectindex, SPINNINGNUKEICON+6-((6+((int32_t) totalclock>>3))%7)));
6463 hendricks2 162
}
7694 terminx 163
static void Menu_DrawCursorTextTile(int32_t x, int32_t y, int32_t h, int32_t picnum, vec2_16_t const & siz, int32_t ydim_upper = 0, int32_t ydim_lower = ydim-1)
6464 hendricks2 164
{
7322 terminx 165
    vec2_t const adjsiz = { (siz.x>>1)<<16, siz.y<<16 };
6464 hendricks2 166
    Menu_DrawCursorCommon(x + scale(adjsiz.x, h, adjsiz.y), y, divscale16(h, adjsiz.y), picnum, ydim_upper, ydim_lower);
167
}
6463 hendricks2 168
static void Menu_DrawCursorText(int32_t x, int32_t y, int32_t h, int32_t ydim_upper = 0, int32_t ydim_lower = ydim-1)
169
{
7694 terminx 170
    vec2_16_t const & siz = tilesiz[SPINNINGNUKEICON];
6464 hendricks2 171
 
7808 terminx 172
    if (FURY || siz.x == 0)
6464 hendricks2 173
    {
174
        Menu_DrawCursorTextTile(x, y, h, SMALLFNTCURSOR, tilesiz[SMALLFNTCURSOR], ydim_upper, ydim_lower);
175
        return;
176
    }
177
 
8050 pogokeen 178
    Menu_DrawCursorTextTile(x, y, h, SPINNINGNUKEICON+(((int32_t) totalclock>>3)%7), siz, ydim_upper, ydim_lower);
6463 hendricks2 179
}
180
 
7070 terminx 181
 
7114 terminx 182
static uint16_t g_oldSaveCnt;
5 Plagman 183
 
184
 
185
 
186
 
4496 hendricks2 187
/*
188
All MAKE_* macros are generally for the purpose of keeping state initialization
189
separate from actual data. Alternatively, they can serve to factor out repetitive
190
stuff and keep the important bits from getting lost to our eyes.
4506 hendricks2 191
 
7930 hendricks2 192
They serve as a stand-in for C++ default value constructors, since this was written
193
when the codebase still used C89.
4778 hendricks2 194
 
195
Note that I prefer to include a space on the inside of the macro parentheses, since
196
they effectively stand in for curly braces as struct initializers.
4496 hendricks2 197
*/
2313 helixhorne 198
 
199
 
7930 hendricks2 200
MenuGameplayStemEntry g_MenuGameplayEntries[MAXMENUGAMEPLAYENTRIES];
201
 
4496 hendricks2 202
// common font types
203
// tilenums are set after namesdyn runs
2313 helixhorne 204
 
6613 hendricks2 205
//                                      emptychar x,y       between x,y         zoom                cursorLeft          cursorCenter        cursorScale         textflags
206
//                                      tilenum             shade_deselected    shade_disabled      pal                 pal_selected        pal_deselected      pal_disabled
207
MenuFont_t MF_Redfont =               { { 5<<16, 15<<16 },  { 0, 0 },           65536,              20<<16,             110<<16,            65536,              TEXT_BIGALPHANUM | TEXT_UPPERCASE,
208
                                        -1,                 10,                 0,                  0,                  0,                  0,                  1,
209
                                        0,                  0,                  1 };
210
MenuFont_t MF_Bluefont =              { { 5<<16, 7<<16 },   { 0, 0 },           65536,              10<<16,             110<<16,            32768,              0,
211
                                        -1,                 10,                 0,                  0,                  10,                 10,                 16,
212
                                        0,                  0,                  16 };
213
MenuFont_t MF_Minifont =              { { 4<<16, 5<<16 },   { 1<<16, 1<<16 },   65536,              10<<16,             110<<16,            32768,              0,
214
                                        -1,                 10,                 0,                  0,                  2,                  2,                  0,
215
                                        0,                  0,                  16 };
2313 helixhorne 216
 
6613 hendricks2 217
 
5478 terminx 218
static MenuMenuFormat_t MMF_Top_Main =             { {  MENU_MARGIN_CENTER<<16, 55<<16, }, -(170<<16) };
219
static MenuMenuFormat_t MMF_Top_Episode =          { {  MENU_MARGIN_CENTER<<16, 48<<16, }, -(190<<16) };
7930 hendricks2 220
static MenuMenuFormat_t MMF_Top_NewGameCustom =    { {  MENU_MARGIN_CENTER<<16, 48<<16, }, -(190<<16) };
221
static MenuMenuFormat_t MMF_Top_NewGameCustomSub = { {  MENU_MARGIN_CENTER<<16, 48<<16, }, -(190<<16) };
5478 terminx 222
static MenuMenuFormat_t MMF_Top_Skill =            { {  MENU_MARGIN_CENTER<<16, 58<<16, }, -(190<<16) };
223
static MenuMenuFormat_t MMF_Top_Options =          { {  MENU_MARGIN_CENTER<<16, 38<<16, }, -(190<<16) };
224
static MenuMenuFormat_t MMF_Top_Joystick_Network = { {  MENU_MARGIN_CENTER<<16, 70<<16, }, -(190<<16) };
225
static MenuMenuFormat_t MMF_BigOptions =           { {    MENU_MARGIN_WIDE<<16, 38<<16, }, -(190<<16) };
226
static MenuMenuFormat_t MMF_SmallOptions =         { {    MENU_MARGIN_WIDE<<16, 37<<16, },    170<<16 };
227
static MenuMenuFormat_t MMF_Macros =               { {                  26<<16, 40<<16, },    160<<16 };
228
static MenuMenuFormat_t MMF_SmallOptionsNarrow  =  { { MENU_MARGIN_REGULAR<<16, 38<<16, }, -(190<<16) };
6680 hendricks2 229
static MenuMenuFormat_t MMF_KeyboardSetupFuncs =   { {                  50<<16, 34<<16, },    151<<16 };
5478 terminx 230
static MenuMenuFormat_t MMF_MouseJoySetupBtns =    { {                  76<<16, 34<<16, },    143<<16 };
231
static MenuMenuFormat_t MMF_FuncList =             { {                 100<<16, 51<<16, },    152<<16 };
232
static MenuMenuFormat_t MMF_ColorCorrect =         { { MENU_MARGIN_REGULAR<<16, 86<<16, },    190<<16 };
233
static MenuMenuFormat_t MMF_BigSliders =           { {    MENU_MARGIN_WIDE<<16, 37<<16, },    190<<16 };
6569 hendricks2 234
static MenuMenuFormat_t MMF_LoadSave =             { {                 200<<16, 49<<16, },    145<<16 };
5478 terminx 235
static MenuMenuFormat_t MMF_NetSetup =             { {                  36<<16, 38<<16, },    190<<16 };
236
static MenuMenuFormat_t MMF_FileSelectLeft =       { {                  40<<16, 45<<16, },    162<<16 };
237
static MenuMenuFormat_t MMF_FileSelectRight =      { {                 164<<16, 45<<16, },    162<<16 };
4778 hendricks2 238
 
6203 hendricks2 239
static MenuEntryFormat_t MEF_Null =             {     0,      0,          0 };
240
static MenuEntryFormat_t MEF_MainMenu =         { 4<<16,      0,          0 };
6289 hendricks2 241
static MenuEntryFormat_t MEF_OptionsMenu =      { 7<<16,      0,          0 };
8017 terminx 242
static MenuEntryFormat_t MEF_LeftMenu =         { 7<<16,      0,    120<<16 };
6203 hendricks2 243
static MenuEntryFormat_t MEF_CenterMenu =       { 7<<16,      0,          0 };
6650 hendricks2 244
static MenuEntryFormat_t MEF_BigOptions_Apply = { 4<<16, 16<<16, -(260<<16) };
6203 hendricks2 245
static MenuEntryFormat_t MEF_BigOptionsRt =     { 4<<16,      0, -(260<<16) };
7968 hendricks2 246
static MenuEntryFormat_t MEF_BigOptionsRtSections = { 3<<16,      0, -(260<<16) };
6013 terminx 247
#if defined USE_OPENGL || !defined EDUKE32_ANDROID_MENU
6680 hendricks2 248
static MenuEntryFormat_t MEF_SmallOptions =     { 1<<16,      0, -(260<<16) };
4647 hendricks2 249
#endif
6203 hendricks2 250
static MenuEntryFormat_t MEF_BigCheats =        { 3<<16,      0, -(260<<16) };
251
static MenuEntryFormat_t MEF_Cheats =           { 2<<16,      0, -(260<<16) };
252
static MenuEntryFormat_t MEF_PlayerNarrow =     { 1<<16,      0,     90<<16 };
253
static MenuEntryFormat_t MEF_Macros =           { 2<<16,     -1,    268<<16 };
254
static MenuEntryFormat_t MEF_VideoSetup =       { 4<<16,      0,    168<<16 };
6207 hendricks2 255
static MenuEntryFormat_t MEF_VideoSetup_Apply = { 4<<16, 16<<16,    168<<16 };
6680 hendricks2 256
static MenuEntryFormat_t MEF_KBFuncList =       { 3<<16,      0, -(225<<16) };
257
static MenuEntryFormat_t MEF_FuncList =         { 3<<16,      0, -(170<<16) };
6203 hendricks2 258
static MenuEntryFormat_t MEF_ColorCorrect =     { 2<<16,      0, -(240<<16) };
6680 hendricks2 259
static MenuEntryFormat_t MEF_BigSliders =       { 2<<16,      0, -(260<<16) };
6569 hendricks2 260
static MenuEntryFormat_t MEF_LoadSave =         { 2<<16,     -1,     78<<16 };
6203 hendricks2 261
static MenuEntryFormat_t MEF_NetSetup =         { 4<<16,      0,    112<<16 };
6207 hendricks2 262
static MenuEntryFormat_t MEF_NetSetup_Confirm = { 4<<16, 16<<16,    112<<16 };
2313 helixhorne 263
 
4496 hendricks2 264
// common menu option sets
4778 hendricks2 265
#define MAKE_MENUOPTIONSET(optionNames, optionValues, features) { optionNames, optionValues, &MMF_FuncList, &MEF_FuncList, &MF_Minifont, ARRAY_SIZE(optionNames), -1, 0, features }
266
#define MAKE_MENUOPTIONSETDYN(optionNames, optionValues, numOptions, features) { optionNames, optionValues, &MMF_FuncList, &MEF_FuncList, &MF_Minifont, numOptions, -1, 0, features }
5034 hendricks2 267
#define MAKE_MENUOPTIONSETNULL { NULL, NULL, &MMF_FuncList, &MEF_FuncList, &MF_Minifont, 0, -1, 0, 0 }
2313 helixhorne 268
 
5547 terminx 269
static char const *MEOSN_OffOn[] = { "Off", "On", };
4778 hendricks2 270
static MenuOptionSet_t MEOS_OffOn = MAKE_MENUOPTIONSET( MEOSN_OffOn, NULL, 0x3 );
5547 terminx 271
static char const *MEOSN_OnOff[] = { "On", "Off", };
4778 hendricks2 272
static MenuOptionSet_t MEOS_OnOff = MAKE_MENUOPTIONSET( MEOSN_OnOff, NULL, 0x3 );
5547 terminx 273
static char const *MEOSN_NoYes[] = { "No", "Yes", };
4778 hendricks2 274
static MenuOptionSet_t MEOS_NoYes = MAKE_MENUOPTIONSET( MEOSN_NoYes, NULL, 0x3 );
5547 terminx 275
static char const *MEOSN_YesNo[] = { "Yes", "No", };
4778 hendricks2 276
static MenuOptionSet_t MEOS_YesNo = MAKE_MENUOPTIONSET( MEOSN_YesNo, NULL, 0x3 );
2313 helixhorne 277
 
5 Plagman 278
 
4496 hendricks2 279
static char MenuGameFuncs[NUMGAMEFUNCTIONS][MAXGAMEFUNCLEN];
5547 terminx 280
static char const *MenuGameFuncNone = "  -None-";
281
static char const *MEOSN_Gamefuncs[NUMGAMEFUNCTIONS+1];
6185 hendricks2 282
static int32_t MEOSV_Gamefuncs[NUMGAMEFUNCTIONS+1];
283
static MenuOptionSet_t MEOS_Gamefuncs = MAKE_MENUOPTIONSET( MEOSN_Gamefuncs, MEOSV_Gamefuncs, 0x1 );
2313 helixhorne 284
 
5 Plagman 285
 
286
 
4496 hendricks2 287
/*
4778 hendricks2 288
MenuEntry_t is passed in arrays of pointers so that the callback function
4496 hendricks2 289
that is called when an entry is modified or activated can test equality of the current
4778 hendricks2 290
entry pointer directly against the known ones, instead of relying on an ID number.
5 Plagman 291
 
4778 hendricks2 292
That way, individual menu entries can be ifdef'd out painlessly.
4496 hendricks2 293
*/
2728 hendricks2 294
 
4688 hendricks2 295
static MenuLink_t MEO_NULL = { MENU_NULL, MA_None, };
4496 hendricks2 296
static const char* MenuCustom = "Custom";
2728 hendricks2 297
 
4778 hendricks2 298
#define MAKE_MENUSTRING(...) { NULL, __VA_ARGS__, }
4496 hendricks2 299
#define MAKE_MENUOPTION(...) { __VA_ARGS__, -1, }
300
#define MAKE_MENURANGE(...) { __VA_ARGS__, }
301
#define MAKE_MENUENTRY(...) { __VA_ARGS__, 0, 0, 0, }
2728 hendricks2 302
 
4778 hendricks2 303
 
304
#define MAKE_SPACER( EntryName, Height ) \
6198 hendricks2 305
static MenuSpacer_t MEO_ ## EntryName = { Height };
4778 hendricks2 306
 
307
MAKE_SPACER( Space2, 2<<16 ); // bigoptions
308
MAKE_SPACER( Space4, 4<<16 ); // usermap, smalloptions, anything else non-top
309
MAKE_SPACER( Space6, 6<<16 ); // videosetup
310
MAKE_SPACER( Space8, 8<<16 ); // colcorr, redslide
311
 
6198 hendricks2 312
static MenuEntry_t ME_Space2_Redfont = MAKE_MENUENTRY( NULL, &MF_Redfont, &MEF_Null, &MEO_Space2, Spacer );
313
static MenuEntry_t ME_Space4_Bluefont = MAKE_MENUENTRY( NULL, &MF_Bluefont, &MEF_Null, &MEO_Space4, Spacer );
8027 hendricks2 314
static MenuEntry_t ME_Space4_Redfont = MAKE_MENUENTRY( NULL, &MF_Redfont, &MEF_Null, &MEO_Space4, Spacer );
8569 terminx 315
#ifndef EDUKE32_RETAIL_MENU
6198 hendricks2 316
static MenuEntry_t ME_Space8_Bluefont = MAKE_MENUENTRY( NULL, &MF_Bluefont, &MEF_Null, &MEO_Space8, Spacer );
317
#endif
6415 terminx 318
static MenuEntry_t ME_Space6_Redfont = MAKE_MENUENTRY( NULL, &MF_Redfont, &MEF_Null, &MEO_Space6, Spacer );
6198 hendricks2 319
static MenuEntry_t ME_Space8_Redfont = MAKE_MENUENTRY( NULL, &MF_Redfont, &MEF_Null, &MEO_Space8, Spacer );
4778 hendricks2 320
 
321
#define MAKE_MENU_TOP_ENTRYLINK( Title, Format, EntryName, LinkID ) \
4688 hendricks2 322
static MenuLink_t MEO_ ## EntryName = { LinkID, MA_Advance, };\
4778 hendricks2 323
static MenuEntry_t ME_ ## EntryName = MAKE_MENUENTRY( Title, &MF_Redfont, &Format, &MEO_ ## EntryName, Link )
2728 hendricks2 324
 
6329 hendricks2 325
static char const s_NewGame[] = "New Game";
326
static char const s_SaveGame[] = "Save Game";
327
static char const s_LoadGame[] = "Load Game";
328
static char const s_Continue[] = "Continue";
329
static char const s_Options[] = "Options";
330
static char const s_Credits[] = "Credits";
2728 hendricks2 331
 
6329 hendricks2 332
MAKE_MENU_TOP_ENTRYLINK( s_NewGame, MEF_MainMenu, MAIN_NEWGAME, MENU_EPISODE );
8569 terminx 333
#ifdef EDUKE32_RETAIL_MENU
5000 terminx 334
MAKE_MENU_TOP_ENTRYLINK( "Resume Game", MEF_MainMenu, MAIN_RESUMEGAME, MENU_CLOSE );
335
#endif
6329 hendricks2 336
MAKE_MENU_TOP_ENTRYLINK( s_NewGame, MEF_MainMenu, MAIN_NEWGAME_INGAME, MENU_NEWVERIFY );
4688 hendricks2 337
static MenuLink_t MEO_MAIN_NEWGAME_NETWORK = { MENU_NETWORK, MA_Advance, };
6329 hendricks2 338
MAKE_MENU_TOP_ENTRYLINK( s_SaveGame, MEF_MainMenu, MAIN_SAVEGAME, MENU_SAVE );
339
MAKE_MENU_TOP_ENTRYLINK( s_LoadGame, MEF_MainMenu, MAIN_LOADGAME, MENU_LOAD );
340
MAKE_MENU_TOP_ENTRYLINK( s_Options, MEF_MainMenu, MAIN_OPTIONS, MENU_OPTIONS );
6754 terminx 341
#ifdef EDUKE32_STANDALONE
342
MAKE_MENU_TOP_ENTRYLINK( "Read me!", MEF_MainMenu, MAIN_HELP, MENU_STORY );
343
#else
344
MAKE_MENU_TOP_ENTRYLINK("Help", MEF_MainMenu, MAIN_HELP, MENU_STORY);
345
#endif
8569 terminx 346
#ifndef EDUKE32_RETAIL_MENU
6329 hendricks2 347
MAKE_MENU_TOP_ENTRYLINK( s_Credits, MEF_MainMenu, MAIN_CREDITS, MENU_CREDITS );
4682 hendricks2 348
#endif
5663 terminx 349
MAKE_MENU_TOP_ENTRYLINK( "End Game", MEF_MainMenu, MAIN_QUITTOTITLE, MENU_QUITTOTITLE );
4778 hendricks2 350
MAKE_MENU_TOP_ENTRYLINK( "Quit", MEF_MainMenu, MAIN_QUIT, MENU_QUIT );
8569 terminx 351
#ifndef EDUKE32_RETAIL_MENU
4778 hendricks2 352
MAKE_MENU_TOP_ENTRYLINK( "Quit Game", MEF_MainMenu, MAIN_QUITGAME, MENU_QUIT );
5462 hendricks2 353
#endif
2728 hendricks2 354
 
4496 hendricks2 355
static MenuEntry_t *MEL_MAIN[] = {
356
    &ME_MAIN_NEWGAME,
5068 terminx 357
    &ME_MAIN_LOADGAME,
4496 hendricks2 358
    &ME_MAIN_OPTIONS,
6466 hendricks2 359
    &ME_MAIN_HELP,
8569 terminx 360
#ifndef EDUKE32_RETAIL_MENU
5663 terminx 361
    &ME_MAIN_CREDITS,
4609 terminx 362
#endif
4496 hendricks2 363
    &ME_MAIN_QUIT,
364
};
4609 terminx 365
 
4496 hendricks2 366
static MenuEntry_t *MEL_MAIN_INGAME[] = {
8569 terminx 367
#ifdef EDUKE32_RETAIL_MENU
5000 terminx 368
    &ME_MAIN_RESUMEGAME,
369
#else
4496 hendricks2 370
    &ME_MAIN_NEWGAME_INGAME,
5000 terminx 371
#endif
4496 hendricks2 372
    &ME_MAIN_SAVEGAME,
373
    &ME_MAIN_LOADGAME,
374
    &ME_MAIN_OPTIONS,
375
    &ME_MAIN_HELP,
376
    &ME_MAIN_QUITTOTITLE,
8569 terminx 377
#ifndef EDUKE32_RETAIL_MENU
4496 hendricks2 378
    &ME_MAIN_QUITGAME,
5000 terminx 379
#endif
4496 hendricks2 380
};
2728 hendricks2 381
 
4496 hendricks2 382
// Episode and Skill will be dynamically generated after CONs are parsed
4688 hendricks2 383
static MenuLink_t MEO_EPISODE = { MENU_SKILL, MA_Advance, };
384
static MenuLink_t MEO_EPISODE_SHAREWARE = { MENU_BUYDUKE, MA_Advance, };
4778 hendricks2 385
static MenuEntry_t ME_EPISODE_TEMPLATE = MAKE_MENUENTRY( NULL, &MF_Redfont, &MEF_CenterMenu, &MEO_EPISODE, Link );
4496 hendricks2 386
static MenuEntry_t ME_EPISODE[MAXVOLUMES];
4688 hendricks2 387
static MenuLink_t MEO_EPISODE_USERMAP = { MENU_USERMAP, MA_Advance, };
4778 hendricks2 388
static MenuEntry_t ME_EPISODE_USERMAP = MAKE_MENUENTRY( "User Map", &MF_Redfont, &MEF_CenterMenu, &MEO_EPISODE_USERMAP, Link );
389
static MenuEntry_t *MEL_EPISODE[MAXVOLUMES+2]; // +2 for spacer and User Map
398 terminx 390
 
7930 hendricks2 391
static MenuLink_t MEO_NEWGAMECUSTOM_TEMPLATE = { MENU_NEWGAMECUSTOMSUB, MA_Advance, };
392
static MenuLink_t MEO_NEWGAMECUSTOM[MAXMENUGAMEPLAYENTRIES];
393
static MenuLink_t MEO_NEWGAMECUSTOMSUB_TEMPLATE = { MENU_SKILL, MA_Advance, };
394
static MenuLink_t MEO_NEWGAMECUSTOMSUB[MAXMENUGAMEPLAYENTRIES][MAXMENUGAMEPLAYENTRIES];
395
MenuEntry_t ME_NEWGAMECUSTOMENTRIES[MAXMENUGAMEPLAYENTRIES];
396
MenuEntry_t ME_NEWGAMECUSTOMSUBENTRIES[MAXMENUGAMEPLAYENTRIES][MAXMENUGAMEPLAYENTRIES];
397
static MenuEntry_t *MEL_NEWGAMECUSTOM[MAXMENUGAMEPLAYENTRIES];
398
static MenuEntry_t *MEL_NEWGAMECUSTOMSUB[MAXMENUGAMEPLAYENTRIES];
399
 
4778 hendricks2 400
static MenuEntry_t ME_SKILL_TEMPLATE = MAKE_MENUENTRY( NULL, &MF_Redfont, &MEF_CenterMenu, &MEO_NULL, Link );
4496 hendricks2 401
static MenuEntry_t ME_SKILL[MAXSKILLS];
402
static MenuEntry_t *MEL_SKILL[MAXSKILLS];
5 Plagman 403
 
8569 terminx 404
#ifdef EDUKE32_RETAIL_MENU
6742 hendricks2 405
static MenuLink_t MEO_GAMESETUP_SAVESETUP = { MENU_SAVESETUP, MA_Advance, };
406
static MenuEntry_t ME_GAMESETUP_SAVESETUP = MAKE_MENUENTRY( "Save setup", &MF_Redfont, &MEF_BigOptionsRt, &MEO_GAMESETUP_SAVESETUP, Link );
407
#endif
408
 
8569 terminx 409
#if defined STARTUP_SETUP_WINDOW && !defined EDUKE32_RETAIL_MENU
7219 terminx 410
static MenuOption_t MEO_GAMESETUP_STARTWIN = MAKE_MENUOPTION( &MF_Redfont, &MEOS_OffOn, &ud.setup.forcesetup );
4778 hendricks2 411
static MenuEntry_t ME_GAMESETUP_STARTWIN = MAKE_MENUENTRY( "Startup window:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_GAMESETUP_STARTWIN, Option );
4682 hendricks2 412
#endif
4609 terminx 413
 
6409 terminx 414
static char const *MEOSN_GAMESETUP_AIM_AUTO[] = { "Never", "Always", "Hitscan only",
6013 terminx 415
#ifdef EDUKE32_ANDROID_MENU
4688 hendricks2 416
"Extra wide"
4609 terminx 417
#endif
418
};
419
static int32_t MEOSV_GAMESETUP_AIM_AUTO[] = { 0, 1, 2,
6013 terminx 420
#ifdef EDUKE32_ANDROID_MENU
4609 terminx 421
3,
422
#endif
423
};
424
 
4778 hendricks2 425
static MenuOptionSet_t MEOS_GAMESETUP_AIM_AUTO = MAKE_MENUOPTIONSET( MEOSN_GAMESETUP_AIM_AUTO, MEOSV_GAMESETUP_AIM_AUTO, 0x2 );
426
static MenuOption_t MEO_GAMESETUP_AIM_AUTO = MAKE_MENUOPTION( &MF_Redfont, &MEOS_GAMESETUP_AIM_AUTO, &ud.config.AutoAim );
427
static MenuEntry_t ME_GAMESETUP_AIM_AUTO = MAKE_MENUENTRY( "Auto aim:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_GAMESETUP_AIM_AUTO, Option );
4609 terminx 428
 
8021 terminx 429
static MenuOption_t MEO_GAMESETUP_ALWAYS_RUN = MAKE_MENUOPTION( &MF_Redfont, &MEOS_NoYes, &ud.auto_run);
430
static MenuEntry_t ME_GAMESETUP_ALWAYS_RUN = MAKE_MENUENTRY( "Always run:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_GAMESETUP_ALWAYS_RUN, Option );
431
 
8038 hendricks2 432
static char const *MEOSN_GAMESETUP_WEAPSWITCH_PICKUP[] = { "Never", "If new", /*"If favored",*/ };
4778 hendricks2 433
static MenuOptionSet_t MEOS_GAMESETUP_WEAPSWITCH_PICKUP = MAKE_MENUOPTIONSET( MEOSN_GAMESETUP_WEAPSWITCH_PICKUP, NULL, 0x2 );
434
static MenuOption_t MEO_GAMESETUP_WEAPSWITCH_PICKUP = MAKE_MENUOPTION( &MF_Redfont, &MEOS_GAMESETUP_WEAPSWITCH_PICKUP, NULL );
435
static MenuEntry_t ME_GAMESETUP_WEAPSWITCH_PICKUP = MAKE_MENUENTRY( "Equip pickups:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_GAMESETUP_WEAPSWITCH_PICKUP, Option );
4609 terminx 436
 
5547 terminx 437
static char const *MEOSN_DemoRec[] = { "Off", "Running", };
4778 hendricks2 438
static MenuOptionSet_t MEOS_DemoRec = MAKE_MENUOPTIONSET( MEOSN_DemoRec, NULL, 0x3 );
439
static MenuOption_t MEO_GAMESETUP_DEMOREC = MAKE_MENUOPTION( &MF_Redfont, &MEOS_OffOn, &ud.m_recstat );
440
static MenuEntry_t ME_GAMESETUP_DEMOREC = MAKE_MENUENTRY( "Record demo:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_GAMESETUP_DEMOREC, Option );
4609 terminx 441
 
4496 hendricks2 442
#ifdef _WIN32
4778 hendricks2 443
static MenuOption_t MEO_GAMESETUP_UPDATES = MAKE_MENUOPTION( &MF_Redfont, &MEOS_NoYes, &ud.config.CheckForUpdates );
444
static MenuEntry_t ME_GAMESETUP_UPDATES = MAKE_MENUENTRY( "Online updates:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_GAMESETUP_UPDATES, Option );
4496 hendricks2 445
#endif
2728 hendricks2 446
 
4778 hendricks2 447
static MenuOption_t MEO_ADULTMODE = MAKE_MENUOPTION(&MF_Redfont, &MEOS_OffOn, &ud.lockout);
448
static MenuEntry_t ME_ADULTMODE = MAKE_MENUENTRY( "Parental lock:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_ADULTMODE, Option );
4688 hendricks2 449
// static MenuLink_t MEO_ADULTMODE_PASSWORD = { MENU_ADULTPASSWORD, MA_None, };
4778 hendricks2 450
// static MenuEntry_t ME_ADULTMODE_PASSWORD = MAKE_MENUENTRY( "Enter Password", &MF_Redfont, &, &MEO_ADULTMODE_PASSWORD, Link );
4609 terminx 451
 
6013 terminx 452
#ifdef EDUKE32_ANDROID_MENU
4993 terminx 453
static MenuOption_t MEO_GAMESETUP_CROUCHLOCK = MAKE_MENUOPTION(&MF_Redfont, &MEOS_OffOn, &droidinput.toggleCrouch);
454
static MenuEntry_t ME_GAMESETUP_CROUCHLOCK = MAKE_MENUENTRY("Crouch lock:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_GAMESETUP_CROUCHLOCK, Option);
455
 
456
static MenuOption_t MEO_GAMESETUP_QUICKSWITCH = MAKE_MENUOPTION(&MF_Redfont, &MEOS_OffOn, &droidinput.quickSelectWeapon);
457
static MenuEntry_t ME_GAMESETUP_QUICKSWITCH = MAKE_MENUENTRY("Quick weapon switch:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_GAMESETUP_QUICKSWITCH, Option);
5025 helixhorne 458
#endif
4993 terminx 459
 
8569 terminx 460
#if defined(EDUKE32_ANDROID_MENU) || !defined(EDUKE32_RETAIL_MENU)
5517 hendricks2 461
static MenuLink_t MEO_GAMESETUP_CHEATS = { MENU_CHEATS, MA_Advance, };
462
static MenuEntry_t ME_GAMESETUP_CHEATS = MAKE_MENUENTRY( "Cheats", &MF_Redfont, &MEF_BigOptionsRt, &MEO_GAMESETUP_CHEATS, Link );
463
 
4778 hendricks2 464
static MenuEntry_t *MEL_GAMESETUP[] = {
4850 hendricks2 465
    &ME_ADULTMODE,
8569 terminx 466
#if defined STARTUP_SETUP_WINDOW && !defined EDUKE32_RETAIL_MENU
4496 hendricks2 467
    &ME_GAMESETUP_STARTWIN,
4609 terminx 468
#endif
8023 hendricks2 469
#ifndef EDUKE32_ANDROID_MENU
4496 hendricks2 470
    &ME_GAMESETUP_DEMOREC,
471
#ifdef _WIN32
4850 hendricks2 472
    &ME_GAMESETUP_UPDATES,
4609 terminx 473
#endif
474
#endif
5517 hendricks2 475
    &ME_GAMESETUP_CHEATS,
4496 hendricks2 476
};
6411 terminx 477
#endif
2728 hendricks2 478
 
8569 terminx 479
#ifndef EDUKE32_RETAIL_MENU
6289 hendricks2 480
MAKE_MENU_TOP_ENTRYLINK( "Game Setup", MEF_OptionsMenu, OPTIONS_GAMESETUP, MENU_GAMESETUP );
6409 terminx 481
#endif
6289 hendricks2 482
MAKE_MENU_TOP_ENTRYLINK( "Sound Setup", MEF_OptionsMenu, OPTIONS_SOUNDSETUP, MENU_SOUND );
483
MAKE_MENU_TOP_ENTRYLINK( "Display Setup", MEF_OptionsMenu, OPTIONS_DISPLAYSETUP, MENU_DISPLAYSETUP );
484
MAKE_MENU_TOP_ENTRYLINK( "Player Setup", MEF_OptionsMenu, OPTIONS_PLAYERSETUP, MENU_PLAYER );
6013 terminx 485
#ifndef EDUKE32_ANDROID_MENU
6289 hendricks2 486
MAKE_MENU_TOP_ENTRYLINK( "Control Setup", MEF_OptionsMenu, OPTIONS_CONTROLS, MENU_CONTROLS );
487
 
7968 hendricks2 488
MAKE_MENU_TOP_ENTRYLINK( "Keyboard Setup", MEF_BigOptionsRtSections, OPTIONS_KEYBOARDSETUP, MENU_KEYBOARDSETUP );
489
MAKE_MENU_TOP_ENTRYLINK( "Mouse Setup", MEF_BigOptionsRtSections, OPTIONS_MOUSESETUP, MENU_MOUSESETUP );
5462 hendricks2 490
#endif
7972 hendricks2 491
MAKE_MENU_TOP_ENTRYLINK( "Gamepad Setup", MEF_BigOptionsRtSections, OPTIONS_JOYSTICKSETUP, MENU_JOYSTICKSETUP );
6013 terminx 492
#ifdef EDUKE32_ANDROID_MENU
7968 hendricks2 493
MAKE_MENU_TOP_ENTRYLINK( "Touch Setup", MEF_BigOptionsRtSections, OPTIONS_TOUCHSETUP, MENU_TOUCHSETUP );
4993 terminx 494
#endif
8569 terminx 495
#ifdef EDUKE32_RETAIL_MENU
6411 terminx 496
MAKE_MENU_TOP_ENTRYLINK("Cheats", MEF_OptionsMenu, OPTIONS_CHEATS, MENU_CHEATS);
497
#endif
2728 hendricks2 498
 
8084 terminx 499
static int32_t newresolution, newrendermode, newfullscreen, newvsync, newborderless;
5 Plagman 500
 
4496 hendricks2 501
enum resflags_t {
502
    RES_FS  = 0x1,
503
    RES_WIN = 0x2,
504
};
5 Plagman 505
 
6697 pogokeen 506
#define MAXRESOLUTIONSTRINGLENGTH 19
5 Plagman 507
 
4496 hendricks2 508
typedef struct resolution_t {
509
    int32_t xdim, ydim;
510
    int32_t flags;
511
    int32_t bppmax;
512
    char name[MAXRESOLUTIONSTRINGLENGTH];
513
} resolution_t;
2358 helixhorne 514
 
4496 hendricks2 515
resolution_t resolution[MAXVALIDMODES];
5 Plagman 516
 
5547 terminx 517
static char const *MEOSN_VIDEOSETUP_RESOLUTION[MAXVALIDMODES];
4778 hendricks2 518
static MenuOptionSet_t MEOS_VIDEOSETUP_RESOLUTION = MAKE_MENUOPTIONSETDYN( MEOSN_VIDEOSETUP_RESOLUTION, NULL, 0, 0x0 );
519
static MenuOption_t MEO_VIDEOSETUP_RESOLUTION = MAKE_MENUOPTION( &MF_Redfont, &MEOS_VIDEOSETUP_RESOLUTION, &newresolution );
520
static MenuEntry_t ME_VIDEOSETUP_RESOLUTION = MAKE_MENUENTRY( "Resolution:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_VIDEOSETUP_RESOLUTION, Option );
5 Plagman 521
 
4496 hendricks2 522
#ifdef USE_OPENGL
523
#ifdef POLYMER
5547 terminx 524
static char const *MEOSN_VIDEOSETUP_RENDERER[] = { "Classic", "Polymost", "Polymer", };
4496 hendricks2 525
static int32_t MEOSV_VIDEOSETUP_RENDERER[] = { REND_CLASSIC, REND_POLYMOST, REND_POLYMER, };
526
#else
5547 terminx 527
static char const *MEOSN_VIDEOSETUP_RENDERER[] = { "Classic", "OpenGL", };
4496 hendricks2 528
static int32_t MEOSV_VIDEOSETUP_RENDERER[] = { REND_CLASSIC, REND_POLYMOST, };
529
#endif
5 Plagman 530
 
4778 hendricks2 531
static MenuOptionSet_t MEOS_VIDEOSETUP_RENDERER = MAKE_MENUOPTIONSET( MEOSN_VIDEOSETUP_RENDERER, MEOSV_VIDEOSETUP_RENDERER, 0x2 );
5 Plagman 532
 
4778 hendricks2 533
static MenuOption_t MEO_VIDEOSETUP_RENDERER = MAKE_MENUOPTION( &MF_Redfont, &MEOS_VIDEOSETUP_RENDERER, &newrendermode );
534
static MenuEntry_t ME_VIDEOSETUP_RENDERER = MAKE_MENUENTRY( "Renderer:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_VIDEOSETUP_RENDERER, Option );
4823 hendricks2 535
#endif
536
 
8084 terminx 537
static MenuOption_t MEO_VIDEOSETUP_FULLSCREEN = MAKE_MENUOPTION( &MF_Redfont, &MEOS_YesNo, &newfullscreen );
538
static MenuEntry_t ME_VIDEOSETUP_FULLSCREEN = MAKE_MENUENTRY( "Windowed:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_VIDEOSETUP_FULLSCREEN, Option );
5475 terminx 539
 
8084 terminx 540
static char const *MEOSN_VIDEOSETUP_BORDERLESS [] = { "No", "Yes", "Auto", };
541
static int32_t MEOSV_VIDEOSETUP_BORDERLESS [] = { 0, 1, 2, };
542
static MenuOptionSet_t MEOS_VIDEOSETUP_BORDERLESS = MAKE_MENUOPTIONSET(MEOSN_VIDEOSETUP_BORDERLESS, MEOSV_VIDEOSETUP_BORDERLESS, 0x2);
543
static MenuOption_t MEO_VIDEOSETUP_BORDERLESS = MAKE_MENUOPTION(&MF_Redfont, &MEOS_VIDEOSETUP_BORDERLESS, &newborderless);
544
static MenuEntry_t ME_VIDEOSETUP_BORDERLESS = MAKE_MENUENTRY("Borderless:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_VIDEOSETUP_BORDERLESS, Option);
5475 terminx 545
 
8612 terminx 546
static char const *MEOSN_VIDEOSETUP_VSYNC[] = { "Adaptive", "Off", "On",
547
#if defined _WIN32 && SDL_MAJOR_VERSION == 2
548
                                                "KMT",
549
#endif
550
};
551
 
552
static int32_t MEOSV_VIDEOSETUP_VSYNC[] = { -1, 0, 1,
553
#if defined _WIN32 && SDL_MAJOR_VERSION == 2
554
                                             2,
555
#endif
556
};
557
 
5475 terminx 558
static MenuOptionSet_t MEOS_VIDEOSETUP_VSYNC = MAKE_MENUOPTIONSET(MEOSN_VIDEOSETUP_VSYNC, MEOSV_VIDEOSETUP_VSYNC, 0x2);
559
static MenuOption_t MEO_VIDEOSETUP_VSYNC = MAKE_MENUOPTION(&MF_Redfont, &MEOS_VIDEOSETUP_VSYNC, &newvsync);
560
static MenuEntry_t ME_VIDEOSETUP_VSYNC = MAKE_MENUENTRY("VSync:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_VIDEOSETUP_VSYNC, Option);
561
 
8084 terminx 562
 
563
 
8613 terminx 564
static char const *MEOSN_VIDEOSETUP_FRAMELIMIT [] = { "Auto", "None", "30 fps", "60 fps", "75 fps", "100 fps", "120 fps", "144 fps", "165 fps", "240 fps" };
565
static int32_t MEOSV_VIDEOSETUP_FRAMELIMIT [] = { -1, 0, 30, 60, 75, 100, 120, 144, 165, 240 };
7287 terminx 566
static MenuOptionSet_t MEOS_VIDEOSETUP_FRAMELIMIT = MAKE_MENUOPTIONSET(MEOSN_VIDEOSETUP_FRAMELIMIT, MEOSV_VIDEOSETUP_FRAMELIMIT, 0x0);
5922 terminx 567
static MenuOption_t MEO_VIDEOSETUP_FRAMELIMIT= MAKE_MENUOPTION(&MF_Redfont, &MEOS_VIDEOSETUP_FRAMELIMIT, &r_maxfps);
568
static MenuEntry_t ME_VIDEOSETUP_FRAMELIMIT = MAKE_MENUENTRY("Framerate limit:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_VIDEOSETUP_FRAMELIMIT, Option);
569
 
7287 terminx 570
static MenuRangeInt32_t MEO_VIDEOSETUP_FRAMELIMITOFFSET = MAKE_MENURANGE( &r_maxfpsoffset, &MF_Redfont, -10, 10, 0, 21, 1 );
571
static MenuEntry_t ME_VIDEOSETUP_FRAMELIMITOFFSET = MAKE_MENUENTRY( "FPS offset:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_VIDEOSETUP_FRAMELIMITOFFSET, RangeInt32 );
5922 terminx 572
 
4778 hendricks2 573
static MenuEntry_t ME_VIDEOSETUP_APPLY = MAKE_MENUENTRY( "Apply Changes", &MF_Redfont, &MEF_BigOptions_Apply, &MEO_NULL, Link );
4609 terminx 574
 
575
 
4823 hendricks2 576
static MenuLink_t MEO_DISPLAYSETUP_COLORCORR = { MENU_COLCORR, MA_Advance, };
4856 hendricks2 577
static MenuEntry_t ME_DISPLAYSETUP_COLORCORR = MAKE_MENUENTRY( "Color Correction", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_COLORCORR, Link );
5884 terminx 578
 
579
 
7287 terminx 580
static char const *MEOSN_DISPLAYSETUP_UPSCALING[] = { "None", "2x" };
581
static int32_t MEOSV_DISPLAYSETUP_UPSCALING[] = { 1, 2 };
6939 pogokeen 582
static MenuOptionSet_t MEOS_DISPLAYSETUP_UPSCALING = MAKE_MENUOPTIONSET( MEOSN_DISPLAYSETUP_UPSCALING, MEOSV_DISPLAYSETUP_UPSCALING, 0x0 );
583
static MenuOption_t MEO_DISPLAYSETUP_UPSCALING = MAKE_MENUOPTION( &MF_Redfont, &MEOS_DISPLAYSETUP_UPSCALING, &ud.detail );
584
static MenuEntry_t ME_DISPLAYSETUP_UPSCALING = MAKE_MENUENTRY( "Upscaling:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_UPSCALING, Option );
4609 terminx 585
 
586
 
6013 terminx 587
#ifndef EDUKE32_ANDROID_MENU
4609 terminx 588
static MenuOption_t MEO_DISPLAYSETUP_ASPECTRATIO = MAKE_MENUOPTION(&MF_Redfont, &MEOS_OffOn, &r_usenewaspect);
4823 hendricks2 589
static MenuEntry_t ME_DISPLAYSETUP_ASPECTRATIO = MAKE_MENUENTRY( "Widescreen:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_ASPECTRATIO, Option );
5652 terminx 590
#endif
5 Plagman 591
 
7961 hendricks2 592
static MenuOption_t MEO_DISPLAYSETUP_VOXELS = MAKE_MENUOPTION(&MF_Redfont, &MEOS_OffOn, &usevoxels);
593
static MenuEntry_t ME_DISPLAYSETUP_VOXELS = MAKE_MENUENTRY( "Voxels:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_VOXELS, Option );
594
 
7348 terminx 595
static MenuRangeInt32_t MEO_DISPLAYSETUP_FOV = MAKE_MENURANGE( &ud.fov, &MF_Redfont, 70, 120, 0, 11, 1 );
7329 terminx 596
static MenuEntry_t ME_DISPLAYSETUP_FOV = MAKE_MENUENTRY( "FOV:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_FOV, RangeInt32 );
597
 
598
 
4609 terminx 599
#ifdef USE_OPENGL
6940 pogokeen 600
# if !(defined EDUKE32_STANDALONE) || defined POLYMER
6822 pogokeen 601
//POGOTODO: allow filtering again in standalone once indexed colour textures support filtering
7420 terminx 602
#ifdef TEXFILTER_MENU_OPTIONS
5547 terminx 603
static char const *MEOSN_DISPLAYSETUP_TEXFILTER[] = { "Classic", "Filtered" };
5878 hendricks2 604
static int32_t MEOSV_DISPLAYSETUP_TEXFILTER[] = { TEXFILTER_OFF, TEXFILTER_ON };
605
static MenuOptionSet_t MEOS_DISPLAYSETUP_TEXFILTER = MAKE_MENUOPTIONSET( MEOSN_DISPLAYSETUP_TEXFILTER, MEOSV_DISPLAYSETUP_TEXFILTER, 0x2 );
606
static MenuOption_t MEO_DISPLAYSETUP_TEXFILTER = MAKE_MENUOPTION( &MF_Redfont, &MEOS_DISPLAYSETUP_TEXFILTER, &gltexfiltermode );
4823 hendricks2 607
static MenuEntry_t ME_DISPLAYSETUP_TEXFILTER = MAKE_MENUENTRY( "Texture Mode:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_TEXFILTER, Option );
4609 terminx 608
 
6194 hendricks2 609
static char const *MEOSN_DISPLAYSETUP_ANISOTROPY[] = { "Max", "None", "2x", "4x", "8x", "16x", };
610
static int32_t MEOSV_DISPLAYSETUP_ANISOTROPY[] = { 0, 1, 2, 4, 8, 16, };
4778 hendricks2 611
static MenuOptionSet_t MEOS_DISPLAYSETUP_ANISOTROPY = MAKE_MENUOPTIONSET( MEOSN_DISPLAYSETUP_ANISOTROPY, MEOSV_DISPLAYSETUP_ANISOTROPY, 0x0 );
4609 terminx 612
static MenuOption_t MEO_DISPLAYSETUP_ANISOTROPY = MAKE_MENUOPTION(&MF_Redfont, &MEOS_DISPLAYSETUP_ANISOTROPY, &glanisotropy);
4823 hendricks2 613
static MenuEntry_t ME_DISPLAYSETUP_ANISOTROPY = MAKE_MENUENTRY( "Anisotropy:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_ANISOTROPY, Option );
7420 terminx 614
#endif
6940 pogokeen 615
# endif
4609 terminx 616
 
6940 pogokeen 617
# ifdef EDUKE32_ANDROID_MENU
4993 terminx 618
static MenuOption_t MEO_DISPLAYSETUP_HIDEDPAD = MAKE_MENUOPTION(&MF_Redfont, &MEOS_NoYes, &droidinput.hideStick);
6194 hendricks2 619
static MenuEntry_t ME_DISPLAYSETUP_HIDEDPAD = MAKE_MENUENTRY("Hide touch D-pad:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_HIDEDPAD, Option);
4993 terminx 620
 
621
static MenuRangeFloat_t MEO_DISPLAYSETUP_TOUCHALPHA = MAKE_MENURANGE(&droidinput.gameControlsAlpha, &MF_Redfont, 0, 1, 0, 16, 2);
622
static MenuEntry_t ME_DISPLAYSETUP_TOUCHALPHA = MAKE_MENUENTRY("UI opacity:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_TOUCHALPHA, RangeFloat);
6940 pogokeen 623
# endif
4609 terminx 624
 
4993 terminx 625
#endif
626
 
6522 hendricks2 627
static char const s_Scale[] = "Scale:";
628
 
4609 terminx 629
static MenuOption_t MEO_SCREENSETUP_CROSSHAIR = MAKE_MENUOPTION(&MF_Redfont, &MEOS_OffOn, &ud.crosshair);
6289 hendricks2 630
static MenuEntry_t ME_SCREENSETUP_CROSSHAIR = MAKE_MENUENTRY( "Crosshair:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SCREENSETUP_CROSSHAIR, Option );
4778 hendricks2 631
static MenuRangeInt32_t MEO_SCREENSETUP_CROSSHAIRSIZE = MAKE_MENURANGE( &ud.crosshairscale, &MF_Redfont, 25, 100, 0, 16, 2 );
6522 hendricks2 632
static MenuEntry_t ME_SCREENSETUP_CROSSHAIRSIZE = MAKE_MENUENTRY( s_Scale, &MF_Redfont, &MEF_BigOptions_Apply, &MEO_SCREENSETUP_CROSSHAIRSIZE, RangeInt32 );
4609 terminx 633
 
634
static int32_t vpsize;
6587 hendricks2 635
static MenuRangeInt32_t MEO_SCREENSETUP_SCREENSIZE = MAKE_MENURANGE( &vpsize, &MF_Redfont, 0, 0, 0, 1, EnforceIntervals );
7984 hendricks2 636
static MenuOption_t MEO_SCREENSETUP_SCREENSIZE_TWO = MAKE_MENUOPTION( &MF_Redfont, &MEOS_OffOn, &vpsize );
6650 hendricks2 637
static MenuEntry_t ME_SCREENSETUP_SCREENSIZE = MAKE_MENUENTRY( "Status bar:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SCREENSETUP_SCREENSIZE, RangeInt32 );
5054 hendricks2 638
static MenuRangeInt32_t MEO_SCREENSETUP_TEXTSIZE = MAKE_MENURANGE( &ud.textscale, &MF_Redfont, 100, 400, 0, 16, 2 );
6522 hendricks2 639
static MenuEntry_t ME_SCREENSETUP_TEXTSIZE = MAKE_MENUENTRY( s_Scale, &MF_Redfont, &MEF_BigOptions_Apply, &MEO_SCREENSETUP_TEXTSIZE, RangeInt32 );
4609 terminx 640
static MenuOption_t MEO_SCREENSETUP_LEVELSTATS = MAKE_MENUOPTION(&MF_Redfont, &MEOS_OffOn, &ud.levelstats);
6289 hendricks2 641
static MenuEntry_t ME_SCREENSETUP_LEVELSTATS = MAKE_MENUENTRY( "Level stats:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SCREENSETUP_LEVELSTATS, Option );
4609 terminx 642
 
643
 
644
static MenuOption_t MEO_SCREENSETUP_SHOWPICKUPMESSAGES = MAKE_MENUOPTION(&MF_Redfont, &MEOS_OffOn, &ud.fta_on);
6289 hendricks2 645
static MenuEntry_t ME_SCREENSETUP_SHOWPICKUPMESSAGES = MAKE_MENUENTRY( "Game messages:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SCREENSETUP_SHOWPICKUPMESSAGES, Option );
4609 terminx 646
 
647
 
648
 
6588 hendricks2 649
#ifdef EDUKE32_ANDROID_MENU
650
static char const *MEOSN_SCREENSETUP_STATUSBARONTOP[] = { "Bottom", "Top" };
6680 hendricks2 651
static int32_t MEOSV_SCREENSETUP_STATUSBARONTOP[] = { 0, 1 };
6588 hendricks2 652
static MenuOptionSet_t MEOS_SCREENSETUP_STATUSBARONTOP = MAKE_MENUOPTIONSET( MEOSN_SCREENSETUP_STATUSBARONTOP, MEOSV_SCREENSETUP_STATUSBARONTOP, 0x2 );
653
static MenuOption_t MEO_SCREENSETUP_STATUSBARONTOP = MAKE_MENUOPTION(&MF_Redfont, &MEOS_SCREENSETUP_STATUSBARONTOP, &ud.hudontop);
654
static MenuEntry_t ME_SCREENSETUP_STATUSBARONTOP = MAKE_MENUENTRY( "Status bar:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SCREENSETUP_STATUSBARONTOP, Option );
655
#endif
656
 
8071 terminx 657
static MenuRangeInt32_t MEO_SCREENSETUP_SBARSIZE = MAKE_MENURANGE( &ud.statusbarscale, &MF_Redfont, 50, 100, 0, 10, 2 );
6522 hendricks2 658
static MenuEntry_t ME_SCREENSETUP_SBARSIZE = MAKE_MENUENTRY( s_Scale, &MF_Redfont, &MEF_BigOptions_Apply, &MEO_SCREENSETUP_SBARSIZE, RangeInt32 );
4609 terminx 659
 
660
 
4688 hendricks2 661
static MenuLink_t MEO_DISPLAYSETUP_SCREENSETUP = { MENU_SCREENSETUP, MA_Advance, };
6289 hendricks2 662
static MenuEntry_t ME_DISPLAYSETUP_SCREENSETUP = MAKE_MENUENTRY( "HUD setup", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_SCREENSETUP, Link );
4609 terminx 663
 
664
 
8569 terminx 665
#ifndef EDUKE32_RETAIL_MENU
4823 hendricks2 666
#ifdef USE_OPENGL
5408 terminx 667
static MenuLink_t MEO_DISPLAYSETUP_ADVANCED_GL_POLYMOST = { MENU_POLYMOST, MA_Advance, };
668
static MenuEntry_t ME_DISPLAYSETUP_ADVANCED_GL_POLYMOST = MAKE_MENUENTRY( "Polymost setup", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_ADVANCED_GL_POLYMOST, Link );
669
 
670
#ifdef POLYMER
6061 hendricks2 671
static MenuLink_t MEO_DISPLAYSETUP_ADVANCED_GL_POLYMER = { MENU_POLYMER, MA_Advance, };
5408 terminx 672
static MenuEntry_t ME_DISPLAYSETUP_ADVANCED_GL_POLYMER = MAKE_MENUENTRY("Polymer setup", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_ADVANCED_GL_POLYMER, Link);
4823 hendricks2 673
#endif
5408 terminx 674
#endif
6013 terminx 675
#endif
4609 terminx 676
 
6013 terminx 677
#ifndef EDUKE32_ANDROID_MENU
4688 hendricks2 678
static MenuLink_t MEO_DISPLAYSETUP_VIDEOSETUP = { MENU_VIDEOSETUP, MA_Advance, };
4856 hendricks2 679
static MenuEntry_t ME_DISPLAYSETUP_VIDEOSETUP = MAKE_MENUENTRY( "Video mode", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_VIDEOSETUP, Link );
4682 hendricks2 680
#endif
4609 terminx 681
 
5084 hendricks2 682
 
683
static MenuLink_t MEO_ENTERCHEAT = { MENU_CHEATENTRY, MA_None, };
684
static MenuEntry_t ME_ENTERCHEAT = MAKE_MENUENTRY( "Enter Cheat Code", &MF_Redfont, &MEF_BigCheats, &MEO_ENTERCHEAT, Link );
685
 
686
static MenuLink_t MEO_CHEAT_WARP = { MENU_CHEAT_WARP, MA_None, };
687
static MenuLink_t MEO_CHEAT_SKILL = { MENU_CHEAT_SKILL, MA_None, };
7895 hendricks2 688
// KEEPINSYNC cheats.h: enum CheatCodeFunctions
689
// KEEPINSYNC cheats.cpp: uint8_t CheatFunctionIDs[]
5084 hendricks2 690
#define MAKE_MENUCHEAT( Name ) MAKE_MENUENTRY( Name, &MF_Bluefont, &MEF_Cheats, &MEO_NULL, Link )
691
static MenuEntry_t ME_CheatCodes[] = {
7895 hendricks2 692
    MAKE_MENUCHEAT( CheatDescriptions[CHEAT_CASHMAN] ),
693
    MAKE_MENUCHEAT( CheatDescriptions[CHEAT_CORNHOLIO] ),
694
    MAKE_MENUCHEAT( CheatDescriptions[CHEAT_STUFF] ),
695
    MAKE_MENUCHEAT( CheatDescriptions[CHEAT_WEAPONS] ),
696
    MAKE_MENUCHEAT( CheatDescriptions[CHEAT_ITEMS] ),
697
    MAKE_MENUCHEAT( CheatDescriptions[CHEAT_INVENTORY] ),
698
    MAKE_MENUCHEAT( CheatDescriptions[CHEAT_KEYS] ),
699
    MAKE_MENUCHEAT( CheatDescriptions[CHEAT_HYPER] ),
700
    MAKE_MENUCHEAT( CheatDescriptions[CHEAT_VIEW] ),
701
    MAKE_MENUCHEAT( CheatDescriptions[CHEAT_SHOWMAP] ),
702
    MAKE_MENUCHEAT( CheatDescriptions[CHEAT_UNLOCK] ),
703
    MAKE_MENUCHEAT( CheatDescriptions[CHEAT_CLIP] ),
704
    MAKE_MENUENTRY( CheatDescriptions[CHEAT_SCOTTY], &MF_Bluefont, &MEF_Cheats, &MEO_CHEAT_WARP, Link ),
705
    MAKE_MENUENTRY( CheatDescriptions[CHEAT_SKILL], &MF_Bluefont, &MEF_Cheats, &MEO_CHEAT_SKILL, Link ),
706
    MAKE_MENUCHEAT( CheatDescriptions[CHEAT_MONSTERS] ),
707
    MAKE_MENUCHEAT( CheatDescriptions[CHEAT_RATE] ),
708
    MAKE_MENUCHEAT( CheatDescriptions[CHEAT_BETA] ),
709
    MAKE_MENUCHEAT( CheatDescriptions[CHEAT_TODD] ),
710
    MAKE_MENUCHEAT( CheatDescriptions[CHEAT_ALLEN] ),
711
    MAKE_MENUCHEAT( CheatDescriptions[CHEAT_COORDS] ),
712
    MAKE_MENUCHEAT( CheatDescriptions[CHEAT_DEBUG] ),
5084 hendricks2 713
};
714
 
4496 hendricks2 715
static MenuEntry_t *MEL_OPTIONS[] = {
8569 terminx 716
#ifndef EDUKE32_RETAIL_MENU
4496 hendricks2 717
    &ME_OPTIONS_GAMESETUP,
6409 terminx 718
#endif
6411 terminx 719
    &ME_OPTIONS_DISPLAYSETUP,
4496 hendricks2 720
    &ME_OPTIONS_SOUNDSETUP,
6013 terminx 721
#ifndef EDUKE32_ANDROID_MENU
8569 terminx 722
#ifndef EDUKE32_RETAIL_MENU
4496 hendricks2 723
    &ME_OPTIONS_PLAYERSETUP,
6013 terminx 724
#endif
4993 terminx 725
    &ME_OPTIONS_CONTROLS,
726
#else
5084 hendricks2 727
    &ME_OPTIONS_TOUCHSETUP,
4609 terminx 728
#endif
8569 terminx 729
#ifdef EDUKE32_RETAIL_MENU
6742 hendricks2 730
    &ME_GAMESETUP_SAVESETUP,
6411 terminx 731
    &ME_OPTIONS_CHEATS
6409 terminx 732
#endif
4496 hendricks2 733
};
5 Plagman 734
 
4609 terminx 735
static MenuEntry_t *MEL_CONTROLS[] = {
6013 terminx 736
#ifndef EDUKE32_ANDROID_MENU
4850 hendricks2 737
    &ME_OPTIONS_KEYBOARDSETUP,
738
    &ME_OPTIONS_MOUSESETUP,
739
    &ME_OPTIONS_JOYSTICKSETUP,
4993 terminx 740
#else
7968 hendricks2 741
    &ME_OPTIONS_TOUCHSETUP,
4993 terminx 742
#endif
7968 hendricks2 743
    &ME_Space6_Redfont,
7959 hendricks2 744
    &ME_GAMESETUP_AIM_AUTO,
8021 terminx 745
    &ME_GAMESETUP_ALWAYS_RUN,
8023 hendricks2 746
    &ME_GAMESETUP_WEAPSWITCH_PICKUP,
747
#ifdef EDUKE32_ANDROID_MENU
748
    &ME_GAMESETUP_QUICKSWITCH,
749
    &ME_GAMESETUP_CROUCHLOCK,
750
#endif
4609 terminx 751
};
752
 
5084 hendricks2 753
static MenuEntry_t *MEL_CHEATS[ARRAY_SIZE(ME_CheatCodes)+1] = {
754
    &ME_ENTERCHEAT,
755
};
4609 terminx 756
 
4778 hendricks2 757
static MenuEntry_t *MEL_VIDEOSETUP[] = {
4496 hendricks2 758
    &ME_VIDEOSETUP_RESOLUTION,
4823 hendricks2 759
#ifdef USE_OPENGL
4496 hendricks2 760
    &ME_VIDEOSETUP_RENDERER,
4823 hendricks2 761
#endif
4496 hendricks2 762
    &ME_VIDEOSETUP_FULLSCREEN,
8084 terminx 763
    &ME_VIDEOSETUP_BORDERLESS,
5475 terminx 764
    &ME_VIDEOSETUP_VSYNC,
5922 terminx 765
    &ME_VIDEOSETUP_FRAMELIMIT,
7287 terminx 766
    &ME_VIDEOSETUP_FRAMELIMITOFFSET,
8027 hendricks2 767
    &ME_Space4_Redfont,
4496 hendricks2 768
    &ME_VIDEOSETUP_APPLY,
769
};
4609 terminx 770
static MenuEntry_t *MEL_DISPLAYSETUP[] = {
771
    &ME_DISPLAYSETUP_SCREENSETUP,
772
    &ME_DISPLAYSETUP_COLORCORR,
6013 terminx 773
#ifndef EDUKE32_ANDROID_MENU
4850 hendricks2 774
    &ME_DISPLAYSETUP_VIDEOSETUP,
5652 terminx 775
    &ME_DISPLAYSETUP_ASPECTRATIO,
7961 hendricks2 776
    &ME_DISPLAYSETUP_VOXELS,
7329 terminx 777
    &ME_DISPLAYSETUP_FOV,
4609 terminx 778
#endif
6939 pogokeen 779
    &ME_DISPLAYSETUP_UPSCALING,
4496 hendricks2 780
};
4609 terminx 781
 
4496 hendricks2 782
#ifdef USE_OPENGL
4609 terminx 783
static MenuEntry_t *MEL_DISPLAYSETUP_GL[] = {
4850 hendricks2 784
    &ME_DISPLAYSETUP_SCREENSETUP,
4609 terminx 785
    &ME_DISPLAYSETUP_COLORCORR,
6013 terminx 786
#ifndef EDUKE32_ANDROID_MENU
4850 hendricks2 787
    &ME_DISPLAYSETUP_VIDEOSETUP,
5652 terminx 788
    &ME_DISPLAYSETUP_ASPECTRATIO,
7961 hendricks2 789
    &ME_DISPLAYSETUP_VOXELS,
7329 terminx 790
    &ME_DISPLAYSETUP_FOV,
4609 terminx 791
#endif
6940 pogokeen 792
#ifndef EDUKE32_STANDALONE
7420 terminx 793
# ifdef TEXFILTER_MENU_OPTIONS
4850 hendricks2 794
    &ME_DISPLAYSETUP_TEXFILTER,
7420 terminx 795
# endif
6940 pogokeen 796
#endif
6013 terminx 797
#ifdef EDUKE32_ANDROID_MENU
4993 terminx 798
    &ME_DISPLAYSETUP_HIDEDPAD,
799
    &ME_DISPLAYSETUP_TOUCHALPHA,
6013 terminx 800
#else
6940 pogokeen 801
# ifndef EDUKE32_STANDALONE
7420 terminx 802
#  ifdef TEXFILTER_MENU_OPTIONS
6013 terminx 803
    &ME_DISPLAYSETUP_ANISOTROPY,
7420 terminx 804
#  endif
6940 pogokeen 805
# endif
8569 terminx 806
# ifndef EDUKE32_RETAIL_MENU
5408 terminx 807
    &ME_DISPLAYSETUP_ADVANCED_GL_POLYMOST,
6940 pogokeen 808
# endif
4609 terminx 809
#endif
4496 hendricks2 810
};
4609 terminx 811
 
812
#ifdef POLYMER
813
static MenuEntry_t *MEL_DISPLAYSETUP_GL_POLYMER[] = {
4850 hendricks2 814
    &ME_DISPLAYSETUP_SCREENSETUP,
815
    &ME_DISPLAYSETUP_COLORCORR,
6013 terminx 816
#ifndef EDUKE32_ANDROID_MENU
4850 hendricks2 817
    &ME_DISPLAYSETUP_VIDEOSETUP,
7329 terminx 818
    &ME_DISPLAYSETUP_FOV,
7961 hendricks2 819
    &ME_DISPLAYSETUP_VOXELS,
4496 hendricks2 820
#endif
7420 terminx 821
#ifdef TEXFILTER_MENU_OPTIONS
4850 hendricks2 822
    &ME_DISPLAYSETUP_TEXFILTER,
823
    &ME_DISPLAYSETUP_ANISOTROPY,
7420 terminx 824
#endif
8569 terminx 825
#ifndef EDUKE32_RETAIL_MENU
5408 terminx 826
    &ME_DISPLAYSETUP_ADVANCED_GL_POLYMER,
4609 terminx 827
#endif
828
};
5 Plagman 829
 
4609 terminx 830
#endif
831
#endif
832
 
833
 
834
 
8303 hendricks2 835
static char const MenuKeyNone[] = "  -";
5547 terminx 836
static char const *MEOSN_Keys[NUMKEYS];
5 Plagman 837
 
6613 hendricks2 838
static MenuCustom2Col_t MEO_KEYBOARDSETUPFUNCS_TEMPLATE = { { NULL, NULL, }, MEOSN_Keys, &MF_Minifont, NUMKEYS, 54<<16, 0 };
4496 hendricks2 839
static MenuCustom2Col_t MEO_KEYBOARDSETUPFUNCS[NUMGAMEFUNCTIONS];
6680 hendricks2 840
static MenuEntry_t ME_KEYBOARDSETUPFUNCS_TEMPLATE = MAKE_MENUENTRY( NULL, &MF_Minifont, &MEF_KBFuncList, &MEO_KEYBOARDSETUPFUNCS_TEMPLATE, Custom2Col );
4496 hendricks2 841
static MenuEntry_t ME_KEYBOARDSETUPFUNCS[NUMGAMEFUNCTIONS];
842
static MenuEntry_t *MEL_KEYBOARDSETUPFUNCS[NUMGAMEFUNCTIONS];
5 Plagman 843
 
4823 hendricks2 844
static MenuLink_t MEO_KEYBOARDSETUP_KEYS = { MENU_KEYBOARDKEYS, MA_Advance, };
4778 hendricks2 845
static MenuEntry_t ME_KEYBOARDSETUP_KEYS = MAKE_MENUENTRY( "Configure Keys", &MF_Redfont, &MEF_CenterMenu, &MEO_KEYBOARDSETUP_KEYS, Link );
7971 hendricks2 846
static MenuLink_t MEO_KEYBOARDSETUP_RESET = { MENU_KEYSRESETVERIFY, MA_None, };
847
static MenuEntry_t ME_KEYBOARDSETUP_RESET = MAKE_MENUENTRY( "Reset To Defaults", &MF_Redfont, &MEF_CenterMenu, &MEO_KEYBOARDSETUP_RESET, Link );
848
static MenuLink_t MEO_KEYBOARDSETUP_RESETCLASSIC = { MENU_KEYSCLASSICVERIFY, MA_None, };
849
static MenuEntry_t ME_KEYBOARDSETUP_RESETCLASSIC = MAKE_MENUENTRY( "Reset To Classic", &MF_Redfont, &MEF_CenterMenu, &MEO_KEYBOARDSETUP_RESETCLASSIC, Link );
5 Plagman 850
 
4496 hendricks2 851
static MenuEntry_t *MEL_KEYBOARDSETUP[] = {
852
    &ME_KEYBOARDSETUP_KEYS,
853
    &ME_KEYBOARDSETUP_RESET,
854
    &ME_KEYBOARDSETUP_RESETCLASSIC,
855
};
5 Plagman 856
 
857
 
4496 hendricks2 858
// There is no better way to do this than manually.
4399 hendricks2 859
 
4496 hendricks2 860
#define MENUMOUSEFUNCTIONS 12
78 terminx 861
 
5547 terminx 862
static char const *MenuMouseNames[MENUMOUSEFUNCTIONS] = {
4496 hendricks2 863
    "Button 1",
864
    "Double Button 1",
865
    "Button 2",
866
    "Double Button 2",
867
    "Button 3",
868
    "Double Button 3",
5 Plagman 869
 
4496 hendricks2 870
    "Wheel Up",
871
    "Wheel Down",
5 Plagman 872
 
4496 hendricks2 873
    "Button 4",
874
    "Double Button 4",
875
    "Button 5",
876
    "Double Button 5",
877
};
878
static int32_t MenuMouseDataIndex[MENUMOUSEFUNCTIONS][2] = {
879
    { 0, 0, },
880
    { 0, 1, },
881
    { 1, 0, },
882
    { 1, 1, },
883
    { 2, 0, },
884
    { 2, 1, },
1677 terminx 885
 
4496 hendricks2 886
    // note the mouse wheel
887
    { 4, 0, },
888
    { 5, 0, },
5 Plagman 889
 
4496 hendricks2 890
    { 3, 0, },
891
    { 3, 1, },
892
    { 6, 0, },
893
    { 6, 1, },
894
};
3084 terminx 895
 
4496 hendricks2 896
static MenuOption_t MEO_MOUSEJOYSETUPBTNS_TEMPLATE = MAKE_MENUOPTION( &MF_Minifont, &MEOS_Gamefuncs, NULL );
897
static MenuOption_t MEO_MOUSESETUPBTNS[MENUMOUSEFUNCTIONS];
4778 hendricks2 898
static MenuEntry_t ME_MOUSEJOYSETUPBTNS_TEMPLATE = MAKE_MENUENTRY( NULL, &MF_Minifont, &MEF_FuncList, NULL, Option );
4496 hendricks2 899
static MenuEntry_t ME_MOUSESETUPBTNS[MENUMOUSEFUNCTIONS];
900
static MenuEntry_t *MEL_MOUSESETUPBTNS[MENUMOUSEFUNCTIONS];
3084 terminx 901
 
4823 hendricks2 902
static MenuLink_t MEO_MOUSESETUP_BTNS = { MENU_MOUSEBTNS, MA_Advance, };
4778 hendricks2 903
static MenuEntry_t ME_MOUSESETUP_BTNS = MAKE_MENUENTRY( "Button assignment", &MF_Redfont, &MEF_BigOptionsRt, &MEO_MOUSESETUP_BTNS, Link );
8538 terminx 904
static MenuRangeFloat_t MEO_MOUSESETUP_SENSITIVITY = MAKE_MENURANGE( &CONTROL_MouseSensitivity, &MF_Redfont, .1f, 10.f, 0.f, 100, 1 );
4778 hendricks2 905
static MenuEntry_t ME_MOUSESETUP_SENSITIVITY = MAKE_MENUENTRY( "Sensitivity:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_MOUSESETUP_SENSITIVITY, RangeFloat );
6022 terminx 906
 
8569 terminx 907
#ifndef EDUKE32_RETAIL_MENU
6061 hendricks2 908
static char const *MEOSN_MOUSESETUP_AIM_TYPE [] = { "Toggle", "Hold" };
6022 terminx 909
static MenuOptionSet_t MEOS_MOUSESETUP_AIM_TYPE = MAKE_MENUOPTIONSET(MEOSN_MOUSESETUP_AIM_TYPE, NULL, 0x2);
910
static MenuOption_t MEO_MOUSESETUP_MOUSEAIMINGTYPE = MAKE_MENUOPTION(&MF_Redfont, &MEOS_MOUSESETUP_AIM_TYPE, &ud.mouseaiming);
911
static MenuEntry_t ME_MOUSESETUP_MOUSEAIMINGTYPE = MAKE_MENUENTRY("Aiming type:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_MOUSESETUP_MOUSEAIMINGTYPE, Option);
4778 hendricks2 912
static MenuOption_t MEO_MOUSESETUP_MOUSEAIMING = MAKE_MENUOPTION( &MF_Redfont, &MEOS_NoYes, &g_myAimMode );
913
static MenuEntry_t ME_MOUSESETUP_MOUSEAIMING = MAKE_MENUENTRY( "Vertical aiming:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_MOUSESETUP_MOUSEAIMING, Option );
6409 terminx 914
#endif
4778 hendricks2 915
static MenuOption_t MEO_MOUSESETUP_INVERT = MAKE_MENUOPTION( &MF_Redfont, &MEOS_YesNo, &ud.mouseflip );
916
static MenuEntry_t ME_MOUSESETUP_INVERT = MAKE_MENUENTRY( "Invert aiming:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_MOUSESETUP_INVERT, Option );
8536 terminx 917
 
8569 terminx 918
#ifndef EDUKE32_RETAIL_MENU
4823 hendricks2 919
static MenuLink_t MEO_MOUSESETUP_ADVANCED = { MENU_MOUSEADVANCED, MA_Advance, };
4778 hendricks2 920
static MenuEntry_t ME_MOUSESETUP_ADVANCED = MAKE_MENUENTRY( "Advanced setup", &MF_Redfont, &MEF_BigOptionsRt, &MEO_MOUSESETUP_ADVANCED, Link );
6409 terminx 921
#endif
7945 hendricks2 922
static MenuRangeInt32_t MEO_MOUSEADVANCED_SCALEX = MAKE_MENURANGE(&ud.config.MouseAnalogueScale[0], &MF_Redfont, -262144, 262144, 65536, 161, 3);
6680 hendricks2 923
static MenuEntry_t ME_MOUSEADVANCED_SCALEX = MAKE_MENUENTRY("X-Scale:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_MOUSEADVANCED_SCALEX, RangeInt32);
7945 hendricks2 924
static MenuRangeInt32_t MEO_MOUSEADVANCED_SCALEY = MAKE_MENURANGE(&ud.config.MouseAnalogueScale[1], &MF_Redfont, -262144, 262144, 65536, 161, 3);
6680 hendricks2 925
static MenuEntry_t ME_MOUSEADVANCED_SCALEY = MAKE_MENUENTRY("Y-Scale:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_MOUSEADVANCED_SCALEY, RangeInt32);
3084 terminx 926
 
4778 hendricks2 927
static MenuEntry_t *MEL_MOUSESETUP[] = {
6409 terminx 928
    &ME_MOUSESETUP_BTNS,
4496 hendricks2 929
    &ME_MOUSESETUP_SENSITIVITY,
8569 terminx 930
#ifdef EDUKE32_RETAIL_MENU
6409 terminx 931
    &ME_MOUSEADVANCED_SCALEX,
932
    &ME_MOUSEADVANCED_SCALEY,
933
#endif
6198 hendricks2 934
    &ME_Space2_Redfont,
6409 terminx 935
    &ME_MOUSESETUP_INVERT,
8569 terminx 936
#ifndef EDUKE32_RETAIL_MENU
6022 terminx 937
    &ME_MOUSESETUP_MOUSEAIMINGTYPE,
4850 hendricks2 938
    &ME_MOUSESETUP_MOUSEAIMING,
939
    &ME_MOUSESETUP_ADVANCED,
6409 terminx 940
#endif
4609 terminx 941
};
942
 
6013 terminx 943
#ifdef EDUKE32_ANDROID_MENU
5023 terminx 944
static MenuRangeFloat_t MEO_TOUCHSETUP_SENSITIVITY_MOVE = MAKE_MENURANGE(&droidinput.forward_sens, &MF_Redfont, 1.f, 9.f, 0.f, 17, 1 + EnforceIntervals);
5652 terminx 945
static MenuEntry_t ME_TOUCHSETUP_SENSITIVITY_MOVE = MAKE_MENUENTRY("Running:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_TOUCHSETUP_SENSITIVITY_MOVE, RangeFloat);
4993 terminx 946
 
5023 terminx 947
static MenuRangeFloat_t MEO_TOUCHSETUP_SENSITIVITY_STRAFE = MAKE_MENURANGE(&droidinput.strafe_sens, &MF_Redfont, 1.f, 9.f, 0.f, 17, 1 + EnforceIntervals);
5652 terminx 948
static MenuEntry_t ME_TOUCHSETUP_SENSITIVITY_STRAFE = MAKE_MENUENTRY("Strafing:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_TOUCHSETUP_SENSITIVITY_STRAFE, RangeFloat);
4993 terminx 949
 
5023 terminx 950
static MenuRangeFloat_t MEO_TOUCHSETUP_SENSITIVITY_LOOK = MAKE_MENURANGE(&droidinput.pitch_sens, &MF_Redfont, 1.f, 9.f, 0.f, 17, 1 + EnforceIntervals);
5652 terminx 951
static MenuEntry_t ME_TOUCHSETUP_SENSITIVITY_LOOK = MAKE_MENUENTRY("Looking:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_TOUCHSETUP_SENSITIVITY_LOOK, RangeFloat);
4993 terminx 952
 
5023 terminx 953
static MenuRangeFloat_t MEO_TOUCHSETUP_SENSITIVITY_TURN = MAKE_MENURANGE(&droidinput.yaw_sens, &MF_Redfont, 1.f, 9.f, 0.f, 17, 1 + EnforceIntervals);
5652 terminx 954
static MenuEntry_t ME_TOUCHSETUP_SENSITIVITY_TURN = MAKE_MENUENTRY("Turning:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_TOUCHSETUP_SENSITIVITY_TURN, RangeFloat);
4993 terminx 955
 
956
static MenuOption_t MEO_TOUCHSETUP_INVERT = MAKE_MENUOPTION(&MF_Redfont, &MEOS_NoYes, &droidinput.invertLook);
957
static MenuEntry_t ME_TOUCHSETUP_INVERT = MAKE_MENUENTRY("Invert look:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_TOUCHSETUP_INVERT, Option);
958
 
5652 terminx 959
MAKE_MENU_TOP_ENTRYLINK("Sensitivity", MEF_CenterMenu, TOUCHSENS, MENU_TOUCHSENS);
960
MAKE_MENU_TOP_ENTRYLINK("Button Setup", MEF_CenterMenu, TOUCHBUTTONS, MENU_TOUCHBUTTONS);
961
 
6061 hendricks2 962
static MenuEntry_t *MEL_TOUCHSETUP [] = {
5652 terminx 963
    &ME_TOUCHSENS,
964
    &ME_TOUCHBUTTONS,
965
};
966
 
6061 hendricks2 967
static MenuEntry_t *MEL_TOUCHSENS [] = {
4993 terminx 968
    &ME_TOUCHSETUP_SENSITIVITY_MOVE,
969
    &ME_TOUCHSETUP_SENSITIVITY_STRAFE,
970
    &ME_TOUCHSETUP_SENSITIVITY_LOOK,
971
    &ME_TOUCHSETUP_SENSITIVITY_TURN,
6198 hendricks2 972
    &ME_Space2_Redfont,
4993 terminx 973
    &ME_TOUCHSETUP_INVERT,
974
};
975
#endif
976
 
7982 hendricks2 977
static MenuOption_t MEO_JOYSTICK_ENABLE = MAKE_MENUOPTION( &MF_Redfont, &MEOS_OffOn, &ud.setup.usejoystick );
978
static MenuEntry_t ME_JOYSTICK_ENABLE = MAKE_MENUENTRY( "Enable Gamepad:", &MF_Redfont, &MEF_BigOptionsRtSections, &MEO_JOYSTICK_ENABLE, Option );
979
 
7968 hendricks2 980
MAKE_MENU_TOP_ENTRYLINK( "Edit Buttons", MEF_BigOptionsRtSections, JOYSTICK_EDITBUTTONS, MENU_JOYSTICKBTNS );
981
MAKE_MENU_TOP_ENTRYLINK( "Edit Axes", MEF_BigOptionsRtSections, JOYSTICK_EDITAXES, MENU_JOYSTICKAXES );
5 Plagman 982
 
7971 hendricks2 983
static MenuLink_t MEO_JOYSTICK_DEFAULTS_STANDARD = { MENU_JOYSTANDARDVERIFY, MA_None, };
984
static MenuEntry_t ME_JOYSTICK_DEFAULTS_STANDARD = MAKE_MENUENTRY( "Use Standard Layout", &MF_Redfont, &MEF_BigOptionsRtSections, &MEO_JOYSTICK_DEFAULTS_STANDARD, Link );
985
static MenuLink_t MEO_JOYSTICK_DEFAULTS_PRO = { MENU_JOYPROVERIFY, MA_None, };
986
static MenuEntry_t ME_JOYSTICK_DEFAULTS_PRO = MAKE_MENUENTRY( "Use Pro Layout", &MF_Redfont, &MEF_BigOptionsRtSections, &MEO_JOYSTICK_DEFAULTS_PRO, Link );
987
static MenuLink_t MEO_JOYSTICK_DEFAULTS_CLEAR = { MENU_JOYCLEARVERIFY, MA_None, };
988
static MenuEntry_t ME_JOYSTICK_DEFAULTS_CLEAR = MAKE_MENUENTRY( "Clear All Settings", &MF_Redfont, &MEF_BigOptionsRtSections, &MEO_JOYSTICK_DEFAULTS_CLEAR, Link );
7968 hendricks2 989
 
4496 hendricks2 990
static MenuEntry_t *MEL_JOYSTICKSETUP[] = {
7982 hendricks2 991
    &ME_JOYSTICK_ENABLE,
992
    &ME_Space6_Redfont,
4496 hendricks2 993
    &ME_JOYSTICK_EDITBUTTONS,
994
    &ME_JOYSTICK_EDITAXES,
7968 hendricks2 995
    &ME_Space6_Redfont,
996
    &ME_JOYSTICK_DEFAULTS_STANDARD,
997
    &ME_JOYSTICK_DEFAULTS_PRO,
998
    &ME_JOYSTICK_DEFAULTS_CLEAR,
4496 hendricks2 999
};
5 Plagman 1000
 
4496 hendricks2 1001
#define MAXJOYBUTTONSTRINGLENGTH 32
5 Plagman 1002
 
4826 hendricks2 1003
static char MenuJoystickNames[MAXJOYBUTTONSANDHATS*2][MAXJOYBUTTONSTRINGLENGTH];
5 Plagman 1004
 
4826 hendricks2 1005
static MenuOption_t MEO_JOYSTICKBTNS[MAXJOYBUTTONSANDHATS*2];
1006
static MenuEntry_t ME_JOYSTICKBTNS[MAXJOYBUTTONSANDHATS*2];
1007
static MenuEntry_t *MEL_JOYSTICKBTNS[MAXJOYBUTTONSANDHATS*2];
59 terminx 1008
 
4688 hendricks2 1009
static MenuLink_t MEO_JOYSTICKAXES = { MENU_JOYSTICKAXIS, MA_Advance, };
4778 hendricks2 1010
static MenuEntry_t ME_JOYSTICKAXES_TEMPLATE = MAKE_MENUENTRY( NULL, &MF_Redfont, &MEF_BigSliders, &MEO_JOYSTICKAXES, Link );
4496 hendricks2 1011
static MenuEntry_t ME_JOYSTICKAXES[MAXJOYAXES];
1012
static char MenuJoystickAxes[MAXJOYAXES][MAXJOYBUTTONSTRINGLENGTH];
59 terminx 1013
 
4496 hendricks2 1014
static MenuEntry_t *MEL_JOYSTICKAXES[MAXJOYAXES];
2188 helixhorne 1015
 
4778 hendricks2 1016
static MenuEntry_t *MEL_MOUSEADVANCED[] = {
1017
    &ME_MOUSEADVANCED_SCALEX,
1018
    &ME_MOUSEADVANCED_SCALEY,
4496 hendricks2 1019
};
3084 terminx 1020
 
4496 hendricks2 1021
static const char *MenuJoystickHatDirections[] = { "Up", "Right", "Down", "Left", };
3084 terminx 1022
 
5547 terminx 1023
static char const *MEOSN_JOYSTICKAXIS_ANALOG[] = { "  -None-", "Turning", "Strafing", "Looking", "Moving", };
4496 hendricks2 1024
static int32_t MEOSV_JOYSTICKAXIS_ANALOG[] = { -1, analog_turning, analog_strafing, analog_lookingupanddown, analog_moving, };
4778 hendricks2 1025
static MenuOptionSet_t MEOS_JOYSTICKAXIS_ANALOG = MAKE_MENUOPTIONSET( MEOSN_JOYSTICKAXIS_ANALOG, MEOSV_JOYSTICKAXIS_ANALOG, 0x0 );
4496 hendricks2 1026
static MenuOption_t MEO_JOYSTICKAXIS_ANALOG = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_JOYSTICKAXIS_ANALOG, NULL );
4778 hendricks2 1027
static MenuEntry_t ME_JOYSTICKAXIS_ANALOG = MAKE_MENUENTRY( "Analog", &MF_Redfont, &MEF_BigSliders, &MEO_JOYSTICKAXIS_ANALOG, Option );
7945 hendricks2 1028
static MenuRangeInt32_t MEO_JOYSTICKAXIS_SCALE = MAKE_MENURANGE( NULL, &MF_Bluefont, -262144, 262144, 65536, 161, 3 );
4778 hendricks2 1029
static MenuEntry_t ME_JOYSTICKAXIS_SCALE = MAKE_MENUENTRY( "Scale", &MF_Redfont, &MEF_BigSliders, &MEO_JOYSTICKAXIS_SCALE, RangeInt32 );
7986 hendricks2 1030
static MenuOption_t MEO_JOYSTICKAXIS_INVERT = MAKE_MENUOPTION( &MF_Redfont, &MEOS_OffOn, NULL );
1031
static MenuEntry_t ME_JOYSTICKAXIS_INVERT = MAKE_MENUENTRY( "Invert", &MF_Redfont, &MEF_BigSliders, &MEO_JOYSTICKAXIS_INVERT, Option );
7945 hendricks2 1032
static MenuRangeInt32_t MEO_JOYSTICKAXIS_DEAD = MAKE_MENURANGE( NULL, &MF_Bluefont, 0, 10000, 0, 101, 2 );
4778 hendricks2 1033
static MenuEntry_t ME_JOYSTICKAXIS_DEAD = MAKE_MENUENTRY( "Dead Zone", &MF_Redfont, &MEF_BigSliders, &MEO_JOYSTICKAXIS_DEAD, RangeInt32 );
7945 hendricks2 1034
static MenuRangeInt32_t MEO_JOYSTICKAXIS_SATU = MAKE_MENURANGE( NULL, &MF_Bluefont, 0, 10000, 0, 101, 2 );
4778 hendricks2 1035
static MenuEntry_t ME_JOYSTICKAXIS_SATU = MAKE_MENUENTRY( "Saturation", &MF_Redfont, &MEF_BigSliders, &MEO_JOYSTICKAXIS_SATU, RangeInt32 );
3084 terminx 1036
 
4496 hendricks2 1037
static MenuOption_t MEO_JOYSTICKAXIS_DIGITALNEGATIVE = MAKE_MENUOPTION( &MF_Minifont, &MEOS_Gamefuncs, NULL );
6613 hendricks2 1038
static MenuEntry_t ME_JOYSTICKAXIS_DIGITALNEGATIVE = MAKE_MENUENTRY( "Digital -", &MF_Bluefont, &MEF_BigSliders, &MEO_JOYSTICKAXIS_DIGITALNEGATIVE, Option );
4496 hendricks2 1039
static MenuOption_t MEO_JOYSTICKAXIS_DIGITALPOSITIVE = MAKE_MENUOPTION( &MF_Minifont, &MEOS_Gamefuncs, NULL );
6613 hendricks2 1040
static MenuEntry_t ME_JOYSTICKAXIS_DIGITALPOSITIVE = MAKE_MENUENTRY( "Digital +", &MF_Bluefont, &MEF_BigSliders, &MEO_JOYSTICKAXIS_DIGITALPOSITIVE, Option );
3084 terminx 1041
 
4496 hendricks2 1042
static MenuEntry_t *MEL_JOYSTICKAXIS[] = {
1043
    &ME_JOYSTICKAXIS_ANALOG,
1044
    &ME_JOYSTICKAXIS_SCALE,
7986 hendricks2 1045
    &ME_JOYSTICKAXIS_INVERT,
4496 hendricks2 1046
    &ME_JOYSTICKAXIS_DEAD,
1047
    &ME_JOYSTICKAXIS_SATU,
6198 hendricks2 1048
    &ME_Space8_Redfont,
4778 hendricks2 1049
    &ME_JOYSTICKAXIS_DIGITALNEGATIVE,
1050
    &ME_JOYSTICKAXIS_DIGITALPOSITIVE,
4496 hendricks2 1051
};
3084 terminx 1052
 
4778 hendricks2 1053
static MenuEntry_t *MEL_INTERNAL_JOYSTICKAXIS_DIGITAL[] = {
4496 hendricks2 1054
    &ME_JOYSTICKAXIS_DIGITALNEGATIVE,
1055
    &ME_JOYSTICKAXIS_DIGITALPOSITIVE,
1056
};
3084 terminx 1057
 
4496 hendricks2 1058
#ifdef USE_OPENGL
1059
static MenuOption_t MEO_RENDERERSETUP_HIGHTILE = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_NoYes, &usehightile );
6613 hendricks2 1060
static MenuEntry_t ME_RENDERERSETUP_HIGHTILE = MAKE_MENUENTRY( "True color textures:", &MF_Bluefont, &MEF_SmallOptions, &MEO_RENDERERSETUP_HIGHTILE, Option );
5408 terminx 1061
 
6061 hendricks2 1062
static char const *MEOSN_RENDERERSETUP_TEXQUALITY [] = { "Full", "Half", "Barf", };
5408 terminx 1063
static MenuOptionSet_t MEOS_RENDERERSETUP_TEXQUALITY = MAKE_MENUOPTIONSET(MEOSN_RENDERERSETUP_TEXQUALITY, NULL, 0x2);
1064
static MenuOption_t MEO_RENDERERSETUP_TEXQUALITY = MAKE_MENUOPTION(&MF_Bluefont, &MEOS_RENDERERSETUP_TEXQUALITY, &r_downsize);
6613 hendricks2 1065
static MenuEntry_t ME_RENDERERSETUP_TEXQUALITY = MAKE_MENUENTRY("GL texture quality:", &MF_Bluefont, &MEF_SmallOptions, &MEO_RENDERERSETUP_TEXQUALITY, Option);
5408 terminx 1066
 
1067
 
4496 hendricks2 1068
static MenuOption_t MEO_RENDERERSETUP_PRECACHE = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_OffOn, &ud.config.useprecache );
6613 hendricks2 1069
static MenuEntry_t ME_RENDERERSETUP_PRECACHE = MAKE_MENUENTRY( "Pre-load map textures:", &MF_Bluefont, &MEF_SmallOptions, &MEO_RENDERERSETUP_PRECACHE, Option );
5526 hendricks2 1070
# ifndef EDUKE32_GLES
5547 terminx 1071
static char const *MEOSN_RENDERERSETUP_TEXCACHE[] = { "Off", "On", "Compr.", };
4778 hendricks2 1072
static MenuOptionSet_t MEOS_RENDERERSETUP_TEXCACHE = MAKE_MENUOPTIONSET( MEOSN_RENDERERSETUP_TEXCACHE, NULL, 0x2 );
4496 hendricks2 1073
static MenuOption_t MEO_RENDERERSETUP_TEXCACHE = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_RENDERERSETUP_TEXCACHE, &glusetexcache );
6613 hendricks2 1074
static MenuEntry_t ME_RENDERERSETUP_TEXCACHE = MAKE_MENUENTRY( "On-disk texture cache:", &MF_Bluefont, &MEF_SmallOptions, &MEO_RENDERERSETUP_TEXCACHE, Option );
5526 hendricks2 1075
# endif
1076
# ifdef USE_GLEXT
4496 hendricks2 1077
static MenuOption_t MEO_RENDERERSETUP_DETAILTEX = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_NoYes, &r_detailmapping );
6613 hendricks2 1078
static MenuEntry_t ME_RENDERERSETUP_DETAILTEX = MAKE_MENUENTRY( "Detail textures:", &MF_Bluefont, &MEF_SmallOptions, &MEO_RENDERERSETUP_DETAILTEX, Option );
5408 terminx 1079
static MenuOption_t MEO_RENDERERSETUP_GLOWTEX = MAKE_MENUOPTION(&MF_Bluefont, &MEOS_NoYes, &r_glowmapping);
6613 hendricks2 1080
static MenuEntry_t ME_RENDERERSETUP_GLOWTEX = MAKE_MENUENTRY("Glow textures:", &MF_Bluefont, &MEF_SmallOptions, &MEO_RENDERERSETUP_GLOWTEX, Option);
5526 hendricks2 1081
# endif
4496 hendricks2 1082
static MenuOption_t MEO_RENDERERSETUP_MODELS = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_NoYes, &usemodels );
6613 hendricks2 1083
static MenuEntry_t ME_RENDERERSETUP_MODELS = MAKE_MENUENTRY( "3D models:", &MF_Bluefont, &MEF_SmallOptions, &MEO_RENDERERSETUP_MODELS, Option );
4496 hendricks2 1084
#endif
5408 terminx 1085
 
5406 terminx 1086
#ifdef POLYMER
6061 hendricks2 1087
static char const *MEOSN_POLYMER_LIGHTS [] = { "Off", "Full", "Map only", };
5408 terminx 1088
static MenuOptionSet_t MEOS_POLYMER_LIGHTS = MAKE_MENUOPTIONSET(MEOSN_POLYMER_LIGHTS, NULL, 0x2);
1089
static MenuOption_t MEO_POLYMER_LIGHTS = MAKE_MENUOPTION(&MF_Bluefont, &MEOS_POLYMER_LIGHTS, &pr_lighting);
6613 hendricks2 1090
static MenuEntry_t ME_POLYMER_LIGHTS = MAKE_MENUENTRY("Dynamic lights:", &MF_Bluefont, &MEF_SmallOptions, &MEO_POLYMER_LIGHTS, Option);
5408 terminx 1091
 
1092
static MenuRangeInt32_t MEO_POLYMER_LIGHTPASSES = MAKE_MENURANGE(&r_pr_maxlightpasses, &MF_Bluefont, 1, 10, 1, 10, 1);
6613 hendricks2 1093
static MenuEntry_t ME_POLYMER_LIGHTPASSES = MAKE_MENUENTRY("Lights per surface:", &MF_Bluefont, &MEF_SmallOptions, &MEO_POLYMER_LIGHTPASSES, RangeInt32);
5408 terminx 1094
 
1095
static MenuOption_t MEO_POLYMER_SHADOWS = MAKE_MENUOPTION(&MF_Bluefont, &MEOS_OffOn, &pr_shadows);
6613 hendricks2 1096
static MenuEntry_t ME_POLYMER_SHADOWS = MAKE_MENUENTRY("Dynamic shadows:", &MF_Bluefont, &MEF_SmallOptions, &MEO_POLYMER_SHADOWS, Option);
5408 terminx 1097
 
1098
static MenuRangeInt32_t MEO_POLYMER_SHADOWCOUNT = MAKE_MENURANGE(&pr_shadowcount, &MF_Bluefont, 1, 10, 1, 10, 1);
6613 hendricks2 1099
static MenuEntry_t ME_POLYMER_SHADOWCOUNT = MAKE_MENUENTRY("Shadows per surface:", &MF_Bluefont, &MEF_SmallOptions, &MEO_POLYMER_SHADOWCOUNT, RangeInt32);
5408 terminx 1100
 
5406 terminx 1101
#endif
3084 terminx 1102
 
4496 hendricks2 1103
#ifdef USE_OPENGL
5408 terminx 1104
static MenuEntry_t *MEL_RENDERERSETUP_POLYMOST[] = {
4496 hendricks2 1105
    &ME_RENDERERSETUP_HIGHTILE,
1106
    &ME_RENDERERSETUP_TEXQUALITY,
1107
    &ME_RENDERERSETUP_PRECACHE,
5526 hendricks2 1108
# ifndef EDUKE32_GLES
4496 hendricks2 1109
    &ME_RENDERERSETUP_TEXCACHE,
5526 hendricks2 1110
# endif
1111
# ifdef USE_GLEXT
4496 hendricks2 1112
    &ME_RENDERERSETUP_DETAILTEX,
5408 terminx 1113
    &ME_RENDERERSETUP_GLOWTEX,
5526 hendricks2 1114
# endif
6198 hendricks2 1115
    &ME_Space4_Bluefont,
4496 hendricks2 1116
    &ME_RENDERERSETUP_MODELS,
5408 terminx 1117
};
1118
 
5406 terminx 1119
#ifdef POLYMER
6061 hendricks2 1120
static MenuEntry_t *MEL_RENDERERSETUP_POLYMER [] = {
5408 terminx 1121
    &ME_RENDERERSETUP_HIGHTILE,
1122
    &ME_RENDERERSETUP_TEXQUALITY,
1123
    &ME_RENDERERSETUP_PRECACHE,
5526 hendricks2 1124
# ifndef EDUKE32_GLES
5408 terminx 1125
    &ME_RENDERERSETUP_TEXCACHE,
5526 hendricks2 1126
# endif
1127
# ifdef USE_GLEXT
5408 terminx 1128
    &ME_RENDERERSETUP_DETAILTEX,
1129
    &ME_RENDERERSETUP_GLOWTEX,
5526 hendricks2 1130
# endif
6198 hendricks2 1131
    &ME_Space4_Bluefont,
5408 terminx 1132
    &ME_RENDERERSETUP_MODELS,
6198 hendricks2 1133
    &ME_Space4_Bluefont,
5408 terminx 1134
    &ME_POLYMER_LIGHTS,
1135
    &ME_POLYMER_LIGHTPASSES,
1136
    &ME_POLYMER_SHADOWS,
1137
    &ME_POLYMER_SHADOWCOUNT,
4496 hendricks2 1138
};
1139
#endif
5408 terminx 1140
#endif
3084 terminx 1141
 
6013 terminx 1142
#ifdef EDUKE32_ANDROID_MENU
6828 terminx 1143
static MenuRangeFloat_t MEO_COLCORR_GAMMA = MAKE_MENURANGE( &g_videoGamma, &MF_Bluefont, 1.f, 2.5f, 0.f, 39, 1 );
4609 terminx 1144
#else
7312 hendricks2 1145
static MenuRangeFloat_t MEO_COLCORR_GAMMA = MAKE_MENURANGE( &g_videoGamma, &MF_Bluefont, 0.3f, 4.f, 0.f, 75, 1 );
4609 terminx 1146
#endif
4778 hendricks2 1147
static MenuEntry_t ME_COLCORR_GAMMA = MAKE_MENUENTRY( "Gamma:", &MF_Redfont, &MEF_ColorCorrect, &MEO_COLCORR_GAMMA, RangeFloat );
6828 terminx 1148
static MenuRangeFloat_t MEO_COLCORR_CONTRAST = MAKE_MENURANGE( &g_videoContrast, &MF_Bluefont, 0.1f, 2.7f, 0.f, 53, 1 );
4778 hendricks2 1149
static MenuEntry_t ME_COLCORR_CONTRAST = MAKE_MENUENTRY( "Contrast:", &MF_Redfont, &MEF_ColorCorrect, &MEO_COLCORR_CONTRAST, RangeFloat );
6828 terminx 1150
static MenuRangeFloat_t MEO_COLCORR_BRIGHTNESS = MAKE_MENURANGE( &g_videoBrightness, &MF_Bluefont, -0.8f, 0.8f, 0.f, 33, 1 );
4778 hendricks2 1151
static MenuEntry_t ME_COLCORR_BRIGHTNESS = MAKE_MENUENTRY( "Brightness:", &MF_Redfont, &MEF_ColorCorrect, &MEO_COLCORR_BRIGHTNESS, RangeFloat );
7971 hendricks2 1152
static MenuLink_t MEO_COLCORR_RESET = { MENU_COLCORRRESETVERIFY, MA_None, };
1153
static MenuEntry_t ME_COLCORR_RESET = MAKE_MENUENTRY( "Reset To Defaults", &MF_Redfont, &MEF_ColorCorrect, &MEO_COLCORR_RESET, Link );
6013 terminx 1154
#ifdef EDUKE32_ANDROID_MENU
4993 terminx 1155
#define MINVIS 1.f
1156
#else
1157
#define MINVIS 0.125f
1158
#endif
8569 terminx 1159
#ifndef EDUKE32_RETAIL_MENU
4993 terminx 1160
static MenuRangeFloat_t MEO_COLCORR_AMBIENT = MAKE_MENURANGE( &r_ambientlight, &MF_Bluefont, MINVIS, 4.f, 0.f, 32, 1 );
4778 hendricks2 1161
static MenuEntry_t ME_COLCORR_AMBIENT = MAKE_MENUENTRY( "Visibility:", &MF_Redfont, &MEF_ColorCorrect, &MEO_COLCORR_AMBIENT, RangeFloat );
6335 terminx 1162
#endif
4496 hendricks2 1163
static MenuEntry_t *MEL_COLCORR[] = {
1164
    &ME_COLCORR_GAMMA,
6013 terminx 1165
#ifndef EDUKE32_ANDROID_MENU
4496 hendricks2 1166
    &ME_COLCORR_CONTRAST,
1167
    &ME_COLCORR_BRIGHTNESS,
4609 terminx 1168
#endif
8569 terminx 1169
#ifndef EDUKE32_RETAIL_MENU
4850 hendricks2 1170
    &ME_COLCORR_AMBIENT,
6335 terminx 1171
#endif
6198 hendricks2 1172
    &ME_Space8_Redfont,
4496 hendricks2 1173
    &ME_COLCORR_RESET,
1174
};
3084 terminx 1175
 
4778 hendricks2 1176
static MenuEntry_t *MEL_SCREENSETUP[] = {
6588 hendricks2 1177
#ifdef EDUKE32_ANDROID_MENU
1178
    &ME_SCREENSETUP_STATUSBARONTOP,
1179
#endif
6650 hendricks2 1180
    &ME_SCREENSETUP_SCREENSIZE,
4850 hendricks2 1181
    &ME_SCREENSETUP_SBARSIZE,
4609 terminx 1182
 
4850 hendricks2 1183
    &ME_SCREENSETUP_CROSSHAIR,
1184
    &ME_SCREENSETUP_CROSSHAIRSIZE,
4609 terminx 1185
 
4850 hendricks2 1186
    &ME_SCREENSETUP_LEVELSTATS,
1187
    &ME_SCREENSETUP_TEXTSIZE,
4609 terminx 1188
 
4850 hendricks2 1189
    &ME_SCREENSETUP_SHOWPICKUPMESSAGES,
4609 terminx 1190
};
1191
 
4496 hendricks2 1192
// Save and load will be filled in before every viewing of the save/load screen.
6329 hendricks2 1193
static MenuLink_t MEO_LOAD = { MENU_LOADVERIFY, MA_None, };
6613 hendricks2 1194
static MenuEntry_t ME_LOAD_TEMPLATE = MAKE_MENUENTRY( NULL, &MF_Minifont, &MEF_LoadSave, &MEO_LOAD, Link );
1195
static MenuEntry_t ME_LOAD_EMPTY = MAKE_MENUENTRY( NULL, &MF_Minifont, &MEF_LoadSave, nullptr, Dummy );
6569 hendricks2 1196
static MenuEntry_t *ME_LOAD;
1197
static MenuEntry_t **MEL_LOAD;
3084 terminx 1198
 
6569 hendricks2 1199
static char const s_NewSaveGame[] = "(New Save Game)";
6613 hendricks2 1200
static MenuString_t MEO_SAVE_TEMPLATE = MAKE_MENUSTRING( NULL, &MF_Minifont, MAXSAVEGAMENAME, 0 );
1201
static MenuString_t MEO_SAVE_NEW = MAKE_MENUSTRING( NULL, &MF_Minifont, MAXSAVEGAMENAME, 0 );
6569 hendricks2 1202
static MenuString_t *MEO_SAVE;
6613 hendricks2 1203
static MenuEntry_t ME_SAVE_TEMPLATE = MAKE_MENUENTRY( NULL, &MF_Minifont, &MEF_LoadSave, &MEO_SAVE_TEMPLATE, String );
1204
static MenuEntry_t ME_SAVE_NEW = MAKE_MENUENTRY( s_NewSaveGame, &MF_Minifont, &MEF_LoadSave, &MEO_SAVE_NEW, String );
6569 hendricks2 1205
static MenuEntry_t *ME_SAVE;
1206
static MenuEntry_t **MEL_SAVE;
3084 terminx 1207
 
8760 terminx 1208
static int32_t soundrate, soundvoices, musicdevice, opl3stereo;
1209
static char sf2bankfile[BMAX_PATH];
4778 hendricks2 1210
static MenuOption_t MEO_SOUND = MAKE_MENUOPTION( &MF_Redfont, &MEOS_OffOn, &ud.config.SoundToggle );
1211
static MenuEntry_t ME_SOUND = MAKE_MENUENTRY( "Sound:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SOUND, Option );
4609 terminx 1212
 
4778 hendricks2 1213
static MenuOption_t MEO_SOUND_MUSIC = MAKE_MENUOPTION( &MF_Redfont, &MEOS_OffOn, &ud.config.MusicToggle );
1214
static MenuEntry_t ME_SOUND_MUSIC = MAKE_MENUENTRY( "Music:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SOUND_MUSIC, Option );
4609 terminx 1215
 
8013 hendricks2 1216
static char const s_Volume[] = "Volume:";
1217
 
7122 terminx 1218
static MenuRangeInt32_t MEO_SOUND_VOLUME_FX = MAKE_MENURANGE( &ud.config.FXVolume, &MF_Redfont, 0, 255, 0, 33, 2 );
8013 hendricks2 1219
static MenuEntry_t ME_SOUND_VOLUME_FX = MAKE_MENUENTRY( s_Volume, &MF_Redfont, &MEF_BigOptions_Apply, &MEO_SOUND_VOLUME_FX, RangeInt32 );
4609 terminx 1220
 
4778 hendricks2 1221
static MenuRangeInt32_t MEO_SOUND_VOLUME_MUSIC = MAKE_MENURANGE( &ud.config.MusicVolume, &MF_Redfont, 0, 255, 0, 33, 2 );
8013 hendricks2 1222
static MenuEntry_t ME_SOUND_VOLUME_MUSIC = MAKE_MENUENTRY( s_Volume, &MF_Redfont, &MEF_BigOptions_Apply, &MEO_SOUND_VOLUME_MUSIC, RangeInt32 );
4609 terminx 1223
 
7402 terminx 1224
#ifndef EDUKE32_STANDALONE
4778 hendricks2 1225
static MenuOption_t MEO_SOUND_DUKETALK = MAKE_MENUOPTION(&MF_Redfont, &MEOS_NoYes, NULL);
1226
static MenuEntry_t ME_SOUND_DUKETALK = MAKE_MENUENTRY( "Duke talk:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SOUND_DUKETALK, Option );
6013 terminx 1227
#else
8026 hendricks2 1228
static MenuOption_t MEO_SOUND_DUKETALK = MAKE_MENUOPTION(&MF_Redfont, &MEOS_YesNo, NULL);
1229
static MenuEntry_t ME_SOUND_DUKETALK = MAKE_MENUENTRY("Silent protagonist:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SOUND_DUKETALK, Option);
6013 terminx 1230
#endif
4609 terminx 1231
 
5547 terminx 1232
static char const *MEOSN_SOUND_SAMPLINGRATE[] = { "22050Hz", "44100Hz", "48000Hz", };
4609 terminx 1233
static int32_t MEOSV_SOUND_SAMPLINGRATE[] = { 22050, 44100, 48000, };
4778 hendricks2 1234
static MenuOptionSet_t MEOS_SOUND_SAMPLINGRATE = MAKE_MENUOPTIONSET( MEOSN_SOUND_SAMPLINGRATE, MEOSV_SOUND_SAMPLINGRATE, 0x3 );
1235
static MenuOption_t MEO_SOUND_SAMPLINGRATE = MAKE_MENUOPTION( &MF_Redfont, &MEOS_SOUND_SAMPLINGRATE, &soundrate );
1236
static MenuEntry_t ME_SOUND_SAMPLINGRATE = MAKE_MENUENTRY( "Sample rate:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SOUND_SAMPLINGRATE, Option );
4609 terminx 1237
 
8569 terminx 1238
#ifndef EDUKE32_RETAIL_MENU
8760 terminx 1239
static MenuOption_t MEO_SOUND_OPL3STEREO = MAKE_MENUOPTION(&MF_Redfont, &MEOS_NoYes, &opl3stereo);
1240
static MenuEntry_t ME_SOUND_OPL3STEREO = MAKE_MENUENTRY( "OPL3 stereo mode:", &MF_Redfont, &MEF_BigOptionsRtSections, &MEO_SOUND_OPL3STEREO, Option );
1241
 
8234 terminx 1242
static MenuRangeInt32_t MEO_SOUND_NUMVOICES = MAKE_MENURANGE( &soundvoices, &MF_Redfont, 16, 128, 0, 8, 1 );
4778 hendricks2 1243
static MenuEntry_t ME_SOUND_NUMVOICES = MAKE_MENUENTRY( "Voices:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SOUND_NUMVOICES, RangeInt32 );
4609 terminx 1244
 
8258 hendricks2 1245
static char const *MEOSN_SOUND_MIDIDRIVER[] = {
8381 terminx 1246
    "OPL3 emu.",
8218 terminx 1247
#ifdef _WIN32
8381 terminx 1248
    "Windows MME",
8218 terminx 1249
#endif
8760 terminx 1250
    ".sf2 synth",
8218 terminx 1251
};
8258 hendricks2 1252
static int32_t MEOSV_SOUND_MIDIDRIVER[] = {
8219 terminx 1253
    ASS_OPL3,
8218 terminx 1254
#ifdef _WIN32
1255
    ASS_WinMM,
1256
#endif
8752 terminx 1257
    ASS_SF2,
8218 terminx 1258
};
1259
 
8258 hendricks2 1260
static MenuOptionSet_t MEOS_SOUND_MIDIDRIVER = MAKE_MENUOPTIONSET( MEOSN_SOUND_MIDIDRIVER, MEOSV_SOUND_MIDIDRIVER, 0x2 );
1261
static MenuOption_t MEO_SOUND_MIDIDRIVER = MAKE_MENUOPTION( &MF_Redfont, &MEOS_SOUND_MIDIDRIVER, &musicdevice );
1262
static MenuEntry_t ME_SOUND_MIDIDRIVER = MAKE_MENUENTRY( "MIDI driver:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SOUND_MIDIDRIVER, Option );
8218 terminx 1263
 
8760 terminx 1264
static MenuLink_t MEO_SOUND_DEVSETUP = { MENU_SOUND_DEVSETUP, MA_Advance, };
1265
static MenuEntry_t ME_SOUND_DEVSETUP = MAKE_MENUENTRY( "Device configuration", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SOUND_DEVSETUP, Link );
1266
 
1267
static MenuLink_t MEO_SOUND_SF2 = { MENU_SOUND_SF2, MA_Advance, };
1268
static MenuEntry_t ME_SOUND_SF2 = MAKE_MENUENTRY( sf2bankfile, &MF_Redfont, &MEF_BigOptionsRtSections, &MEO_SOUND_SF2, Link );
4645 hendricks2 1269
#endif
4609 terminx 1270
 
8764 terminx 1271
static MenuEntry_t ME_SOUND_RESTART = MAKE_MENUENTRY( "Apply Changes", &MF_Redfont, &MEF_BigOptions_Apply, &MEO_NULL, Link );
1272
 
4778 hendricks2 1273
static MenuEntry_t *MEL_SOUND[] = {
4496 hendricks2 1274
    &ME_SOUND,
8013 hendricks2 1275
    &ME_SOUND_VOLUME_FX,
4496 hendricks2 1276
    &ME_SOUND_MUSIC,
4850 hendricks2 1277
    &ME_SOUND_VOLUME_MUSIC,
4496 hendricks2 1278
    &ME_SOUND_DUKETALK,
8569 terminx 1279
#ifndef EDUKE32_RETAIL_MENU
8760 terminx 1280
    &ME_Space4_Redfont,
1281
    &ME_SOUND_DEVSETUP,
4609 terminx 1282
#endif
4496 hendricks2 1283
};
3084 terminx 1284
 
8760 terminx 1285
static MenuEntry_t *MEL_SOUND_DEVSETUP[] = {
4850 hendricks2 1286
    &ME_SOUND_SAMPLINGRATE,
8569 terminx 1287
#ifndef EDUKE32_RETAIL_MENU
4850 hendricks2 1288
    &ME_SOUND_NUMVOICES,
8760 terminx 1289
    &ME_SOUND_MIDIDRIVER,
1290
    &ME_SOUND_OPL3STEREO,
1291
    &ME_SOUND_SF2,
6380 terminx 1292
#endif
8760 terminx 1293
    &ME_Space4_Redfont,
4850 hendricks2 1294
    &ME_SOUND_RESTART,
4609 terminx 1295
};
1296
 
6742 hendricks2 1297
 
1298
static MenuOption_t MEO_SAVESETUP_AUTOSAVE = MAKE_MENUOPTION( &MF_Redfont, &MEOS_OffOn, &ud.autosave );
7790 terminx 1299
static MenuEntry_t ME_SAVESETUP_AUTOSAVE = MAKE_MENUENTRY( "Checkpoints:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SAVESETUP_AUTOSAVE, Option );
6742 hendricks2 1300
 
6748 hendricks2 1301
static MenuOption_t MEO_SAVESETUP_AUTOSAVEDELETION = MAKE_MENUOPTION( &MF_Redfont, &MEOS_NoYes, &ud.autosavedeletion );
1302
static MenuEntry_t ME_SAVESETUP_AUTOSAVEDELETION = MAKE_MENUENTRY( "Auto-Delete:", &MF_Redfont, &MEF_BigOptions_Apply, &MEO_SAVESETUP_AUTOSAVEDELETION, Option );
1303
static MenuRangeInt32_t MEO_SAVESETUP_MAXAUTOSAVES = MAKE_MENURANGE( &ud.maxautosaves, &MF_Redfont, 1, 10, 0, 10, 1 );
1304
static MenuEntry_t ME_SAVESETUP_MAXAUTOSAVES = MAKE_MENUENTRY( "Limit:", &MF_Redfont, &MEF_BigOptions_Apply, &MEO_SAVESETUP_MAXAUTOSAVES, RangeInt32 );
1305
 
6749 hendricks2 1306
static MenuEntry_t ME_SAVESETUP_CLEANUP = MAKE_MENUENTRY( "Clean Up Saves", &MF_Redfont, &MEF_BigOptionsRt, &MEO_NULL, Link );
1307
 
8114 terminx 1308
#ifdef EDUKE32_STANDALONE
1309
static MenuEntry_t ME_SAVESETUP_RESETSTATS = MAKE_MENUENTRY( "Reset Stats/Achievements", &MF_Redfont, &MEF_BigOptionsRt, &MEO_NULL, Link );
1310
#endif
1311
 
6742 hendricks2 1312
static MenuEntry_t *MEL_SAVESETUP[] = {
1313
    &ME_SAVESETUP_AUTOSAVE,
6748 hendricks2 1314
    &ME_SAVESETUP_AUTOSAVEDELETION,
1315
    &ME_SAVESETUP_MAXAUTOSAVES,
6749 hendricks2 1316
    &ME_SAVESETUP_CLEANUP,
8114 terminx 1317
#ifdef EDUKE32_STANDALONE
1318
    &ME_SAVESETUP_RESETSTATS,
1319
#endif
6742 hendricks2 1320
};
1321
 
1322
 
4778 hendricks2 1323
MAKE_MENU_TOP_ENTRYLINK( "Player Setup", MEF_CenterMenu, NETWORK_PLAYERSETUP, MENU_PLAYER );
1324
MAKE_MENU_TOP_ENTRYLINK( "Join Game", MEF_CenterMenu, NETWORK_JOINGAME, MENU_NETJOIN );
1325
MAKE_MENU_TOP_ENTRYLINK( "Host Game", MEF_CenterMenu, NETWORK_HOSTGAME, MENU_NETHOST );
4399 hendricks2 1326
 
4496 hendricks2 1327
static MenuEntry_t *MEL_NETWORK[] = {
1328
    &ME_NETWORK_PLAYERSETUP,
1329
    &ME_NETWORK_JOINGAME,
1330
    &ME_NETWORK_HOSTGAME,
1331
};
4399 hendricks2 1332
 
4778 hendricks2 1333
static MenuString_t MEO_PLAYER_NAME = MAKE_MENUSTRING( szPlayerName, &MF_Bluefont, MAXPLAYERNAME, 0 );
6613 hendricks2 1334
static MenuEntry_t ME_PLAYER_NAME = MAKE_MENUENTRY( "Name", &MF_Bluefont, &MEF_PlayerNarrow, &MEO_PLAYER_NAME, String );
5547 terminx 1335
static char const *MEOSN_PLAYER_COLOR[] = { "Auto", "Blue", "Red", "Green", "Gray", "Dark gray", "Dark green", "Brown", "Dark blue", "Bright red", "Yellow", };
4822 hendricks2 1336
static int32_t MEOSV_PLAYER_COLOR[] = { 0, 9, 10, 11, 12, 13, 14, 15, 16, 21, 23, };
4778 hendricks2 1337
static MenuOptionSet_t MEOS_PLAYER_COLOR = MAKE_MENUOPTIONSET( MEOSN_PLAYER_COLOR, MEOSV_PLAYER_COLOR, 0x2 );
4496 hendricks2 1338
static MenuOption_t MEO_PLAYER_COLOR = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_PLAYER_COLOR, &ud.color );
6613 hendricks2 1339
static MenuEntry_t ME_PLAYER_COLOR = MAKE_MENUENTRY( "Color", &MF_Bluefont, &MEF_PlayerNarrow, &MEO_PLAYER_COLOR, Option );
5547 terminx 1340
static char const *MEOSN_PLAYER_TEAM[] = { "Blue", "Red", "Green", "Gray", };
4778 hendricks2 1341
static MenuOptionSet_t MEOS_PLAYER_TEAM = MAKE_MENUOPTIONSET( MEOSN_PLAYER_TEAM, NULL, 0x2 );
4496 hendricks2 1342
static MenuOption_t MEO_PLAYER_TEAM = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_PLAYER_TEAM, &ud.team );
6613 hendricks2 1343
static MenuEntry_t ME_PLAYER_TEAM = MAKE_MENUENTRY( "Team", &MF_Bluefont, &MEF_PlayerNarrow, &MEO_PLAYER_TEAM, Option );
8569 terminx 1344
#ifndef EDUKE32_RETAIL_MENU
4688 hendricks2 1345
static MenuLink_t MEO_PLAYER_MACROS = { MENU_MACROS, MA_Advance, };
6613 hendricks2 1346
static MenuEntry_t ME_PLAYER_MACROS = MAKE_MENUENTRY( "Multiplayer macros", &MF_Bluefont, &MEF_SmallOptions, &MEO_PLAYER_MACROS, Link );
4682 hendricks2 1347
#endif
5 Plagman 1348
 
4778 hendricks2 1349
static MenuEntry_t *MEL_PLAYER[] = {
4496 hendricks2 1350
    &ME_PLAYER_NAME,
6198 hendricks2 1351
    &ME_Space4_Bluefont,
4496 hendricks2 1352
    &ME_PLAYER_COLOR,
6198 hendricks2 1353
    &ME_Space4_Bluefont,
4496 hendricks2 1354
    &ME_PLAYER_TEAM,
8569 terminx 1355
#ifndef EDUKE32_RETAIL_MENU
6198 hendricks2 1356
    &ME_Space8_Bluefont,
4496 hendricks2 1357
    &ME_PLAYER_MACROS,
4778 hendricks2 1358
#endif
4496 hendricks2 1359
};
5 Plagman 1360
 
4778 hendricks2 1361
static MenuString_t MEO_MACROS_TEMPLATE = MAKE_MENUSTRING( NULL, &MF_Bluefont, MAXRIDECULELENGTH, 0 );
6569 hendricks2 1362
static MenuString_t MEO_MACROS[10];
4778 hendricks2 1363
static MenuEntry_t ME_MACROS_TEMPLATE = MAKE_MENUENTRY( NULL, &MF_Bluefont, &MEF_Macros, &MEO_MACROS_TEMPLATE, String );
4496 hendricks2 1364
static MenuEntry_t ME_MACROS[MAXRIDECULE];
1365
static MenuEntry_t *MEL_MACROS[MAXRIDECULE];
5 Plagman 1366
 
5547 terminx 1367
static char const *MenuUserMap = "User Map";
1368
static char const *MenuSkillNone = "None";
5 Plagman 1369
 
5547 terminx 1370
static char const *MEOSN_NetGametypes[MAXGAMETYPES];
1371
static char const *MEOSN_NetEpisodes[MAXVOLUMES+1];
5033 hendricks2 1372
static int32_t MEOSV_NetEpisodes[MAXVOLUMES+1];
5547 terminx 1373
static char const *MEOSN_NetLevels[MAXVOLUMES][MAXLEVELS];
1374
static char const *MEOSN_NetSkills[MAXSKILLS+1];
5 Plagman 1375
 
4823 hendricks2 1376
static MenuLink_t MEO_NETHOST_OPTIONS = { MENU_NETOPTIONS, MA_Advance, };
4778 hendricks2 1377
static MenuEntry_t ME_NETHOST_OPTIONS = MAKE_MENUENTRY( "Game Options", &MF_Redfont, &MEF_VideoSetup, &MEO_NETHOST_OPTIONS, Link );
1378
static MenuEntry_t ME_NETHOST_LAUNCH = MAKE_MENUENTRY( "Launch Game", &MF_Redfont, &MEF_VideoSetup, &MEO_NULL, Link );
5 Plagman 1379
 
4496 hendricks2 1380
static MenuEntry_t *MEL_NETHOST[] = {
1381
    &ME_NETHOST_OPTIONS,
1382
    &ME_NETHOST_LAUNCH,
1383
};
471 terminx 1384
 
4778 hendricks2 1385
static MenuOptionSet_t MEOS_NETOPTIONS_GAMETYPE = MAKE_MENUOPTIONSET( MEOSN_NetGametypes, NULL, 0x0 );
4496 hendricks2 1386
static MenuOption_t MEO_NETOPTIONS_GAMETYPE = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_NETOPTIONS_GAMETYPE, &ud.m_coop );
4778 hendricks2 1387
static MenuEntry_t ME_NETOPTIONS_GAMETYPE = MAKE_MENUENTRY( "Game Type", &MF_Redfont, &MEF_NetSetup, &MEO_NETOPTIONS_GAMETYPE, Option );
5033 hendricks2 1388
static MenuOptionSet_t MEOS_NETOPTIONS_EPISODE = MAKE_MENUOPTIONSET( MEOSN_NetEpisodes, MEOSV_NetEpisodes, 0x0 );
1389
static int32_t NetEpisode;
1390
static MenuOption_t MEO_NETOPTIONS_EPISODE = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_NETOPTIONS_EPISODE, &NetEpisode );
4778 hendricks2 1391
static MenuEntry_t ME_NETOPTIONS_EPISODE = MAKE_MENUENTRY( "Episode", &MF_Redfont, &MEF_NetSetup, &MEO_NETOPTIONS_EPISODE, Option );
5034 hendricks2 1392
static MenuOptionSet_t MEOS_NETOPTIONS_LEVEL_TEMPLATE = MAKE_MENUOPTIONSETNULL;
4496 hendricks2 1393
static MenuOptionSet_t MEOS_NETOPTIONS_LEVEL[MAXVOLUMES];
1394
static MenuOption_t MEO_NETOPTIONS_LEVEL = MAKE_MENUOPTION( &MF_Bluefont, NULL, &ud.m_level_number );
4778 hendricks2 1395
static MenuEntry_t ME_NETOPTIONS_LEVEL = MAKE_MENUENTRY( "Level", &MF_Redfont, &MEF_NetSetup, &MEO_NETOPTIONS_LEVEL, Option );
4823 hendricks2 1396
static MenuLink_t MEO_NETOPTIONS_USERMAP = { MENU_NETUSERMAP, MA_Advance, };
4778 hendricks2 1397
static MenuEntry_t ME_NETOPTIONS_USERMAP = MAKE_MENUENTRY( "User Map", &MF_Redfont, &MEF_NetSetup, &MEO_NETOPTIONS_USERMAP, Link );
1398
static MenuOptionSet_t MEOS_NETOPTIONS_MONSTERS = MAKE_MENUOPTIONSET( MEOSN_NetSkills, NULL, 0x0 );
4496 hendricks2 1399
static MenuOption_t MEO_NETOPTIONS_MONSTERS = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_NETOPTIONS_MONSTERS, NULL );
4778 hendricks2 1400
static MenuEntry_t ME_NETOPTIONS_MONSTERS = MAKE_MENUENTRY( "Monsters", &MF_Redfont, &MEF_NetSetup, &MEO_NETOPTIONS_MONSTERS, Option );
4496 hendricks2 1401
static MenuOption_t MEO_NETOPTIONS_MARKERS = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_OffOn, &ud.m_marker );
4778 hendricks2 1402
static MenuEntry_t ME_NETOPTIONS_MARKERS = MAKE_MENUENTRY( "Markers", &MF_Redfont, &MEF_NetSetup, &MEO_NETOPTIONS_MARKERS, Option );
4496 hendricks2 1403
static MenuOption_t MEO_NETOPTIONS_MAPEXITS = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_OnOff, &ud.m_noexits );
4778 hendricks2 1404
static MenuEntry_t ME_NETOPTIONS_MAPEXITS = MAKE_MENUENTRY( "Map Exits", &MF_Redfont, &MEF_NetSetup, &MEO_NETOPTIONS_MAPEXITS, Option );
4496 hendricks2 1405
static MenuOption_t MEO_NETOPTIONS_FRFIRE = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_OffOn, &ud.m_ffire );
4778 hendricks2 1406
static MenuEntry_t ME_NETOPTIONS_FRFIRE = MAKE_MENUENTRY( "Fr. Fire", &MF_Redfont, &MEF_NetSetup, &MEO_NETOPTIONS_FRFIRE, Option );
7242 seventyfiv 1407
static MenuEntry_t ME_NETOPTIONS_ACCEPT = MAKE_MENUENTRY( "Accept", &MF_Redfont, &MEF_NetSetup_Confirm, &MEO_NETWORK_HOSTGAME, Link );
471 terminx 1408
 
4496 hendricks2 1409
static MenuEntry_t *MEL_NETOPTIONS[] = {
1410
    &ME_NETOPTIONS_GAMETYPE,
1411
    &ME_NETOPTIONS_EPISODE,
1412
    &ME_NETOPTIONS_LEVEL,
1413
    &ME_NETOPTIONS_MONSTERS,
1414
    &ME_NETOPTIONS_MARKERS,
1415
    &ME_NETOPTIONS_MAPEXITS,
1416
    &ME_NETOPTIONS_ACCEPT,
1417
};
5 Plagman 1418
 
4496 hendricks2 1419
static char MenuServer[BMAX_PATH] = "localhost";
4778 hendricks2 1420
static MenuString_t MEO_NETJOIN_SERVER = MAKE_MENUSTRING( MenuServer, &MF_Bluefont, BMAX_PATH, 0 );
1421
static MenuEntry_t ME_NETJOIN_SERVER = MAKE_MENUENTRY( "Server", &MF_Redfont, &MEF_VideoSetup, &MEO_NETJOIN_SERVER, String );
4496 hendricks2 1422
#define MAXPORTSTRINGLENGTH 6 // unsigned 16-bit integer
1423
static char MenuPort[MAXPORTSTRINGLENGTH] = "19014";
4778 hendricks2 1424
static MenuString_t MEO_NETJOIN_PORT = MAKE_MENUSTRING( MenuPort, &MF_Bluefont, MAXPORTSTRINGLENGTH, INPUT_NUMERIC );
1425
static MenuEntry_t ME_NETJOIN_PORT = MAKE_MENUENTRY( "Port", &MF_Redfont, &MEF_VideoSetup, &MEO_NETJOIN_PORT, String );
6207 hendricks2 1426
static MenuEntry_t ME_NETJOIN_CONNECT = MAKE_MENUENTRY( "Connect", &MF_Redfont, &MEF_VideoSetup_Apply, &MEO_NULL, Link );
471 terminx 1427
 
4496 hendricks2 1428
static MenuEntry_t *MEL_NETJOIN[] = {
1429
    &ME_NETJOIN_SERVER,
1430
    &ME_NETJOIN_PORT,
1431
    &ME_NETJOIN_CONNECT,
1432
};
5 Plagman 1433
 
1434
 
4496 hendricks2 1435
#define NoTitle NULL
91 terminx 1436
 
5693 hendricks2 1437
#define MAKE_MENUMENU(Title, Format, Entries) { Title, Format, Entries, ARRAY_SIZE(Entries), 0, 0, 0 }
6569 hendricks2 1438
#define MAKE_MENUMENU_CUSTOMSIZE(Title, Format, Entries) { Title, Format, Entries, 0, 0, 0, 0 }
91 terminx 1439
 
4778 hendricks2 1440
static MenuMenu_t M_MAIN = MAKE_MENUMENU( NoTitle, &MMF_Top_Main, MEL_MAIN );
1441
static MenuMenu_t M_MAIN_INGAME = MAKE_MENUMENU( NoTitle, &MMF_Top_Main, MEL_MAIN_INGAME );
1442
static MenuMenu_t M_EPISODE = MAKE_MENUMENU( "Select An Episode", &MMF_Top_Episode, MEL_EPISODE );
1443
static MenuMenu_t M_SKILL = MAKE_MENUMENU( "Select Skill", &MMF_Top_Skill, MEL_SKILL );
7930 hendricks2 1444
static MenuMenu_t M_NEWGAMECUSTOM = MAKE_MENUMENU( s_NewGame, &MMF_Top_NewGameCustom, MEL_NEWGAMECUSTOM );
1445
static MenuMenu_t M_NEWGAMECUSTOMSUB = MAKE_MENUMENU( s_NewGame, &MMF_Top_NewGameCustomSub, MEL_NEWGAMECUSTOMSUB );
8569 terminx 1446
#ifndef EDUKE32_RETAIL_MENU
4778 hendricks2 1447
static MenuMenu_t M_GAMESETUP = MAKE_MENUMENU( "Game Setup", &MMF_BigOptions, MEL_GAMESETUP );
6411 terminx 1448
#endif
6329 hendricks2 1449
static MenuMenu_t M_OPTIONS = MAKE_MENUMENU( s_Options, &MMF_Top_Options, MEL_OPTIONS );
4778 hendricks2 1450
static MenuMenu_t M_VIDEOSETUP = MAKE_MENUMENU( "Video Mode", &MMF_BigOptions, MEL_VIDEOSETUP );
1451
static MenuMenu_t M_KEYBOARDSETUP = MAKE_MENUMENU( "Keyboard Setup", &MMF_Top_Options, MEL_KEYBOARDSETUP );
7959 hendricks2 1452
static MenuMenu_t M_CONTROLS = MAKE_MENUMENU( "Control Setup", &MMF_BigOptions, MEL_CONTROLS );
5084 hendricks2 1453
static MenuMenu_t M_CHEATS = MAKE_MENUMENU( "Cheats", &MMF_SmallOptions, MEL_CHEATS );
4778 hendricks2 1454
static MenuMenu_t M_MOUSESETUP = MAKE_MENUMENU( "Mouse Setup", &MMF_BigOptions, MEL_MOUSESETUP );
6013 terminx 1455
#ifdef EDUKE32_ANDROID_MENU
5652 terminx 1456
static MenuMenu_t M_TOUCHSETUP = MAKE_MENUMENU( "Touch Setup", &MMF_Top_Options, MEL_TOUCHSETUP );
1457
static MenuMenu_t M_TOUCHSENS = MAKE_MENUMENU( "Sensitivity", &MMF_BigOptions, MEL_TOUCHSENS);
6061 hendricks2 1458
static MenuPanel_t M_TOUCHBUTTONS = { "Button Setup", MENU_TOUCHSETUP, MA_Return, MENU_TOUCHSETUP, MA_Advance, };
4993 terminx 1459
#endif
7972 hendricks2 1460
static MenuMenu_t M_JOYSTICKSETUP = MAKE_MENUMENU( "Gamepad Setup", &MMF_BigOptions, MEL_JOYSTICKSETUP );
1461
static MenuMenu_t M_JOYSTICKBTNS = MAKE_MENUMENU( "Gamepad Buttons", &MMF_MouseJoySetupBtns, MEL_JOYSTICKBTNS );
1462
static MenuMenu_t M_JOYSTICKAXES = MAKE_MENUMENU( "Gamepad Axes", &MMF_BigSliders, MEL_JOYSTICKAXES );
6324 terminx 1463
static MenuMenu_t M_KEYBOARDKEYS = MAKE_MENUMENU( "Key Configuration", &MMF_KeyboardSetupFuncs, MEL_KEYBOARDSETUPFUNCS );
4778 hendricks2 1464
static MenuMenu_t M_MOUSEBTNS = MAKE_MENUMENU( "Mouse Buttons", &MMF_MouseJoySetupBtns, MEL_MOUSESETUPBTNS );
1465
static MenuMenu_t M_MOUSEADVANCED = MAKE_MENUMENU( "Advanced Mouse", &MMF_BigSliders, MEL_MOUSEADVANCED );
1466
static MenuMenu_t M_JOYSTICKAXIS = MAKE_MENUMENU( NULL, &MMF_BigSliders, MEL_JOYSTICKAXIS );
4609 terminx 1467
#ifdef USE_OPENGL
5408 terminx 1468
static MenuMenu_t M_RENDERERSETUP_POLYMOST = MAKE_MENUMENU( "Polymost Setup", &MMF_SmallOptions, MEL_RENDERERSETUP_POLYMOST );
5424 helixhorne 1469
# ifdef POLYMER
5408 terminx 1470
static MenuMenu_t M_RENDERERSETUP_POLYMER = MAKE_MENUMENU("Polymer Setup", &MMF_SmallOptions, MEL_RENDERERSETUP_POLYMER );
5424 helixhorne 1471
# endif
4609 terminx 1472
#endif
4778 hendricks2 1473
static MenuMenu_t M_COLCORR = MAKE_MENUMENU( "Color Correction", &MMF_ColorCorrect, MEL_COLCORR );
6289 hendricks2 1474
static MenuMenu_t M_SCREENSETUP = MAKE_MENUMENU( "HUD Setup", &MMF_BigOptions, MEL_SCREENSETUP );
4778 hendricks2 1475
static MenuMenu_t M_DISPLAYSETUP = MAKE_MENUMENU( "Display Setup", &MMF_BigOptions, MEL_DISPLAYSETUP );
6569 hendricks2 1476
static MenuMenu_t M_LOAD = MAKE_MENUMENU_CUSTOMSIZE( s_LoadGame, &MMF_LoadSave, MEL_LOAD );
1477
static MenuMenu_t M_SAVE = MAKE_MENUMENU_CUSTOMSIZE( s_SaveGame, &MMF_LoadSave, MEL_SAVE );
4778 hendricks2 1478
static MenuMenu_t M_SOUND = MAKE_MENUMENU( "Sound Setup", &MMF_BigOptions, MEL_SOUND );
8760 terminx 1479
static MenuMenu_t M_SOUND_DEVSETUP = MAKE_MENUMENU( "Device Configuration", &MMF_BigOptions, MEL_SOUND_DEVSETUP );
6742 hendricks2 1480
static MenuMenu_t M_SAVESETUP = MAKE_MENUMENU( "Save Setup", &MMF_BigOptions, MEL_SAVESETUP );
4778 hendricks2 1481
static MenuMenu_t M_NETWORK = MAKE_MENUMENU( "Network Game", &MMF_Top_Joystick_Network, MEL_NETWORK );
1482
static MenuMenu_t M_PLAYER = MAKE_MENUMENU( "Player Setup", &MMF_SmallOptions, MEL_PLAYER );
1483
static MenuMenu_t M_MACROS = MAKE_MENUMENU( "Multiplayer Macros", &MMF_Macros, MEL_MACROS );
1484
static MenuMenu_t M_NETHOST = MAKE_MENUMENU( "Host Network Game", &MMF_SmallOptionsNarrow, MEL_NETHOST );
1485
static MenuMenu_t M_NETOPTIONS = MAKE_MENUMENU( "Net Game Options", &MMF_NetSetup, MEL_NETOPTIONS );
1486
static MenuMenu_t M_NETJOIN = MAKE_MENUMENU( "Join Network Game", &MMF_SmallOptionsNarrow, MEL_NETJOIN );
88 terminx 1487
 
8569 terminx 1488
#ifdef EDUKE32_RETAIL_MENU
4688 hendricks2 1489
static MenuPanel_t M_STORY = { NoTitle, MENU_STORY, MA_Return, MENU_STORY, MA_Advance, };
4609 terminx 1490
#else
4688 hendricks2 1491
static MenuPanel_t M_STORY = { NoTitle, MENU_F1HELP, MA_Return, MENU_F1HELP, MA_Advance, };
4609 terminx 1492
#endif
1493
 
4688 hendricks2 1494
static MenuPanel_t M_F1HELP = { NoTitle, MENU_STORY, MA_Return, MENU_STORY, MA_Advance, };
1495
static MenuPanel_t M_CREDITS = { NoTitle, MENU_CREDITS5, MA_Return, MENU_CREDITS2, MA_Advance, };
1496
static MenuPanel_t M_CREDITS2 = { NoTitle, MENU_CREDITS, MA_Return, MENU_CREDITS3, MA_Advance, };
1497
static MenuPanel_t M_CREDITS3 = { NoTitle, MENU_CREDITS2, MA_Return, MENU_CREDITS4, MA_Advance, };
6013 terminx 1498
static MenuPanel_t M_CREDITS4 = { "About " APPNAME, MENU_CREDITS3, MA_Return, MENU_CREDITS5, MA_Advance, };
1499
static MenuPanel_t M_CREDITS5 = { "About " APPNAME, MENU_CREDITS4, MA_Return, MENU_CREDITS, MA_Advance, };
5 Plagman 1500
 
4686 hendricks2 1501
#define CURSOR_CENTER_2LINE { MENU_MARGIN_CENTER<<16, 120<<16, }
1502
#define CURSOR_CENTER_3LINE { MENU_MARGIN_CENTER<<16, 129<<16, }
4496 hendricks2 1503
#define CURSOR_BOTTOMRIGHT { 304<<16, 186<<16, }
5 Plagman 1504
 
6756 hendricks2 1505
static MenuVerify_t M_SAVECLEANVERIFY = { CURSOR_CENTER_3LINE, MENU_SAVESETUP, MA_None, };
8114 terminx 1506
static MenuVerify_t M_RESETSTATSVERIFY = { CURSOR_CENTER_3LINE, MENU_SAVESETUP, MA_None, };
4688 hendricks2 1507
static MenuVerify_t M_QUIT = { CURSOR_CENTER_2LINE, MENU_CLOSE, MA_None, };
1508
static MenuVerify_t M_QUITTOTITLE = { CURSOR_CENTER_2LINE, MENU_CLOSE, MA_None, };
1509
static MenuVerify_t M_LOADVERIFY = { CURSOR_CENTER_3LINE, MENU_CLOSE, MA_None, };
6756 hendricks2 1510
static MenuVerify_t M_LOADDELVERIFY = { CURSOR_CENTER_3LINE, MENU_LOAD, MA_None, };
4688 hendricks2 1511
static MenuVerify_t M_NEWVERIFY = { CURSOR_CENTER_2LINE, MENU_EPISODE, MA_Advance, };
1512
static MenuVerify_t M_SAVEVERIFY = { CURSOR_CENTER_2LINE, MENU_SAVE, MA_None, };
6750 hendricks2 1513
static MenuVerify_t M_SAVEDELVERIFY = { CURSOR_CENTER_3LINE, MENU_SAVE, MA_None, };
4688 hendricks2 1514
static MenuVerify_t M_RESETPLAYER = { CURSOR_CENTER_3LINE, MENU_CLOSE, MA_None, };
5 Plagman 1515
 
7971 hendricks2 1516
static MenuVerify_t M_COLCORRRESETVERIFY = { CURSOR_CENTER_2LINE, MENU_COLCORR, MA_None, };
1517
static MenuVerify_t M_KEYSRESETVERIFY = { CURSOR_CENTER_2LINE, MENU_KEYBOARDSETUP, MA_None, };
1518
static MenuVerify_t M_KEYSCLASSICVERIFY = { CURSOR_CENTER_2LINE, MENU_KEYBOARDSETUP, MA_None, };
1519
static MenuVerify_t M_JOYSTANDARDVERIFY = { CURSOR_CENTER_2LINE, MENU_JOYSTICKSETUP, MA_None, };
1520
static MenuVerify_t M_JOYPROVERIFY = { CURSOR_CENTER_2LINE, MENU_JOYSTICKSETUP, MA_None, };
1521
static MenuVerify_t M_JOYCLEARVERIFY = { CURSOR_CENTER_2LINE, MENU_JOYSTICKSETUP, MA_None, };
1522
 
4688 hendricks2 1523
static MenuMessage_t M_NETWAITMASTER = { CURSOR_BOTTOMRIGHT, MENU_NULL, MA_None, };
1524
static MenuMessage_t M_NETWAITVOTES = { CURSOR_BOTTOMRIGHT, MENU_NULL, MA_None, };
1525
static MenuMessage_t M_BUYDUKE = { CURSOR_BOTTOMRIGHT, MENU_EPISODE, MA_Return, };
5 Plagman 1526
 
5083 hendricks2 1527
static MenuTextForm_t M_ADULTPASSWORD = { NULL, "Enter Password:", MAXPWLOCKOUT, MTF_Password };
5084 hendricks2 1528
static MenuTextForm_t M_CHEATENTRY = { NULL, "Enter Cheat Code:", MAXCHEATLEN, 0 };
1529
static MenuTextForm_t M_CHEAT_WARP = { NULL, "Enter Warp #:", 3, 0 };
1530
static MenuTextForm_t M_CHEAT_SKILL = { NULL, "Enter Skill #:", 1, 0 };
5 Plagman 1531
 
7999 hendricks2 1532
#define MAKE_MENUFILESELECT(a, dir, b, c) { a, { &MMF_FileSelectLeft, &MMF_FileSelectRight }, { &MF_Minifont, &MF_Minifont }, dir, b, c, { NULL, NULL }, { 0, 0 }, { 3<<16, 3<<16 }, FNLIST_INITIALIZER, 0 }
337 terminx 1533
 
7999 hendricks2 1534
static MenuFileSelect_t M_USERMAP = MAKE_MENUFILESELECT( "Select A User Map", "./usermaps/", "*.map", boardfilename );
337 terminx 1535
 
8760 terminx 1536
static MenuFileSelect_t M_SOUND_SF2 = MAKE_MENUFILESELECT( "Select Sound Bank", "./", "*.sf2", sf2bankfile);
1537
 
4496 hendricks2 1538
// MUST be in ascending order of MenuID enum values due to binary search
1539
static Menu_t Menus[] = {
4778 hendricks2 1540
    { &M_MAIN, MENU_MAIN, MENU_CLOSE, MA_None, Menu },
1541
    { &M_MAIN_INGAME, MENU_MAIN_INGAME, MENU_CLOSE, MA_None, Menu },
1542
    { &M_EPISODE, MENU_EPISODE, MENU_MAIN, MA_Return, Menu },
8501 hendricks2 1543
    { &M_USERMAP, MENU_USERMAP, MENU_EPISODE, MA_Return, FileSelect },
7930 hendricks2 1544
    { &M_NEWGAMECUSTOM, MENU_NEWGAMECUSTOM, MENU_MAIN, MA_Return, Menu },
1545
    { &M_NEWGAMECUSTOMSUB, MENU_NEWGAMECUSTOMSUB, MENU_NEWGAMECUSTOM, MA_Return, Menu },
1546
    { &M_SKILL, MENU_SKILL, MENU_PREVIOUS, MA_Return, Menu },
8569 terminx 1547
#ifndef EDUKE32_RETAIL_MENU
4778 hendricks2 1548
    { &M_GAMESETUP, MENU_GAMESETUP, MENU_OPTIONS, MA_Return, Menu },
6411 terminx 1549
#endif
4778 hendricks2 1550
    { &M_OPTIONS, MENU_OPTIONS, MENU_MAIN, MA_Return, Menu },
1551
    { &M_VIDEOSETUP, MENU_VIDEOSETUP, MENU_DISPLAYSETUP, MA_Return, Menu },
1552
    { &M_KEYBOARDSETUP, MENU_KEYBOARDSETUP, MENU_CONTROLS, MA_Return, Menu },
1553
    { &M_MOUSESETUP, MENU_MOUSESETUP, MENU_CONTROLS, MA_Return, Menu },
1554
    { &M_JOYSTICKSETUP, MENU_JOYSTICKSETUP, MENU_CONTROLS, MA_Return, Menu },
1555
    { &M_JOYSTICKBTNS, MENU_JOYSTICKBTNS, MENU_JOYSTICKSETUP, MA_Return, Menu },
1556
    { &M_JOYSTICKAXES, MENU_JOYSTICKAXES, MENU_JOYSTICKSETUP, MA_Return, Menu },
1557
    { &M_KEYBOARDKEYS, MENU_KEYBOARDKEYS, MENU_KEYBOARDSETUP, MA_Return, Menu },
1558
    { &M_MOUSEBTNS, MENU_MOUSEBTNS, MENU_MOUSESETUP, MA_Return, Menu },
1559
    { &M_MOUSEADVANCED, MENU_MOUSEADVANCED, MENU_MOUSESETUP, MA_Return, Menu },
1560
    { &M_JOYSTICKAXIS, MENU_JOYSTICKAXIS, MENU_JOYSTICKAXES, MA_Return, Menu },
6013 terminx 1561
#ifdef EDUKE32_ANDROID_MENU
4993 terminx 1562
    { &M_TOUCHSETUP, MENU_TOUCHSETUP, MENU_OPTIONS, MA_Return, Menu },
5652 terminx 1563
    { &M_TOUCHSENS, MENU_TOUCHSENS, MENU_TOUCHSETUP, MA_Return, Menu },
5661 terminx 1564
    { &M_TOUCHBUTTONS, MENU_TOUCHBUTTONS, MENU_TOUCHSETUP, MA_Return, Panel },
4993 terminx 1565
#endif
4778 hendricks2 1566
    { &M_CONTROLS, MENU_CONTROLS, MENU_OPTIONS, MA_Return, Menu },
4609 terminx 1567
#ifdef USE_OPENGL
5408 terminx 1568
    { &M_RENDERERSETUP_POLYMOST, MENU_POLYMOST, MENU_DISPLAYSETUP, MA_Return, Menu },
4609 terminx 1569
#endif
4778 hendricks2 1570
    { &M_COLCORR, MENU_COLCORR, MENU_DISPLAYSETUP, MA_Return, Menu },
1571
    { &M_COLCORR, MENU_COLCORR_INGAME, MENU_CLOSE, MA_Return, Menu },
1572
    { &M_SCREENSETUP, MENU_SCREENSETUP, MENU_DISPLAYSETUP, MA_Return, Menu },
1573
    { &M_DISPLAYSETUP, MENU_DISPLAYSETUP, MENU_OPTIONS, MA_Return, Menu },
5408 terminx 1574
#ifdef POLYMER
5424 helixhorne 1575
    { &M_RENDERERSETUP_POLYMER, MENU_POLYMER, MENU_DISPLAYSETUP, MA_Return, Menu },
5408 terminx 1576
#endif
4778 hendricks2 1577
    { &M_LOAD, MENU_LOAD, MENU_MAIN, MA_Return, Menu },
1578
    { &M_SAVE, MENU_SAVE, MENU_MAIN, MA_Return, Menu },
1579
    { &M_STORY, MENU_STORY, MENU_MAIN, MA_Return, Panel },
1580
    { &M_F1HELP, MENU_F1HELP, MENU_MAIN, MA_Return, Panel },
1581
    { &M_QUIT, MENU_QUIT, MENU_PREVIOUS, MA_Return, Verify },
1582
    { &M_QUITTOTITLE, MENU_QUITTOTITLE, MENU_PREVIOUS, MA_Return, Verify },
1583
    { &M_QUIT, MENU_QUIT_INGAME, MENU_CLOSE, MA_None, Verify },
1584
    { &M_NETHOST, MENU_NETSETUP, MENU_MAIN, MA_Return, Menu },
1585
    { &M_NETWAITMASTER, MENU_NETWAITMASTER, MENU_MAIN, MA_Return, Message },
1586
    { &M_NETWAITVOTES, MENU_NETWAITVOTES, MENU_MAIN, MA_Return, Message },
1587
    { &M_SOUND, MENU_SOUND, MENU_OPTIONS, MA_Return, Menu },
1588
    { &M_SOUND, MENU_SOUND_INGAME, MENU_CLOSE, MA_Return, Menu },
8760 terminx 1589
    { &M_SOUND_DEVSETUP, MENU_SOUND_DEVSETUP, MENU_SOUND, MA_Return, Menu },
8764 terminx 1590
#ifndef EDUKE32_RETAIL_MENU
8760 terminx 1591
    { &M_SOUND_SF2, MENU_SOUND_SF2, MENU_SOUND_DEVSETUP, MA_Return, FileSelect },
8764 terminx 1592
#endif
6742 hendricks2 1593
    { &M_SAVESETUP, MENU_SAVESETUP, MENU_OPTIONS, MA_Return, Menu },
6750 hendricks2 1594
    { &M_SAVECLEANVERIFY, MENU_SAVECLEANVERIFY, MENU_SAVESETUP, MA_None, Verify },
8114 terminx 1595
    { &M_RESETSTATSVERIFY, MENU_RESETSTATSVERIFY, MENU_SAVESETUP, MA_None, Verify },
8569 terminx 1596
#ifdef EDUKE32_RETAIL_MENU
6409 terminx 1597
    { &M_CHEATS, MENU_CHEATS, MENU_OPTIONS, MA_Return, Menu },
1598
#else
5517 hendricks2 1599
    { &M_CHEATS, MENU_CHEATS, MENU_GAMESETUP, MA_Return, Menu },
6409 terminx 1600
#endif
5084 hendricks2 1601
    { &M_CHEATENTRY, MENU_CHEATENTRY, MENU_CHEATS, MA_None, TextForm },
1602
    { &M_CHEAT_WARP, MENU_CHEAT_WARP, MENU_CHEATS, MA_None, TextForm },
1603
    { &M_CHEAT_SKILL, MENU_CHEAT_SKILL, MENU_CHEATS, MA_None, TextForm },
4778 hendricks2 1604
    { &M_CREDITS, MENU_CREDITS, MENU_MAIN, MA_Return, Panel },
1605
    { &M_CREDITS2, MENU_CREDITS2, MENU_MAIN, MA_Return, Panel },
1606
    { &M_CREDITS3, MENU_CREDITS3, MENU_MAIN, MA_Return, Panel },
1607
    { &M_CREDITS4, MENU_CREDITS4, MENU_MAIN, MA_Return, Panel },
1608
    { &M_CREDITS5, MENU_CREDITS5, MENU_MAIN, MA_Return, Panel },
1609
    { &M_LOADVERIFY, MENU_LOADVERIFY, MENU_LOAD, MA_None, Verify },
6750 hendricks2 1610
    { &M_LOADDELVERIFY, MENU_LOADDELVERIFY, MENU_LOAD, MA_None, Verify },
1611
    { &M_NEWVERIFY, MENU_NEWVERIFY, MENU_PREVIOUS, MA_Return, Verify },
4778 hendricks2 1612
    { &M_SAVEVERIFY, MENU_SAVEVERIFY, MENU_SAVE, MA_None, Verify },
6750 hendricks2 1613
    { &M_SAVEDELVERIFY, MENU_SAVEDELVERIFY, MENU_SAVE, MA_None, Verify },
7971 hendricks2 1614
    { &M_COLCORRRESETVERIFY, MENU_COLCORRRESETVERIFY, MENU_COLCORR, MA_None, Verify },
1615
    { &M_KEYSRESETVERIFY, MENU_KEYSRESETVERIFY, MENU_KEYBOARDSETUP, MA_None, Verify },
1616
    { &M_KEYSCLASSICVERIFY, MENU_KEYSCLASSICVERIFY, MENU_KEYBOARDSETUP, MA_None, Verify },
1617
    { &M_JOYSTANDARDVERIFY, MENU_JOYSTANDARDVERIFY, MENU_JOYSTICKSETUP, MA_None, Verify },
1618
    { &M_JOYPROVERIFY, MENU_JOYPROVERIFY, MENU_JOYSTICKSETUP, MA_None, Verify },
1619
    { &M_JOYCLEARVERIFY, MENU_JOYCLEARVERIFY, MENU_JOYSTICKSETUP, MA_None, Verify },
5083 hendricks2 1620
    { &M_ADULTPASSWORD, MENU_ADULTPASSWORD, MENU_GAMESETUP, MA_None, TextForm },
4778 hendricks2 1621
    { &M_RESETPLAYER, MENU_RESETPLAYER, MENU_CLOSE, MA_None, Verify },
1622
    { &M_BUYDUKE, MENU_BUYDUKE, MENU_EPISODE, MA_Return, Message },
1623
    { &M_NETWORK, MENU_NETWORK, MENU_MAIN, MA_Return, Menu },
1624
    { &M_PLAYER, MENU_PLAYER, MENU_OPTIONS, MA_Return, Menu },
1625
    { &M_MACROS, MENU_MACROS, MENU_PLAYER, MA_Return, Menu },
1626
    { &M_NETHOST, MENU_NETHOST, MENU_NETWORK, MA_Return, Menu },
1627
    { &M_NETOPTIONS, MENU_NETOPTIONS, MENU_NETWORK, MA_Return, Menu },
1628
    { &M_USERMAP, MENU_NETUSERMAP, MENU_NETOPTIONS, MA_Return, FileSelect },
1629
    { &M_NETJOIN, MENU_NETJOIN, MENU_NETWORK, MA_Return, Menu },
4496 hendricks2 1630
};
337 terminx 1631
 
7114 terminx 1632
static CONSTEXPR const uint16_t numMenus = ARRAY_SIZE(Menus);
337 terminx 1633
 
4496 hendricks2 1634
Menu_t *m_currentMenu = &Menus[0];
1635
static Menu_t *m_previousMenu = &Menus[0];
6289 hendricks2 1636
static Menu_t * m_parentMenu;
5 Plagman 1637
 
4496 hendricks2 1638
MenuID_t g_currentMenu;
1639
static MenuID_t g_previousMenu;
337 terminx 1640
 
4778 hendricks2 1641
#define MenuMenu_ChangeEntryList(m, el)\
4496 hendricks2 1642
    do {\
4778 hendricks2 1643
        m.entrylist = el;\
1644
        m.numEntries = ARRAY_SIZE(el);\
4496 hendricks2 1645
    } while (0)
5 Plagman 1646
 
4855 hendricks2 1647
static void MenuEntry_DisableOnCondition(MenuEntry_t * const entry, const int32_t condition)
1648
{
1649
    if (condition)
6204 hendricks2 1650
        entry->flags |= MEF_Disabled;
4855 hendricks2 1651
    else
6204 hendricks2 1652
        entry->flags &= ~MEF_Disabled;
4855 hendricks2 1653
}
6329 hendricks2 1654
static void MenuEntry_LookDisabledOnCondition(MenuEntry_t * const entry, const int32_t condition)
1655
{
1656
    if (condition)
1657
        entry->flags |= MEF_LookDisabled;
1658
    else
1659
        entry->flags &= ~MEF_LookDisabled;
1660
}
6676 hendricks2 1661
static void MenuEntry_HideOnCondition(MenuEntry_t * const entry, const int32_t condition)
1662
{
1663
    if (condition)
1664
        entry->flags |= MEF_Hidden;
1665
    else
1666
        entry->flags &= ~MEF_Hidden;
1667
}
5 Plagman 1668
 
8499 hendricks2 1669
static int32_t M_RunMenu_Menu(Menu_t *cm, MenuMenu_t *menu, MenuEntry_t *currentry, int32_t state, vec2_t origin, int actually_draw = 1);
6569 hendricks2 1670
static void Menu_EntryFocus(/*MenuEntry_t *entry*/);
1671
 
1672
static MenuEntry_t *Menu_AdjustForCurrentEntryAssignment(MenuMenu_t *menu)
1673
{
1674
    MenuEntry_t *currentry = menu->entrylist[menu->currentEntry];
1675
 
1676
    Menu_EntryFocus(/*currentry*/);
1677
 
1678
    if (currentry->ybottom - menu->scrollPos > klabs(menu->format->bottomcutoff))
1679
        menu->scrollPos = currentry->ybottom - klabs(menu->format->bottomcutoff);
1680
    else if (currentry->ytop - menu->scrollPos < menu->format->pos.y)
1681
        menu->scrollPos = currentry->ytop - menu->format->pos.y;
1682
 
1683
    return currentry;
1684
}
1685
 
1686
static MenuEntry_t *Menu_AdjustForCurrentEntryAssignmentBlind(MenuMenu_t *menu)
1687
{
8499 hendricks2 1688
    M_RunMenu_Menu(nullptr, menu, nullptr, 0, { 0, 0 }, 0);
6569 hendricks2 1689
    return Menu_AdjustForCurrentEntryAssignment(menu);
1690
}
1691
 
6751 hendricks2 1692
static int32_t SELECTDIR_z = 65536;
1693
 
7930 hendricks2 1694
void Menu_PopulateNewGameCustom(void)
1695
{
1696
    M_NEWGAMECUSTOM.title = s_NewGame;
1697
 
1698
    int e = 0;
1699
    for (MenuGameplayStemEntry const & stem : g_MenuGameplayEntries)
1700
    {
1701
        MenuGameplayEntry const & entry = stem.entry;
1702
        if (!entry.isValid())
1703
            break;
1704
 
1705
        MEL_NEWGAMECUSTOM[e] = &ME_NEWGAMECUSTOMENTRIES[e];
1706
 
1707
        ++e;
1708
    }
1709
    M_NEWGAMECUSTOM.numEntries = e;
1710
    MMF_Top_NewGameCustom.pos.y = (58 + (3-e)*6)<<16;
1711
}
1712
 
1713
void Menu_PopulateNewGameCustomSub(int e)
1714
{
1715
    if ((unsigned)e >= MAXMENUGAMEPLAYENTRIES)
1716
        return;
1717
 
1718
    MenuGameplayStemEntry const & stem = g_MenuGameplayEntries[e];
1719
    MenuGameplayEntry const & entry = stem.entry;
1720
    if (!entry.isValid())
1721
        return;
1722
 
1723
    M_NEWGAMECUSTOMSUB.title = entry.name;
1724
 
1725
    int s = 0;
1726
    for (MenuGameplayEntry const & subentry : stem.subentries)
1727
    {
1728
        if (!subentry.isValid())
1729
            break;
1730
 
1731
        MEL_NEWGAMECUSTOMSUB[s] = &ME_NEWGAMECUSTOMSUBENTRIES[e][s];
1732
 
1733
        ++s;
1734
    }
1735
    M_NEWGAMECUSTOMSUB.numEntries = s;
1736
    MMF_Top_NewGameCustomSub.pos.y = (58 + (3-s)*6)<<16;
1737
}
1738
 
4496 hendricks2 1739
/*
1740
This function prepares data after ART and CON have been processed.
1741
It also initializes some data in loops rather than statically at compile time.
1742
*/
5923 terminx 1743
void Menu_Init(void)
4496 hendricks2 1744
{
1745
    int32_t i, j, k;
5 Plagman 1746
 
8017 terminx 1747
    if (FURY)
1748
    {
1749
        MMF_Top_Skill.pos.x = (320<<15);
1750
        ME_SKILL_TEMPLATE.format = &MEF_LeftMenu;
1751
    }
1752
 
4496 hendricks2 1753
    // prepare menu fonts
6613 hendricks2 1754
    // check if tilenum is -1 in case it was set in EVENT_SETDEFAULTS
1755
    if ((unsigned)MF_Redfont.tilenum >= MAXTILES) MF_Redfont.tilenum = BIGALPHANUM;
1756
    if ((unsigned)MF_Bluefont.tilenum >= MAXTILES) MF_Bluefont.tilenum = STARTALPHANUM;
1757
    if ((unsigned)MF_Minifont.tilenum >= MAXTILES) MF_Minifont.tilenum = MINIFONT;
1758
    MF_Redfont.emptychar.y = tilesiz[MF_Redfont.tilenum].y<<16;
1759
    MF_Bluefont.emptychar.y = tilesiz[MF_Bluefont.tilenum].y<<16;
1760
    MF_Minifont.emptychar.y = tilesiz[MF_Minifont.tilenum].y<<16;
4496 hendricks2 1761
    if (!minitext_lowercase)
1762
        MF_Minifont.textflags |= TEXT_UPPERCASE;
5 Plagman 1763
 
4496 hendricks2 1764
    // prepare gamefuncs and keys
6185 hendricks2 1765
    MEOSN_Gamefuncs[0] = MenuGameFuncNone;
1766
    MEOSV_Gamefuncs[0] = -1;
1767
    k = 1;
4496 hendricks2 1768
    for (i = 0; i < NUMGAMEFUNCTIONS; ++i)
1769
    {
1770
        Bstrcpy(MenuGameFuncs[i], gamefunctions[i]);
5 Plagman 1771
 
4496 hendricks2 1772
        for (j = 0; j < MAXGAMEFUNCLEN; ++j)
1773
            if (MenuGameFuncs[i][j] == '_')
1774
                MenuGameFuncs[i][j] = ' ';
5 Plagman 1775
 
6185 hendricks2 1776
        if (gamefunctions[i][0] != '\0')
1777
        {
1778
            MEOSN_Gamefuncs[k] = MenuGameFuncs[i];
1779
            MEOSV_Gamefuncs[k] = i;
1780
            ++k;
1781
        }
4496 hendricks2 1782
    }
6185 hendricks2 1783
    MEOS_Gamefuncs.numOptions = k;
1784
 
8303 hendricks2 1785
    for (i = 1; i < NUMKEYS-1; ++i)
6827 terminx 1786
        MEOSN_Keys[i] = g_keyNameTable[i];
8303 hendricks2 1787
    MEOSN_Keys[0] = MenuKeyNone;
4496 hendricks2 1788
    MEOSN_Keys[NUMKEYS-1] = MenuKeyNone;
5 Plagman 1789
 
1790
 
4496 hendricks2 1791
    // prepare episodes
5033 hendricks2 1792
    k = 0;
5835 terminx 1793
    for (i = 0; i < g_volumeCnt; ++i)
4496 hendricks2 1794
    {
5835 terminx 1795
        if (g_volumeNames[i][0])
337 terminx 1796
        {
5835 terminx 1797
            if (!(g_volumeFlags[i] & EF_HIDEFROMSP))
5033 hendricks2 1798
            {
1799
                MEL_EPISODE[i] = &ME_EPISODE[i];
1800
                ME_EPISODE[i] = ME_EPISODE_TEMPLATE;
5835 terminx 1801
                ME_EPISODE[i].name = g_volumeNames[i];
5033 hendricks2 1802
            }
4496 hendricks2 1803
 
5041 hendricks2 1804
            // if (!(EpisodeFlags[i] & EF_HIDEFROMMP))
5033 hendricks2 1805
            {
5835 terminx 1806
                MEOSN_NetEpisodes[k] = g_volumeNames[i];
5033 hendricks2 1807
                MEOSV_NetEpisodes[k] = i;
4496 hendricks2 1808
 
5033 hendricks2 1809
                k++;
1810
            }
337 terminx 1811
        }
5 Plagman 1812
 
4496 hendricks2 1813
        // prepare levels
5034 hendricks2 1814
        MEOS_NETOPTIONS_LEVEL[i] = MEOS_NETOPTIONS_LEVEL_TEMPLATE;
4496 hendricks2 1815
        for (j = 0; j < MAXLEVELS; ++j)
337 terminx 1816
        {
5835 terminx 1817
            MEOSN_NetLevels[i][j] = g_mapInfo[MAXLEVELS*i+j].name;
1818
            if (g_mapInfo[i*MAXLEVELS+j].filename != NULL)
4496 hendricks2 1819
                MEOS_NETOPTIONS_LEVEL[i].numOptions = j+1;
337 terminx 1820
        }
4496 hendricks2 1821
        MEOS_NETOPTIONS_LEVEL[i].optionNames = MEOSN_NetLevels[i];
1822
    }
5835 terminx 1823
    M_EPISODE.numEntries = g_volumeCnt+2;
8569 terminx 1824
#if 1 //ifndef EDUKE32_SIMPLE_MENU
6198 hendricks2 1825
    MEL_EPISODE[g_volumeCnt] = &ME_Space4_Redfont;
5835 terminx 1826
    MEL_EPISODE[g_volumeCnt+1] = &ME_EPISODE_USERMAP;
5033 hendricks2 1827
    MEOSN_NetEpisodes[k] = MenuUserMap;
1828
    MEOSV_NetEpisodes[k] = MAXVOLUMES;
6415 terminx 1829
#else
1830
    M_EPISODE.numEntries = g_volumeCnt;
1831
    k--;
1832
#endif
1833
    MEOS_NETOPTIONS_EPISODE.numOptions = k + 1;
5033 hendricks2 1834
    NetEpisode = MEOSV_NetEpisodes[0];
6193 hendricks2 1835
    MMF_Top_Episode.pos.y = (58 + (3-k)*6)<<16;
5835 terminx 1836
    if (g_skillCnt == 0)
4977 hendricks2 1837
        MEO_EPISODE.linkID = MENU_NULL;
6596 hendricks2 1838
    M_EPISODE.currentEntry = ud.default_volume;
5 Plagman 1839
 
7930 hendricks2 1840
    // prepare new game custom :O
1841
    if (g_MenuGameplayEntries[0].entry.isValid())
1842
    {
1843
        MEO_MAIN_NEWGAME.linkID = M_NEWVERIFY.linkID = MENU_NEWGAMECUSTOM;
1844
 
1845
        int e = 0;
1846
        for (MenuGameplayStemEntry const & stem : g_MenuGameplayEntries)
1847
        {
1848
            MenuGameplayEntry const & entry = stem.entry;
1849
            if (!entry.isValid())
1850
                break;
1851
 
1852
            MenuEntry_t & e_me = ME_NEWGAMECUSTOMENTRIES[e];
1853
            e_me = ME_EPISODE_TEMPLATE;
1854
            MenuLink_t & e_meo = MEO_NEWGAMECUSTOM[e];
1855
            e_meo = MEO_NEWGAMECUSTOM_TEMPLATE;
1856
            e_me.entry = &e_meo;
1857
 
1858
            e_me.name = entry.name;
1859
            if (entry.flags & MGE_Locked)
1860
                e_me.flags |= MEF_Disabled;
1861
            if (entry.flags & MGE_Hidden)
1862
                e_me.flags |= MEF_Hidden;
1863
 
1864
            int s = 0;
1865
            for (MenuGameplayEntry const & subentry : stem.subentries)
1866
            {
1867
                if (!subentry.isValid())
1868
                    break;
1869
 
1870
                MenuEntry_t & s_me = ME_NEWGAMECUSTOMSUBENTRIES[e][s];
1871
                s_me = ME_EPISODE_TEMPLATE;
1872
                MenuLink_t & s_meo = MEO_NEWGAMECUSTOMSUB[e][s];
1873
                s_meo = MEO_NEWGAMECUSTOMSUB_TEMPLATE;
1874
                s_me.entry = &s_meo;
1875
 
1876
                s_me.name = subentry.name;
1877
                if (subentry.flags & MGE_Locked)
1878
                    s_me.flags |= MEF_Disabled;
1879
                if (subentry.flags & MGE_Hidden)
1880
                    s_me.flags |= MEF_Hidden;
1881
 
1882
                ++s;
1883
            }
1884
 
7998 hendricks2 1885
            if (entry.flags & MGE_UserContent)
1886
                e_meo.linkID = MENU_USERMAP;
1887
            else if (s == 0)
7930 hendricks2 1888
                e_meo.linkID = MENU_SKILL;
1889
 
1890
            ++e;
1891
        }
1892
 
1893
        Menu_PopulateNewGameCustom();
1894
    }
1895
 
4496 hendricks2 1896
    // prepare skills
1897
    k = -1;
5835 terminx 1898
    for (i = 0; i < g_skillCnt && g_skillNames[i][0]; ++i)
4496 hendricks2 1899
    {
1900
        MEL_SKILL[i] = &ME_SKILL[i];
1901
        ME_SKILL[i] = ME_SKILL_TEMPLATE;
5835 terminx 1902
        ME_SKILL[i].name = g_skillNames[i];
5 Plagman 1903
 
5835 terminx 1904
        MEOSN_NetSkills[i] = g_skillNames[i];
5 Plagman 1905
 
4496 hendricks2 1906
        k = i;
1907
    }
1908
    ++k;
5835 terminx 1909
    M_SKILL.numEntries = g_skillCnt; // k;
1910
    MEOS_NETOPTIONS_MONSTERS.numOptions = g_skillCnt + 1; // k+1;
1911
    MEOSN_NetSkills[g_skillCnt] = MenuSkillNone;
1912
    MMF_Top_Skill.pos.y = (58 + (4-g_skillCnt)*6)<<16;
6596 hendricks2 1913
    M_SKILL.currentEntry = ud.default_skill;
6569 hendricks2 1914
    Menu_AdjustForCurrentEntryAssignmentBlind(&M_SKILL);
5 Plagman 1915
 
4496 hendricks2 1916
    // prepare multiplayer gametypes
1917
    k = -1;
1918
    for (i = 0; i < MAXGAMETYPES; ++i)
5835 terminx 1919
        if (g_gametypeNames[i][0])
4496 hendricks2 1920
        {
5835 terminx 1921
            MEOSN_NetGametypes[i] = g_gametypeNames[i];
4496 hendricks2 1922
            k = i;
1923
        }
1924
    ++k;
1925
    MEOS_NETOPTIONS_GAMETYPE.numOptions = k;
5452 hendricks2 1926
    if (NAM_WW2GI)
1927
        ME_NETOPTIONS_MONSTERS.name = "Enemies";
5 Plagman 1928
 
6676 hendricks2 1929
    // prepare cheats
1930
    for (i = 0; i < NUMCHEATFUNCS; ++i)
1931
        MEL_CHEATS[i+1] = &ME_CheatCodes[i];
1932
 
4496 hendricks2 1933
    // prepare text chat macros
1934
    for (i = 0; i < MAXRIDECULE; ++i)
1935
    {
1936
        MEL_MACROS[i] = &ME_MACROS[i];
1937
        ME_MACROS[i] = ME_MACROS_TEMPLATE;
1938
        ME_MACROS[i].entry = &MEO_MACROS[i];
1939
        MEO_MACROS[i] = MEO_MACROS_TEMPLATE;
5 Plagman 1940
 
4496 hendricks2 1941
        MEO_MACROS[i].variable = ud.ridecule[i];
1942
    }
1943
 
1944
    // prepare input
1945
    for (i = 0; i < NUMGAMEFUNCTIONS; ++i)
1946
    {
6185 hendricks2 1947
        if (MenuGameFuncs[i][0] == '\0')
6350 hendricks2 1948
        {
1949
            MEL_KEYBOARDSETUPFUNCS[i] = NULL;
6185 hendricks2 1950
            continue;
6350 hendricks2 1951
        }
6185 hendricks2 1952
 
6350 hendricks2 1953
        MEL_KEYBOARDSETUPFUNCS[i] = &ME_KEYBOARDSETUPFUNCS[i];
1954
        ME_KEYBOARDSETUPFUNCS[i] = ME_KEYBOARDSETUPFUNCS_TEMPLATE;
1955
        ME_KEYBOARDSETUPFUNCS[i].name = MenuGameFuncs[i];
1956
        ME_KEYBOARDSETUPFUNCS[i].entry = &MEO_KEYBOARDSETUPFUNCS[i];
1957
        MEO_KEYBOARDSETUPFUNCS[i] = MEO_KEYBOARDSETUPFUNCS_TEMPLATE;
1958
        MEO_KEYBOARDSETUPFUNCS[i].column[0] = &ud.config.KeyboardKeys[i][0];
1959
        MEO_KEYBOARDSETUPFUNCS[i].column[1] = &ud.config.KeyboardKeys[i][1];
4496 hendricks2 1960
    }
6350 hendricks2 1961
    M_KEYBOARDKEYS.numEntries = NUMGAMEFUNCTIONS;
4496 hendricks2 1962
    for (i = 0; i < MENUMOUSEFUNCTIONS; ++i)
1963
    {
1964
        MEL_MOUSESETUPBTNS[i] = &ME_MOUSESETUPBTNS[i];
1965
        ME_MOUSESETUPBTNS[i] = ME_MOUSEJOYSETUPBTNS_TEMPLATE;
1966
        ME_MOUSESETUPBTNS[i].name = MenuMouseNames[i];
1967
        ME_MOUSESETUPBTNS[i].entry = &MEO_MOUSESETUPBTNS[i];
1968
        MEO_MOUSESETUPBTNS[i] = MEO_MOUSEJOYSETUPBTNS_TEMPLATE;
1969
        MEO_MOUSESETUPBTNS[i].data = &ud.config.MouseFunctions[MenuMouseDataIndex[i][0]][MenuMouseDataIndex[i][1]];
1970
    }
6827 terminx 1971
    for (i = 0; i < 2*joystick.numButtons + 8*joystick.numHats; ++i)
4496 hendricks2 1972
    {
6827 terminx 1973
        if (i < 2*joystick.numButtons)
337 terminx 1974
        {
4496 hendricks2 1975
            if (i & 1)
6827 terminx 1976
                Bsnprintf(MenuJoystickNames[i], MAXJOYBUTTONSTRINGLENGTH, "Double %s", joyGetName(1, i>>1));
4496 hendricks2 1977
            else
6827 terminx 1978
                Bstrncpy(MenuJoystickNames[i], joyGetName(1, i>>1), MAXJOYBUTTONSTRINGLENGTH);
337 terminx 1979
        }
1980
        else
1981
        {
6827 terminx 1982
            Bsnprintf(MenuJoystickNames[i], MAXJOYBUTTONSTRINGLENGTH, (i & 1) ? "Double Hat %d %s" : "Hat %d %s", ((i - 2*joystick.numButtons)>>3), MenuJoystickHatDirections[((i - 2*joystick.numButtons)>>1) % 4]);
337 terminx 1983
        }
5 Plagman 1984
 
4496 hendricks2 1985
        MEL_JOYSTICKBTNS[i] = &ME_JOYSTICKBTNS[i];
1986
        ME_JOYSTICKBTNS[i] = ME_MOUSEJOYSETUPBTNS_TEMPLATE;
1987
        ME_JOYSTICKBTNS[i].name = MenuJoystickNames[i];
1988
        ME_JOYSTICKBTNS[i].entry = &MEO_JOYSTICKBTNS[i];
1989
        MEO_JOYSTICKBTNS[i] = MEO_MOUSEJOYSETUPBTNS_TEMPLATE;
1990
        MEO_JOYSTICKBTNS[i].data = &ud.config.JoystickFunctions[i>>1][i&1];
4399 hendricks2 1991
    }
6827 terminx 1992
    M_JOYSTICKBTNS.numEntries = 2*joystick.numButtons + 8*joystick.numHats;
1993
    for (i = 0; i < joystick.numAxes; ++i)
4496 hendricks2 1994
    {
1995
        ME_JOYSTICKAXES[i] = ME_JOYSTICKAXES_TEMPLATE;
6827 terminx 1996
        Bstrncpy(MenuJoystickAxes[i], joyGetName(0, i), MAXJOYBUTTONSTRINGLENGTH);
4496 hendricks2 1997
        ME_JOYSTICKAXES[i].name = MenuJoystickAxes[i];
1998
        MEL_JOYSTICKAXES[i] = &ME_JOYSTICKAXES[i];
1999
    }
6827 terminx 2000
    M_JOYSTICKAXES.numEntries = joystick.numAxes;
5 Plagman 2001
 
5452 hendricks2 2002
    // prepare sound setup
6289 hendricks2 2003
#ifndef EDUKE32_STANDALONE
5452 hendricks2 2004
    if (WW2GI)
2005
        ME_SOUND_DUKETALK.name = "GI talk:";
2006
    else if (NAM)
2007
        ME_SOUND_DUKETALK.name = "Grunt talk:";
6289 hendricks2 2008
#endif
5452 hendricks2 2009
 
7808 terminx 2010
    if (FURY)
6289 hendricks2 2011
    {
2012
        MF_Redfont.between.x = 2<<16;
6377 hendricks2 2013
        MF_Redfont.cursorScale = 32768;
2014
        MF_Redfont.zoom = 16384;
6613 hendricks2 2015
        MF_Bluefont.zoom = 16384;
6289 hendricks2 2016
 
6329 hendricks2 2017
        // hack; should swap out pointers
2018
        MF_Minifont = MF_Bluefont;
2019
 
6289 hendricks2 2020
        MMF_Top_Main.pos.x = 40<<16;
2021
        MMF_Top_Main.pos.y = 130<<16;
2022
        MMF_Top_Main.bottomcutoff = 190<<16;
2023
        M_OPTIONS.format = &MMF_Top_Main;
2024
 
2025
        MEF_MainMenu.width = MEF_OptionsMenu.width = -(160<<16);
6335 terminx 2026
        MEF_MainMenu.marginBottom = 7<<16;
6289 hendricks2 2027
 
2028
        M_OPTIONS.title = NoTitle;
6751 hendricks2 2029
 
2030
        SELECTDIR_z = 16384;
6289 hendricks2 2031
    }
2032
 
4496 hendricks2 2033
    // prepare shareware
2034
    if (VOLUMEONE)
2035
    {
2036
        // blue out episodes beyond the first
5835 terminx 2037
        for (i = 1; i < g_volumeCnt; ++i)
337 terminx 2038
        {
4496 hendricks2 2039
            if (MEL_EPISODE[i])
335 terminx 2040
            {
4496 hendricks2 2041
                ME_EPISODE[i].entry = &MEO_EPISODE_SHAREWARE;
6206 hendricks2 2042
                ME_EPISODE[i].flags |= MEF_LookDisabled;
5 Plagman 2043
            }
337 terminx 2044
        }
5835 terminx 2045
        M_EPISODE.numEntries = g_volumeCnt; // remove User Map (and spacer)
4496 hendricks2 2046
        MEOS_NETOPTIONS_EPISODE.numOptions = 1;
4855 hendricks2 2047
        MenuEntry_DisableOnCondition(&ME_NETOPTIONS_EPISODE, 1);
4496 hendricks2 2048
    }
5 Plagman 2049
 
4496 hendricks2 2050
    // prepare pre-Atomic
2051
    if (!VOLUMEALL || !PLUTOPAK)
2052
    {
2053
        // prepare credits
6329 hendricks2 2054
        M_CREDITS.title = M_CREDITS2.title = M_CREDITS3.title = s_Credits;
4496 hendricks2 2055
    }
6612 hendricks2 2056
 
6676 hendricks2 2057
    MenuEntry_HideOnCondition(&ME_MAIN_HELP, G_GetLogoFlags() & LOGO_NOHELP);
8569 terminx 2058
#ifndef EDUKE32_RETAIL_MENU
6676 hendricks2 2059
    MenuEntry_HideOnCondition(&ME_MAIN_CREDITS, G_GetLogoFlags() & LOGO_NOCREDITS);
6612 hendricks2 2060
#endif
4496 hendricks2 2061
}
5 Plagman 2062
 
5923 terminx 2063
static void Menu_Run(Menu_t *cm, vec2_t origin);
5 Plagman 2064
 
2065
 
6569 hendricks2 2066
static void Menu_BlackRectangle(int32_t x, int32_t y, int32_t width, int32_t height, int32_t orientation);
5 Plagman 2067
 
4496 hendricks2 2068
/*
5923 terminx 2069
At present, no true difference is planned between Menu_Pre() and Menu_PreDraw().
4496 hendricks2 2070
They are separate for purposes of organization.
2071
*/
5 Plagman 2072
 
5923 terminx 2073
static void Menu_Pre(MenuID_t cm)
4496 hendricks2 2074
{
2075
    int32_t i;
7776 terminx 2076
    auto ps = g_player[myconnectindex].ps;
5 Plagman 2077
 
4496 hendricks2 2078
    switch (cm)
2079
    {
2080
    case MENU_MAIN_INGAME:
4855 hendricks2 2081
        MenuEntry_DisableOnCondition(&ME_MAIN_SAVEGAME, ud.recstat == 2);
2082
        MenuEntry_DisableOnCondition(&ME_MAIN_QUITTOTITLE, g_netServer || numplayers > 1);
6370 terminx 2083
        fallthrough__;
4496 hendricks2 2084
    case MENU_MAIN:
2085
        if ((g_netServer || ud.multimode > 1) && ud.recstat != 2)
2086
        {
2087
            ME_MAIN_NEWGAME.entry = &MEO_MAIN_NEWGAME_NETWORK;
2088
            ME_MAIN_NEWGAME_INGAME.entry = &MEO_MAIN_NEWGAME_NETWORK;
2089
        }
2090
        else
2091
        {
2092
            ME_MAIN_NEWGAME.entry = &MEO_MAIN_NEWGAME;
2093
            ME_MAIN_NEWGAME_INGAME.entry = &MEO_MAIN_NEWGAME_INGAME;
2094
        }
2095
        break;
4399 hendricks2 2096
 
4496 hendricks2 2097
    case MENU_GAMESETUP:
2098
        MEO_GAMESETUP_DEMOREC.options = (ps->gm&MODE_GAME) ? &MEOS_DemoRec : &MEOS_OffOn;
4855 hendricks2 2099
        MenuEntry_DisableOnCondition(&ME_GAMESETUP_DEMOREC, (ps->gm&MODE_GAME) && ud.m_recstat != 1);
4496 hendricks2 2100
        break;
5 Plagman 2101
 
7961 hendricks2 2102
    case MENU_DISPLAYSETUP:
2103
        MenuEntry_HideOnCondition(&ME_DISPLAYSETUP_VOXELS, !g_haveVoxels);
4496 hendricks2 2104
#ifdef USE_OPENGL
6829 terminx 2105
        if (videoGetRenderMode() == REND_CLASSIC)
4778 hendricks2 2106
            MenuMenu_ChangeEntryList(M_DISPLAYSETUP, MEL_DISPLAYSETUP);
4496 hendricks2 2107
#ifdef POLYMER
6829 terminx 2108
        else if (videoGetRenderMode() == REND_POLYMER)
4778 hendricks2 2109
            MenuMenu_ChangeEntryList(M_DISPLAYSETUP, MEL_DISPLAYSETUP_GL_POLYMER);
4496 hendricks2 2110
#endif
2111
        else
4778 hendricks2 2112
            MenuMenu_ChangeEntryList(M_DISPLAYSETUP, MEL_DISPLAYSETUP_GL);
5 Plagman 2113
 
6587 hendricks2 2114
        MEO_SCREENSETUP_SCREENSIZE.steps = !(ud.statusbarflags & STATUSBAR_NONONE) +
2115
                                           !(ud.statusbarflags & STATUSBAR_NOMODERN) +
2116
                                           !(ud.statusbarflags & STATUSBAR_NOMINI) * (ud.statusbarrange + 1) +
2117
                                           !(ud.statusbarflags & STATUSBAR_NOOVERLAY) +
2118
                                           !(ud.statusbarflags & STATUSBAR_NOFULL) +
2119
                                           !(ud.statusbarflags & STATUSBAR_NOSHRINK) * 14;
6650 hendricks2 2120
        MEO_SCREENSETUP_SCREENSIZE.max = MEO_SCREENSETUP_SCREENSIZE.steps - 1;
7984 hendricks2 2121
        if (MEO_SCREENSETUP_SCREENSIZE.steps <= 2 && !(ud.statusbarflags & STATUSBAR_NONONE))
2122
        {
2123
            ME_SCREENSETUP_SCREENSIZE.entry = &MEO_SCREENSETUP_SCREENSIZE_TWO;
2124
            ME_SCREENSETUP_SCREENSIZE.type = Option;
2125
        }
2126
        else
2127
        {
2128
            ME_SCREENSETUP_SCREENSIZE.entry = &MEO_SCREENSETUP_SCREENSIZE;
2129
            ME_SCREENSETUP_SCREENSIZE.type = RangeInt32;
2130
        }
2131
        MenuEntry_HideOnCondition(&ME_SCREENSETUP_SCREENSIZE, (MEO_SCREENSETUP_SCREENSIZE.steps < 2));
4976 hendricks2 2132
 
6587 hendricks2 2133
        vpsize = !(ud.statusbarflags & STATUSBAR_NONONE) +
2134
                 (ud.screen_size >= 4 && !(ud.statusbarflags & STATUSBAR_NOMODERN)) +
2135
                 (ud.screen_size >= 4 && ud.althud == 0 && !(ud.statusbarflags & STATUSBAR_NOMINI)) * (ud.statusbarcustom + 1) +
2136
                 (ud.screen_size >= 8 && !(ud.statusbarflags & STATUSBAR_NOOVERLAY)) +
2137
                 (ud.screen_size >= 8 && ud.statusbarmode == 0 && !(ud.statusbarflags & STATUSBAR_NOFULL)) +
2138
                 (ud.screen_size > 8 && !(ud.statusbarflags & STATUSBAR_NOSHRINK)) * ((ud.screen_size - 8) >> 2)
2139
                 -1;
2140
 
6940 pogokeen 2141
#ifndef EDUKE32_STANDALONE
7420 terminx 2142
#ifdef TEXFILTER_MENU_OPTIONS
6829 terminx 2143
        if (videoGetRenderMode() != REND_CLASSIC)
4869 hendricks2 2144
        {
6776 pogokeen 2145
            //POGOTODO: allow setting anisotropy again while r_useindexedcolortextures is set when support is added down the line
7420 terminx 2146
            // don't allow setting anisotropy while in POLYMOST and r_useindexedcolortextures is enabled
6829 terminx 2147
            MenuEntry_DisableOnCondition(&ME_DISPLAYSETUP_ANISOTROPY, videoGetRenderMode() == REND_POLYMOST && r_useindexedcolortextures);
6776 pogokeen 2148
 
4609 terminx 2149
            for (i = (int32_t) ARRAY_SIZE(MEOSV_DISPLAYSETUP_ANISOTROPY) - 1; i >= 0; --i)
5 Plagman 2150