Subversion Repositories eduke32

Rev

Rev 4993 | Details | Compare with Previous | Last modification | View Log | RSS feed

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