Subversion Repositories eduke32

Rev

Rev 8773 | Rev 8778 | 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
 
8776 terminx 918
static MenuRangeInt32_t MEO_MOUSESETUP_SCALEX = MAKE_MENURANGE(&CONTROL_MouseAxesScale[0], &MF_Redfont, 512, 65536, 65536, 128, 3 | EnforceIntervals);
919
static MenuEntry_t ME_MOUSESETUP_SCALEX = MAKE_MENUENTRY("X-Scale:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_MOUSESETUP_SCALEX, RangeInt32);
920
static MenuRangeInt32_t MEO_MOUSESETUP_SCALEY = MAKE_MENURANGE(&CONTROL_MouseAxesScale[1], &MF_Redfont, 512, 65536, 65536, 128, 3 | EnforceIntervals);
921
static MenuEntry_t ME_MOUSESETUP_SCALEY = MAKE_MENUENTRY("Y-Scale:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_MOUSESETUP_SCALEY, RangeInt32);
3084 terminx 922
 
4778 hendricks2 923
static MenuEntry_t *MEL_MOUSESETUP[] = {
6409 terminx 924
    &ME_MOUSESETUP_BTNS,
4496 hendricks2 925
    &ME_MOUSESETUP_SENSITIVITY,
8776 terminx 926
    &ME_MOUSESETUP_SCALEX,
927
    &ME_MOUSESETUP_SCALEY,
6198 hendricks2 928
    &ME_Space2_Redfont,
6409 terminx 929
    &ME_MOUSESETUP_INVERT,
8569 terminx 930
#ifndef EDUKE32_RETAIL_MENU
6022 terminx 931
    &ME_MOUSESETUP_MOUSEAIMINGTYPE,
4850 hendricks2 932
    &ME_MOUSESETUP_MOUSEAIMING,
6409 terminx 933
#endif
4609 terminx 934
};
935
 
6013 terminx 936
#ifdef EDUKE32_ANDROID_MENU
5023 terminx 937
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 938
static MenuEntry_t ME_TOUCHSETUP_SENSITIVITY_MOVE = MAKE_MENUENTRY("Running:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_TOUCHSETUP_SENSITIVITY_MOVE, RangeFloat);
4993 terminx 939
 
5023 terminx 940
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 941
static MenuEntry_t ME_TOUCHSETUP_SENSITIVITY_STRAFE = MAKE_MENUENTRY("Strafing:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_TOUCHSETUP_SENSITIVITY_STRAFE, RangeFloat);
4993 terminx 942
 
5023 terminx 943
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 944
static MenuEntry_t ME_TOUCHSETUP_SENSITIVITY_LOOK = MAKE_MENUENTRY("Looking:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_TOUCHSETUP_SENSITIVITY_LOOK, RangeFloat);
4993 terminx 945
 
5023 terminx 946
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 947
static MenuEntry_t ME_TOUCHSETUP_SENSITIVITY_TURN = MAKE_MENUENTRY("Turning:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_TOUCHSETUP_SENSITIVITY_TURN, RangeFloat);
4993 terminx 948
 
949
static MenuOption_t MEO_TOUCHSETUP_INVERT = MAKE_MENUOPTION(&MF_Redfont, &MEOS_NoYes, &droidinput.invertLook);
950
static MenuEntry_t ME_TOUCHSETUP_INVERT = MAKE_MENUENTRY("Invert look:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_TOUCHSETUP_INVERT, Option);
951
 
5652 terminx 952
MAKE_MENU_TOP_ENTRYLINK("Sensitivity", MEF_CenterMenu, TOUCHSENS, MENU_TOUCHSENS);
953
MAKE_MENU_TOP_ENTRYLINK("Button Setup", MEF_CenterMenu, TOUCHBUTTONS, MENU_TOUCHBUTTONS);
954
 
6061 hendricks2 955
static MenuEntry_t *MEL_TOUCHSETUP [] = {
5652 terminx 956
    &ME_TOUCHSENS,
957
    &ME_TOUCHBUTTONS,
958
};
959
 
6061 hendricks2 960
static MenuEntry_t *MEL_TOUCHSENS [] = {
4993 terminx 961
    &ME_TOUCHSETUP_SENSITIVITY_MOVE,
962
    &ME_TOUCHSETUP_SENSITIVITY_STRAFE,
963
    &ME_TOUCHSETUP_SENSITIVITY_LOOK,
964
    &ME_TOUCHSETUP_SENSITIVITY_TURN,
6198 hendricks2 965
    &ME_Space2_Redfont,
4993 terminx 966
    &ME_TOUCHSETUP_INVERT,
967
};
968
#endif
969
 
7982 hendricks2 970
static MenuOption_t MEO_JOYSTICK_ENABLE = MAKE_MENUOPTION( &MF_Redfont, &MEOS_OffOn, &ud.setup.usejoystick );
971
static MenuEntry_t ME_JOYSTICK_ENABLE = MAKE_MENUENTRY( "Enable Gamepad:", &MF_Redfont, &MEF_BigOptionsRtSections, &MEO_JOYSTICK_ENABLE, Option );
972
 
7968 hendricks2 973
MAKE_MENU_TOP_ENTRYLINK( "Edit Buttons", MEF_BigOptionsRtSections, JOYSTICK_EDITBUTTONS, MENU_JOYSTICKBTNS );
974
MAKE_MENU_TOP_ENTRYLINK( "Edit Axes", MEF_BigOptionsRtSections, JOYSTICK_EDITAXES, MENU_JOYSTICKAXES );
5 Plagman 975
 
7971 hendricks2 976
static MenuLink_t MEO_JOYSTICK_DEFAULTS_STANDARD = { MENU_JOYSTANDARDVERIFY, MA_None, };
977
static MenuEntry_t ME_JOYSTICK_DEFAULTS_STANDARD = MAKE_MENUENTRY( "Use Standard Layout", &MF_Redfont, &MEF_BigOptionsRtSections, &MEO_JOYSTICK_DEFAULTS_STANDARD, Link );
978
static MenuLink_t MEO_JOYSTICK_DEFAULTS_PRO = { MENU_JOYPROVERIFY, MA_None, };
979
static MenuEntry_t ME_JOYSTICK_DEFAULTS_PRO = MAKE_MENUENTRY( "Use Pro Layout", &MF_Redfont, &MEF_BigOptionsRtSections, &MEO_JOYSTICK_DEFAULTS_PRO, Link );
980
static MenuLink_t MEO_JOYSTICK_DEFAULTS_CLEAR = { MENU_JOYCLEARVERIFY, MA_None, };
981
static MenuEntry_t ME_JOYSTICK_DEFAULTS_CLEAR = MAKE_MENUENTRY( "Clear All Settings", &MF_Redfont, &MEF_BigOptionsRtSections, &MEO_JOYSTICK_DEFAULTS_CLEAR, Link );
7968 hendricks2 982
 
4496 hendricks2 983
static MenuEntry_t *MEL_JOYSTICKSETUP[] = {
7982 hendricks2 984
    &ME_JOYSTICK_ENABLE,
985
    &ME_Space6_Redfont,
4496 hendricks2 986
    &ME_JOYSTICK_EDITBUTTONS,
987
    &ME_JOYSTICK_EDITAXES,
7968 hendricks2 988
    &ME_Space6_Redfont,
989
    &ME_JOYSTICK_DEFAULTS_STANDARD,
990
    &ME_JOYSTICK_DEFAULTS_PRO,
991
    &ME_JOYSTICK_DEFAULTS_CLEAR,
4496 hendricks2 992
};
5 Plagman 993
 
4496 hendricks2 994
#define MAXJOYBUTTONSTRINGLENGTH 32
5 Plagman 995
 
4826 hendricks2 996
static char MenuJoystickNames[MAXJOYBUTTONSANDHATS*2][MAXJOYBUTTONSTRINGLENGTH];
5 Plagman 997
 
4826 hendricks2 998
static MenuOption_t MEO_JOYSTICKBTNS[MAXJOYBUTTONSANDHATS*2];
999
static MenuEntry_t ME_JOYSTICKBTNS[MAXJOYBUTTONSANDHATS*2];
1000
static MenuEntry_t *MEL_JOYSTICKBTNS[MAXJOYBUTTONSANDHATS*2];
59 terminx 1001
 
4688 hendricks2 1002
static MenuLink_t MEO_JOYSTICKAXES = { MENU_JOYSTICKAXIS, MA_Advance, };
4778 hendricks2 1003
static MenuEntry_t ME_JOYSTICKAXES_TEMPLATE = MAKE_MENUENTRY( NULL, &MF_Redfont, &MEF_BigSliders, &MEO_JOYSTICKAXES, Link );
4496 hendricks2 1004
static MenuEntry_t ME_JOYSTICKAXES[MAXJOYAXES];
1005
static char MenuJoystickAxes[MAXJOYAXES][MAXJOYBUTTONSTRINGLENGTH];
59 terminx 1006
 
4496 hendricks2 1007
static MenuEntry_t *MEL_JOYSTICKAXES[MAXJOYAXES];
2188 helixhorne 1008
 
4496 hendricks2 1009
static const char *MenuJoystickHatDirections[] = { "Up", "Right", "Down", "Left", };
3084 terminx 1010
 
5547 terminx 1011
static char const *MEOSN_JOYSTICKAXIS_ANALOG[] = { "  -None-", "Turning", "Strafing", "Looking", "Moving", };
4496 hendricks2 1012
static int32_t MEOSV_JOYSTICKAXIS_ANALOG[] = { -1, analog_turning, analog_strafing, analog_lookingupanddown, analog_moving, };
4778 hendricks2 1013
static MenuOptionSet_t MEOS_JOYSTICKAXIS_ANALOG = MAKE_MENUOPTIONSET( MEOSN_JOYSTICKAXIS_ANALOG, MEOSV_JOYSTICKAXIS_ANALOG, 0x0 );
4496 hendricks2 1014
static MenuOption_t MEO_JOYSTICKAXIS_ANALOG = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_JOYSTICKAXIS_ANALOG, NULL );
4778 hendricks2 1015
static MenuEntry_t ME_JOYSTICKAXIS_ANALOG = MAKE_MENUENTRY( "Analog", &MF_Redfont, &MEF_BigSliders, &MEO_JOYSTICKAXIS_ANALOG, Option );
7945 hendricks2 1016
static MenuRangeInt32_t MEO_JOYSTICKAXIS_SCALE = MAKE_MENURANGE( NULL, &MF_Bluefont, -262144, 262144, 65536, 161, 3 );
4778 hendricks2 1017
static MenuEntry_t ME_JOYSTICKAXIS_SCALE = MAKE_MENUENTRY( "Scale", &MF_Redfont, &MEF_BigSliders, &MEO_JOYSTICKAXIS_SCALE, RangeInt32 );
7986 hendricks2 1018
static MenuOption_t MEO_JOYSTICKAXIS_INVERT = MAKE_MENUOPTION( &MF_Redfont, &MEOS_OffOn, NULL );
1019
static MenuEntry_t ME_JOYSTICKAXIS_INVERT = MAKE_MENUENTRY( "Invert", &MF_Redfont, &MEF_BigSliders, &MEO_JOYSTICKAXIS_INVERT, Option );
7945 hendricks2 1020
static MenuRangeInt32_t MEO_JOYSTICKAXIS_DEAD = MAKE_MENURANGE( NULL, &MF_Bluefont, 0, 10000, 0, 101, 2 );
4778 hendricks2 1021
static MenuEntry_t ME_JOYSTICKAXIS_DEAD = MAKE_MENUENTRY( "Dead Zone", &MF_Redfont, &MEF_BigSliders, &MEO_JOYSTICKAXIS_DEAD, RangeInt32 );
7945 hendricks2 1022
static MenuRangeInt32_t MEO_JOYSTICKAXIS_SATU = MAKE_MENURANGE( NULL, &MF_Bluefont, 0, 10000, 0, 101, 2 );
4778 hendricks2 1023
static MenuEntry_t ME_JOYSTICKAXIS_SATU = MAKE_MENUENTRY( "Saturation", &MF_Redfont, &MEF_BigSliders, &MEO_JOYSTICKAXIS_SATU, RangeInt32 );
3084 terminx 1024
 
4496 hendricks2 1025
static MenuOption_t MEO_JOYSTICKAXIS_DIGITALNEGATIVE = MAKE_MENUOPTION( &MF_Minifont, &MEOS_Gamefuncs, NULL );
6613 hendricks2 1026
static MenuEntry_t ME_JOYSTICKAXIS_DIGITALNEGATIVE = MAKE_MENUENTRY( "Digital -", &MF_Bluefont, &MEF_BigSliders, &MEO_JOYSTICKAXIS_DIGITALNEGATIVE, Option );
4496 hendricks2 1027
static MenuOption_t MEO_JOYSTICKAXIS_DIGITALPOSITIVE = MAKE_MENUOPTION( &MF_Minifont, &MEOS_Gamefuncs, NULL );
6613 hendricks2 1028
static MenuEntry_t ME_JOYSTICKAXIS_DIGITALPOSITIVE = MAKE_MENUENTRY( "Digital +", &MF_Bluefont, &MEF_BigSliders, &MEO_JOYSTICKAXIS_DIGITALPOSITIVE, Option );
3084 terminx 1029
 
4496 hendricks2 1030
static MenuEntry_t *MEL_JOYSTICKAXIS[] = {
1031
    &ME_JOYSTICKAXIS_ANALOG,
1032
    &ME_JOYSTICKAXIS_SCALE,
7986 hendricks2 1033
    &ME_JOYSTICKAXIS_INVERT,
4496 hendricks2 1034
    &ME_JOYSTICKAXIS_DEAD,
1035
    &ME_JOYSTICKAXIS_SATU,
6198 hendricks2 1036
    &ME_Space8_Redfont,
4778 hendricks2 1037
    &ME_JOYSTICKAXIS_DIGITALNEGATIVE,
1038
    &ME_JOYSTICKAXIS_DIGITALPOSITIVE,
4496 hendricks2 1039
};
3084 terminx 1040
 
4778 hendricks2 1041
static MenuEntry_t *MEL_INTERNAL_JOYSTICKAXIS_DIGITAL[] = {
4496 hendricks2 1042
    &ME_JOYSTICKAXIS_DIGITALNEGATIVE,
1043
    &ME_JOYSTICKAXIS_DIGITALPOSITIVE,
1044
};
3084 terminx 1045
 
4496 hendricks2 1046
#ifdef USE_OPENGL
1047
static MenuOption_t MEO_RENDERERSETUP_HIGHTILE = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_NoYes, &usehightile );
6613 hendricks2 1048
static MenuEntry_t ME_RENDERERSETUP_HIGHTILE = MAKE_MENUENTRY( "True color textures:", &MF_Bluefont, &MEF_SmallOptions, &MEO_RENDERERSETUP_HIGHTILE, Option );
5408 terminx 1049
 
6061 hendricks2 1050
static char const *MEOSN_RENDERERSETUP_TEXQUALITY [] = { "Full", "Half", "Barf", };
5408 terminx 1051
static MenuOptionSet_t MEOS_RENDERERSETUP_TEXQUALITY = MAKE_MENUOPTIONSET(MEOSN_RENDERERSETUP_TEXQUALITY, NULL, 0x2);
1052
static MenuOption_t MEO_RENDERERSETUP_TEXQUALITY = MAKE_MENUOPTION(&MF_Bluefont, &MEOS_RENDERERSETUP_TEXQUALITY, &r_downsize);
6613 hendricks2 1053
static MenuEntry_t ME_RENDERERSETUP_TEXQUALITY = MAKE_MENUENTRY("GL texture quality:", &MF_Bluefont, &MEF_SmallOptions, &MEO_RENDERERSETUP_TEXQUALITY, Option);
5408 terminx 1054
 
1055
 
4496 hendricks2 1056
static MenuOption_t MEO_RENDERERSETUP_PRECACHE = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_OffOn, &ud.config.useprecache );
6613 hendricks2 1057
static MenuEntry_t ME_RENDERERSETUP_PRECACHE = MAKE_MENUENTRY( "Pre-load map textures:", &MF_Bluefont, &MEF_SmallOptions, &MEO_RENDERERSETUP_PRECACHE, Option );
5526 hendricks2 1058
# ifndef EDUKE32_GLES
5547 terminx 1059
static char const *MEOSN_RENDERERSETUP_TEXCACHE[] = { "Off", "On", "Compr.", };
4778 hendricks2 1060
static MenuOptionSet_t MEOS_RENDERERSETUP_TEXCACHE = MAKE_MENUOPTIONSET( MEOSN_RENDERERSETUP_TEXCACHE, NULL, 0x2 );
4496 hendricks2 1061
static MenuOption_t MEO_RENDERERSETUP_TEXCACHE = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_RENDERERSETUP_TEXCACHE, &glusetexcache );
6613 hendricks2 1062
static MenuEntry_t ME_RENDERERSETUP_TEXCACHE = MAKE_MENUENTRY( "On-disk texture cache:", &MF_Bluefont, &MEF_SmallOptions, &MEO_RENDERERSETUP_TEXCACHE, Option );
5526 hendricks2 1063
# endif
1064
# ifdef USE_GLEXT
4496 hendricks2 1065
static MenuOption_t MEO_RENDERERSETUP_DETAILTEX = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_NoYes, &r_detailmapping );
6613 hendricks2 1066
static MenuEntry_t ME_RENDERERSETUP_DETAILTEX = MAKE_MENUENTRY( "Detail textures:", &MF_Bluefont, &MEF_SmallOptions, &MEO_RENDERERSETUP_DETAILTEX, Option );
5408 terminx 1067
static MenuOption_t MEO_RENDERERSETUP_GLOWTEX = MAKE_MENUOPTION(&MF_Bluefont, &MEOS_NoYes, &r_glowmapping);
6613 hendricks2 1068
static MenuEntry_t ME_RENDERERSETUP_GLOWTEX = MAKE_MENUENTRY("Glow textures:", &MF_Bluefont, &MEF_SmallOptions, &MEO_RENDERERSETUP_GLOWTEX, Option);
5526 hendricks2 1069
# endif
4496 hendricks2 1070
static MenuOption_t MEO_RENDERERSETUP_MODELS = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_NoYes, &usemodels );
6613 hendricks2 1071
static MenuEntry_t ME_RENDERERSETUP_MODELS = MAKE_MENUENTRY( "3D models:", &MF_Bluefont, &MEF_SmallOptions, &MEO_RENDERERSETUP_MODELS, Option );
4496 hendricks2 1072
#endif
5408 terminx 1073
 
5406 terminx 1074
#ifdef POLYMER
6061 hendricks2 1075
static char const *MEOSN_POLYMER_LIGHTS [] = { "Off", "Full", "Map only", };
5408 terminx 1076
static MenuOptionSet_t MEOS_POLYMER_LIGHTS = MAKE_MENUOPTIONSET(MEOSN_POLYMER_LIGHTS, NULL, 0x2);
1077
static MenuOption_t MEO_POLYMER_LIGHTS = MAKE_MENUOPTION(&MF_Bluefont, &MEOS_POLYMER_LIGHTS, &pr_lighting);
6613 hendricks2 1078
static MenuEntry_t ME_POLYMER_LIGHTS = MAKE_MENUENTRY("Dynamic lights:", &MF_Bluefont, &MEF_SmallOptions, &MEO_POLYMER_LIGHTS, Option);
5408 terminx 1079
 
1080
static MenuRangeInt32_t MEO_POLYMER_LIGHTPASSES = MAKE_MENURANGE(&r_pr_maxlightpasses, &MF_Bluefont, 1, 10, 1, 10, 1);
6613 hendricks2 1081
static MenuEntry_t ME_POLYMER_LIGHTPASSES = MAKE_MENUENTRY("Lights per surface:", &MF_Bluefont, &MEF_SmallOptions, &MEO_POLYMER_LIGHTPASSES, RangeInt32);
5408 terminx 1082
 
1083
static MenuOption_t MEO_POLYMER_SHADOWS = MAKE_MENUOPTION(&MF_Bluefont, &MEOS_OffOn, &pr_shadows);
6613 hendricks2 1084
static MenuEntry_t ME_POLYMER_SHADOWS = MAKE_MENUENTRY("Dynamic shadows:", &MF_Bluefont, &MEF_SmallOptions, &MEO_POLYMER_SHADOWS, Option);
5408 terminx 1085
 
1086
static MenuRangeInt32_t MEO_POLYMER_SHADOWCOUNT = MAKE_MENURANGE(&pr_shadowcount, &MF_Bluefont, 1, 10, 1, 10, 1);
6613 hendricks2 1087
static MenuEntry_t ME_POLYMER_SHADOWCOUNT = MAKE_MENUENTRY("Shadows per surface:", &MF_Bluefont, &MEF_SmallOptions, &MEO_POLYMER_SHADOWCOUNT, RangeInt32);
5408 terminx 1088
 
5406 terminx 1089
#endif
3084 terminx 1090
 
4496 hendricks2 1091
#ifdef USE_OPENGL
5408 terminx 1092
static MenuEntry_t *MEL_RENDERERSETUP_POLYMOST[] = {
4496 hendricks2 1093
    &ME_RENDERERSETUP_HIGHTILE,
1094
    &ME_RENDERERSETUP_TEXQUALITY,
1095
    &ME_RENDERERSETUP_PRECACHE,
5526 hendricks2 1096
# ifndef EDUKE32_GLES
4496 hendricks2 1097
    &ME_RENDERERSETUP_TEXCACHE,
5526 hendricks2 1098
# endif
1099
# ifdef USE_GLEXT
4496 hendricks2 1100
    &ME_RENDERERSETUP_DETAILTEX,
5408 terminx 1101
    &ME_RENDERERSETUP_GLOWTEX,
5526 hendricks2 1102
# endif
6198 hendricks2 1103
    &ME_Space4_Bluefont,
4496 hendricks2 1104
    &ME_RENDERERSETUP_MODELS,
5408 terminx 1105
};
1106
 
5406 terminx 1107
#ifdef POLYMER
6061 hendricks2 1108
static MenuEntry_t *MEL_RENDERERSETUP_POLYMER [] = {
5408 terminx 1109
    &ME_RENDERERSETUP_HIGHTILE,
1110
    &ME_RENDERERSETUP_TEXQUALITY,
1111
    &ME_RENDERERSETUP_PRECACHE,
5526 hendricks2 1112
# ifndef EDUKE32_GLES
5408 terminx 1113
    &ME_RENDERERSETUP_TEXCACHE,
5526 hendricks2 1114
# endif
1115
# ifdef USE_GLEXT
5408 terminx 1116
    &ME_RENDERERSETUP_DETAILTEX,
1117
    &ME_RENDERERSETUP_GLOWTEX,
5526 hendricks2 1118
# endif
6198 hendricks2 1119
    &ME_Space4_Bluefont,
5408 terminx 1120
    &ME_RENDERERSETUP_MODELS,
6198 hendricks2 1121
    &ME_Space4_Bluefont,
5408 terminx 1122
    &ME_POLYMER_LIGHTS,
1123
    &ME_POLYMER_LIGHTPASSES,
1124
    &ME_POLYMER_SHADOWS,
1125
    &ME_POLYMER_SHADOWCOUNT,
4496 hendricks2 1126
};
1127
#endif
5408 terminx 1128
#endif
3084 terminx 1129
 
6013 terminx 1130
#ifdef EDUKE32_ANDROID_MENU
6828 terminx 1131
static MenuRangeFloat_t MEO_COLCORR_GAMMA = MAKE_MENURANGE( &g_videoGamma, &MF_Bluefont, 1.f, 2.5f, 0.f, 39, 1 );
4609 terminx 1132
#else
7312 hendricks2 1133
static MenuRangeFloat_t MEO_COLCORR_GAMMA = MAKE_MENURANGE( &g_videoGamma, &MF_Bluefont, 0.3f, 4.f, 0.f, 75, 1 );
4609 terminx 1134
#endif
4778 hendricks2 1135
static MenuEntry_t ME_COLCORR_GAMMA = MAKE_MENUENTRY( "Gamma:", &MF_Redfont, &MEF_ColorCorrect, &MEO_COLCORR_GAMMA, RangeFloat );
6828 terminx 1136
static MenuRangeFloat_t MEO_COLCORR_CONTRAST = MAKE_MENURANGE( &g_videoContrast, &MF_Bluefont, 0.1f, 2.7f, 0.f, 53, 1 );
4778 hendricks2 1137
static MenuEntry_t ME_COLCORR_CONTRAST = MAKE_MENUENTRY( "Contrast:", &MF_Redfont, &MEF_ColorCorrect, &MEO_COLCORR_CONTRAST, RangeFloat );
6828 terminx 1138
static MenuRangeFloat_t MEO_COLCORR_BRIGHTNESS = MAKE_MENURANGE( &g_videoBrightness, &MF_Bluefont, -0.8f, 0.8f, 0.f, 33, 1 );
4778 hendricks2 1139
static MenuEntry_t ME_COLCORR_BRIGHTNESS = MAKE_MENUENTRY( "Brightness:", &MF_Redfont, &MEF_ColorCorrect, &MEO_COLCORR_BRIGHTNESS, RangeFloat );
7971 hendricks2 1140
static MenuLink_t MEO_COLCORR_RESET = { MENU_COLCORRRESETVERIFY, MA_None, };
1141
static MenuEntry_t ME_COLCORR_RESET = MAKE_MENUENTRY( "Reset To Defaults", &MF_Redfont, &MEF_ColorCorrect, &MEO_COLCORR_RESET, Link );
6013 terminx 1142
#ifdef EDUKE32_ANDROID_MENU
4993 terminx 1143
#define MINVIS 1.f
1144
#else
1145
#define MINVIS 0.125f
1146
#endif
8569 terminx 1147
#ifndef EDUKE32_RETAIL_MENU
4993 terminx 1148
static MenuRangeFloat_t MEO_COLCORR_AMBIENT = MAKE_MENURANGE( &r_ambientlight, &MF_Bluefont, MINVIS, 4.f, 0.f, 32, 1 );
4778 hendricks2 1149
static MenuEntry_t ME_COLCORR_AMBIENT = MAKE_MENUENTRY( "Visibility:", &MF_Redfont, &MEF_ColorCorrect, &MEO_COLCORR_AMBIENT, RangeFloat );
6335 terminx 1150
#endif
4496 hendricks2 1151
static MenuEntry_t *MEL_COLCORR[] = {
1152
    &ME_COLCORR_GAMMA,
6013 terminx 1153
#ifndef EDUKE32_ANDROID_MENU
4496 hendricks2 1154
    &ME_COLCORR_CONTRAST,
1155
    &ME_COLCORR_BRIGHTNESS,
4609 terminx 1156
#endif
8569 terminx 1157
#ifndef EDUKE32_RETAIL_MENU
4850 hendricks2 1158
    &ME_COLCORR_AMBIENT,
6335 terminx 1159
#endif
6198 hendricks2 1160
    &ME_Space8_Redfont,
4496 hendricks2 1161
    &ME_COLCORR_RESET,
1162
};
3084 terminx 1163
 
4778 hendricks2 1164
static MenuEntry_t *MEL_SCREENSETUP[] = {
6588 hendricks2 1165
#ifdef EDUKE32_ANDROID_MENU
1166
    &ME_SCREENSETUP_STATUSBARONTOP,
1167
#endif
6650 hendricks2 1168
    &ME_SCREENSETUP_SCREENSIZE,
4850 hendricks2 1169
    &ME_SCREENSETUP_SBARSIZE,
4609 terminx 1170
 
4850 hendricks2 1171
    &ME_SCREENSETUP_CROSSHAIR,
1172
    &ME_SCREENSETUP_CROSSHAIRSIZE,
4609 terminx 1173
 
4850 hendricks2 1174
    &ME_SCREENSETUP_LEVELSTATS,
1175
    &ME_SCREENSETUP_TEXTSIZE,
4609 terminx 1176
 
4850 hendricks2 1177
    &ME_SCREENSETUP_SHOWPICKUPMESSAGES,
4609 terminx 1178
};
1179
 
4496 hendricks2 1180
// Save and load will be filled in before every viewing of the save/load screen.
6329 hendricks2 1181
static MenuLink_t MEO_LOAD = { MENU_LOADVERIFY, MA_None, };
6613 hendricks2 1182
static MenuEntry_t ME_LOAD_TEMPLATE = MAKE_MENUENTRY( NULL, &MF_Minifont, &MEF_LoadSave, &MEO_LOAD, Link );
1183
static MenuEntry_t ME_LOAD_EMPTY = MAKE_MENUENTRY( NULL, &MF_Minifont, &MEF_LoadSave, nullptr, Dummy );
6569 hendricks2 1184
static MenuEntry_t *ME_LOAD;
1185
static MenuEntry_t **MEL_LOAD;
3084 terminx 1186
 
6569 hendricks2 1187
static char const s_NewSaveGame[] = "(New Save Game)";
6613 hendricks2 1188
static MenuString_t MEO_SAVE_TEMPLATE = MAKE_MENUSTRING( NULL, &MF_Minifont, MAXSAVEGAMENAME, 0 );
1189
static MenuString_t MEO_SAVE_NEW = MAKE_MENUSTRING( NULL, &MF_Minifont, MAXSAVEGAMENAME, 0 );
6569 hendricks2 1190
static MenuString_t *MEO_SAVE;
6613 hendricks2 1191
static MenuEntry_t ME_SAVE_TEMPLATE = MAKE_MENUENTRY( NULL, &MF_Minifont, &MEF_LoadSave, &MEO_SAVE_TEMPLATE, String );
1192
static MenuEntry_t ME_SAVE_NEW = MAKE_MENUENTRY( s_NewSaveGame, &MF_Minifont, &MEF_LoadSave, &MEO_SAVE_NEW, String );
6569 hendricks2 1193
static MenuEntry_t *ME_SAVE;
1194
static MenuEntry_t **MEL_SAVE;
3084 terminx 1195
 
8760 terminx 1196
static int32_t soundrate, soundvoices, musicdevice, opl3stereo;
1197
static char sf2bankfile[BMAX_PATH];
4778 hendricks2 1198
static MenuOption_t MEO_SOUND = MAKE_MENUOPTION( &MF_Redfont, &MEOS_OffOn, &ud.config.SoundToggle );
1199
static MenuEntry_t ME_SOUND = MAKE_MENUENTRY( "Sound:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SOUND, Option );
4609 terminx 1200
 
4778 hendricks2 1201
static MenuOption_t MEO_SOUND_MUSIC = MAKE_MENUOPTION( &MF_Redfont, &MEOS_OffOn, &ud.config.MusicToggle );
1202
static MenuEntry_t ME_SOUND_MUSIC = MAKE_MENUENTRY( "Music:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SOUND_MUSIC, Option );
4609 terminx 1203
 
8013 hendricks2 1204
static char const s_Volume[] = "Volume:";
1205
 
7122 terminx 1206
static MenuRangeInt32_t MEO_SOUND_VOLUME_FX = MAKE_MENURANGE( &ud.config.FXVolume, &MF_Redfont, 0, 255, 0, 33, 2 );
8013 hendricks2 1207
static MenuEntry_t ME_SOUND_VOLUME_FX = MAKE_MENUENTRY( s_Volume, &MF_Redfont, &MEF_BigOptions_Apply, &MEO_SOUND_VOLUME_FX, RangeInt32 );
4609 terminx 1208
 
4778 hendricks2 1209
static MenuRangeInt32_t MEO_SOUND_VOLUME_MUSIC = MAKE_MENURANGE( &ud.config.MusicVolume, &MF_Redfont, 0, 255, 0, 33, 2 );
8013 hendricks2 1210
static MenuEntry_t ME_SOUND_VOLUME_MUSIC = MAKE_MENUENTRY( s_Volume, &MF_Redfont, &MEF_BigOptions_Apply, &MEO_SOUND_VOLUME_MUSIC, RangeInt32 );
4609 terminx 1211
 
7402 terminx 1212
#ifndef EDUKE32_STANDALONE
4778 hendricks2 1213
static MenuOption_t MEO_SOUND_DUKETALK = MAKE_MENUOPTION(&MF_Redfont, &MEOS_NoYes, NULL);
1214
static MenuEntry_t ME_SOUND_DUKETALK = MAKE_MENUENTRY( "Duke talk:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SOUND_DUKETALK, Option );
6013 terminx 1215
#else
8026 hendricks2 1216
static MenuOption_t MEO_SOUND_DUKETALK = MAKE_MENUOPTION(&MF_Redfont, &MEOS_YesNo, NULL);
1217
static MenuEntry_t ME_SOUND_DUKETALK = MAKE_MENUENTRY("Silent protagonist:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SOUND_DUKETALK, Option);
6013 terminx 1218
#endif
4609 terminx 1219
 
5547 terminx 1220
static char const *MEOSN_SOUND_SAMPLINGRATE[] = { "22050Hz", "44100Hz", "48000Hz", };
4609 terminx 1221
static int32_t MEOSV_SOUND_SAMPLINGRATE[] = { 22050, 44100, 48000, };
4778 hendricks2 1222
static MenuOptionSet_t MEOS_SOUND_SAMPLINGRATE = MAKE_MENUOPTIONSET( MEOSN_SOUND_SAMPLINGRATE, MEOSV_SOUND_SAMPLINGRATE, 0x3 );
1223
static MenuOption_t MEO_SOUND_SAMPLINGRATE = MAKE_MENUOPTION( &MF_Redfont, &MEOS_SOUND_SAMPLINGRATE, &soundrate );
1224
static MenuEntry_t ME_SOUND_SAMPLINGRATE = MAKE_MENUENTRY( "Sample rate:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SOUND_SAMPLINGRATE, Option );
4609 terminx 1225
 
8569 terminx 1226
#ifndef EDUKE32_RETAIL_MENU
8760 terminx 1227
static MenuOption_t MEO_SOUND_OPL3STEREO = MAKE_MENUOPTION(&MF_Redfont, &MEOS_NoYes, &opl3stereo);
1228
static MenuEntry_t ME_SOUND_OPL3STEREO = MAKE_MENUENTRY( "OPL3 stereo mode:", &MF_Redfont, &MEF_BigOptionsRtSections, &MEO_SOUND_OPL3STEREO, Option );
1229
 
8234 terminx 1230
static MenuRangeInt32_t MEO_SOUND_NUMVOICES = MAKE_MENURANGE( &soundvoices, &MF_Redfont, 16, 128, 0, 8, 1 );
4778 hendricks2 1231
static MenuEntry_t ME_SOUND_NUMVOICES = MAKE_MENUENTRY( "Voices:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SOUND_NUMVOICES, RangeInt32 );
4609 terminx 1232
 
8258 hendricks2 1233
static char const *MEOSN_SOUND_MIDIDRIVER[] = {
8381 terminx 1234
    "OPL3 emu.",
8218 terminx 1235
#ifdef _WIN32
8381 terminx 1236
    "Windows MME",
8218 terminx 1237
#endif
8760 terminx 1238
    ".sf2 synth",
8218 terminx 1239
};
8258 hendricks2 1240
static int32_t MEOSV_SOUND_MIDIDRIVER[] = {
8219 terminx 1241
    ASS_OPL3,
8218 terminx 1242
#ifdef _WIN32
1243
    ASS_WinMM,
1244
#endif
8752 terminx 1245
    ASS_SF2,
8218 terminx 1246
};
1247
 
8258 hendricks2 1248
static MenuOptionSet_t MEOS_SOUND_MIDIDRIVER = MAKE_MENUOPTIONSET( MEOSN_SOUND_MIDIDRIVER, MEOSV_SOUND_MIDIDRIVER, 0x2 );
1249
static MenuOption_t MEO_SOUND_MIDIDRIVER = MAKE_MENUOPTION( &MF_Redfont, &MEOS_SOUND_MIDIDRIVER, &musicdevice );
1250
static MenuEntry_t ME_SOUND_MIDIDRIVER = MAKE_MENUENTRY( "MIDI driver:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SOUND_MIDIDRIVER, Option );
8218 terminx 1251
 
8760 terminx 1252
static MenuLink_t MEO_SOUND_DEVSETUP = { MENU_SOUND_DEVSETUP, MA_Advance, };
1253
static MenuEntry_t ME_SOUND_DEVSETUP = MAKE_MENUENTRY( "Device configuration", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SOUND_DEVSETUP, Link );
1254
 
1255
static MenuLink_t MEO_SOUND_SF2 = { MENU_SOUND_SF2, MA_Advance, };
1256
static MenuEntry_t ME_SOUND_SF2 = MAKE_MENUENTRY( sf2bankfile, &MF_Redfont, &MEF_BigOptionsRtSections, &MEO_SOUND_SF2, Link );
4645 hendricks2 1257
#endif
4609 terminx 1258
 
8764 terminx 1259
static MenuEntry_t ME_SOUND_RESTART = MAKE_MENUENTRY( "Apply Changes", &MF_Redfont, &MEF_BigOptions_Apply, &MEO_NULL, Link );
1260
 
4778 hendricks2 1261
static MenuEntry_t *MEL_SOUND[] = {
4496 hendricks2 1262
    &ME_SOUND,
8013 hendricks2 1263
    &ME_SOUND_VOLUME_FX,
4496 hendricks2 1264
    &ME_SOUND_MUSIC,
4850 hendricks2 1265
    &ME_SOUND_VOLUME_MUSIC,
4496 hendricks2 1266
    &ME_SOUND_DUKETALK,
8569 terminx 1267
#ifndef EDUKE32_RETAIL_MENU
8760 terminx 1268
    &ME_Space4_Redfont,
1269
    &ME_SOUND_DEVSETUP,
4609 terminx 1270
#endif
4496 hendricks2 1271
};
3084 terminx 1272
 
8760 terminx 1273
static MenuEntry_t *MEL_SOUND_DEVSETUP[] = {
4850 hendricks2 1274
    &ME_SOUND_SAMPLINGRATE,
8569 terminx 1275
#ifndef EDUKE32_RETAIL_MENU
4850 hendricks2 1276
    &ME_SOUND_NUMVOICES,
8760 terminx 1277
    &ME_SOUND_MIDIDRIVER,
1278
    &ME_SOUND_OPL3STEREO,
1279
    &ME_SOUND_SF2,
6380 terminx 1280
#endif
8760 terminx 1281
    &ME_Space4_Redfont,
4850 hendricks2 1282
    &ME_SOUND_RESTART,
4609 terminx 1283
};
1284
 
6742 hendricks2 1285
 
1286
static MenuOption_t MEO_SAVESETUP_AUTOSAVE = MAKE_MENUOPTION( &MF_Redfont, &MEOS_OffOn, &ud.autosave );
7790 terminx 1287
static MenuEntry_t ME_SAVESETUP_AUTOSAVE = MAKE_MENUENTRY( "Checkpoints:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SAVESETUP_AUTOSAVE, Option );
6742 hendricks2 1288
 
6748 hendricks2 1289
static MenuOption_t MEO_SAVESETUP_AUTOSAVEDELETION = MAKE_MENUOPTION( &MF_Redfont, &MEOS_NoYes, &ud.autosavedeletion );
1290
static MenuEntry_t ME_SAVESETUP_AUTOSAVEDELETION = MAKE_MENUENTRY( "Auto-Delete:", &MF_Redfont, &MEF_BigOptions_Apply, &MEO_SAVESETUP_AUTOSAVEDELETION, Option );
1291
static MenuRangeInt32_t MEO_SAVESETUP_MAXAUTOSAVES = MAKE_MENURANGE( &ud.maxautosaves, &MF_Redfont, 1, 10, 0, 10, 1 );
1292
static MenuEntry_t ME_SAVESETUP_MAXAUTOSAVES = MAKE_MENUENTRY( "Limit:", &MF_Redfont, &MEF_BigOptions_Apply, &MEO_SAVESETUP_MAXAUTOSAVES, RangeInt32 );
1293
 
6749 hendricks2 1294
static MenuEntry_t ME_SAVESETUP_CLEANUP = MAKE_MENUENTRY( "Clean Up Saves", &MF_Redfont, &MEF_BigOptionsRt, &MEO_NULL, Link );
1295
 
8114 terminx 1296
#ifdef EDUKE32_STANDALONE
1297
static MenuEntry_t ME_SAVESETUP_RESETSTATS = MAKE_MENUENTRY( "Reset Stats/Achievements", &MF_Redfont, &MEF_BigOptionsRt, &MEO_NULL, Link );
1298
#endif
1299
 
6742 hendricks2 1300
static MenuEntry_t *MEL_SAVESETUP[] = {
1301
    &ME_SAVESETUP_AUTOSAVE,
6748 hendricks2 1302
    &ME_SAVESETUP_AUTOSAVEDELETION,
1303
    &ME_SAVESETUP_MAXAUTOSAVES,
6749 hendricks2 1304
    &ME_SAVESETUP_CLEANUP,
8114 terminx 1305
#ifdef EDUKE32_STANDALONE
1306
    &ME_SAVESETUP_RESETSTATS,
1307
#endif
6742 hendricks2 1308
};
1309
 
1310
 
4778 hendricks2 1311
MAKE_MENU_TOP_ENTRYLINK( "Player Setup", MEF_CenterMenu, NETWORK_PLAYERSETUP, MENU_PLAYER );
1312
MAKE_MENU_TOP_ENTRYLINK( "Join Game", MEF_CenterMenu, NETWORK_JOINGAME, MENU_NETJOIN );
1313
MAKE_MENU_TOP_ENTRYLINK( "Host Game", MEF_CenterMenu, NETWORK_HOSTGAME, MENU_NETHOST );
4399 hendricks2 1314
 
4496 hendricks2 1315
static MenuEntry_t *MEL_NETWORK[] = {
1316
    &ME_NETWORK_PLAYERSETUP,
1317
    &ME_NETWORK_JOINGAME,
1318
    &ME_NETWORK_HOSTGAME,
1319
};
4399 hendricks2 1320
 
4778 hendricks2 1321
static MenuString_t MEO_PLAYER_NAME = MAKE_MENUSTRING( szPlayerName, &MF_Bluefont, MAXPLAYERNAME, 0 );
6613 hendricks2 1322
static MenuEntry_t ME_PLAYER_NAME = MAKE_MENUENTRY( "Name", &MF_Bluefont, &MEF_PlayerNarrow, &MEO_PLAYER_NAME, String );
5547 terminx 1323
static char const *MEOSN_PLAYER_COLOR[] = { "Auto", "Blue", "Red", "Green", "Gray", "Dark gray", "Dark green", "Brown", "Dark blue", "Bright red", "Yellow", };
4822 hendricks2 1324
static int32_t MEOSV_PLAYER_COLOR[] = { 0, 9, 10, 11, 12, 13, 14, 15, 16, 21, 23, };
4778 hendricks2 1325
static MenuOptionSet_t MEOS_PLAYER_COLOR = MAKE_MENUOPTIONSET( MEOSN_PLAYER_COLOR, MEOSV_PLAYER_COLOR, 0x2 );
4496 hendricks2 1326
static MenuOption_t MEO_PLAYER_COLOR = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_PLAYER_COLOR, &ud.color );
6613 hendricks2 1327
static MenuEntry_t ME_PLAYER_COLOR = MAKE_MENUENTRY( "Color", &MF_Bluefont, &MEF_PlayerNarrow, &MEO_PLAYER_COLOR, Option );
5547 terminx 1328
static char const *MEOSN_PLAYER_TEAM[] = { "Blue", "Red", "Green", "Gray", };
4778 hendricks2 1329
static MenuOptionSet_t MEOS_PLAYER_TEAM = MAKE_MENUOPTIONSET( MEOSN_PLAYER_TEAM, NULL, 0x2 );
4496 hendricks2 1330
static MenuOption_t MEO_PLAYER_TEAM = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_PLAYER_TEAM, &ud.team );
6613 hendricks2 1331
static MenuEntry_t ME_PLAYER_TEAM = MAKE_MENUENTRY( "Team", &MF_Bluefont, &MEF_PlayerNarrow, &MEO_PLAYER_TEAM, Option );
8569 terminx 1332
#ifndef EDUKE32_RETAIL_MENU
4688 hendricks2 1333
static MenuLink_t MEO_PLAYER_MACROS = { MENU_MACROS, MA_Advance, };
6613 hendricks2 1334
static MenuEntry_t ME_PLAYER_MACROS = MAKE_MENUENTRY( "Multiplayer macros", &MF_Bluefont, &MEF_SmallOptions, &MEO_PLAYER_MACROS, Link );
4682 hendricks2 1335
#endif
5 Plagman 1336
 
4778 hendricks2 1337
static MenuEntry_t *MEL_PLAYER[] = {
4496 hendricks2 1338
    &ME_PLAYER_NAME,
6198 hendricks2 1339
    &ME_Space4_Bluefont,
4496 hendricks2 1340
    &ME_PLAYER_COLOR,
6198 hendricks2 1341
    &ME_Space4_Bluefont,
4496 hendricks2 1342
    &ME_PLAYER_TEAM,
8569 terminx 1343
#ifndef EDUKE32_RETAIL_MENU
6198 hendricks2 1344
    &ME_Space8_Bluefont,
4496 hendricks2 1345
    &ME_PLAYER_MACROS,
4778 hendricks2 1346
#endif
4496 hendricks2 1347
};
5 Plagman 1348
 
4778 hendricks2 1349
static MenuString_t MEO_MACROS_TEMPLATE = MAKE_MENUSTRING( NULL, &MF_Bluefont, MAXRIDECULELENGTH, 0 );
6569 hendricks2 1350
static MenuString_t MEO_MACROS[10];
4778 hendricks2 1351
static MenuEntry_t ME_MACROS_TEMPLATE = MAKE_MENUENTRY( NULL, &MF_Bluefont, &MEF_Macros, &MEO_MACROS_TEMPLATE, String );
4496 hendricks2 1352
static MenuEntry_t ME_MACROS[MAXRIDECULE];
1353
static MenuEntry_t *MEL_MACROS[MAXRIDECULE];
5 Plagman 1354
 
5547 terminx 1355
static char const *MenuUserMap = "User Map";
1356
static char const *MenuSkillNone = "None";
5 Plagman 1357
 
5547 terminx 1358
static char const *MEOSN_NetGametypes[MAXGAMETYPES];
1359
static char const *MEOSN_NetEpisodes[MAXVOLUMES+1];
5033 hendricks2 1360
static int32_t MEOSV_NetEpisodes[MAXVOLUMES+1];
5547 terminx 1361
static char const *MEOSN_NetLevels[MAXVOLUMES][MAXLEVELS];
1362
static char const *MEOSN_NetSkills[MAXSKILLS+1];
5 Plagman 1363
 
4823 hendricks2 1364
static MenuLink_t MEO_NETHOST_OPTIONS = { MENU_NETOPTIONS, MA_Advance, };
4778 hendricks2 1365
static MenuEntry_t ME_NETHOST_OPTIONS = MAKE_MENUENTRY( "Game Options", &MF_Redfont, &MEF_VideoSetup, &MEO_NETHOST_OPTIONS, Link );
1366
static MenuEntry_t ME_NETHOST_LAUNCH = MAKE_MENUENTRY( "Launch Game", &MF_Redfont, &MEF_VideoSetup, &MEO_NULL, Link );
5 Plagman 1367
 
4496 hendricks2 1368
static MenuEntry_t *MEL_NETHOST[] = {
1369
    &ME_NETHOST_OPTIONS,
1370
    &ME_NETHOST_LAUNCH,
1371
};
471 terminx 1372
 
4778 hendricks2 1373
static MenuOptionSet_t MEOS_NETOPTIONS_GAMETYPE = MAKE_MENUOPTIONSET( MEOSN_NetGametypes, NULL, 0x0 );
4496 hendricks2 1374
static MenuOption_t MEO_NETOPTIONS_GAMETYPE = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_NETOPTIONS_GAMETYPE, &ud.m_coop );
4778 hendricks2 1375
static MenuEntry_t ME_NETOPTIONS_GAMETYPE = MAKE_MENUENTRY( "Game Type", &MF_Redfont, &MEF_NetSetup, &MEO_NETOPTIONS_GAMETYPE, Option );
5033 hendricks2 1376
static MenuOptionSet_t MEOS_NETOPTIONS_EPISODE = MAKE_MENUOPTIONSET( MEOSN_NetEpisodes, MEOSV_NetEpisodes, 0x0 );
1377
static int32_t NetEpisode;
1378
static MenuOption_t MEO_NETOPTIONS_EPISODE = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_NETOPTIONS_EPISODE, &NetEpisode );
4778 hendricks2 1379
static MenuEntry_t ME_NETOPTIONS_EPISODE = MAKE_MENUENTRY( "Episode", &MF_Redfont, &MEF_NetSetup, &MEO_NETOPTIONS_EPISODE, Option );
5034 hendricks2 1380
static MenuOptionSet_t MEOS_NETOPTIONS_LEVEL_TEMPLATE = MAKE_MENUOPTIONSETNULL;
4496 hendricks2 1381
static MenuOptionSet_t MEOS_NETOPTIONS_LEVEL[MAXVOLUMES];
1382
static MenuOption_t MEO_NETOPTIONS_LEVEL = MAKE_MENUOPTION( &MF_Bluefont, NULL, &ud.m_level_number );
4778 hendricks2 1383
static MenuEntry_t ME_NETOPTIONS_LEVEL = MAKE_MENUENTRY( "Level", &MF_Redfont, &MEF_NetSetup, &MEO_NETOPTIONS_LEVEL, Option );
4823 hendricks2 1384
static MenuLink_t MEO_NETOPTIONS_USERMAP = { MENU_NETUSERMAP, MA_Advance, };
4778 hendricks2 1385
static MenuEntry_t ME_NETOPTIONS_USERMAP = MAKE_MENUENTRY( "User Map", &MF_Redfont, &MEF_NetSetup, &MEO_NETOPTIONS_USERMAP, Link );
1386
static MenuOptionSet_t MEOS_NETOPTIONS_MONSTERS = MAKE_MENUOPTIONSET( MEOSN_NetSkills, NULL, 0x0 );
4496 hendricks2 1387
static MenuOption_t MEO_NETOPTIONS_MONSTERS = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_NETOPTIONS_MONSTERS, NULL );
4778 hendricks2 1388
static MenuEntry_t ME_NETOPTIONS_MONSTERS = MAKE_MENUENTRY( "Monsters", &MF_Redfont, &MEF_NetSetup, &MEO_NETOPTIONS_MONSTERS, Option );
4496 hendricks2 1389
static MenuOption_t MEO_NETOPTIONS_MARKERS = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_OffOn, &ud.m_marker );
4778 hendricks2 1390
static MenuEntry_t ME_NETOPTIONS_MARKERS = MAKE_MENUENTRY( "Markers", &MF_Redfont, &MEF_NetSetup, &MEO_NETOPTIONS_MARKERS, Option );
4496 hendricks2 1391
static MenuOption_t MEO_NETOPTIONS_MAPEXITS = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_OnOff, &ud.m_noexits );
4778 hendricks2 1392
static MenuEntry_t ME_NETOPTIONS_MAPEXITS = MAKE_MENUENTRY( "Map Exits", &MF_Redfont, &MEF_NetSetup, &MEO_NETOPTIONS_MAPEXITS, Option );
4496 hendricks2 1393
static MenuOption_t MEO_NETOPTIONS_FRFIRE = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_OffOn, &ud.m_ffire );
4778 hendricks2 1394
static MenuEntry_t ME_NETOPTIONS_FRFIRE = MAKE_MENUENTRY( "Fr. Fire", &MF_Redfont, &MEF_NetSetup, &MEO_NETOPTIONS_FRFIRE, Option );
7242 seventyfiv 1395
static MenuEntry_t ME_NETOPTIONS_ACCEPT = MAKE_MENUENTRY( "Accept", &MF_Redfont, &MEF_NetSetup_Confirm, &MEO_NETWORK_HOSTGAME, Link );
471 terminx 1396
 
4496 hendricks2 1397
static MenuEntry_t *MEL_NETOPTIONS[] = {
1398
    &ME_NETOPTIONS_GAMETYPE,
1399
    &ME_NETOPTIONS_EPISODE,
1400
    &ME_NETOPTIONS_LEVEL,
1401
    &ME_NETOPTIONS_MONSTERS,
1402
    &ME_NETOPTIONS_MARKERS,
1403
    &ME_NETOPTIONS_MAPEXITS,
1404
    &ME_NETOPTIONS_ACCEPT,
1405
};
5 Plagman 1406
 
4496 hendricks2 1407
static char MenuServer[BMAX_PATH] = "localhost";
4778 hendricks2 1408
static MenuString_t MEO_NETJOIN_SERVER = MAKE_MENUSTRING( MenuServer, &MF_Bluefont, BMAX_PATH, 0 );
1409
static MenuEntry_t ME_NETJOIN_SERVER = MAKE_MENUENTRY( "Server", &MF_Redfont, &MEF_VideoSetup, &MEO_NETJOIN_SERVER, String );
4496 hendricks2 1410
#define MAXPORTSTRINGLENGTH 6 // unsigned 16-bit integer
1411
static char MenuPort[MAXPORTSTRINGLENGTH] = "19014";
4778 hendricks2 1412
static MenuString_t MEO_NETJOIN_PORT = MAKE_MENUSTRING( MenuPort, &MF_Bluefont, MAXPORTSTRINGLENGTH, INPUT_NUMERIC );
1413
static MenuEntry_t ME_NETJOIN_PORT = MAKE_MENUENTRY( "Port", &MF_Redfont, &MEF_VideoSetup, &MEO_NETJOIN_PORT, String );
6207 hendricks2 1414
static MenuEntry_t ME_NETJOIN_CONNECT = MAKE_MENUENTRY( "Connect", &MF_Redfont, &MEF_VideoSetup_Apply, &MEO_NULL, Link );
471 terminx 1415
 
4496 hendricks2 1416
static MenuEntry_t *MEL_NETJOIN[] = {
1417
    &ME_NETJOIN_SERVER,
1418
    &ME_NETJOIN_PORT,
1419
    &ME_NETJOIN_CONNECT,
1420
};
5 Plagman 1421
 
1422
 
4496 hendricks2 1423
#define NoTitle NULL
91 terminx 1424
 
5693 hendricks2 1425
#define MAKE_MENUMENU(Title, Format, Entries) { Title, Format, Entries, ARRAY_SIZE(Entries), 0, 0, 0 }
6569 hendricks2 1426
#define MAKE_MENUMENU_CUSTOMSIZE(Title, Format, Entries) { Title, Format, Entries, 0, 0, 0, 0 }
91 terminx 1427
 
4778 hendricks2 1428
static MenuMenu_t M_MAIN = MAKE_MENUMENU( NoTitle, &MMF_Top_Main, MEL_MAIN );
1429
static MenuMenu_t M_MAIN_INGAME = MAKE_MENUMENU( NoTitle, &MMF_Top_Main, MEL_MAIN_INGAME );
1430
static MenuMenu_t M_EPISODE = MAKE_MENUMENU( "Select An Episode", &MMF_Top_Episode, MEL_EPISODE );
1431
static MenuMenu_t M_SKILL = MAKE_MENUMENU( "Select Skill", &MMF_Top_Skill, MEL_SKILL );
7930 hendricks2 1432
static MenuMenu_t M_NEWGAMECUSTOM = MAKE_MENUMENU( s_NewGame, &MMF_Top_NewGameCustom, MEL_NEWGAMECUSTOM );
1433
static MenuMenu_t M_NEWGAMECUSTOMSUB = MAKE_MENUMENU( s_NewGame, &MMF_Top_NewGameCustomSub, MEL_NEWGAMECUSTOMSUB );
8569 terminx 1434
#ifndef EDUKE32_RETAIL_MENU
4778 hendricks2 1435
static MenuMenu_t M_GAMESETUP = MAKE_MENUMENU( "Game Setup", &MMF_BigOptions, MEL_GAMESETUP );
6411 terminx 1436
#endif
6329 hendricks2 1437
static MenuMenu_t M_OPTIONS = MAKE_MENUMENU( s_Options, &MMF_Top_Options, MEL_OPTIONS );
4778 hendricks2 1438
static MenuMenu_t M_VIDEOSETUP = MAKE_MENUMENU( "Video Mode", &MMF_BigOptions, MEL_VIDEOSETUP );
1439
static MenuMenu_t M_KEYBOARDSETUP = MAKE_MENUMENU( "Keyboard Setup", &MMF_Top_Options, MEL_KEYBOARDSETUP );
7959 hendricks2 1440
static MenuMenu_t M_CONTROLS = MAKE_MENUMENU( "Control Setup", &MMF_BigOptions, MEL_CONTROLS );
5084 hendricks2 1441
static MenuMenu_t M_CHEATS = MAKE_MENUMENU( "Cheats", &MMF_SmallOptions, MEL_CHEATS );
4778 hendricks2 1442
static MenuMenu_t M_MOUSESETUP = MAKE_MENUMENU( "Mouse Setup", &MMF_BigOptions, MEL_MOUSESETUP );
6013 terminx 1443
#ifdef EDUKE32_ANDROID_MENU
5652 terminx 1444
static MenuMenu_t M_TOUCHSETUP = MAKE_MENUMENU( "Touch Setup", &MMF_Top_Options, MEL_TOUCHSETUP );
1445
static MenuMenu_t M_TOUCHSENS = MAKE_MENUMENU( "Sensitivity", &MMF_BigOptions, MEL_TOUCHSENS);
6061 hendricks2 1446
static MenuPanel_t M_TOUCHBUTTONS = { "Button Setup", MENU_TOUCHSETUP, MA_Return, MENU_TOUCHSETUP, MA_Advance, };
4993 terminx 1447
#endif
7972 hendricks2 1448
static MenuMenu_t M_JOYSTICKSETUP = MAKE_MENUMENU( "Gamepad Setup", &MMF_BigOptions, MEL_JOYSTICKSETUP );
1449
static MenuMenu_t M_JOYSTICKBTNS = MAKE_MENUMENU( "Gamepad Buttons", &MMF_MouseJoySetupBtns, MEL_JOYSTICKBTNS );
1450
static MenuMenu_t M_JOYSTICKAXES = MAKE_MENUMENU( "Gamepad Axes", &MMF_BigSliders, MEL_JOYSTICKAXES );
6324 terminx 1451
static MenuMenu_t M_KEYBOARDKEYS = MAKE_MENUMENU( "Key Configuration", &MMF_KeyboardSetupFuncs, MEL_KEYBOARDSETUPFUNCS );
4778 hendricks2 1452
static MenuMenu_t M_MOUSEBTNS = MAKE_MENUMENU( "Mouse Buttons", &MMF_MouseJoySetupBtns, MEL_MOUSESETUPBTNS );
1453
static MenuMenu_t M_JOYSTICKAXIS = MAKE_MENUMENU( NULL, &MMF_BigSliders, MEL_JOYSTICKAXIS );
4609 terminx 1454
#ifdef USE_OPENGL
5408 terminx 1455
static MenuMenu_t M_RENDERERSETUP_POLYMOST = MAKE_MENUMENU( "Polymost Setup", &MMF_SmallOptions, MEL_RENDERERSETUP_POLYMOST );
5424 helixhorne 1456
# ifdef POLYMER
5408 terminx 1457
static MenuMenu_t M_RENDERERSETUP_POLYMER = MAKE_MENUMENU("Polymer Setup", &MMF_SmallOptions, MEL_RENDERERSETUP_POLYMER );
5424 helixhorne 1458
# endif
4609 terminx 1459
#endif
4778 hendricks2 1460
static MenuMenu_t M_COLCORR = MAKE_MENUMENU( "Color Correction", &MMF_ColorCorrect, MEL_COLCORR );
6289 hendricks2 1461
static MenuMenu_t M_SCREENSETUP = MAKE_MENUMENU( "HUD Setup", &MMF_BigOptions, MEL_SCREENSETUP );
4778 hendricks2 1462
static MenuMenu_t M_DISPLAYSETUP = MAKE_MENUMENU( "Display Setup", &MMF_BigOptions, MEL_DISPLAYSETUP );
6569 hendricks2 1463
static MenuMenu_t M_LOAD = MAKE_MENUMENU_CUSTOMSIZE( s_LoadGame, &MMF_LoadSave, MEL_LOAD );
1464
static MenuMenu_t M_SAVE = MAKE_MENUMENU_CUSTOMSIZE( s_SaveGame, &MMF_LoadSave, MEL_SAVE );
4778 hendricks2 1465
static MenuMenu_t M_SOUND = MAKE_MENUMENU( "Sound Setup", &MMF_BigOptions, MEL_SOUND );
8760 terminx 1466
static MenuMenu_t M_SOUND_DEVSETUP = MAKE_MENUMENU( "Device Configuration", &MMF_BigOptions, MEL_SOUND_DEVSETUP );
6742 hendricks2 1467
static MenuMenu_t M_SAVESETUP = MAKE_MENUMENU( "Save Setup", &MMF_BigOptions, MEL_SAVESETUP );
4778 hendricks2 1468
static MenuMenu_t M_NETWORK = MAKE_MENUMENU( "Network Game", &MMF_Top_Joystick_Network, MEL_NETWORK );
1469
static MenuMenu_t M_PLAYER = MAKE_MENUMENU( "Player Setup", &MMF_SmallOptions, MEL_PLAYER );
1470
static MenuMenu_t M_MACROS = MAKE_MENUMENU( "Multiplayer Macros", &MMF_Macros, MEL_MACROS );
1471
static MenuMenu_t M_NETHOST = MAKE_MENUMENU( "Host Network Game", &MMF_SmallOptionsNarrow, MEL_NETHOST );
1472
static MenuMenu_t M_NETOPTIONS = MAKE_MENUMENU( "Net Game Options", &MMF_NetSetup, MEL_NETOPTIONS );
1473
static MenuMenu_t M_NETJOIN = MAKE_MENUMENU( "Join Network Game", &MMF_SmallOptionsNarrow, MEL_NETJOIN );
88 terminx 1474
 
8569 terminx 1475
#ifdef EDUKE32_RETAIL_MENU
4688 hendricks2 1476
static MenuPanel_t M_STORY = { NoTitle, MENU_STORY, MA_Return, MENU_STORY, MA_Advance, };
4609 terminx 1477
#else
4688 hendricks2 1478
static MenuPanel_t M_STORY = { NoTitle, MENU_F1HELP, MA_Return, MENU_F1HELP, MA_Advance, };
4609 terminx 1479
#endif
1480
 
4688 hendricks2 1481
static MenuPanel_t M_F1HELP = { NoTitle, MENU_STORY, MA_Return, MENU_STORY, MA_Advance, };
1482
static MenuPanel_t M_CREDITS = { NoTitle, MENU_CREDITS5, MA_Return, MENU_CREDITS2, MA_Advance, };
1483
static MenuPanel_t M_CREDITS2 = { NoTitle, MENU_CREDITS, MA_Return, MENU_CREDITS3, MA_Advance, };
1484
static MenuPanel_t M_CREDITS3 = { NoTitle, MENU_CREDITS2, MA_Return, MENU_CREDITS4, MA_Advance, };
6013 terminx 1485
static MenuPanel_t M_CREDITS4 = { "About " APPNAME, MENU_CREDITS3, MA_Return, MENU_CREDITS5, MA_Advance, };
1486
static MenuPanel_t M_CREDITS5 = { "About " APPNAME, MENU_CREDITS4, MA_Return, MENU_CREDITS, MA_Advance, };
5 Plagman 1487
 
4686 hendricks2 1488
#define CURSOR_CENTER_2LINE { MENU_MARGIN_CENTER<<16, 120<<16, }
1489
#define CURSOR_CENTER_3LINE { MENU_MARGIN_CENTER<<16, 129<<16, }
4496 hendricks2 1490
#define CURSOR_BOTTOMRIGHT { 304<<16, 186<<16, }
5 Plagman 1491
 
6756 hendricks2 1492
static MenuVerify_t M_SAVECLEANVERIFY = { CURSOR_CENTER_3LINE, MENU_SAVESETUP, MA_None, };
8114 terminx 1493
static MenuVerify_t M_RESETSTATSVERIFY = { CURSOR_CENTER_3LINE, MENU_SAVESETUP, MA_None, };
4688 hendricks2 1494
static MenuVerify_t M_QUIT = { CURSOR_CENTER_2LINE, MENU_CLOSE, MA_None, };
1495
static MenuVerify_t M_QUITTOTITLE = { CURSOR_CENTER_2LINE, MENU_CLOSE, MA_None, };
1496
static MenuVerify_t M_LOADVERIFY = { CURSOR_CENTER_3LINE, MENU_CLOSE, MA_None, };
6756 hendricks2 1497
static MenuVerify_t M_LOADDELVERIFY = { CURSOR_CENTER_3LINE, MENU_LOAD, MA_None, };
4688 hendricks2 1498
static MenuVerify_t M_NEWVERIFY = { CURSOR_CENTER_2LINE, MENU_EPISODE, MA_Advance, };
1499
static MenuVerify_t M_SAVEVERIFY = { CURSOR_CENTER_2LINE, MENU_SAVE, MA_None, };
6750 hendricks2 1500
static MenuVerify_t M_SAVEDELVERIFY = { CURSOR_CENTER_3LINE, MENU_SAVE, MA_None, };
4688 hendricks2 1501
static MenuVerify_t M_RESETPLAYER = { CURSOR_CENTER_3LINE, MENU_CLOSE, MA_None, };
5 Plagman 1502
 
7971 hendricks2 1503
static MenuVerify_t M_COLCORRRESETVERIFY = { CURSOR_CENTER_2LINE, MENU_COLCORR, MA_None, };
1504
static MenuVerify_t M_KEYSRESETVERIFY = { CURSOR_CENTER_2LINE, MENU_KEYBOARDSETUP, MA_None, };
1505
static MenuVerify_t M_KEYSCLASSICVERIFY = { CURSOR_CENTER_2LINE, MENU_KEYBOARDSETUP, MA_None, };
1506
static MenuVerify_t M_JOYSTANDARDVERIFY = { CURSOR_CENTER_2LINE, MENU_JOYSTICKSETUP, MA_None, };
1507
static MenuVerify_t M_JOYPROVERIFY = { CURSOR_CENTER_2LINE, MENU_JOYSTICKSETUP, MA_None, };
1508
static MenuVerify_t M_JOYCLEARVERIFY = { CURSOR_CENTER_2LINE, MENU_JOYSTICKSETUP, MA_None, };
1509
 
4688 hendricks2 1510
static MenuMessage_t M_NETWAITMASTER = { CURSOR_BOTTOMRIGHT, MENU_NULL, MA_None, };
1511
static MenuMessage_t M_NETWAITVOTES = { CURSOR_BOTTOMRIGHT, MENU_NULL, MA_None, };
1512
static MenuMessage_t M_BUYDUKE = { CURSOR_BOTTOMRIGHT, MENU_EPISODE, MA_Return, };
5 Plagman 1513
 
5083 hendricks2 1514
static MenuTextForm_t M_ADULTPASSWORD = { NULL, "Enter Password:", MAXPWLOCKOUT, MTF_Password };
5084 hendricks2 1515
static MenuTextForm_t M_CHEATENTRY = { NULL, "Enter Cheat Code:", MAXCHEATLEN, 0 };
1516
static MenuTextForm_t M_CHEAT_WARP = { NULL, "Enter Warp #:", 3, 0 };
1517
static MenuTextForm_t M_CHEAT_SKILL = { NULL, "Enter Skill #:", 1, 0 };
5 Plagman 1518
 
7999 hendricks2 1519
#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 1520
 
7999 hendricks2 1521
static MenuFileSelect_t M_USERMAP = MAKE_MENUFILESELECT( "Select A User Map", "./usermaps/", "*.map", boardfilename );
337 terminx 1522
 
8760 terminx 1523
static MenuFileSelect_t M_SOUND_SF2 = MAKE_MENUFILESELECT( "Select Sound Bank", "./", "*.sf2", sf2bankfile);
1524
 
4496 hendricks2 1525
// MUST be in ascending order of MenuID enum values due to binary search
1526
static Menu_t Menus[] = {
4778 hendricks2 1527
    { &M_MAIN, MENU_MAIN, MENU_CLOSE, MA_None, Menu },
1528
    { &M_MAIN_INGAME, MENU_MAIN_INGAME, MENU_CLOSE, MA_None, Menu },
1529
    { &M_EPISODE, MENU_EPISODE, MENU_MAIN, MA_Return, Menu },
8501 hendricks2 1530
    { &M_USERMAP, MENU_USERMAP, MENU_EPISODE, MA_Return, FileSelect },
7930 hendricks2 1531
    { &M_NEWGAMECUSTOM, MENU_NEWGAMECUSTOM, MENU_MAIN, MA_Return, Menu },
1532
    { &M_NEWGAMECUSTOMSUB, MENU_NEWGAMECUSTOMSUB, MENU_NEWGAMECUSTOM, MA_Return, Menu },
1533
    { &M_SKILL, MENU_SKILL, MENU_PREVIOUS, MA_Return, Menu },
8569 terminx 1534
#ifndef EDUKE32_RETAIL_MENU
4778 hendricks2 1535
    { &M_GAMESETUP, MENU_GAMESETUP, MENU_OPTIONS, MA_Return, Menu },
6411 terminx 1536
#endif
4778 hendricks2 1537
    { &M_OPTIONS, MENU_OPTIONS, MENU_MAIN, MA_Return, Menu },
1538
    { &M_VIDEOSETUP, MENU_VIDEOSETUP, MENU_DISPLAYSETUP, MA_Return, Menu },
1539
    { &M_KEYBOARDSETUP, MENU_KEYBOARDSETUP, MENU_CONTROLS, MA_Return, Menu },
1540
    { &M_MOUSESETUP, MENU_MOUSESETUP, MENU_CONTROLS, MA_Return, Menu },
1541
    { &M_JOYSTICKSETUP, MENU_JOYSTICKSETUP, MENU_CONTROLS, MA_Return, Menu },
1542
    { &M_JOYSTICKBTNS, MENU_JOYSTICKBTNS, MENU_JOYSTICKSETUP, MA_Return, Menu },
1543
    { &M_JOYSTICKAXES, MENU_JOYSTICKAXES, MENU_JOYSTICKSETUP, MA_Return, Menu },
1544
    { &M_KEYBOARDKEYS, MENU_KEYBOARDKEYS, MENU_KEYBOARDSETUP, MA_Return, Menu },
1545
    { &M_MOUSEBTNS, MENU_MOUSEBTNS, MENU_MOUSESETUP, MA_Return, Menu },
1546
    { &M_JOYSTICKAXIS, MENU_JOYSTICKAXIS, MENU_JOYSTICKAXES, MA_Return, Menu },
6013 terminx 1547
#ifdef EDUKE32_ANDROID_MENU
4993 terminx 1548
    { &M_TOUCHSETUP, MENU_TOUCHSETUP, MENU_OPTIONS, MA_Return, Menu },
5652 terminx 1549
    { &M_TOUCHSENS, MENU_TOUCHSENS, MENU_TOUCHSETUP, MA_Return, Menu },
5661 terminx 1550
    { &M_TOUCHBUTTONS, MENU_TOUCHBUTTONS, MENU_TOUCHSETUP, MA_Return, Panel },
4993 terminx 1551
#endif
4778 hendricks2 1552
    { &M_CONTROLS, MENU_CONTROLS, MENU_OPTIONS, MA_Return, Menu },
4609 terminx 1553
#ifdef USE_OPENGL
5408 terminx 1554
    { &M_RENDERERSETUP_POLYMOST, MENU_POLYMOST, MENU_DISPLAYSETUP, MA_Return, Menu },
4609 terminx 1555
#endif
4778 hendricks2 1556
    { &M_COLCORR, MENU_COLCORR, MENU_DISPLAYSETUP, MA_Return, Menu },
1557
    { &M_COLCORR, MENU_COLCORR_INGAME, MENU_CLOSE, MA_Return, Menu },
1558
    { &M_SCREENSETUP, MENU_SCREENSETUP, MENU_DISPLAYSETUP, MA_Return, Menu },
1559
    { &M_DISPLAYSETUP, MENU_DISPLAYSETUP, MENU_OPTIONS, MA_Return, Menu },
5408 terminx 1560
#ifdef POLYMER
5424 helixhorne 1561
    { &M_RENDERERSETUP_POLYMER, MENU_POLYMER, MENU_DISPLAYSETUP, MA_Return, Menu },
5408 terminx 1562
#endif
4778 hendricks2 1563
    { &M_LOAD, MENU_LOAD, MENU_MAIN, MA_Return, Menu },
1564
    { &M_SAVE, MENU_SAVE, MENU_MAIN, MA_Return, Menu },
1565
    { &M_STORY, MENU_STORY, MENU_MAIN, MA_Return, Panel },
1566
    { &M_F1HELP, MENU_F1HELP, MENU_MAIN, MA_Return, Panel },
1567
    { &M_QUIT, MENU_QUIT, MENU_PREVIOUS, MA_Return, Verify },
1568
    { &M_QUITTOTITLE, MENU_QUITTOTITLE, MENU_PREVIOUS, MA_Return, Verify },
1569
    { &M_QUIT, MENU_QUIT_INGAME, MENU_CLOSE, MA_None, Verify },
1570
    { &M_NETHOST, MENU_NETSETUP, MENU_MAIN, MA_Return, Menu },
1571
    { &M_NETWAITMASTER, MENU_NETWAITMASTER, MENU_MAIN, MA_Return, Message },
1572
    { &M_NETWAITVOTES, MENU_NETWAITVOTES, MENU_MAIN, MA_Return, Message },
1573
    { &M_SOUND, MENU_SOUND, MENU_OPTIONS, MA_Return, Menu },
1574
    { &M_SOUND, MENU_SOUND_INGAME, MENU_CLOSE, MA_Return, Menu },
8760 terminx 1575
    { &M_SOUND_DEVSETUP, MENU_SOUND_DEVSETUP, MENU_SOUND, MA_Return, Menu },
8764 terminx 1576
#ifndef EDUKE32_RETAIL_MENU
8760 terminx 1577
    { &M_SOUND_SF2, MENU_SOUND_SF2, MENU_SOUND_DEVSETUP, MA_Return, FileSelect },
8764 terminx 1578
#endif
6742 hendricks2 1579
    { &M_SAVESETUP, MENU_SAVESETUP, MENU_OPTIONS, MA_Return, Menu },
6750 hendricks2 1580
    { &M_SAVECLEANVERIFY, MENU_SAVECLEANVERIFY, MENU_SAVESETUP, MA_None, Verify },
8114 terminx 1581
    { &M_RESETSTATSVERIFY, MENU_RESETSTATSVERIFY, MENU_SAVESETUP, MA_None, Verify },
8569 terminx 1582
#ifdef EDUKE32_RETAIL_MENU
6409 terminx 1583
    { &M_CHEATS, MENU_CHEATS, MENU_OPTIONS, MA_Return, Menu },
1584
#else
5517 hendricks2 1585
    { &M_CHEATS, MENU_CHEATS, MENU_GAMESETUP, MA_Return, Menu },
6409 terminx 1586
#endif
5084 hendricks2 1587
    { &M_CHEATENTRY, MENU_CHEATENTRY, MENU_CHEATS, MA_None, TextForm },
1588
    { &M_CHEAT_WARP, MENU_CHEAT_WARP, MENU_CHEATS, MA_None, TextForm },
1589
    { &M_CHEAT_SKILL, MENU_CHEAT_SKILL, MENU_CHEATS, MA_None, TextForm },
4778 hendricks2 1590
    { &M_CREDITS, MENU_CREDITS, MENU_MAIN, MA_Return, Panel },
1591
    { &M_CREDITS2, MENU_CREDITS2, MENU_MAIN, MA_Return, Panel },
1592
    { &M_CREDITS3, MENU_CREDITS3, MENU_MAIN, MA_Return, Panel },
1593
    { &M_CREDITS4, MENU_CREDITS4, MENU_MAIN, MA_Return, Panel },
1594
    { &M_CREDITS5, MENU_CREDITS5, MENU_MAIN, MA_Return, Panel },
1595
    { &M_LOADVERIFY, MENU_LOADVERIFY, MENU_LOAD, MA_None, Verify },
6750 hendricks2 1596
    { &M_LOADDELVERIFY, MENU_LOADDELVERIFY, MENU_LOAD, MA_None, Verify },
1597
    { &M_NEWVERIFY, MENU_NEWVERIFY, MENU_PREVIOUS, MA_Return, Verify },
4778 hendricks2 1598
    { &M_SAVEVERIFY, MENU_SAVEVERIFY, MENU_SAVE, MA_None, Verify },
6750 hendricks2 1599
    { &M_SAVEDELVERIFY, MENU_SAVEDELVERIFY, MENU_SAVE, MA_None, Verify },
7971 hendricks2 1600
    { &M_COLCORRRESETVERIFY, MENU_COLCORRRESETVERIFY, MENU_COLCORR, MA_None, Verify },
1601
    { &M_KEYSRESETVERIFY, MENU_KEYSRESETVERIFY, MENU_KEYBOARDSETUP, MA_None, Verify },
1602
    { &M_KEYSCLASSICVERIFY, MENU_KEYSCLASSICVERIFY, MENU_KEYBOARDSETUP, MA_None, Verify },
1603
    { &M_JOYSTANDARDVERIFY, MENU_JOYSTANDARDVERIFY, MENU_JOYSTICKSETUP, MA_None, Verify },
1604
    { &M_JOYPROVERIFY, MENU_JOYPROVERIFY, MENU_JOYSTICKSETUP, MA_None, Verify },
1605
    { &M_JOYCLEARVERIFY, MENU_JOYCLEARVERIFY, MENU_JOYSTICKSETUP, MA_None, Verify },
5083 hendricks2 1606
    { &M_ADULTPASSWORD, MENU_ADULTPASSWORD, MENU_GAMESETUP, MA_None, TextForm },
4778 hendricks2 1607
    { &M_RESETPLAYER, MENU_RESETPLAYER, MENU_CLOSE, MA_None, Verify },
1608
    { &M_BUYDUKE, MENU_BUYDUKE, MENU_EPISODE, MA_Return, Message },
1609
    { &M_NETWORK, MENU_NETWORK, MENU_MAIN, MA_Return, Menu },
1610
    { &M_PLAYER, MENU_PLAYER, MENU_OPTIONS, MA_Return, Menu },
1611
    { &M_MACROS, MENU_MACROS, MENU_PLAYER, MA_Return, Menu },
1612
    { &M_NETHOST, MENU_NETHOST, MENU_NETWORK, MA_Return, Menu },
1613
    { &M_NETOPTIONS, MENU_NETOPTIONS, MENU_NETWORK, MA_Return, Menu },
1614
    { &M_USERMAP, MENU_NETUSERMAP, MENU_NETOPTIONS, MA_Return, FileSelect },
1615
    { &M_NETJOIN, MENU_NETJOIN, MENU_NETWORK, MA_Return, Menu },
4496 hendricks2 1616
};
337 terminx 1617
 
7114 terminx 1618
static CONSTEXPR const uint16_t numMenus = ARRAY_SIZE(Menus);
337 terminx 1619
 
4496 hendricks2 1620
Menu_t *m_currentMenu = &Menus[0];
1621
static Menu_t *m_previousMenu = &Menus[0];
6289 hendricks2 1622
static Menu_t * m_parentMenu;
5 Plagman 1623
 
4496 hendricks2 1624
MenuID_t g_currentMenu;
1625
static MenuID_t g_previousMenu;
337 terminx 1626
 
4778 hendricks2 1627
#define MenuMenu_ChangeEntryList(m, el)\
4496 hendricks2 1628
    do {\
4778 hendricks2 1629
        m.entrylist = el;\
1630
        m.numEntries = ARRAY_SIZE(el);\
4496 hendricks2 1631
    } while (0)
5 Plagman 1632
 
4855 hendricks2 1633
static void MenuEntry_DisableOnCondition(MenuEntry_t * const entry, const int32_t condition)
1634
{
1635
    if (condition)
6204 hendricks2 1636
        entry->flags |= MEF_Disabled;
4855 hendricks2 1637
    else
6204 hendricks2 1638
        entry->flags &= ~MEF_Disabled;
4855 hendricks2 1639
}
6329 hendricks2 1640
static void MenuEntry_LookDisabledOnCondition(MenuEntry_t * const entry, const int32_t condition)
1641
{
1642
    if (condition)
1643
        entry->flags |= MEF_LookDisabled;
1644
    else
1645
        entry->flags &= ~MEF_LookDisabled;
1646
}
6676 hendricks2 1647
static void MenuEntry_HideOnCondition(MenuEntry_t * const entry, const int32_t condition)
1648
{
1649
    if (condition)
1650
        entry->flags |= MEF_Hidden;
1651
    else
1652
        entry->flags &= ~MEF_Hidden;
1653
}
5 Plagman 1654
 
8499 hendricks2 1655
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 1656
static void Menu_EntryFocus(/*MenuEntry_t *entry*/);
1657
 
1658
static MenuEntry_t *Menu_AdjustForCurrentEntryAssignment(MenuMenu_t *menu)
1659
{
1660
    MenuEntry_t *currentry = menu->entrylist[menu->currentEntry];
1661
 
1662
    Menu_EntryFocus(/*currentry*/);
1663
 
1664
    if (currentry->ybottom - menu->scrollPos > klabs(menu->format->bottomcutoff))
1665
        menu->scrollPos = currentry->ybottom - klabs(menu->format->bottomcutoff);
1666
    else if (currentry->ytop - menu->scrollPos < menu->format->pos.y)
1667
        menu->scrollPos = currentry->ytop - menu->format->pos.y;
1668
 
1669
    return currentry;
1670
}
1671
 
1672
static MenuEntry_t *Menu_AdjustForCurrentEntryAssignmentBlind(MenuMenu_t *menu)
1673
{
8499 hendricks2 1674
    M_RunMenu_Menu(nullptr, menu, nullptr, 0, { 0, 0 }, 0);
6569 hendricks2 1675
    return Menu_AdjustForCurrentEntryAssignment(menu);
1676
}
1677
 
6751 hendricks2 1678
static int32_t SELECTDIR_z = 65536;
1679
 
7930 hendricks2 1680
void Menu_PopulateNewGameCustom(void)
1681
{
1682
    M_NEWGAMECUSTOM.title = s_NewGame;
1683
 
1684
    int e = 0;
1685
    for (MenuGameplayStemEntry const & stem : g_MenuGameplayEntries)
1686
    {
1687
        MenuGameplayEntry const & entry = stem.entry;
1688
        if (!entry.isValid())
1689
            break;
1690
 
1691
        MEL_NEWGAMECUSTOM[e] = &ME_NEWGAMECUSTOMENTRIES[e];
1692
 
1693
        ++e;
1694
    }
1695
    M_NEWGAMECUSTOM.numEntries = e;
1696
    MMF_Top_NewGameCustom.pos.y = (58 + (3-e)*6)<<16;
1697
}
1698
 
1699
void Menu_PopulateNewGameCustomSub(int e)
1700
{
1701
    if ((unsigned)e >= MAXMENUGAMEPLAYENTRIES)
1702
        return;
1703
 
1704
    MenuGameplayStemEntry const & stem = g_MenuGameplayEntries[e];
1705
    MenuGameplayEntry const & entry = stem.entry;
1706
    if (!entry.isValid())
1707
        return;
1708
 
1709
    M_NEWGAMECUSTOMSUB.title = entry.name;
1710
 
1711
    int s = 0;
1712
    for (MenuGameplayEntry const & subentry : stem.subentries)
1713
    {
1714
        if (!subentry.isValid())
1715
            break;
1716
 
1717
        MEL_NEWGAMECUSTOMSUB[s] = &ME_NEWGAMECUSTOMSUBENTRIES[e][s];
1718
 
1719
        ++s;
1720
    }
1721
    M_NEWGAMECUSTOMSUB.numEntries = s;
1722
    MMF_Top_NewGameCustomSub.pos.y = (58 + (3-s)*6)<<16;
1723
}
1724
 
4496 hendricks2 1725
/*
1726
This function prepares data after ART and CON have been processed.
1727
It also initializes some data in loops rather than statically at compile time.
1728
*/
5923 terminx 1729
void Menu_Init(void)
4496 hendricks2 1730
{
1731
    int32_t i, j, k;
5 Plagman 1732
 
8017 terminx 1733
    if (FURY)
1734
    {
1735
        MMF_Top_Skill.pos.x = (320<<15);
1736
        ME_SKILL_TEMPLATE.format = &MEF_LeftMenu;
1737
    }
1738
 
4496 hendricks2 1739
    // prepare menu fonts
6613 hendricks2 1740
    // check if tilenum is -1 in case it was set in EVENT_SETDEFAULTS
1741
    if ((unsigned)MF_Redfont.tilenum >= MAXTILES) MF_Redfont.tilenum = BIGALPHANUM;
1742
    if ((unsigned)MF_Bluefont.tilenum >= MAXTILES) MF_Bluefont.tilenum = STARTALPHANUM;
1743
    if ((unsigned)MF_Minifont.tilenum >= MAXTILES) MF_Minifont.tilenum = MINIFONT;
1744
    MF_Redfont.emptychar.y = tilesiz[MF_Redfont.tilenum].y<<16;
1745
    MF_Bluefont.emptychar.y = tilesiz[MF_Bluefont.tilenum].y<<16;
1746
    MF_Minifont.emptychar.y = tilesiz[MF_Minifont.tilenum].y<<16;
4496 hendricks2 1747
    if (!minitext_lowercase)
1748
        MF_Minifont.textflags |= TEXT_UPPERCASE;
5 Plagman 1749
 
4496 hendricks2 1750
    // prepare gamefuncs and keys
6185 hendricks2 1751
    MEOSN_Gamefuncs[0] = MenuGameFuncNone;
1752
    MEOSV_Gamefuncs[0] = -1;
1753
    k = 1;
4496 hendricks2 1754
    for (i = 0; i < NUMGAMEFUNCTIONS; ++i)
1755
    {
1756
        Bstrcpy(MenuGameFuncs[i], gamefunctions[i]);
5 Plagman 1757
 
4496 hendricks2 1758
        for (j = 0; j < MAXGAMEFUNCLEN; ++j)
1759
            if (MenuGameFuncs[i][j] == '_')
1760
                MenuGameFuncs[i][j] = ' ';
5 Plagman 1761
 
6185 hendricks2 1762
        if (gamefunctions[i][0] != '\0')
1763
        {
1764
            MEOSN_Gamefuncs[k] = MenuGameFuncs[i];
1765
            MEOSV_Gamefuncs[k] = i;
1766
            ++k;
1767
        }
4496 hendricks2 1768
    }
6185 hendricks2 1769
    MEOS_Gamefuncs.numOptions = k;
1770
 
8303 hendricks2 1771
    for (i = 1; i < NUMKEYS-1; ++i)
6827 terminx 1772
        MEOSN_Keys[i] = g_keyNameTable[i];
8303 hendricks2 1773
    MEOSN_Keys[0] = MenuKeyNone;
4496 hendricks2 1774
    MEOSN_Keys[NUMKEYS-1] = MenuKeyNone;
5 Plagman 1775
 
1776
 
4496 hendricks2 1777
    // prepare episodes
5033 hendricks2 1778
    k = 0;
5835 terminx 1779
    for (i = 0; i < g_volumeCnt; ++i)
4496 hendricks2 1780
    {
5835 terminx 1781
        if (g_volumeNames[i][0])
337 terminx 1782
        {
5835 terminx 1783
            if (!(g_volumeFlags[i] & EF_HIDEFROMSP))
5033 hendricks2 1784
            {
1785
                MEL_EPISODE[i] = &ME_EPISODE[i];
1786
                ME_EPISODE[i] = ME_EPISODE_TEMPLATE;
5835 terminx 1787
                ME_EPISODE[i].name = g_volumeNames[i];
5033 hendricks2 1788
            }
4496 hendricks2 1789
 
5041 hendricks2 1790
            // if (!(EpisodeFlags[i] & EF_HIDEFROMMP))
5033 hendricks2 1791
            {
5835 terminx 1792
                MEOSN_NetEpisodes[k] = g_volumeNames[i];
5033 hendricks2 1793
                MEOSV_NetEpisodes[k] = i;
4496 hendricks2 1794
 
5033 hendricks2 1795
                k++;
1796
            }
337 terminx 1797
        }
5 Plagman 1798
 
4496 hendricks2 1799
        // prepare levels
5034 hendricks2 1800
        MEOS_NETOPTIONS_LEVEL[i] = MEOS_NETOPTIONS_LEVEL_TEMPLATE;
4496 hendricks2 1801
        for (j = 0; j < MAXLEVELS; ++j)
337 terminx 1802
        {
5835 terminx 1803
            MEOSN_NetLevels[i][j] = g_mapInfo[MAXLEVELS*i+j].name;
1804
            if (g_mapInfo[i*MAXLEVELS+j].filename != NULL)
4496 hendricks2 1805
                MEOS_NETOPTIONS_LEVEL[i].numOptions = j+1;
337 terminx 1806
        }
4496 hendricks2 1807
        MEOS_NETOPTIONS_LEVEL[i].optionNames = MEOSN_NetLevels[i];
1808
    }
5835 terminx 1809
    M_EPISODE.numEntries = g_volumeCnt+2;
8569 terminx 1810
#if 1 //ifndef EDUKE32_SIMPLE_MENU
6198 hendricks2 1811
    MEL_EPISODE[g_volumeCnt] = &ME_Space4_Redfont;
5835 terminx 1812
    MEL_EPISODE[g_volumeCnt+1] = &ME_EPISODE_USERMAP;
5033 hendricks2 1813
    MEOSN_NetEpisodes[k] = MenuUserMap;
1814
    MEOSV_NetEpisodes[k] = MAXVOLUMES;
6415 terminx 1815
#else
1816
    M_EPISODE.numEntries = g_volumeCnt;
1817
    k--;
1818
#endif
1819
    MEOS_NETOPTIONS_EPISODE.numOptions = k + 1;
5033 hendricks2 1820
    NetEpisode = MEOSV_NetEpisodes[0];
6193 hendricks2 1821
    MMF_Top_Episode.pos.y = (58 + (3-k)*6)<<16;
5835 terminx 1822
    if (g_skillCnt == 0)
4977 hendricks2 1823
        MEO_EPISODE.linkID = MENU_NULL;
6596 hendricks2 1824
    M_EPISODE.currentEntry = ud.default_volume;
5 Plagman 1825
 
7930 hendricks2 1826
    // prepare new game custom :O
1827
    if (g_MenuGameplayEntries[0].entry.isValid())
1828
    {
1829
        MEO_MAIN_NEWGAME.linkID = M_NEWVERIFY.linkID = MENU_NEWGAMECUSTOM;
1830
 
1831
        int e = 0;
1832
        for (MenuGameplayStemEntry const & stem : g_MenuGameplayEntries)
1833
        {
1834
            MenuGameplayEntry const & entry = stem.entry;
1835
            if (!entry.isValid())
1836
                break;
1837
 
1838
            MenuEntry_t & e_me = ME_NEWGAMECUSTOMENTRIES[e];
1839
            e_me = ME_EPISODE_TEMPLATE;
1840
            MenuLink_t & e_meo = MEO_NEWGAMECUSTOM[e];
1841
            e_meo = MEO_NEWGAMECUSTOM_TEMPLATE;
1842
            e_me.entry = &e_meo;
1843
 
1844
            e_me.name = entry.name;
1845
            if (entry.flags & MGE_Locked)
1846
                e_me.flags |= MEF_Disabled;
1847
            if (entry.flags & MGE_Hidden)
1848
                e_me.flags |= MEF_Hidden;
1849
 
1850
            int s = 0;
1851
            for (MenuGameplayEntry const & subentry : stem.subentries)
1852
            {
1853
                if (!subentry.isValid())
1854
                    break;
1855
 
1856
                MenuEntry_t & s_me = ME_NEWGAMECUSTOMSUBENTRIES[e][s];
1857
                s_me = ME_EPISODE_TEMPLATE;
1858
                MenuLink_t & s_meo = MEO_NEWGAMECUSTOMSUB[e][s];
1859
                s_meo = MEO_NEWGAMECUSTOMSUB_TEMPLATE;
1860
                s_me.entry = &s_meo;
1861
 
1862
                s_me.name = subentry.name;
1863
                if (subentry.flags & MGE_Locked)
1864
                    s_me.flags |= MEF_Disabled;
1865
                if (subentry.flags & MGE_Hidden)
1866
                    s_me.flags |= MEF_Hidden;
1867
 
1868
                ++s;
1869
            }
1870
 
7998 hendricks2 1871
            if (entry.flags & MGE_UserContent)
1872
                e_meo.linkID = MENU_USERMAP;
1873
            else if (s == 0)
7930 hendricks2 1874
                e_meo.linkID = MENU_SKILL;
1875
 
1876
            ++e;
1877
        }
1878
 
1879
        Menu_PopulateNewGameCustom();
1880
    }
1881
 
4496 hendricks2 1882
    // prepare skills
1883
    k = -1;
5835 terminx 1884
    for (i = 0; i < g_skillCnt && g_skillNames[i][0]; ++i)
4496 hendricks2 1885
    {
1886
        MEL_SKILL[i] = &ME_SKILL[i];
1887
        ME_SKILL[i] = ME_SKILL_TEMPLATE;
5835 terminx 1888
        ME_SKILL[i].name = g_skillNames[i];
5 Plagman 1889
 
5835 terminx 1890
        MEOSN_NetSkills[i] = g_skillNames[i];
5 Plagman 1891
 
4496 hendricks2 1892
        k = i;
1893
    }
1894
    ++k;
5835 terminx 1895
    M_SKILL.numEntries = g_skillCnt; // k;
1896
    MEOS_NETOPTIONS_MONSTERS.numOptions = g_skillCnt + 1; // k+1;
1897
    MEOSN_NetSkills[g_skillCnt] = MenuSkillNone;
1898
    MMF_Top_Skill.pos.y = (58 + (4-g_skillCnt)*6)<<16;
6596 hendricks2 1899
    M_SKILL.currentEntry = ud.default_skill;
6569 hendricks2 1900
    Menu_AdjustForCurrentEntryAssignmentBlind(&M_SKILL);
5 Plagman 1901
 
4496 hendricks2 1902
    // prepare multiplayer gametypes
1903
    k = -1;
1904
    for (i = 0; i < MAXGAMETYPES; ++i)
5835 terminx 1905
        if (g_gametypeNames[i][0])
4496 hendricks2 1906
        {
5835 terminx 1907
            MEOSN_NetGametypes[i] = g_gametypeNames[i];
4496 hendricks2 1908
            k = i;
1909
        }
1910
    ++k;
1911
    MEOS_NETOPTIONS_GAMETYPE.numOptions = k;
5452 hendricks2 1912
    if (NAM_WW2GI)
1913
        ME_NETOPTIONS_MONSTERS.name = "Enemies";
5 Plagman 1914
 
6676 hendricks2 1915
    // prepare cheats
1916
    for (i = 0; i < NUMCHEATFUNCS; ++i)
1917
        MEL_CHEATS[i+1] = &ME_CheatCodes[i];
1918
 
4496 hendricks2 1919
    // prepare text chat macros
1920
    for (i = 0; i < MAXRIDECULE; ++i)
1921
    {
1922
        MEL_MACROS[i] = &ME_MACROS[i];
1923
        ME_MACROS[i] = ME_MACROS_TEMPLATE;
1924
        ME_MACROS[i].entry = &MEO_MACROS[i];
1925
        MEO_MACROS[i] = MEO_MACROS_TEMPLATE;
5 Plagman 1926
 
4496 hendricks2 1927
        MEO_MACROS[i].variable = ud.ridecule[i];
1928
    }
1929
 
1930
    // prepare input
1931
    for (i = 0; i < NUMGAMEFUNCTIONS; ++i)
1932
    {
6185 hendricks2 1933
        if (MenuGameFuncs[i][0] == '\0')
6350 hendricks2 1934
        {
1935
            MEL_KEYBOARDSETUPFUNCS[i] = NULL;
6185 hendricks2 1936
            continue;
6350 hendricks2 1937
        }
6185 hendricks2 1938
 
6350 hendricks2 1939
        MEL_KEYBOARDSETUPFUNCS[i] = &ME_KEYBOARDSETUPFUNCS[i];
1940
        ME_KEYBOARDSETUPFUNCS[i] = ME_KEYBOARDSETUPFUNCS_TEMPLATE;
1941
        ME_KEYBOARDSETUPFUNCS[i].name = MenuGameFuncs[i];
1942
        ME_KEYBOARDSETUPFUNCS[i].entry = &MEO_KEYBOARDSETUPFUNCS[i];
1943
        MEO_KEYBOARDSETUPFUNCS[i] = MEO_KEYBOARDSETUPFUNCS_TEMPLATE;
1944
        MEO_KEYBOARDSETUPFUNCS[i].column[0] = &ud.config.KeyboardKeys[i][0];
1945
        MEO_KEYBOARDSETUPFUNCS[i].column[1] = &ud.config.KeyboardKeys[i][1];
4496 hendricks2 1946
    }
6350 hendricks2 1947
    M_KEYBOARDKEYS.numEntries = NUMGAMEFUNCTIONS;
4496 hendricks2 1948
    for (i = 0; i < MENUMOUSEFUNCTIONS; ++i)
1949
    {
1950
        MEL_MOUSESETUPBTNS[i] = &ME_MOUSESETUPBTNS[i];
1951
        ME_MOUSESETUPBTNS[i] = ME_MOUSEJOYSETUPBTNS_TEMPLATE;
1952
        ME_MOUSESETUPBTNS[i].name = MenuMouseNames[i];
1953
        ME_MOUSESETUPBTNS[i].entry = &MEO_MOUSESETUPBTNS[i];
1954
        MEO_MOUSESETUPBTNS[i] = MEO_MOUSEJOYSETUPBTNS_TEMPLATE;
1955
        MEO_MOUSESETUPBTNS[i].data = &ud.config.MouseFunctions[MenuMouseDataIndex[i][0]][MenuMouseDataIndex[i][1]];
1956
    }
6827 terminx 1957
    for (i = 0; i < 2*joystick.numButtons + 8*joystick.numHats; ++i)
4496 hendricks2 1958
    {
6827 terminx 1959
        if (i < 2*joystick.numButtons)
337 terminx 1960
        {
4496 hendricks2 1961
            if (i & 1)
6827 terminx 1962
                Bsnprintf(MenuJoystickNames[i], MAXJOYBUTTONSTRINGLENGTH, "Double %s", joyGetName(1, i>>1));
4496 hendricks2 1963
            else
6827 terminx 1964
                Bstrncpy(MenuJoystickNames[i], joyGetName(1, i>>1), MAXJOYBUTTONSTRINGLENGTH);
337 terminx 1965
        }
1966
        else
1967
        {
6827 terminx 1968
            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 1969
        }
5 Plagman 1970
 
4496 hendricks2 1971
        MEL_JOYSTICKBTNS[i] = &ME_JOYSTICKBTNS[i];
1972
        ME_JOYSTICKBTNS[i] = ME_MOUSEJOYSETUPBTNS_TEMPLATE;
1973
        ME_JOYSTICKBTNS[i].name = MenuJoystickNames[i];
1974
        ME_JOYSTICKBTNS[i].entry = &MEO_JOYSTICKBTNS[i];
1975
        MEO_JOYSTICKBTNS[i] = MEO_MOUSEJOYSETUPBTNS_TEMPLATE;
1976
        MEO_JOYSTICKBTNS[i].data = &ud.config.JoystickFunctions[i>>1][i&1];
4399 hendricks2 1977
    }
6827 terminx 1978
    M_JOYSTICKBTNS.numEntries = 2*joystick.numButtons + 8*joystick.numHats;
1979
    for (i = 0; i < joystick.numAxes; ++i)
4496 hendricks2 1980
    {
1981
        ME_JOYSTICKAXES[i] = ME_JOYSTICKAXES_TEMPLATE;
6827 terminx 1982
        Bstrncpy(MenuJoystickAxes[i], joyGetName(0, i), MAXJOYBUTTONSTRINGLENGTH);
4496 hendricks2 1983
        ME_JOYSTICKAXES[i].name = MenuJoystickAxes[i];
1984
        MEL_JOYSTICKAXES[i] = &ME_JOYSTICKAXES[i];
1985
    }
6827 terminx 1986
    M_JOYSTICKAXES.numEntries = joystick.numAxes;
5 Plagman 1987
 
5452 hendricks2 1988
    // prepare sound setup
6289 hendricks2 1989
#ifndef EDUKE32_STANDALONE
5452 hendricks2 1990
    if (WW2GI)
1991
        ME_SOUND_DUKETALK.name = "GI talk:";
1992
    else if (NAM)
1993
        ME_SOUND_DUKETALK.name = "Grunt talk:";
6289 hendricks2 1994
#endif
5452 hendricks2 1995
 
7808 terminx 1996
    if (FURY)
6289 hendricks2 1997
    {
1998
        MF_Redfont.between.x = 2<<16;
6377 hendricks2 1999
        MF_Redfont.cursorScale = 32768;
2000
        MF_Redfont.zoom = 16384;
6613 hendricks2 2001
        MF_Bluefont.zoom = 16384;
6289 hendricks2 2002
 
6329 hendricks2 2003
        // hack; should swap out pointers
2004
        MF_Minifont = MF_Bluefont;
2005
 
6289 hendricks2 2006
        MMF_Top_Main.pos.x = 40<<16;
2007
        MMF_Top_Main.pos.y = 130<<16;
2008
        MMF_Top_Main.bottomcutoff = 190<<16;
2009
        M_OPTIONS.format = &MMF_Top_Main;
2010
 
2011
        MEF_MainMenu.width = MEF_OptionsMenu.width = -(160<<16);
6335 terminx 2012
        MEF_MainMenu.marginBottom = 7<<16;
6289 hendricks2 2013
 
2014
        M_OPTIONS.title = NoTitle;
6751 hendricks2 2015
 
2016
        SELECTDIR_z = 16384;
6289 hendricks2 2017
    }
2018
 
4496 hendricks2 2019
    // prepare shareware
2020
    if (VOLUMEONE)
2021
    {
2022
        // blue out episodes beyond the first
5835 terminx 2023
        for (i = 1; i < g_volumeCnt; ++i)
337 terminx 2024
        {
4496 hendricks2 2025
            if (MEL_EPISODE[i])
335 terminx 2026
            {
4496 hendricks2 2027
                ME_EPISODE[i].entry = &MEO_EPISODE_SHAREWARE;
6206 hendricks2 2028
                ME_EPISODE[i].flags |= MEF_LookDisabled;
5 Plagman 2029
            }
337 terminx 2030
        }
5835 terminx 2031
        M_EPISODE.numEntries = g_volumeCnt; // remove User Map (and spacer)
4496 hendricks2 2032
        MEOS_NETOPTIONS_EPISODE.numOptions = 1;
4855 hendricks2 2033
        MenuEntry_DisableOnCondition(&ME_NETOPTIONS_EPISODE, 1);
4496 hendricks2 2034
    }
5 Plagman 2035
 
4496 hendricks2 2036
    // prepare pre-Atomic
2037
    if (!VOLUMEALL || !PLUTOPAK)
2038
    {
2039
        // prepare credits
6329 hendricks2 2040
        M_CREDITS.title = M_CREDITS2.title = M_CREDITS3.title = s_Credits;
4496 hendricks2 2041
    }
6612 hendricks2 2042
 
6676 hendricks2 2043
    MenuEntry_HideOnCondition(&ME_MAIN_HELP, G_GetLogoFlags() & LOGO_NOHELP);
8569 terminx 2044
#ifndef EDUKE32_RETAIL_MENU
6676 hendricks2 2045
    MenuEntry_HideOnCondition(&ME_MAIN_CREDITS, G_GetLogoFlags() & LOGO_NOCREDITS);
6612 hendricks2 2046
#endif
4496 hendricks2 2047
}
5 Plagman 2048
 
5923 terminx 2049
static void Menu_Run(Menu_t *cm, vec2_t origin);
5 Plagman 2050
 
2051
 
6569 hendricks2 2052
static void Menu_BlackRectangle(int32_t x, int32_t y, int32_t width, int32_t height, int32_t orientation);
5 Plagman 2053
 
4496 hendricks2 2054
/*
5923 terminx 2055
At present, no true difference is planned between Menu_Pre() and Menu_PreDraw().
4496 hendricks2 2056
They are separate for purposes of organization.
2057
*/
5 Plagman 2058
 
5923 terminx 2059
static void Menu_Pre(MenuID_t cm)
4496 hendricks2 2060
{
2061
    int32_t i;
7776 terminx 2062
    auto ps = g_player[myconnectindex].ps;
5 Plagman 2063
 
4496 hendricks2 2064
    switch (cm)
2065
    {
2066
    case MENU_MAIN_INGAME:
4855 hendricks2 2067
        MenuEntry_DisableOnCondition(&ME_MAIN_SAVEGAME, ud.recstat == 2);
2068
        MenuEntry_DisableOnCondition(&ME_MAIN_QUITTOTITLE, g_netServer || numplayers > 1);
6370 terminx 2069
        fallthrough__;
4496 hendricks2 2070
    case MENU_MAIN:
2071
        if ((g_netServer || ud.multimode > 1) && ud.recstat != 2)
2072
        {
2073
            ME_MAIN_NEWGAME.entry = &MEO_MAIN_NEWGAME_NETWORK;
2074
            ME_MAIN_NEWGAME_INGAME.entry = &MEO_MAIN_NEWGAME_NETWORK;
2075
        }
2076
        else
2077
        {
2078
            ME_MAIN_NEWGAME.entry = &MEO_MAIN_NEWGAME;
2079
            ME_MAIN_NEWGAME_INGAME.entry = &MEO_MAIN_NEWGAME_INGAME;
2080
        }
2081
        break;
4399 hendricks2 2082
 
4496 hendricks2 2083
    case MENU_GAMESETUP:
2084
        MEO_GAMESETUP_DEMOREC.options = (ps->gm&MODE_GAME) ? &MEOS_DemoRec : &MEOS_OffOn;
4855 hendricks2 2085
        MenuEntry_DisableOnCondition(&ME_GAMESETUP_DEMOREC, (ps->gm&MODE_GAME) && ud.m_recstat != 1);
4496 hendricks2 2086
        break;
5 Plagman 2087
 
7961 hendricks2 2088
    case MENU_DISPLAYSETUP:
2089
        MenuEntry_HideOnCondition(&ME_DISPLAYSETUP_VOXELS, !g_haveVoxels);
4496 hendricks2 2090
#ifdef USE_OPENGL
6829 terminx 2091
        if (videoGetRenderMode() == REND_CLASSIC)
4778 hendricks2 2092
            MenuMenu_ChangeEntryList(M_DISPLAYSETUP, MEL_DISPLAYSETUP);
4496 hendricks2 2093
#ifdef POLYMER
6829 terminx 2094
        else if (videoGetRenderMode() == REND_POLYMER)
4778 hendricks2 2095
            MenuMenu_ChangeEntryList(M_DISPLAYSETUP, MEL_DISPLAYSETUP_GL_POLYMER);
4496 hendricks2 2096
#endif
2097
        else
4778 hendricks2 2098
            MenuMenu_ChangeEntryList(M_DISPLAYSETUP, MEL_DISPLAYSETUP_GL);
5 Plagman 2099
 
6587 hendricks2 2100
        MEO_SCREENSETUP_SCREENSIZE.steps = !(ud.statusbarflags & STATUSBAR_NONONE) +
2101
                                           !(ud.statusbarflags & STATUSBAR_NOMODERN) +
2102
                                           !(ud.statusbarflags & STATUSBAR_NOMINI) * (ud.statusbarrange + 1) +
2103
                                           !(ud.statusbarflags & STATUSBAR_NOOVERLAY) +
2104
                                           !(ud.statusbarflags & STATUSBAR_NOFULL) +
2105
                                           !(ud.statusbarflags & STATUSBAR_NOSHRINK) * 14;
6650 hendricks2 2106
        MEO_SCREENSETUP_SCREENSIZE.max = MEO_SCREENSETUP_SCREENSIZE.steps - 1;
7984 hendricks2 2107
        if (MEO_SCREENSETUP_SCREENSIZE.steps <= 2 && !(ud.statusbarflags & STATUSBAR_NONONE))
2108
        {
2109
            ME_SCREENSETUP_SCREENSIZE.entry = &MEO_SCREENSETUP_SCREENSIZE_TWO;
2110
            ME_SCREENSETUP_SCREENSIZE.type = Option;
2111
        }
2112
        else
2113
        {
2114
            ME_SCREENSETUP_SCREENSIZE.entry = &MEO_SCREENSETUP_SCREENSIZE;
2115
            ME_SCREENSETUP_SCREENSIZE.type = RangeInt32;
2116
        }
2117
        MenuEntry_HideOnCondition(&ME_SCREENSETUP_SCREENSIZE, (MEO_SCREENSETUP_SCREENSIZE.steps < 2));
4976 hendricks2 2118
 
6587 hendricks2 2119
        vpsize = !(ud.statusbarflags & STATUSBAR_NONONE) +
2120
                 (ud.screen_size >= 4 && !(ud.statusbarflags & STATUSBAR_NOMODERN)) +
2121
                 (ud.screen_size >= 4 && ud.althud == 0 && !(ud.statusbarflags & STATUSBAR_NOMINI)) * (ud.statusbarcustom + 1) +
2122
                 (ud.screen_size >= 8 && !(ud.statusbarflags & STATUSBAR_NOOVERLAY)) +
2123
                 (ud.screen_size >= 8 && ud.statusbarmode == 0 && !(ud.statusbarflags & STATUSBAR_NOFULL)) +
2124
                 (ud.screen_size > 8 && !(ud.statusbarflags & STATUSBAR_NOSHRINK)) * ((ud.screen_size - 8) >> 2)
2125
                 -1;
2126
 
6940 pogokeen 2127
#ifndef EDUKE32_STANDALONE
7420 terminx 2128
#ifdef TEXFILTER_MENU_OPTIONS
6829 terminx 2129
        if (videoGetRenderMode() != REND_CLASSIC)
4869 hendricks2 2130
        {
6776 pogokeen 2131
            //POGOTODO: allow setting anisotropy again while r_useindexedcolortextures is set when support is added down the line
7420 terminx 2132
            // don't allow setting anisotropy while in POLYMOST and r_useindexedcolortextures is enabled
6829 terminx 2133
            MenuEntry_DisableOnCondition(&ME_DISPLAYSETUP_ANISOTROPY, videoGetRenderMode() == REND_POLYMOST && r_useindexedcolortextures);
6776 pogokeen 2134
 
4609 terminx 2135
            for (i = (int32_t) ARRAY_SIZE(MEOSV_DISPLAYSETUP_ANISOTROPY) - 1; i >= 0; --i)
5 Plagman 2136
            {
4609 terminx 2137
                if (MEOSV_DISPLAYSETUP_ANISOTROPY[i] <= glinfo.maxanisotropy)
4496 hendricks2 2138
                {
4609 terminx 2139
                    MEOS_DISPLAYSETUP_ANISOTROPY.numOptions = i + 1;
4496 hendricks2 2140
                    break;
2141
                }
337 terminx 2142
            }
4869 hendricks2 2143
        }
6940 pogokeen 2144
#endif
7420 terminx 2145
#endif
4850 hendricks2 2146
        break;
5 Plagman 2147
 
5408 terminx 2148
    case MENU_POLYMER:
2149
    case MENU_POLYMOST:
4855 hendricks2 2150
        MenuEntry_DisableOnCondition(&ME_RENDERERSETUP_TEXQUALITY, !usehightile);
2151
        MenuEntry_DisableOnCondition