Subversion Repositories eduke32

Rev

Rev 5004 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 5004 Rev 5023
1
//-------------------------------------------------------------------------
1
//-------------------------------------------------------------------------
2
/*
2
/*
3
Copyright (C) 2010 EDuke32 developers and contributors
3
Copyright (C) 2010 EDuke32 developers and contributors
4

4

5
This file is part of EDuke32.
5
This file is part of EDuke32.
6

6

7
EDuke32 is free software; you can redistribute it and/or
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
8
modify it under the terms of the GNU General Public License version 2
9
as published by the Free Software Foundation.
9
as published by the Free Software Foundation.
10

10

11
This program is distributed in the hope that it will be useful,
11
This program is distributed in the hope that it will be useful,
12
but WITHOUT ANY WARRANTY; without even the implied warranty of
12
but WITHOUT ANY WARRANTY; without even the implied warranty of
13
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14

14

15
See the GNU General Public License for more details.
15
See the GNU General Public License for more details.
16

16

17
You should have received a copy of the GNU General Public License
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
18
along with this program; if not, write to the Free Software
19
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
19
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
20
*/
20
*/
21
//-------------------------------------------------------------------------
21
//-------------------------------------------------------------------------
22
22
23
#include "compat.h"
23
#include "compat.h"
24
#include "duke3d.h"
24
#include "duke3d.h"
25
#include "renderlayer.h"
25
#include "renderlayer.h"
26
#include "net.h"
26
#include "net.h"
27
#include "player.h"
27
#include "player.h"
28
#include "mouse.h"
28
#include "mouse.h"
29
#include "joystick.h"
29
#include "joystick.h"
30
#include "osd.h"
30
#include "osd.h"
31
#include "osdcmds.h"
31
#include "osdcmds.h"
32
#include "gamedef.h"
32
#include "gamedef.h"
33
#include "gameexec.h"
33
#include "gameexec.h"
34
#include "savegame.h"
34
#include "savegame.h"
35
#include "premap.h"
35
#include "premap.h"
36
#include "demo.h"
36
#include "demo.h"
37
#include "xxhash.h"
37
#include "xxhash.h"
38
#include "common.h"
38
#include "common.h"
39
#include "common_game.h"
39
#include "common_game.h"
40
#include "input.h"
40
#include "input.h"
41
#include "menus.h"
41
#include "menus.h"
42
42
43
#include <sys/stat.h>
43
#include <sys/stat.h>
44
44
45
#include "android/in_android.h"
45
#include "android/in_android.h"
46
#ifndef __ANDROID__
46
#ifndef __ANDROID__
47
droidinput_t droidinput;
47
droidinput_t droidinput;
48
#endif
48
#endif
49
49
50
// common positions
50
// common positions
51
#define MENU_MARGIN_REGULAR 40
51
#define MENU_MARGIN_REGULAR 40
52
#define MENU_MARGIN_WIDE    32
52
#define MENU_MARGIN_WIDE    32
53
#define MENU_MARGIN_CENTER  160
53
#define MENU_MARGIN_CENTER  160
54
#define MENU_HEIGHT_CENTER  100
54
#define MENU_HEIGHT_CENTER  100
55
55
56
int32_t g_skillSoundVoice = -1;
56
int32_t g_skillSoundVoice = -1;
57
57
58
extern int32_t voting;
58
extern int32_t voting;
59
59
60
#define USERMAPENTRYLENGTH 25
60
#define USERMAPENTRYLENGTH 25
61
61
62
#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)
62
#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)
63
#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)
63
#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)
64
#define mminitext(x,y,t,p) minitext_(x, y, t, 0, p, 2|8|16|ROTATESPRITE_FULL16)
64
#define mminitext(x,y,t,p) minitext_(x, y, t, 0, p, 2|8|16|ROTATESPRITE_FULL16)
65
#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)
65
#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)
66
#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)
66
#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)
67
67
68
static void shadowminitext(int32_t x, int32_t y, const char *t, int32_t p)
68
static void shadowminitext(int32_t x, int32_t y, const char *t, int32_t p)
69
{
69
{
70
    int32_t f = 0;
70
    int32_t f = 0;
71
71
72
    if (!minitext_lowercase)
72
    if (!minitext_lowercase)
73
        f |= TEXT_UPPERCASE;
73
        f |= TEXT_UPPERCASE;
74
74
75
    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);
75
    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);
76
}
76
}
77
static void creditsminitext(int32_t x, int32_t y, const char *t, int32_t p)
77
static void creditsminitext(int32_t x, int32_t y, const char *t, int32_t p)
78
{
78
{
79
    int32_t f = TEXT_XCENTER;
79
    int32_t f = TEXT_XCENTER;
80
80
81
    if (!minitext_lowercase)
81
    if (!minitext_lowercase)
82
        f |= TEXT_UPPERCASE;
82
        f |= TEXT_UPPERCASE;
83
83
84
    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);
84
    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);
85
}
85
}
86
86
87
int32_t menutext_(int32_t x, int32_t y, int32_t s, int32_t p, char *t, int32_t bits)
87
int32_t menutext_(int32_t x, int32_t y, int32_t s, int32_t p, char *t, int32_t bits)
88
{
88
{
89
    vec2_t dim;
89
    vec2_t dim;
90
    int32_t f = TEXT_BIGALPHANUM|TEXT_UPPERCASE|TEXT_LITERALESCAPE;
90
    int32_t f = TEXT_BIGALPHANUM|TEXT_UPPERCASE|TEXT_LITERALESCAPE;
91
91
92
    if (!(bits & ROTATESPRITE_FULL16))
92
    if (!(bits & ROTATESPRITE_FULL16))
93
    {
93
    {
94
        x<<=16;
94
        x<<=16;
95
        y<<=16;
95
        y<<=16;
96
    }
96
    }
97
97
98
    if (x == (160<<16))
98
    if (x == (160<<16))
99
        f |= TEXT_XCENTER;
99
        f |= TEXT_XCENTER;
100
100
101
    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);
101
    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);
102
102
103
    if (!(bits & ROTATESPRITE_FULL16))
103
    if (!(bits & ROTATESPRITE_FULL16))
104
        x >>= 16;
104
        x >>= 16;
105
105
106
    return dim.x;
106
    return dim.x;
107
}
107
}
108
108
109
#pragma pack(push,1)
109
#pragma pack(push,1)
110
static savehead_t savehead;
110
static savehead_t savehead;
111
#pragma pack(pop)
111
#pragma pack(pop)
112
112
113
static void M_DrawBackground(const vec2_t origin)
113
static void M_DrawBackground(const vec2_t origin)
114
{
114
{
115
    rotatesprite_fs(origin.x + (MENU_MARGIN_CENTER<<16), origin.y + (100<<16), 65536L,0,MENUSCREEN,16,0,10+64);
115
    rotatesprite_fs(origin.x + (MENU_MARGIN_CENTER<<16), origin.y + (100<<16), 65536L,0,MENUSCREEN,16,0,10+64);
116
}
116
}
117
117
118
static void M_DrawTopBar(const vec2_t origin)
118
static void M_DrawTopBar(const vec2_t origin)
119
{
119
{
120
    rotatesprite_fs(origin.x + (MENU_MARGIN_CENTER<<16), origin.y + (19<<16), 65536L,0,MENUBAR,16,0,10);
120
    rotatesprite_fs(origin.x + (MENU_MARGIN_CENTER<<16), origin.y + (19<<16), 65536L,0,MENUBAR,16,0,10);
121
}
121
}
122
122
123
static void M_DrawTopBarCaption(const char *caption, const vec2_t origin)
123
static void M_DrawTopBarCaption(const char *caption, const vec2_t origin)
124
{
124
{
125
    char *s = Bstrdup(caption), p = Bstrlen(caption)-1;
125
    char *s = Bstrdup(caption), p = Bstrlen(caption)-1;
126
    if (s[p] == ':') s[p] = 0;
126
    if (s[p] == ':') s[p] = 0;
127
    mmenutextcenter(origin.x, origin.y + (24<<16), s);
127
    mmenutextcenter(origin.x, origin.y + (24<<16), s);
128
    Bfree(s);
128
    Bfree(s);
129
}
129
}
130
130
131
extern int32_t g_quitDeadline;
131
extern int32_t g_quitDeadline;
132
132
133
133
134
134
135
135
136
136
137
137
138
138
139
139
140
140
141
141
142
142
143
143
144
144
145
/*
145
/*
146
All MAKE_* macros are generally for the purpose of keeping state initialization
146
All MAKE_* macros are generally for the purpose of keeping state initialization
147
separate from actual data. Alternatively, they can serve to factor out repetitive
147
separate from actual data. Alternatively, they can serve to factor out repetitive
148
stuff and keep the important bits from getting lost to our eyes.
148
stuff and keep the important bits from getting lost to our eyes.
149

149

150
They serve as a stand-in for C++ default value constructors, since we're using C89.
150
They serve as a stand-in for C++ default value constructors, since we're using C89.
151

151

152
Note that I prefer to include a space on the inside of the macro parentheses, since
152
Note that I prefer to include a space on the inside of the macro parentheses, since
153
they effectively stand in for curly braces as struct initializers.
153
they effectively stand in for curly braces as struct initializers.
154
*/
154
*/
155
155
156
156
157
// common font types
157
// common font types
158
// tilenums are set after namesdyn runs
158
// tilenums are set after namesdyn runs
159
static MenuFont_t MF_Null             = { -1, 10,  0,  0,     0,      0,      0,     0, 0 };
159
static MenuFont_t MF_Null             = { -1, 10,  0,  0,     0,      0,      0,     0, 0 };
160
static MenuFont_t MF_Redfont          = { -1, 10,  0,  1, 5<<16, 15<<16,  0<<16, 0<<16, TEXT_BIGALPHANUM | TEXT_UPPERCASE };
160
static MenuFont_t MF_Redfont          = { -1, 10,  0,  1, 5<<16, 15<<16,  0<<16, 0<<16, TEXT_BIGALPHANUM | TEXT_UPPERCASE };
161
static MenuFont_t MF_RedfontBlue      = { -1, 10,  1,  1, 5<<16, 15<<16,  0<<16, 0<<16, TEXT_BIGALPHANUM | TEXT_UPPERCASE };
161
static MenuFont_t MF_RedfontBlue      = { -1, 10,  1,  1, 5<<16, 15<<16,  0<<16, 0<<16, TEXT_BIGALPHANUM | TEXT_UPPERCASE };
162
static MenuFont_t MF_RedfontGreen     = { -1, 10,  8,  1, 5<<16, 15<<16,  0<<16, 0<<16, TEXT_BIGALPHANUM | TEXT_UPPERCASE };
162
static MenuFont_t MF_RedfontGreen     = { -1, 10,  8,  1, 5<<16, 15<<16,  0<<16, 0<<16, TEXT_BIGALPHANUM | TEXT_UPPERCASE };
163
static MenuFont_t MF_Bluefont         = { -1, 10,  0, 16, 5<<16,  7<<16, -1<<16, 0<<16, 0 };
163
static MenuFont_t MF_Bluefont         = { -1, 10,  0, 16, 5<<16,  7<<16, -1<<16, 0<<16, 0 };
164
static MenuFont_t MF_BluefontRed      = { -1, 10, 10, 16, 5<<16,  7<<16, -1<<16, 0<<16, 0 };
164
static MenuFont_t MF_BluefontRed      = { -1, 10, 10, 16, 5<<16,  7<<16, -1<<16, 0<<16, 0 };
165
static MenuFont_t MF_Minifont         = { -1, 10,  0, 16, 4<<16,  5<<16,  1<<16, 1<<16, 0 };
165
static MenuFont_t MF_Minifont         = { -1, 10,  0, 16, 4<<16,  5<<16,  1<<16, 1<<16, 0 };
166
static MenuFont_t MF_MinifontRed      = { -1, 16, 21, 16, 4<<16,  5<<16,  1<<16, 1<<16, 0 };
166
static MenuFont_t MF_MinifontRed      = { -1, 16, 21, 16, 4<<16,  5<<16,  1<<16, 1<<16, 0 };
167
static MenuFont_t MF_MinifontDarkGray = { -1, 10, 13, 16, 4<<16,  5<<16,  1<<16, 1<<16, 0 };
167
static MenuFont_t MF_MinifontDarkGray = { -1, 10, 13, 16, 4<<16,  5<<16,  1<<16, 1<<16, 0 };
168
168
169
169
170
static MenuMenuFormat_t MMF_Top_Main =             { {  MENU_MARGIN_CENTER<<16, 55<<16, }, -170<<16 };
170
static MenuMenuFormat_t MMF_Top_Main =             { {  MENU_MARGIN_CENTER<<16, 55<<16, }, -170<<16 };
171
static MenuMenuFormat_t MMF_Top_Episode =          { {  MENU_MARGIN_CENTER<<16, 48<<16, }, -190<<16 };
171
static MenuMenuFormat_t MMF_Top_Episode =          { {  MENU_MARGIN_CENTER<<16, 48<<16, }, -190<<16 };
172
static MenuMenuFormat_t MMF_Top_Skill =            { {  MENU_MARGIN_CENTER<<16, 58<<16, }, -190<<16 };
172
static MenuMenuFormat_t MMF_Top_Skill =            { {  MENU_MARGIN_CENTER<<16, 58<<16, }, -190<<16 };
173
static MenuMenuFormat_t MMF_Top_Options =          { {  MENU_MARGIN_CENTER<<16, 38<<16, }, -190<<16 };
173
static MenuMenuFormat_t MMF_Top_Options =          { {  MENU_MARGIN_CENTER<<16, 38<<16, }, -190<<16 };
174
static MenuMenuFormat_t MMF_Top_Joystick_Network = { {  MENU_MARGIN_CENTER<<16, 70<<16, }, -190<<16 };
174
static MenuMenuFormat_t MMF_Top_Joystick_Network = { {  MENU_MARGIN_CENTER<<16, 70<<16, }, -190<<16 };
175
static MenuMenuFormat_t MMF_BigOptions =           { {    MENU_MARGIN_WIDE<<16, 38<<16, }, -190<<16 };
175
static MenuMenuFormat_t MMF_BigOptions =           { {    MENU_MARGIN_WIDE<<16, 38<<16, }, -190<<16 };
176
static MenuMenuFormat_t MMF_SmallOptions =         { {    MENU_MARGIN_WIDE<<16, 37<<16, },  160<<16 };
176
static MenuMenuFormat_t MMF_SmallOptions =         { {    MENU_MARGIN_WIDE<<16, 37<<16, },  160<<16 };
177
static MenuMenuFormat_t MMF_Macros =               { {                  26<<16, 40<<16, },  160<<16 };
177
static MenuMenuFormat_t MMF_Macros =               { {                  26<<16, 40<<16, },  160<<16 };
178
static MenuMenuFormat_t MMF_SmallOptionsNarrow  =  { { MENU_MARGIN_REGULAR<<16, 38<<16, }, -190<<16 };
178
static MenuMenuFormat_t MMF_SmallOptionsNarrow  =  { { MENU_MARGIN_REGULAR<<16, 38<<16, }, -190<<16 };
179
static MenuMenuFormat_t MMF_KeyboardSetupFuncs =   { {                  70<<16, 34<<16, },  151<<16 };
179
static MenuMenuFormat_t MMF_KeyboardSetupFuncs =   { {                  70<<16, 34<<16, },  151<<16 };
180
static MenuMenuFormat_t MMF_MouseJoySetupBtns =    { {                  76<<16, 34<<16, },  143<<16 };
180
static MenuMenuFormat_t MMF_MouseJoySetupBtns =    { {                  76<<16, 34<<16, },  143<<16 };
181
static MenuMenuFormat_t MMF_FuncList =             { {                 100<<16, 51<<16, },  152<<16 };
181
static MenuMenuFormat_t MMF_FuncList =             { {                 100<<16, 51<<16, },  152<<16 };
182
static MenuMenuFormat_t MMF_ColorCorrect =         { { MENU_MARGIN_REGULAR<<16, 86<<16, },  190<<16 };
182
static MenuMenuFormat_t MMF_ColorCorrect =         { { MENU_MARGIN_REGULAR<<16, 86<<16, },  190<<16 };
183
static MenuMenuFormat_t MMF_BigSliders =           { {    MENU_MARGIN_WIDE<<16, 37<<16, },  190<<16 };
183
static MenuMenuFormat_t MMF_BigSliders =           { {    MENU_MARGIN_WIDE<<16, 37<<16, },  190<<16 };
184
static MenuMenuFormat_t MMF_LoadSave =             { {                 223<<16, 48<<16, },  320<<16 };
184
static MenuMenuFormat_t MMF_LoadSave =             { {                 223<<16, 48<<16, },  320<<16 };
185
static MenuMenuFormat_t MMF_NetSetup =             { {                  36<<16, 38<<16, },  190<<16 };
185
static MenuMenuFormat_t MMF_NetSetup =             { {                  36<<16, 38<<16, },  190<<16 };
186
static MenuMenuFormat_t MMF_FileSelectLeft =       { {                  40<<16, 45<<16, },  162<<16 };
186
static MenuMenuFormat_t MMF_FileSelectLeft =       { {                  40<<16, 45<<16, },  162<<16 };
187
static MenuMenuFormat_t MMF_FileSelectRight =      { {                 164<<16, 45<<16, },  162<<16 };
187
static MenuMenuFormat_t MMF_FileSelectRight =      { {                 164<<16, 45<<16, },  162<<16 };
188
188
189
static MenuEntryFormat_t MEF_Null =             {     0,      0,        0,  20<<16, 65536 };
189
static MenuEntryFormat_t MEF_Null =             {     0,      0,        0,  20<<16, 65536 };
190
static MenuEntryFormat_t MEF_MainMenu =         { 4<<16,      0,        0, 110<<16, 65536 };
190
static MenuEntryFormat_t MEF_MainMenu =         { 4<<16,      0,        0, 110<<16, 65536 };
191
static MenuEntryFormat_t MEF_CenterMenu =       { 7<<16,      0,        0, 110<<16, 65536 };
191
static MenuEntryFormat_t MEF_CenterMenu =       { 7<<16,      0,        0, 110<<16, 65536 };
192
static MenuEntryFormat_t MEF_BigOptions =       { 4<<16,      0,  190<<16,  20<<16, 65536 };
192
static MenuEntryFormat_t MEF_BigOptions =       { 4<<16,      0,  190<<16,  20<<16, 65536 };
193
static MenuEntryFormat_t MEF_BigOptions_Apply = { 4<<16, 16<<16,  190<<16,  20<<16, 65536 };
193
static MenuEntryFormat_t MEF_BigOptions_Apply = { 4<<16, 16<<16,  190<<16,  20<<16, 65536 };
194
static MenuEntryFormat_t MEF_BigOptionsRt =     { 4<<16,      0, -260<<16,  20<<16, 65536 };
194
static MenuEntryFormat_t MEF_BigOptionsRt =     { 4<<16,      0, -260<<16,  20<<16, 65536 };
195
#if defined USE_OPENGL || !defined DROIDMENU
195
#if defined USE_OPENGL || !defined DROIDMENU
196
static MenuEntryFormat_t MEF_SmallOptions =     { 1<<16,      0,  216<<16,  10<<16, 32768 };
196
static MenuEntryFormat_t MEF_SmallOptions =     { 1<<16,      0,  216<<16,  10<<16, 32768 };
197
#endif
197
#endif
198
static MenuEntryFormat_t MEF_PlayerNarrow =     { 1<<16,      0,   90<<16,  10<<16, 32768 };
198
static MenuEntryFormat_t MEF_PlayerNarrow =     { 1<<16,      0,   90<<16,  10<<16, 32768 };
199
static MenuEntryFormat_t MEF_Macros =           { 2<<16,     -1,  268<<16,  10<<16, 32768 };
199
static MenuEntryFormat_t MEF_Macros =           { 2<<16,     -1,  268<<16,  10<<16, 32768 };
200
static MenuEntryFormat_t MEF_VideoSetup =       { 4<<16,      0,  168<<16,  20<<16, 65536 };
200
static MenuEntryFormat_t MEF_VideoSetup =       { 4<<16,      0,  168<<16,  20<<16, 65536 };
201
static MenuEntryFormat_t MEF_FuncList =         { 3<<16,      0,  100<<16,  10<<16, 32768 };
201
static MenuEntryFormat_t MEF_FuncList =         { 3<<16,      0,  100<<16,  10<<16, 32768 };
202
static MenuEntryFormat_t MEF_ColorCorrect =     { 2<<16,      0, -240<<16,  20<<16, 65536 };
202
static MenuEntryFormat_t MEF_ColorCorrect =     { 2<<16,      0, -240<<16,  20<<16, 65536 };
203
static MenuEntryFormat_t MEF_BigSliders =       { 2<<16,      0,  170<<16,  20<<16, 65536 };
203
static MenuEntryFormat_t MEF_BigSliders =       { 2<<16,      0,  170<<16,  20<<16, 65536 };
204
static MenuEntryFormat_t MEF_LoadSave =         { 7<<16,     -1,   78<<16,  20<<16, 65536 };
204
static MenuEntryFormat_t MEF_LoadSave =         { 7<<16,     -1,   78<<16,  20<<16, 65536 };
205
static MenuEntryFormat_t MEF_NetSetup =         { 4<<16,      0,    2<<16,  20<<16, 65536 };
205
static MenuEntryFormat_t MEF_NetSetup =         { 4<<16,      0,    2<<16,  20<<16, 65536 };
206
206
207
// common menu option sets
207
// common menu option sets
208
#define MAKE_MENUOPTIONSET(optionNames, optionValues, features) { optionNames, optionValues, &MMF_FuncList, &MEF_FuncList, &MF_Minifont, ARRAY_SIZE(optionNames), -1, 0, features }
208
#define MAKE_MENUOPTIONSET(optionNames, optionValues, features) { optionNames, optionValues, &MMF_FuncList, &MEF_FuncList, &MF_Minifont, ARRAY_SIZE(optionNames), -1, 0, features }
209
#define MAKE_MENUOPTIONSETDYN(optionNames, optionValues, numOptions, features) { optionNames, optionValues, &MMF_FuncList, &MEF_FuncList, &MF_Minifont, numOptions, -1, 0, features }
209
#define MAKE_MENUOPTIONSETDYN(optionNames, optionValues, numOptions, features) { optionNames, optionValues, &MMF_FuncList, &MEF_FuncList, &MF_Minifont, numOptions, -1, 0, features }
210
210
211
static char *MEOSN_OffOn[] = { "Off", "On", };
211
static char *MEOSN_OffOn[] = { "Off", "On", };
212
static MenuOptionSet_t MEOS_OffOn = MAKE_MENUOPTIONSET( MEOSN_OffOn, NULL, 0x3 );
212
static MenuOptionSet_t MEOS_OffOn = MAKE_MENUOPTIONSET( MEOSN_OffOn, NULL, 0x3 );
213
static char *MEOSN_OnOff[] = { "On", "Off", };
213
static char *MEOSN_OnOff[] = { "On", "Off", };
214
static MenuOptionSet_t MEOS_OnOff = MAKE_MENUOPTIONSET( MEOSN_OnOff, NULL, 0x3 );
214
static MenuOptionSet_t MEOS_OnOff = MAKE_MENUOPTIONSET( MEOSN_OnOff, NULL, 0x3 );
215
static char *MEOSN_NoYes[] = { "No", "Yes", };
215
static char *MEOSN_NoYes[] = { "No", "Yes", };
216
static MenuOptionSet_t MEOS_NoYes = MAKE_MENUOPTIONSET( MEOSN_NoYes, NULL, 0x3 );
216
static MenuOptionSet_t MEOS_NoYes = MAKE_MENUOPTIONSET( MEOSN_NoYes, NULL, 0x3 );
217
static char *MEOSN_YesNo[] = { "Yes", "No", };
217
static char *MEOSN_YesNo[] = { "Yes", "No", };
218
static MenuOptionSet_t MEOS_YesNo = MAKE_MENUOPTIONSET( MEOSN_YesNo, NULL, 0x3 );
218
static MenuOptionSet_t MEOS_YesNo = MAKE_MENUOPTIONSET( MEOSN_YesNo, NULL, 0x3 );
219
219
220
220
221
static char MenuGameFuncs[NUMGAMEFUNCTIONS][MAXGAMEFUNCLEN];
221
static char MenuGameFuncs[NUMGAMEFUNCTIONS][MAXGAMEFUNCLEN];
222
static char *MenuGameFuncNone = "  -None-";
222
static char *MenuGameFuncNone = "  -None-";
223
static char *MEOSN_Gamefuncs[NUMGAMEFUNCTIONS+1];
223
static char *MEOSN_Gamefuncs[NUMGAMEFUNCTIONS+1];
224
static MenuOptionSet_t MEOS_Gamefuncs = MAKE_MENUOPTIONSET( MEOSN_Gamefuncs, NULL, 0x1 );
224
static MenuOptionSet_t MEOS_Gamefuncs = MAKE_MENUOPTIONSET( MEOSN_Gamefuncs, NULL, 0x1 );
225
225
226
226
227
227
228
/*
228
/*
229
MenuEntry_t is passed in arrays of pointers so that the callback function
229
MenuEntry_t is passed in arrays of pointers so that the callback function
230
that is called when an entry is modified or activated can test equality of the current
230
that is called when an entry is modified or activated can test equality of the current
231
entry pointer directly against the known ones, instead of relying on an ID number.
231
entry pointer directly against the known ones, instead of relying on an ID number.
232

232

233
That way, individual menu entries can be ifdef'd out painlessly.
233
That way, individual menu entries can be ifdef'd out painlessly.
234
*/
234
*/
235
235
236
static MenuLink_t MEO_NULL = { MENU_NULL, MA_None, };
236
static MenuLink_t MEO_NULL = { MENU_NULL, MA_None, };
237
static const char* MenuCustom = "Custom";
237
static const char* MenuCustom = "Custom";
238
238
239
#define MAKE_MENUSTRING(...) { NULL, __VA_ARGS__, }
239
#define MAKE_MENUSTRING(...) { NULL, __VA_ARGS__, }
240
#define MAKE_MENUOPTION(...) { __VA_ARGS__, -1, }
240
#define MAKE_MENUOPTION(...) { __VA_ARGS__, -1, }
241
#define MAKE_MENURANGE(...) { __VA_ARGS__, }
241
#define MAKE_MENURANGE(...) { __VA_ARGS__, }
242
#define MAKE_MENUENTRY(...) { __VA_ARGS__, 0, 0, 0, }
242
#define MAKE_MENUENTRY(...) { __VA_ARGS__, 0, 0, 0, }
243
243
244
244
245
#define MAKE_SPACER( EntryName, Height ) \
245
#define MAKE_SPACER( EntryName, Height ) \
246
static MenuSpacer_t MEO_ ## EntryName = { Height };\
246
static MenuSpacer_t MEO_ ## EntryName = { Height };\
247
static MenuEntry_t ME_ ## EntryName = MAKE_MENUENTRY( NULL, &MF_Null, &MEF_Null, &MEO_ ## EntryName, Spacer )
247
static MenuEntry_t ME_ ## EntryName = MAKE_MENUENTRY( NULL, &MF_Null, &MEF_Null, &MEO_ ## EntryName, Spacer )
248
248
249
MAKE_SPACER( Space2, 2<<16 ); // bigoptions
249
MAKE_SPACER( Space2, 2<<16 ); // bigoptions
250
MAKE_SPACER( Space4, 4<<16 ); // usermap, smalloptions, anything else non-top
250
MAKE_SPACER( Space4, 4<<16 ); // usermap, smalloptions, anything else non-top
251
MAKE_SPACER( Space6, 6<<16 ); // videosetup
251
MAKE_SPACER( Space6, 6<<16 ); // videosetup
252
MAKE_SPACER( Space8, 8<<16 ); // colcorr, redslide
252
MAKE_SPACER( Space8, 8<<16 ); // colcorr, redslide
253
253
254
254
255
#define MAKE_MENU_TOP_ENTRYLINK( Title, Format, EntryName, LinkID ) \
255
#define MAKE_MENU_TOP_ENTRYLINK( Title, Format, EntryName, LinkID ) \
256
static MenuLink_t MEO_ ## EntryName = { LinkID, MA_Advance, };\
256
static MenuLink_t MEO_ ## EntryName = { LinkID, MA_Advance, };\
257
static MenuEntry_t ME_ ## EntryName = MAKE_MENUENTRY( Title, &MF_Redfont, &Format, &MEO_ ## EntryName, Link )
257
static MenuEntry_t ME_ ## EntryName = MAKE_MENUENTRY( Title, &MF_Redfont, &Format, &MEO_ ## EntryName, Link )
258
258
259
259
260
MAKE_MENU_TOP_ENTRYLINK( "New Game", MEF_MainMenu, MAIN_NEWGAME, MENU_EPISODE );
260
MAKE_MENU_TOP_ENTRYLINK( "New Game", MEF_MainMenu, MAIN_NEWGAME, MENU_EPISODE );
261
#ifdef DROIDMENU
261
#ifdef DROIDMENU
262
MAKE_MENU_TOP_ENTRYLINK( "Resume Game", MEF_MainMenu, MAIN_RESUMEGAME, MENU_CLOSE );
262
MAKE_MENU_TOP_ENTRYLINK( "Resume Game", MEF_MainMenu, MAIN_RESUMEGAME, MENU_CLOSE );
263
#endif
263
#endif
264
MAKE_MENU_TOP_ENTRYLINK( "New Game", MEF_MainMenu, MAIN_NEWGAME_INGAME, MENU_NEWVERIFY );
264
MAKE_MENU_TOP_ENTRYLINK( "New Game", MEF_MainMenu, MAIN_NEWGAME_INGAME, MENU_NEWVERIFY );
265
static MenuLink_t MEO_MAIN_NEWGAME_NETWORK = { MENU_NETWORK, MA_Advance, };
265
static MenuLink_t MEO_MAIN_NEWGAME_NETWORK = { MENU_NETWORK, MA_Advance, };
266
MAKE_MENU_TOP_ENTRYLINK( "Save Game", MEF_MainMenu, MAIN_SAVEGAME, MENU_SAVE );
266
MAKE_MENU_TOP_ENTRYLINK( "Save Game", MEF_MainMenu, MAIN_SAVEGAME, MENU_SAVE );
267
MAKE_MENU_TOP_ENTRYLINK( "Load Game", MEF_MainMenu, MAIN_LOADGAME, MENU_LOAD );
267
MAKE_MENU_TOP_ENTRYLINK( "Load Game", MEF_MainMenu, MAIN_LOADGAME, MENU_LOAD );
268
MAKE_MENU_TOP_ENTRYLINK( "Options", MEF_MainMenu, MAIN_OPTIONS, MENU_OPTIONS );
268
MAKE_MENU_TOP_ENTRYLINK( "Options", MEF_MainMenu, MAIN_OPTIONS, MENU_OPTIONS );
269
#ifndef DROIDMENU
269
#ifndef DROIDMENU
270
MAKE_MENU_TOP_ENTRYLINK( "Help", MEF_MainMenu, MAIN_HELP, MENU_STORY );
270
MAKE_MENU_TOP_ENTRYLINK( "Help", MEF_MainMenu, MAIN_HELP, MENU_STORY );
271
#endif
271
#endif
272
MAKE_MENU_TOP_ENTRYLINK( "Credits", MEF_MainMenu, MAIN_CREDITS, MENU_CREDITS );
272
MAKE_MENU_TOP_ENTRYLINK( "Credits", MEF_MainMenu, MAIN_CREDITS, MENU_CREDITS );
273
MAKE_MENU_TOP_ENTRYLINK( "Quit To Title", MEF_MainMenu, MAIN_QUITTOTITLE, MENU_QUITTOTITLE );
273
MAKE_MENU_TOP_ENTRYLINK( "Quit To Title", MEF_MainMenu, MAIN_QUITTOTITLE, MENU_QUITTOTITLE );
274
MAKE_MENU_TOP_ENTRYLINK( "Quit", MEF_MainMenu, MAIN_QUIT, MENU_QUIT );
274
MAKE_MENU_TOP_ENTRYLINK( "Quit", MEF_MainMenu, MAIN_QUIT, MENU_QUIT );
275
MAKE_MENU_TOP_ENTRYLINK( "Quit Game", MEF_MainMenu, MAIN_QUITGAME, MENU_QUIT );
275
MAKE_MENU_TOP_ENTRYLINK( "Quit Game", MEF_MainMenu, MAIN_QUITGAME, MENU_QUIT );
276
276
277
static MenuEntry_t *MEL_MAIN[] = {
277
static MenuEntry_t *MEL_MAIN[] = {
278
    &ME_MAIN_NEWGAME,
278
    &ME_MAIN_NEWGAME,
279
    &ME_MAIN_OPTIONS,
279
    &ME_MAIN_OPTIONS,
280
    &ME_MAIN_LOADGAME,
280
    &ME_MAIN_LOADGAME,
281
#ifndef DROIDMENU
281
#ifndef DROIDMENU
282
    &ME_MAIN_HELP,
282
    &ME_MAIN_HELP,
283
#endif
283
#endif
284
    &ME_MAIN_CREDITS,
284
    &ME_MAIN_CREDITS,
285
    &ME_MAIN_QUIT,
285
    &ME_MAIN_QUIT,
286
};
286
};
287
287
288
static MenuEntry_t *MEL_MAIN_INGAME[] = {
288
static MenuEntry_t *MEL_MAIN_INGAME[] = {
289
#ifdef DROIDMENU
289
#ifdef DROIDMENU
290
    &ME_MAIN_RESUMEGAME,
290
    &ME_MAIN_RESUMEGAME,
291
#else
291
#else
292
    &ME_MAIN_NEWGAME_INGAME,
292
    &ME_MAIN_NEWGAME_INGAME,
293
#endif
293
#endif
294
    &ME_MAIN_SAVEGAME,
294
    &ME_MAIN_SAVEGAME,
295
    &ME_MAIN_LOADGAME,
295
    &ME_MAIN_LOADGAME,
296
    &ME_MAIN_OPTIONS,
296
    &ME_MAIN_OPTIONS,
297
#ifndef DROIDMENU
297
#ifndef DROIDMENU
298
    &ME_MAIN_HELP,
298
    &ME_MAIN_HELP,
299
    &ME_MAIN_QUITTOTITLE,
299
    &ME_MAIN_QUITTOTITLE,
300
    &ME_MAIN_QUITGAME,
300
    &ME_MAIN_QUITGAME,
301
#else
301
#else
302
    &ME_MAIN_QUITTOTITLE,
302
    &ME_MAIN_QUITTOTITLE,
303
#endif
303
#endif
304
};
304
};
305
305
306
// Episode and Skill will be dynamically generated after CONs are parsed
306
// Episode and Skill will be dynamically generated after CONs are parsed
307
static MenuLink_t MEO_EPISODE = { MENU_SKILL, MA_Advance, };
307
static MenuLink_t MEO_EPISODE = { MENU_SKILL, MA_Advance, };
308
static MenuLink_t MEO_EPISODE_SHAREWARE = { MENU_BUYDUKE, MA_Advance, };
308
static MenuLink_t MEO_EPISODE_SHAREWARE = { MENU_BUYDUKE, MA_Advance, };
309
static MenuEntry_t ME_EPISODE_TEMPLATE = MAKE_MENUENTRY( NULL, &MF_Redfont, &MEF_CenterMenu, &MEO_EPISODE, Link );
309
static MenuEntry_t ME_EPISODE_TEMPLATE = MAKE_MENUENTRY( NULL, &MF_Redfont, &MEF_CenterMenu, &MEO_EPISODE, Link );
310
static MenuEntry_t ME_EPISODE[MAXVOLUMES];
310
static MenuEntry_t ME_EPISODE[MAXVOLUMES];
311
static MenuLink_t MEO_EPISODE_USERMAP = { MENU_USERMAP, MA_Advance, };
311
static MenuLink_t MEO_EPISODE_USERMAP = { MENU_USERMAP, MA_Advance, };
312
static MenuEntry_t ME_EPISODE_USERMAP = MAKE_MENUENTRY( "User Map", &MF_Redfont, &MEF_CenterMenu, &MEO_EPISODE_USERMAP, Link );
312
static MenuEntry_t ME_EPISODE_USERMAP = MAKE_MENUENTRY( "User Map", &MF_Redfont, &MEF_CenterMenu, &MEO_EPISODE_USERMAP, Link );
313
static MenuEntry_t *MEL_EPISODE[MAXVOLUMES+2]; // +2 for spacer and User Map
313
static MenuEntry_t *MEL_EPISODE[MAXVOLUMES+2]; // +2 for spacer and User Map
314
314
315
static MenuEntry_t ME_SKILL_TEMPLATE = MAKE_MENUENTRY( NULL, &MF_Redfont, &MEF_CenterMenu, &MEO_NULL, Link );
315
static MenuEntry_t ME_SKILL_TEMPLATE = MAKE_MENUENTRY( NULL, &MF_Redfont, &MEF_CenterMenu, &MEO_NULL, Link );
316
static MenuEntry_t ME_SKILL[MAXSKILLS];
316
static MenuEntry_t ME_SKILL[MAXSKILLS];
317
static MenuEntry_t *MEL_SKILL[MAXSKILLS];
317
static MenuEntry_t *MEL_SKILL[MAXSKILLS];
318
318
319
#if defined STARTUP_SETUP_WINDOW && !defined DROIDMENU
319
#if defined STARTUP_SETUP_WINDOW && !defined DROIDMENU
320
static MenuOption_t MEO_GAMESETUP_STARTWIN = MAKE_MENUOPTION( &MF_Redfont, &MEOS_OffOn, &ud.config.ForceSetup );
320
static MenuOption_t MEO_GAMESETUP_STARTWIN = MAKE_MENUOPTION( &MF_Redfont, &MEOS_OffOn, &ud.config.ForceSetup );
321
static MenuEntry_t ME_GAMESETUP_STARTWIN = MAKE_MENUENTRY( "Startup window:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_GAMESETUP_STARTWIN, Option );
321
static MenuEntry_t ME_GAMESETUP_STARTWIN = MAKE_MENUENTRY( "Startup window:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_GAMESETUP_STARTWIN, Option );
322
#endif
322
#endif
323
323
324
static char *MEOSN_GAMESETUP_AIM_AUTO[] = { "None", "Regular", "Bullets only",
324
static char *MEOSN_GAMESETUP_AIM_AUTO[] = { "None", "Regular", "Bullets only",
325
#ifdef DROIDMENU
325
#ifdef DROIDMENU
326
"Extra wide"
326
"Extra wide"
327
#endif
327
#endif
328
};
328
};
329
static int32_t MEOSV_GAMESETUP_AIM_AUTO[] = { 0, 1, 2,
329
static int32_t MEOSV_GAMESETUP_AIM_AUTO[] = { 0, 1, 2,
330
#ifdef DROIDMENU
330
#ifdef DROIDMENU
331
3,
331
3,
332
#endif
332
#endif
333
};
333
};
334
334
335
static MenuOptionSet_t MEOS_GAMESETUP_AIM_AUTO = MAKE_MENUOPTIONSET( MEOSN_GAMESETUP_AIM_AUTO, MEOSV_GAMESETUP_AIM_AUTO, 0x2 );
335
static MenuOptionSet_t MEOS_GAMESETUP_AIM_AUTO = MAKE_MENUOPTIONSET( MEOSN_GAMESETUP_AIM_AUTO, MEOSV_GAMESETUP_AIM_AUTO, 0x2 );
336
static MenuOption_t MEO_GAMESETUP_AIM_AUTO = MAKE_MENUOPTION( &MF_Redfont, &MEOS_GAMESETUP_AIM_AUTO, &ud.config.AutoAim );
336
static MenuOption_t MEO_GAMESETUP_AIM_AUTO = MAKE_MENUOPTION( &MF_Redfont, &MEOS_GAMESETUP_AIM_AUTO, &ud.config.AutoAim );
337
static MenuEntry_t ME_GAMESETUP_AIM_AUTO = MAKE_MENUENTRY( "Auto aim:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_GAMESETUP_AIM_AUTO, Option );
337
static MenuEntry_t ME_GAMESETUP_AIM_AUTO = MAKE_MENUENTRY( "Auto aim:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_GAMESETUP_AIM_AUTO, Option );
338
338
339
static char *MEOSN_GAMESETUP_WEAPSWITCH_PICKUP[] = { "Never", "If new", "By rating", };
339
static char *MEOSN_GAMESETUP_WEAPSWITCH_PICKUP[] = { "Never", "If new", "By rating", };
340
static MenuOptionSet_t MEOS_GAMESETUP_WEAPSWITCH_PICKUP = MAKE_MENUOPTIONSET( MEOSN_GAMESETUP_WEAPSWITCH_PICKUP, NULL, 0x2 );
340
static MenuOptionSet_t MEOS_GAMESETUP_WEAPSWITCH_PICKUP = MAKE_MENUOPTIONSET( MEOSN_GAMESETUP_WEAPSWITCH_PICKUP, NULL, 0x2 );
341
static MenuOption_t MEO_GAMESETUP_WEAPSWITCH_PICKUP = MAKE_MENUOPTION( &MF_Redfont, &MEOS_GAMESETUP_WEAPSWITCH_PICKUP, NULL );
341
static MenuOption_t MEO_GAMESETUP_WEAPSWITCH_PICKUP = MAKE_MENUOPTION( &MF_Redfont, &MEOS_GAMESETUP_WEAPSWITCH_PICKUP, NULL );
342
static MenuEntry_t ME_GAMESETUP_WEAPSWITCH_PICKUP = MAKE_MENUENTRY( "Equip pickups:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_GAMESETUP_WEAPSWITCH_PICKUP, Option );
342
static MenuEntry_t ME_GAMESETUP_WEAPSWITCH_PICKUP = MAKE_MENUENTRY( "Equip pickups:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_GAMESETUP_WEAPSWITCH_PICKUP, Option );
343
343
344
static char *MEOSN_DemoRec[] = { "Off", "Running", };
344
static char *MEOSN_DemoRec[] = { "Off", "Running", };
345
static MenuOptionSet_t MEOS_DemoRec = MAKE_MENUOPTIONSET( MEOSN_DemoRec, NULL, 0x3 );
345
static MenuOptionSet_t MEOS_DemoRec = MAKE_MENUOPTIONSET( MEOSN_DemoRec, NULL, 0x3 );
346
static MenuOption_t MEO_GAMESETUP_DEMOREC = MAKE_MENUOPTION( &MF_Redfont, &MEOS_OffOn, &ud.m_recstat );
346
static MenuOption_t MEO_GAMESETUP_DEMOREC = MAKE_MENUOPTION( &MF_Redfont, &MEOS_OffOn, &ud.m_recstat );
347
static MenuEntry_t ME_GAMESETUP_DEMOREC = MAKE_MENUENTRY( "Record demo:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_GAMESETUP_DEMOREC, Option );
347
static MenuEntry_t ME_GAMESETUP_DEMOREC = MAKE_MENUENTRY( "Record demo:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_GAMESETUP_DEMOREC, Option );
348
348
349
#ifdef _WIN32
349
#ifdef _WIN32
350
static MenuOption_t MEO_GAMESETUP_UPDATES = MAKE_MENUOPTION( &MF_Redfont, &MEOS_NoYes, &ud.config.CheckForUpdates );
350
static MenuOption_t MEO_GAMESETUP_UPDATES = MAKE_MENUOPTION( &MF_Redfont, &MEOS_NoYes, &ud.config.CheckForUpdates );
351
static MenuEntry_t ME_GAMESETUP_UPDATES = MAKE_MENUENTRY( "Online updates:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_GAMESETUP_UPDATES, Option );
351
static MenuEntry_t ME_GAMESETUP_UPDATES = MAKE_MENUENTRY( "Online updates:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_GAMESETUP_UPDATES, Option );
352
#endif
352
#endif
353
353
354
static MenuOption_t MEO_ADULTMODE = MAKE_MENUOPTION(&MF_Redfont, &MEOS_OffOn, &ud.lockout);
354
static MenuOption_t MEO_ADULTMODE = MAKE_MENUOPTION(&MF_Redfont, &MEOS_OffOn, &ud.lockout);
355
static MenuEntry_t ME_ADULTMODE = MAKE_MENUENTRY( "Parental lock:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_ADULTMODE, Option );
355
static MenuEntry_t ME_ADULTMODE = MAKE_MENUENTRY( "Parental lock:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_ADULTMODE, Option );
356
// static MenuLink_t MEO_ADULTMODE_PASSWORD = { MENU_ADULTPASSWORD, MA_None, };
356
// static MenuLink_t MEO_ADULTMODE_PASSWORD = { MENU_ADULTPASSWORD, MA_None, };
357
// static MenuEntry_t ME_ADULTMODE_PASSWORD = MAKE_MENUENTRY( "Enter Password", &MF_Redfont, &, &MEO_ADULTMODE_PASSWORD, Link );
357
// static MenuEntry_t ME_ADULTMODE_PASSWORD = MAKE_MENUENTRY( "Enter Password", &MF_Redfont, &, &MEO_ADULTMODE_PASSWORD, Link );
358
358
359
static MenuOption_t MEO_GAMESETUP_CROUCHLOCK = MAKE_MENUOPTION(&MF_Redfont, &MEOS_OffOn, &droidinput.toggleCrouch);
359
static MenuOption_t MEO_GAMESETUP_CROUCHLOCK = MAKE_MENUOPTION(&MF_Redfont, &MEOS_OffOn, &droidinput.toggleCrouch);
360
static MenuEntry_t ME_GAMESETUP_CROUCHLOCK = MAKE_MENUENTRY("Crouch lock:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_GAMESETUP_CROUCHLOCK, Option);
360
static MenuEntry_t ME_GAMESETUP_CROUCHLOCK = MAKE_MENUENTRY("Crouch lock:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_GAMESETUP_CROUCHLOCK, Option);
361
361
362
static MenuOption_t MEO_GAMESETUP_QUICKSWITCH = MAKE_MENUOPTION(&MF_Redfont, &MEOS_OffOn, &droidinput.quickSelectWeapon);
362
static MenuOption_t MEO_GAMESETUP_QUICKSWITCH = MAKE_MENUOPTION(&MF_Redfont, &MEOS_OffOn, &droidinput.quickSelectWeapon);
363
static MenuEntry_t ME_GAMESETUP_QUICKSWITCH = MAKE_MENUENTRY("Quick weapon switch:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_GAMESETUP_QUICKSWITCH, Option);
363
static MenuEntry_t ME_GAMESETUP_QUICKSWITCH = MAKE_MENUENTRY("Quick weapon switch:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_GAMESETUP_QUICKSWITCH, Option);
364
364
365
static MenuEntry_t *MEL_GAMESETUP[] = {
365
static MenuEntry_t *MEL_GAMESETUP[] = {
366
    &ME_ADULTMODE,
366
    &ME_ADULTMODE,
367
#if defined STARTUP_SETUP_WINDOW && !defined DROIDMENU
367
#if defined STARTUP_SETUP_WINDOW && !defined DROIDMENU
368
    &ME_GAMESETUP_STARTWIN,
368
    &ME_GAMESETUP_STARTWIN,
369
#endif
369
#endif
370
    &ME_GAMESETUP_AIM_AUTO,
370
    &ME_GAMESETUP_AIM_AUTO,
371
    &ME_GAMESETUP_WEAPSWITCH_PICKUP,
371
    &ME_GAMESETUP_WEAPSWITCH_PICKUP,
-
 
372
#ifdef DROIDMENU
372
    &ME_GAMESETUP_QUICKSWITCH,
373
    &ME_GAMESETUP_QUICKSWITCH,
373
    &ME_GAMESETUP_CROUCHLOCK,
374
    &ME_GAMESETUP_CROUCHLOCK,
374
#ifndef DROIDMENU
375
#else
375
    &ME_GAMESETUP_DEMOREC,
376
    &ME_GAMESETUP_DEMOREC,
376
#ifdef _WIN32
377
#ifdef _WIN32
377
    &ME_GAMESETUP_UPDATES,
378
    &ME_GAMESETUP_UPDATES,
378
#endif
379
#endif
379
#endif
380
#endif
380
};
381
};
381
382
382
MAKE_MENU_TOP_ENTRYLINK( "Game Setup", MEF_CenterMenu, OPTIONS_GAMESETUP, MENU_GAMESETUP );
383
MAKE_MENU_TOP_ENTRYLINK( "Game Setup", MEF_CenterMenu, OPTIONS_GAMESETUP, MENU_GAMESETUP );
383
MAKE_MENU_TOP_ENTRYLINK( "Sound Setup", MEF_CenterMenu, OPTIONS_SOUNDSETUP, MENU_SOUND );
384
MAKE_MENU_TOP_ENTRYLINK( "Sound Setup", MEF_CenterMenu, OPTIONS_SOUNDSETUP, MENU_SOUND );
384
MAKE_MENU_TOP_ENTRYLINK( "Display Setup", MEF_CenterMenu, OPTIONS_DISPLAYSETUP, MENU_DISPLAYSETUP );
385
MAKE_MENU_TOP_ENTRYLINK( "Display Setup", MEF_CenterMenu, OPTIONS_DISPLAYSETUP, MENU_DISPLAYSETUP );
385
MAKE_MENU_TOP_ENTRYLINK( "Player Setup", MEF_CenterMenu, OPTIONS_PLAYERSETUP, MENU_PLAYER );
386
MAKE_MENU_TOP_ENTRYLINK( "Player Setup", MEF_CenterMenu, OPTIONS_PLAYERSETUP, MENU_PLAYER );
386
MAKE_MENU_TOP_ENTRYLINK( "Control Setup", MEF_CenterMenu, OPTIONS_CONTROLS, MENU_CONTROLS );
387
MAKE_MENU_TOP_ENTRYLINK( "Control Setup", MEF_CenterMenu, OPTIONS_CONTROLS, MENU_CONTROLS );
387
MAKE_MENU_TOP_ENTRYLINK( "Keyboard Setup", MEF_CenterMenu, OPTIONS_KEYBOARDSETUP, MENU_KEYBOARDSETUP );
388
MAKE_MENU_TOP_ENTRYLINK( "Keyboard Setup", MEF_CenterMenu, OPTIONS_KEYBOARDSETUP, MENU_KEYBOARDSETUP );
388
MAKE_MENU_TOP_ENTRYLINK( "Mouse Setup", MEF_CenterMenu, OPTIONS_MOUSESETUP, MENU_MOUSESETUP );
389
MAKE_MENU_TOP_ENTRYLINK( "Mouse Setup", MEF_CenterMenu, OPTIONS_MOUSESETUP, MENU_MOUSESETUP );
389
MAKE_MENU_TOP_ENTRYLINK( "Joystick Setup", MEF_CenterMenu, OPTIONS_JOYSTICKSETUP, MENU_JOYSTICKSETUP );
390
MAKE_MENU_TOP_ENTRYLINK( "Joystick Setup", MEF_CenterMenu, OPTIONS_JOYSTICKSETUP, MENU_JOYSTICKSETUP );
390
#ifdef DROIDMENU
391
#ifdef DROIDMENU
391
MAKE_MENU_TOP_ENTRYLINK( "Touch Setup", MEF_CenterMenu, OPTIONS_TOUCHSETUP, MENU_TOUCHSETUP );
392
MAKE_MENU_TOP_ENTRYLINK( "Touch Setup", MEF_CenterMenu, OPTIONS_TOUCHSETUP, MENU_TOUCHSETUP );
392
#endif
393
#endif
393
394
394
static int32_t newresolution, newrendermode, newfullscreen;
395
static int32_t newresolution, newrendermode, newfullscreen;
395
396
396
enum resflags_t {
397
enum resflags_t {
397
    RES_FS  = 0x1,
398
    RES_FS  = 0x1,
398
    RES_WIN = 0x2,
399
    RES_WIN = 0x2,
399
};
400
};
400
401
401
#define MAXRESOLUTIONSTRINGLENGTH 16
402
#define MAXRESOLUTIONSTRINGLENGTH 16
402
403
403
typedef struct resolution_t {
404
typedef struct resolution_t {
404
    int32_t xdim, ydim;
405
    int32_t xdim, ydim;
405
    int32_t flags;
406
    int32_t flags;
406
    int32_t bppmax;
407
    int32_t bppmax;
407
    char name[MAXRESOLUTIONSTRINGLENGTH];
408
    char name[MAXRESOLUTIONSTRINGLENGTH];
408
} resolution_t;
409
} resolution_t;
409
410
410
resolution_t resolution[MAXVALIDMODES];
411
resolution_t resolution[MAXVALIDMODES];
411
412
412
static char *MEOSN_VIDEOSETUP_RESOLUTION[MAXVALIDMODES];
413
static char *MEOSN_VIDEOSETUP_RESOLUTION[MAXVALIDMODES];
413
static MenuOptionSet_t MEOS_VIDEOSETUP_RESOLUTION = MAKE_MENUOPTIONSETDYN( MEOSN_VIDEOSETUP_RESOLUTION, NULL, 0, 0x0 );
414
static MenuOptionSet_t MEOS_VIDEOSETUP_RESOLUTION = MAKE_MENUOPTIONSETDYN( MEOSN_VIDEOSETUP_RESOLUTION, NULL, 0, 0x0 );
414
static MenuOption_t MEO_VIDEOSETUP_RESOLUTION = MAKE_MENUOPTION( &MF_Redfont, &MEOS_VIDEOSETUP_RESOLUTION, &newresolution );
415
static MenuOption_t MEO_VIDEOSETUP_RESOLUTION = MAKE_MENUOPTION( &MF_Redfont, &MEOS_VIDEOSETUP_RESOLUTION, &newresolution );
415
static MenuEntry_t ME_VIDEOSETUP_RESOLUTION = MAKE_MENUENTRY( "Resolution:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_VIDEOSETUP_RESOLUTION, Option );
416
static MenuEntry_t ME_VIDEOSETUP_RESOLUTION = MAKE_MENUENTRY( "Resolution:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_VIDEOSETUP_RESOLUTION, Option );
416
417
417
#ifdef USE_OPENGL
418
#ifdef USE_OPENGL
418
#ifdef POLYMER
419
#ifdef POLYMER
419
static char *MEOSN_VIDEOSETUP_RENDERER[] = { "Classic", "Polymost", "Polymer", };
420
static char *MEOSN_VIDEOSETUP_RENDERER[] = { "Classic", "Polymost", "Polymer", };
420
static int32_t MEOSV_VIDEOSETUP_RENDERER[] = { REND_CLASSIC, REND_POLYMOST, REND_POLYMER, };
421
static int32_t MEOSV_VIDEOSETUP_RENDERER[] = { REND_CLASSIC, REND_POLYMOST, REND_POLYMER, };
421
#else
422
#else
422
static char *MEOSN_VIDEOSETUP_RENDERER[] = { "Classic", "OpenGL", };
423
static char *MEOSN_VIDEOSETUP_RENDERER[] = { "Classic", "OpenGL", };
423
static int32_t MEOSV_VIDEOSETUP_RENDERER[] = { REND_CLASSIC, REND_POLYMOST, };
424
static int32_t MEOSV_VIDEOSETUP_RENDERER[] = { REND_CLASSIC, REND_POLYMOST, };
424
#endif
425
#endif
425
426
426
static MenuOptionSet_t MEOS_VIDEOSETUP_RENDERER = MAKE_MENUOPTIONSET( MEOSN_VIDEOSETUP_RENDERER, MEOSV_VIDEOSETUP_RENDERER, 0x2 );
427
static MenuOptionSet_t MEOS_VIDEOSETUP_RENDERER = MAKE_MENUOPTIONSET( MEOSN_VIDEOSETUP_RENDERER, MEOSV_VIDEOSETUP_RENDERER, 0x2 );
427
428
428
static MenuOption_t MEO_VIDEOSETUP_RENDERER = MAKE_MENUOPTION( &MF_Redfont, &MEOS_VIDEOSETUP_RENDERER, &newrendermode );
429
static MenuOption_t MEO_VIDEOSETUP_RENDERER = MAKE_MENUOPTION( &MF_Redfont, &MEOS_VIDEOSETUP_RENDERER, &newrendermode );
429
static MenuEntry_t ME_VIDEOSETUP_RENDERER = MAKE_MENUENTRY( "Renderer:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_VIDEOSETUP_RENDERER, Option );
430
static MenuEntry_t ME_VIDEOSETUP_RENDERER = MAKE_MENUENTRY( "Renderer:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_VIDEOSETUP_RENDERER, Option );
430
#endif
431
#endif
431
432
432
static MenuOption_t MEO_VIDEOSETUP_FULLSCREEN = MAKE_MENUOPTION( &MF_Redfont, &MEOS_NoYes, &newfullscreen );
433
static MenuOption_t MEO_VIDEOSETUP_FULLSCREEN = MAKE_MENUOPTION( &MF_Redfont, &MEOS_NoYes, &newfullscreen );
433
static MenuEntry_t ME_VIDEOSETUP_FULLSCREEN = MAKE_MENUENTRY( "Fullscreen:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_VIDEOSETUP_FULLSCREEN, Option );
434
static MenuEntry_t ME_VIDEOSETUP_FULLSCREEN = MAKE_MENUENTRY( "Fullscreen:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_VIDEOSETUP_FULLSCREEN, Option );
434
static MenuEntry_t ME_VIDEOSETUP_APPLY = MAKE_MENUENTRY( "Apply Changes", &MF_Redfont, &MEF_BigOptions_Apply, &MEO_NULL, Link );
435
static MenuEntry_t ME_VIDEOSETUP_APPLY = MAKE_MENUENTRY( "Apply Changes", &MF_Redfont, &MEF_BigOptions_Apply, &MEO_NULL, Link );
435
436
436
437
437
static MenuLink_t MEO_DISPLAYSETUP_COLORCORR = { MENU_COLCORR, MA_Advance, };
438
static MenuLink_t MEO_DISPLAYSETUP_COLORCORR = { MENU_COLCORR, MA_Advance, };
438
static MenuEntry_t ME_DISPLAYSETUP_COLORCORR = MAKE_MENUENTRY( "Color Correction", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_COLORCORR, Link );
439
static MenuEntry_t ME_DISPLAYSETUP_COLORCORR = MAKE_MENUENTRY( "Color Correction", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_COLORCORR, Link );
439
static MenuOption_t MEO_DISPLAYSETUP_PIXELDOUBLING = MAKE_MENUOPTION( &MF_Redfont, &MEOS_OnOff, &ud.detail );
440
static MenuOption_t MEO_DISPLAYSETUP_PIXELDOUBLING = MAKE_MENUOPTION( &MF_Redfont, &MEOS_OnOff, &ud.detail );
440
static MenuEntry_t ME_DISPLAYSETUP_PIXELDOUBLING = MAKE_MENUENTRY( "Pixel Doubling:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_PIXELDOUBLING, Option );
441
static MenuEntry_t ME_DISPLAYSETUP_PIXELDOUBLING = MAKE_MENUENTRY( "Pixel Doubling:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_PIXELDOUBLING, Option );
441
442
442
443
443
#ifdef USE_OPENGL
444
#ifdef USE_OPENGL
444
static MenuOption_t MEO_DISPLAYSETUP_ASPECTRATIO = MAKE_MENUOPTION(&MF_Redfont, &MEOS_OffOn, NULL);
445
static MenuOption_t MEO_DISPLAYSETUP_ASPECTRATIO = MAKE_MENUOPTION(&MF_Redfont, &MEOS_OffOn, NULL);
445
#else
446
#else
446
static MenuOption_t MEO_DISPLAYSETUP_ASPECTRATIO = MAKE_MENUOPTION(&MF_Redfont, &MEOS_OffOn, &r_usenewaspect);
447
static MenuOption_t MEO_DISPLAYSETUP_ASPECTRATIO = MAKE_MENUOPTION(&MF_Redfont, &MEOS_OffOn, &r_usenewaspect);
447
#endif
448
#endif
448
static MenuEntry_t ME_DISPLAYSETUP_ASPECTRATIO = MAKE_MENUENTRY( "Widescreen:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_ASPECTRATIO, Option );
449
static MenuEntry_t ME_DISPLAYSETUP_ASPECTRATIO = MAKE_MENUENTRY( "Widescreen:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_ASPECTRATIO, Option );
449
#ifdef POLYMER
450
#ifdef POLYMER
450
static char *MEOSN_DISPLAYSETUP_ASPECTRATIO_POLYMER[] = { "Auto", "4:3", "16:10", "5:3", "16:9", "1.85:1", "2.39:1", };
451
static char *MEOSN_DISPLAYSETUP_ASPECTRATIO_POLYMER[] = { "Auto", "4:3", "16:10", "5:3", "16:9", "1.85:1", "2.39:1", };
451
static double MEOSV_DISPLAYSETUP_ASPECTRATIO_POLYMER[] = { 0., 1.33, 1.6, 1.66, 1.78, 1.85, 2.39, };
452
static double MEOSV_DISPLAYSETUP_ASPECTRATIO_POLYMER[] = { 0., 1.33, 1.6, 1.66, 1.78, 1.85, 2.39, };
452
static MenuOptionSet_t MEOS_DISPLAYSETUP_ASPECTRATIO_POLYMER = MAKE_MENUOPTIONSET( MEOSN_DISPLAYSETUP_ASPECTRATIO_POLYMER, NULL, 0x1 );
453
static MenuOptionSet_t MEOS_DISPLAYSETUP_ASPECTRATIO_POLYMER = MAKE_MENUOPTIONSET( MEOSN_DISPLAYSETUP_ASPECTRATIO_POLYMER, NULL, 0x1 );
453
static MenuOption_t MEO_DISPLAYSETUP_ASPECTRATIO_POLYMER = MAKE_MENUOPTION(&MF_Redfont, &MEOS_DISPLAYSETUP_ASPECTRATIO_POLYMER, NULL);
454
static MenuOption_t MEO_DISPLAYSETUP_ASPECTRATIO_POLYMER = MAKE_MENUOPTION(&MF_Redfont, &MEOS_DISPLAYSETUP_ASPECTRATIO_POLYMER, NULL);
454
static MenuEntry_t ME_DISPLAYSETUP_ASPECTRATIO_POLYMER = MAKE_MENUENTRY( "Aspect ratio:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_ASPECTRATIO_POLYMER, Option );
455
static MenuEntry_t ME_DISPLAYSETUP_ASPECTRATIO_POLYMER = MAKE_MENUENTRY( "Aspect ratio:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_ASPECTRATIO_POLYMER, Option );
455
#endif
456
#endif
456
457
457
458
458
#ifdef USE_OPENGL
459
#ifdef USE_OPENGL
459
static char *MEOSN_DISPLAYSETUP_TEXFILTER[] = { "Classic", "Filtered" };
460
static char *MEOSN_DISPLAYSETUP_TEXFILTER[] = { "Classic", "Filtered" };
460
static MenuOptionSet_t MEOS_DISPLAYSETUP_TEXFILTER = MAKE_MENUOPTIONSET( MEOSN_DISPLAYSETUP_TEXFILTER, NULL, 0x2 );
461
static MenuOptionSet_t MEOS_DISPLAYSETUP_TEXFILTER = MAKE_MENUOPTIONSET( MEOSN_DISPLAYSETUP_TEXFILTER, NULL, 0x2 );
461
int32_t menufiltermode;
462
int32_t menufiltermode;
462
static MenuOption_t MEO_DISPLAYSETUP_TEXFILTER = MAKE_MENUOPTION( &MF_Redfont, &MEOS_DISPLAYSETUP_TEXFILTER, &menufiltermode );
463
static MenuOption_t MEO_DISPLAYSETUP_TEXFILTER = MAKE_MENUOPTION( &MF_Redfont, &MEOS_DISPLAYSETUP_TEXFILTER, &menufiltermode );
463
static MenuEntry_t ME_DISPLAYSETUP_TEXFILTER = MAKE_MENUENTRY( "Texture Mode:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_TEXFILTER, Option );
464
static MenuEntry_t ME_DISPLAYSETUP_TEXFILTER = MAKE_MENUENTRY( "Texture Mode:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_TEXFILTER, Option );
464
465
465
static char *MEOSN_DISPLAYSETUP_ANISOTROPY[] = { "None", "2x", "4x", "8x", "16x", };
466
static char *MEOSN_DISPLAYSETUP_ANISOTROPY[] = { "None", "2x", "4x", "8x", "16x", };
466
static int32_t MEOSV_DISPLAYSETUP_ANISOTROPY[] = { 1, 2, 4, 8, 16, };
467
static int32_t MEOSV_DISPLAYSETUP_ANISOTROPY[] = { 1, 2, 4, 8, 16, };
467
static MenuOptionSet_t MEOS_DISPLAYSETUP_ANISOTROPY = MAKE_MENUOPTIONSET( MEOSN_DISPLAYSETUP_ANISOTROPY, MEOSV_DISPLAYSETUP_ANISOTROPY, 0x0 );
468
static MenuOptionSet_t MEOS_DISPLAYSETUP_ANISOTROPY = MAKE_MENUOPTIONSET( MEOSN_DISPLAYSETUP_ANISOTROPY, MEOSV_DISPLAYSETUP_ANISOTROPY, 0x0 );
468
static MenuOption_t MEO_DISPLAYSETUP_ANISOTROPY = MAKE_MENUOPTION(&MF_Redfont, &MEOS_DISPLAYSETUP_ANISOTROPY, &glanisotropy);
469
static MenuOption_t MEO_DISPLAYSETUP_ANISOTROPY = MAKE_MENUOPTION(&MF_Redfont, &MEOS_DISPLAYSETUP_ANISOTROPY, &glanisotropy);
469
static MenuEntry_t ME_DISPLAYSETUP_ANISOTROPY = MAKE_MENUENTRY( "Anisotropy:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_ANISOTROPY, Option );
470
static MenuEntry_t ME_DISPLAYSETUP_ANISOTROPY = MAKE_MENUENTRY( "Anisotropy:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_ANISOTROPY, Option );
470
static char *MEOSN_DISPLAYSETUP_VSYNC[] = { "Adaptive", "Off", "On", };
471
static char *MEOSN_DISPLAYSETUP_VSYNC[] = { "Adaptive", "Off", "On", };
471
static int32_t MEOSV_DISPLAYSETUP_VSYNC[] = { -1, 0, 1, };
472
static int32_t MEOSV_DISPLAYSETUP_VSYNC[] = { -1, 0, 1, };
472
static MenuOptionSet_t MEOS_DISPLAYSETUP_VSYNC = MAKE_MENUOPTIONSET( MEOSN_DISPLAYSETUP_VSYNC, MEOSV_DISPLAYSETUP_VSYNC, 0x2 );
473
static MenuOptionSet_t MEOS_DISPLAYSETUP_VSYNC = MAKE_MENUOPTIONSET( MEOSN_DISPLAYSETUP_VSYNC, MEOSV_DISPLAYSETUP_VSYNC, 0x2 );
473
static MenuOption_t MEO_DISPLAYSETUP_VSYNC = MAKE_MENUOPTION(&MF_Redfont, &MEOS_DISPLAYSETUP_VSYNC, &vsync);
474
static MenuOption_t MEO_DISPLAYSETUP_VSYNC = MAKE_MENUOPTION(&MF_Redfont, &MEOS_DISPLAYSETUP_VSYNC, &vsync);
474
static MenuEntry_t ME_DISPLAYSETUP_VSYNC = MAKE_MENUENTRY( "VSync:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_VSYNC, Option );
475
static MenuEntry_t ME_DISPLAYSETUP_VSYNC = MAKE_MENUENTRY( "VSync:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_VSYNC, Option );
475
476
476
#ifdef DROIDMENU
477
#ifdef DROIDMENU
477
static MenuOption_t MEO_DISPLAYSETUP_HIDEDPAD = MAKE_MENUOPTION(&MF_Redfont, &MEOS_NoYes, &droidinput.hideStick);
478
static MenuOption_t MEO_DISPLAYSETUP_HIDEDPAD = MAKE_MENUOPTION(&MF_Redfont, &MEOS_NoYes, &droidinput.hideStick);
478
static MenuEntry_t ME_DISPLAYSETUP_HIDEDPAD = MAKE_MENUENTRY("Hide touch d-pad:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_HIDEDPAD, Option);
479
static MenuEntry_t ME_DISPLAYSETUP_HIDEDPAD = MAKE_MENUENTRY("Hide touch d-pad:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_HIDEDPAD, Option);
479
480
480
static MenuRangeFloat_t MEO_DISPLAYSETUP_TOUCHALPHA = MAKE_MENURANGE(&droidinput.gameControlsAlpha, &MF_Redfont, 0, 1, 0, 16, 2);
481
static MenuRangeFloat_t MEO_DISPLAYSETUP_TOUCHALPHA = MAKE_MENURANGE(&droidinput.gameControlsAlpha, &MF_Redfont, 0, 1, 0, 16, 2);
481
static MenuEntry_t ME_DISPLAYSETUP_TOUCHALPHA = MAKE_MENUENTRY("UI opacity:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_TOUCHALPHA, RangeFloat);
482
static MenuEntry_t ME_DISPLAYSETUP_TOUCHALPHA = MAKE_MENUENTRY("UI opacity:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_TOUCHALPHA, RangeFloat);
482
#endif
483
#endif
483
484
484
#endif
485
#endif
485
486
486
static MenuOption_t MEO_SCREENSETUP_CROSSHAIR = MAKE_MENUOPTION(&MF_Redfont, &MEOS_OffOn, &ud.crosshair);
487
static MenuOption_t MEO_SCREENSETUP_CROSSHAIR = MAKE_MENUOPTION(&MF_Redfont, &MEOS_OffOn, &ud.crosshair);
487
static MenuEntry_t ME_SCREENSETUP_CROSSHAIR = MAKE_MENUENTRY( "Crosshair:", &MF_Redfont, &MEF_BigOptions, &MEO_SCREENSETUP_CROSSHAIR, Option );
488
static MenuEntry_t ME_SCREENSETUP_CROSSHAIR = MAKE_MENUENTRY( "Crosshair:", &MF_Redfont, &MEF_BigOptions, &MEO_SCREENSETUP_CROSSHAIR, Option );
488
static MenuRangeInt32_t MEO_SCREENSETUP_CROSSHAIRSIZE = MAKE_MENURANGE( &ud.crosshairscale, &MF_Redfont, 25, 100, 0, 16, 2 );
489
static MenuRangeInt32_t MEO_SCREENSETUP_CROSSHAIRSIZE = MAKE_MENURANGE( &ud.crosshairscale, &MF_Redfont, 25, 100, 0, 16, 2 );
489
static MenuEntry_t ME_SCREENSETUP_CROSSHAIRSIZE = MAKE_MENUENTRY( "Size:", &MF_Redfont, &MEF_BigOptions, &MEO_SCREENSETUP_CROSSHAIRSIZE, RangeInt32 );
490
static MenuEntry_t ME_SCREENSETUP_CROSSHAIRSIZE = MAKE_MENUENTRY( "Size:", &MF_Redfont, &MEF_BigOptions, &MEO_SCREENSETUP_CROSSHAIRSIZE, RangeInt32 );
490
491
491
static int32_t vpsize;
492
static int32_t vpsize;
492
static MenuRangeInt32_t MEO_SCREENSETUP_SCREENSIZE = MAKE_MENURANGE( &vpsize, &MF_Redfont, 12, 0, 0, 4, EnforceIntervals );
493
static MenuRangeInt32_t MEO_SCREENSETUP_SCREENSIZE = MAKE_MENURANGE( &vpsize, &MF_Redfont, 12, 0, 0, 4, EnforceIntervals );
493
static MenuEntry_t ME_SCREENSETUP_SCREENSIZE = MAKE_MENUENTRY( "Screen size:", &MF_Redfont, &MEF_BigOptions, &MEO_SCREENSETUP_SCREENSIZE, RangeInt32 );
494
static MenuEntry_t ME_SCREENSETUP_SCREENSIZE = MAKE_MENUENTRY( "Screen size:", &MF_Redfont, &MEF_BigOptions, &MEO_SCREENSETUP_SCREENSIZE, RangeInt32 );
494
static MenuRangeInt32_t MEO_SCREENSETUP_TEXTSIZE = MAKE_MENURANGE( &ud.textscale, &MF_Redfont, 100, 400, 0, 7, 2 );
495
static MenuRangeInt32_t MEO_SCREENSETUP_TEXTSIZE = MAKE_MENURANGE( &ud.textscale, &MF_Redfont, 100, 400, 0, 7, 2 );
495
static MenuEntry_t ME_SCREENSETUP_TEXTSIZE = MAKE_MENUENTRY( "Size:", &MF_Redfont, &MEF_BigOptions, &MEO_SCREENSETUP_TEXTSIZE, RangeInt32 );
496
static MenuEntry_t ME_SCREENSETUP_TEXTSIZE = MAKE_MENUENTRY( "Size:", &MF_Redfont, &MEF_BigOptions, &MEO_SCREENSETUP_TEXTSIZE, RangeInt32 );
496
static MenuOption_t MEO_SCREENSETUP_LEVELSTATS = MAKE_MENUOPTION(&MF_Redfont, &MEOS_OffOn, &ud.levelstats);
497
static MenuOption_t MEO_SCREENSETUP_LEVELSTATS = MAKE_MENUOPTION(&MF_Redfont, &MEOS_OffOn, &ud.levelstats);
497
static MenuEntry_t ME_SCREENSETUP_LEVELSTATS = MAKE_MENUENTRY( "Level stats:", &MF_Redfont, &MEF_BigOptions, &MEO_SCREENSETUP_LEVELSTATS, Option );
498
static MenuEntry_t ME_SCREENSETUP_LEVELSTATS = MAKE_MENUENTRY( "Level stats:", &MF_Redfont, &MEF_BigOptions, &MEO_SCREENSETUP_LEVELSTATS, Option );
498
499
499
500
500
static MenuOption_t MEO_SCREENSETUP_SHOWPICKUPMESSAGES = MAKE_MENUOPTION(&MF_Redfont, &MEOS_OffOn, &ud.fta_on);
501
static MenuOption_t MEO_SCREENSETUP_SHOWPICKUPMESSAGES = MAKE_MENUOPTION(&MF_Redfont, &MEOS_OffOn, &ud.fta_on);
501
static MenuEntry_t ME_SCREENSETUP_SHOWPICKUPMESSAGES = MAKE_MENUENTRY( "Pickup messages:", &MF_Redfont, &MEF_BigOptions, &MEO_SCREENSETUP_SHOWPICKUPMESSAGES, Option );
502
static MenuEntry_t ME_SCREENSETUP_SHOWPICKUPMESSAGES = MAKE_MENUENTRY( "Pickup messages:", &MF_Redfont, &MEF_BigOptions, &MEO_SCREENSETUP_SHOWPICKUPMESSAGES, Option );
502
503
503
static char *MEOSN_SCREENSETUP_NEWSTATUSBAR[] = { "Classic", "New",
504
static char *MEOSN_SCREENSETUP_NEWSTATUSBAR[] = { "Classic", "New",
504
#ifdef DROIDMENU
505
#ifdef DROIDMENU
505
"On top",
506
"On top",
506
#endif
507
#endif
507
};
508
};
508
509
509
static int32_t MEOSV_SCREENSETUP_NEWSTATUSBAR[] = { 0, 1,
510
static int32_t MEOSV_SCREENSETUP_NEWSTATUSBAR[] = { 0, 1,
510
#ifdef DROIDMENU
511
#ifdef DROIDMENU
511
2,
512
2,
512
#endif
513
#endif
513
};
514
};
514
515
515
static MenuOptionSet_t MEOS_SCREENSETUP_NEWSTATUSBAR = MAKE_MENUOPTIONSET( MEOSN_SCREENSETUP_NEWSTATUSBAR, MEOSV_SCREENSETUP_NEWSTATUSBAR, 0x2 );
516
static MenuOptionSet_t MEOS_SCREENSETUP_NEWSTATUSBAR = MAKE_MENUOPTIONSET( MEOSN_SCREENSETUP_NEWSTATUSBAR, MEOSV_SCREENSETUP_NEWSTATUSBAR, 0x2 );
516
static MenuOption_t MEO_SCREENSETUP_NEWSTATUSBAR = MAKE_MENUOPTION(&MF_Redfont, &MEOS_SCREENSETUP_NEWSTATUSBAR, &ud.althud);
517
static MenuOption_t MEO_SCREENSETUP_NEWSTATUSBAR = MAKE_MENUOPTION(&MF_Redfont, &MEOS_SCREENSETUP_NEWSTATUSBAR, &ud.althud);
517
static MenuEntry_t ME_SCREENSETUP_NEWSTATUSBAR = MAKE_MENUENTRY( "Status bar:", &MF_Redfont, &MEF_BigOptions, &MEO_SCREENSETUP_NEWSTATUSBAR, Option );
518
static MenuEntry_t ME_SCREENSETUP_NEWSTATUSBAR = MAKE_MENUENTRY( "Status bar:", &MF_Redfont, &MEF_BigOptions, &MEO_SCREENSETUP_NEWSTATUSBAR, Option );
518
519
519
520
520
521
521
static MenuRangeInt32_t MEO_SCREENSETUP_SBARSIZE = MAKE_MENURANGE( &ud.statusbarscale, &MF_Redfont, 36, 100, 0, 17, 2 );
522
static MenuRangeInt32_t MEO_SCREENSETUP_SBARSIZE = MAKE_MENURANGE( &ud.statusbarscale, &MF_Redfont, 36, 100, 0, 17, 2 );
522
static MenuEntry_t ME_SCREENSETUP_SBARSIZE = MAKE_MENUENTRY( "Size:", &MF_Redfont, &MEF_BigOptions, &MEO_SCREENSETUP_SBARSIZE, RangeInt32 );
523
static MenuEntry_t ME_SCREENSETUP_SBARSIZE = MAKE_MENUENTRY( "Size:", &MF_Redfont, &MEF_BigOptions, &MEO_SCREENSETUP_SBARSIZE, RangeInt32 );
523
524
524
525
525
static MenuLink_t MEO_DISPLAYSETUP_SCREENSETUP = { MENU_SCREENSETUP, MA_Advance, };
526
static MenuLink_t MEO_DISPLAYSETUP_SCREENSETUP = { MENU_SCREENSETUP, MA_Advance, };
526
static MenuEntry_t ME_DISPLAYSETUP_SCREENSETUP = MAKE_MENUENTRY( "Status and crosshair", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_SCREENSETUP, Link );
527
static MenuEntry_t ME_DISPLAYSETUP_SCREENSETUP = MAKE_MENUENTRY( "Status and crosshair", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_SCREENSETUP, Link );
527
528
528
529
529
#ifndef DROIDMENU
530
#ifndef DROIDMENU
530
#ifdef USE_OPENGL
531
#ifdef USE_OPENGL
531
static MenuLink_t MEO_DISPLAYSETUP_ADVANCED_GL = { MENU_RENDERERSETUP, MA_Advance, };
532
static MenuLink_t MEO_DISPLAYSETUP_ADVANCED_GL = { MENU_RENDERERSETUP, MA_Advance, };
532
static MenuEntry_t ME_DISPLAYSETUP_ADVANCED_GL = MAKE_MENUENTRY( "Advanced", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_ADVANCED_GL, Link );
533
static MenuEntry_t ME_DISPLAYSETUP_ADVANCED_GL = MAKE_MENUENTRY( "Advanced", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_ADVANCED_GL, Link );
533
#endif
534
#endif
534
535
535
static MenuLink_t MEO_DISPLAYSETUP_VIDEOSETUP = { MENU_VIDEOSETUP, MA_Advance, };
536
static MenuLink_t MEO_DISPLAYSETUP_VIDEOSETUP = { MENU_VIDEOSETUP, MA_Advance, };
536
static MenuEntry_t ME_DISPLAYSETUP_VIDEOSETUP = MAKE_MENUENTRY( "Video mode", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_VIDEOSETUP, Link );
537
static MenuEntry_t ME_DISPLAYSETUP_VIDEOSETUP = MAKE_MENUENTRY( "Video mode", &MF_Redfont, &MEF_BigOptionsRt, &MEO_DISPLAYSETUP_VIDEOSETUP, Link );
537
#endif
538
#endif
538
539
539
static MenuEntry_t *MEL_OPTIONS[] = {
540
static MenuEntry_t *MEL_OPTIONS[] = {
540
    &ME_OPTIONS_GAMESETUP,
541
    &ME_OPTIONS_GAMESETUP,
541
    &ME_OPTIONS_SOUNDSETUP,
542
    &ME_OPTIONS_SOUNDSETUP,
542
    &ME_OPTIONS_DISPLAYSETUP,
543
    &ME_OPTIONS_DISPLAYSETUP,
543
#ifndef DROIDMENU
544
#ifndef DROIDMENU
544
    &ME_OPTIONS_PLAYERSETUP,
545
    &ME_OPTIONS_PLAYERSETUP,
545
    &ME_OPTIONS_CONTROLS,
546
    &ME_OPTIONS_CONTROLS,
546
#else
547
#else
547
    &ME_OPTIONS_TOUCHSETUP
548
    &ME_OPTIONS_TOUCHSETUP
548
#endif
549
#endif
549
};
550
};
550
551
551
static MenuEntry_t *MEL_CONTROLS[] = {
552
static MenuEntry_t *MEL_CONTROLS[] = {
552
#ifndef DROIDMENU
553
#ifndef DROIDMENU
553
    &ME_OPTIONS_KEYBOARDSETUP,
554
    &ME_OPTIONS_KEYBOARDSETUP,
554
    &ME_OPTIONS_MOUSESETUP,
555
    &ME_OPTIONS_MOUSESETUP,
555
    &ME_OPTIONS_JOYSTICKSETUP,
556
    &ME_OPTIONS_JOYSTICKSETUP,
556
#else
557
#else
557
    &ME_OPTIONS_TOUCHSETUP
558
    &ME_OPTIONS_TOUCHSETUP
558
#endif
559
#endif
559
};
560
};
560
561
561
562
562
static MenuEntry_t *MEL_VIDEOSETUP[] = {
563
static MenuEntry_t *MEL_VIDEOSETUP[] = {
563
    &ME_VIDEOSETUP_RESOLUTION,
564
    &ME_VIDEOSETUP_RESOLUTION,
564
#ifdef USE_OPENGL
565
#ifdef USE_OPENGL
565
    &ME_VIDEOSETUP_RENDERER,
566
    &ME_VIDEOSETUP_RENDERER,
566
#endif
567
#endif
567
    &ME_VIDEOSETUP_FULLSCREEN,
568
    &ME_VIDEOSETUP_FULLSCREEN,
568
    &ME_Space6,
569
    &ME_Space6,
569
    &ME_VIDEOSETUP_APPLY,
570
    &ME_VIDEOSETUP_APPLY,
570
};
571
};
571
static MenuEntry_t *MEL_DISPLAYSETUP[] = {
572
static MenuEntry_t *MEL_DISPLAYSETUP[] = {
572
    &ME_DISPLAYSETUP_SCREENSETUP,
573
    &ME_DISPLAYSETUP_SCREENSETUP,
573
    &ME_DISPLAYSETUP_COLORCORR,
574
    &ME_DISPLAYSETUP_COLORCORR,
574
#ifndef DROIDMENU
575
#ifndef DROIDMENU
575
    &ME_DISPLAYSETUP_VIDEOSETUP,
576
    &ME_DISPLAYSETUP_VIDEOSETUP,
576
#endif
577
#endif
577
    &ME_DISPLAYSETUP_ASPECTRATIO,
578
    &ME_DISPLAYSETUP_ASPECTRATIO,
578
    &ME_DISPLAYSETUP_PIXELDOUBLING,
579
    &ME_DISPLAYSETUP_PIXELDOUBLING,
579
};
580
};
580
581
581
#ifdef USE_OPENGL
582
#ifdef USE_OPENGL
582
static MenuEntry_t *MEL_DISPLAYSETUP_GL[] = {
583
static MenuEntry_t *MEL_DISPLAYSETUP_GL[] = {
583
    &ME_DISPLAYSETUP_SCREENSETUP,
584
    &ME_DISPLAYSETUP_SCREENSETUP,
584
    &ME_DISPLAYSETUP_COLORCORR,
585
    &ME_DISPLAYSETUP_COLORCORR,
585
#ifndef DROIDMENU
586
#ifndef DROIDMENU
586
    &ME_DISPLAYSETUP_VIDEOSETUP,
587
    &ME_DISPLAYSETUP_VIDEOSETUP,
587
#endif
588
#endif
588
    &ME_DISPLAYSETUP_ASPECTRATIO,
589
    &ME_DISPLAYSETUP_ASPECTRATIO,
589
    &ME_DISPLAYSETUP_TEXFILTER,
590
    &ME_DISPLAYSETUP_TEXFILTER,
590
#ifdef DROIDMENU
591
#ifdef DROIDMENU
591
    &ME_DISPLAYSETUP_HIDEDPAD,
592
    &ME_DISPLAYSETUP_HIDEDPAD,
592
    &ME_DISPLAYSETUP_TOUCHALPHA,
593
    &ME_DISPLAYSETUP_TOUCHALPHA,
593
#endif
594
#endif
594
#ifndef DROIDMENU
595
#ifndef DROIDMENU
595
    &ME_DISPLAYSETUP_ANISOTROPY,
596
    &ME_DISPLAYSETUP_ANISOTROPY,
596
    &ME_DISPLAYSETUP_VSYNC,
597
    &ME_DISPLAYSETUP_VSYNC,
597
    &ME_DISPLAYSETUP_ADVANCED_GL,
598
    &ME_DISPLAYSETUP_ADVANCED_GL,
598
#endif
599
#endif
599
};
600
};
600
601
601
#ifdef POLYMER
602
#ifdef POLYMER
602
static MenuEntry_t *MEL_DISPLAYSETUP_GL_POLYMER[] = {
603
static MenuEntry_t *MEL_DISPLAYSETUP_GL_POLYMER[] = {
603
    &ME_DISPLAYSETUP_SCREENSETUP,
604
    &ME_DISPLAYSETUP_SCREENSETUP,
604
    &ME_DISPLAYSETUP_COLORCORR,
605
    &ME_DISPLAYSETUP_COLORCORR,
605
#ifndef DROIDMENU
606
#ifndef DROIDMENU
606
    &ME_DISPLAYSETUP_VIDEOSETUP,
607
    &ME_DISPLAYSETUP_VIDEOSETUP,
607
#endif
608
#endif
608
    &ME_DISPLAYSETUP_ASPECTRATIO_POLYMER,
609
    &ME_DISPLAYSETUP_ASPECTRATIO_POLYMER,
609
    &ME_DISPLAYSETUP_TEXFILTER,
610
    &ME_DISPLAYSETUP_TEXFILTER,
610
#ifndef DROIDMENU
611
#ifndef DROIDMENU
611
    &ME_DISPLAYSETUP_ANISOTROPY,
612
    &ME_DISPLAYSETUP_ANISOTROPY,
612
    &ME_DISPLAYSETUP_VSYNC,
613
    &ME_DISPLAYSETUP_VSYNC,
613
    &ME_DISPLAYSETUP_ADVANCED_GL,
614
    &ME_DISPLAYSETUP_ADVANCED_GL,
614
#endif
615
#endif
615
};
616
};
616
617
617
#endif
618
#endif
618
#endif
619
#endif
619
620
620
621
621
622
622
static char *MenuKeyNone = "  -";
623
static char *MenuKeyNone = "  -";
623
static char *MEOSN_Keys[NUMKEYS];
624
static char *MEOSN_Keys[NUMKEYS];
624
625
625
static MenuCustom2Col_t MEO_KEYBOARDSETUPFUNCS_TEMPLATE = { { NULL, NULL, }, MEOSN_Keys, &MF_MinifontRed, NUMKEYS, 54<<16, 0 };
626
static MenuCustom2Col_t MEO_KEYBOARDSETUPFUNCS_TEMPLATE = { { NULL, NULL, }, MEOSN_Keys, &MF_MinifontRed, NUMKEYS, 54<<16, 0 };
626
static MenuCustom2Col_t MEO_KEYBOARDSETUPFUNCS[NUMGAMEFUNCTIONS];
627
static MenuCustom2Col_t MEO_KEYBOARDSETUPFUNCS[NUMGAMEFUNCTIONS];
627
static MenuEntry_t ME_KEYBOARDSETUPFUNCS_TEMPLATE = MAKE_MENUENTRY( NULL, &MF_Minifont, &MEF_FuncList, &MEO_KEYBOARDSETUPFUNCS_TEMPLATE, Custom2Col );
628
static MenuEntry_t ME_KEYBOARDSETUPFUNCS_TEMPLATE = MAKE_MENUENTRY( NULL, &MF_Minifont, &MEF_FuncList, &MEO_KEYBOARDSETUPFUNCS_TEMPLATE, Custom2Col );
628
static MenuEntry_t ME_KEYBOARDSETUPFUNCS[NUMGAMEFUNCTIONS];
629
static MenuEntry_t ME_KEYBOARDSETUPFUNCS[NUMGAMEFUNCTIONS];
629
static MenuEntry_t *MEL_KEYBOARDSETUPFUNCS[NUMGAMEFUNCTIONS];
630
static MenuEntry_t *MEL_KEYBOARDSETUPFUNCS[NUMGAMEFUNCTIONS];
630
631
631
static MenuLink_t MEO_KEYBOARDSETUP_KEYS = { MENU_KEYBOARDKEYS, MA_Advance, };
632
static MenuLink_t MEO_KEYBOARDSETUP_KEYS = { MENU_KEYBOARDKEYS, MA_Advance, };
632
static MenuEntry_t ME_KEYBOARDSETUP_KEYS = MAKE_MENUENTRY( "Configure Keys", &MF_Redfont, &MEF_CenterMenu, &MEO_KEYBOARDSETUP_KEYS, Link );
633
static MenuEntry_t ME_KEYBOARDSETUP_KEYS = MAKE_MENUENTRY( "Configure Keys", &MF_Redfont, &MEF_CenterMenu, &MEO_KEYBOARDSETUP_KEYS, Link );
633
static MenuEntry_t ME_KEYBOARDSETUP_RESET = MAKE_MENUENTRY( "Reset To Defaults", &MF_Redfont, &MEF_CenterMenu, &MEO_NULL, Link );
634
static MenuEntry_t ME_KEYBOARDSETUP_RESET = MAKE_MENUENTRY( "Reset To Defaults", &MF_Redfont, &MEF_CenterMenu, &MEO_NULL, Link );
634
static MenuEntry_t ME_KEYBOARDSETUP_RESETCLASSIC = MAKE_MENUENTRY( "Reset To Classic", &MF_Redfont, &MEF_CenterMenu, &MEO_NULL, Link );
635
static MenuEntry_t ME_KEYBOARDSETUP_RESETCLASSIC = MAKE_MENUENTRY( "Reset To Classic", &MF_Redfont, &MEF_CenterMenu, &MEO_NULL, Link );
635
636
636
static MenuEntry_t *MEL_KEYBOARDSETUP[] = {
637
static MenuEntry_t *MEL_KEYBOARDSETUP[] = {
637
    &ME_KEYBOARDSETUP_KEYS,
638
    &ME_KEYBOARDSETUP_KEYS,
638
    &ME_KEYBOARDSETUP_RESET,
639
    &ME_KEYBOARDSETUP_RESET,
639
    &ME_KEYBOARDSETUP_RESETCLASSIC,
640
    &ME_KEYBOARDSETUP_RESETCLASSIC,
640
};
641
};
641
642
642
643
643
// There is no better way to do this than manually.
644
// There is no better way to do this than manually.
644
645
645
#define MENUMOUSEFUNCTIONS 12
646
#define MENUMOUSEFUNCTIONS 12
646
647
647
static char *MenuMouseNames[MENUMOUSEFUNCTIONS] = {
648
static char *MenuMouseNames[MENUMOUSEFUNCTIONS] = {
648
    "Button 1",
649
    "Button 1",
649
    "Double Button 1",
650
    "Double Button 1",
650
    "Button 2",
651
    "Button 2",
651
    "Double Button 2",
652
    "Double Button 2",
652
    "Button 3",
653
    "Button 3",
653
    "Double Button 3",
654
    "Double Button 3",
654
655
655
    "Wheel Up",
656
    "Wheel Up",
656
    "Wheel Down",
657
    "Wheel Down",
657
658
658
    "Button 4",
659
    "Button 4",
659
    "Double Button 4",
660
    "Double Button 4",
660
    "Button 5",
661
    "Button 5",
661
    "Double Button 5",
662
    "Double Button 5",
662
};
663
};
663
static int32_t MenuMouseDataIndex[MENUMOUSEFUNCTIONS][2] = {
664
static int32_t MenuMouseDataIndex[MENUMOUSEFUNCTIONS][2] = {
664
    { 0, 0, },
665
    { 0, 0, },
665
    { 0, 1, },
666
    { 0, 1, },
666
    { 1, 0, },
667
    { 1, 0, },
667
    { 1, 1, },
668
    { 1, 1, },
668
    { 2, 0, },
669
    { 2, 0, },
669
    { 2, 1, },
670
    { 2, 1, },
670
671
671
    // note the mouse wheel
672
    // note the mouse wheel
672
    { 4, 0, },
673
    { 4, 0, },
673
    { 5, 0, },
674
    { 5, 0, },
674
675
675
    { 3, 0, },
676
    { 3, 0, },
676
    { 3, 1, },
677
    { 3, 1, },
677
    { 6, 0, },
678
    { 6, 0, },
678
    { 6, 1, },
679
    { 6, 1, },
679
};
680
};
680
681
681
static MenuOption_t MEO_MOUSEJOYSETUPBTNS_TEMPLATE = MAKE_MENUOPTION( &MF_Minifont, &MEOS_Gamefuncs, NULL );
682
static MenuOption_t MEO_MOUSEJOYSETUPBTNS_TEMPLATE = MAKE_MENUOPTION( &MF_Minifont, &MEOS_Gamefuncs, NULL );
682
static MenuOption_t MEO_MOUSESETUPBTNS[MENUMOUSEFUNCTIONS];
683
static MenuOption_t MEO_MOUSESETUPBTNS[MENUMOUSEFUNCTIONS];
683
static MenuEntry_t ME_MOUSEJOYSETUPBTNS_TEMPLATE = MAKE_MENUENTRY( NULL, &MF_Minifont, &MEF_FuncList, NULL, Option );
684
static MenuEntry_t ME_MOUSEJOYSETUPBTNS_TEMPLATE = MAKE_MENUENTRY( NULL, &MF_Minifont, &MEF_FuncList, NULL, Option );
684
static MenuEntry_t ME_MOUSESETUPBTNS[MENUMOUSEFUNCTIONS];
685
static MenuEntry_t ME_MOUSESETUPBTNS[MENUMOUSEFUNCTIONS];
685
static MenuEntry_t *MEL_MOUSESETUPBTNS[MENUMOUSEFUNCTIONS];
686
static MenuEntry_t *MEL_MOUSESETUPBTNS[MENUMOUSEFUNCTIONS];
686
687
687
static MenuLink_t MEO_MOUSESETUP_BTNS = { MENU_MOUSEBTNS, MA_Advance, };
688
static MenuLink_t MEO_MOUSESETUP_BTNS = { MENU_MOUSEBTNS, MA_Advance, };
688
static MenuEntry_t ME_MOUSESETUP_BTNS = MAKE_MENUENTRY( "Button assignment", &MF_Redfont, &MEF_BigOptionsRt, &MEO_MOUSESETUP_BTNS, Link );
689
static MenuEntry_t ME_MOUSESETUP_BTNS = MAKE_MENUENTRY( "Button assignment", &MF_Redfont, &MEF_BigOptionsRt, &MEO_MOUSESETUP_BTNS, Link );
689
static MenuRangeFloat_t MEO_MOUSESETUP_SENSITIVITY = MAKE_MENURANGE( &CONTROL_MouseSensitivity, &MF_Redfont, .5f, 16.f, 0.f, 32, 1 );
690
static MenuRangeFloat_t MEO_MOUSESETUP_SENSITIVITY = MAKE_MENURANGE( &CONTROL_MouseSensitivity, &MF_Redfont, .5f, 16.f, 0.f, 32, 1 );
690
static MenuEntry_t ME_MOUSESETUP_SENSITIVITY = MAKE_MENUENTRY( "Sensitivity:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_MOUSESETUP_SENSITIVITY, RangeFloat );
691
static MenuEntry_t ME_MOUSESETUP_SENSITIVITY = MAKE_MENUENTRY( "Sensitivity:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_MOUSESETUP_SENSITIVITY, RangeFloat );
691
static MenuOption_t MEO_MOUSESETUP_MOUSEAIMING = MAKE_MENUOPTION( &MF_Redfont, &MEOS_NoYes, &g_myAimMode );
692
static MenuOption_t MEO_MOUSESETUP_MOUSEAIMING = MAKE_MENUOPTION( &MF_Redfont, &MEOS_NoYes, &g_myAimMode );
692
static MenuEntry_t ME_MOUSESETUP_MOUSEAIMING = MAKE_MENUENTRY( "Vertical aiming:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_MOUSESETUP_MOUSEAIMING, Option );
693
static MenuEntry_t ME_MOUSESETUP_MOUSEAIMING = MAKE_MENUENTRY( "Vertical aiming:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_MOUSESETUP_MOUSEAIMING, Option );
693
static MenuOption_t MEO_MOUSESETUP_INVERT = MAKE_MENUOPTION( &MF_Redfont, &MEOS_YesNo, &ud.mouseflip );
694
static MenuOption_t MEO_MOUSESETUP_INVERT = MAKE_MENUOPTION( &MF_Redfont, &MEOS_YesNo, &ud.mouseflip );
694
static MenuEntry_t ME_MOUSESETUP_INVERT = MAKE_MENUENTRY( "Invert aiming:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_MOUSESETUP_INVERT, Option );
695
static MenuEntry_t ME_MOUSESETUP_INVERT = MAKE_MENUENTRY( "Invert aiming:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_MOUSESETUP_INVERT, Option );
695
static MenuOption_t MEO_MOUSESETUP_SMOOTH = MAKE_MENUOPTION( &MF_Redfont, &MEOS_NoYes, &ud.config.SmoothInput );
696
static MenuOption_t MEO_MOUSESETUP_SMOOTH = MAKE_MENUOPTION( &MF_Redfont, &MEOS_NoYes, &ud.config.SmoothInput );
696
static MenuEntry_t ME_MOUSESETUP_SMOOTH = MAKE_MENUENTRY( "Filter input:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_MOUSESETUP_SMOOTH, Option );
697
static MenuEntry_t ME_MOUSESETUP_SMOOTH = MAKE_MENUENTRY( "Filter input:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_MOUSESETUP_SMOOTH, Option );
697
static MenuLink_t MEO_MOUSESETUP_ADVANCED = { MENU_MOUSEADVANCED, MA_Advance, };
698
static MenuLink_t MEO_MOUSESETUP_ADVANCED = { MENU_MOUSEADVANCED, MA_Advance, };
698
static MenuEntry_t ME_MOUSESETUP_ADVANCED = MAKE_MENUENTRY( "Advanced setup", &MF_Redfont, &MEF_BigOptionsRt, &MEO_MOUSESETUP_ADVANCED, Link );
699
static MenuEntry_t ME_MOUSESETUP_ADVANCED = MAKE_MENUENTRY( "Advanced setup", &MF_Redfont, &MEF_BigOptionsRt, &MEO_MOUSESETUP_ADVANCED, Link );
699
700
700
static MenuEntry_t *MEL_MOUSESETUP[] = {
701
static MenuEntry_t *MEL_MOUSESETUP[] = {
701
    &ME_MOUSESETUP_SENSITIVITY,
702
    &ME_MOUSESETUP_SENSITIVITY,
702
    &ME_MOUSESETUP_BTNS,
703
    &ME_MOUSESETUP_BTNS,
703
    &ME_Space2,
704
    &ME_Space2,
704
    &ME_MOUSESETUP_MOUSEAIMING,
705
    &ME_MOUSESETUP_MOUSEAIMING,
705
    &ME_MOUSESETUP_INVERT,
706
    &ME_MOUSESETUP_INVERT,
706
    &ME_MOUSESETUP_SMOOTH,
707
    &ME_MOUSESETUP_SMOOTH,
707
    &ME_MOUSESETUP_ADVANCED,
708
    &ME_MOUSESETUP_ADVANCED,
708
};
709
};
709
710
710
#ifdef DROIDMENU
711
#ifdef DROIDMENU
711
static MenuRangeFloat_t MEO_TOUCHSETUP_SENSITIVITY_MOVE = MAKE_MENURANGE(&droidinput.forward_sens, &MF_Redfont, 1.f, 10.f, 0.f, 20, 1 + EnforceIntervals);
712
static MenuRangeFloat_t MEO_TOUCHSETUP_SENSITIVITY_MOVE = MAKE_MENURANGE(&droidinput.forward_sens, &MF_Redfont, 1.f, 9.f, 0.f, 17, 1 + EnforceIntervals);
712
static MenuEntry_t ME_TOUCHSETUP_SENSITIVITY_MOVE = MAKE_MENUENTRY("Run sens:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_TOUCHSETUP_SENSITIVITY_MOVE, RangeFloat);
713
static MenuEntry_t ME_TOUCHSETUP_SENSITIVITY_MOVE = MAKE_MENUENTRY("Run sens:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_TOUCHSETUP_SENSITIVITY_MOVE, RangeFloat);
713
714
714
static MenuRangeFloat_t MEO_TOUCHSETUP_SENSITIVITY_STRAFE = MAKE_MENURANGE(&droidinput.strafe_sens, &MF_Redfont, 1.f, 10.f, 0.f, 20, 1 + EnforceIntervals);
715
static MenuRangeFloat_t MEO_TOUCHSETUP_SENSITIVITY_STRAFE = MAKE_MENURANGE(&droidinput.strafe_sens, &MF_Redfont, 1.f, 9.f, 0.f, 17, 1 + EnforceIntervals);
715
static MenuEntry_t ME_TOUCHSETUP_SENSITIVITY_STRAFE = MAKE_MENUENTRY("Strafe sens:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_TOUCHSETUP_SENSITIVITY_STRAFE, RangeFloat);
716
static MenuEntry_t ME_TOUCHSETUP_SENSITIVITY_STRAFE = MAKE_MENUENTRY("Strafe sens:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_TOUCHSETUP_SENSITIVITY_STRAFE, RangeFloat);
716
717
717
static MenuRangeFloat_t MEO_TOUCHSETUP_SENSITIVITY_LOOK = MAKE_MENURANGE(&droidinput.pitch_sens, &MF_Redfont, 1.f, 10.f, 0.f, 20, 1 + EnforceIntervals);
718
static MenuRangeFloat_t MEO_TOUCHSETUP_SENSITIVITY_LOOK = MAKE_MENURANGE(&droidinput.pitch_sens, &MF_Redfont, 1.f, 9.f, 0.f, 17, 1 + EnforceIntervals);
718
static MenuEntry_t ME_TOUCHSETUP_SENSITIVITY_LOOK = MAKE_MENUENTRY("Look sens:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_TOUCHSETUP_SENSITIVITY_LOOK, RangeFloat);
719
static MenuEntry_t ME_TOUCHSETUP_SENSITIVITY_LOOK = MAKE_MENUENTRY("Look sens:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_TOUCHSETUP_SENSITIVITY_LOOK, RangeFloat);
719
720
720
static MenuRangeFloat_t MEO_TOUCHSETUP_SENSITIVITY_TURN = MAKE_MENURANGE(&droidinput.yaw_sens, &MF_Redfont, 1.f, 10.f, 0.f, 20, 1 + EnforceIntervals);
721
static MenuRangeFloat_t MEO_TOUCHSETUP_SENSITIVITY_TURN = MAKE_MENURANGE(&droidinput.yaw_sens, &MF_Redfont, 1.f, 9.f, 0.f, 17, 1 + EnforceIntervals);
721
static MenuEntry_t ME_TOUCHSETUP_SENSITIVITY_TURN = MAKE_MENUENTRY("Turn sens:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_TOUCHSETUP_SENSITIVITY_TURN, RangeFloat);
722
static MenuEntry_t ME_TOUCHSETUP_SENSITIVITY_TURN = MAKE_MENUENTRY("Turn sens:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_TOUCHSETUP_SENSITIVITY_TURN, RangeFloat);
722
723
723
static MenuOption_t MEO_TOUCHSETUP_INVERT = MAKE_MENUOPTION(&MF_Redfont, &MEOS_NoYes, &droidinput.invertLook);
724
static MenuOption_t MEO_TOUCHSETUP_INVERT = MAKE_MENUOPTION(&MF_Redfont, &MEOS_NoYes, &droidinput.invertLook);
724
static MenuEntry_t ME_TOUCHSETUP_INVERT = MAKE_MENUENTRY("Invert look:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_TOUCHSETUP_INVERT, Option);
725
static MenuEntry_t ME_TOUCHSETUP_INVERT = MAKE_MENUENTRY("Invert look:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_TOUCHSETUP_INVERT, Option);
725
726
726
static MenuEntry_t *MEL_TOUCHSETUP [] ={
727
static MenuEntry_t *MEL_TOUCHSETUP [] ={
727
    &ME_TOUCHSETUP_SENSITIVITY_MOVE,
728
    &ME_TOUCHSETUP_SENSITIVITY_MOVE,
728
    &ME_TOUCHSETUP_SENSITIVITY_STRAFE,
729
    &ME_TOUCHSETUP_SENSITIVITY_STRAFE,
729
    &ME_TOUCHSETUP_SENSITIVITY_LOOK,
730
    &ME_TOUCHSETUP_SENSITIVITY_LOOK,
730
    &ME_TOUCHSETUP_SENSITIVITY_TURN,
731
    &ME_TOUCHSETUP_SENSITIVITY_TURN,
731
    &ME_Space2,
732
    &ME_Space2,
732
    &ME_TOUCHSETUP_INVERT,
733
    &ME_TOUCHSETUP_INVERT,
733
};
734
};
734
#endif
735
#endif
735
736
736
MAKE_MENU_TOP_ENTRYLINK( "Edit Buttons", MEF_CenterMenu, JOYSTICK_EDITBUTTONS, MENU_JOYSTICKBTNS );
737
MAKE_MENU_TOP_ENTRYLINK( "Edit Buttons", MEF_CenterMenu, JOYSTICK_EDITBUTTONS, MENU_JOYSTICKBTNS );
737
MAKE_MENU_TOP_ENTRYLINK( "Edit Axes", MEF_CenterMenu, JOYSTICK_EDITAXES, MENU_JOYSTICKAXES );
738
MAKE_MENU_TOP_ENTRYLINK( "Edit Axes", MEF_CenterMenu, JOYSTICK_EDITAXES, MENU_JOYSTICKAXES );
738
739
739
static MenuEntry_t *MEL_JOYSTICKSETUP[] = {
740
static MenuEntry_t *MEL_JOYSTICKSETUP[] = {
740
    &ME_JOYSTICK_EDITBUTTONS,
741
    &ME_JOYSTICK_EDITBUTTONS,
741
    &ME_JOYSTICK_EDITAXES,
742
    &ME_JOYSTICK_EDITAXES,
742
};
743
};
743
744
744
#define MAXJOYBUTTONSTRINGLENGTH 32
745
#define MAXJOYBUTTONSTRINGLENGTH 32
745
746
746
static char MenuJoystickNames[MAXJOYBUTTONSANDHATS*2][MAXJOYBUTTONSTRINGLENGTH];
747
static char MenuJoystickNames[MAXJOYBUTTONSANDHATS*2][MAXJOYBUTTONSTRINGLENGTH];
747
748
748
static MenuOption_t MEO_JOYSTICKBTNS[MAXJOYBUTTONSANDHATS*2];
749
static MenuOption_t MEO_JOYSTICKBTNS[MAXJOYBUTTONSANDHATS*2];
749
static MenuEntry_t ME_JOYSTICKBTNS[MAXJOYBUTTONSANDHATS*2];
750
static MenuEntry_t ME_JOYSTICKBTNS[MAXJOYBUTTONSANDHATS*2];
750
static MenuEntry_t *MEL_JOYSTICKBTNS[MAXJOYBUTTONSANDHATS*2];
751
static MenuEntry_t *MEL_JOYSTICKBTNS[MAXJOYBUTTONSANDHATS*2];
751
752
752
static MenuLink_t MEO_JOYSTICKAXES = { MENU_JOYSTICKAXIS, MA_Advance, };
753
static MenuLink_t MEO_JOYSTICKAXES = { MENU_JOYSTICKAXIS, MA_Advance, };
753
static MenuEntry_t ME_JOYSTICKAXES_TEMPLATE = MAKE_MENUENTRY( NULL, &MF_Redfont, &MEF_BigSliders, &MEO_JOYSTICKAXES, Link );
754
static MenuEntry_t ME_JOYSTICKAXES_TEMPLATE = MAKE_MENUENTRY( NULL, &MF_Redfont, &MEF_BigSliders, &MEO_JOYSTICKAXES, Link );
754
static MenuEntry_t ME_JOYSTICKAXES[MAXJOYAXES];
755
static MenuEntry_t ME_JOYSTICKAXES[MAXJOYAXES];
755
static char MenuJoystickAxes[MAXJOYAXES][MAXJOYBUTTONSTRINGLENGTH];
756
static char MenuJoystickAxes[MAXJOYAXES][MAXJOYBUTTONSTRINGLENGTH];
756
757
757
static MenuEntry_t *MEL_JOYSTICKAXES[MAXJOYAXES];
758
static MenuEntry_t *MEL_JOYSTICKAXES[MAXJOYAXES];
758
759
759
static MenuRangeInt32_t MEO_MOUSEADVANCED_SCALEX = MAKE_MENURANGE( &ud.config.MouseAnalogueScale[0], &MF_Bluefont, -262144, 262144, 65536, 65, 3 );
760
static MenuRangeInt32_t MEO_MOUSEADVANCED_SCALEX = MAKE_MENURANGE( &ud.config.MouseAnalogueScale[0], &MF_Bluefont, -262144, 262144, 65536, 65, 3 );
760
static MenuEntry_t ME_MOUSEADVANCED_SCALEX = MAKE_MENUENTRY( "X-Axis Scale", &MF_Redfont, &MEF_BigSliders, &MEO_MOUSEADVANCED_SCALEX, RangeInt32 );
761
static MenuEntry_t ME_MOUSEADVANCED_SCALEX = MAKE_MENUENTRY( "X-Axis Scale", &MF_Redfont, &MEF_BigSliders, &MEO_MOUSEADVANCED_SCALEX, RangeInt32 );
761
static MenuRangeInt32_t MEO_MOUSEADVANCED_SCALEY = MAKE_MENURANGE( &ud.config.MouseAnalogueScale[1], &MF_Bluefont, -262144, 262144, 65536, 65, 3 );
762
static MenuRangeInt32_t MEO_MOUSEADVANCED_SCALEY = MAKE_MENURANGE( &ud.config.MouseAnalogueScale[1], &MF_Bluefont, -262144, 262144, 65536, 65, 3 );
762
static MenuEntry_t ME_MOUSEADVANCED_SCALEY = MAKE_MENUENTRY( "Y-Axis Scale", &MF_Redfont, &MEF_BigSliders, &MEO_MOUSEADVANCED_SCALEY, RangeInt32 );
763
static MenuEntry_t ME_MOUSEADVANCED_SCALEY = MAKE_MENUENTRY( "Y-Axis Scale", &MF_Redfont, &MEF_BigSliders, &MEO_MOUSEADVANCED_SCALEY, RangeInt32 );
763
764
764
static MenuOption_t MEO_MOUSEADVANCED_DAXES_UP = MAKE_MENUOPTION( &MF_BluefontRed, &MEOS_Gamefuncs, &ud.config.MouseDigitalFunctions[1][0] );
765
static MenuOption_t MEO_MOUSEADVANCED_DAXES_UP = MAKE_MENUOPTION( &MF_BluefontRed, &MEOS_Gamefuncs, &ud.config.MouseDigitalFunctions[1][0] );
765
static MenuEntry_t ME_MOUSEADVANCED_DAXES_UP = MAKE_MENUENTRY( "Digital Up", &MF_Redfont, &MEF_BigSliders, &MEO_MOUSEADVANCED_DAXES_UP, Option );
766
static MenuEntry_t ME_MOUSEADVANCED_DAXES_UP = MAKE_MENUENTRY( "Digital Up", &MF_Redfont, &MEF_BigSliders, &MEO_MOUSEADVANCED_DAXES_UP, Option );
766
static MenuOption_t MEO_MOUSEADVANCED_DAXES_DOWN = MAKE_MENUOPTION( &MF_BluefontRed, &MEOS_Gamefuncs, &ud.config.MouseDigitalFunctions[1][1] );
767
static MenuOption_t MEO_MOUSEADVANCED_DAXES_DOWN = MAKE_MENUOPTION( &MF_BluefontRed, &MEOS_Gamefuncs, &ud.config.MouseDigitalFunctions[1][1] );
767
static MenuEntry_t ME_MOUSEADVANCED_DAXES_DOWN = MAKE_MENUENTRY( "Digital Down", &MF_Redfont, &MEF_BigSliders, &MEO_MOUSEADVANCED_DAXES_DOWN, Option );
768
static MenuEntry_t ME_MOUSEADVANCED_DAXES_DOWN = MAKE_MENUENTRY( "Digital Down", &MF_Redfont, &MEF_BigSliders, &MEO_MOUSEADVANCED_DAXES_DOWN, Option );
768
static MenuOption_t MEO_MOUSEADVANCED_DAXES_LEFT = MAKE_MENUOPTION( &MF_BluefontRed, &MEOS_Gamefuncs, &ud.config.MouseDigitalFunctions[0][0] );
769
static MenuOption_t MEO_MOUSEADVANCED_DAXES_LEFT = MAKE_MENUOPTION( &MF_BluefontRed, &MEOS_Gamefuncs, &ud.config.MouseDigitalFunctions[0][0] );
769
static MenuEntry_t ME_MOUSEADVANCED_DAXES_LEFT = MAKE_MENUENTRY( "Digital Left", &MF_Redfont, &MEF_BigSliders, &MEO_MOUSEADVANCED_DAXES_LEFT, Option );
770
static MenuEntry_t ME_MOUSEADVANCED_DAXES_LEFT = MAKE_MENUENTRY( "Digital Left", &MF_Redfont, &MEF_BigSliders, &MEO_MOUSEADVANCED_DAXES_LEFT, Option );
770
static MenuOption_t MEO_MOUSEADVANCED_DAXES_RIGHT = MAKE_MENUOPTION( &MF_BluefontRed, &MEOS_Gamefuncs, &ud.config.MouseDigitalFunctions[0][1] );
771
static MenuOption_t MEO_MOUSEADVANCED_DAXES_RIGHT = MAKE_MENUOPTION( &MF_BluefontRed, &MEOS_Gamefuncs, &ud.config.MouseDigitalFunctions[0][1] );
771
static MenuEntry_t ME_MOUSEADVANCED_DAXES_RIGHT = MAKE_MENUENTRY( "Digital Right", &MF_Redfont, &MEF_BigSliders, &MEO_MOUSEADVANCED_DAXES_RIGHT, Option );
772
static MenuEntry_t ME_MOUSEADVANCED_DAXES_RIGHT = MAKE_MENUENTRY( "Digital Right", &MF_Redfont, &MEF_BigSliders, &MEO_MOUSEADVANCED_DAXES_RIGHT, Option );
772
773
773
static MenuEntry_t *MEL_MOUSEADVANCED[] = {
774
static MenuEntry_t *MEL_MOUSEADVANCED[] = {
774
    &ME_MOUSEADVANCED_SCALEX,
775
    &ME_MOUSEADVANCED_SCALEX,
775
    &ME_MOUSEADVANCED_SCALEY,
776
    &ME_MOUSEADVANCED_SCALEY,
776
    &ME_Space8,
777
    &ME_Space8,
777
    &ME_MOUSEADVANCED_DAXES_UP,
778
    &ME_MOUSEADVANCED_DAXES_UP,
778
    &ME_MOUSEADVANCED_DAXES_DOWN,
779
    &ME_MOUSEADVANCED_DAXES_DOWN,
779
    &ME_MOUSEADVANCED_DAXES_LEFT,
780
    &ME_MOUSEADVANCED_DAXES_LEFT,
780
    &ME_MOUSEADVANCED_DAXES_RIGHT,
781
    &ME_MOUSEADVANCED_DAXES_RIGHT,
781
};
782
};
782
783
783
static MenuEntry_t *MEL_INTERNAL_MOUSEADVANCED_DAXES[] = {
784
static MenuEntry_t *MEL_INTERNAL_MOUSEADVANCED_DAXES[] = {
784
    &ME_MOUSEADVANCED_DAXES_UP,
785
    &ME_MOUSEADVANCED_DAXES_UP,
785
    &ME_MOUSEADVANCED_DAXES_DOWN,
786
    &ME_MOUSEADVANCED_DAXES_DOWN,
786
    &ME_MOUSEADVANCED_DAXES_LEFT,
787
    &ME_MOUSEADVANCED_DAXES_LEFT,
787
    &ME_MOUSEADVANCED_DAXES_RIGHT,
788
    &ME_MOUSEADVANCED_DAXES_RIGHT,
788
};
789
};
789
790
790
static const char *MenuJoystickHatDirections[] = { "Up", "Right", "Down", "Left", };
791
static const char *MenuJoystickHatDirections[] = { "Up", "Right", "Down", "Left", };
791
792
792
static char *MEOSN_JOYSTICKAXIS_ANALOG[] = { "  -None-", "Turning", "Strafing", "Looking", "Moving", };
793
static char *MEOSN_JOYSTICKAXIS_ANALOG[] = { "  -None-", "Turning", "Strafing", "Looking", "Moving", };
793
static int32_t MEOSV_JOYSTICKAXIS_ANALOG[] = { -1, analog_turning, analog_strafing, analog_lookingupanddown, analog_moving, };
794
static int32_t MEOSV_JOYSTICKAXIS_ANALOG[] = { -1, analog_turning, analog_strafing, analog_lookingupanddown, analog_moving, };
794
static MenuOptionSet_t MEOS_JOYSTICKAXIS_ANALOG = MAKE_MENUOPTIONSET( MEOSN_JOYSTICKAXIS_ANALOG, MEOSV_JOYSTICKAXIS_ANALOG, 0x0 );
795
static MenuOptionSet_t MEOS_JOYSTICKAXIS_ANALOG = MAKE_MENUOPTIONSET( MEOSN_JOYSTICKAXIS_ANALOG, MEOSV_JOYSTICKAXIS_ANALOG, 0x0 );
795
static MenuOption_t MEO_JOYSTICKAXIS_ANALOG = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_JOYSTICKAXIS_ANALOG, NULL );
796
static MenuOption_t MEO_JOYSTICKAXIS_ANALOG = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_JOYSTICKAXIS_ANALOG, NULL );
796
static MenuEntry_t ME_JOYSTICKAXIS_ANALOG = MAKE_MENUENTRY( "Analog", &MF_Redfont, &MEF_BigSliders, &MEO_JOYSTICKAXIS_ANALOG, Option );
797
static MenuEntry_t ME_JOYSTICKAXIS_ANALOG = MAKE_MENUENTRY( "Analog", &MF_Redfont, &MEF_BigSliders, &MEO_JOYSTICKAXIS_ANALOG, Option );
797
static MenuRangeInt32_t MEO_JOYSTICKAXIS_SCALE = MAKE_MENURANGE( NULL, &MF_Bluefont, -262144, 262144, 65536, 65, 3 );
798
static MenuRangeInt32_t MEO_JOYSTICKAXIS_SCALE = MAKE_MENURANGE( NULL, &MF_Bluefont, -262144, 262144, 65536, 65, 3 );
798
static MenuEntry_t ME_JOYSTICKAXIS_SCALE = MAKE_MENUENTRY( "Scale", &MF_Redfont, &MEF_BigSliders, &MEO_JOYSTICKAXIS_SCALE, RangeInt32 );
799
static MenuEntry_t ME_JOYSTICKAXIS_SCALE = MAKE_MENUENTRY( "Scale", &MF_Redfont, &MEF_BigSliders, &MEO_JOYSTICKAXIS_SCALE, RangeInt32 );
799
static MenuRangeInt32_t MEO_JOYSTICKAXIS_DEAD = MAKE_MENURANGE( NULL, &MF_Bluefont, 0, 1000000, 0, 33, 2 );
800
static MenuRangeInt32_t MEO_JOYSTICKAXIS_DEAD = MAKE_MENURANGE( NULL, &MF_Bluefont, 0, 1000000, 0, 33, 2 );
800
static MenuEntry_t ME_JOYSTICKAXIS_DEAD = MAKE_MENUENTRY( "Dead Zone", &MF_Redfont, &MEF_BigSliders, &MEO_JOYSTICKAXIS_DEAD, RangeInt32 );
801
static MenuEntry_t ME_JOYSTICKAXIS_DEAD = MAKE_MENUENTRY( "Dead Zone", &MF_Redfont, &MEF_BigSliders, &MEO_JOYSTICKAXIS_DEAD, RangeInt32 );
801
static MenuRangeInt32_t MEO_JOYSTICKAXIS_SATU = MAKE_MENURANGE( NULL, &MF_Bluefont, 0, 1000000, 0, 33, 2 );
802
static MenuRangeInt32_t MEO_JOYSTICKAXIS_SATU = MAKE_MENURANGE( NULL, &MF_Bluefont, 0, 1000000, 0, 33, 2 );
802
static MenuEntry_t ME_JOYSTICKAXIS_SATU = MAKE_MENUENTRY( "Saturation", &MF_Redfont, &MEF_BigSliders, &MEO_JOYSTICKAXIS_SATU, RangeInt32 );
803
static MenuEntry_t ME_JOYSTICKAXIS_SATU = MAKE_MENUENTRY( "Saturation", &MF_Redfont, &MEF_BigSliders, &MEO_JOYSTICKAXIS_SATU, RangeInt32 );
803
804
804
static MenuOption_t MEO_JOYSTICKAXIS_DIGITALNEGATIVE = MAKE_MENUOPTION( &MF_Minifont, &MEOS_Gamefuncs, NULL );
805
static MenuOption_t MEO_JOYSTICKAXIS_DIGITALNEGATIVE = MAKE_MENUOPTION( &MF_Minifont, &MEOS_Gamefuncs, NULL );
805
static MenuEntry_t ME_JOYSTICKAXIS_DIGITALNEGATIVE = MAKE_MENUENTRY( "Digital -", &MF_BluefontRed, &MEF_BigSliders, &MEO_JOYSTICKAXIS_DIGITALNEGATIVE, Option );
806
static MenuEntry_t ME_JOYSTICKAXIS_DIGITALNEGATIVE = MAKE_MENUENTRY( "Digital -", &MF_BluefontRed, &MEF_BigSliders, &MEO_JOYSTICKAXIS_DIGITALNEGATIVE, Option );
806
static MenuOption_t MEO_JOYSTICKAXIS_DIGITALPOSITIVE = MAKE_MENUOPTION( &MF_Minifont, &MEOS_Gamefuncs, NULL );
807
static MenuOption_t MEO_JOYSTICKAXIS_DIGITALPOSITIVE = MAKE_MENUOPTION( &MF_Minifont, &MEOS_Gamefuncs, NULL );
807
static MenuEntry_t ME_JOYSTICKAXIS_DIGITALPOSITIVE = MAKE_MENUENTRY( "Digital +", &MF_BluefontRed, &MEF_BigSliders, &MEO_JOYSTICKAXIS_DIGITALPOSITIVE, Option );
808
static MenuEntry_t ME_JOYSTICKAXIS_DIGITALPOSITIVE = MAKE_MENUENTRY( "Digital +", &MF_BluefontRed, &MEF_BigSliders, &MEO_JOYSTICKAXIS_DIGITALPOSITIVE, Option );
808
809
809
static MenuEntry_t *MEL_JOYSTICKAXIS[] = {
810
static MenuEntry_t *MEL_JOYSTICKAXIS[] = {
810
    &ME_JOYSTICKAXIS_ANALOG,
811
    &ME_JOYSTICKAXIS_ANALOG,
811
    &ME_JOYSTICKAXIS_SCALE,
812
    &ME_JOYSTICKAXIS_SCALE,
812
    &ME_JOYSTICKAXIS_DEAD,
813
    &ME_JOYSTICKAXIS_DEAD,
813
    &ME_JOYSTICKAXIS_SATU,
814
    &ME_JOYSTICKAXIS_SATU,
814
    &ME_Space8,
815
    &ME_Space8,
815
    &ME_JOYSTICKAXIS_DIGITALNEGATIVE,
816
    &ME_JOYSTICKAXIS_DIGITALNEGATIVE,
816
    &ME_JOYSTICKAXIS_DIGITALPOSITIVE,
817
    &ME_JOYSTICKAXIS_DIGITALPOSITIVE,
817
};
818
};
818
819
819
static MenuEntry_t *MEL_INTERNAL_JOYSTICKAXIS_DIGITAL[] = {
820
static MenuEntry_t *MEL_INTERNAL_JOYSTICKAXIS_DIGITAL[] = {
820
    &ME_JOYSTICKAXIS_DIGITALNEGATIVE,
821
    &ME_JOYSTICKAXIS_DIGITALNEGATIVE,
821
    &ME_JOYSTICKAXIS_DIGITALPOSITIVE,
822
    &ME_JOYSTICKAXIS_DIGITALPOSITIVE,
822
};
823
};
823
824
824
#ifdef USE_OPENGL
825
#ifdef USE_OPENGL
825
static MenuOption_t MEO_RENDERERSETUP_HIGHTILE = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_NoYes, &usehightile );
826
static MenuOption_t MEO_RENDERERSETUP_HIGHTILE = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_NoYes, &usehightile );
826
static MenuEntry_t ME_RENDERERSETUP_HIGHTILE = MAKE_MENUENTRY( "Hires textures:", &MF_BluefontRed, &MEF_SmallOptions, &MEO_RENDERERSETUP_HIGHTILE, Option );
827
static MenuEntry_t ME_RENDERERSETUP_HIGHTILE = MAKE_MENUENTRY( "Hires textures:", &MF_BluefontRed, &MEF_SmallOptions, &MEO_RENDERERSETUP_HIGHTILE, Option );
827
static MenuRangeInt32_t MEO_RENDERERSETUP_TEXQUALITY = MAKE_MENURANGE( &r_downsize, &MF_Bluefont, 2, 0, 0, 3, 0 );
828
static MenuRangeInt32_t MEO_RENDERERSETUP_TEXQUALITY = MAKE_MENURANGE( &r_downsize, &MF_Bluefont, 2, 0, 0, 3, 0 );
828
static MenuEntry_t ME_RENDERERSETUP_TEXQUALITY = MAKE_MENUENTRY( "Hires texture quality", &MF_BluefontRed, &MEF_SmallOptions, &MEO_RENDERERSETUP_TEXQUALITY, RangeInt32 );
829
static MenuEntry_t ME_RENDERERSETUP_TEXQUALITY = MAKE_MENUENTRY( "Hires texture quality", &MF_BluefontRed, &MEF_SmallOptions, &MEO_RENDERERSETUP_TEXQUALITY, RangeInt32 );
829
static MenuOption_t MEO_RENDERERSETUP_PRECACHE = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_OffOn, &ud.config.useprecache );
830
static MenuOption_t MEO_RENDERERSETUP_PRECACHE = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_OffOn, &ud.config.useprecache );
830
static MenuEntry_t ME_RENDERERSETUP_PRECACHE = MAKE_MENUENTRY( "Pre-load map textures", &MF_BluefontRed, &MEF_SmallOptions, &MEO_RENDERERSETUP_PRECACHE, Option );
831
static MenuEntry_t ME_RENDERERSETUP_PRECACHE = MAKE_MENUENTRY( "Pre-load map textures", &MF_BluefontRed, &MEF_SmallOptions, &MEO_RENDERERSETUP_PRECACHE, Option );
831
static char *MEOSN_RENDERERSETUP_TEXCACHE[] = { "Off", "On", "Compress", };
832
static char *MEOSN_RENDERERSETUP_TEXCACHE[] = { "Off", "On", "Compress", };
832
static MenuOptionSet_t MEOS_RENDERERSETUP_TEXCACHE = MAKE_MENUOPTIONSET( MEOSN_RENDERERSETUP_TEXCACHE, NULL, 0x2 );
833
static MenuOptionSet_t MEOS_RENDERERSETUP_TEXCACHE = MAKE_MENUOPTIONSET( MEOSN_RENDERERSETUP_TEXCACHE, NULL, 0x2 );
833
static MenuOption_t MEO_RENDERERSETUP_TEXCACHE = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_RENDERERSETUP_TEXCACHE, &glusetexcache );
834
static MenuOption_t MEO_RENDERERSETUP_TEXCACHE = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_RENDERERSETUP_TEXCACHE, &glusetexcache );
834
static MenuEntry_t ME_RENDERERSETUP_TEXCACHE = MAKE_MENUENTRY( "On disk texture cache", &MF_BluefontRed, &MEF_SmallOptions, &MEO_RENDERERSETUP_TEXCACHE, Option );
835
static MenuEntry_t ME_RENDERERSETUP_TEXCACHE = MAKE_MENUENTRY( "On disk texture cache", &MF_BluefontRed, &MEF_SmallOptions, &MEO_RENDERERSETUP_TEXCACHE, Option );
835
#ifndef EDUKE32_GLES
836
#ifndef EDUKE32_GLES
836
static MenuOption_t MEO_RENDERERSETUP_DETAILTEX = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_NoYes, &r_detailmapping );
837
static MenuOption_t MEO_RENDERERSETUP_DETAILTEX = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_NoYes, &r_detailmapping );
837
static MenuEntry_t ME_RENDERERSETUP_DETAILTEX = MAKE_MENUENTRY( "Detail textures:", &MF_BluefontRed, &MEF_SmallOptions, &MEO_RENDERERSETUP_DETAILTEX, Option );
838
static MenuEntry_t ME_RENDERERSETUP_DETAILTEX = MAKE_MENUENTRY( "Detail textures:", &MF_BluefontRed, &MEF_SmallOptions, &MEO_RENDERERSETUP_DETAILTEX, Option );
838
#endif
839
#endif
839
static MenuOption_t MEO_RENDERERSETUP_MODELS = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_NoYes, &usemodels );
840
static MenuOption_t MEO_RENDERERSETUP_MODELS = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_NoYes, &usemodels );
840
static MenuEntry_t ME_RENDERERSETUP_MODELS = MAKE_MENUENTRY( "Models:", &MF_BluefontRed, &MEF_SmallOptions, &MEO_RENDERERSETUP_MODELS, Option );
841
static MenuEntry_t ME_RENDERERSETUP_MODELS = MAKE_MENUENTRY( "Models:", &MF_BluefontRed, &MEF_SmallOptions, &MEO_RENDERERSETUP_MODELS, Option );
841
#endif
842
#endif
842
843
843
#ifdef USE_OPENGL
844
#ifdef USE_OPENGL
844
static MenuEntry_t *MEL_RENDERERSETUP[] = {
845
static MenuEntry_t *MEL_RENDERERSETUP[] = {
845
    &ME_RENDERERSETUP_HIGHTILE,
846
    &ME_RENDERERSETUP_HIGHTILE,
846
    &ME_RENDERERSETUP_TEXQUALITY,
847
    &ME_RENDERERSETUP_TEXQUALITY,
847
    &ME_RENDERERSETUP_PRECACHE,
848
    &ME_RENDERERSETUP_PRECACHE,
848
#ifndef EDUKE32_GLES
849
#ifndef EDUKE32_GLES
849
    &ME_RENDERERSETUP_TEXCACHE,
850
    &ME_RENDERERSETUP_TEXCACHE,
850
    &ME_RENDERERSETUP_DETAILTEX,
851
    &ME_RENDERERSETUP_DETAILTEX,
851
#endif
852
#endif
852
    &ME_Space4,
853
    &ME_Space4,
853
    &ME_RENDERERSETUP_MODELS,
854
    &ME_RENDERERSETUP_MODELS,
854
};
855
};
855
#endif
856
#endif
856
857
857
#ifdef DROIDMENU
858
#ifdef DROIDMENU
858
static MenuRangeFloat_t MEO_COLCORR_GAMMA = MAKE_MENURANGE( &vid_gamma, &MF_Bluefont, 1.f, 2.5f, 0.f, 39, 1 );
859
static MenuRangeFloat_t MEO_COLCORR_GAMMA = MAKE_MENURANGE( &vid_gamma, &MF_Bluefont, 1.f, 2.5f, 0.f, 39, 1 );
859
#else
860
#else
860
static MenuRangeFloat_t MEO_COLCORR_GAMMA = MAKE_MENURANGE( &vid_gamma, &MF_Bluefont, 0.2f, 4.f, 0.f, 39, 1 );
861
static MenuRangeFloat_t MEO_COLCORR_GAMMA = MAKE_MENURANGE( &vid_gamma, &MF_Bluefont, 0.2f, 4.f, 0.f, 39, 1 );
861
#endif
862
#endif
862
static MenuEntry_t ME_COLCORR_GAMMA = MAKE_MENUENTRY( "Gamma:", &MF_Redfont, &MEF_ColorCorrect, &MEO_COLCORR_GAMMA, RangeFloat );
863
static MenuEntry_t ME_COLCORR_GAMMA = MAKE_MENUENTRY( "Gamma:", &MF_Redfont, &MEF_ColorCorrect, &MEO_COLCORR_GAMMA, RangeFloat );
863
static MenuRangeFloat_t MEO_COLCORR_CONTRAST = MAKE_MENURANGE( &vid_contrast, &MF_Bluefont, 0.1f, 2.7f, 0.f, 53, 1 );
864
static MenuRangeFloat_t MEO_COLCORR_CONTRAST = MAKE_MENURANGE( &vid_contrast, &MF_Bluefont, 0.1f, 2.7f, 0.f, 53, 1 );
864
static MenuEntry_t ME_COLCORR_CONTRAST = MAKE_MENUENTRY( "Contrast:", &MF_Redfont, &MEF_ColorCorrect, &MEO_COLCORR_CONTRAST, RangeFloat );
865
static MenuEntry_t ME_COLCORR_CONTRAST = MAKE_MENUENTRY( "Contrast:", &MF_Redfont, &MEF_ColorCorrect, &MEO_COLCORR_CONTRAST, RangeFloat );
865
static MenuRangeFloat_t MEO_COLCORR_BRIGHTNESS = MAKE_MENURANGE( &vid_brightness, &MF_Bluefont, -0.8f, 0.8f, 0.f, 33, 1 );
866
static MenuRangeFloat_t MEO_COLCORR_BRIGHTNESS = MAKE_MENURANGE( &vid_brightness, &MF_Bluefont, -0.8f, 0.8f, 0.f, 33, 1 );
866
static MenuEntry_t ME_COLCORR_BRIGHTNESS = MAKE_MENUENTRY( "Brightness:", &MF_Redfont, &MEF_ColorCorrect, &MEO_COLCORR_BRIGHTNESS, RangeFloat );
867
static MenuEntry_t ME_COLCORR_BRIGHTNESS = MAKE_MENUENTRY( "Brightness:", &MF_Redfont, &MEF_ColorCorrect, &MEO_COLCORR_BRIGHTNESS, RangeFloat );
867
static MenuEntry_t ME_COLCORR_RESET = MAKE_MENUENTRY( "Reset To Defaults", &MF_Redfont, &MEF_ColorCorrect, &MEO_NULL, Link );
868
static MenuEntry_t ME_COLCORR_RESET = MAKE_MENUENTRY( "Reset To Defaults", &MF_Redfont, &MEF_ColorCorrect, &MEO_NULL, Link );
868
#ifdef DROIDMENU
869
#ifdef DROIDMENU
869
#define MINVIS 1.f
870
#define MINVIS 1.f
870
#else
871
#else
871
#define MINVIS 0.125f
872
#define MINVIS 0.125f
872
#endif
873
#endif
873
static MenuRangeFloat_t MEO_COLCORR_AMBIENT = MAKE_MENURANGE( &r_ambientlight, &MF_Bluefont, MINVIS, 4.f, 0.f, 32, 1 );
874
static MenuRangeFloat_t MEO_COLCORR_AMBIENT = MAKE_MENURANGE( &r_ambientlight, &MF_Bluefont, MINVIS, 4.f, 0.f, 32, 1 );
874
static MenuEntry_t ME_COLCORR_AMBIENT = MAKE_MENUENTRY( "Visibility:", &MF_Redfont, &MEF_ColorCorrect, &MEO_COLCORR_AMBIENT, RangeFloat );
875
static MenuEntry_t ME_COLCORR_AMBIENT = MAKE_MENUENTRY( "Visibility:", &MF_Redfont, &MEF_ColorCorrect, &MEO_COLCORR_AMBIENT, RangeFloat );
875
876
876
static MenuEntry_t *MEL_COLCORR[] = {
877
static MenuEntry_t *MEL_COLCORR[] = {
877
    &ME_COLCORR_GAMMA,
878
    &ME_COLCORR_GAMMA,
878
#ifndef DROIDMENU
879
#ifndef DROIDMENU
879
    &ME_COLCORR_CONTRAST,
880
    &ME_COLCORR_CONTRAST,
880
    &ME_COLCORR_BRIGHTNESS,
881
    &ME_COLCORR_BRIGHTNESS,
881
#endif
882
#endif
882
    &ME_COLCORR_AMBIENT,
883
    &ME_COLCORR_AMBIENT,
883
    &ME_Space8,
884
    &ME_Space8,
884
    &ME_COLCORR_RESET,
885
    &ME_COLCORR_RESET,
885
};
886
};
886
887
887
static MenuEntry_t *MEL_SCREENSETUP[] = {
888
static MenuEntry_t *MEL_SCREENSETUP[] = {
888
#ifndef DROIDMENU
889
#ifndef DROIDMENU
889
    &ME_SCREENSETUP_SCREENSIZE,
890
    &ME_SCREENSETUP_SCREENSIZE,
890
#endif
891
#endif
891
892
892
    &ME_SCREENSETUP_NEWSTATUSBAR,
893
    &ME_SCREENSETUP_NEWSTATUSBAR,
893
    &ME_SCREENSETUP_SBARSIZE,
894
    &ME_SCREENSETUP_SBARSIZE,
894
895
895
    &ME_SCREENSETUP_CROSSHAIR,
896
    &ME_SCREENSETUP_CROSSHAIR,
896
    &ME_SCREENSETUP_CROSSHAIRSIZE,
897
    &ME_SCREENSETUP_CROSSHAIRSIZE,
897
898
898
    &ME_SCREENSETUP_LEVELSTATS,
899
    &ME_SCREENSETUP_LEVELSTATS,
899
    &ME_SCREENSETUP_TEXTSIZE,
900
    &ME_SCREENSETUP_TEXTSIZE,
900
901
901
    &ME_SCREENSETUP_SHOWPICKUPMESSAGES,
902
    &ME_SCREENSETUP_SHOWPICKUPMESSAGES,
902
};
903
};
903
904
904
// Save and load will be filled in before every viewing of the save/load screen.
905
// Save and load will be filled in before every viewing of the save/load screen.
905
static MenuLink_t MEO_LOAD = { MENU_NULL, MA_None, };
906
static MenuLink_t MEO_LOAD = { MENU_NULL, MA_None, };
906
static MenuLink_t MEO_LOAD_VALID = { MENU_LOADVERIFY, MA_None, };
907
static MenuLink_t MEO_LOAD_VALID = { MENU_LOADVERIFY, MA_None, };
907
static MenuEntry_t ME_LOAD_TEMPLATE = MAKE_MENUENTRY( NULL, &MF_MinifontRed, &MEF_LoadSave, &MEO_LOAD, Link );
908
static MenuEntry_t ME_LOAD_TEMPLATE = MAKE_MENUENTRY( NULL, &MF_MinifontRed, &MEF_LoadSave, &MEO_LOAD, Link );
908
static MenuEntry_t ME_LOAD[MAXSAVEGAMES];
909
static MenuEntry_t ME_LOAD[MAXSAVEGAMES];
909
static MenuEntry_t *MEL_LOAD[MAXSAVEGAMES];
910
static MenuEntry_t *MEL_LOAD[MAXSAVEGAMES];
910
911
911
static MenuString_t MEO_SAVE_TEMPLATE = MAKE_MENUSTRING( NULL, &MF_MinifontRed, MAXSAVEGAMENAME, 0 );
912
static MenuString_t MEO_SAVE_TEMPLATE = MAKE_MENUSTRING( NULL, &MF_MinifontRed, MAXSAVEGAMENAME, 0 );
912
static MenuString_t MEO_SAVE[MAXSAVEGAMES];
913
static MenuString_t MEO_SAVE[MAXSAVEGAMES];
913
static MenuEntry_t ME_SAVE_TEMPLATE = MAKE_MENUENTRY( NULL, &MF_MinifontRed, &MEF_LoadSave, &MEO_SAVE_TEMPLATE, String );
914
static MenuEntry_t ME_SAVE_TEMPLATE = MAKE_MENUENTRY( NULL, &MF_MinifontRed, &MEF_LoadSave, &MEO_SAVE_TEMPLATE, String );
914
static MenuEntry_t ME_SAVE[MAXSAVEGAMES];
915
static MenuEntry_t ME_SAVE[MAXSAVEGAMES];
915
static MenuEntry_t *MEL_SAVE[MAXSAVEGAMES];
916
static MenuEntry_t *MEL_SAVE[MAXSAVEGAMES];
916
917
917
static int32_t soundrate, soundbits, soundvoices;
918
static int32_t soundrate, soundbits, soundvoices;
918
static MenuOption_t MEO_SOUND = MAKE_MENUOPTION( &MF_Redfont, &MEOS_OffOn, &ud.config.SoundToggle );
919
static MenuOption_t MEO_SOUND = MAKE_MENUOPTION( &MF_Redfont, &MEOS_OffOn, &ud.config.SoundToggle );
919
static MenuEntry_t ME_SOUND = MAKE_MENUENTRY( "Sound:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SOUND, Option );
920
static MenuEntry_t ME_SOUND = MAKE_MENUENTRY( "Sound:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SOUND, Option );
920
921
921
static MenuOption_t MEO_SOUND_MUSIC = MAKE_MENUOPTION( &MF_Redfont, &MEOS_OffOn, &ud.config.MusicToggle );
922
static MenuOption_t MEO_SOUND_MUSIC = MAKE_MENUOPTION( &MF_Redfont, &MEOS_OffOn, &ud.config.MusicToggle );
922
static MenuEntry_t ME_SOUND_MUSIC = MAKE_MENUENTRY( "Music:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SOUND_MUSIC, Option );
923
static MenuEntry_t ME_SOUND_MUSIC = MAKE_MENUENTRY( "Music:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SOUND_MUSIC, Option );
923
924
924
static MenuRangeInt32_t MEO_SOUND_VOLUME_MASTER = MAKE_MENURANGE( &ud.config.MasterVolume, &MF_Redfont, 0, 255, 0, 33, 2 );
925
static MenuRangeInt32_t MEO_SOUND_VOLUME_MASTER = MAKE_MENURANGE( &ud.config.MasterVolume, &MF_Redfont, 0, 255, 0, 33, 2 );
925
static MenuEntry_t ME_SOUND_VOLUME_MASTER = MAKE_MENUENTRY( "Volume:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SOUND_VOLUME_MASTER, RangeInt32 );
926
static MenuEntry_t ME_SOUND_VOLUME_MASTER = MAKE_MENUENTRY( "Volume:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SOUND_VOLUME_MASTER, RangeInt32 );
926
927
927
static MenuRangeInt32_t MEO_SOUND_VOLUME_EFFECTS = MAKE_MENURANGE( &ud.config.FXVolume, &MF_Redfont, 0, 255, 0, 33, 2 );
928
static MenuRangeInt32_t MEO_SOUND_VOLUME_EFFECTS = MAKE_MENURANGE( &ud.config.FXVolume, &MF_Redfont, 0, 255, 0, 33, 2 );
928
static MenuEntry_t ME_SOUND_VOLUME_EFFECTS = MAKE_MENUENTRY( "Effects:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SOUND_VOLUME_EFFECTS, RangeInt32 );
929
static MenuEntry_t ME_SOUND_VOLUME_EFFECTS = MAKE_MENUENTRY( "Effects:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SOUND_VOLUME_EFFECTS, RangeInt32 );
929
930
930
static MenuRangeInt32_t MEO_SOUND_VOLUME_MUSIC = MAKE_MENURANGE( &ud.config.MusicVolume, &MF_Redfont, 0, 255, 0, 33, 2 );
931
static MenuRangeInt32_t MEO_SOUND_VOLUME_MUSIC = MAKE_MENURANGE( &ud.config.MusicVolume, &MF_Redfont, 0, 255, 0, 33, 2 );
931
static MenuEntry_t ME_SOUND_VOLUME_MUSIC = MAKE_MENUENTRY( "Music:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SOUND_VOLUME_MUSIC, RangeInt32 );
932
static MenuEntry_t ME_SOUND_VOLUME_MUSIC = MAKE_MENUENTRY( "Music:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SOUND_VOLUME_MUSIC, RangeInt32 );
932
933
933
static MenuOption_t MEO_SOUND_DUKETALK = MAKE_MENUOPTION(&MF_Redfont, &MEOS_NoYes, NULL);
934
static MenuOption_t MEO_SOUND_DUKETALK = MAKE_MENUOPTION(&MF_Redfont, &MEOS_NoYes, NULL);
934
static MenuEntry_t ME_SOUND_DUKETALK = MAKE_MENUENTRY( "Duke talk:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SOUND_DUKETALK, Option );
935
static MenuEntry_t ME_SOUND_DUKETALK = MAKE_MENUENTRY( "Duke talk:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SOUND_DUKETALK, Option );
935
936
936
static char *MEOSN_SOUND_SAMPLINGRATE[] = { "22050Hz", "44100Hz", "48000Hz", };
937
static char *MEOSN_SOUND_SAMPLINGRATE[] = { "22050Hz", "44100Hz", "48000Hz", };
937
static int32_t MEOSV_SOUND_SAMPLINGRATE[] = { 22050, 44100, 48000, };
938
static int32_t MEOSV_SOUND_SAMPLINGRATE[] = { 22050, 44100, 48000, };
938
static MenuOptionSet_t MEOS_SOUND_SAMPLINGRATE = MAKE_MENUOPTIONSET( MEOSN_SOUND_SAMPLINGRATE, MEOSV_SOUND_SAMPLINGRATE, 0x3 );
939
static MenuOptionSet_t MEOS_SOUND_SAMPLINGRATE = MAKE_MENUOPTIONSET( MEOSN_SOUND_SAMPLINGRATE, MEOSV_SOUND_SAMPLINGRATE, 0x3 );
939
static MenuOption_t MEO_SOUND_SAMPLINGRATE = MAKE_MENUOPTION( &MF_Redfont, &MEOS_SOUND_SAMPLINGRATE, &soundrate );
940
static MenuOption_t MEO_SOUND_SAMPLINGRATE = MAKE_MENUOPTION( &MF_Redfont, &MEOS_SOUND_SAMPLINGRATE, &soundrate );
940
static MenuEntry_t ME_SOUND_SAMPLINGRATE = MAKE_MENUENTRY( "Sample rate:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SOUND_SAMPLINGRATE, Option );
941
static MenuEntry_t ME_SOUND_SAMPLINGRATE = MAKE_MENUENTRY( "Sample rate:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SOUND_SAMPLINGRATE, Option );
941
942
942
static char *MEOSN_SOUND_SAMPLESIZE[] = { "8-bit", "16-bit", };
943
static char *MEOSN_SOUND_SAMPLESIZE[] = { "8-bit", "16-bit", };
943
static int32_t MEOSV_SOUND_SAMPLESIZE[] = { 8, 16, };
944
static int32_t MEOSV_SOUND_SAMPLESIZE[] = { 8, 16, };
944
static MenuOptionSet_t MEOS_SOUND_SAMPLESIZE = MAKE_MENUOPTIONSET( MEOSN_SOUND_SAMPLESIZE, MEOSV_SOUND_SAMPLESIZE, 0x3 );
945
static MenuOptionSet_t MEOS_SOUND_SAMPLESIZE = MAKE_MENUOPTIONSET( MEOSN_SOUND_SAMPLESIZE, MEOSV_SOUND_SAMPLESIZE, 0x3 );
945
static MenuOption_t MEO_SOUND_SAMPLESIZE = MAKE_MENUOPTION( &MF_Redfont, &MEOS_SOUND_SAMPLESIZE, &soundbits );
946
static MenuOption_t MEO_SOUND_SAMPLESIZE = MAKE_MENUOPTION( &MF_Redfont, &MEOS_SOUND_SAMPLESIZE, &soundbits );
946
static MenuEntry_t ME_SOUND_SAMPLESIZE = MAKE_MENUENTRY( "Sample size:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SOUND_SAMPLESIZE, Option );
947
static MenuEntry_t ME_SOUND_SAMPLESIZE = MAKE_MENUENTRY( "Sample size:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SOUND_SAMPLESIZE, Option );
947
948
948
static MenuRangeInt32_t MEO_SOUND_NUMVOICES = MAKE_MENURANGE( &soundvoices, &MF_Redfont, 16, 256, 0, 16, 1 );
949
static MenuRangeInt32_t MEO_SOUND_NUMVOICES = MAKE_MENURANGE( &soundvoices, &MF_Redfont, 16, 256, 0, 16, 1 );
949
static MenuEntry_t ME_SOUND_NUMVOICES = MAKE_MENUENTRY( "Voices:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SOUND_NUMVOICES, RangeInt32 );
950
static MenuEntry_t ME_SOUND_NUMVOICES = MAKE_MENUENTRY( "Voices:", &MF_Redfont, &MEF_BigOptionsRt, &MEO_SOUND_NUMVOICES, RangeInt32 );
950
951
951
static MenuEntry_t ME_SOUND_RESTART = MAKE_MENUENTRY( "Restart sound system", &MF_Redfont, &MEF_BigOptionsRt, &MEO_NULL, Link );
952
static MenuEntry_t ME_SOUND_RESTART = MAKE_MENUENTRY( "Restart sound system", &MF_Redfont, &MEF_BigOptionsRt, &MEO_NULL, Link );
952
953
953
#ifndef DROIDMENU
954
#ifndef DROIDMENU
954
static MenuLink_t MEO_ADVSOUND = { MENU_ADVSOUND, MA_Advance, };
955
static MenuLink_t MEO_ADVSOUND = { MENU_ADVSOUND, MA_Advance, };
955
static MenuEntry_t ME_SOUND_ADVSOUND = MAKE_MENUENTRY( "Advanced", &MF_Redfont, &MEF_BigOptionsRt, &MEO_ADVSOUND, Link );
956
static MenuEntry_t ME_SOUND_ADVSOUND = MAKE_MENUENTRY( "Advanced", &MF_Redfont, &MEF_BigOptionsRt, &MEO_ADVSOUND, Link );
956
#endif
957
#endif
957
958
958
static MenuEntry_t *MEL_SOUND[] = {
959
static MenuEntry_t *MEL_SOUND[] = {
959
    &ME_SOUND,
960
    &ME_SOUND,
960
    &ME_SOUND_MUSIC,
961
    &ME_SOUND_MUSIC,
961
    &ME_Space2,
962
    &ME_Space2,
962
    &ME_SOUND_VOLUME_MASTER,
963
    &ME_SOUND_VOLUME_MASTER,
963
    &ME_SOUND_VOLUME_EFFECTS,
964
    &ME_SOUND_VOLUME_EFFECTS,
964
    &ME_SOUND_VOLUME_MUSIC,
965
    &ME_SOUND_VOLUME_MUSIC,
965
    &ME_Space2,
966
    &ME_Space2,
966
    &ME_SOUND_DUKETALK,
967
    &ME_SOUND_DUKETALK,
967
#ifndef DROIDMENU
968
#ifndef DROIDMENU
968
    &ME_SOUND_ADVSOUND,
969
    &ME_SOUND_ADVSOUND,
969
#endif
970
#endif
970
};
971
};
971
972
972
static MenuEntry_t *MEL_ADVSOUND[] = {
973
static MenuEntry_t *MEL_ADVSOUND[] = {
973
    &ME_SOUND_SAMPLINGRATE,
974
    &ME_SOUND_SAMPLINGRATE,
974
    &ME_SOUND_SAMPLESIZE,
975
    &ME_SOUND_SAMPLESIZE,
975
    &ME_Space2,
976
    &ME_Space2,
976
    &ME_SOUND_NUMVOICES,
977
    &ME_SOUND_NUMVOICES,
977
    &ME_Space2,
978
    &ME_Space2,
978
    &ME_SOUND_RESTART,
979
    &ME_SOUND_RESTART,
979
};
980
};
980
981
981
MAKE_MENU_TOP_ENTRYLINK( "Player Setup", MEF_CenterMenu, NETWORK_PLAYERSETUP, MENU_PLAYER );
982
MAKE_MENU_TOP_ENTRYLINK( "Player Setup", MEF_CenterMenu, NETWORK_PLAYERSETUP, MENU_PLAYER );
982
MAKE_MENU_TOP_ENTRYLINK( "Join Game", MEF_CenterMenu, NETWORK_JOINGAME, MENU_NETJOIN );
983
MAKE_MENU_TOP_ENTRYLINK( "Join Game", MEF_CenterMenu, NETWORK_JOINGAME, MENU_NETJOIN );
983
MAKE_MENU_TOP_ENTRYLINK( "Host Game", MEF_CenterMenu, NETWORK_HOSTGAME, MENU_NETHOST );
984
MAKE_MENU_TOP_ENTRYLINK( "Host Game", MEF_CenterMenu, NETWORK_HOSTGAME, MENU_NETHOST );
984
985
985
static MenuEntry_t *MEL_NETWORK[] = {
986
static MenuEntry_t *MEL_NETWORK[] = {
986
    &ME_NETWORK_PLAYERSETUP,
987
    &ME_NETWORK_PLAYERSETUP,
987
    &ME_NETWORK_JOINGAME,
988
    &ME_NETWORK_JOINGAME,
988
    &ME_NETWORK_HOSTGAME,
989
    &ME_NETWORK_HOSTGAME,
989
};
990
};
990
991
991
static MenuString_t MEO_PLAYER_NAME = MAKE_MENUSTRING( szPlayerName, &MF_Bluefont, MAXPLAYERNAME, 0 );
992
static MenuString_t MEO_PLAYER_NAME = MAKE_MENUSTRING( szPlayerName, &MF_Bluefont, MAXPLAYERNAME, 0 );
992
static MenuEntry_t ME_PLAYER_NAME = MAKE_MENUENTRY( "Name", &MF_BluefontRed, &MEF_PlayerNarrow, &MEO_PLAYER_NAME, String );
993
static MenuEntry_t ME_PLAYER_NAME = MAKE_MENUENTRY( "Name", &MF_BluefontRed, &MEF_PlayerNarrow, &MEO_PLAYER_NAME, String );
993
static char *MEOSN_PLAYER_COLOR[] = { "Auto", "Blue", "Red", "Green", "Gray", "Dark gray", "Dark green", "Brown", "Dark blue", "Bright red", "Yellow", };
994
static char *MEOSN_PLAYER_COLOR[] = { "Auto", "Blue", "Red", "Green", "Gray", "Dark gray", "Dark green", "Brown", "Dark blue", "Bright red", "Yellow", };
994
static int32_t MEOSV_PLAYER_COLOR[] = { 0, 9, 10, 11, 12, 13, 14, 15, 16, 21, 23, };
995
static int32_t MEOSV_PLAYER_COLOR[] = { 0, 9, 10, 11, 12, 13, 14, 15, 16, 21, 23, };
995
static MenuOptionSet_t MEOS_PLAYER_COLOR = MAKE_MENUOPTIONSET( MEOSN_PLAYER_COLOR, MEOSV_PLAYER_COLOR, 0x2 );
996
static MenuOptionSet_t MEOS_PLAYER_COLOR = MAKE_MENUOPTIONSET( MEOSN_PLAYER_COLOR, MEOSV_PLAYER_COLOR, 0x2 );
996
static MenuOption_t MEO_PLAYER_COLOR = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_PLAYER_COLOR, &ud.color );
997
static MenuOption_t MEO_PLAYER_COLOR = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_PLAYER_COLOR, &ud.color );
997
static MenuEntry_t ME_PLAYER_COLOR = MAKE_MENUENTRY( "Color", &MF_BluefontRed, &MEF_PlayerNarrow, &MEO_PLAYER_COLOR, Option );
998
static MenuEntry_t ME_PLAYER_COLOR = MAKE_MENUENTRY( "Color", &MF_BluefontRed, &MEF_PlayerNarrow, &MEO_PLAYER_COLOR, Option );
998
static char *MEOSN_PLAYER_TEAM[] = { "Blue", "Red", "Green", "Gray", };
999
static char *MEOSN_PLAYER_TEAM[] = { "Blue", "Red", "Green", "Gray", };
999
static MenuOptionSet_t MEOS_PLAYER_TEAM = MAKE_MENUOPTIONSET( MEOSN_PLAYER_TEAM, NULL, 0x2 );
1000
static MenuOptionSet_t MEOS_PLAYER_TEAM = MAKE_MENUOPTIONSET( MEOSN_PLAYER_TEAM, NULL, 0x2 );
1000
static MenuOption_t MEO_PLAYER_TEAM = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_PLAYER_TEAM, &ud.team );
1001
static MenuOption_t MEO_PLAYER_TEAM = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_PLAYER_TEAM, &ud.team );
1001
static MenuEntry_t ME_PLAYER_TEAM = MAKE_MENUENTRY( "Team", &MF_BluefontRed, &MEF_PlayerNarrow, &MEO_PLAYER_TEAM, Option );
1002
static MenuEntry_t ME_PLAYER_TEAM = MAKE_MENUENTRY( "Team", &MF_BluefontRed, &MEF_PlayerNarrow, &MEO_PLAYER_TEAM, Option );
1002
#ifndef DROIDMENU
1003
#ifndef DROIDMENU
1003
static MenuLink_t MEO_PLAYER_MACROS = { MENU_MACROS, MA_Advance, };
1004
static MenuLink_t MEO_PLAYER_MACROS = { MENU_MACROS, MA_Advance, };
1004
static MenuEntry_t ME_PLAYER_MACROS = MAKE_MENUENTRY( "Multiplayer macros", &MF_BluefontRed, &MEF_SmallOptions, &MEO_PLAYER_MACROS, Link );
1005
static MenuEntry_t ME_PLAYER_MACROS = MAKE_MENUENTRY( "Multiplayer macros", &MF_BluefontRed, &MEF_SmallOptions, &MEO_PLAYER_MACROS, Link );
1005
#endif
1006
#endif
1006
1007
1007
static MenuEntry_t *MEL_PLAYER[] = {
1008
static MenuEntry_t *MEL_PLAYER[] = {
1008
    &ME_PLAYER_NAME,
1009
    &ME_PLAYER_NAME,
1009
    &ME_Space4,
1010
    &ME_Space4,
1010
    &ME_PLAYER_COLOR,
1011
    &ME_PLAYER_COLOR,
1011
    &ME_Space4,
1012
    &ME_Space4,
1012
    &ME_PLAYER_TEAM,
1013
    &ME_PLAYER_TEAM,
1013
#ifndef DROIDMENU
1014
#ifndef DROIDMENU
1014
    &ME_Space8,
1015
    &ME_Space8,
1015
    &ME_PLAYER_MACROS,
1016
    &ME_PLAYER_MACROS,
1016
#endif
1017
#endif
1017
};
1018
};
1018
1019
1019
static MenuString_t MEO_MACROS_TEMPLATE = MAKE_MENUSTRING( NULL, &MF_Bluefont, MAXRIDECULELENGTH, 0 );
1020
static MenuString_t MEO_MACROS_TEMPLATE = MAKE_MENUSTRING( NULL, &MF_Bluefont, MAXRIDECULELENGTH, 0 );
1020
static MenuString_t MEO_MACROS[MAXSAVEGAMES];
1021
static MenuString_t MEO_MACROS[MAXSAVEGAMES];
1021
static MenuEntry_t ME_MACROS_TEMPLATE = MAKE_MENUENTRY( NULL, &MF_Bluefont, &MEF_Macros, &MEO_MACROS_TEMPLATE, String );
1022
static MenuEntry_t ME_MACROS_TEMPLATE = MAKE_MENUENTRY( NULL, &MF_Bluefont, &MEF_Macros, &MEO_MACROS_TEMPLATE, String );
1022
static MenuEntry_t ME_MACROS[MAXRIDECULE];
1023
static MenuEntry_t ME_MACROS[MAXRIDECULE];
1023
static MenuEntry_t *MEL_MACROS[MAXRIDECULE];
1024
static MenuEntry_t *MEL_MACROS[MAXRIDECULE];
1024
1025
1025
static char *MenuUserMap = "User Map";
1026
static char *MenuUserMap = "User Map";
1026
static char *MenuSkillNone = "None";
1027
static char *MenuSkillNone = "None";
1027
1028
1028
static char *MEOSN_NetGametypes[MAXGAMETYPES];
1029
static char *MEOSN_NetGametypes[MAXGAMETYPES];
1029
static char *MEOSN_NetEpisodes[MAXVOLUMES+1];
1030
static char *MEOSN_NetEpisodes[MAXVOLUMES+1];
1030
static char *MEOSN_NetLevels[MAXVOLUMES][MAXLEVELS];
1031
static char *MEOSN_NetLevels[MAXVOLUMES][MAXLEVELS];
1031
static char *MEOSN_NetSkills[MAXSKILLS+1];
1032
static char *MEOSN_NetSkills[MAXSKILLS+1];
1032
1033
1033
static MenuLink_t MEO_NETHOST_OPTIONS = { MENU_NETOPTIONS, MA_Advance, };
1034
static MenuLink_t MEO_NETHOST_OPTIONS = { MENU_NETOPTIONS, MA_Advance, };
1034
static MenuEntry_t ME_NETHOST_OPTIONS = MAKE_MENUENTRY( "Game Options", &MF_Redfont, &MEF_VideoSetup, &MEO_NETHOST_OPTIONS, Link );
1035
static MenuEntry_t ME_NETHOST_OPTIONS = MAKE_MENUENTRY( "Game Options", &MF_Redfont, &MEF_VideoSetup, &MEO_NETHOST_OPTIONS, Link );
1035
static MenuEntry_t ME_NETHOST_LAUNCH = MAKE_MENUENTRY( "Launch Game", &MF_Redfont, &MEF_VideoSetup, &MEO_NULL, Link );
1036
static MenuEntry_t ME_NETHOST_LAUNCH = MAKE_MENUENTRY( "Launch Game", &MF_Redfont, &MEF_VideoSetup, &MEO_NULL, Link );
1036
1037
1037
static MenuEntry_t *MEL_NETHOST[] = {
1038
static MenuEntry_t *MEL_NETHOST[] = {
1038
    &ME_NETHOST_OPTIONS,
1039
    &ME_NETHOST_OPTIONS,
1039
    &ME_NETHOST_LAUNCH,
1040
    &ME_NETHOST_LAUNCH,
1040
};
1041
};
1041
1042
1042
static MenuOptionSet_t MEOS_NETOPTIONS_GAMETYPE = MAKE_MENUOPTIONSET( MEOSN_NetGametypes, NULL, 0x0 );
1043
static MenuOptionSet_t MEOS_NETOPTIONS_GAMETYPE = MAKE_MENUOPTIONSET( MEOSN_NetGametypes, NULL, 0x0 );
1043
static MenuOption_t MEO_NETOPTIONS_GAMETYPE = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_NETOPTIONS_GAMETYPE, &ud.m_coop );
1044
static MenuOption_t MEO_NETOPTIONS_GAMETYPE = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_NETOPTIONS_GAMETYPE, &ud.m_coop );
1044
static MenuEntry_t ME_NETOPTIONS_GAMETYPE = MAKE_MENUENTRY( "Game Type", &MF_Redfont, &MEF_NetSetup, &MEO_NETOPTIONS_GAMETYPE, Option );
1045
static MenuEntry_t ME_NETOPTIONS_GAMETYPE = MAKE_MENUENTRY( "Game Type", &MF_Redfont, &MEF_NetSetup, &MEO_NETOPTIONS_GAMETYPE, Option );
1045
static MenuOptionSet_t MEOS_NETOPTIONS_EPISODE = MAKE_MENUOPTIONSET( MEOSN_NetEpisodes, NULL, 0x0 );
1046
static MenuOptionSet_t MEOS_NETOPTIONS_EPISODE = MAKE_MENUOPTIONSET( MEOSN_NetEpisodes, NULL, 0x0 );
1046
static MenuOption_t MEO_NETOPTIONS_EPISODE = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_NETOPTIONS_EPISODE, NULL );
1047
static MenuOption_t MEO_NETOPTIONS_EPISODE = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_NETOPTIONS_EPISODE, NULL );
1047
static MenuEntry_t ME_NETOPTIONS_EPISODE = MAKE_MENUENTRY( "Episode", &MF_Redfont, &MEF_NetSetup, &MEO_NETOPTIONS_EPISODE, Option );
1048
static MenuEntry_t ME_NETOPTIONS_EPISODE = MAKE_MENUENTRY( "Episode", &MF_Redfont, &MEF_NetSetup, &MEO_NETOPTIONS_EPISODE, Option );
1048
static MenuOptionSet_t MEOS_NETOPTIONS_LEVEL[MAXVOLUMES];
1049
static MenuOptionSet_t MEOS_NETOPTIONS_LEVEL[MAXVOLUMES];
1049
static MenuOption_t MEO_NETOPTIONS_LEVEL = MAKE_MENUOPTION( &MF_Bluefont, NULL, &ud.m_level_number );
1050
static MenuOption_t MEO_NETOPTIONS_LEVEL = MAKE_MENUOPTION( &MF_Bluefont, NULL, &ud.m_level_number );
1050
static MenuEntry_t ME_NETOPTIONS_LEVEL = MAKE_MENUENTRY( "Level", &MF_Redfont, &MEF_NetSetup, &MEO_NETOPTIONS_LEVEL, Option );
1051
static MenuEntry_t ME_NETOPTIONS_LEVEL = MAKE_MENUENTRY( "Level", &MF_Redfont, &MEF_NetSetup, &MEO_NETOPTIONS_LEVEL, Option );
1051
static MenuLink_t MEO_NETOPTIONS_USERMAP = { MENU_NETUSERMAP, MA_Advance, };
1052
static MenuLink_t MEO_NETOPTIONS_USERMAP = { MENU_NETUSERMAP, MA_Advance, };
1052
static MenuEntry_t ME_NETOPTIONS_USERMAP = MAKE_MENUENTRY( "User Map", &MF_Redfont, &MEF_NetSetup, &MEO_NETOPTIONS_USERMAP, Link );
1053
static MenuEntry_t ME_NETOPTIONS_USERMAP = MAKE_MENUENTRY( "User Map", &MF_Redfont, &MEF_NetSetup, &MEO_NETOPTIONS_USERMAP, Link );
1053
static MenuOptionSet_t MEOS_NETOPTIONS_MONSTERS = MAKE_MENUOPTIONSET( MEOSN_NetSkills, NULL, 0x0 );
1054
static MenuOptionSet_t MEOS_NETOPTIONS_MONSTERS = MAKE_MENUOPTIONSET( MEOSN_NetSkills, NULL, 0x0 );
1054
static MenuOption_t MEO_NETOPTIONS_MONSTERS = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_NETOPTIONS_MONSTERS, NULL );
1055
static MenuOption_t MEO_NETOPTIONS_MONSTERS = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_NETOPTIONS_MONSTERS, NULL );
1055
static MenuEntry_t ME_NETOPTIONS_MONSTERS = MAKE_MENUENTRY( "Monsters", &MF_Redfont, &MEF_NetSetup, &MEO_NETOPTIONS_MONSTERS, Option );
1056
static MenuEntry_t ME_NETOPTIONS_MONSTERS = MAKE_MENUENTRY( "Monsters", &MF_Redfont, &MEF_NetSetup, &MEO_NETOPTIONS_MONSTERS, Option );
1056
static MenuOption_t MEO_NETOPTIONS_MARKERS = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_OffOn, &ud.m_marker );
1057
static MenuOption_t MEO_NETOPTIONS_MARKERS = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_OffOn, &ud.m_marker );
1057
static MenuEntry_t ME_NETOPTIONS_MARKERS = MAKE_MENUENTRY( "Markers", &MF_Redfont, &MEF_NetSetup, &MEO_NETOPTIONS_MARKERS, Option );
1058
static MenuEntry_t ME_NETOPTIONS_MARKERS = MAKE_MENUENTRY( "Markers", &MF_Redfont, &MEF_NetSetup, &MEO_NETOPTIONS_MARKERS, Option );
1058
static MenuEntry_t ME_NETOPTIONS_MARKERS_DISABLED = MAKE_MENUENTRY( "Markers", &MF_RedfontBlue, &MEF_NetSetup, NULL, Dummy );
1059
static MenuEntry_t ME_NETOPTIONS_MARKERS_DISABLED = MAKE_MENUENTRY( "Markers", &MF_RedfontBlue, &MEF_NetSetup, NULL, Dummy );
1059
static MenuOption_t MEO_NETOPTIONS_MAPEXITS = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_OnOff, &ud.m_noexits );
1060
static MenuOption_t MEO_NETOPTIONS_MAPEXITS = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_OnOff, &ud.m_noexits );
1060
static MenuEntry_t ME_NETOPTIONS_MAPEXITS = MAKE_MENUENTRY( "Map Exits", &MF_Redfont, &MEF_NetSetup, &MEO_NETOPTIONS_MAPEXITS, Option );
1061
static MenuEntry_t ME_NETOPTIONS_MAPEXITS = MAKE_MENUENTRY( "Map Exits", &MF_Redfont, &MEF_NetSetup, &MEO_NETOPTIONS_MAPEXITS, Option );
1061
static MenuOption_t MEO_NETOPTIONS_FRFIRE = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_OffOn, &ud.m_ffire );
1062
static MenuOption_t MEO_NETOPTIONS_FRFIRE = MAKE_MENUOPTION( &MF_Bluefont, &MEOS_OffOn, &ud.m_ffire );
1062
static MenuEntry_t ME_NETOPTIONS_FRFIRE = MAKE_MENUENTRY( "Fr. Fire", &MF_Redfont, &MEF_NetSetup, &MEO_NETOPTIONS_FRFIRE, Option );
1063
static MenuEntry_t ME_NETOPTIONS_FRFIRE = MAKE_MENUENTRY( "Fr. Fire", &MF_Redfont, &MEF_NetSetup, &MEO_NETOPTIONS_FRFIRE, Option );
1063
static MenuEntry_t ME_NETOPTIONS_ACCEPT = MAKE_MENUENTRY( "Accept", &MF_RedfontGreen, &MEF_NetSetup, &MEO_NULL, Link );
1064
static MenuEntry_t ME_NETOPTIONS_ACCEPT = MAKE_MENUENTRY( "Accept", &MF_RedfontGreen, &MEF_NetSetup, &MEO_NULL, Link );
1064
1065
1065
static MenuEntry_t *MEL_NETOPTIONS[] = {
1066
static MenuEntry_t *MEL_NETOPTIONS[] = {
1066
    &ME_NETOPTIONS_GAMETYPE,
1067
    &ME_NETOPTIONS_GAMETYPE,
1067
    &ME_NETOPTIONS_EPISODE,
1068
    &ME_NETOPTIONS_EPISODE,
1068
    &ME_NETOPTIONS_LEVEL,
1069
    &ME_NETOPTIONS_LEVEL,
1069
    &ME_NETOPTIONS_MONSTERS,
1070
    &ME_NETOPTIONS_MONSTERS,
1070
    &ME_NETOPTIONS_MARKERS,
1071
    &ME_NETOPTIONS_MARKERS,
1071
    &ME_NETOPTIONS_MAPEXITS,
1072
    &ME_NETOPTIONS_MAPEXITS,
1072
    &ME_NETOPTIONS_ACCEPT,
1073
    &ME_NETOPTIONS_ACCEPT,
1073
};
1074
};
1074
1075
1075
static char MenuServer[BMAX_PATH] = "localhost";
1076
static char MenuServer[BMAX_PATH] = "localhost";
1076
static MenuString_t MEO_NETJOIN_SERVER = MAKE_MENUSTRING( MenuServer, &MF_Bluefont, BMAX_PATH, 0 );
1077
static MenuString_t MEO_NETJOIN_SERVER = MAKE_MENUSTRING( MenuServer, &MF_Bluefont, BMAX_PATH, 0 );
1077
static MenuEntry_t ME_NETJOIN_SERVER = MAKE_MENUENTRY( "Server", &MF_Redfont, &MEF_VideoSetup, &MEO_NETJOIN_SERVER, String );
1078
static MenuEntry_t ME_NETJOIN_SERVER = MAKE_MENUENTRY( "Server", &MF_Redfont, &MEF_VideoSetup, &MEO_NETJOIN_SERVER, String );
1078
#define MAXPORTSTRINGLENGTH 6 // unsigned 16-bit integer
1079
#define MAXPORTSTRINGLENGTH 6 // unsigned 16-bit integer
1079
static char MenuPort[MAXPORTSTRINGLENGTH] = "19014";
1080
static char MenuPort[MAXPORTSTRINGLENGTH] = "19014";
1080
static MenuString_t MEO_NETJOIN_PORT = MAKE_MENUSTRING( MenuPort, &MF_Bluefont, MAXPORTSTRINGLENGTH, INPUT_NUMERIC );
1081
static MenuString_t MEO_NETJOIN_PORT = MAKE_MENUSTRING( MenuPort, &MF_Bluefont, MAXPORTSTRINGLENGTH, INPUT_NUMERIC );
1081
static MenuEntry_t ME_NETJOIN_PORT = MAKE_MENUENTRY( "Port", &MF_Redfont, &MEF_VideoSetup, &MEO_NETJOIN_PORT, String );
1082
static MenuEntry_t ME_NETJOIN_PORT = MAKE_MENUENTRY( "Port", &MF_Redfont, &MEF_VideoSetup, &MEO_NETJOIN_PORT, String );
1082
static MenuEntry_t ME_NETJOIN_CONNECT = MAKE_MENUENTRY( "Connect", &MF_RedfontGreen, &MEF_VideoSetup, &MEO_NULL, Link );
1083
static MenuEntry_t ME_NETJOIN_CONNECT = MAKE_MENUENTRY( "Connect", &MF_RedfontGreen, &MEF_VideoSetup, &MEO_NULL, Link );
1083
1084
1084
static MenuEntry_t *MEL_NETJOIN[] = {
1085
static MenuEntry_t *MEL_NETJOIN[] = {
1085
    &ME_NETJOIN_SERVER,
1086
    &ME_NETJOIN_SERVER,
1086
    &ME_NETJOIN_PORT,
1087
    &ME_NETJOIN_PORT,
1087
    &ME_NETJOIN_CONNECT,
1088
    &ME_NETJOIN_CONNECT,
1088
};
1089
};
1089
1090
1090
1091
1091
#define NoTitle NULL
1092
#define NoTitle NULL
1092
1093
1093
#define MAKE_MENUMENU(Title, Format, Entries) { Title, Format, Entries, ARRAY_SIZE(Entries), 0, 0, 0, 0 }
1094
#define MAKE_MENUMENU(Title, Format, Entries) { Title, Format, Entries, ARRAY_SIZE(Entries), 0, 0, 0, 0 }
1094
1095
1095
static MenuMenu_t M_MAIN = MAKE_MENUMENU( NoTitle, &MMF_Top_Main, MEL_MAIN );
1096
static MenuMenu_t M_MAIN = MAKE_MENUMENU( NoTitle, &MMF_Top_Main, MEL_MAIN );
1096
static MenuMenu_t M_MAIN_INGAME = MAKE_MENUMENU( NoTitle, &MMF_Top_Main, MEL_MAIN_INGAME );
1097
static MenuMenu_t M_MAIN_INGAME = MAKE_MENUMENU( NoTitle, &MMF_Top_Main, MEL_MAIN_INGAME );
1097
static MenuMenu_t M_EPISODE = MAKE_MENUMENU( "Select An Episode", &MMF_Top_Episode, MEL_EPISODE );
1098
static MenuMenu_t M_EPISODE = MAKE_MENUMENU( "Select An Episode", &MMF_Top_Episode, MEL_EPISODE );
1098
static MenuMenu_t M_SKILL = MAKE_MENUMENU( "Select Skill", &MMF_Top_Skill, MEL_SKILL );
1099
static MenuMenu_t M_SKILL = MAKE_MENUMENU( "Select Skill", &MMF_Top_Skill, MEL_SKILL );
1099
static MenuMenu_t M_GAMESETUP = MAKE_MENUMENU( "Game Setup", &MMF_BigOptions, MEL_GAMESETUP );
1100
static MenuMenu_t M_GAMESETUP = MAKE_MENUMENU( "Game Setup", &MMF_BigOptions, MEL_GAMESETUP );
1100
static MenuMenu_t M_OPTIONS = MAKE_MENUMENU( "Options", &MMF_Top_Options, MEL_OPTIONS );
1101
static MenuMenu_t M_OPTIONS = MAKE_MENUMENU( "Options", &MMF_Top_Options, MEL_OPTIONS );
1101
static MenuMenu_t M_VIDEOSETUP = MAKE_MENUMENU( "Video Mode", &MMF_BigOptions, MEL_VIDEOSETUP );
1102
static MenuMenu_t M_VIDEOSETUP = MAKE_MENUMENU( "Video Mode", &MMF_BigOptions, MEL_VIDEOSETUP );
1102
static MenuMenu_t M_KEYBOARDSETUP = MAKE_MENUMENU( "Keyboard Setup", &MMF_Top_Options, MEL_KEYBOARDSETUP );
1103
static MenuMenu_t M_KEYBOARDSETUP = MAKE_MENUMENU( "Keyboard Setup", &MMF_Top_Options, MEL_KEYBOARDSETUP );
1103
static MenuMenu_t M_CONTROLS = MAKE_MENUMENU( "Control Setup", &MMF_Top_Options, MEL_CONTROLS );
1104
static MenuMenu_t M_CONTROLS = MAKE_MENUMENU( "Control Setup", &MMF_Top_Options, MEL_CONTROLS );
1104
static MenuMenu_t M_MOUSESETUP = MAKE_MENUMENU( "Mouse Setup", &MMF_BigOptions, MEL_MOUSESETUP );
1105
static MenuMenu_t M_MOUSESETUP = MAKE_MENUMENU( "Mouse Setup", &MMF_BigOptions, MEL_MOUSESETUP );
1105
#ifdef DROIDMENU
1106
#ifdef DROIDMENU
1106
static MenuMenu_t M_TOUCHSETUP = MAKE_MENUMENU( "Touch Setup", &MMF_BigOptions, MEL_TOUCHSETUP );
1107
static MenuMenu_t M_TOUCHSETUP = MAKE_MENUMENU( "Touch Setup", &MMF_BigOptions, MEL_TOUCHSETUP );
1107
#endif
1108
#endif
1108
static MenuMenu_t M_JOYSTICKSETUP = MAKE_MENUMENU( "Joystick Setup", &MMF_Top_Joystick_Network, MEL_JOYSTICKSETUP );
1109
static MenuMenu_t M_JOYSTICKSETUP = MAKE_MENUMENU( "Joystick Setup", &MMF_Top_Joystick_Network, MEL_JOYSTICKSETUP );
1109
static MenuMenu_t M_JOYSTICKBTNS = MAKE_MENUMENU( "Joystick Buttons", &MMF_MouseJoySetupBtns, MEL_JOYSTICKBTNS );
1110
static MenuMenu_t M_JOYSTICKBTNS = MAKE_MENUMENU( "Joystick Buttons", &MMF_MouseJoySetupBtns, MEL_JOYSTICKBTNS );
1110
static MenuMenu_t M_JOYSTICKAXES = MAKE_MENUMENU( "Joystick Axes", &MMF_BigSliders, MEL_JOYSTICKAXES );
1111
static MenuMenu_t M_JOYSTICKAXES = MAKE_MENUMENU( "Joystick Axes", &MMF_BigSliders, MEL_JOYSTICKAXES );
1111
static MenuMenu_t M_KEYBOARDKEYS = MAKE_MENUMENU( "Keyboard Keys", &MMF_KeyboardSetupFuncs, MEL_KEYBOARDSETUPFUNCS );
1112
static MenuMenu_t M_KEYBOARDKEYS = MAKE_MENUMENU( "Keyboard Keys", &MMF_KeyboardSetupFuncs, MEL_KEYBOARDSETUPFUNCS );
1112
static MenuMenu_t M_MOUSEBTNS = MAKE_MENUMENU( "Mouse Buttons", &MMF_MouseJoySetupBtns, MEL_MOUSESETUPBTNS );
1113
static MenuMenu_t M_MOUSEBTNS = MAKE_MENUMENU( "Mouse Buttons", &MMF_MouseJoySetupBtns, MEL_MOUSESETUPBTNS );
1113
static MenuMenu_t M_MOUSEADVANCED = MAKE_MENUMENU( "Advanced Mouse", &MMF_BigSliders, MEL_MOUSEADVANCED );
1114
static MenuMenu_t M_MOUSEADVANCED = MAKE_MENUMENU( "Advanced Mouse", &MMF_BigSliders, MEL_MOUSEADVANCED );
1114
static MenuMenu_t M_JOYSTICKAXIS = MAKE_MENUMENU( NULL, &MMF_BigSliders, MEL_JOYSTICKAXIS );
1115
static MenuMenu_t M_JOYSTICKAXIS = MAKE_MENUMENU( NULL, &MMF_BigSliders, MEL_JOYSTICKAXIS );
1115
#ifdef USE_OPENGL
1116
#ifdef USE_OPENGL
1116
static MenuMenu_t M_RENDERERSETUP = MAKE_MENUMENU( "Advanced Video", &MMF_SmallOptions, MEL_RENDERERSETUP );
1117
static MenuMenu_t M_RENDERERSETUP = MAKE_MENUMENU( "Advanced Video", &MMF_SmallOptions, MEL_RENDERERSETUP );
1117
#endif
1118
#endif
1118
static MenuMenu_t M_COLCORR = MAKE_MENUMENU( "Color Correction", &MMF_ColorCorrect, MEL_COLCORR );
1119
static MenuMenu_t M_COLCORR = MAKE_MENUMENU( "Color Correction", &MMF_ColorCorrect, MEL_COLCORR );
1119
static MenuMenu_t M_SCREENSETUP = MAKE_MENUMENU( "Status and crosshair", &MMF_BigOptions, MEL_SCREENSETUP );
1120
static MenuMenu_t M_SCREENSETUP = MAKE_MENUMENU( "Status and crosshair", &MMF_BigOptions, MEL_SCREENSETUP );
1120
static MenuMenu_t M_DISPLAYSETUP = MAKE_MENUMENU( "Display Setup", &MMF_BigOptions, MEL_DISPLAYSETUP );
1121
static MenuMenu_t M_DISPLAYSETUP = MAKE_MENUMENU( "Display Setup", &MMF_BigOptions, MEL_DISPLAYSETUP );
1121
static MenuMenu_t M_LOAD = MAKE_MENUMENU( "Load Game", &MMF_LoadSave, MEL_LOAD );
1122
static MenuMenu_t M_LOAD = MAKE_MENUMENU( "Load Game", &MMF_LoadSave, MEL_LOAD );
1122
static MenuMenu_t M_SAVE = MAKE_MENUMENU( "Save Game", &MMF_LoadSave, MEL_SAVE );
1123
static MenuMenu_t M_SAVE = MAKE_MENUMENU( "Save Game", &MMF_LoadSave, MEL_SAVE );
1123
static MenuMenu_t M_SOUND = MAKE_MENUMENU( "Sound Setup", &MMF_BigOptions, MEL_SOUND );
1124
static MenuMenu_t M_SOUND = MAKE_MENUMENU( "Sound Setup", &MMF_BigOptions, MEL_SOUND );
1124
static MenuMenu_t M_ADVSOUND = MAKE_MENUMENU( "Advanced Sound", &MMF_BigOptions, MEL_ADVSOUND );
1125
static MenuMenu_t M_ADVSOUND = MAKE_MENUMENU( "Advanced Sound", &MMF_BigOptions, MEL_ADVSOUND );
1125
static MenuMenu_t M_NETWORK = MAKE_MENUMENU( "Network Game", &MMF_Top_Joystick_Network, MEL_NETWORK );
1126
static MenuMenu_t M_NETWORK = MAKE_MENUMENU( "Network Game", &MMF_Top_Joystick_Network, MEL_NETWORK );
1126
static MenuMenu_t M_PLAYER = MAKE_MENUMENU( "Player Setup", &MMF_SmallOptions, MEL_PLAYER );
1127
static MenuMenu_t M_PLAYER = MAKE_MENUMENU( "Player Setup", &MMF_SmallOptions, MEL_PLAYER );
1127
static MenuMenu_t M_MACROS = MAKE_MENUMENU( "Multiplayer Macros", &MMF_Macros, MEL_MACROS );
1128
static MenuMenu_t M_MACROS = MAKE_MENUMENU( "Multiplayer Macros", &MMF_Macros, MEL_MACROS );
1128
static MenuMenu_t M_NETHOST = MAKE_MENUMENU( "Host Network Game", &MMF_SmallOptionsNarrow, MEL_NETHOST );
1129
static MenuMenu_t M_NETHOST = MAKE_MENUMENU( "Host Network Game", &MMF_SmallOptionsNarrow, MEL_NETHOST );
1129
static MenuMenu_t M_NETOPTIONS = MAKE_MENUMENU( "Net Game Options", &MMF_NetSetup, MEL_NETOPTIONS );
1130
static MenuMenu_t M_NETOPTIONS = MAKE_MENUMENU( "Net Game Options", &MMF_NetSetup, MEL_NETOPTIONS );
1130
static MenuMenu_t M_NETJOIN = MAKE_MENUMENU( "Join Network Game", &MMF_SmallOptionsNarrow, MEL_NETJOIN );
1131
static MenuMenu_t M_NETJOIN = MAKE_MENUMENU( "Join Network Game", &MMF_SmallOptionsNarrow, MEL_NETJOIN );
1131
1132
1132
#ifdef DROIDMENU
1133
#ifdef DROIDMENU
1133
static MenuPanel_t M_STORY = { NoTitle, MENU_STORY, MA_Return, MENU_STORY, MA_Advance, };
1134
static MenuPanel_t M_STORY = { NoTitle, MENU_STORY, MA_Return, MENU_STORY, MA_Advance, };
1134
#else
1135
#else
1135
static MenuPanel_t M_STORY = { NoTitle, MENU_F1HELP, MA_Return, MENU_F1HELP, MA_Advance, };
1136
static MenuPanel_t M_STORY = { NoTitle, MENU_F1HELP, MA_Return, MENU_F1HELP, MA_Advance, };
1136
#endif
1137
#endif
1137
1138
1138
static MenuPanel_t M_F1HELP = { NoTitle, MENU_STORY, MA_Return, MENU_STORY, MA_Advance, };
1139
static MenuPanel_t M_F1HELP = { NoTitle, MENU_STORY, MA_Return, MENU_STORY, MA_Advance, };
1139
static const char* MenuCredits = "Credits";
1140
static const char* MenuCredits = "Credits";
1140
static MenuPanel_t M_CREDITS = { NoTitle, MENU_CREDITS5, MA_Return, MENU_CREDITS2, MA_Advance, };
1141
static MenuPanel_t M_CREDITS = { NoTitle, MENU_CREDITS5, MA_Return, MENU_CREDITS2, MA_Advance, };
1141
static MenuPanel_t M_CREDITS2 = { NoTitle, MENU_CREDITS, MA_Return, MENU_CREDITS3, MA_Advance, };
1142
static MenuPanel_t M_CREDITS2 = { NoTitle, MENU_CREDITS, MA_Return, MENU_CREDITS3, MA_Advance, };
1142
static MenuPanel_t M_CREDITS3 = { NoTitle, MENU_CREDITS2, MA_Return, MENU_CREDITS4, MA_Advance, };
1143
static MenuPanel_t M_CREDITS3 = { NoTitle, MENU_CREDITS2, MA_Return, MENU_CREDITS4, MA_Advance, };
1143
#ifdef DROIDMENU
1144
#ifdef DROIDMENU
1144
static MenuPanel_t M_CREDITS4 = { "Meltdown Collection", MENU_CREDITS3, MA_Return, MENU_CREDITS5, MA_Advance, };
1145
static MenuPanel_t M_CREDITS4 = { "Hail to the King", MENU_CREDITS3, MA_Return, MENU_CREDITS5, MA_Advance, };
1145
#else
1146
#else
1146
static MenuPanel_t M_CREDITS4 = { "About EDuke32", MENU_CREDITS3, MA_Return, MENU_CREDITS5, MA_Advance, };
1147
static MenuPanel_t M_CREDITS4 = { "About EDuke32", MENU_CREDITS3, MA_Return, MENU_CREDITS5, MA_Advance, };
1147
#endif
1148
#endif
1148
static MenuPanel_t M_CREDITS5 = { "About EDuke32", MENU_CREDITS4, MA_Return, MENU_CREDITS, MA_Advance, };
1149
static MenuPanel_t M_CREDITS5 = { "About EDuke32", MENU_CREDITS4, MA_Return, MENU_CREDITS, MA_Advance, };
1149
1150
1150
#define CURSOR_CENTER_2LINE { MENU_MARGIN_CENTER<<16, 120<<16, }
1151
#define CURSOR_CENTER_2LINE { MENU_MARGIN_CENTER<<16, 120<<16, }
1151
#define CURSOR_CENTER_3LINE { MENU_MARGIN_CENTER<<16, 129<<16, }
1152
#define CURSOR_CENTER_3LINE { MENU_MARGIN_CENTER<<16, 129<<16, }
1152
#define CURSOR_BOTTOMRIGHT { 304<<16, 186<<16, }
1153
#define CURSOR_BOTTOMRIGHT { 304<<16, 186<<16, }
1153
1154
1154
static MenuVerify_t M_QUIT = { CURSOR_CENTER_2LINE, MENU_CLOSE, MA_None, };
1155
static MenuVerify_t M_QUIT = { CURSOR_CENTER_2LINE, MENU_CLOSE, MA_None, };
1155
static MenuVerify_t M_QUITTOTITLE = { CURSOR_CENTER_2LINE, MENU_CLOSE, MA_None, };
1156
static MenuVerify_t M_QUITTOTITLE = { CURSOR_CENTER_2LINE, MENU_CLOSE, MA_None, };
1156
static MenuVerify_t M_LOADVERIFY = { CURSOR_CENTER_3LINE, MENU_CLOSE, MA_None, };
1157
static MenuVerify_t M_LOADVERIFY = { CURSOR_CENTER_3LINE, MENU_CLOSE, MA_None, };
1157
static MenuVerify_t M_NEWVERIFY = { CURSOR_CENTER_2LINE, MENU_EPISODE, MA_Advance, };
1158
static MenuVerify_t M_NEWVERIFY = { CURSOR_CENTER_2LINE, MENU_EPISODE, MA_Advance, };
1158
static MenuVerify_t M_SAVEVERIFY = { CURSOR_CENTER_2LINE, MENU_SAVE, MA_None, };
1159
static MenuVerify_t M_SAVEVERIFY = { CURSOR_CENTER_2LINE, MENU_SAVE, MA_None, };
1159
static MenuVerify_t M_RESETPLAYER = { CURSOR_CENTER_3LINE, MENU_CLOSE, MA_None, };
1160
static MenuVerify_t M_RESETPLAYER = { CURSOR_CENTER_3LINE, MENU_CLOSE, MA_None, };
1160
1161
1161
static MenuMessage_t M_NETWAITMASTER = { CURSOR_BOTTOMRIGHT, MENU_NULL, MA_None, };
1162
static MenuMessage_t M_NETWAITMASTER = { CURSOR_BOTTOMRIGHT, MENU_NULL, MA_None, };
1162
static MenuMessage_t M_NETWAITVOTES = { CURSOR_BOTTOMRIGHT, MENU_NULL, MA_None, };
1163
static MenuMessage_t M_NETWAITVOTES = { CURSOR_BOTTOMRIGHT, MENU_NULL, MA_None, };
1163
static MenuMessage_t M_BUYDUKE = { CURSOR_BOTTOMRIGHT, MENU_EPISODE, MA_Return, };
1164
static MenuMessage_t M_BUYDUKE = { CURSOR_BOTTOMRIGHT, MENU_EPISODE, MA_Return, };
1164
1165
1165
static MenuPassword_t M_ADULTPASSWORD = { NULL, MAXPWLOCKOUT };
1166
static MenuPassword_t M_ADULTPASSWORD = { NULL, MAXPWLOCKOUT };
1166
1167
1167
#define MAKE_MENUFILESELECT(a, b, c) { a, { &MMF_FileSelectLeft, &MMF_FileSelectRight }, { &MF_Minifont, &MF_MinifontRed }, b, c, { NULL, NULL }, { 0, 0 }, { 3<<16, 3<<16 }, FNLIST_INITIALIZER, 0 }
1168
#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 }
1168
1169
1169
static MenuFileSelect_t M_USERMAP = MAKE_MENUFILESELECT( "Select A User Map", "*.map", boardfilename );
1170
static MenuFileSelect_t M_USERMAP = MAKE_MENUFILESELECT( "Select A User Map", "*.map", boardfilename );
1170
1171
1171
// MUST be in ascending order of MenuID enum values due to binary search
1172
// MUST be in ascending order of MenuID enum values due to binary search
1172
static Menu_t Menus[] = {
1173
static Menu_t Menus[] = {
1173
    { &M_MAIN, MENU_MAIN, MENU_CLOSE, MA_None, Menu },
1174
    { &M_MAIN, MENU_MAIN, MENU_CLOSE, MA_None, Menu },
1174
    { &M_MAIN_INGAME, MENU_MAIN_INGAME, MENU_CLOSE, MA_None, Menu },
1175
    { &M_MAIN_INGAME, MENU_MAIN_INGAME, MENU_CLOSE, MA_None, Menu },
1175
    { &M_EPISODE, MENU_EPISODE, MENU_MAIN, MA_Return, Menu },
1176
    { &M_EPISODE, MENU_EPISODE, MENU_MAIN, MA_Return, Menu },
1176
    { &M_USERMAP, MENU_USERMAP, MENU_EPISODE, MA_Return, FileSelect },
1177
    { &M_USERMAP, MENU_USERMAP, MENU_EPISODE, MA_Return, FileSelect },
1177
    { &M_SKILL, MENU_SKILL, MENU_EPISODE, MA_Return, Menu },
1178
    { &M_SKILL, MENU_SKILL, MENU_EPISODE, MA_Return, Menu },
1178
    { &M_GAMESETUP, MENU_GAMESETUP, MENU_OPTIONS, MA_Return, Menu },
1179
    { &M_GAMESETUP, MENU_GAMESETUP, MENU_OPTIONS, MA_Return, Menu },
1179
    { &M_OPTIONS, MENU_OPTIONS, MENU_MAIN, MA_Return, Menu },
1180
    { &M_OPTIONS, MENU_OPTIONS, MENU_MAIN, MA_Return, Menu },
1180
    { &M_VIDEOSETUP, MENU_VIDEOSETUP, MENU_DISPLAYSETUP, MA_Return, Menu },
1181
    { &M_VIDEOSETUP, MENU_VIDEOSETUP, MENU_DISPLAYSETUP, MA_Return, Menu },
1181
    { &M_KEYBOARDSETUP, MENU_KEYBOARDSETUP, MENU_CONTROLS, MA_Return, Menu },
1182
    { &M_KEYBOARDSETUP, MENU_KEYBOARDSETUP, MENU_CONTROLS, MA_Return, Menu },
1182
    { &M_MOUSESETUP, MENU_MOUSESETUP, MENU_CONTROLS, MA_Return, Menu },
1183
    { &M_MOUSESETUP, MENU_MOUSESETUP, MENU_CONTROLS, MA_Return, Menu },
1183
    { &M_JOYSTICKSETUP, MENU_JOYSTICKSETUP, MENU_CONTROLS, MA_Return, Menu },
1184
    { &M_JOYSTICKSETUP, MENU_JOYSTICKSETUP, MENU_CONTROLS, MA_Return, Menu },
1184
    { &M_JOYSTICKBTNS, MENU_JOYSTICKBTNS, MENU_JOYSTICKSETUP, MA_Return, Menu },
1185
    { &M_JOYSTICKBTNS, MENU_JOYSTICKBTNS, MENU_JOYSTICKSETUP, MA_Return, Menu },
1185
    { &M_JOYSTICKAXES, MENU_JOYSTICKAXES, MENU_JOYSTICKSETUP, MA_Return, Menu },
1186
    { &M_JOYSTICKAXES, MENU_JOYSTICKAXES, MENU_JOYSTICKSETUP, MA_Return, Menu },
1186
    { &M_KEYBOARDKEYS, MENU_KEYBOARDKEYS, MENU_KEYBOARDSETUP, MA_Return, Menu },
1187
    { &M_KEYBOARDKEYS, MENU_KEYBOARDKEYS, MENU_KEYBOARDSETUP, MA_Return, Menu },
1187
    { &M_MOUSEBTNS, MENU_MOUSEBTNS, MENU_MOUSESETUP, MA_Return, Menu },
1188
    { &M_MOUSEBTNS, MENU_MOUSEBTNS, MENU_MOUSESETUP, MA_Return, Menu },
1188
    { &M_MOUSEADVANCED, MENU_MOUSEADVANCED, MENU_MOUSESETUP, MA_Return, Menu },
1189
    { &M_MOUSEADVANCED, MENU_MOUSEADVANCED, MENU_MOUSESETUP, MA_Return, Menu },
1189
    { &M_JOYSTICKAXIS, MENU_JOYSTICKAXIS, MENU_JOYSTICKAXES, MA_Return, Menu },
1190
    { &M_JOYSTICKAXIS, MENU_JOYSTICKAXIS, MENU_JOYSTICKAXES, MA_Return, Menu },
1190
#ifdef DROIDMENU
1191
#ifdef DROIDMENU
1191
    { &M_TOUCHSETUP, MENU_TOUCHSETUP, MENU_OPTIONS, MA_Return, Menu },
1192
    { &M_TOUCHSETUP, MENU_TOUCHSETUP, MENU_OPTIONS, MA_Return, Menu },
1192
#endif
1193
#endif
1193
    { &M_CONTROLS, MENU_CONTROLS, MENU_OPTIONS, MA_Return, Menu },
1194
    { &M_CONTROLS, MENU_CONTROLS, MENU_OPTIONS, MA_Return, Menu },
1194
#ifdef USE_OPENGL
1195
#ifdef USE_OPENGL
1195
    { &M_RENDERERSETUP, MENU_RENDERERSETUP, MENU_DISPLAYSETUP, MA_Return, Menu },
1196
    { &M_RENDERERSETUP, MENU_RENDERERSETUP, MENU_DISPLAYSETUP, MA_Return, Menu },
1196
#endif
1197
#endif
1197
    { &M_COLCORR, MENU_COLCORR, MENU_DISPLAYSETUP, MA_Return, Menu },
1198
    { &M_COLCORR, MENU_COLCORR, MENU_DISPLAYSETUP, MA_Return, Menu },
1198
    { &M_COLCORR, MENU_COLCORR_INGAME, MENU_CLOSE, MA_Return, Menu },
1199
    { &M_COLCORR, MENU_COLCORR_INGAME, MENU_CLOSE, MA_Return, Menu },
1199
    { &M_SCREENSETUP, MENU_SCREENSETUP, MENU_DISPLAYSETUP, MA_Return, Menu },
1200
    { &M_SCREENSETUP, MENU_SCREENSETUP, MENU_DISPLAYSETUP, MA_Return, Menu },
1200
    { &M_DISPLAYSETUP, MENU_DISPLAYSETUP, MENU_OPTIONS, MA_Return, Menu },
1201
    { &M_DISPLAYSETUP, MENU_DISPLAYSETUP, MENU_OPTIONS, MA_Return, Menu },
1201
    { &M_LOAD, MENU_LOAD, MENU_MAIN, MA_Return, Menu },
1202
    { &M_LOAD, MENU_LOAD, MENU_MAIN, MA_Return, Menu },
1202
    { &M_SAVE, MENU_SAVE, MENU_MAIN, MA_Return, Menu },
1203
    { &M_SAVE, MENU_SAVE, MENU_MAIN, MA_Return, Menu },
1203
    { &M_STORY, MENU_STORY, MENU_MAIN, MA_Return, Panel },
1204
    { &M_STORY, MENU_STORY, MENU_MAIN, MA_Return, Panel },
1204
    { &M_F1HELP, MENU_F1HELP, MENU_MAIN, MA_Return, Panel },
1205
    { &M_F1HELP, MENU_F1HELP, MENU_MAIN, MA_Return, Panel },
1205
    { &M_QUIT, MENU_QUIT, MENU_PREVIOUS, MA_Return, Verify },
1206
    { &M_QUIT, MENU_QUIT, MENU_PREVIOUS, MA_Return, Verify },
1206
    { &M_QUITTOTITLE, MENU_QUITTOTITLE, MENU_PREVIOUS, MA_Return, Verify },
1207
    { &M_QUITTOTITLE, MENU_QUITTOTITLE, MENU_PREVIOUS, MA_Return, Verify },
1207
    { &M_QUIT, MENU_QUIT_INGAME, MENU_CLOSE, MA_None, Verify },
1208
    { &M_QUIT, MENU_QUIT_INGAME, MENU_CLOSE, MA_None, Verify },
1208
    { &M_NETHOST, MENU_NETSETUP, MENU_MAIN, MA_Return, Menu },
1209
    { &M_NETHOST, MENU_NETSETUP, MENU_MAIN, MA_Return, Menu },
1209
    { &M_NETWAITMASTER, MENU_NETWAITMASTER, MENU_MAIN, MA_Return, Message },
1210
    { &M_NETWAITMASTER, MENU_NETWAITMASTER, MENU_MAIN, MA_Return, Message },
1210
    { &M_NETWAITVOTES, MENU_NETWAITVOTES, MENU_MAIN, MA_Return, Message },
1211
    { &M_NETWAITVOTES, MENU_NETWAITVOTES, MENU_MAIN, MA_Return, Message },
1211
    { &M_SOUND, MENU_SOUND, MENU_OPTIONS, MA_Return, Menu },
1212
    { &M_SOUND, MENU_SOUND, MENU_OPTIONS, MA_Return, Menu },
1212
    { &M_SOUND, MENU_SOUND_INGAME, MENU_CLOSE, MA_Return, Menu },
1213
    { &M_SOUND, MENU_SOUND_INGAME, MENU_CLOSE, MA_Return, Menu },
1213
    { &M_ADVSOUND, MENU_ADVSOUND, MENU_SOUND, MA_Return, Menu },
1214
    { &M_ADVSOUND, MENU_ADVSOUND, MENU_SOUND, MA_Return, Menu },
1214
    { &M_CREDITS, MENU_CREDITS, MENU_MAIN, MA_Return, Panel },
1215
    { &M_CREDITS, MENU_CREDITS, MENU_MAIN, MA_Return, Panel },
1215
    { &M_CREDITS2, MENU_CREDITS2, MENU_MAIN, MA_Return, Panel },
1216
    { &M_CREDITS2, MENU_CREDITS2, MENU_MAIN, MA_Return, Panel },
1216
    { &M_CREDITS3, MENU_CREDITS3, MENU_MAIN, MA_Return, Panel },
1217
    { &M_CREDITS3, MENU_CREDITS3, MENU_MAIN, MA_Return, Panel },
1217
    { &M_CREDITS4, MENU_CREDITS4, MENU_MAIN, MA_Return, Panel },
1218
    { &M_CREDITS4, MENU_CREDITS4, MENU_MAIN, MA_Return, Panel },
1218
    { &M_CREDITS5, MENU_CREDITS5, MENU_MAIN, MA_Return, Panel },
1219
    { &M_CREDITS5, MENU_CREDITS5, MENU_MAIN, MA_Return, Panel },
1219
    { &M_LOADVERIFY, MENU_LOADVERIFY, MENU_LOAD, MA_None, Verify },
1220
    { &M_LOADVERIFY, MENU_LOADVERIFY, MENU_LOAD, MA_None, Verify },
1220
    { &M_NEWVERIFY, MENU_NEWVERIFY, MENU_MAIN, MA_Return, Verify },
1221
    { &M_NEWVERIFY, MENU_NEWVERIFY, MENU_MAIN, MA_Return, Verify },
1221
    { &M_SAVEVERIFY, MENU_SAVEVERIFY, MENU_SAVE, MA_None, Verify },
1222
    { &M_SAVEVERIFY, MENU_SAVEVERIFY, MENU_SAVE, MA_None, Verify },
1222
    { &M_ADULTPASSWORD, MENU_ADULTPASSWORD, MENU_GAMESETUP, MA_None, Password },
1223
    { &M_ADULTPASSWORD, MENU_ADULTPASSWORD, MENU_GAMESETUP, MA_None, Password },
1223
    { &M_RESETPLAYER, MENU_RESETPLAYER, MENU_CLOSE, MA_None, Verify },
1224
    { &M_RESETPLAYER, MENU_RESETPLAYER, MENU_CLOSE, MA_None, Verify },
1224
    { &M_BUYDUKE, MENU_BUYDUKE, MENU_EPISODE, MA_Return, Message },
1225
    { &M_BUYDUKE, MENU_BUYDUKE, MENU_EPISODE, MA_Return, Message },
1225
    { &M_NETWORK, MENU_NETWORK, MENU_MAIN, MA_Return, Menu },
1226
    { &M_NETWORK, MENU_NETWORK, MENU_MAIN, MA_Return, Menu },
1226
    { &M_PLAYER, MENU_PLAYER, MENU_OPTIONS, MA_Return, Menu },
1227
    { &M_PLAYER, MENU_PLAYER, MENU_OPTIONS, MA_Return, Menu },
1227
    { &M_MACROS, MENU_MACROS, MENU_PLAYER, MA_Return, Menu },
1228
    { &M_MACROS, MENU_MACROS, MENU_PLAYER, MA_Return, Menu },
1228
    { &M_NETHOST, MENU_NETHOST, MENU_NETWORK, MA_Return, Menu },
1229
    { &M_NETHOST, MENU_NETHOST, MENU_NETWORK, MA_Return, Menu },
1229
    { &M_NETOPTIONS, MENU_NETOPTIONS, MENU_NETWORK, MA_Return, Menu },
1230
    { &M_NETOPTIONS, MENU_NETOPTIONS, MENU_NETWORK, MA_Return, Menu },
1230
    { &M_USERMAP, MENU_NETUSERMAP, MENU_NETOPTIONS, MA_Return, FileSelect },
1231
    { &M_USERMAP, MENU_NETUSERMAP, MENU_NETOPTIONS, MA_Return, FileSelect },
1231
    { &M_NETJOIN, MENU_NETJOIN, MENU_NETWORK, MA_Return, Menu },
1232
    { &M_NETJOIN, MENU_NETJOIN, MENU_NETWORK, MA_Return, Menu },
1232
};
1233
};
1233
1234
1234
static const size_t numMenus = ARRAY_SIZE(Menus);
1235
static const size_t numMenus = ARRAY_SIZE(Menus);
1235
1236
1236
Menu_t *m_currentMenu = &Menus[0];
1237
Menu_t *m_currentMenu = &Menus[0];
1237
static Menu_t *m_previousMenu = &Menus[0];
1238
static Menu_t *m_previousMenu = &Menus[0];
1238
1239
1239
MenuID_t g_currentMenu;
1240
MenuID_t g_currentMenu;
1240
static MenuID_t g_previousMenu;
1241
static MenuID_t g_previousMenu;
1241
1242
1242
#define MenuMenu_ChangeEntryList(m, el)\
1243
#define MenuMenu_ChangeEntryList(m, el)\
1243
    do {\
1244
    do {\
1244
        m.entrylist = el;\
1245
        m.entrylist = el;\
1245
        m.numEntries = ARRAY_SIZE(el);\
1246
        m.numEntries = ARRAY_SIZE(el);\
1246
    } while (0)
1247
    } while (0)
1247
1248
1248
static void MenuEntry_DisableOnCondition(MenuEntry_t * const entry, const int32_t condition)
1249
static void MenuEntry_DisableOnCondition(MenuEntry_t * const entry, const int32_t condition)
1249
{
1250
{
1250
    if (condition)
1251
    if (condition)
1251
        entry->flags |= Disabled;
1252
        entry->flags |= Disabled;
1252
    else
1253
    else
1253
        entry->flags &= ~Disabled;
1254
        entry->flags &= ~Disabled;
1254
}
1255
}
1255
1256
1256
/*
1257
/*
1257
This function prepares data after ART and CON have been processed.
1258
This function prepares data after ART and CON have been processed.
1258
It also initializes some data in loops rather than statically at compile time.
1259
It also initializes some data in loops rather than statically at compile time.
1259
*/
1260
*/
1260
void M_Init(void)
1261
void M_Init(void)
1261
{
1262
{
1262
    int32_t i, j, k;
1263
    int32_t i, j, k;
1263
1264
1264
    // prepare menu fonts
1265
    // prepare menu fonts
1265
    MF_Redfont.tilenum = MF_RedfontBlue.tilenum = MF_RedfontGreen.tilenum = BIGALPHANUM;
1266
    MF_Redfont.tilenum = MF_RedfontBlue.tilenum = MF_RedfontGreen.tilenum = BIGALPHANUM;
1266
    MF_Bluefont.tilenum = MF_BluefontRed.tilenum = STARTALPHANUM;
1267
    MF_Bluefont.tilenum = MF_BluefontRed.tilenum = STARTALPHANUM;
1267
    MF_Minifont.tilenum = MF_MinifontRed.tilenum = MF_MinifontDarkGray.tilenum = MINIFONT;
1268
    MF_Minifont.tilenum = MF_MinifontRed.tilenum = MF_MinifontDarkGray.tilenum = MINIFONT;
1268
    if (!minitext_lowercase)
1269
    if (!minitext_lowercase)
1269
    {
1270
    {
1270
        MF_Minifont.textflags |= TEXT_UPPERCASE;
1271
        MF_Minifont.textflags |= TEXT_UPPERCASE;
1271
        MF_MinifontRed.textflags |= TEXT_UPPERCASE;
1272
        MF_MinifontRed.textflags |= TEXT_UPPERCASE;
1272
        MF_MinifontDarkGray.textflags |= TEXT_UPPERCASE;
1273
        MF_MinifontDarkGray.textflags |= TEXT_UPPERCASE;
1273
    }
1274
    }
1274
1275
1275
    // prepare gamefuncs and keys
1276
    // prepare gamefuncs and keys
1276
    for (i = 0; i < NUMGAMEFUNCTIONS; ++i)
1277
    for (i = 0; i < NUMGAMEFUNCTIONS; ++i)
1277
    {
1278
    {
1278
        Bstrcpy(MenuGameFuncs[i], gamefunctions[i]);
1279
        Bstrcpy(MenuGameFuncs[i], gamefunctions[i]);
1279
1280
1280
        for (j = 0; j < MAXGAMEFUNCLEN; ++j)
1281
        for (j = 0; j < MAXGAMEFUNCLEN; ++j)
1281
            if (MenuGameFuncs[i][j] == '_')
1282
            if (MenuGameFuncs[i][j] == '_')
1282
                MenuGameFuncs[i][j] = ' ';
1283
                MenuGameFuncs[i][j] = ' ';
1283
1284
1284
        MEOSN_Gamefuncs[i] = MenuGameFuncs[i];
1285
        MEOSN_Gamefuncs[i] = MenuGameFuncs[i];
1285
    }
1286
    }
1286
    MEOSN_Gamefuncs[NUMGAMEFUNCTIONS] = MenuGameFuncNone;
1287
    MEOSN_Gamefuncs[NUMGAMEFUNCTIONS] = MenuGameFuncNone;
1287
    for (i = 0; i < NUMKEYS; ++i)
1288
    for (i = 0; i < NUMKEYS; ++i)
1288
        MEOSN_Keys[i] = key_names[i];
1289
        MEOSN_Keys[i] = key_names[i];
1289
    MEOSN_Keys[NUMKEYS-1] = MenuKeyNone;
1290
    MEOSN_Keys[NUMKEYS-1] = MenuKeyNone;
1290
1291
1291
1292
1292
    // prepare episodes
1293
    // prepare episodes
1293
    k = -1;
1294
    k = -1;
1294
    for (i = 0; i < g_numVolumes; ++i)
1295
    for (i = 0; i < g_numVolumes; ++i)
1295
    {
1296
    {
1296
        if (EpisodeNames[i][0])
1297
        if (EpisodeNames[i][0])
1297
        {
1298
        {
1298
            MEL_EPISODE[i] = &ME_EPISODE[i];
1299
            MEL_EPISODE[i] = &ME_EPISODE[i];
1299
            ME_EPISODE[i] = ME_EPISODE_TEMPLATE;
1300
            ME_EPISODE[i] = ME_EPISODE_TEMPLATE;
1300
            ME_EPISODE[i].name = EpisodeNames[i];
1301
            ME_EPISODE[i].name = EpisodeNames[i];
1301
1302
1302
            MEOSN_NetEpisodes[i] = EpisodeNames[i];
1303
            MEOSN_NetEpisodes[i] = EpisodeNames[i];
1303
1304
1304
            k = i;
1305
            k = i;
1305
        }
1306
        }
1306
1307
1307
        // prepare levels
1308
        // prepare levels
1308
        for (j = 0; j < MAXLEVELS; ++j)
1309
        for (j = 0; j < MAXLEVELS; ++j)
1309
        {
1310
        {
1310
            MEOSN_NetLevels[i][j] = MapInfo[MAXLEVELS*i+j].name;
1311
            MEOSN_NetLevels[i][j] = MapInfo[MAXLEVELS*i+j].name;
1311
            if (MapInfo[i*MAXLEVELS+j].filename != NULL)
1312
            if (MapInfo[i*MAXLEVELS+j].filename != NULL)
1312
                MEOS_NETOPTIONS_LEVEL[i].numOptions = j+1;
1313
                MEOS_NETOPTIONS_LEVEL[i].numOptions = j+1;
1313
        }
1314
        }
1314
        MEOS_NETOPTIONS_LEVEL[i].optionNames = MEOSN_NetLevels[i];
1315
        MEOS_NETOPTIONS_LEVEL[i].optionNames = MEOSN_NetLevels[i];
1315
    }
1316
    }
1316
    ++k;
1317
    ++k;
1317
    M_EPISODE.numEntries = g_numVolumes+2; // k;
1318
    M_EPISODE.numEntries = g_numVolumes+2; // k;
1318
    MEL_EPISODE[g_numVolumes] = &ME_Space4;
1319
    MEL_EPISODE[g_numVolumes] = &ME_Space4;
1319
    MEL_EPISODE[g_numVolumes+1] = &ME_EPISODE_USERMAP;
1320
    MEL_EPISODE[g_numVolumes+1] = &ME_EPISODE_USERMAP;
1320
    MEOS_NETOPTIONS_EPISODE.numOptions = g_numVolumes + 1; // k+1;
1321
    MEOS_NETOPTIONS_EPISODE.numOptions = g_numVolumes + 1; // k+1;
1321
    MEOSN_NetEpisodes[g_numVolumes] = MenuUserMap;
1322
    MEOSN_NetEpisodes[g_numVolumes] = MenuUserMap;
1322
    MMF_Top_Episode.pos.y = (48-(g_numVolumes*2))<<16;
1323
    MMF_Top_Episode.pos.y = (48-(g_numVolumes*2))<<16;
1323
    if (g_numSkills == 0)
1324
    if (g_numSkills == 0)
1324
        MEO_EPISODE.linkID = MENU_NULL;
1325
        MEO_EPISODE.linkID = MENU_NULL;
1325
1326
1326
    // prepare skills
1327
    // prepare skills
1327
    k = -1;
1328
    k = -1;
1328
    for (i = 0; i < g_numSkills && SkillNames[i][0]; ++i)
1329
    for (i = 0; i < g_numSkills && SkillNames[i][0]; ++i)
1329
    {
1330
    {
1330
        MEL_SKILL[i] = &ME_SKILL[i];
1331
        MEL_SKILL[i] = &ME_SKILL[i];
1331
        ME_SKILL[i] = ME_SKILL_TEMPLATE;
1332
        ME_SKILL[i] = ME_SKILL_TEMPLATE;
1332
        ME_SKILL[i].name = SkillNames[i];
1333
        ME_SKILL[i].name = SkillNames[i];
1333
1334
1334
        MEOSN_NetSkills[i] = SkillNames[i];
1335
        MEOSN_NetSkills[i] = SkillNames[i];
1335
1336
1336
        k = i;
1337
        k = i;
1337
    }
1338
    }
1338
    ++k;
1339
    ++k;
1339
    M_SKILL.numEntries = g_numSkills; // k;
1340
    M_SKILL.numEntries = g_numSkills; // k;
1340
    MEOS_NETOPTIONS_MONSTERS.numOptions = g_numSkills + 1; // k+1;
1341
    MEOS_NETOPTIONS_MONSTERS.numOptions = g_numSkills + 1; // k+1;
1341
    MEOSN_NetSkills[g_numSkills] = MenuSkillNone;
1342
    MEOSN_NetSkills[g_numSkills] = MenuSkillNone;
1342
    MMF_Top_Skill.pos.y = (58 + (4-g_numSkills)*6)<<16;
1343
    MMF_Top_Skill.pos.y = (58 + (4-g_numSkills)*6)<<16;
1343
    M_SKILL.currentEntry = 1;
1344
    M_SKILL.currentEntry = 1;
1344
1345
1345
    // prepare multiplayer gametypes
1346
    // prepare multiplayer gametypes
1346
    k = -1;
1347
    k = -1;
1347
    for (i = 0; i < MAXGAMETYPES; ++i)
1348
    for (i = 0; i < MAXGAMETYPES; ++i)
1348
        if (GametypeNames[i][0])
1349
        if (GametypeNames[i][0])
1349
        {
1350
        {
1350
            MEOSN_NetGametypes[i] = GametypeNames[i];
1351
            MEOSN_NetGametypes[i] = GametypeNames[i];
1351
            k = i;
1352
            k = i;
1352
        }
1353
        }
1353
    ++k;
1354
    ++k;
1354
    MEOS_NETOPTIONS_GAMETYPE.numOptions = k;
1355
    MEOS_NETOPTIONS_GAMETYPE.numOptions = k;
1355
1356
1356
    // prepare savegames
1357
    // prepare savegames
1357
    for (i = 0; i < MAXSAVEGAMES; ++i)
1358
    for (i = 0; i < MAXSAVEGAMES; ++i)
1358
    {
1359
    {
1359
        MEL_LOAD[i] = &ME_LOAD[i];
1360
        MEL_LOAD[i] = &ME_LOAD[i];
1360
        MEL_SAVE[i] = &ME_SAVE[i];
1361
        MEL_SAVE[i] = &ME_SAVE[i];
1361
        ME_LOAD[i] = ME_LOAD_TEMPLATE;
1362
        ME_LOAD[i] = ME_LOAD_TEMPLATE;
1362
        ME_SAVE[i] = ME_SAVE_TEMPLATE;
1363
        ME_SAVE[i] = ME_SAVE_TEMPLATE;
1363
        ME_SAVE[i].entry = &MEO_SAVE[i];
1364
        ME_SAVE[i].entry = &MEO_SAVE[i];
1364
        MEO_SAVE[i] = MEO_SAVE_TEMPLATE;
1365
        MEO_SAVE[i] = MEO_SAVE_TEMPLATE;
1365
1366
1366
        ME_LOAD[i].name = ud.savegame[i];
1367
        ME_LOAD[i].name = ud.savegame[i];
1367
        MEO_SAVE[i].variable = ud.savegame[i];
1368
        MEO_SAVE[i].variable = ud.savegame[i];
1368
    }
1369
    }
1369
1370
1370
    // prepare text chat macros
1371
    // prepare text chat macros
1371
    for (i = 0; i < MAXRIDECULE; ++i)
1372
    for (i = 0; i < MAXRIDECULE; ++i)
1372
    {
1373
    {
1373
        MEL_MACROS[i] = &ME_MACROS[i];
1374
        MEL_MACROS[i] = &ME_MACROS[i];
1374
        ME_MACROS[i] = ME_MACROS_TEMPLATE;
1375
        ME_MACROS[i] = ME_MACROS_TEMPLATE;
1375
        ME_MACROS[i].entry = &MEO_MACROS[i];
1376
        ME_MACROS[i].entry = &MEO_MACROS[i];
1376
        MEO_MACROS[i] = MEO_MACROS_TEMPLATE;
1377
        MEO_MACROS[i] = MEO_MACROS_TEMPLATE;
1377
1378
1378
        MEO_MACROS[i].variable = ud.ridecule[i];
1379
        MEO_MACROS[i].variable = ud.ridecule[i];
1379
    }
1380
    }
1380
1381
1381
    // prepare input
1382
    // prepare input
1382
    for (i = 0; i < NUMGAMEFUNCTIONS; ++i)
1383
    for (i = 0; i < NUMGAMEFUNCTIONS; ++i)
1383
    {
1384
    {
1384
        MEL_KEYBOARDSETUPFUNCS[i] = &ME_KEYBOARDSETUPFUNCS[i];
1385
        MEL_KEYBOARDSETUPFUNCS[i] = &ME_KEYBOARDSETUPFUNCS[i];
1385
        ME_KEYBOARDSETUPFUNCS[i] = ME_KEYBOARDSETUPFUNCS_TEMPLATE;
1386
        ME_KEYBOARDSETUPFUNCS[i] = ME_KEYBOARDSETUPFUNCS_TEMPLATE;
1386
        ME_KEYBOARDSETUPFUNCS[i].name = MenuGameFuncs[i];
1387
        ME_KEYBOARDSETUPFUNCS[i].name = MenuGameFuncs[i];
1387
        ME_KEYBOARDSETUPFUNCS[i].entry = &MEO_KEYBOARDSETUPFUNCS[i];
1388
        ME_KEYBOARDSETUPFUNCS[i].entry = &MEO_KEYBOARDSETUPFUNCS[i];
1388
        MEO_KEYBOARDSETUPFUNCS[i] = MEO_KEYBOARDSETUPFUNCS_TEMPLATE;
1389
        MEO_KEYBOARDSETUPFUNCS[i] = MEO_KEYBOARDSETUPFUNCS_TEMPLATE;
1389
        MEO_KEYBOARDSETUPFUNCS[i].column[0] = &ud.config.KeyboardKeys[i][0];
1390
        MEO_KEYBOARDSETUPFUNCS[i].column[0] = &ud.config.KeyboardKeys[i][0];
1390
        MEO_KEYBOARDSETUPFUNCS[i].column[1] = &ud.config.KeyboardKeys[i][1];
1391
        MEO_KEYBOARDSETUPFUNCS[i].column[1] = &ud.config.KeyboardKeys[i][1];
1391
    }
1392
    }
1392
    for (i = 0; i < MENUMOUSEFUNCTIONS; ++i)
1393
    for (i = 0; i < MENUMOUSEFUNCTIONS; ++i)
1393
    {
1394
    {
1394
        MEL_MOUSESETUPBTNS[i] = &ME_MOUSESETUPBTNS[i];
1395
        MEL_MOUSESETUPBTNS[i] = &ME_MOUSESETUPBTNS[i];
1395
        ME_MOUSESETUPBTNS[i] = ME_MOUSEJOYSETUPBTNS_TEMPLATE;
1396
        ME_MOUSESETUPBTNS[i] = ME_MOUSEJOYSETUPBTNS_TEMPLATE;
1396
        ME_MOUSESETUPBTNS[i].name = MenuMouseNames[i];
1397
        ME_MOUSESETUPBTNS[i].name = MenuMouseNames[i];
1397
        ME_MOUSESETUPBTNS[i].entry = &MEO_MOUSESETUPBTNS[i];
1398
        ME_MOUSESETUPBTNS[i].entry = &MEO_MOUSESETUPBTNS[i];
1398
        MEO_MOUSESETUPBTNS[i] = MEO_MOUSEJOYSETUPBTNS_TEMPLATE;
1399
        MEO_MOUSESETUPBTNS[i] = MEO_MOUSEJOYSETUPBTNS_TEMPLATE;
1399
        MEO_MOUSESETUPBTNS[i].data = &ud.config.MouseFunctions[MenuMouseDataIndex[i][0]][MenuMouseDataIndex[i][1]];
1400
        MEO_MOUSESETUPBTNS[i].data = &ud.config.MouseFunctions[MenuMouseDataIndex[i][0]][MenuMouseDataIndex[i][1]];
1400
    }
1401
    }
1401
    for (i = 0; i < 2*joynumbuttons + 8*joynumhats; ++i)
1402
    for (i = 0; i < 2*joynumbuttons + 8*joynumhats; ++i)
1402
    {
1403
    {
1403
        if (i < 2*joynumbuttons)
1404
        if (i < 2*joynumbuttons)
1404
        {
1405
        {
1405
            if