Subversion Repositories eduke32

Rev

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