summaryrefslogtreecommitdiff
path: root/src/menus.h
blob: 7a64c30090d0641984c8391dbe42c142766569d6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
#ifndef MENUS_H
#define MENUS_H

#include <common_structs.h>
#include <defines.h>

// gSubMenuSelection is position on options screen?
enum MenuOptionsCursorPositions { MENU_OPTIONS_CSRPOS_SOUNDMODE = 0x16 };

// needs to be a union (or array...?) to go into rodata as a const
// terrible for endianness... Best guess as to what this is for..
union GameModePack {
    u8 modes[4];
    s32 word;
};

/**
 * @brief Options for gMenuFadeType
 */
enum MenuFadeTypes {
    MENU_FADE_TYPE_MAIN,
    MENU_FADE_TYPE_BACK,
    MENU_FADE_TYPE_DEMO,
    MENU_FADE_TYPE_DATA,
    MENU_FADE_TYPE_OPTION,
    MENU_FADE_TYPE_MAX
};

/**
 * @brief Options for gSubMenuSelection
 */
enum SubMenuSelectionType {
    SUB_MENU_NONE,
    SUB_MENU_DATA, // 0x01, value repurposed in map select
    SUB_MENU_MAP_SELECT_CUP = 0x01,
    SUB_MENU_MAP_SELECT_COURSE,
    SUB_MENU_MAP_SELECT_OK,
    SUB_MENU_MAP_SELECT_BATTLE_COURSE,
    SUB_MENU_DATA_OPTIONS = 0x0B,
    SUB_MENU_DATA_ERASE_CONFIRM,
    SUB_MENU_DATA_CANT_ERASE,
    SUB_MENU_OPTION_MIN = 0x15,
    SUB_MENU_OPTION_RETURN_GAME_SELECT = SUB_MENU_OPTION_MIN,
    SUB_MENU_OPTION_SOUND_MODE,
    SUB_MENU_OPTION_COPY_CONTROLLER_PAK,
    SUB_MENU_OPTION_ERASE_ALL_DATA,
    SUB_MENU_OPTION_MAX = SUB_MENU_OPTION_ERASE_ALL_DATA, // 0x18
    SUB_MENU_ERASE_MIN = 0x1E,
    SUB_MENU_ERASE_QUIT = SUB_MENU_ERASE_MIN,
    SUB_MENU_ERASE_ERASE,
    SUB_MENU_ERASE_MAX = SUB_MENU_ERASE_ERASE, // 0x1F
    SUB_MENU_SAVE_DATA_ERASED,                 // 0x20
    SUB_MENU_COPY_PAK_FROM_GHOST_MIN = 0x28,
    SUB_MENU_COPY_PAK_FROM_GHOST1_1P = SUB_MENU_COPY_PAK_FROM_GHOST_MIN,
    SUB_MENU_COPY_PAK_FROM_GHOST2_1P,
    SUB_MENU_COPY_PAK_FROM_GHOST_MAX = SUB_MENU_COPY_PAK_FROM_GHOST2_1P, // 0x29
    SUB_MENU_COPY_PAK_ERROR_2P_MIN,                                      // 0x2A
    SUB_MENU_COPY_PAK_ERROR_NO_GHOST_DATA = SUB_MENU_COPY_PAK_ERROR_2P_MIN,
    SUB_MENU_COPY_PAK_ERROR_NO_GAME_DATA,
    SUB_MENU_COPY_PAK_ERROR_NO_PAK_2P,
    SUB_MENU_COPY_PAK_ERROR_BAD_READ_2P,
    SUB_MENU_COPY_PAK_ERROR_2P_MAX = SUB_MENU_COPY_PAK_ERROR_BAD_READ_2P, // 0x2D
    SUB_MENU_COPY_PAK_TO_GHOST_MIN = 0x32,
    SUB_MENU_COPY_PAK_TO_GHOST1_2P = SUB_MENU_COPY_PAK_TO_GHOST_MIN,
    SUB_MENU_COPY_PAK_TO_GHOST2_2P,
    SUB_MENU_COPY_PAK_TO_GHOST_MAX = SUB_MENU_COPY_PAK_TO_GHOST2_2P, // 0x33
    SUB_MENU_COPY_PAK_ERROR_1P_MIN,
    SUB_MENU_COPY_PAK_ERROR_NO_PAK_1P = SUB_MENU_COPY_PAK_ERROR_1P_MIN, // 0x34
    SUB_MENU_COPY_PAK_ERROR_BAD_READ_1P,
    SUB_MENU_COPY_PAK_ERROR_CANT_CREATE_1P,
    SUB_MENU_COPY_PAK_ERROR_NO_PAGES_1P,
    SUB_MENU_COPY_PAK_ERROR_1P_MAX,
    SUB_MENU_COPY_PAK_PROMPT_MIN = SUB_MENU_COPY_PAK_ERROR_1P_MAX, // 0x38
    SUB_MENU_COPY_PAK_PROMPT_QUIT = SUB_MENU_COPY_PAK_PROMPT_MIN,
    SUB_MENU_COPY_PAK_PROMPT_COPY,
    SUB_MENU_COPY_PAK_PROMPT_MAX = SUB_MENU_COPY_PAK_PROMPT_COPY, // 0x39
    SUB_MENU_COPY_PAK_ACTION_MIN,
    SUB_MENU_COPY_PAK_START = SUB_MENU_COPY_PAK_ACTION_MIN, // 0x3A
    SUB_MENU_COPY_PAK_COPYING,
    SUB_MENU_COPY_PAK_COMPLETED,
    SUB_MENU_COPY_PAK_ACTION_MAX = SUB_MENU_COPY_PAK_COMPLETED, // 0x3C
    SUB_MENU_COPY_PAK_UNABLE_ERROR_MIN = 0x41,
    SUB_MENU_COPY_PAK_UNABLE_COPY_FROM_1P = SUB_MENU_COPY_PAK_UNABLE_ERROR_MIN,
    SUB_MENU_COPY_PAK_UNABLE_READ_FROM_2P,
    SUB_MENU_COPY_PAK_UNABLE_ERROR_MAX = SUB_MENU_COPY_PAK_UNABLE_READ_FROM_2P,
    SUB_MENU_COPY_PAK_CREATE_GAME_DATA_INIT = 0x46,
    SUB_MENU_COPY_PAK_CREATE_GAME_DATA_DONE
};

/**
 * @brief Options for gMainMenuSelection
 */
enum MainMenuSelectionType {
    MAIN_MENU_NONE,
    MAIN_MENU_OPTION,
    MAIN_MENU_DATA,
    MAIN_MENU_PLAYER_SELECT,
    MAIN_MENU_MODE_SELECT,            // Mario GP - T. Trials - VS - Battle
    MAIN_MENU_MODE_SUB_SELECT,        // CC Selection and T.Trials options (Begin, Data)
    MAIN_MENU_OK_SELECT,              // OK option after selecting a submode
    MAIN_MENU_OK_SELECT_GO_BACK,      // OK option after going back from player select
    MAIN_MENU_MODE_SUB_SELECT_GO_BACK // Used in T.Trials after going back to Data option from course data
};

/**
 * @brief Options for gPlayerSelectMenuSelection
 */
enum PlayerSelectMenuSelectionTypes {
    PLAYER_SELECT_MENU_NONE,
    PLAYER_SELECT_MENU_MAIN,
    PLAYER_SELECT_MENU_OK,        // OK option after selecting characters
    PLAYER_SELECT_MENU_OK_GO_BACK // OK option after going back from map select
};

/**
 * @brief Options for gDebugMenuSelection
 */
enum DebugMenuSelectionTypes {
    DEBUG_MENU_NONE,
    DEBUG_MENU_DISABLED,
    DEBUG_MENU_DEBUG_MODE,
    DEBUG_MENU_COURSE,
    DEBUG_MENU_CC,
    DEBUG_MENU_SCREEN_MODE,
    DEBUG_MENU_PLAYER,
    DEBUG_MENU_SOUND_MODE,
    DEBUG_MENU_GIVE_ALL_GOLD_CUP,
    DEBUG_MENU_OPTION_SELECTED = 0x40
};

/**
 * @brief Options for gControllerPakMenuSelection
 */
enum ControllerPakMenuSelectionTypes {
    CONTROLLER_PAK_MENU_NONE,
    CONTROLLER_PAK_MENU_SELECT_RECORD,
    CONTROLLER_PAK_MENU_END,
    CONTROLLER_PAK_MENU_ERASE,
    CONTROLLER_PAK_MENU_QUIT,
    CONTROLLER_PAK_MENU_TABLE_GAME_DATA,
    CONTROLLER_PAK_MENU_GO_TO_ERASING,
    CONTROLLER_PAK_MENU_ERASING,
    CONTROLLER_PAK_MENU_ERASE_ERROR_NOT_ERASED,
    CONTROLLER_PAK_MENU_ERASE_ERROR_NO_PAK,
    CONTROLLER_PAK_MENU_ERASE_ERROR_PAK_CHANGED
};

/**
 * @brief Options for gCourseRecordsMenuSelection
 */
enum CourseRecordsMenuSelectionTypes {
    COURSE_RECORDS_MENU_MIN,
    COURSE_RECORDS_MENU_RETURN_MENU = COURSE_RECORDS_MENU_MIN,
    COURSE_RECORDS_MENU_ERASE_RECORDS,
    COURSE_RECORDS_MENU_ERASE_GHOST,
    COURSE_RECORDS_MENU_MAX = COURSE_RECORDS_MENU_ERASE_GHOST
};

/**
 * @brief Options for gCourseRecordsSubMenuSelection
 */
enum CourseRecordsSubMenuSelectionTypes {
    COURSE_RECORDS_SUB_MENU_MIN,
    COURSE_RECORDS_SUB_MENU_QUIT = COURSE_RECORDS_SUB_MENU_MIN,
    COURSE_RECORDS_SUB_MENU_ERASE,
    COURSE_RECORDS_SUB_MENU_MAX = COURSE_RECORDS_SUB_MENU_ERASE
};

/**
 * @brief Options for gDebugGotoScene
 */
enum DebugGotoSceneTypes {
    DEBUG_GOTO_RACING,
    DEBUG_GOTO_ENDING,
    DEBUG_GOTO_CREDITS_SEQUENCE_DEFAULT,
    DEBUG_GOTO_CREDITS_SEQUENCE_EXTRA
};

/**
 * @brief Options for gFadeModeSelection
 */
enum FadeModeSelectionTypes { FADE_MODE_NONE, FADE_MODE_MAIN, FADE_MODE_LOGO };

/**
 * @brief Options for gControllerPakScrollDirection
 */
enum ControllerPakScrollDirectionTypes {
    CONTROLLER_PAK_SCROLL_DIR_NONE,
    CONTROLLER_PAK_SCROLL_DIR_DOWN,
    CONTROLLER_PAK_SCROLL_DIR_UP
};

#define NUM_ROWS_GAME_MODE_MENU 4
#define NUM_COLUMN_GAME_MODE_SUB_MENU 4
#define NUM_ROWS_GAME_MODE_SUB_MENU 3

// This really, really shouldn't be in this header file, but I don't know where else to put it
void rmonPrintf(const char*, ...);

/* functions */
void update_menus(void);
void options_menu_act(struct Controller*, u16);
void data_menu_act(struct Controller*, u16);
void course_data_menu_act(struct Controller*, u16);
void logo_intro_menu_act(struct Controller*, u16);
void controller_pak_menu_act(struct Controller*, u16);
void splash_menu_act(struct Controller*, u16);
void setup_game_mode_selected(void);
void main_menu_act(struct Controller*, u16);
bool is_character_spot_free(s32);
void player_select_menu_act(struct Controller* controller, u16 arg1);
void course_select_menu_act(struct Controller*, u16);
void load_menu_states(s32);
void reset_cycle_flash_menu(void);
void set_sound_mode(void);
bool is_screen_being_faded(void);

/* data */
extern s32 gIntroModelZEye;
extern f32 gIntroModelScale;
extern f32 gIntroModelRotX;
extern f32 gIntroModelRotY;
extern f32 gIntroModelRotZ;
extern f32 gIntroModelPosX;
extern f32 gIntroModelPosY;
extern f32 gIntroModelPosZ;
extern s32 gMenuFadeType;

extern s8 gCharacterGridSelections[];
extern bool gCharacterGridIsSelected[];
extern s8 gSubMenuSelection;
extern s8 gMainMenuSelection;
extern s8 gPlayerSelectMenuSelection;
extern s8 gDebugMenuSelection;
extern s8 gControllerPakMenuSelection;
extern s8 gScreenModeListIndex;
extern u8 gSoundMode;
extern s8 gPlayerCount;
extern s8 gVersusResultCursorSelection;
extern s8 gTimeTrialsResultCursorSelection;
extern s8 gBattleResultCursorSelection;
extern s8 gTimeTrialDataCourseIndex;
extern s8 gCourseRecordsMenuSelection;
extern s8 gCourseRecordsSubMenuSelection;
extern s8 gDebugGotoScene;
extern bool gGhostPlayerInit;
extern bool gCourseMapInit;
extern s32 gMenuTimingCounter;
extern s32 gMenuDelayTimer;
extern s8 gDemoUseController;
extern s8 gCupSelection;
extern s8 sTempCupSelection;
extern s8 gCourseIndexInCup;
extern s8 unref_D_8018EE0C;

extern s32 gMenuSelection; // D_800E86A0
extern s32 gFadeModeSelection;
extern s8 gCharacterSelections[];

extern s8 gGameModeMenuColumn[];
extern s8 gGameModeSubMenuColumn[NUM_COLUMN_GAME_MODE_SUB_MENU][NUM_ROWS_GAME_MODE_SUB_MENU];
extern s8 gNextDemoId;
extern s8 gControllerPakSelectedTableRow;
extern s8 gControllerPakVisibleTableRows[];
extern s8 gControllerPakScrollDirection;
extern s8 unref_D_800E86D4[];
extern u32 sVIGammaOffDitherOn;

extern const s8 sScreenModePlayerTable[5];
extern const s8 sScreenModePlayerCount[5];
extern const s8 gPlayerModeSelection[];
extern const s8 sGameModePlayerColumnDefault[][3];
extern const s8 sGameModePlayerColumnExtra[][3];
extern const s32 gGameModePlayerSelection[][3];
extern const s8 sCharacterGridOrder[8];
extern const s16 gCupCourseOrder[NUM_CUPS][NUM_COURSES_PER_CUP];

extern const union GameModePack sSoundMenuPack;

// end of menus.c variables

#endif /* MENUS_H */