summaryrefslogtreecommitdiff
path: root/src/menu_items.c
diff options
context:
space:
mode:
authorMegaMech <MegaMech@users.noreply.github.com>2025-01-04 14:47:22 -0700
committerGitHub <noreply@github.com>2025-01-04 14:47:22 -0700
commit4dfc8a9fef29af9319d7c145ba7190540ccd9d02 (patch)
tree81cfb2e009ca3e66db1bb40f14887b014e4786ab /src/menu_items.c
parent1101dcafb08a1f17b06306ff44a9d869ffeb7862 (diff)
parenteb8e6abc20117228246653bf5f950caada20537d (diff)
Merge pull request #134 from MegaMech/91750
The Big code_80091750.c PR
Diffstat (limited to 'src/menu_items.c')
-rw-r--r--src/menu_items.c12298
1 files changed, 12298 insertions, 0 deletions
diff --git a/src/menu_items.c b/src/menu_items.c
new file mode 100644
index 000000000..a59a996b9
--- /dev/null
+++ b/src/menu_items.c
@@ -0,0 +1,12298 @@
+#include <libultraship.h>
+#include <macros.h>
+#include <string.h>
+#include <mk64.h>
+#include <stubs.h>
+#include <defines.h>
+#include <segments.h>
+#include <libultra/types.h>
+#include <sounds.h>
+#include <assets/texture_data_2.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"
+
+#include "stdio.h"
+#include "port/Engine.h"
+#include "port/Game.h"
+
+#include "engine/Engine.h"
+#include "engine/courses/Course.h"
+#include "engine/Matrix.h"
+
+const char* GetCupName(void);
+
+void guMtxCatL(Mtx* m, Mtx* n, Mtx* res);
+
+const char* sMenuTextureList[MENU_TEXTURE_BUFFER_MAX];
+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 + 1];
+struct_8018E0E8_entry D_8018E0E8[D_8018E0E8_SIZE];
+s32 sMenuTextureListIndex;
+TextureMap sMenuTextureMap[TEXTURE_MAP_MAX];
+s32 sMenuTextureEntries;
+Gfx* sGfxPtr;
+s32 gNumD_8018E768Entries;
+struct_8018E768_entry D_8018E768[D_8018E768_SIZE];
+s32 gCycleFlashMenu;
+s8 D_8018E7AC[5];
+u32 D_8018E7B8[5];
+u32 D_8018E7D0[5];
+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;
+ALIGNED8 SaveData gSaveData;
+
+u8 D_8018ED90;
+u8 D_8018ED91;
+s32 sIntroLogoTimer;
+
+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",
+};
+
+// @todo Increase this array for more than eight players
+const s8 D_800EFD64[] = { 0, 1, 4, 3, 5, 6, 2, 7 };
+
+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* 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 ",
+};
+
+char* D_800E78BC[] = {
+ "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
+};
+
+MenuTexture* D_800E7E00[] = {
+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[] = {
+ D_0200211C, D_02002144, D_0200216C, D_02002194, D_020021BC, D_020021E4, D_0200220C, D_02002234, D_0200225C,
+ D_02002284, D_020022AC, D_020022D4, D_020022FC, D_02002324, D_0200234C, D_02002374, D_0200239C, D_020023C4,
+ D_020023EC, D_02002414, D_0200243C, D_02002464, D_0200248C, D_020024B4, D_020024DC, D_02002504, D_0200252C,
+ D_02002554, D_0200257C, D_020025A4, D_02004584, D_0200261C, D_02002694, D_020026BC, D_020026E4, D_0200270C,
+ D_02002734, D_0200275C, D_02002784, D_020027AC, D_020027D4, D_020027FC, D_020025CC, D_02002644, D_020025F4,
+ D_0200266C, D_02004534, D_02004584, 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[] = {
+ D_02004534,
+ D_0200455C,
+};
+
+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,
+ D_020048A4,
+ D_020048CC,
+};
+
+MenuTexture* D_800E8274[] = { // CC textures
+ seg2_50_CC_texture, seg2_100_CC_texture, seg2_150_CC_texture, seg2_extra_CC_texture,
+};
+MenuTexture* D_800E8284[] = { // Versus and Battle textures
+ D_020049BC, seg2_menu_no_item_texture
+};
+MenuTexture* D_800E828C[] = { // Time Trials Begin & Data (probably)
+ D_020049E4, seg2_data_texture,
+};
+
+// Next three variables are duplicates of the above, for whatever reason...
+MenuTexture* D_800E8294[] = {
+ seg2_50_CC_texture, seg2_100_CC_texture, seg2_150_CC_texture, seg2_extra_CC_texture
+};
+
+MenuTexture* D_800E82A4[] = {
+ D_020049BC, seg2_menu_no_item_texture
+};
+
+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;
+
+f32 sIntroModelMotionSpeed = 0.0f;
+
+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) {
+ // save data disabled for now due to array overflow
+ // load_save_data();
+ }
+ if (func_80091D74() != 0) {
+ gMenuSelection = CONTROLLER_PAK_MENU;
+ }
+ }
+ if (gMenuSelection == LOGO_INTRO_MENU) {
+ gNextFreeMemoryAddress = gFreeMemoryResetAnchor;
+#ifdef TARGET_N64
+ set_segment_base_addr(6, decompress_segments((u8*) STARTUP_LOGO_ROM_START, (u8*) STARTUP_LOGO_ROM_END));
+#endif
+ }
+ gNextFreeMemoryAddress = gFreeMemoryResetAnchor;
+ // Hypothetically, this should be a ptr... But only hypothetically.
+ //sMenuTextureList = 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_D_8018EE0C = 0;
+
+ for (i = 0; i < 5; i++) {
+ D_8018E7AC[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 = 1;
+ 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 = (GetCupIndex() * 4) + GetCupCursorPosition();
+ 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);
+ //sMenuTextureList = (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++) {
+ D_8018E7AC[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;
+ 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*) LOAD_ASSET(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* item = find_menu_items_dupe(MENU_ITEM_TYPE_0AF);
+ if (item->state == 2) {
+ item->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);
+ break;
+ 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);
+ break;
+ 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);
+ break;
+ 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);
+ break;
+ 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);
+ break;
+ 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);
+ break;
+ 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);
+ break;
+ 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);
+ break;
+ 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);
+ break;
+ 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);
+ break;
+ 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);
+ break;
+ 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);
+ break;
+ 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);
+ break;
+ 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);
+ break;
+ 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);
+ break;
+ 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);
+ break;
+ 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);
+ break;
+ 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);
+ break;
+ case 18:
+ add_menu_item(MENU_ITEM_TYPE_1CD, 0, 0, MENU_ITEM_PRIORITY_2);
+ break;
+ }
+}
+
+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, 1);
+}
+
+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, 2);
+}
+
+void print_text1_right(s32 column, s32 row, char* text, s32 tracking, f32 scaleX, f32 scaleY) {
+ print_text1(column, row, text, tracking, scaleX, scaleY, 3);
+}
+
+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, 4);
+}
+
+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 (gNumScreens == 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 (gNumScreens == 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 (gNumScreens == 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);
+ AddEffectMatrixOrtho();
+ 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;
+ ClearEffectsMatrixPool();
+ }
+}
+
+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);
+ //sMenuTextureList = (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++) {
+ D_8018E7AC[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);
+ AddEffectMatrixOrtho();
+ gSPDisplayList(gDisplayListHead++, D_02007F18);
+ gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
+ 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;
+ ClearEffectsMatrixPool();
+}
+
+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);
+ AddEffectMatrixOrtho();
+ 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) {
+ ClearHudMatrixPool();
+ ClearEffectsMatrixPool();
+ 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, (s32*) &D_8018E850[1], (s32*) &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 != 0) {
+ 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;
+ }
+}
+
+CProperties* GetCoursePropsA(void);
+
+void func_80095574(void) {
+ s32 var_v0;
+
+ if ((unref_D_8018EE0C < 3) || (D_8018E7AC[4] != 0)) {
+ handle_menus_default();
+ }
+ if (gDebugMenuSelection >= 2) {
+ 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", GetCourseIndex());
+ // This isn't functionally equivallent, but who cares.
+ if (gCurrentCourseId < COURSE_TOADS_TURNPIKE) {
+ var_v0 = 0;
+ } else {
+ var_v0 = 8;
+ }
+ debug_print_str2(var_v0 + 0xB9, 0x0000006E, GetCoursePropsA()->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 == DEBUG_MENU_DEBUG_MODE) {
+ play_sound2(SOUND_INTRO_WELCOME);
+ }
+ if (gMenuTimingCounter >= 0x12D) {
+ 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
+ arg1 = LOAD_ASSET(arg1);
+ 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;
+ // A match is a match, but why are goto's required here?
+ if (gMatrixEffectCount >= 0x2F7) {
+ goto func_80095BD0_label1;
+ }
+ 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(&gGfxPool->mtxEffect[gMatrixEffectCount], arg2, arg3, arg6, arg7);
+ gSPMatrix(displayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxEffect[gMatrixEffectCount++]),
+ G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gMKLoadTextureTile_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);
+}
+
+// Player select menu character border
+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 < arg7; var_s3 += temp_lo) {
+
+ if (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;
+ }
+ gMKLoadTextureTile(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;
+
+ gMKLoadTextureTile(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;
+}
+
+#define D_0B002A00 gTextureTitleChocoMountain
+
+#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;
+ }
+ gMKLoadTextureTile(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, u16* argA, u32 argB, u32 argC, 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
+
+#undef D_0B002A00
+
+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);
+ gMKLoadTextureTile(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;
+
+ gMKLoadTextureTile(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;
+}
+
+// Render player characters at player select menu
+Gfx* func_80097E58(Gfx* displayListHead, s8 fmt, u32 arg2, u32 arg3, u32 arg4, u32 arg5, s32 arg6, s32 arg7,
+ u8* someTexture, u32 arg9, 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));
+
+ // Renders the left side
+ gMKLoadTextureTile(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));
+ // Renders the right side
+ gMKLoadTextureTile(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, (1 + 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) {
+ gMKLoadTextureTile(displayListHead++, sMenuTextureList, 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 (D_8018E7B8[0] == 0) {
+ D_8018E7B8[0] = 1;
+ }
+ temp_f24 = sins(((D_8018E7D0[0] * 0x4E20) / D_8018E7B8[0]) % 20000U);
+ temp_f0 = coss(((D_8018E7D0[0] * 0x4E20) / D_8018E7B8[0]) % 20000U);
+ temp_f18 = (((f32) D_8018E7D0[0] * 0.5) / D_8018E7B8[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) {
+ gMKLoadTextureTile(displayListHead++, sMenuTextureList, 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 >= SCREEN_WIDTH) {
+ lrx = SCREEN_WIDTH - 1;
+ }
+ if (lry >= SCREEN_HEIGHT) {
+ lry = SCREEN_HEIGHT - 1;
+ }
+ 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 filled with a solid color
+Gfx* draw_box_fill_wide(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 >= SCREEN_WIDTH) {
+ lrx = SCREEN_WIDTH - 1;
+ }
+ if (lry >= SCREEN_HEIGHT) {
+ lry = SCREEN_HEIGHT - 1;
+ }
+ gSPDisplayList(displayListHead++, D_02008030);
+ gDPSetFillColor(displayListHead++, (GPACK_RGBA5551(red, green, (u32) blue, alpha) << 0x10 |
+ GPACK_RGBA5551(red, green, (u32) blue, alpha)));
+ gDPFillWideRectangle(displayListHead++, OTRGetDimensionFromLeftEdge(ulx), uly, OTRGetDimensionFromRightEdge(lrx),
+ lry);
+ // 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* draw_box_wide(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);
+ gDPFillWideRectangle(displayListHead++, OTRGetRectDimensionFromLeftEdge(ulx), uly,
+ OTRGetRectDimensionFromRightEdge(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);
+}
+
+Gfx* func_80098FC8_wide(Gfx* displayListHead, s32 ulx, s32 uly, s32 lrx, s32 lry) {
+ return draw_box_fill_wide(displayListHead, ulx, uly, lrx, lry, 0, 0, 0, 0xFF);
+}
+
+void load_texture(const char* texture) {
+ if (sMenuTextureListIndex >= 500) {
+ printf("\nload_texture: REACHED MAXIMUM MENU ITEMS\n\n");
+ return;
+ }
+
+ sMenuTextureList[sMenuTextureListIndex] = texture;
+
+ sMenuTextureMap[sMenuTextureEntries].textureData = texture;
+ sMenuTextureMap[sMenuTextureEntries].offset = sMenuTextureListIndex;
+
+ sMenuTextureListIndex += 1;
+ sMenuTextureEntries += 1;
+}
+
+/**
+ * If you need to reset a texture cache after a modification,
+ * this will reload the texture.
+ */
+void load_texture_reset_cache(const char* texture) {
+ if (sMenuTextureListIndex >= 500) {
+ printf("\nload_texture: REACHED MAXIMUM MENU ITEMS\n\n");
+ return;
+ }
+
+ ResourceDirtyByName(texture);
+
+ sMenuTextureList[sMenuTextureListIndex] = texture;
+
+ sMenuTextureMap[sMenuTextureEntries].textureData = texture;
+ sMenuTextureMap[sMenuTextureEntries].offset = sMenuTextureListIndex;
+
+ sMenuTextureListIndex += 1;
+ sMenuTextureEntries += 1;
+}
+
+void replace_texture(s32 index, const char* newTexture) {
+ sMenuTextureList[sMenuTextureMap[index].offset] = newTexture;
+ sMenuTextureMap[index].textureData = newTexture;
+ //printf("\nTEST %s %p %s idx %d\n\n", sMenuTextureList[index], sMenuTextureList[sMenuTextureListIndex], newTexture, sMenuTextureListIndex);
+}
+
+// strcpy the const char asset strings into sMenuTextureList. This replaces osPiDma.
+void dma_compressed_mio0_texture_segA(u64* data, size_t nbytes, void* vaddr) {
+}
+
+// strcpy the const char asset strings into sMenuTextureList. This replaces osPiDma.
+void dma_tkmk00_textures(u64* data, size_t nbytes, void* vaddr) {
+}
+
+void clear_menu_textures(void) {
+ for (size_t i = 0; i < ARRAY_COUNT(sMenuTextureList); i++) {
+ sMenuTextureList[i] = NULL;
+ }
+
+ sMenuTextureListIndex = 0;
+ sMenuTextureEntries = 0;
+}
+
+/**
+ * Differs from memory.c with `+ 0x8` instead of `| 0x8`
+ *
+ * @param addr
+ * @return void*
+ */
+void* segmented_to_virtual_dupe(const void* addr) {
+#ifdef TARGET_N64
+ size_t segment = (uintptr_t) addr >> 24;
+ size_t offset = (uintptr_t) addr & 0x00FFFFFF;
+
+ return (void*) ((gSegmentTable[segment] + offset) + 0x80000000);
+#else
+ return addr;
+#endif
+}
+
+void* segmented_to_virtual_dupe_2(const void* addr) {
+#ifdef TARGET_N64
+ size_t segment = (uintptr_t) addr >> 24;
+ size_t offset = (uintptr_t) addr & 0x00FFFFFF;
+
+ return (void*) ((gSegmentTable[segment] + offset) + 0x80000000);
+#else
+ return addr;
+#endif
+}
+
+#include <assets/player_selection.h>
+
+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_compressed_mio0_texture_segA(texAddr->textureData, size, sMenuTextureList[sMenuTextureListIndex]);
+ mio0decode(gMenuCompressedBuffer, (u8*) &sMenuTextureList[sMenuTextureListIndex]);
+ load_texture(texAddr->textureData);
+ } else {
+ dma_compressed_mio0_texture_segA(texAddr->textureData, (texAddr->height * texAddr->width) * 2,
+ &sMenuTextureList[sMenuTextureListIndex]);
+ load_texture(texAddr->textureData);
+ }
+ //texMap[sMenuTextureEntries].textureData = texAddr->textureData;
+ //texMap[sMenuTextureEntries].offset = sMenuTextureListIndex;
+ //sMenuTextureListIndex += 1;
+ //sMenuTextureListIndex = ((sMenuTextureListIndex / 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_compressed_mio0_texture_segA(texAddr->textureData, (u32) (((s32) (texAddr->height * texAddr->width)) / 2),
+ &sMenuTextureList[sMenuTextureListIndex]);
+ load_texture(texAddr->textureData);
+ }
+ //texMap[sMenuTextureEntries].textureData = texAddr->textureData;
+ //texMap[sMenuTextureEntries].offset = sMenuTextureListIndex;
+ //sMenuTextureListIndex += 1;
+ //sMenuTextureListIndex = ((sMenuTextureListIndex / 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_compressed_mio0_texture_segA(texAddr->textureData, 0x00008000U, &sMenuTextureList[sMenuTextureListIndex]);
+ mio0decode(gMenuCompressedBuffer, (u8*) &sMenuTextureList[sMenuTextureListIndex]);
+ load_texture(texAddr->textureData);
+ //texMap[sMenuTextureEntries].textureData = texAddr->textureData;
+ //texMap[sMenuTextureEntries].offset = sMenuTextureListIndex;
+ //sMenuTextureListIndex += 1;
+ //sMenuTextureListIndex = ((sMenuTextureListIndex / 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;
+ }
+
+ // dma a compressed texture to the compressed texture buffer
+ switch (compType) {
+ case LOAD_MENU_IMG_MIO0_ONCE:
+ case LOAD_MENU_IMG_MIO0_FORCE:
+ //dma_compressed_mio0_texture_segA(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;
+ }
+
+ // Extract compressed texture to the texture buffer
+ switch (compType) {
+ case LOAD_MENU_IMG_MIO0_ONCE:
+ case LOAD_MENU_IMG_MIO0_FORCE:
+ mio0decode(gMenuCompressedBuffer, (u8*) &sMenuTextureList[sMenuTextureListIndex]);
+ //strcpy(&sMenuTextureList[sMenuTextureListIndex], texAddr->textureData);
+ load_texture(texAddr->textureData);
+ 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*) &sMenuTextureList[sMenuTextureListIndex], clearBit);
+ load_texture(texAddr->textureData);
+
+ //strcpy(&sMenuTextureList[sMenuTextureListIndex], texAddr->textureData);
+ break;
+ }
+
+ //texMap[sMenuTextureEntries].textureData = texAddr->textureData;
+ //texMap[sMenuTextureEntries].offset = sMenuTextureListIndex;
+ //sMenuTextureListIndex += 1;
+ //sMenuTextureListIndex = ((sMenuTextureListIndex / 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;
+ }
+ //! @warning This function does not increment sMenuTextureListIndex
+ dma_compressed_mio0_texture_segA(texAddr->textureData, size, gMenuCompressedBuffer);
+ mio0decode(gMenuCompressedBuffer, D_802BFB80.arraySize4[arg2][arg1 / 2][(arg1 % 2) + 2].pixel_index_array);
+ load_texture(texAddr->textureData);
+ 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;
+ s32 texSize;
+ OSIoMesg mb;
+ OSMesg msg;
+ 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);
+#ifdef TARGET_N64
+ osPiStartDma(&mb, 0, 0, (uintptr_t) &_textures_0aSegmentRomStart[SEGMENT_OFFSET(texAddr->textureData)],
+ gMenuCompressedBuffer, size, &gDmaMesgQueue);
+#endif
+ 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);
+#ifdef TARGET_N64
+ osPiStartDma(&mb, 0, 0, (uintptr_t) &_textures_0aSegmentRomStart[SEGMENT_OFFSET(texAddr->textureData)],
+ gMenuCompressedBuffer + bufSize * 4, size, &gDmaMesgQueue);
+#endif
+ }
+ mio0decode(gMenuCompressedBuffer, (u8*) &sMenuTextureList[sMenuTextureMap[var_s1->texNum].offset]);
+ //strcpy(&sMenuTextureList[sMenuTextureMap[var_s1->texNum].offset], var_s1->texture->textureData);
+ //sMenuTextureList[sMenuTextureMap[var_s1->texNum].offset] = var_s1->texture->textureData;
+ replace_texture(var_s1->texNum, var_s1->texture->textureData);
+
+ 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);
+#ifdef TARGET_N64
+ osPiStartDma(&mb, 0, 0, (uintptr_t) &_textures_0aSegmentRomStart[SEGMENT_OFFSET(texAddr->textureData)],
+ gMenuCompressedBuffer, size, &gDmaMesgQueue);
+#endif
+ }
+ mio0decode(gMenuCompressedBuffer + bufSize * 4,
+ (u8*) &sMenuTextureList[sMenuTextureMap[var_s1->texNum].offset]);
+ replace_texture(var_s1->texNum, var_s1->texture->textureData);
+ 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);
+#ifdef TARGET_N64
+ test = &_textures_0aSegmentRomStart[SEGMENT_OFFSET(temp_s2->textureData)];
+ osPiStartDma(&sp68, 0, 0, (uintptr_t) test, gMenuCompressedBuffer, var_s0, &gDmaMesgQueue);
+#endif
+ 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);
+#ifdef TARGET_N64
+ osPiStartDma(&sp68, 0, 0, (uintptr_t) &_textures_0aSegmentRomStart[SEGMENT_OFFSET(temp_s2->textureData)],
+ gMenuCompressedBuffer + 0x1400, var_s0, &gDmaMesgQueue);
+#endif
+ }
+#ifdef TARGET_N64
+ mio0decode(gMenuCompressedBuffer,
+ D_802BFB80.arraySize4[var_s1->unk6][var_s1->unk4 / 2][(var_s1->unk4 % 2) + 2].pixel_index_array);
+#else
+ memcpy(D_802BFB80.arraySize4[var_s1->unk6][var_s1->unk4 / 2][(var_s1->unk4 % 2) + 2].pixel_index_array,
+ temp_s2->textureData, temp_s2->width * temp_s2->height * 2);
+#endif
+ 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);
+#ifdef TARGET_N64
+ osPiStartDma(&sp68, 0, 0, (uintptr_t) &_textures_0aSegmentRomStart[SEGMENT_OFFSET(temp_s2->textureData)],
+ gMenuCompressedBuffer, var_s0, &gDmaMesgQueue);
+#endif
+ }
+#ifdef TARGET_N64
+ mio0decode(gMenuCompressedBuffer + 0x1400,
+ D_802BFB80.arraySize4[var_s1->unk6][var_s1->unk4 / 2][(var_s1->unk4 % 2) + 2].pixel_index_array);
+#else
+ memcpy(D_802BFB80.arraySize4[var_s1->unk6][var_s1->unk4 / 2][(var_s1->unk4 % 2) + 2].pixel_index_array,
+ temp_s2->textureData, temp_s2->width * temp_s2->height * 2);
+#endif
+ 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*) &sMenuTextureList[temp_v1], 1);
+ // u8 *tex = (u8 *) LOAD_ASSET(arg0->textureData);
+ //size_t texSize = ResourceGetTexSizeByName(arg0->textureData);
+ replace_texture(arg1, arg0->textureData);
+ //sMenuTextureMap[arg1].textureData = arg0->textureData;
+}
+
+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;
+ u16* color0;
+ u16* color1;
+
+ color0 = LOAD_ASSET(sMenuTextureList[sMenuTextureMap[arg0].offset]);
+ color1 = LOAD_ASSET(sMenuTextureList[sMenuTextureMap[arg1].offset]);
+ for (size_t i = 0; i < arg2; i++) {
+ temp_a0 = BSWAP16(*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++ = BSWAP16(newblue + newgreen + newred + alpha);
+ }
+ // Invalidate texture to properly apply color manipulation
+ gSPInvalidateTexCache(gDisplayListHead++, sMenuTextureMap[arg0].offset);
+ gSPInvalidateTexCache(gDisplayListHead++, sMenuTextureMap[arg1].offset);
+}
+
+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 = LOAD_ASSET(sMenuTextureList[sMenuTextureMap[arg0].offset]);
+ for (var_v1 = 0; var_v1 < 0x4B000; var_v1++) {
+ u16 color_pixel = BSWAP16(*color);
+ red = ((color_pixel & 0xF800) >> 0xB) * 0x4D;
+ green = ((color_pixel & 0x7C0) >> 6) * 0x96;
+ blue = ((color_pixel & 0x3E) >> 1) * 0x1D;
+ alpha = color_pixel & 0x1;
+ temp_t9 = red + green + blue;
+ temp_t9 >>= 8;
+ newred = temp_t9 << 0xB;
+ newgreen = temp_t9 << 6;
+ newblue = temp_t9 << 1;
+ *color++ = BSWAP16(newblue + newgreen + newred + alpha);
+ }
+ // Invalidate texture to properly apply color manipulation
+ gSPInvalidateTexCache(gDisplayListHead++, sMenuTextureMap[arg0].offset);
+}
+
+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 = LOAD_ASSET(sMenuTextureList[sMenuTextureMap[arg0].offset]);
+ size = sMenuTextureMap[arg0 + 1].offset - sMenuTextureMap[arg0].offset;
+ for (var_v1 = 0; var_v1 != size; var_v1++) {
+ u16 color_pixel = BSWAP16(*color);
+ red = ((color_pixel & 0xF800) >> 0xB) * 0x4D;
+ green = ((color_pixel & 0x7C0) >> 6) * 0x96;
+ blue = ((color_pixel & 0x3E) >> 1) * 0x1D;
+ alpha = color_pixel & 0x1;
+ temp_t9 = red + green + blue;
+ temp_t9 = temp_t9 >> 8;
+ temp_t9 += ((0x20 - temp_t9) * arg1) >> 8;
+ *color++ = BSWAP16((temp_t9 << 1) + (temp_t9 << 6) + (temp_t9 << 0xB) + alpha);
+ }
+ // Invalidate texture to properly apply color manipulation
+ gSPInvalidateTexCache(gDisplayListHead++, sMenuTextureMap[arg0].offset);
+}
+
+void convert_img_to_greyscale(s32 index, u32 num) {
+ size_t width = ResourceGetTexWidthByName(sMenuTextureList[sMenuTextureMap[index].offset]);
+ size_t height = ResourceGetTexHeightByName(sMenuTextureList[sMenuTextureMap[index].offset]);
+ u32 i;
+ s32 red;
+ s32 green;
+ s32 blue;
+ s32 alpha;
+ u32 result;
+ u16* color;
+ f32 sp48[32];
+
+ size_t size = width * height;
+
+ for (i = 0; i < ARRAY_COUNT(sp48); i++) {
+ sp48[i] = func_800917B0(i * 0.03125, (num * 1.5 * 0.00390625) + 0.25);
+ }
+
+ color = (u16*)LOAD_ASSET(sMenuTextureList[sMenuTextureMap[index].offset]);
+
+
+
+ for (i = 0; i < (u32) size; i++) {
+ u16 color_pixel = BSWAP16(*color);
+ red = ((color_pixel & 0xF800) >> 0xB) * 0x55;
+ green = ((color_pixel & 0x7C0) >> 6) * 0x4B;
+ blue = ((color_pixel & 0x3E) >> 1) * 0x5F;
+ alpha = color_pixel & 0x1;
+ result = red + green + blue;
+ result >>= 8;
+ result = sp48[result] * 32.0f;
+ if (result >= 0x20) {
+ result = 0x1F;
+ }
+ *color++ = BSWAP16((result << 1) + (result << 6) + (result << 0xB) + alpha);
+ }
+ // Invalidate texture to properly apply color manipulation
+ gSPInvalidateTexCache(gDisplayListHead++, sMenuTextureMap[index].offset);
+}
+
+void adjust_img_colour(s32 index, s32 screenSize, s32 r, s32 g, s32 b) {
+ size_t width = ResourceGetTexWidthByName(sMenuTextureList[sMenuTextureMap[index].offset]);
+ size_t height = ResourceGetTexHeightByName(sMenuTextureList[sMenuTextureMap[index].offset]);
+ s32 red;
+ s32 green;
+ s32 blue;
+ s32 alpha;
+ s32 newred;
+ s32 newgreen;
+ s32 newblue;
+ u32 temp_t9;
+ u16* color;
+ // Overwrite the default screen size of 320 * 240 to allow widescreen textures.
+ screenSize = width * height;
+
+ color = LOAD_ASSET(sMenuTextureList[sMenuTextureMap[index].offset]);
+
+
+ for (size_t i = 0; i < screenSize; i++) {
+ u16 color_pixel = BSWAP16(*color);
+ red = ((color_pixel & 0xF800) >> 0xB) * 0x4D;
+ green = ((color_pixel & 0x7C0) >> 6) * 0x96;
+ blue = ((color_pixel & 0x3E) >> 1) * 0x1D;
+ alpha = (color_pixel & 0x1);
+ temp_t9 = red + green + blue;
+ temp_t9 = temp_t9 >> 8;
+ newred = ((temp_t9 * r) >> 8) << 0xB;
+ newgreen = ((temp_t9 * g) >> 8) << 6;
+ newblue = ((temp_t9 * b) >> 8) << 1;
+ *color++ = BSWAP16(newred + newgreen + newblue + alpha);
+ }
+ // Invalidate texture to properly apply color manipulation
+ gSPInvalidateTexCache(gDisplayListHead++, sMenuTextureMap[index].offset);
+}
+
+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 sMenuTextureList[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 (D_8018E7AC[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*) sMenuTextureList[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*) sMenuTextureList[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*) sMenuTextureList[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 (D_8018E7AC[arg0]) {
+ case 1:
+ func_8009CDDC(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:
+ func_8009CDFC(arg0, var_a1);
+ break;
+ case 0:
+ default:
+ break;
+ }
+ }
+}
+
+void func_8009CBE4(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_wide(gDisplayListHead, x - (w / 2), y - (h / 2), (w / 2) + x, (h / 2) + y, color->red,
+ color->green, color->blue, 0xFF - (D_8018E7D0[arg0] * 0xFF / D_8018E7B8[arg0]));
+
+ if ((arg1 == 0) && (D_8018E7D0[arg0] += 1, (D_8018E7D0[arg0] >= D_8018E7B8[arg0]))) {
+ if (gGamestate == 4) {
+ D_8018E7AC[arg0] = 6;
+ return;
+ }
+ D_8018E7AC[arg0] = 0;
+ unref_D_8018EE0C = 0;
+ }
+}
+
+void func_8009CDDC(s32 arg0, s32 arg1) {
+ func_8009CBE4(arg0, arg1, 0);
+}
+
+void func_8009CDFC(s32 arg0, s32 arg1) {
+ func_8009CBE4(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* menuItem;
+
+ 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) && (GetCupIndex() == SPECIAL_CUP)) {
+ var_a1 = 1;
+ }
+ func_8009CE64_label1:
+ if (var_a1) {
+ gGotoMenu = 9;
+ gCreditsCourseId = COURSE_LUIGI_RACEWAY;
+ } else {
+ gGotoMenu = 1;
+ gMenuSelection = 0x0000000B;
+ }
+ } else if (gGamestate == 4) {
+ if (D_8018E7AC[arg0] == 2) {
+ if (arg0 != 4) {
+ D_8018E7AC[arg0] = 5;
+ } else {
+ var_a1 = 0;
+ menuItem = find_menu_items(0x000000B0);
+ if (menuItem != NULL) {
+ switch (menuItem->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;
+ menuItem = find_menu_items(0x000000AC);
+ if (menuItem != NULL) {
+ switch (menuItem->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;
+ menuItem = find_menu_items(0x000000C7);
+ if (menuItem != NULL) {
+ switch (menuItem->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 */
+ D_8018E7AC[arg0] = 5;
+ break;
+ }
+ if (var_a1 != 0) {
+ gIsGamePaused = 0;
+ }
+ }
+ menuItem = find_menu_items(0x000000BD);
+ if (menuItem != NULL) {
+ switch (menuItem->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 {
+ D_8018E7AC[arg0] = 5;
+ }
+ }
+ }
+ }
+ }
+ } else {
+ D_8018E7AC[arg0] = 0;
+ if (gDebugMenuSelection != 0x40) {
+ switch (gMenuFadeType) { /* switch 3 */
+ case 0: /* switch 3 */
+ if (gMenuSelection == 8) {
+ gMenuSelection = 0x0000000A;
+ gFadeModeSelection = 2;
+ } else {
+ gMenuSelection++;
+ }
+ break;
+ case 1: /* switch 3 */
+ gMenuSelection -= 1;
+ break;
+ case 2: /* switch 3 */
+ gDemoMode = 1;
+ gDemoUseController = 1;
+ gGamestateNext = 4;
+ gCCSelection = (s32) 1;
+ switch (gNextDemoId) { /* switch 4 */
+ case 0: /* switch 4 */
+ SetCourseByClass(GetMarioRaceway());
+ CourseManager_SetCup(GetFlowerCup());
+ SetCupCursorPosition(COURSE_FOUR);
+ gCurrentCourseId = 0;
+ gScreenModeSelection = 0;
+ gPlayerCountSelection1 = 1;
+ gPlayerCount = 1;
+ gCharacterSelections[0] = 0;
+ gModeSelection = 0;
+ break;
+ case 1: /* switch 4 */
+ SetCourseByClass(GetLuigiRaceway());
+ CourseManager_SetCup(GetMushroomCup());
+ SetCupCursorPosition(COURSE_ONE);
+ gCurrentCourseId = (s16) 1;
+ gScreenModeSelection = (s32) 1;
+ gPlayerCountSelection1 = 2;
+ gPlayerCount = (s8) 2;
+ gCharacterSelections[0] = (s8) 2;
+ gCharacterSelections[1] = (s8) 4;
+ gModeSelection = 2;
+ break;
+ case 2: /* switch 4 */
+ SetCourseByClass(GetKalimariDesert());
+ CourseManager_SetCup(GetMushroomCup());
+ SetCupCursorPosition(COURSE_FOUR);
+ gCurrentCourseId = COURSE_KALIMARI_DESERT;
+ gScreenModeSelection = 0;
+ gPlayerCountSelection1 = (s32) 1;
+ gPlayerCount = 1;
+ gCharacterSelections[0] = 1;
+ gModeSelection = 0;
+ break;
+ case 3: /* switch 4 */
+ SetCourseByClass(GetWarioStadium());
+ CourseManager_SetCup(GetStarCup());
+ SetCupCursorPosition(COURSE_ONE);
+ gCurrentCourseId = 0x000E;
+ gScreenModeSelection = 3;
+ gPlayerCountSelection1 = 3;
+ gPlayerCount = (s8) 3;
+ gCharacterSelections[0] = 5;
+ gCharacterSelections[1] = 2;
+ gCharacterSelections[2] = 7;
+ gModeSelection = (s32) 2;
+ break;
+ case 4: /* switch 4 */
+ SetCourseByClass(GetBowsersCastle());
+ CourseManager_SetCup(GetStarCup());
+ SetCupCursorPosition(COURSE_FOUR);
+ gCurrentCourseId = 2;
+ gScreenModeSelection = 0;
+ gPlayerCountSelection1 = (s32) 1;
+ gPlayerCount = 1;
+ gCharacterSelections[0] = 7;
+ gModeSelection = 0;
+ break;
+ case 5: /* switch 4 */
+ SetCourseByClass(GetSherbetLand());
+ CourseManager_SetCup(GetFlowerCup());
+ SetCupCursorPosition(COURSE_TWO);
+ gCurrentCourseId = 0x000C;
+ gScreenModeSelection = 3;
+ gPlayerCountSelection1 = 4;
+ gPlayerCount = 4;
+ gCharacterSelections[0] = 0;
+ gCharacterSelections[1] = 1;
+ gCharacterSelections[2] = 6;
+ gCharacterSelections[3] = 3;
+ gModeSelection = 2;
+ break;
+ default:
+ break;
+ }
+ SetCourseFromCup();
+ gNextDemoId += 1;
+ if (gNextDemoId >= 6) {
+ gNextDemoId = 0;
+ }
+
+ //gCupSelection = GetCupIndex(); // gCupSelectionByCourseId[gCurrentCourseId];
+ D_800DC540 = (s32) GetCupIndex();
+ gCourseIndexInCup = GetCupCursorPosition();
+ // gCupCourseSelection = (s8) gPerCupIndexByCourseId[gCurrentCourseId];
+ // SetCupCursorPosition(); //
+ break;
+ case 3: /* switch 3 */
+ switch (gMenuSelection) {
+ case 11:
+ gMenuSelection = 6;
+ break;
+ case 6:
+ gMenuSelection = 11;
+ break;
+ }
+ break;
+ case 4: /* switch 3 */
+ switch (gMenuSelection) {
+ case 11:
+ gMenuSelection = 5;
+ break;
+ case 5:
+ gMenuSelection = 11;
+ break;
+ }
+ break;
+ }
+ if (gFadeModeSelection == 0) {
+ gFadeModeSelection = 1;
+ }
+ if (gMenuSelection >= 0xE) {
+ gGamestateNext = 4;
+ if (gModeSelection == 1) {
+ gGhostPlayerInit = (s8) 1;
+ }
+ func_8009CE1C();
+ }
+ unref_D_8018EE0C = 0;
+ } else {
+ switch (gDebugGotoScene) { /* switch 5; irregular */
+ case 1: /* switch 5 */
+ gGamestateNext = (s32) 5;
+ break;
+ case 2: /* switch 5 */
+ case 3: /* switch 5 */
+ gGamestateNext = 9;
+ gCreditsCourseId = COURSE_LUIGI_RACEWAY;
+ 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;
+ }
+ }
+
+ if (GetCourse() == GetBlockFort() || GetCourse() == GetSkyscraper() || GetCourse() == GetDoubleDeck() ||
+ GetCourse() == GetBigDonut()) {
+
+ gModeSelection = BATTLE;
+ if (gPlayerCountSelection1 == 1) {
+ gPlayerCount = 2;
+ gScreenModeSelection = SCREEN_MODE_2P_SPLITSCREEN_HORIZONTAL;
+ gPlayerCountSelection1 = gPlayerCount;
+ }
+ } else {
+ if (gModeSelection == 3) {
+ gModeSelection = 0;
+ }
+ if ((gModeSelection == 2) && (gPlayerCountSelection1 == 1)) {
+ gModeSelection = 0;
+ }
+ }
+
+ //gCupSelection = gCupSelectionByCourseId[gCurrentCourseId];
+ D_800DC540 = GetCupIndex();
+ gCourseIndexInCup = GetCupCursorPosition();;
+
+ switch (gDebugGotoScene) { /* switch 6; irregular */
+ case 1: /* switch 6 */
+ break;
+ case 2: /* switch 6 */
+ gCCSelection = 0;
+ break;
+ case 3: /* 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 = (D_8018E7D0[arg0] * 0xFF) / D_8018E7B8[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_wide(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) {
+ D_8018E7D0[arg0]++;
+ if ((D_8018E7B8[arg0] + 1) < D_8018E7D0[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_wide(gDisplayListHead, var_t0 - temp_v0, var_t1 - temp_v1, someMath0, someMath1, 0, 0, 0, 0x000000FF);
+}
+
+void func_8009DAA8(void) {
+ u32 var_t0;
+
+ D_8018E7D0[4]++;
+ if (D_8018E7D0[4] >= (D_8018E7B8[4] + 1)) {
+ func_8009CE64(4);
+ }
+ gDPPipeSync(gDisplayListHead++);
+ var_t0 = (D_8018E7D0[4] * 255) / D_8018E7B8[4];
+ if ((s32) var_t0 >= 0x100) {
+ var_t0 = 0x000000FF;
+ }
+ gDisplayListHead = draw_box_wide(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;
+
+ D_8018E7D0[4]++;
+ // why?
+ var_v1 = D_8018E7D0[4];
+ if ((u32) var_v1 >= D_8018E7B8[4]) {
+ if ((u32) var_v1 == D_8018E7B8[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 / D_8018E7B8[4])) {
+ if ((sTKMK00_LowResBuffer[var_s0] == 0) && (random_int((0x4B0U - D_8018E7D0[4]) / D_8018E7B8[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 = (D_8018E7D0[4] * 255) / D_8018E7B8[4];
+ if (var_v1 >= 0x100) {
+ var_v1 = 0x000000FF;
+ }
+ gDisplayListHead = draw_box_wide(gDisplayListHead, 0, 0, 0x00000140, 0x000000F0, 0, 0, 0, var_v1);
+}
+
+void func_8009DEF8(u32 arg0, u32 arg1) {
+ if (arg0 == 0) {
+ arg0 = 1;
+ }
+ if ((D_8018E7AC[4] != 1) && (D_8018E7AC[4] != 6)) {
+ D_8018E7AC[4] = arg1;
+ D_8018E7B8[4] = arg0;
+ if (D_8018E7B8[4] >= 0x100U) {
+ D_8018E7B8[4] = 0xFFU;
+ }
+ D_8018E7D0[4] = 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 ((D_8018E7AC[4] != 2) && (D_8018E7AC[4] != 5)) {
+ D_8018E7AC[4] = arg1;
+ D_8018E7B8[4] = arg0;
+ if (D_8018E7B8[4] >= 0x100U) {
+ D_8018E7B8[4] = 0xFFU;
+ }
+ D_8018E7D0[4] = 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 = D_8018E7AC[arg0];
+ if ((temp != 1) && (temp != 6)) {
+ D_8018E7AC[arg0] = 1;
+ D_8018E7B8[arg0] = arg1;
+ if ((u32) arg1 >= 0x100U) {
+ D_8018E7B8[arg0] = 0xFF;
+ }
+ D_8018E7D0[arg0] = 0;
+ }
+}
+
+void func_8009E088(s32 arg0, s32 arg1) {
+ s32 temp;
+
+ if (arg1 == 0) {
+ arg1 = 1;
+ }
+
+ temp = D_8018E7AC[arg0];
+ if ((temp != 2) && (temp != 5)) {
+ D_8018E7AC[arg0] = 2;
+ D_8018E7B8[arg0] = arg1;
+ if ((u32) arg1 >= 0x100U) {
+ D_8018E7B8[arg0] = 0xFF;
+ }
+ D_8018E7D0[arg0] = 0;
+ }
+}
+
+void func_8009E0F0(s32 arg0) {
+ s32 var_v0;
+
+ if (D_8018E7AC[4] != 3) {
+ D_8018E7AC[4] = 3;
+ D_8018E7B8[4] = arg0;
+ if (D_8018E7B8[4] >= 0x100U) {
+ D_8018E7B8[4] = 0x000000FF;
+ }
+ D_8018E7D0[4] = 0;
+ for (var_v0 = 0; var_v0 < 0x4B0; var_v0++) {
+ sTKMK00_LowResBuffer[var_v0] = 0;
+ }
+ }
+}
+
+void func_8009E17C(u32 arg0) {
+ if (D_8018E7AC[4] != 4) {
+ D_8018E7AC[4] = 4;
+ D_8018E7B8[4] = arg0;
+ if (D_8018E7B8[4] >= 0x100U) {
+ D_8018E7B8[4] = 0x000000FFU;
+ }
+ D_8018E7D0[4] = 0;
+ }
+}
+
+void func_8009E1C0(void) {
+ func_8009DFE0(10);
+ gMenuFadeType = 0;
+}
+
+void func_8009E1E4(void) {
+ func_8009E000(10);
+ gMenuFadeType = 0;
+}
+
+void func_8009E208(void) {
+ func_8009DFE0(10);
+ gMenuFadeType = 1;
+}
+
+void func_8009E230(void) {
+ func_8009DFE0(10);
+ gMenuFadeType = 2;
+}
+
+void func_8009E258(void) {
+ func_8009DFE0(10);
+ gMenuFadeType = 3;
+}
+
+void func_8009E280(void) {
+ func_8009DFE0(10);
+ gMenuFadeType = 4;
+}
+
+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_fill_wide(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_fill_wide(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) {
+ printf("Ran out of buffer space for UI elements");
+ 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:
+ sIntroLogoTimer = 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);
+ load_texture_reset_cache(gMenuTexturesBackground[has_unlocked_extra_mode()]->textureData);
+ break;
+ case MENU_ITEM_UI_LOGO_AND_COPYRIGHT:
+ load_mario_kart_64_logo();
+ //sMenuTextureListIndex += 1;
+ 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_texture_reset_cache(gMenuTexturesBackground[has_unlocked_extra_mode()]->textureData);
+ //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 - MAIN_MENU_BACKGROUND].red,
+ D_800E74E8[type - MAIN_MENU_BACKGROUND].green, D_800E74E8[type - MAIN_MENU_BACKGROUND].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) GetCupIndex();
+ var_ra->param2 = func_800B54C0(GetCupIndex(), 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((GetCupIndex() * 4) + GetCupCursorPosition());
+ }
+ 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 ((s8) arg0->visible) {
+ gDPPipeSync(gDisplayListHead++);
+ switch (arg0->type) {
+ case MENU_ITEM_UI_LOGO_INTRO:
+ func_80094660(gGfxPool, arg0->param1);
+ break;
+ case START_MENU_FLAG:
+ render_checkered_flag(gGfxPool, arg0->param1);
+ break;
+ case MENU_ITEM_TYPE_0D2:
+ gDisplayListHead = func_8009B9D0(gDisplayListHead, D_020014C8);
+ break;
+ case MENU_ITEM_TYPE_0D3:
+ gDisplayListHead = func_8009B9D0(gDisplayListHead, D_02001540);
+ break;
+ case MENU_ITEM_TYPE_0D4:
+ func_800A09E0(arg0);
+ func_800A0AD0(arg0);
+ func_800A0B80(arg0);
+ break;
+ case MENU_ITEM_TYPE_0D5:
+ // 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:
+ func_8009A76C(arg0->D_8018DEE0_index, arg0->column, arg0->row, -1);
+ break;
+ case MENU_ITEM_TYPE_0D7:
+ func_800A0DFC();
+ break;
+ case MENU_ITEM_TYPE_0D8:
+ case MENU_ITEM_TYPE_0D9:
+ func_800A0EB8(arg0, arg0->type - 0xD8);
+ break;
+ case MENU_ITEM_UI_START_BACKGROUND:
+ gDisplayListHead =
+ render_menu_textures(gDisplayListHead, gMenuTexturesBackground[has_unlocked_extra_mode()], arg0->column, arg0->row);
+ break;
+ case MENU_ITEM_UI_LOGO_AND_COPYRIGHT:
+ 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:
+ 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:
+ var_t0 = (s32) ((f32) (get_string_width(CourseManager_GetProps()->Name) + 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, CourseManager_GetProps()->Name, 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:
+ 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:
+ case CHARACTER_SELECT_BACKGROUND:
+ case COURSE_SELECT_BACKGROUND:
+ gDisplayListHead = func_8009BC9C(gDisplayListHead, gMenuTexturesBackground[has_unlocked_extra_mode()], arg0->column,
+ arg0->row, 3, 0);
+ break;
+ case MENU_ITEM_UI_GAME_SELECT:
+ gDisplayListHead = render_menu_textures(gDisplayListHead, seg2_game_select_texture, arg0->column, arg0->row);
+ 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:
+ var_a1 = arg0->type - 0xB;
+ func_800A8270(var_a1, arg0);
+ func_800A0FA4(arg0, var_a1);
+ break;
+ case MENU_ITEM_UI_OK:
+ func_800A8564(arg0);
+ gDisplayListHead = func_8009BC9C(gDisplayListHead, D_0200487C, arg0->column, arg0->row, 2, arg0->param1);
+ break;
+ case MAIN_MENU_OPTION_GFX:
+ case MAIN_MENU_DATA_GFX:
+ 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:
+ case MAIN_MENU_100CC:
+ case MAIN_MENU_150CC:
+ case MAIN_MENU_EXTRA_CC:
+ case MENU_ITEM_TYPE_016:
+ case MENU_ITEM_TYPE_017:
+ case MAIN_MENU_TIME_TRIALS_BEGIN:
+ case MAIN_MENU_TIME_TRIALS_DATA:
+ var_v1 = gGameModeSubMenuColumn[gPlayerCount - 1][gGameModeMenuColumn[gPlayerCount - 1]];
+ var_a1 = gGameModePlayerSelection[gPlayerCount - 1][gGameModeMenuColumn[gPlayerCount - 1]];
+ switch (arg0->type) {
+ case MAIN_MENU_50CC:
+ case MAIN_MENU_100CC:
+ case MAIN_MENU_150CC:
+ case MAIN_MENU_EXTRA_CC:
+ 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:
+ case MENU_ITEM_TYPE_017:
+ 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:
+ case MAIN_MENU_TIME_TRIALS_DATA:
+ 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;
+ } // End of switch
+ if (var_v1 == -1) {
+ break;
+ }
+ if ((gMainMenuSelection >= 5) && (var_v1 == (arg0->type - var_a1))) {
+ if (gMainMenuSelection >= 6) {
+ 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:
+ func_800A10CC(arg0);
+ break;
+ case CHARACTER_SELECT_MENU_PLAYER_SELECT_BANNER:
+ gDisplayListHead = render_menu_textures(gDisplayListHead, D_02004B4C, arg0->column, arg0->row);
+ 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:
+ 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:
+ func_800A8564(arg0);
+ gDisplayListHead = func_8009BC9C(gDisplayListHead, D_02004B74, arg0->column, arg0->row, 2, arg0->param1);
+ 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:
+ func_800A12BC(arg0, segmented_to_virtual_dupe(D_800E7D54[arg0->type - 0x2B]));
+ /* fallthrough */
+ case MENU_ITEM_TYPE_0A0:
+ case MENU_ITEM_TYPE_0A1:
+ func_8009A76C(arg0->D_8018DEE0_index, arg0->column, arg0->row, arg0->param1);
+ break;
+ 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:
+ 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:
+ 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:
+ case MENU_ITEM_TYPE_060:
+ case MENU_ITEM_TYPE_061:
+ case MENU_ITEM_TYPE_062:
+ func_800A1500(arg0);
+ break;
+ case COURSE_SELECT_MUSHROOM_CUP:
+ case COURSE_SELECT_FLOWER_CUP:
+ case COURSE_SELECT_STAR_CUP:
+ case COURSE_SELECT_SPECIAL_CUP:
+ var_a1 = arg0->type - 0x53;
+ func_800A890C(var_a1, arg0);
+ func_800A143C(arg0, var_a1);
+ break;
+ case COURSE_SELECT_OK:
+ func_800A8564(arg0);
+ gDisplayListHead = func_8009BC9C(gDisplayListHead, D_02004E80, arg0->column, arg0->row, 2, arg0->param1);
+ break;
+ case MENU_ITEM_TYPE_065:
+ case MENU_ITEM_TYPE_066:
+ if (arg0->type == MENU_ITEM_TYPE_065) {
+ scaleX = 0.6f;
+ } else {
+ scaleX = 0.8f;
+ }
+ func_800A86E8(arg0);
+ set_text_color(3);
+ print_text_mode_1(arg0->column + 8, arg0->row + 0x10, gBestTimeText[arg0->type - MENU_ITEM_TYPE_065], 0, scaleX, 0.8f);
+ func_800A874C(arg0);
+ break;
+ case MENU_ITEM_TYPE_06E:
+ render_battle_introduction(arg0);
+ break;
+ case MENU_ITEM_TYPE_067:
+ func_800A8EC0(arg0);
+ break;
+ case MENU_ITEM_TYPE_068:
+ 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:
+ func_800A8F48(arg0);
+ break;
+ case MENU_ITEM_TYPE_078:
+ case MENU_ITEM_TYPE_079:
+ case MENU_ITEM_TYPE_07A:
+ case MENU_ITEM_TYPE_07B:
+ var_a1 = arg0->type - MENU_ITEM_TYPE_078;
+ func_800A90D4(var_a1, arg0);
+ func_800A143C(arg0, var_a1);
+ break;
+ case MENU_ITEM_TYPE_08C:
+ 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:
+ func_800A1780(arg0);
+ 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:
+ func_800A15EC(arg0);
+ break;
+ case MENU_ITEM_TYPE_096:
+ 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:
+ set_text_color(TEXT_BLUE_GREEN_RED_CYCLE_2);
+ print_text_mode_1(arg0->column, arg0->row, CourseManager_GetProps()->Name, arg0->param1, arg0->paramf, 1.0f);
+ break;
+ case MENU_ITEM_TYPE_098:
+ func_800A2D1C(arg0);
+ break;
+ case MENU_ITEM_TYPE_05E:
+ gDisplayListHead = func_80096CD8(gDisplayListHead, 0x00000019, 0x00000072, 0x0000007CU, 0x0000004AU);
+ break;
+ case MENU_ITEM_TYPE_0AA:
+ func_800A2EB8(arg0);
+ break;
+ case MENU_ITEM_TYPE_0AB:
+ func_800A34A8(arg0);
+ break;
+ case MENU_ITEM_TYPE_0AC:
+ func_800A6154(arg0);
+ break;
+ case MENU_ITEM_TYPE_0AF:
+ func_800A6034(arg0);
+ break;
+ case MENU_ITEM_TYPE_0B0:
+ func_800A638C(arg0);
+ break;
+ case MENU_ITEM_TYPE_0B1:
+ case MENU_ITEM_TYPE_0B2:
+ case MENU_ITEM_TYPE_0B3:
+ case MENU_ITEM_TYPE_0B4:
+ 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:
+ time_trials_finish_text_render(arg0);
+ break;
+ case MENU_ITEM_TYPE_0BA:
+ func_800A3E60(arg0);
+ break;
+ case MENU_ITEM_ANNOUNCE_GHOST:
+ render_menu_item_announce_ghost(arg0);
+ break;
+ case MENU_ITEM_PAUSE:
+ render_pause_menu(arg0);
+ break;
+ case MENU_ITEM_END_COURSE_OPTION:
+ render_menu_item_end_course_option(arg0);
+ break;
+ case MENU_ITEM_DATA_COURSE_IMAGE:
+ render_menu_item_data_course_image(arg0);
+ break;
+ case MENU_ITEM_DATA_COURSE_INFO:
+ render_menu_item_data_course_info(arg0);
+ break;
+ case MENU_ITEM_DATA_COURSE_SELECTABLE:
+ menu_item_data_course_selectable(arg0);
+ break;
+ case MENU_ITEM_TYPE_0E9:
+ func_800A1DE0(arg0);
+ break;
+ case MENU_ITEM_TYPE_0EA:
+ func_800A1F30(arg0);
+ break;
+ case MENU_ITEM_TYPE_0F0:
+ func_800A1FB0(arg0);
+ break;
+ case MENU_ITEM_TYPE_0F1:
+ gDisplayListHead = render_menu_textures(gDisplayListHead, D_02004638, arg0->column, arg0->row);
+ break;
+ case MENU_ITEM_TYPE_10E:
+ func_800A70E8(arg0);
+ break;
+ case MENU_ITEM_TYPE_12B:
+ func_800A7258(arg0);
+ break;
+ case MENU_ITEM_TYPE_12C:
+ func_800A72FC(arg0);
+ break;
+ case MENU_ITEM_TYPE_12D:
+ func_800A7448(arg0);
+ break;
+ case MENU_ITEM_TYPE_12E:
+ func_800A75A0(arg0);
+ break;
+ case MENU_ITEM_TYPE_12F:
+ func_800A761C(arg0);
+ break;
+ case MENU_ITEM_TYPE_130:
+ 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:
+ 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:
+ 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 *item) {
+ s32 table_row;
+
+ gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, 0, 0, 319, 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) + item->row);
+ }
+}
+
+void func_800A0AD0(UNUSED MenuItem* arg0) {
+ MenuItem* temp_t1;
+ // Find MenuItem with a type/id of MENU_ITEM_TYPE_0DA
+ 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) - 3;
+ } 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_wide(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_wide(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_wide(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);
+}
+
+// render course preview
+void render_menu_item_data_course_image(MenuItem* arg0) {
+ 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
+ //! @bug todo: This function will not work in custom courses.
+ 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, CourseManager_GetProps()->Name, 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, CourseManager_GetProps()->CourseLength, 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 < 2; 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;
+ s32 i;
+ s32 var_s5;
+ s32 var_s4;
+ char spB8[3];
+ s32 var_s1;
+ char spA8[3];
+ s32 var_s2;
+ char sp98[3];
+ struct_8018EE10_entry* var_v1;
+
+ gDisplayListHead = draw_box_wide(gDisplayListHead, 0, 0, 0x00000140, 0x000000F0, 0, 0, 0, 0x00000064);
+ switch (gSubMenuSelection) {
+ case SUB_MENU_OPTION_RETURN_GAME_SELECT:
+ case SUB_MENU_OPTION_SOUND_MODE:
+ case SUB_MENU_OPTION_COPY_CONTROLLER_PAK:
+ case SUB_MENU_OPTION_ERASE_ALL_DATA:
+ for (i = 0; i < ARRAY_COUNT(gTextOptionMenu); i++) {
+ set_text_color_rainbow_if_selected(gSubMenuSelection - SUB_MENU_OPTION_MIN, i, 3);
+ print_text_mode_1(0x00000032, 0x55 + (0x23 * i), gTextOptionMenu[i], 0, 0.9f, 1.0f);
+ if (i == (gSubMenuSelection - SUB_MENU_OPTION_MIN)) {
+ spE0.column = 0x0032;
+ spE0.row = 0x55 + (0x23 * i);
+ }
+ }
+ set_text_color(TEXT_GREEN);
+ print_text1_center_mode_1(0x000000E6, 0x00000078, gSoundModeNames[gSoundMode], 0, 1.0f, 1.0f);
+ break;
+ case SUB_MENU_ERASE_QUIT:
+ case SUB_MENU_ERASE_ERASE:
+ set_text_color(TEXT_YELLOW);
+ for (i = 0; i < ARRAY_COUNT(D_800E7878); i++) {
+ print_text_mode_1(0x00000028, 0x55 + (0x14 * i), D_800E7878[i], 0, 1.0f, 1.0f);
+ }
+ for (i = 0; i < ARRAY_COUNT(D_800E7840); i++) {
+ set_text_color_rainbow_if_selected(gSubMenuSelection - SUB_MENU_ERASE_MIN, i, 1);
+ print_text_mode_1(0x00000084, 0x96 + (0x19 * i), D_800E7840[i], 0, 1.0f, 1.0f);
+ if (i == (gSubMenuSelection - SUB_MENU_ERASE_MIN)) {
+ spE0.column = 0x0084;
+ spE0.row = 0x96 + (0x19 * i);
+ }
+ }
+ break;
+ case SUB_MENU_SAVE_DATA_ERASED:
+ set_text_color(TEXT_YELLOW);
+ for (i = 0; i < ARRAY_COUNT(D_800E7884); i++) {
+ print_text_mode_1(0x00000032, 0x55 + (0x14 * i), D_800E7884[i], 0, 1.0f, 1.0f);
+ }
+ break;
+ case SUB_MENU_COPY_PAK_ERROR_NO_GHOST_DATA:
+ case SUB_MENU_COPY_PAK_ERROR_NO_GAME_DATA:
+ case SUB_MENU_COPY_PAK_ERROR_NO_PAK_2P:
+ case SUB_MENU_COPY_PAK_ERROR_BAD_READ_2P:
+ set_text_color(TEXT_RED);
+ var_s1 = gSubMenuSelection - SUB_MENU_COPY_PAK_ERROR_2P_MIN;
+ for (i = 0; i < ARRAY_COUNT(D_800E78D0) / 4; i++) {
+ print_text_mode_1(0x00000032, 0x55 + (0x14 * i), D_800E78D0[(var_s1 * 3) + i], 0,
+ 0.9f, 0.9f);
+ }
+ break;
+ case SUB_MENU_COPY_PAK_ERROR_NO_PAK_1P:
+ case SUB_MENU_COPY_PAK_ERROR_BAD_READ_1P:
+ case SUB_MENU_COPY_PAK_ERROR_CANT_CREATE_1P:
+ case SUB_MENU_COPY_PAK_ERROR_NO_PAGES_1P:
+ set_text_color(TEXT_RED);
+ var_s1 = gSubMenuSelection - SUB_MENU_COPY_PAK_ERROR_1P_MIN;
+ for (i = 0; i < ARRAY_COUNT(D_800E7890) / 4; i++) {
+ print_text_mode_1(0x00000023, 0x55 + (0x14 * i), D_800E7890[(var_s1 * 4) + i], 0,
+ 0.8f, 0.8f);
+ }
+ break;
+ case SUB_MENU_COPY_PAK_UNABLE_COPY_FROM_1P:
+ case SUB_MENU_COPY_PAK_UNABLE_READ_FROM_2P:
+ set_text_color(TEXT_RED);
+ var_s1 = gSubMenuSelection - SUB_MENU_COPY_PAK_UNABLE_ERROR_MIN;
+ for (i = 0; i < ARRAY_COUNT(D_800E7900) / 2; i++) {
+ print_text_mode_1(0x00000041, 0x55 + (0x14 * i), D_800E7900[(var_s1 * 3) + i], 0,
+ 0.9f, 0.9f);
+ }
+ break;
+ case SUB_MENU_COPY_PAK_CREATE_GAME_DATA_INIT:
+ case SUB_MENU_COPY_PAK_CREATE_GAME_DATA_DONE:
+ set_text_color(TEXT_YELLOW);
+ for (i = 0; i < ARRAY_COUNT(D_800E7A48); i++) {
+ print_text_mode_1(0x00000050, 0x55 + (0x14 * i), D_800E7A48[i], 0, 1.0f, 1.0f);
+ }
+ break;
+ case SUB_MENU_COPY_PAK_FROM_GHOST1_1P:
+ case SUB_MENU_COPY_PAK_FROM_GHOST2_1P:
+ case SUB_MENU_COPY_PAK_TO_GHOST1_2P:
+ case SUB_MENU_COPY_PAK_TO_GHOST2_2P:
+ 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),
+ CourseManager_GetProps()->Name, 0,
+ 0.5f, 0.5f);
+ }
+ }
+ }
+ break;
+ case SUB_MENU_COPY_PAK_PROMPT_QUIT:
+ case SUB_MENU_COPY_PAK_PROMPT_COPY:
+ 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),
+ CourseManager_GetProps()->Name, 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:
+ case SUB_MENU_COPY_PAK_COPYING:
+ case SUB_MENU_COPY_PAK_COMPLETED:
+ 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),
+ CourseManager_GetProps()->Name, 0,
+ 0.5f, 0.5f);
+ }
+ }
+ }
+ break;
+ }
+ switch (gSubMenuSelection) {
+ case SUB_MENU_COPY_PAK_FROM_GHOST1_1P:
+ case SUB_MENU_COPY_PAK_FROM_GHOST2_1P:
+ case SUB_MENU_COPY_PAK_TO_GHOST1_2P:
+ case SUB_MENU_COPY_PAK_TO_GHOST2_2P:
+ case SUB_MENU_COPY_PAK_PROMPT_QUIT:
+ case SUB_MENU_COPY_PAK_PROMPT_COPY:
+ spE0.column -= 5;
+ spE0.row -= 6;
+ break;
+ default:
+ 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_wide(gDisplayListHead, 0, 0, 0x13F, 0x28);
+ gDisplayListHead = func_80098FC8_wide(gDisplayListHead, 0, 0xC7, 0x13F, 0xEF);
+ arg0->param1 = 0x28;
+ break;
+ case 2:
+ arg0->param1 -= 2;
+ if (arg0->param1 > 0) {
+ gDisplayListHead = func_80098FC8_wide(gDisplayListHead, 0, 0, 0x13F, arg0->param1);
+ gDisplayListHead = func_80098FC8_wide(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_wide(gDisplayListHead, 0, 0, 0x13F, arg0->param1);
+ gDisplayListHead = func_80098FC8_wide(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(GetCupCursorPosition() + 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(GetCupName()) + 8) * 0.6f) /
+ 2); // gCupNames[GetCupIndex()]) + 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(GetCupCursorPosition() + 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[GetCupIndex()]) + 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;
+
+ set_text_color(TEXT_BLUE_GREEN_RED_CYCLE_1);
+ print_text1_center_mode_1(arg0->column + 0x43, arg0->row + 0x19, CourseManager_GetProps()->Name, 0, 0.6f, 0.6f);
+ set_text_color(TEXT_YELLOW);
+ print_text1_center_mode_1(arg0->column + 0x46, arg0->row + 0x28, gLapTimeText, 0, 0.75f, 0.75f);
+ 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);
+ }
+ set_text_color(TEXT_YELLOW);
+ print_text_mode_1(0xB4 - arg0->column, arg0->row + 0x86, gBestTimeText[0], 0, 0.75f, 0.75f);
+ 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,
+ CourseManager_GetProps()->Name, 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) {
+ case 1:
+ case 5:
+ case 6:
+ case 7:
+ case 8:
+ case 9:
+ case 10:
+ case 30:
+ 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:
+ case 12:
+ case 13:
+ case 14:
+ case 15:
+ case 16:
+ 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:
+ case 18:
+ 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),
+ CourseManager_GetProps()->Name,
+ 0, 0.45f, 0.45f);
+ }
+ }
+ break;
+ case 19:
+ 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:
+ case 21:
+ 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:
+ 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:
+ 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) {
+ s32 time;
+ 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) {
+ 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) {
+ char sp68[3];
+ s32 temp_a0;
+ s32 var_s0;
+ s32 zero = 0; // ?
+
+ gDisplayListHead = draw_box_wide(gDisplayListHead, 0, 0, 0x0000013F, 0x000000EF, 0, 0, 0, 0x0000008C);
+ set_text_color(TEXT_YELLOW);
+ print_text1_center_mode_1(0x000000A0, 0x00000050, CourseManager_GetProps()->Name, 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_wide(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_wide(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[GetCupIndex()]) * 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[GetCupIndex()], 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, CourseManager_GetProps()->Name, 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_wide(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);
+ AddEffectMatrixOrtho();
+ 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;
+ f32 why;
+ char sp84[3];
+ s32 temp_a0;
+ 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_wide(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_wide(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, CourseManager_GetProps()->Name,
+ 0, 1.0f, 1.0f);
+ switch (arg0->state) {
+ case 1:
+ case 11:
+ case 12:
+ case 13:
+ case 14:
+ case 15:
+ case 16:
+ 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:
+ case 22:
+ case 23:
+ case 24:
+ case 25:
+ case 26:
+ 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:
+ case 31:
+ 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)),
+ CourseManager_GetProps()->Name,
+ 0, 0.75f, 0.75f);
+ }
+ }
+ break;
+ case 32:
+ 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:
+ case 36:
+ 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:
+ 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:
+ 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 = CourseManager_GetProps()->Name;
+ 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_wide(gDisplayListHead, 0, 0, 0x0000013F, 0x000000EF, 0, 0, 0, arg0->param1);
+ set_text_color(3);
+ 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_wide(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_wide(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_wide(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 = GetEffectMatrix(); // &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);
+ AddEffectMatrixFixed(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_wide(gDisplayListHead, 0, 0, 0x13F, 0xEF, 0, 0, 0, arg0->param1);
+ } else {
+ // All other stages of the podium scene
+ gDisplayListHead = draw_box_wide(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(GetCupName()) * 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, GetCupName(), 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;
+ char sp3C[5];
+ 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(gTextCreditsRenderInfo[creditIndex].textColor);
+ slideDirection = gTextCreditsRenderInfo[creditIndex].slideDirection;
+ if ((slideDirection == SLIDE_RIGHT) || (slideDirection != SLIDE_LEFT)) {
+ someScaling = gTextCreditsRenderInfo[creditIndex].textScaling;
+ print_text1_left(arg0->column, arg0->row, gCreditsText[creditIndex], arg0->param1 * someScaling,
+ arg0->paramf * someScaling, someScaling);
+ } else {
+ someScaling = gTextCreditsRenderInfo[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* menuItem;
+
+ for (i = 0; i < MENU_ITEMS_MAX; i++) {
+ isRendered = false;
+ menuItem = &gMenuItems[i];
+ type = menuItem->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 (sIntroLogoTimer < 0x50) {
+ sIntroModelSpeed = 3.0f;
+ } else if (sIntroLogoTimer < 0x5A) {
+ if (sIntroModelMotionSpeed < 1.0) {
+ sIntroModelMotionSpeed += 0.1;
+ }
+ sIntroModelSpeed += 0.1;
+ } else if (sIntroLogoTimer < 0xA0) {
+ sIntroModelSpeed += 0.1;
+ } else if (sIntroLogoTimer < 0x190) {
+ sIntroModelSpeed += 0.3;
+ }
+ gIntroModelRotY -= sIntroModelSpeed;
+ sIntroLogoTimer += 1;
+ if (gIntroModelRotY < -360.0f) {
+ gIntroModelRotY += 360.0f;
+ }
+ menuItem->param1++;
+ if (menuItem->param1 == 0x000000B4) {
+ func_8009E000(0x00000028);
+ func_800CA388(0x64U);
+ gMenuFadeType = 0;
+ }
+ if ((menuItem->param2 != 0) && (menuItem->param1 >= 3)) {
+ menuItem->param2 = 0;
+ play_sound2(SOUND_INTRO_LOGO);
+ }
+ break;
+ case MENU_ITEM_TYPE_0DA: /* switch 8 */
+ func_800A954C(menuItem);
+ break;
+ case MENU_ITEM_TYPE_0D6: /* switch 8 */
+ func_800A9710(menuItem);
+ break;
+ case MENU_ITEM_TYPE_0D4: /* switch 8 */
+ func_800A97BC(menuItem);
+ break;
+ case MENU_ITEM_UI_START_RECORD_TIME: /* switch 8 */
+ switch (menuItem->state) { /* switch 9; irregular */
+ case 0: /* switch 9 */
+ if (gControllerFive->button & R_TRIG) {
+ menuItem->state = (s32) 1U;
+ play_sound2(SOUND_ACTION_PING);
+ } else {
+ menuItem->visible = 0;
+ }
+ break;
+ case 1:
+ default:
+ menuItem->visible = 1;
+ break;
+ }
+ break;
+ case MENU_ITEM_UI_GAME_SELECT:
+ func_800AA280(menuItem);
+ break;
+ case MAIN_MENU_OPTION_GFX:
+ case MAIN_MENU_DATA_GFX:
+ switch (gMainMenuSelection) {
+ case MAIN_MENU_OPTION:
+ case MAIN_MENU_DATA:
+ case MAIN_MENU_PLAYER_SELECT:
+ func_800A9B9C(menuItem);
+ break;
+ case MAIN_MENU_MODE_SELECT:
+ 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:
+ func_800A9C40(menuItem);
+ break;
+ }
+ break;
+ case MENU_ITEM_UI_OK:
+ func_800AA280(menuItem);
+ update_ok_menu_item(menuItem);
+ 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:
+ 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(menuItem);
+ 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(menuItem);
+ break;
+ }
+ func_800A9D5C(menuItem);
+ break;
+ case MAIN_MENU_50CC:
+ case MAIN_MENU_100CC:
+ case MAIN_MENU_150CC:
+ case MAIN_MENU_EXTRA_CC:
+ case MENU_ITEM_TYPE_016:
+ case MENU_ITEM_TYPE_017:
+ case MAIN_MENU_TIME_TRIALS_BEGIN:
+ case MAIN_MENU_TIME_TRIALS_DATA:
+ func_800A9E58(menuItem);
+ break;
+ case MENU_ITEM_TYPE_01B:
+ func_800AA2EC(menuItem);
+ 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:
+ update_cursor(menuItem);
+ 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:
+ func_800AAC18(menuItem);
+ switch (menuItem->type) {
+ 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:
+ func_800AA69C(menuItem);
+ break;
+ }
+ switch (gPlayerSelectMenuSelection) {
+ case PLAYER_SELECT_MENU_MAIN:
+ func_800AAB90(menuItem);
+ break;
+ case PLAYER_SELECT_MENU_OK:
+ case PLAYER_SELECT_MENU_OK_GO_BACK:
+ func_800AAA9C(menuItem);
+ break;
+ }
+ func_800AAE18(menuItem);
+ break;
+ case CHARACTER_SELECT_MENU_OK:
+ case COURSE_SELECT_OK:
+ update_ok_menu_item(menuItem);
+ break;
+ case COURSE_SELECT_MUSHROOM_CUP:
+ case COURSE_SELECT_FLOWER_CUP:
+ case COURSE_SELECT_STAR_CUP:
+ case COURSE_SELECT_SPECIAL_CUP:
+ func_800AB164(menuItem);
+ switch (gSubMenuSelection) {
+ case 1:
+ func_800AB020(menuItem);
+ break;
+ case 2:
+ case 3:
+ func_800AB098(menuItem);
+ break;
+ }
+ break;
+ case MENU_ITEM_TYPE_058:
+ case COURSE_SELECT_COURSE_NAMES:
+ case MENU_ITEM_TYPE_05A:
+ case MENU_ITEM_TYPE_05B:
+ func_800AB260(menuItem);
+ break;
+ case MENU_ITEM_TYPE_064:
+ func_800AB314(menuItem);
+ break;
+ case MENU_ITEM_TYPE_05F:
+ case MENU_ITEM_TYPE_060:
+ case MENU_ITEM_TYPE_061:
+ case MENU_ITEM_TYPE_062:
+ func_800AB290(menuItem);
+ break;
+ case MENU_ITEM_TYPE_065:
+ case MENU_ITEM_TYPE_066:
+ func_800AB904(menuItem);
+ break;
+ case MENU_ITEM_TYPE_067:
+ func_800AB9B0(menuItem);
+ break;
+ case MENU_ITEM_TYPE_078:
+ case MENU_ITEM_TYPE_079:
+ case MENU_ITEM_TYPE_07A:
+ case MENU_ITEM_TYPE_07B:
+ case MENU_ITEM_TYPE_08C:
+ func_800ABAE8(menuItem);
+ break;
+ case MENU_ITEM_TYPE_08D:
+ func_800ABB24(menuItem);
+ 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:
+ func_800ABBCC(menuItem);
+ break;
+ case MENU_ITEM_TYPE_096:
+ func_800ABC38(menuItem);
+ break;
+ case MENU_ITEM_TYPE_097:
+ func_800ABEAC(menuItem);
+ break;
+ case MENU_ITEM_TYPE_05E:
+ func_800AC300(menuItem);
+ break;
+ case MENU_ITEM_TYPE_0AA:
+ func_800AC324(menuItem);
+ break;
+ case MENU_ITEM_TYPE_0AB:
+ func_800AC458(menuItem);
+ break;
+ case MENU_ITEM_TYPE_0AC:
+ func_800ACA14(menuItem);
+ break;
+ case MENU_ITEM_TYPE_0AF:
+ func_800AC978(menuItem);
+ break;
+ case MENU_ITEM_TYPE_0B0:
+ func_800ACC50(menuItem);
+ break;
+ case MENU_ITEM_TYPE_0B1:
+ case MENU_ITEM_TYPE_0B2:
+ case MENU_ITEM_TYPE_0B3:
+ case MENU_ITEM_TYPE_0B4:
+ func_800ACF40(menuItem);
+ break;
+ case MENU_ITEM_TYPE_0B9:
+ func_800AD1A4(menuItem);
+ break;
+ case MENU_ITEM_TYPE_0BA:
+ func_800AD2E8(menuItem);
+ break;
+ case MENU_ITEM_ANNOUNCE_GHOST:
+ func_800AEC54(menuItem);
+ break;
+ case MENU_ITEM_PAUSE:
+ func_800ADF48(menuItem);
+ break;
+ case MENU_ITEM_END_COURSE_OPTION:
+ func_800AE218(menuItem);
+ break;
+ case MENU_ITEM_DATA_COURSE_IMAGE:
+ func_800AEDBC(menuItem);
+ break;
+ case MENU_ITEM_DATA_COURSE_SELECTABLE:
+ func_800AEE90(menuItem);
+ break;
+ case MENU_ITEM_TYPE_0E9:
+ func_800AEEBC(menuItem);
+ break;
+ case MENU_ITEM_TYPE_0EA:
+ func_800AEEE8(menuItem);
+ break;
+ case MENU_ITEM_TYPE_0BE:
+ func_800AEF14(menuItem);
+ break;
+ case MENU_ITEM_TYPE_10E:
+ func_800AEF74(menuItem);
+ break;
+ case MENU_ITEM_TYPE_12B:
+ func_800AF004(menuItem);
+ break;
+ case MENU_ITEM_TYPE_12C:
+ case MENU_ITEM_TYPE_12D:
+ case MENU_ITEM_TYPE_12E:
+ case MENU_ITEM_TYPE_12F:
+ func_800AF1AC(menuItem);
+ break;
+ case MENU_ITEM_TYPE_130:
+ func_800AF270(menuItem);
+ 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:
+ func_800AF480(menuItem);
+ 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;
+ menuItem = &gMenuItems[i];
+ if (menuItem && menuItem) {} // ?
+ type = menuItem->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) && (j == (s8) menuItem->priority)) {
+ render_menus(menuItem);
+ }
+ }
+ }
+}
+
+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 >= 4)) {
+ 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) {
+ 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 == GetCupIndex()) {
+ 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 < GetCupSize(); someIndex++) {
+ if ((someIndex == GetCupCursorPosition()) && (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_wide(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((GetCupIndex() * 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((GetCupIndex() * 4) + GetCupCursorPosition()) >= 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 1:
+ arg0->row -= 2;
+ if (arg0->row < 0x60) {
+ arg0->row = 0x69;
+ gControllerPakScrollDirection = 0;
+ 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 2:
+ arg0->row += 2;
+ if (arg0->row >= 0x73) {
+ arg0->row = 0x69;
+ gControllerPakScrollDirection = 0;
+ 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 = 0;
+ 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, 0x03, 0x02, 0x00, 0x00, 0x03, 0x03, 0x02, 0x00
+};
+
+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_800F0CA0[gSubMenuSelection + 11];
+ break;
+ case CHARACTER_SELECT_MENU_OK:
+ var_v0 = D_800F0CA0[gPlayerSelectMenuSelection + 7];
+ 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)) {
+ case 5:
+ break;
+ case 0:
+ arg0->state = 1;
+ var_t1 = 1;
+ break;
+ case 2:
+ gControllerPak1State = 0;
+ break;
+ default:
+ 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 == 3) {
+ 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 == 3) {
+ 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) {
+ s32 count = gPlayerCount - 1;
+ for (size_t i = 0; i < ARRAY_COUNT(gMenuItems); i++) {
+ if (gMenuItems[i].type == (count + MENU_ITEM_UI_1P_GAME)) {
+ return &gMenuItems[i];
+ }
+ }
+ printf("Error: get_menu_item_player_count returned a null value when searching id 0x%X", count + 0xB);
+ return NULL;
+ // MenuItem *entry = gMenuItems;
+ // s32 thing = gPlayerCount - 1;
+
+ // for(; !(entry > &gMenuItems[MENU_ITEMS_MAX]); entry++) {
+ // if ((thing + 0xB) == 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 arg0) {
+
+ for (size_t i = 0; i < ARRAY_COUNT(gMenuItems); i++) {
+ if (gMenuItems[i].type == (arg0 + 0x2B)) {
+ return &gMenuItems[i];
+ }
+ }
+ printf("Error: get_menu_item_character returned a null value when searching id 0x%X", arg0 + 0x2B);
+ return NULL;
+
+ // MenuItem *entry = gMenuItems;
+
+ // for(; !(entry > &gMenuItems[MENU_ITEMS_MAX]); entry++) {
+ // if ((arg0 + 0x2B) == 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) {
+ for (size_t i = 0; i < ARRAY_COUNT(gMenuItems); i++) {
+ if (gMenuItems[i].type == type) {
+ return &gMenuItems[i];
+ }
+ }
+ printf("Error: find_menu_items_dupe returned a null value when searching id 0x%X", type);
+ return NULL;
+
+ // MenuItem *entry = gMenuItems;
+ // for (; !(entry > (&gMenuItems[MENU_ITEMS_MAX])); entry++) {
+ // if (entry->type == arg0) {
+ // goto escape;
+ // }
+ // }
+
+ // Something VERY wrong has occurred
+ // while(true);
+ // escape:
+ // return entry;
+}
+
+MenuItem* find_menu_items(s32 type) {
+ for (size_t i = 0; i < ARRAY_COUNT(gMenuItems); i++) {
+ if (gMenuItems[i].type == type) {
+ return &gMenuItems[i];
+ }
+ }
+ // No printf here as returning null seems to be normal game logic
+ // printf("Error: find_menu_items returned a null value when searching id 0x%X",
+ // arg0);
+ return NULL;
+
+ // MenuItem *entry = gMenuItems;
+ // for (; !(entry > (&gMenuItems[MENU_ITEMS_MAX])); entry++) {
+ // if (entry->type == arg0) {
+ // goto escape;
+ // }
+ // }
+
+ // return NULL;
+ // escape:
+ // return entry;
+}
+
+s32 get_character_menu_state(s32 arg0) {
+ MenuItem* temp;
+ temp = get_menu_item_character(arg0);
+ return temp->state;
+}
+
+void hover_cursor_over_character_portrait(MenuItem* arg0, s32 arg1) {
+ MenuItem* temp_v0;
+
+ temp_v0 = get_menu_item_character(arg1);
+ arg0->column = temp_v0->column;
+ arg0->row = temp_v0->row;
+}
+
+s32 func_800AAFCC(s32 characterId) {
+ s32 someIndex = 0;
+ s32 ret = false;
+
+ for (; someIndex < 4; 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 ((GetCupIndex() + 0x53) == arg0->type) {
+ arg0->state = 2;
+ } else {
+ arg0->state = 1;
+ }
+ break;
+ case 4:
+ if ((GetCupIndex() + 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 ((GetCupIndex() + 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 ((GetCupIndex() + 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 == GetCupIndex()) {
+ arg0->visible = 1;
+ } else {
+ arg0->visible = 0;
+ }
+}
+
+void func_800AB290(MenuItem* arg0) {
+ if (arg0->param1 != GetCupIndex()) {
+ arg0->param1 = GetCupIndex();
+ func_8009A594(arg0->D_8018DEE0_index, 0,
+ segmented_to_virtual_dupe_2(D_800E7E34[gCupCourseOrder[GetCupIndex()][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 != one) {
+ arg0->state = 0;
+ arg0->param2 = 0;
+ for (var_a1 = 0; var_a1 < GetCupSize(); var_a1++) {
+ if (GetCupCursorPosition() == 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) == GetCupIndex()) {
+ arg0->param2++;
+ if (arg0->param2 >= 0x33) {
+ arg0->state = one;
+ arg0->param2 = 0;
+ var_v0 = GetCupIndex() * 4;
+ arg0->param1 = var_v0 + 1;
+ }
+ } else {
+ arg0->param2 = 0;
+ arg0->param1 = GetCupIndex() * 4;
+ }
+ if (gSubMenuSelection == 3) {
+ arg0->state = 2;
+ arg0->param2 = 0;
+ }
+ break;
+ case 1:
+ if ((arg0->param1 / 4) != GetCupIndex()) {
+ arg0->state = 0;
+ arg0->param2 = 0;
+ arg0->param1 = 0;
+ } else {
+ arg0->param2++;
+ if (arg0->param2 >= 0x1F) {
+ arg0->param2 = 0;
+ arg0->param1 = (GetCupIndex() * 4) + (((arg0->param1 % 4) + one) % 4);
+ } else {
+ if (gSubMenuSelection == 3) {
+ arg0->state = 2;
+ arg0->param2 = 0;
+ }
+ }
+ }
+ break;
+ case 2:
+ arg0->param2++;
+ if (arg0->param2 >= 0x1A) {
+ arg0->state = 3;
+ arg0->param2 = 0;
+ }
+ if (gSubMenuSelection != 3) {
+ arg0->state = 0;
+ arg0->param2 = 0;
+ arg0->param1 = 0;
+ }
+ break;
+ case 3:
+ if (gSubMenuSelection != 3) {
+ 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 1:
+ temp_a1 = &D_800E7248[arg0->type - 0x65];
+ if (arg0->column != temp_a1->column) {
+ func_800A9208(arg0, temp_a1->column);
+ }
+ break;
+ case 2:
+ case 3:
+ 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 != GetCupIndex()) {
+ arg0->param1 = GetCupIndex();
+ arg0->param2 = func_800B54C0((s32) GetCupIndex(), 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 == 3) {
+ arg0->state = 1;
+ }
+ break;
+ case 1:
+ func_800A91D8(arg0, (s32) temp_v1->column, (s32) temp_v1->row);
+ if (gSubMenuSelection == 1) {
+ 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(CourseManager_GetProps()->Name) / 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(0xAB, 0, 0, 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) {
+ case 2:
+ if (gGPCurrentRaceRankByPlayerId[temp_a2] != 0) {
+ var_v1 = 1;
+ }
+ break;
+ case 3:
+ 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((GetCupIndex() * 4) + GetCupCursorPosition()) + 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((GetCupIndex() * 4) + GetCupCursorPosition()) + 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((GetCupIndex() * 4) + GetCupCursorPosition()) != 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) {
+ case 0:
+ 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:
+ break;
+ case 1:
+ arg0->param1 += 3;
+ if (arg0->param1 >= 0x8D) {
+ arg0->state = 0x0000000F;
+ }
+ break;
+ case 11:
+ case 12:
+ case 13:
+ case 14:
+ case 15:
+ case 16:
+ 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((GetCupIndex() * 4) + GetCupCursorPosition()) + 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((GetCupIndex() * 4) + GetCupCursorPosition()) + 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:
+ case 22:
+ case 23:
+ case 24:
+ case 25:
+ case 26:
+ case 41:
+ 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:
+ case 31:
+ arg0->param2 = (u32) arg0->state - 0x1E;
+ if (func_800B639C((GetCupIndex() * 4) + GetCupCursorPosition()) != 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:
+ if ((arg0->param1 == 1) && (func_800B6A68() != 0)) {
+ arg0->state = 0x00000019;
+ } else {
+ arg0->param1++;
+ if (arg0->param1 >= 2) {
+ arg0->state = 0x0000001E;
+ }
+ }
+ break;
+ case 35:
+ case 36:
+ 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:
+ 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 != 0xB) {
+ arg0->visible = 0;
+ } else {
+ arg0->visible = 1;
+ }
+}
+
+void func_800AEEBC(MenuItem* arg0) {
+ if (gSubMenuSelection != 0xC) {
+ arg0->visible = 0;
+ } else {
+ arg0->visible = 1;
+ }
+}
+
+void func_800AEEE8(MenuItem* arg0) {
+ if (gSubMenuSelection != 0xD) {
+ 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 ((gTextCreditsRenderInfo[idx].slideDirection == 0) || (gTextCreditsRenderInfo[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 = &gTextCreditsRenderInfo[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 = &gTextCreditsRenderInfo[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;
+ }
+}