diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/pokedex.c | 4 | ||||
-rw-r--r-- | src/pokenav.c | 274 | ||||
-rw-r--r-- | src/pokenav_unk_1.c | 259 |
3 files changed, 391 insertions, 146 deletions
diff --git a/src/pokedex.c b/src/pokedex.c index 3343854cd..cf144f619 100644 --- a/src/pokedex.c +++ b/src/pokedex.c @@ -4039,7 +4039,7 @@ void sub_80C0460(u16 weight, u8 left, u8 top) lsls r2, 24\n\ lsrs r2, 24\n\ str r2, [sp, 0x10]\n\ - ldr r5, =0x000186a0 @ Note to decompiler: See UNKNOWN_OFFSET\n\ + ldr r5, =0x000186a0 @ Note to decompiler: See UNKNOWN_POKENAV_OFFSET\n\ muls r0, r5\n\ ldr r1, =0x000011b8\n\ bl __divsi3\n\ @@ -4073,7 +4073,7 @@ _080C04C0:\n\ mov r8, r1\n\ movs r6, 0x1\n\ _080C04C6:\n\ - ldr r1, =0x000186a0 @ Note to decompiler: See UNKNOWN_OFFSET\n\ + ldr r1, =0x000186a0 @ Note to decompiler: See UNKNOWN_POKENAV_OFFSET\n\ adds r0, r7, 0\n\ bl __umodsi3\n\ adds r7, r0, 0\n\ diff --git a/src/pokenav.c b/src/pokenav.c index fba5bd1a6..a5fb155da 100644 --- a/src/pokenav.c +++ b/src/pokenav.c @@ -15,25 +15,12 @@ enum MODE_FORCE_CALL_2, // Set after making a call, has to exit Pokenav. }; -enum -{ - NAVMENU_CB_UNK_0, - NAVMENU_CB_UNK_1, - NAVMENU_CB_UNK_2, - NAVMENU_CB_UNK_3, - NAVMENU_CB_UNK_4, - NAVMENU_CB_UNK_5, - NAVMENU_CB_UNK_6 -}; - #define LOOPED_TASK_DECODE_STATE(action) (action - 5) #define LOOPED_TASK_ID(primary, secondary) (((secondary) << 16) |(primary)) #define LOOPED_TASK_PRIMARY_ID(taskId) (taskId & 0xFFFF) #define LOOPED_TASK_SECONDARY_ID(taskId) (taskId >> 16) -#define UNKNOWN_OFFSET 100000 - #define SUBSTRUCT_COUNT 19 struct PokenavResources @@ -46,36 +33,41 @@ struct PokenavResources void *field10[SUBSTRUCT_COUNT]; }; -extern u32 sub_81C9430(void); -extern u32 sub_81C941C(void); +struct UnknownPokenavCallbackStruct +{ + u32 (*unk0)(void); + u32 (*unk4)(void); + u32 (*unk8)(void); + u32 (*unkC)(void); + u32 (*unk10)(void); + void (*unk14)(void); + u32 (*unk18)(void); +}; + extern u32 sub_81C9924(void); extern u32 sub_81C99C0(void); extern u32 sub_81C9990(void); extern u32 sub_81C9940(void); -extern u32 sub_81C9338(void); -extern u32 sub_81C9368(void); -extern u32 sub_81C92CC(void); -extern u32 sub_81C9304(void); extern u32 sub_81CC4D4(void); extern u32 sub_81CC554(void); extern u32 sub_81CC5F4(void); extern u32 sub_81CC62C(void); extern u32 sub_81CC65C(void); -extern u32 sub_81CC524(void); +extern void sub_81CC524(void); extern u32 sub_81CC670(void); extern u32 sub_81CCFD8(void); extern u32 sub_81CD070(void); extern u32 sub_81CDDD4(void); extern u32 sub_81CDE2C(void); extern u32 sub_81CDE64(void); -extern u32 sub_81CD1C0(void); +extern void sub_81CD1C0(void); extern u32 sub_81CECA0(void); extern u32 sub_81CEF3C(void); extern u32 sub_81CEFDC(void); extern u32 sub_81CF330(void); extern u32 sub_81CF3A0(void); extern u32 sub_81CF3D0(void); -extern u32 sub_81CEFF0(void); +extern void sub_81CEFF0(void); extern u32 sub_81CF3F8(void); extern u32 sub_81CD024(void); extern u32 sub_81CEF98(void); @@ -85,21 +77,21 @@ extern u32 sub_81CAB24(void); extern u32 sub_81CB260(void); extern u32 sub_81CB29C(void); extern u32 sub_81CB2CC(void); -extern u32 sub_81CAB38(void); +extern void sub_81CAB38(void); extern u32 sub_81CB2E0(void); extern u32 sub_81CF9BC(void); extern u32 sub_81CFA34(void); extern u32 sub_81CFDD0(void); extern u32 sub_81CFE40(void); extern u32 sub_81CFE70(void); -extern u32 sub_81CFA48(void); +extern void sub_81CFA48(void); extern u32 sub_81CFE98(void); extern u32 sub_81D0450(void); extern u32 sub_81D04A0(void); extern u32 sub_81D0978(void); extern u32 sub_81D09B0(void); extern u32 sub_81D09E0(void); -extern u32 sub_81D04B8(void); +extern void sub_81D04B8(void); extern u32 sub_81D09F4(void); extern u32 sub_81CFA04(void); extern u32 sub_81CFE08(void); @@ -126,142 +118,142 @@ static void CB2_Pokenav(void); void sub_81C72BC(void); // Const rom data. -u32 (*const PokenavMenuCallbacks[15][7])(void) = +const struct UnknownPokenavCallbackStruct PokenavMenuCallbacks[15] = { { - sub_81C9298, - sub_81C941C, - sub_81C9924, - sub_81C9990, - sub_81C99C0, - sub_81C9430, - sub_81C99D4, + .unk0 = sub_81C9298, + .unk4 = sub_81C941C, + .unk8 = sub_81C9924, + .unkC = sub_81C9990, + .unk10 = sub_81C99C0, + .unk14 = sub_81C9430, + .unk18 = sub_81C99D4, }, { - sub_81C9298, - sub_81C941C, - sub_81C9940, - sub_81C9990, - sub_81C99C0, - sub_81C9430, - sub_81C99D4, + .unk0 = sub_81C9298, + .unk4 = sub_81C941C, + .unk8 = sub_81C9940, + .unkC = sub_81C9990, + .unk10 = sub_81C99C0, + .unk14 = sub_81C9430, + .unk18 = sub_81C99D4, }, { - sub_81C9338, - sub_81C941C, - sub_81C9940, - sub_81C9990, - sub_81C99C0, - sub_81C9430, - sub_81C99D4, + .unk0 = sub_81C9338, + .unk4 = sub_81C941C, + .unk8 = sub_81C9940, + .unkC = sub_81C9990, + .unk10 = sub_81C99C0, + .unk14 = sub_81C9430, + .unk18 = sub_81C99D4, }, { - sub_81C9368, - sub_81C941C, - sub_81C9940, - sub_81C9990, - sub_81C99C0, - sub_81C9430, - sub_81C99D4, + .unk0 = sub_81C9368, + .unk4 = sub_81C941C, + .unk8 = sub_81C9940, + .unkC = sub_81C9990, + .unk10 = sub_81C99C0, + .unk14 = sub_81C9430, + .unk18 = sub_81C99D4, }, { - sub_81C92CC, - sub_81C941C, - sub_81C9940, - sub_81C9990, - sub_81C99C0, - sub_81C9430, - sub_81C99D4, + .unk0 = sub_81C92CC, + .unk4 = sub_81C941C, + .unk8 = sub_81C9940, + .unkC = sub_81C9990, + .unk10 =sub_81C99C0, + .unk14 = sub_81C9430, + .unk18 = sub_81C99D4, }, { - sub_81C9304, - sub_81C941C, - sub_81C9940, - sub_81C9990, - sub_81C99C0, - sub_81C9430, - sub_81C99D4, + .unk0 = sub_81C9304, + .unk4 = sub_81C941C, + .unk8 = sub_81C9940, + .unkC = sub_81C9990, + .unk10 = sub_81C99C0, + .unk14 = sub_81C9430, + .unk18 = sub_81C99D4, }, { - sub_81CC4D4, - sub_81CC554, - sub_81CC5F4, - sub_81CC62C, - sub_81CC65C, - sub_81CC524, - sub_81CC670, + .unk0 = sub_81CC4D4, + .unk4 = sub_81CC554, + .unk8 = sub_81CC5F4, + .unkC = sub_81CC62C, + .unk10 = sub_81CC65C, + .unk14 = sub_81CC524, + .unk18 = sub_81CC670, }, { - sub_81CCFD8, - sub_81CD070, - sub_81CDDD4, - sub_81CDE2C, - sub_81CDE64, - sub_81CD1C0, - sub_81CECA0, + .unk0 = sub_81CCFD8, + .unk4 = sub_81CD070, + .unk8 = sub_81CDDD4, + .unkC = sub_81CDE2C, + .unk10 = sub_81CDE64, + .unk14 = sub_81CD1C0, + .unk18 = sub_81CECA0, }, { - sub_81CEF3C, - sub_81CEFDC, - sub_81CF330, - sub_81CF3A0, - sub_81CF3D0, - sub_81CEFF0, - sub_81CF3F8, + .unk0 = sub_81CEF3C, + .unk4 = sub_81CEFDC, + .unk8 = sub_81CF330, + .unkC = sub_81CF3A0, + .unk10 = sub_81CF3D0, + .unk14 = sub_81CEFF0, + .unk18 = sub_81CF3F8, }, { - sub_81CD024, - sub_81CD070, - sub_81CDDD4, - sub_81CDE2C, - sub_81CDE64, - sub_81CD1C0, - sub_81CECA0, + .unk0 = sub_81CD024, + .unk4 = sub_81CD070, + .unk8 = sub_81CDDD4, + .unkC = sub_81CDE2C, + .unk10 = sub_81CDE64, + .unk14 = sub_81CD1C0, + .unk18 = sub_81CECA0, }, { - sub_81CEF98, - sub_81CEFDC, - sub_81CF368, - sub_81CF3A0, - sub_81CF3D0, - sub_81CEFF0, - sub_81CF3F8, + .unk0 = sub_81CEF98, + .unk4 = sub_81CEFDC, + .unk8 = sub_81CF368, + .unkC = sub_81CF3A0, + .unk10 = sub_81CF3D0, + .unk14 = sub_81CEFF0, + .unk18 = sub_81CF3F8, }, { - sub_81CAAE8, - sub_81CAB24, - sub_81CB260, - sub_81CB29C, - sub_81CB2CC, - sub_81CAB38, - sub_81CB2E0, + .unk0 = sub_81CAAE8, + .unk4 = sub_81CAB24, + .unk8 = sub_81CB260, + .unkC = sub_81CB29C, + .unk10 = sub_81CB2CC, + .unk14 = sub_81CAB38, + .unk18 = sub_81CB2E0, }, { - sub_81CF9BC, - sub_81CFA34, - sub_81CFDD0, - sub_81CFE40, - sub_81CFE70, - sub_81CFA48, - sub_81CFE98, + .unk0 = sub_81CF9BC, + .unk4 = sub_81CFA34, + .unk8 = sub_81CFDD0, + .unkC = sub_81CFE40, + .unk10 = sub_81CFE70, + .unk14 = sub_81CFA48, + .unk18 = sub_81CFE98, }, { - sub_81D0450, - sub_81D04A0, - sub_81D0978, - sub_81D09B0, - sub_81D09E0, - sub_81D04B8, - sub_81D09F4, + .unk0 = sub_81D0450, + .unk4 = sub_81D04A0, + .unk8 = sub_81D0978, + .unkC = sub_81D09B0, + .unk10 = sub_81D09E0, + .unk14 = sub_81D04B8, + .unk18 = sub_81D09F4, }, { - sub_81CFA04, - sub_81CFA34, - sub_81CFE08, - sub_81CFE40, - sub_81CFE70, - sub_81CFA48, - sub_81CFE98, + .unk0 = sub_81CFA04, + .unk4 = sub_81CFA34, + .unk8 = sub_81CFE08, + .unkC = sub_81CFE40, + .unk10 = sub_81CFE70, + .unk14 = sub_81CFA48, + .unk18 = sub_81CFE98, }, }; @@ -506,7 +498,7 @@ void sub_81C742C(u8 taskId) // Wait for LoopedTask_InitPokenavMenu to finish if (PokenavMainMenuLoopedTaskIsActive()) break; - SetActivePokenavMenu(0 + UNKNOWN_OFFSET); + SetActivePokenavMenu(0 + UNKNOWN_POKENAV_OFFSET); data[0] = 4; break; case 2: @@ -520,10 +512,10 @@ void sub_81C742C(u8 taskId) ShutdownPokenav(); data[0] = 5; } - else if (v1 >= UNKNOWN_OFFSET) + else if (v1 >= UNKNOWN_POKENAV_OFFSET) { - PokenavMenuCallbacks[gPokenavResources->currentMenuIndex][NAVMENU_CB_UNK_6](); - PokenavMenuCallbacks[gPokenavResources->currentMenuIndex][NAVMENU_CB_UNK_5](); + PokenavMenuCallbacks[gPokenavResources->currentMenuIndex].unk18(); + PokenavMenuCallbacks[gPokenavResources->currentMenuIndex].unk14(); if (SetActivePokenavMenu(v1)) { data[0] = 4; @@ -563,16 +555,16 @@ void sub_81C742C(u8 taskId) bool32 SetActivePokenavMenu(u32 indexWithOffset) { - u32 index = indexWithOffset - UNKNOWN_OFFSET; + u32 index = indexWithOffset - UNKNOWN_POKENAV_OFFSET; InitKeys_(); - if (!PokenavMenuCallbacks[index][NAVMENU_CB_UNK_0]()) + if (!PokenavMenuCallbacks[index].unk0()) return FALSE; - if (!PokenavMenuCallbacks[index][NAVMENU_CB_UNK_2]()) + if (!PokenavMenuCallbacks[index].unk8()) return FALSE; - sub_81C7834(PokenavMenuCallbacks[index][NAVMENU_CB_UNK_3], PokenavMenuCallbacks[index][NAVMENU_CB_UNK_4]); - gPokenavResources->currentMenuCb1 = PokenavMenuCallbacks[index][NAVMENU_CB_UNK_1]; + sub_81C7834(PokenavMenuCallbacks[index].unkC, PokenavMenuCallbacks[index].unk10); + gPokenavResources->currentMenuCb1 = PokenavMenuCallbacks[index].unk4; gPokenavResources->currentMenuIndex = index; return TRUE; } @@ -618,7 +610,7 @@ void FreePokenavSubstruct(u32 index) FREE_AND_SET_NULL(gPokenavResources->field10[index]); } -u16 GetPokenavMode(void) +u32 GetPokenavMode(void) { return gPokenavResources->mode; } diff --git a/src/pokenav_unk_1.c b/src/pokenav_unk_1.c index dd2411e01..da05657cb 100644 --- a/src/pokenav_unk_1.c +++ b/src/pokenav_unk_1.c @@ -1,17 +1,35 @@ #include "global.h" #include "pokenav.h" #include "event_data.h" +#include "main.h" +#include "sound.h" +#include "constants/songs.h" struct Pokenav1Struct { u16 unk0; - u16 unk2; + s16 unk2; u16 unk4; u16 unk6; - u8 unk8[8]; + u32 unk8; + u32 (*unkC)(struct Pokenav1Struct*); }; -extern void sub_81C939C(struct Pokenav1Struct *state); + +extern u32 sub_81C76AC(void); +extern u32 sub_81C963C(struct Pokenav1Struct *a0); +extern u32 sub_81C96FC(struct Pokenav1Struct *a0); +extern u32 sub_81C9814(void); +extern void sub_81C97B0(struct Pokenav1Struct *a0, u32 a1); + +u32 sub_81C9600(struct Pokenav1Struct *a0); +u32 sub_81C9588(struct Pokenav1Struct *a0); +u32 sub_81C9520(struct Pokenav1Struct *a0); +u32 sub_81C943C(struct Pokenav1Struct *a0); +u32 (*sub_81C93EC(void))(struct Pokenav1Struct*); +void sub_81C939C(struct Pokenav1Struct *state); + +extern u8 gUnknown_0861FC59[]; u8 sub_81C9268(void) { @@ -40,4 +58,239 @@ u32 sub_81C9298(void) sub_81C939C(state); return 1; +} + +u32 sub_81C92CC(void) +{ + struct Pokenav1Struct *state = AllocSubstruct(1, sizeof(struct Pokenav1Struct)); + u8 v0; + + if (state == NULL) + return 0; + + state->unk0 = sub_81C9268(); + state->unk2 = 2; + state->unk4 = 2; + state->unk6 = 0; + sub_81C939C(state); + + return 1; +} + +u32 sub_81C9304(void) +{ + struct Pokenav1Struct *state = AllocSubstruct(1, sizeof(struct Pokenav1Struct)); + u8 v0; + + if (state == NULL) + return 0; + + state->unk0 = sub_81C9268(); + state->unk2 = 3; + state->unk4 = 3; + sub_81C939C(state); + + return 1; +} + +u32 sub_81C9338(void) +{ + struct Pokenav1Struct *state = AllocSubstruct(1, sizeof(struct Pokenav1Struct)); + u8 v0; + + if (state == NULL) + return 0; + + state->unk0 = 3; + state->unk2 = 0; + state->unk4 = 5; + state->unk6 = 0; + sub_81C939C(state); + + return 1; +} + +u32 sub_81C9368(void) +{ + struct Pokenav1Struct *state = AllocSubstruct(1, sizeof(struct Pokenav1Struct)); + u8 v0; + + if (state == NULL) + return 0; + + state->unk0 = 4; + state->unk2 = sub_81C76AC(); + state->unk4 = 8 + state->unk2; + state->unk6 = 0; + sub_81C939C(state); + + return 1; +} + +void sub_81C939C(struct Pokenav1Struct *state) +{ + switch (state->unk0) + { + case 0: + SetPokenavMode(0); + // fallthrough + case 1: + case 2: + state->unkC = sub_81C93EC(); + break; + case 3: + state->unkC = sub_81C963C; + break; + case 4: + state->unkC = sub_81C96FC; + break; + } +} + +u32 (*sub_81C93EC(void))(struct Pokenav1Struct*) +{ + switch (GetPokenavMode()) + { + default: + case 0: + return sub_81C943C; + case 1: + return sub_81C9520; + case 2: + return sub_81C9588; + } +} + +u32 sub_81C941C(void) +{ + struct Pokenav1Struct *state = GetSubstructPtr(1); + return state->unkC(state); +} + +void sub_81C9430(void) +{ + FreePokenavSubstruct(1); +} + +u32 sub_81C943C(struct Pokenav1Struct *a0) +{ + if (sub_81C9814() != 0) + return 1; + + if (gMain.newKeys & A_BUTTON) + { + switch (gUnknown_0861FC59[a0->unk2 + a0->unk0 * 6]) + { + case 0: + a0->unk6 = gSaveBlock2Ptr->regionMapZoom ? 2 : 1; + sub_81C97B0(a0, UNKNOWN_POKENAV_OFFSET + 6); + return 8; + case 1: + a0->unk0 = 3; + a0->unk2 = 0; + a0->unk4 = gUnknown_0861FC59[18]; + a0->unkC = sub_81C963C; + return 2; + case 2: + a0->unk6 = 6; + sub_81C97B0(a0, UNKNOWN_POKENAV_OFFSET + 11); + return 8; + case 3: + if (CanViewRibbonsMenu()) + { + a0->unk6 = 9; + sub_81C97B0(a0, UNKNOWN_POKENAV_OFFSET + 12); + return 8; + } + else + { + a0->unkC = sub_81C9600; + return 6; + } + case 4: + return -1; + } + } + + if (gMain.newKeys & B_BUTTON) + return -1; + + return 0; +} + +u32 sub_81C9520(struct Pokenav1Struct *a0) +{ + if (sub_81C9814() != 0) + return 1; + + if (gMain.newKeys & A_BUTTON) + { + if (gUnknown_0861FC59[a0->unk2 + a0->unk0 * 6] == 2) + { + a0->unk6 = 6; + sub_81C97B0(a0, UNKNOWN_POKENAV_OFFSET + 11); + return 8; + } + else + { + PlaySE(SE_HAZURE); + return 0; + } + } + + if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_HAZURE); + return 0; + } + + return 0; +} + +u32 sub_81C9588(struct Pokenav1Struct *a0) +{ + if (sub_81C9814() != 0) + return 1; + + if (gMain.newKeys & A_BUTTON) + { + u32 v0 = gUnknown_0861FC59[a0->unk2 + a0->unk0 * 6]; + if (v0 != 2 && v0 != 4) + { + PlaySE(SE_HAZURE); + return 0; + } + else if (v0 == 2) + { + a0->unk6 = 6; + sub_81C97B0(a0, UNKNOWN_POKENAV_OFFSET + 11); + return 8; + } + else + { + return -1; + } + } + else if (gMain.newKeys & B_BUTTON) + { + return -1; + } + return 0; +} + +u32 sub_81C9600(struct Pokenav1Struct *a0) +{ + if (sub_81C9814() != 0) + { + a0->unkC = sub_81C93EC(); + return 1; + } + + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + a0->unkC = sub_81C93EC(); + return 7; + } + + return 0; }
\ No newline at end of file |