diff --git a/progress/progress.menu.csv b/progress/progress.menu.csv
index fa709fce..12a9af44 100644
--- a/progress/progress.menu.csv
+++ b/progress/progress.menu.csv
@@ -106,7 +106,7 @@ us,.menu,func_menu_8002F6C8,148,yes
us,.menu,func_menu_8002C584,176,yes
us,.menu,func_menu_8003155C,652,no
us,.menu,func_menu_8002ADC8,2368,no
-us,.menu,func_menu_80030340,1364,no
+us,.menu,func_menu_80030340,1364,yes
us,.menu,func_menu_80030C14,2376,no
us,.menu,func_menu_80027FAC,1820,no
us,.menu,func_menu_8002DEE8,192,yes
diff --git a/progress/progress.total.csv b/progress/progress.total.csv
index 56cacd55..7707c4c2 100644
--- a/progress/progress.total.csv
+++ b/progress/progress.total.csv
@@ -3389,7 +3389,7 @@ us,.menu,func_menu_8002F6C8,148,yes
us,.menu,func_menu_8002C584,176,yes
us,.menu,func_menu_8003155C,652,no
us,.menu,func_menu_8002ADC8,2368,no
-us,.menu,func_menu_80030340,1364,no
+us,.menu,func_menu_80030340,1364,yes
us,.menu,func_menu_80030C14,2376,no
us,.menu,func_menu_80027FAC,1820,no
us,.menu,func_menu_8002DEE8,192,yes
diff --git a/progress/progress_menu.svg b/progress/progress_menu.svg
index d3126da7..b32e3b8b 100644
--- a/progress/progress_menu.svg
+++ b/progress/progress_menu.svg
@@ -9,7 +9,7 @@
-
+
@@ -17,7 +17,7 @@
menu
- 34.7088%
- 34.7088%
+ 36.9352%
+ 36.9352%
diff --git a/progress/progress_total.svg b/progress/progress_total.svg
index d6bbcf4e..d6722857 100644
--- a/progress/progress_total.svg
+++ b/progress/progress_total.svg
@@ -17,7 +17,7 @@
Donkey Kong 64 (US)
- 37.7133%
- 37.7133%
+ 37.7961%
+ 37.7961%
diff --git a/src/menu/code_0.c b/src/menu/code_0.c
index adf03095..685d057b 100644
--- a/src/menu/code_0.c
+++ b/src/menu/code_0.c
@@ -258,7 +258,7 @@ typedef struct {
typedef struct {
u8 unk0;
u8 unk1;
- u8 unk2;
+ u8 unk2; // Used
s8 unk3; // Used
} Struct807ECDEC;
diff --git a/src/menu/code_3E10.c b/src/menu/code_3E10.c
index e122cb59..f2a1e9dd 100644
--- a/src/menu/code_3E10.c
+++ b/src/menu/code_3E10.c
@@ -140,7 +140,7 @@ extern f32 menu_icon_transition_scale;
extern f32 menu_selection_speed;
s32 func_menu_800322D0(s32);
-void func_menu_80030340(Actor*, s32, Gfx*, s32);
+s32 func_menu_80030340(Actor*, s32, Gfx*, s32);
void func_global_asm_8061D4E4(Actor*);
void func_menu_80030894(MenuAdditionalActorData*,void*,s32,s32,f32,u8,s32); // Param 1 is ActorAdditionalData
@@ -1626,8 +1626,226 @@ void func_menu_80030258(Gfx *dl, Actor *arg1) {
func_menu_80030340(arg1, 1, dl, 0);
}
-// Jumptable
-#pragma GLOBAL_ASM("asm/nonmatchings/menu/code_3E10/func_menu_80030340.s")
+extern s8 D_8076A0D0[];
+extern s8 *D_global_asm_807ECDEC;
+
+typedef struct {
+ u8 unk0[0xC - 0x0];
+ s16 unkC; // Used
+ s16 unkE; // Used
+ u8 unk10;
+ u8 unk11;
+ s8 unk12; // Used
+ u8 unk13;
+ u8 unk14;
+ u8 unk15;
+ u8 unk16;
+ s8 unk17; // Used
+} AAD_80030340;
+
+s32 func_menu_80030340(Actor *actor, s32 arg1, Gfx *dl, s32 arg3) {
+ AAD_80030340 *aaD;
+ u32 sp18;
+ u16 temp_v0;
+
+ aaD = actor->additional_actor_data;
+ sp18 = 0;
+ if (*character_change_array->new_controller_inputs & A_BUTTON) {
+ sp18 = 1;
+ }
+ if (*character_change_array->new_controller_inputs & B_BUTTON) {
+ sp18 |= 2;
+ }
+ if (*character_change_array->new_controller_inputs & U_CBUTTONS) {
+ sp18 |= 0x40;
+ }
+ if (*character_change_array->new_controller_inputs & D_CBUTTONS) {
+ sp18 |= 0x80;
+ }
+ if (*character_change_array->new_controller_inputs & Z_TRIG) {
+ sp18 |= 0x100;
+ }
+ if (D_global_asm_807ECDEC[2] < -40) {
+ sp18 |= 4;
+ } else if (D_global_asm_807ECDEC[2] >= 41) {
+ sp18 |= 8;
+ }
+ if (D_global_asm_807ECDEC[3] < -40) {
+ sp18 |= 0x20;
+ } else if (D_global_asm_807ECDEC[3] >= 41) {
+ sp18 |= 0x10;
+ }
+ switch (arg1) {
+ case 0:
+ D_menu_80033F38 = 1;
+ menu_rotation_speed = 0.0f;
+ menu_selection_speed = 0.0f;
+ menu_icon_transition_scale = 0.0f;
+ global_properties_bitfield &= 0xFFFEFFFF;
+ aaD->unkC = 0;
+ aaD->unkE = 0;
+ is_in_submenu = 1;
+ break;
+ case 1:
+ break;
+ case 2:
+ D_8076A0D0[aaD->unk12] = aaD->unk17;
+ func_global_asm_80659670(1.0f, 1.0f, 1.0f, 0);
+ break;
+ }
+ switch (aaD->unk12) {
+ case 0:
+ if (arg1 == 1) {
+ func_menu_80027F34(actor, dl);
+ return;
+ }
+ if (arg1 == 2) {
+ func_menu_80027E60(actor, sp18);
+ } else {
+ func_menu_80027F40(actor, arg3);
+ }
+ break;
+ case 1:
+ if (arg1 == 1) {
+ func_menu_800286C8(actor, dl);
+ return;
+ }
+ if (arg1 == 2) {
+ func_menu_80027FAC(actor, sp18);
+ } else {
+ func_menu_80028834(actor, arg3);
+ }
+ break;
+ case 2:
+ if (arg1 == 1) {
+ func_menu_80028D3C(actor, dl);
+ return;
+ }
+ if (arg1 == 2) {
+ func_menu_80028C20(actor, sp18);
+ } else {
+ func_menu_80028EA8(actor, arg3);
+ }
+ break;
+ case 3:
+ if (arg1 == 1) {
+ func_menu_800291CC(actor, dl);
+ return;
+ }
+ if (arg1 == 2) {
+ func_menu_80029114(actor, sp18);
+ } else {
+ func_menu_800297B8(actor, arg3);
+ }
+ break;
+ case 4:
+ if (arg1 == 1) {
+ func_menu_80029BB4(actor, dl);
+ return;
+ }
+ if (arg1 == 2) {
+ func_menu_80029AAC(actor, sp18);
+ } else {
+ func_menu_80029D30(actor, arg3);
+ }
+ break;
+ case 5:
+ if (arg1 == 1) {
+ func_menu_8002A088(actor, dl);
+ return;
+ }
+ if (arg1 == 2) {
+ func_menu_80029EF8(actor, sp18);
+ } else {
+ func_menu_8002A36C(actor, arg3);
+ }
+ break;
+ case 6:
+ if (arg1 == 1) {
+ func_menu_8002A638(actor, dl);
+ return;
+ }
+ if (arg1 == 2) {
+ func_menu_8002A468(actor, sp18);
+ } else {
+ func_menu_8002AB80(actor, arg3);
+ }
+ break;
+ case 7:
+ if (arg1 == 1) {
+ func_menu_8002B708(actor, dl);
+ return;
+ }
+ if (arg1 == 2) {
+ func_menu_8002ADC8(actor, sp18);
+ } else {
+ func_menu_8002C0C8(actor, arg3);
+ }
+ break;
+ case 11:
+ if (arg1 == 1) {
+ func_menu_8002C634(actor, dl);
+ return;
+ }
+ if (arg1 == 2) {
+ func_menu_8002C584(actor, sp18);
+ } else {
+ func_menu_8002C91C(actor, arg3);
+ }
+ break;
+ case 8:
+ if (arg1 == 1) {
+ func_menu_8002D520(actor, dl);
+ return;
+ }
+ if (arg1 == 2) {
+ func_menu_8002CFA4(actor, sp18);
+ } else {
+ func_menu_8002D7EC(actor, arg3);
+ }
+ break;
+ case 9:
+ if (arg1 == 1) {
+ func_menu_8002DBDC(actor, dl);
+ return;
+ }
+ if (arg1 == 2) {
+ func_menu_8002D8AC(actor, sp18);
+ } else {
+ func_menu_8002DEE8(actor, arg3);
+ }
+ break;
+ case 10:
+ if (arg1 == 1) {
+ func_menu_8002E420(actor, dl);
+ return;
+ }
+ if (arg1 == 2) {
+ func_menu_8002DFA8(actor, sp18);
+ } else {
+ func_menu_8002E8B8(actor, arg3);
+ }
+ break;
+ case 12:
+ if (arg1 == 1) {
+ func_menu_8002F284(actor, dl);
+ return;
+ }
+ if (arg1 == 2) {
+ func_menu_8002EF68(actor, sp18);
+ } else {
+ func_menu_8002F6C8(actor, arg3);
+ }
+ break;
+ default:
+ break;
+ }
+ if (D_menu_80033F50 > 0) {
+ D_menu_80033F50--;
+ }
+ D_menu_80033670 = sp18;
+ return dl;
+}
extern int func_menu_80030C14(); // TODO: Signature