summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPhlosioneer <mattmdrr2@gmail.com>2019-04-08 17:48:36 -0400
committerhuderlem <huderlem@gmail.com>2019-04-13 11:34:53 -0500
commit2b740b46e8254446b2598b4ab13aeb752e060cc0 (patch)
tree25a071938506d4f696449eca074f2d60980020d9 /src
parentee2edb068af30cf2d560de510fc03cfff77acc92 (diff)
About halfway done with pokenav_unk_1.s
Diffstat (limited to 'src')
-rw-r--r--src/pokedex.c4
-rw-r--r--src/pokenav.c274
-rw-r--r--src/pokenav_unk_1.c259
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