mk64/src/menu_items.c

12258 lines
434 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <ultra64.h>
#include <PR/ultratypes.h>
#include <macros.h>
#include <defines.h>
#include <segments.h>
#include <sounds.h>
#include <mk64.h>
#include <course.h>
#include "code_800029B0.h"
#include "menu_items.h"
#include "code_80005FD0.h"
#include "code_8006E9C0.h"
#include "menus.h"
#include "save.h"
#include "code_80057C60.h"
#include "credits.h"
#include "data_segment2.h"
#include "code_800AF9B0.h"
#include "code_80281780.h"
#include "memory.h"
#include "audio/external.h"
#include "render_objects.h"
#include "staff_ghosts.h"
#include <assets/common_data.h>
#include "textures.h"
#include "math_util.h"
#include "save_data.h"
#include "podium_ceremony_actors.h"
#include "skybox_and_splitscreen.h"
#include <assets/startup_logo.h>
#include "buffers.h"
#include "racing/race_logic.h"
#include "ending/code_80281C40.h"
#include "spawn_players.h"
#include "render_player.h"
#include "decode.h"
//! @todo Move gGfxPool out of main.h
// Unfortunately that's not a small effort due to weird import structure in this project
#include "main.h"
void guMtxCatL(Mtx* m, Mtx* n, Mtx* res);
u16* gMenuTextureBuffer;
u8* gMenuCompressedBuffer;
u8* sTKMK00_LowResBuffer;
u8* sGPPointsCopy;
void* gSomeDLBuffer;
/**
* List of bytes indexed by character ID
* Indicates number of Grand Prix points that character
* has scored
*/
s8 gGPPointsByCharacterId[8];
s8 gCharacterIdByGPOverallRank[8];
s8 D_8018D9D8;
s8 D_8018D9D9;
MenuItem gMenuItems[MENU_ITEMS_MAX];
struct_8018DEE0_entry D_8018DEE0[D_8018DEE0_SIZE];
struct_8018E060_entry D_8018E060[D_8018E060_SIZE];
UNUSED u8 menu_item_bss_padding0[8];
struct_8018E0E8_entry D_8018E0E8[D_8018E0E8_SIZE];
s32 sMenuTextureBufferIndex;
TextureMap sMenuTextureMap[TEXTURE_MAP_MAX];
s32 sMenuTextureEntries;
Gfx* sGfxPtr;
s32 gNumD_8018E768Entries;
struct_8018E768_entry D_8018E768[D_8018E768_SIZE];
s32 gCycleFlashMenu;
s8 gTransitionType[5];
u32 gTransitionDuration[5];
u32 gCurrentTransitionTime[4];
s32 D_8018E7E0;
struct UnkStruct_8018E7E8 D_8018E7E8[D_8018E7E8_SIZE];
struct UnkStruct_8018E7E8 D_8018E810[D_8018E810_SIZE];
s8 D_8018E838[4]; // Import to C was required for matching.
s32 D_8018E83C;
s32 D_8018E840[4]; // This may all be one big array.
s32 D_8018E850[2]; // This is probably incorrect. Fix after decomping code.
s32 D_8018E858[2];
s8 gTextColor;
s32 D_8018E864_pad;
OSPfs gControllerPak1FileHandle;
OSPfs gControllerPak2FileHandle;
OSPfsState pfsState[16];
s32 pfsError[16]; // 0 = Ok, anything else = error.
s32 gControllerPak1NumFilesUsed;
s32 gControllerPak1MaxWriteableFiles;
s32 gControllerPak1NumPagesFree;
s32 gControllerPak1FileNote;
s32 gControllerPak2FileNote;
s32 menu_item_bss_pad2;
ALIGNED8 SaveData gSaveData;
u8 D_8018ED90;
u8 D_8018ED91;
s32 sIntroModelTimer;
Unk_D_800E70A0 D_800E70A0[] = {
{ 0x3d, 0x11, 0x00, 0x00 }, { 0x15, 0x3e, 0x00, 0x00 }, { 0x5c, 0x3e, 0x00, 0x00 },
{ 0xa3, 0x3e, 0x00, 0x00 }, { 0xea, 0x3e, 0x00, 0x00 }, { 0x10a, 0xc8, 0x00, 0x00 },
{ 0x15, 0xc8, 0x00, 0x00 }, { 0x55, 0xc8, 0x00, 0x00 }, { 0x00, 0x00, 0x00, 0x00 },
};
Unk_D_800E70A0 D_800E70E8[] = {
{ 0x40, 0x41, 0x00, 0x00 },
{ 0x40, 0x53, 0x00, 0x00 },
{ 0x40, 0x65, 0x00, 0x00 },
{ 0x40, 0x77, 0x00, 0x00 },
};
Unk_D_800E70A0 D_800E7108[][4] = {
{
{ 0x18, 0x3f, 0x00, 0x00 },
{ 0x5d, 0x3f, 0x00, 0x00 },
{ 0xa2, 0x3f, 0x00, 0x00 },
{ 0xe7, 0x3f, 0x00, 0x00 },
},
{
{ 0x18, 0x91, 0x00, 0x00 },
{ 0x5d, 0x91, 0x00, 0x00 },
{ 0xa2, 0x91, 0x00, 0x00 },
{ 0xe7, 0x91, 0x00, 0x00 },
},
};
Unk_D_800E70A0 D_800E7148[] = {
{ 0x17, 0x3b, 0x00, 0x00 },
{ 0x5d, 0x3b, 0x00, 0x00 },
{ 0xa2, 0x3b, 0x00, 0x00 },
{ 0xe8, 0x3b, 0x00, 0x00 },
};
Unk_D_800E70A0 D_800E7168[] = {
{ 0x17, 0x70, 0x00, 0x00 },
{ 0x57, 0x70, 0x00, 0x00 },
{ 0x17, 0x97, 0x00, 0x00 },
{ 0x57, 0x97, 0x00, 0x00 },
};
// In a perfect world this would be `Unk_D_800E70A0 D_800E7188[][4]`
Unk_D_800E70A0 D_800E7188[] = {
{ 0x80, 0x58, 0x00, 0x00 }, { 0x00, 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x00, 0x00 },
{ 0x80, 0x3f, 0x00, 0x00 }, { 0x80, 0x91, 0x00, 0x00 }, { 0x00, 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x00, 0x00 },
{ 0x5a, 0x58, 0x00, 0x00 }, { 0xa6, 0x58, 0x00, 0x00 }, { 0x00, 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x00, 0x00 },
{ 0x5a, 0x3f, 0x00, 0x00 }, { 0xa6, 0x3f, 0x00, 0x00 }, { 0x5a, 0x91, 0x00, 0x00 }, { 0xa6, 0x91, 0x00, 0x00 },
};
Unk_D_800E70A0 D_800E7208[][2] = {
{
{ 0x9d, 0x70, 0x00, 0x00 },
{ 0x128, 0x81, 0x00, 0x00 },
},
{
{ 0x9d, 0x88, 0x00, 0x00 },
{ 0x128, 0x99, 0x00, 0x00 },
},
{
{ 0x9d, 0xa0, 0x00, 0x00 },
{ 0x128, 0xb1, 0x00, 0x00 },
},
{
{ 0x9d, 0xb8, 0x00, 0x00 },
{ 0x128, 0xc9, 0x00, 0x00 },
},
};
Unk_D_800E70A0 D_800E7248[] = {
{ 0xff6a, 0x3b, 0x00, 0x00 },
{ 0x172, 0x3b, 0x00, 0x00 },
};
Unk_D_800E70A0 D_800E7258[] = {
{ 0x17, 0x3b, 0x00, 0x00 },
{ 0xc5, 0x3b, 0x00, 0x00 },
};
Unk_D_800E70A0 D_800E7268[] = {
{ 0x28, 0x73, 0x00, 0x00 },
{ 0x28, 0x3c, 0x00, 0x00 },
};
Unk_D_800E70A0 D_800E7278[] = {
{ 0x3e, 0x43, 0x00, 0x00 }, { 0xa1, 0x43, 0x00, 0x00 },
{ 0x3e, 0xc5, 0x00, 0x00 }, { 0xa1, 0xc5, 0x00, 0x00 },
{ 0xffc0, 0xf0, 0x00, 0x00 }, { 0x140, 0xf0, 0x00, 0x00 },
{ 0xffc0, 0xffc0, 0x00, 0x00 }, { 0xffc0, 0xffc0, 0x00, 0x00 },
{ 0xffc0, 0xffc0, 0x00, 0x00 }, { 0x140, 0xffc0, 0x00, 0x00 },
{ 0xffc0, 0xf0, 0x00, 0x00 }, { 0xffc0, 0xffc0, 0x00, 0x00 },
{ 0xffc0, 0xffc0, 0x00, 0x00 }, { 0x140, 0xffc0, 0x00, 0x00 },
{ 0xffc0, 0xf0, 0x00, 0x00 }, { 0x140, 0xf0, 0x00, 0x00 },
};
Unk_D_800E70A0 D_800E72F8 = { 0x140, 0x23, 0x00, 0x00 };
// In a perfect world this would be `Unk_D_800E70A0 D_800E7300[][4]`
Unk_D_800E70A0 D_800E7300[] = {
{ 0x50, 0x23, 0x00, 0x00 }, { 0xb0, 0x23, 0x00, 0x00 }, { 0x00, 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x00, 0x00 },
{ 0x32, 0x23, 0x00, 0x00 }, { 0x80, 0x23, 0x00, 0x00 }, { 0xce, 0x23, 0x00, 0x00 }, { 0x00, 0x00, 0x00, 0x00 },
{ 0x18, 0x23, 0x00, 0x00 }, { 0x5d, 0x23, 0x00, 0x00 }, { 0xa2, 0x23, 0x00, 0x00 }, { 0xe7, 0x23, 0x00, 0x00 },
};
Unk_D_800E70A0 D_800E7360[] = {
{ 0x61, 0xa7, 0x00, 0x00 },
{ 0x61, 0xb6, 0x00, 0x00 },
{ 0x61, 0xc5, 0x00, 0x00 },
{ 0x61, 0xd4, 0x00, 0x00 },
};
Unk_D_800E70A0 D_800E7380[] = {
{ 0x30, 0x4b, 0x00, 0x00 },
{ 0x109, 0x4b, 0x00, 0x00 },
};
Unk_D_800E70A0 D_800E7390[] = {
{ 0xad, 0x8d, 0x00, 0x00 }, { 0xad, 0x9a, 0x00, 0x00 }, { 0xad, 0xa7, 0x00, 0x00 },
{ 0xad, 0xb4, 0x00, 0x00 }, { 0xad, 0xc1, 0x00, 0x00 }, { 0xad, 0xce, 0x00, 0x00 },
};
Unk_D_800E70A0 D_800E73C0[] = {
{ 0xac, 0xa5, 0x00, 0x00 },
{ 0xac, 0xc3, 0x00, 0x00 },
};
Unk_D_800E70A0 D_800E73D0[] = {
{ 0xc0, 0xb3, 0x00, 0x00 },
{ 0xc0, 0xc2, 0x00, 0x00 },
};
Unk_D_800E70A0 D_800E73E0[] = {
{ 0x61, 0x94, 0x00, 0x00 }, { 0x61, 0xa1, 0x00, 0x00 }, { 0x61, 0xae, 0x00, 0x00 },
{ 0x61, 0xbb, 0x00, 0x00 }, { 0x61, 0xc8, 0x00, 0x00 }, { 0x61, 0xd5, 0x00, 0x00 },
};
Unk_D_800E70A0 D_800E7410[] = {
{ 0x52, 0x90, 0x00, 0x00 },
{ 0x52, 0xa4, 0x00, 0x00 },
};
Unk_D_800E70A0 D_800E7420[] = {
{ 0x76, 0x95, 0x00, 0x00 },
{ 0x76, 0xa4, 0x00, 0x00 },
};
Unk_D_800E70A0 D_800E7430[] = {
{ 0x17, 0xa, 0x00, 0x00 }, { 0x5d, 0xa, 0x00, 0x00 }, { 0xa2, 0xa, 0x00, 0x00 },
{ 0xe8, 0xa, 0x00, 0x00 }, { 0x17, 0xa, 0x00, 0x00 },
};
Unk_D_800E70A0 D_800E7458[] = {
{ 0x14a, 0x32, 0x00, 0x00 }, { 0xff60, 0xd4, 0x00, 0x00 }, { 0xa0, 0x10e, 0x00, 0x00 },
{ 0xff60, 0xbe, 0x00, 0x00 }, { 0x143, 0x5a, 0x00, 0x00 },
};
Unk_D_800E70A0 D_800E7480[] = {
{ 0xa0, 0x32, 0x00, 0x00 }, { 0x9b, 0xd4, 0x00, 0x00 }, { 0xa0, 0x50, 0x00, 0x00 },
{ 0x9b, 0xbe, 0x00, 0x00 }, { 0x80, 0x5a, 0x00, 0x00 },
};
RGBA16 D_800E74A8[] = {
{ 0x00, 0xf3, 0xf3, 0xff }, { 0xff, 0xa8, 0xc3, 0xff }, { 0xff, 0xfe, 0x7a, 0xff },
{ 0x7b, 0xfc, 0x7b, 0xff }, { 0xff, 0xff, 0x00, 0xff },
};
RGBA16 D_800E74D0[] = {
{ 0x00, 0xf3, 0xf3, 0xff },
{ 0xff, 0xa8, 0xc3, 0xff },
{ 0xff, 0xff, 0x00, 0xff },
};
RGBA16 D_800E74E8[] = {
{ 0xff, 0xaf, 0xaf, 0xff },
{ 0xaf, 0xff, 0xaf, 0xff },
{ 0xaf, 0xaf, 0xff, 0xff },
};
const s16 gGlyphDisplayWidth[] = {
0x000c, 0x000d, 0x000b, 0x000b, 0x000a, 0x000b, 0x000b, 0x000d, 0x0007, 0x000a, 0x000c, 0x000a, 0x0012, 0x000d,
0x000c, 0x000c, 0x000c, 0x000c, 0x000b, 0x000d, 0x000c, 0x000c, 0x0012, 0x000d, 0x000c, 0x000c, 0x000a, 0x000a,
0x000a, 0x0006, 0x001e, 0x0006, 0x000a, 0x0008, 0x000b, 0x000c, 0x000c, 0x000d, 0x000a, 0x000b, 0x000a, 0x000a,
0x0008, 0x001c, 0x000a, 0x0010, 0x000f, 0x0010, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f,
0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f,
0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000e, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f,
0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f,
0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000e, 0x000f, 0x000e,
0x000f, 0x000e, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000e, 0x000e, 0x000e,
0x000e, 0x000e, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f,
0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f,
0x000f, 0x000f, 0x000f, 0x000e, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f,
0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f,
0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000e, 0x000f, 0x000e, 0x000f, 0x000e, 0x000f, 0x000f,
0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000b, 0x000f,
0x000f, 0x000f, 0x000f, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x000f,
0x000f, 0x0017, 0x000f, 0x0017, 0x0017, 0x0017, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f,
};
char* gCupNames[] = {
"mushroom cup",
"flower cup",
"star cup",
"special cup",
"battle",
// ????
"mushroom cup",
"flower cup",
"star cup",
"special cup",
};
#if !ENABLE_CUSTOM_COURSE_ENGINE
// Displays at beginning of course
char* gCourseNames[] = {
#include "assets/course_metadata/gCourseNames.inc.c"
};
char* gCourseNamesDup[] = {
#include "assets/course_metadata/gCourseNames.inc.c"
};
#else
#endif
char* gCourseNamesDup2[] = {
#include "assets/course_metadata/gCourseNames.inc.c"
};
#if !ENABLE_CUSTOM_COURSE_ENGINE
// Used in debug menu at splash screen
char* gDebugCourseNames[] = {
#include "assets/course_metadata/gCourseDebugNames.inc.c"
};
#else
#endif
const s8 gPerCupIndexByCourseId[] = {
#include "assets/course_metadata/gPerCupIndexByCourseId.inc.c"
};
// @todo Increase this array for more than eight players
const s8 D_800EFD64[] = { 0, 1, 4, 3, 5, 6, 2, 7 };
// Maps course IDs (as defined in the COURSES enum) to the cup they belong to
s8 gCupSelectionByCourseId[] = {
#include "assets/course_metadata/gCupSelectionByCourseId.inc.c"
};
char* gCupText[] = {
"none",
"bronze",
"silver",
"gold",
};
char* gDebugCharacterNames[] = {
"MARIO", "LUIGI", "YOSHI", "KINOPIO", "D.KONG", "WARIO", "PEACH", "KOOPA",
};
char* D_800E76A8[] = {
"MARIO", "LUIGI", "YOSHI", "TOAD", "D.K.", "WARIO", "PEACH", "BOWSER",
"ーーーー", // NOT HYPHENS!!! These are EUC-JP characters (0xa1 0xbc)
};
char* D_800E76CC[] = {
"50(",
"100(",
"150(",
"extra",
};
char* D_800E76DC[] = {
"50(",
"100(",
"150(",
"extra",
};
char* gDebugScreenModeNames[] = {
"1p", "2players UD", "2players LR", "3players", "4players",
};
char* gDebugSoundModeNames[] = {
"stereo",
"head phone",
"xxx",
"monaural",
};
char* gSoundModeNames[NUM_SOUND_MODES] = { "STEREO", "HEADPHONE", "", "MONO" };
char* gWinLoseText[] = {
"WINNER!",
"LOSER!",
};
char* gBestTimeText[] = {
"BEST RECORDS",
"BEST LAP",
};
// Might need a const?
char* gLapTimeText = "LAP TIME";
char* gPrefixTimeText[] = {
"LAP 1",
"LAP 2",
"LAP 3",
"TOTAL",
};
char* D_800E7744[] = {
// The s/n/r/t here are not ASCII, they are EUC-JP characters
// 0xae 0xf3/0xae 0xee/0xae 0xf2/0xae 0xf4
"1 s", "2 n", "3 r", "4 t", "5 t", " ",
};
char* gTextPauseButton[] = {
"CONTINUE GAME", "RETRY", "COURSE CHANGE", "DRIVER CHANGE", "QUIT", "REPLAY", "SAVE GHOST",
};
char* D_800E7778[] = {
"VS MATCH RANKING",
"BATTLE RANKING",
};
// This is plain data, it should not end up in rodata
char gTextMenuAnnounceGhost[] = "NOW-MEET THE COURSE GHOST!!!";
char* gTextNoController[] = { "CONNECT A CONTROLLER TO SOCKET 1,", "THEN POWER ON AGAIN" };
char* gTextBattleIntroduction[] = {
"BATTLE GAME",
"POP OPPOSING PLAYER'S BALLOONS",
"WHEN ALL 3 ARE GONE,THEY ARE OUT!",
};
// This is plain data, it should not end up in rodata
char gTextMenuData[] = "a BUTTON*SEE DATA B BUTTON*EXIT";
// This is plain data, it should not end up in rodata
char gTextDistance[] = "distance";
char* sCourseLengths[] = {
#include "assets/course_metadata/sCourseLengths.inc.c"
};
char* gTextMenuOption[] = {
"return to menu",
"erase records for this course",
"erase ghost from this course",
};
char* D_800E7840[] = {
"quit",
"erase",
};
// Why oh why is this array flat? It should be gEraseBestGhostText[][3]
char* gEraseBestGhostText[] = {
"THE BEST RECORDS AND BEST", "LAP FOR THIS COURSE WILL BE", "ERASED. IS THIS OK?",
"GHOST DATA FOR THIS", "COURSE WILL BE ERASED.", "IS THIS OK?",
};
char* D_800E7860[] = {
"UNABLE TO ERASE ",
"GHOST DATA",
};
char* gTextOptionMenu[] = {
"RETURN TO GAME SELECT",
"SOUND MODE",
"COPY N64 CONTROLLER PAK",
"ERASE ALL DATA",
};
char* D_800E7878[] = {
"ALL SAVED DATA WILL BE",
"PERMANENTLY ERASED.",
"ARE YOU REALLY SURE?",
};
char* D_800E7884[] = {
"",
"ALL SAVED DATA",
"HAS BEEN NOW ERASED.",
};
// In a perfect world this would be `char *D_800E7890[][4]`
char* D_800E7890[] = {
"CONTROLLER 1 DOES NOT HAVE ",
"N64 CONTROLLER PAK",
"",
"",
"UNABLE TO READ ",
"N64 CONTROLLER PAK DATA ",
"FROM CONTROLLER 1",
"",
"UNABLE TO CREATE GAME DATA ",
"FROM CONTROLLER 1 ",
"N64 CONTROLLER PAK",
"",
"UNABLE TO COPY GHOST ",
"-- INSUFFICIENT FREE PAGES ",
"IN CONTROLLER 1 ",
"N64 CONTROLLER PAK",
};
// In a perfect world this would be `char *D_800E78D0[][3]`
char* D_800E78D0[] = {
"NO GHOST DATA ", "IN CONTROLLER 2 ", "N64 CONTROLLER PAK",
"NO MARIO KART 64 DATA ", "PRESENT IN CONTROLLER 2 ", "N64 CONTROLLER PAK",
"CONTROLLER 2 ", "DOES NOT HAVE ", "N64 CONTROLLER PAK SET",
"UNABLE TO READ DATA ", "FROM CONTROLLER 2 ", "N64 CONTROLLER PAK",
};
// In a perfect world this would be `char *D_800E7900[][4]`
char* D_800E7900[] = {
"UNABLE TO COPY DATA ", "FROM CONTROLLER 1 ", "N64 CONTROLLER PAK",
"UNABLE TO READ DATA ", "FROM CONTROLLER 2 ", "N64 CONTROLLER PAK",
};
char* D_800E7918[] = {
"CONTROLLER 1",
"CONTROLLER 2",
};
char* D_800E7920[] = {
"WHICH FILE DO YOU WANT TO MAKE A COPY OF?",
"TO WHICH FILE DO YOU WANT TO COPY?",
};
char* D_800E7928[] = {
"CURRENT DATA WILL BE ERASED,",
"IS THIS OK?",
};
char* D_800E7930[] = {
"QUIT",
"COPY",
};
char* D_800E7938[] = {
"COPYING",
"DATA COPY COMPLETED",
};
// In a perfect world this would be `char *D_800E7940[][4]`
char* D_800E7940[] = {
"NO N64 CONTROLLER PAK DETECTED",
"TO SAVE GHOST DATA, ",
"INSERT N64 CONTROLLER PAK ",
"INTO CONTROLLER 1",
"UNABLE TO READ ",
"N64 CONTROLLER PAK DATA",
"",
"",
"",
"",
"",
"",
"INSUFFICIENT FREE PAGES AVAILABLE ",
"IN N64 CONTROLLER PAK TO CREATE ",
"GAME DATA, PLEASE FREE 121 PAGES.",
"SEE INSTRUCTION BOOKLET FOR DETAILS.",
};
// Unused?
char* D_800E7980[] = {
"TO SAVE GHOST DATA, ",
"INSERT N64 CONTROLLER PAK ",
"INTO CONTROLLER 1",
};
// In a perfect world this would be `char *D_800E798C[][7]`
char* D_800E798C[] = {
"N64 CONTROLLER PAK ",
"NOT DETECTED. ",
"IF YOU WANT TO SAVE ",
"THE GHOST DATA, ",
"PLEASE INSERT ",
"N64 CONTROLLER PAK ",
"INTO CONTROLLER 1",
"",
"UNABLE TO SAVE ",
" THE GHOST",
"",
"",
"",
"",
"",
"UNABLE TO SAVE ",
" THE GHOST",
"",
"",
"",
"",
"INSUFFICIENT ",
"FREE PAGES AVAILABLE ",
"",
"-- GHOST DATA ",
"COULD NOT BE SAVED",
"",
"",
"",
"CANNOT CREATE ",
" GAME DATA",
"",
"",
"",
"",
"",
"THIS GHOST IS ",
" ALREADY SAVED",
"",
"",
"",
"",
};
char* D_800E7A34[] = {
"RACE DATA CANNOT ",
"BE SAVED FOR GHOST",
};
char* D_800E7A3C[] = {
"SELECT THE FILE ",
"YOU WANT TO SAVE",
};
// Might need a const?
char* D_800E7A44 = "NO DATA";
char* D_800E7A48[] = {
"CREATING ",
"MARIO KART 64 ",
"GAME DATA",
};
char* D_800E7A54[] = {
"CANNOT CREATE GAME DATA",
"",
"",
};
char* D_800E7A60[] = {
"THE PREVIOUS DATA ",
"WILL BE ERASED, ",
"IS THIS OK?",
};
char* D_800E7A6C[] = {
"QUIT",
"SAVE",
};
char* D_800E7A74[] = {
"SAVING GHOST DATA",
"",
"PLEASE WAIT",
};
char* D_800E7A80[] = {
"UNABLE TO SAVE ",
"THE GHOST",
};
char* D_800E7A88[] = {
"YOU ARE AWARDED THE",
"GOLD CUP",
"SILVER CUP",
"BRONZE CUP",
};
// Might need a const?
char* D_800E7A98 = "MAYBE NEXT TIME!";
char* D_800E7A9C[] = {
"CONGRATULATIONS!",
"WHAT A PITY!",
};
char* gPlaceText[] = {
"YOU PLACED", " st", " nd", " rd", " th", " th", " th", " th", " th",
};
const s8 gGPPointRewards[] = { 9, 6, 3, 1 };
const s8 D_800F0B1C[] = {
0, 0, 1, 0, 1, 0, 1, 2, 0, 1, 2, 3,
};
const s8 D_800F0B28[] = {
0, 1, 2, 1, 2, 1, 2, 1, 2, 0, 0, 1, 2, 2, 1, 2, 2, 1, 2, 2,
1, 2, 2, 1, 2, 2, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
};
const s8 D_800F0B50[] = { 0x1f, 0x0b, 0x15, 0x29 };
const s8 D_800F0B54[] = { 0x20, 0x0f, 0x18, 0x2c };
RGBA16 D_800E7AC8[] = {
{ 0x00, 0x00, 0x00, 0x00 },
{ 0xff, 0xff, 0xff, 0xff },
{ 0x00, 0x00, 0x50, 0xff },
{ 0xff, 0xff, 0xff, 0xff },
};
RGBA16 D_800E7AE8[] = {
{ 0x00, 0x00, 0x00, 0xff },
{ 0xff, 0xff, 0xff, 0xff },
};
MenuTexture* D_800E7AF8[] = {
D_02000000, D_02000028, D_02000050, D_02000078, D_020000A0, D_020000C8, D_020000F0, D_02000118, D_02000140,
D_02000168, D_02000190, D_020001B8, D_020001E0, D_02000208, D_02000230, D_02000258, D_02000280, D_020002A8,
D_020002D0, D_020002F8, D_02000320, D_02000348, D_02000370, D_02000398, D_020003C0, D_020003E8, D_02000410,
D_02000438, D_02000460, D_02000488, D_020004B0, D_020004D8, D_02000500, D_02000528, D_02000550, D_02000578,
D_020005A0, D_020005C8, D_020005F0, D_02000618, D_02000640, D_02000668, D_02000690, D_020006B8, D_020006E0,
D_02000708, D_02000730, D_02000758, D_02000780, D_020007A8, D_020007D0, D_020007F8, D_02000820, D_02000848,
D_02000870, D_02000898, D_020008C0, D_020008E8, D_02000910, D_02000938, D_02000960, D_02000988, D_020009B0,
D_020009D8, D_02000A00, D_02000A28, D_02000A50, D_02000A78, D_02000AA0, D_02000AC8, D_02000AF0, D_02000B18,
D_02000B40, D_02000B68, D_02000B90, D_02000BB8, D_02000BE0, D_02000C08, D_02000C30, D_02000C58, D_02000C80,
D_02000CA8, D_02000CD0, D_02000CF8, D_02000D20, D_02000D48, D_02000D70, D_02000D98, D_02000DC0, D_02000DE8,
D_02000E10, D_02000E38, D_02000E60, D_02000E88, D_02000EB0, D_02000ED8, D_02000F00, D_02000F28, D_02000F50,
D_02000F78, D_02000FA0, D_02000FC8, D_02000FF0, D_02001018, D_02001040, D_02001068, D_02001090, D_020010B8,
D_020010E0, D_02001108, D_02001130, D_02001158, D_02001180, D_020011A8, D_020011D0, D_020011F8, D_02001220,
D_02001248, D_02001270, D_02001298, D_020012C0, D_020012E8, D_02001310, D_02001338, D_02001360, D_02001388,
D_020013B0, D_020013D8, D_02001400, D_02001428, D_02001450, D_02001478, D_020014A0,
};
MenuTexture* D_800E7D0C[] = {
D_020016BC, D_020016E4, D_0200170C, D_02001734, D_0200175C,
D_02001784, D_020017AC, D_020017D4, D_020017FC, D_02001824,
};
MkAnimation* D_800E7D34[] = {
D_0200198C, D_0200199C, D_020019AC, D_020019BC, D_020019CC, D_020019DC,
};
MenuTexture* gMenuTexturesBackground[] = {
seg2_blue_sky_background_texture,
seg2_sunset_background_texture,
};
MenuTexture* D_800E7D54[] = {
D_02001A8C, D_02001A64, D_02001AB4, D_02001A14, D_02001B04, D_020019EC, D_02001ADC, D_02001A3C,
};
MenuTexture* D_800E7D74[] = {
seg2_mario_raceway_preview_texture,
D_02001B54,
D_02001B7C,
D_02001BA4,
D_02001BCC,
D_02001BF4,
D_02001C1C,
D_02001C44,
D_02001C6C,
D_02001C94,
D_02001CBC,
D_02001CE4,
D_02001D0C,
D_02001D34,
D_02001D5C,
D_02001D84,
D_02001DAC,
D_02001DD4,
D_02001DFC,
D_02001E24,
};
MenuTexture* D_800E7DC4[] = {
seg2_mario_raceway_title_texture,
seg2_choco_mountain_title_texture,
D_02004EF8,
D_02004F20,
D_02004F48,
D_02004F70,
D_02004F98,
D_02004FC0,
D_02004FE8,
D_02005010,
D_02005038,
D_02005060,
D_02005088,
D_020050B0,
D_020050D8,
D_02005100,
D_02005128,
D_02005150,
D_02005178,
D_020051A0,
};
// Unused?
MkAnimation* D_800E7E14[] = {
D_020020BC,
D_020020CC,
D_020020DC,
};
MkAnimation* D_800E7E20[] = {
D_020020DC, D_020020EC, D_020020FC, D_0200210C, D_0200210C,
};
MkAnimation* D_800E7E34[] = {
D_02001E64, D_02001E74, D_02001E84, D_02001E94, D_02001EA4, D_02001EB4, D_02001EC4,
D_02001ED4, D_02001EE4, D_02001EF4, D_02001F04, D_02001F14, D_02001F24, D_02001F34,
D_02001F44, D_02001F54, D_02001F64, D_02001F74, D_02001F84, D_02001F94,
};
MenuTexture* gGlyphTextureLUT[] = {
gTextureFontLetterA,
gTextureFontLetterB,
gTextureFontLetterC,
gTextureFontLetterD,
gTextureFontLetterE,
gTextureFontLetterF,
gTextureFontLetterG,
gTextureFontLetterH,
gTextureFontLetterI,
gTextureFontLetterJ,
gTextureFontLetterK,
gTextureFontLetterL,
gTextureFontLetterM,
gTextureFontLetterN,
gTextureFontLetterO,
gTextureFontLetterP,
gTextureFontLetterQ,
gTextureFontLetterR,
gTextureFontLetterS,
gTextureFontLetterT,
gTextureFontLetterU,
gTextureFontLetterV,
gTextureFontLetterW,
gTextureFontLetterX,
gTextureFontLetterY,
gTextureFontLetterZ,
gTextureFontExclamationMark,
gTextureFontMinus,
gTextureFontInterogationMark,
gTextureFontSimpleQuote,
gTextureFontEmpty,
gTextureFontDot,
gTextureFontNumberZero,
gTextureFontNumberOne,
gTextureFontNumberTwo,
gTextureFontNumberThree,
gTextureFontNumberFour,
gTextureFontNumberFive,
gTextureFontNumberSix,
gTextureFontNumberSeven,
gTextureFontNumberEight,
gTextureFontNumberNine,
gTextureFontDoubleQuote,
gTextureFontFourDote,
gTextureFontPlus,
gTextureFontCC,
gTextureFontComma,
gTextureFontEmpty,
D_02002824,
D_0200284C,
D_02002874,
D_0200289C,
D_020028C4,
D_020028EC,
D_02002F54,
D_02002914,
D_02002F7C,
D_0200293C,
D_02002FA4,
D_02002964,
D_02002FCC,
D_0200298C,
D_02002FF4,
D_020029B4,
D_0200301C,
D_020029DC,
D_02003044,
D_02002A04,
D_0200306C,
D_02002A2C,
D_02003094,
D_02002A54,
D_020030BC,
D_02002A7C,
D_020030E4,
D_02002AA4,
D_0200310C,
D_020033B4,
D_02002ACC,
D_02003134,
D_02002AF4,
D_0200315C,
D_02002B1C,
D_02003184,
D_02002B44,
D_02002B6C,
D_02002B94,
D_02002BBC,
D_02002BE4,
D_02002C0C,
D_020031AC,
};
MenuTexture* D_800E7FF0[] = {
D_02003274, D_02002C34, D_020031D4, D_0200329C, D_02002C5C, D_020031FC, D_020032C4, D_02002C84, D_02003224,
D_020032EC, D_02002CAC, D_0200324C, D_02003314, D_02002CD4, D_02002CFC, D_02002D24, D_02002D4C, D_02002D74,
D_0200333C, D_02002D9C, D_02003364, D_02002DC4, D_0200338C, D_02002DEC, D_02002E14, D_02002E3C, D_02002E64,
D_02002E8C, D_02002EB4, D_02002EDC, D_02002F04, D_02002F2C, D_020033DC, D_02003404, D_0200342C, D_02003454,
D_0200347C, D_020034A4, D_020034CC, D_020034F4, D_0200351C, D_02003544, D_0200356C, D_02003BD4,
};
MenuTexture* D_800E80A0[] = {
D_02003594, D_02003BFC, D_020035BC, D_02003C24, D_020035E4, D_02003C4C, D_0200360C, D_02003C74,
D_02003634, D_02003C9C, D_0200365C, D_02003CC4, D_02003684, D_02003CEC, D_020036AC, D_02003D14,
D_020036D4, D_02003D3C, D_020036FC, D_02003D64, D_02003724, D_02003D8C, D_02004034, D_0200374C,
D_02003DB4, D_02003774, D_02003DDC, D_0200379C, D_02003E04,
};
MenuTexture* D_800E8114[] = {
D_020037C4, D_020037EC, D_02003814, D_0200383C, D_02003864, D_0200388C, D_02003E2C, D_02003EF4,
D_020038B4, D_02003E54, D_02003F1C, D_020038DC, D_02003E7C, D_02003F44, D_02003904, D_02003EA4,
D_02003F6C, D_0200392C, D_02003ECC, D_02003F94, D_02003954, D_0200397C, D_020039A4, D_020039CC,
};
MenuTexture* D_800E8174[] = {
D_020039F4,
D_02003FBC,
};
MenuTexture* D_800E817C[] = {
D_02003A1C, D_02003FE4, D_02003A44, D_0200400C, D_02003A6C, D_02003A94, D_02003ABC, D_02003AE4, D_02003B0C,
D_02003B34, D_02003B5C, D_02003B84, D_02003BAC, D_0200405C, D_02004084, D_020040AC, D_020040D4, D_020040FC,
D_020043CC, D_02004444, D_0200437C, D_020043F4, D_02004124, D_0200414C, D_02004174, D_0200419C,
};
MenuTexture* D_800E81E4[] = {
D_020041C4, D_020041EC, D_02004214, D_0200423C, D_02004264, D_0200428C, D_020042B4, D_020042DC, D_02004354,
D_020043A4, D_0200441C, D_0200446C, D_02004494, D_020044BC, D_02004304, D_0200432C, D_020044E4, D_0200450C,
};
MenuTexture* D_800E822C[] = {
gTextureFontComma,
D_0200455C,
};
// In a perfect world this would be `MenuTexture *D_800E8234[][2]`
MenuTexture* D_800E8234[] = {
seg2_menu_1p_column, D_020047DC, seg2_menu_2p_column, D_02004804,
seg2_menu_3p_column, D_0200482C, seg2_menu_4p_column, D_02004854,
};
MenuTexture* D_800E8254[] = {
seg2_game_select_texture, seg2_menu_1p_column, seg2_menu_2p_column, seg2_menu_3p_column,
seg2_menu_4p_column, D_0200487C, gTextureMenuLOption, gTextureMenuRData,
};
// CC textures
MenuTexture* D_800E8274[] = {
seg2_50_CC_texture,
seg2_100_CC_texture,
seg2_150_CC_texture,
seg2_extra_CC_texture,
};
// Versus and battle textures
MenuTexture* D_800E8284[] = { D_020049BC, seg2_menu_no_item_texture };
// Time trials begin and data textures
MenuTexture* D_800E828C[] = {
D_020049E4,
seg2_data_texture,
};
// Duplicates of the above 3 arrays
// CC textures
MenuTexture* D_800E8294[] = {
seg2_50_CC_texture,
seg2_100_CC_texture,
seg2_150_CC_texture,
seg2_extra_CC_texture,
};
// Versus and battle textures
MenuTexture* D_800E82A4[] = { D_020049BC, seg2_menu_no_item_texture };
// Time trials begin and data textures
MenuTexture* D_800E82AC[] = {
D_020049E4,
seg2_data_texture,
};
MenuTexture* gMenuTexturesBorderPlayer[] = {
seg2_P1_border_texture,
seg2_P2_border_texture,
seg2_P3_border_texture,
seg2_P4_border_texture,
};
MenuTexture* gMenuTexturesTrackSelection[] = {
seg2_menu_select_texture, seg2_mushroom_cup_texture, seg2_flower_cup_texture,
seg2_star_cup_texture, seg2_special_cup_texture, seg2_mario_raceway_preview_small_texture,
seg2_mushroom_cup_title_texture, seg2_flower_cup_title_texture, seg2_star_cup_title_texture,
seg2_special_cup_title_texture, seg2_battle_title_texture, D_02004E80,
};
MenuTexture* D_800E82F4[] = {
seg2_mushroom_cup_texture,
seg2_flower_cup_texture,
seg2_star_cup_texture,
seg2_special_cup_texture,
seg2_mario_raceway_preview_small_texture,
seg2_mushroom_cup_title_texture,
seg2_flower_cup_title_texture,
seg2_star_cup_title_texture,
seg2_special_cup_title_texture,
seg2_battle_title_texture,
D_02004E80,
};
MkAnimation* D_800E8320[] = {
D_02006708, D_020068F0, D_02006CC0, D_02006EA8, D_02007090, D_02007280, D_02007468, D_02006AD8,
};
MkAnimation* D_800E8340[] = {
D_02006778, D_02006960, D_02006D30, D_02006F18, D_02007100, D_020072F0, D_020074D8, D_02006B48,
};
MkAnimation* D_800E8360[] = {
D_02006708, D_020068F0, D_02006CC0, D_02006EA8, D_02007090, D_02007280, D_02007468, D_02006AD8,
};
MkAnimation* gCharacterCelebrateAnimation[] = {
D_02006718, D_02006900, D_02006CD0, D_02006EB8, D_020070A0, D_02007290, D_02007478, D_02006AE8,
};
MkAnimation* D_800E83A0[] = {
D_02006778, D_02006960, D_02006D30, D_02006F18, D_02007100, D_020072F0, D_020074D8, D_02006B48,
};
MkAnimation* gCharacterDeselectAnimation[] = {
D_02006788, D_02006970, D_02006D40, D_02006F28, D_02007110, D_02007300, D_020074E8, D_02006B58,
};
MkAnimation* gCharacterSingleBlinkAnimation[] = {
D_020067E0, D_020069C8, D_02006D98, D_02006F80, D_02007170, D_02007358, D_02007540, D_02006BB0,
};
MkAnimation* gCharacterDoubleBlinkAnimation[] = {
D_02006838, D_02006A20, D_02006DF0, D_02006FD8, D_020071C8, D_020073B0, D_02007598, D_02006C08,
};
MkAnimation* gCharacterDefeatAnimation[] = {
D_020068E0, D_02006AC8, D_02006E98, D_02007080, D_02007270, D_02007458, D_02007640, D_02006CB0,
};
s32 D_800E8440[] = {
0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a,
};
s32 D_800E8460[] = {
0x09, 0x09, 0x09, 0x09, 0x0a, 0x09, 0x09, 0x09,
};
s32 D_800E8480[] = {
0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,
};
s32 D_800E84A0[] = {
0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13,
};
Vtx* D_800E84C0[] = {
D_02007BB8,
D_02007CD8,
D_02007DF8,
};
#ifndef AVOID_UB
Gfx* D_800E84CC[] = {
D_02007838, D_02007858, D_02007878, D_02007898, D_020078B8, D_020078D8, D_020078F8, D_02007918,
};
Gfx* D_800E84EC[] = {
D_02007938, D_02007958, D_02007978, D_02007998, D_020079B8, D_020079D8, D_020079F8, D_02007A18,
};
Gfx* D_800E850C[] = {
D_02007A38, D_02007A58, D_02007A78, D_02007A98, D_02007AB8, D_02007AD8, D_02007AF8, D_02007B18,
};
#endif
s8 D_800E852C = 1;
// Speed of the "motion" effect intro logo model
f32 sIntroModelMotionSpeed = 0.0f;
// Speed of the intro logo model
f32 sIntroModelSpeed = 3.0f;
Unk_D_800E70A0 D_800E8538[] = { { 0x69, 0x9b, 0x00, 0x00 } };
// In a perfect world this would be `Unk_D_800E70A0 D_800E8540[][4]`
Unk_D_800E70A0 D_800E8540[] = {
{ 0x82, 0x64, 0x00, 0x00 }, { 0x82, 0x64, 0x00, 0x00 }, { 0x82, 0x64, 0x00, 0x00 }, { 0x82, 0x64, 0x00, 0x00 },
{ 0x6e, 0x28, 0x00, 0x00 }, { 0x6e, 0xa0, 0x00, 0x00 }, { 0x6e, 0x28, 0x00, 0x00 }, { 0x6e, 0xa0, 0x00, 0x00 },
{ 0x28, 0x64, 0x00, 0x00 }, { 0xb2, 0x64, 0x00, 0x00 }, { 0x28, 0x64, 0x00, 0x00 }, { 0xb2, 0x64, 0x00, 0x00 },
{ 0x28, 0x28, 0x00, 0x00 }, { 0xb2, 0x28, 0x00, 0x00 }, { 0x28, 0xa0, 0x00, 0x00 }, { 0xb2, 0xa0, 0x00, 0x00 },
};
// In a perfect world this would be `Unk_D_800E70A0 D_800E85C0[][4]`
Unk_D_800E70A0 D_800E85C0[] = {
{ 0x69, 0x8c, 0x00, 0x00 }, { 0x78, 0x64, 0x00, 0x00 }, { 0x78, 0x64, 0x00, 0x00 }, { 0x78, 0x64, 0x00, 0x00 },
{ 0x69, 0x55, 0x00, 0x00 }, { 0x69, 0xcd, 0x00, 0x00 }, { 0x78, 0x28, 0x00, 0x00 }, { 0x78, 0xa0, 0x00, 0x00 },
};
// In a perfect world this would be `Unk_D_800E70A0 D_800E8600[][4]`
Unk_D_800E70A0 D_800E8600[] = {
{ 0x78, 0x64, 0x00, 0x00 }, { 0x78, 0x64, 0x00, 0x00 }, { 0x78, 0x64, 0x00, 0x00 }, { 0x78, 0x64, 0x00, 0x00 },
{ 0x6e, 0x28, 0x00, 0x00 }, { 0x6e, 0xa0, 0x00, 0x00 }, { 0x6e, 0x28, 0x00, 0x00 }, { 0x6e, 0xa0, 0x00, 0x00 },
{ 0x28, 0x64, 0x00, 0x00 }, { 0xb2, 0x64, 0x00, 0x00 }, { 0x28, 0x64, 0x00, 0x00 }, { 0xb2, 0x64, 0x00, 0x00 },
{ 0x28, 0x28, 0x00, 0x00 }, { 0xb2, 0x28, 0x00, 0x00 }, { 0x28, 0xa0, 0x00, 0x00 }, { 0xb2, 0xa0, 0x00, 0x00 },
};
f64 exponent_by_squaring(f64 base, s32 exponent) {
s32 positive_exponent;
f64 result;
if (exponent < 0) {
positive_exponent = -exponent;
} else {
positive_exponent = exponent;
}
result = 1.0;
if (positive_exponent != 0) {
do {
if ((positive_exponent & 1) != 0) {
result *= base;
}
positive_exponent >>= 1;
base *= base;
} while (positive_exponent != 0);
}
if (exponent >= 0) {
return result;
}
return 1.0 / result;
}
f64 func_800917B0(f64 arg0, f64 arg1) {
if ((arg1 <= 2147483647.0) && (-2147483647.0 <= arg1)) {
if (arg1 == (s32) arg1) {
return exponent_by_squaring(arg0, arg1);
}
}
if (arg0 > 0.0) {
return func_8009195C(func_8009186C(arg0) * arg1);
}
return 0.0;
}
f64 func_8009186C(f64 arg0) {
s32 var_v0;
s32 sp38;
f64 var_f2;
f64 temp_f0;
f64 temp_f12;
if (arg0 <= 0.0) {
return 0.0;
}
func_80091AC0(arg0 / 1.414213562373095, &sp38);
arg0 /= func_80091A6C(1.0, sp38);
var_v0 = 1;
arg0 = (arg0 - 1.0) / (arg0 + 1.0);
temp_f12 = arg0 * arg0;
var_f2 = arg0;
do {
var_v0 += 2;
arg0 *= temp_f12;
temp_f0 = var_f2;
var_f2 += arg0 / (f64) var_v0;
} while (temp_f0 != var_f2);
return ((f64) sp38 * 0.6931471805599453) + (2 * var_f2);
}
#ifdef NON_MATCHING
// https://decomp.me/scratch/dXpT5
// Some math reordering issues on the continued fraction line
f64 func_8009195C(f64 arg0) {
s32 temp_f10;
s32 six = 6;
s32 ten = 10;
s32 fourteen = 14;
s32 eighteen = 18;
f64 temp_f2;
if (arg0 >= 0.0) {
temp_f2 = 0.5;
} else {
temp_f2 = -0.5;
}
temp_f10 = temp_f2 + (arg0 / 0.6931471805599453);
arg0 -= (temp_f10 * 0.6931471805599453);
temp_f2 = arg0 * arg0;
/**
* This is the denominator part a tanh(x/2) continued fraction, where arg0 is x
* The best reference to this I can find is:
*https://math.stackexchange.com/questions/3241906/continued-fraction-02-6-10-14-22n-1-frace-1e1
**/
temp_f2 =
2 + (temp_f2 / (six + (temp_f2 / (ten + (temp_f2 / (fourteen + (temp_f2 / (eighteen + (temp_f2 / 22)))))))));
return func_80091A6C((temp_f2 + arg0) / (temp_f2 - arg0), temp_f10);
}
#else
GLOBAL_ASM("asm/non_matchings/menu_items/func_8009195C.s")
#endif
/**
* This function appears to multiply some `value`
* by 2 ^ `exponent`, even if that exponent is negative
**/
f64 func_80091A6C(f64 value, s32 exponent) {
f64 base;
if (exponent >= 0) {
base = 2.0;
} else {
exponent = -exponent;
base = 0.5;
}
if (exponent != 0) {
do {
if ((exponent & 1) != 0) {
value *= base;
}
exponent >>= 1;
base *= base;
} while (exponent != 0);
}
return value;
}
/**
* Its unclear what exact purpose this function serves
* The function multiplies/divides arg0 by 2 until its in
* the range (0.5, 1.0].
* arg2 appears to track the exponent in the power-of-2
* that would undo the changes to arg0
**/
f64 func_80091AC0(f64 arg0, s32* arg2) {
const f64 const1 = 2.0;
s32 exponent = 0;
while ((arg0 < 0.5) || (arg0 >= 1.0)) {
if (arg0 < 0.5) {
arg0 *= const1;
exponent -= 1;
} else {
arg0 /= const1;
exponent += 1;
}
}
*arg2 = exponent;
return arg0;
}
void swap_values(s32* arg0, s32* arg1) {
s32 temp;
temp = *arg0;
*arg0 = *arg1;
*arg1 = temp;
}
extern s8 D_800E852C;
void func_80091B78(void) {
s32 why = 0;
s32 i;
if (D_800E852C) {
D_800E852C = why;
gVersusResultCursorSelection = 10;
gTimeTrialsResultCursorSelection = 5;
gBattleResultCursorSelection = 10;
if (osEepromProbe(&gSIEventMesgQueue) != 0) {
load_save_data();
}
if (func_80091D74() != 0) {
gMenuSelection = CONTROLLER_PAK_MENU;
}
}
if (gMenuSelection == LOGO_INTRO_MENU) {
gNextFreeMemoryAddress = gFreeMemoryResetAnchor;
set_segment_base_addr(6, decompress_segments((u8*) STARTUP_LOGO_ROM_START, (u8*) STARTUP_LOGO_ROM_END));
}
gNextFreeMemoryAddress = gFreeMemoryResetAnchor;
// Hypothetically, this should be a ptr... But only hypothetically.
gMenuTextureBuffer = get_next_available_memory_addr(0x000900B0);
gMenuCompressedBuffer = (u8*) get_next_available_memory_addr(0x0000CE00);
sTKMK00_LowResBuffer = (u8*) get_next_available_memory_addr(SCREEN_WIDTH * SCREEN_HEIGHT);
gSomeDLBuffer = (struct_8018EE10_entry*) get_next_available_memory_addr(0x00001000);
func_800AF9B0();
unref_8018EE0C = 0;
for (i = 0; i < 5; i++) {
gTransitionType[i] = 0;
}
for (i = 0; i < 4; i++) {
D_8018E838[i] = 0;
}
D_800DC5EC->screenStartX = 160;
D_800DC5EC->screenStartY = 120;
D_800DC5EC->screenWidth = SCREEN_WIDTH;
D_800DC5EC->screenHeight = SCREEN_HEIGHT;
gFadeModeSelection = FADE_MODE_MAIN;
setup_menus();
for (i = 0; i < 4; i++) {
func_800C97C4((u8) i);
}
for (i = 1; i < 8; i++) {
func_800C9D0C((u8) i);
}
set_sound_mode();
osViSetSpecialFeatures(OS_VI_DITHER_FILTER_ON);
}
s32 func_80091D74(void) {
u8 sp67;
UNUSED s32 pad[10];
s32 i;
if (!gControllerBits) {
return 0;
}
if ((!gControllerStatuses[0].status) & CONT_CARD_ON) {
return 0;
}
if (!(gControllerOne->button & START_BUTTON)) {
return 0;
}
osPfsIsPlug(&gSIEventMesgQueue, &sp67);
if (sp67 & 1) {
if (osPfsInit(&gSIEventMesgQueue, &gControllerPak1FileHandle, 0)) {
return 0;
}
} else {
return 0;
}
if (osPfsNumFiles(&gControllerPak1FileHandle, &gControllerPak1NumFilesUsed, &gControllerPak1MaxWriteableFiles)) {
return 0;
}
for (i = 0; i < 16; i++) {
pfsError[i] = osPfsFileState(&gControllerPak1FileHandle, i, pfsState + i);
}
if (osPfsFreeBlocks(&gControllerPak1FileHandle, &gControllerPak1NumPagesFree)) {
return 0;
}
gControllerPak1NumPagesFree >>= 8;
return 1;
}
void func_80091EE4(void) {
s32 temp_s0;
s32 temp_s2;
s32 tmp;
gControllerPak1State = BAD;
tmp = func_800B5F30();
if ((gGhostPlayerInit != 0) && (tmp == 0)) {
temp_s2 = (gCupSelection * 4) + gCourseIndexInCup;
func_800B6708();
for (temp_s0 = 0; temp_s0 < 2; ++temp_s0) {
if ((D_8018EE10[temp_s0].ghostDataSaved != 0) && (temp_s2 == D_8018EE10[temp_s0].courseIndex)) {
func_800B64EC(temp_s0);
temp_s0 = 2;
gGhostPlayerInit = 0;
}
}
}
}
void func_80091FA4(void) {
s32 i;
//! @todo These sizes need to be sizeof() for shiftability if possible
gMenuCompressedBuffer = (u8*) get_next_available_memory_addr(0x00002800);
gMenuTextureBuffer = (u16*) get_next_available_memory_addr(0x000124F8);
sTKMK00_LowResBuffer = (u8*) get_next_available_memory_addr(0x00001000);
sGPPointsCopy = get_next_available_memory_addr(4);
for (i = 0; i < 5; i++) {
gTransitionType[i] = 0;
}
for (i = 0; i < 4; i++) {
D_8018E838[i] = 0;
}
clear_menu_textures();
func_8009A344();
clear_menus();
func_80092258();
add_menu_item(MENU_ITEM_TYPE_096, 0x00000064, 0x00000024, MENU_ITEM_PRIORITY_1);
add_menu_item(MENU_ITEM_TYPE_097, 0x00000064, 0x000000DD, MENU_ITEM_PRIORITY_1);
add_menu_item(MENU_ITEM_TYPE_098, 0, 0, MENU_ITEM_PRIORITY_0);
add_menu_item(MENU_ITEM_PAUSE, 0, 0, MENU_ITEM_PRIORITY_0);
if (gModeSelection == TIME_TRIALS) {
add_menu_item(MENU_ITEM_TYPE_0BE, 0, 0, MENU_ITEM_PRIORITY_0);
add_menu_item(MENU_ITEM_TYPE_10E, 0, 0, MENU_ITEM_PRIORITY_0);
}
if ((D_8015F890 != 0) && (gModeSelection == TIME_TRIALS)) {
add_menu_item(MENU_ITEM_END_COURSE_OPTION, 0, 0, MENU_ITEM_PRIORITY_0);
}
if (!(gControllerBits & 1) && (gDemoUseController != 0)) {
add_menu_item(MENU_ITEM_UI_NO_CONTROLLER, 0, 0, MENU_ITEM_PRIORITY_2);
}
func_800B5F30();
}
void func_80092148(void) {
struct Controller* controller = gControllerFive;
s32 isHeld;
isHeld = controller->button ? 1 : 0;
if (controller->buttonPressed) {
D_8018D9D9 = 1;
}
if ((isHeld) && (D_8018D9D9)) {
D_8018D9D8 = 1;
return;
}
D_8018D9D8 = 0;
}
void func_800921B4(void) {
D_8018D9D9 = 0;
}
// if selected and detect kind menu
void text_rainbow_effect(s32 test, s32 target, s32 alternative_color) {
if (test == target) {
if (is_screen_being_faded() != 0) {
set_text_color(gGlobalTimer % 3);
} else {
set_text_color(TEXT_BLUE_GREEN_RED_CYCLE_2);
}
} else {
set_text_color(alternative_color);
}
}
void set_text_color_rainbow_if_selected(s32 test, s32 target, s32 alternative_color) {
if (test == target) {
set_text_color(TEXT_BLUE_GREEN_RED_CYCLE_2);
} else {
set_text_color(alternative_color);
}
}
void func_80092258(void) {
s32 i;
for (i = 0; i < 2; i++) {
D_8018E850[i] = i;
D_8018E858[i] = 0;
}
}
void func_80092290(s32 arg0, s32* arg1, s32* arg2) {
s32 temp_v1;
s32 i;
s32 idx;
s32 temp_t6;
s32 temp_t7;
s32 temp_t8_2;
s32 temp_t9;
UNUSED s32 temp_t0;
s32 a, b, c, d;
Vtx* vtx;
if ((arg0 < 4) || (arg0 >= 6)) {
return;
}
idx = (((arg0 * 4) + ((gGlobalTimer % 2) * 2)) - 6);
*arg2 += 16;
if (*arg2 >= 256) {
*arg2 = 0;
*arg1 = (s32) (*arg1 + 1) % 3;
}
for (i = 0; i < 3; i++) {
vtx = (Vtx*) segmented_to_virtual_dupe_2(D_800E84C0[i]);
temp_v1 = (*arg1 * 2) + 2;
temp_t6 = (vtx + temp_v1)->v.cn[0] * (256 - *arg2);
temp_t9 = (vtx + temp_v1)->v.cn[1] * (256 - *arg2);
temp_t7 = (vtx + temp_v1)->v.cn[2] * (256 - *arg2);
temp_t8_2 = (vtx + temp_v1)->v.cn[3] * (256 - *arg2);
temp_v1 = (((*arg1 * 2) + 2) % 6) + 2;
a = ((vtx + temp_v1)->v.cn[0] * *arg2);
b = ((vtx + temp_v1)->v.cn[1] * *arg2);
c = ((vtx + temp_v1)->v.cn[2] * *arg2);
d = ((vtx + temp_v1)->v.cn[3] * *arg2);
(vtx + idx)->v.cn[0] = (temp_t6 + a) / 256;
(vtx + idx)->v.cn[1] = (temp_t9 + b) / 256;
(vtx + idx)->v.cn[2] = (temp_t7 + c) / 256;
(vtx + idx)->v.cn[3] = (temp_t8_2 + d) / 256;
(vtx + idx + 1)->v.cn[0] = (temp_t6 + a) / 256;
(vtx + idx + 1)->v.cn[1] = (temp_t9 + b) / 256;
(vtx + idx + 1)->v.cn[2] = (temp_t7 + c) / 256;
(vtx + idx + 1)->v.cn[3] = (temp_t8_2 + d) / 256;
}
}
void func_80092500(void) {
switch (gModeSelection) {
case GRAND_PRIX:
add_menu_item(MENU_ITEM_TYPE_0AA, 0, 0, MENU_ITEM_PRIORITY_0);
break;
case TIME_TRIALS:
add_menu_item(MENU_ITEM_TYPE_0B9, 0, 0, MENU_ITEM_PRIORITY_0);
break;
}
}
void func_80092564(void) {
add_menu_item(MENU_ITEM_TYPE_0AC, 0, 0, MENU_ITEM_PRIORITY_0);
func_8005D18C();
func_8001968C();
}
void func_800925A0(void) {
add_menu_item(MENU_ITEM_TYPE_0AF, 0, 0, MENU_ITEM_PRIORITY_0);
}
void func_800925CC(void) {
MenuItem* temp = find_menu_items_dupe(MENU_ITEM_TYPE_0AF);
if (temp->state == 2) {
temp->state = 3;
}
}
void func_80092604(void) {
add_menu_item(MENU_ITEM_TYPE_0B0, 0, 0, MENU_ITEM_PRIORITY_0);
}
void func_80092630(void) {
add_menu_item(MENU_ITEM_ANNOUNCE_GHOST, 0, 0, MENU_ITEM_PRIORITY_0);
}
void func_8009265C(void) {
add_menu_item(MENU_ITEM_TYPE_12B, 0, 0, MENU_ITEM_PRIORITY_2);
}
void func_80092688(void) {
switch (D_800DC5E4) {
case 0:
add_menu_item(MENU_ITEM_TYPE_1CE, 0, 0, MENU_ITEM_PRIORITY_2);
return;
default:
add_menu_item(MENU_ITEM_TYPE_190, 0, 0, MENU_ITEM_PRIORITY_2);
add_menu_item(MENU_ITEM_TYPE_191, 0, 0, MENU_ITEM_PRIORITY_2);
return;
case 2:
add_menu_item(MENU_ITEM_TYPE_192, 0, 0, MENU_ITEM_PRIORITY_2);
add_menu_item(MENU_ITEM_TYPE_193, 0, 0, MENU_ITEM_PRIORITY_2);
return;
case 3:
add_menu_item(MENU_ITEM_TYPE_194, 0, 0, MENU_ITEM_PRIORITY_2);
add_menu_item(MENU_ITEM_TYPE_195, 0, 0, MENU_ITEM_PRIORITY_2);
return;
case 4:
add_menu_item(MENU_ITEM_TYPE_196, 0, 0, MENU_ITEM_PRIORITY_2);
add_menu_item(MENU_ITEM_TYPE_197, 0, 0, MENU_ITEM_PRIORITY_2);
return;
case 5:
add_menu_item(MENU_ITEM_TYPE_198, 0, 0, MENU_ITEM_PRIORITY_2);
add_menu_item(MENU_ITEM_TYPE_199, 0, 0, MENU_ITEM_PRIORITY_2);
add_menu_item(MENU_ITEM_TYPE_19A, 0, 0, MENU_ITEM_PRIORITY_2);
add_menu_item(MENU_ITEM_TYPE_19B, 0, 0, MENU_ITEM_PRIORITY_2);
return;
case 6:
add_menu_item(MENU_ITEM_TYPE_198, 0, 0, MENU_ITEM_PRIORITY_2);
add_menu_item(MENU_ITEM_TYPE_19C, 0, 0, MENU_ITEM_PRIORITY_2);
add_menu_item(MENU_ITEM_TYPE_19D, 0, 0, MENU_ITEM_PRIORITY_2);
add_menu_item(MENU_ITEM_TYPE_19E, 0, 0, MENU_ITEM_PRIORITY_2);
return;
case 7:
add_menu_item(MENU_ITEM_TYPE_19F, 0, 0, MENU_ITEM_PRIORITY_2);
add_menu_item(MENU_ITEM_TYPE_1A0, 0, 0, MENU_ITEM_PRIORITY_2);
add_menu_item(MENU_ITEM_TYPE_1A1, 0, 0, MENU_ITEM_PRIORITY_2);
add_menu_item(MENU_ITEM_TYPE_1A2, 0, 0, MENU_ITEM_PRIORITY_2);
return;
case 8:
add_menu_item(MENU_ITEM_TYPE_1A3, 0, 0, MENU_ITEM_PRIORITY_2);
add_menu_item(MENU_ITEM_TYPE_1A4, 0, 0, MENU_ITEM_PRIORITY_2);
return;
case 9:
add_menu_item(MENU_ITEM_TYPE_1A5, 0, 0, MENU_ITEM_PRIORITY_2);
add_menu_item(MENU_ITEM_TYPE_1A6, 0, 0, MENU_ITEM_PRIORITY_2);
add_menu_item(MENU_ITEM_TYPE_1A7, 0, 0, MENU_ITEM_PRIORITY_2);
add_menu_item(MENU_ITEM_TYPE_1A8, 0, 0, MENU_ITEM_PRIORITY_2);
add_menu_item(MENU_ITEM_TYPE_1A9, 0, 0, MENU_ITEM_PRIORITY_2);
return;
case 10:
add_menu_item(MENU_ITEM_TYPE_1A5, 0, 0, MENU_ITEM_PRIORITY_2);
add_menu_item(MENU_ITEM_TYPE_1A6, 0, 0, MENU_ITEM_PRIORITY_2);
add_menu_item(MENU_ITEM_TYPE_1AA, 0, 0, MENU_ITEM_PRIORITY_2);
add_menu_item(MENU_ITEM_TYPE_1AB, 0, 0, MENU_ITEM_PRIORITY_2);
add_menu_item(MENU_ITEM_TYPE_1AC, 0, 0, MENU_ITEM_PRIORITY_2);
return;
case 11:
add_menu_item(MENU_ITEM_TYPE_1AD, 0, 0, MENU_ITEM_PRIORITY_2);
add_menu_item(MENU_ITEM_TYPE_1AE, 0, 0, MENU_ITEM_PRIORITY_2);
add_menu_item(MENU_ITEM_TYPE_1AF, 0, 0, MENU_ITEM_PRIORITY_2);
add_menu_item(MENU_ITEM_TYPE_1B0, 0, 0, MENU_ITEM_PRIORITY_2);
return;
case 12:
add_menu_item(MENU_ITEM_TYPE_1B1, 0, 0, MENU_ITEM_PRIORITY_2);
add_menu_item(MENU_ITEM_TYPE_1B2, 0, 0, MENU_ITEM_PRIORITY_2);
return;
case 13:
add_menu_item(MENU_ITEM_TYPE_1B3, 0, 0, MENU_ITEM_PRIORITY_2);
add_menu_item(MENU_ITEM_TYPE_1B4, 0, 0, MENU_ITEM_PRIORITY_2);
add_menu_item(MENU_ITEM_TYPE_1B5, 0, 0, MENU_ITEM_PRIORITY_2);
return;
case 14:
add_menu_item(MENU_ITEM_TYPE_1B6, 0, 0, MENU_ITEM_PRIORITY_2);
add_menu_item(MENU_ITEM_TYPE_1B7, 0, 0, MENU_ITEM_PRIORITY_2);
add_menu_item(MENU_ITEM_TYPE_1B8, 0, 0, MENU_ITEM_PRIORITY_2);
add_menu_item(MENU_ITEM_TYPE_1B9, 0, 0, MENU_ITEM_PRIORITY_2);
add_menu_item(MENU_ITEM_TYPE_1BA, 0, 0, MENU_ITEM_PRIORITY_2);
add_menu_item(MENU_ITEM_TYPE_1BB, 0, 0, MENU_ITEM_PRIORITY_2);
add_menu_item(MENU_ITEM_TYPE_1BC, 0, 0, MENU_ITEM_PRIORITY_2);
return;
case 15:
add_menu_item(MENU_ITEM_TYPE_1BD, 0, 0, MENU_ITEM_PRIORITY_2);
add_menu_item(MENU_ITEM_TYPE_1BE, 0, 0, MENU_ITEM_PRIORITY_2);
add_menu_item(MENU_ITEM_TYPE_1BF, 0, 0, MENU_ITEM_PRIORITY_2);
add_menu_item(MENU_ITEM_TYPE_1C0, 0, 0, MENU_ITEM_PRIORITY_2);
return;
case 16:
add_menu_item(MENU_ITEM_TYPE_1C1, 0, 0, MENU_ITEM_PRIORITY_2);
add_menu_item(MENU_ITEM_TYPE_1C2, 0, 0, MENU_ITEM_PRIORITY_2);
add_menu_item(MENU_ITEM_TYPE_1C3, 0, 0, MENU_ITEM_PRIORITY_2);
return;
case 17:
add_menu_item(MENU_ITEM_TYPE_1C4, 0, 0, MENU_ITEM_PRIORITY_2);
add_menu_item(MENU_ITEM_TYPE_1C5, 0, 0, MENU_ITEM_PRIORITY_2);
add_menu_item(MENU_ITEM_TYPE_1C6, 0, 0, MENU_ITEM_PRIORITY_2);
add_menu_item(MENU_ITEM_TYPE_1C7, 0, 0, MENU_ITEM_PRIORITY_2);
add_menu_item(MENU_ITEM_TYPE_1C8, 0, 0, MENU_ITEM_PRIORITY_2);
add_menu_item(MENU_ITEM_TYPE_1C9, 0, 0, MENU_ITEM_PRIORITY_2);
add_menu_item(MENU_ITEM_TYPE_1CA, 0, 0, MENU_ITEM_PRIORITY_2);
add_menu_item(MENU_ITEM_TYPE_1CB, 0, 0, MENU_ITEM_PRIORITY_2);
add_menu_item(MENU_ITEM_TYPE_1CC, 0, 0, MENU_ITEM_PRIORITY_2);
return;
case 18:
add_menu_item(MENU_ITEM_TYPE_1CD, 0, 0, MENU_ITEM_PRIORITY_2);
return;
}
}
void func_80092C80(void) {
D_8018ED91 = 1;
}
// Originally func_80092C90
// Some kind of lookup function, seems to return an index to be used
// to get a character's width in pixels
s32 char_to_glyph_index(char* character) {
s32 index;
s8 temp_v0;
temp_v0 = *character;
index = 1;
if ((temp_v0 >= 'a') && (temp_v0 <= 'z')) {
index = temp_v0 - 0x61;
} else if ((temp_v0 >= 'A') && (temp_v0 <= 'Z')) {
index = temp_v0 - 0x41;
} else if ((temp_v0 >= '0') && (temp_v0 <= '9')) {
index = temp_v0 - 0x10;
} else if (temp_v0 == ' ') {
index = -1;
} else if (temp_v0 < 0) {
// Handling EUC-JUP characters
switch (temp_v0) { /* irregular */
case -92: // 0xA4
index = func_80092E1C(character + 1);
break;
case -91: // 0xA5
index = func_80092DF8(character + 1);
break;
case -95: // 0xA1
case -93: // 0xA3
case -85: // 0xAB
index = func_80092EE4(character);
break;
}
} else {
switch (temp_v0) {
case '!':
index = 0x0000001A;
break;
case '-':
index = 0x0000001B;
break;
case '?':
index = 0x0000001C;
break;
case '\'':
index = 0x0000001D;
break;
case '$':
index = 0x0000001E;
break;
case '.':
index = 0x0000001F;
break;
case '\"':
index = 0x0000002A;
break;
case '*':
index = 0x0000002B;
break;
case '+':
index = 0x0000002C;
break;
// Displayed as "cc"
case '(':
index = 0x0000002D;
break;
case ',':
index = 0x0000002E;
break;
default:
index = -2;
break;
}
}
return index;
}
s32 func_80092DF8(char* arg) {
return func_80092E1C(arg) + 0x50;
}
s32 func_80092E1C(char* character) {
s32 ret;
UNUSED s32 test;
u8 temp_t6;
u8 temp;
temp_t6 = (*character + 0x80);
// Huh?
temp = temp_t6;
if (temp) {}
if ((temp > 0x20) && (temp < 0x2B)) {
if (temp % 2) {
ret = ((temp - 0x21) / 2) + 0x7B;
} else {
ret = ((temp - 0x21) / 2) + 0x30;
}
} else if ((temp > 0x2A) && (temp < 0x6E)) {
ret = temp + 0xA;
} else {
switch (temp) { /* irregular */
case 0x6F:
ret = 0x00000078;
break;
case 0x72:
case 0x73:
ret = temp + 7;
break;
default:
ret = -2;
break;
}
}
return ret;
}
s32 func_80092EE4(char* character) {
u8 temp_t6;
s32 var_v1;
temp_t6 = (character[1] + 0x80);
var_v1 = 2;
switch (character[0]) { /* switch 3; irregular */
case -95: /* switch 3 */
switch (temp_t6) { /* switch 1 */
case 0x22: /* switch 1 */
case 0x24: /* switch 1 */
var_v1 = 0x000000EA;
break;
case 0x23: /* switch 1 */
var_v1 = 0x000000E9;
break;
case 0x25: /* switch 1 */
var_v1 = 0x000000D0;
break;
case 0x2A: /* switch 1 */
var_v1 = 0x000000E8;
break;
case 0x30: /* switch 1 */
var_v1 = 0x000000EB;
break;
case 0x47: /* switch 1 */
var_v1 = 0x000000D1;
break;
case 0x49: /* switch 1 */
var_v1 = 0x000000D2;
break;
case 0x5C: /* switch 1 */
var_v1 = 0x000000D3;
break;
case 0x3C: /* switch 1 */
case 0x3D: /* switch 1 */
case 0x5D: /* switch 1 */
var_v1 = 0x000000D4;
break;
default: /* switch 1 */
break;
}
break;
case -93: /* switch 3 */
if ((temp_t6 >= 0x30) && (temp_t6 < 0x3A)) {
var_v1 = temp_t6 + 0xA5;
} else {
switch (temp_t6) { /* switch 2 */
case 0x44: /* switch 2 */
var_v1 = 0x000000DF;
break;
case 0x43: /* switch 2 */
case 0x63: /* switch 2 */
var_v1 = 0x000000E0;
break;
case 0x4E: /* switch 2 */
case 0x6E: /* switch 2 */
var_v1 = 0x000000E1;
break;
case 0x50: /* switch 2 */
case 0x70: /* switch 2 */
var_v1 = 0x000000E2;
break;
case 0x52: /* switch 2 */
case 0x72: /* switch 2 */
var_v1 = 0x000000E3;
break;
case 0x73: /* switch 2 */
var_v1 = 0x000000E4;
break;
case 0x54: /* switch 2 */
case 0x74: /* switch 2 */
var_v1 = 0x000000E5;
break;
case 0x53: /* switch 2 */
var_v1 = 0x000000E6;
break;
case 0x56: /* switch 2 */
case 0x76: /* switch 2 */
var_v1 = 0x000000E7;
break;
default: /* switch 2 */
break;
}
}
break;
case -85: /* switch 3 */
if (temp_t6 == 0x2E) {
var_v1 = 0x000000E0;
}
break;
default: /* switch 3 */
var_v1 = 2;
}
return var_v1;
}
// Originally func_80093034
s32 get_string_width(char* buffer) {
s32 glyphIndex;
s32 stringWidth = 0;
if (*buffer != 0) {
do {
glyphIndex = char_to_glyph_index(buffer);
if (glyphIndex >= 0) {
stringWidth += gGlyphDisplayWidth[glyphIndex];
} else if (glyphIndex == -1) {
stringWidth += 7;
}
if (glyphIndex >= 0x30) {
buffer += 2;
} else {
buffer += 1;
}
} while (*buffer != 0);
}
return stringWidth;
}
void set_text_color(s32 arg0) {
gTextColor = arg0;
}
UNUSED void func_800930E4(s32 arg0, s32 arg1, char* arg2) {
set_text_color(TEXT_BLUE);
print_text_mode_1(arg0, arg1, arg2, 0, 1.0, 1.0);
}
// "tracking" is a uniform spacing between all characters in a given word
void print_text0(s32 column, s32 row, char* text, s32 tracking, f32 scaleX, f32 scaleY, s32 mode) {
s32 stringWidth = 0;
s32 glyphIndex;
gSPDisplayList(gDisplayListHead++, D_020077A8);
if (*text != 0) {
do {
glyphIndex = char_to_glyph_index(text);
if (glyphIndex >= 0) {
load_menu_img((MenuTexture*) segmented_to_virtual_dupe((const void*) gGlyphTextureLUT[glyphIndex]));
gDisplayListHead =
print_letter(gDisplayListHead,
(MenuTexture*) segmented_to_virtual_dupe((const void*) gGlyphTextureLUT[glyphIndex]),
column + (stringWidth * scaleX), row, mode, scaleX, scaleY);
stringWidth += gGlyphDisplayWidth[glyphIndex] + tracking;
} else if ((glyphIndex != -2) && (glyphIndex == -1)) {
stringWidth += tracking + 7;
} else {
gSPDisplayList(gDisplayListHead++, D_020077D8);
return;
}
if (glyphIndex >= 0x30) {
text += 2;
} else {
text += 1;
}
} while (*text != 0);
}
gSPDisplayList(gDisplayListHead++, D_020077D8);
}
void print_text_mode_1(s32 column, s32 row, char* text, s32 tracking, f32 scaleX, f32 scaleY) {
print_text0(column, row, text, tracking, scaleX, scaleY, 1);
}
void print_text_mode_2(s32 column, s32 row, char* text, s32 tracking, f32 scaleX, f32 scaleY) {
print_text0(column, row, text, tracking, scaleX, scaleY, 2);
}
// "tracking" is a uniform spacing between all characters in a given word
void print_text1(s32 column, s32 row, char* text, s32 tracking, f32 scaleX, f32 scaleY, s32 arg6) {
char* temp_string = text;
s32 stringWidth = 0;
s32 glyphIndex;
s32 sp60;
while (*temp_string != 0) {
glyphIndex = char_to_glyph_index(temp_string);
if (glyphIndex >= 0) {
stringWidth += ((gGlyphDisplayWidth[glyphIndex] + tracking) * scaleX);
} else if ((glyphIndex != -2) && (glyphIndex == -1)) {
stringWidth += ((tracking + 7) * scaleX);
} else {
return;
}
if (glyphIndex >= 0x30) {
temp_string += 2;
} else {
temp_string += 1;
}
}
switch (arg6) {
case LEFT_TEXT:
// ???
do {
} while (0);
case RIGHT_TEXT:
column -= stringWidth;
break;
case CENTER_TEXT_MODE_1:
case CENTER_TEXT_MODE_2:
column -= stringWidth / 2;
break;
default:
break;
}
if (arg6 < 3) {
sp60 = 1;
} else {
sp60 = 2;
}
gSPDisplayList(gDisplayListHead++, D_020077A8);
while (*text != 0) {
glyphIndex = char_to_glyph_index(text);
if (glyphIndex >= 0) {
load_menu_img(segmented_to_virtual_dupe(gGlyphTextureLUT[glyphIndex]));
gDisplayListHead = print_letter(gDisplayListHead, segmented_to_virtual_dupe(gGlyphTextureLUT[glyphIndex]),
column, row, sp60, scaleX, scaleY);
column = column + (s32) ((gGlyphDisplayWidth[glyphIndex] + tracking) * scaleX);
} else if ((glyphIndex != -2) && (glyphIndex == -1)) {
column = column + (s32) ((tracking + 7) * scaleX);
} else {
gSPDisplayList(gDisplayListHead++, D_020077D8);
return;
}
if (glyphIndex >= 0x30) {
text += 2;
} else {
text += 1;
}
}
gSPDisplayList(gDisplayListHead++, D_020077D8);
}
void print_text1_left(s32 column, s32 row, char* text, s32 tracking, f32 scaleX, f32 scaleY) {
print_text1(column, row, text, tracking, scaleX, scaleY, LEFT_TEXT);
}
void print_text1_center_mode_1(s32 column, s32 row, char* text, s32 tracking, f32 scaleX, f32 scaleY) {
print_text1(column, row, text, tracking, scaleX, scaleY, CENTER_TEXT_MODE_1);
}
void print_text1_right(s32 column, s32 row, char* text, s32 tracking, f32 scaleX, f32 scaleY) {
print_text1(column, row, text, tracking, scaleX, scaleY, RIGHT_TEXT);
}
void print_text1_center_mode_2(s32 column, s32 row, char* text, s32 tracking, f32 scaleX, f32 scaleY) {
print_text1(column, row, text, tracking, scaleX, scaleY, CENTER_TEXT_MODE_2);
}
void print_text2(s32 column, s32 row, char* text, s32 tracking, f32 scaleX, f32 scaleY, s32 arg6) {
MenuTexture* glyphTexture;
s32 characterWidth;
s32 glyphIndex;
gSPDisplayList(gDisplayListHead++, D_020077A8);
if (*text != 0) {
do {
glyphIndex = char_to_glyph_index(text);
if (glyphIndex >= 0) {
glyphTexture = (MenuTexture*) segmented_to_virtual_dupe((const void*) gGlyphTextureLUT[glyphIndex]);
load_menu_img(glyphTexture);
gDisplayListHead =
print_letter(gDisplayListHead, glyphTexture, column - (gGlyphDisplayWidth[glyphIndex] / 2), row,
arg6, scaleX, scaleY);
if ((glyphIndex >= 0xD5) && (glyphIndex < 0xE0)) {
characterWidth = 0x20;
} else {
characterWidth = 0xC;
}
column = column + (s32) ((characterWidth + tracking) * scaleX);
} else if ((glyphIndex != -2) && (glyphIndex == -1)) {
column = column + (s32) ((tracking + 7) * scaleX);
} else {
gSPDisplayList(gDisplayListHead++, D_020077D8);
return;
}
if (glyphIndex >= 0x30) {
text += 2;
} else {
text += 1;
}
} while (*text != 0);
}
gSPDisplayList(gDisplayListHead++, D_020077D8);
}
void func_800939C8(s32 column, s32 row, char* text, s32 tracking, f32 scaleX, f32 scaleY) {
print_text2(column, row, text, tracking, scaleX, scaleY, 1);
}
void text_draw(s32 column, s32 row, char* text, s32 tracking, f32 scaleX, f32 scaleY) {
print_text2(column, row, text, tracking, scaleX, scaleY, 2);
}
void func_80093A30(s32 arg0) {
func_8009E2A8(D_800F0B1C[arg0]);
}
void func_80093A5C(u32 arg0) {
if (D_8015F788 == 0) {
func_8009C918();
}
switch (arg0) {
case RENDER_SCREEN_MODE_1P_PLAYER_ONE:
func_800940EC((s32) D_800F0B1C[arg0]);
break;
case RENDER_SCREEN_MODE_2P_HORIZONTAL_PLAYER_ONE:
case RENDER_SCREEN_MODE_2P_HORIZONTAL_PLAYER_TWO:
case RENDER_SCREEN_MODE_2P_VERTICAL_PLAYER_ONE:
case RENDER_SCREEN_MODE_2P_VERTICAL_PLAYER_TWO:
if (D_8015F788 == 0) {
func_80093C1C((s32) D_800F0B1C[arg0]);
} else {
func_800940EC((s32) D_800F0B1C[arg0]);
}
break;
case RENDER_SCREEN_MODE_3P_4P_PLAYER_ONE:
case RENDER_SCREEN_MODE_3P_4P_PLAYER_TWO:
case RENDER_SCREEN_MODE_3P_4P_PLAYER_THREE:
case RENDER_SCREEN_MODE_3P_4P_PLAYER_FOUR:
if (D_8015F788 == 3) {
func_800940EC((s32) D_800F0B1C[arg0]);
} else {
func_80093C1C((s32) D_800F0B1C[arg0]);
}
break;
}
gDPSetRenderMode(gDisplayListHead++, G_RM_OPA_SURF, G_RM_OPA_SURF2);
}
UNUSED void func_80093B70(u32 arg0) {
if ((arg0 == 0) || (arg0 == 2) || (arg0 == 3) || (arg0 == 8)) {
func_8009C918();
}
switch (arg0) {
case 0:
func_800940EC(0);
break;
case 2:
case 3:
case 8:
func_80093C1C(0);
break;
case 1:
case 4:
case 9:
func_800940EC(1);
break;
case 10:
func_80093C1C(2);
break;
case 11:
func_800940EC(3);
break;
default:
break;
}
}
void func_80093C1C(s32 arg0) {
gSPDisplayList(gDisplayListHead++, D_02007F18);
func_8009CA6C(arg0);
gSPDisplayList(gDisplayListHead++, D_02007F48);
}
UNUSED void func_80093C88(void) {
return;
}
UNUSED void func_80093C90(void) {
return;
}
void func_80093C98(s32 arg0) {
gSPViewport(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(D_802B8880));
guOrtho(&gGfxPool->mtxEffect[gMatrixEffectCount], 0.0f, 319.0f, 239.0f, 0.0f, -100.0f, 100.0f, 1.0f);
gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxEffect[gMatrixEffectCount++]),
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION);
gSPDisplayList(gDisplayListHead++, D_02007F18);
gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
handle_menus_special();
if (arg0 == 0) {
func_800A54EC();
func_8009CA6C(4);
D_80165754 = gMatrixEffectCount;
gMatrixEffectCount = 0;
}
}
void func_80093E20(void) {
func_80093C98(0);
}
void func_80093E40(void) {
func_80093C98(1);
}
void func_80093E60(void) {
s32 i;
gMenuCompressedBuffer = get_next_available_memory_addr(0x00002800);
gMenuTextureBuffer = (u16*) get_next_available_memory_addr(0x000124F8);
sTKMK00_LowResBuffer = get_next_available_memory_addr(0x00001000);
sGPPointsCopy = get_next_available_memory_addr(4U);
for (i = 0; i < 5; i++) {
gTransitionType[i] = 0;
}
for (i = 0; i < 4; i++) {
D_8018E838[i] = 0;
}
clear_menu_textures();
func_8009A344();
clear_menus();
func_80092258();
D_8018ED91 = 0;
}
void func_80093F10(void) {
gSPViewport(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(D_802B8880));
guOrtho(&gGfxPool->mtxEffect[gMatrixEffectCount], 0.0f, 319.0f, 239.0f, 0.0f, -100.0f, 100.0f, 1.0f);
gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxEffect[gMatrixEffectCount++]),
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION);
gSPDisplayList(gDisplayListHead++, D_02007F18);
gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, 0, 0, 320, 240);
func_80092290(4, D_8018E850, D_8018E858);
func_80092290(5, (s32*) &D_8018E850[1], (s32*) &D_8018E858[1]);
func_8009C918();
func_80099A70();
func_80099E54();
handle_menus_default();
func_80099AEC();
func_80099EC4();
func_8009CA2C();
gSPDisplayList(gDisplayListHead++, D_02007F48);
gMatrixEffectCount = 0;
}
void func_800940EC(s32 arg0) {
gSPViewport(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(D_802B8880));
gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
guOrtho(&gGfxPool->mtxEffect[gMatrixEffectCount], 0.0f, 319.0f, 239.0f, 0.0f, -100.0f, 100.0f, 1.0f);
gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxEffect[gMatrixEffectCount++]),
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION);
gSPDisplayList(gDisplayListHead++, D_02007F18);
func_80092290(4, D_8018E850, D_8018E858);
func_80092290(5, (s32*) &D_8018E850[1], (s32*) &D_8018E858[1]);
func_80092148();
func_80099A70();
func_80099E54();
handle_menus_default();
func_80099AEC();
func_80099EC4();
func_8009CA6C(arg0);
gSPDisplayList(gDisplayListHead++, D_02007F48);
func_80057CE4();
}
void func_800942D0(void) {
Mtx* test;
f32 var_f26;
s32 var_s2;
s32 thing;
test = &gGfxPool->mtxObject[0];
gSPMatrix(gDisplayListHead++, &gGfxPool->mtxScreen, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION);
gSPMatrix(gDisplayListHead++, &gGfxPool->mtxLookAt[0], G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
guRotate(test, gIntroModelRotX, 1.0f, 0.0f, 0.0f);
guRotate(test + 1, gIntroModelRotY, 0.0f, 1.0f, 0.0f);
guScale(test + 2, 1.0f, 1.0f, gIntroModelScale);
gSPMatrix(gDisplayListHead++, test++, G_MTX_NOPUSH | G_MTX_MUL | G_MTX_MODELVIEW);
gSPMatrix(gDisplayListHead++, test++, G_MTX_NOPUSH | G_MTX_MUL | G_MTX_MODELVIEW);
gSPMatrix(gDisplayListHead++, test++, G_MTX_PUSH | G_MTX_MUL | G_MTX_MODELVIEW);
gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2);
gDPSetEnvColor(gDisplayListHead++, 0x00, 0x00, 0x00, 0x00);
gSPDisplayList(gDisplayListHead++, D_02007F60);
gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW);
if (sIntroModelMotionSpeed > 0) {
var_f26 = sIntroModelSpeed;
if (var_f26 > 10.0f) {
var_f26 = 10.0f;
}
for (var_s2 = 0, thing = 0xC0; var_s2 < 0xC; var_s2++, thing -= 0x10) {
guRotate(test, 0.0f, 1.0f, 0.0f, 0.0f);
guRotate(test + 1, (var_s2 + 1) * sIntroModelMotionSpeed * var_f26, 0.0f, 1.0f, 0.0f);
guScale(test + 2, 1.0f, 1.0f, 2.0f);
gSPMatrix(gDisplayListHead++, test++, G_MTX_PUSH | G_MTX_MUL | G_MTX_MODELVIEW);
gSPMatrix(gDisplayListHead++, test++, G_MTX_NOPUSH | G_MTX_MUL | G_MTX_MODELVIEW);
gSPMatrix(gDisplayListHead++, test++, G_MTX_NOPUSH | G_MTX_MUL | G_MTX_MODELVIEW);
gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_XLU_SURF, G_RM_AA_ZB_XLU_SURF2);
gDPSetEnvColor(gDisplayListHead++, 0x00, 0x00, 0x00, thing);
gSPDisplayList(gDisplayListHead++, startup_texture_dl4);
gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW);
}
}
}
void func_80094660(struct GfxPool* arg0, UNUSED s32 arg1) {
u16 perspNorm;
move_segment_table_to_dmem();
gDPSetTexturePersp(gDisplayListHead++, G_TP_PERSP);
guPerspective(&arg0->mtxScreen, &perspNorm, 45.0f, 1.3333334f, 100.0f, 12800.0f, 1.0f);
gSPPerspNormalize(gDisplayListHead++, perspNorm);
guLookAt(&arg0->mtxLookAt[0], 0.0f, 0.0f, (f32) gIntroModelZEye, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
func_800942D0();
gDPPipeSync(gDisplayListHead++);
gDPSetTexturePersp(gDisplayListHead++, G_TP_NONE);
gDPSetTextureFilter(gDisplayListHead++, G_TF_BILERP);
}
void render_checkered_flag(struct GfxPool* arg0, UNUSED s32 arg1) {
u16 perspNorm;
move_segment_table_to_dmem();
guPerspective(&arg0->mtxPersp[0], &perspNorm, 45.0f, 1.3333334f, 100.0f, 12800.0f, 1.0f);
gSPPerspNormalize(gDisplayListHead++, perspNorm);
guLookAt(&arg0->mtxLookAt[1], 0.0f, 0.0f, (f32) gIntroModelZEye, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
guRotate(&arg0->mtxObject[0], gIntroModelRotX, 1.0f, 0, 0);
guRotate(&arg0->mtxObject[1], gIntroModelRotY, 0, 1.0f, 0);
guRotate(&arg0->mtxObject[2], gIntroModelRotZ, 0, 0, 1.0f);
guScale(&arg0->mtxObject[3], gIntroModelScale, gIntroModelScale, gIntroModelScale);
guTranslate(&arg0->mtxObject[4], gIntroModelPosX, gIntroModelPosY, gIntroModelPosZ);
gSPMatrix(gDisplayListHead++, &arg0->mtxPersp[0], G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION);
gSPMatrix(gDisplayListHead++, &arg0->mtxLookAt[1], G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPMatrix(gDisplayListHead++, &arg0->mtxObject[0], G_MTX_NOPUSH | G_MTX_MUL | G_MTX_MODELVIEW);
gSPMatrix(gDisplayListHead++, &arg0->mtxObject[1], G_MTX_NOPUSH | G_MTX_MUL | G_MTX_MODELVIEW);
gSPMatrix(gDisplayListHead++, &arg0->mtxObject[2], G_MTX_NOPUSH | G_MTX_MUL | G_MTX_MODELVIEW);
gSPMatrix(gDisplayListHead++, &arg0->mtxObject[3], G_MTX_NOPUSH | G_MTX_MUL | G_MTX_MODELVIEW);
gSPMatrix(gDisplayListHead++, &arg0->mtxObject[4], G_MTX_NOPUSH | G_MTX_MUL | G_MTX_MODELVIEW);
gSPDisplayList(gDisplayListHead++, D_02007FC8);
func_800B0004();
gSPDisplayList(gDisplayListHead++, D_02007650);
}
void func_80094A64(struct GfxPool* pool) {
gMatrixHudCount = 0;
gMatrixEffectCount = 0;
gSPViewport(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&D_802B8880));
gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
guOrtho(&pool->mtxScreen, 0.0f, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1, 0.0f, -100.0f, 100.0f, 1.0f);
gSPMatrix(gDisplayListHead++, &pool->mtxScreen, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION);
gSPDisplayList(gDisplayListHead++, D_02007650);
setup_menus();
func_80092290(4, D_8018E850, D_8018E858);
func_80092290(5, &D_8018E850[1], &D_8018E858[1]);
func_80099A70();
func_8009C918();
switch (gMenuSelection) {
case START_MENU:
func_80095574();
func_80093E40();
break;
case OPTIONS_MENU:
case DATA_MENU:
case COURSE_DATA_MENU:
case LOGO_INTRO_MENU:
case CONTROLLER_PAK_MENU:
case MAIN_MENU:
case CHARACTER_SELECT_MENU:
case COURSE_SELECT_MENU:
handle_menus_default();
func_80099AEC();
break;
}
func_8009CA2C();
gCycleFlashMenu += 1;
gDPPipeSync(gDisplayListHead++);
gSPDisplayList(gDisplayListHead++, D_020076B0);
}
void setup_menus(void) {
if (gFadeModeSelection != FADE_MODE_NONE) {
clear_menu_textures();
func_8009A344();
clear_menus();
func_8009B938();
func_80092258();
func_800B5F30();
func_800B6014();
load_menu_states(gMenuSelection);
switch (gMenuSelection) {
case OPTIONS_MENU:
add_menu_item(MAIN_MENU_BACKGROUND, 0, 0, MENU_ITEM_PRIORITY_2);
add_menu_item(MENU_ITEM_TYPE_0F1, 0, 0, MENU_ITEM_PRIORITY_4);
add_menu_item(MENU_ITEM_TYPE_0F0, 0, 0, MENU_ITEM_PRIORITY_2);
break;
case DATA_MENU:
add_menu_item(MAIN_MENU_BACKGROUND, 0, 0, MENU_ITEM_PRIORITY_2);
add_menu_item(MENU_ITEM_TYPE_08C, 0, 0, MENU_ITEM_PRIORITY_6);
add_menu_item(MENU_ITEM_TYPE_07C, 0, 0, MENU_ITEM_PRIORITY_6);
add_menu_item(MENU_ITEM_TYPE_07D, 0, 0, MENU_ITEM_PRIORITY_6);
add_menu_item(MENU_ITEM_TYPE_07E, 0, 0, MENU_ITEM_PRIORITY_6);
add_menu_item(MENU_ITEM_TYPE_07F, 0, 0, MENU_ITEM_PRIORITY_6);
add_menu_item(MENU_ITEM_TYPE_080, 0, 0, MENU_ITEM_PRIORITY_6);
add_menu_item(MENU_ITEM_TYPE_081, 0, 0, MENU_ITEM_PRIORITY_6);
add_menu_item(MENU_ITEM_TYPE_082, 0, 0, MENU_ITEM_PRIORITY_6);
add_menu_item(MENU_ITEM_TYPE_083, 0, 0, MENU_ITEM_PRIORITY_6);
add_menu_item(MENU_ITEM_TYPE_084, 0, 0, MENU_ITEM_PRIORITY_6);
add_menu_item(MENU_ITEM_TYPE_085, 0, 0, MENU_ITEM_PRIORITY_6);
add_menu_item(MENU_ITEM_TYPE_086, 0, 0, MENU_ITEM_PRIORITY_6);
add_menu_item(MENU_ITEM_TYPE_087, 0, 0, MENU_ITEM_PRIORITY_6);
add_menu_item(MENU_ITEM_TYPE_088, 0, 0, MENU_ITEM_PRIORITY_6);
add_menu_item(MENU_ITEM_TYPE_089, 0, 0, MENU_ITEM_PRIORITY_6);
add_menu_item(MENU_ITEM_TYPE_08A, 0, 0, MENU_ITEM_PRIORITY_6);
add_menu_item(MENU_ITEM_TYPE_08B, 0, 0, MENU_ITEM_PRIORITY_6);
add_menu_item(MENU_ITEM_TYPE_08D, 0, 0, MENU_ITEM_PRIORITY_8);
break;
case COURSE_DATA_MENU:
add_menu_item(MENU_ITEM_DATA_COURSE_IMAGE, 0, 0, MENU_ITEM_PRIORITY_8);
add_menu_item(MENU_ITEM_DATA_COURSE_INFO, 0, 0, MENU_ITEM_PRIORITY_8);
add_menu_item(MENU_ITEM_DATA_COURSE_SELECTABLE, 0, 0, MENU_ITEM_PRIORITY_8);
add_menu_item(MENU_ITEM_TYPE_0E9, 0, 0, MENU_ITEM_PRIORITY_8);
add_menu_item(MENU_ITEM_TYPE_0EA, 0, 0, MENU_ITEM_PRIORITY_8);
break;
case LOGO_INTRO_MENU:
add_menu_item(MENU_ITEM_UI_LOGO_INTRO, 0, 0, MENU_ITEM_PRIORITY_0);
break;
case CONTROLLER_PAK_MENU:
add_menu_item(MENU_ITEM_TYPE_0DA, 0, 0, MENU_ITEM_PRIORITY_0);
add_menu_item(MENU_ITEM_TYPE_0D2, 0, 0, MENU_ITEM_PRIORITY_4);
add_menu_item(MENU_ITEM_TYPE_0D4, 0, 0, MENU_ITEM_PRIORITY_6);
add_menu_item(MENU_ITEM_TYPE_0D3, 0, 0, MENU_ITEM_PRIORITY_8);
add_menu_item(MENU_ITEM_TYPE_0D5, 0, 0, MENU_ITEM_PRIORITY_A);
add_menu_item(MENU_ITEM_TYPE_0D6, 0, 0, MENU_ITEM_PRIORITY_A);
add_menu_item(MENU_ITEM_TYPE_0D7, 0, 0, MENU_ITEM_PRIORITY_A);
add_menu_item(MENU_ITEM_TYPE_0D8, 0, 0, MENU_ITEM_PRIORITY_A);
add_menu_item(MENU_ITEM_TYPE_0D9, 0, 0, MENU_ITEM_PRIORITY_A);
break;
case START_MENU:
add_menu_item(MENU_ITEM_UI_LOGO_AND_COPYRIGHT, 0, 0, MENU_ITEM_PRIORITY_4);
add_menu_item(MENU_ITEM_UI_START_BACKGROUND, 0, 0, MENU_ITEM_PRIORITY_0);
add_menu_item(START_MENU_FLAG, 0, 0, MENU_ITEM_PRIORITY_0);
if (gControllerBits & 1) {
add_menu_item(MENU_ITEM_UI_PUSH_START_BUTTON, 0, 0, MENU_ITEM_PRIORITY_2);
} else {
add_menu_item(MENU_ITEM_UI_NO_CONTROLLER, 0, 0, MENU_ITEM_PRIORITY_2);
}
add_menu_item(MENU_ITEM_UI_START_RECORD_TIME, 0, 0, MENU_ITEM_PRIORITY_6);
gDemoMode = 0;
gDemoUseController = 0;
break;
case MAIN_MENU:
add_menu_item(MAIN_MENU_BACKGROUND, 0, 0, MENU_ITEM_PRIORITY_2);
add_menu_item(MENU_ITEM_UI_GAME_SELECT, 0x0000015E, 0x00000011, MENU_ITEM_PRIORITY_6);
add_menu_item(MENU_ITEM_UI_4P_GAME, 0x0000015E, 0x0000003E, MENU_ITEM_PRIORITY_6);
add_menu_item(MENU_ITEM_UI_3P_GAME, 0x0000015E, 0x0000003E, MENU_ITEM_PRIORITY_6);
add_menu_item(MENU_ITEM_UI_2P_GAME, 0x0000015E, 0x0000003E, MENU_ITEM_PRIORITY_6);
add_menu_item(MENU_ITEM_UI_1P_GAME, 0x0000015E, 0x0000003E, MENU_ITEM_PRIORITY_6);
add_menu_item(MENU_ITEM_UI_OK, 0x0000015E, 0x000000C8, MENU_ITEM_PRIORITY_6);
add_menu_item(MAIN_MENU_DATA_GFX, 0x0000015E, 0x000000C8, MENU_ITEM_PRIORITY_6);
add_menu_item(MAIN_MENU_OPTION_GFX, 0x0000015E, 0x000000C8, MENU_ITEM_PRIORITY_6);
if (has_unlocked_extra_mode() != 0) {
add_menu_item(MAIN_MENU_EXTRA_CC, 0, 0, MENU_ITEM_PRIORITY_6);
}
add_menu_item(MAIN_MENU_150CC, 0, 0, MENU_ITEM_PRIORITY_6);
add_menu_item(MAIN_MENU_100CC, 0, 0, MENU_ITEM_PRIORITY_6);
add_menu_item(MAIN_MENU_50CC, 0, 0, MENU_ITEM_PRIORITY_6);
add_menu_item(MAIN_MENU_TIME_TRIALS_DATA, 0, 0, MENU_ITEM_PRIORITY_6);
add_menu_item(MAIN_MENU_TIME_TRIALS_BEGIN, 0, 0, MENU_ITEM_PRIORITY_6);
add_menu_item(MENU_ITEM_TYPE_01B, 0, 0, MENU_ITEM_PRIORITY_C);
break;
case CHARACTER_SELECT_MENU:
add_menu_item(CHARACTER_SELECT_BACKGROUND, 0, 0, MENU_ITEM_PRIORITY_2);
add_menu_item(CHARACTER_SELECT_MENU_PLAYER_SELECT_BANNER, 0, 0, MENU_ITEM_PRIORITY_6);
add_menu_item(CHARACTER_SELECT_MENU_OK, 0, 0, MENU_ITEM_PRIORITY_6);
add_menu_item(CHARACTER_SELECT_MENU_MARIO, 0, 0, MENU_ITEM_PRIORITY_8);
add_menu_item(CHARACTER_SELECT_MENU_LUIGI, 0, 0, MENU_ITEM_PRIORITY_8);
add_menu_item(CHARACTER_SELECT_MENU_TOAD, 0, 0, MENU_ITEM_PRIORITY_6);
add_menu_item(CHARACTER_SELECT_MENU_PEACH, 0, 0, MENU_ITEM_PRIORITY_6);
add_menu_item(CHARACTER_SELECT_MENU_YOSHI, 0, 0, MENU_ITEM_PRIORITY_6);
add_menu_item(CHARACTER_SELECT_MENU_DK, 0, 0, MENU_ITEM_PRIORITY_6);
add_menu_item(CHARACTER_SELECT_MENU_WARIO, 0, 0, MENU_ITEM_PRIORITY_6);
add_menu_item(CHARACTER_SELECT_MENU_BOWSER, 0, 0, MENU_ITEM_PRIORITY_8);
add_menu_item(CHARACTER_SELECT_MENU_1P_CURSOR, 0, 0, MENU_ITEM_PRIORITY_C);
add_menu_item(CHARACTER_SELECT_MENU_2P_CURSOR, 0, 0, MENU_ITEM_PRIORITY_C);
add_menu_item(CHARACTER_SELECT_MENU_3P_CURSOR, 0, 0, MENU_ITEM_PRIORITY_C);
add_menu_item(CHARACTER_SELECT_MENU_4P_CURSOR, 0, 0, MENU_ITEM_PRIORITY_C);
break;
case COURSE_SELECT_MENU:
add_menu_item(COURSE_SELECT_BACKGROUND, 0, 0, MENU_ITEM_PRIORITY_2);
add_menu_item(COURSE_SELECT_MAP_SELECT, 0, 0, MENU_ITEM_PRIORITY_6);
if (gModeSelection != BATTLE) {
add_menu_item(COURSE_SELECT_MUSHROOM_CUP, 0, 0, MENU_ITEM_PRIORITY_4);
add_menu_item(COURSE_SELECT_FLOWER_CUP, 0, 0, MENU_ITEM_PRIORITY_4);
add_menu_item(COURSE_SELECT_STAR_CUP, 0, 0, MENU_ITEM_PRIORITY_4);
add_menu_item(COURSE_SELECT_SPECIAL_CUP, 0, 0, MENU_ITEM_PRIORITY_4);
add_menu_item(MENU_ITEM_TYPE_058, 0, 0, MENU_ITEM_PRIORITY_6);
add_menu_item(COURSE_SELECT_COURSE_NAMES, 0, 0, MENU_ITEM_PRIORITY_6);
add_menu_item(MENU_ITEM_TYPE_05A, 0, 0, MENU_ITEM_PRIORITY_6);
add_menu_item(MENU_ITEM_TYPE_05B, 0, 0, MENU_ITEM_PRIORITY_6);
} else {
add_menu_item(COURSE_SELECT_BATTLE_NAMES, 0, 0, MENU_ITEM_PRIORITY_6);
add_menu_item(MENU_ITEM_TYPE_06E, 0, 0, MENU_ITEM_PRIORITY_6);
}
add_menu_item(MENU_ITEM_TYPE_064, 0, 0, MENU_ITEM_PRIORITY_6);
add_menu_item(MENU_ITEM_TYPE_05F, 0, 0, MENU_ITEM_PRIORITY_6);
add_menu_item(MENU_ITEM_TYPE_060, 0, 0, MENU_ITEM_PRIORITY_6);
add_menu_item(MENU_ITEM_TYPE_061, 0, 0, MENU_ITEM_PRIORITY_6);
add_menu_item(MENU_ITEM_TYPE_062, 0, 0, MENU_ITEM_PRIORITY_6);
add_menu_item(COURSE_SELECT_OK, 0, 0, MENU_ITEM_PRIORITY_6);
add_menu_item(MENU_ITEM_TYPE_05E, 0, 0, MENU_ITEM_PRIORITY_8);
if (gModeSelection == TIME_TRIALS) {
add_menu_item(MENU_ITEM_TYPE_065, 0, 0, MENU_ITEM_PRIORITY_8);
add_menu_item(MENU_ITEM_TYPE_066, 0, 0, MENU_ITEM_PRIORITY_8);
add_menu_item(MENU_ITEM_TYPE_069, 0, 0, MENU_ITEM_PRIORITY_8);
}
if (gModeSelection == GRAND_PRIX) {
add_menu_item(MENU_ITEM_TYPE_068, 0, 0, MENU_ITEM_PRIORITY_8);
add_menu_item(MENU_ITEM_TYPE_067, 0, 0, MENU_ITEM_PRIORITY_5);
}
break;
case 0:
case 1:
case 2:
case 3:
case 4:
default:
break;
}
if (gFadeModeSelection != FADE_MODE_LOGO) {
func_8009DF4C(0x00000014);
} else {
func_8009DF6C(0x00000014);
}
gFadeModeSelection = FADE_MODE_NONE;
}
}
void func_80095574(void) {
s32 var_v0;
if ((unref_8018EE0C < 3) || (gTransitionType[4] != 0)) {
handle_menus_default();
}
if (gDebugMenuSelection > DEBUG_MENU_DISABLED) { // If not disabled
load_debug_font();
debug_print_str2(0x00000050, 0x00000064, "debug_mode");
switch (gDebugMenuSelection) {
case DEBUG_MENU_DEBUG_MODE:
debug_print_str2(0x00000046, 0x00000064, "*");
break;
case DEBUG_MENU_COURSE:
debug_print_str2(0x00000046, 0x0000006E, "*");
break;
case DEBUG_MENU_SCREEN_MODE:
debug_print_str2(0x00000046, 0x00000078, "*");
break;
case DEBUG_MENU_PLAYER:
debug_print_str2(0x00000046, 0x00000082, "*");
break;
case DEBUG_MENU_SOUND_MODE:
debug_print_str2(0x00000046, 0x0000008C, "*");
break;
case DEBUG_MENU_GIVE_ALL_GOLD_CUP:
debug_print_str2(0x00000046, 0x00000096, "*");
break;
}
if (gEnableDebugMode) {
debug_print_str2(0x000000AA, 0x00000064, "on");
} else {
debug_print_str2(0x000000AA, 0x00000064, "off");
}
if ((gCurrentCourseId >= (NUM_COURSES - 1)) || (gCurrentCourseId < 0)) {
gCurrentCourseId = 0;
}
print_str_num(0x00000050, 0x0000006E, "map_number", gCurrentCourseId);
if (gCurrentCourseId < 0xA) {
var_v0 = 0;
} else {
var_v0 = 8;
}
debug_print_str2(var_v0 + 0xB9, 0x0000006E, GET_COURSE_debugName);
debug_print_str2(0x00000050, 0x00000078, "screen_mode");
debug_print_str2(0x000000AA, 0x00000078, gDebugScreenModeNames[gScreenModeListIndex]);
debug_print_str2(0x00000050, 0x00000082, "player");
debug_print_str2(0x000000AA, 0x00000082, gDebugCharacterNames[gCharacterSelections[0]]);
debug_print_str2(0x00000050, 0x0000008C, "sound mode");
debug_print_str2(0x000000AA, 0x0000008C, gDebugSoundModeNames[gSoundMode]);
if (gDebugMenuSelection == DEBUG_MENU_GIVE_ALL_GOLD_CUP) {
debug_print_str2(0x00000050, 0x00000096, "push b to get all goldcup");
}
func_80057778();
}
if (gDebugMenuSelection == DEBUG_MENU_DISABLED) {
gMenuTimingCounter += 1;
} else {
gMenuTimingCounter = 3;
}
if (gMenuTimingCounter == 2) {
play_sound2(SOUND_INTRO_WELCOME);
}
if (gMenuTimingCounter > 300) {
func_8009E230();
func_800CA0A0();
}
gSPDisplayList(gDisplayListHead++, D_020076E0);
}
// While this matches, its a little screwy
// This function seemingly needs to return a Gfx*, but doing that explicity doesn't match
// Instead we depend on the fact that the result of draw_box_fill is left
// in v0 which means it is returned, sort of.
// Its also weird that the displayListHead argument goes entirely unused. What's up with that?
Gfx* draw_flash_select_case(UNUSED Gfx* displayListHead, s32 ulx, s32 uly, s32 lrx, s32 lry, s32 speed) {
s32 greyscale;
greyscale = ((gCycleFlashMenu % speed) << 9) / speed;
if (greyscale > 0x100) {
greyscale = 0x200 - greyscale;
}
if (greyscale > 0xFF) { // set max greyscale to 0xFF
greyscale = 0xFF;
}
#if AVOID_UB
return gDisplayListHead =
draw_box_fill(gDisplayListHead, ulx, uly, lrx, lry, greyscale, greyscale, greyscale, 0xFF);
#else
gDisplayListHead = draw_box_fill(gDisplayListHead, ulx, uly, lrx, lry, greyscale, greyscale, greyscale, 0xFF);
#endif
}
Gfx* draw_flash_select_case_slow(Gfx* displayListHead, s32 ulx, s32 uly, s32 lrx, s32 lry) {
return draw_flash_select_case(displayListHead, ulx, uly, lrx, lry, 64);
}
Gfx* draw_flash_select_case_fast(Gfx* displayListHead, s32 ulx, s32 uly, s32 lrx, s32 lry) {
return draw_flash_select_case(displayListHead, ulx, uly, lrx, lry, 4);
}
Gfx* func_800959F8(Gfx* displayListHead, Vtx* arg1) {
s32 index;
if ((s32) gTextColor < TEXT_BLUE_GREEN_RED_CYCLE_1) {
index = gTextColor;
} else {
index = ((gTextColor * 2) + ((s32) gGlobalTimer % 2)) - 4;
}
#ifdef AVOID_UB
gSPVertex(displayListHead++, arg1, 2, 0);
gSPVertex(displayListHead++, &arg1[(index + 1) * 2], 2, 2);
gSPDisplayList(displayListHead++, common_rectangle_display);
#else
if (arg1 == D_02007BB8) {
gSPDisplayList(displayListHead++, D_800E84CC[index]);
} else if (arg1 == D_02007CD8) {
gSPDisplayList(displayListHead++, D_800E84EC[index]);
} else if (arg1 == D_02007DF8) {
gSPDisplayList(displayListHead++, D_800E850C[index]);
}
#endif
return displayListHead;
}
#ifdef AVOID_UB
#define MTX_TYPE Mtx
#else
typedef struct {
u16 i[4][4];
u16 f[4][4];
} Mtx_u;
typedef union {
Mtx_u u;
Mtx_t m;
long long int force_structure_alignment;
} Mtx2;
typedef union {
s16 s[2];
s32 w;
} TheWhyUnion;
#define MTX_TYPE Mtx2
#endif
// Why... Why... Why... This function is so bad it's not going in the header.
void func_80095AE0(MTX_TYPE* arg0, f32 arg1, f32 arg2, f32 arg3, f32 arg4) {
#ifdef AVOID_UB
// Use Mat4 array to set matrix values using guMtxF2L. This helps little-endian systems.
Mat4 src;
src[0][0] = arg3;
src[0][1] = 0.0f;
src[0][2] = 0.0f;
src[0][3] = 0.0f;
src[1][0] = 0.0f;
src[1][1] = arg4;
src[1][2] = 0.0f;
src[1][3] = 0.0f;
src[2][0] = 0.0f;
src[2][1] = 0.0f;
src[2][2] = 1.0f;
src[2][3] = 0.0f;
src[3][0] = arg1;
src[3][1] = arg2;
src[3][2] = 0.0f;
src[3][3] = 1.0f;
guMtxF2L(src, arg0);
#else
TheWhyUnion sp14;
TheWhyUnion sp10;
TheWhyUnion spC;
TheWhyUnion sp8;
s32 i;
// clang-format off
// should be inline
for(i = 0; i < 16; i++) { arg0->m[0][i] = 0; }
// clang-format on
sp14.w = arg3 * 65536.0f;
sp10.w = arg4 * 65536.0f;
spC.w = arg1 * 65536.0f;
sp8.w = arg2 * 65536.0f;
arg0->u.i[0][0] = sp14.s[0];
arg0->u.i[1][1] = sp10.s[0];
arg0->u.i[2][2] = 1;
arg0->u.i[3][0] = spC.s[0];
arg0->u.i[3][1] = sp8.s[0];
arg0->u.i[3][3] = 1;
arg0->u.f[0][0] = sp14.s[1];
arg0->u.f[1][1] = sp10.s[1];
arg0->u.f[3][0] = spC.s[1];
arg0->u.f[3][1] = sp8.s[1];
#endif
}
#undef MTX_TYPE
Gfx* func_80095BD0(Gfx* displayListHead, u8* arg1, f32 arg2, f32 arg3, u32 arg4, u32 arg5, f32 arg6, f32 arg7) {
Vtx* var_a1;
Mtx* sp28;
// A match is a match, but why are goto's required here?
if (gMatrixEffectCount >= 0x2F7) {
goto func_80095BD0_label1;
}
sp28 = &gGfxPool->mtxEffect[gMatrixEffectCount];
if (gMatrixEffectCount < 0) {
rmonPrintf("effectcount < 0 !!!!!!(kawano)\n");
}
goto func_80095BD0_label2;
func_80095BD0_label1:
rmonPrintf("MAX effectcount(760) over!!!!(kawano)\n");
return displayListHead;
func_80095BD0_label2:
func_80095AE0((void*) sp28, arg2, arg3, arg6, arg7);
gSPMatrix(displayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxEffect[gMatrixEffectCount]),
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gMatrixEffectCount += 1;
gDPLoadTextureTile_4b(displayListHead++, arg1, G_IM_FMT_I, arg4, 0, 0, 0, arg4, arg5, 0, G_TX_NOMIRROR | G_TX_WRAP,
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
switch (arg4) {
default:
var_a1 = D_02007CD8;
break;
case 16:
var_a1 = D_02007CD8;
break;
case 26:
var_a1 = D_02007BB8;
break;
case 30:
var_a1 = D_02007DF8;
break;
}
return func_800959F8(displayListHead, var_a1);
}
Gfx* func_80095E10(Gfx* displayListHead, s8 arg1, s32 arg2, s32 arg3, s32 arg4, s32 arg5, s32 arg6, s32 arg7, s32 arg8,
s32 arg9, u8* argA, u32 argB, u32 argC) {
u32 var_a1_2 = arg4;
u32 var_s3 = arg5;
s32 sp7C;
u32 var_s2;
u32 var_s4;
s32 var_t0 = 1;
s32 temp_lo;
s32 sp68 = 0;
s32 sp64 = 0;
s32 var_v0_2;
while ((u32) var_t0 < argB) {
var_t0 *= 2;
}
temp_lo = 0x400 / var_t0;
while ((u32) (temp_lo / 2) > argC) {
temp_lo /= 2;
}
var_v0_2 = var_t0;
while (var_v0_2 > 1) {
var_v0_2 /= 2;
sp68 += 1;
}
var_v0_2 = temp_lo;
while (var_v0_2 > 1) {
var_v0_2 /= 2;
sp64 += 1;
}
if (arg8 < 0) {
arg4 -= arg8;
arg8 = 0;
} else if (((arg6 - arg4) + arg8) > SCREEN_WIDTH) {
arg6 = (arg4 - arg8) + SCREEN_WIDTH;
}
if (arg9 < 0) {
arg5 -= arg9;
arg9 = 0;
} else if (((arg7 - arg5) + arg9) > SCREEN_HEIGHT) {
arg7 = (arg5 - arg9) + SCREEN_HEIGHT;
}
if (arg6 < arg4) {
return displayListHead;
}
if (arg7 < arg5) {
return displayListHead;
}
sp7C = arg8;
for (var_s3 = arg5; var_s3 < (u32) arg7; var_s3 += temp_lo) {
if ((u32) arg7 < temp_lo + var_s3) {
var_s4 = arg7 - var_s3;
if (!var_s4) {
break;
}
} else {
var_s4 = temp_lo;
}
for (var_a1_2 = arg4; var_a1_2 < (u32) arg6; var_a1_2 += var_t0) {
if ((u32) arg6 < var_t0 + var_a1_2) {
var_s2 = arg6 - var_a1_2;
if (!var_s2) {
break;
}
} else {
var_s2 = var_t0;
}
gDPLoadTextureTile(displayListHead++, argA, arg1, G_IM_SIZ_16b, argB, 0, var_a1_2, var_s3,
var_a1_2 + var_s2, var_s3 + var_s4, 0, G_TX_NOMIRROR | G_TX_WRAP,
G_TX_NOMIRROR | G_TX_WRAP, sp68, sp64, G_TX_NOLOD, G_TX_NOLOD);
gSPTextureRectangle(displayListHead++, arg8 * 4, arg9 * 4, (arg8 + var_s2) * 4, (arg9 + var_s4) * 4, 0,
(var_a1_2 * 32) & 0xFFFF, (var_s3 * 32) & 0xFFFF, arg2, arg3);
arg8 += var_t0;
}
arg8 = sp7C;
arg9 += temp_lo;
}
return displayListHead;
}
Gfx* func_800963F0(Gfx* displayListHead, s8 arg1, s32 arg2, s32 arg3, f32 arg4, f32 arg5, s32 arg6, s32 arg7, s32 arg8,
s32 arg9, s32 argA, s32 argB, u8* argC, u32 argD, u32 argE) {
u32 var_a1_2 = arg6;
u32 var_s3 = arg7;
s32 sp7C;
u32 var_s2;
u32 var_s4;
u32 a;
u32 b;
s32 var_t0 = 1;
s32 temp_lo;
s32 sp68 = 0;
s32 sp64 = 0;
s32 var_v0_2;
while ((u32) var_t0 < argD) {
var_t0 *= 2;
}
temp_lo = 0x400 / var_t0;
while ((u32) (temp_lo / 2) > argE) {
temp_lo /= 2;
}
var_v0_2 = var_t0;
while (var_v0_2 > 1) {
var_v0_2 /= 2;
sp68 += 1;
}
var_v0_2 = temp_lo;
while (var_v0_2 > 1) {
var_v0_2 /= 2;
sp64 += 1;
}
if (argA < 0) {
arg6 -= argA;
argA = 0;
} else if ((argA + (arg8 - arg6) * arg4) > SCREEN_WIDTH) {
arg8 -= argA + (arg8 - arg6) * arg4 - SCREEN_WIDTH;
}
if (argB < 0) {
arg7 -= argB;
argB = 0;
} else if ((argB + (arg9 - arg7) * arg5) > SCREEN_HEIGHT) {
arg9 -= argB + (arg9 - arg7) * arg5 - SCREEN_HEIGHT;
}
if (arg8 < arg6) {
return displayListHead;
}
if (arg9 < arg7) {
return displayListHead;
}
arg2 /= arg4;
arg3 /= arg5;
sp7C = argA;
for (var_s3 = arg7; var_s3 < (u32) arg9; var_s3 += temp_lo) {
if ((u32) arg9 < temp_lo + var_s3) {
var_s4 = arg9 - var_s3;
if (!var_s4) {
break;
}
} else {
var_s4 = temp_lo;
}
b = var_s4 * arg5;
for (var_a1_2 = arg6; var_a1_2 < (u32) arg8; var_a1_2 += var_t0) {
if ((u32) arg8 < (var_t0 + var_a1_2)) {
var_s2 = arg8 - var_a1_2;
if (!var_s2) {
break;
}
} else {
var_s2 = var_t0;
}
a = var_s2 * arg4;
gDPLoadTextureTile(displayListHead++, argC, arg1, G_IM_SIZ_16b, argD, argE, var_a1_2, var_s3,
var_a1_2 + var_s2, var_s3 + var_s4, 0, G_TX_NOMIRROR | G_TX_WRAP,
G_TX_NOMIRROR | G_TX_WRAP, sp68, sp64, G_TX_NOLOD, G_TX_NOLOD);
gSPTextureRectangle(displayListHead++, argA * 4, argB * 4, (argA + a) * 4, (argB + b) * 4, 0,
(var_a1_2 * 32) & 0xFFFF, (var_s3 * 32) & 0xFFFF, arg2, arg3);
argA += var_t0 * arg4;
}
argA = sp7C;
argB += temp_lo * arg5;
}
return displayListHead;
}
extern u8 D_0B002A00[];
#ifdef NON_MATCHING
// https://decomp.me/scratch/xV83r
// Possibly a missed variable rename or just weird diffs.
// I don't know what this actually meant to be. Its plausible that its meant to be a reference to
// `gTextureTitleChocoMountain` That would be weird though because this function doesn't draw that picture at all. So
// its plausible that its instead using it as some form semi-random data for the static pattern?
// This function is responsible for drawing a near unnoticeable static pattern
// over the course images when loading the cup selection screen
// Try locking the word at `8018DC80` to see something like 0x20 just before confirming character selection to make it
// last longer
Gfx* func_80096CD8(Gfx* displayListHead, s32 arg1, s32 arg2, u32 width, u32 arg4) {
u32 var_s1_3;
u32 var_fp;
u32 var_v0;
u32 var_a1;
s32 var_ra = 1;
s32 spCC;
s32 masks = 0;
s32 maskt = 0;
s32 rand;
while (var_ra < (s32) width) {
var_ra *= 2;
}
spCC = 0x400 / var_ra;
while ((spCC / 2) > (s32) arg4) {
spCC /= 2;
}
rand = var_ra;
while (rand > 1) {
rand /= 2;
masks += 1;
}
rand = spCC;
while (rand > 1) {
rand /= 2;
maskt += 1;
}
if (arg1 < 0) {
width -= arg1;
arg1 = 0;
} else if ((arg1 + width) > SCREEN_WIDTH) {
width = SCREEN_WIDTH - arg1;
}
if (arg2 < 0) {
arg4 -= arg2;
arg2 = 0;
} else if ((arg2 + arg4) > SCREEN_HEIGHT) {
arg4 = SCREEN_HEIGHT - arg2;
}
if (width == 0) {
return displayListHead;
}
if (arg4 == 0) {
return displayListHead;
}
rand = random_int(100);
displayListHead = draw_box(displayListHead, arg1, arg2, arg1 + width, arg2 + arg4, 0, 0, 0, rand);
rand += 150;
gDPPipeSync(displayListHead++);
gDPSetRenderMode(displayListHead++, G_RM_XLU_SURF, G_RM_XLU_SURF2);
gDPSetPrimColor(displayListHead++, 0, 0, rand, rand, rand, rand);
gDPSetCombineMode(displayListHead++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
for (var_fp = arg2; var_fp < (arg2 + arg4); var_fp += spCC) {
if ((var_fp + spCC) > (arg2 + arg4)) {
var_v0 = (arg2 + arg4) - var_fp;
if (var_v0 == 0) {
break;
}
} else {
var_v0 = spCC;
}
for (var_s1_3 = arg1; var_s1_3 < (arg1 + width); var_s1_3 += var_ra) {
if ((var_s1_3 + var_ra) > (arg1 + width)) {
var_a1 = (arg1 + width) - var_s1_3;
if (var_a1 == 0) {
break;
}
} else {
var_a1 = var_ra;
}
gDPLoadTextureTile(displayListHead++, D_0B002A00 + (random_int(128) * 2), G_IM_FMT_IA, G_IM_SIZ_16b, width,
arg4, var_s1_3, var_fp, var_s1_3 + var_a1, var_fp + var_v0, 0, G_TX_NOMIRROR | G_TX_WRAP,
G_TX_NOMIRROR | G_TX_WRAP, masks, maskt, G_TX_NOLOD, G_TX_NOLOD);
gSPTextureRectangle(displayListHead++, var_s1_3 * 4, var_fp * 4, (var_s1_3 + var_a1) * 4,
(var_fp + var_v0) * 4, 0, (var_s1_3 * 32) & 0xFFFF, (var_fp * 32) & 0xFFFF, 1024, 1024);
}
}
return displayListHead;
}
#else
GLOBAL_ASM("asm/non_matchings/menu_items/func_80096CD8.s")
#endif
#ifdef NON_MATCHING
Gfx* func_80097274(Gfx* displayListHead, s8 arg1, s32 arg2, s32 arg3, s32 arg4, s32 arg5, s32 arg6, s32 arg7, s32 arg8,
s32 arg9, UNUSED u16* argA, u32 argB, u32 argC, UNUSED s32 argD) {
u32 var_a1_2 = arg4;
u32 var_s3 = arg5;
s32 sp7C;
u32 var_s2;
u32 var_s4;
s32 var_t0 = 1;
s32 temp_lo;
s32 sp68 = 0;
s32 sp64 = 0;
s32 var_v0_2;
gDPPipeSync(displayListHead++);
gDPSetCycleType(displayListHead++, G_CYC_2CYCLE);
gDPSetTextureLOD(displayListHead++, G_TL_TILE);
gDPSetPrimColor(displayListHead++, 0, 0, 0, 0, 0, gGlobalTimer % 256);
gDPSetCombineLERP(displayListHead++, TEXEL1, TEXEL0, PRIMITIVE_ALPHA, TEXEL0, TEXEL1, TEXEL0, PRIMITIVE, TEXEL0, 0,
0, 0, COMBINED, 0, 0, 0, COMBINED);
while (var_t0 < (s32) argB) {
var_t0 *= 2;
}
temp_lo = 0x400 / var_t0;
while ((temp_lo / 2) > (s32) argC) {
temp_lo /= 2;
}
var_v0_2 = var_t0;
while (var_v0_2 > 1) {
var_v0_2 /= 2;
sp68 += 1;
}
var_v0_2 = temp_lo;
while (var_v0_2 > 1) {
var_v0_2 /= 2;
sp64 += 1;
}
if (arg8 < 0) {
arg4 -= arg8;
arg8 = 0;
} else if (((arg6 - arg4) + arg8) > SCREEN_WIDTH) {
arg6 = (arg4 - arg8) + SCREEN_WIDTH;
}
if (arg9 < 0) {
arg5 -= arg9;
arg9 = 0;
} else if (((arg7 - arg5) + arg9) > SCREEN_HEIGHT) {
arg7 = (arg5 - arg9) + SCREEN_HEIGHT;
}
if (arg6 < arg4) {
return displayListHead;
}
if (arg7 < arg5) {
return displayListHead;
}
sp7C = arg8;
for (var_s3 = arg5; var_s3 < (u32) arg7; var_s3 += temp_lo) {
if (arg7 < (s32) (temp_lo + var_s3)) {
var_s4 = arg7 - var_s3;
if (!var_s4) {
break;
}
} else {
var_s4 = temp_lo;
}
for (var_a1_2 = arg4; var_a1_2 < (u32) arg6; var_a1_2 += var_t0) {
if (arg6 < (s32) (var_t0 + var_a1_2)) {
var_s2 = arg6 - var_a1_2;
if (!var_s2) {
break;
}
} else {
var_s2 = var_t0;
}
gDPLoadMultiTile(displayListHead++, arg1, 0, G_TX_RENDERTILE, arg2, G_IM_SIZ_16b, argB, argC, var_a1_2,
var_s3, var_a1_2 + var_s2, var_s3 + var_s4, 0, G_TX_WRAP, G_TX_WRAP, sp68, sp64,
G_TX_NOLOD, G_TX_NOLOD);
gDPLoadMultiTile(displayListHead++, D_0B002A00 + random_int(128) * 2, 256, G_TX_RENDERTILE + 1, arg2,
G_IM_SIZ_16b, argB, argC, var_a1_2, var_s3, var_a1_2 + var_s2, var_s3 + var_s4, 0,
G_TX_WRAP, G_TX_WRAP, sp68, sp64, G_TX_NOLOD, G_TX_NOLOD);
gSPTextureRectangle(displayListHead++, arg8 * 4, arg9 * 4, (arg8 + var_s2) * 4, (arg9 + var_s4) * 4, 0,
(var_a1_2 * 32) & 0xFFFF, (var_s3 * 32) & 0xFFFF, arg2, arg3);
arg8 += var_t0;
}
arg8 = sp7C;
arg9 += temp_lo;
}
gDPPipeSync(displayListHead++);
gDPSetCycleType(displayListHead++, G_CYC_1CYCLE);
return displayListHead;
}
#else
GLOBAL_ASM("asm/non_matchings/menu_items/func_80097274.s")
#endif
Gfx* func_80097A14(Gfx* displayListHead, s8 arg1, s32 arg2, s32 arg3, s32 arg4, s32 arg5, s32 arg6, s32 arg7, u8* arg8,
u32 arg9, u32 argA) {
gDPPipeSync(displayListHead++);
gDPSetCycleType(displayListHead++, G_CYC_COPY);
displayListHead = func_80095E10(displayListHead, arg1, 0x00001000, 0x00000400, arg2, arg3, arg4, arg5, arg6, arg7,
arg8, arg9, argA);
gDPPipeSync(displayListHead++);
gDPSetCycleType(displayListHead++, G_CYC_1CYCLE);
return displayListHead;
}
Gfx* func_80097AE4(Gfx* displayListHead, s8 fmt, s32 arg2, s32 arg3, u8* arg4, s32 width) {
s32 i;
s32 temp;
s32 arg2Copy;
s32 dsdx;
if (width >= 32) {
return displayListHead;
}
arg2Copy = arg2;
for (i = 0; i < 64; i += 32) {
temp = 0;
dsdx = 0x8000 / (32 - width);
gDPLoadTextureTile(displayListHead++, arg4, fmt, G_IM_SIZ_16b, 64, 64, temp, i, temp + 32, i + 32, 0,
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, 5, 5, G_TX_NOLOD, G_TX_NOLOD);
gSPTextureRectangle(displayListHead++, (arg2 + width) << 2, arg3 << 2, (arg2 + 32) << 2, (arg3 + 32) << 2, 0, 0,
0, dsdx, 1024);
arg2 += 32;
gDPLoadTextureTile(displayListHead++, arg4, fmt, G_IM_SIZ_16b, 64, 64, temp + 32, i, temp + 64, i + 32, 0,
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, 5, 5, G_TX_NOLOD, G_TX_NOLOD);
gSPTextureRectangle(displayListHead++, arg2 << 2, arg3 << 2, ((arg2 - width) + 32) << 2, (arg3 + 32) << 2, 0, 0,
0, dsdx, 1024);
arg2 = arg2Copy;
arg3 += 32;
}
return displayListHead;
}
Gfx* func_80097E58(Gfx* displayListHead, s8 fmt, UNUSED u32 arg2, u32 arg3, UNUSED u32 arg4, u32 arg5, s32 arg6,
s32 arg7, u8* someTexture, u32 arg9, UNUSED u32 argA, s32 width) {
u32 ult;
u32 temp;
s32 arg6Copy;
s32 temp_v1;
s32 var_s2;
s32 lrs;
s32 spDC;
s32 temp2 = 32;
if (width >= 32) {
return displayListHead;
}
arg6Copy = arg6;
lrs = arg9 / 2;
spDC = arg9 - lrs;
for (ult = arg3; ult < arg5; ult += 32) {
temp = 0;
if ((ult + temp2) > arg5) {
var_s2 = arg5 - ult;
if (!var_s2) {
break;
}
} else {
var_s2 = temp2;
}
temp_v1 = ((32 * lrs) << 10) / (lrs * (32 - width));
gDPLoadTextureTile(displayListHead++, someTexture, fmt, G_IM_SIZ_16b, arg9, argA, temp, ult, temp + lrs,
ult + var_s2, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, 5, 5, G_TX_NOLOD,
G_TX_NOLOD);
gSPTextureRectangle(displayListHead++, (arg6 + lrs * width / 32) << 2, arg7 << 2, (arg6 + lrs) << 2,
(arg7 + var_s2) << 2, 0, 0, (ult << 5) & 0xFFFF, temp_v1, 1024);
arg6 += lrs;
temp_v1 = ((32 * spDC) << 10) / (spDC * (32 - width));
gDPLoadTextureTile(displayListHead++, someTexture, fmt, G_IM_SIZ_16b, arg9, argA, temp + lrs, ult, temp + arg9,
ult + var_s2, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, 5, 5, G_TX_NOLOD,
G_TX_NOLOD);
gSPTextureRectangle(displayListHead++, arg6 << 2, arg7 << 2, (arg6 + spDC * (32 - width) / 32) << 2,
(arg7 + var_s2) << 2, 0, (lrs << 5) & 0xFFFF, (ult << 5) & 0xFFFF, temp_v1, 1024);
arg6 = arg6Copy;
arg7 += temp2;
}
return displayListHead;
}
Gfx* func_80098558(Gfx* displayListHead, u32 arg1, u32 arg2, u32 arg3, u32 arg4, u32 arg5, u32 arg6, UNUSED s32 arg7,
s32 arg8) {
u32 var_a3;
u32 var_v0;
s32 arg5Copy;
arg5Copy = arg5;
for (var_v0 = arg2; var_v0 < arg4; var_v0 += 0x20) {
for (var_a3 = arg1; var_a3 < arg3; var_a3 += 0x20) {
gDPLoadTextureTile(displayListHead++, gMenuTextureBuffer, G_IM_FMT_RGBA, G_IM_SIZ_16b, arg8, 0, var_a3,
var_v0, var_a3 + 0x20, var_v0 + 0x20, 0, G_TX_NOMIRROR | G_TX_WRAP,
G_TX_NOMIRROR | G_TX_WRAP, 5, 5, G_TX_NOLOD, G_TX_NOLOD);
gSPTextureRectangle(displayListHead++, arg5 << 2, arg6 << 2, (arg5 + 0x20) << 2, (arg6 + 0x20) << 2, 0, 0,
0, 1024, 1024);
arg5 += 0x20;
}
arg5 = arg5Copy;
arg6 += 0x20;
}
return displayListHead;
}
Gfx* func_800987D0(Gfx* displayListHead, u32 arg1, u32 arg2, u32 width, u32 height, s32 column, s32 row,
UNUSED u8* arg7, u32 textureWidth, UNUSED s32 textureHeight) {
s32 var_a2;
s32 var_v0_2;
s32 columnCopy;
s32 temp_f4_2;
UNUSED s32 stackPadding0;
s32 temp_f6;
f32 temp_f0;
f32 temp_f18;
f32 temp_f24;
if (gTransitionDuration[0] == 0) {
gTransitionDuration[0] = 1;
}
temp_f24 = sins(((gCurrentTransitionTime[0] * 0x4E20) / gTransitionDuration[0]) % 20000U);
temp_f0 = coss(((gCurrentTransitionTime[0] * 0x4E20) / gTransitionDuration[0]) % 20000U);
temp_f18 = (((f32) gCurrentTransitionTime[0] * 0.5) / gTransitionDuration[0]) + 1.0;
columnCopy = column;
for (var_v0_2 = arg2; (u32) var_v0_2 < height; var_v0_2 += 0x20) {
for (var_a2 = arg1; (u32) var_a2 < width; var_a2 += 0x20) {
gDPLoadTextureTile(displayListHead++, gMenuTextureBuffer, G_IM_FMT_RGBA, G_IM_SIZ_16b, textureWidth, 0,
var_a2, var_v0_2, var_a2 + 0x20, var_v0_2 + 0x20, 0, G_TX_NOMIRROR | G_TX_WRAP,
G_TX_NOMIRROR | G_TX_WRAP, 5, 5, G_TX_NOLOD, G_TX_NOLOD);
temp_f6 = (temp_f18 * ((temp_f0 * (column - 0xA0)) + (temp_f24 * (row - 0x78)))) + 160.0f;
temp_f4_2 = (temp_f18 * ((-temp_f24 * (column - 0xA0)) + (temp_f0 * (row - 0x78)))) + 120.0f;
gSPTextureRectangle(displayListHead++, temp_f6 * 4, temp_f4_2 * 4, ((temp_f6 + 0x20) ^ 0) * 4,
((temp_f4_2 + 0x20) ^ 0) * 4, 0, 0, 0, 1024, 1024);
column += 0x20;
}
column = columnCopy;
row += 0x20;
}
return displayListHead;
}
// draw a box filled with a solid color
Gfx* draw_box_fill(Gfx* displayListHead, s32 ulx, s32 uly, s32 lrx, s32 lry, s32 red, s32 green, s32 blue, s32 alpha) {
red &= 0xFF;
green &= 0xFF;
blue &= 0xFF;
alpha &= 0xFF;
if (lrx < ulx) {
swap_values(&ulx, &lrx);
}
if (lry < uly) {
swap_values(&uly, &lry);
}
if ((ulx >= 0x140) || (uly >= 0xF0)) {
return displayListHead;
}
if (ulx < 0) {
ulx = 0;
}
if (uly < 0) {
uly = 0;
}
if ((lrx < 0) || (lry < 0)) {
return displayListHead;
}
if (lrx >= 0x140) {
lrx = 0x13F;
}
if (lry >= 0xF0) {
lry = 0xEF;
}
gSPDisplayList(displayListHead++, D_02008030);
gDPSetFillColor(displayListHead++, (GPACK_RGBA5551(red, green, (u32) blue, alpha) << 0x10 |
GPACK_RGBA5551(red, green, (u32) blue, alpha)));
gDPFillRectangle(displayListHead++, ulx, uly, lrx, lry);
gSPDisplayList(displayListHead++, D_02008058);
return displayListHead;
}
// draw a box with a solid outline
Gfx* draw_box(Gfx* displayListHead, s32 ulx, s32 uly, s32 lrx, s32 lry, u32 red, u32 green, u32 blue, u32 alpha) {
red &= 0xFF;
green &= 0xFF;
blue &= 0xFF;
alpha &= 0xFF;
if (lrx < ulx) {
swap_values(&ulx, &lrx);
}
if (lry < uly) {
swap_values(&uly, &lry);
}
if ((ulx >= 0x140) || (uly >= 0xF0)) {
return displayListHead;
}
if (ulx < 0) {
ulx = 0;
}
if (uly < 0) {
uly = 0;
}
if ((lrx < 0) || (lry < 0)) {
return displayListHead;
}
if (lrx >= 0x141) {
lrx = 0x140;
}
if (lry >= 0xF1) {
lry = 0xF0;
}
gSPDisplayList(displayListHead++, D_02008008);
gDPSetPrimColor(displayListHead++, 0, 0, red, green, blue, alpha);
gDPFillRectangle(displayListHead++, ulx, uly, lrx, lry);
gDPPipeSync(displayListHead++);
return displayListHead;
}
Gfx* func_80098FC8(Gfx* displayListHead, s32 ulx, s32 uly, s32 lrx, s32 lry) {
return draw_box_fill(displayListHead, ulx, uly, lrx, lry, 0, 0, 0, 0xFF);
}
void dma_copy_mio0_segment(u64* data, size_t nbytes, void* vaddr) {
OSIoMesg mb;
OSMesg msg;
osInvalDCache(vaddr, nbytes);
osPiStartDma(&mb, OS_MESG_PRI_NORMAL, OS_READ, (uintptr_t) &_textures_0aSegmentRomStart[SEGMENT_OFFSET(data)],
vaddr, nbytes, &gDmaMesgQueue);
osRecvMesg(&gDmaMesgQueue, &msg, OS_MESG_BLOCK);
}
void dma_tkmk00_textures(u64* data, size_t nbytes, void* vaddr) {
OSIoMesg mb;
OSMesg msg;
osInvalDCache(vaddr, nbytes);
osPiStartDma(&mb, OS_MESG_PRI_NORMAL, OS_READ, (uintptr_t) &_textures_0bSegmentRomStart[SEGMENT_OFFSET(data)],
vaddr, nbytes, &gDmaMesgQueue);
osRecvMesg(&gDmaMesgQueue, &msg, OS_MESG_BLOCK);
}
void clear_menu_textures(void) {
sMenuTextureBufferIndex = 0;
sMenuTextureEntries = 0;
}
/**
* Differs from memory.c with `+ 0x8` instead of `| 0x8`
*
* @param addr
* @return void*
*/
void* segmented_to_virtual_dupe(const void* addr) {
size_t segment = (uintptr_t) addr >> 24;
size_t offset = (uintptr_t) addr & 0x00FFFFFF;
return (void*) ((gSegmentTable[segment] + offset) + 0x80000000);
}
void* segmented_to_virtual_dupe_2(const void* addr) {
size_t segment = (uintptr_t) addr >> 24;
size_t offset = (uintptr_t) addr & 0x00FFFFFF;
return (void*) ((gSegmentTable[segment] + offset) + 0x80000000);
}
void load_menu_img(MenuTexture* addr) {
u16 size;
s32 i;
s32 imgLoaded;
MenuTexture* texAddr;
TextureMap* texMap = &sMenuTextureMap[0];
texAddr = segmented_to_virtual_dupe(addr);
while (texAddr->textureData != NULL) {
imgLoaded = false;
for (i = 0; i < sMenuTextureEntries; i++) {
if (texAddr->textureData == (texMap + i)->textureData) {
imgLoaded = true;
break;
}
}
if (imgLoaded == false) {
if (texAddr->type == 3) {
if (texAddr->size != 0) {
size = texAddr->size;
} else {
size = 0x1000;
}
if (size % 8) {
size = ((size / 8) * 8) + 8;
}
dma_copy_mio0_segment(texAddr->textureData, size, gMenuCompressedBuffer);
mio0decode(gMenuCompressedBuffer, (u8*) &gMenuTextureBuffer[sMenuTextureBufferIndex]);
} else {
dma_copy_mio0_segment(texAddr->textureData, (texAddr->height * texAddr->width) * 2,
&gMenuTextureBuffer[sMenuTextureBufferIndex]);
}
texMap[sMenuTextureEntries].textureData = texAddr->textureData;
texMap[sMenuTextureEntries].offset = sMenuTextureBufferIndex;
sMenuTextureBufferIndex += texAddr->height * texAddr->width;
sMenuTextureBufferIndex = ((sMenuTextureBufferIndex / 8) * 8) + 8;
sMenuTextureEntries += 1;
}
texAddr++;
}
}
void func_80099394(MenuTexture* addr) {
s32 i;
s32 imgLoaded;
MenuTexture* texAddr;
TextureMap* texMap = &sMenuTextureMap[0];
texAddr = segmented_to_virtual_dupe(addr);
while (texAddr->textureData != NULL) {
imgLoaded = false;
for (i = 0; i < sMenuTextureEntries; i++) {
if (texAddr->textureData == (texMap + i)->textureData) {
imgLoaded = true;
break;
}
}
if (imgLoaded == false) {
if (texAddr->type == 5) {
dma_copy_mio0_segment(texAddr->textureData, (u32) (((s32) (texAddr->height * texAddr->width)) / 2),
&gMenuTextureBuffer[sMenuTextureBufferIndex]);
}
texMap[sMenuTextureEntries].textureData = texAddr->textureData;
texMap[sMenuTextureEntries].offset = sMenuTextureBufferIndex;
sMenuTextureBufferIndex += texAddr->height * texAddr->width;
sMenuTextureBufferIndex = ((sMenuTextureBufferIndex / 8) * 8) + 8;
sMenuTextureEntries += 1;
}
texAddr++;
}
}
void func_8009952C(MenuTexture* addr) {
s32 i;
s32 imgLoaded;
MenuTexture* texAddr;
TextureMap* texMap = &sMenuTextureMap[0];
texAddr = segmented_to_virtual_dupe(addr);
while (texAddr->textureData != NULL) {
imgLoaded = false;
for (i = 0; i < sMenuTextureEntries; i++) {
if (texAddr->textureData == (texMap + i)->textureData) {
imgLoaded = true;
break;
}
}
if (imgLoaded == false) {
dma_copy_mio0_segment(texAddr->textureData, 0x00008000U, gMenuCompressedBuffer);
mio0decode(gMenuCompressedBuffer, (u8*) &gMenuTextureBuffer[sMenuTextureBufferIndex]);
texMap[sMenuTextureEntries].textureData = texAddr->textureData;
texMap[sMenuTextureEntries].offset = sMenuTextureBufferIndex;
sMenuTextureBufferIndex += texAddr->height * texAddr->width;
sMenuTextureBufferIndex = ((sMenuTextureBufferIndex / 8) * 8) + 8;
sMenuTextureEntries += 1;
}
texAddr++;
}
}
void load_menu_img_mio0_forced(MenuTexture* addr) {
load_menu_img_comp_type(addr, LOAD_MENU_IMG_MIO0_FORCE);
}
void load_menu_img_comp_type(MenuTexture* addr, s32 compType) {
u16 size;
s32 i;
s32 imgLoaded;
u8 clearBit;
MenuTexture* texAddr;
TextureMap* texMap = &sMenuTextureMap[0];
texAddr = segmented_to_virtual_dupe(addr);
while (texAddr->textureData != NULL) {
imgLoaded = false;
for (i = 0; i < sMenuTextureEntries; i++) {
if (texAddr->textureData == (texMap + i)->textureData) {
imgLoaded = true;
break;
}
}
if ((imgLoaded == false) || (compType > LOAD_MENU_IMG_FORCE)) {
if (texAddr->size != 0) {
size = texAddr->size;
} else {
size = 0x1000;
}
if (size % 8) {
size = ((size / 8) * 8) + 8;
}
switch (compType) {
case LOAD_MENU_IMG_MIO0_ONCE:
case LOAD_MENU_IMG_MIO0_FORCE:
dma_copy_mio0_segment(texAddr->textureData, size, gMenuCompressedBuffer);
break;
case LOAD_MENU_IMG_TKMK00_ONCE:
case LOAD_MENU_IMG_TKMK00_FORCE:
dma_tkmk00_textures(texAddr->textureData, size, gMenuCompressedBuffer);
break;
}
switch (compType) {
case LOAD_MENU_IMG_MIO0_ONCE:
case LOAD_MENU_IMG_MIO0_FORCE:
mio0decode(gMenuCompressedBuffer, (u8*) &gMenuTextureBuffer[sMenuTextureBufferIndex]);
break;
case LOAD_MENU_IMG_TKMK00_ONCE:
case LOAD_MENU_IMG_TKMK00_FORCE:
if (texAddr->type == 1) {
clearBit = 0xBE;
} else {
clearBit = 1;
}
if (1) {}
tkmk00decode(gMenuCompressedBuffer, sTKMK00_LowResBuffer,
(u8*) &gMenuTextureBuffer[sMenuTextureBufferIndex], clearBit);
break;
}
texMap[sMenuTextureEntries].textureData = texAddr->textureData;
texMap[sMenuTextureEntries].offset = sMenuTextureBufferIndex;
sMenuTextureBufferIndex += texAddr->height * texAddr->width;
sMenuTextureBufferIndex = ((sMenuTextureBufferIndex / 8) * 8) + 8;
sMenuTextureEntries += 1;
}
texAddr++;
}
}
void func_80099958(MenuTexture* addr, s32 arg1, s32 arg2) {
u16 size;
MenuTexture* texAddr;
texAddr = segmented_to_virtual_dupe(addr);
while (texAddr->textureData != NULL) {
if (texAddr->size != 0) {
size = texAddr->size;
} else {
size = 0x1400;
}
if (size % 8) {
// Round up to the next multiple of eight
size = ((size / 8) * 8) + 8;
}
dma_copy_mio0_segment(texAddr->textureData, size, gMenuCompressedBuffer);
mio0decode(gMenuCompressedBuffer, D_802BFB80.arraySize4[arg2][arg1 / 2][(arg1 % 2) + 2].pixel_index_array);
texAddr++;
}
}
// Possibly a debug print function?
void func_80099A70(void) {
s32 i;
D_8018E060[0].texture = NULL;
for (i = 0; i < D_8018E060_SIZE; i++) {}
}
void func_80099A94(MenuTexture* arg0, s32 arg1) {
struct_8018E060_entry* var_v1;
var_v1 = &D_8018E060[0];
while (var_v1->texture != NULL) {
var_v1++;
}
var_v1->texture = segmented_to_virtual_dupe(arg0);
var_v1->texNum = arg1;
}
#ifdef NON_MATCHING
// https://decomp.me/scratch/rxEoi
// Something's up with the handling of `_textures_0aSegmentRomStart`, I don't know how to fix it
void func_80099AEC(void) {
s8 texEnd;
s32 size;
UNUSED s32 stackPadding0;
UNUSED s32 stackPadding1;
s32 texSize;
OSIoMesg mb;
OSMesg msg;
UNUSED u8* test;
s32 bufSize;
MenuTexture* texAddr;
struct_8018E060_entry* var_s1;
if (gGamestate == RACING) {
bufSize = 0x00000500;
} else {
bufSize = 0x00001000;
}
texEnd = 0;
var_s1 = D_8018E060;
texAddr = var_s1->texture;
if (texAddr == NULL)
return;
texSize = texAddr->size;
if (texSize != 0) {
size = texSize;
} else {
size = 0x1400;
}
if (size % 8) {
size = ((size / 8) * 8) + 8;
}
osInvalDCache(gMenuCompressedBuffer, size);
osPiStartDma(&mb, 0, 0, (uintptr_t) &_textures_0aSegmentRomStart[SEGMENT_OFFSET(texAddr->textureData)],
gMenuCompressedBuffer, size, &gDmaMesgQueue);
osRecvMesg(&gDmaMesgQueue, &msg, 1);
while (1) {
if ((var_s1 + 1)->texture == NULL) {
texEnd += 1;
} else {
texAddr = (var_s1 + 1)->texture;
texSize = (var_s1 + 1)->texture->size;
if (texSize != 0) {
size = texSize;
} else {
size = 0x1400;
}
if (size % 8) {
size = ((size / 8) * 8) + 8;
}
osInvalDCache(gMenuCompressedBuffer + bufSize * 4, size);
osPiStartDma(&mb, 0, 0, (uintptr_t) &_textures_0aSegmentRomStart[SEGMENT_OFFSET(texAddr->textureData)],
gMenuCompressedBuffer + bufSize * 4, size, &gDmaMesgQueue);
}
mio0decode(gMenuCompressedBuffer, (u8*) &gMenuTextureBuffer[sMenuTextureMap[var_s1->texNum].offset]);
var_s1->texture = NULL;
var_s1++;
if (texEnd != 0)
break;
osRecvMesg(&gDmaMesgQueue, &msg, 1);
if ((var_s1 + 1)->texture == NULL) {
texEnd += 1;
} else {
texAddr = (var_s1 + 1)->texture;
texSize = (var_s1 + 1)->texture->size;
if (texSize != 0) {
size = texSize;
} else {
size = 0x1400;
}
if (size % 8) {
size = ((size / 8) * 8) + 8;
}
osInvalDCache(gMenuCompressedBuffer, size);
osPiStartDma(&mb, 0, 0, (uintptr_t) &_textures_0aSegmentRomStart[SEGMENT_OFFSET(texAddr->textureData)],
gMenuCompressedBuffer, size, &gDmaMesgQueue);
}
mio0decode(gMenuCompressedBuffer + bufSize * 4,
(u8*) &gMenuTextureBuffer[sMenuTextureMap[var_s1->texNum].offset]);
var_s1->texture = NULL;
var_s1++;
if (texEnd != 0)
break;
osRecvMesg(&gDmaMesgQueue, &msg, 1);
}
}
#else
GLOBAL_ASM("asm/non_matchings/menu_items/func_80099AEC.s")
#endif
void func_80099E54(void) {
D_8018E0E8[0].mk64Texture = NULL;
}
void func_80099E60(MenuTexture* arg0, s32 arg1, s32 arg2) {
struct_8018E0E8_entry* var_v1;
var_v1 = D_8018E0E8;
while (var_v1->mk64Texture != NULL) {
var_v1++;
}
var_v1->mk64Texture = segmented_to_virtual_dupe(arg0);
var_v1->unk4 = arg1;
var_v1->unk6 = arg2;
}
#ifdef NON_MATCHING
// https://decomp.me/scratch/rUXbD
// Some fakematch nonsense, may or may not be necessary
// Issue is with instruction ordering near the first `osPiStartDma` call
void func_80099EC4(void) {
s8 var_s4;
s32 var_s0;
UNUSED s32 stackPadding0;
UNUSED s32 stackPadding1;
OSIoMesg sp68;
OSMesg sp64;
s32 huh;
u8* test;
MenuTexture* temp_s2;
struct_8018E0E8_entry* var_s1;
var_s4 = 0;
var_s1 = D_8018E0E8;
temp_s2 = var_s1->mk64Texture;
if (temp_s2 == NULL)
return;
huh = temp_s2->size;
if (huh != 0) {
var_s0 = huh;
} else {
var_s0 = 0x1400;
}
if (var_s0 % 8) {
var_s0 = ((var_s0 / 8) * 8) + 8;
}
osInvalDCache(gMenuCompressedBuffer, var_s0);
test = &_textures_0aSegmentRomStart[SEGMENT_OFFSET(temp_s2->textureData)];
osPiStartDma(&sp68, 0, 0, (uintptr_t) test, gMenuCompressedBuffer, var_s0, &gDmaMesgQueue);
if ((var_s0 && var_s0) && var_s0) {}
// osPiStartDma(&sp68, 0, 0, &_textures_0aSegmentRomStart[SEGMENT_OFFSET(temp_s2->textureData)],
// gMenuCompressedBuffer, var_s0, &gDmaMesgQueue);
osRecvMesg(&gDmaMesgQueue, &sp64, 1);
while (1) {
if ((var_s1 + 1)->mk64Texture == NULL) {
var_s4 += 1;
} else {
temp_s2 = (var_s1 + 1)->mk64Texture;
huh = (var_s1 + 1)->mk64Texture->size;
if (huh != 0) {
var_s0 = huh;
} else {
var_s0 = 0x1400;
}
if (var_s0 % 8) {
var_s0 = ((var_s0 / 8) * 8) + 8;
}
osInvalDCache(gMenuCompressedBuffer + 0x1400, var_s0);
osPiStartDma(&sp68, 0, 0, (uintptr_t) &_textures_0aSegmentRomStart[SEGMENT_OFFSET(temp_s2->textureData)],
gMenuCompressedBuffer + 0x1400, var_s0, &gDmaMesgQueue);
}
mio0decode(gMenuCompressedBuffer,
D_802BFB80.arraySize4[var_s1->unk6][var_s1->unk4 / 2][(var_s1->unk4 % 2) + 2].pixel_index_array);
var_s1->mk64Texture = NULL;
var_s1++;
if (var_s4 != 0)
break;
osRecvMesg(&gDmaMesgQueue, &sp64, 1);
if ((var_s1 + 1)->mk64Texture == NULL) {
var_s4 += 1;
} else {
temp_s2 = (var_s1 + 1)->mk64Texture;
huh = (var_s1 + 1)->mk64Texture->size;
if (huh != 0) {
var_s0 = huh;
} else {
var_s0 = 0x1400;
}
if (var_s0 % 8) {
var_s0 = ((var_s0 / 8) * 8) + 8;
}
osInvalDCache(gMenuCompressedBuffer, var_s0);
osPiStartDma(&sp68, 0, 0, (uintptr_t) &_textures_0aSegmentRomStart[SEGMENT_OFFSET(temp_s2->textureData)],
gMenuCompressedBuffer, var_s0, &gDmaMesgQueue);
}
mio0decode(gMenuCompressedBuffer + 0x1400,
D_802BFB80.arraySize4[var_s1->unk6][var_s1->unk4 / 2][(var_s1->unk4 % 2) + 2].pixel_index_array);
var_s1->mk64Texture = NULL;
var_s1++;
if (var_s4 != 0)
break;
osRecvMesg(&gDmaMesgQueue, &sp64, 1);
}
}
#else
GLOBAL_ASM("asm/non_matchings/menu_items/func_80099EC4.s")
#endif
void func_8009A238(MenuTexture* arg0, s32 arg1) {
s32 var_a3;
s32 temp_v1;
u64* sp24;
UNUSED TextureMap* temp_v0;
temp_v1 = sMenuTextureMap[arg1].offset;
sp24 = arg0->textureData;
var_a3 = arg0->size;
if (var_a3 % 8) {
var_a3 = ((var_a3 / 8) * 8) + 8;
}
dma_tkmk00_textures(sp24, var_a3, gMenuCompressedBuffer);
tkmk00decode(gMenuCompressedBuffer, sTKMK00_LowResBuffer, (u8*) &gMenuTextureBuffer[temp_v1], 1);
sMenuTextureMap[arg1].textureData = sp24;
}
void func_8009A2F0(struct_8018E0E8_entry* arg0) {
MenuTexture* var_a0;
struct_8018E0E8_entry* temp_v0;
temp_v0 = segmented_to_virtual_dupe_2(arg0);
var_a0 = temp_v0->mk64Texture;
while (var_a0 != NULL) {
if (var_a0 == NULL) {
break;
}
load_menu_img_comp_type(var_a0, LOAD_MENU_IMG_TKMK00_ONCE);
if (1) {}
temp_v0++;
var_a0 = temp_v0->mk64Texture;
}
}
void func_8009A344(void) {
s32 index;
for (index = 0; index < D_8018DEE0_SIZE; index++) {
D_8018DEE0[index].visible = 0;
}
}
s32 animate_character_select_menu(MkAnimation* anim) {
s32 i;
struct_8018DEE0_entry* entry;
anim = segmented_to_virtual_dupe_2(anim);
i = 0;
while (D_8018DEE0[i].visible) {
i++;
if (i >= 0x10) {
// No more space.
while (1) {
;
}
}
}
entry = &D_8018DEE0[i];
entry->textureSequence = anim;
entry->sequenceIndex = -1;
entry->frameCountDown = 0;
entry->visible = 0x80000000;
entry->menuTextureIndex = sMenuTextureEntries;
if (anim[0].mk64Texture) {
load_menu_img_mio0_forced(anim[0].mk64Texture);
}
if (anim[1].mk64Texture) {
load_menu_img_mio0_forced(anim[1].mk64Texture);
} else {
load_menu_img_mio0_forced(anim[0].mk64Texture);
}
entry->unk14 = 0;
return i;
}
s32 func_8009A478(MkAnimation* anim, s32 arg1) {
s32 i;
struct_8018DEE0_entry* entry;
anim = segmented_to_virtual_dupe_2(anim);
i = 0;
while (D_8018DEE0[i].visible) {
i++;
if (i >= 0x10) {
// No more space.
while (1) {
;
}
}
}
entry = &D_8018DEE0[i];
entry->textureSequence = anim;
entry->sequenceIndex = -1;
entry->frameCountDown = 0;
entry->visible = 0x80000000;
entry->menuTextureIndex = sMenuTextureEntries;
if (anim[0].mk64Texture) {
func_80099958(anim[0].mk64Texture, arg1, 0);
}
if (anim[1].mk64Texture) {
func_80099958(anim[1].mk64Texture, arg1, 1);
} else {
func_80099958(anim[0].mk64Texture, arg1, 1);
}
entry->unk14 = 0;
return i;
}
void func_8009A594(s32 arg0, s32 arg1, MkAnimation* arg2) {
MkAnimation* temp_v0;
MenuTexture* temp_a0;
temp_v0 = segmented_to_virtual_dupe_2(arg2);
D_8018DEE0[arg0].textureSequence = temp_v0;
D_8018DEE0[arg0].sequenceIndex = arg1;
// All hail the fake match gods who, in their infinite grace, have blessed us
// with this enigma of a match on the first iteration of permutation
D_8018DEE0[arg0].frameCountDown = (temp_v0 + arg1)->frame_length;
temp_a0 = segmented_to_virtual_dupe(temp_v0[arg1].mk64Texture);
if (D_8018DEE0[arg0].unk14 != 0) {
func_80099A94(temp_a0, D_8018DEE0[arg0].menuTextureIndex);
D_8018DEE0[arg0].unk14 = 0;
} else {
func_80099A94(temp_a0, D_8018DEE0[arg0].menuTextureIndex + 1);
D_8018DEE0[arg0].unk14 = 1;
}
}
void func_8009A640(s32 arg0, s32 arg1, s32 arg2, MkAnimation* arg3) {
MkAnimation* temp_v0;
MenuTexture* temp_a0;
temp_v0 = segmented_to_virtual_dupe_2(arg3);
D_8018DEE0[arg0].textureSequence = temp_v0;
D_8018DEE0[arg0].sequenceIndex = arg1;
D_8018DEE0[arg0].frameCountDown = (temp_v0 + arg1)->frame_length;
temp_a0 = segmented_to_virtual_dupe(temp_v0[arg1].mk64Texture);
D_8018DEE0[arg0].unk14 ^= 1;
func_80099E60(temp_a0, arg2, D_8018DEE0[arg0].unk14);
}
UNUSED void func_8009A6D4(void) {
s32 index;
for (index = 0; index < D_8018DEE0_SIZE; index++) {
if ((D_8018DEE0[index].visible & 0x80000000) != 0) {
func_8009A878(&D_8018DEE0[index]);
gDisplayListHead = func_8009C434(gDisplayListHead, &D_8018DEE0[index], 0, 0, 0);
}
}
func_80099AEC();
}
void func_8009A76C(s32 arg0, s32 arg1, s32 arg2, s32 arg3) {
struct_8018DEE0_entry* temp = &D_8018DEE0[arg0];
if (temp->visible & 0x80000000) {
func_8009A878(temp);
gDisplayListHead = func_8009C434(gDisplayListHead, temp, arg1, arg2, arg3);
}
}
void func_8009A7EC(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4) {
struct_8018DEE0_entry* temp = &D_8018DEE0[arg0];
if (temp->visible & 0x80000000) {
func_8009A944(temp, arg3);
gDisplayListHead = func_8009C708(gDisplayListHead, temp, arg1, arg2, arg3, arg4);
}
}
MenuTexture* func_8009A878(struct_8018DEE0_entry* arg0) {
MkAnimation* temp_v1;
MkAnimation* var_v0;
MkAnimation* test;
MenuTexture* temp_a0;
temp_v1 = arg0->textureSequence;
if (arg0->sequenceIndex < 0) {
arg0->sequenceIndex = 0;
arg0->frameCountDown = 0;
}
arg0->frameCountDown--;
if (arg0->frameCountDown <= 0) {
arg0->sequenceIndex++;
// Again, hail the fake match gods
var_v0 = ((test = temp_v1) + arg0->sequenceIndex);
if (var_v0->mk64Texture == NULL) {
arg0->sequenceIndex = 0;
}
var_v0 = (test + arg0->sequenceIndex);
arg0->frameCountDown = var_v0->frame_length;
temp_a0 = segmented_to_virtual_dupe(var_v0->mk64Texture);
if (arg0->unk14 != 0) {
func_80099A94(temp_a0, arg0->menuTextureIndex);
arg0->unk14 = 0;
} else {
func_80099A94(temp_a0, arg0->menuTextureIndex + 1);
arg0->unk14 = 1;
}
}
return arg0->textureSequence[arg0->sequenceIndex].mk64Texture;
}
MenuTexture* func_8009A944(struct_8018DEE0_entry* arg0, s32 arg1) {
MkAnimation* temp_v1;
MkAnimation* var_v0;
MkAnimation* test;
MenuTexture* temp_a0;
temp_v1 = arg0->textureSequence;
if (arg0->sequenceIndex < 0) {
arg0->sequenceIndex = 0;
arg0->frameCountDown = 0;
}
arg0->frameCountDown--;
if (arg0->frameCountDown <= 0) {
arg0->sequenceIndex++;
var_v0 = ((test = temp_v1) + arg0->sequenceIndex);
if (var_v0->mk64Texture == NULL) {
arg0->sequenceIndex = 0;
}
var_v0 = (test + arg0->sequenceIndex);
arg0->frameCountDown = var_v0->frame_length;
temp_a0 = segmented_to_virtual_dupe(var_v0->mk64Texture);
arg0->unk14 ^= 1;
func_80099E60(temp_a0, arg1, arg0->unk14);
}
return arg0->textureSequence[arg0->sequenceIndex].mk64Texture;
}
void func_8009A9FC(s32 arg0, s32 arg1, u32 arg2, s32 arg3) {
s32 red;
s32 green;
s32 blue;
s32 newred;
s32 newgreen;
s32 newblue;
s32 alpha;
s32 temp_t9;
u16 temp_a0;
s32 var_t1;
u16* color0;
u16* color1;
color0 = &gMenuTextureBuffer[sMenuTextureMap[arg0].offset];
color1 = &gMenuTextureBuffer[sMenuTextureMap[arg1].offset];
for (var_t1 = 0; (u32) var_t1 < arg2; var_t1++) {
temp_a0 = *color0++;
red = (temp_a0 & 0xF800) >> 0xB;
green = (temp_a0 & 0x7C0) >> 6;
blue = (temp_a0 & 0x3E) >> 1;
alpha = temp_a0 & 0x1;
if (alpha) {}
temp_t9 = ((red * 0x4D) + (green * 0x96) + (blue * 0x1D)) >> 8;
newred = (((((temp_t9 - red) * arg3) >> 8) + red) << 0xB);
newgreen = (((((((temp_t9 * 7) / 8) - green) * arg3) >> 8) + green) << 6);
newblue = (((((((temp_t9 * 6) / 8) - blue) * arg3) >> 8) + blue) << 1);
*color1++ = newblue + newgreen + newred + alpha;
}
}
void func_8009AB7C(s32 arg0) {
s32 red;
s32 green;
s32 blue;
s32 alpha;
s32 newred;
s32 newgreen;
s32 newblue;
u32 temp_t9;
s32 var_v1;
u16* color;
color = &gMenuTextureBuffer[sMenuTextureMap[arg0].offset];
for (var_v1 = 0; var_v1 < 0x4B000; var_v1++) {
red = ((*color & 0xF800) >> 0xB) * 0x4D;
green = ((*color & 0x7C0) >> 6) * 0x96;
blue = ((*color & 0x3E) >> 1) * 0x1D;
alpha = *color & 0x1;
temp_t9 = red + green + blue;
temp_t9 >>= 8;
newred = temp_t9 << 0xB;
newgreen = temp_t9 << 6;
newblue = temp_t9 << 1;
*color++ = newblue + newgreen + newred + alpha;
}
}
void func_8009AD78(s32 arg0, s32 arg1) {
s32 red;
s32 green;
s32 blue;
s32 alpha;
UNUSED s32 newred;
UNUSED s32 newgreen;
UNUSED s32 newblue;
u32 temp_t9;
s32 var_v1;
s32 size;
UNUSED u16 temp_a0;
u16* color;
color = &gMenuTextureBuffer[sMenuTextureMap[arg0].offset];
size = sMenuTextureMap[arg0 + 1].offset - sMenuTextureMap[arg0].offset;
for (var_v1 = 0; var_v1 != size; var_v1++) {
red = ((*color & 0xF800) >> 0xB) * 0x4D;
green = ((*color & 0x7C0) >> 6) * 0x96;
blue = ((*color & 0x3E) >> 1) * 0x1D;
alpha = *color & 0x1;
temp_t9 = red + green + blue;
temp_t9 = temp_t9 >> 8;
temp_t9 += ((0x20 - temp_t9) * arg1) >> 8;
*color++ = (temp_t9 << 1) + (temp_t9 << 6) + (temp_t9 << 0xB) + alpha;
}
}
void convert_img_to_greyscale(s32 arg0, u32 arg1) {
u32 var_s0;
s32 red;
s32 green;
s32 blue;
s32 alpha;
u32 temp_t9;
s32 size;
u16* color;
f32 sp48[0x20];
for (var_s0 = 0; var_s0 < 0x20; var_s0++) {
sp48[var_s0] = func_800917B0(var_s0 * 0.03125, (arg1 * 1.5 * 0.00390625) + 0.25);
}
color = &gMenuTextureBuffer[sMenuTextureMap[arg0].offset];
size = sMenuTextureMap[arg0 + 1].offset - sMenuTextureMap[arg0].offset;
for (var_s0 = 0; var_s0 < (u32) size; var_s0++) {
red = ((*color & 0xF800) >> 0xB) * 0x55;
green = ((*color & 0x7C0) >> 6) * 0x4B;
blue = ((*color & 0x3E) >> 1) * 0x5F;
alpha = *color & 0x1;
temp_t9 = red + green + blue;
temp_t9 >>= 8;
temp_t9 = sp48[temp_t9] * 32.0f;
if (temp_t9 >= 0x20) {
temp_t9 = 0x1F;
}
*color++ = (temp_t9 << 1) + (temp_t9 << 6) + (temp_t9 << 0xB) + alpha;
}
}
void adjust_img_colour(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4) {
s32 red;
s32 green;
s32 blue;
s32 alpha;
s32 newred;
s32 newgreen;
s32 newblue;
u32 temp_t9;
s32 var_v1;
u16* color;
color = &gMenuTextureBuffer[sMenuTextureMap[arg0].offset];
for (var_v1 = 0; var_v1 != arg1; var_v1++) {
red = ((*color & 0xF800) >> 0xB) * 0x4D;
green = ((*color & 0x7C0) >> 6) * 0x96;
blue = ((*color & 0x3E) >> 1) * 0x1D;
alpha = *color & 0x1;
temp_t9 = red + green + blue;
temp_t9 = temp_t9 >> 8;
newred = ((temp_t9 * arg2) >> 8) << 0xB;
newgreen = ((temp_t9 * arg3) >> 8) << 6;
newblue = ((temp_t9 * arg4) >> 8) << 1;
*color++ = newred + newgreen + newblue + alpha;
}
}
u16* func_8009B8C4(u64* arg0) {
UNUSED s32 pad[2];
s32 offset;
s32 found;
s32 someIndex;
found = 0;
for (someIndex = 0; someIndex < sMenuTextureEntries; someIndex++) {
if (arg0 == sMenuTextureMap[someIndex].textureData) {
found = 1;
offset = sMenuTextureMap[someIndex].offset;
break;
}
}
if (found != 0) {
return &gMenuTextureBuffer[offset];
}
return NULL;
}
// gSomeDLBuffer is a little weird. In code_800AF9B0 its treated as a
// struct_8018EE10_entry pointer. But here its being treated as a
// Gfx pointer. It seems to be multi use.
void func_8009B938(void) {
sGfxPtr = (Gfx*) gSomeDLBuffer;
gNumD_8018E768Entries = 0;
}
void func_8009B954(MenuTexture* arg0) {
D_8018E768[gNumD_8018E768Entries].textures = segmented_to_virtual_dupe(arg0);
D_8018E768[gNumD_8018E768Entries].displayList = sGfxPtr;
}
void func_8009B998(void) {
gSPEndDisplayList(sGfxPtr++);
gNumD_8018E768Entries += 1;
}
// I don't get how this compiles, given that there's a code path
// that has no explicit return value.
// Based on the target assembly, in the event that it never finds
// the desired entry, it'll treat the return value of segmented_to_virtual_dupe
// as the return of this function. Which seems like a bug to me
Gfx* func_8009B9D0(Gfx* displayListHead, MenuTexture* textures) {
Gfx* displayList;
UNUSED s32 pad;
bool found;
s32 index;
found = false;
for (index = 0; index < D_8018E768_SIZE; index++) {
if (D_8018E768[index].textures == segmented_to_virtual_dupe(textures)) {
displayList = D_8018E768[index].displayList;
found = true;
break;
}
}
if (found) {
gSPDisplayList(displayListHead++, displayList);
return displayListHead;
}
}
Gfx* render_menu_textures(Gfx* arg0, MenuTexture* arg1, s32 column, s32 row) {
MenuTexture* temp_v0;
u8* temp_v0_3;
s8 var_s4;
temp_v0 = segmented_to_virtual_dupe(arg1);
while (temp_v0->textureData != NULL) {
var_s4 = 0;
switch (temp_v0->type) {
case 0:
gSPDisplayList(arg0++, D_02007708);
break;
case 1:
gSPDisplayList(arg0++, D_02007728);
break;
case 2:
gSPDisplayList(arg0++, D_02007748);
break;
case 3:
gSPDisplayList(arg0++, D_02007768);
var_s4 = 3;
break;
case 4:
gSPDisplayList(arg0++, D_02007788);
break;
default:
gSPDisplayList(arg0++, D_02007728);
break;
}
temp_v0_3 = (u8*) func_8009B8C4(temp_v0->textureData);
if (temp_v0_3 != 0) {
if (gTransitionType[4] != 4) {
arg0 =
func_80095E10(arg0, var_s4, 0x00000400, 0x00000400, 0, 0, temp_v0->width, temp_v0->height,
temp_v0->dX + column, temp_v0->dY + row, temp_v0_3, temp_v0->width, temp_v0->height);
} else {
arg0 = func_800987D0(arg0, 0U, 0U, temp_v0->width, temp_v0->height, temp_v0->dX + column,
temp_v0->dY + row, temp_v0_3, temp_v0->width, temp_v0->height);
}
}
temp_v0++;
}
return arg0;
}
Gfx* func_8009BC9C(Gfx* arg0, MenuTexture* arg1, s32 arg2, s32 arg3, s32 arg4, s32 arg5) {
MenuTexture* var_s0;
u8* temp_v0_3;
var_s0 = segmented_to_virtual_dupe(arg1);
while (var_s0->textureData != NULL) {
switch (var_s0->type) { /* irregular */
case 0:
gSPDisplayList(arg0++, D_02007708);
break;
case 1:
gSPDisplayList(arg0++, D_02007728);
break;
}
temp_v0_3 = (u8*) func_8009B8C4(var_s0->textureData);
if (temp_v0_3 != 0) {
switch (arg4) { /* switch 1; irregular */
case 1: /* switch 1 */
arg0 = func_80097AE4(arg0, 0, var_s0->dX + arg2, var_s0->dY + arg3, temp_v0_3, arg5);
break;
case 2: /* switch 1 */
arg0 = func_80097E58(arg0, 0, 0, 0U, var_s0->width, var_s0->height, var_s0->dX + arg2,
var_s0->dY + arg3, temp_v0_3, var_s0->width, var_s0->height, arg5);
break;
case 3: /* switch 1 */
arg0 = func_80097A14(arg0, 0, 0, 0, var_s0->width, var_s0->height, var_s0->dX + arg2,
var_s0->dY + arg3, temp_v0_3, var_s0->width, var_s0->height);
break;
case 4: /* switch 1 */
arg0 = func_80097274(arg0, 0, 0x00000400, 0x00000400, 0, 0, var_s0->width, var_s0->height,
var_s0->dX + arg2, var_s0->dY + arg3, (u16*) temp_v0_3, var_s0->width,
var_s0->height, arg5);
break;
}
}
var_s0++;
}
return arg0;
}
Gfx* print_letter(Gfx* arg0, MenuTexture* glyphTexture, f32 arg2, f32 arg3, s32 mode, f32 scaleX, f32 scaleY) {
s32 var_v0;
u8* temp_v0_2;
f32 thing0;
f32 thing1;
MenuTexture* var_s0;
var_s0 = segmented_to_virtual_dupe(glyphTexture);
while (var_s0->textureData != NULL) {
var_v0 = 0;
thing0 = var_s0->dX + arg2;
if (thing0 > 320.0f) {
var_v0 = 1;
}
thing0 += var_s0->width * scaleX;
if (thing0 < 0.0f) {
var_v0 += 1;
}
thing1 = var_s0->dY + arg3;
if (thing1 < 0.0f) {
var_v0 += 1;
}
thing1 -= var_s0->height * scaleY;
if (thing1 > 240.0f) {
var_v0 += 1;
}
if (var_v0 != 0) {
var_s0++;
} else {
temp_v0_2 = (u8*) func_8009B8C4(var_s0->textureData);
if (temp_v0_2 != 0) {
switch (mode) { /* irregular */
case 1:
gSPDisplayList(arg0++, D_020077F8);
arg0 = func_80095BD0(arg0, temp_v0_2, var_s0->dX + arg2, var_s0->dY + arg3, var_s0->width,
var_s0->height, scaleX, scaleY);
break;
case 2:
gSPDisplayList(arg0++, D_02007818);
arg0 = func_80095BD0(arg0, temp_v0_2, var_s0->dX + arg2, var_s0->dY + arg3, var_s0->width,
var_s0->height, scaleX, scaleY);
break;
}
}
var_s0++;
}
}
return arg0;
}
Gfx* func_8009C204(Gfx* arg0, MenuTexture* arg1, s32 arg2, s32 arg3, s32 arg4) {
s32 var_s2;
u8* temp_t0;
MenuTexture* var_s1;
var_s1 = segmented_to_virtual_dupe(arg1);
while (var_s1->textureData != NULL) {
var_s2 = 0;
switch (var_s1->type) { /* irregular */
case 0:
gSPDisplayList(arg0++, D_02007708);
break;
case 1:
gSPDisplayList(arg0++, D_02007728);
break;
case 3:
gSPDisplayList(arg0++, D_02007768);
var_s2 = 3;
break;
default:
gSPDisplayList(arg0++, D_02007728);
break;
}
temp_t0 = (u8*) func_8009B8C4(var_s1->textureData);
switch (arg4) { /* switch 1; irregular */
case 2: /* switch 1 */
arg0 =
func_800963F0(arg0, var_s2, 0x00000400, 0x00000400, 0.5f, 0.5f, 0, 0, var_s1->width, var_s1->height,
var_s1->dX + arg2, var_s1->dY + arg3, temp_t0, var_s1->width, var_s1->height);
break;
case 3: /* switch 1 */
arg0 = func_800963F0(arg0, var_s2, 0x00000400, 0x00000400, 0.457f, 0.5f, 0, 0, var_s1->width,
var_s1->height, var_s1->dX + arg2, var_s1->dY + arg3, temp_t0, var_s1->width,
var_s1->height);
break;
}
var_s1++;
}
return arg0;
}
Gfx* func_8009C434(Gfx* arg0, struct_8018DEE0_entry* arg1, s32 arg2, s32 arg3, s32 arg4) {
s32 var_t0;
s32 var_t1;
Gfx* temp;
MenuTexture* var_s0;
var_s0 = segmented_to_virtual_dupe(arg1->textureSequence[arg1->sequenceIndex].mk64Texture);
temp = D_02007728;
while (var_s0->textureData != NULL) {
var_t1 = 0;
switch (var_s0->type) { /* irregular */
default:
gSPDisplayList(arg0++, temp);
break;
case 0:
gSPDisplayList(arg0++, D_02007708);
break;
case 1:
gSPDisplayList(arg0++, temp);
break;
case 3:
gSPDisplayList(arg0++, D_02007768);
var_t1 = 3;
break;
}
if (arg1->unk14 != 0) {
var_t0 = sMenuTextureMap[arg1->menuTextureIndex + 1].offset;
} else {
var_t0 = sMenuTextureMap[arg1->menuTextureIndex].offset;
if (1) {}
if (1) {}
if (1) {}
}
if (arg4 >= 0) {
arg0 =
func_80097E58(arg0, var_t1, 0, 0U, var_s0->width, var_s0->height, var_s0->dX + arg2, var_s0->dY + arg3,
(u8*) &gMenuTextureBuffer[var_t0], var_s0->width, var_s0->height, (u32) arg4);
} else {
switch (arg4) {
case -1:
arg0 = func_80095E10(arg0, var_t1, 0x00000400, 0x00000400, 0, 0, var_s0->width, var_s0->height,
var_s0->dX + arg2, var_s0->dY + arg3, (u8*) &gMenuTextureBuffer[var_t0],
var_s0->width, var_s0->height);
break;
case -2:
arg0 = func_800963F0(arg0, var_t1, 0x00000400, 0x00000400, 0.5f, 0.5f, 0, 0, var_s0->width,
var_s0->height, var_s0->dX + arg2, var_s0->dY + arg3,
(u8*) &gMenuTextureBuffer[var_t0], var_s0->width, var_s0->height);
break;
}
}
var_s0++;
}
return arg0;
}
Gfx* func_8009C708(Gfx* arg0, struct_8018DEE0_entry* arg1, s32 arg2, s32 arg3, s32 arg4, s32 arg5) {
s32 var_t0;
UNUSED s32 thing;
Gfx* temp;
MenuTexture* var_s1;
var_s1 = segmented_to_virtual_dupe(arg1->textureSequence[arg1->sequenceIndex].mk64Texture);
temp = D_02007728;
while (var_s1->textureData != NULL) {
var_t0 = 0;
switch (var_s1->type) { /* irregular */
case 0:
gSPDisplayList(arg0++, D_02007708);
break;
case 1:
gSPDisplayList(arg0++, temp);
break;
case 2:
gSPDisplayList(arg0++, D_02007748);
break;
case 3:
gSPDisplayList(arg0++, D_02007768);
var_t0 = 3;
break;
default:
gSPDisplayList(arg0++, temp);
break;
}
if (arg5 >= 0) {
arg0 =
func_80097E58(arg0, var_t0, 0, 0U, var_s1->width, var_s1->height, var_s1->dX + arg2, var_s1->dY + arg3,
D_802BFB80.arraySize4[arg1->unk14][arg4 / 2][(arg4 % 2) + 2].pixel_index_array,
var_s1->width, var_s1->height, (u32) arg5);
}
var_s1++;
}
return arg0;
}
void func_8009C918(void) {
s32 someIndex;
for (someIndex = 0; someIndex < 4; someIndex++) {
D_8018E7E8[someIndex].x = D_8015F480[someIndex].screenStartX;
D_8018E7E8[someIndex].y = D_8015F480[someIndex].screenStartY;
D_8018E810[someIndex].x = D_8015F480[someIndex].screenWidth;
D_8018E810[someIndex].y = D_8015F480[someIndex].screenHeight;
}
D_8018E7E8[4].x = 0x00A0;
D_8018E7E8[4].y = 0x0078;
D_8018E810[4].x = 0x0140;
D_8018E810[4].y = 0x00F0;
}
void func_8009CA2C(void) {
s32 var_s0;
for (var_s0 = 0; var_s0 < 5; var_s0++) {
func_8009CA6C(var_s0);
}
}
void func_8009CA6C(s32 arg0) {
s32 var_a1;
if ((arg0 == 4) || ((find_menu_items(0x000000AA) == NULL) && (find_menu_items(0x000000AB) == NULL) &&
(find_menu_items(0x000000B9) == NULL) && (find_menu_items(0x000000BA) == NULL) &&
(find_menu_items(0x000000AC) == NULL) && (find_menu_items(0x000000B0) == NULL))) {
var_a1 = 0;
gSPDisplayList(gDisplayListHead++, D_0D0076F8);
if ((arg0 != 4) && (gIsGamePaused != 0)) {
var_a1 = 1;
}
switch (gTransitionType[arg0]) {
case 1:
draw_black_fade_in(arg0, var_a1);
return;
case 2:
func_8009D958(arg0, var_a1);
return;
case 3:
func_8009DB8C();
return;
case 4:
func_8009DAA8();
return;
case 5:
func_8009D998(arg0);
return;
case 7:
func_8009D978(arg0, var_a1);
return;
case 8:
draw_white_fade_in(arg0, var_a1);
break;
case 0:
default:
break;
}
}
}
void draw_fade_in(s32 arg0, s32 arg1, s32 arg2) {
RGBA16* color;
s16 x, y, w, h;
UNUSED s32 pad[3];
struct UnkStruct_800DC5EC* unk;
struct UnkStruct_8018E7E8 *size, *start;
if ((gModeSelection == GRAND_PRIX) || (gModeSelection == TIME_TRIALS)) {
start = &(D_8018E7E8[arg0]);
size = &(D_8018E810[arg0]);
x = start->x;
y = start->y;
w = size->x;
h = size->y;
} else if (arg0 >= 4) {
start = &(D_8018E7E8[arg0]);
size = &(D_8018E810[arg0]);
x = start->x;
y = start->y;
w = size->x;
h = size->y;
} else {
unk = &D_8015F480[arg0];
x = unk->screenStartX;
y = unk->screenStartY;
w = unk->screenWidth;
h = unk->screenHeight;
}
color = &D_800E7AE8[arg2];
gDisplayListHead =
draw_box(gDisplayListHead, x - (w / 2), y - (h / 2), (w / 2) + x, (h / 2) + y, color->red, color->green,
color->blue, 0xFF - (gCurrentTransitionTime[arg0] * 0xFF / gTransitionDuration[arg0]));
if ((arg1 == 0) &&
(gCurrentTransitionTime[arg0] += 1, (gCurrentTransitionTime[arg0] >= gTransitionDuration[arg0]))) {
if (gGamestate == 4) {
gTransitionType[arg0] = 6;
return;
}
gTransitionType[arg0] = 0;
unref_8018EE0C = 0;
}
}
void draw_black_fade_in(s32 arg0, s32 arg1) {
draw_fade_in(arg0, arg1, 0);
}
void draw_white_fade_in(s32 arg0, s32 arg1) {
draw_fade_in(arg0, arg1, 1);
}
void func_8009CE1C(void) {
if ((gSoundMode != 3) && (gPlayerCountSelection1 >= 2)) {
func_800C3448(0xE0000002);
}
}
void func_8009CE64(s32 arg0) {
s32 thing;
s32 var_a1;
UNUSED s32 stackPadding0;
MenuItem* temp_v0;
var_a1 = 0;
if (gGamestate == 5) {
if (2 != gCCSelection) {
thing = gCCSelection;
if (thing != 3) {
goto func_8009CE64_label1;
}
goto func_8009CE64_label2;
}
func_8009CE64_label2:
if ((D_802874D8.unk1D < 3) && (gCupSelection == 3)) {
var_a1 = 1;
}
func_8009CE64_label1:
if (var_a1) {
gGotoMenu = 9;
gCreditsCourseId = 8;
} else {
gGotoMenu = 1;
gMenuSelection = 0x0000000B;
}
} else if (gGamestate == 4) {
if (gTransitionType[arg0] == 2) {
if (arg0 != 4) {
gTransitionType[arg0] = 5;
} else {
var_a1 = 0;
temp_v0 = find_menu_items(0x000000B0);
if (temp_v0 != NULL) {
switch (temp_v0->state) { /* switch 8; irregular */
case 10: /* switch 8 */
func_802903B0();
break;
case 11: /* switch 8 */
func_80290388();
break;
case 12: /* switch 8 */
func_80290360();
break;
default: /* switch 8 */
case 13: /* switch 8 */
func_80290338();
break;
}
} else {
var_a1 = 0;
temp_v0 = find_menu_items(0x000000AC);
if (temp_v0 != NULL) {
switch (temp_v0->state) { /* switch 7; irregular */
case 11: /* switch 7 */
func_802903B0();
D_8016556E = 1;
break;
default: /* switch 7 */
case 12: /* switch 7 */
func_80290338();
break;
}
} else {
var_a1 = 0;
temp_v0 = find_menu_items(0x000000C7);
if (temp_v0 != NULL) {
switch (temp_v0->state) { /* switch 1 */
case 12: /* switch 1 */
func_802903B0();
var_a1 = 1;
break;
case 13: /* switch 1 */
case 22: /* switch 1 */
case 42: /* switch 1 */
func_80290388();
var_a1 = 1;
break;
case 14: /* switch 1 */
case 23: /* switch 1 */
case 43: /* switch 1 */
func_80290360();
var_a1 = 1;
break;
case 15: /* switch 1 */
case 24: /* switch 1 */
case 32: /* switch 1 */
case 44: /* switch 1 */
func_80290338();
var_a1 = 1;
break;
default: /* switch 1 */
gTransitionType[arg0] = 5;
break;
}
if (var_a1 != 0) {
gIsGamePaused = 0;
}
}
temp_v0 = find_menu_items(0x000000BD);
if (temp_v0 != NULL) {
switch (temp_v0->state) { /* switch 2 */
case 11: /* switch 2 */
D_8015F892 = 1;
D_8015F890 = 0;
func_802903B0();
break;
case 12: /* switch 2 */
D_8015F892 = 0;
D_8015F890 = 0;
func_80290388();
break;
case 13: /* switch 2 */
D_8015F892 = 0;
D_8015F890 = 0;
func_80290360();
break;
case 14: /* switch 2 */
D_8015F892 = 0;
D_8015F890 = 0;
func_80290338();
break;
case 15: /* switch 2 */
D_8015F892 = 0;
D_8015F890 = 1;
func_802903B0();
break;
default: /* switch 2 */
break;
}
} else {
gTransitionType[arg0] = 5;
}
}
}
}
}
} else {
gTransitionType[arg0] = 0;
if (gDebugMenuSelection != DEBUG_MENU_OPTION_SELECTED) {
switch (gMenuFadeType) { /* switch 3 */
case MENU_FADE_TYPE_MAIN: /* switch 3 */
if (gMenuSelection == LOGO_INTRO_MENU) {
gMenuSelection = START_MENU;
gFadeModeSelection = FADE_MODE_LOGO;
} else {
gMenuSelection++;
}
break;
case MENU_FADE_TYPE_BACK: /* switch 3 */
gMenuSelection -= 1;
break;
case MENU_FADE_TYPE_DEMO: /* switch 3 */
gDemoMode = 1;
gDemoUseController = 1;
gGamestateNext = 4;
gCCSelection = (s32) 1;
switch (gNextDemoId) { /* switch 4 */
case 0: /* switch 4 */
gCurrentCourseId = COURSE_MARIO_RACEWAY;
gScreenModeSelection = 0;
gPlayerCountSelection1 = 1;
gPlayerCount = 1;
gCharacterSelections[0] = 0;
gModeSelection = 0;
break;
case 1: /* switch 4 */
gCurrentCourseId = COURSE_CHOCO_MOUNTAIN;
gScreenModeSelection = (s32) 1;
gPlayerCountSelection1 = 2;
gPlayerCount = (s8) 2;
gCharacterSelections[0] = (s8) 2;
gCharacterSelections[1] = (s8) 4;
gModeSelection = 2;
break;
case 2: /* switch 4 */
gCurrentCourseId = COURSE_KALAMARI_DESERT;
gScreenModeSelection = 0;
gPlayerCountSelection1 = (s32) 1;
gPlayerCount = 1;
gCharacterSelections[0] = 1;
gModeSelection = 0;
break;
case 3: /* switch 4 */
gCurrentCourseId = COURSE_WARIO_STADIUM;
gScreenModeSelection = 3;
gPlayerCountSelection1 = 3;
gPlayerCount = (s8) 3;
gCharacterSelections[0] = 5;
gCharacterSelections[1] = 2;
gCharacterSelections[2] = 7;
gModeSelection = (s32) 2;
break;
case 4: /* switch 4 */
gCurrentCourseId = COURSE_BOWSER_CASTLE;
gScreenModeSelection = 0;
gPlayerCountSelection1 = (s32) 1;
gPlayerCount = 1;
gCharacterSelections[0] = 7;
gModeSelection = 0;
break;
case 5: /* switch 4 */
gCurrentCourseId = COURSE_SHERBET_LAND;
gScreenModeSelection = 3;
gPlayerCountSelection1 = 4;
gPlayerCount = 4;
gCharacterSelections[0] = 0;
gCharacterSelections[1] = 1;
gCharacterSelections[2] = 6;
gCharacterSelections[3] = 3;
gModeSelection = 2;
break;
default:
break;
}
gNextDemoId += 1;
if (gNextDemoId >= 6) {
gNextDemoId = 0;
}
gCupSelection = gCupSelectionByCourseId[gCurrentCourseId];
D_800DC540 = (s32) gCupSelection;
gCourseIndexInCup = (s8) gPerCupIndexByCourseId[gCurrentCourseId];
break;
case MENU_FADE_TYPE_DATA: /* switch 3 */
switch (gMenuSelection) {
case 11:
gMenuSelection = 6;
break;
case 6:
gMenuSelection = 11;
break;
}
break;
case MENU_FADE_TYPE_OPTION: /* switch 3 */
switch (gMenuSelection) {
case 11:
gMenuSelection = 5;
break;
case 5:
gMenuSelection = 11;
break;
}
break;
}
if (gFadeModeSelection == FADE_MODE_NONE) {
gFadeModeSelection = FADE_MODE_MAIN;
}
if (gMenuSelection >= 0xE) {
gGamestateNext = 4;
if (gModeSelection == 1) {
gGhostPlayerInit = (s8) 1;
}
func_8009CE1C();
}
unref_8018EE0C = 0;
} else {
switch (gDebugGotoScene) { /* switch 5; irregular */
case DEBUG_GOTO_ENDING: /* switch 5 */
gGamestateNext = (s32) 5;
break;
case DEBUG_GOTO_CREDITS_SEQUENCE_DEFAULT: /* switch 5 */
case DEBUG_GOTO_CREDITS_SEQUENCE_EXTRA: /* switch 5 */
gGamestateNext = 9;
gCreditsCourseId = 8;
break;
default: /* switch 5 */
gGamestateNext = 4;
if (gModeSelection == (s32) 1) {
gGhostPlayerInit = 1;
}
break;
}
func_8000F124();
if (gScreenModeSelection == 3) {
switch (gModeSelection) {
case 0:
case 1:
gModeSelection = 2;
break;
}
}
switch (gCurrentCourseId) {
case COURSE_BLOCK_FORT:
case COURSE_SKYSCRAPER:
case COURSE_DOUBLE_DECK:
case COURSE_BIG_DONUT:
gModeSelection = 3;
if (gPlayerCountSelection1 == 1) {
gPlayerCount = 2;
gScreenModeSelection = 1;
gPlayerCountSelection1 = gPlayerCount;
}
break;
default:
if (gModeSelection == 3) {
gModeSelection = 0;
}
if ((gModeSelection == 2) && (gPlayerCountSelection1 == 1)) {
gModeSelection = 0;
}
}
gCupSelection = gCupSelectionByCourseId[gCurrentCourseId];
D_800DC540 = gCupSelection;
gCourseIndexInCup = gPerCupIndexByCourseId[gCurrentCourseId];
switch (gDebugGotoScene) { /* switch 6; irregular */
case DEBUG_GOTO_ENDING: /* switch 6 */
break;
case DEBUG_GOTO_CREDITS_SEQUENCE_DEFAULT: /* switch 6 */
gCCSelection = 0;
break;
case DEBUG_GOTO_CREDITS_SEQUENCE_EXTRA: /* switch 6 */
gCCSelection = 3;
break;
default: /* switch 6 */
if (gCCSelection == 3) {
gIsMirrorMode = 1;
} else {
gIsMirrorMode = 0;
}
break;
}
}
}
}
void func_8009D77C(s32 arg0, s32 arg1, s32 arg2) {
s16 var_ra;
s16 var_t3;
s16 var_t4;
s32 temp_t8;
s32 temp_v1;
s32 var_t2;
s32 someMath0;
s32 someMath1;
RGBA16* temp_v0_2;
s32 sp44;
UNUSED s32 stackPadding0;
if ((gModeSelection == 0) || (gModeSelection == 1)) {
var_t3 = D_8018E7E8[arg0].x;
var_t4 = D_8018E7E8[arg0].y;
var_ra = D_8018E810[arg0].x;
sp44 = D_8018E810[arg0].y;
} else if (arg0 >= 4) {
var_t3 = D_8018E7E8[arg0].x;
var_t4 = D_8018E7E8[arg0].y;
var_ra = D_8018E810[arg0].x;
sp44 = D_8018E810[arg0].y;
} else {
var_t3 = D_8015F480[arg0].screenStartX;
var_t4 = D_8015F480[arg0].screenStartY;
var_ra = D_8015F480[arg0].screenWidth;
sp44 = D_8015F480[arg0].screenHeight;
}
var_t2 = (gCurrentTransitionTime[arg0] * 0xFF) / gTransitionDuration[arg0];
if (var_t2 >= 0x100) {
var_t2 = 0x000000FF;
}
temp_v1 = var_ra / 2;
temp_t8 = sp44 / 2;
temp_v0_2 = &D_800E7AE8[arg2];
// Why does it have to written like this to match?
someMath0 = temp_v1;
someMath0 += var_t3;
someMath1 = temp_t8;
someMath1 += var_t4;
gDisplayListHead = draw_box(gDisplayListHead, var_t3 - temp_v1, var_t4 - temp_t8, someMath0, someMath1,
temp_v0_2->red, temp_v0_2->green, temp_v0_2->blue, var_t2);
if (arg1 == 0) {
gCurrentTransitionTime[arg0]++;
if ((gTransitionDuration[arg0] + 1) < gCurrentTransitionTime[arg0]) {
func_8009CE64(arg0);
}
}
}
void func_8009D958(s32 arg0, s32 arg1) {
func_8009D77C(arg0, arg1, 0);
}
void func_8009D978(s32 arg0, s32 arg1) {
func_8009D77C(arg0, arg1, 1);
}
void func_8009D998(s32 arg0) {
s16 var_t0;
s16 var_t1;
s16 var_t2;
s16 var_t3;
s32 temp_v0;
s32 temp_v1;
s32 someMath0;
s32 someMath1;
if ((gModeSelection == 0) || (gModeSelection == 1)) {
var_t0 = D_8018E7E8[arg0].x;
var_t1 = D_8018E7E8[arg0].y;
var_t2 = D_8018E810[arg0].x;
var_t3 = D_8018E810[arg0].y;
} else if (arg0 >= 4) {
var_t0 = D_8018E7E8[arg0].x;
var_t1 = D_8018E7E8[arg0].y;
var_t2 = D_8018E810[arg0].x;
var_t3 = D_8018E810[arg0].y;
} else {
var_t0 = D_8015F480[arg0].screenStartX;
var_t1 = D_8015F480[arg0].screenStartY;
var_t2 = D_8015F480[arg0].screenWidth;
var_t3 = D_8015F480[arg0].screenHeight;
}
temp_v0 = var_t2 / 2;
temp_v1 = var_t3 / 2;
// Why does it have to written like this to match?
someMath0 = temp_v0;
someMath0 += var_t0;
someMath1 = temp_v1;
someMath1 += var_t1;
gDisplayListHead =
draw_box(gDisplayListHead, var_t0 - temp_v0, var_t1 - temp_v1, someMath0, someMath1, 0, 0, 0, 0x000000FF);
}
void func_8009DAA8(void) {
u32 var_t0;
gCurrentTransitionTime[4]++;
if (gCurrentTransitionTime[4] >= (gTransitionDuration[4] + 1)) {
func_8009CE64(4);
}
gDPPipeSync(gDisplayListHead++);
var_t0 = (gCurrentTransitionTime[4] * 255) / gTransitionDuration[4];
if ((s32) var_t0 >= 0x100) {
var_t0 = 0x000000FF;
}
gDisplayListHead = draw_box(gDisplayListHead, 0, 0, 0x00000140, 0x000000F0, 0, 0, 0, (s32) var_t0);
}
void func_8009DB8C(void) {
s32 temp_t4;
s32 temp_t5;
s32 var_s0;
u32 var_s3;
s32 var_v1;
gCurrentTransitionTime[4]++;
// why?
var_v1 = gCurrentTransitionTime[4];
if ((u32) var_v1 >= gTransitionDuration[4]) {
if ((u32) var_v1 == gTransitionDuration[4]) {
for (var_s0 = 0; var_s0 < 0x4B0; var_s0++) {
sTKMK00_LowResBuffer[var_s0] = 1;
}
} else {
func_8009CE64(4);
}
} else {
var_s0 = 0;
var_s3 = 0;
while (var_s3 < (0x4B0U / gTransitionDuration[4])) {
if ((sTKMK00_LowResBuffer[var_s0] == 0) &&
(random_int((0x4B0U - gCurrentTransitionTime[4]) / gTransitionDuration[4]) == 0)) {
var_s3 += 1;
sTKMK00_LowResBuffer[var_s0] = 1;
}
var_s0 += 1;
if (var_s0 >= 0x4B0) {
var_s0 = 0;
}
}
}
gDPPipeSync(gDisplayListHead++);
gDPSetRenderMode(gDisplayListHead++, G_RM_XLU_SURF, G_RM_XLU_SURF2);
gDPSetPrimColor(gDisplayListHead++, 0, 0, 0x00, 0x00, 0x00, 0xFF);
gDPSetCombineMode(gDisplayListHead++, G_CC_PRIMITIVE, G_CC_PRIMITIVE);
for (var_s0 = 0; var_s0 < 0x4B0; var_s0++) {
if (sTKMK00_LowResBuffer[var_s0] != 0) {
temp_t4 = (var_s0 % 40) * 8;
temp_t5 = (var_s0 / 40) * 8;
gDPFillRectangle(gDisplayListHead++, temp_t4, temp_t5, temp_t4 + 8, temp_t5 + 8);
}
}
gDPPipeSync(gDisplayListHead++);
var_v1 = (gCurrentTransitionTime[4] * 255) / gTransitionDuration[4];
if (var_v1 >= 0x100) {
var_v1 = 0x000000FF;
}
gDisplayListHead = draw_box(gDisplayListHead, 0, 0, 0x00000140, 0x000000F0, 0, 0, 0, var_v1);
}
void func_8009DEF8(u32 arg0, u32 arg1) {
if (arg0 == 0) {
arg0 = 1;
}
if ((gTransitionType[4] != 1) && (gTransitionType[4] != 6)) {
gTransitionType[4] = arg1;
gTransitionDuration[4] = arg0;
if (gTransitionDuration[4] >= 0x100U) {
gTransitionDuration[4] = 0xFFU;
}
D_8018E7E0 = 0;
}
}
void func_8009DF4C(s32 arg0) {
func_8009DEF8(arg0, 1);
}
void func_8009DF6C(s32 arg0) {
func_8009DEF8(arg0, 8);
}
void func_8009DF8C(u32 arg0, u32 arg1) {
if (arg0 == 0) {
arg0 = 1;
}
if ((gTransitionType[4] != 2) && (gTransitionType[4] != 5)) {
gTransitionType[4] = arg1;
gTransitionDuration[4] = arg0;
if (gTransitionDuration[4] >= 0x100U) {
gTransitionDuration[4] = 0xFFU;
}
D_8018E7E0 = 0;
}
}
void func_8009DFE0(s32 arg0) {
func_8009DF8C(arg0, 2);
}
void func_8009E000(s32 arg0) {
func_8009DF8C(arg0, 7);
}
void func_8009E020(s32 arg0, s32 arg1) {
s32 temp;
if (arg1 == 0) {
arg1 = 1;
}
temp = gTransitionType[arg0];
if ((temp != 1) && (temp != 6)) {
gTransitionType[arg0] = 1;
gTransitionDuration[arg0] = arg1;
if ((u32) arg1 >= 0x100U) {
gTransitionDuration[arg0] = 0xFF;
}
gCurrentTransitionTime[arg0] = 0;
}
}
void func_8009E088(s32 arg0, s32 arg1) {
s32 temp;
if (arg1 == 0) {
arg1 = 1;
}
temp = gTransitionType[arg0];
if ((temp != 2) && (temp != 5)) {
gTransitionType[arg0] = 2;
gTransitionDuration[arg0] = arg1;
if ((u32) arg1 >= 0x100U) {
gTransitionDuration[arg0] = 0xFF;
}
gCurrentTransitionTime[arg0] = 0;
}
}
void func_8009E0F0(s32 arg0) {
s32 var_v0;
if (gTransitionType[4] != 3) {
gTransitionType[4] = 3;
gTransitionDuration[4] = arg0;
if (gTransitionDuration[4] >= 0x100U) {
gTransitionDuration[4] = 0x000000FF;
}
D_8018E7E0 = 0;
for (var_v0 = 0; var_v0 < 0x4B0; var_v0++) {
sTKMK00_LowResBuffer[var_v0] = 0;
}
}
}
void func_8009E17C(u32 arg0) {
if (gTransitionType[4] != 4) {
gTransitionType[4] = 4;
gTransitionDuration[4] = arg0;
if (gTransitionDuration[4] >= 0x100U) {
gTransitionDuration[4] = 0x000000FFU;
}
D_8018E7E0 = 0;
}
}
void func_8009E1C0(void) {
func_8009DFE0(10);
gMenuFadeType = MENU_FADE_TYPE_MAIN;
}
void func_8009E1E4(void) {
func_8009E000(10);
gMenuFadeType = MENU_FADE_TYPE_MAIN;
}
void func_8009E208(void) {
func_8009DFE0(10);
gMenuFadeType = MENU_FADE_TYPE_BACK;
}
void func_8009E230(void) {
func_8009DFE0(10);
gMenuFadeType = MENU_FADE_TYPE_DEMO;
}
void func_8009E258(void) {
func_8009DFE0(10);
gMenuFadeType = MENU_FADE_TYPE_DATA;
}
void func_8009E280(void) {
func_8009DFE0(10);
gMenuFadeType = MENU_FADE_TYPE_OPTION;
}
void func_8009E2A8(s32 arg0) {
switch (D_8018E838[arg0]) {
case 0:
break;
case 1:
func_8009E2F0(arg0);
break;
default:
D_8018E838[arg0] = 0;
break;
}
}
void func_8009E2F0(s32 arg0) {
UNUSED s32 stackPadding0;
UNUSED s32 stackPadding1;
s32 someIndex;
s32 temp_t7;
f32 temp_t7_2;
RGBA16* temp_v0;
struct UnkStruct_8018E7E8* temp_t0;
struct UnkStruct_8018E7E8* temp_t1;
temp_t7 = D_800F0B28[D_8018E840[arg0]];
if (temp_t7 != 0) {
temp_t1 = &D_8018E7E8[arg0];
temp_t0 = &D_8018E810[arg0];
temp_v0 = &D_800E7AC8[temp_t7];
if ((u32) D_8018E840[arg0] < 0x1BU) {
gDisplayListHead = draw_box(gDisplayListHead, temp_t1->x - (temp_t0->x / 2), temp_t1->y - (temp_t0->y / 2),
temp_t1->x + (temp_t0->x / 2), temp_t1->y + (temp_t0->y / 2), temp_v0->red,
temp_v0->green, temp_v0->blue, temp_v0->alpha);
} else {
temp_t7_2 = ((u32) (38 - D_8018E840[arg0])) / 11.0;
gDisplayListHead = draw_box(gDisplayListHead, temp_t1->x - (temp_t0->x / 2), temp_t1->y - (temp_t0->y / 2),
temp_t1->x + (temp_t0->x / 2), temp_t1->y + (temp_t0->y / 2), temp_v0->red,
temp_v0->green, temp_v0->blue, (u32) (temp_v0->alpha * temp_t7_2));
}
}
D_8018E840[arg0]++;
if ((u32) D_8018E840[arg0] >= 0x26U) {
for (someIndex = 0; someIndex < 4; someIndex++) {
D_8018E838[someIndex] = 0;
}
}
}
void func_8009E5BC(void) {
s32 i;
for (i = 0; i < 4; i++) {
func_8009E5FC(i);
}
}
void func_8009E5FC(s32 arg0) {
D_8018E838[arg0] = 1;
D_8018E840[arg0] = 0;
}
void clear_menus(void) {
s32 index;
for (index = 0; index < MENU_ITEMS_MAX; index++) {
gMenuItems[index].type = 0;
}
}
#ifdef NON_MATCHING
// https://decomp.me/scratch/1BHpa
// Stack differences, can't figure out how to fix them
void add_menu_item(s32 type, s32 column, s32 row, s8 priority) {
MenuItem* var_ra;
s32 stackPadding0;
UNUSED s32 stackPadding1;
UNUSED s32 stackPadding2;
s32 temp_v0_6;
s32 var_v0;
s32 var_v1_3;
s32 temp_a1;
UNUSED MenuTexture* mk64Texture;
MkAnimation* var_a0;
s32 one = 1;
var_v0 = 0;
var_ra = gMenuItems;
while (true) {
if (var_ra->type == 0) {
break;
}
var_v0++;
if (var_v0 > MENU_ITEMS_MAX) {
while (true) {}
}
var_ra++;
}
var_ra->type = type;
var_ra->state = 0;
var_ra->subState = 0;
var_ra->column = column;
var_ra->row = row;
var_ra->priority = (u8) priority;
var_ra->visible = one;
var_ra->param1 = 0;
var_ra->param2 = 0;
switch (type) {
case MENU_ITEM_UI_LOGO_INTRO:
sIntroModelTimer = 0;
sIntroModelMotionSpeed = 0.0f;
sIntroModelSpeed = 3.0f;
gIntroModelZEye = 2500;
gIntroModelRotX = 0;
gIntroModelRotY = -270.0f;
gIntroModelRotZ = 0;
gIntroModelPosX = 0;
gIntroModelPosY = 0;
gIntroModelPosZ = 0;
gIntroModelScale = 3;
var_ra->param1 = -1;
var_ra->param2 = one;
break;
case START_MENU_FLAG:
gIntroModelZEye = 1800;
gIntroModelRotX = -51.0f;
gIntroModelRotY = -12.0f;
gIntroModelRotZ = -18.0f;
gIntroModelPosX = -270.0f;
gIntroModelPosY = 750.0f;
gIntroModelPosZ = 0;
gIntroModelScale = 1.0f;
var_ra->param1 = -1;
var_ra->param2 = one;
break;
case MENU_ITEM_TYPE_0D2:
load_menu_img_comp_type(D_020014C8, LOAD_MENU_IMG_TKMK00_ONCE);
func_8009B954(D_020014C8);
sGfxPtr = render_menu_textures(sGfxPtr, D_020014C8, var_ra->column, var_ra->row);
func_8009B998();
break;
case MENU_ITEM_TYPE_0D3:
load_menu_img_comp_type(D_02001540, LOAD_MENU_IMG_TKMK00_ONCE);
func_8009B954(D_02001540);
sGfxPtr = render_menu_textures(sGfxPtr, D_02001540, var_ra->column, var_ra->row);
func_8009B998();
break;
case MENU_ITEM_TYPE_0D4:
load_menu_img_comp_type(D_0200157C, LOAD_MENU_IMG_TKMK00_ONCE);
load_menu_img(D_02001874);
var_ra->row = 0x00000069;
for (var_v0 = 0; var_v0 < 133; var_v0++) {
load_menu_img(segmented_to_virtual_dupe(D_800E7AF8[var_v0]));
}
break;
case MENU_ITEM_TYPE_0D5:
load_menu_img(D_020015A4);
func_8009B954(D_020015A4);
sGfxPtr = render_menu_textures(sGfxPtr, D_020015A4, var_ra->column, var_ra->row);
gDPLoadTextureBlock(sGfxPtr++, func_8009B8C4(gTexture7ED50C), G_IM_FMT_IA, G_IM_SIZ_16b, 256, 5, 0,
G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK,
G_TX_NOLOD, G_TX_NOLOD);
gSPTextureRectangle(sGfxPtr++, 0x80, 0x2C0, 0x480, 0x2D4, G_TX_RENDERTILE, 0, 0x80, 0x0400, 0xFC00);
func_8009B998();
load_menu_img(D_020015CC);
func_8009B954(D_020015CC);
sGfxPtr = render_menu_textures(sGfxPtr, D_020015CC, var_ra->column, var_ra->row);
func_8009B998();
load_menu_img(D_02001630);
func_8009B954(D_02001630);
sGfxPtr = render_menu_textures(sGfxPtr, D_02001630, var_ra->column, var_ra->row);
func_8009B998();
load_menu_img(D_02001658);
func_8009B954(D_02001658);
sGfxPtr = render_menu_textures(sGfxPtr, D_02001658, var_ra->column, var_ra->row);
func_8009B998();
break;
case MENU_ITEM_TYPE_0D6:
var_ra->D_8018DEE0_index = animate_character_select_menu(segmented_to_virtual_dupe_2(D_800E7D34[0]));
break;
case MENU_ITEM_TYPE_0D7:
for (var_v0 = 0; var_v0 < 10; var_v0++) {
load_menu_img(segmented_to_virtual_dupe(D_800E7D0C[var_v0]));
}
break;
case MENU_ITEM_TYPE_0D8:
case MENU_ITEM_TYPE_0D9:
load_menu_img(D_0200184C);
break;
case MENU_ITEM_UI_START_BACKGROUND:
load_menu_img_comp_type(gMenuTexturesBackground[has_unlocked_extra_mode()], LOAD_MENU_IMG_TKMK00_ONCE);
break;
case MENU_ITEM_UI_LOGO_AND_COPYRIGHT:
load_mario_kart_64_logo();
sMenuTextureBufferIndex += 0x10000;
load_menu_img(seg2_copyright_1996_texture);
break;
case MENU_ITEM_UI_PUSH_START_BUTTON:
load_menu_img(seg2_push_start_button_texture);
break;
case MAIN_MENU_BACKGROUND:
case CHARACTER_SELECT_BACKGROUND:
case COURSE_SELECT_BACKGROUND:
load_menu_img_comp_type(gMenuTexturesBackground[has_unlocked_extra_mode()], LOAD_MENU_IMG_TKMK00_ONCE);
load_menu_img_comp_type(D_02004B74, LOAD_MENU_IMG_TKMK00_ONCE);
convert_img_to_greyscale(0, 0x00000019);
adjust_img_colour(0, SCREEN_WIDTH * SCREEN_HEIGHT, D_800E74E8[type - 0x23].red,
D_800E74E8[type - 0x23].green, D_800E74E8[type - 0x23].blue);
break;
case MENU_ITEM_UI_OK:
var_ra->param1 = 0x00000020;
/* fallthrough */
case MENU_ITEM_UI_GAME_SELECT:
case MAIN_MENU_DATA_GFX:
case MAIN_MENU_OPTION_GFX:
case MAIN_MENU_50CC:
case MAIN_MENU_100CC:
case MAIN_MENU_150CC:
case 0x15:
case 0x16:
case 0x17:
case MAIN_MENU_TIME_TRIALS_BEGIN:
case MAIN_MENU_TIME_TRIALS_DATA:
load_menu_img_comp_type(segmented_to_virtual_dupe(D_800E8274[type - 0x12]), LOAD_MENU_IMG_TKMK00_ONCE);
break;
case MENU_ITEM_UI_1P_GAME:
case MENU_ITEM_UI_2P_GAME:
case MENU_ITEM_UI_3P_GAME:
case MENU_ITEM_UI_4P_GAME:
load_menu_img_comp_type(segmented_to_virtual_dupe(D_800E8234[((type - 0xB) * 2) + 0]),
LOAD_MENU_IMG_TKMK00_ONCE);
load_menu_img(segmented_to_virtual_dupe(D_800E8234[((type - 0xB) * 2) + 1]));
break;
case CHARACTER_SELECT_MENU_PLAYER_SELECT_BANNER:
load_menu_img_comp_type(D_02004B4C, LOAD_MENU_IMG_TKMK00_ONCE);
break;
case CHARACTER_SELECT_MENU_OK:
load_menu_img_comp_type(D_02004B74, LOAD_MENU_IMG_TKMK00_ONCE);
var_ra->param1 = 0x00000020;
break;
case CHARACTER_SELECT_MENU_1P_CURSOR:
case CHARACTER_SELECT_MENU_2P_CURSOR:
case CHARACTER_SELECT_MENU_3P_CURSOR:
case CHARACTER_SELECT_MENU_4P_CURSOR:
load_menu_img(segmented_to_virtual_dupe(gMenuTexturesBorderPlayer[type - CHARACTER_SELECT_MENU_1P_CURSOR]));
break;
case CHARACTER_SELECT_MENU_MARIO:
case CHARACTER_SELECT_MENU_LUIGI:
case CHARACTER_SELECT_MENU_TOAD:
case CHARACTER_SELECT_MENU_PEACH:
case CHARACTER_SELECT_MENU_YOSHI:
case CHARACTER_SELECT_MENU_DK:
case CHARACTER_SELECT_MENU_WARIO:
case CHARACTER_SELECT_MENU_BOWSER:
var_ra->D_8018DEE0_index =
animate_character_select_menu(segmented_to_virtual_dupe_2(D_800E8320[type - 0x2B]));
load_menu_img_comp_type(segmented_to_virtual_dupe(D_800E7D54[type - 0x2B]), LOAD_MENU_IMG_TKMK00_ONCE);
break;
case MENU_ITEM_TYPE_0A0:
case MENU_ITEM_TYPE_0A1:
var_ra->D_8018DEE0_index =
animate_character_select_menu(segmented_to_virtual_dupe_2(D_800E8320[type - 0xA0]));
break;
case COURSE_SELECT_OK:
var_ra->param1 = 0x00000020;
/* fallthrough */
case COURSE_SELECT_MAP_SELECT:
case COURSE_SELECT_MUSHROOM_CUP:
case COURSE_SELECT_FLOWER_CUP:
case COURSE_SELECT_STAR_CUP:
case COURSE_SELECT_SPECIAL_CUP:
case MENU_ITEM_TYPE_058:
case COURSE_SELECT_COURSE_NAMES:
case MENU_ITEM_TYPE_05A:
case MENU_ITEM_TYPE_05B:
case COURSE_SELECT_BATTLE_NAMES:
load_menu_img_comp_type(segmented_to_virtual_dupe(gMenuTexturesTrackSelection[type - 0x52]),
LOAD_MENU_IMG_TKMK00_ONCE);
break;
case MENU_ITEM_TYPE_05F:
case MENU_ITEM_TYPE_060:
case MENU_ITEM_TYPE_061:
case MENU_ITEM_TYPE_062:
var_ra->D_8018DEE0_index = animate_character_select_menu(
segmented_to_virtual_dupe_2(D_800E7E34[gCupCourseOrder[0][var_ra->type - 0x5F]]));
break;
case MENU_ITEM_TYPE_05E:
var_ra->param2 = random_int(4U) + 2;
break;
case MENU_ITEM_TYPE_065:
case MENU_ITEM_TYPE_066:
var_ra->column = D_800E7248[type - 0x65].column;
var_ra->row = D_800E7248[type - 0x65].row;
break;
case MENU_ITEM_TYPE_067:
var_ra->param1 = (s32) gCupSelection;
var_ra->param2 = func_800B54C0(gCupSelection, gCCSelection);
var_ra->D_8018DEE0_index = animate_character_select_menu(
segmented_to_virtual_dupe_2(D_800E7E20[((gCCSelection / 2) * 4) - var_ra->param2]));
var_ra->column = D_800E7268[0].column;
var_ra->row = D_800E7268[0].row;
break;
case MENU_ITEM_TYPE_068:
load_menu_img_comp_type(segmented_to_virtual_dupe(D_800E8294[gCCSelection]), LOAD_MENU_IMG_TKMK00_ONCE);
var_ra->column = 0x00000037;
var_ra->row = 0x000000C3;
break;
case MENU_ITEM_TYPE_069:
load_menu_img_comp_type(segmented_to_virtual_dupe(D_02004A0C), LOAD_MENU_IMG_TKMK00_ONCE);
if (controller_pak_1_status() == 0) {
func_800B6708();
} else {
D_8018EE10[0].ghostDataSaved = 0;
D_8018EE10[1].ghostDataSaved = 0;
}
break;
case MENU_ITEM_TYPE_078:
case MENU_ITEM_TYPE_079:
case MENU_ITEM_TYPE_07A:
case MENU_ITEM_TYPE_07B:
load_menu_img_comp_type(segmented_to_virtual_dupe(D_800E82F4[type - 0x78]), LOAD_MENU_IMG_TKMK00_ONCE);
break;
case MENU_ITEM_TYPE_08C:
load_menu_img_comp_type(segmented_to_virtual_dupe(seg2_data_texture), LOAD_MENU_IMG_TKMK00_ONCE);
if (controller_pak_1_status() == 0) {
func_800B6708();
} else {
D_8018EE10[0].ghostDataSaved = 0;
D_8018EE10[1].ghostDataSaved = 0;
}
break;
case MENU_ITEM_TYPE_08D:
load_menu_img(segmented_to_virtual_dupe(D_02001FA4));
break;
case MENU_ITEM_TYPE_07C:
case MENU_ITEM_TYPE_07D:
case MENU_ITEM_TYPE_07E:
case MENU_ITEM_TYPE_07F:
case MENU_ITEM_TYPE_080:
case MENU_ITEM_TYPE_081:
case MENU_ITEM_TYPE_082:
case MENU_ITEM_TYPE_083:
case MENU_ITEM_TYPE_084:
case MENU_ITEM_TYPE_085:
case MENU_ITEM_TYPE_086:
case MENU_ITEM_TYPE_087:
case MENU_ITEM_TYPE_088:
case MENU_ITEM_TYPE_089:
case MENU_ITEM_TYPE_08A:
case MENU_ITEM_TYPE_08B:
temp_v0_6 = var_ra->type - MENU_ITEM_TYPE_07C;
load_menu_img_comp_type(
segmented_to_virtual_dupe(D_800E7D74[gCupCourseOrder[temp_v0_6 / 4][temp_v0_6 % 4]]),
LOAD_MENU_IMG_MIO0_ONCE);
temp_v0_6 = var_ra->type - MENU_ITEM_TYPE_07C;
load_menu_img_comp_type(
segmented_to_virtual_dupe(D_800E7DC4[gCupCourseOrder[temp_v0_6 / 4][temp_v0_6 % 4]]),
LOAD_MENU_IMG_TKMK00_ONCE);
load_menu_img_comp_type(segmented_to_virtual_dupe(D_02004A0C), LOAD_MENU_IMG_TKMK00_ONCE);
break;
case MENU_ITEM_TYPE_0B1:
case MENU_ITEM_TYPE_0B2:
case MENU_ITEM_TYPE_0B3:
case MENU_ITEM_TYPE_0B4:
temp_a1 = D_800EFD64[gCharacterSelections[type - MENU_ITEM_TYPE_0B1]];
var_v1_3 = 0;
stackPadding0 = type - MENU_ITEM_TYPE_0B1;
switch (gModeSelection) {
case VERSUS:
if (gGPCurrentRaceRankByPlayerId[type - MENU_ITEM_TYPE_0B1] != 0) {
var_v1_3 = 1;
}
break;
case BATTLE:
if ((type - MENU_ITEM_TYPE_0B1) != gPlayerWinningIndex) {
var_v1_3 = 1;
}
break;
default:
break;
}
if (var_v1_3 != 0) {
var_a0 = gCharacterDefeatAnimation[temp_a1];
} else {
var_a0 = D_800E8320[temp_a1];
}
var_ra->D_8018DEE0_index = func_8009A478(segmented_to_virtual_dupe_2(var_a0), stackPadding0);
load_menu_img_comp_type(segmented_to_virtual_dupe(D_800E7D54[temp_a1]), LOAD_MENU_IMG_TKMK00_ONCE);
load_menu_img(segmented_to_virtual_dupe(gMenuTexturesBorderPlayer[type - MENU_ITEM_TYPE_0B1]));
break;
case MENU_ITEM_TYPE_0BB:
var_ra->param1 = func_800B5020(playerHUD[0].someTimer, gCharacterSelections[0]);
var_ra->param2 = func_800B5218();
if (D_80162DD4 != 1) {
if (func_800051C4() >= 0x3C01) {
D_80162DD4 = 1;
}
}
if ((var_ra->param1 == 0) || (var_ra->param2 != 0)) {
func_800B559C((gCupSelection * 4) + gCourseIndexInCup);
}
break;
case MENU_ITEM_DATA_COURSE_IMAGE:
var_ra->D_8018DEE0_index = animate_character_select_menu(segmented_to_virtual_dupe_2(
D_800E7E34[gCupCourseOrder[gTimeTrialDataCourseIndex / 4][gTimeTrialDataCourseIndex % 4]]));
var_ra->param1 = gTimeTrialDataCourseIndex;
load_menu_img_comp_type(segmented_to_virtual_dupe(D_02004A0C), LOAD_MENU_IMG_TKMK00_ONCE);
func_8006EF60();
if (controller_pak_1_status() == 0) {
func_800B6708();
} else {
D_8018EE10[0].ghostDataSaved = 0;
D_8018EE10[1].ghostDataSaved = 0;
}
break;
case MENU_ITEM_TYPE_0F0:
var_ra->state = (s32) gSoundMode;
break;
case MENU_ITEM_TYPE_0F1:
load_menu_img_comp_type(segmented_to_virtual_dupe(D_02004638), LOAD_MENU_IMG_TKMK00_ONCE);
break;
case MENU_ITEM_TYPE_0BE:
D_8018ED90 = 0;
break;
case MENU_ITEM_TYPE_130:
temp_a1 = D_800EFD64[D_802874D8.unk1E];
if (D_802874D8.unk1D >= 3) {
var_v0 = 1;
} else {
var_v0 = 0;
}
if (var_v0 != 0) {
var_a0 = gCharacterDefeatAnimation[temp_a1];
} else {
var_a0 = D_800E8320[temp_a1];
}
var_ra->D_8018DEE0_index = func_8009A478(segmented_to_virtual_dupe_2(var_a0), 0);
load_menu_img_comp_type(segmented_to_virtual_dupe(D_800E7D54[temp_a1]), LOAD_MENU_IMG_TKMK00_ONCE);
break;
case MENU_ITEM_TYPE_190:
case MENU_ITEM_TYPE_191:
case MENU_ITEM_TYPE_192:
case MENU_ITEM_TYPE_193:
case MENU_ITEM_TYPE_194:
case MENU_ITEM_TYPE_195:
case MENU_ITEM_TYPE_196:
case MENU_ITEM_TYPE_197:
case MENU_ITEM_TYPE_198:
case MENU_ITEM_TYPE_199:
case MENU_ITEM_TYPE_19A:
case MENU_ITEM_TYPE_19B:
case MENU_ITEM_TYPE_19C:
case MENU_ITEM_TYPE_19D:
case MENU_ITEM_TYPE_19E:
case MENU_ITEM_TYPE_19F:
case MENU_ITEM_TYPE_1A0:
case MENU_ITEM_TYPE_1A1:
case MENU_ITEM_TYPE_1A2:
case MENU_ITEM_TYPE_1A3:
case MENU_ITEM_TYPE_1A4:
case MENU_ITEM_TYPE_1A5:
case MENU_ITEM_TYPE_1A6:
case MENU_ITEM_TYPE_1A7:
case MENU_ITEM_TYPE_1A8:
case MENU_ITEM_TYPE_1A9:
case MENU_ITEM_TYPE_1AA:
case MENU_ITEM_TYPE_1AB:
case MENU_ITEM_TYPE_1AC:
case MENU_ITEM_TYPE_1AD:
case MENU_ITEM_TYPE_1AE:
case MENU_ITEM_TYPE_1AF:
case MENU_ITEM_TYPE_1B0:
case MENU_ITEM_TYPE_1B1:
case MENU_ITEM_TYPE_1B2:
case MENU_ITEM_TYPE_1B3:
case MENU_ITEM_TYPE_1B4:
case MENU_ITEM_TYPE_1B5:
case MENU_ITEM_TYPE_1B6:
case MENU_ITEM_TYPE_1B7:
case MENU_ITEM_TYPE_1B8:
case MENU_ITEM_TYPE_1B9:
case MENU_ITEM_TYPE_1BA:
case MENU_ITEM_TYPE_1BB:
case MENU_ITEM_TYPE_1BC:
case MENU_ITEM_TYPE_1BD:
case MENU_ITEM_TYPE_1BE:
case MENU_ITEM_TYPE_1BF:
case MENU_ITEM_TYPE_1C0:
case MENU_ITEM_TYPE_1C1:
case MENU_ITEM_TYPE_1C2:
case MENU_ITEM_TYPE_1C3:
case MENU_ITEM_TYPE_1C4:
case MENU_ITEM_TYPE_1C5:
case MENU_ITEM_TYPE_1C6:
case MENU_ITEM_TYPE_1C7:
case MENU_ITEM_TYPE_1C8:
case MENU_ITEM_TYPE_1C9:
case MENU_ITEM_TYPE_1CA:
case MENU_ITEM_TYPE_1CB:
case MENU_ITEM_TYPE_1CC:
case MENU_ITEM_TYPE_1CD:
case MENU_ITEM_TYPE_1CE:
default:
break;
}
}
#else
GLOBAL_ASM("asm/non_matchings/menu_items/add_menu_item.s")
#endif
#ifdef NON_MATCHING
// https://decomp.me/scratch/MatRp
// Biggest diff left is in the case 0x12 though 0x19 handling. Not really sure what's going on there
// There's also a diff in the handling of gTextNoController in case 0x4. Not sure what's going on there either
void render_menus(MenuItem* arg0) {
s32 var_a1;
s32 var_v1;
UNUSED s32 stackPadding0;
UNUSED s32 stackPadding1;
MenuTexture* sp9C;
UNUSED s32 stackPadding2;
s32 temp_a0;
s32 temp_t2;
s32 temp_t5;
s32 temp_t9;
s32 temp_v1;
char sp80[3];
s32 var_t0;
UNUSED s32 var_a2;
f32 why = 0.75f;
s32 one = 1;
f32 floatone = 1;
UNUSED s32 stackPadding3;
UNUSED s32 stackPadding4;
f32 scaleX;
if (arg0->visible) {
gDPPipeSync(gDisplayListHead++);
switch (arg0->type) { /* switch 6; irregular */
case MENU_ITEM_UI_LOGO_INTRO: /* switch 6 */
func_80094660(gGfxPool, arg0->param1);
break;
case START_MENU_FLAG: /* switch 6 */
render_checkered_flag(gGfxPool, arg0->param1);
break;
case MENU_ITEM_TYPE_0D2: /* switch 6 */
gDisplayListHead = func_8009B9D0(gDisplayListHead, D_020014C8);
break;
case MENU_ITEM_TYPE_0D3: /* switch 6 */
gDisplayListHead = func_8009B9D0(gDisplayListHead, D_02001540);
break;
case MENU_ITEM_TYPE_0D4: /* switch 6 */
func_800A09E0(arg0);
func_800A0AD0(arg0);
func_800A0B80(arg0);
break;
case MENU_ITEM_TYPE_0D5: /* switch 6 */
// Sets the text color of the text on the Controller Pak menu
// Also sets the color of the shading at the top and bottom of the menu
// Does not set color of the text in the table itself
gDPSetPrimColor(gDisplayListHead++, 0, 0, 0x00, 0x00, 0x00, 0xFF);
gDisplayListHead = func_8009B9D0(gDisplayListHead, D_020015A4);
gDPSetPrimColor(gDisplayListHead++, 0, 0, 0x32, 0x00, 0x00, 0xFF);
gDisplayListHead = func_8009B9D0(gDisplayListHead, D_020015CC);
gDPSetPrimColor(gDisplayListHead++, 0, 0, 0x00, 0x32, 0x00, 0xFF);
gDisplayListHead = func_8009B9D0(gDisplayListHead, D_02001630);
gDPSetPrimColor(gDisplayListHead++, 0, 0, 0x32, 0x32, 0x00, 0xFF);
gDisplayListHead = func_8009B9D0(gDisplayListHead, D_02001658);
break;
case MENU_ITEM_TYPE_0D6: /* switch 6 */
func_8009A76C(arg0->D_8018DEE0_index, arg0->column, arg0->row, -1);
break;
case MENU_ITEM_TYPE_0D7: /* switch 6 */
func_800A0DFC();
break;
case MENU_ITEM_TYPE_0D8: /* switch 6 */
case MENU_ITEM_TYPE_0D9: /* switch 6 */
func_800A0EB8(arg0, arg0->type - 0xD8);
break;
case MENU_ITEM_UI_START_BACKGROUND: /* switch 6 */
gDisplayListHead = render_menu_textures(
gDisplayListHead, gMenuTexturesBackground[has_unlocked_extra_mode()], arg0->column, arg0->row);
break;
case MENU_ITEM_UI_LOGO_AND_COPYRIGHT: /* switch 6 */
render_game_logo((arg0->column + 0xA0), (arg0->row + 0x47));
gDisplayListHead =
render_menu_textures(gDisplayListHead, seg2_copyright_1996_texture, arg0->column, arg0->row);
break;
case MENU_ITEM_UI_PUSH_START_BUTTON: /* switch 6 */
if (((gGlobalTimer / 8) % 3) != 0) {
gDisplayListHead =
render_menu_textures(gDisplayListHead, seg2_push_start_button_texture, arg0->column, arg0->row);
}
break;
case MENU_ITEM_UI_START_RECORD_TIME: /* switch 6 */
var_t0 = (s32) ((f32) (get_string_width(gCourseNamesDup[0]) + 5) * 0.9f) / 2;
gDisplayListHead = draw_box(gDisplayListHead, 0xA0 - var_t0, 0x0000007B, var_t0 + 0xA0, 0x000000A4, 0,
0, 0, 0x00000096);
set_text_color(TEXT_GREEN);
print_text1_center_mode_1(0x0000009B, 0x0000008C, gCourseNamesDup[0], 0, 0.9f, 0.9f);
temp_v1 = func_800B4EB4(0, 7) & 0xFFFFF;
if (temp_v1 < 0x1EAA) {
set_text_color((s32) gGlobalTimer % 2);
} else if (temp_v1 < 0x2329) {
set_text_color((s32) gGlobalTimer % 3);
} else {
set_text_color(TEXT_YELLOW);
}
get_time_record_minutes(temp_v1, sp80);
func_800939C8(0x00000077, 0x000000A0, sp80, 0, 1.0f, 1.0f);
print_text_mode_1(0x0000008B, 0x000000A0, "'", 0, 1.0f, 1.0f);
get_time_record_seconds(temp_v1, sp80);
func_800939C8(0x00000094, 0x000000A0, sp80, 0, 1.0f, 1.0f);
print_text_mode_1(0x000000A7, 0x000000A0, "\"", 0, 1.0f, 1.0f);
get_time_record_centiseconds(temp_v1, sp80);
func_800939C8(0x000000B4, 0x000000A0, sp80, 0, 1.0f, 1.0f);
break;
case MENU_ITEM_UI_NO_CONTROLLER: /* switch 6 */
var_t0 = get_string_width(gTextNoController[0]);
temp_v1 = get_string_width(gTextNoController[1]);
if (var_t0 < temp_v1) {
var_t0 = temp_v1;
}
temp_t2 = (s32) (var_t0 * why) / 2;
temp_t5 = (s32) (((why * 2) + 0.5) * 16.0) / 2;
gDisplayListHead = draw_box(gDisplayListHead, 0xA0 - temp_t2, 0xB6 - temp_t5, temp_t2 + 0xA0,
temp_t5 + 0xB6, 0, 0, 0, 0x00000096);
set_text_color(TEXT_BLUE_GREEN_RED_CYCLE_1);
for (temp_t9 = 0; temp_t9 < 2; temp_t9++) {
print_text1_center_mode_1(0xA0 * one - floatone * why,
(s32) (0xB4 * one + ((f32) (temp_t9 * 0x12) * why)),
gTextNoController[temp_t9], 0, why, why);
}
break;
case MAIN_MENU_BACKGROUND: /* switch 6 */
case CHARACTER_SELECT_BACKGROUND: /* switch 6 */
case COURSE_SELECT_BACKGROUND: /* switch 6 */
gDisplayListHead = func_8009BC9C(gDisplayListHead, gMenuTexturesBackground[has_unlocked_extra_mode()],
arg0->column, arg0->row, 3, 0);
break;
case MENU_ITEM_UI_GAME_SELECT: /* switch 6 */
gDisplayListHead =
render_menu_textures(gDisplayListHead, seg2_game_select_texture, arg0->column, arg0->row);
break;
case MENU_ITEM_UI_1P_GAME: /* switch 6 */
case MENU_ITEM_UI_2P_GAME: /* switch 6 */
case MENU_ITEM_UI_3P_GAME: /* switch 6 */
case MENU_ITEM_UI_4P_GAME: /* switch 6 */
var_a1 = arg0->type - 0xB;
func_800A8270(var_a1, arg0);
func_800A0FA4(arg0, var_a1);
break;
case MENU_ITEM_UI_OK: /* switch 6 */
func_800A8564(arg0);
gDisplayListHead =
func_8009BC9C(gDisplayListHead, D_0200487C, arg0->column, arg0->row, 2, arg0->param1);
break;
case MAIN_MENU_OPTION_GFX: /* switch 6 */
case MAIN_MENU_DATA_GFX: /* switch 6 */
var_a1 = arg0->type - 0xF;
if (arg0->param1 < 0x20) {
temp_t9 = (arg0->param1 * 0x3A) / 64;
if (var_a1 == gMainMenuSelection) {
gDisplayListHead =
draw_flash_select_case_fast(gDisplayListHead, arg0->column + temp_t9, arg0->row,
(arg0->column - temp_t9) + 0x39, arg0->row + 0x12);
} else {
gDisplayListHead =
draw_box_fill(gDisplayListHead, arg0->column + temp_t9, arg0->row,
(arg0->column - temp_t9) + 0x39, arg0->row + 0x12, 1, 1, 1, 0x000000FF);
}
}
var_v1 = arg0->type - 0xA;
gDisplayListHead =
func_8009BC9C(gDisplayListHead, D_800E8254[var_v1], arg0->column, arg0->row, 2, arg0->param1);
break;
case MAIN_MENU_50CC: /* switch 6 */
case MAIN_MENU_100CC: /* switch 6 */
case MAIN_MENU_150CC: /* switch 6 */
case MAIN_MENU_EXTRA_CC: /* switch 6 */
case MENU_ITEM_TYPE_016: /* switch 6 */
case MENU_ITEM_TYPE_017: /* switch 6 */
case MAIN_MENU_TIME_TRIALS_BEGIN: /* switch 6 */
case MAIN_MENU_TIME_TRIALS_DATA: /* switch 6 */
var_v1 = gGameModeSubMenuColumn[gPlayerCount - 1][gGameModeMenuColumn[gPlayerCount - 1]];
var_a1 = gGameModePlayerSelection[gPlayerCount - 1][gGameModeMenuColumn[gPlayerCount - 1]];
switch (arg0->type) { /* switch 5 */
case MAIN_MENU_50CC: /* switch 5 */
case MAIN_MENU_100CC: /* switch 5 */
case MAIN_MENU_150CC: /* switch 5 */
case MAIN_MENU_EXTRA_CC: /* switch 5 */
switch (var_a1) {
case 0:
case 2:
break;
default:
var_v1 = -1;
break;
}
var_a1 = MAIN_MENU_50CC;
sp9C = segmented_to_virtual_dupe(D_800E8294[arg0->type - MAIN_MENU_50CC]);
break;
case MENU_ITEM_TYPE_016: /* switch 5 */
case MENU_ITEM_TYPE_017: /* switch 5 */
if (var_a1 != 2) {
var_v1 = -1;
} else {
var_a1 = MENU_ITEM_TYPE_016;
sp9C = segmented_to_virtual_dupe(D_800E82A4[arg0->type - MENU_ITEM_TYPE_016]);
}
break;
case MAIN_MENU_TIME_TRIALS_BEGIN: /* switch 5 */
case MAIN_MENU_TIME_TRIALS_DATA: /* switch 5 */
if (var_a1 != 1) {
var_v1 = -1;
} else {
var_a1 = MAIN_MENU_TIME_TRIALS_BEGIN;
sp9C = segmented_to_virtual_dupe(D_800E82AC[arg0->type - MAIN_MENU_TIME_TRIALS_BEGIN]);
}
break;
}
if (var_v1 == -1) {
break;
}
if ((gMainMenuSelection >= MAIN_MENU_MODE_SUB_SELECT) && (var_v1 == (arg0->type - var_a1))) {
if (gMainMenuSelection > MAIN_MENU_MODE_SUB_SELECT) {
gDisplayListHead =
draw_box_fill(gDisplayListHead, arg0->column, arg0->row, arg0->column + 0x3F,
arg0->row + 0x11, 0x000000FF, 0x000000F9, 0x000000DC, 0x000000FF);
} else {
gDisplayListHead = draw_flash_select_case_slow(
gDisplayListHead, arg0->column ^ 0, arg0->row ^ 0, arg0->column + 0x3F, arg0->row + 0x11);
}
} else {
gDisplayListHead = draw_box_fill(gDisplayListHead, arg0->column, arg0->row, arg0->column + 0x3F,
arg0->row + 0x11, 1, 1, 1, 0x000000FF);
}
gDisplayListHead = render_menu_textures(gDisplayListHead, sp9C, arg0->column, arg0->row);
break;
case MENU_ITEM_TYPE_01B: /* switch 6 */
func_800A10CC(arg0);
break;
case CHARACTER_SELECT_MENU_PLAYER_SELECT_BANNER: /* switch 6 */
gDisplayListHead = render_menu_textures(gDisplayListHead, D_02004B4C, arg0->column, arg0->row);
break;
case CHARACTER_SELECT_MENU_1P_CURSOR: /* switch 6 */
case CHARACTER_SELECT_MENU_2P_CURSOR: /* switch 6 */
case CHARACTER_SELECT_MENU_3P_CURSOR: /* switch 6 */
case CHARACTER_SELECT_MENU_4P_CURSOR: /* switch 6 */
temp_a0 = arg0->type - CHARACTER_SELECT_MENU_1P_CURSOR;
if (gCharacterGridSelections[temp_a0]) {
if (gCharacterGridIsSelected[temp_a0] == 0) {
temp_t2 = 0x000000FF;
} else {
temp_t2 = gGlobalTimer % 16;
if (temp_t2 >= 8) {
temp_t2 = (-temp_t2 * 8) + 0x80;
} else {
temp_t2 *= 8;
}
temp_t2 += 0xBF;
}
render_cursor_player(arg0, temp_a0, temp_t2);
}
break;
case CHARACTER_SELECT_MENU_OK: /* switch 6 */
func_800A8564(arg0);
gDisplayListHead =
func_8009BC9C(gDisplayListHead, D_02004B74, arg0->column, arg0->row, 2, arg0->param1);
break;
case CHARACTER_SELECT_MENU_MARIO: /* switch 6 */
case CHARACTER_SELECT_MENU_LUIGI: /* switch 6 */
case CHARACTER_SELECT_MENU_TOAD: /* switch 6 */
case CHARACTER_SELECT_MENU_PEACH: /* switch 6 */
case CHARACTER_SELECT_MENU_YOSHI: /* switch 6 */
case CHARACTER_SELECT_MENU_DK: /* switch 6 */
case CHARACTER_SELECT_MENU_WARIO: /* switch 6 */
case CHARACTER_SELECT_MENU_BOWSER: /* switch 6 */
func_800A12BC(arg0, segmented_to_virtual_dupe(D_800E7D54[arg0->type - 0x2B]));
/* fallthrough */
case MENU_ITEM_TYPE_0A0: /* switch 6 */
case MENU_ITEM_TYPE_0A1: /* switch 6 */
func_8009A76C(arg0->D_8018DEE0_index, arg0->column, arg0->row, arg0->param1);
break;
case MENU_ITEM_TYPE_058: /* switch 6 */
case COURSE_SELECT_COURSE_NAMES: /* switch 6 */
case MENU_ITEM_TYPE_05A: /* switch 6 */
case MENU_ITEM_TYPE_05B: /* switch 6 */
case COURSE_SELECT_BATTLE_NAMES: /* switch 6 */
func_800A8A98(arg0);
gDisplayListHead = render_menu_textures(
gDisplayListHead,
segmented_to_virtual_dupe(gMenuTexturesTrackSelection[arg0->type - COURSE_SELECT_MAP_SELECT]),
arg0->column, arg0->row);
func_800A8CA4(arg0);
break;
case COURSE_SELECT_MAP_SELECT: /* switch 6 */
gDisplayListHead = render_menu_textures(
gDisplayListHead,
segmented_to_virtual_dupe(gMenuTexturesTrackSelection[arg0->type - COURSE_SELECT_MAP_SELECT]),
arg0->column, arg0->row);
break;
case MENU_ITEM_TYPE_05F: /* switch 6 */
case MENU_ITEM_TYPE_060: /* switch 6 */
case MENU_ITEM_TYPE_061: /* switch 6 */
case MENU_ITEM_TYPE_062: /* switch 6 */
func_800A1500(arg0);
break;
case COURSE_SELECT_MUSHROOM_CUP: /* switch 6 */
case COURSE_SELECT_FLOWER_CUP: /* switch 6 */
case COURSE_SELECT_STAR_CUP: /* switch 6 */
case COURSE_SELECT_SPECIAL_CUP: /* switch 6 */
var_a1 = arg0->type - 0x53;
func_800A890C(var_a1, arg0);
func_800A143C(arg0, var_a1);
break;
case COURSE_SELECT_OK: /* switch 6 */
func_800A8564(arg0);
gDisplayListHead =
func_8009BC9C(gDisplayListHead, D_02004E80, arg0->column, arg0->row, 2, arg0->param1);
break;
case MENU_ITEM_TYPE_065: /* switch 6 */
case MENU_ITEM_TYPE_066: /* switch 6 */
if (arg0->type == MENU_ITEM_TYPE_065) {
scaleX = 0.6f;
} else {
scaleX = 0.8f;
}
func_800A86E8(arg0);
set_text_color(TEXT_YELLOW);
print_text_mode_1(arg0->column + 8, arg0->row + 0x10, gBestTimeText[arg0->type - 0x65], 0, scaleX,
0.8f);
func_800A874C(arg0);
break;
case MENU_ITEM_TYPE_06E: /* switch 6 */
render_battle_introduction(arg0);
break;
case MENU_ITEM_TYPE_067: /* switch 6 */
func_800A8EC0(arg0);
break;
case MENU_ITEM_TYPE_068: /* switch 6 */
gDisplayListHead = draw_box_fill(gDisplayListHead, arg0->column, arg0->row, arg0->column + 0x3F,
arg0->row + 0x11, 1, 1, 1, 0x000000FF);
gDisplayListHead = render_menu_textures(
gDisplayListHead, segmented_to_virtual_dupe(D_800E8294[gCCSelection]), arg0->column, arg0->row);
break;
case MENU_ITEM_TYPE_069: /* switch 6 */
func_800A8F48(arg0);
break;
case MENU_ITEM_TYPE_078: /* switch 6 */
case MENU_ITEM_TYPE_079: /* switch 6 */
case MENU_ITEM_TYPE_07A: /* switch 6 */
case MENU_ITEM_TYPE_07B: /* switch 6 */
var_a1 = arg0->type - 0x78;
func_800A90D4(var_a1, arg0);
func_800A143C(arg0, var_a1);
break;
case MENU_ITEM_TYPE_08C: /* switch 6 */
if ((gMainMenuSelection >= MAIN_MENU_MODE_SUB_SELECT) && (var_a1 == (arg0->type - var_v1))) {
if (gMainMenuSelection > MAIN_MENU_MODE_SUB_SELECT) {
gDisplayListHead =
draw_box_fill(gDisplayListHead, arg0->column, arg0->row, arg0->column + 0x3F,
arg0->row + 0x11, 0x000000FF, 0x000000F9, 0x000000DC, 0x000000FF);
} else {
gDisplayListHead = draw_flash_select_case_slow(
gDisplayListHead, arg0->column ^ 0, arg0->row ^ 0, arg0->column + 0x3F, arg0->row + 0x11);
}
} else {
gDisplayListHead = draw_box_fill(gDisplayListHead, arg0->column, arg0->row, arg0->column + 0x3F,
arg0->row + 0x11, 1, 1, 1, 0x000000FF);
}
gDisplayListHead = render_menu_textures(gDisplayListHead, seg2_data_texture, arg0->column, arg0->row);
set_text_color(TEXT_YELLOW);
print_text1_left(0x00000125, 0x0000001C, gTextMenuData, 0, 0.55f, 0.55f);
break;
case MENU_ITEM_TYPE_08D: /* switch 6 */
func_800A1780(arg0);
break;
case MENU_ITEM_TYPE_07C: /* switch 6 */
case MENU_ITEM_TYPE_07D: /* switch 6 */
case MENU_ITEM_TYPE_07E: /* switch 6 */
case MENU_ITEM_TYPE_07F: /* switch 6 */
case MENU_ITEM_TYPE_080: /* switch 6 */
case MENU_ITEM_TYPE_081: /* switch 6 */
case MENU_ITEM_TYPE_082: /* switch 6 */
case MENU_ITEM_TYPE_083: /* switch 6 */
case MENU_ITEM_TYPE_084: /* switch 6 */
case MENU_ITEM_TYPE_085: /* switch 6 */
case MENU_ITEM_TYPE_086: /* switch 6 */
case MENU_ITEM_TYPE_087: /* switch 6 */
case MENU_ITEM_TYPE_088: /* switch 6 */
case MENU_ITEM_TYPE_089: /* switch 6 */
case MENU_ITEM_TYPE_08A: /* switch 6 */
case MENU_ITEM_TYPE_08B: /* switch 6 */
func_800A15EC(arg0);
break;
case MENU_ITEM_TYPE_096: /* switch 6 */
set_text_color(TEXT_BLUE_GREEN_RED_CYCLE_1);
print_text1_left(arg0->column, arg0->row, gCupNames[D_800DC540], arg0->param1, arg0->paramf, 1.0f);
break;
case MENU_ITEM_TYPE_097: /* switch 6 */
set_text_color(TEXT_BLUE_GREEN_RED_CYCLE_2);
print_text_mode_1(arg0->column, arg0->row, gCourseNames[gCurrentCourseId], arg0->param1, arg0->paramf,
1.0f);
break;
case MENU_ITEM_TYPE_098: /* switch 6 */
func_800A2D1C(arg0);
break;
case MENU_ITEM_TYPE_05E: /* switch 6 */
gDisplayListHead = func_80096CD8(gDisplayListHead, 0x00000019, 0x00000072, 0x0000007CU, 0x0000004AU);
break;
case MENU_ITEM_TYPE_0AA: /* switch 6 */
func_800A2EB8(arg0);
break;
case MENU_ITEM_TYPE_0AB: /* switch 6 */
func_800A34A8(arg0);
break;
case MENU_ITEM_TYPE_0AC: /* switch 6 */
func_800A6154(arg0);
break;
case MENU_ITEM_TYPE_0AF: /* switch 6 */
func_800A6034(arg0);
break;
case MENU_ITEM_TYPE_0B0: /* switch 6 */
func_800A638C(arg0);
break;
case MENU_ITEM_TYPE_0B1: /* switch 6 */
case MENU_ITEM_TYPE_0B2: /* switch 6 */
case MENU_ITEM_TYPE_0B3: /* switch 6 */
case MENU_ITEM_TYPE_0B4: /* switch 6 */
if (arg0->state != 0) {
var_v1 = arg0->type - MENU_ITEM_TYPE_0B1;
gDisplayListHead = render_menu_textures(
gDisplayListHead,
segmented_to_virtual_dupe(D_800E7D54[D_800EFD64[gCharacterSelections[var_v1]]]), arg0->column,
arg0->row);
func_8009A7EC(arg0->D_8018DEE0_index, arg0->column, arg0->row, var_v1, arg0->param1);
render_cursor_player(arg0, var_v1, 0x000000FF);
}
break;
case MENU_ITEM_TYPE_0B9: /* switch 6 */
time_trials_finish_text_render(arg0);
break;
case MENU_ITEM_TYPE_0BA: /* switch 6 */
func_800A3E60(arg0);
break;
case MENU_ITEM_ANNOUNCE_GHOST: /* switch 6 */
render_menu_item_announce_ghost(arg0);
break;
case MENU_ITEM_PAUSE: /* switch 6 */
render_pause_menu(arg0);
break;
case MENU_ITEM_END_COURSE_OPTION: /* switch 6 */
render_menu_item_end_course_option(arg0);
break;
case MENU_ITEM_DATA_COURSE_IMAGE: /* switch 6 */
render_menu_item_data_course_image(arg0);
break;
case MENU_ITEM_DATA_COURSE_INFO: /* switch 6 */
render_menu_item_data_course_info(arg0);
break;
case MENU_ITEM_DATA_COURSE_SELECTABLE: /* switch 6 */
menu_item_data_course_selectable(arg0);
break;
case MENU_ITEM_TYPE_0E9: /* switch 6 */
func_800A1DE0(arg0);
break;
case MENU_ITEM_TYPE_0EA: /* switch 6 */
func_800A1F30(arg0);
break;
case MENU_ITEM_TYPE_0F0: /* switch 6 */
func_800A1FB0(arg0);
break;
case MENU_ITEM_TYPE_0F1: /* switch 6 */
gDisplayListHead = render_menu_textures(gDisplayListHead, D_02004638, arg0->column, arg0->row);
break;
case MENU_ITEM_TYPE_10E: /* switch 6 */
func_800A70E8(arg0);
break;
case MENU_ITEM_TYPE_12B: /* switch 6 */
func_800A7258(arg0);
break;
case MENU_ITEM_TYPE_12C: /* switch 6 */
func_800A72FC(arg0);
break;
case MENU_ITEM_TYPE_12D: /* switch 6 */
func_800A7448(arg0);
break;
case MENU_ITEM_TYPE_12E: /* switch 6 */
func_800A75A0(arg0);
break;
case MENU_ITEM_TYPE_12F: /* switch 6 */
func_800A761C(arg0);
break;
case MENU_ITEM_TYPE_130: /* switch 6 */
if (arg0->state != 0) {
gDisplayListHead = render_menu_textures(
gDisplayListHead, segmented_to_virtual_dupe(D_800E7D54[D_800EFD64[D_802874D8.unk1E]]),
arg0->column, arg0->row);
func_8009A7EC(arg0->D_8018DEE0_index, arg0->column, arg0->row, 0, arg0->param1);
}
break;
case MENU_ITEM_TYPE_190: /* switch 6 */
case MENU_ITEM_TYPE_191: /* switch 6 */
case MENU_ITEM_TYPE_192: /* switch 6 */
case MENU_ITEM_TYPE_193: /* switch 6 */
case MENU_ITEM_TYPE_194: /* switch 6 */
case MENU_ITEM_TYPE_195: /* switch 6 */
case MENU_ITEM_TYPE_196: /* switch 6 */
case MENU_ITEM_TYPE_197: /* switch 6 */
case MENU_ITEM_TYPE_198: /* switch 6 */
case MENU_ITEM_TYPE_199: /* switch 6 */
case MENU_ITEM_TYPE_19A: /* switch 6 */
case MENU_ITEM_TYPE_19B: /* switch 6 */
case MENU_ITEM_TYPE_19C: /* switch 6 */
case MENU_ITEM_TYPE_19D: /* switch 6 */
case MENU_ITEM_TYPE_19E: /* switch 6 */
case MENU_ITEM_TYPE_19F: /* switch 6 */
case MENU_ITEM_TYPE_1A0: /* switch 6 */
case MENU_ITEM_TYPE_1A1: /* switch 6 */
case MENU_ITEM_TYPE_1A2: /* switch 6 */
case MENU_ITEM_TYPE_1A3: /* switch 6 */
case MENU_ITEM_TYPE_1A4: /* switch 6 */
case MENU_ITEM_TYPE_1A5: /* switch 6 */
case MENU_ITEM_TYPE_1A6: /* switch 6 */
case MENU_ITEM_TYPE_1A7: /* switch 6 */
case MENU_ITEM_TYPE_1A8: /* switch 6 */
case MENU_ITEM_TYPE_1A9: /* switch 6 */
case MENU_ITEM_TYPE_1AA: /* switch 6 */
case MENU_ITEM_TYPE_1AB: /* switch 6 */
case MENU_ITEM_TYPE_1AC: /* switch 6 */
case MENU_ITEM_TYPE_1AD: /* switch 6 */
case MENU_ITEM_TYPE_1AE: /* switch 6 */
case MENU_ITEM_TYPE_1AF: /* switch 6 */
case MENU_ITEM_TYPE_1B0: /* switch 6 */
case MENU_ITEM_TYPE_1B1: /* switch 6 */
case MENU_ITEM_TYPE_1B2: /* switch 6 */
case MENU_ITEM_TYPE_1B3: /* switch 6 */
case MENU_ITEM_TYPE_1B4: /* switch 6 */
case MENU_ITEM_TYPE_1B5: /* switch 6 */
case MENU_ITEM_TYPE_1B6: /* switch 6 */
case MENU_ITEM_TYPE_1B7: /* switch 6 */
case MENU_ITEM_TYPE_1B8: /* switch 6 */
case MENU_ITEM_TYPE_1B9: /* switch 6 */
case MENU_ITEM_TYPE_1BA: /* switch 6 */
case MENU_ITEM_TYPE_1BB: /* switch 6 */
case MENU_ITEM_TYPE_1BC: /* switch 6 */
case MENU_ITEM_TYPE_1BD: /* switch 6 */
case MENU_ITEM_TYPE_1BE: /* switch 6 */
case MENU_ITEM_TYPE_1BF: /* switch 6 */
case MENU_ITEM_TYPE_1C0: /* switch 6 */
case MENU_ITEM_TYPE_1C1: /* switch 6 */
case MENU_ITEM_TYPE_1C2: /* switch 6 */
case MENU_ITEM_TYPE_1C3: /* switch 6 */
case MENU_ITEM_TYPE_1C4: /* switch 6 */
case MENU_ITEM_TYPE_1C5: /* switch 6 */
case MENU_ITEM_TYPE_1C6: /* switch 6 */
case MENU_ITEM_TYPE_1C7: /* switch 6 */
case MENU_ITEM_TYPE_1C8: /* switch 6 */
case MENU_ITEM_TYPE_1C9: /* switch 6 */
case MENU_ITEM_TYPE_1CA: /* switch 6 */
case MENU_ITEM_TYPE_1CB: /* switch 6 */
case MENU_ITEM_TYPE_1CC: /* switch 6 */
case MENU_ITEM_TYPE_1CD: /* switch 6 */
case MENU_ITEM_TYPE_1CE: /* switch 6 */
menu_item_credits_render(arg0);
break;
}
}
}
#else
GLOBAL_ASM("asm/non_matchings/menu_items/render_menus.s")
#endif
void func_800A08D8(u8 arg0, s32 column, s32 row) {
if (arg0 >= 0x10) {
arg0 -= 0x10;
if (arg0 < 0x85) {
if (arg0 >= 0x32) {
arg0 = 0x2B;
}
gDisplayListHead =
render_menu_textures(gDisplayListHead, segmented_to_virtual_dupe(D_800E7AF8[arg0]), column, row);
}
}
}
// Walks through `someString` for `len` charcters, seemingly even going over null terminators.
// Returns a count of all non-terminator characters walked over.
s32 func_800A095C(char* someString, s32 len, s32 column, s32 row) {
s32 tempColumn;
s32 nonTerminatorCount;
nonTerminatorCount = 0;
tempColumn = column;
for (; len != 0; len--, tempColumn += 8) {
if (*someString != 0) {
nonTerminatorCount++;
}
func_800A08D8(*someString++, tempColumn, row);
}
return nonTerminatorCount;
}
void func_800A09E0(MenuItem* arg0) {
s32 table_row;
gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, 0, 0, SCREEN_WIDTH - 1, 194);
for (table_row = 0; table_row < 9; table_row++) {
if (gControllerPakScrollDirection == CONTROLLER_PAK_SCROLL_DIR_NONE && (table_row == 0 || table_row == 8)) {
continue;
}
gDisplayListHead = render_menu_textures(gDisplayListHead, D_0200157C, 0x20, (table_row * 0xA) + arg0->row);
}
}
void func_800A0AD0(UNUSED MenuItem* arg0) {
MenuItem* temp_t1;
// Find MenuItem with a type/id of 0xDA
temp_t1 = find_menu_items_dupe(MENU_ITEM_TYPE_0DA);
if ((gControllerPakMenuSelection != CONTROLLER_PAK_MENU_SELECT_RECORD) &&
(gControllerPakMenuSelection != CONTROLLER_PAK_MENU_END)) {
gDPSetPrimColor(gDisplayListHead++, 0, 0, 0xFF, temp_t1->param2, 0x00, 0xFF);
gDisplayListHead =
render_menu_textures(gDisplayListHead, D_02001874, 0x24, (gControllerPakSelectedTableRow * 0xA) + 0x7C);
}
}
void func_800A0B80(MenuItem* arg0) {
UNUSED s32 temp_a2;
s32 temp_s1;
s32 temp_s2;
s32 var_s1;
s32 var_s5;
s32 var_s0;
OSPfsState* temp_s4;
gDPSetPrimColor(gDisplayListHead++, 0, 0, 0x00, 0x00, 0x32, 0xFF);
for (var_s5 = 0; var_s5 < 9; var_s5++) {
if (gControllerPakVisibleTableRows[var_s5] == 0) {
continue;
}
temp_s1 = var_s5 * 0xA;
var_s0 = gControllerPakVisibleTableRows[var_s5];
if (var_s0 < 0xA) {
func_800A08D8(var_s0 + 0x10, 0x00000032, arg0->row + temp_s1 + 1);
} else {
var_s0 %= 10;
func_800A08D8(var_s0 + 0x10, 0x00000035, arg0->row + temp_s1 + 1);
func_800A08D8(0x11U, 0x0000002F, arg0->row + temp_s1 + 1);
}
temp_s2 = arg0->row + temp_s1 + 1;
if (pfsError[gControllerPakVisibleTableRows[var_s5] - 1] == 0) {
temp_s4 = &pfsState[gControllerPakVisibleTableRows[var_s5] - 1];
var_s0 = func_800A095C(temp_s4->game_name, 0x00000010, 0x0000004F, temp_s2);
if (temp_s4->ext_name[0] != 0) {
func_800A08D8(0x3CU, (var_s0 * 8) + 0x4F, temp_s2);
func_800A08D8(temp_s4->ext_name[0], (var_s0 * 8) + 0x57, temp_s2);
}
var_s1 = 0x10;
var_s0 = (temp_s4->file_size + 0xFF) >> 8;
// An actual do-while loop, a rare beast in these parts
do {
func_800A08D8(((var_s0 % 10) + 0x10), var_s1 + 0xFD, temp_s2);
var_s0 /= 10;
var_s1 -= 8;
} while (var_s0 != 0);
}
}
gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, 0, 0, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1);
}
void func_800A0DFC(void) {
s32 temp_t6;
s32 var_s0;
s32 var_s1;
var_s0 = gControllerPak1NumPagesFree;
var_s1 = 0x00000110;
do {
temp_t6 = var_s0 % 10;
var_s0 /= 10;
gDisplayListHead =
render_menu_textures(gDisplayListHead, segmented_to_virtual_dupe(D_800E7D0C[temp_t6]), var_s1, 0x000000B8);
var_s1 -= 9;
} while (var_s0 != 0);
}
void func_800A0EB8(UNUSED MenuItem* arg0, s32 arg1) {
s32 var_t1;
s32 thing;
Unk_D_800E70A0* temp_v0;
MenuItem* temp_t3;
temp_t3 = find_menu_items_dupe(MENU_ITEM_TYPE_0DA);
if (arg1 == 0) {
if (gControllerPakMenuSelection == CONTROLLER_PAK_MENU_END) {
var_t1 = 1;
} else {
var_t1 = 0;
}
} else {
thing = gControllerPakMenuSelection; // ?
if ((thing == CONTROLLER_PAK_MENU_ERASE) || (thing == CONTROLLER_PAK_MENU_QUIT)) {
var_t1 = ((arg1 * 2) + gControllerPakMenuSelection) - CONTROLLER_PAK_MENU_ERASE;
} else {
return;
}
}
temp_v0 = &D_800E7278[var_t1];
gDPSetPrimColor(gDisplayListHead++, 0, 0, 0xFF, temp_t3->param2, 0x00, 0xFF);
gDisplayListHead = render_menu_textures(gDisplayListHead, D_0200184C, (s32) temp_v0->column, (s32) temp_v0->row);
}
void func_800A0FA4(MenuItem* arg0, s32 arg1) {
switch (arg0->state) {
case 0:
case 2:
case 3:
gDisplayListHead = render_menu_textures(
gDisplayListHead, segmented_to_virtual_dupe(D_800E8234[(arg1 * 2) + 0]), arg0->column, arg0->row);
gDisplayListHead = render_menu_textures(
gDisplayListHead, segmented_to_virtual_dupe(D_800E8234[(arg1 * 2) + 1]), arg0->column, arg0->row);
break;
case 1:
case 4:
gDisplayListHead = func_8009BC9C(gDisplayListHead, segmented_to_virtual_dupe(D_800E8234[(arg1 * 2) + 0]),
arg0->column, arg0->row, 2, arg0->param1);
gDisplayListHead = func_8009BC9C(gDisplayListHead, segmented_to_virtual_dupe(D_800E8234[(arg1 * 2) + 1]),
arg0->column, arg0->row, 2, arg0->param1);
break;
}
}
void func_800A10CC(MenuItem* arg0) {
s32 var_s1;
s32 index;
switch (arg0->state) {
case 2:
case 3:
case 4:
case 5:
gDisplayListHead =
draw_box_fill(gDisplayListHead, 0x0000001E, 0x00000032, 0x00000122, 0x0000006E, 0, 0, 0, 0x000000FF);
index = arg0->state - 2;
set_text_color(TEXT_YELLOW);
for (var_s1 = 0; var_s1 < 4; var_s1++) {
// In a perfect world this would be `D_800E7940[index][var_s1]`
print_text_mode_1(0x00000023, 0x41 + (0xD * var_s1), D_800E7940[(index * 4) + var_s1], 0, 0.65f, 0.65f);
}
break;
default:
break;
}
}
void render_cursor_player(MenuItem* arg0, s32 arg1, s32 arg2) {
RGBA16* temp_v1;
temp_v1 = &D_800E74A8[arg1];
gDPSetPrimColor(gDisplayListHead++, 0, 0, temp_v1->red, temp_v1->green, temp_v1->blue, temp_v1->alpha);
gDPSetEnvColor(gDisplayListHead++, arg2, arg2, arg2, 0x00);
gDisplayListHead = render_menu_textures(
gDisplayListHead, segmented_to_virtual_dupe(gMenuTexturesBorderPlayer[arg1]), arg0->column, arg0->row);
}
void func_800A12BC(MenuItem* arg0, MenuTexture* arg1) {
switch (arg0->state) {
case 0:
case 2:
case 4:
gDisplayListHead = render_menu_textures(gDisplayListHead, arg1, arg0->column, arg0->row);
break;
case 1:
case 3:
gDisplayListHead = func_8009BC9C(gDisplayListHead, arg1, arg0->column, arg0->row, 2, arg0->param1);
break;
}
}
void func_800A1350(MenuItem* arg0) {
s32 thing;
if (func_800AAFCC(arg0->type - 0x2B) < 0) {
switch (arg0->state) {
case 0:
case 2:
case 4:
gDisplayListHead = draw_box(gDisplayListHead, arg0->column, arg0->row, arg0->column + 0x40,
arg0->row + 0x4C, 0, 0, 0, 0x00000064);
break;
case 1:
case 3:
thing = arg0->param1;
gDisplayListHead = draw_box(gDisplayListHead, arg0->column + thing, arg0->row,
(arg0->column - thing) + 0x40, arg0->row + 0x4C, 0, 0, 0, 0x00000064);
break;
}
}
}
void func_800A143C(MenuItem* arg0, s32 arg1) {
switch (arg0->state) {
case 0:
case 2:
case 3:
gDisplayListHead =
render_menu_textures(gDisplayListHead, segmented_to_virtual_dupe(gMenuTexturesTrackSelection[arg1 + 1]),
arg0->column, arg0->row);
break;
case 1:
case 4:
gDisplayListHead =
func_8009BC9C(gDisplayListHead, segmented_to_virtual_dupe(gMenuTexturesTrackSelection[arg1 + 1]),
arg0->column, arg0->row, 2, arg0->param1);
break;
}
}
void func_800A1500(MenuItem* arg0) {
MenuItem* temp_v0;
Unk_D_800E70A0* temp_v0_2;
s32 var_a1;
var_a1 = 0;
temp_v0 = find_menu_items_dupe(MENU_ITEM_TYPE_064);
switch (temp_v0->state) { /* irregular */
case 0:
case 1:
break;
case 2:
if (((temp_v0->param1 % 4) + 0x5F) != arg0->type) {
var_a1 = 1;
}
break;
case 3:
var_a1 = 1;
break;
}
switch (var_a1) { /* switch 1; irregular */
case 0: /* switch 1 */
func_8009A76C(arg0->D_8018DEE0_index, 0x00000017, 0x00000070, -1);
break;
case 1: /* switch 1 */
temp_v0_2 = &D_800E7168[arg0->type - 0x5F];
func_8009A76C(arg0->D_8018DEE0_index, temp_v0_2->column, temp_v0_2->row, -2);
break;
}
}
void func_800A15EC(MenuItem* arg0) {
s16 courseId = gCupCourseOrder[(arg0->type - 0x7C) / 4][(arg0->type - 0x7C) % 4];
gDisplayListHead =
func_8009C204(gDisplayListHead, segmented_to_virtual_dupe(D_800E7D74[courseId]), arg0->column, arg0->row, 2);
gDisplayListHead = draw_box(gDisplayListHead, arg0->column, arg0->row + 0x27, arg0->column + 0x40, arg0->row + 0x30,
0, 0, 0, 0xFF);
gDisplayListHead = func_8009C204(gDisplayListHead, segmented_to_virtual_dupe(D_800E7DC4[courseId]), arg0->column,
arg0->row + 0x27, 3);
if (func_800B639C(arg0->type - 0x7C) >= 0) {
// The "^ 0" is required to force the use of v1 instead of a 4th s* register
gDisplayListHead = draw_flash_select_case_slow(gDisplayListHead, arg0->column + 0x20, arg0->row ^ 0,
arg0->column + 0x3F, arg0->row + 9);
gDisplayListHead =
func_8009C204(gDisplayListHead, segmented_to_virtual_dupe(&D_02004A0C), arg0->column + 0x20, arg0->row, 2);
}
}
void func_800A1780(MenuItem* arg0) {
RGBA16* temp_a1;
RGBA16* temp_v1;
s32 temp_a2;
u32 red;
u32 green;
u32 blue;
u32 alpha;
temp_v1 = &D_800E74D0[arg0->param2];
temp_a1 = &D_800E74D0[(arg0->param2 + 1) % 3];
temp_a2 = 256 - arg0->param1;
red = ((temp_v1->red * temp_a2) + (temp_a1->red * arg0->param1)) / 256;
green = ((temp_v1->green * temp_a2) + (temp_a1->green * arg0->param1)) / 256;
blue = ((temp_v1->blue * temp_a2) + (temp_a1->blue * arg0->param1)) / 256;
alpha = ((temp_v1->alpha * temp_a2) + (temp_a1->alpha * arg0->param1)) / 256;
gDPSetPrimColor(gDisplayListHead++, 0, 0, red, green, blue, alpha);
gDisplayListHead =
render_menu_textures(gDisplayListHead, segmented_to_virtual_dupe(D_02001FA4), arg0->column, arg0->row);
}
void render_menu_item_data_course_image(MenuItem* arg0) {
// render course preview
func_8009A76C(arg0->D_8018DEE0_index, 0x17, 0x84, -1);
if (func_800B639C(gTimeTrialDataCourseIndex) >= TIME_TRIAL_DATA_LUIGI_RACEWAY) {
gDisplayListHead = draw_flash_select_case_slow(gDisplayListHead, 0x57, 0x84, 0x96, 0x95);
gDisplayListHead = render_menu_textures(gDisplayListHead, D_02004A0C, 0x57, 0x84);
}
// course minimap
func_8004EF9C(gCupCourseOrder[gTimeTrialDataCourseIndex / 4][gTimeTrialDataCourseIndex % 4]);
do {
gDPSetTextureFilter(gDisplayListHead++, G_TF_BILERP);
} while (0);
}
void render_menu_item_data_course_info(MenuItem* arg0) {
s16 courseId;
s32 recordType;
s32 rowOffset;
courseId = gCupCourseOrder[gTimeTrialDataCourseIndex / 4][gTimeTrialDataCourseIndex % 4];
arg0->column = 0x14;
// name of the course
set_text_color(TEXT_BLUE_GREEN_RED_CYCLE_1);
print_text1_center_mode_1(0x69, arg0->row + 0x19, gCourseNamesDup[courseId], 0, 0.75f, 0.75f);
// distance
set_text_color(TEXT_RED);
print_text_mode_1(0x2D, arg0->row + 0x28, (char*) &gTextDistance, 0, 0.75f, 0.75f);
print_text1_left(0xA5, arg0->row + 0x28, sCourseLengths[courseId], 1, 0.75f, 0.75f);
// best lap record
set_text_color(TEXT_YELLOW);
print_text_mode_1(0xA0, arg0->row + 0x86, gBestTimeText[0], 0, 0.75f, 0.75f);
// Print the 3 Lap Time Trial records
for (recordType = TIME_TRIAL_3LAP_RECORD_1, rowOffset = 0; recordType < TIME_TRIAL_1LAP_RECORD;
recordType++, rowOffset += 0xD) {
set_text_color(TEXT_RED);
render_lap_times(recordType, 0x96, arg0->row + rowOffset + 0x92);
}
set_text_color(TEXT_YELLOW);
print_text_mode_1(0xA0, arg0->row + 0xD5, gBestTimeText[1], 0, 0.75f, 0.75f);
render_lap_times(TIME_TRIAL_1LAP_RECORD, 0x96, arg0->row + 0xE1);
}
void menu_item_data_course_selectable(MenuItem* arg0) {
UNUSED s32 stackPadding0;
UNUSED s32 stackPadding1;
UNUSED s32 stackPadding2;
UNUSED char* wut;
Unk_D_800E70A0 sp78;
s32 i;
s32 var_s1;
s32 var_s2;
UNUSED s32 thing;
CourseTimeTrialRecords* temp_s6;
temp_s6 = &gSaveData.allCourseTimeTrialRecords.cupRecords[gTimeTrialDataCourseIndex / 4]
.courseRecords[gTimeTrialDataCourseIndex % 4];
for (i = 0; i < ARRAY_COUNT(gTextMenuOption); i++) {
wut = gTextMenuOption[i];
var_s1 = 0;
if (i == gCourseRecordsMenuSelection) {
var_s2 = TEXT_BLUE_GREEN_RED_CYCLE_2;
} else {
var_s2 = TEXT_GREEN;
switch (i) { /* irregular */
case COURSE_RECORDS_MENU_ERASE_RECORDS:
if (temp_s6->unknownBytes[0] == 0) {
var_s1 = 1;
}
break;
case COURSE_RECORDS_MENU_ERASE_GHOST:
if (func_800B639C((s32) gTimeTrialDataCourseIndex) < 0) {
var_s1 = 1;
}
break;
}
}
if (var_s1 != 0) {
set_text_color(TEXT_BLUE);
gDPSetPrimColor(gDisplayListHead++, 0, 0, 0x00, 0x00, 0x00, 0x96);
print_text_mode_2(0x00000025, 0x3F + (0xD * i), gTextMenuOption[i], 0, 0.6f, 0.6f);
} else {
set_text_color(var_s2);
print_text_mode_1(0x00000025, 0x3F + (0xD * i), gTextMenuOption[i], 0, 0.6f, 0.6f);
}
}
sp78.column = 0x001F;
sp78.row = (gCourseRecordsMenuSelection * 0xD) + 0x3A;
func_800A66A8(arg0, (Unk_D_800E70A0*) &sp78);
}
void func_800A1DE0(MenuItem* arg0) {
UNUSED s32 stackPadding0;
UNUSED s32 stackPadding1;
UNUSED s32 stackPadding2;
UNUSED s32 stackPadding3;
Unk_D_800E70A0 sp58;
s32 var_a0;
UNUSED s32 var_s0;
s32 var_s1;
UNUSED char* wut;
set_text_color(TEXT_GREEN);
for (var_s1 = 0; var_s1 < 3; var_s1++) {
// Removing `wut` introduces counter intuitive changes to how this loop is handled
// Also, in a perfect world this would be `gEraseBestGhostText[gCourseRecordsMenuSelection - 1][var_s1]`
wut = gEraseBestGhostText[(gCourseRecordsMenuSelection - 1) * 3 + var_s1];
print_text_mode_1(0x0000001B, 0x3C + (0xD * var_s1),
gEraseBestGhostText[(gCourseRecordsMenuSelection - 1) * 3 + var_s1], 0, 0.65f, 0.65f);
}
for (var_s1 = 0; var_s1 < ARRAY_COUNT(D_800E7840); var_s1++) {
wut = D_800E7840[var_s1];
if (var_s1 == gCourseRecordsSubMenuSelection) {
var_a0 = 5;
} else {
var_a0 = 1;
}
set_text_color(var_a0);
print_text_mode_1(0x00000043, 0x6E + (0xD * var_s1), D_800E7840[var_s1], 0, 0.65f, 0.65f);
}
sp58.column = 0x003B;
sp58.row = (gCourseRecordsSubMenuSelection * 0xD) + 0x66;
func_800A66A8(arg0, &sp58);
}
void func_800A1F30(UNUSED MenuItem* unused) {
s32 row;
s32 text;
set_text_color(TEXT_RED);
for (row = 0x49, text = 0; row < 0x69; row += 0x10, text++) {
print_text_mode_1(0x2A, row, D_800E7860[text], 0, 0.75f, 0.75f);
}
}
#ifdef NON_MATCHING
// Register allocation stuff, minor stack diffs
void func_800A1FB0(MenuItem* arg0) {
Unk_D_800E70A0 spE0;
UNUSED s32 stackPadding0;
UNUSED s32 stackPadding1;
UNUSED s32 stackPadding2;
UNUSED s32 stackPadding3;
UNUSED s32 stackPadding4;
UNUSED s32 stackPadding5;
s32 var_s5;
s32 var_s4;
UNUSED s32 stackPadding6;
char spB8[3];
UNUSED s32 stackPadding7;
UNUSED s32 stackPadding8;
s32 var_s1;
char spA8[3];
s32 var_s2;
UNUSED s32 temp_v0;
UNUSED s32 stackPadding9;
char sp98[3];
struct_8018EE10_entry* var_v1;
gDisplayListHead = draw_box(gDisplayListHead, 0, 0, 0x00000140, 0x000000F0, 0, 0, 0, 0x00000064);
switch (gSubMenuSelection) { /* switch 1 */
case SUB_MENU_OPTION_RETURN_GAME_SELECT: /* switch 1 */
case SUB_MENU_OPTION_SOUND_MODE: /* switch 1 */
case SUB_MENU_OPTION_COPY_CONTROLLER_PAK: /* switch 1 */
case SUB_MENU_OPTION_ERASE_ALL_DATA: /* switch 1 */
for (stackPadding0 = 0; stackPadding0 < ARRAY_COUNT(gTextOptionMenu); stackPadding0++) {
set_text_color_rainbow_if_selected(gSubMenuSelection - SUB_MENU_OPTION_MIN, stackPadding0, 3);
print_text_mode_1(0x00000032, 0x55 + (0x23 * stackPadding0), gTextOptionMenu[stackPadding0], 0, 0.9f,
1.0f);
if (stackPadding0 == (gSubMenuSelection - SUB_MENU_OPTION_MIN)) {
spE0.column = 0x0032;
spE0.row = 0x55 + (0x23 * stackPadding0);
}
}
set_text_color(TEXT_GREEN);
print_text1_center_mode_1(0x000000E6, 0x55 + 0x23, gSoundModeNames[gSoundMode], 0, 1.0f, 1.0f);
break;
case SUB_MENU_ERASE_QUIT: /* switch 1 */
case SUB_MENU_ERASE_ERASE: /* switch 1 */
set_text_color(TEXT_YELLOW);
for (stackPadding0 = 0; stackPadding0 < ARRAY_COUNT(D_800E7878); stackPadding0++) {
print_text_mode_1(0x00000028, 0x55 + (0x14 * stackPadding0), D_800E7878[stackPadding0], 0, 1.0f, 1.0f);
}
for (stackPadding0 = 0; stackPadding0 < ARRAY_COUNT(D_800E7840); stackPadding0++) {
set_text_color_rainbow_if_selected(gSubMenuSelection - SUB_MENU_ERASE_MIN, stackPadding0, 1);
print_text_mode_1(0x00000084, 0x96 + (0x19 * stackPadding0), D_800E7840[stackPadding0], 0, 1.0f, 1.0f);
if (stackPadding0 == (gSubMenuSelection - SUB_MENU_ERASE_MIN)) {
spE0.column = 0x0084;
spE0.row = 0x96 + (0x19 * stackPadding0);
}
}
break;
case SUB_MENU_SAVE_DATA_ERASED: /* switch 1 */
set_text_color(TEXT_YELLOW);
for (stackPadding0 = 0; stackPadding0 < ARRAY_COUNT(D_800E7884); stackPadding0++) {
print_text_mode_1(0x00000032, 0x55 + (0x14 * stackPadding0), D_800E7884[stackPadding0], 0, 1.0f, 1.0f);
}
break;
case SUB_MENU_COPY_PAK_ERROR_NO_GHOST_DATA: /* switch 1 */
case SUB_MENU_COPY_PAK_ERROR_NO_GAME_DATA: /* switch 1 */
case SUB_MENU_COPY_PAK_ERROR_NO_PAK_2P: /* switch 1 */
case SUB_MENU_COPY_PAK_ERROR_BAD_READ_2P: /* switch 1 */
set_text_color(TEXT_RED);
var_s1 = gSubMenuSelection - SUB_MENU_COPY_PAK_ERROR_2P_MIN;
for (stackPadding0 = 0; stackPadding0 < ARRAY_COUNT(D_800E78D0) / 4; stackPadding0++) { // 12 / 4 = 3
print_text_mode_1(0x00000032, 0x55 + (0x14 * stackPadding0), D_800E78D0[(var_s1 * 3) + stackPadding0],
0, 0.9f, 0.9f);
}
break;
case SUB_MENU_COPY_PAK_ERROR_NO_PAK_1P: /* switch 1 */
case SUB_MENU_COPY_PAK_ERROR_BAD_READ_1P: /* switch 1 */
case SUB_MENU_COPY_PAK_ERROR_CANT_CREATE_1P: /* switch 1 */
case SUB_MENU_COPY_PAK_ERROR_NO_PAGES_1P: /* switch 1 */
set_text_color(TEXT_RED);
var_s1 = gSubMenuSelection - SUB_MENU_COPY_PAK_ERROR_1P_MIN;
for (stackPadding0 = 0; stackPadding0 < ARRAY_COUNT(D_800E7890) / 4; stackPadding0++) { // 16 / 4 = 4
print_text_mode_1(0x00000023, 0x55 + (0x14 * stackPadding0), D_800E7890[(var_s1 * 4) + stackPadding0],
0, 0.8f, 0.8f);
}
break;
case SUB_MENU_COPY_PAK_UNABLE_COPY_FROM_1P: /* switch 1 */
case SUB_MENU_COPY_PAK_UNABLE_READ_FROM_2P: /* switch 1 */
set_text_color(TEXT_RED);
var_s1 = gSubMenuSelection - SUB_MENU_COPY_PAK_UNABLE_ERROR_MIN;
for (stackPadding0 = 0; stackPadding0 < ARRAY_COUNT(D_800E7900) / 2; stackPadding0++) { // 6 / 2 = 3
print_text_mode_1(0x00000041, 0x55 + (0x14 * stackPadding0), D_800E7900[(var_s1 * 3) + stackPadding0],
0, 0.9f, 0.9f);
}
break;
case SUB_MENU_COPY_PAK_CREATE_GAME_DATA_INIT: /* switch 1 */
case SUB_MENU_COPY_PAK_CREATE_GAME_DATA_DONE: /* switch 1 */
set_text_color(TEXT_YELLOW);
for (stackPadding0 = 0; stackPadding0 < ARRAY_COUNT(D_800E7A48); stackPadding0++) {
print_text_mode_1(0x00000050, 0x55 + (0x14 * stackPadding0), D_800E7A48[stackPadding0], 0, 1.0f, 1.0f);
}
break;
case SUB_MENU_COPY_PAK_FROM_GHOST1_1P: /* switch 1 */
case SUB_MENU_COPY_PAK_FROM_GHOST2_1P: /* switch 1 */
case SUB_MENU_COPY_PAK_TO_GHOST1_2P: /* switch 1 */
case SUB_MENU_COPY_PAK_TO_GHOST2_2P: /* switch 1 */
switch (gSubMenuSelection) {
case SUB_MENU_COPY_PAK_FROM_GHOST1_1P:
case SUB_MENU_COPY_PAK_FROM_GHOST2_1P:
var_s5 = SUB_MENU_COPY_PAK_FROM_GHOST_MIN;
var_s4 = 0;
break;
case SUB_MENU_COPY_PAK_TO_GHOST1_2P:
case SUB_MENU_COPY_PAK_TO_GHOST2_2P:
var_s5 = SUB_MENU_COPY_PAK_TO_GHOST_MIN;
var_s4 = 1;
default:
// var_s5 = spC4;
// var_s4 = spC0;
break;
}
set_text_color(var_s4 + 1);
print_text1_center_mode_1(0x000000A0, 0x00000055, D_800E7920[var_s4], 0, 0.6f, 0.6f);
for (var_s1 = 0; var_s1 < ARRAY_COUNT(D_800E7918); var_s1++) {
set_text_color(TEXT_YELLOW);
print_text1_center_mode_1(0x5C + (0x82 * var_s1), 0x0000007D, D_800E7918[var_s1], 0, 0.75f, 0.75f);
for (var_s2 = 0; var_s2 < 2; var_s2++) {
if (var_s1 != var_s4) {
text_rainbow_effect(gSubMenuSelection - var_s5, var_s2, TEXT_GREEN);
if (var_s2 == (gSubMenuSelection - var_s5)) {
spE0.column = 0x20 + (0x89 * var_s1);
spE0.row = 0x96 + (0x1E * var_s2);
}
} else if ((var_s4 != 0) && (var_s2 == arg0->param2)) {
set_text_color((s32) gGlobalTimer % 3);
} else {
set_text_color(TEXT_GREEN);
}
convert_number_to_ascii(var_s2 + 1, &spB8[0]);
print_text_mode_1(0x20 + (0x89 * var_s1), 0x96 + (0x1E * var_s2), &spB8[1], 0, 0.6f, 0.6f);
if (var_s1 == 0) {
var_v1 = &D_8018EE10[var_s2];
} else {
var_v1 = &((struct_8018EE10_entry*) gSomeDLBuffer)[var_s2];
}
if (var_v1->ghostDataSaved == 0) {
print_text_mode_1(0x2A + (var_s1 * 0x89), 0x96 + (0x1E * var_s2), D_800E7A44, 0, 0.5f, 0.5f);
} else {
print_text_mode_1(
0x2A + (var_s1 * 0x89), 0x96 + (0x1E * var_s2),
gCourseNamesDup2[gCupCourseOrder[var_v1->courseIndex / 4][var_v1->courseIndex % 4]], 0,
0.5f, 0.5f);
}
}
}
break;
case SUB_MENU_COPY_PAK_PROMPT_QUIT: /* switch 1 */
case SUB_MENU_COPY_PAK_PROMPT_COPY: /* switch 1 */
set_text_color(TEXT_RED);
for (var_s1 = 0; var_s1 < ARRAY_COUNT(D_800E7928); var_s1++) {
print_text1_center_mode_1(0x000000A0, 0x4D + (0x14 * var_s1), D_800E7928[var_s1], 0, 0.8f, 0.8f);
}
for (var_s1 = 0; var_s1 < ARRAY_COUNT(D_800E7918); var_s1++) {
set_text_color(TEXT_YELLOW);
print_text1_center_mode_1(0x5C + (0x82 * var_s1), 0x0000007D, D_800E7918[var_s1], 0, 0.75f, 0.75f);
for (var_s2 = 0; var_s2 != 2; var_s2++) {
if (var_s1 == 0) {
if (var_s2 == arg0->param1) {
set_text_color((s32) gGlobalTimer % 3);
} else {
set_text_color(TEXT_GREEN);
}
} else if (var_s2 == arg0->param2) {
set_text_color((s32) gGlobalTimer % 3);
} else {
set_text_color(TEXT_GREEN);
}
convert_number_to_ascii(var_s2 + 1, &spA8[0]);
print_text_mode_1(0x20 + (0x89 * var_s1), 0x96 + (0x1E * var_s2), &spA8[1], 0, 0.6f, 0.6f);
if (var_s1 == 0) {
var_v1 = &D_8018EE10[var_s2];
} else {
var_v1 = &((struct_8018EE10_entry*) gSomeDLBuffer)[var_s2];
}
if (var_v1->ghostDataSaved == 0) {
print_text_mode_1(0x2A + (var_s1 * 0x89), 0x96 + (0x1E * var_s2), D_800E7A44, 0, 0.5f, 0.5f);
} else {
print_text_mode_1(
0x2A + (var_s1 * 0x89), 0x96 + (0x1E * var_s2),
gCourseNamesDup2[gCupCourseOrder[var_v1->courseIndex / 4][var_v1->courseIndex % 4]], 0,
0.5f, 0.5f);
}
}
}
// Register allocation diffs here
for (var_s2 = 0; var_s2 < ARRAY_COUNT(D_800E7930); var_s2++) {
if (var_s2 == (gSubMenuSelection - SUB_MENU_COPY_PAK_PROMPT_MIN)) {
spE0.column = 0x6E + (0x32 * var_s2);
spE0.row = 0x00D2;
}
text_rainbow_effect((gSubMenuSelection - SUB_MENU_COPY_PAK_PROMPT_MIN), var_s2, TEXT_YELLOW);
print_text_mode_1(0x6E + (0x32 * var_s2), 0x000000D2, D_800E7930[var_s2], 0, 0.75f, 0.75f);
}
break;
case SUB_MENU_COPY_PAK_START: /* switch 1 */
case SUB_MENU_COPY_PAK_COPYING: /* switch 1 */
case SUB_MENU_COPY_PAK_COMPLETED: /* switch 1 */
var_s5 = (gSubMenuSelection - SUB_MENU_COPY_PAK_ACTION_MIN) / 2;
set_text_color(TEXT_RED);
print_text1_center_mode_1(0x000000A0, 0x00000055, D_800E7938[var_s5], 0, 1.0f, 1.0f);
for (var_s1 = 0; var_s1 < ARRAY_COUNT(D_800E7918); var_s1++) {
set_text_color(TEXT_YELLOW);
print_text1_center_mode_1(0x5C + (0x82 * var_s1), 0x0000007D, D_800E7918[var_s1], 0, 0.75f, 0.75f);
for (var_s2 = 0; var_s2 < 2; var_s2++) {
if (var_s1 == 0) {
if (var_s2 == arg0->param1) {
if (var_s5 == 0) {
set_text_color(TEXT_RED);
} else {
set_text_color(gGlobalTimer % 3);
}
} else {
set_text_color(TEXT_GREEN);
}
} else if (var_s2 == arg0->param2) {
set_text_color(TEXT_RED);
} else {
set_text_color(TEXT_GREEN);
}
convert_number_to_ascii(var_s2 + 1, &sp98[0]);
print_text_mode_1(0x20 + (0x89 * var_s1), 0x96 + (0x1E * var_s2), &sp98[1], 0, 0.6f, 0.6f);
if (var_s1 == 0) {
var_v1 = &D_8018EE10[var_s2];
} else {
var_v1 = &((struct_8018EE10_entry*) gSomeDLBuffer)[var_s2];
}
if (var_v1->ghostDataSaved == 0) {
print_text_mode_1(0x2A + (var_s1 * 0x89), 0x96 + (0x1E * var_s2), D_800E7A44, 0, 0.5f, 0.5f);
} else {
print_text_mode_1(
0x2A + (var_s1 * 0x89), 0x96 + (0x1E * var_s2),
gCourseNamesDup2[gCupCourseOrder[var_v1->courseIndex / 4][var_v1->courseIndex % 4]], 0,
0.5f, 0.5f);
}
}
}
break;
}
switch (gSubMenuSelection) { /* switch 2 */
case SUB_MENU_COPY_PAK_FROM_GHOST1_1P: /* switch 2 */
case SUB_MENU_COPY_PAK_FROM_GHOST2_1P: /* switch 2 */
case SUB_MENU_COPY_PAK_TO_GHOST1_2P: /* switch 2 */
case SUB_MENU_COPY_PAK_TO_GHOST2_2P: /* switch 2 */
case SUB_MENU_COPY_PAK_PROMPT_QUIT: /* switch 2 */
case SUB_MENU_COPY_PAK_PROMPT_COPY: /* switch 2 */
spE0.column -= 5;
spE0.row -= 6;
break;
default: /* switch 2 */
spE0.column -= 0xA;
spE0.row -= 8;
break;
}
func_800A66A8(arg0, (Unk_D_800E70A0*) &spE0);
}
#else
GLOBAL_ASM("asm/non_matchings/menu_items/func_800A1FB0.s")
#endif
void func_800A2D1C(MenuItem* arg0) {
switch (D_80164A28) {
case 1:
gDisplayListHead = func_80098FC8(gDisplayListHead, 0, 0, 0x13F, 0x28);
gDisplayListHead = func_80098FC8(gDisplayListHead, 0, 0xC7, 0x13F, 0xEF);
arg0->param1 = 0x28;
break;
case 2:
arg0->param1 -= 2;
if (arg0->param1 > 0) {
gDisplayListHead = func_80098FC8(gDisplayListHead, 0, 0, 0x13F, arg0->param1);
gDisplayListHead = func_80098FC8(gDisplayListHead, 0, 0xEF - arg0->param1, 0x13F, 0xEF);
} else {
arg0->type = 0;
}
break;
default:
if ((gModeSelection != GRAND_PRIX) || (gPlayerCountSelection1 != 1) || (gDemoUseController != 0)) {
arg0->type = 0;
} else {
arg0->param1 -= 2;
if (arg0->param1 > 0) {
gDisplayListHead = func_80098FC8(gDisplayListHead, 0, 0, 0x13F, arg0->param1);
gDisplayListHead = func_80098FC8(gDisplayListHead, 0, 0xEF - arg0->param1, 0x13F, 0xEF);
} else {
arg0->type = 0;
}
}
break;
}
}
void func_800A2EB8(MenuItem* arg0) {
s8 sp70[8];
UNUSED s32 stackPadding0;
char sp68[3];
s32 temp_s0;
s32 var_a0;
s32 var_s2;
for (var_s2 = 0; var_s2 < NUM_PLAYERS; var_s2++) {
sp70[var_s2] = gPlayers[gGPCurrentRacePlayerIdByRank[var_s2]].characterId;
}
set_text_color(TEXT_BLUE_GREEN_RED_CYCLE_1);
print_text_mode_1(arg0->column + 0x1E, arg0->row + 0x19, "results", 0, 1.0f, 1.0f);
set_text_color(TEXT_BLUE_GREEN_RED_CYCLE_2);
print_text_mode_1(arg0->column + 0x2C, arg0->row + 0x28, "round", 0, 0.7f, 0.7f);
convert_number_to_ascii(gCourseIndexInCup + 1, sp68);
print_text_mode_1(arg0->column + 0x57, arg0->row + 0x28, &sp68[1], 0, 0.7f, 0.7f);
for (var_s2 = 0; var_s2 < 4; var_s2++) {
if (gGPCurrentRacePlayerIdByRank[var_s2] < gPlayerCount) {
var_a0 = (s32) gGlobalTimer % 3;
} else {
var_a0 = TEXT_YELLOW;
}
set_text_color(var_a0);
func_800A32B4(arg0->column + 7, arg0->row + (0x10 * var_s2) + 0x38, (s32) sp70[var_s2], var_s2);
}
for (var_s2 = 4; var_s2 < 8; var_s2++) {
if (gGPCurrentRacePlayerIdByRank[var_s2] < gPlayerCount) {
var_a0 = (s32) gGlobalTimer % 3;
} else {
var_a0 = TEXT_YELLOW;
}
set_text_color(var_a0);
func_800A32B4(0xBE - arg0->column, arg0->row + (0x10 * var_s2) + 0x5A, sp70[var_s2], var_s2);
}
set_text_color(TEXT_BLUE_GREEN_RED_CYCLE_2);
temp_s0 = (s32) (((f32) (get_string_width(gCupNames[gCupSelection]) + 8) * 0.6f) / 2);
print_text1_center_mode_1(
(-(s32) (((f32) (get_string_width(D_800E76CC[gCCSelection]) + 8) * 0.6f) / 2) - arg0->column) + 0xF5,
arg0->row + 0xE1, gCupNames[D_800DC540], 0, 0.6f, 0.6f);
print_text1_center_mode_1(
(temp_s0 - arg0->column) + 0xF5, arg0->row + 0xE1,
D_800E76CC[gGameModeSubMenuColumn[gPlayerCount - 1][gGameModeMenuColumn[gPlayerCount - 1]]], 0, 0.6f, 0.6f);
}
void func_800A32B4(s32 arg0, s32 arg1, s32 characterId, s32 rank) {
UNUSED s32 stackPadding0;
f32 sp50;
UNUSED s32 stackPadding1;
UNUSED s32 stackPadding2;
UNUSED s32 stackPadding3;
UNUSED s32 stackPadding4;
char sp3C[4];
sp50 = gTimePlayerLastTouchedFinishLine[gGPCurrentRacePlayerIdByRank[rank]];
convert_number_to_ascii(rank + 1, sp3C);
sp3C[2] = '.';
sp3C[3] = '\0';
func_800939C8(arg0 - 1, arg1, &sp3C[1], -4, 0.7f, 0.7f);
print_text_mode_1(arg0 + 0xA, arg1, D_800E76A8[characterId], 0, 0.65f, 0.7f);
convert_number_to_ascii((s32) (sp50 / 60.0f), sp3C);
func_800939C8(arg0 + 0x42, arg1, sp3C, 0, 0.7f, 0.7f);
convert_number_to_ascii((s32) sp50 % 60, sp3C);
print_text_mode_1(arg0 + 0x4E, arg1, "'", 0, 0.7f, 0.7f);
func_800939C8(arg0 + 0x56, arg1, sp3C, 0, 0.7f, 0.7f);
convert_number_to_ascii((s32) ((f64) sp50 * 100.0) % 100, sp3C);
print_text_mode_1(arg0 + 0x62, arg1, "\"", 0, 0.7f, 0.7f);
func_800939C8(arg0 + 0x6A, arg1, sp3C, 0, 0.7f, 0.7f);
}
void func_800A34A8(MenuItem* arg0) {
s8 sp80[8];
UNUSED s32 stackPadding0;
char sp78[3];
UNUSED s32 stackPadding1;
s32 var_a0;
s32 var_v0;
s32 var_v1;
UNUSED s32 stackPadding2;
s32 temp_s0_3;
s32 rank;
s32 test;
if (arg0->state != 0) {
if (arg0->state < 9) {
for (rank = 0; rank < NUM_PLAYERS; rank++) {
sp80[rank] = gPlayers[gGPCurrentRacePlayerIdByRank[rank]].characterId;
}
} else {
func_800A3A10(sp80);
func_800A3A10(gCharacterIdByGPOverallRank);
}
set_text_color(TEXT_BLUE_GREEN_RED_CYCLE_1);
print_text_mode_1(arg0->column + 0x19, 0x19 - arg0->row, "driver's points", 0, 0.8f, 0.8f);
set_text_color(TEXT_BLUE_GREEN_RED_CYCLE_2);
print_text_mode_1(arg0->column + 0x36, 0x28 - arg0->row, "round", 0, 0.7f, 0.7f);
convert_number_to_ascii(gCourseIndexInCup + 1, sp78);
print_text_mode_1(arg0->column + 0x61, (0x28 & 0xFFFFFFFF) - arg0->row, &sp78[1], 0, 0.7f, 0.7f);
for (rank = 0; rank < 4; rank++) {
test = arg0->state;
if ((test != 8) && (test != 9)) {
var_v0 = 0;
} else {
if ((rank * 5) < arg0->param1) {
var_v0 = 1;
} else {
var_v0 = 0;
}
}
if (var_v0 == 0) {
if (arg0->state < 9) {
var_v0 = gGPCurrentRacePlayerIdByRank[rank];
var_v1 = 0;
} else {
var_v1 = 0x0000000D;
var_v0 = D_80164478[sp80[rank]];
}
if (var_v0 < gPlayerCount) {
var_a0 = (s32) gGlobalTimer % 3;
} else {
var_a0 = 3;
}
set_text_color(var_a0);
func_800A3ADC(arg0, arg0->column + var_v1 + 0x1C, ((rank * 0x10) - arg0->row) + 0x38, sp80[rank], rank,
sp80);
}
}
for (rank = 4; rank < NUM_PLAYERS; rank++) {
test = arg0->state;
if ((test != 8) && (test != 9)) {
var_v0 = 0;
} else {
if ((rank * 5) < arg0->param1) {
var_v0 = 1;
} else {
var_v0 = 0;
}
}
if (var_v0 == 0) {
if (arg0->state < 9) {
var_v0 = gGPCurrentRacePlayerIdByRank[rank];
} else {
var_v0 = D_80164478[sp80[rank]];
}
if (var_v0 < gPlayerCount) {
var_a0 = (s32) gGlobalTimer % 3;
} else {
var_a0 = 3;
}
set_text_color(var_a0);
func_800A3ADC(arg0, 0xBE - arg0->column, arg0->row + (rank * 0x10) + 0x5A, sp80[rank], rank, sp80);
}
}
set_text_color(TEXT_BLUE_GREEN_RED_CYCLE_2);
temp_s0_3 = ((get_string_width(gCupNames[gCupSelection]) + 8) * 0.6f) / 2;
print_text1_center_mode_1(
(-(s32) (((get_string_width(D_800E76CC[gCCSelection]) + 8) * 0.6f) / 2) - arg0->column) + 0xE6,
arg0->row + 0xE1, gCupNames[D_800DC540], 0, 0.6f, 0.6f);
print_text1_center_mode_1(
(temp_s0_3 - arg0->column) + 0xE6, arg0->row + 0xE1,
D_800E76CC[gGameModeSubMenuColumn[gPlayerCount - 1][gGameModeMenuColumn[gPlayerCount - 1]]], 0, 0.6f, 0.6f);
}
}
void func_800A3A10(s8* arg0) {
s32 temp_a3;
s32 temp_t1;
s32 var_a1;
s32 var_v0;
UNUSED s32 thing1;
UNUSED s8* new_var;
for (var_v0 = 0; var_v0 < 8; var_v0++) {
arg0[var_v0] = var_v0;
for (var_a1 = var_v0; var_a1 > 0; var_a1--) {
new_var = &arg0[var_a1];
temp_a3 = arg0[var_a1 - 1];
thing1 = gGPPointsByCharacterId[temp_a3];
temp_t1 = arg0[var_a1];
if (gGPPointsByCharacterId[temp_a3] < gGPPointsByCharacterId[temp_t1]) {
arg0[var_a1] = temp_a3;
arg0[var_a1 - 1] = temp_t1;
} else if (gGPPointsByCharacterId[temp_t1] == gGPPointsByCharacterId[temp_a3]) {
if ((D_80164478[temp_t1] < gPlayerCount) && (D_80164478[temp_t1] < D_80164478[temp_a3])) {
arg0[var_a1] = temp_a3;
arg0[var_a1 - 1] = temp_t1;
} else {
break;
}
} else {
break;
}
}
}
}
void func_800A3ADC(MenuItem* arg0, s32 arg1, s32 arg2, s32 characterId, s32 arg4, s8* arg5) {
UNUSED s32 stackPadding0;
s32 wut;
char sp34[4];
s32 phi_v1;
if (arg0->state < 9) {
convert_number_to_ascii(arg4 + 1, sp34);
} else {
for (phi_v1 = arg4; phi_v1 > 0; phi_v1--) {
wut = phi_v1 - 1;
if (gGPPointsByCharacterId[arg5[phi_v1]] != gGPPointsByCharacterId[arg5[wut]]) {
break;
}
}
convert_number_to_ascii(phi_v1 + 1, sp34);
}
sp34[2] = '.';
sp34[3] = '\0';
func_800939C8(arg1, arg2, &sp34[1], -4, 0.7f, 0.7f);
print_text_mode_1(arg1 + 0xA, arg2, D_800E76A8[characterId], 0, 0.7f, 0.7f);
convert_number_to_ascii(gGPPointsByCharacterId[characterId], sp34);
func_800939C8(arg1 + 0x47, arg2, sp34, 0, 0.7f, 0.7f);
if ((arg4 < ARRAY_COUNT(gGPPointRewards)) && (arg0->state < 9)) {
convert_number_to_ascii(sGPPointsCopy[arg4], sp34);
sp34[0] = '+';
print_text_mode_1(arg1 + 0x5A, arg2, sp34, 0, 0.7f, 0.7f);
}
}
void time_trials_finish_text_render(MenuItem* arg0) {
s32 recordType;
s32 rowOffset;
// name of the course
set_text_color(TEXT_BLUE_GREEN_RED_CYCLE_1);
print_text1_center_mode_1(arg0->column + 0x43, arg0->row + 0x19,
gCourseNamesDup[gCupCourseOrder[gCupSelection][gCourseIndexInCup]], 0, 0.6f, 0.6f);
// lap time text
set_text_color(TEXT_YELLOW);
print_text1_center_mode_1(arg0->column + 0x46, arg0->row + 0x28, gLapTimeText, 0, 0.75f, 0.75f);
// lap time
for (recordType = 0, rowOffset = 0; recordType < TIME_TRIAL_3LAP_RECORD_5; recordType += 1, rowOffset += 0xF) {
render_lap_time(recordType, arg0->column + 0x17, arg0->row + rowOffset + 0x37);
}
// best record text
set_text_color(TEXT_YELLOW);
print_text_mode_1(0xB4 - arg0->column, arg0->row + 0x86, gBestTimeText[0], 0, 0.75f, 0.75f);
// best record
for (recordType = 0, rowOffset = 0; recordType < TIME_TRIAL_1LAP_RECORD; recordType += 1, rowOffset += 0xD) {
set_text_color(TEXT_RED);
render_lap_times(recordType, 0xAA - arg0->column, arg0->row + rowOffset + 0x92);
}
set_text_color(TEXT_YELLOW);
print_text_mode_1(0xB4 - arg0->column, arg0->row + 0xD5, gBestTimeText[1], 0, 0.75f, 0.75f);
render_lap_times(TIME_TRIAL_1LAP_RECORD, 0xAA - arg0->column, arg0->row + 0xE1);
}
void func_800A3E60(MenuItem* arg0) {
UNUSED s32 stackPadding0;
Unk_D_800E70A0 sp84;
UNUSED s32 stackPadding1;
UNUSED s32 stackPadding2;
UNUSED s32 stackPadding3;
UNUSED s32 stackPadding4;
s32 var_v0;
s32 var_v1;
s32 var_s1;
Unk_D_800E70A0* var_v0_5;
char sp60[3];
var_v0 = arg0->state;
if (var_v0 == 0) {
return;
}
if (var_v0 == 0x0000001F) {
return;
}
set_text_color(TEXT_BLUE_GREEN_RED_CYCLE_1);
print_text1_center_mode_1(arg0->column + 0x55, 0x19 - arg0->row,
gCourseNamesDup[gCupCourseOrder[gCupSelection][gCourseIndexInCup]], 0, 0.6f, 0.6f);
set_text_color(TEXT_YELLOW);
print_text1_center_mode_1(arg0->column + 0x55, 0x28 - arg0->row, gLapTimeText, 0, 0.75f, 0.75f);
for (var_s1 = 0; var_s1 < 4; var_s1++) {
render_lap_time(var_s1, arg0->column + 0x26, ((0xF * var_s1) - arg0->row) + 0x37);
}
switch (arg0->state) { /* switch 1 */
case 1: /* switch 1 */
case 5: /* switch 1 */
case 6: /* switch 1 */
case 7: /* switch 1 */
case 8: /* switch 1 */
case 9: /* switch 1 */
case 10: /* switch 1 */
case 30: /* switch 1 */
for (var_s1 = 0; var_s1 < 6; var_s1++) {
var_v1 = 0;
text_rainbow_effect(arg0->state - 5, var_s1, 1);
switch (var_s1) { /* switch 3; irregular */
case 4: /* switch 3 */
if (D_80162DF8 == 1) {
var_v1 = 1;
}
break;
case 5: /* switch 3 */
if (D_80162DD4 != 0) {
var_v1 = 2;
}
break;
}
if (var_v1 != 0) {
set_text_color(TEXT_BLUE);
gDPSetPrimColor(gDisplayListHead++, 0, 0, 0x00, 0x00, 0x00, 0x96);
print_text_mode_2(0xB2 - arg0->column, arg0->row + (0xD * var_s1) + 0x93,
gTextPauseButton[var_s1 + 1], 0, 0.75f, 0.75f);
} else {
print_text_mode_1(0xB2 - arg0->column, arg0->row + (0xD * var_s1) + 0x93,
gTextPauseButton[var_s1 + 1], 0, 0.75f, 0.75f);
}
}
break;
case 11: /* switch 1 */
case 12: /* switch 1 */
case 13: /* switch 1 */
case 14: /* switch 1 */
case 15: /* switch 1 */
case 16: /* switch 1 */
set_text_color(TEXT_YELLOW);
var_v1 = arg0->state - 11;
for (var_s1 = 0; var_s1 < 7; var_s1++) {
print_text_mode_1(0x000000A2, 0x8C + (0xD * var_s1), D_800E798C[(var_v1 * 7) + var_s1], 0, 0.6f, 0.6f);
}
break;
case 17: /* switch 1 */
case 18: /* switch 1 */
set_text_color(TEXT_GREEN);
for (var_s1 = 0; var_s1 < 2; var_s1++) {
print_text_mode_1(0x000000A5, arg0->row + (0xD * var_s1) + 0x8C, D_800E7A3C[var_s1], 0, 0.7f, 0.7f);
}
for (var_s1 = 0; var_s1 < 2; var_s1++) {
text_rainbow_effect(arg0->state - 0x11, var_s1, 1);
convert_number_to_ascii(var_s1 + 1, sp60);
print_text_mode_1(0xB1 - arg0->column, 0xAA + (0x1E * var_s1), &sp60[1], 0, 0.6f, 0.6f);
if (D_8018EE10[var_s1].ghostDataSaved == 0) {
print_text_mode_1(0xBB - arg0->column, 0xAA + (0x1E * var_s1), D_800E7A44, 0, 0.45f, 0.45f);
} else {
print_text_mode_1(0xBB - arg0->column, 0xAA + (0x1E * var_s1),
gCourseNamesDup2[gCupCourseOrder[D_8018EE10[var_s1].courseIndex / 4]
[D_8018EE10[var_s1].courseIndex % 4]],
0, 0.45f, 0.45f);
}
}
break;
case 19: /* switch 1 */
set_text_color(TEXT_YELLOW);
for (var_s1 = 0; var_s1 < 3; var_s1++) {
print_text_mode_1(0x000000AA, (0xD * var_s1) + 0x93, D_800E7A48[var_s1], 0, 0.8f, 0.8f);
}
break;
case 20: /* switch 1 */
case 21: /* switch 1 */
if (var_s1 && var_s1) {}
set_text_color(TEXT_YELLOW);
for (var_s1 = 0; var_s1 < 3; var_s1++) {
print_text_mode_1(0x000000A3, arg0->row + (0xD * var_s1) + 0x8C, D_800E7A60[var_s1], 0, 0.67f, 0.67f);
}
for (var_s1 = 0; var_s1 < 2; var_s1++) {
text_rainbow_effect(arg0->state - 0x14, var_s1, 1);
print_text_mode_1(0xC8 - arg0->column, 0xB9 + (0xF * var_s1), D_800E7A6C[var_s1], 0, 0.75f, 0.75f);
}
break;
case 25: /* switch 1 */
set_text_color(TEXT_YELLOW);
for (var_s1 = 0; var_s1 < 3; var_s1++) {
print_text_mode_1(0x000000A3, (0xD * var_s1) + 0x93, D_800E7A74[var_s1], 0, 0.67f, 0.67f);
}
break;
case 26: /* switch 1 */
set_text_color(TEXT_YELLOW);
for (var_s1 = 0; var_s1 < 2; var_s1++) {
print_text_mode_1(0x000000AA, (0xD * var_s1) + 0x93, D_800E7A80[var_s1], 0, 0.75f, 0.75f);
}
break;
}
switch (arg0->state) { /* switch 2 */
case 5: /* switch 2 */
case 6: /* switch 2 */
case 7: /* switch 2 */
case 8: /* switch 2 */
case 9: /* switch 2 */
case 10: /* switch 2 */
var_v0_5 = &D_800E7390[arg0->state - 5];
break;
case 17: /* switch 2 */
case 18: /* switch 2 */
var_v0_5 = &D_800E73C0[arg0->state - 17];
break;
case 20: /* switch 2 */
case 21: /* switch 2 */
var_v0_5 = &D_800E73D0[arg0->state - 20];
break;
case 30: /* switch 2 */
var_v0_5 = &D_800E7390[arg0->param1 - 5];
break;
default:
return;
}
sp84.column = var_v0_5->column - arg0->column;
sp84.row = var_v0_5->row + arg0->row;
func_800A66A8(arg0, &sp84);
}
void render_lap_time(s32 lapNumber, s32 column, s32 row) {
UNUSED s32 stackPadding0;
s32 time;
UNUSED s32 stackPadding1;
s32 textColor;
char sp34[3];
MenuItem* temp_v0_2;
if (lapNumber < 3) {
time = playerHUD[PLAYER_ONE].lapDurations[lapNumber];
set_text_color(TEXT_RED);
} else {
time = playerHUD[PLAYER_ONE].someTimer;
set_text_color(TEXT_GREEN);
}
print_text1_left(column + 0x21, row, gPrefixTimeText[lapNumber], 0, 0.7f, 0.7f);
temp_v0_2 = find_menu_items_dupe(MENU_ITEM_TYPE_0BB);
if (lapNumber < 3) {
if (temp_v0_2->param2 & (1 << lapNumber)) { // best lap
textColor = (s32) gGlobalTimer % 3;
} else {
textColor = TEXT_YELLOW;
}
} else {
if (temp_v0_2->param1 >= 0) {
textColor = (s32) gGlobalTimer % 3;
} else {
textColor = TEXT_YELLOW;
}
}
set_text_color(textColor);
get_time_record_minutes(time, sp34);
func_800939C8(column + 0x2C, row, sp34, 0, 0.7f, 0.7f);
print_text_mode_1(column + 0x37, row, "'", 0, 0.7f, 0.7f);
get_time_record_seconds(time, sp34);
func_800939C8(column + 0x40, row, sp34, 0, 0.7f, 0.7f);
print_text_mode_1(column + 0x4B, row, "\"", 0, 0.7f, 0.7f);
get_time_record_centiseconds(time, sp34);
func_800939C8(column + 0x55, row, sp34, 0, 0.7f, 0.7f);
}
#ifdef NON_MATCHING
// https://decomp.me/scratch/mWCHC
// The majority of th diff is from the handling of `textColor`. There is something super fucky there.
// The permuter found a decent improvement with making `textColor` a `volatile` variable but that
// seems wrong for several reasons
void render_lap_times(s32 recordType, s32 column, s32 row) {
UNUSED s32 stackPadding0;
u32 timeRecord;
s32 textColor;
s32 temp_t0;
s32 characterId;
char sp38[3];
MenuItem* temp_v0;
s32 sp30;
if (gGamestate == 4) {
sp30 = 0;
} else {
sp30 = 1;
}
if (recordType < 5) {
if (sp30 == 0) {
timeRecord = func_800B4E24(recordType);
} else {
timeRecord = func_800B4EB4(recordType, gTimeTrialDataCourseIndex);
}
set_text_color(TEXT_GREEN);
} else {
if (sp30 == 0) {
timeRecord = func_800B4F2C();
} else {
timeRecord = func_800B4FB0(gTimeTrialDataCourseIndex);
}
}
func_800939C8(column + 0x14, row, D_800E7744[recordType], 2, 0.65f, 0.65f);
if (sp30 == 0) {
temp_v0 = find_menu_items_dupe(MENU_ITEM_TYPE_0BB);
if (recordType < 5) {
if (recordType == temp_v0->param1) {
textColor = gGlobalTimer % 3;
} else {
textColor = TEXT_YELLOW;
}
} else {
// huh?
textColor = TEXT_YELLOW;
if (temp_v0->param2 != 0) {
textColor = gGlobalTimer;
textColor %= 3;
} else {
}
}
} else {
textColor = TEXT_YELLOW;
}
set_text_color(textColor);
temp_t0 = timeRecord & 0xFFFFF;
get_time_record_minutes(temp_t0, sp38);
func_800939C8(column + 0x27, row, sp38, 0, 0.65f, 0.65f);
print_text_mode_1(column + 0x32, row, "'", 0, 0.65f, 0.65f);
if (!textColor) {}
get_time_record_seconds(temp_t0, sp38);
func_800939C8(column + 0x3B, row, sp38, 0, 0.65f, 0.65f);
print_text_mode_1(column + 0x46, row, "\"", 0, 0.65f, 0.65f);
get_time_record_centiseconds(temp_t0, sp38);
func_800939C8(column + 0x50, row, sp38, 0, 0.65f, 0.65f);
if (temp_t0 < 0x927C0) {
characterId = timeRecord >> 0x14;
} else {
characterId = 8;
}
print_text1_center_mode_1(column + 0x78, row, D_800E76A8[characterId], 0, 0.65f, 0.65f);
}
#else
GLOBAL_ASM("asm/non_matchings/menu_items/render_lap_times.s")
#endif
void render_menu_item_announce_ghost(MenuItem* arg0) {
UNUSED s32 stackPadding0;
s32 temp_t0;
s32 temp_t1;
s32 temp_t2;
f32 someMultiplier = 0.85f;
s32 thing = 24.0f * someMultiplier;
temp_t0 = 0x140 - arg0->column;
temp_t1 = arg0->row;
temp_t2 = (s32) ((get_string_width(gTextMenuAnnounceGhost) + 8) * someMultiplier) / 2;
gDisplayListHead = draw_box(gDisplayListHead, temp_t0 - temp_t2, (temp_t1 - thing) + 4, temp_t2 + temp_t0,
temp_t1 + 4, 0, 0, 0, 0x00000064);
set_text_color(TEXT_BLUE_GREEN_RED_CYCLE_1);
print_text1_center_mode_1(arg0->column - 3, arg0->row, gTextMenuAnnounceGhost, 0, 0.85f, 0.85f);
}
void render_pause_menu(MenuItem* arg0) {
if (gIsGamePaused != 0) {
switch (gModeSelection) {
case TIME_TRIALS:
render_pause_menu_time_trials(arg0);
break;
case VERSUS:
render_pause_menu_versus(arg0);
break;
case GRAND_PRIX:
render_pause_grand_prix(arg0);
break;
case BATTLE:
render_pause_battle(arg0);
break;
}
}
}
void render_pause_menu_time_trials(MenuItem* arg0) {
UNUSED s32 stackPadding0;
UNUSED s32 stackPadding1;
UNUSED s32 stackPadding2;
char sp68[3];
s32 temp_a0;
s32 var_s0;
s32 zero = 0; // ?
gDisplayListHead = draw_box(gDisplayListHead, 0, 0, 0x0000013F, 0x000000EF, 0, 0, 0, 0x0000008C);
set_text_color(TEXT_YELLOW);
print_text1_center_mode_1(0x000000A0, 0x00000050,
gCourseNamesDup[gCupCourseOrder[gCupSelection][gCourseIndexInCup]], 0, 1.0f, 1.0f);
set_text_color(TEXT_RED);
print_text1_center_mode_1(0x0000009D, 0x00000060, gBestTimeText[0], 0, 0.8f, 0.8f);
temp_a0 = func_800B4E24(TIME_TRIAL_3LAP_RECORD_1);
temp_a0 &= 0xFFFFF;
get_time_record_minutes(temp_a0, sp68);
func_800939C8(0x0000007F, 0x0000006D, sp68, 0, 0.8f, 0.8f);
print_text_mode_1(0x0000008E, 0x0000006D, "'", 0, 0.8f, 0.8f);
get_time_record_seconds(temp_a0, sp68);
func_800939C8(0x00000098, 0x0000006D, sp68, 0, 0.8f, 0.8f);
print_text_mode_1(0x000000A7, 0x0000006D, "\"", 0, 0.8f, 0.8f);
get_time_record_centiseconds(temp_a0, sp68);
func_800939C8(0x000000B3, 0x0000006D, sp68, 0, 0.8f, 0.8f);
print_text1_center_mode_1(0x0000009D, 0x0000007C, gBestTimeText[1], 0, 0.8f, 0.8f);
temp_a0 = func_800B4F2C();
temp_a0 &= 0xFFFFF;
get_time_record_minutes(temp_a0, sp68);
func_800939C8(0x0000007F, 0x00000089, sp68, 0, 0.8f, 0.8f);
print_text_mode_1(0x0000008E, 0x00000089, "'", 0, 0.8f, 0.8f);
get_time_record_seconds(temp_a0, sp68);
func_800939C8(0x00000098, 0x00000089, sp68, 0, 0.8f, 0.8f);
print_text_mode_1(0x000000A7, 0x00000089, "\"", 0, 0.8f, 0.8f);
get_time_record_centiseconds(temp_a0, sp68);
func_800939C8(0x000000B3, 0x00000089, sp68, 0, 0.8f, 0.8f);
for (var_s0 = 0; var_s0 < 5; var_s0++) {
text_rainbow_effect(arg0->state - 11, var_s0, TEXT_GREEN);
print_text_mode_1(D_800E8538[zero].column, D_800E8538[zero].row + (13 * var_s0), gTextPauseButton[var_s0], 0,
0.75f, 0.75f);
}
}
void render_pause_menu_versus(MenuItem* arg0) {
s16 temp_t0;
s16 temp_v1;
s32 temp_t3;
s32 temp_t4;
s32 var_s0;
s32 var_s1;
Unk_D_800E70A0* temp_s3;
struct UnkStruct_800DC5EC* temp_v0;
temp_v0 = &D_8015F480[gIsGamePaused - 1];
temp_v1 = temp_v0->screenStartX;
temp_t0 = temp_v0->screenStartY;
temp_t3 = temp_v0->screenWidth / 2;
temp_t4 = temp_v0->screenHeight / 2;
gDisplayListHead = draw_box(gDisplayListHead, temp_v1 - temp_t3, temp_t0 - temp_t4, temp_v1 + temp_t3,
temp_t0 + temp_t4, 0, 0, 0, 0x0000008C);
temp_s3 = &D_800E8540[(gScreenModeSelection * 4) + (gIsGamePaused - 1)];
for (var_s0 = 0; var_s0 < 4; var_s0++) {
if (var_s0 > 0) {
var_s1 = var_s0 + 1;
} else {
var_s1 = var_s0;
}
text_rainbow_effect(arg0->state - 0x15, var_s0, TEXT_YELLOW);
print_text_mode_1(temp_s3->column - 2, temp_s3->row + (13 * var_s0), gTextPauseButton[var_s1], 0, 0.75f, 0.75f);
}
}
void render_pause_grand_prix(MenuItem* arg0) {
s32 temp_t0;
s32 temp_v1;
s32 temp_s0;
s32 temp_s1;
s32 temp_t3;
s32 temp_t4;
s32 var_s0;
Unk_D_800E70A0* temp_s3;
struct UnkStruct_800DC5EC* temp_v0;
f32 one = 1.0f;
temp_v0 = &D_8015F480[gIsGamePaused - 1];
temp_v1 = temp_v0->screenStartX;
temp_t0 = temp_v0->screenStartY;
temp_t3 = temp_v0->screenWidth / 2;
temp_t4 = temp_v0->screenHeight / 2;
gDisplayListHead = draw_box(gDisplayListHead, temp_v1 - temp_t3, temp_t0 - temp_t4, temp_v1 + temp_t3,
temp_t0 + temp_t4, 0, 0, 0, 140);
temp_s3 = &D_800E85C0[(gScreenModeSelection * 4) + (gIsGamePaused - 1)];
temp_s0 = ((get_string_width(gCupNames[gCupSelection]) * one) + 10.0f) / 2;
temp_s1 = ((get_string_width(D_800E76CC[gCCSelection]) * one) + 10.0f) / 2;
set_text_color(TEXT_YELLOW);
print_text1_center_mode_1(160 - temp_s1, temp_s3->row - 50, gCupNames[gCupSelection], 0, 1.0f, 1.0f);
set_text_color(TEXT_YELLOW);
print_text1_center_mode_1(160 + temp_s0, temp_s3->row - 50, D_800E76CC[gCCSelection], 0, 1.0f, 1.0f);
set_text_color(TEXT_YELLOW);
print_text1_center_mode_1(160, temp_s3->row - 30,
gCourseNamesDup[gCupCourseOrder[gCupSelection][gCourseIndexInCup]], 0, 1.0f, 1.0f);
for (var_s0 = 0; var_s0 < 2; var_s0++) {
text_rainbow_effect(arg0->state - 31, var_s0, TEXT_YELLOW);
print_text_mode_1(temp_s3->column, temp_s3->row + (var_s0 * 13), gTextPauseButton[var_s0 * 4], 0, 0.75f, 0.75f);
}
}
void render_pause_battle(MenuItem* arg0) {
struct UnkStruct_800DC5EC* temp_v0;
s16 temp_t0;
s16 temp_v1;
s32 temp_t3;
s32 temp_t4;
s32 var_a1;
s32 var_s1;
Unk_D_800E70A0* temp_s3;
temp_v0 = &D_8015F480[gIsGamePaused - 1];
temp_v1 = temp_v0->screenStartX;
temp_t0 = temp_v0->screenStartY;
temp_t3 = temp_v0->screenWidth / 2;
temp_t4 = temp_v0->screenHeight / 2;
gDisplayListHead = draw_box(gDisplayListHead, temp_v1 - temp_t3, temp_t0 - temp_t4, temp_v1 + temp_t3,
temp_t0 + temp_t4, 0, 0, 0, 0x0000008C);
temp_s3 = &D_800E8600[(gScreenModeSelection * 4) + (gIsGamePaused - 1)];
for (var_a1 = 0; var_a1 < 4; var_a1++) {
if (var_a1 > 0) {
var_s1 = var_a1 + 1;
} else {
var_s1 = var_a1;
}
text_rainbow_effect(arg0->state - 0x29, var_a1, TEXT_YELLOW);
print_text_mode_1(temp_s3->column - 2, temp_s3->row + 13 * var_a1, gTextPauseButton[var_s1], 0, 0.75f, 0.75f);
}
}
void func_800A54EC(void) {
Unk_D_800E70A0 sp50;
Unk_D_800E70A0* var_v1;
MenuItem* sp48;
s32 whyTheSequel;
s32 why;
UNUSED Unk_D_800E70A0* huh;
if (gIsGamePaused == 0) {
return;
}
why = gModeSelection;
sp48 = find_menu_items(MENU_ITEM_PAUSE);
if (why) {} // ?????
gSPViewport(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(D_802B8880));
guOrtho(&gGfxPool->mtxEffect[gMatrixEffectCount], 0.0f, 319.0f, 239.0f, 0.0f, -100.0f, 100.0f, 1.0f);
gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxEffect[gMatrixEffectCount++]),
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION);
switch (why) { /* irregular */
default:
break;
case 1:
var_v1 = &D_800E8538[0];
break;
case 2:
var_v1 = &D_800E8540[(gScreenModeSelection * 4) + (gIsGamePaused - 1)];
break;
case 0:
var_v1 = &D_800E85C0[(gScreenModeSelection * 4) + (gIsGamePaused - 1)];
break;
case 3:
var_v1 = &D_800E8600[(gScreenModeSelection * 4) + (gIsGamePaused - 1)];
break;
}
whyTheSequel = D_800F0B50[why];
sp50.column = var_v1->column - 8;
sp50.row = (var_v1->row + ((sp48->state - whyTheSequel) * 0xD)) - 8;
func_800A66A8(sp48, &sp50);
}
void render_menu_item_end_course_option(MenuItem* arg0) {
Unk_D_800E70A0 sp98;
UNUSED s32 stackPadding0;
UNUSED s32 stackPadding1;
UNUSED s32 stackPadding2;
f32 why;
char sp84[3];
UNUSED s32 stackPadding3;
UNUSED s32 stackPadding4;
s32 temp_a0;
UNUSED s32 var_v1;
s32 var_s1;
s32 var_s2;
s32 temp_v0;
s32 zero = 0;
Unk_D_800E70A0* var_v0_9;
char sp5C[3];
if (arg0->state == 0) {
if ((arg0->param1 >= 0x1E) && ((gGlobalTimer / 16) % 2)) {
why = get_string_width(gTextPauseButton[REPLAY]) * 0.8f;
gDisplayListHead =
draw_box(gDisplayListHead, 0x000000C0, 0x00000021, (s32) (why) + 0xC6, 0x00000032, 0, 0, 0, 0x00000096);
set_text_color(TEXT_GREEN);
print_text_mode_1(0x000000BF, 0x00000030, gTextPauseButton[REPLAY], 0, 0.8f, 0.8f);
}
} else {
if (arg0->state == 1) {
var_s1 = arg0->param1;
var_s2 = (s32) (arg0->param1 * 0xFF) / 140;
} else {
var_s1 = 0x0000008C;
var_s2 = 0x000000FF;
}
gDisplayListHead = draw_box(gDisplayListHead, 0, 0, 0x0000013F, 0x000000EF, 0, 0, 0, var_s1);
gDPSetPrimColor(gDisplayListHead++, 0, 0, 0x00, 0x00, 0x00, var_s2);
set_text_color(TEXT_YELLOW);
print_text1_center_mode_2(0x000000A0, 0x00000050,
gCourseNamesDup[gCupCourseOrder[gCupSelection][gCourseIndexInCup]], 0, 1.0f, 1.0f);
switch (arg0->state) { /* switch 1 */
case 1: /* switch 1 */
case 11: /* switch 1 */
case 12: /* switch 1 */
case 13: /* switch 1 */
case 14: /* switch 1 */
case 15: /* switch 1 */
case 16: /* switch 1 */
set_text_color(TEXT_RED);
print_text1_center_mode_2(0x0000009D, 0x00000060, gBestTimeText[0], 0, 0.8f, 0.8f);
temp_a0 = func_800B4E24(0);
temp_a0 &= 0xFFFFF;
get_time_record_minutes(temp_a0, sp84);
text_draw(0x0000007F, 0x0000006D, sp84, 0, 0.8f, 0.8f);
print_text_mode_2(0x0000008E, 0x0000006D, "'", 0, 0.8f, 0.8f);
get_time_record_seconds(temp_a0, sp84);
text_draw(0x00000098, 0x0000006D, sp84, 0, 0.8f, 0.8f);
print_text_mode_2(0x000000A7, 0x0000006D, "\"", 0, 0.8f, 0.8f);
get_time_record_centiseconds(temp_a0, sp84);
text_draw(0x000000B3, 0x0000006D, sp84, 0, 0.8f, 0.8f);
print_text1_center_mode_2(0x0000009D, 0x0000007C, gBestTimeText[1], 0, 0.8f, 0.8f);
temp_a0 = func_800B4F2C();
temp_a0 &= 0xFFFFF;
get_time_record_minutes(temp_a0, sp84);
text_draw(0x0000007F, 0x00000089, sp84, 0, 0.8f, 0.8f);
print_text_mode_2(0x0000008E, 0x00000089, "'", 0, 0.8f, 0.8f);
get_time_record_seconds(temp_a0, sp84);
text_draw(0x00000098, 0x00000089, sp84, 0, 0.8f, 0.8f);
print_text_mode_2(0x000000A7, 0x00000089, "\"", 0, 0.8f, 0.8f);
get_time_record_centiseconds(temp_a0, sp84);
text_draw(0x000000B3, 0x00000089, sp84, 0, 0.8f, 0.8f);
for (var_s1 = 0; var_s1 < 6; var_s1++) {
text_rainbow_effect(arg0->state - 0xB, var_s1, TEXT_GREEN);
print_text_mode_2(D_800E8538[zero].column, D_800E8538[zero].row + (0xD * var_s1),
gTextPauseButton[var_s1 + 1], 0, 0.75f, 0.75f);
}
break;
case 21: /* switch 1 */
case 22: /* switch 1 */
case 23: /* switch 1 */
case 24: /* switch 1 */
case 25: /* switch 1 */
case 26: /* switch 1 */
set_text_color(TEXT_YELLOW);
temp_v0 = arg0->state - 0x15;
for (var_s1 = 0; var_s1 < 7; var_s1++) {
print_text_mode_1(0x0000004D, 0x6E + (0xD * var_s1), D_800E798C[(temp_v0 * 7) + var_s1], 0, 0.8f,
0.8f);
}
break;
case 30: /* switch 1 */
case 31: /* switch 1 */
set_text_color(TEXT_GREEN);
for (var_s1 = 0; var_s1 < 2; var_s1++) {
print_text_mode_1(0x0000005A, arg0->row + (0xD * var_s1) + 0x6E, D_800E7A3C[var_s1], 0, 0.8f, 0.8f);
}
for (var_s1 = 0; var_s1 < 2; var_s1++) {
text_rainbow_effect(arg0->state - 0x1E, var_s1, TEXT_GREEN);
convert_number_to_ascii(var_s1 + 1, sp5C);
print_text_mode_1(0x5A - arg0->column, (0x96 + (0x14 * var_s1)), &sp5C[1], 0, 0.75f, 0.75f);
if (D_8018EE10[var_s1].ghostDataSaved == 0) {
print_text_mode_1(0x69 - arg0->column, (0x96 + (0x14 * var_s1)), D_800E7A44, 0, 0.75f, 0.75f);
} else {
print_text_mode_1(0x69 - arg0->column, (0x96 + (0x14 * var_s1)),
gCourseNamesDup2[gCupCourseOrder[D_8018EE10[var_s1].courseIndex / 4]
[D_8018EE10[var_s1].courseIndex % 4]],
0, 0.75f, 0.75f);
}
}
break;
case 32: /* switch 1 */
set_text_color(TEXT_YELLOW);
for (var_s1 = 0; var_s1 < 3; var_s1++) {
print_text_mode_1(0x00000064, (0xD * var_s1) + 0x6E, D_800E7A48[var_s1], 0, 0.8f, 0.8f);
}
break;
case 35: /* switch 1 */
case 36: /* switch 1 */
set_text_color(TEXT_YELLOW);
for (var_s1 = 0; var_s1 < 3; var_s1++) {
print_text_mode_1(0x00000055, arg0->row + (0xD * var_s1) + 0x6E, D_800E7A60[var_s1], 0, 0.8f, 0.8f);
}
for (var_s1 = 0; var_s1 < 2; var_s1++) {
text_rainbow_effect(arg0->state - 0x23, var_s1, TEXT_GREEN);
print_text_mode_1(0x7D - arg0->column, 0x9B + (0xF * var_s1), D_800E7A6C[var_s1], 0, 0.8f, 0.8f);
}
break;
case 40: /* switch 1 */
set_text_color(TEXT_YELLOW);
for (var_s1 = 0; var_s1 < 3; var_s1++) {
print_text_mode_1(0x00000055, (0xD * var_s1) + 0x6E, D_800E7A74[var_s1], 0, 0.8f, 0.8f);
}
break;
case 41: /* switch 1 */
set_text_color(TEXT_YELLOW);
for (var_s1 = 0; var_s1 < 2; var_s1++) {
print_text_mode_1(0x0000005D, (0xD * var_s1) + 0x6E, D_800E7A80[var_s1], 0, 0.8f, 0.8f);
}
break;
}
switch (arg0->state) { /* switch 2 */
case 11: /* switch 2 */
case 12: /* switch 2 */
case 13: /* switch 2 */
case 14: /* switch 2 */
case 15: /* switch 2 */
case 16: /* switch 2 */
var_v0_9 = &D_800E73E0[arg0->state - 11];
break;
case 30: /* switch 2 */
case 31: /* switch 2 */
var_v0_9 = &D_800E7410[arg0->state - 30];
break;
case 35: /* switch 2 */
case 36: /* switch 2 */
if (0) {} // wtf?
var_v0_9 = &D_800E7420[arg0->state - 35];
break;
default:
return;
}
sp98.column = var_v0_9->column;
sp98.row = var_v0_9->row;
func_800A66A8(arg0, &sp98);
}
}
void func_800A6034(MenuItem* arg0) {
char* text;
if (D_801657E8 != true) {
gDPSetPrimColor(gDisplayListHead++, 0, 0, 0x00, 0x00, 0x00, arg0->param1);
text = gCupNames[D_800DC540];
set_text_color(TEXT_BLUE_GREEN_RED_CYCLE_2);
print_text1_center_mode_2(arg0->column + 0x41, arg0->row + 0xA0, text, 0, 0.85f, 1.0f);
text = gCourseNames[gCurrentCourseId];
set_text_color((s32) gCurrentCourseId % 4);
print_text1_center_mode_2(arg0->column + 0x41, arg0->row + 0xC3, text, 0, 0.65f, 0.85f);
}
}
void func_800A6154(MenuItem* arg0) {
UNUSED s32 stackPadding0;
UNUSED s32 stackPadding1;
UNUSED s32 stackPadding2;
Unk_D_800E70A0 sp6C;
UNUSED s32 stackPadding3;
s32 var_s0;
s32 var_s1;
if (arg0->state == 0) {
gDisplayListHead = draw_box(gDisplayListHead, 0, 0, 0x0000013F, 0x000000EF, 0, 0, 0, arg0->param1);
set_text_color(TEXT_YELLOW);
gDPSetPrimColor(gDisplayListHead++, 0, 0, 0x00, 0x00, 0x00, (arg0->param1 * 0xFF) / 100);
for (var_s1 = 0, var_s0 = 0x96; var_s0 < 0xBE; var_s1++, var_s0 += 0x14) {
print_text_mode_2(0x0000008C, var_s0, gTextPauseButton[(var_s1 * 3) + 1], 0, 1.0f, 1.0f);
}
} else {
gDisplayListHead = draw_box(gDisplayListHead, 0, 0, 0x0000013F, 0x000000EF, 0, 0, 0, 0x00000064);
for (var_s1 = 0, var_s0 = 0x96; var_s1 < 2; var_s1++, var_s0 += 0x14) {
text_rainbow_effect(arg0->state - 0xB, var_s1, TEXT_YELLOW);
print_text_mode_1(0x0000008C, var_s0, gTextPauseButton[(var_s1 * 3) + 1], 0, 1.0f, 1.0f);
}
}
if (arg0->state >= 0xB) {
sp6C.column = 0x0084;
sp6C.row = (arg0->state * 0x14) - 0x4E;
func_800A66A8(arg0, &sp6C);
}
if (arg0->param2 > 0) {
gDisplayListHead = func_80098FC8(gDisplayListHead, 0, 0, 0x0000013F, arg0->param2);
gDisplayListHead = func_80098FC8(gDisplayListHead, 0, 0xEF - arg0->param2, 0x0000013F, 0x000000EF);
}
}
void func_800A638C(MenuItem* arg0) {
UNUSED s32 temp_a0;
s32 var_a1;
UNUSED s32 var_s0;
s32 var_s1;
UNUSED s8** var_s2;
if (arg0->state == 0) {
gDisplayListHead = draw_box(gDisplayListHead, 0, 0, 0x0000013F, 0x000000EF, 0, 0, 0, arg0->param1);
set_text_color(TEXT_BLUE_GREEN_RED_CYCLE_2);
gDPSetPrimColor(gDisplayListHead++, 0, 0, 0x00, 0x00, 0x00, (arg0->param1 * 0xFF) / 100);
print_text1_center_mode_2(0x000000A0, arg0->row + 0x1E, D_800E7778[gModeSelection / 3], 0, 1.0f, 1.0f);
} else {
gDisplayListHead = draw_box(gDisplayListHead, 0, 0, 0x0000013F, 0x000000EF, 0, 0, 0, 0x00000064);
set_text_color(TEXT_BLUE_GREEN_RED_CYCLE_2);
print_text1_center_mode_1(0x000000A0, arg0->row + 0x1E, D_800E7778[gModeSelection / 3], 0, 1.0f, 1.0f);
}
switch (arg0->state) { /* irregular */
default:
var_a1 = 0x000000FF;
break;
case 0:
case 1:
var_a1 = 0;
break;
case 2:
var_a1 = arg0->param1;
break;
}
gDPSetPrimColor(gDisplayListHead++, 0, 0, 0x00, 0x00, 0x00, var_a1);
switch (gPlayerCount) {
case 2:
func_800A69C8(arg0);
break;
case 3:
func_800A6BEC(arg0);
break;
case 4:
func_800A6CC0(arg0);
break;
default:
break;
}
if (arg0->state >= 10) {
for (var_s1 = 0; var_s1 < 4; var_s1++) {
text_rainbow_effect(arg0->state - 0xA, var_s1, TEXT_GREEN);
print_text_mode_1(0x00000069, 0xAE + (0xF * var_s1), gTextPauseButton[var_s1 + 1], 0, 0.8f, 0.8f);
}
func_800A66A8(arg0, &D_800E7360[arg0->state - 10]);
}
}
void func_800A66A8(MenuItem* arg0, Unk_D_800E70A0* arg1) {
Mtx* mtx;
f32 tmp;
static float x2, y2, z2;
static float x1, y1, z1;
mtx = &gGfxPool->mtxEffect[gMatrixEffectCount];
if (arg0->paramf > 1.5) {
arg0->paramf *= 0.95;
} else {
arg0->paramf = 1.5;
}
tmp = arg0->paramf;
x1 = (tmp * 3) * arg0->subState;
y1 = tmp * 4;
z1 = tmp * 2;
x2 += x1;
y2 += y1;
z2 += z1;
// clang-format off
if (x2) {}; if (y2) {}; if (z2) {};
// clang-format on
guScale(mtx, 1.2f, 1.2f, 1.2f);
guRotate(mtx + 1, y2, 0.0f, 1.0f, 0.0f);
guMtxCatL(mtx, mtx + 1, mtx);
guRotate(mtx + 1, z2, 0.0f, 0.0f, 1.0f);
guMtxCatL(mtx, mtx + 1, mtx);
guRotate(mtx + 1, x2, 1.0f, 0.0f, 0.0f);
guMtxCatL(mtx, mtx + 1, mtx);
guTranslate(mtx + 1, arg1->column, arg1->row, 0.0f);
guMtxCatL(mtx, mtx + 1, mtx);
gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxEffect[gMatrixEffectCount++]),
(G_MTX_NOPUSH | G_MTX_LOAD) | G_MTX_MODELVIEW);
gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING);
gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIA, G_CC_MODULATEIA);
gDPNoOp(gDisplayListHead++);
gDPSetRenderMode(gDisplayListHead++, G_RM_CLD_SURF, G_RM_CLD_SURF2);
gSPDisplayList(gDisplayListHead++, D_0D003090);
}
void func_800A69C8(UNUSED MenuItem* arg0) {
Unk_D_800E70A0* thing;
UNUSED s32 stackPadding1;
s32 var_s0;
char sp74[5];
s32 var_v1;
char* temp_s3;
u8* var_s4;
for (var_s0 = 0; var_s0 < gPlayerCount; var_s0++) {
var_v1 = 0;
thing = &D_800E7300[var_s0];
switch (gModeSelection) { /* irregular */
case VERSUS:
if (gGPCurrentRaceRankByPlayerId[var_s0] != 0) {
var_v1 = 1;
}
var_s4 = &gNmiUnknown1[var_s0];
break;
case BATTLE:
if (var_s0 != gPlayerWinningIndex) {
var_v1 = 1;
}
var_s4 = &gNmiUnknown4[var_s0];
break;
}
temp_s3 = gWinLoseText[var_v1];
if (var_v1 != 0) {
set_text_color(TEXT_BLUE);
} else {
set_text_color((s32) gGlobalTimer % 3);
}
func_800A79F4(var_s4[0], sp74);
text_draw(thing->column + 0x10, thing->row + 0x75, sp74, 0, 1.0f, 1.0f);
print_text1_center_mode_2(D_800E7380[var_s0].column, D_800E7380[var_s0].row, temp_s3, 0, 0.65f, 1.0f);
}
set_text_color(TEXT_BLUE);
// Not a hyphen, that is an EUC-JP character
text_draw(0x0000009E, D_800E7300[0].row + 0x6D, "ー", 0, 1.0f, 1.0f);
}
void func_800A6BEC(UNUSED MenuItem* arg0) {
s32 var_s0;
for (var_s0 = 0; var_s0 < gPlayerCount; var_s0++) {
switch (gModeSelection) { /* irregular */
case VERSUS:
func_800A6E94(3, var_s0, gNmiUnknown2);
break;
case BATTLE:
func_800A6D94(3, var_s0, gNmiUnknown5);
break;
}
}
}
void func_800A6CC0(UNUSED MenuItem* arg0) {
s32 var_s0;
for (var_s0 = 0; var_s0 < gPlayerCount; var_s0++) {
switch (gModeSelection) { /* irregular */
case VERSUS:
func_800A6E94(4, var_s0, gNmiUnknown3);
break;
case BATTLE:
func_800A6D94(4, var_s0, gNmiUnknown6);
break;
}
}
}
void func_800A6D94(s32 arg0, s32 arg1, u8* arg2) {
UNUSED s32 stackPadding0;
Unk_D_800E70A0* stackPadding1;
char sp30[5];
s32 var_v0;
f32 otherThing;
s32 thing;
var_v0 = 0;
if (arg1 != gPlayerWinningIndex) {
var_v0 = 1;
}
thing = arg2[arg1];
if (var_v0 != 0) {
set_text_color(TEXT_BLUE);
} else {
set_text_color(gGlobalTimer % 3);
}
stackPadding1 = &D_800E7300[((arg0 - 2) * 4) + arg1];
func_800A79F4(thing, sp30);
otherThing = 0.75f;
text_draw((stackPadding1->column + 0x20) - ((32.0f * otherThing) / 2), stackPadding1->row + 0x75, sp30, 0, 0.75f,
0.75f);
}
// The s/n/r/ー are not ASCII characters, they're EUC-JP characters
void func_800A6E94(s32 arg0, s32 arg1, u8* arg2) {
UNUSED s32 stackPadding0;
u8* temp_v0;
Unk_D_800E70A0* temp_s0;
char sp40[3];
s32 rank;
// Everything about this variable is bizarre
s32 sp38 = -1;
temp_s0 = &D_800E7300[((arg0 - 2) * 4) + arg1];
rank = gGPCurrentRaceRankByPlayerId[arg1];
if (rank == ++sp38) {
set_text_color(gGlobalTimer % 3);
} else {
set_text_color(TEXT_YELLOW);
}
text_draw(temp_s0->column + 4, temp_s0->row + 0x5A, "1 s ー", 0, 0.8f, 0.8f);
temp_v0 = arg2 + (arg1 * 3);
convert_number_to_ascii(temp_v0[0], sp40);
text_draw(temp_s0->column + 0x2D, temp_s0->row + 0x5A, sp40, 0, 0.8f, 0.8f);
if (rank == ++sp38) {
set_text_color(gGlobalTimer % 3);
} else {
set_text_color(TEXT_BLUE);
}
text_draw(temp_s0->column + 4, temp_s0->row + 0x69, "2 n ー", 0, 0.8f, 0.8f);
convert_number_to_ascii(temp_v0[1], sp40);
text_draw(temp_s0->column + 0x2D, temp_s0->row + 0x69, sp40, 0, 0.8f, 0.8f);
if (++sp38 == rank) {
set_text_color(gGlobalTimer % 3);
} else {
set_text_color(TEXT_RED);
}
text_draw(temp_s0->column + 4, temp_s0->row + 0x78, "3 r ー", 0, 0.8f, 0.8f);
convert_number_to_ascii(temp_v0[2], sp40);
text_draw(temp_s0->column + 0x2D, temp_s0->row + 0x78, sp40, 0, 0.8f, 0.8f);
}
void func_800A70E8(MenuItem* arg0) {
s32 var_s0;
s32 temp_f6;
s32 alpha;
s32 loopIndex;
s32 stringIndex;
if (arg0->state == 1) {
var_s0 = get_string_width(D_800E7A34[0]) * 0.45f;
temp_f6 = get_string_width(D_800E7A34[1]) * 0.45f;
if (var_s0 < temp_f6) {
var_s0 = temp_f6;
}
gDisplayListHead =
draw_box(gDisplayListHead, 0x000000C0, 0x00000022, var_s0 + 0xC6, 0x00000039, 0, 0, 0, 0x00000096);
alpha = 0x180 - ((arg0->param1 % 32) * 8);
if (alpha >= 0x100) {
alpha = 0xFF;
}
gDPSetPrimColor(gDisplayListHead++, 0, 0, 0x00, 0x00, 0x00, alpha);
set_text_color(TEXT_RED);
for (loopIndex = 0x2C, stringIndex = 0; loopIndex < 0x40; loopIndex += 0xA, stringIndex++) {
print_text_mode_2(0x000000C0, loopIndex, D_800E7A34[stringIndex], 0, 0.45f, 0.45f);
}
}
}
// Shading layer of the grand prix podium result screen
void func_800A7258(MenuItem* arg0) {
if (arg0->state == 0) {
// If shading layer is fading in
gDisplayListHead = draw_box(gDisplayListHead, 0, 0, 0x13F, 0xEF, 0, 0, 0, arg0->param1);
} else {
// All other stages of the podium scene
gDisplayListHead = draw_box(gDisplayListHead, 0, 0, 0x13F, 0xEF, 0, 0, 0, 0x64);
}
}
// Podium scene, top line
void func_800A72FC(MenuItem* arg0) {
UNUSED s32 pad;
s32 cupNameLength = (((f32) get_string_width(gCupNames[gCupSelection]) * 1) + 10) / 2;
s32 ccNameLength = (((f32) get_string_width(D_800E76CC[gCCSelection]) * 1) + 10) / 2;
set_text_color(TEXT_YELLOW);
print_text1_center_mode_1(arg0->column - ccNameLength, arg0->row, gCupNames[gCupSelection], 0, 1, 1);
set_text_color(TEXT_YELLOW);
print_text1_center_mode_1(arg0->column + cupNameLength, arg0->row, D_800E76DC[gCCSelection], 0, 1, 1);
}
void func_800A7448(MenuItem* arg0) {
UNUSED s32 pad;
s32 sp40;
s32 sp3C;
s32 thing = D_802874D8.unk1D;
if (thing >= 3) {
set_text_color(TEXT_YELLOW);
print_text1_center_mode_1(arg0->column, arg0->row, D_800E7A98, 0, 0.75f, 0.75f);
} else {
sp40 = (s32) (((f32) (get_string_width(D_800E7A88[0]) + 5) * 0.75f) / 2);
sp3C = (s32) (((f32) (get_string_width(D_800E7A88[thing + 1]) + 5) * 0.75f) / 2);
set_text_color(TEXT_YELLOW);
print_text1_center_mode_1(arg0->column - sp3C, arg0->row, D_800E7A88[0], 0, 0.75f, 0.75f);
set_text_color(TEXT_YELLOW);
print_text1_center_mode_1(arg0->column + sp40, arg0->row, D_800E7A88[thing + 1], 0, 0.75f, 0.75f);
}
}
void func_800A75A0(MenuItem* arg0) {
UNUSED s32 pad;
s32 topThree;
if (D_802874D8.unk1D < 3) {
topThree = 0;
} else {
topThree = 1;
}
set_text_color(TEXT_BLUE_GREEN_RED_CYCLE_1);
print_text1_center_mode_1(arg0->column, arg0->row, D_800E7A9C[topThree], 0, 1.3f, 1.3f);
}
void func_800A761C(MenuItem* arg0) {
UNUSED s32 stackPadding0;
s32 sp48;
s32 sp44;
UNUSED s32 stackPadding1;
char sp3C[3];
s32 temp_a0;
temp_a0 = D_802874D8.unk1D + 1;
func_800A79F4(temp_a0, sp3C);
sp48 = ((get_string_width(gPlaceText[0]) + 5) * 1.2f) / 2;
sp44 = ((get_string_width(gPlaceText[temp_a0]) + 5) * 1.2f) / 2;
set_text_color(TEXT_BLUE_GREEN_RED_CYCLE_2);
print_text1_center_mode_1(arg0->column - sp44, arg0->row, gPlaceText[0], 0, 1.2f, 1.2f);
set_text_color((s32) gGlobalTimer % 3);
print_text1_center_mode_1(arg0->column + sp48, arg0->row, gPlaceText[temp_a0], 0, 1.2f, 1.2f);
convert_number_to_ascii(temp_a0, sp3C);
func_800939C8((arg0->column + sp48) - 0x18, arg0->row, &sp3C[1], 0, 2.0f, 2.0f);
}
void menu_item_credits_render(MenuItem* arg0) {
f32 someScaling;
s32 creditIndex;
s8 slideDirection;
UNUSED s32 pad;
creditIndex = arg0->type - 0x190;
set_text_color(gCreditsTextRenderInfo[creditIndex].textColor);
slideDirection = gCreditsTextRenderInfo[creditIndex].slideDirection;
if ((slideDirection == SLIDE_RIGHT) || (slideDirection != SLIDE_LEFT)) {
someScaling = gCreditsTextRenderInfo[creditIndex].textScaling;
print_text1_left(arg0->column, arg0->row, gCreditsText[creditIndex], arg0->param1 * someScaling,
arg0->paramf * someScaling, someScaling);
} else {
someScaling = gCreditsTextRenderInfo[creditIndex].textScaling;
print_text_mode_1(arg0->column, arg0->row, gCreditsText[creditIndex], arg0->param1 * someScaling,
arg0->paramf * someScaling, someScaling);
}
}
// Originally func_800A7894
// Presumes that "number" is a 2 digit number. Convert it to a string
void convert_number_to_ascii(s32 number, char* buffer) {
buffer[0] = (number / 0xA) + 0x30;
buffer[1] = (number % 0xA) + 0x30;
// Terminator
buffer[2] = 0;
}
// Originally func_800A78E0
// MK 64 doesn't show more then 2 digits for any given time
// (minute, second, centisecond)
// So, if timeRecord is greater than 10 minutes, just use '-'s
void write_dashes(char* buffer) {
buffer[0] = 0x2D;
buffer[1] = 0x2D;
buffer[2] = '\0';
}
// Originally func_800A78F4
// timeRecord is assumed to be measured in centiseconds
void get_time_record_minutes(s32 timeRecord, char* buffer) {
// If timeRecord is greater than 100 minutes, put '-'
// in buffer
if (timeRecord >= MAX_TIME) {
write_dashes(buffer);
return;
}
convert_number_to_ascii(timeRecord / 0x1770, buffer);
}
// Originally func_800A7944
// timeRecord is assumed to be measured in centiseconds
void get_time_record_seconds(s32 timeRecord, char* buffer) {
// If timeRecord is greater than 100 minutes, put '-'
// in buffer
if (timeRecord >= MAX_TIME) {
write_dashes(buffer);
return;
}
convert_number_to_ascii((timeRecord / 0x64) % 0x3C, buffer);
}
// Originally func_800A79A4
// timeRecord is assumed to be measured in centiseconds
void get_time_record_centiseconds(s32 timeRecord, char* buffer) {
// If timeRecord is greater than 100 minutes, put '-'
// in buffer
if (timeRecord >= MAX_TIME) {
write_dashes(buffer);
return;
}
convert_number_to_ascii(timeRecord % 0x64, buffer);
}
// Converts a 2-digit number to EUC-JP by the looks of it
void func_800A79F4(s32 arg0, char* arg1) {
arg1[0] = 0xA3;
arg1[1] = (arg0 / 0xA) - 0x50;
arg1[2] = 0xA3;
arg1[3] = (arg0 % 0xA) - 0x50;
arg1[4] = '\0';
}
void handle_menus_with_pri_arg(s32 priSpecial) {
s32 j;
s32 isRendered;
s32 i;
s32 type;
MenuItem* entry;
for (i = 0; i < MENU_ITEMS_MAX; i++) {
isRendered = false;
entry = &gMenuItems[i];
type = entry->type;
if ((type == MENU_ITEM_UI_NO_CONTROLLER) || (type == MENU_ITEM_UI_START_RECORD_TIME) ||
(type == MENU_ITEM_PAUSE)) {
if (priSpecial != 0) {
isRendered = true;
}
} else if (priSpecial == 0) {
isRendered = true;
}
if (isRendered == false) {
continue;
}
switch (type) { /* switch 8; irregular */
case MENU_ITEM_UI_LOGO_INTRO: /* switch 8 */
if (sIntroModelTimer < 0x50) {
sIntroModelSpeed = 3.0f;
} else if (sIntroModelTimer < 0x5A) {
if (sIntroModelMotionSpeed < 1.0) {
sIntroModelMotionSpeed += 0.1;
}
sIntroModelSpeed += 0.1;
} else if (sIntroModelTimer < 0xA0) {
sIntroModelSpeed += 0.1;
} else if (sIntroModelTimer < 0x190) {
sIntroModelSpeed += 0.3;
}
gIntroModelRotY -= sIntroModelSpeed;
sIntroModelTimer += 1;
if (gIntroModelRotY < -360.0f) {
gIntroModelRotY += 360.0f;
}
entry->param1++;
if (entry->param1 == 0x000000B4) {
func_8009E000(0x00000028);
func_800CA388(0x64U);
gMenuFadeType = MENU_FADE_TYPE_MAIN;
}
if ((entry->param2 != 0) && (entry->param1 >= 3)) {
entry->param2 = 0;
play_sound2(SOUND_INTRO_LOGO);
}
break;
case MENU_ITEM_TYPE_0DA: /* switch 8 */
func_800A954C(entry);
break;
case MENU_ITEM_TYPE_0D6: /* switch 8 */
func_800A9710(entry);
break;
case MENU_ITEM_TYPE_0D4: /* switch 8 */
func_800A97BC(entry);
break;
case MENU_ITEM_UI_START_RECORD_TIME: /* switch 8 */
switch (entry->state) { /* switch 9; irregular */
case 0: /* switch 9 */
if (gControllerFive->button & R_TRIG) {
entry->state = (s32) 1U;
play_sound2(SOUND_ACTION_PING);
} else {
entry->visible = 0;
}
break;
case 1: /* switch 9 */
default: /* switch 9 */
entry->visible = 1;
break;
}
break;
case MENU_ITEM_UI_GAME_SELECT: /* switch 8 */
func_800AA280(entry);
break;
case MAIN_MENU_OPTION_GFX: /* switch 8 */
case MAIN_MENU_DATA_GFX: /* switch 8 */
switch (gMainMenuSelection) { /* switch 5 */
case MAIN_MENU_OPTION: /* switch 5 */
case MAIN_MENU_DATA: /* switch 5 */
case MAIN_MENU_PLAYER_SELECT: /* switch 5 */
func_800A9B9C(entry);
break;
case MAIN_MENU_MODE_SELECT: /* switch 5 */
case MAIN_MENU_MODE_SUB_SELECT: /* switch 5 */
case MAIN_MENU_OK_SELECT: /* switch 5 */
case MAIN_MENU_OK_SELECT_GO_BACK: /* switch 5 */
case MAIN_MENU_MODE_SUB_SELECT_GO_BACK: /* switch 5 */
func_800A9C40(entry);
break;
}
break;
case MENU_ITEM_UI_OK: /* switch 8 */
func_800AA280(entry);
update_ok_menu_item(entry);
break;
case MENU_ITEM_UI_1P_GAME: /* switch 8 */
case MENU_ITEM_UI_2P_GAME: /* switch 8 */
case MENU_ITEM_UI_3P_GAME: /* switch 8 */
case MENU_ITEM_UI_4P_GAME: /* switch 8 */
switch (gMainMenuSelection) { /* switch 6 */
case MAIN_MENU_OPTION: /* switch 6 */
case MAIN_MENU_DATA: /* switch 6 */
case MAIN_MENU_PLAYER_SELECT: /* switch 6 */
func_800A9B9C(entry);
break;
case MAIN_MENU_MODE_SELECT: /* switch 6 */
case MAIN_MENU_MODE_SUB_SELECT: /* switch 6 */
case MAIN_MENU_OK_SELECT: /* switch 6 */
case MAIN_MENU_OK_SELECT_GO_BACK: /* switch 6 */
case MAIN_MENU_MODE_SUB_SELECT_GO_BACK: /* switch 6 */
func_800A9C40(entry);
break;
}
func_800A9D5C(entry);
break;
case MAIN_MENU_50CC: /* switch 8 */
case MAIN_MENU_100CC: /* switch 8 */
case MAIN_MENU_150CC: /* switch 8 */
case MAIN_MENU_EXTRA_CC: /* switch 8 */
case MENU_ITEM_TYPE_016: /* switch 8 */
case MENU_ITEM_TYPE_017: /* switch 8 */
case MAIN_MENU_TIME_TRIALS_BEGIN: /* switch 8 */
case MAIN_MENU_TIME_TRIALS_DATA: /* switch 8 */
func_800A9E58(entry);
break;
case MENU_ITEM_TYPE_01B: /* switch 8 */
func_800AA2EC(entry);
break;
case CHARACTER_SELECT_MENU_1P_CURSOR: /* switch 8 */
case CHARACTER_SELECT_MENU_2P_CURSOR: /* switch 8 */
case CHARACTER_SELECT_MENU_3P_CURSOR: /* switch 8 */
case CHARACTER_SELECT_MENU_4P_CURSOR: /* switch 8 */
update_cursor(entry);
break;
case CHARACTER_SELECT_MENU_MARIO: /* switch 8 */
case CHARACTER_SELECT_MENU_LUIGI: /* switch 8 */
case CHARACTER_SELECT_MENU_TOAD: /* switch 8 */
case CHARACTER_SELECT_MENU_PEACH: /* switch 8 */
case CHARACTER_SELECT_MENU_YOSHI: /* switch 8 */
case CHARACTER_SELECT_MENU_DK: /* switch 8 */
case CHARACTER_SELECT_MENU_WARIO: /* switch 8 */
case CHARACTER_SELECT_MENU_BOWSER: /* switch 8 */
func_800AAC18(entry);
switch (entry->type) { /* switch 7 */
case CHARACTER_SELECT_MENU_MARIO: /* switch 7 */
case CHARACTER_SELECT_MENU_LUIGI: /* switch 7 */
case CHARACTER_SELECT_MENU_TOAD: /* switch 7 */
case CHARACTER_SELECT_MENU_PEACH: /* switch 7 */
case CHARACTER_SELECT_MENU_YOSHI: /* switch 7 */
case CHARACTER_SELECT_MENU_DK: /* switch 7 */
case CHARACTER_SELECT_MENU_WARIO: /* switch 7 */
case CHARACTER_SELECT_MENU_BOWSER: /* switch 7 */
func_800AA69C(entry);
break;
}
switch (gPlayerSelectMenuSelection) { /* switch 10; irregular */
case PLAYER_SELECT_MENU_MAIN: /* switch 10 */
func_800AAB90(entry);
break;
case PLAYER_SELECT_MENU_OK: /* switch 10 */
case PLAYER_SELECT_MENU_OK_GO_BACK: /* switch 10 */
func_800AAA9C(entry);
break;
}
func_800AAE18(entry);
break;
case CHARACTER_SELECT_MENU_OK: /* switch 8 */
case COURSE_SELECT_OK: /* switch 8 */
update_ok_menu_item(entry);
break;
case COURSE_SELECT_MUSHROOM_CUP: /* switch 8 */
case COURSE_SELECT_FLOWER_CUP: /* switch 8 */
case COURSE_SELECT_STAR_CUP: /* switch 8 */
case COURSE_SELECT_SPECIAL_CUP: /* switch 8 */
func_800AB164(entry);
switch (gSubMenuSelection) { /* switch 11; irregular */
case SUB_MENU_MAP_SELECT_CUP: /* switch 11 */
func_800AB020(entry);
break;
case SUB_MENU_MAP_SELECT_COURSE: /* switch 11 */
case SUB_MENU_MAP_SELECT_OK: /* switch 11 */
func_800AB098(entry);
break;
}
break;
case MENU_ITEM_TYPE_058: /* switch 8 */
case COURSE_SELECT_COURSE_NAMES: /* switch 8 */
case MENU_ITEM_TYPE_05A: /* switch 8 */
case MENU_ITEM_TYPE_05B: /* switch 8 */
func_800AB260(entry);
break;
case MENU_ITEM_TYPE_064: /* switch 8 */
func_800AB314(entry);
break;
case MENU_ITEM_TYPE_05F: /* switch 8 */
case MENU_ITEM_TYPE_060: /* switch 8 */
case MENU_ITEM_TYPE_061: /* switch 8 */
case MENU_ITEM_TYPE_062: /* switch 8 */
func_800AB290(entry);
break;
case MENU_ITEM_TYPE_065: /* switch 8 */
case MENU_ITEM_TYPE_066: /* switch 8 */
func_800AB904(entry);
break;
case MENU_ITEM_TYPE_067: /* switch 8 */
func_800AB9B0(entry);
break;
case MENU_ITEM_TYPE_078: /* switch 8 */
case MENU_ITEM_TYPE_079: /* switch 8 */
case MENU_ITEM_TYPE_07A: /* switch 8 */
case MENU_ITEM_TYPE_07B: /* switch 8 */
case MENU_ITEM_TYPE_08C: /* switch 8 */
func_800ABAE8(entry);
break;
case MENU_ITEM_TYPE_08D: /* switch 8 */
func_800ABB24(entry);
break;
case MENU_ITEM_TYPE_07C: /* switch 8 */
case MENU_ITEM_TYPE_07D: /* switch 8 */
case MENU_ITEM_TYPE_07E: /* switch 8 */
case MENU_ITEM_TYPE_07F: /* switch 8 */
case MENU_ITEM_TYPE_080: /* switch 8 */
case MENU_ITEM_TYPE_081: /* switch 8 */
case MENU_ITEM_TYPE_082: /* switch 8 */
case MENU_ITEM_TYPE_083: /* switch 8 */
case MENU_ITEM_TYPE_084: /* switch 8 */
case MENU_ITEM_TYPE_085: /* switch 8 */
case MENU_ITEM_TYPE_086: /* switch 8 */
case MENU_ITEM_TYPE_087: /* switch 8 */
case MENU_ITEM_TYPE_088: /* switch 8 */
case MENU_ITEM_TYPE_089: /* switch 8 */
case MENU_ITEM_TYPE_08A: /* switch 8 */
case MENU_ITEM_TYPE_08B: /* switch 8 */
func_800ABBCC(entry);
break;
case MENU_ITEM_TYPE_096: /* switch 8 */
func_800ABC38(entry);
break;
case MENU_ITEM_TYPE_097: /* switch 8 */
func_800ABEAC(entry);
break;
case MENU_ITEM_TYPE_05E: /* switch 8 */
func_800AC300(entry);
break;
case MENU_ITEM_TYPE_0AA: /* switch 8 */
func_800AC324(entry);
break;
case MENU_ITEM_TYPE_0AB: /* switch 8 */
func_800AC458(entry);
break;
case MENU_ITEM_TYPE_0AC: /* switch 8 */
func_800ACA14(entry);
break;
case MENU_ITEM_TYPE_0AF: /* switch 8 */
func_800AC978(entry);
break;
case MENU_ITEM_TYPE_0B0: /* switch 8 */
func_800ACC50(entry);
break;
case MENU_ITEM_TYPE_0B1: /* switch 8 */
case MENU_ITEM_TYPE_0B2: /* switch 8 */
case MENU_ITEM_TYPE_0B3: /* switch 8 */
case MENU_ITEM_TYPE_0B4: /* switch 8 */
func_800ACF40(entry);
break;
case MENU_ITEM_TYPE_0B9: /* switch 8 */
func_800AD1A4(entry);
break;
case MENU_ITEM_TYPE_0BA: /* switch 8 */
func_800AD2E8(entry);
break;
case MENU_ITEM_ANNOUNCE_GHOST: /* switch 8 */
func_800AEC54(entry);
break;
case MENU_ITEM_PAUSE: /* switch 8 */
func_800ADF48(entry);
break;
case MENU_ITEM_END_COURSE_OPTION: /* switch 8 */
func_800AE218(entry);
break;
case MENU_ITEM_DATA_COURSE_IMAGE: /* switch 8 */
func_800AEDBC(entry);
break;
case MENU_ITEM_DATA_COURSE_SELECTABLE: /* switch 8 */
func_800AEE90(entry);
break;
case MENU_ITEM_TYPE_0E9: /* switch 8 */
func_800AEEBC(entry);
break;
case MENU_ITEM_TYPE_0EA: /* switch 8 */
func_800AEEE8(entry);
break;
case MENU_ITEM_TYPE_0BE: /* switch 8 */
func_800AEF14(entry);
break;
case MENU_ITEM_TYPE_10E: /* switch 8 */
func_800AEF74(entry);
break;
case MENU_ITEM_TYPE_12B: /* switch 8 */
func_800AF004(entry);
break;
case MENU_ITEM_TYPE_12C: /* switch 8 */
case MENU_ITEM_TYPE_12D: /* switch 8 */
case MENU_ITEM_TYPE_12E: /* switch 8 */
case MENU_ITEM_TYPE_12F: /* switch 8 */
func_800AF1AC(entry);
break;
case MENU_ITEM_TYPE_130: /* switch 8 */
func_800AF270(entry);
break;
case MENU_ITEM_TYPE_190: /* switch 8 */
case MENU_ITEM_TYPE_191: /* switch 8 */
case MENU_ITEM_TYPE_192: /* switch 8 */
case MENU_ITEM_TYPE_193: /* switch 8 */
case MENU_ITEM_TYPE_194: /* switch 8 */
case MENU_ITEM_TYPE_195: /* switch 8 */
case MENU_ITEM_TYPE_196: /* switch 8 */
case MENU_ITEM_TYPE_197: /* switch 8 */
case MENU_ITEM_TYPE_198: /* switch 8 */
case MENU_ITEM_TYPE_199: /* switch 8 */
case MENU_ITEM_TYPE_19A: /* switch 8 */
case MENU_ITEM_TYPE_19B: /* switch 8 */
case MENU_ITEM_TYPE_19C: /* switch 8 */
case MENU_ITEM_TYPE_19D: /* switch 8 */
case MENU_ITEM_TYPE_19E: /* switch 8 */
case MENU_ITEM_TYPE_19F: /* switch 8 */
case MENU_ITEM_TYPE_1A0: /* switch 8 */
case MENU_ITEM_TYPE_1A1: /* switch 8 */
case MENU_ITEM_TYPE_1A2: /* switch 8 */
case MENU_ITEM_TYPE_1A3: /* switch 8 */
case MENU_ITEM_TYPE_1A4: /* switch 8 */
case MENU_ITEM_TYPE_1A5: /* switch 8 */
case MENU_ITEM_TYPE_1A6: /* switch 8 */
case MENU_ITEM_TYPE_1A7: /* switch 8 */
case MENU_ITEM_TYPE_1A8: /* switch 8 */
case MENU_ITEM_TYPE_1A9: /* switch 8 */
case MENU_ITEM_TYPE_1AA: /* switch 8 */
case MENU_ITEM_TYPE_1AB: /* switch 8 */
case MENU_ITEM_TYPE_1AC: /* switch 8 */
case MENU_ITEM_TYPE_1AD: /* switch 8 */
case MENU_ITEM_TYPE_1AE: /* switch 8 */
case MENU_ITEM_TYPE_1AF: /* switch 8 */
case MENU_ITEM_TYPE_1B0: /* switch 8 */
case MENU_ITEM_TYPE_1B1: /* switch 8 */
case MENU_ITEM_TYPE_1B2: /* switch 8 */
case MENU_ITEM_TYPE_1B3: /* switch 8 */
case MENU_ITEM_TYPE_1B4: /* switch 8 */
case MENU_ITEM_TYPE_1B5: /* switch 8 */
case MENU_ITEM_TYPE_1B6: /* switch 8 */
case MENU_ITEM_TYPE_1B7: /* switch 8 */
case MENU_ITEM_TYPE_1B8: /* switch 8 */
case MENU_ITEM_TYPE_1B9: /* switch 8 */
case MENU_ITEM_TYPE_1BA: /* switch 8 */
case MENU_ITEM_TYPE_1BB: /* switch 8 */
case MENU_ITEM_TYPE_1BC: /* switch 8 */
case MENU_ITEM_TYPE_1BD: /* switch 8 */
case MENU_ITEM_TYPE_1BE: /* switch 8 */
case MENU_ITEM_TYPE_1BF: /* switch 8 */
case MENU_ITEM_TYPE_1C0: /* switch 8 */
case MENU_ITEM_TYPE_1C1: /* switch 8 */
case MENU_ITEM_TYPE_1C2: /* switch 8 */
case MENU_ITEM_TYPE_1C3: /* switch 8 */
case MENU_ITEM_TYPE_1C4: /* switch 8 */
case MENU_ITEM_TYPE_1C5: /* switch 8 */
case MENU_ITEM_TYPE_1C6: /* switch 8 */
case MENU_ITEM_TYPE_1C7: /* switch 8 */
case MENU_ITEM_TYPE_1C8: /* switch 8 */
case MENU_ITEM_TYPE_1C9: /* switch 8 */
case MENU_ITEM_TYPE_1CA: /* switch 8 */
case MENU_ITEM_TYPE_1CB: /* switch 8 */
case MENU_ITEM_TYPE_1CC: /* switch 8 */
case MENU_ITEM_TYPE_1CD: /* switch 8 */
case MENU_ITEM_TYPE_1CE: /* switch 8 */
func_800AF480(entry);
break;
case MENU_ITEM_UI_NONE:
case MENU_ITEM_UI_START_BACKGROUND:
case MENU_ITEM_UI_LOGO_AND_COPYRIGHT:
case MENU_ITEM_UI_PUSH_START_BUTTON:
case MENU_ITEM_UI_NO_CONTROLLER:
break;
}
}
for (j = 0; j < MENU_ITEM_PRIORITY_MAX; j++) {
for (i = 0; i < MENU_ITEMS_MAX; i++) {
isRendered = false;
entry = &gMenuItems[i];
if (entry && entry) {} // ?
type = entry->type;
if ((type == MENU_ITEM_UI_NO_CONTROLLER) || (type == MENU_ITEM_UI_START_RECORD_TIME) ||
(type == MENU_ITEM_PAUSE)) {
if (priSpecial != 0) {
isRendered = true;
}
} else if (priSpecial == 0) {
isRendered = true;
}
if ((isRendered != 0) && (j == (s8) entry->priority)) {
render_menus(entry);
}
}
}
}
void handle_menus_default(void) {
handle_menus_with_pri_arg(0);
}
void handle_menus_special(void) {
handle_menus_with_pri_arg(1);
}
void func_800A8270(s32 arg0, MenuItem* arg1) {
s32 temp_t1;
s32 temp_t6;
s32 var_s0;
s32 var_s2;
s32 var_s3;
s32 var_s4;
if (arg1->param1 < 0x20) {
temp_t6 = (arg1->param1 << 6) / 64;
temp_t1 = arg1->column;
var_s0 = arg1->row;
var_s3 = temp_t1 + temp_t6;
var_s4 = (temp_t1 - temp_t6) + 0x3F;
gDPPipeSync(gDisplayListHead++);
gDPSetRenderMode(gDisplayListHead++, G_RM_OPA_SURF, G_RM_OPA_SURF2);
gDPSetCombineMode(gDisplayListHead++, G_CC_DECALRGBA, G_CC_DECALRGBA);
if ((arg0 + 1) == gPlayerCount) {
if ((gMainMenuSelection == MAIN_MENU_OPTION) || (gMainMenuSelection == MAIN_MENU_DATA) ||
(gMainMenuSelection == MAIN_MENU_PLAYER_SELECT)) {
gDisplayListHead = draw_flash_select_case_slow(gDisplayListHead, var_s3, var_s0, var_s4, var_s0 + 0x35);
} else {
gDisplayListHead = draw_box_fill(gDisplayListHead, var_s3, var_s0, var_s4, var_s0 + 0x35, 0x000000FF,
0x000000F9, 0x000000DC, 0x000000FF);
}
} else {
gDisplayListHead = func_80098FC8(gDisplayListHead, var_s3, var_s0, var_s4, var_s0 + 0x35);
}
for (var_s0 += 0x41, var_s2 = 0; var_s2 <= gPlayerModeSelection[arg0]; var_s2++, var_s0 += 0x12) {
if ((var_s2 == gGameModeMenuColumn[arg0]) && ((arg0 + 1) == gPlayerCount) &&
(gMainMenuSelection > MAIN_MENU_PLAYER_SELECT)) {
if (gMainMenuSelection == MAIN_MENU_MODE_SELECT) {
gDisplayListHead =
draw_flash_select_case_slow(gDisplayListHead, var_s3, var_s0, var_s4, var_s0 + 0x11);
} else {
gDisplayListHead = draw_box_fill(gDisplayListHead, var_s3, var_s0, var_s4, var_s0 + 0x11,
0x000000FF, 0x000000F9, 0x000000DC, 0x000000FF);
}
} else {
gDisplayListHead =
draw_box_fill(gDisplayListHead, var_s3, var_s0, var_s4, var_s0 + 0x11, 1, 1, 1, 0x000000FF);
}
}
}
}
void func_800A8564(MenuItem* arg0) {
s32 sp34;
s32 var_a1;
MenuTexture* var_a0;
s32 temp_a2;
s32 temp_t0;
var_a1 = 0;
switch (arg0->type) { /* irregular */
case 0xF:
var_a0 = D_0200487C;
if ((gMainMenuSelection == MAIN_MENU_OK_SELECT) || (gMainMenuSelection == MAIN_MENU_OK_SELECT_GO_BACK)) {
var_a1 = 1;
}
break;
case 0x33:
var_a0 = D_02004B74;
if ((gPlayerSelectMenuSelection == PLAYER_SELECT_MENU_OK) ||
(gPlayerSelectMenuSelection == PLAYER_SELECT_MENU_OK_GO_BACK)) {
var_a1 = 1;
}
break;
case 0x5D:
var_a0 = D_02004E80;
if (gSubMenuSelection == SUB_MENU_MAP_SELECT_OK) {
var_a1 = 1;
}
break;
default:
return;
}
if (arg0->param1 < 0x20) {
sp34 = (arg0->param1 << 5) / 64;
var_a0 = segmented_to_virtual_dupe(var_a0);
temp_t0 = arg0->column + var_a0->dX;
temp_a2 = arg0->row + var_a0->dY;
if (var_a1 != 0) {
gDisplayListHead = draw_flash_select_case_slow(gDisplayListHead, temp_t0 + sp34, temp_a2,
(temp_t0 - sp34) + 0x1E, temp_a2 + 0x12);
} else {
gDisplayListHead = draw_box_fill(gDisplayListHead, temp_t0 + sp34, temp_a2, (temp_t0 - sp34) + 0x1E,
temp_a2 + 0x12, 1, 1, 1, 0x000000FF);
}
}
}
void func_800A86E8(MenuItem* arg0) {
gDisplayListHead =
draw_box_fill(gDisplayListHead, arg0->column, arg0->row, arg0->column + 0x64, arg0->row + 0x27, 1, 1, 1, 0xFF);
}
// Credit for the use of ternary operators goes to LLONSIT
void func_800A874C(MenuItem* arg0) {
UNUSED s32 stackPadding0;
char buffer[3];
UNUSED s32 stackPadding1;
UNUSED s32 stackPadding2;
s32 temp_s1;
UNUSED u32 var_v0;
u32 var_s2;
set_text_color(TEXT_GREEN);
var_s2 = arg0->type == MENU_ITEM_TYPE_065 ? func_800B4E24(0) : func_800B4F2C();
temp_s1 = var_s2 & 0xFFFFF;
get_time_record_minutes((temp_s1 ^ 0), buffer);
text_draw(arg0->column + 5, arg0->row + 0x21, buffer, 0, 0.6f, 0.65f);
print_text_mode_1(arg0->column + 0xE, arg0->row + 0x21, "'", 0, 0.6f, 0.65f);
get_time_record_seconds(temp_s1, buffer);
text_draw(arg0->column + 0x16, arg0->row + 0x21, buffer, 0, 0.6f, 0.65f);
print_text_mode_1(arg0->column + 0x20, arg0->row + 0x21, "\"", 0, 0.6f, 0.65f);
get_time_record_centiseconds(temp_s1, buffer);
text_draw(arg0->column + 0x29, arg0->row + 0x21, buffer, 0, 0.6f, 0.65f);
var_s2 = (u32) temp_s1 < 0x927C0U ? var_s2 >> 0x14 : 8;
print_text1_left(arg0->column + 0x60, arg0->row + 0x21, D_800E76A8[var_s2], 0, 0.6f, 0.65f);
}
void func_800A890C(s32 arg0, MenuItem* arg1) {
s32 temp_a2;
s32 temp_t1;
s32 temp_t7;
if (arg1->param1 < 32) {
if (1) {}
temp_t7 = (arg1->param1 * 65) / 64;
temp_t1 = arg1->column;
temp_a2 = arg1->row;
gDPPipeSync(gDisplayListHead++);
gDPSetRenderMode(gDisplayListHead++, G_RM_OPA_SURF, G_RM_OPA_SURF2);
gDPSetCombineMode(gDisplayListHead++, G_CC_DECALRGBA, G_CC_DECALRGBA);
if (arg0 == gCupSelection) {
if (gSubMenuSelection == SUB_MENU_MAP_SELECT_CUP) {
gDisplayListHead = draw_flash_select_case_slow(gDisplayListHead, temp_t1 + temp_t7, temp_a2,
(temp_t1 - temp_t7) + 64, temp_a2 + 39);
} else {
gDisplayListHead = draw_box_fill(gDisplayListHead, temp_t1 + temp_t7, temp_a2, (temp_t1 - temp_t7) + 64,
temp_a2 + 39, 255, 249, 220, 255);
}
} else {
gDisplayListHead = draw_box_fill(gDisplayListHead, temp_t1 + temp_t7, temp_a2, (temp_t1 - temp_t7) + 64,
temp_a2 + 39, 1, 1, 1, 255);
}
}
}
void func_800A8A98(MenuItem* arg0) {
s32 temp_s2;
s32 temp_s3;
s32 someIndex;
temp_s2 = arg0->column;
temp_s3 = arg0->row;
gDPPipeSync(gDisplayListHead++);
gDPSetRenderMode(gDisplayListHead++, G_RM_OPA_SURF, G_RM_OPA_SURF2);
gDPSetCombineMode(gDisplayListHead++, G_CC_DECALRGBA, G_CC_DECALRGBA);
for (someIndex = 0; someIndex < NUM_COURSES_PER_CUP; someIndex++) {
if ((someIndex == gCourseIndexInCup) && (gSubMenuSelection > SUB_MENU_MAP_SELECT_CUP) &&
(gModeSelection != GRAND_PRIX)) {
if ((gSubMenuSelection == SUB_MENU_MAP_SELECT_COURSE) ||
(gSubMenuSelection == SUB_MENU_MAP_SELECT_BATTLE_COURSE)) {
gDisplayListHead = draw_flash_select_case_slow(
gDisplayListHead, D_800E7208[someIndex][0].column + temp_s2, D_800E7208[someIndex][0].row + temp_s3,
D_800E7208[someIndex][1].column + temp_s2, D_800E7208[someIndex][1].row + temp_s3);
} else {
gDisplayListHead = draw_box_fill(
gDisplayListHead, D_800E7208[someIndex][0].column + temp_s2, D_800E7208[someIndex][0].row + temp_s3,
D_800E7208[someIndex][1].column + temp_s2, D_800E7208[someIndex][1].row + temp_s3, 0x000000FF,
0x000000F9, 0x000000DC, 0x000000FF);
}
} else {
gDisplayListHead = draw_box_fill(
gDisplayListHead, D_800E7208[someIndex][0].column + temp_s2, D_800E7208[someIndex][0].row + temp_s3,
D_800E7208[someIndex][1].column + temp_s2, D_800E7208[someIndex][1].row + temp_s3, 1, 1, 1, 0x000000FF);
}
}
}
void func_800A8CA4(MenuItem* arg0) {
s32 temp_s2;
s32 temp_s3;
s32 var_s0;
MenuItem* temp_v0;
temp_v0 = find_menu_items_dupe(MENU_ITEM_TYPE_064);
temp_s2 = arg0->column;
temp_s3 = arg0->row;
gDPPipeSync(gDisplayListHead++);
gDPSetRenderMode(gDisplayListHead++, G_RM_OPA_SURF, G_RM_OPA_SURF2);
gDPSetCombineMode(gDisplayListHead++, G_CC_DECALRGBA, G_CC_DECALRGBA);
if (gModeSelection == GRAND_PRIX) {
if (gSubMenuSelection != SUB_MENU_MAP_SELECT_OK) {
for (var_s0 = 0; var_s0 < 4; var_s0++) {
// Wut?
if ((var_s0 != (temp_v0->param1 % 4)) != 0) {
gDisplayListHead =
draw_box(gDisplayListHead, D_800E7208[var_s0][0].column + temp_s2,
D_800E7208[var_s0][0].row + temp_s3, D_800E7208[var_s0][1].column + temp_s2,
D_800E7208[var_s0][1].row + temp_s3, 0, 0, 0, 0x00000064);
}
}
}
}
}
void render_battle_introduction(UNUSED MenuItem* arg0) {
set_text_color(TEXT_YELLOW);
print_text1_center_mode_1(0x98, 0x44, gTextBattleIntroduction[0], 0, 1.0f, 1.0f);
print_text_mode_1(0x17, 0x58, gTextBattleIntroduction[1], 0, 0.7f, 0.8f);
print_text_mode_1(0x17, 0x6A, gTextBattleIntroduction[2], 0, 0.7f, 0.8f);
}
void func_800A8EC0(MenuItem* arg0) {
if (arg0->param2 != 0) {
func_8009A76C(arg0->D_8018DEE0_index, arg0->column, arg0->row, -1);
set_text_color(TEXT_YELLOW);
print_text_mode_1(arg0->column + 0x20, arg0->row + 0x28, gCupText[arg0->param2], 0, 0.7f, 0.7f);
}
}
void func_800A8F48(UNUSED MenuItem* arg0) {
UNUSED Gfx* temp_v0_2;
Unk_D_800E70A0* temp_v0;
s16 temp_s0;
s16 temp_v1;
s32 temp_s2;
s32 var_s1;
switch (gSubMenuSelection) { /* irregular */
case SUB_MENU_MAP_SELECT_CUP:
for (var_s1 = 0; var_s1 < 4; var_s1++) {
if (func_800B639C((gCupSelection * 4) + var_s1) >= 0) {
temp_v0 = &D_800E7168[var_s1];
temp_v1 = temp_v0->column;
temp_s0 = temp_v0->row;
temp_s2 = temp_v1 + 0x20;
gDisplayListHead =
func_80098FC8(gDisplayListHead, temp_s2, (s32) temp_s0, temp_v1 + 0x3F, temp_s0 + 9);
gDisplayListHead = func_8009C204(gDisplayListHead, segmented_to_virtual_dupe(D_02004A0C), temp_s2,
(s32) temp_s0, 2);
}
}
break;
case SUB_MENU_MAP_SELECT_COURSE:
default:
if (func_800B639C((gCupSelection * 4) + gCourseIndexInCup) >= 0) {
gDisplayListHead = func_80098FC8(gDisplayListHead, 0x00000057, 0x00000070, 0x00000096, 0x00000081);
gDisplayListHead = render_menu_textures(gDisplayListHead, D_02004A0C, 0x00000057, 0x00000070);
}
break;
}
}
void func_800A90D4(UNUSED s32 arg0, MenuItem* arg1) {
s32 temp_a2;
s32 temp_t1;
s32 temp_t7;
if (arg1->param1 < 0x20) {
if (1) {}
temp_t7 = (arg1->param1 * 0x41) / 0x40;
temp_t1 = arg1->column;
temp_a2 = arg1->row;
gDPPipeSync(gDisplayListHead++);
gDPSetRenderMode(gDisplayListHead++, G_RM_OPA_SURF, G_RM_OPA_SURF2);
gDPSetCombineMode(gDisplayListHead++, G_CC_DECALRGBA, G_CC_DECALRGBA);
gDisplayListHead = draw_box_fill(gDisplayListHead, temp_t1 + temp_t7, temp_a2, (temp_t1 - temp_t7) + 0x40,
temp_a2 + 0x27, 1, 1, 1, 0xFF);
}
}
void func_800A91D8(MenuItem* arg0, s32 columnTarget, s32 rowTarget) {
func_800A9208(arg0, columnTarget);
func_800A9278(arg0, rowTarget);
}
void func_800A9208(MenuItem* arg0, s32 columnTarget) {
s32 step = columnTarget - arg0->column;
if (step != 0) {
if (step > 0) {
step = (step / 4) + 1;
if (step >= 0x11) {
step = 0x10;
}
} else {
step = (step / 4) - 1;
if (step < -0x10) {
step = -0x10;
}
}
}
arg0->column += step;
}
void func_800A9278(MenuItem* arg0, s32 rowTarget) {
s32 step = rowTarget - arg0->row;
if (step != 0) {
if (step > 0) {
step = (step / 4) + 1;
if (step >= 0x11) {
step = 0x10;
}
} else {
step = (step / 4) - 1;
if (step < -0x10) {
step = -0x10;
}
}
}
arg0->row += step;
}
void func_800A92E8(MenuItem* arg0, s32 columnTarget) {
s32 step = columnTarget - arg0->column;
if (step != 0) {
if (step > 0) {
step = (step / 4) + 1;
if (step >= 0x11) {
step = 0x10;
}
if (step < 8) {
step = 8;
}
arg0->column += step;
if (columnTarget < arg0->column) {
arg0->column = columnTarget;
}
} else {
step = (step / 4) - 1;
if (step < -0x10) {
step = -0x10;
}
if (step < -8) {
step = -8;
}
arg0->column += step;
if (arg0->column < columnTarget) {
arg0->column = columnTarget;
}
}
}
}
// Appears to be a copy of func_800A9278
UNUSED void func_800A939C(MenuItem* arg0, s32 rowTarget) {
s32 step = rowTarget - arg0->row;
if (step != 0) {
if (step > 0) {
step = (step / 4) + 1;
if (step >= 0x11) {
step = 0x10;
}
} else {
step = (step / 4) - 1;
if (step < -0x10) {
step = -0x10;
}
}
}
arg0->row += step;
}
void func_800A940C(MenuItem* arg0, s32 columnTarget) {
s32 step = columnTarget - arg0->column;
if (step != 0) {
step = 0xC8 / step;
if (step > 0) {
if (step >= 0x19) {
step = 0x18;
}
if (step < 0x10) {
step = 0x10;
}
arg0->column += step;
if (columnTarget < arg0->column) {
arg0->column = columnTarget;
}
} else {
if (step < -0x18) {
step = -0x18;
}
if (step >= -0xF) {
step = -0x10;
}
arg0->column += step;
if (arg0->column < columnTarget) {
arg0->column = columnTarget;
}
}
}
}
void func_800A94C8(MenuItem* arg0, s32 columnTarget, s32 arg2) {
s32 step;
if (columnTarget == arg0->column) {
arg0->column += arg2;
} else {
step = columnTarget - arg0->column;
if (step != 0) {
if (step > 0) {
step = (step / 4) + 1;
if (step >= 0x11) {
step = 0x10;
}
} else {
step = (step / 4) - 1;
if (step < -0x10) {
step = -0x10;
}
}
}
arg0->column -= step;
}
}
void func_800A954C(MenuItem* arg0) {
// Cycle lasts 26 (0x1A) frames
if (arg0->state == 0) {
// Move highlight from yellow to red
arg0->param2 = (s32) (u32) ((((f32) (0xC - arg0->param1) * 127.0f) / 12.0f) + 128.0f);
} else {
// Move highlight from red to yellow
arg0->param2 = (s32) (u32) ((((f64) (f32) arg0->param1 * 127.0) / 12.0) + 128.0);
}
arg0->param1++;
if (arg0->param1 >= 0xC) {
// Every 13 (0xC) frames reverse direction
arg0->param1 = 0;
arg0->state ^= 1;
}
}
void func_800A9710(MenuItem* arg0) {
s32 phi_v0;
switch (gControllerPakMenuSelection) {
case CONTROLLER_PAK_MENU_ERASE:
case CONTROLLER_PAK_MENU_QUIT:
phi_v0 = 1;
break;
case CONTROLLER_PAK_MENU_GO_TO_ERASING:
case CONTROLLER_PAK_MENU_ERASING:
phi_v0 = 5;
break;
case CONTROLLER_PAK_MENU_ERASE_ERROR_NOT_ERASED:
phi_v0 = 2;
break;
case CONTROLLER_PAK_MENU_ERASE_ERROR_NO_PAK:
phi_v0 = 3;
break;
case CONTROLLER_PAK_MENU_ERASE_ERROR_PAK_CHANGED:
phi_v0 = 4;
break;
default:
phi_v0 = 0;
break;
}
if (phi_v0 != arg0->state) {
arg0->state = phi_v0;
func_8009A594(arg0->D_8018DEE0_index, 0, segmented_to_virtual_dupe_2(D_800E7D34[phi_v0]));
}
}
void func_800A97BC(MenuItem* arg0) {
s32 i;
switch (gControllerPakScrollDirection) {
case CONTROLLER_PAK_SCROLL_DIR_DOWN:
arg0->row -= 2;
if (arg0->row < 0x60) {
arg0->row = 0x69;
gControllerPakScrollDirection = CONTROLLER_PAK_SCROLL_DIR_NONE;
for (i = 0; i < 8; i++) {
if (i < 7) {
gControllerPakVisibleTableRows[i] = gControllerPakVisibleTableRows[i + 1];
} else {
if ((gControllerPakVisibleTableRows[i - 1] == 0x10) ||
(gControllerPakVisibleTableRows[i - 1] == 0)) {
gControllerPakVisibleTableRows[i] = 0;
} else {
gControllerPakVisibleTableRows[i] = gControllerPakVisibleTableRows[i - 1] + 1;
}
}
}
gControllerPakVisibleTableRows[0] = gControllerPakVisibleTableRows[8] = 0;
}
break;
case CONTROLLER_PAK_SCROLL_DIR_UP:
arg0->row += 2;
if (arg0->row >= 0x73) {
arg0->row = 0x69;
gControllerPakScrollDirection = CONTROLLER_PAK_SCROLL_DIR_NONE;
for (i = 8; i > 0; i--) {
if (i > 1) {
gControllerPakVisibleTableRows[i] = gControllerPakVisibleTableRows[i - 1];
} else {
if ((gControllerPakVisibleTableRows[i + 1] == 1) ||
(gControllerPakVisibleTableRows[i + 1] == 0)) {
gControllerPakVisibleTableRows[i] = 0;
} else {
gControllerPakVisibleTableRows[i] = gControllerPakVisibleTableRows[i + 1] - 1;
}
}
}
gControllerPakVisibleTableRows[0] = gControllerPakVisibleTableRows[8] = 0;
break;
default:
gControllerPakScrollDirection = CONTROLLER_PAK_SCROLL_DIR_NONE;
break;
}
}
} // todo: <-- fix these brackets
// Don't know if this belongs here or inside update_ok_menu_item
// as a `static const`. But this matches so we'll leave
// it here for now.
const s8 D_800F0CA0[] = { 0x03, 0x03, 0x03, 0x02, 0x00, 0x02, 0x02, 0x01 };
const s8 D_800F0CA8[] = { 0x03, 0x02, 0x00 };
const s8 D_800F0CAC[] = { 0x03, 0x03, 0x02 };
void update_ok_menu_item(MenuItem* arg0) {
s32 sp4;
s32 var_v0;
switch (arg0->type) { /* irregular */
default:
var_v0 = sp4; // wut?
break;
case MENU_ITEM_UI_OK:
var_v0 = D_800F0CA0[gMainMenuSelection - 1];
break;
case COURSE_SELECT_OK:
var_v0 = D_800F0CAC[gSubMenuSelection - 1];
break;
case CHARACTER_SELECT_MENU_OK:
var_v0 = D_800F0CA8[gPlayerSelectMenuSelection - 1];
break;
}
switch (var_v0) { /* switch 1; irregular */
case 0: /* switch 1 */
arg0->param1 = 0;
break;
case 1: /* switch 1 */
arg0->param1 = 0x00000020;
break;
case 2: /* switch 1 */
if (arg0->param1 > 0) {
arg0->param1 = (arg0->param1 - (arg0->param1 / 12)) - 2;
if (arg0->param1 < 0) {
arg0->param1 = 0;
}
}
break;
case 3: /* switch 1 */
if (arg0->param1 < 0x20) {
arg0->param1 += 2;
if (arg0->param1 >= 0x20) {
arg0->param1 = 0x00000020;
}
}
break;
}
}
void func_800A9B9C(MenuItem* arg0) {
switch (arg0->state) {
case 0:
func_800AA280(arg0);
break;
case 1:
func_800AA280(arg0);
arg0->state = 4;
/* fallthrough */
case 4:
if (arg0->param1 > 0) {
arg0->param1 = (arg0->param1 - (arg0->param1 / 12)) - 2;
if (arg0->param1 < 0) {
arg0->param1 = 0;
}
} else {
arg0->param1 = 0;
arg0->state = 0;
}
break;
case 2:
arg0->state = 3;
break;
case 3:
default:
break;
}
}
void func_800A9C40(MenuItem* arg0) {
switch (arg0->state) {
case 0:
func_800AA280(arg0);
if ((gPlayerCount + 0xA) == arg0->type) {
arg0->state = 2;
} else {
arg0->state = 1;
}
break;
case 4:
if ((gPlayerCount + 0xA) == arg0->type) {
arg0->state = 2;
arg0->param1 = 0;
break;
}
arg0->state = 1;
case 1:
func_800AA280(arg0);
if ((gMainMenuSelection == MAIN_MENU_OK_SELECT_GO_BACK) ||
(gMainMenuSelection == MAIN_MENU_MODE_SUB_SELECT_GO_BACK)) {
arg0->param1 = 0x00000020;
} else {
if (arg0->param1 < 0x20) {
arg0->param1 += 2;
if (arg0->param1 >= 0x20) {
arg0->param1 = 0x00000020;
}
}
}
break;
case 3:
if ((gPlayerCount + 0xA) == arg0->type) {
arg0->state = 2;
}
break;
case 2:
default:
break;
}
}
void func_800A9D5C(MenuItem* arg0) {
Unk_D_800E70A0* temp_v0;
if ((gPlayerCount + 0xA) == arg0->type) {
arg0->priority = 0x0A;
} else {
arg0->priority = 6;
}
switch (arg0->state) {
case 2:
if ((gMainMenuSelection == MAIN_MENU_OK_SELECT_GO_BACK) ||
(gMainMenuSelection == MAIN_MENU_MODE_SUB_SELECT_GO_BACK)) {
arg0->column = 0x00000080;
arg0->row = 0x0000003E;
} else {
func_800A91D8(arg0, 0x00000080, 0x0000003E);
}
break;
case 3:
temp_v0 = &D_800E70A0[arg0->type - 0xA];
func_800A91D8(arg0, temp_v0->column, temp_v0->row);
if ((arg0->column == temp_v0->column) && (arg0->row == temp_v0->row)) {
arg0->state = 0;
}
/* fallthrough */
case 0:
case 1:
case 4:
default:
break;
}
}
void func_800A9E58(MenuItem* arg0) {
MenuItem* temp_v0;
Unk_D_800E70A0* temp_v1_2;
s32 sp24;
s32 sp20;
s32 sp1C;
s32 temp_a1;
switch (arg0->type) { /* switch 1 */
case 18: /* switch 1 */
case 19: /* switch 1 */
case 20: /* switch 1 */
case 21: /* switch 1 */
sp24 = 18;
sp1C = 2;
sp20 = 0;
break;
case 22: /* switch 1 */
case 23: /* switch 1 */
sp24 = 22;
sp20 = 2;
sp1C = 2;
break;
case 24: /* switch 1 */
case 25: /* switch 1 */
sp24 = 24;
sp20 = 1;
sp1C = 1;
break;
}
temp_a1 = gGameModePlayerSelection[gPlayerCount - 1][gGameModeMenuColumn[gPlayerCount - 1]];
switch (arg0->state) { /* switch 5; irregular */
case 0: /* switch 5 */
if ((temp_a1 != sp20) && (temp_a1 != sp1C)) {
arg0->visible = 0;
} else {
arg0->param2 = gGameModeMenuColumn[gPlayerCount - 1];
switch (gMainMenuSelection) { /* switch 2 */
case MAIN_MENU_MODE_SELECT: /* switch 2 */
case MAIN_MENU_MODE_SUB_SELECT: /* switch 2 */
case MAIN_MENU_OK_SELECT: /* switch 2 */
arg0->visible = 1;
temp_v0 = get_menu_item_player_count();
arg0->column = temp_v0->column;
arg0->row = (gGameModeMenuColumn[gPlayerCount - 1] * 0x12) + temp_v0->row + 0x41;
arg0->param1 = 0;
arg0->state = 1;
break;
case MAIN_MENU_OK_SELECT_GO_BACK: /* switch 2 */
case MAIN_MENU_MODE_SUB_SELECT_GO_BACK: /* switch 2 */
temp_v0 = get_menu_item_player_count();
temp_v1_2 = &D_800E70E8[arg0->type - sp24];
arg0->column = temp_v0->column + temp_v1_2->column;
arg0->row = (gGameModeMenuColumn[gPlayerCount - 1] * 0x12) + temp_v0->row + temp_v1_2->row;
arg0->param1 = arg0->row - temp_v0->row;
arg0->visible = 1;
arg0->state = 2;
break;
default: /* switch 2 */
arg0->visible = 0;
break;
}
}
break;
case 1: /* switch 5 */
switch (gMainMenuSelection) { /* switch 3 */
case MAIN_MENU_MODE_SELECT: /* switch 3 */
case MAIN_MENU_MODE_SUB_SELECT: /* switch 3 */
case MAIN_MENU_OK_SELECT: /* switch 3 */
case MAIN_MENU_OK_SELECT_GO_BACK: /* switch 3 */
case MAIN_MENU_MODE_SUB_SELECT_GO_BACK: /* switch 3 */
if ((temp_a1 != sp20) && (temp_a1 != sp1C)) {
arg0->visible = 0;
arg0->state = 0;
} else {
if (arg0->param2 != gGameModeMenuColumn[gPlayerCount - 1]) {
arg0->state = 0;
}
temp_v0 = get_menu_item_player_count();
arg0->column = temp_v0->column + arg0->param1;
temp_v1_2 = &D_800E70E8[arg0->type - sp24];
func_800A92E8(arg0, temp_v0->column + temp_v1_2->column);
arg0->param1 = arg0->column - temp_v0->column;
if (arg0->param1 == temp_v1_2->column) {
arg0->state = 2;
arg0->param1 = arg0->row - temp_v0->row;
}
}
break;
default: /* switch 3 */
arg0->visible = 0;
arg0->state = 0;
break;
}
break;
case 2: /* switch 5 */
switch (gMainMenuSelection) { /* switch 4 */
case MAIN_MENU_MODE_SELECT: /* switch 4 */
case MAIN_MENU_MODE_SUB_SELECT: /* switch 4 */
case MAIN_MENU_OK_SELECT: /* switch 4 */
case MAIN_MENU_OK_SELECT_GO_BACK: /* switch 4 */
case MAIN_MENU_MODE_SUB_SELECT_GO_BACK: /* switch 4 */
if ((temp_a1 != sp20) && (temp_a1 != sp1C)) {
arg0->visible = 0;
arg0->state = 0;
} else {
if (arg0->param2 != gGameModeMenuColumn[gPlayerCount - 1]) {
arg0->state = 0;
}
temp_v0 = get_menu_item_player_count();
temp_v1_2 = &D_800E70E8[arg0->type - sp24];
arg0->column = temp_v0->column + temp_v1_2->column;
arg0->row = temp_v0->row + arg0->param1;
func_800A91D8(arg0, arg0->column,
(gGameModeMenuColumn[gPlayerCount - 1] * 0x12) + temp_v0->row + temp_v1_2->row);
arg0->param1 = arg0->row - temp_v0->row;
}
break;
default: /* switch 4 */
arg0->visible = 0;
arg0->state = 0;
break;
}
break;
}
}
void func_800AA280(MenuItem* arg0) {
Unk_D_800E70A0* temp_v0;
temp_v0 = &D_800E70A0[arg0->type - 0xA];
if ((gMainMenuSelection == MAIN_MENU_OK_SELECT_GO_BACK) ||
(gMainMenuSelection == MAIN_MENU_MODE_SUB_SELECT_GO_BACK)) {
arg0->column = temp_v0->column;
arg0->row = temp_v0->row;
} else {
func_800A91D8(arg0, temp_v0->column, temp_v0->row);
}
}
void func_800AA2EC(MenuItem* arg0) {
s32 temp_v0;
s32 var_t1;
var_t1 = 0;
switch (gMainMenuSelection) {
case MAIN_MENU_OPTION:
case MAIN_MENU_DATA:
case MAIN_MENU_PLAYER_SELECT:
case MAIN_MENU_MODE_SELECT:
arg0->state = 0;
break;
case MAIN_MENU_MODE_SUB_SELECT:
case MAIN_MENU_OK_SELECT:
case MAIN_MENU_OK_SELECT_GO_BACK:
case MAIN_MENU_MODE_SUB_SELECT_GO_BACK:
if (arg0->state != 0) {
break;
}
if (gPlayerCount != 1) {
break;
}
if (gGameModeMenuColumn[gPlayerCount - 1] != 1) {
break;
}
if (gControllerPak1State != 0) {
var_t1 = 0;
switch (osPfsFindFile(&gControllerPak1FileHandle, gCompanyCode, gGameCode, (u8*) gGameName,
(u8*) gExtCode, &gControllerPak1FileNote)) { /* switch 1; irregular */
case 5: /* switch 1 */
break;
case 0: /* switch 1 */
arg0->state = 1;
var_t1 = 1;
break;
case 2: /* switch 1 */
gControllerPak1State = 0;
break;
default: /* switch 1 */
gControllerPak1State = 0;
break;
}
}
if (var_t1 == 0) {
if (gControllerPak1State == 0) {
if (check_for_controller_pak(0) == 0) {
arg0->state = 2;
break;
}
temp_v0 = osPfsInit(&gSIEventMesgQueue, &gControllerPak1FileHandle, 0);
if (temp_v0 != 0) {
switch (temp_v0) {
case PFS_ERR_NOPACK:
case PFS_ERR_DEVICE:
arg0->state = 2;
break;
case PFS_ERR_ID_FATAL:
arg0->state = 3;
break;
case PFS_ERR_CONTRFAIL:
default:
arg0->state = 3;
break;
}
return;
} else {
gControllerPak1State = 1;
}
if (osPfsFindFile(&gControllerPak1FileHandle, gCompanyCode, gGameCode, (u8*) gGameName,
(u8*) gExtCode, &gControllerPak1FileNote) == 0) {
arg0->state = 1;
break;
}
if (osPfsNumFiles(&gControllerPak1FileHandle, &gControllerPak1NumFilesUsed,
&gControllerPak1MaxWriteableFiles) != 0) {
arg0->state = 3;
break;
}
if (osPfsFreeBlocks(&gControllerPak1FileHandle, &gControllerPak1NumPagesFree) != 0) {
arg0->state = 3;
break;
}
gControllerPak1NumPagesFree = (s32) gControllerPak1NumPagesFree >> 8;
}
if (gControllerPak1MaxWriteableFiles >= gControllerPak1NumFilesUsed) {
arg0->state = 5;
break;
}
if (gControllerPak1NumPagesFree >= 0x79) {
arg0->state = 1;
break;
}
arg0->state = 5;
}
break;
default:
break;
}
}
void func_800AA5C8(MenuItem* arg0, s8 arg1) {
s32 temp_v1;
temp_v1 = arg0->type - 0x2B;
switch (arg0->subState) { /* irregular */
case 0:
if (func_800AAFCC((s32) arg1) >= 0) {
arg0->subState = 2;
func_8009A594(arg0->D_8018DEE0_index, 0, segmented_to_virtual_dupe_2(D_800E8340[temp_v1]));
}
break;
case 2:
if (func_800AAFCC((s32) arg1) < 0) {
arg0->subState = 0;
func_8009A594(arg0->D_8018DEE0_index, 0, segmented_to_virtual_dupe_2(D_800E8320[temp_v1]));
}
break;
}
}
void func_800AA69C(MenuItem* arg0) {
s32 temp_v0;
s32 var_a0;
s32 var_v0;
s32 temp_a0;
UNUSED s32 stackPadding0;
temp_a0 = arg0->type - 0x2B;
temp_v0 = func_800AAFCC(arg0->type - 0x2B);
if (temp_v0 >= 0) {
var_a0 = 1;
} else {
var_a0 = 0;
}
switch (arg0->subState) {
case 0:
if ((gCharacterGridIsSelected[temp_v0] != 0) && (var_a0 != 0)) {
arg0->subState = 1;
func_8009A594(arg0->D_8018DEE0_index, 0,
segmented_to_virtual_dupe_2(gCharacterCelebrateAnimation[temp_a0]));
} else {
temp_v0 = random_int(0x00C8U);
if (temp_v0 >= 0xC6) {
arg0->subState = 4;
func_8009A594(arg0->D_8018DEE0_index, 0,
segmented_to_virtual_dupe_2(gCharacterSingleBlinkAnimation[temp_a0]));
} else if (temp_v0 >= 0xC5) {
arg0->subState = 5;
func_8009A594(arg0->D_8018DEE0_index, 0,
segmented_to_virtual_dupe_2(gCharacterDoubleBlinkAnimation[temp_a0]));
}
}
break;
case 1:
if (D_8018DEE0[arg0->D_8018DEE0_index].sequenceIndex >= D_800E8440[temp_a0]) {
arg0->subState = 2;
func_8009A594(arg0->D_8018DEE0_index, 0, segmented_to_virtual_dupe_2(D_800E83A0[temp_a0]));
} else if ((gCharacterGridIsSelected[temp_v0] == 0) && (var_a0 != 0)) {
arg0->subState = 3;
func_8009A594(arg0->D_8018DEE0_index,
D_800E8460[temp_a0] - D_8018DEE0[arg0->D_8018DEE0_index].sequenceIndex,
segmented_to_virtual_dupe_2(gCharacterDeselectAnimation[temp_a0]));
}
break;
case 2:
if ((gCharacterGridIsSelected[temp_v0] == 0) && (var_a0 != 0)) {
arg0->subState = 3;
func_8009A594(arg0->D_8018DEE0_index, 0,
segmented_to_virtual_dupe_2(gCharacterDeselectAnimation[temp_a0]));
}
break;
case 3:
if (D_8018DEE0[arg0->D_8018DEE0_index].sequenceIndex >= D_800E8460[temp_a0]) {
arg0->subState = 0;
func_8009A594(arg0->D_8018DEE0_index, 0, segmented_to_virtual_dupe_2(D_800E8360[temp_a0]));
} else if ((gCharacterGridIsSelected[temp_v0] != 0) && (var_a0 != 0)) {
arg0->subState = 1;
func_8009A594(arg0->D_8018DEE0_index,
D_800E8460[temp_a0] - D_8018DEE0[arg0->D_8018DEE0_index].sequenceIndex,
segmented_to_virtual_dupe_2(gCharacterCelebrateAnimation[temp_a0]));
}
break;
case 4:
case 5:
if ((gCharacterGridIsSelected[temp_v0] != 0) && (var_a0 != 0)) {
arg0->subState = 1;
func_8009A594(arg0->D_8018DEE0_index, 0,
segmented_to_virtual_dupe_2(gCharacterCelebrateAnimation[temp_a0]));
} else {
if (arg0->subState == 4) {
var_v0 = D_800E8480[temp_a0];
} else {
var_v0 = D_800E84A0[temp_a0];
}
if (D_8018DEE0[arg0->D_8018DEE0_index].sequenceIndex >= var_v0) {
arg0->subState = 0;
func_8009A594(arg0->D_8018DEE0_index, 0, segmented_to_virtual_dupe_2(D_800E8360[temp_a0]));
}
}
break;
default:
break;
}
}
void func_800AAA9C(MenuItem* arg0) {
switch (arg0->state) {
case 3:
arg0->state = 1;
/* fallthrough */
case 1:
if (gPlayerSelectMenuSelection == PLAYER_SELECT_MENU_OK_GO_BACK) {
arg0->param1 = 0x00000020;
} else {
if (arg0->param1 < 0x20) {
arg0->param1 += (arg0->param1 / 12) + 2;
if (arg0->param1 >= 0x20) {
arg0->param1 = 0x00000020;
}
}
}
/* fallthrough */
case 0:
if (func_800AAFCC(arg0->type - 0x2B) >= 0) {
arg0->state = 2;
arg0->param1 = 0;
} else {
arg0->state = 1;
}
break;
case 4:
if (func_800AAFCC(arg0->type - 0x2B) >= 0) {
arg0->state = 2;
arg0->param1 = 0;
}
break;
case 2:
default:
break;
}
}
void func_800AAB90(MenuItem* arg0) {
switch (arg0->state) {
case 1:
if (arg0->param1 > 0) {
arg0->state = 3;
}
break;
case 2:
arg0->state = 4;
break;
case 3:
if (arg0->param1 > 0) {
arg0->param1 = (arg0->param1 - (arg0->param1 / 12)) - 2;
if (arg0->param1 < 0) {
arg0->param1 = 0;
}
} else {
arg0->param1 = 0;
arg0->state = 0;
}
break;
case 0:
case 4:
default:
break;
}
}
void func_800AAC18(MenuItem* arg0) {
UNUSED s32 stackPadding0;
UNUSED s32 stackPadding1;
s32 temp_a1;
s32 temp_v0;
UNUSED s32 stackPadding2;
Unk_D_800E70A0* var_t0;
temp_a1 = arg0->type - 0x2B;
switch (arg0->state) {
case 0:
if (gPlayerSelectMenuSelection == PLAYER_SELECT_MENU_OK_GO_BACK) {
temp_v0 = func_800AAFCC(temp_a1);
if (temp_v0 >= 0) {
var_t0 = &D_800E7188[(gScreenModeSelection * 4) + temp_v0];
arg0->column = (s32) var_t0->column;
arg0->row = (s32) var_t0->row;
arg0->state = 2;
arg0->subState = 2;
func_8009A594(arg0->D_8018DEE0_index, 0, segmented_to_virtual_dupe_2(D_800E8340[temp_a1]));
}
break;
}
case 1:
case 3:
var_t0 = &D_800E7108[0][temp_a1];
arg0->column = (s32) var_t0->column;
arg0->row = (s32) var_t0->row;
break;
case 2:
case 4:
if (arg0->state == 2) {
temp_v0 = func_800AAFCC(temp_a1);
if (temp_v0 >= 0) {
var_t0 = &D_800E7188[(gScreenModeSelection * 4) + temp_v0];
}
} else {
var_t0 = &D_800E7108[0][temp_a1];
if ((var_t0->column == arg0->column) && (var_t0->row == arg0->row)) {
arg0->state = 0;
return;
}
}
if ((arg0->state != 2) || (arg0->subState != 1)) {
func_800A91D8(arg0, (s32) var_t0->column, (s32) var_t0->row);
}
break;
default:
break;
}
}
void update_cursor(MenuItem* arg0) {
s32 playerId;
s8 characterSelectionIndex;
playerId = arg0->type - CHARACTER_SELECT_MENU_1P_CURSOR;
characterSelectionIndex = gCharacterGridSelections[playerId];
arg0->priority = 0xE - (playerId * 2);
hover_cursor_over_character_portrait(arg0, characterSelectionIndex - 1);
}
void func_800AAE18(MenuItem* arg0) {
s32 temp_v0;
temp_v0 = func_800AAFCC(arg0->type - CHARACTER_SELECT_MENU_MARIO);
if (temp_v0 >= 0) {
arg0->priority = 0xE - (temp_v0 * 2);
} else {
arg0->priority = 6;
}
}
/**
* Similar to find_menu_items_dupe, there is potential for a
* hard lock in the function if no appropriate gMenuItems entry
* is found.
**/
MenuItem* get_menu_item_player_count(void) {
MenuItem* entry = gMenuItems;
s32 nbPlayer = gPlayerCount - 1;
for (; !(entry > &gMenuItems[MENU_ITEMS_MAX]); entry++) {
if ((nbPlayer + MENU_ITEM_UI_1P_GAME) == entry->type) {
goto escape;
}
}
// Something VERY wrong has occurred
while (true) {
;
}
escape:
return entry;
}
/**
* Similar to find_menu_items_dupe, there is potential for a
* hard lock in the function if no appropriate gMenuItems entry
* is found.
**/
MenuItem* get_menu_item_character(s32 characterId) {
MenuItem* entry = gMenuItems;
for (; !(entry > &gMenuItems[MENU_ITEMS_MAX]); entry++) {
if ((characterId + CHARACTER_SELECT_MENU_MARIO) == entry->type) {
goto escape;
}
}
// Something VERY wrong has occurred
while (true) {
;
}
escape:
return entry;
}
/**
* `arg0` is the desired "type" of the 8018D9E0 entry to
* search for. If no entry with that "type" is found, this
* function will enter a `while(1)` loop, hard-locking the
* game.
*
* In practice this never appears to happen, but that is
* probably as much a matter of luck as it is good
* reasoning on the original author(s) part.
**/
MenuItem* find_menu_items_dupe(s32 type) {
MenuItem* entry = gMenuItems;
for (; !(entry > (&gMenuItems[MENU_ITEMS_MAX])); entry++) {
if (entry->type == type) {
goto escape;
}
}
// Something VERY wrong has occurred
while (true) {
;
}
escape:
return entry;
}
MenuItem* find_menu_items(s32 type) {
MenuItem* entry = gMenuItems;
for (; !(entry > (&gMenuItems[MENU_ITEMS_MAX])); entry++) {
if (entry->type == type) {
goto escape;
}
}
return NULL;
escape:
return entry;
}
UNUSED s32 get_character_menu_state(s32 characterId) {
MenuItem* temp;
temp = get_menu_item_character(characterId);
return temp->state;
}
void hover_cursor_over_character_portrait(MenuItem* arg0, s32 characterId) {
MenuItem* temp_v0;
temp_v0 = get_menu_item_character(characterId);
arg0->column = temp_v0->column;
arg0->row = temp_v0->row;
}
s32 func_800AAFCC(s32 characterId) {
s32 someIndex = 0;
bool ret = false;
for (; someIndex < ARRAY_COUNT(gCharacterGridSelections); someIndex++) {
if ((characterId + 1) == gCharacterGridSelections[someIndex]) {
ret = true;
break;
}
}
if (ret != false) {
return someIndex;
}
return -1;
}
void func_800AB020(MenuItem* arg0) {
switch (arg0->state) {
case 1:
arg0->state = 4;
/* fallthrough */
case 4:
if (arg0->param1 > 0) {
arg0->param1 = (arg0->param1 - (arg0->param1 / 12)) - 2;
if (arg0->param1 < 0) {
arg0->param1 = 0;
}
} else {
arg0->param1 = 0;
arg0->state = 0;
}
break;
case 2:
arg0->state = 3;
break;
case 0:
case 3:
default:
break;
}
}
void func_800AB098(MenuItem* arg0) {
switch (arg0->state) {
case 0:
if ((gCupSelection + 0x53) == arg0->type) {
arg0->state = 2;
} else {
arg0->state = 1;
}
break;
case 4:
if ((gCupSelection + 0x53) == arg0->type) {
arg0->state = 2;
arg0->param1 = 0;
break;
} else {
arg0->state = 1;
}
// Purposeful fallthrough
case 1:
if (arg0->param1 < 32) {
arg0->param1 += 2;
if (arg0->param1 >= 32) {
arg0->param1 = 32;
}
}
break;
case 3:
if ((gCupSelection + 0x53) == arg0->type) {
arg0->state = 2;
}
break;
case 2:
default:
break;
}
}
void func_800AB164(MenuItem* arg0) {
Unk_D_800E70A0* thing = &D_800E7148[arg0->type - 0x53];
if ((gCupSelection + 0x53) == arg0->type) {
arg0->priority = 0x0A;
} else {
arg0->priority = 4;
}
switch (arg0->state) {
case 0:
thing = &D_800E7148[arg0->type - 0x53];
arg0->column = thing->column;
arg0->row = thing->row;
break;
case 2:
func_800A91D8(arg0, 0x00000080, 0x0000003B);
break;
case 3:
thing = &D_800E7148[arg0->type - 0x53];
func_800A91D8(arg0, thing->column, thing->row);
if ((arg0->column == thing->column) && (arg0->row == thing->row)) {
arg0->state = 0;
}
break;
case 1:
case 4:
default:
break;
}
}
void func_800AB260(MenuItem* arg0) {
s32 temp = (arg0->type - 0x58);
if (temp == gCupSelection) {
arg0->visible = 1;
} else {
arg0->visible = 0;
}
}
void func_800AB290(MenuItem* arg0) {
if (arg0->param1 != gCupSelection) {
arg0->param1 = gCupSelection;
func_8009A594(arg0->D_8018DEE0_index, 0,
segmented_to_virtual_dupe_2(D_800E7E34[gCupCourseOrder[gCupSelection][arg0->type - 0x5F]]));
}
}
#ifdef NON_MATCHING
// Decent work has been done, but not quite right
// https://decomp.me/scratch/YLbkC
void func_800AB314(MenuItem* arg0) {
s32 var_a1;
s32 one = 1;
s32 four = 4;
MenuItem* sp24[4];
s32 var_v0;
for (var_a1 = 0; var_a1 < 4; var_a1++) {
sp24[var_a1] = find_menu_items_dupe(var_a1 + 0x5F);
}
switch (gModeSelection) {
default:
if (gSubMenuSelection != SUB_MENU_MAP_SELECT_CUP) {
arg0->state = 0;
arg0->param2 = 0;
for (var_a1 = 0; var_a1 < 4; var_a1++) {
if (gCourseIndexInCup == var_a1) {
sp24[var_a1]->visible = one;
if (arg0->param1 != var_a1) {
arg0->param1 = var_a1;
}
} else {
sp24[var_a1]->visible = 0;
}
}
} else {
arg0->state = 3;
for (var_a1 = 0; var_a1 < 4; var_a1++) {
sp24[var_a1]->visible = one;
sp24[var_a1]->priority = 6;
}
}
break;
case 0:
switch (arg0->state) { /* irregular */
case 0:
if ((arg0->param1 / 4) == gCupSelection) {
arg0->param2++;
if (arg0->param2 >= 0x33) {
arg0->state = one;
arg0->param2 = 0;
var_v0 = gCupSelection * 4;
arg0->param1 = var_v0 + 1;
}
} else {
arg0->param2 = 0;
arg0->param1 = gCupSelection * 4;
}
if (gSubMenuSelection == SUB_MENU_MAP_SELECT_OK) {
arg0->state = 2;
arg0->param2 = 0;
}
break;
case 1:
if ((arg0->param1 / 4) != gCupSelection) {
arg0->state = 0;
arg0->param2 = 0;
arg0->param1 = 0;
} else {
arg0->param2++;
if (arg0->param2 >= 0x1F) {
arg0->param2 = 0;
arg0->param1 = (gCupSelection * 4) + (((arg0->param1 % 4) + one) % 4);
} else {
if (gSubMenuSelection == SUB_MENU_MAP_SELECT_OK) {
arg0->state = 2;
arg0->param2 = 0;
}
}
}
break;
case 2:
arg0->param2++;
if (arg0->param2 >= 0x1A) {
arg0->state = 3;
arg0->param2 = 0;
}
if (gSubMenuSelection != SUB_MENU_MAP_SELECT_OK) {
arg0->state = 0;
arg0->param2 = 0;
arg0->param1 = 0;
}
break;
case 3:
if (gSubMenuSelection != SUB_MENU_MAP_SELECT_OK) {
arg0->state = 0;
arg0->param2 = 0;
arg0->param1 = 0;
}
break;
}
switch (arg0->state) {
case 0:
case 1:
for (var_a1 = 0; var_a1 < 4; var_a1++) {
if ((arg0->param1 % 4) == var_a1) {
sp24[var_a1]->visible = one;
} else {
sp24[var_a1]->visible = 0;
}
sp24[var_a1]->priority = 6;
}
break;
case 2:
for (var_a1 = 0; var_a1 < 4; var_a1++) {
if (var_a1 == (arg0->param1 % 4)) {
sp24[var_a1]->priority = 6;
} else if (arg0->param2 < (var_a1 * 5)) {
sp24[var_a1]->priority = four;
} else {
sp24[var_a1]->priority = 8;
}
sp24[var_a1]->visible = one;
}
break;
case 3:
for (var_a1 = 0; var_a1 < 4; var_a1++) {
sp24[var_a1]->visible = one;
sp24[var_a1]->priority = 6;
}
break;
default:
break;
}
break;
}
}
#else
GLOBAL_ASM("asm/non_matchings/menu_items/func_800AB314.s")
#endif
void func_800AB904(MenuItem* arg0) {
Unk_D_800E70A0* temp_a1;
switch (gSubMenuSelection) { /* irregular */
case SUB_MENU_MAP_SELECT_CUP:
temp_a1 = &D_800E7248[arg0->type - 0x65];
if (arg0->column != temp_a1->column) {
func_800A9208(arg0, temp_a1->column);
}
break;
case SUB_MENU_MAP_SELECT_COURSE:
case SUB_MENU_MAP_SELECT_OK:
temp_a1 = &D_800E7258[arg0->type - 0x65];
if (arg0->column != temp_a1->column) {
func_800A9208(arg0, temp_a1->column);
}
break;
}
}
void func_800AB9B0(MenuItem* arg0) {
Unk_D_800E70A0* temp_v1;
if (arg0->param1 != gCupSelection) {
arg0->param1 = gCupSelection;
arg0->param2 = func_800B54C0((s32) gCupSelection, gCCSelection);
func_8009A594(arg0->D_8018DEE0_index, 0,
segmented_to_virtual_dupe_2(D_800E7E20[((gCCSelection / 2) * 4) - arg0->param2]));
arg0->column = (s32) D_800E7268->column;
arg0->row = D_800E7268->row;
}
temp_v1 = &D_800E7268[arg0->state];
switch (arg0->state) { /* irregular */
case 0:
func_800A91D8(arg0, (s32) temp_v1->column, (s32) temp_v1->row);
if (gSubMenuSelection == SUB_MENU_MAP_SELECT_OK) {
arg0->state = 1;
}
break;
case 1:
func_800A91D8(arg0, (s32) temp_v1->column, (s32) temp_v1->row);
if (gSubMenuSelection == SUB_MENU_MAP_SELECT_CUP) {
arg0->state = 0;
}
break;
}
}
void func_800ABAE8(MenuItem* arg0) {
s32 index;
if (arg0->type == 0x8C) {
index = 4;
} else {
index = arg0->type - 0x78;
}
arg0->column = D_800E7430[index].column;
arg0->row = D_800E7430[index].row;
}
void func_800ABB24(MenuItem* arg0) {
Unk_D_800E70A0* temp_v1;
s32 thing = gTimeTrialDataCourseIndex;
temp_v1 = &D_800E7430[thing / 4];
arg0->column = temp_v1->column - 2;
arg0->row = temp_v1->row + ((thing % 4) * 0x32) + 0x13;
arg0->param1 += 0x10;
if (arg0->param1 >= 0x100) {
arg0->param1 -= 0x100;
arg0->param2 = (s32) (arg0->param2 + 1) % 3;
}
}
void func_800ABBCC(MenuItem* arg0) {
s32 temp_v0;
Unk_D_800E70A0* temp_v1;
temp_v0 = arg0->type - 0x7C;
temp_v1 = &D_800E7430[temp_v0 / 4];
arg0->column = (s32) temp_v1->column;
arg0->row = temp_v1->row + ((temp_v0 % 4) * 0x32) + 0x14;
}
void func_800ABC38(MenuItem* arg0) {
// Huh?
s32 one = 1;
func_800ABCF4(arg0);
switch (D_80164A28) { /* irregular */
case 1:
arg0->visible = one;
break;
case 2:
if (arg0->row >= -0x13) {
arg0->row -= 2;
} else {
arg0->type = 0;
}
break;
default:
if ((gModeSelection != GRAND_PRIX) || (gPlayerCountSelection1 != (s32) 1U) || (gDemoUseController != 0)) {
arg0->type = 0;
} else {
if (arg0->row >= -0x13) {
arg0->row -= 2;
} else {
arg0->type = 0;
}
}
break;
}
}
void func_800ABCF4(MenuItem* arg0) {
f64 temp_f0;
switch (arg0->state) { /* irregular */
case 0:
arg0->column = 0;
arg0->state = 1;
arg0->param2 = (get_string_width(gCupNames[D_800DC540]) / 2) + 0xA0;
/* fallthrough */
case 1:
func_800A9208(arg0, arg0->param2);
arg0->param1 = (s32) (arg0->param2 - arg0->column) / 4;
if (arg0->param1 >= 9) {
arg0->param1 = 8;
}
arg0->paramf = (f32) (((f64) arg0->param1 * 0.05) + 1.0);
if (arg0->column >= (arg0->param2 - 0x14)) {
arg0->state = 2;
arg0->D_8018DEE0_index = 0;
}
break;
case 2:
func_800A9208(arg0, arg0->param2);
arg0->param1 = (s32) (arg0->param2 - arg0->column) / 4;
arg0->D_8018DEE0_index++;
temp_f0 = (f64) (arg0->D_8018DEE0_index - 0xA);
arg0->paramf = (f32) ((temp_f0 * 0.0085 * temp_f0) + 0.4);
if ((arg0->D_8018DEE0_index >= 9) && ((f64) arg0->paramf > 1.0)) {
arg0->paramf = 1.0f;
}
break;
}
}
void func_800ABEAC(MenuItem* arg0) {
s32 why = 1;
func_800ABF68(arg0);
switch (D_80164A28) {
case 1:
arg0->visible = why;
break;
case 2:
if (arg0->row < 0x104) {
arg0->row += 2;
} else {
arg0->type = 0;
}
break;
default:
if ((gModeSelection != GRAND_PRIX) || (gPlayerCountSelection1 != why) || (gDemoUseController != 0)) {
arg0->type = 0;
} else {
if (arg0->row < 0x104) {
arg0->row += 2;
} else {
arg0->type = 0;
}
}
break;
}
}
void func_800ABF68(MenuItem* arg0) {
switch (arg0->state) {
case 0:
arg0->column = 0x140;
arg0->state = 1;
arg0->param2 = 0xA0 - (get_string_width(gCourseNames[gCurrentCourseId]) / 2);
/* fallthrough */
case 1:
func_800A9208(arg0, arg0->param2);
arg0->param1 = (arg0->column - arg0->param2) / 4;
if (arg0->param1 >= 9) {
arg0->param1 = 8;
}
arg0->paramf = (arg0->param1 * 0.05) + 1.0;
if ((arg0->param2 + 0x14) >= arg0->column) {
arg0->state = 2;
arg0->D_8018DEE0_index = 0;
}
break;
case 2:
func_800A9208(arg0, arg0->param2);
arg0->param1 = (arg0->column - arg0->param2) / 4;
arg0->D_8018DEE0_index++;
arg0->paramf = ((arg0->D_8018DEE0_index - 0xA) * 0.0085 * (arg0->D_8018DEE0_index - 0xA)) + 0.4;
if ((arg0->D_8018DEE0_index >= 9) && ((f64) arg0->paramf > 1.0)) {
arg0->paramf = 1.0f;
}
break;
}
}
void func_800AC128(MenuItem* arg0) {
switch (arg0->state) {
case 0:
arg0->column = 0x00000140;
arg0->state = 1;
/* fallthrough */
case 1:
func_800A940C(arg0, 0x00000064);
arg0->param1 = (s32) (arg0->column - 0x64) / 6;
if (arg0->param1 >= 9) {
arg0->param1 = 8;
}
arg0->paramf = (f32) (((f64) arg0->param1 * 0.07) + 0.6);
if (arg0->column == 0x00000064) {
arg0->state = 2;
arg0->D_8018DEE0_index = 0;
}
break;
case 2:
arg0->D_8018DEE0_index++;
arg0->param1 = 0;
arg0->paramf = (f32) (1.5 - ((arg0->D_8018DEE0_index - 0xF) * 0.004 * (arg0->D_8018DEE0_index - 0xF)));
if ((arg0->D_8018DEE0_index >= 0x10) && ((f64) arg0->paramf < 0.8)) {
arg0->state = 3;
arg0->D_8018DEE0_index = 0;
}
break;
case 3:
arg0->D_8018DEE0_index++;
arg0->param1 = 0;
arg0->paramf = (f32) (1.25 - ((arg0->D_8018DEE0_index - 0xF) * 0.002 * (arg0->D_8018DEE0_index - 0xF)));
if ((arg0->D_8018DEE0_index >= 0xD) && ((f64) arg0->paramf < 1.0)) {
arg0->paramf = 1.0f;
}
break;
}
}
void func_800AC300(MenuItem* arg0) {
if (arg0->param2 < ++arg0->param1) {
arg0->type = 0;
}
}
void func_800AC324(MenuItem* arg0) {
switch (arg0->state) {
case 0:
arg0->column = 0x14A;
arg0->state = 1;
func_800921B4();
break;
case 1:
func_800A9208(arg0, 0xA0);
if (arg0->column == 0xA0) {
arg0->state = 2;
arg0->param2 = 0;
}
break;
case 2:
arg0->param2++;
if (((D_8018D9D8 != 0) || (arg0->param2 >= 0x5B)) && (D_800DDB24 != 0)) {
arg0->state = 3;
arg0->param1 = arg0->column;
add_menu_item(MENU_ITEM_TYPE_0AB, 0, 0, MENU_ITEM_PRIORITY_0);
}
break;
case 3:
arg0->column = arg0->param1;
if (arg0->param1 < 0x14A) {
if (D_8018D9D8 != 0) {
arg0->param1 += 0x20;
} else {
arg0->param1 += 0x10;
}
} else {
arg0->type = 0;
}
break;
}
}
void func_800AC458(MenuItem* arg0) {
s32 var_a1;
s32 var_t1;
s32 temp;
switch (arg0->state) {
case 0:
arg0->column = -0x000000A0;
arg0->state = 1;
for (var_a1 = 0; var_a1 < ARRAY_COUNT(gGPPointRewards); var_a1++) {
sGPPointsCopy[var_a1] = gGPPointRewards[var_a1];
}
arg0->param2 = arg0->column;
break;
case 1:
arg0->column = arg0->param2;
temp = (D_8018D9D8 != 0) ? 0x20 : 0x10;
if ((arg0->param2 + temp) < 0) {
arg0->param2 += temp;
D_800DC5EC->screenStartX += temp;
D_800DC5F0->screenStartX -= temp;
} else {
arg0->param2 = 0;
arg0->column = 0;
arg0->state = 2;
arg0->param1 = 0;
D_800DC5EC->screenStartX = 0x00F0;
D_800DC5F0->screenStartX = 0x0050;
}
break;
case 2:
arg0->column = 0;
arg0->param1++;
if (((D_8018D9D8 != 0) || (arg0->param1 >= 0x1F)) && (D_800DDB24 != 0)) {
arg0->state = 3;
arg0->param1 = 0;
arg0->param2 = 0;
}
break;
case 3:
case 4:
case 5:
case 6:
var_t1 = 0;
var_a1 = arg0->state - 3;
arg0->param1++;
if (((arg0->param1 % 3) == 0) || (D_8018D9D8 != 0)) {
if (sGPPointsCopy[var_a1] > 0) {
sGPPointsCopy[var_a1]--;
gGPPointsByCharacterId[gPlayers[gGPCurrentRacePlayerIdByRank[var_a1]].characterId] += 1;
play_sound2(SOUND_ACTION_COUNT_SCORE);
var_t1 = 0;
if ((sGPPointsCopy[var_a1] == 0) && (arg0->param2 == 0)) {
arg0->param2 = 1;
arg0->param1 = 0;
}
}
}
if ((arg0->param2 != 0) && ((arg0->param1 > 0xA) || ((D_8018D9D8 != 0) && (arg0->param1 >= 4)))) {
var_t1 = 1;
}
if (var_t1 != 0) {
arg0->param2 = 0;
arg0->param1 = 0;
if (arg0->state < 6) {
arg0->state++;
} else {
arg0->state = 7;
}
}
break;
case 7:
arg0->param1++;
if ((((D_8018D9D8 != 0) && (arg0->param1 >= 0xB)) || (arg0->param1 >= 0x3D)) && (D_800DDB24 != 0)) {
arg0->state = 8;
arg0->param1 = 0;
}
break;
case 8:
arg0->param1++;
if (D_8018D9D8 != 0) {
arg0->param1 += 5;
}
if (arg0->param1 >= 0x29) {
arg0->state = 9;
}
break;
case 9:
arg0->param1--;
if (D_8018D9D8 != 0) {
arg0->param1 -= 5;
}
if (arg0->param1 <= 0) {
arg0->state = 0x0000000A;
arg0->param1 = 0;
if (gCourseIndexInCup == 3) {
for (var_a1 = 0; var_a1 < 8; var_a1++) {
if (D_80164478[gCharacterIdByGPOverallRank[var_a1]] < gPlayerCount) {
func_800B536C(var_a1);
break;
}
}
}
}
break;
case 10:
arg0->param1++;
if (arg0->param1 > 0) {
arg0->state = 0x0000000B;
arg0->param1 = 0;
func_800921B4();
}
break;
case 11:
if ((D_8018D9D8 != 0) && (D_800DDB24 != 0)) {
arg0->state = 0x0000000C;
arg0->param2 = arg0->row;
play_sound2(SOUND_ACTION_NEXT_COURSE);
}
break;
case 12:
arg0->row = arg0->param2;
if (arg0->param2 < 0xF0) {
arg0->param2 += 0x10;
D_800DC5EC->screenStartY += 0x10;
D_800DC5F0->screenStartY -= 0x10;
} else {
arg0->param2 = 0;
arg0->state = 0x0000000D;
arg0->param1 = 0;
D_800DC5EC->screenStartY = 0x012C;
D_800DC5F0->screenStartY = -0x003C;
D_8015F894 = 4;
func_800CA330(0x19U);
}
break;
case 13:
default:
break;
}
}
void func_800AC978(MenuItem* arg0) {
switch (arg0->state) { /* irregular */
case 0:
arg0->column = 0x14A;
arg0->state = 1;
arg0->param1 = 0xFF;
break;
case 1:
func_800A9208(arg0, 0xA0);
if (arg0->column == 0xA0) {
arg0->state = 2;
}
break;
case 2:
break;
case 3:
if (arg0->param1 != 0) {
arg0->param1 -= 0x33;
}
break;
}
}
void func_800ACA14(MenuItem* arg0) {
switch (arg0->state) { /* irregular */
case 0:
if (arg0->param2 >= 0xB) {
arg0->param1 += 3;
}
if (arg0->param1 >= 0x65) {
arg0->state = 0x0000000B;
arg0->param1 = 0;
}
break;
case 11:
case 12:
if (is_screen_being_faded()) {
break;
}
if ((gControllerFive->buttonPressed | gControllerFive->stickPressed) & 0x800) {
if (arg0->state >= 0xC) {
arg0->state--;
play_sound2(SOUND_MENU_CURSOR_MOVE);
if (arg0->paramf < 4.2) {
arg0->paramf += 4.0;
}
arg0->subState = -1;
}
}
if ((gControllerFive->buttonPressed | gControllerFive->stickPressed) & 0x400) {
if (arg0->state < 0xC) {
arg0->state++;
play_sound2(SOUND_MENU_CURSOR_MOVE);
if (arg0->paramf < 4.2) {
arg0->paramf += 4.0;
}
arg0->subState = 1;
}
}
if (gControllerFive->buttonPressed & 0x9000) {
func_8009DFE0(0x0000001E);
func_800CA330(0x19U);
play_sound2(SOUND_ACTION_CONTINUE_UNKNOWN);
if (arg0->paramf < 4.2) {
arg0->paramf += 4.0;
}
}
break;
default:
break;
}
if (arg0->param2 < 0x28) {
arg0->param2++;
}
}
void func_800ACC50(MenuItem* arg0) {
s32 i;
switch (arg0->state) {
case 0:
arg0->param1 += 3;
if (arg0->param1 >= 0x65) {
arg0->state = 1;
arg0->param1 = 0;
for (i = 0; i < gPlayerCount; i++) {
add_menu_item(i + MENU_ITEM_TYPE_0B1, 0, 0, (s8) (MENU_ITEM_PRIORITY_5 - i));
}
}
break;
case 1:
if (find_menu_items_dupe(0x000000B1)->state >= 2) {
arg0->state = 2;
}
break;
case 2:
arg0->param1 += 0x20;
if (arg0->param1 >= 0x100) {
if (gModeSelection == VERSUS) {
arg0->state = (s32) gVersusResultCursorSelection;
} else {
arg0->state = (s32) gBattleResultCursorSelection;
}
arg0->param1 = 0;
}
break;
case 10:
case 11:
case 12:
case 13:
if (is_screen_being_faded() == 0) {
if ((gControllerFive->buttonPressed | gControllerFive->stickPressed) & 0x800) {
if (arg0->state >= 0xB) {
arg0->state--;
play_sound2(SOUND_MENU_CURSOR_MOVE);
if (arg0->paramf < 4.2) {
arg0->paramf += 4.0;
}
arg0->subState = -1;
}
}
if ((gControllerFive->buttonPressed | gControllerFive->stickPressed) & 0x400) {
if (arg0->state < 0xD) {
arg0->state++;
play_sound2(SOUND_MENU_CURSOR_MOVE);
if (arg0->paramf < 4.2) {
arg0->paramf += 4.0;
}
arg0->subState = 1;
}
}
if (gControllerFive->buttonPressed & 0x9000) {
func_8009DFE0(0x0000001E);
play_sound2(SOUND_MENU_OK_CLICKED);
if (gModeSelection == VERSUS) {
gVersusResultCursorSelection = (s8) arg0->state;
} else {
gBattleResultCursorSelection = (s8) arg0->state;
}
if (arg0->paramf < 4.2) {
arg0->paramf += 4.0;
}
}
}
break;
default:
break;
}
}
void func_800ACF40(MenuItem* arg0) {
Unk_D_800E70A0* temp_v0_2;
s32 temp_a2;
s32 temp_a1;
s32 var_v1;
UNUSED s32 stackPadding0;
temp_a2 = arg0->type - 0xB1;
temp_a1 = D_800EFD64[gCharacterSelections[arg0->type - 0xB1]];
switch (arg0->state) {
case 0:
arg0->column = D_800E72F8.column;
arg0->row = D_800E72F8.row;
arg0->state = 1;
break;
case 1:
temp_v0_2 = &D_800E7300[((gPlayerCount - 2) * 4) + temp_a2];
func_800A9208(arg0, temp_v0_2->column);
func_800A9278(arg0, temp_v0_2->row);
if (arg0->column == temp_v0_2->column) {
arg0->state = 2;
arg0->param2 = 0;
}
break;
case 2:
var_v1 = 0;
switch (gModeSelection) { /* switch 1; irregular */
case 2: /* switch 1 */
if (gGPCurrentRaceRankByPlayerId[temp_a2] != 0) {
var_v1 = 1;
}
break;
case 3: /* switch 1 */
if (temp_a2 != gPlayerWinningIndex) {
var_v1 = 1;
}
break;
}
if (var_v1 == 0) {
arg0->param2++;
if (arg0->param2 >= 0x1F) {
if (find_menu_items_dupe(0x000000B0)->state >= 2) {
func_8009A640(arg0->D_8018DEE0_index, 0, temp_a2,
segmented_to_virtual_dupe_2(gCharacterCelebrateAnimation[temp_a1]));
arg0->state = 3;
func_800CA24C(temp_a2);
func_800C90F4(temp_a2, (gCharacterSelections[temp_a2] * 0x10) + 0x29008007);
}
}
}
break;
case 3:
if (D_8018DEE0[arg0->D_8018DEE0_index].sequenceIndex >= D_800E8440[temp_a1]) {
func_8009A640(arg0->D_8018DEE0_index, 0, temp_a2, segmented_to_virtual_dupe_2(D_800E83A0[temp_a1]));
arg0->state = 4;
}
break;
case 4:
default:
break;
}
}
void func_800AD1A4(MenuItem* arg0) {
switch (arg0->state) {
case 0:
arg0->column = 0x0000014A;
arg0->state = 1;
func_800921B4();
add_menu_item(MENU_ITEM_TYPE_0BB, 0, 0, MENU_ITEM_PRIORITY_0);
break;
case 1:
func_800A9208(arg0, 0x000000A0);
if (arg0->column == 0x000000A0) {
arg0->state = 2;
arg0->param2 = 0;
}
break;
case 2:
arg0->param2++;
if (arg0->param2 >= 0x15) {
arg0->state = 3;
}
break;
case 3:
if (D_8018D9D8 != 0) {
func_800921B4();
arg0->state = 4;
arg0->param1 = arg0->column;
add_menu_item(MENU_ITEM_TYPE_0BA, 0, 0, MENU_ITEM_PRIORITY_0);
}
break;
case 4:
arg0->column = arg0->param1;
if (arg0->param1 < 0x14A) {
if (D_8018D9D8 != 0) {
arg0->param1 += 0x20;
} else {
arg0->param1 += 0x10;
}
} else {
arg0->type = 0;
}
break;
default:
break;
}
}
void func_800AD2E8(MenuItem* arg0) {
struct_8018EE10_entry* thing;
s32 var_v1;
s32 var_a1;
s32 index;
switch (arg0->state) { /* switch 3; irregular */
case 0: /* switch 3 */
arg0->column = -0x000000A0;
arg0->state = 1;
for (index = 0; index < ARRAY_COUNT(gGPPointRewards); index++) {
sGPPointsCopy[index] = gGPPointRewards[index];
}
arg0->param2 = arg0->column;
break;
;
case 1: /* switch 3 */
arg0->column = arg0->param2;
if (D_8018D9D8 != 0) {
var_a1 = 0x20;
} else {
var_a1 = 0x10;
}
if ((arg0->param2 + var_a1) < 0) {
arg0->param2 += var_a1;
D_800DC5EC->screenStartX += var_a1;
D_800DC5F0->screenStartX -= var_a1;
} else {
arg0->param2 = 0;
arg0->column = 0;
arg0->state = gTimeTrialsResultCursorSelection;
if ((arg0->state == 9) && (D_80162DF8 == 1)) {
arg0->state--;
}
D_800DC5EC->screenStartX = 0x00F0;
D_800DC5F0->screenStartX = 0x0050;
}
break;
case 5: /* switch 3 */
case 6: /* switch 3 */
case 7: /* switch 3 */
case 8: /* switch 3 */
case 9: /* switch 3 */
case 10: /* switch 3 */
if (is_screen_being_faded() == 0) {
if ((gControllerOne->buttonPressed | gControllerOne->stickPressed) & 0x800) {
if (arg0->state >= 6) {
arg0->state--;
if ((D_80162DF8 == 1) && (arg0->state == 9)) {
arg0->state--;
}
play_sound2(SOUND_MENU_CURSOR_MOVE);
if (arg0->paramf < 4.2) {
arg0->paramf += 4.0;
}
arg0->subState = -1;
}
}
if ((gControllerOne->buttonPressed | gControllerOne->stickPressed) & 0x400) {
if (arg0->state < 0xA) {
arg0->state++;
if ((D_80162DF8 == 1) && (arg0->state == 9)) {
arg0->state++;
}
if ((arg0->state == 0x0000000A) && (D_80162DD4 != 0)) {
arg0->state -= 2;
} else {
play_sound2(SOUND_MENU_CURSOR_MOVE);
if (arg0->paramf < 4.2) {
arg0->paramf += 4.0;
}
arg0->subState = 1;
}
}
}
if (gControllerOne->buttonPressed & 0x9000) {
if (arg0->state == 0x0000000A) {
var_v1 = 0;
if (arg0->paramf < 4.2) {
arg0->paramf += 4.0;
}
if (gControllerPak1State != 0) {
var_v1 = 0;
switch (osPfsFindFile(&gControllerPak1FileHandle, gCompanyCode, gGameCode, (u8*) gGameName,
(u8*) gExtCode, &gControllerPak1FileNote)) { /* switch 4; irregular */
case 5: /* switch 4 */
break;
case 0: /* switch 4 */
func_800B6708();
arg0->state = func_800B6348((gCupSelection * 4) + gCourseIndexInCup) + 0x11;
var_v1 = 1;
play_sound2(SOUND_MENU_SELECT);
break;
case 2: /* switch 4 */
gControllerPak1State = 0;
break;
default: /* switch 4 */
gControllerPak1State = 0;
break;
}
}
if (var_v1 == 0) {
if (gControllerPak1State == 0) {
switch (func_800B5F30()) { /* switch 2 */
case -1: /* switch 2 */
arg0->state = 0x0000000B;
var_v1 = 1;
break;
case -3: /* switch 2 */
case -2: /* switch 2 */
arg0->state = 0x0000000C;
var_v1 = 1;
break;
case 1: /* switch 2 */
case 11: /* switch 2 */
arg0->state = 0x0000000B;
var_v1 = 1;
break;
case 10: /* switch 2 */
arg0->state = 0x0000000C;
var_v1 = 1;
break;
default: /* switch 2 */
var_v1 = 1;
arg0->state = 0x0000000C;
break;
case 0:
break;
}
if (var_v1 != 0) {
play_sound2(SOUND_MENU_FILE_NOT_FOUND);
return;
}
if (osPfsFindFile(&gControllerPak1FileHandle, gCompanyCode, gGameCode, (u8*) gGameName,
(u8*) gExtCode, &gControllerPak1FileNote) == 0) {
func_800B6708();
arg0->state = func_800B6348((gCupSelection * 4) + gCourseIndexInCup) + 0x11;
play_sound2(SOUND_MENU_SELECT);
return;
}
}
if (gControllerPak1MaxWriteableFiles >= gControllerPak1NumFilesUsed) {
arg0->state = 0x0000000E;
play_sound2(SOUND_MENU_FILE_NOT_FOUND);
return;
}
if (gControllerPak1NumPagesFree >= 0x79) {
arg0->state = 0x00000013;
arg0->param1 = 0;
play_sound2(SOUND_MENU_SELECT);
return;
}
arg0->state = 0x0000000E;
play_sound2(SOUND_MENU_FILE_NOT_FOUND);
}
} else {
arg0->param1 = arg0->state;
gTimeTrialsResultCursorSelection = arg0->state;
arg0->state = 0x0000001E;
arg0->param2 = arg0->row;
play_sound2(SOUND_ACTION_NEXT_COURSE);
if (arg0->paramf < 4.2) {
arg0->paramf += 4.0;
}
}
}
}
break;
case 11: /* switch 1 */
case 12: /* switch 1 */
case 13: /* switch 1 */
case 14: /* switch 1 */
case 15: /* switch 1 */
case 16: /* switch 1 */
case 26: /* switch 1 */
if (gControllerOne->buttonPressed & 0xD000) {
arg0->state = 0x0000000A;
play_sound2(SOUND_MENU_GO_BACK);
if (arg0->paramf < 4.2) {
arg0->paramf += 4.0;
}
}
break;
case 17: /* switch 1 */
case 18: /* switch 1 */
arg0->param2 = arg0->state - 0x11;
if (func_800B639C((gCupSelection * 4) + gCourseIndexInCup) != arg0->param2) {
if ((gControllerOne->buttonPressed | gControllerOne->stickPressed) & 0x800) {
if (arg0->state >= 0x12) {
arg0->state--;
play_sound2(SOUND_MENU_CURSOR_MOVE);
if (arg0->paramf < 4.2) {
arg0->paramf += 4.0;
}
arg0->subState = -1;
}
}
if ((gControllerOne->buttonPressed | gControllerOne->stickPressed) & 0x400) {
if (arg0->state < 0x12) {
arg0->state++;
play_sound2(SOUND_MENU_CURSOR_MOVE);
if (arg0->paramf < 4.2) {
arg0->paramf += 4.0;
}
arg0->subState = 1;
}
}
}
if (gControllerOne->buttonPressed & 0x4000) {
arg0->state = 0x0000000A;
play_sound2(SOUND_MENU_GO_BACK);
return;
}
if (gControllerOne->buttonPressed & 0x9000) {
thing = &D_8018EE10[arg0->param2];
if (thing->ghostDataSaved == 0) {
arg0->state = 0x00000019;
arg0->param1 = 0;
} else if (func_800B63F0(arg0->param2) == 0) {
arg0->state = 0x00000010;
} else {
arg0->state = 0x00000014;
}
play_sound2(SOUND_MENU_SELECT);
if (arg0->paramf < 4.2) {
arg0->paramf += 4.0;
}
}
break;
case 19: /* switch 1 */
if ((arg0->param1 == 1) && (func_800B6A68() != 0)) {
arg0->state = 0x0000000F;
return;
} else {
arg0->param1++;
if (arg0->param1 >= 2) {
arg0->state = 0x00000011;
}
}
break;
case 20: /* switch 1 */
case 21: /* switch 1 */
if (((gControllerOne->buttonPressed | gControllerOne->stickPressed) & 0x800) && (arg0->state >= 0x15)) {
arg0->state--;
play_sound2(SOUND_MENU_CURSOR_MOVE);
if (arg0->paramf < 4.2) {
arg0->paramf += 4.0;
}
arg0->subState = -1;
}
if ((gControllerOne->buttonPressed | gControllerOne->stickPressed) & 0x400) {
if (arg0->state < 0x15) {
arg0->state++;
play_sound2(SOUND_MENU_CURSOR_MOVE);
if (arg0->paramf < 4.2) {
arg0->paramf += 4.0;
}
arg0->subState = 1;
}
}
if (gControllerOne->buttonPressed & 0x4000) {
arg0->state = arg0->param2 + 0x11;
play_sound2(SOUND_MENU_GO_BACK);
return;
}
if (gControllerOne->buttonPressed & 0x9000) {
if (arg0->state == 0x00000015) {
arg0->state = 0x00000019;
arg0->param1 = 0;
play_sound2(SOUND_MENU_SELECT);
if (arg0->paramf < 4.2) {
arg0->paramf += 4.0;
}
} else {
arg0->state = arg0->param2 + 0x11;
play_sound2(SOUND_MENU_GO_BACK);
return;
}
}
break;
case 25: /* switch 1 */
if (arg0->param1 == 1) {
if (osPfsFindFile(&gControllerPak1FileHandle, gCompanyCode, gGameCode, (u8*) gGameName, (u8*) gExtCode,
&gControllerPak1FileNote) != 0) {
arg0->state = 0x0000001A;
play_sound2(SOUND_MENU_FILE_NOT_FOUND);
return;
}
if (func_800B6178(arg0->param2) != 0) {
arg0->state = 0x0000001A;
play_sound2(SOUND_MENU_FILE_NOT_FOUND);
return;
}
}
arg0->param1++;
if (arg0->param1 >= 2) {
arg0->state = 0x0000000A;
return;
}
break;
case 30: /* switch 1 */
arg0->row = arg0->param2;
if (arg0->param2 < 0xF0) {
arg0->param2 += 0x10;
D_800DC5EC->screenStartY += 0x10;
D_800DC5F0->screenStartY -= 0x10;
return;
}
switch (arg0->param1) { /* switch 3 */
case 5: /* switch 3 */
D_8015F890 = 0;
D_8015F892 = 1;
func_802903B0();
break;
case 6: /* switch 3 */
func_80290388();
break;
case 7: /* switch 3 */
func_80290360();
break;
case 8: /* switch 3 */
func_80290338();
break;
case 9: /* switch 3 */
D_8015F890 = 1;
D_8015F892 = 0;
func_802903B0();
break;
}
arg0->param2 = 0;
arg0->state = 0x0000001F;
D_800DC5EC->screenStartY = 0x012C;
D_800DC5F0->screenStartY = -0x003C;
D_8015F894 = 4;
func_800CA330(0x19U);
break;
case 31: /* switch 1 */
arg0->type = 0;
break;
}
}
#ifdef VERSION_EU
#define FUNC_800ADF48DEF 70
#else
#define FUNC_800ADF48DEF 60
#endif
void func_800ADF48(MenuItem* arg0) {
UNUSED s32 stackPadding;
struct Controller* controller;
if (gIsGamePaused != 0) {
switch (arg0->state) {
case 0:
arg0->state = D_800F0B50[gModeSelection];
break;
case 11:
case 12:
case 13:
case 14:
case 15:
case 21:
case 22:
case 23:
case 24:
case 31:
case 32:
case 41:
case 42:
case 43:
case 44:
if (is_screen_being_faded() == 0) {
controller = &gControllers[gIsGamePaused - 1];
if ((controller->buttonPressed | controller->stickPressed) & 0x800) {
if (D_800F0B50[gModeSelection] < arg0->state) {
arg0->state--;
play_sound2(SOUND_MENU_CURSOR_MOVE);
if (arg0->paramf < 4.2) {
arg0->paramf += 4.0;
}
arg0->subState = -1;
}
}
if ((controller->buttonPressed | controller->stickPressed) & 0x400) {
if (arg0->state < D_800F0B54[gModeSelection]) {
arg0->state++;
play_sound2(SOUND_MENU_CURSOR_MOVE);
if (arg0->paramf < 4.2) {
arg0->paramf += 4.0;
}
arg0->subState = 1;
}
}
if (controller->buttonPressed & B_BUTTON) {
if (arg0->state != D_800F0B50[gModeSelection]) {
arg0->state = D_800F0B50[gModeSelection];
play_sound2(SOUND_MENU_GO_BACK);
return;
}
}
if (controller->buttonPressed & (START_BUTTON | A_BUTTON)) {
if (arg0->state == D_800F0B50[gModeSelection]) {
arg0->state = 0;
gIsGamePaused = 0;
func_8028DF38();
func_800C9F90(0U);
} else {
func_8009DFE0(30);
play_sound2(SOUND_ACTION_CONTINUE_UNKNOWN);
func_800CA330(FUNC_800ADF48DEF);
if (arg0->paramf < 4.2) {
arg0->paramf += 4.0;
}
}
}
}
break;
default:
break;
}
} else {
arg0->state = 0;
}
}
void func_800AE218(MenuItem* arg0) {
struct_8018EE10_entry* thing;
s32 var_v1;
if (arg0->state != 0) {
D_800DC5B8 = 0;
}
switch (arg0->state) { /* switch 1 */
case 0: /* switch 1 */
if (arg0->param1 < 0x1E) {
arg0->param1++;
}
if (gControllerOne->buttonPressed & 0x1000) {
arg0->state = 0x0000000F;
play_sound2(SOUND_ACTION_GO_BACK_2);
} else if (playerHUD[PLAYER_ONE].raceCompleteBool != 0) {
arg0->state = 1;
arg0->param1 = 0;
}
break;
default: /* switch 1 */
break;
case 1: /* switch 1 */
arg0->param1 += 3;
if (arg0->param1 >= 0x8D) {
arg0->state = 0x0000000F;
}
break;
case 11: /* switch 1 */
case 12: /* switch 1 */
case 13: /* switch 1 */
case 14: /* switch 1 */
case 15: /* switch 1 */
case 16: /* switch 1 */
if (is_screen_being_faded() == 0) {
if ((gControllerOne->buttonPressed | gControllerOne->stickPressed) & 0x800) {
if (arg0->state >= 0xC) {
arg0->state--;
play_sound2(SOUND_MENU_CURSOR_MOVE);
if (arg0->paramf < 4.2) {
arg0->paramf += 4.0;
}
arg0->subState = -1;
}
}
if ((gControllerOne->buttonPressed | gControllerOne->stickPressed) & 0x400) {
if (arg0->state < 0x10) {
arg0->state++;
play_sound2(SOUND_MENU_CURSOR_MOVE);
if (arg0->paramf < 4.2) {
arg0->paramf += 4.0;
}
arg0->subState = 1;
}
}
if (gControllerOne->buttonPressed & 0x9000) {
if (arg0->state == 0x00000010) {
var_v1 = 0;
if (arg0->paramf < 4.2) {
arg0->paramf += 4.0;
}
if (gControllerPak1State != 0) {
var_v1 = 0;
switch (osPfsFindFile(&gControllerPak1FileHandle, gCompanyCode, gGameCode, (u8*) gGameName,
(u8*) gExtCode, &gControllerPak1FileNote)) { /* switch 3; irregular */
case PFS_ERR_INVALID: /* switch 3 */
break;
case PFS_NO_ERROR: /* switch 3 */
func_800B6708();
arg0->state = func_800B6348((gCupSelection * 4) + gCourseIndexInCup) + 0x1E;
var_v1 = 1;
break;
case PFS_ERR_NEW_PACK: /* switch 3 */
gControllerPak1State = 0;
break;
default: /* switch 3 */
gControllerPak1State = 0;
break;
}
}
if (var_v1 != 0) {
play_sound2(SOUND_MENU_SELECT);
return;
}
if (gControllerPak1State == 0) {
switch (func_800B5F30()) { /* switch 2 */
case PFS_INVALID_DATA: /* switch 2 */
arg0->state = 0x00000015;
var_v1 = 1;
break;
case PFS_FREE_BLOCKS_ERROR: /* switch 2 */
case PFS_NUM_FILES_ERROR: /* switch 2 */
arg0->state = 0x00000016;
var_v1 = 1;
break;
case PFS_ERR_NOPACK: /* switch 2 */
case PFS_ERR_DEVICE: /* switch 2 */
arg0->state = 0x00000015;
var_v1 = 1;
break;
case PFS_ERR_ID_FATAL: /* switch 2 */
arg0->state = 0x00000016;
var_v1 = 1;
break;
default: /* switch 2 */
var_v1 = 1;
arg0->state = 0x00000016;
break;
case 0:
break;
}
if (var_v1 != 0) {
play_sound2(SOUND_MENU_FILE_NOT_FOUND);
return;
}
if (osPfsFindFile(&gControllerPak1FileHandle, gCompanyCode, gGameCode, (u8*) gGameName,
(u8*) gExtCode, &gControllerPak1FileNote) == 0) {
func_800B6708();
arg0->state = func_800B6348((gCupSelection * 4) + gCourseIndexInCup) + 0x1E;
play_sound2(SOUND_MENU_SELECT);
return;
}
}
if (gControllerPak1MaxWriteableFiles >= gControllerPak1NumFilesUsed) {
arg0->state = 0x00000018;
play_sound2(SOUND_MENU_FILE_NOT_FOUND);
} else if (gControllerPak1NumPagesFree >= 0x79) {
arg0->state = 0x00000020;
arg0->param1 = 0;
play_sound2(SOUND_MENU_SELECT);
} else {
arg0->state = 0x00000018;
play_sound2(SOUND_MENU_FILE_NOT_FOUND);
}
} else {
func_8009DFE0(0x0000001E);
play_sound2(SOUND_MENU_OK_CLICKED);
func_800CA330(0x19U);
func_800CA388(0x19U);
if (arg0->paramf < 4.2) {
arg0->paramf += 4.0;
}
}
}
}
break;
case 21: /* switch 1 */
case 22: /* switch 1 */
case 23: /* switch 1 */
case 24: /* switch 1 */
case 25: /* switch 1 */
case 26: /* switch 1 */
case 41: /* switch 1 */
if (gControllerOne->buttonPressed & 0xD000) {
arg0->state = 0x00000010;
play_sound2(SOUND_MENU_GO_BACK);
if (arg0->paramf < 4.2) {
arg0->paramf += 4.0;
}
}
break;
case 30: /* switch 1 */
case 31: /* switch 1 */
arg0->param2 = (u32) arg0->state - 0x1E;
if (func_800B639C((gCupSelection * 4) + gCourseIndexInCup) != arg0->param2) {
if ((gControllerOne->buttonPressed | gControllerOne->stickPressed) & 0x800) {
if (arg0->state >= 0x1F) {
arg0->state--;
play_sound2(SOUND_MENU_CURSOR_MOVE);
if (arg0->paramf < 4.2) {
arg0->paramf += 4.0;
}
arg0->subState = -1;
}
}
if ((gControllerOne->buttonPressed | gControllerOne->stickPressed) & 0x400) {
if (arg0->state < 0x1F) {
arg0->state++;
play_sound2(SOUND_MENU_CURSOR_MOVE);
if (arg0->paramf < 4.2) {
arg0->paramf += 4.0;
}
arg0->subState = 1;
}
}
}
if (gControllerOne->buttonPressed & 0x4000) {
arg0->state = 0x00000010;
play_sound2(SOUND_MENU_GO_BACK);
} else if (gControllerOne->buttonPressed & 0x9000) {
thing = &D_8018EE10[arg0->param2];
if (thing->ghostDataSaved == 0) {
arg0->state = 0x00000028;
arg0->param1 = 0;
} else if (func_800B63F0(arg0->param2) == 0) {
arg0->state = 0x0000001A;
} else {
arg0->state = 0x00000023;
}
play_sound2(SOUND_MENU_SELECT);
if (arg0->paramf < 4.2) {
arg0->paramf += 4.0;
}
}
break;
case 32: /* switch 1 */
if ((arg0->param1 == 1) && (func_800B6A68() != 0)) {
arg0->state = 0x00000019;
} else {
arg0->param1++;
if (arg0->param1 >= 2) {
arg0->state = 0x0000001E;
}
}
break;
case 35: /* switch 1 */
case 36: /* switch 1 */
if (((gControllerOne->buttonPressed | gControllerOne->stickPressed) & 0x800) &&
((s32) (u32) arg0->state >= 0x24)) {
arg0->state--;
play_sound2(SOUND_MENU_CURSOR_MOVE);
if (arg0->paramf < 4.2) {
arg0->paramf += 4.0;
}
arg0->subState = -1;
}
if ((gControllerOne->buttonPressed | gControllerOne->stickPressed) & 0x400) {
if (arg0->state < 0x24) {
arg0->state++;
play_sound2(SOUND_MENU_CURSOR_MOVE);
if (arg0->paramf < 4.2) {
arg0->paramf += 4.0;
}
arg0->subState = 1;
}
}
if (gControllerOne->buttonPressed & 0x4000) {
arg0->state = arg0->param2 + 0x1E;
play_sound2(SOUND_MENU_GO_BACK);
} else if (gControllerOne->buttonPressed & 0x9000) {
if (arg0->state == 0x00000024) {
arg0->state = 0x00000028;
arg0->param1 = 0;
play_sound2(SOUND_MENU_SELECT);
if (arg0->paramf < 4.2) {
arg0->paramf += 4.0;
}
} else {
arg0->state = arg0->param2 + 0x1E;
play_sound2(SOUND_MENU_GO_BACK);
}
}
break;
case 40: /* switch 1 */
if (arg0->param1 == 1) {
if (osPfsFindFile(&gControllerPak1FileHandle, gCompanyCode, gGameCode, (u8*) gGameName, (u8*) gExtCode,
&gControllerPak1FileNote) != 0) {
arg0->state = 0x00000029;
play_sound2(SOUND_MENU_FILE_NOT_FOUND);
return;
}
if (func_800B6178(arg0->param2) != 0) {
arg0->state = 0x00000029;
play_sound2(SOUND_MENU_FILE_NOT_FOUND);
return;
}
}
arg0->param1++;
if (arg0->param1 >= 2) {
arg0->state = 0x00000010;
}
break;
}
}
void func_800AEC54(MenuItem* arg0) {
switch (arg0->state) {
case 0:
arg0->column = (get_string_width(gTextMenuAnnounceGhost) / 2) + 0x140;
arg0->row = 0x000000DA;
arg0->state = 1;
func_800C90F4(0U, (D_80162DE4 * 0x10) + 0x29008001);
break;
case 1:
func_800A9208(arg0, 0x000000A0);
if (arg0->column == 0x000000A0) {
arg0->state = 2;
arg0->param1 = 0;
}
break;
case 2:
arg0->param1++;
if (arg0->param1 >= 0x3D) {
arg0->state = 3;
arg0->param1 = 0;
}
break;
case 4:
arg0->param1++;
if (arg0->param1 >= 6) {
arg0->type = 0;
break;
}
// Purposeful fallthrough
case 3:
func_800A94C8(arg0, 0x000000A0, -1);
if (((arg0->column + 0x14) == -(get_string_width(gTextMenuAnnounceGhost) / 2)) && (arg0->state == 3)) {
arg0->state = 4;
}
break;
default:
break;
}
}
void func_800AEDBC(MenuItem* arg0) {
if (arg0->param1 != gTimeTrialDataCourseIndex) {
arg0->param1 = (s32) gTimeTrialDataCourseIndex;
func_8009A594(arg0->D_8018DEE0_index, 0,
segmented_to_virtual_dupe_2(
D_800E7E34[gCupCourseOrder[gTimeTrialDataCourseIndex / 4][gTimeTrialDataCourseIndex % 4]]));
if (controller_pak_1_status() == PFS_NO_ERROR) {
func_800B6708();
} else {
D_8018EE10[0].ghostDataSaved = 0;
D_8018EE10[1].ghostDataSaved = 0;
}
}
}
void func_800AEE90(MenuItem* arg0) {
if (gSubMenuSelection != SUB_MENU_DATA_OPTIONS) {
arg0->visible = 0;
} else {
arg0->visible = 1;
}
}
void func_800AEEBC(MenuItem* arg0) {
if (gSubMenuSelection != SUB_MENU_DATA_ERASE_CONFIRM) {
arg0->visible = 0;
} else {
arg0->visible = 1;
}
}
void func_800AEEE8(MenuItem* arg0) {
if (gSubMenuSelection != SUB_MENU_DATA_CANT_ERASE) {
arg0->visible = 0;
} else {
arg0->visible = 1;
}
}
void func_800AEF14(MenuItem* arg0) {
if (playerHUD[PLAYER_ONE].raceCompleteBool != 0) {
if ((u32) playerHUD[PLAYER_ONE].someTimer < (u32) (func_800B4E24(4) & 0xFFFFF)) {
D_8018ED90 = 1;
}
arg0->type = 0;
}
}
void func_800AEF74(MenuItem* arg0) {
switch (arg0->state) { /* irregular */
case 0:
if (D_80162DF8 == 1) {
arg0->state = 1;
arg0->param1 = 0;
} else if (playerHUD[PLAYER_ONE].raceCompleteBool == (s8) 1) {
arg0->state = 2;
}
break;
case 2:
break;
case 1:
arg0->param1 += 1;
if (playerHUD[PLAYER_ONE].raceCompleteBool == 1) {
arg0->state = 2;
}
break;
}
}
void func_800AF004(MenuItem* arg0) {
UNUSED s32 temp_t1;
switch (arg0->state) {
case 0:
arg0->param1 += 3;
if (arg0->param1 >= 0x65) {
arg0->param1 = 0;
arg0->state = 1;
gCupSelection %= 4;
gCCSelection %= 4;
add_menu_item(MENU_ITEM_TYPE_12C, 0, 0, MENU_ITEM_PRIORITY_4);
}
break;
case 1:
case 2:
case 3:
case 4:
arg0->param1 += 1;
if (arg0->param1 >= 9) {
arg0->param1 = 0;
arg0->state++;
add_menu_item(arg0->state + MENU_ITEM_TYPE_12B, 0, 0, MENU_ITEM_PRIORITY_4);
}
break;
case 5:
arg0->param1 += 1;
if ((arg0->param1 >= 0x65) &&
((gControllerFive->buttonPressed != 0) || (gControllerFive->stickPressed != 0))) {
arg0->state = 6;
arg0->param1 = 0;
if (D_802874D8.unk1D < 3) {
play_sound2(SOUND_MENU_OK_CLICKED);
} else {
play_sound2(SOUND_ACTION_CONTINUE_UNKNOWN);
}
}
break;
case 6:
func_8009DFE0(0x0000001E);
func_800CA330(0x19U);
func_800CA388(0x19U);
arg0->state = 7;
break;
case 7:
default:
break;
}
}
void func_800AF1AC(MenuItem* arg0) {
Unk_D_800E70A0* temp_v0_2;
s32 idx = arg0->type - 0x12C;
switch (arg0->state) { /* irregular */
case 0:
temp_v0_2 = &D_800E7458[idx];
arg0->column = temp_v0_2->column;
arg0->row = temp_v0_2->row;
arg0->state = 1;
break;
case 1:
temp_v0_2 = &D_800E7480[idx];
func_800A91D8(arg0, temp_v0_2->column, temp_v0_2->row);
if ((arg0->column == temp_v0_2->column) && (arg0->row == temp_v0_2->row)) {
arg0->state = 2;
}
break;
case 2:
break;
}
}
void func_800AF270(MenuItem* arg0) {
s32 temp_v1;
s32 sp30;
s32 temp_v0;
Unk_D_800E70A0* thing;
temp_v1 = arg0->type - 0x12C;
sp30 = D_802874D8.unk1E;
temp_v0 = D_800EFD64[sp30];
switch (arg0->state) {
case 0:
thing = &D_800E7458[temp_v1];
arg0->column = thing->column;
arg0->row = thing->row;
arg0->state = 1;
break;
case 1:
thing = &D_800E7480[temp_v1];
func_800A91D8(arg0, thing->column, thing->row);
if ((arg0->column == thing->column) && (arg0->row == thing->row)) {
arg0->state = 2;
arg0->param2 = 0;
}
break;
case 2:
arg0->param2++;
if (arg0->param2 >= 0x1F) {
if (D_802874D8.unk1D >= 3) {
arg0->state = 4;
func_800CA0B8();
func_800C90F4(0U, (sp30 * 0x10) + SOUND_ARG_LOAD(0x29, 0x00, 0x80, 0x03));
func_800CA0A0();
} else {
arg0->state = 3;
func_8009A640(arg0->D_8018DEE0_index, 0, sp30,
segmented_to_virtual_dupe_2(gCharacterCelebrateAnimation[temp_v0]));
func_800CA0B8();
func_800C90F4(0U, (sp30 * 0x10) + SOUND_ARG_LOAD(0x29, 0x00, 0x80, 0x07));
func_800CA0A0();
}
}
break;
case 3:
if (D_8018DEE0[arg0->D_8018DEE0_index].sequenceIndex >= D_800E8440[temp_v0]) {
func_8009A640(arg0->D_8018DEE0_index, 0, sp30, segmented_to_virtual_dupe_2(D_800E83A0[temp_v0]));
arg0->state = 4;
}
break;
case 4:
break;
}
}
void func_800AF480(MenuItem* arg0) {
s32 idx = arg0->type - 0x190;
if ((gCreditsTextRenderInfo[idx].slideDirection == 0) || (gCreditsTextRenderInfo[idx].slideDirection != 1)) {
func_800AF4DC(arg0);
} else {
func_800AF740(arg0);
}
}
void func_800AF4DC(MenuItem* arg0) {
UNUSED s32 pad;
s32 temp_v0;
CreditsRenderInfo* temp_v1;
temp_v0 = arg0->type - 0x190;
temp_v1 = &gCreditsTextRenderInfo[temp_v0];
arg0->row = temp_v1->row;
switch (arg0->state) {
case 0:
arg0->column = temp_v1->startingColumn;
arg0->state = 1;
arg0->param2 = temp_v1->columnExtra + (get_string_width(gCreditsText[temp_v0]) * temp_v1->textScaling / 2);
/* fallthrough */
case 1:
func_800A9208(arg0, arg0->param2);
arg0->param1 = (s32) (arg0->param2 - arg0->column) / 4;
if (arg0->param1 >= 9) {
arg0->param1 = 8;
}
arg0->paramf = (arg0->param1 * 0.05) + 1.0;
if (arg0->column >= (arg0->param2 - 0x14)) {
arg0->state = 2;
arg0->D_8018DEE0_index = 0;
}
break;
case 2:
func_800A9208(arg0, arg0->param2);
arg0->param1 = (arg0->param2 - arg0->column) / 4;
arg0->D_8018DEE0_index += 1;
arg0->paramf = ((arg0->D_8018DEE0_index - 0xA) * 0.0085 * (arg0->D_8018DEE0_index - 0xA)) + 0.4;
if ((arg0->D_8018DEE0_index >= 9) && ((f64) arg0->paramf > 1)) {
arg0->paramf = 1.0f;
arg0->state = 3;
}
break;
case 3:
if ((u8) D_8018ED91 != 0) {
arg0->state = 4;
}
break;
case 4:
func_800A94C8(arg0, arg0->param2, 1);
if (arg0->row > 480.0) {
arg0->type = 0;
}
break;
default:
break;
}
}
void func_800AF740(MenuItem* arg0) {
UNUSED s32 pad;
s32 temp_v0;
CreditsRenderInfo* temp_v1;
temp_v0 = arg0->type - 0x190;
temp_v1 = &gCreditsTextRenderInfo[temp_v0];
arg0->row = temp_v1->row;
switch (arg0->state) {
case 0:
arg0->column = temp_v1->startingColumn;
arg0->state = 1;
arg0->param2 = temp_v1->columnExtra - (get_string_width(gCreditsText[temp_v0]) * temp_v1->textScaling / 2);
/* fallthrough */
case 1:
func_800A9208(arg0, arg0->param2);
arg0->param1 = (s32) (arg0->column - arg0->param2) / 4;
if (arg0->param1 >= 9) {
arg0->param1 = 8;
}
arg0->paramf = (arg0->param1 * 0.05) + 1.0;
if ((arg0->param2 + 0x14) >= arg0->column) {
arg0->state = 2;
arg0->D_8018DEE0_index = 0;
}
break;
case 2:
func_800A9208(arg0, arg0->param2);
arg0->param1 = (arg0->column - arg0->param2) / 4;
arg0->D_8018DEE0_index += 1;
arg0->paramf = ((arg0->D_8018DEE0_index - 0xA) * 0.0085 * (arg0->D_8018DEE0_index - 0xA)) + 0.4;
if ((arg0->D_8018DEE0_index >= 9) && ((f64) arg0->paramf > 1)) {
arg0->paramf = 1.0f;
arg0->state = 3;
}
break;
case 3:
if ((u8) D_8018ED91 != 0) {
arg0->state = 4;
}
break;
case 4:
func_800A94C8(arg0, arg0->param2, -1);
if (arg0->row > 480.0) {
arg0->type = 0;
}
break;
default:
break;
}
}