From fb8dddf0f16a0a7a582fe832bf1091b00f4a02d9 Mon Sep 17 00:00:00 2001 From: Phlosioneer Date: Sat, 23 Feb 2019 23:17:26 -0500 Subject: Decompiled sub_81C81D4 --- src/pokenav.c | 49 ++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 42 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/pokenav.c b/src/pokenav.c index d09c3da94..1e712b170 100644 --- a/src/pokenav.c +++ b/src/pokenav.c @@ -28,6 +28,18 @@ enum #define UNKNOWN_OFFSET 100000 +// Sizes based tentatively on loads and stores in sub_81C9160 +struct UnknownSubSubStruct_0203CF40 { + u16 unk0; + u16 unk2; + u16 unk4; + u16 unk6; + u8 unk8; + u8 unk9; + u16 unkA; + u16 unkC; +}; + struct UnknownSubStruct_0203CF40 { void (*unk0)(u32); @@ -39,7 +51,14 @@ struct UnknownSubStruct_0203CF40 struct Sprite *unk18; struct Sprite *unk1C[2]; struct Sprite *unk24[2]; - u8 tilemapBuffer[0x1000]; + u8 tilemapBuffer[0x800]; +}; + +struct UnknownSubStruct_81C81D4 +{ + u8 unk0[0x888]; + struct UnknownSubSubStruct_0203CF40 unk888; + u8 unk898[0xC]; }; #define SUBSTRUCT_COUNT 19 @@ -51,7 +70,7 @@ struct UnknownStruct_0203CF40 u16 mode; u16 fieldA; bool32 hasAnyRibbons; - struct UnknownSubStruct_0203CF40 *field10[SUBSTRUCT_COUNT]; + void *field10[SUBSTRUCT_COUNT]; }; extern u32 sub_81C9430(void); @@ -116,6 +135,9 @@ extern u32 sub_81D04B8(void); extern u32 sub_81D09F4(void); extern u32 sub_81CFA04(void); extern u32 sub_81CFE08(void); +extern u32 sub_81C91AC(struct UnknownSubStruct_81C81D4 *a0, const void *a1, void *a2, s32 a3); +extern u32 sub_81C9160(struct UnknownSubSubStruct_0203CF40 *a0, void *a1); +extern u32 sub_81C8254(s32); u32 sub_81C791C(s32 a0); bool32 sub_81C756C(u32 a0); @@ -760,7 +782,9 @@ bool32 CanViewRibbonsMenu(void) bool32 sub_81C76C4(void) { - struct UnknownSubStruct_0203CF40 *structPtr = AllocSubstruct(0, 0x82C); + struct UnknownSubStruct_0203CF40 *structPtr; + + structPtr = AllocSubstruct(0, sizeof(struct UnknownSubStruct_0203CF40)); if (structPtr == NULL) return FALSE; @@ -1422,12 +1446,23 @@ void sub_81C817C(struct Sprite *sprite) } } -/* -bool32 sub_81C81D4(const void *arg0, void *arg1, s32 arg3) +bool32 sub_81C81D4(const void *arg0, void *arg1, s32 arg2) { - struct UnknownSubStruct_0203CF40 *structPtr = AllocSubstruct(0x11, 0x8A4); + u32 v1; + struct UnknownSubStruct_81C81D4 *structPtr; + + structPtr = AllocSubstruct(0x11, sizeof(struct UnknownSubStruct_81C81D4)); if (structPtr == NULL) return FALSE; + + sub_81C9160(&structPtr->unk888, arg1); + + v1 = sub_81C91AC(structPtr, arg0, arg1, arg2); + if (v1 == 0) + return FALSE; + + sub_81C7078(sub_81C8254, 6); + return TRUE; } -*/ + -- cgit v1.2.3 From a7d2d986b234b870ae06555d2a64a1d7721b9556 Mon Sep 17 00:00:00 2001 From: Phlosioneer Date: Sat, 23 Feb 2019 23:38:32 -0500 Subject: Decompiled two small functions, updated structs --- src/pokenav.c | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/pokenav.c b/src/pokenav.c index 1e712b170..ce8606f0d 100644 --- a/src/pokenav.c +++ b/src/pokenav.c @@ -34,7 +34,7 @@ struct UnknownSubSubStruct_0203CF40 { u16 unk2; u16 unk4; u16 unk6; - u8 unk8; + u8 windowId; u8 unk9; u16 unkA; u16 unkC; @@ -56,7 +56,8 @@ struct UnknownSubStruct_0203CF40 struct UnknownSubStruct_81C81D4 { - u8 unk0[0x888]; + struct UnknownSubSubStruct_0203CF40 unk0; + u8 unkE[0x878]; struct UnknownSubSubStruct_0203CF40 unk888; u8 unk898[0xC]; }; @@ -78,6 +79,7 @@ extern void sub_81CAADC(void); extern u32 sub_81C99D4(void); extern void sub_8199D98(void); extern void sub_81C7D28(void); +extern void sub_81C8FE0(void); extern u32 sub_81C9298(void); extern u32 sub_81C941C(void); extern u32 sub_81C9924(void); @@ -434,14 +436,14 @@ bool32 sub_81C70D8(u32 a0) return FALSE; } -bool32 sub_81C7124(u32 a0) +bool32 sub_81C7124(u32 (*a0)(s32)) { s32 i; for (i = 0; i < NUM_TASKS; i++) { if (gTasks[i].isActive && (gTasks[i].func == sub_81C7170 || gTasks[i].func == sub_81C71E4) - && GetWordTaskArg(i, 1) == a0) + && (void *)GetWordTaskArg(i, 1) == a0) return TRUE; } return FALSE; @@ -740,7 +742,7 @@ void *AllocSubstruct(u32 index, u32 size) return gUnknown_0203CF40->field10[index] = Alloc(size); } -struct UnknownSubStruct_0203CF40 *GetSubstructPtr(u32 index) +void *GetSubstructPtr(u32 index) { return gUnknown_0203CF40->field10[index]; } @@ -1466,3 +1468,15 @@ bool32 sub_81C81D4(const void *arg0, void *arg1, s32 arg2) return TRUE; } +bool32 sub_81C8224(void) { + return sub_81C7124(sub_81C8254); +} + +void sub_81C8234(void) { + struct UnknownSubStruct_81C81D4 *structPtr; + + structPtr = GetSubstructPtr(0x11); + sub_81C8FE0(); + RemoveWindow(structPtr->unk0.windowId); + FreeSubstruct(0x11); +} \ No newline at end of file -- cgit v1.2.3 From 62589d7003946e04355a9a8c7e2f9088e88bffa7 Mon Sep 17 00:00:00 2001 From: Phlosioneer Date: Sun, 24 Feb 2019 03:33:33 -0500 Subject: Decompiled more, ported asmdiff to powershell --- src/pokenav.c | 140 +++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 129 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/pokenav.c b/src/pokenav.c index ce8606f0d..cb7e2463e 100644 --- a/src/pokenav.c +++ b/src/pokenav.c @@ -28,18 +28,32 @@ enum #define UNKNOWN_OFFSET 100000 -// Sizes based tentatively on loads and stores in sub_81C9160 struct UnknownSubSubStruct_0203CF40 { - u16 unk0; - u16 unk2; + u8 bg; + u8 unk1; + u8 unk2; + u8 unk3; u16 unk4; u16 unk6; u8 windowId; u8 unk9; u16 unkA; u16 unkC; + u16 unkE; }; +struct UnknownSubSubStruct_81C81D4 { + u16 unk0; + u16 unk2; + u16 unk4; + u16 unk6; + u16 unk8; + u16 unkA; + u32 unkC; + u32 unk10; +}; + +// Generally at index 0. struct UnknownSubStruct_0203CF40 { void (*unk0)(u32); @@ -54,12 +68,18 @@ struct UnknownSubStruct_0203CF40 u8 tilemapBuffer[0x800]; }; +// Generally at index 0x11 (17) struct UnknownSubStruct_81C81D4 { struct UnknownSubSubStruct_0203CF40 unk0; - u8 unkE[0x878]; - struct UnknownSubSubStruct_0203CF40 unk888; - u8 unk898[0xC]; + u32 unk10; + u32 unk14; + u32 unk18; + u32 unk1C; + u8 unk20[0x68]; + u8 tilemapBuffer[0x800]; + struct UnknownSubSubStruct_81C81D4 unk888; + u8 unk898[0x6]; }; #define SUBSTRUCT_COUNT 19 @@ -138,9 +158,17 @@ extern u32 sub_81D09F4(void); extern u32 sub_81CFA04(void); extern u32 sub_81CFE08(void); extern u32 sub_81C91AC(struct UnknownSubStruct_81C81D4 *a0, const void *a1, void *a2, s32 a3); -extern u32 sub_81C9160(struct UnknownSubSubStruct_0203CF40 *a0, void *a1); -extern u32 sub_81C8254(s32); - +extern u32 sub_81C9160(struct UnknownSubSubStruct_81C81D4 *a0, void *a1); +extern u32 sub_81C83E0(void); +extern void sub_81C8ED0(void); +extern void sub_81C8EF8(struct UnknownSubSubStruct_81C81D4 *a0, struct UnknownSubSubStruct_0203CF40 *a1); +extern u32 sub_81C83F0(s32); + +void sub_81C83AC(u32 a0, u32 a1, u32 a2, u32 a3, u32 a4, struct UnknownSubStruct_81C81D4 *a5); +void sub_81C837C(struct UnknownSubSubStruct_81C81D4 *a0, struct UnknownSubStruct_81C81D4 *a1); +void sub_81C835C(struct UnknownSubSubStruct_0203CF40 *a0); +void sub_81C82E4(struct UnknownSubStruct_81C81D4 *a0); +u32 sub_81C8254(s32); u32 sub_81C791C(s32 a0); bool32 sub_81C756C(u32 a0); bool32 sub_81C76C4(void); @@ -1468,15 +1496,105 @@ bool32 sub_81C81D4(const void *arg0, void *arg1, s32 arg2) return TRUE; } -bool32 sub_81C8224(void) { +bool32 sub_81C8224(void) +{ return sub_81C7124(sub_81C8254); } -void sub_81C8234(void) { +void sub_81C8234(void) +{ struct UnknownSubStruct_81C81D4 *structPtr; structPtr = GetSubstructPtr(0x11); sub_81C8FE0(); RemoveWindow(structPtr->unk0.windowId); FreeSubstruct(0x11); +} + +u32 sub_81C8254(s32 a0) +{ + struct UnknownSubStruct_81C81D4 *structPtr; + + if (IsDma3ManagerBusyWithBgCopy()) + return 2; + + structPtr = GetSubstructPtr(0x11); + + switch (a0) + { + case 0: + sub_81C82E4(structPtr); + return 0; + case 1: + sub_81C835C(&structPtr->unk0); + return 0; + case 2: + sub_81C837C(&structPtr->unk888, structPtr); + return 0; + case 3: + if (sub_81C83E0()) + { + return 2; + } + else + { + sub_81C8ED0(); + return 1; + } + case 4: + sub_81C8EF8(&structPtr->unk888, &structPtr->unk0); + return 4; + default: + return 4; + } +} + +void sub_81C82E4(struct UnknownSubStruct_81C81D4 *a0) +{ + u16 v1 = (a0->unk0.unk1 << 12) | a0->unk0.unk6; + // TODO: When #553 is merged, use a PALETTE_NUM_TO_FILL_VALUE(1) macro here... + sub_8199DF0(a0->unk0.bg, 0x11, a0->unk0.unk6, 1); + // ...and PALETTE_NUM_TO_FILL_VALUE(4) here. + sub_8199DF0(a0->unk0.bg, 0x44, a0->unk0.unk6 + 1, 1); + SetBgTilemapBuffer(a0->unk0.bg, a0->tilemapBuffer); + FillBgTilemapBufferRect_Palette0(a0->unk0.bg, v1, 0, 0, 32, 32); + ChangeBgY(a0->unk0.bg, 0, 0); + ChangeBgX(a0->unk0.bg, 0, 0); + ChangeBgY(a0->unk0.bg, a0->unk0.unk3 << 11, 2); + CopyBgTilemapBufferToVram(a0->unk0.bg); +} + +void sub_81C835C(struct UnknownSubSubStruct_0203CF40 *a0) +{ + // TODO: When #553 is merged, use a PALETTE_NUM_TO_FILL_VALUE(1) macro here. + FillWindowPixelBuffer(a0->windowId, 0x11); + PutWindowTilemap(a0->windowId); + CopyWindowToVram(a0->windowId, 1); +} + +void sub_81C837C(struct UnknownSubSubStruct_81C81D4 *a0, struct UnknownSubStruct_81C81D4 *a1) +{ + s32 v1; + s32 v2; + + // TODO: Clean this up. + v1 = a0->unk2 - a0->unk0; + v2 = a0->unk8; + if (v1 > a0->unk8) + v1 = v2; + sub_81C83AC(a0->unk10, a0->unk0, v1, a0->unkC, 0, a1); +} + +void sub_81C83AC(u32 a0, u32 a1, u32 a2, u32 a3, u32 a4, struct UnknownSubStruct_81C81D4 *a5) +{ + if (a2 == 0) + return; + + a5->unk1C = a0 + a1 * a3; + a5->unk18 = a3; + a5->unk0.unkC = 0; + a5->unk0.unkE = a2; + a5->unk14 = a1; + a5->unk10 = a4; + sub_81C7078(sub_81C83F0, 5); } \ No newline at end of file -- cgit v1.2.3 From a25f4c75bc1c92e43f9077d505e57ed6f2def471 Mon Sep 17 00:00:00 2001 From: Phlosioneer Date: Sun, 24 Feb 2019 04:33:58 -0500 Subject: Decompiled a weird function --- src/pokenav.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 62 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/pokenav.c b/src/pokenav.c index cb7e2463e..9db9f45a6 100644 --- a/src/pokenav.c +++ b/src/pokenav.c @@ -33,7 +33,8 @@ struct UnknownSubSubStruct_0203CF40 { u8 unk1; u8 unk2; u8 unk3; - u16 unk4; + u8 unk4; + u8 unk5; u16 unk6; u8 windowId; u8 unk9; @@ -76,7 +77,17 @@ struct UnknownSubStruct_81C81D4 u32 unk14; u32 unk18; u32 unk1C; - u8 unk20[0x68]; + u32 unk20; + u32 unk24; + u32 unk28; + u32 unk2C; + u32 unk30; + void (*unk34)(u32, char*); + void (*unk38)(u16, u32, u32); + u32 unk3C; + u32 unk40; + u32 unk44; + char unk48[0x40]; u8 tilemapBuffer[0x800]; struct UnknownSubSubStruct_81C81D4 unk888; u8 unk898[0x6]; @@ -159,11 +170,11 @@ extern u32 sub_81CFA04(void); extern u32 sub_81CFE08(void); extern u32 sub_81C91AC(struct UnknownSubStruct_81C81D4 *a0, const void *a1, void *a2, s32 a3); extern u32 sub_81C9160(struct UnknownSubSubStruct_81C81D4 *a0, void *a1); -extern u32 sub_81C83E0(void); extern void sub_81C8ED0(void); extern void sub_81C8EF8(struct UnknownSubSubStruct_81C81D4 *a0, struct UnknownSubSubStruct_0203CF40 *a1); -extern u32 sub_81C83F0(s32); +u32 sub_81C83F0(s32); +u32 sub_81C83E0(void); void sub_81C83AC(u32 a0, u32 a1, u32 a2, u32 a3, u32 a4, struct UnknownSubStruct_81C81D4 *a5); void sub_81C837C(struct UnknownSubSubStruct_81C81D4 *a0, struct UnknownSubStruct_81C81D4 *a1); void sub_81C835C(struct UnknownSubSubStruct_0203CF40 *a0); @@ -1597,4 +1608,51 @@ void sub_81C83AC(u32 a0, u32 a1, u32 a2, u32 a3, u32 a4, struct UnknownSubStruct a5->unk14 = a1; a5->unk10 = a4; sub_81C7078(sub_81C83F0, 5); +} + +u32 sub_81C83E0(void) +{ + return sub_81C7124(sub_81C83F0); +} + +u32 sub_81C83F0(s32 a0) +{ + struct UnknownSubStruct_81C81D4 *structPtr; + u32 v1; + + structPtr = GetSubstructPtr(0x11); + switch (a0) + { + case 0: + v1 = (structPtr->unk0.unkA + structPtr->unk0.unkC + structPtr->unk10) & 0xF; + structPtr->unk34(structPtr->unk1C, structPtr->unk48); + if (structPtr->unk38 != NULL) + // Accessing unk0.windowId as if it were a u16...? + // It's accessed as a u8 again in the very next line... + structPtr->unk38(*(u16*)(&structPtr->unk0.windowId), structPtr->unk14, v1); + + AddTextPrinterParameterized(structPtr->unk0.windowId, structPtr->unk0.unk5, structPtr->unk48, 8, (v1 << 4) | 1, 255, (void (*)(struct TextPrinterTemplate*, u16))a0); + + if (++structPtr->unk0.unkC >= structPtr->unk0.unkE) + { + if (structPtr->unk38 != NULL) + CopyWindowToVram(structPtr->unk0.windowId, 3); + else + CopyWindowToVram(structPtr->unk0.windowId, 2); + return 0; + } + else + { + structPtr->unk1C += structPtr->unk18; + structPtr->unk14++; + return 3; + } + case 1: + if (IsDma3ManagerBusyWithBgCopy()) + return 2; + else + return 4; + default: + return 4; + } } \ No newline at end of file -- cgit v1.2.3 From c03b13b855c08fd4380f4f87d148b17d0014dac9 Mon Sep 17 00:00:00 2001 From: Phlosioneer Date: Mon, 25 Feb 2019 01:02:16 -0500 Subject: Decompiled more, got one NONMATCHING --- src/pokenav.c | 157 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 154 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/pokenav.c b/src/pokenav.c index 9db9f45a6..16a67daf7 100644 --- a/src/pokenav.c +++ b/src/pokenav.c @@ -77,10 +77,10 @@ struct UnknownSubStruct_81C81D4 u32 unk14; u32 unk18; u32 unk1C; - u32 unk20; + s32 unk20; u32 unk24; u32 unk28; - u32 unk2C; + s32 unk2C; u32 unk30; void (*unk34)(u32, char*); void (*unk38)(u16, u32, u32); @@ -168,11 +168,13 @@ extern u32 sub_81D04B8(void); extern u32 sub_81D09F4(void); extern u32 sub_81CFA04(void); extern u32 sub_81CFE08(void); +extern u32 sub_81C85A0(s32); extern u32 sub_81C91AC(struct UnknownSubStruct_81C81D4 *a0, const void *a1, void *a2, s32 a3); extern u32 sub_81C9160(struct UnknownSubSubStruct_81C81D4 *a0, void *a1); extern void sub_81C8ED0(void); extern void sub_81C8EF8(struct UnknownSubSubStruct_81C81D4 *a0, struct UnknownSubSubStruct_0203CF40 *a1); +void sub_81C8568(s32 a0, struct UnknownSubStruct_81C81D4 *a1); u32 sub_81C83F0(s32); u32 sub_81C83E0(void); void sub_81C83AC(u32 a0, u32 a1, u32 a2, u32 a3, u32 a4, struct UnknownSubStruct_81C81D4 *a5); @@ -445,7 +447,7 @@ const struct CompressedSpriteSheet gUnknown_0861FA64 = extern struct UnknownStruct_0203CF40 *gUnknown_0203CF40; extern u8 gUnknown_0203CF3C; extern const struct SpriteTemplate gUnknown_0861FB04; - +extern u32 gUnknown_0203CF44; // code u32 sub_81C7078(u32 (*func)(s32), u32 priority) { @@ -1655,4 +1657,153 @@ u32 sub_81C83F0(s32 a0) default: return 4; } +} + +bool32 sub_81C84A4(void) +{ + u16 v1; + s32 v2; + struct UnknownSubStruct_81C81D4 *structPtr; + structPtr = GetSubstructPtr(0x11); + + return structPtr->unk888.unk0 != 0; +} + +bool32 sub_81C84C0(void) +{ + struct UnknownSubSubStruct_81C81D4 *subPtr; + struct UnknownSubStruct_81C81D4 *structPtr; + structPtr = GetSubstructPtr(0x11); + subPtr = &structPtr->unk888; + + return subPtr->unk0 + subPtr->unk8 < subPtr->unk2; +} + + +#ifdef NONMATCHING +// This has some register renaming issues (r4, r5, and r6 are all switched around), and +// for some reason it's creating two copies of subPtr->unk0. +void sub_81C84E8(s32 a0, s32 a1) +{ + s32 v1; + struct UnknownSubSubStruct_81C81D4 *subPtr; + struct UnknownSubStruct_81C81D4 *structPtr; + structPtr = GetSubstructPtr(0x11); + subPtr = &structPtr->unk888; + + if (a0 < 0) + { + // This is where the issue is. subPtr->unk0 is being stored in r1 and then copied to + // r2... and then r2 is read for the if statement, r1 is read for the function call, + // and then both are clobbered as expected. Between those two uses, no writes to r1/r2 + // happen; it doesn't need to be duplicated/moved at all. + if (subPtr->unk0 + a0 < 0) + v1 = -1 * subPtr->unk0; + else + v1 = a0; + if (a1 != 0) + sub_81C83AC(subPtr->unk10, subPtr->unk0 + v1, v1 * -1, subPtr->unkC, v1, structPtr); + } + else if (a1 != 0) + { + + gUnknown_0203CF44 = subPtr->unk0 + subPtr->unk8; + if ((s32)(gUnknown_0203CF44) + a0 >= (s32)subPtr->unk2) + v1 = subPtr->unk2 - gUnknown_0203CF44; + else + v1 = a0; + + sub_81C83AC(subPtr->unk10, gUnknown_0203CF44, v1, subPtr->unkC, subPtr->unk8, structPtr); + // Needed to prevent GCC from combining the two sub_81C83AC calls. + asm(""); + } + else + { + v1 = a0; + } + + sub_81C8568(v1, structPtr); + subPtr->unk0++; +} +#else +NAKED +void sub_81C84E8(s32 a0, s32 a1) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + sub sp, 0x8\n\ + adds r6, r0, 0\n\ + adds r4, r1, 0\n\ + movs r0, 0x11\n\ + bl GetSubstructPtr\n\ + adds r7, r0, 0\n\ + ldr r0, =0x00000888\n\ + adds r5, r7, r0\n\ + cmp r6, 0\n\ + bge _081C8524\n\ + ldrh r1, [r5]\n\ + adds r0, r1, r6\n\ + cmp r0, 0\n\ + bge _081C850A\n\ + negs r6, r1\n\ +_081C850A:\n\ + cmp r4, 0\n\ + beq _081C854E\n\ + ldr r0, [r5, 0x10]\n\ + adds r1, r6\n\ + negs r2, r6\n\ + ldr r3, [r5, 0xC]\n\ + str r6, [sp]\n\ + str r7, [sp, 0x4]\n\ + bl sub_81C83AC\n\ + b _081C854E\n\ + .pool\n\ +_081C8524:\n\ + cmp r4, 0\n\ + beq _081C854E\n\ + ldr r2, =gUnknown_0203CF44\n\ + ldrh r1, [r5]\n\ + ldrh r0, [r5, 0x8]\n\ + adds r4, r1, r0\n\ + str r4, [r2]\n\ + adds r0, r4, r6\n\ + ldrh r1, [r5, 0x2]\n\ + cmp r0, r1\n\ + blt _081C853C\n\ + subs r6, r1, r4\n\ +_081C853C:\n\ + ldr r0, [r5, 0x10]\n\ + ldr r3, [r5, 0xC]\n\ + ldrh r1, [r5, 0x8]\n\ + str r1, [sp]\n\ + str r7, [sp, 0x4]\n\ + adds r1, r4, 0\n\ + adds r2, r6, 0\n\ + bl sub_81C83AC\n\ +_081C854E:\n\ + adds r0, r6, 0\n\ + adds r1, r7, 0\n\ + bl sub_81C8568\n\ + ldrh r0, [r5]\n\ + adds r0, r6\n\ + strh r0, [r5]\n\ + add sp, 0x8\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .pool\n\ + .syntax divided"); +} +#endif + +void sub_81C8568(s32 a0, struct UnknownSubStruct_81C81D4 *a1) +{ + a1->unk20 = GetBgY(a1->unk0.bg); + a1->unk24 = a1->unk20 + (a0 << 12); + if (a0 > 0) + a1->unk30 = 1; + else + a1->unk30 = 2; + a1->unk2C = a0; + a1->unk28 = sub_81C7078(sub_81C85A0, 6); } \ No newline at end of file -- cgit v1.2.3 From 2e789dbbdc18f56cba62aef51156d44136b20632 Mon Sep 17 00:00:00 2001 From: Phlosioneer Date: Wed, 27 Feb 2019 02:11:45 -0500 Subject: Decompile another 7 functions --- src/pokenav.c | 231 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 226 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/pokenav.c b/src/pokenav.c index 16a67daf7..9b315dc9a 100644 --- a/src/pokenav.c +++ b/src/pokenav.c @@ -78,7 +78,7 @@ struct UnknownSubStruct_81C81D4 u32 unk18; u32 unk1C; s32 unk20; - u32 unk24; + s32 unk24; u32 unk28; s32 unk2C; u32 unk30; @@ -90,7 +90,8 @@ struct UnknownSubStruct_81C81D4 char unk48[0x40]; u8 tilemapBuffer[0x800]; struct UnknownSubSubStruct_81C81D4 unk888; - u8 unk898[0x6]; + u32 unk89C; + u32 unk8A0; }; #define SUBSTRUCT_COUNT 19 @@ -168,15 +169,17 @@ extern u32 sub_81D04B8(void); extern u32 sub_81D09F4(void); extern u32 sub_81CFA04(void); extern u32 sub_81CFE08(void); -extern u32 sub_81C85A0(s32); extern u32 sub_81C91AC(struct UnknownSubStruct_81C81D4 *a0, const void *a1, void *a2, s32 a3); extern u32 sub_81C9160(struct UnknownSubSubStruct_81C81D4 *a0, void *a1); extern void sub_81C8ED0(void); extern void sub_81C8EF8(struct UnknownSubSubStruct_81C81D4 *a0, struct UnknownSubSubStruct_0203CF40 *a1); +extern u32 sub_81C8870(s32 a0); +extern u32 sub_81C8958(s32 a0); +u32 sub_81C85A0(s32); void sub_81C8568(s32 a0, struct UnknownSubStruct_81C81D4 *a1); u32 sub_81C83F0(s32); -u32 sub_81C83E0(void); +bool32 sub_81C83E0(void); void sub_81C83AC(u32 a0, u32 a1, u32 a2, u32 a3, u32 a4, struct UnknownSubStruct_81C81D4 *a5); void sub_81C837C(struct UnknownSubSubStruct_81C81D4 *a0, struct UnknownSubStruct_81C81D4 *a1); void sub_81C835C(struct UnknownSubSubStruct_0203CF40 *a0); @@ -1612,7 +1615,7 @@ void sub_81C83AC(u32 a0, u32 a1, u32 a2, u32 a3, u32 a4, struct UnknownSubStruct sub_81C7078(sub_81C83F0, 5); } -u32 sub_81C83E0(void) +bool32 sub_81C83E0(void) { return sub_81C7124(sub_81C83F0); } @@ -1806,4 +1809,222 @@ void sub_81C8568(s32 a0, struct UnknownSubStruct_81C81D4 *a1) a1->unk30 = 2; a1->unk2C = a0; a1->unk28 = sub_81C7078(sub_81C85A0, 6); +} + +u32 sub_81C85A0(s32 a0) +{ + s32 y; + s32 v1; + bool32 flag; + struct UnknownSubStruct_81C81D4 *structPtr; + structPtr = GetSubstructPtr(0x11); + + switch (a0) + { + case 0: + if (sub_81C83E0() == FALSE) + return 1; + else + return 2; + case 1: + flag = FALSE; + y = GetBgY(structPtr->unk0.bg); + v1 = ChangeBgY(structPtr->unk0.bg, 0x1000, structPtr->unk30); + if (structPtr->unk30 == 2) + { + if ((y > structPtr->unk24 || y <= structPtr->unk20) && v1 <= structPtr->unk24) + { + flag = TRUE; + } + } + else + { + if ((y < structPtr->unk24 || y >= structPtr->unk20) && v1 >= structPtr->unk24) + { + flag = TRUE; + } + } + if (flag) + { + structPtr->unk0.unkA = (structPtr->unk0.unkA + structPtr->unk2C) & 0xF; + ChangeBgY(structPtr->unk0.bg, structPtr->unk24, 0); + return 4; + } + else + { + return 2; + } + default: + return 4; + } +} + +bool32 sub_81C8630(void) +{ + struct UnknownSubStruct_81C81D4 *structPtr; + structPtr = GetSubstructPtr(0x11); + return sub_81C70D8(structPtr->unk28); +} + +struct UnknownSubSubStruct_81C81D4 *sub_81C8644(void) +{ + struct UnknownSubStruct_81C81D4 *structPtr; + structPtr = GetSubstructPtr(0x11); + return &structPtr->unk888; +} + +u32 sub_81C8658(void) +{ + struct UnknownSubSubStruct_81C81D4 *structPtr; + structPtr = sub_81C8644(); + + // Using unk6 as a timer. + if (structPtr->unk6 != 0) + { + structPtr->unk6--; + return 1; + } + else + { + if (sub_81C84A4()) + { + sub_81C84E8(-1, 1); + return 2; + } + else + { + return 0; + } + } +} + +u32 sub_81C868C(void) +{ + struct UnknownSubSubStruct_81C81D4 *structPtr; + structPtr = sub_81C8644(); + + if (structPtr->unk0 + structPtr->unk6 < structPtr->unk2 - 1) + { + if (structPtr->unk6 < structPtr->unk8 - 1) + { + structPtr->unk6++; + return 1; + } + else if (!sub_81C84C0()) + { + return 0; + } + } + else + { + return 0; + } + sub_81C84E8(1, 1); + return 2; +} + +u32 sub_81C86CC(void) +{ + struct UnknownSubSubStruct_81C81D4 *structPtr; + s32 v1; + + structPtr = sub_81C8644(); + if (sub_81C84A4()) + { + if (structPtr->unk0 >= structPtr->unk8) + v1 = structPtr->unk8; + else + v1 = structPtr->unk0; + sub_81C84E8(v1 * -1, 1); + return 2; + } + else if (structPtr->unk6 != 0) + { + structPtr->unk6 = 0; + return 1; + } + else + { + return 0; + } +} + +u32 sub_81C870C(void) +{ + struct UnknownSubSubStruct_81C81D4 *structPtr; + structPtr = sub_81C8644(); + + if (sub_81C84C0()) + { + s32 v1; + s32 v2; + s32 v3; + v2 = structPtr->unk0 + structPtr->unk8; + v1 = structPtr->unk4 - structPtr->unk0; + if (v2 <= structPtr->unk4) + v1 = structPtr->unk8; + sub_81C84E8(v1, 1); + return 2; + } + else + { + s32 v1; + s32 v2; + if (structPtr->unk2 >= structPtr->unk8) + { + v1 = structPtr->unk6; + v2 = structPtr->unk8; + } + else + { + v1 = structPtr->unk6; + v2 = structPtr->unk2; + } + v2 -= 1; + if (v1 >= v2) + { + return 0; + } + else + { + structPtr->unk6 = v2; + return 1; + } + } +} + +u32 sub_81C875C(void) +{ + struct UnknownSubSubStruct_81C81D4 *structPtr; + structPtr = sub_81C8644(); + + return structPtr->unk0 + structPtr->unk6; +} + +u32 sub_81C8770(void) +{ + struct UnknownSubSubStruct_81C81D4 *structPtr; + structPtr = sub_81C8644(); + + return structPtr->unk0; +} + +void sub_81C877C(void) +{ + struct UnknownSubStruct_81C81D4 *structPtr; + structPtr = GetSubstructPtr(0x11); + structPtr->unk89C = 0; + structPtr->unk8A0 = sub_81C7078(sub_81C8870, 6); +} + +void sub_81C87AC(u16 a0) +{ + u16 temp; + struct UnknownSubStruct_81C81D4 *structPtr; + structPtr = GetSubstructPtr(0x11); + temp = structPtr->unk888.unk0; + temp += a0; + structPtr->unk888.unk0 = temp; + structPtr->unk89C = 0; + structPtr->unk8A0 = sub_81C7078(sub_81C8958, 6); } \ No newline at end of file -- cgit v1.2.3 From a71c563b10d6c3d200218f76688eeb45717296bc Mon Sep 17 00:00:00 2001 From: Phlosioneer Date: Fri, 15 Mar 2019 02:33:55 -0400 Subject: A few more functions decompiled --- src/pokenav.c | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 87 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/pokenav.c b/src/pokenav.c index 1912e7e57..6e7049ddf 100644 --- a/src/pokenav.c +++ b/src/pokenav.c @@ -36,8 +36,7 @@ struct UnknownSubSubStruct_0203CF40 { u8 unk4; u8 unk5; u16 unk6; - u8 windowId; - u8 unk9; + u16 windowId; u16 unkA; u16 unkC; u16 unkE; @@ -173,18 +172,21 @@ extern u32 sub_81C91AC(struct UnknownSubStruct_81C81D4 *a0, const void *a1, void extern u32 sub_81C9160(struct UnknownSubSubStruct_81C81D4 *a0, void *a1); extern void sub_81C8ED0(void); extern void sub_81C8EF8(struct UnknownSubSubStruct_81C81D4 *a0, struct UnknownSubSubStruct_0203CF40 *a1); -extern u32 sub_81C8870(s32 a0); extern u32 sub_81C8958(s32 a0); +extern u32 sub_81C8A28(s32 a0); +extern void sub_81C8B70(struct UnknownSubSubStruct_0203CF40 *a0, u32 a1, u32 a2); +extern void sub_81C9008(struct UnknownSubStruct_81C81D4 *a0, u32 a1); -u32 sub_81C85A0(s32); +u32 sub_81C8870(s32 a0); +u32 sub_81C85A0(s32 a0); void sub_81C8568(s32 a0, struct UnknownSubStruct_81C81D4 *a1); -u32 sub_81C83F0(s32); +u32 sub_81C83F0(s32 a0); bool32 sub_81C83E0(void); void sub_81C83AC(u32 a0, u32 a1, u32 a2, u32 a3, u32 a4, struct UnknownSubStruct_81C81D4 *a5); void sub_81C837C(struct UnknownSubSubStruct_81C81D4 *a0, struct UnknownSubStruct_81C81D4 *a1); void sub_81C835C(struct UnknownSubSubStruct_0203CF40 *a0); void sub_81C82E4(struct UnknownSubStruct_81C81D4 *a0); -u32 sub_81C8254(s32); +u32 sub_81C8254(s32 a0); u32 sub_81C791C(s32 a0); bool32 sub_81C756C(u32 a0); bool32 sub_81C76C4(void); @@ -2027,4 +2029,83 @@ void sub_81C87AC(u16 a0) structPtr->unk888.unk0 = temp; structPtr->unk89C = 0; structPtr->unk8A0 = sub_81C7078(sub_81C8958, 6); +} + +void sub_81C87F0(void) +{ + struct UnknownSubStruct_81C81D4 *structPtr; + structPtr = GetSubstructPtr(0x11); + structPtr->unk89C = 0; + structPtr->unk8A0 = sub_81C7078(sub_81C8A28, 6); +} + +bool32 sub_81C8820(void) +{ + struct UnknownSubStruct_81C81D4 *structPtr; + structPtr = GetSubstructPtr(0x11); + return sub_81C70D8(structPtr->unk8A0); +} + +void sub_81C8838(void) +{ + struct UnknownSubStruct_81C81D4 *structPtr; + struct UnknownSubSubStruct_81C81D4 *subStr; + structPtr = GetSubstructPtr(0x11); + subStr = &structPtr->unk888; + structPtr->unk38(structPtr->unk0.windowId, subStr->unk0 + subStr->unk6, (structPtr->unk0.unkA + subStr->unk6) & 0xF); + CopyWindowToVram(structPtr->unk0.windowId, 1); +} + +u32 sub_81C8870(s32 a0) +{ + struct UnknownSubStruct_81C81D4 *structPtr; + u16 v1; + u32 v2; + + // Needed to fix a register renaming issue. + register u16* temp asm("r1"); + structPtr = GetSubstructPtr(0x11); + + switch (a0) + { + case 0: + sub_81C9008(structPtr, 1); + // fall-through + case 1: + if (structPtr->unk89C != structPtr->unk888.unk6) + sub_81C8B70(&structPtr->unk0, structPtr->unk89C, 1); + + structPtr->unk89C++; + return 0; + case 2: + if (IsDma3ManagerBusyWithBgCopy()) + return 2; + + if (structPtr->unk89C != structPtr->unk888.unk8) + return 6; + + if (structPtr->unk888.unk6 != 0) + sub_81C8B70(&structPtr->unk0, structPtr->unk89C, structPtr->unk888.unk6); + + return 0; + case 3: + if (IsDma3ManagerBusyWithBgCopy()) + return 2; + temp = &structPtr->unk888.unk6; + v1 = *temp; + if (v1 == 0) + return 4; + + sub_81C84E8(v1, 0); + return 0; + case 4: + v2 = sub_81C8630(); + if (v2) + return 2; + + structPtr->unk888.unk6 = v2; + return 4; + default: + return 4; + } } \ No newline at end of file -- cgit v1.2.3 From 8cea949e6d7991d4101b58941a82c7f87538a847 Mon Sep 17 00:00:00 2001 From: Phlosioneer Date: Fri, 15 Mar 2019 19:33:30 -0400 Subject: Move constant and EWRAM data into C. --- src/pokenav.c | 232 +++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 198 insertions(+), 34 deletions(-) (limited to 'src') diff --git a/src/pokenav.c b/src/pokenav.c index 6e7049ddf..5796eecd4 100644 --- a/src/pokenav.c +++ b/src/pokenav.c @@ -105,6 +105,13 @@ struct UnknownStruct_0203CF40 void *field10[SUBSTRUCT_COUNT]; }; +// Needed to match u32/u16 tag field difference. +struct CompressedSpritePalette_ +{ + const u32 *data; // LZ77 compressed palette data + u32 tag; +}; + extern u32 sub_81C9430(void); extern void sub_81CAADC(void); extern u32 sub_81C99D4(void); @@ -176,6 +183,7 @@ extern u32 sub_81C8958(s32 a0); extern u32 sub_81C8A28(s32 a0); extern void sub_81C8B70(struct UnknownSubSubStruct_0203CF40 *a0, u32 a1, u32 a2); extern void sub_81C9008(struct UnknownSubStruct_81C81D4 *a0, u32 a1); +extern void sub_81C7CB4(struct Sprite* sprite); u32 sub_81C8870(s32 a0); u32 sub_81C85A0(s32 a0); @@ -425,7 +433,7 @@ const u8 gMenuButtonReminderColor[4] = 4, 1, 2, 0 }; -const struct CompressedSpriteSheet gUnknown_0861FA4C[] = +static const struct CompressedSpriteSheet sUnknown_0861FA4C[] = { { .data = gUnknown_0861F5B0, @@ -434,25 +442,194 @@ const struct CompressedSpriteSheet gUnknown_0861FA4C[] = } }; -const struct SpritePalette gUnknown_0861FA54[2] = +static const struct SpritePalette sUnknown_0861FA54[] = { { .data = gUnknown_0861F590, .tag = 0, }, + {} }; -const struct CompressedSpriteSheet gUnknown_0861FA64 = +static const struct CompressedSpriteSheet sUnknown_0861FA64 = { .data = gPokenavLeftHeaderHoennMap_Gfx, .size = 0xC00, .tag = 2 }; -extern struct UnknownStruct_0203CF40 *gUnknown_0203CF40; -extern u8 gUnknown_0203CF3C; -extern const struct SpriteTemplate gUnknown_0861FB04; -extern u32 gUnknown_0203CF44; +static const struct CompressedSpriteSheet sUnknown_0861FA6C[] = +{ + { + .data = gPokenavLeftHeaderMainMenu_Gfx, + .size = 0x20, + .tag = 3 + }, + { + .data = gPokenavLeftHeaderCondition_Gfx, + .size = 0x20, + .tag = 1 + }, + { + .data = gPokenavLeftHeaderRibbons_Gfx, + .size = 0x20, + .tag = 2 + }, + { + .data = gPokenavLeftHeaderMatchCall_Gfx, + .size = 0x20, + .tag = 4 + }, + { + .data = gPokenavLeftHeaderHoennMap_Gfx, + .size = 0x20, + .tag = 0 + }, + { + .data = gPokenavLeftHeaderHoennMap_Gfx, + .size = 0x40, + .tag = 0 + } +}; + +static const struct CompressedSpritePalette_ sUnknown_0861FA9C[] = +{ + { + .data = gPokenavLeftHeaderParty_Gfx, + .tag = 1 + }, + { + .data = gPokenavLeftHeaderSearch_Gfx, + .tag = 1 + }, + { + .data = gPokenavLeftHeaderCool_Gfx, + .tag = 4 + }, + { + .data = gPokenavLeftHeaderBeauty_Gfx, + .tag = 1 + }, + { + .data = gPokenavLeftHeaderCute_Gfx, + .tag = 2 + }, + { + .data = gPokenavLeftHeaderSmart_Gfx, + .tag = 0 + }, + { + .data = gPokenavLeftHeaderTough_Gfx, + .tag = 0 + } +}; + +static const struct OamData sUnknown_0861FAD4 = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, // FIXME: Use SPRITE_SHAPE + .x = 0, + .matrixNum = 0, + .size = 2, // FIXME: Use SPRITE_SIZE + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0 +}; + +static const union AnimCmd sUnknown_0861FADC[] = +{ + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(16, 8), + ANIMCMD_FRAME(32, 8), + ANIMCMD_FRAME(48, 8), + ANIMCMD_FRAME(64, 8), + ANIMCMD_FRAME(80, 8), + ANIMCMD_FRAME(96, 8), + ANIMCMD_FRAME(112, 8), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd *const sUnknown_0861FB00[] = +{ + sUnknown_0861FADC +}; + +static const struct SpriteTemplate sUnknown_0861FB04 = +{ + .tileTag = 0, + .paletteTag = 0, + .oam = &sUnknown_0861FAD4, + .anims = sUnknown_0861FB00, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_81C7CB4 +}; + +static const struct OamData sUnknown_0861FB1C = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 1, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0 +}; + +static const struct OamData sUnknown_0861FB24 = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 1, + .x = 0, + .matrixNum = 0, + .size = 2, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0 +}; + +static const struct SpriteTemplate sUnknown_0861FB2C = +{ + .tileTag = 2, + .paletteTag = 1, + .oam = &sUnknown_0861FB1C, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy +}; + +static const struct SpriteTemplate sUnknown_0861FB44 = +{ + .tileTag = 2, + .paletteTag = 2, + .oam = &sUnknown_0861FB24, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy +}; + +EWRAM_DATA u8 gUnknown_0203CF3C = 0; +EWRAM_DATA struct UnknownStruct_0203CF40 *gUnknown_0203CF40 = NULL; +EWRAM_DATA u32 gUnknown_0203CF44 = 0; + // code u32 sub_81C7078(u32 (*func)(s32), u32 priority) { @@ -1220,12 +1397,12 @@ void sub_81C7C28(void) u8 spriteId; struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0); - for (i = 0; i < ARRAY_COUNT(gUnknown_0861FA4C); i++) - LoadCompressedSpriteSheet(&gUnknown_0861FA4C[i]); + for (i = 0; i < ARRAY_COUNT(sUnknown_0861FA4C); i++) + LoadCompressedSpriteSheet(&sUnknown_0861FA4C[i]); - sub_81C795C(gUnknown_0861FA54); + sub_81C795C(sUnknown_0861FA54); structPtr->unk14 = ~1 & ~(0x10000 << IndexOfSpritePaletteTag(0)); - spriteId = CreateSprite(&gUnknown_0861FB04, 220, 12, 0); + spriteId = CreateSprite(&sUnknown_0861FB04, 220, 12, 0); structPtr->unk18 = &gSprites[spriteId]; } @@ -1263,26 +1440,22 @@ void sub_81C7CE4(void) structPtr->unk18->subpriority = 0; } -extern const struct SpriteTemplate gUnknown_0861FB2C; -extern const struct SpriteTemplate gUnknown_0861FB44; -extern const struct CompressedSpriteSheet gUnknown_0861FA6C[]; - void sub_81C7D28(void) { s32 i, spriteId; struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0); - LoadCompressedSpriteSheet(&gUnknown_0861FA64); + LoadCompressedSpriteSheet(&sUnknown_0861FA64); AllocSpritePalette(1); AllocSpritePalette(2); for (i = 0; i < 2; i++) { - spriteId = CreateSprite(&gUnknown_0861FB2C, 0, 0, 1); + spriteId = CreateSprite(&sUnknown_0861FB2C, 0, 0, 1); structPtr->unk1C[i] = &gSprites[spriteId]; structPtr->unk1C[i]->invisible = TRUE; structPtr->unk1C[i]->pos2.x = i * 64; - spriteId = CreateSprite(&gUnknown_0861FB44, 0, 0, 2); + spriteId = CreateSprite(&sUnknown_0861FB44, 0, 0, 2); structPtr->unk24[i] = &gSprites[spriteId]; structPtr->unk24[i]->invisible = TRUE; structPtr->unk24[i]->pos2.x = i * 32; @@ -1318,12 +1491,12 @@ void sub_81C7E58(u32 arg0) return; structPtr = GetSubstructPtr(0); - tag = gUnknown_0861FA6C[arg0].tag; - size = GetDecompressedDataSize(gUnknown_0861FA6C[arg0].data); + tag = sUnknown_0861FA6C[arg0].tag; + size = GetDecompressedDataSize(sUnknown_0861FA6C[arg0].data); LoadPalette(&gPokenavLeftHeader_Pal[tag * 16], (IndexOfSpritePaletteTag(1) * 16) + 0x100, 0x20); - LZ77UnCompWram(gUnknown_0861FA6C[arg0].data, gDecompressionBuffer); + LZ77UnCompWram(sUnknown_0861FA6C[arg0].data, gDecompressionBuffer); RequestDma3Copy(gDecompressionBuffer, (void *)VRAM + 0x10000 + (GetSpriteTileStartByTag(2) * 32), size, 1); - structPtr->unk1C[1]->oam.tileNum = GetSpriteTileStartByTag(2) + gUnknown_0861FA6C[arg0].size; + structPtr->unk1C[1]->oam.tileNum = GetSpriteTileStartByTag(2) + sUnknown_0861FA6C[arg0].size; if (arg0 == 4 || arg0 == 5) structPtr->unk1C[1]->pos2.x = 56; @@ -1331,15 +1504,6 @@ void sub_81C7E58(u32 arg0) structPtr->unk1C[1]->pos2.x = 64; } -// Needed to match u32/u16 tag field difference. -struct CompressedSpritePalette_ -{ - const u32 *data; // LZ77 compressed palette data - u32 tag; -}; - -extern const struct CompressedSpritePalette_ gUnknown_0861FA9C[]; - void sub_81C7F24(u32 arg0) { u32 size, tag; @@ -1347,10 +1511,10 @@ void sub_81C7F24(u32 arg0) if (arg0 >= 7) return; - tag = gUnknown_0861FA9C[arg0].tag; - size = GetDecompressedDataSize(gUnknown_0861FA9C[arg0].data); + tag = sUnknown_0861FA9C[arg0].tag; + size = GetDecompressedDataSize(sUnknown_0861FA9C[arg0].data); LoadPalette(&gPokenavLeftHeader_Pal[tag * 16], (IndexOfSpritePaletteTag(2) * 16) + 0x100, 0x20); - LZ77UnCompWram(gUnknown_0861FA9C[arg0].data, &gDecompressionBuffer[0x1000]); + LZ77UnCompWram(sUnknown_0861FA9C[arg0].data, &gDecompressionBuffer[0x1000]); RequestDma3Copy(&gDecompressionBuffer[0x1000], (void *)VRAM + 0x10800 + (GetSpriteTileStartByTag(2) * 32), size, 1); } -- cgit v1.2.3 From bdc6ed1a985e17a25d4f551514f55ed9cf48ecab Mon Sep 17 00:00:00 2001 From: Phlosioneer Date: Sat, 16 Mar 2019 00:34:11 -0400 Subject: Decompiled two difficult functions Had do use a lot of `asm` directives for sub_81C8A28 to match. --- src/pokenav.c | 140 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 136 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/pokenav.c b/src/pokenav.c index 5796eecd4..7b9a6393a 100644 --- a/src/pokenav.c +++ b/src/pokenav.c @@ -179,12 +179,16 @@ extern u32 sub_81C91AC(struct UnknownSubStruct_81C81D4 *a0, const void *a1, void extern u32 sub_81C9160(struct UnknownSubSubStruct_81C81D4 *a0, void *a1); extern void sub_81C8ED0(void); extern void sub_81C8EF8(struct UnknownSubSubStruct_81C81D4 *a0, struct UnknownSubSubStruct_0203CF40 *a1); -extern u32 sub_81C8958(s32 a0); -extern u32 sub_81C8A28(s32 a0); extern void sub_81C8B70(struct UnknownSubSubStruct_0203CF40 *a0, u32 a1, u32 a2); -extern void sub_81C9008(struct UnknownSubStruct_81C81D4 *a0, u32 a1); +extern void sub_81C9008(struct UnknownSubSubStruct_0203CF40 *a0, u32 a1); extern void sub_81C7CB4(struct Sprite* sprite); +extern void sub_81C8CB4(struct UnknownSubSubStruct_81C81D4 *a0, struct UnknownSubSubStruct_0203CF40 *a1); +extern void sub_81C8DBC(struct UnknownSubSubStruct_0203CF40 *a0, u32 a1); +extern void sub_81C8E54(struct UnknownSubSubStruct_81C81D4 *a0, struct UnknownSubSubStruct_0203CF40 *a1, u32 a2); +extern void sub_81C8D4C(struct UnknownSubSubStruct_81C81D4 *a0, struct UnknownSubSubStruct_0203CF40 *a1); +u32 sub_81C8A28(s32 a0); +u32 sub_81C8958(s32 a0); u32 sub_81C8870(s32 a0); u32 sub_81C85A0(s32 a0); void sub_81C8568(s32 a0, struct UnknownSubStruct_81C81D4 *a1); @@ -2233,7 +2237,7 @@ u32 sub_81C8870(s32 a0) switch (a0) { case 0: - sub_81C9008(structPtr, 1); + sub_81C9008(&structPtr->unk0, 1); // fall-through case 1: if (structPtr->unk89C != structPtr->unk888.unk6) @@ -2272,4 +2276,132 @@ u32 sub_81C8870(s32 a0) default: return 4; } +} + +u32 sub_81C8958(s32 a0) +{ + struct UnknownSubStruct_81C81D4 *structPtr; + structPtr = GetSubstructPtr(0x11); + if (IsDma3ManagerBusyWithBgCopy()) + return 2; + + switch (a0) + { + case 0: + sub_81C8CB4(&structPtr->unk888, &structPtr->unk0); + break; + case 1: + sub_81C8DBC(&structPtr->unk0, 0); + break; + case 2: + sub_81C8E54(&structPtr->unk888, &structPtr->unk0, 0); + break; + case 3: + sub_81C8DBC(&structPtr->unk0, 1); + break; + case 4: + sub_81C8E54(&structPtr->unk888, &structPtr->unk0, 1); + break; + case 5: + sub_81C8DBC(&structPtr->unk0, 2); + break; + case 6: + sub_81C8E54(&structPtr->unk888, &structPtr->unk0, 2); + break; + case 7: + sub_81C8E54(&structPtr->unk888, &structPtr->unk0, 3); + break; + default: + return 4; + } + return 0; +} + +u32 sub_81C8A28(s32 a0) +{ + struct UnknownSubStruct_81C81D4 *structPtr; + struct UnknownSubSubStruct_81C81D4 *subPtr888; + register struct UnknownSubSubStruct_0203CF40 *subPtr0 asm("r2"); + s32 v4; + + if (IsDma3ManagerBusyWithBgCopy()) + { + return 2; + } + + structPtr = GetSubstructPtr(0x11); + subPtr888 = &structPtr->unk888; + subPtr0 = &structPtr->unk0; + + switch (a0) + { + default: + return 4; + case 0: + sub_81C8D4C(subPtr888, subPtr0); + return 0; + case 1: + { + s32 v1; + s32 v2; + u32 *v3; + register s32 v4 asm("r5"); + + v3 = &structPtr->unk89C; + v1 = *v3 + 1; + *v3 = v1; + if (v1 < structPtr->unk888.unk8) + { + sub_81C8B70(subPtr0, v1, 1); + return 2; + } + + *v3 = 0; + if (subPtr888->unk2 <= subPtr888->unk8) + { + register u32 temp asm("r0"); + temp = subPtr888->unk0; + if (temp == 0) + return 9; + v2 = temp; + } + else + { + register s32 temp asm("r1"); + v2 = subPtr888->unk0 + subPtr888->unk8; + temp = (s32)subPtr888->unk2; + if (v2 <= temp) + return 9; + v2 -= temp; + } + v4 = v2 * -1; + sub_81C8B70(subPtr0, v4, v2); + subPtr888->unk6 = v2; + *v3 = v4; + return 0; + } + case 2: + sub_81C84E8(structPtr->unk89C, 0); + return 0; + case 3: + if (sub_81C8630()) + return 2; + + structPtr->unk89C = 0; + return 1; + case 4: + sub_81C83AC(subPtr888->unk10, subPtr888->unk0 + structPtr->unk89C, 1, subPtr888->unkC, structPtr->unk89C, structPtr); + return 0; + case 5: + if (sub_81C83E0()) + return 2; + + v4 = ++structPtr->unk89C; + if (v4 >= subPtr888->unk2 || v4 >= subPtr888->unk8) + return 1; + return 9; + case 6: + sub_81C9008(subPtr0, 0); + return 4; + } } \ No newline at end of file -- cgit v1.2.3 From f4737874ef2308607cef97f61e8ae0a1ae05bdd8 Mon Sep 17 00:00:00 2001 From: Phlosioneer Date: Sat, 16 Mar 2019 22:10:07 -0400 Subject: Made a new substruct for the substruct We must go deeper. --- src/pokenav.c | 185 ++++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 142 insertions(+), 43 deletions(-) (limited to 'src') diff --git a/src/pokenav.c b/src/pokenav.c index 7b9a6393a..3986cb51c 100644 --- a/src/pokenav.c +++ b/src/pokenav.c @@ -68,8 +68,7 @@ struct UnknownSubStruct_0203CF40 u8 tilemapBuffer[0x800]; }; -// Generally at index 0x11 (17) -struct UnknownSubStruct_81C81D4 +struct UnknownInnerStruct_81C81D4 { struct UnknownSubSubStruct_0203CF40 unk0; u32 unk10; @@ -87,6 +86,12 @@ struct UnknownSubStruct_81C81D4 u32 unk40; u32 unk44; char unk48[0x40]; +}; + +// Generally at index 0x11 (17) +struct UnknownSubStruct_81C81D4 +{ + struct UnknownInnerStruct_81C81D4 unk0; u8 tilemapBuffer[0x800]; struct UnknownSubSubStruct_81C81D4 unk888; u32 unk89C; @@ -178,24 +183,25 @@ extern u32 sub_81CFE08(void); extern u32 sub_81C91AC(struct UnknownSubStruct_81C81D4 *a0, const void *a1, void *a2, s32 a3); extern u32 sub_81C9160(struct UnknownSubSubStruct_81C81D4 *a0, void *a1); extern void sub_81C8ED0(void); -extern void sub_81C8EF8(struct UnknownSubSubStruct_81C81D4 *a0, struct UnknownSubSubStruct_0203CF40 *a1); -extern void sub_81C8B70(struct UnknownSubSubStruct_0203CF40 *a0, u32 a1, u32 a2); -extern void sub_81C9008(struct UnknownSubSubStruct_0203CF40 *a0, u32 a1); extern void sub_81C7CB4(struct Sprite* sprite); -extern void sub_81C8CB4(struct UnknownSubSubStruct_81C81D4 *a0, struct UnknownSubSubStruct_0203CF40 *a1); -extern void sub_81C8DBC(struct UnknownSubSubStruct_0203CF40 *a0, u32 a1); -extern void sub_81C8E54(struct UnknownSubSubStruct_81C81D4 *a0, struct UnknownSubSubStruct_0203CF40 *a1, u32 a2); -extern void sub_81C8D4C(struct UnknownSubSubStruct_81C81D4 *a0, struct UnknownSubSubStruct_0203CF40 *a1); - +extern void sub_81CBD48(u16 windowId, u32 a1); +extern void sub_81C8EF8(struct UnknownSubSubStruct_81C81D4 *a0, struct UnknownInnerStruct_81C81D4 *a1); +extern void sub_81C9008(struct UnknownInnerStruct_81C81D4 *a0, u32 a1); +extern void sub_81C8DBC(struct UnknownInnerStruct_81C81D4 *a0, u32 a1); +extern void sub_81C8E54(struct UnknownSubSubStruct_81C81D4 *a0, struct UnknownInnerStruct_81C81D4 *a1, u32 a2); + +void sub_81C8D4C(struct UnknownSubSubStruct_81C81D4 *a0, struct UnknownInnerStruct_81C81D4 *a1); +void sub_81C8CB4(struct UnknownSubSubStruct_81C81D4 *a0, struct UnknownInnerStruct_81C81D4 *a1); +void sub_81C8B70(struct UnknownSubSubStruct_0203CF40 *a0, u32 a1, u32 a2); u32 sub_81C8A28(s32 a0); u32 sub_81C8958(s32 a0); u32 sub_81C8870(s32 a0); u32 sub_81C85A0(s32 a0); -void sub_81C8568(s32 a0, struct UnknownSubStruct_81C81D4 *a1); +void sub_81C8568(s32 a0, struct UnknownInnerStruct_81C81D4 *a1); u32 sub_81C83F0(s32 a0); bool32 sub_81C83E0(void); -void sub_81C83AC(u32 a0, u32 a1, u32 a2, u32 a3, u32 a4, struct UnknownSubStruct_81C81D4 *a5); -void sub_81C837C(struct UnknownSubSubStruct_81C81D4 *a0, struct UnknownSubStruct_81C81D4 *a1); +void sub_81C83AC(u32 a0, u32 a1, u32 a2, u32 a3, u32 a4, struct UnknownInnerStruct_81C81D4 *a5); +void sub_81C837C(struct UnknownSubSubStruct_81C81D4 *a0, struct UnknownInnerStruct_81C81D4 *a1); void sub_81C835C(struct UnknownSubSubStruct_0203CF40 *a0); void sub_81C82E4(struct UnknownSubStruct_81C81D4 *a0); u32 sub_81C8254(s32 a0); @@ -634,6 +640,8 @@ EWRAM_DATA u8 gUnknown_0203CF3C = 0; EWRAM_DATA struct UnknownStruct_0203CF40 *gUnknown_0203CF40 = NULL; EWRAM_DATA u32 gUnknown_0203CF44 = 0; +extern const u8 gUnknown_0861FBE4[3]; + // code u32 sub_81C7078(u32 (*func)(s32), u32 priority) { @@ -1693,7 +1701,7 @@ void sub_81C8234(void) structPtr = GetSubstructPtr(0x11); sub_81C8FE0(); - RemoveWindow(structPtr->unk0.windowId); + RemoveWindow(structPtr->unk0.unk0.windowId); FreeSubstruct(0x11); } @@ -1712,10 +1720,10 @@ u32 sub_81C8254(s32 a0) sub_81C82E4(structPtr); return 0; case 1: - sub_81C835C(&structPtr->unk0); + sub_81C835C(&structPtr->unk0.unk0); return 0; case 2: - sub_81C837C(&structPtr->unk888, structPtr); + sub_81C837C(&structPtr->unk888, &structPtr->unk0); return 0; case 3: if (sub_81C83E0()) @@ -1737,28 +1745,27 @@ u32 sub_81C8254(s32 a0) void sub_81C82E4(struct UnknownSubStruct_81C81D4 *a0) { - u16 v1 = (a0->unk0.unk1 << 12) | a0->unk0.unk6; + u16 v1 = (a0->unk0.unk0.unk1 << 12) | a0->unk0.unk0.unk6; // TODO: When #553 is merged, use a PALETTE_NUM_TO_FILL_VALUE(1) macro here... - sub_8199DF0(a0->unk0.bg, 0x11, a0->unk0.unk6, 1); + sub_8199DF0(a0->unk0.unk0.bg, 0x11, a0->unk0.unk0.unk6, 1); // ...and PALETTE_NUM_TO_FILL_VALUE(4) here. - sub_8199DF0(a0->unk0.bg, 0x44, a0->unk0.unk6 + 1, 1); - SetBgTilemapBuffer(a0->unk0.bg, a0->tilemapBuffer); - FillBgTilemapBufferRect_Palette0(a0->unk0.bg, v1, 0, 0, 32, 32); - ChangeBgY(a0->unk0.bg, 0, 0); - ChangeBgX(a0->unk0.bg, 0, 0); - ChangeBgY(a0->unk0.bg, a0->unk0.unk3 << 11, 2); - CopyBgTilemapBufferToVram(a0->unk0.bg); + sub_8199DF0(a0->unk0.unk0.bg, 0x44, a0->unk0.unk0.unk6 + 1, 1); + SetBgTilemapBuffer(a0->unk0.unk0.bg, a0->tilemapBuffer); + FillBgTilemapBufferRect_Palette0(a0->unk0.unk0.bg, v1, 0, 0, 32, 32); + ChangeBgY(a0->unk0.unk0.bg, 0, 0); + ChangeBgX(a0->unk0.unk0.bg, 0, 0); + ChangeBgY(a0->unk0.unk0.bg, a0->unk0.unk0.unk3 << 11, 2); + CopyBgTilemapBufferToVram(a0->unk0.unk0.bg); } void sub_81C835C(struct UnknownSubSubStruct_0203CF40 *a0) { - // TODO: When #553 is merged, use a PALETTE_NUM_TO_FILL_VALUE(1) macro here. - FillWindowPixelBuffer(a0->windowId, 0x11); + FillWindowPixelBuffer(a0->windowId, PIXEL_FILL(1)); PutWindowTilemap(a0->windowId); CopyWindowToVram(a0->windowId, 1); } -void sub_81C837C(struct UnknownSubSubStruct_81C81D4 *a0, struct UnknownSubStruct_81C81D4 *a1) +void sub_81C837C(struct UnknownSubSubStruct_81C81D4 *a0, struct UnknownInnerStruct_81C81D4 *a1) { s32 v1; s32 v2; @@ -1771,7 +1778,7 @@ void sub_81C837C(struct UnknownSubSubStruct_81C81D4 *a0, struct UnknownSubStruct sub_81C83AC(a0->unk10, a0->unk0, v1, a0->unkC, 0, a1); } -void sub_81C83AC(u32 a0, u32 a1, u32 a2, u32 a3, u32 a4, struct UnknownSubStruct_81C81D4 *a5) +void sub_81C83AC(u32 a0, u32 a1, u32 a2, u32 a3, u32 a4, struct UnknownInnerStruct_81C81D4 *a5) { if (a2 == 0) return; @@ -1792,10 +1799,10 @@ bool32 sub_81C83E0(void) u32 sub_81C83F0(s32 a0) { - struct UnknownSubStruct_81C81D4 *structPtr; + struct UnknownInnerStruct_81C81D4 *structPtr; u32 v1; - structPtr = GetSubstructPtr(0x11); + structPtr = &((struct UnknownSubStruct_81C81D4*)GetSubstructPtr(0x11))->unk0; switch (a0) { case 0: @@ -1856,6 +1863,7 @@ bool32 sub_81C84C0(void) #ifdef NONMATCHING // This has some register renaming issues (r4, r5, and r6 are all switched around), and // for some reason it's creating two copies of subPtr->unk0. +// TODO: Now I know why it's making two copies - one of them is UnknownInnerStruct_81C81D4. void sub_81C84E8(s32 a0, s32 a1) { s32 v1; @@ -1969,7 +1977,7 @@ _081C854E:\n\ } #endif -void sub_81C8568(s32 a0, struct UnknownSubStruct_81C81D4 *a1) +void sub_81C8568(s32 a0, struct UnknownInnerStruct_81C81D4 *a1) { a1->unk20 = GetBgY(a1->unk0.bg); a1->unk24 = a1->unk20 + (a0 << 12); @@ -1986,8 +1994,8 @@ u32 sub_81C85A0(s32 a0) s32 y; s32 v1; bool32 flag; - struct UnknownSubStruct_81C81D4 *structPtr; - structPtr = GetSubstructPtr(0x11); + struct UnknownInnerStruct_81C81D4 *structPtr; + structPtr = &((struct UnknownSubStruct_81C81D4 *)GetSubstructPtr(0x11))->unk0; switch (a0) { @@ -2033,7 +2041,7 @@ bool32 sub_81C8630(void) { struct UnknownSubStruct_81C81D4 *structPtr; structPtr = GetSubstructPtr(0x11); - return sub_81C70D8(structPtr->unk28); + return sub_81C70D8(structPtr->unk0.unk28); } struct UnknownSubSubStruct_81C81D4 *sub_81C8644(void) @@ -2220,8 +2228,8 @@ void sub_81C8838(void) struct UnknownSubSubStruct_81C81D4 *subStr; structPtr = GetSubstructPtr(0x11); subStr = &structPtr->unk888; - structPtr->unk38(structPtr->unk0.windowId, subStr->unk0 + subStr->unk6, (structPtr->unk0.unkA + subStr->unk6) & 0xF); - CopyWindowToVram(structPtr->unk0.windowId, 1); + structPtr->unk0.unk38(structPtr->unk0.unk0.windowId, subStr->unk0 + subStr->unk6, (structPtr->unk0.unk0.unkA + subStr->unk6) & 0xF); + CopyWindowToVram(structPtr->unk0.unk0.windowId, 1); } u32 sub_81C8870(s32 a0) @@ -2241,7 +2249,7 @@ u32 sub_81C8870(s32 a0) // fall-through case 1: if (structPtr->unk89C != structPtr->unk888.unk6) - sub_81C8B70(&structPtr->unk0, structPtr->unk89C, 1); + sub_81C8B70(&structPtr->unk0.unk0, structPtr->unk89C, 1); structPtr->unk89C++; return 0; @@ -2253,7 +2261,7 @@ u32 sub_81C8870(s32 a0) return 6; if (structPtr->unk888.unk6 != 0) - sub_81C8B70(&structPtr->unk0, structPtr->unk89C, structPtr->unk888.unk6); + sub_81C8B70(&structPtr->unk0.unk0, structPtr->unk89C, structPtr->unk888.unk6); return 0; case 3: @@ -2321,7 +2329,7 @@ u32 sub_81C8A28(s32 a0) { struct UnknownSubStruct_81C81D4 *structPtr; struct UnknownSubSubStruct_81C81D4 *subPtr888; - register struct UnknownSubSubStruct_0203CF40 *subPtr0 asm("r2"); + register struct UnknownInnerStruct_81C81D4 *subPtr0 asm("r2"); s32 v4; if (IsDma3ManagerBusyWithBgCopy()) @@ -2352,7 +2360,7 @@ u32 sub_81C8A28(s32 a0) *v3 = v1; if (v1 < structPtr->unk888.unk8) { - sub_81C8B70(subPtr0, v1, 1); + sub_81C8B70(&subPtr0->unk0, v1, 1); return 2; } @@ -2375,7 +2383,7 @@ u32 sub_81C8A28(s32 a0) v2 -= temp; } v4 = v2 * -1; - sub_81C8B70(subPtr0, v4, v2); + sub_81C8B70(&subPtr0->unk0, v4, v2); subPtr888->unk6 = v2; *v3 = v4; return 0; @@ -2390,7 +2398,7 @@ u32 sub_81C8A28(s32 a0) structPtr->unk89C = 0; return 1; case 4: - sub_81C83AC(subPtr888->unk10, subPtr888->unk0 + structPtr->unk89C, 1, subPtr888->unkC, structPtr->unk89C, structPtr); + sub_81C83AC(subPtr888->unk10, subPtr888->unk0 + structPtr->unk89C, 1, subPtr888->unkC, structPtr->unk89C, &structPtr->unk0); return 0; case 5: if (sub_81C83E0()) @@ -2404,4 +2412,95 @@ u32 sub_81C8A28(s32 a0) sub_81C9008(subPtr0, 0); return 4; } +} + +void sub_81C8B70(struct UnknownSubSubStruct_0203CF40 *a0, u32 a1, u32 a2) +{ + u8 *v1; + u32 v2; + + v1 = (u8*)GetWindowAttribute(a0->windowId, WINDOW_TILE_DATA); + v2 = a0->unk4 * 64; + + a1 = (a0->unkA + a1) & 0xF; + if ((s32)(a1 + a2) <= 16) + { + CpuFastFill8(PIXEL_FILL(1), v1 + a1 * v2, a2 * v2); + CopyWindowToVram(a0->windowId, 2); + } + else + { + u32 v3; + u32 v4; + + v3 = 16 - a1; + v4 = a2 - v3; + + CpuFastFill8(PIXEL_FILL(1), v1 + a1 * v2, v3 * v2); + CpuFastFill8(PIXEL_FILL(1), v1, v4 * v2); + CopyWindowToVram(a0->windowId, 2); + } + + a2 -= 1; + for (a2; a2 != -1; a1 = (a1 + 1) & 0xF, a2--) + { + sub_81CBD48(a0->windowId, a1); + } + + CopyWindowToVram(a0->windowId, 1); +} + +void sub_81C8C64(struct UnknownSubSubStruct_0203CF40 *a0, u32 a1) +{ + u16 *v1; + register u32 v2 asm("r0"); + u32 v3; + + v1 = (u16*)GetBgTilemapBuffer(GetWindowAttribute(a0->windowId, WINDOW_BG)); + + v1 = &v1[(a0->unkA << 6) + a0->unk2 - 1]; + + if (a1 != 0) + { + v2 = a0->unk1 << 12; + v3 = a0->unk6 + 1; + } + else + { + v2 = a0->unk1 << 12; + v3 = a0->unk6; + } + { + register u16 v5 asm("r1"); + register u32 v6 asm("r0"); + v6 = (v3 | v2); + v6 = v6 << 16; + v5 = v6 >> 16; + v1[0] = v5; + v1[0x20] = v5; + } +} + +void sub_81C8CB4(struct UnknownSubSubStruct_81C81D4 *a0, struct UnknownInnerStruct_81C81D4 *a1) +{ + u8 buffer[ARRAY_COUNT(gUnknown_0861FBE4)]; + + + memcpy(buffer, gUnknown_0861FBE4, ARRAY_COUNT(gUnknown_0861FBE4)); + + a1->unk34(a0->unk10 + a0->unkC * a0->unk0, a1->unk48); + a1->unk38(a1->unk0.windowId, a0->unk0, a1->unk0.unkA); + FillWindowPixelRect(a1->unk0.windowId, PIXEL_FILL(4), 0, a1->unk0.unkA * 16, a1->unk0.unk4 * 8, 16); + AddTextPrinterParameterized3(a1->unk0.windowId, a1->unk0.unk5, 8, (a1->unk0.unkA * 16) + 1, buffer, TEXT_SPEED_FF, a1->unk48); + sub_81C8C64(&a1->unk0, 1); + CopyWindowRectToVram(a1->unk0.windowId, 3, 0, a1->unk0.unkA * 2, a1->unk0.unk4, 2); +} + +void sub_81C8D4C(struct UnknownSubSubStruct_81C81D4 *a0, struct UnknownInnerStruct_81C81D4 *a1) +{ + a1->unk34(a0->unk10 + a0->unkC * a0->unk0, a1->unk48); + FillWindowPixelRect(a1->unk0.windowId, PIXEL_FILL(1), 0, a1->unk0.unkA * 16, a1->unk0.unk4 * 8, 16); + AddTextPrinterParameterized(a1->unk0.windowId, a1->unk0.unk5, a1->unk48, 8, a1->unk0.unkA * 16 + 1, TEXT_SPEED_FF, NULL); + sub_81C8C64(&a1->unk0, 0); + CopyWindowToVram(a1->unk0.windowId, 3); } \ No newline at end of file -- cgit v1.2.3 From bc506861581869658f627a21fa90749540f352ca Mon Sep 17 00:00:00 2001 From: Phlosioneer Date: Sat, 6 Apr 2019 03:41:00 -0400 Subject: Decomp everything onvolving UnknownSubStruct_81C81D4 Now I can start cleaning up the fields and substructs --- src/pokenav.c | 403 +++++++++++++++++++++++++++++++++++++++++++++++++++++----- src/strings.c | 6 +- 2 files changed, 373 insertions(+), 36 deletions(-) (limited to 'src') diff --git a/src/pokenav.c b/src/pokenav.c index 3986cb51c..cde8646bc 100644 --- a/src/pokenav.c +++ b/src/pokenav.c @@ -34,7 +34,7 @@ struct UnknownSubSubStruct_0203CF40 { u8 unk2; u8 unk3; u8 unk4; - u8 unk5; + u8 fontId; u16 unk6; u16 windowId; u16 unkA; @@ -80,12 +80,12 @@ struct UnknownInnerStruct_81C81D4 u32 unk28; s32 unk2C; u32 unk30; - void (*unk34)(u32, char*); + void (*unk34)(u32, u8*); void (*unk38)(u16, u32, u32); - u32 unk3C; - u32 unk40; - u32 unk44; - char unk48[0x40]; + struct Sprite *rightArrow; + struct Sprite *upArrow; + struct Sprite *downArrow; + u8 unkTextBuffer[0x40]; }; // Generally at index 0x11 (17) @@ -117,12 +117,27 @@ struct CompressedSpritePalette_ u32 tag; }; +struct UnknownStruct_81C9160 +{ + u32 unk0; + u16 unk4; + u16 unk6; + u8 unk8; + u8 unk9; + u8 unkA; + u8 unkB; + u8 unkC; + u8 unkD; + u8 unkE; + void (*unk10)(u32, u8 *a1); + void (*unk14)(u16 a0, u32 a1, u32 a2); +}; + extern u32 sub_81C9430(void); extern void sub_81CAADC(void); extern u32 sub_81C99D4(void); extern void sub_8199D98(void); extern void sub_81C7D28(void); -extern void sub_81C8FE0(void); extern u32 sub_81C9298(void); extern u32 sub_81C941C(void); extern u32 sub_81C9924(void); @@ -180,16 +195,22 @@ extern u32 sub_81D04B8(void); extern u32 sub_81D09F4(void); extern u32 sub_81CFA04(void); extern u32 sub_81CFE08(void); -extern u32 sub_81C91AC(struct UnknownSubStruct_81C81D4 *a0, const void *a1, void *a2, s32 a3); -extern u32 sub_81C9160(struct UnknownSubSubStruct_81C81D4 *a0, void *a1); -extern void sub_81C8ED0(void); extern void sub_81C7CB4(struct Sprite* sprite); extern void sub_81CBD48(u16 windowId, u32 a1); -extern void sub_81C8EF8(struct UnknownSubSubStruct_81C81D4 *a0, struct UnknownInnerStruct_81C81D4 *a1); -extern void sub_81C9008(struct UnknownInnerStruct_81C81D4 *a0, u32 a1); -extern void sub_81C8DBC(struct UnknownInnerStruct_81C81D4 *a0, u32 a1); -extern void sub_81C8E54(struct UnknownSubSubStruct_81C81D4 *a0, struct UnknownInnerStruct_81C81D4 *a1, u32 a2); - +extern u8 *sub_81CAFD8(u16 a0, u32 a1); +extern void sub_81DB620(u32 windowId, u32 a1, u32 a2, u32 a3, u32 a4); + +u32 sub_81C91AC(struct UnknownInnerStruct_81C81D4 *a0, const struct BgTemplate *a1, struct UnknownStruct_81C9160 *a2, s32 a3); +void sub_81C9160(struct UnknownSubSubStruct_81C81D4 *a0, struct UnknownStruct_81C9160 *a1); +void SpriteCB_MatchCallUpArrow(struct Sprite *sprite); +void SpriteCB_MatchCallDownArrow(struct Sprite *sprite); +void SpriteCB_MatchCallRightArrow(struct Sprite *sprite); +void ToggleMatchCallArrows(struct UnknownInnerStruct_81C81D4 *a0, u32 a1); +void sub_81C8FE0(struct UnknownInnerStruct_81C81D4 *a0); +void sub_81C8EF8(struct UnknownSubSubStruct_81C81D4 *a0, struct UnknownInnerStruct_81C81D4 *a1); +void sub_81C8ED0(void); +void sub_81C8E54(struct UnknownSubSubStruct_81C81D4 *a0, struct UnknownInnerStruct_81C81D4 *a1, u32 a2); +void PrintMatchCallFieldNames(struct UnknownInnerStruct_81C81D4 *a0, u32 a1); void sub_81C8D4C(struct UnknownSubSubStruct_81C81D4 *a0, struct UnknownInnerStruct_81C81D4 *a1); void sub_81C8CB4(struct UnknownSubSubStruct_81C81D4 *a0, struct UnknownInnerStruct_81C81D4 *a1); void sub_81C8B70(struct UnknownSubSubStruct_0203CF40 *a0, u32 a1, u32 a2); @@ -636,12 +657,103 @@ static const struct SpriteTemplate sUnknown_0861FB44 = .callback = SpriteCallbackDummy }; +static const u16 sMatchcallArrowPaletteData[] = INCBIN_U16("graphics/pokenav/arrows_matchcall.gbapal"); +static const u32 sMatchcallArrowSpriteSheetData[] = INCBIN_U32("graphics/pokenav/arrows_matchcall.4bpp.lz"); + +static const u8 sPokenavColors_0861FBE4[] = +{ + 0, 2, 5 +}; + +static const u8 *const sMatchCallFieldNames[] = +{ + gText_NavgearMatchCall_Strategy, + gText_NavgearMatchCall_TrainerPokemon, + gText_NavgearMatchCall_SelfIntroduction +}; + +static const u8 sMatchCallFieldColors[] = +{ + 1, 4, 5 +}; + +static const u8 sUnknown_0861FBF7[] = +{ + 2, 4, 6, 7, 0 +}; + +static const struct CompressedSpriteSheet sMatchcallArrowSpriteSheet[] = +{ + { + .data = sMatchcallArrowSpriteSheetData, + .size = 192, + .tag = 0xA + } +}; + +static const struct SpritePalette sMatchcallArrowPalette[] = +{ + { + .data = sMatchcallArrowPaletteData, + .tag = 0x14 + }, + {} +}; + +static const struct OamData sMatchCallRightArrowSpriteOam = +{ + .y = 0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .bpp = ST_OAM_4BPP, + .shape = 2, //SPRITE_SHAPE(16x8), + .x = 0, + .size = 0, //SPRITE_SIZE(16x8), + .tileNum = 0, + .priority = 2, + .paletteNum = 0 +}; + +static const struct SpriteTemplate sMatchCallRightArrowSprite = +{ + .tileTag = 0xA, + .paletteTag = 0x14, + .oam = &sMatchCallRightArrowSpriteOam, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_MatchCallRightArrow +}; + +static const struct OamData sMatchCallUpDownArrowSpriteOam = +{ + .y = 0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .bpp = ST_OAM_4BPP, + .shape = 1, //SPRITE_SHAPE(8x16), + .x = 0, + .size = 0, //SPRITE_SIZE(8x16), + .tileNum = 0, + .priority = 2, + .paletteNum = 0 +}; + +static const struct SpriteTemplate sMatchCallUpDownArrowSprite = +{ + .tileTag = 0xA, + .paletteTag = 0x14, + .oam = &sMatchCallUpDownArrowSpriteOam, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy +}; + EWRAM_DATA u8 gUnknown_0203CF3C = 0; EWRAM_DATA struct UnknownStruct_0203CF40 *gUnknown_0203CF40 = NULL; EWRAM_DATA u32 gUnknown_0203CF44 = 0; -extern const u8 gUnknown_0861FBE4[3]; - // code u32 sub_81C7078(u32 (*func)(s32), u32 priority) { @@ -1670,7 +1782,7 @@ void sub_81C817C(struct Sprite *sprite) } } -bool32 sub_81C81D4(const void *arg0, void *arg1, s32 arg2) +bool32 sub_81C81D4(const struct BgTemplate *arg0, struct UnknownStruct_81C9160 *arg1, s32 arg2) { u32 v1; struct UnknownSubStruct_81C81D4 *structPtr; @@ -1682,7 +1794,7 @@ bool32 sub_81C81D4(const void *arg0, void *arg1, s32 arg2) sub_81C9160(&structPtr->unk888, arg1); - v1 = sub_81C91AC(structPtr, arg0, arg1, arg2); + v1 = sub_81C91AC(&structPtr->unk0, arg0, arg1, arg2); if (v1 == 0) return FALSE; @@ -1700,7 +1812,7 @@ void sub_81C8234(void) struct UnknownSubStruct_81C81D4 *structPtr; structPtr = GetSubstructPtr(0x11); - sub_81C8FE0(); + sub_81C8FE0(&structPtr->unk0); RemoveWindow(structPtr->unk0.unk0.windowId); FreeSubstruct(0x11); } @@ -1807,13 +1919,13 @@ u32 sub_81C83F0(s32 a0) { case 0: v1 = (structPtr->unk0.unkA + structPtr->unk0.unkC + structPtr->unk10) & 0xF; - structPtr->unk34(structPtr->unk1C, structPtr->unk48); + structPtr->unk34(structPtr->unk1C, structPtr->unkTextBuffer); if (structPtr->unk38 != NULL) // Accessing unk0.windowId as if it were a u16...? // It's accessed as a u8 again in the very next line... structPtr->unk38(*(u16*)(&structPtr->unk0.windowId), structPtr->unk14, v1); - AddTextPrinterParameterized(structPtr->unk0.windowId, structPtr->unk0.unk5, structPtr->unk48, 8, (v1 << 4) | 1, 255, (void (*)(struct TextPrinterTemplate*, u16))a0); + AddTextPrinterParameterized(structPtr->unk0.windowId, structPtr->unk0.fontId, structPtr->unkTextBuffer, 8, (v1 << 4) + 1, 255, NULL); if (++structPtr->unk0.unkC >= structPtr->unk0.unkE) { @@ -2245,7 +2357,7 @@ u32 sub_81C8870(s32 a0) switch (a0) { case 0: - sub_81C9008(&structPtr->unk0, 1); + ToggleMatchCallArrows(&structPtr->unk0, 1); // fall-through case 1: if (structPtr->unk89C != structPtr->unk888.unk6) @@ -2299,19 +2411,19 @@ u32 sub_81C8958(s32 a0) sub_81C8CB4(&structPtr->unk888, &structPtr->unk0); break; case 1: - sub_81C8DBC(&structPtr->unk0, 0); + PrintMatchCallFieldNames(&structPtr->unk0, 0); break; case 2: sub_81C8E54(&structPtr->unk888, &structPtr->unk0, 0); break; case 3: - sub_81C8DBC(&structPtr->unk0, 1); + PrintMatchCallFieldNames(&structPtr->unk0, 1); break; case 4: sub_81C8E54(&structPtr->unk888, &structPtr->unk0, 1); break; case 5: - sub_81C8DBC(&structPtr->unk0, 2); + PrintMatchCallFieldNames(&structPtr->unk0, 2); break; case 6: sub_81C8E54(&structPtr->unk888, &structPtr->unk0, 2); @@ -2409,7 +2521,7 @@ u32 sub_81C8A28(s32 a0) return 1; return 9; case 6: - sub_81C9008(subPtr0, 0); + ToggleMatchCallArrows(subPtr0, 0); return 4; } } @@ -2483,24 +2595,249 @@ void sub_81C8C64(struct UnknownSubSubStruct_0203CF40 *a0, u32 a1) void sub_81C8CB4(struct UnknownSubSubStruct_81C81D4 *a0, struct UnknownInnerStruct_81C81D4 *a1) { - u8 buffer[ARRAY_COUNT(gUnknown_0861FBE4)]; + u8 colors[3]; - memcpy(buffer, gUnknown_0861FBE4, ARRAY_COUNT(gUnknown_0861FBE4)); + memcpy(colors, sPokenavColors_0861FBE4, ARRAY_COUNT(sPokenavColors_0861FBE4)); - a1->unk34(a0->unk10 + a0->unkC * a0->unk0, a1->unk48); + a1->unk34(a0->unk10 + a0->unkC * a0->unk0, a1->unkTextBuffer); a1->unk38(a1->unk0.windowId, a0->unk0, a1->unk0.unkA); FillWindowPixelRect(a1->unk0.windowId, PIXEL_FILL(4), 0, a1->unk0.unkA * 16, a1->unk0.unk4 * 8, 16); - AddTextPrinterParameterized3(a1->unk0.windowId, a1->unk0.unk5, 8, (a1->unk0.unkA * 16) + 1, buffer, TEXT_SPEED_FF, a1->unk48); + AddTextPrinterParameterized3(a1->unk0.windowId, a1->unk0.fontId, 8, (a1->unk0.unkA * 16) + 1, colors, TEXT_SPEED_FF, a1->unkTextBuffer); sub_81C8C64(&a1->unk0, 1); CopyWindowRectToVram(a1->unk0.windowId, 3, 0, a1->unk0.unkA * 2, a1->unk0.unk4, 2); } void sub_81C8D4C(struct UnknownSubSubStruct_81C81D4 *a0, struct UnknownInnerStruct_81C81D4 *a1) { - a1->unk34(a0->unk10 + a0->unkC * a0->unk0, a1->unk48); + a1->unk34(a0->unk10 + a0->unkC * a0->unk0, a1->unkTextBuffer); FillWindowPixelRect(a1->unk0.windowId, PIXEL_FILL(1), 0, a1->unk0.unkA * 16, a1->unk0.unk4 * 8, 16); - AddTextPrinterParameterized(a1->unk0.windowId, a1->unk0.unk5, a1->unk48, 8, a1->unk0.unkA * 16 + 1, TEXT_SPEED_FF, NULL); + AddTextPrinterParameterized(a1->unk0.windowId, a1->unk0.fontId, a1->unkTextBuffer, 8, a1->unk0.unkA * 16 + 1, TEXT_SPEED_FF, NULL); sub_81C8C64(&a1->unk0, 0); CopyWindowToVram(a1->unk0.windowId, 3); +} + +void PrintMatchCallFieldNames(struct UnknownInnerStruct_81C81D4 *a0, u32 fieldId) +{ + const u8 *fieldNames[3]; + u8 colors[3]; + u32 r4; + u32 r5; + u32 tmp; + u32 one; + + memcpy(fieldNames, sMatchCallFieldNames, sizeof(sMatchCallFieldNames)); + memcpy(colors, sMatchCallFieldColors, sizeof(sMatchCallFieldColors)); + + r4 = a0->unk0.unkA; + tmp = fieldId * 2 + 1; + r4 += tmp; + r4 &= 0xF; + FillWindowPixelRect(a0->unk0.windowId, PIXEL_FILL(1), 0, r4 << 4, a0->unk0.unk4, 16); + + // This is a fake match. It should be this: + // AddTextPrinterParameterized3(a0->unk0.windowId, 7, 2, r4 << 4 + 1, colors, TEXT_SPEED_FF, fieldNames[fieldId]); + // But the original GCC does some clever reuse of the `1` constant that the current GCC doesn't. + one = 1; + AddTextPrinterParameterized3(a0->unk0.windowId, 7, 2, (r4 << 4) + one, colors, one - 2, fieldNames[fieldId]); + CopyWindowRectToVram(a0->unk0.windowId, 2, 0, r4 << 1, a0->unk0.unk4, 2); +} + +void sub_81C8E54(struct UnknownSubSubStruct_81C81D4 *a0, struct UnknownInnerStruct_81C81D4 *a1, u32 a2) +{ + const u8 *str; + u32 r6; + + r6 = (a1->unk0.unkA + sUnknown_0861FBF7[a2]) & 0xF; + + str = sub_81CAFD8(a0->unk0, a2); + if (str != NULL) { + sub_81DB620(a1->unk0.windowId, 1, r6 * 2, a1->unk0.unk4 - 1, 2); + AddTextPrinterParameterized(a1->unk0.windowId, 7, str, 2, (r6 << 4) + 1, TEXT_SPEED_FF, NULL); + CopyWindowRectToVram(a1->unk0.windowId, 2, 0, r6 * 2, a1->unk0.unk4, 2); + } +} + +void sub_81C8ED0(void) +{ + u32 i; + const struct CompressedSpriteSheet *ptr; + + for (i = 0, ptr = sMatchcallArrowSpriteSheet; i < ARRAY_COUNT(sMatchcallArrowSpriteSheet); ptr++, i++) + { + LoadCompressedSpriteSheet(ptr); + } + sub_81C795C(sMatchcallArrowPalette); +} + +void sub_81C8EF8(struct UnknownSubSubStruct_81C81D4 *a0, struct UnknownInnerStruct_81C81D4 *a1) +{ + register u32 spriteId asm("r3"); + s16 temp; + + spriteId = (u8)CreateSprite(&sMatchCallRightArrowSprite, a1->unk0.unk2 * 8 + 3, (a1->unk0.unk3 + 1) * 8, 7); + a1->rightArrow = &gSprites[spriteId]; + + temp = a1->unk0.unk2 * 8 + (a1->unk0.unk4 - 1) * 4; + spriteId = (u8)CreateSprite(&sMatchCallUpDownArrowSprite, temp, a1->unk0.unk3 * 8 + a0->unk8 * 16, 7); + a1->downArrow = &gSprites[spriteId]; + a1->downArrow->oam.tileNum += 2; + a1->downArrow->callback = SpriteCB_MatchCallDownArrow; + + spriteId = (u8)CreateSprite(&sMatchCallUpDownArrowSprite, temp, a1->unk0.unk3 * 8, 7); + a1->upArrow = &gSprites[spriteId]; + a1->upArrow->oam.tileNum += 4; + a1->upArrow->callback = SpriteCB_MatchCallUpArrow; +} + +void sub_81C8FE0(struct UnknownInnerStruct_81C81D4 *a0) +{ + DestroySprite(a0->rightArrow); + DestroySprite(a0->upArrow); + DestroySprite(a0->downArrow); + FreeSpriteTilesByTag(0xA); + FreeSpritePaletteByTag(0x14); +} + +void ToggleMatchCallArrows(struct UnknownInnerStruct_81C81D4 *a0, bool32 shouldHide) +{ + if (shouldHide) + { + a0->rightArrow->callback = SpriteCallbackDummy; + a0->upArrow->callback = SpriteCallbackDummy; + a0->downArrow->callback = SpriteCallbackDummy; + } + else + { + a0->rightArrow->callback = SpriteCB_MatchCallRightArrow; + a0->upArrow->callback = SpriteCB_MatchCallUpArrow; + a0->downArrow->callback = SpriteCB_MatchCallDownArrow; + } + a0->rightArrow->invisible = shouldHide; + a0->upArrow->invisible = shouldHide; + a0->downArrow->invisible = shouldHide; +} + +void SpriteCB_MatchCallRightArrow(struct Sprite *sprite) +{ + struct UnknownSubStruct_81C81D4 *structPtr; + structPtr = GetSubstructPtr(0x11); + sprite->pos2.y = structPtr->unk888.unk6 << 4; +} + +void SpriteCB_MatchCallDownArrow(struct Sprite *sprite) +{ + if (sprite->data[7] == 0 && sub_81C84C0()) + sprite->invisible = FALSE; + else + sprite->invisible = TRUE; + + if (++sprite->data[0] > 3) + { + s16 offset; + + sprite->data[0] = 0; + offset = (sprite->data[1] + 1) & 7; + sprite->data[1] = offset; + sprite->pos2.y = offset; + } +} + +void SpriteCB_MatchCallUpArrow(struct Sprite *sprite) +{ + if (sprite->data[7] == 0 && sub_81C84A4()) + sprite->invisible = FALSE; + else + sprite->invisible = TRUE; + + if (++sprite->data[0] > 3) + { + s16 offset; + + sprite->data[0] = 0; + offset = (sprite->data[1] + 1) & 7; + sprite->data[1] = offset; + sprite->pos2.y = -1 * offset; + } +} + +void ToggleMatchCallVerticalArrows(bool32 shouldHide) +{ + struct UnknownSubStruct_81C81D4 *structPtr; + structPtr = GetSubstructPtr(0x11); + structPtr->unk0.upArrow->data[7] = shouldHide; + structPtr->unk0.downArrow->data[7] = shouldHide; +} + +void sub_81C9160(struct UnknownSubSubStruct_81C81D4 *a0, struct UnknownStruct_81C9160 *a1) +{ + u32 unused1 = a0->unk10 = a1->unk0; + u32 v0 = a1->unk6; + u32 zero = 0; + u32 unused2 = a0->unk0 = v0; + u32 v1 = a0->unk2 = a1->unk4; + + a0->unkC = a1->unk8; + a0->unk8 = a1->unkC; + if (a0->unk8 >= (u16)v1) + { + a0->unk0 = 0; + a0->unk4 = 0; + a0->unk6 = v0; + } + else + { + s32 v2; + a0->unk4 = a0->unk2 - a0->unk8; + v2 = a0->unk0 + a0->unk8; + if (v2 > a0->unk2) { + a0->unk6 = v2 - a0->unk2; + a0->unk0 = v0 - a0->unk6; + } + else + { + a0->unk6 = 0; + } + } +} + +u32 sub_81C91AC(struct UnknownInnerStruct_81C81D4 *a0, const struct BgTemplate *a1, struct UnknownStruct_81C9160 *a2, s32 a3) +{ + register u32 raw_bg asm("r4") = ((a1->bg) << 30); + u8 bg = raw_bg >> 30; + u32 unknown = 0; + struct WindowTemplate template; + u8 bg_again; + + a0->unk0.bg = bg; + a0->unk0.unk6 = a3; + a0->unk34 = a2->unk10; + a0->unk38 = a2->unk14; + a0->unk0.unk1 = a2->unkD; + a0->unk0.unk2 = a2->unk9; + a0->unk0.unk3 = a2->unkB; + a0->unk0.unk4 = a2->unkA; + a0->unk0.fontId = a2->unkE; + + template.bg = raw_bg >> 30; + template.tilemapLeft = a2->unk9; + template.tilemapTop = 0; + template.width = a2->unkA; + template.height = 32; + template.paletteNum = a2->unkD; + template.baseBlock = a3 + 2; + + a0->unk0.windowId = AddWindow(&template); + if (a0->unk0.windowId == 0xFF) + { + return 0; + } + else + { + a0->unk0.unkA = unknown; + a0->rightArrow = NULL; + a0->upArrow = NULL; + a0->downArrow = NULL; + return 1; + } } \ No newline at end of file diff --git a/src/strings.c b/src/strings.c index f81a19083..c4266a135 100644 --- a/src/strings.c +++ b/src/strings.c @@ -962,9 +962,9 @@ const u8 gUnknown_085EBE7D[] = _("DETAIL"); const u8 gUnknown_085EBE84[] = _("CALL"); const u8 gUnknown_085EBE89[] = _("EXIT"); const u8 gUnknown_085EBE8E[] = _("Can't call opponent here."); -const u8 gUnknown_085EBEA8[] = _("STRATEGY"); -const u8 gUnknown_085EBEB1[] = _("TRAINER'S POKéMON"); -const u8 gUnknown_085EBEC3[] = _("SELF-INTRODUCTION"); +const u8 gText_NavgearMatchCall_Strategy[] = _("STRATEGY"); +const u8 gText_NavgearMatchCall_TrainerPokemon[] = _("TRAINER'S POKéMON"); +const u8 gText_NavgearMatchCall_SelfIntroduction[] = _("SELF-INTRODUCTION"); const u8 gText_Navgear_ClearButtonList[] = _("{CLEAR 0x80}"); const u8 gText_NavgearMap_ZoomedOutButtons[] = _("{A_BUTTON}ZOOM {B_BUTTON}CANCEL"); const u8 gText_NavgearMap_ZoomedInButtons[] = _("{A_BUTTON}FULL {B_BUTTON}CANCEL"); -- cgit v1.2.3 From 3b45f37517a8d97f80c86f08d2e60c31a1701903 Mon Sep 17 00:00:00 2001 From: Phlosioneer Date: Sat, 6 Apr 2019 16:15:52 -0400 Subject: Significant documentatioon progress --- src/pokenav.c | 555 ++++++++++++++++++++++++++++++---------------------------- 1 file changed, 288 insertions(+), 267 deletions(-) (limited to 'src') diff --git a/src/pokenav.c b/src/pokenav.c index cde8646bc..403218178 100644 --- a/src/pokenav.c +++ b/src/pokenav.c @@ -26,8 +26,24 @@ enum MODE_FORCE_CALL_2, // Set after making a call, has to exit Pokenav. }; +// Return values of LoopedTask functions. +#define LT_INC_AND_STOP 0 +#define LT_INC_AND_CONTINUE 1 +#define LT_STOP 2 +#define LT_CONTINUE 3 +#define LT_FINISH 4 +#define LT_SET_STATE(newState) (newState + 5) + +#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 +typedef u32 (*LoopedTask)(s32 state); + struct UnknownSubSubStruct_0203CF40 { u8 bg; u8 unk1; @@ -42,12 +58,14 @@ struct UnknownSubSubStruct_0203CF40 { u16 unkE; }; -struct UnknownSubSubStruct_81C81D4 { - u16 unk0; - u16 unk2; +struct MatchCallWindowState { + // The index of the element at the top of the window. + u16 windowTopIndex; + u16 listLength; u16 unk4; - u16 unk6; - u16 unk8; + // The index of the cursor, relative to the top of the window. + u16 selectedIndexOffset; + u16 visibleEntries; u16 unkA; u32 unkC; u32 unk10; @@ -59,7 +77,7 @@ struct UnknownSubStruct_0203CF40 void (*unk0)(u32); u32 (*unk4)(void); u32 unk8; - u32 unkC; + u32 currentTaskId; u32 unk10; u32 unk14; struct Sprite *unk18; @@ -93,14 +111,14 @@ struct UnknownSubStruct_81C81D4 { struct UnknownInnerStruct_81C81D4 unk0; u8 tilemapBuffer[0x800]; - struct UnknownSubSubStruct_81C81D4 unk888; + struct MatchCallWindowState unk888; u32 unk89C; u32 unk8A0; }; #define SUBSTRUCT_COUNT 19 -struct UnknownStruct_0203CF40 +struct PokenavResources { u32 (*field0)(void); u32 field4; @@ -117,7 +135,7 @@ struct CompressedSpritePalette_ u32 tag; }; -struct UnknownStruct_81C9160 +struct MatchCallListTemplate { u32 unk0; u16 unk4; @@ -200,33 +218,33 @@ extern void sub_81CBD48(u16 windowId, u32 a1); extern u8 *sub_81CAFD8(u16 a0, u32 a1); extern void sub_81DB620(u32 windowId, u32 a1, u32 a2, u32 a3, u32 a4); -u32 sub_81C91AC(struct UnknownInnerStruct_81C81D4 *a0, const struct BgTemplate *a1, struct UnknownStruct_81C9160 *a2, s32 a3); -void sub_81C9160(struct UnknownSubSubStruct_81C81D4 *a0, struct UnknownStruct_81C9160 *a1); +u32 sub_81C91AC(struct UnknownInnerStruct_81C81D4 *a0, const struct BgTemplate *a1, struct MatchCallListTemplate *a2, s32 a3); +void sub_81C9160(struct MatchCallWindowState *a0, struct MatchCallListTemplate *a1); void SpriteCB_MatchCallUpArrow(struct Sprite *sprite); void SpriteCB_MatchCallDownArrow(struct Sprite *sprite); void SpriteCB_MatchCallRightArrow(struct Sprite *sprite); void ToggleMatchCallArrows(struct UnknownInnerStruct_81C81D4 *a0, u32 a1); void sub_81C8FE0(struct UnknownInnerStruct_81C81D4 *a0); -void sub_81C8EF8(struct UnknownSubSubStruct_81C81D4 *a0, struct UnknownInnerStruct_81C81D4 *a1); +void sub_81C8EF8(struct MatchCallWindowState *a0, struct UnknownInnerStruct_81C81D4 *a1); void sub_81C8ED0(void); -void sub_81C8E54(struct UnknownSubSubStruct_81C81D4 *a0, struct UnknownInnerStruct_81C81D4 *a1, u32 a2); +void sub_81C8E54(struct MatchCallWindowState *a0, struct UnknownInnerStruct_81C81D4 *a1, u32 a2); void PrintMatchCallFieldNames(struct UnknownInnerStruct_81C81D4 *a0, u32 a1); -void sub_81C8D4C(struct UnknownSubSubStruct_81C81D4 *a0, struct UnknownInnerStruct_81C81D4 *a1); -void sub_81C8CB4(struct UnknownSubSubStruct_81C81D4 *a0, struct UnknownInnerStruct_81C81D4 *a1); +void sub_81C8D4C(struct MatchCallWindowState *a0, struct UnknownInnerStruct_81C81D4 *a1); +void sub_81C8CB4(struct MatchCallWindowState *a0, struct UnknownInnerStruct_81C81D4 *a1); void sub_81C8B70(struct UnknownSubSubStruct_0203CF40 *a0, u32 a1, u32 a2); -u32 sub_81C8A28(s32 a0); -u32 sub_81C8958(s32 a0); -u32 sub_81C8870(s32 a0); -u32 sub_81C85A0(s32 a0); +u32 LoopedTask_sub_81C8A28(s32 a0); +u32 LoopedTask_sub_81C8958(s32 a0); +u32 LoopedTask_sub_81C8870(s32 a0); +u32 LoopedTask_sub_81C85A0(s32 a0); void sub_81C8568(s32 a0, struct UnknownInnerStruct_81C81D4 *a1); -u32 sub_81C83F0(s32 a0); +u32 LoopedTask_sub_81C83F0(s32 a0); bool32 sub_81C83E0(void); void sub_81C83AC(u32 a0, u32 a1, u32 a2, u32 a3, u32 a4, struct UnknownInnerStruct_81C81D4 *a5); -void sub_81C837C(struct UnknownSubSubStruct_81C81D4 *a0, struct UnknownInnerStruct_81C81D4 *a1); +void sub_81C837C(struct MatchCallWindowState *a0, struct UnknownInnerStruct_81C81D4 *a1); void sub_81C835C(struct UnknownSubSubStruct_0203CF40 *a0); void sub_81C82E4(struct UnknownSubStruct_81C81D4 *a0); -u32 sub_81C8254(s32 a0); -u32 sub_81C791C(s32 a0); +u32 LoopedTask_sub_81C8254(s32 a0); +u32 LoopedTask_sub_81C791C(s32 a0); bool32 sub_81C756C(u32 a0); bool32 sub_81C76C4(void); static bool32 AnyMonHasRibbon(void); @@ -234,22 +252,22 @@ u32 sub_81C75E0(void); u32 sub_81C75D4(void); u32 sub_81C76FC(void); u32 sub_81C786C(void); -u32 sub_81C7764(s32 a0); -u32 sub_81C78D4(s32 a0); +u32 LoopedTask_sub_81C7764(s32 a0); +u32 LoopedTask_sub_81C78D4(s32 a0); bool32 sub_81C7738(void); void CopyPaletteIntoBufferUnfaded(const u16 *palette, u32 a1, u32 a2); void sub_81C7834(void *func1, void *func2); -static void InitMainStruct(struct UnknownStruct_0203CF40 *a0); +static void InitMainStruct(struct PokenavResources *a0); void FreeSubstruct(u32 index); void sub_81C7850(u32 a0); void sub_81C7BF8(u32 a0); -void sub_81C71E4(u8 a0); -void sub_81C7170(u8 taskId); +void Task_RunLoopedTask_LinkMode(u8 a0); +void Task_RunLoopedTask(u8 taskId); void sub_81C742C(u8 taskId); void sub_81C7710(void); static void InitKeys_(void); static void FreeVars(void); -static void VblankCb_Pokenav(void); +static void VBlankCB_Pokenav(void); static void CB2_Pokenav(void); void sub_81C7C28(void); void sub_81C72BC(void); @@ -750,127 +768,131 @@ static const struct SpriteTemplate sMatchCallUpDownArrowSprite = .callback = SpriteCallbackDummy }; -EWRAM_DATA u8 gUnknown_0203CF3C = 0; -EWRAM_DATA struct UnknownStruct_0203CF40 *gUnknown_0203CF40 = NULL; +EWRAM_DATA u8 gNextLoopedTaskId = 0; +EWRAM_DATA struct PokenavResources *gPokenavResources = NULL; EWRAM_DATA u32 gUnknown_0203CF44 = 0; // code -u32 sub_81C7078(u32 (*func)(s32), u32 priority) +u32 CreateLoopedTask(LoopedTask loopedTask, u32 priority) { u16 taskId; if (!IsUpdateLinkStateCBActive()) - taskId = CreateTask(sub_81C7170, priority); + taskId = CreateTask(Task_RunLoopedTask, priority); else - taskId = CreateTask(sub_81C71E4, priority); + taskId = CreateTask(Task_RunLoopedTask_LinkMode, priority); - SetWordTaskArg(taskId, 1, (u32)func); + SetWordTaskArg(taskId, 1, (u32)loopedTask); - gTasks[taskId].data[3] = gUnknown_0203CF3C; - return ((gUnknown_0203CF3C++) << 16) | taskId; + gTasks[taskId].data[3] = gNextLoopedTaskId; + return LOOPED_TASK_ID(taskId, gNextLoopedTaskId++); } -bool32 sub_81C70D8(u32 a0) +bool32 IsLoopedTaskActive(u32 taskId) { - u32 taskId = a0 & 0xFFFF; - u32 v2 = a0 >> 16; + u32 primaryId = LOOPED_TASK_PRIMARY_ID(taskId); + u32 secondaryId = LOOPED_TASK_SECONDARY_ID(taskId); - if (gTasks[taskId].isActive - && (gTasks[taskId].func == sub_81C7170 || gTasks[taskId].func == sub_81C71E4) - && gTasks[taskId].data[3] == v2) + if (gTasks[primaryId].isActive + && (gTasks[primaryId].func == Task_RunLoopedTask || gTasks[primaryId].func == Task_RunLoopedTask_LinkMode) + && gTasks[primaryId].data[3] == secondaryId) return TRUE; else return FALSE; } -bool32 sub_81C7124(u32 (*a0)(s32)) +bool32 FuncIsActiveLoopedTask(LoopedTask func) { s32 i; for (i = 0; i < NUM_TASKS; i++) { if (gTasks[i].isActive - && (gTasks[i].func == sub_81C7170 || gTasks[i].func == sub_81C71E4) - && (void *)GetWordTaskArg(i, 1) == a0) + && (gTasks[i].func == Task_RunLoopedTask || gTasks[i].func == Task_RunLoopedTask_LinkMode) + && (LoopedTask)GetWordTaskArg(i, 1) == func) return TRUE; } return FALSE; } -void sub_81C7170(u8 taskId) +void Task_RunLoopedTask(u8 taskId) { - u32 (*func)(s32) = (void *)GetWordTaskArg(taskId, 1); - s16 *data = gTasks[taskId].data; + LoopedTask loopedTask = (LoopedTask)GetWordTaskArg(taskId, 1); + s16 *state = &gTasks[taskId].data[0]; bool32 exitLoop = FALSE; while (!exitLoop) { - u32 var = func(data[0]); - switch (var) + u32 action = loopedTask(*state); + switch (action) { - case 1: - data[0] = data[0] + 1; + case LT_INC_AND_CONTINUE: + (*state)++; break; - case 0: - data[0]++; + case LT_INC_AND_STOP: + (*state)++; return; - case 4: + case LT_FINISH: DestroyTask(taskId); return; + // case LT_SET_STATE: default: - data[0] = var - 5; + *state = LOOPED_TASK_DECODE_STATE(action); break; - case 3: + case LT_CONTINUE: break; - case 2: + case LT_STOP: return; } } } -void sub_81C71E4(u8 taskId) +// Every "Continue" action stops instead. +void Task_RunLoopedTask_LinkMode(u8 taskId) { - u32 (*func)(u32); - s16 *data; - u32 v1; + LoopedTask task; + s16 *state; + u32 action; if (sub_8087598()) return; - func = (u32 (*)(u32))GetWordTaskArg(taskId, 1); - data = gTasks[taskId].data; - v1 = func(data[0]); - switch (v1) - { - case 0: - case 1: - data[0]++; + + task = (LoopedTask)GetWordTaskArg(taskId, 1); + state = &gTasks[taskId].data[0]; + action = task(*state); + switch (action) + { + case LT_INC_AND_STOP: + case LT_INC_AND_CONTINUE: + (*state)++; break; - case 4: + case LT_FINISH: DestroyTask(taskId); break; + // case: LT_SET_STATE: default: - data[0] = v1 - 5; + *state = LOOPED_TASK_DECODE_STATE(action); break; - case 2: - case 3: + case LT_STOP: + case LT_CONTINUE: break; } } void CB2_InitPokeNav(void) { - gUnknown_0203CF40 = Alloc(sizeof(*gUnknown_0203CF40)); - if (gUnknown_0203CF40 == NULL) + gPokenavResources = Alloc(sizeof(*gPokenavResources)); + if (gPokenavResources == NULL) { SetMainCallback2(CB2_ReturnToFieldWithOpenMenu); } else { - InitMainStruct(gUnknown_0203CF40); + InitMainStruct(gPokenavResources); ResetTasks(); SetVBlankCallback(NULL); CreateTask(sub_81C742C, 0); SetMainCallback2(CB2_Pokenav); - SetVBlankCallback(VblankCb_Pokenav); + SetVBlankCallback(VBlankCB_Pokenav); } } @@ -886,22 +908,22 @@ void sub_81C72BC(void) if (gPaletteFade.active) return; - gUnknown_0203CF40 = Alloc(sizeof(*gUnknown_0203CF40)); - if (gUnknown_0203CF40 == NULL) + gPokenavResources = Alloc(sizeof(*gPokenavResources)); + if (gPokenavResources == NULL) { SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); } else { - InitMainStruct(gUnknown_0203CF40); - gUnknown_0203CF40->mode = MODE_FORCE_CALL_1; + InitMainStruct(gPokenavResources); + gPokenavResources->mode = MODE_FORCE_CALL_1; ResetTasks(); ResetSpriteData(); FreeAllSpritePalettes(); SetVBlankCallback(NULL); CreateTask(sub_81C742C, 0); SetMainCallback2(CB2_Pokenav); - SetVBlankCallback(VblankCb_Pokenav); + SetVBlankCallback(VBlankCB_Pokenav); } } @@ -912,12 +934,12 @@ static void FreeVars(void) for (i = 0; i < SUBSTRUCT_COUNT; i++) FreeSubstruct(i); - FREE_AND_SET_NULL(gUnknown_0203CF40); + FREE_AND_SET_NULL(gPokenavResources); InitKeys(); } -// Clears UnknownStruct_0203CF40 -static void InitMainStruct(struct UnknownStruct_0203CF40 *a0) +// Clears PokenavResources +static void InitMainStruct(struct PokenavResources *a0) { s32 i; @@ -967,7 +989,7 @@ static void CB2_Pokenav(void) UpdatePaletteFade(); } -static void VblankCb_Pokenav(void) +static void VBlankCB_Pokenav(void) { TransferPlttBuffer(); LoadOam(); @@ -1004,8 +1026,8 @@ void sub_81C742C(u8 taskId) } else if (v1 >= UNKNOWN_OFFSET) { - gUnknown_0861F3EC[gUnknown_0203CF40->field4][6](); - gUnknown_0861F3EC[gUnknown_0203CF40->field4][5](); + gUnknown_0861F3EC[gPokenavResources->field4][6](); + gUnknown_0861F3EC[gPokenavResources->field4][5](); if (sub_81C756C(v1)) { data[0] = 4; @@ -1030,7 +1052,7 @@ void sub_81C742C(u8 taskId) case 5: if (!sub_81C7738()) { - bool32 calledFromScript = (gUnknown_0203CF40->mode != MODE_NORMAL); + bool32 calledFromScript = (gPokenavResources->mode != MODE_NORMAL); sub_81C9430(); FreeVars(); @@ -1054,8 +1076,8 @@ bool32 sub_81C756C(u32 a0) return FALSE; sub_81C7834(gUnknown_0861F3EC[index][3], gUnknown_0861F3EC[index][4]); - gUnknown_0203CF40->field0 = gUnknown_0861F3EC[index][1]; - gUnknown_0203CF40->field4 = index; + gPokenavResources->field0 = gUnknown_0861F3EC[index][1]; + gPokenavResources->field4 = index; return TRUE; } @@ -1066,7 +1088,7 @@ u32 sub_81C75D4(void) u32 sub_81C75E0(void) { - return gUnknown_0203CF40->field0(); + return gPokenavResources->field0(); } static void InitKeys_(void) @@ -1081,33 +1103,33 @@ void SetVBlankCallback_(IntrCallback callback) void SetPokenavVBlankCallback(void) { - SetVBlankCallback(VblankCb_Pokenav); + SetVBlankCallback(VBlankCB_Pokenav); } void *AllocSubstruct(u32 index, u32 size) { - return gUnknown_0203CF40->field10[index] = Alloc(size); + return gPokenavResources->field10[index] = Alloc(size); } void *GetSubstructPtr(u32 index) { - return gUnknown_0203CF40->field10[index]; + return gPokenavResources->field10[index]; } void FreeSubstruct(u32 index) { - if (gUnknown_0203CF40->field10[index] != NULL) - FREE_AND_SET_NULL(gUnknown_0203CF40->field10[index]); + if (gPokenavResources->field10[index] != NULL) + FREE_AND_SET_NULL(gPokenavResources->field10[index]); } u16 GetPokenavMode(void) { - return gUnknown_0203CF40->mode; + return gPokenavResources->mode; } void SetPokenavMode(u16 mode) { - gUnknown_0203CF40->mode = mode; + gPokenavResources->mode = mode; } void sub_81C7694(u32 a0) @@ -1116,17 +1138,17 @@ void sub_81C7694(u32 a0) if (value > 4) value = 0; - gUnknown_0203CF40->fieldA = value; + gPokenavResources->fieldA = value; } u16 sub_81C76AC(void) { - return gUnknown_0203CF40->fieldA; + return gPokenavResources->fieldA; } bool32 CanViewRibbonsMenu(void) { - return gUnknown_0203CF40->hasAnyRibbons; + return gPokenavResources->hasAnyRibbons; } bool32 sub_81C76C4(void) @@ -1139,14 +1161,14 @@ bool32 sub_81C76C4(void) ResetSpriteData(); FreeAllSpritePalettes(); - structPtr->unkC = sub_81C7078(sub_81C7764, 1); + structPtr->currentTaskId = CreateLoopedTask(LoopedTask_sub_81C7764, 1); return TRUE; } u32 sub_81C76FC(void) { struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0); - return sub_81C70D8(structPtr->unkC); + return IsLoopedTaskActive(structPtr->currentTaskId); } void sub_81C7710(void) @@ -1169,7 +1191,7 @@ bool32 sub_81C7738(void) return TRUE; } -u32 sub_81C7764(s32 a0) +u32 LoopedTask_sub_81C7764(s32 a0) { struct UnknownSubStruct_0203CF40 *structPtr; @@ -1234,22 +1256,22 @@ u32 sub_81C786C(void) void sub_81C7880(void) { struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0); - structPtr->unkC = sub_81C7078(sub_81C78D4, 4); + structPtr->currentTaskId = CreateLoopedTask(LoopedTask_sub_81C78D4, 4); } void sub_81C78A0(void) { struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0); - structPtr->unkC = sub_81C7078(sub_81C791C, 4); + structPtr->currentTaskId = CreateLoopedTask(LoopedTask_sub_81C791C, 4); } bool32 sub_81C78C0(void) { struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0); - return sub_81C70D8(structPtr->unkC); + return IsLoopedTaskActive(structPtr->currentTaskId); } -u32 sub_81C78D4(s32 a0) +u32 LoopedTask_sub_81C78D4(s32 a0) { switch (a0) { @@ -1270,7 +1292,7 @@ u32 sub_81C78D4(s32 a0) } } -u32 sub_81C791C(s32 a0) +u32 LoopedTask_sub_81C791C(s32 a0) { if (ChangeBgY(0, 384, 2) <= 0) { @@ -1782,7 +1804,7 @@ void sub_81C817C(struct Sprite *sprite) } } -bool32 sub_81C81D4(const struct BgTemplate *arg0, struct UnknownStruct_81C9160 *arg1, s32 arg2) +bool32 sub_81C81D4(const struct BgTemplate *arg0, struct MatchCallListTemplate *arg1, s32 arg2) { u32 v1; struct UnknownSubStruct_81C81D4 *structPtr; @@ -1798,13 +1820,13 @@ bool32 sub_81C81D4(const struct BgTemplate *arg0, struct UnknownStruct_81C9160 * if (v1 == 0) return FALSE; - sub_81C7078(sub_81C8254, 6); + CreateLoopedTask(LoopedTask_sub_81C8254, 6); return TRUE; } bool32 sub_81C8224(void) { - return sub_81C7124(sub_81C8254); + return FuncIsActiveLoopedTask(LoopedTask_sub_81C8254); } void sub_81C8234(void) @@ -1817,7 +1839,7 @@ void sub_81C8234(void) FreeSubstruct(0x11); } -u32 sub_81C8254(s32 a0) +u32 LoopedTask_sub_81C8254(s32 a0) { struct UnknownSubStruct_81C81D4 *structPtr; @@ -1877,17 +1899,17 @@ void sub_81C835C(struct UnknownSubSubStruct_0203CF40 *a0) CopyWindowToVram(a0->windowId, 1); } -void sub_81C837C(struct UnknownSubSubStruct_81C81D4 *a0, struct UnknownInnerStruct_81C81D4 *a1) +void sub_81C837C(struct MatchCallWindowState *a0, struct UnknownInnerStruct_81C81D4 *a1) { s32 v1; s32 v2; // TODO: Clean this up. - v1 = a0->unk2 - a0->unk0; - v2 = a0->unk8; - if (v1 > a0->unk8) + v1 = a0->listLength - a0->windowTopIndex; + v2 = a0->visibleEntries; + if (v1 > a0->visibleEntries) v1 = v2; - sub_81C83AC(a0->unk10, a0->unk0, v1, a0->unkC, 0, a1); + sub_81C83AC(a0->unk10, a0->windowTopIndex, v1, a0->unkC, 0, a1); } void sub_81C83AC(u32 a0, u32 a1, u32 a2, u32 a3, u32 a4, struct UnknownInnerStruct_81C81D4 *a5) @@ -1901,15 +1923,15 @@ void sub_81C83AC(u32 a0, u32 a1, u32 a2, u32 a3, u32 a4, struct UnknownInnerStru a5->unk0.unkE = a2; a5->unk14 = a1; a5->unk10 = a4; - sub_81C7078(sub_81C83F0, 5); + CreateLoopedTask(LoopedTask_sub_81C83F0, 5); } bool32 sub_81C83E0(void) { - return sub_81C7124(sub_81C83F0); + return FuncIsActiveLoopedTask(LoopedTask_sub_81C83F0); } -u32 sub_81C83F0(s32 a0) +u32 LoopedTask_sub_81C83F0(s32 a0) { struct UnknownInnerStruct_81C81D4 *structPtr; u32 v1; @@ -1951,24 +1973,24 @@ u32 sub_81C83F0(s32 a0) } } -bool32 sub_81C84A4(void) +bool32 ShouldShowUpArrow(void) { u16 v1; s32 v2; struct UnknownSubStruct_81C81D4 *structPtr; structPtr = GetSubstructPtr(0x11); - return structPtr->unk888.unk0 != 0; + return structPtr->unk888.windowTopIndex != 0; } -bool32 sub_81C84C0(void) +bool32 ShouldShowDownArrow(void) { - struct UnknownSubSubStruct_81C81D4 *subPtr; + struct MatchCallWindowState *subPtr; struct UnknownSubStruct_81C81D4 *structPtr; structPtr = GetSubstructPtr(0x11); subPtr = &structPtr->unk888; - return subPtr->unk0 + subPtr->unk8 < subPtr->unk2; + return subPtr->windowTopIndex + subPtr->visibleEntries < subPtr->listLength; } @@ -1976,37 +1998,37 @@ bool32 sub_81C84C0(void) // This has some register renaming issues (r4, r5, and r6 are all switched around), and // for some reason it's creating two copies of subPtr->unk0. // TODO: Now I know why it's making two copies - one of them is UnknownInnerStruct_81C81D4. -void sub_81C84E8(s32 a0, s32 a1) +void MatchCall_MoveWindow(s32 a0, bool32 a1) { s32 v1; - struct UnknownSubSubStruct_81C81D4 *subPtr; + struct MatchCallWindowState *subPtr; struct UnknownSubStruct_81C81D4 *structPtr; structPtr = GetSubstructPtr(0x11); subPtr = &structPtr->unk888; if (a0 < 0) { - // This is where the issue is. subPtr->unk0 is being stored in r1 and then copied to + // This is where the issue is. subPtr->windowTopIndex is being stored in r1 and then copied to // r2... and then r2 is read for the if statement, r1 is read for the function call, // and then both are clobbered as expected. Between those two uses, no writes to r1/r2 // happen; it doesn't need to be duplicated/moved at all. - if (subPtr->unk0 + a0 < 0) - v1 = -1 * subPtr->unk0; + if (subPtr->windowTopIndex + a0 < 0) + v1 = -1 * subPtr->windowTopIndex; else v1 = a0; - if (a1 != 0) - sub_81C83AC(subPtr->unk10, subPtr->unk0 + v1, v1 * -1, subPtr->unkC, v1, structPtr); + if (a1) + sub_81C83AC(subPtr->unk10, subPtr->windowTopIndex + v1, v1 * -1, subPtr->unkC, v1, structPtr); } - else if (a1 != 0) + else if (a1) { - gUnknown_0203CF44 = subPtr->unk0 + subPtr->unk8; - if ((s32)(gUnknown_0203CF44) + a0 >= (s32)subPtr->unk2) - v1 = subPtr->unk2 - gUnknown_0203CF44; + gUnknown_0203CF44 = subPtr->windowTopIndex + subPtr->visibleEntries; + if ((s32)(gUnknown_0203CF44) + a0 >= (s32)subPtr->listLength) + v1 = subPtr->listLength - gUnknown_0203CF44; else v1 = a0; - sub_81C83AC(subPtr->unk10, gUnknown_0203CF44, v1, subPtr->unkC, subPtr->unk8, structPtr); + sub_81C83AC(subPtr->unk10, gUnknown_0203CF44, v1, subPtr->unkC, subPtr->visibleEntries, structPtr); // Needed to prevent GCC from combining the two sub_81C83AC calls. asm(""); } @@ -2016,11 +2038,11 @@ void sub_81C84E8(s32 a0, s32 a1) } sub_81C8568(v1, structPtr); - subPtr->unk0++; + subPtr->windowTopIndex++; } #else NAKED -void sub_81C84E8(s32 a0, s32 a1) +void MatchCall_MoveWindow(s32 a0, bool32 a1) { asm(".syntax unified\n\ push {r4-r7,lr}\n\ @@ -2098,10 +2120,10 @@ void sub_81C8568(s32 a0, struct UnknownInnerStruct_81C81D4 *a1) else a1->unk30 = 2; a1->unk2C = a0; - a1->unk28 = sub_81C7078(sub_81C85A0, 6); + a1->unk28 = CreateLoopedTask(LoopedTask_sub_81C85A0, 6); } -u32 sub_81C85A0(s32 a0) +u32 LoopedTask_sub_81C85A0(s32 a0) { s32 y; s32 v1; @@ -2153,32 +2175,31 @@ bool32 sub_81C8630(void) { struct UnknownSubStruct_81C81D4 *structPtr; structPtr = GetSubstructPtr(0x11); - return sub_81C70D8(structPtr->unk0.unk28); + return IsLoopedTaskActive(structPtr->unk0.unk28); } -struct UnknownSubSubStruct_81C81D4 *sub_81C8644(void) +struct MatchCallWindowState *GetMatchCallWindowStruct(void) { struct UnknownSubStruct_81C81D4 *structPtr; structPtr = GetSubstructPtr(0x11); return &structPtr->unk888; } -u32 sub_81C8658(void) +u32 MatchCall_MoveCursorUp(void) { - struct UnknownSubSubStruct_81C81D4 *structPtr; - structPtr = sub_81C8644(); + struct MatchCallWindowState *structPtr; + structPtr = GetMatchCallWindowStruct(); - // Using unk6 as a timer. - if (structPtr->unk6 != 0) + if (structPtr->selectedIndexOffset != 0) { - structPtr->unk6--; + structPtr->selectedIndexOffset--; return 1; } else { - if (sub_81C84A4()) + if (ShouldShowUpArrow()) { - sub_81C84E8(-1, 1); + MatchCall_MoveWindow(-1, TRUE); return 2; } else @@ -2188,19 +2209,19 @@ u32 sub_81C8658(void) } } -u32 sub_81C868C(void) +u32 MatchCall_MoveCursorDown(void) { - struct UnknownSubSubStruct_81C81D4 *structPtr; - structPtr = sub_81C8644(); + struct MatchCallWindowState *structPtr; + structPtr = GetMatchCallWindowStruct(); - if (structPtr->unk0 + structPtr->unk6 < structPtr->unk2 - 1) + if (structPtr->windowTopIndex + structPtr->selectedIndexOffset < structPtr->listLength - 1) { - if (structPtr->unk6 < structPtr->unk8 - 1) + if (structPtr->selectedIndexOffset < structPtr->visibleEntries - 1) { - structPtr->unk6++; + structPtr->selectedIndexOffset++; return 1; } - else if (!sub_81C84C0()) + else if (!ShouldShowDownArrow()) { return 0; } @@ -2209,28 +2230,28 @@ u32 sub_81C868C(void) { return 0; } - sub_81C84E8(1, 1); + MatchCall_MoveWindow(1, TRUE); return 2; } -u32 sub_81C86CC(void) +u32 MatchCall_PageUp(void) { - struct UnknownSubSubStruct_81C81D4 *structPtr; - s32 v1; + struct MatchCallWindowState *structPtr; + s32 scroll; - structPtr = sub_81C8644(); - if (sub_81C84A4()) + structPtr = GetMatchCallWindowStruct(); + if (ShouldShowUpArrow()) { - if (structPtr->unk0 >= structPtr->unk8) - v1 = structPtr->unk8; + if (structPtr->windowTopIndex >= structPtr->visibleEntries) + scroll = structPtr->visibleEntries; else - v1 = structPtr->unk0; - sub_81C84E8(v1 * -1, 1); + scroll = structPtr->windowTopIndex; + MatchCall_MoveWindow(scroll * -1, TRUE); return 2; } - else if (structPtr->unk6 != 0) + else if (structPtr->selectedIndexOffset != 0) { - structPtr->unk6 = 0; + structPtr->selectedIndexOffset = 0; return 1; } else @@ -2239,64 +2260,64 @@ u32 sub_81C86CC(void) } } -u32 sub_81C870C(void) +u32 MatchCall_PageDown(void) { - struct UnknownSubSubStruct_81C81D4 *structPtr; - structPtr = sub_81C8644(); + struct MatchCallWindowState *structPtr; + structPtr = GetMatchCallWindowStruct(); - if (sub_81C84C0()) + if (ShouldShowDownArrow()) { - s32 v1; - s32 v2; + s32 scroll; + s32 windowBottomIndex; s32 v3; - v2 = structPtr->unk0 + structPtr->unk8; - v1 = structPtr->unk4 - structPtr->unk0; - if (v2 <= structPtr->unk4) - v1 = structPtr->unk8; - sub_81C84E8(v1, 1); + windowBottomIndex = structPtr->windowTopIndex + structPtr->visibleEntries; + scroll = structPtr->unk4 - structPtr->windowTopIndex; + if (windowBottomIndex <= structPtr->unk4) + scroll = structPtr->visibleEntries; + MatchCall_MoveWindow(scroll, TRUE); return 2; } else { - s32 v1; - s32 v2; - if (structPtr->unk2 >= structPtr->unk8) + s32 cursor; + s32 lastVisibleIndex; + if (structPtr->listLength >= structPtr->visibleEntries) { - v1 = structPtr->unk6; - v2 = structPtr->unk8; + cursor = structPtr->selectedIndexOffset; + lastVisibleIndex = structPtr->visibleEntries; } else { - v1 = structPtr->unk6; - v2 = structPtr->unk2; + cursor = structPtr->selectedIndexOffset; + lastVisibleIndex = structPtr->listLength; } - v2 -= 1; - if (v1 >= v2) + lastVisibleIndex -= 1; + if (cursor >= lastVisibleIndex) { return 0; } else { - structPtr->unk6 = v2; + structPtr->selectedIndexOffset = lastVisibleIndex; return 1; } } } -u32 sub_81C875C(void) +u32 GetSelectedMatchCall(void) { - struct UnknownSubSubStruct_81C81D4 *structPtr; - structPtr = sub_81C8644(); + struct MatchCallWindowState *structPtr; + structPtr = GetMatchCallWindowStruct(); - return structPtr->unk0 + structPtr->unk6; + return structPtr->windowTopIndex + structPtr->selectedIndexOffset; } -u32 sub_81C8770(void) +u32 GetMatchCallListTopIndex(void) { - struct UnknownSubSubStruct_81C81D4 *structPtr; - structPtr = sub_81C8644(); + struct MatchCallWindowState *structPtr; + structPtr = GetMatchCallWindowStruct(); - return structPtr->unk0; + return structPtr->windowTopIndex; } void sub_81C877C(void) @@ -2304,7 +2325,7 @@ void sub_81C877C(void) struct UnknownSubStruct_81C81D4 *structPtr; structPtr = GetSubstructPtr(0x11); structPtr->unk89C = 0; - structPtr->unk8A0 = sub_81C7078(sub_81C8870, 6); + structPtr->unk8A0 = CreateLoopedTask(LoopedTask_sub_81C8870, 6); } void sub_81C87AC(u16 a0) @@ -2312,11 +2333,11 @@ void sub_81C87AC(u16 a0) u16 temp; struct UnknownSubStruct_81C81D4 *structPtr; structPtr = GetSubstructPtr(0x11); - temp = structPtr->unk888.unk0; + temp = structPtr->unk888.windowTopIndex; temp += a0; - structPtr->unk888.unk0 = temp; + structPtr->unk888.windowTopIndex = temp; structPtr->unk89C = 0; - structPtr->unk8A0 = sub_81C7078(sub_81C8958, 6); + structPtr->unk8A0 = CreateLoopedTask(LoopedTask_sub_81C8958, 6); } void sub_81C87F0(void) @@ -2324,27 +2345,27 @@ void sub_81C87F0(void) struct UnknownSubStruct_81C81D4 *structPtr; structPtr = GetSubstructPtr(0x11); structPtr->unk89C = 0; - structPtr->unk8A0 = sub_81C7078(sub_81C8A28, 6); + structPtr->unk8A0 = CreateLoopedTask(LoopedTask_sub_81C8A28, 6); } bool32 sub_81C8820(void) { struct UnknownSubStruct_81C81D4 *structPtr; structPtr = GetSubstructPtr(0x11); - return sub_81C70D8(structPtr->unk8A0); + return IsLoopedTaskActive(structPtr->unk8A0); } void sub_81C8838(void) { struct UnknownSubStruct_81C81D4 *structPtr; - struct UnknownSubSubStruct_81C81D4 *subStr; + struct MatchCallWindowState *subStr; structPtr = GetSubstructPtr(0x11); subStr = &structPtr->unk888; - structPtr->unk0.unk38(structPtr->unk0.unk0.windowId, subStr->unk0 + subStr->unk6, (structPtr->unk0.unk0.unkA + subStr->unk6) & 0xF); + structPtr->unk0.unk38(structPtr->unk0.unk0.windowId, subStr->windowTopIndex + subStr->selectedIndexOffset, (structPtr->unk0.unk0.unkA + subStr->selectedIndexOffset) & 0xF); CopyWindowToVram(structPtr->unk0.unk0.windowId, 1); } -u32 sub_81C8870(s32 a0) +u32 LoopedTask_sub_81C8870(s32 a0) { struct UnknownSubStruct_81C81D4 *structPtr; u16 v1; @@ -2360,7 +2381,7 @@ u32 sub_81C8870(s32 a0) ToggleMatchCallArrows(&structPtr->unk0, 1); // fall-through case 1: - if (structPtr->unk89C != structPtr->unk888.unk6) + if (structPtr->unk89C != structPtr->unk888.selectedIndexOffset) sub_81C8B70(&structPtr->unk0.unk0, structPtr->unk89C, 1); structPtr->unk89C++; @@ -2369,36 +2390,36 @@ u32 sub_81C8870(s32 a0) if (IsDma3ManagerBusyWithBgCopy()) return 2; - if (structPtr->unk89C != structPtr->unk888.unk8) + if (structPtr->unk89C != structPtr->unk888.visibleEntries) return 6; - if (structPtr->unk888.unk6 != 0) - sub_81C8B70(&structPtr->unk0.unk0, structPtr->unk89C, structPtr->unk888.unk6); + if (structPtr->unk888.selectedIndexOffset != 0) + sub_81C8B70(&structPtr->unk0.unk0, structPtr->unk89C, structPtr->unk888.selectedIndexOffset); return 0; case 3: if (IsDma3ManagerBusyWithBgCopy()) return 2; - temp = &structPtr->unk888.unk6; + temp = &structPtr->unk888.selectedIndexOffset; v1 = *temp; if (v1 == 0) return 4; - sub_81C84E8(v1, 0); + MatchCall_MoveWindow(v1, FALSE); return 0; case 4: v2 = sub_81C8630(); if (v2) return 2; - structPtr->unk888.unk6 = v2; + structPtr->unk888.selectedIndexOffset = v2; return 4; default: return 4; } } -u32 sub_81C8958(s32 a0) +u32 LoopedTask_sub_81C8958(s32 a0) { struct UnknownSubStruct_81C81D4 *structPtr; structPtr = GetSubstructPtr(0x11); @@ -2437,10 +2458,10 @@ u32 sub_81C8958(s32 a0) return 0; } -u32 sub_81C8A28(s32 a0) +u32 LoopedTask_sub_81C8A28(s32 a0) { struct UnknownSubStruct_81C81D4 *structPtr; - struct UnknownSubSubStruct_81C81D4 *subPtr888; + struct MatchCallWindowState *subPtr888; register struct UnknownInnerStruct_81C81D4 *subPtr0 asm("r2"); s32 v4; @@ -2470,17 +2491,17 @@ u32 sub_81C8A28(s32 a0) v3 = &structPtr->unk89C; v1 = *v3 + 1; *v3 = v1; - if (v1 < structPtr->unk888.unk8) + if (v1 < structPtr->unk888.visibleEntries) { sub_81C8B70(&subPtr0->unk0, v1, 1); return 2; } *v3 = 0; - if (subPtr888->unk2 <= subPtr888->unk8) + if (subPtr888->listLength <= subPtr888->visibleEntries) { register u32 temp asm("r0"); - temp = subPtr888->unk0; + temp = subPtr888->windowTopIndex; if (temp == 0) return 9; v2 = temp; @@ -2488,20 +2509,20 @@ u32 sub_81C8A28(s32 a0) else { register s32 temp asm("r1"); - v2 = subPtr888->unk0 + subPtr888->unk8; - temp = (s32)subPtr888->unk2; + v2 = subPtr888->windowTopIndex + subPtr888->visibleEntries; + temp = (s32)subPtr888->listLength; if (v2 <= temp) return 9; v2 -= temp; } v4 = v2 * -1; sub_81C8B70(&subPtr0->unk0, v4, v2); - subPtr888->unk6 = v2; + subPtr888->selectedIndexOffset = v2; *v3 = v4; return 0; } case 2: - sub_81C84E8(structPtr->unk89C, 0); + MatchCall_MoveWindow(structPtr->unk89C, FALSE); return 0; case 3: if (sub_81C8630()) @@ -2510,14 +2531,14 @@ u32 sub_81C8A28(s32 a0) structPtr->unk89C = 0; return 1; case 4: - sub_81C83AC(subPtr888->unk10, subPtr888->unk0 + structPtr->unk89C, 1, subPtr888->unkC, structPtr->unk89C, &structPtr->unk0); + sub_81C83AC(subPtr888->unk10, subPtr888->windowTopIndex + structPtr->unk89C, 1, subPtr888->unkC, structPtr->unk89C, &structPtr->unk0); return 0; case 5: if (sub_81C83E0()) return 2; v4 = ++structPtr->unk89C; - if (v4 >= subPtr888->unk2 || v4 >= subPtr888->unk8) + if (v4 >= subPtr888->listLength || v4 >= subPtr888->visibleEntries) return 1; return 9; case 6: @@ -2593,24 +2614,24 @@ void sub_81C8C64(struct UnknownSubSubStruct_0203CF40 *a0, u32 a1) } } -void sub_81C8CB4(struct UnknownSubSubStruct_81C81D4 *a0, struct UnknownInnerStruct_81C81D4 *a1) +void sub_81C8CB4(struct MatchCallWindowState *a0, struct UnknownInnerStruct_81C81D4 *a1) { u8 colors[3]; memcpy(colors, sPokenavColors_0861FBE4, ARRAY_COUNT(sPokenavColors_0861FBE4)); - a1->unk34(a0->unk10 + a0->unkC * a0->unk0, a1->unkTextBuffer); - a1->unk38(a1->unk0.windowId, a0->unk0, a1->unk0.unkA); + a1->unk34(a0->unk10 + a0->unkC * a0->windowTopIndex, a1->unkTextBuffer); + a1->unk38(a1->unk0.windowId, a0->windowTopIndex, a1->unk0.unkA); FillWindowPixelRect(a1->unk0.windowId, PIXEL_FILL(4), 0, a1->unk0.unkA * 16, a1->unk0.unk4 * 8, 16); AddTextPrinterParameterized3(a1->unk0.windowId, a1->unk0.fontId, 8, (a1->unk0.unkA * 16) + 1, colors, TEXT_SPEED_FF, a1->unkTextBuffer); sub_81C8C64(&a1->unk0, 1); CopyWindowRectToVram(a1->unk0.windowId, 3, 0, a1->unk0.unkA * 2, a1->unk0.unk4, 2); } -void sub_81C8D4C(struct UnknownSubSubStruct_81C81D4 *a0, struct UnknownInnerStruct_81C81D4 *a1) +void sub_81C8D4C(struct MatchCallWindowState *a0, struct UnknownInnerStruct_81C81D4 *a1) { - a1->unk34(a0->unk10 + a0->unkC * a0->unk0, a1->unkTextBuffer); + a1->unk34(a0->unk10 + a0->unkC * a0->windowTopIndex, a1->unkTextBuffer); FillWindowPixelRect(a1->unk0.windowId, PIXEL_FILL(1), 0, a1->unk0.unkA * 16, a1->unk0.unk4 * 8, 16); AddTextPrinterParameterized(a1->unk0.windowId, a1->unk0.fontId, a1->unkTextBuffer, 8, a1->unk0.unkA * 16 + 1, TEXT_SPEED_FF, NULL); sub_81C8C64(&a1->unk0, 0); @@ -2643,14 +2664,14 @@ void PrintMatchCallFieldNames(struct UnknownInnerStruct_81C81D4 *a0, u32 fieldId CopyWindowRectToVram(a0->unk0.windowId, 2, 0, r4 << 1, a0->unk0.unk4, 2); } -void sub_81C8E54(struct UnknownSubSubStruct_81C81D4 *a0, struct UnknownInnerStruct_81C81D4 *a1, u32 a2) +void sub_81C8E54(struct MatchCallWindowState *a0, struct UnknownInnerStruct_81C81D4 *a1, u32 a2) { const u8 *str; u32 r6; r6 = (a1->unk0.unkA + sUnknown_0861FBF7[a2]) & 0xF; - str = sub_81CAFD8(a0->unk0, a2); + str = sub_81CAFD8(a0->windowTopIndex, a2); if (str != NULL) { sub_81DB620(a1->unk0.windowId, 1, r6 * 2, a1->unk0.unk4 - 1, 2); AddTextPrinterParameterized(a1->unk0.windowId, 7, str, 2, (r6 << 4) + 1, TEXT_SPEED_FF, NULL); @@ -2670,7 +2691,7 @@ void sub_81C8ED0(void) sub_81C795C(sMatchcallArrowPalette); } -void sub_81C8EF8(struct UnknownSubSubStruct_81C81D4 *a0, struct UnknownInnerStruct_81C81D4 *a1) +void sub_81C8EF8(struct MatchCallWindowState *a0, struct UnknownInnerStruct_81C81D4 *a1) { register u32 spriteId asm("r3"); s16 temp; @@ -2679,7 +2700,7 @@ void sub_81C8EF8(struct UnknownSubSubStruct_81C81D4 *a0, struct UnknownInnerStru a1->rightArrow = &gSprites[spriteId]; temp = a1->unk0.unk2 * 8 + (a1->unk0.unk4 - 1) * 4; - spriteId = (u8)CreateSprite(&sMatchCallUpDownArrowSprite, temp, a1->unk0.unk3 * 8 + a0->unk8 * 16, 7); + spriteId = (u8)CreateSprite(&sMatchCallUpDownArrowSprite, temp, a1->unk0.unk3 * 8 + a0->visibleEntries * 16, 7); a1->downArrow = &gSprites[spriteId]; a1->downArrow->oam.tileNum += 2; a1->downArrow->callback = SpriteCB_MatchCallDownArrow; @@ -2722,12 +2743,12 @@ void SpriteCB_MatchCallRightArrow(struct Sprite *sprite) { struct UnknownSubStruct_81C81D4 *structPtr; structPtr = GetSubstructPtr(0x11); - sprite->pos2.y = structPtr->unk888.unk6 << 4; + sprite->pos2.y = structPtr->unk888.selectedIndexOffset << 4; } void SpriteCB_MatchCallDownArrow(struct Sprite *sprite) { - if (sprite->data[7] == 0 && sub_81C84C0()) + if (sprite->data[7] == 0 && ShouldShowDownArrow()) sprite->invisible = FALSE; else sprite->invisible = TRUE; @@ -2745,7 +2766,7 @@ void SpriteCB_MatchCallDownArrow(struct Sprite *sprite) void SpriteCB_MatchCallUpArrow(struct Sprite *sprite) { - if (sprite->data[7] == 0 && sub_81C84A4()) + if (sprite->data[7] == 0 && ShouldShowUpArrow()) sprite->invisible = FALSE; else sprite->invisible = TRUE; @@ -2769,44 +2790,44 @@ void ToggleMatchCallVerticalArrows(bool32 shouldHide) structPtr->unk0.downArrow->data[7] = shouldHide; } -void sub_81C9160(struct UnknownSubSubStruct_81C81D4 *a0, struct UnknownStruct_81C9160 *a1) +void sub_81C9160(struct MatchCallWindowState *a0, struct MatchCallListTemplate *a1) { u32 unused1 = a0->unk10 = a1->unk0; u32 v0 = a1->unk6; u32 zero = 0; - u32 unused2 = a0->unk0 = v0; - u32 v1 = a0->unk2 = a1->unk4; + u32 unused2 = a0->windowTopIndex = v0; + u32 v1 = a0->listLength = a1->unk4; a0->unkC = a1->unk8; - a0->unk8 = a1->unkC; - if (a0->unk8 >= (u16)v1) + a0->visibleEntries = a1->unkC; + if (a0->visibleEntries >= (u16)v1) { - a0->unk0 = 0; + a0->windowTopIndex = 0; a0->unk4 = 0; - a0->unk6 = v0; + a0->selectedIndexOffset = v0; } else { s32 v2; - a0->unk4 = a0->unk2 - a0->unk8; - v2 = a0->unk0 + a0->unk8; - if (v2 > a0->unk2) { - a0->unk6 = v2 - a0->unk2; - a0->unk0 = v0 - a0->unk6; + a0->unk4 = a0->listLength - a0->visibleEntries; + v2 = a0->windowTopIndex + a0->visibleEntries; + if (v2 > a0->listLength) { + a0->selectedIndexOffset = v2 - a0->listLength; + a0->windowTopIndex = v0 - a0->selectedIndexOffset; } else { - a0->unk6 = 0; + a0->selectedIndexOffset = 0; } } } -u32 sub_81C91AC(struct UnknownInnerStruct_81C81D4 *a0, const struct BgTemplate *a1, struct UnknownStruct_81C9160 *a2, s32 a3) +u32 sub_81C91AC(struct UnknownInnerStruct_81C81D4 *a0, const struct BgTemplate *a1, struct MatchCallListTemplate *a2, s32 a3) { register u32 raw_bg asm("r4") = ((a1->bg) << 30); u8 bg = raw_bg >> 30; u32 unknown = 0; - struct WindowTemplate template; + struct WindowTemplate window; u8 bg_again; a0->unk0.bg = bg; @@ -2819,15 +2840,15 @@ u32 sub_81C91AC(struct UnknownInnerStruct_81C81D4 *a0, const struct BgTemplate * a0->unk0.unk4 = a2->unkA; a0->unk0.fontId = a2->unkE; - template.bg = raw_bg >> 30; - template.tilemapLeft = a2->unk9; - template.tilemapTop = 0; - template.width = a2->unkA; - template.height = 32; - template.paletteNum = a2->unkD; - template.baseBlock = a3 + 2; - - a0->unk0.windowId = AddWindow(&template); + window.bg = raw_bg >> 30; + window.tilemapLeft = a2->unk9; + window.tilemapTop = 0; + window.width = a2->unkA; + window.height = 32; + window.paletteNum = a2->unkD; + window.baseBlock = a3 + 2; + + a0->unk0.windowId = AddWindow(&window); if (a0->unk0.windowId == 0xFF) { return 0; -- cgit v1.2.3 From ddfe0f91cff4c7b1040d357b23b8987dfdebfcac Mon Sep 17 00:00:00 2001 From: Phlosioneer Date: Sat, 6 Apr 2019 23:34:30 -0400 Subject: Document decompiled parts of the pokenav main menu --- src/menu.c | 2 +- src/pokenav.c | 314 ++++++++++++++++++++++++++++++---------------------------- 2 files changed, 163 insertions(+), 153 deletions(-) (limited to 'src') diff --git a/src/menu.c b/src/menu.c index b04572b81..c5bfe890e 100644 --- a/src/menu.c +++ b/src/menu.c @@ -1921,7 +1921,7 @@ void sub_8199D3C(void *ptr, int delta, int width, int height, bool32 is8BPP) } } -void sub_8199D98(void) +void ResetBgPositions(void) { ChangeBgX(0, 0, 0); ChangeBgX(1, 0, 0); diff --git a/src/pokenav.c b/src/pokenav.c index 403218178..aab827074 100644 --- a/src/pokenav.c +++ b/src/pokenav.c @@ -26,10 +26,21 @@ 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 +}; + // Return values of LoopedTask functions. -#define LT_INC_AND_STOP 0 +#define LT_INC_AND_PAUSE 0 #define LT_INC_AND_CONTINUE 1 -#define LT_STOP 2 +#define LT_PAUSE 2 #define LT_CONTINUE 3 #define LT_FINISH 4 #define LT_SET_STATE(newState) (newState + 5) @@ -72,7 +83,7 @@ struct MatchCallWindowState { }; // Generally at index 0. -struct UnknownSubStruct_0203CF40 +struct PokenavMainMenuResources { void (*unk0)(u32); u32 (*unk4)(void); @@ -80,7 +91,7 @@ struct UnknownSubStruct_0203CF40 u32 currentTaskId; u32 unk10; u32 unk14; - struct Sprite *unk18; + struct Sprite *spinningNavgear; struct Sprite *unk1C[2]; struct Sprite *unk24[2]; u8 tilemapBuffer[0x800]; @@ -120,8 +131,8 @@ struct UnknownSubStruct_81C81D4 struct PokenavResources { - u32 (*field0)(void); - u32 field4; + u32 (*currentMenuCb1)(void); + u32 currentMenuIndex; u16 mode; u16 fieldA; bool32 hasAnyRibbons; @@ -154,8 +165,7 @@ struct MatchCallListTemplate extern u32 sub_81C9430(void); extern void sub_81CAADC(void); extern u32 sub_81C99D4(void); -extern void sub_8199D98(void); -extern void sub_81C7D28(void); +extern void InitHoenMapHeaderSprites(void); extern u32 sub_81C9298(void); extern u32 sub_81C941C(void); extern u32 sub_81C9924(void); @@ -213,7 +223,7 @@ extern u32 sub_81D04B8(void); extern u32 sub_81D09F4(void); extern u32 sub_81CFA04(void); extern u32 sub_81CFE08(void); -extern void sub_81C7CB4(struct Sprite* sprite); +extern void SpriteCB_SpinningNavgear(struct Sprite* sprite); extern void sub_81CBD48(u16 windowId, u32 a1); extern u8 *sub_81CAFD8(u16 a0, u32 a1); extern void sub_81DB620(u32 windowId, u32 a1, u32 a2, u32 a3, u32 a4); @@ -244,35 +254,35 @@ void sub_81C837C(struct MatchCallWindowState *a0, struct UnknownInnerStruct_81C8 void sub_81C835C(struct UnknownSubSubStruct_0203CF40 *a0); void sub_81C82E4(struct UnknownSubStruct_81C81D4 *a0); u32 LoopedTask_sub_81C8254(s32 a0); -u32 LoopedTask_sub_81C791C(s32 a0); -bool32 sub_81C756C(u32 a0); -bool32 sub_81C76C4(void); +u32 LoopedTask_ScrollMenuHeaderUp(s32 a0); +bool32 SetActivePokenavMenu(u32 a0); +bool32 InitPokenavMainMenu(void); static bool32 AnyMonHasRibbon(void); u32 sub_81C75E0(void); u32 sub_81C75D4(void); -u32 sub_81C76FC(void); +u32 PokenavMainMenuLoopedTaskIsActive(void); u32 sub_81C786C(void); -u32 LoopedTask_sub_81C7764(s32 a0); -u32 LoopedTask_sub_81C78D4(s32 a0); -bool32 sub_81C7738(void); +u32 LoopedTask_InitPokenavMenu(s32 a0); +u32 LoopedTask_ScrollMenuHeaderDown(s32 a0); +bool32 WaitForPokenavShutdownFade(void); void CopyPaletteIntoBufferUnfaded(const u16 *palette, u32 a1, u32 a2); void sub_81C7834(void *func1, void *func2); -static void InitMainStruct(struct PokenavResources *a0); -void FreeSubstruct(u32 index); +static void InitPokenavResources(struct PokenavResources *a0); +void FreePokenavSubstruct(u32 index); void sub_81C7850(u32 a0); void sub_81C7BF8(u32 a0); void Task_RunLoopedTask_LinkMode(u8 a0); void Task_RunLoopedTask(u8 taskId); void sub_81C742C(u8 taskId); -void sub_81C7710(void); +void ShutdownPokenav(void); static void InitKeys_(void); -static void FreeVars(void); +static void FreePokenavResources(void); static void VBlankCB_Pokenav(void); static void CB2_Pokenav(void); -void sub_81C7C28(void); +void InitPokenavMainMenuResources(void); void sub_81C72BC(void); void sub_81C7B74(void); -void sub_81C7C94(void); +void CleanupPokenavMainMenuResources(void); void sub_81C7F24(u32 arg0); void sub_81C7E58(u32 arg0); void sub_81C8110(bool32 arg0); @@ -283,7 +293,7 @@ void sub_81C814C(struct Sprite *sprite, s32 arg1, s32 arg2, s32 arg3); void sub_81C817C(struct Sprite *sprite); // Const rom data. -u32 (*const gUnknown_0861F3EC[15][7])(void) = +u32 (*const PokenavMenuCallbacks[15][7])(void) = { { sub_81C9298, @@ -422,11 +432,11 @@ u32 (*const gUnknown_0861F3EC[15][7])(void) = }, }; -const u16 gUnknown_0861F590[] = INCBIN_U16("graphics/pokenav/icon2.gbapal"); -const u32 gUnknown_0861F5B0[] = INCBIN_U32("graphics/pokenav/icon2.4bpp.lz"); -const u32 gUnknown_0861F994[] = INCBIN_U32("graphics/pokenav/icon2_unused.4bpp.lz"); +const u16 gSpinningNavgearPaletteData[] = INCBIN_U16("graphics/pokenav/icon2.gbapal"); +const u32 gSpinningNavgearGfx[] = INCBIN_U32("graphics/pokenav/icon2.4bpp.lz"); +const u32 gUnused_SpinningNavgearGfx2[] = INCBIN_U32("graphics/pokenav/icon2_unused.4bpp.lz"); -const struct BgTemplate gUnknown_0861FA04[] = +const struct BgTemplate gPokenavMainMenuBgTemplates[] = { { .bg = 0, @@ -482,25 +492,25 @@ const u8 gMenuButtonReminderColor[4] = 4, 1, 2, 0 }; -static const struct CompressedSpriteSheet sUnknown_0861FA4C[] = +static const struct CompressedSpriteSheet gSpinningNavgearSpriteSheet[] = { { - .data = gUnknown_0861F5B0, + .data = gSpinningNavgearGfx, .size = 0x1000, .tag = 0, } }; -static const struct SpritePalette sUnknown_0861FA54[] = +static const struct SpritePalette gSpinningNavgearPalette[] = { { - .data = gUnknown_0861F590, + .data = gSpinningNavgearPaletteData, .tag = 0, }, {} }; -static const struct CompressedSpriteSheet sUnknown_0861FA64 = +static const struct CompressedSpriteSheet sPokenavHoenMapLeftHeaderSpriteSheet = { .data = gPokenavLeftHeaderHoennMap_Gfx, .size = 0xC00, @@ -573,7 +583,7 @@ static const struct CompressedSpritePalette_ sUnknown_0861FA9C[] = } }; -static const struct OamData sUnknown_0861FAD4 = +static const struct OamData sSpinningNavgearSpriteOam = { .y = 0, .affineMode = 0, @@ -590,7 +600,7 @@ static const struct OamData sUnknown_0861FAD4 = .affineParam = 0 }; -static const union AnimCmd sUnknown_0861FADC[] = +static const union AnimCmd sSpinningNavgarAnims[] = { ANIMCMD_FRAME(0, 8), ANIMCMD_FRAME(16, 8), @@ -603,23 +613,23 @@ static const union AnimCmd sUnknown_0861FADC[] = ANIMCMD_JUMP(0) }; -static const union AnimCmd *const sUnknown_0861FB00[] = +static const union AnimCmd *const sSpinningNavgarAnimTable[] = { - sUnknown_0861FADC + sSpinningNavgarAnims }; -static const struct SpriteTemplate sUnknown_0861FB04 = +static const struct SpriteTemplate sSpinningNavgearSpriteTemplate = { .tileTag = 0, .paletteTag = 0, - .oam = &sUnknown_0861FAD4, - .anims = sUnknown_0861FB00, + .oam = &sSpinningNavgearSpriteOam, + .anims = sSpinningNavgarAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_81C7CB4 + .callback = SpriteCB_SpinningNavgear }; -static const struct OamData sUnknown_0861FB1C = +static const struct OamData sPokenavLeftHeaderHoenMapSpriteOam = { .y = 0, .affineMode = 0, @@ -653,11 +663,11 @@ static const struct OamData sUnknown_0861FB24 = .affineParam = 0 }; -static const struct SpriteTemplate sUnknown_0861FB2C = +static const struct SpriteTemplate sPokenavLeftHeaderHoenMapSpriteTemplate = { .tileTag = 2, .paletteTag = 1, - .oam = &sUnknown_0861FB1C, + .oam = &sPokenavLeftHeaderHoenMapSpriteOam, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, @@ -828,7 +838,7 @@ void Task_RunLoopedTask(u8 taskId) case LT_INC_AND_CONTINUE: (*state)++; break; - case LT_INC_AND_STOP: + case LT_INC_AND_PAUSE: (*state)++; return; case LT_FINISH: @@ -840,13 +850,13 @@ void Task_RunLoopedTask(u8 taskId) break; case LT_CONTINUE: break; - case LT_STOP: + case LT_PAUSE: return; } } } -// Every "Continue" action stops instead. +// Every "Continue" action pauses instead. void Task_RunLoopedTask_LinkMode(u8 taskId) { LoopedTask task; @@ -861,7 +871,7 @@ void Task_RunLoopedTask_LinkMode(u8 taskId) action = task(*state); switch (action) { - case LT_INC_AND_STOP: + case LT_INC_AND_PAUSE: case LT_INC_AND_CONTINUE: (*state)++; break; @@ -872,7 +882,7 @@ void Task_RunLoopedTask_LinkMode(u8 taskId) default: *state = LOOPED_TASK_DECODE_STATE(action); break; - case LT_STOP: + case LT_PAUSE: case LT_CONTINUE: break; } @@ -887,7 +897,7 @@ void CB2_InitPokeNav(void) } else { - InitMainStruct(gPokenavResources); + InitPokenavResources(gPokenavResources); ResetTasks(); SetVBlankCallback(NULL); CreateTask(sub_81C742C, 0); @@ -915,7 +925,7 @@ void sub_81C72BC(void) } else { - InitMainStruct(gPokenavResources); + InitPokenavResources(gPokenavResources); gPokenavResources->mode = MODE_FORCE_CALL_1; ResetTasks(); ResetSpriteData(); @@ -927,19 +937,18 @@ void sub_81C72BC(void) } } -static void FreeVars(void) +static void FreePokenavResources(void) { s32 i; for (i = 0; i < SUBSTRUCT_COUNT; i++) - FreeSubstruct(i); + FreePokenavSubstruct(i); FREE_AND_SET_NULL(gPokenavResources); InitKeys(); } -// Clears PokenavResources -static void InitMainStruct(struct PokenavResources *a0) +static void InitPokenavResources(struct PokenavResources *a0) { s32 i; @@ -947,9 +956,9 @@ static void InitMainStruct(struct PokenavResources *a0) a0->field10[i] = NULL; a0->mode = MODE_NORMAL; - a0->field4 = 0; + a0->currentMenuIndex = 0; a0->hasAnyRibbons = AnyMonHasRibbon(); - a0->field0 = NULL; + a0->currentMenuCb1 = NULL; } static bool32 AnyMonHasRibbon(void) @@ -1004,13 +1013,14 @@ void sub_81C742C(u8 taskId) switch (data[0]) { case 0: - sub_81C76C4(); + InitPokenavMainMenu(); data[0] = 1; break; case 1: - if (sub_81C76FC()) + // Wait for LoopedTask_InitPokenavMenu to finish + if (PokenavMainMenuLoopedTaskIsActive()) break; - sub_81C756C(UNKNOWN_OFFSET); + SetActivePokenavMenu(0 + UNKNOWN_OFFSET); data[0] = 4; break; case 2: @@ -1021,20 +1031,20 @@ void sub_81C742C(u8 taskId) v1 = sub_81C75E0(); if (v1 == -1) { - sub_81C7710(); + ShutdownPokenav(); data[0] = 5; } else if (v1 >= UNKNOWN_OFFSET) { - gUnknown_0861F3EC[gPokenavResources->field4][6](); - gUnknown_0861F3EC[gPokenavResources->field4][5](); - if (sub_81C756C(v1)) + PokenavMenuCallbacks[gPokenavResources->currentMenuIndex][NAVMENU_CB_UNK_6](); + PokenavMenuCallbacks[gPokenavResources->currentMenuIndex][NAVMENU_CB_UNK_5](); + if (SetActivePokenavMenu(v1)) { data[0] = 4; } else { - sub_81C7710(); + ShutdownPokenav(); data[0] = 5; } } @@ -1050,12 +1060,12 @@ void sub_81C742C(u8 taskId) data[0] = 3; break; case 5: - if (!sub_81C7738()) + if (!WaitForPokenavShutdownFade()) { bool32 calledFromScript = (gPokenavResources->mode != MODE_NORMAL); sub_81C9430(); - FreeVars(); + FreePokenavResources(); if (calledFromScript) SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); else @@ -1065,19 +1075,19 @@ void sub_81C742C(u8 taskId) } } -bool32 sub_81C756C(u32 a0) +bool32 SetActivePokenavMenu(u32 indexWithOffset) { - u32 index = a0 - UNKNOWN_OFFSET; + u32 index = indexWithOffset - UNKNOWN_OFFSET; InitKeys_(); - if (!gUnknown_0861F3EC[index][0]()) + if (!PokenavMenuCallbacks[index][NAVMENU_CB_UNK_0]()) return FALSE; - if (!gUnknown_0861F3EC[index][2]()) + if (!PokenavMenuCallbacks[index][NAVMENU_CB_UNK_2]()) return FALSE; - sub_81C7834(gUnknown_0861F3EC[index][3], gUnknown_0861F3EC[index][4]); - gPokenavResources->field0 = gUnknown_0861F3EC[index][1]; - gPokenavResources->field4 = index; + sub_81C7834(PokenavMenuCallbacks[index][NAVMENU_CB_UNK_3], PokenavMenuCallbacks[index][NAVMENU_CB_UNK_4]); + gPokenavResources->currentMenuCb1 = PokenavMenuCallbacks[index][NAVMENU_CB_UNK_1]; + gPokenavResources->currentMenuIndex = index; return TRUE; } @@ -1088,7 +1098,7 @@ u32 sub_81C75D4(void) u32 sub_81C75E0(void) { - return gPokenavResources->field0(); + return gPokenavResources->currentMenuCb1(); } static void InitKeys_(void) @@ -1116,7 +1126,7 @@ void *GetSubstructPtr(u32 index) return gPokenavResources->field10[index]; } -void FreeSubstruct(u32 index) +void FreePokenavSubstruct(u32 index) { if (gPokenavResources->field10[index] != NULL) FREE_AND_SET_NULL(gPokenavResources->field10[index]); @@ -1151,39 +1161,39 @@ bool32 CanViewRibbonsMenu(void) return gPokenavResources->hasAnyRibbons; } -bool32 sub_81C76C4(void) +bool32 InitPokenavMainMenu(void) { - struct UnknownSubStruct_0203CF40 *structPtr; + struct PokenavMainMenuResources *structPtr; - structPtr = AllocSubstruct(0, sizeof(struct UnknownSubStruct_0203CF40)); + structPtr = AllocSubstruct(0, sizeof(struct PokenavMainMenuResources)); if (structPtr == NULL) return FALSE; ResetSpriteData(); FreeAllSpritePalettes(); - structPtr->currentTaskId = CreateLoopedTask(LoopedTask_sub_81C7764, 1); + structPtr->currentTaskId = CreateLoopedTask(LoopedTask_InitPokenavMenu, 1); return TRUE; } -u32 sub_81C76FC(void) +u32 PokenavMainMenuLoopedTaskIsActive(void) { - struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0); + struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); return IsLoopedTaskActive(structPtr->currentTaskId); } -void sub_81C7710(void) +void ShutdownPokenav(void) { PlaySE(SE_PN_OFF); sub_81CAADC(); BeginNormalPaletteFade(0xFFFFFFFF, -1, 0, 16, RGB_BLACK); } -bool32 sub_81C7738(void) +bool32 WaitForPokenavShutdownFade(void) { if (!gPaletteFade.active) { sub_81C99D4(); - sub_81C7C94(); + CleanupPokenavMainMenuResources(); FreeAllWindowBuffers(); return FALSE; } @@ -1191,9 +1201,9 @@ bool32 sub_81C7738(void) return TRUE; } -u32 LoopedTask_sub_81C7764(s32 a0) +u32 LoopedTask_InitPokenavMenu(s32 a0) { - struct UnknownSubStruct_0203CF40 *structPtr; + struct PokenavMainMenuResources *structPtr; switch (a0) { @@ -1201,10 +1211,10 @@ u32 LoopedTask_sub_81C7764(s32 a0) SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP); FreeAllWindowBuffers(); ResetBgsAndClearDma3BusyFlags(0); - InitBgsFromTemplates(0, gUnknown_0861FA04, ARRAY_COUNT(gUnknown_0861FA04)); - sub_8199D98(); + InitBgsFromTemplates(0, gPokenavMainMenuBgTemplates, ARRAY_COUNT(gPokenavMainMenuBgTemplates)); + ResetBgPositions(); reset_temp_tile_data_buffers(); - return 1; + return LT_INC_AND_CONTINUE; case 1: structPtr = GetSubstructPtr(0); decompress_and_copy_tile_data_to_vram(0, &gPokenavHeader_Gfx, 0, 0, 0); @@ -1212,29 +1222,29 @@ u32 LoopedTask_sub_81C7764(s32 a0) CopyToBgTilemapBuffer(0, &gPokenavHeader_Tilemap, 0, 0); CopyPaletteIntoBufferUnfaded(gPokenavHeader_Pal, 0, 0x20); CopyBgTilemapBufferToVram(0); - return 0; + return LT_INC_AND_PAUSE; case 2: if (free_temp_tile_data_buffers_if_possible()) - return 2; + return LT_PAUSE; sub_81C7B74(); - return 0; + return LT_INC_AND_PAUSE; case 3: if (IsDma3ManagerBusyWithBgCopy()) - return 2; + return LT_PAUSE; - sub_81C7C28(); - sub_81C7D28(); + InitPokenavMainMenuResources(); + InitHoenMapHeaderSprites(); ShowBg(0); - return 4; + return LT_FINISH; default: - return 4; + return LT_FINISH; } } void sub_81C7834(void *func1, void *func2) // Fix types later. { - struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0); + struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); structPtr->unk0 = func1; structPtr->unk4 = func2; structPtr->unk8 = 0; @@ -1242,57 +1252,57 @@ void sub_81C7834(void *func1, void *func2) // Fix types later. void sub_81C7850(u32 a0) { - struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0); + struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); structPtr->unk8 = 0; structPtr->unk0(a0); } u32 sub_81C786C(void) { - struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0); + struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); return structPtr->unk4(); } void sub_81C7880(void) { - struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0); - structPtr->currentTaskId = CreateLoopedTask(LoopedTask_sub_81C78D4, 4); + struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); + structPtr->currentTaskId = CreateLoopedTask(LoopedTask_ScrollMenuHeaderDown, 4); } void sub_81C78A0(void) { - struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0); - structPtr->currentTaskId = CreateLoopedTask(LoopedTask_sub_81C791C, 4); + struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); + structPtr->currentTaskId = CreateLoopedTask(LoopedTask_ScrollMenuHeaderUp, 4); } -bool32 sub_81C78C0(void) +bool32 MainMenuLoopedTaskIsBusy(void) { - struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0); + struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); return IsLoopedTaskActive(structPtr->currentTaskId); } -u32 LoopedTask_sub_81C78D4(s32 a0) +u32 LoopedTask_ScrollMenuHeaderDown(s32 a0) { switch (a0) { default: - return 4; + return LT_FINISH; case 1: - return 0; + return LT_INC_AND_PAUSE; case 0: - return 0; + return LT_INC_AND_PAUSE; case 2: if (ChangeBgY(0, 384, 1) >= 0x2000u) { ChangeBgY(0, 0x2000, 0); - return 4; + return LT_FINISH; } - return 2; + return LT_PAUSE; } } -u32 LoopedTask_sub_81C791C(s32 a0) +u32 LoopedTask_ScrollMenuHeaderUp(s32 a0) { if (ChangeBgY(0, 384, 2) <= 0) { @@ -1307,7 +1317,7 @@ void CopyPaletteIntoBufferUnfaded(const u16 *palette, u32 bufferOffset, u32 size CpuCopy16(palette, gPlttBufferUnfaded + bufferOffset, size); } -void sub_81C795C(const struct SpritePalette *palettes) +void Pokenav_AllocAndLoadPalettes(const struct SpritePalette *palettes) { const struct SpritePalette *current; u32 index; @@ -1470,7 +1480,7 @@ _081C7AAE:\n\ void sub_81C7AC0(s32 a0) { - struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0); + struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); switch (a0) { @@ -1509,7 +1519,7 @@ void InitBgTemplates(const struct BgTemplate *templates, s32 count) void sub_81C7B74(void) { - struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0); + struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); InitWindows(&gUnknown_0861FA08[0]); structPtr->unk10 = 0; @@ -1520,7 +1530,7 @@ void sub_81C7B74(void) void sub_81C7BA4(u32 a0) { - struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0); + struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); sub_81C7BF8(structPtr->unk10); AddTextPrinterParameterized3(structPtr->unk10, 1, 0, 1, gMenuButtonReminderColor, 0, sMenuButtonReminders[a0]); @@ -1537,66 +1547,66 @@ void sub_81C7BF8(u32 windowId) FillWindowPixelRect(windowId, PIXEL_FILL(5), 0, 0, 0x80, 1); } -void sub_81C7C28(void) +void InitPokenavMainMenuResources(void) { s32 i; u8 spriteId; - struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0); + struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); - for (i = 0; i < ARRAY_COUNT(sUnknown_0861FA4C); i++) - LoadCompressedSpriteSheet(&sUnknown_0861FA4C[i]); + for (i = 0; i < ARRAY_COUNT(gSpinningNavgearSpriteSheet); i++) + LoadCompressedSpriteSheet(&gSpinningNavgearSpriteSheet[i]); - sub_81C795C(sUnknown_0861FA54); + Pokenav_AllocAndLoadPalettes(gSpinningNavgearPalette); structPtr->unk14 = ~1 & ~(0x10000 << IndexOfSpritePaletteTag(0)); - spriteId = CreateSprite(&sUnknown_0861FB04, 220, 12, 0); - structPtr->unk18 = &gSprites[spriteId]; + spriteId = CreateSprite(&sSpinningNavgearSpriteTemplate, 220, 12, 0); + structPtr->spinningNavgear = &gSprites[spriteId]; } -void sub_81C7C94(void) +void CleanupPokenavMainMenuResources(void) { - struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0); + struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); - DestroySprite(structPtr->unk18); + DestroySprite(structPtr->spinningNavgear); FreeSpriteTilesByTag(0); FreeSpritePaletteByTag(0); } -void sub_81C7CB4(struct Sprite *sprite) +void SpriteCB_SpinningNavgear(struct Sprite *sprite) { sprite->pos2.y = (GetBgY(0) / 256u) * -1; } struct Sprite *sub_81C7CCC(void) { - struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0); + struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); - structPtr->unk18->callback = SpriteCallbackDummy; - return structPtr->unk18; + structPtr->spinningNavgear->callback = SpriteCallbackDummy; + return structPtr->spinningNavgear; } void sub_81C7CE4(void) { - struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0); + struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); - structPtr->unk18->pos1.x = 220; - structPtr->unk18->pos1.y = 12; - structPtr->unk18->callback = sub_81C7CB4; - structPtr->unk18->invisible = FALSE; - structPtr->unk18->oam.priority = 0; - structPtr->unk18->subpriority = 0; + structPtr->spinningNavgear->pos1.x = 220; + structPtr->spinningNavgear->pos1.y = 12; + structPtr->spinningNavgear->callback = SpriteCB_SpinningNavgear; + structPtr->spinningNavgear->invisible = FALSE; + structPtr->spinningNavgear->oam.priority = 0; + structPtr->spinningNavgear->subpriority = 0; } -void sub_81C7D28(void) +void InitHoenMapHeaderSprites(void) { s32 i, spriteId; - struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0); + struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); - LoadCompressedSpriteSheet(&sUnknown_0861FA64); + LoadCompressedSpriteSheet(&sPokenavHoenMapLeftHeaderSpriteSheet); AllocSpritePalette(1); AllocSpritePalette(2); for (i = 0; i < 2; i++) { - spriteId = CreateSprite(&sUnknown_0861FB2C, 0, 0, 1); + spriteId = CreateSprite(&sPokenavLeftHeaderHoenMapSpriteTemplate, 0, 0, 1); structPtr->unk1C[i] = &gSprites[spriteId]; structPtr->unk1C[i]->invisible = TRUE; structPtr->unk1C[i]->pos2.x = i * 64; @@ -1620,7 +1630,7 @@ void sub_81C7DFC(u32 arg0) void sub_81C7E14(u32 arg0) { - struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0); + struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); if (arg0 == 4) structPtr->unk1C[1]->oam.tileNum = GetSpriteTileStartByTag(2) + 32; @@ -1630,7 +1640,7 @@ void sub_81C7E14(u32 arg0) void sub_81C7E58(u32 arg0) { - struct UnknownSubStruct_0203CF40 *structPtr; + struct PokenavMainMenuResources *structPtr; u32 size, tag; if (arg0 >= 6) @@ -1690,7 +1700,7 @@ void sub_81C7FC4(u32 arg0, bool32 arg1) void sub_81C7FDC(void) { s32 i; - struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0); + struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); for (i = 0; i < 2; i++) { @@ -1701,7 +1711,7 @@ void sub_81C7FDC(void) bool32 sub_81C8010(void) { - struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0); + struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); if (structPtr->unk1C[0]->callback == SpriteCallbackDummy && structPtr->unk24[0]->callback == SpriteCallbackDummy) return FALSE; @@ -1712,7 +1722,7 @@ bool32 sub_81C8010(void) void sub_81C803C(u32 arg0, bool32 arg1) { s32 var1, var2, i; - struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0); + struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); if (!arg1) var1 = -96, var2 = 32; @@ -1729,7 +1739,7 @@ void sub_81C803C(u32 arg0, bool32 arg1) void sub_81C8088(u32 arg0, bool32 arg1) { s32 var1, var2, i; - struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0); + struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); if (!arg1) var1 = -96, var2 = 16; @@ -1746,7 +1756,7 @@ void sub_81C8088(u32 arg0, bool32 arg1) void sub_81C80D4(bool32 arg0) { s32 var1, var2, i; - struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0); + struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); if (!arg0) var1 = 32, var2 = -96; @@ -1762,7 +1772,7 @@ void sub_81C80D4(bool32 arg0) void sub_81C8110(bool32 arg0) { s32 var1, var2, i; - struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0); + struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); if (!arg0) var1 = 16, var2 = -96; @@ -1836,7 +1846,7 @@ void sub_81C8234(void) structPtr = GetSubstructPtr(0x11); sub_81C8FE0(&structPtr->unk0); RemoveWindow(structPtr->unk0.unk0.windowId); - FreeSubstruct(0x11); + FreePokenavSubstruct(0x11); } u32 LoopedTask_sub_81C8254(s32 a0) @@ -2688,7 +2698,7 @@ void sub_81C8ED0(void) { LoadCompressedSpriteSheet(ptr); } - sub_81C795C(sMatchcallArrowPalette); + Pokenav_AllocAndLoadPalettes(sMatchcallArrowPalette); } void sub_81C8EF8(struct MatchCallWindowState *a0, struct UnknownInnerStruct_81C81D4 *a1) -- cgit v1.2.3 From ad2a97935e1c1f4362f0dffa58ef437d191bab4e Mon Sep 17 00:00:00 2001 From: Phlosioneer Date: Sun, 7 Apr 2019 01:32:42 -0400 Subject: Document left header system --- src/pokenav.c | 243 ++++++++++++++++++++++++++++++++-------------------------- 1 file changed, 135 insertions(+), 108 deletions(-) (limited to 'src') diff --git a/src/pokenav.c b/src/pokenav.c index aab827074..6299d2647 100644 --- a/src/pokenav.c +++ b/src/pokenav.c @@ -37,6 +37,31 @@ enum NAVMENU_CB_UNK_6 }; +enum +{ + NAVGEAR_GFX_MAIN_MENU, + NAVGEAR_GFX_CONDITION_MENU, + NAVGEAR_GFX_RIBBONS_MENU, + NAVGEAR_GFX_MATCH_CALL_MENU, + + // One of these is for the zoomed-in map, and the other is for the + // zoomed-out map. Don't know which is which yet. + NAVGEAR_GFX_MAP_MENU_UNK0, + NAVGEAR_GFX_MAP_MENU_UNK1, + + NAVGEAR_GFX_PARTY_MENU, + NAVGEAR_GFX_SEARCH_MENU, + NAVGEAR_GFX_COOL_MENU, + NAVGEAR_GFX_BEAUTY_MENU, + NAVGEAR_GFX_CUTE_MENU, + NAVGEAR_GFX_SMART_MENU, + NAVGEAR_GFX_TOUGH_MENU, + + NAVGEAR_GFX_MENUS_END +}; + +#define NAVGEAR_GFX_SUBMENUS_START NAVGEAR_GFX_PARTY_MENU + // Return values of LoopedTask functions. #define LT_INC_AND_PAUSE 0 #define LT_INC_AND_CONTINUE 1 @@ -92,8 +117,8 @@ struct PokenavMainMenuResources u32 unk10; u32 unk14; struct Sprite *spinningNavgear; - struct Sprite *unk1C[2]; - struct Sprite *unk24[2]; + struct Sprite *leftHeaderSprites[2]; + struct Sprite *submenuLeftHeaderSprites[2]; u8 tilemapBuffer[0x800]; }; @@ -139,8 +164,9 @@ struct PokenavResources void *field10[SUBSTRUCT_COUNT]; }; -// Needed to match u32/u16 tag field difference. -struct CompressedSpritePalette_ +// This struct uses a 32bit tag, and doesn't have a size field. +// Needed to match LoadLeftHeaderGfxForSubMenu. +struct CompressedSpriteSheetNoSize { const u32 *data; // LZ77 compressed palette data u32 tag; @@ -283,14 +309,14 @@ void InitPokenavMainMenuResources(void); void sub_81C72BC(void); void sub_81C7B74(void); void CleanupPokenavMainMenuResources(void); -void sub_81C7F24(u32 arg0); -void sub_81C7E58(u32 arg0); -void sub_81C8110(bool32 arg0); -void sub_81C80D4(bool32 arg0); -void sub_81C803C(u32 arg0, bool32 arg1); -void sub_81C8088(u32 arg0, bool32 arg1); -void sub_81C814C(struct Sprite *sprite, s32 arg1, s32 arg2, s32 arg3); -void sub_81C817C(struct Sprite *sprite); +void LoadLeftHeaderGfxForSubMenu(u32 arg0); +void LoadLeftHeaderGfxForMenu(u32 arg0); +void HideLeftHeaderSubmenuSprites(bool32 arg0); +void HideLeftHeaderSprites(bool32 arg0); +void ShowLeftHeaderSprites(u32 arg0, bool32 arg1); +void ShowLeftHeaderSubmenuSprites(u32 arg0, bool32 arg1); +void MoveLeftHeader(struct Sprite *sprite, s32 arg1, s32 arg2, s32 arg3); +void SpriteCB_MoveLeftHeader(struct Sprite *sprite); // Const rom data. u32 (*const PokenavMenuCallbacks[15][7])(void) = @@ -517,67 +543,67 @@ static const struct CompressedSpriteSheet sPokenavHoenMapLeftHeaderSpriteSheet = .tag = 2 }; -static const struct CompressedSpriteSheet sUnknown_0861FA6C[] = +static const struct CompressedSpriteSheet sPokenavMenuLeftHeaderSpriteSheets[] = { - { + [NAVGEAR_GFX_MAIN_MENU] = { .data = gPokenavLeftHeaderMainMenu_Gfx, .size = 0x20, .tag = 3 }, - { + [NAVGEAR_GFX_CONDITION_MENU] = { .data = gPokenavLeftHeaderCondition_Gfx, .size = 0x20, .tag = 1 }, - { + [NAVGEAR_GFX_RIBBONS_MENU] = { .data = gPokenavLeftHeaderRibbons_Gfx, .size = 0x20, .tag = 2 }, - { + [NAVGEAR_GFX_MATCH_CALL_MENU] = { .data = gPokenavLeftHeaderMatchCall_Gfx, .size = 0x20, .tag = 4 }, - { + [NAVGEAR_GFX_MAP_MENU_UNK0] = { .data = gPokenavLeftHeaderHoennMap_Gfx, .size = 0x20, .tag = 0 }, - { + [NAVGEAR_GFX_MAP_MENU_UNK1] = { .data = gPokenavLeftHeaderHoennMap_Gfx, .size = 0x40, .tag = 0 } }; -static const struct CompressedSpritePalette_ sUnknown_0861FA9C[] = +static const struct CompressedSpriteSheetNoSize sPokenavSubMenuLeftHeaderSpriteSheets[] = { - { + [NAVGEAR_GFX_PARTY_MENU - NAVGEAR_GFX_SUBMENUS_START] = { .data = gPokenavLeftHeaderParty_Gfx, .tag = 1 }, - { + [NAVGEAR_GFX_SEARCH_MENU - NAVGEAR_GFX_SUBMENUS_START] = { .data = gPokenavLeftHeaderSearch_Gfx, .tag = 1 }, - { + [NAVGEAR_GFX_COOL_MENU - NAVGEAR_GFX_SUBMENUS_START] = { .data = gPokenavLeftHeaderCool_Gfx, .tag = 4 }, - { + [NAVGEAR_GFX_BEAUTY_MENU - NAVGEAR_GFX_SUBMENUS_START] = { .data = gPokenavLeftHeaderBeauty_Gfx, .tag = 1 }, - { + [NAVGEAR_GFX_CUTE_MENU - NAVGEAR_GFX_SUBMENUS_START] = { .data = gPokenavLeftHeaderCute_Gfx, .tag = 2 }, - { + [NAVGEAR_GFX_SMART_MENU - NAVGEAR_GFX_SUBMENUS_START] = { .data = gPokenavLeftHeaderSmart_Gfx, .tag = 0 }, - { + [NAVGEAR_GFX_TOUGH_MENU - NAVGEAR_GFX_SUBMENUS_START] = { .data = gPokenavLeftHeaderTough_Gfx, .tag = 0 } @@ -600,7 +626,7 @@ static const struct OamData sSpinningNavgearSpriteOam = .affineParam = 0 }; -static const union AnimCmd sSpinningNavgarAnims[] = +static const union AnimCmd sSpinningNavgearAnims[] = { ANIMCMD_FRAME(0, 8), ANIMCMD_FRAME(16, 8), @@ -613,9 +639,9 @@ static const union AnimCmd sSpinningNavgarAnims[] = ANIMCMD_JUMP(0) }; -static const union AnimCmd *const sSpinningNavgarAnimTable[] = +static const union AnimCmd *const sSpinningNavgearAnimTable[] = { - sSpinningNavgarAnims + sSpinningNavgearAnims }; static const struct SpriteTemplate sSpinningNavgearSpriteTemplate = @@ -623,7 +649,7 @@ static const struct SpriteTemplate sSpinningNavgearSpriteTemplate = .tileTag = 0, .paletteTag = 0, .oam = &sSpinningNavgearSpriteOam, - .anims = sSpinningNavgarAnimTable, + .anims = sSpinningNavgearAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_SpinningNavgear @@ -1573,10 +1599,11 @@ void CleanupPokenavMainMenuResources(void) void SpriteCB_SpinningNavgear(struct Sprite *sprite) { + // If the background starts scrolling, follow it. sprite->pos2.y = (GetBgY(0) / 256u) * -1; } -struct Sprite *sub_81C7CCC(void) +struct Sprite *PauseSpinningNavgearSprite(void) { struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); @@ -1584,7 +1611,7 @@ struct Sprite *sub_81C7CCC(void) return structPtr->spinningNavgear; } -void sub_81C7CE4(void) +void ResumeSpinningNavgearSprite(void) { struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); @@ -1604,28 +1631,28 @@ void InitHoenMapHeaderSprites(void) LoadCompressedSpriteSheet(&sPokenavHoenMapLeftHeaderSpriteSheet); AllocSpritePalette(1); AllocSpritePalette(2); - for (i = 0; i < 2; i++) + for (i = 0; i < (s32)ARRAY_COUNT(structPtr->leftHeaderSprites); i++) { spriteId = CreateSprite(&sPokenavLeftHeaderHoenMapSpriteTemplate, 0, 0, 1); - structPtr->unk1C[i] = &gSprites[spriteId]; - structPtr->unk1C[i]->invisible = TRUE; - structPtr->unk1C[i]->pos2.x = i * 64; + structPtr->leftHeaderSprites[i] = &gSprites[spriteId]; + structPtr->leftHeaderSprites[i]->invisible = TRUE; + structPtr->leftHeaderSprites[i]->pos2.x = i * 64; spriteId = CreateSprite(&sUnknown_0861FB44, 0, 0, 2); - structPtr->unk24[i] = &gSprites[spriteId]; - structPtr->unk24[i]->invisible = TRUE; - structPtr->unk24[i]->pos2.x = i * 32; - structPtr->unk24[i]->pos2.y = 18; - structPtr->unk24[i]->oam.tileNum += (i * 8) + 64; + structPtr->submenuLeftHeaderSprites[i] = &gSprites[spriteId]; + structPtr->submenuLeftHeaderSprites[i]->invisible = TRUE; + structPtr->submenuLeftHeaderSprites[i]->pos2.x = i * 32; + structPtr->submenuLeftHeaderSprites[i]->pos2.y = 18; + structPtr->submenuLeftHeaderSprites[i]->oam.tileNum += (i * 8) + 64; } } -void sub_81C7DFC(u32 arg0) +void LoadLeftHeaderGfxForIndex(u32 arg0) { - if (arg0 < 6) - sub_81C7E58(arg0); + if (arg0 < NAVGEAR_GFX_SUBMENUS_START) + LoadLeftHeaderGfxForMenu(arg0); else - sub_81C7F24(arg0 - 6); + LoadLeftHeaderGfxForSubMenu(arg0 - NAVGEAR_GFX_SUBMENUS_START); } void sub_81C7E14(u32 arg0) @@ -1633,44 +1660,44 @@ void sub_81C7E14(u32 arg0) struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); if (arg0 == 4) - structPtr->unk1C[1]->oam.tileNum = GetSpriteTileStartByTag(2) + 32; + structPtr->leftHeaderSprites[1]->oam.tileNum = GetSpriteTileStartByTag(2) + 32; else - structPtr->unk1C[1]->oam.tileNum = GetSpriteTileStartByTag(2) + 64; + structPtr->leftHeaderSprites[1]->oam.tileNum = GetSpriteTileStartByTag(2) + 64; } -void sub_81C7E58(u32 arg0) +void LoadLeftHeaderGfxForMenu(u32 index) { struct PokenavMainMenuResources *structPtr; u32 size, tag; - if (arg0 >= 6) + if (index >= NAVGEAR_GFX_SUBMENUS_START) return; structPtr = GetSubstructPtr(0); - tag = sUnknown_0861FA6C[arg0].tag; - size = GetDecompressedDataSize(sUnknown_0861FA6C[arg0].data); + tag = sPokenavMenuLeftHeaderSpriteSheets[index].tag; + size = GetDecompressedDataSize(sPokenavMenuLeftHeaderSpriteSheets[index].data); LoadPalette(&gPokenavLeftHeader_Pal[tag * 16], (IndexOfSpritePaletteTag(1) * 16) + 0x100, 0x20); - LZ77UnCompWram(sUnknown_0861FA6C[arg0].data, gDecompressionBuffer); + LZ77UnCompWram(sPokenavMenuLeftHeaderSpriteSheets[index].data, gDecompressionBuffer); RequestDma3Copy(gDecompressionBuffer, (void *)VRAM + 0x10000 + (GetSpriteTileStartByTag(2) * 32), size, 1); - structPtr->unk1C[1]->oam.tileNum = GetSpriteTileStartByTag(2) + sUnknown_0861FA6C[arg0].size; + structPtr->leftHeaderSprites[1]->oam.tileNum = GetSpriteTileStartByTag(2) + sPokenavMenuLeftHeaderSpriteSheets[index].size; - if (arg0 == 4 || arg0 == 5) - structPtr->unk1C[1]->pos2.x = 56; + if (index == NAVGEAR_GFX_MAP_MENU_UNK0 || index == NAVGEAR_GFX_MAP_MENU_UNK1) + structPtr->leftHeaderSprites[1]->pos2.x = 56; else - structPtr->unk1C[1]->pos2.x = 64; + structPtr->leftHeaderSprites[1]->pos2.x = 64; } -void sub_81C7F24(u32 arg0) +void LoadLeftHeaderGfxForSubMenu(u32 arg0) { u32 size, tag; - if (arg0 >= 7) + if (arg0 >= NAVGEAR_GFX_MENUS_END - NAVGEAR_GFX_SUBMENUS_START) return; - tag = sUnknown_0861FA9C[arg0].tag; - size = GetDecompressedDataSize(sUnknown_0861FA9C[arg0].data); + tag = sPokenavSubMenuLeftHeaderSpriteSheets[arg0].tag; + size = GetDecompressedDataSize(sPokenavSubMenuLeftHeaderSpriteSheets[arg0].data); LoadPalette(&gPokenavLeftHeader_Pal[tag * 16], (IndexOfSpritePaletteTag(2) * 16) + 0x100, 0x20); - LZ77UnCompWram(sUnknown_0861FA9C[arg0].data, &gDecompressionBuffer[0x1000]); + LZ77UnCompWram(sPokenavSubMenuLeftHeaderSpriteSheets[arg0].data, &gDecompressionBuffer[0x1000]); RequestDma3Copy(&gDecompressionBuffer[0x1000], (void *)VRAM + 0x10800 + (GetSpriteTileStartByTag(2) * 32), size, 1); } @@ -1684,17 +1711,17 @@ void sub_81C7FA0(u32 arg0, bool32 arg1, bool32 arg2) var = 0x10; if (arg0 < 6) - sub_81C803C(var, arg2); + ShowLeftHeaderSprites(var, arg2); else - sub_81C8088(var, arg2); + ShowLeftHeaderSubmenuSprites(var, arg2); } void sub_81C7FC4(u32 arg0, bool32 arg1) { if (arg0 < 6) - sub_81C80D4(arg1); + HideLeftHeaderSprites(arg1); else - sub_81C8110(arg1); + HideLeftHeaderSubmenuSprites(arg1); } void sub_81C7FDC(void) @@ -1702,10 +1729,10 @@ void sub_81C7FDC(void) s32 i; struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); - for (i = 0; i < 2; i++) + for (i = 0; i < (s32)ARRAY_COUNT(structPtr->leftHeaderSprites); i++) { - structPtr->unk1C[i]->invisible = TRUE; - structPtr->unk24[i]->invisible = TRUE; + structPtr->leftHeaderSprites[i]->invisible = TRUE; + structPtr->submenuLeftHeaderSprites[i]->invisible = TRUE; } } @@ -1713,89 +1740,89 @@ bool32 sub_81C8010(void) { struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); - if (structPtr->unk1C[0]->callback == SpriteCallbackDummy && structPtr->unk24[0]->callback == SpriteCallbackDummy) + if (structPtr->leftHeaderSprites[0]->callback == SpriteCallbackDummy && structPtr->submenuLeftHeaderSprites[0]->callback == SpriteCallbackDummy) return FALSE; else return TRUE; } -void sub_81C803C(u32 arg0, bool32 arg1) +void ShowLeftHeaderSprites(u32 startY, bool32 isOnRightSide) { - s32 var1, var2, i; + s32 start, end, i; struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); - if (!arg1) - var1 = -96, var2 = 32; + if (!isOnRightSide) + start = -96, end = 32; else - var1 = 256, var2 = 160; + start = 256, end = 160; - for (i = 0; i < 2; i++) + for (i = 0; i < (s32)ARRAY_COUNT(structPtr->leftHeaderSprites); i++) { - structPtr->unk1C[i]->pos1.y = arg0; - sub_81C814C(structPtr->unk1C[i], var1, var2, 12); + structPtr->leftHeaderSprites[i]->pos1.y = startY; + MoveLeftHeader(structPtr->leftHeaderSprites[i], start, end, 12); } } -void sub_81C8088(u32 arg0, bool32 arg1) +void ShowLeftHeaderSubmenuSprites(u32 startY, bool32 isOnRightSide) { - s32 var1, var2, i; + s32 start, end, i; struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); - if (!arg1) - var1 = -96, var2 = 16; + if (!isOnRightSide) + start = -96, end = 16; else - var1 = 256, var2 = 192; + start = 256, end = 192; - for (i = 0; i < 2; i++) + for (i = 0; i < (s32)ARRAY_COUNT(structPtr->submenuLeftHeaderSprites); i++) { - structPtr->unk24[i]->pos1.y = arg0; - sub_81C814C(structPtr->unk24[i], var1, var2, 12); + structPtr->submenuLeftHeaderSprites[i]->pos1.y = startY; + MoveLeftHeader(structPtr->submenuLeftHeaderSprites[i], start, end, 12); } } -void sub_81C80D4(bool32 arg0) +void HideLeftHeaderSprites(bool32 isOnRightSide) { - s32 var1, var2, i; + s32 start, end, i; struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); - if (!arg0) - var1 = 32, var2 = -96; + if (!isOnRightSide) + start = 32, end = -96; else - var1 = 192, var2 = 256; + start = 192, end = 256; - for (i = 0; i < 2; i++) + for (i = 0; i < (s32)ARRAY_COUNT(structPtr->leftHeaderSprites); i++) { - sub_81C814C(structPtr->unk1C[i], var1, var2, 12); + MoveLeftHeader(structPtr->leftHeaderSprites[i], start, end, 12); } } -void sub_81C8110(bool32 arg0) +void HideLeftHeaderSubmenuSprites(bool32 isOnRightSide) { - s32 var1, var2, i; + s32 start, end, i; struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); - if (!arg0) - var1 = 16, var2 = -96; + if (!isOnRightSide) + start = 16, end = -96; else - var1 = 192, var2 = 256; + start = 192, end = 256; - for (i = 0; i < 2; i++) + for (i = 0; i < (s32)ARRAY_COUNT(structPtr->submenuLeftHeaderSprites); i++) { - sub_81C814C(structPtr->unk24[i], var1, var2, 12); + MoveLeftHeader(structPtr->submenuLeftHeaderSprites[i], start, end, 12); } } -void sub_81C814C(struct Sprite *sprite, s32 arg1, s32 arg2, s32 arg3) +void MoveLeftHeader(struct Sprite *sprite, s32 startX, s32 endX, s32 duration) { - sprite->pos1.x = arg1; - sprite->data[0] = arg1 * 16; - sprite->data[1] = (arg2 - arg1) * 16 / arg3; - sprite->data[2] = arg3; - sprite->data[7] = arg2; - sprite->callback = sub_81C817C; + sprite->pos1.x = startX; + sprite->data[0] = startX * 16; + sprite->data[1] = (endX - startX) * 16 / duration; + sprite->data[2] = duration; + sprite->data[7] = endX; + sprite->callback = SpriteCB_MoveLeftHeader; } -void sub_81C817C(struct Sprite *sprite) +void SpriteCB_MoveLeftHeader(struct Sprite *sprite) { if (sprite->data[2] != 0) { -- cgit v1.2.3 From 0dc73b0b3a378f4af253691a7b2694b9faa2fbdf Mon Sep 17 00:00:00 2001 From: Phlosioneer Date: Sun, 7 Apr 2019 14:40:35 -0400 Subject: Break up pokenav into subfiles The files are separated based on the pokenav resources substruct ID they use. --- src/pokenav.c | 2241 +---------------------------------------- src/pokenav_main_menu.c | 990 ++++++++++++++++++ src/pokenav_match_call.c | 1448 -------------------------- src/pokenav_match_call_data.c | 1448 ++++++++++++++++++++++++++ src/pokenav_match_call_ui.c | 1266 +++++++++++++++++++++++ 5 files changed, 3705 insertions(+), 3688 deletions(-) create mode 100644 src/pokenav_main_menu.c delete mode 100644 src/pokenav_match_call.c create mode 100644 src/pokenav_match_call_data.c create mode 100644 src/pokenav_match_call_ui.c (limited to 'src') diff --git a/src/pokenav.c b/src/pokenav.c index 6299d2647..b70d66599 100644 --- a/src/pokenav.c +++ b/src/pokenav.c @@ -18,6 +18,7 @@ #include "decompress.h" #include "strings.h" #include "constants/rgb.h" +#include "pokenav.h" enum { @@ -37,39 +38,6 @@ enum NAVMENU_CB_UNK_6 }; -enum -{ - NAVGEAR_GFX_MAIN_MENU, - NAVGEAR_GFX_CONDITION_MENU, - NAVGEAR_GFX_RIBBONS_MENU, - NAVGEAR_GFX_MATCH_CALL_MENU, - - // One of these is for the zoomed-in map, and the other is for the - // zoomed-out map. Don't know which is which yet. - NAVGEAR_GFX_MAP_MENU_UNK0, - NAVGEAR_GFX_MAP_MENU_UNK1, - - NAVGEAR_GFX_PARTY_MENU, - NAVGEAR_GFX_SEARCH_MENU, - NAVGEAR_GFX_COOL_MENU, - NAVGEAR_GFX_BEAUTY_MENU, - NAVGEAR_GFX_CUTE_MENU, - NAVGEAR_GFX_SMART_MENU, - NAVGEAR_GFX_TOUGH_MENU, - - NAVGEAR_GFX_MENUS_END -}; - -#define NAVGEAR_GFX_SUBMENUS_START NAVGEAR_GFX_PARTY_MENU - -// Return values of LoopedTask functions. -#define LT_INC_AND_PAUSE 0 -#define LT_INC_AND_CONTINUE 1 -#define LT_PAUSE 2 -#define LT_CONTINUE 3 -#define LT_FINISH 4 -#define LT_SET_STATE(newState) (newState + 5) - #define LOOPED_TASK_DECODE_STATE(action) (action - 5) #define LOOPED_TASK_ID(primary, secondary) (((secondary) << 16) |(primary)) @@ -78,80 +46,6 @@ enum #define UNKNOWN_OFFSET 100000 -typedef u32 (*LoopedTask)(s32 state); - -struct UnknownSubSubStruct_0203CF40 { - u8 bg; - u8 unk1; - u8 unk2; - u8 unk3; - u8 unk4; - u8 fontId; - u16 unk6; - u16 windowId; - u16 unkA; - u16 unkC; - u16 unkE; -}; - -struct MatchCallWindowState { - // The index of the element at the top of the window. - u16 windowTopIndex; - u16 listLength; - u16 unk4; - // The index of the cursor, relative to the top of the window. - u16 selectedIndexOffset; - u16 visibleEntries; - u16 unkA; - u32 unkC; - u32 unk10; -}; - -// Generally at index 0. -struct PokenavMainMenuResources -{ - void (*unk0)(u32); - u32 (*unk4)(void); - u32 unk8; - u32 currentTaskId; - u32 unk10; - u32 unk14; - struct Sprite *spinningNavgear; - struct Sprite *leftHeaderSprites[2]; - struct Sprite *submenuLeftHeaderSprites[2]; - u8 tilemapBuffer[0x800]; -}; - -struct UnknownInnerStruct_81C81D4 -{ - struct UnknownSubSubStruct_0203CF40 unk0; - u32 unk10; - u32 unk14; - u32 unk18; - u32 unk1C; - s32 unk20; - s32 unk24; - u32 unk28; - s32 unk2C; - u32 unk30; - void (*unk34)(u32, u8*); - void (*unk38)(u16, u32, u32); - struct Sprite *rightArrow; - struct Sprite *upArrow; - struct Sprite *downArrow; - u8 unkTextBuffer[0x40]; -}; - -// Generally at index 0x11 (17) -struct UnknownSubStruct_81C81D4 -{ - struct UnknownInnerStruct_81C81D4 unk0; - u8 tilemapBuffer[0x800]; - struct MatchCallWindowState unk888; - u32 unk89C; - u32 unk8A0; -}; - #define SUBSTRUCT_COUNT 19 struct PokenavResources @@ -164,34 +58,7 @@ struct PokenavResources void *field10[SUBSTRUCT_COUNT]; }; -// This struct uses a 32bit tag, and doesn't have a size field. -// Needed to match LoadLeftHeaderGfxForSubMenu. -struct CompressedSpriteSheetNoSize -{ - const u32 *data; // LZ77 compressed palette data - u32 tag; -}; - -struct MatchCallListTemplate -{ - u32 unk0; - u16 unk4; - u16 unk6; - u8 unk8; - u8 unk9; - u8 unkA; - u8 unkB; - u8 unkC; - u8 unkD; - u8 unkE; - void (*unk10)(u32, u8 *a1); - void (*unk14)(u16 a0, u32 a1, u32 a2); -}; - extern u32 sub_81C9430(void); -extern void sub_81CAADC(void); -extern u32 sub_81C99D4(void); -extern void InitHoenMapHeaderSprites(void); extern u32 sub_81C9298(void); extern u32 sub_81C941C(void); extern u32 sub_81C9924(void); @@ -249,38 +116,7 @@ extern u32 sub_81D04B8(void); extern u32 sub_81D09F4(void); extern u32 sub_81CFA04(void); extern u32 sub_81CFE08(void); -extern void SpriteCB_SpinningNavgear(struct Sprite* sprite); -extern void sub_81CBD48(u16 windowId, u32 a1); -extern u8 *sub_81CAFD8(u16 a0, u32 a1); -extern void sub_81DB620(u32 windowId, u32 a1, u32 a2, u32 a3, u32 a4); -u32 sub_81C91AC(struct UnknownInnerStruct_81C81D4 *a0, const struct BgTemplate *a1, struct MatchCallListTemplate *a2, s32 a3); -void sub_81C9160(struct MatchCallWindowState *a0, struct MatchCallListTemplate *a1); -void SpriteCB_MatchCallUpArrow(struct Sprite *sprite); -void SpriteCB_MatchCallDownArrow(struct Sprite *sprite); -void SpriteCB_MatchCallRightArrow(struct Sprite *sprite); -void ToggleMatchCallArrows(struct UnknownInnerStruct_81C81D4 *a0, u32 a1); -void sub_81C8FE0(struct UnknownInnerStruct_81C81D4 *a0); -void sub_81C8EF8(struct MatchCallWindowState *a0, struct UnknownInnerStruct_81C81D4 *a1); -void sub_81C8ED0(void); -void sub_81C8E54(struct MatchCallWindowState *a0, struct UnknownInnerStruct_81C81D4 *a1, u32 a2); -void PrintMatchCallFieldNames(struct UnknownInnerStruct_81C81D4 *a0, u32 a1); -void sub_81C8D4C(struct MatchCallWindowState *a0, struct UnknownInnerStruct_81C81D4 *a1); -void sub_81C8CB4(struct MatchCallWindowState *a0, struct UnknownInnerStruct_81C81D4 *a1); -void sub_81C8B70(struct UnknownSubSubStruct_0203CF40 *a0, u32 a1, u32 a2); -u32 LoopedTask_sub_81C8A28(s32 a0); -u32 LoopedTask_sub_81C8958(s32 a0); -u32 LoopedTask_sub_81C8870(s32 a0); -u32 LoopedTask_sub_81C85A0(s32 a0); -void sub_81C8568(s32 a0, struct UnknownInnerStruct_81C81D4 *a1); -u32 LoopedTask_sub_81C83F0(s32 a0); -bool32 sub_81C83E0(void); -void sub_81C83AC(u32 a0, u32 a1, u32 a2, u32 a3, u32 a4, struct UnknownInnerStruct_81C81D4 *a5); -void sub_81C837C(struct MatchCallWindowState *a0, struct UnknownInnerStruct_81C81D4 *a1); -void sub_81C835C(struct UnknownSubSubStruct_0203CF40 *a0); -void sub_81C82E4(struct UnknownSubStruct_81C81D4 *a0); -u32 LoopedTask_sub_81C8254(s32 a0); -u32 LoopedTask_ScrollMenuHeaderUp(s32 a0); bool32 SetActivePokenavMenu(u32 a0); bool32 InitPokenavMainMenu(void); static bool32 AnyMonHasRibbon(void); @@ -288,15 +124,10 @@ u32 sub_81C75E0(void); u32 sub_81C75D4(void); u32 PokenavMainMenuLoopedTaskIsActive(void); u32 sub_81C786C(void); -u32 LoopedTask_InitPokenavMenu(s32 a0); -u32 LoopedTask_ScrollMenuHeaderDown(s32 a0); bool32 WaitForPokenavShutdownFade(void); -void CopyPaletteIntoBufferUnfaded(const u16 *palette, u32 a1, u32 a2); void sub_81C7834(void *func1, void *func2); static void InitPokenavResources(struct PokenavResources *a0); -void FreePokenavSubstruct(u32 index); void sub_81C7850(u32 a0); -void sub_81C7BF8(u32 a0); void Task_RunLoopedTask_LinkMode(u8 a0); void Task_RunLoopedTask(u8 taskId); void sub_81C742C(u8 taskId); @@ -305,18 +136,7 @@ static void InitKeys_(void); static void FreePokenavResources(void); static void VBlankCB_Pokenav(void); static void CB2_Pokenav(void); -void InitPokenavMainMenuResources(void); void sub_81C72BC(void); -void sub_81C7B74(void); -void CleanupPokenavMainMenuResources(void); -void LoadLeftHeaderGfxForSubMenu(u32 arg0); -void LoadLeftHeaderGfxForMenu(u32 arg0); -void HideLeftHeaderSubmenuSprites(bool32 arg0); -void HideLeftHeaderSprites(bool32 arg0); -void ShowLeftHeaderSprites(u32 arg0, bool32 arg1); -void ShowLeftHeaderSubmenuSprites(u32 arg0, bool32 arg1); -void MoveLeftHeader(struct Sprite *sprite, s32 arg1, s32 arg2, s32 arg3); -void SpriteCB_MoveLeftHeader(struct Sprite *sprite); // Const rom data. u32 (*const PokenavMenuCallbacks[15][7])(void) = @@ -458,355 +278,9 @@ u32 (*const PokenavMenuCallbacks[15][7])(void) = }, }; -const u16 gSpinningNavgearPaletteData[] = INCBIN_U16("graphics/pokenav/icon2.gbapal"); -const u32 gSpinningNavgearGfx[] = INCBIN_U32("graphics/pokenav/icon2.4bpp.lz"); -const u32 gUnused_SpinningNavgearGfx2[] = INCBIN_U32("graphics/pokenav/icon2_unused.4bpp.lz"); - -const struct BgTemplate gPokenavMainMenuBgTemplates[] = -{ - { - .bg = 0, - .charBaseIndex = 0, - .mapBaseIndex = 5, - .screenSize = 0, - .paletteMode = 0, - .priority = 0, - .baseTile = 0, - } -}; - -const struct WindowTemplate gUnknown_0861FA08[2] = -{ - { - .bg = 0, - .tilemapLeft = 1, - .tilemapTop = 22, - .width = 16, - .height = 2, - .paletteNum = 0, - .baseBlock = 0x36, - }, - { - .bg = 0xFF, - .tilemapLeft = 0, - .tilemapTop = 0, - .width = 0, - .height = 0, - .paletteNum = 0, - .baseBlock = 0, - }, -}; - -const u8 *const (sMenuButtonReminders[12]) = -{ - gText_Navgear_ClearButtonList, - gText_NavgearMap_ZoomedOutButtons, - gText_NavgearMap_ZoomedInButtons, - gText_NavgearCondition_MonListButtons, - gText_NavgearCondition_MonStatusButtons, - gText_NavgearCondition_MarkingButtons, - gText_NavgearMatchCall_TrainerListButtons, - gText_NavgearMatchCall_CallMenuButtons, - gText_NavgearMatchCall_CheckTrainerButtons, - gText_NavgearRibbons_MonListButtons, - gText_NavgearRibbons_RibbonListButtons, - gText_NavgearRibbons_RibbonCheckButtons, -}; - -const u8 gMenuButtonReminderColor[4] = -{ - 4, 1, 2, 0 -}; - -static const struct CompressedSpriteSheet gSpinningNavgearSpriteSheet[] = -{ - { - .data = gSpinningNavgearGfx, - .size = 0x1000, - .tag = 0, - } -}; - -static const struct SpritePalette gSpinningNavgearPalette[] = -{ - { - .data = gSpinningNavgearPaletteData, - .tag = 0, - }, - {} -}; - -static const struct CompressedSpriteSheet sPokenavHoenMapLeftHeaderSpriteSheet = -{ - .data = gPokenavLeftHeaderHoennMap_Gfx, - .size = 0xC00, - .tag = 2 -}; - -static const struct CompressedSpriteSheet sPokenavMenuLeftHeaderSpriteSheets[] = -{ - [NAVGEAR_GFX_MAIN_MENU] = { - .data = gPokenavLeftHeaderMainMenu_Gfx, - .size = 0x20, - .tag = 3 - }, - [NAVGEAR_GFX_CONDITION_MENU] = { - .data = gPokenavLeftHeaderCondition_Gfx, - .size = 0x20, - .tag = 1 - }, - [NAVGEAR_GFX_RIBBONS_MENU] = { - .data = gPokenavLeftHeaderRibbons_Gfx, - .size = 0x20, - .tag = 2 - }, - [NAVGEAR_GFX_MATCH_CALL_MENU] = { - .data = gPokenavLeftHeaderMatchCall_Gfx, - .size = 0x20, - .tag = 4 - }, - [NAVGEAR_GFX_MAP_MENU_UNK0] = { - .data = gPokenavLeftHeaderHoennMap_Gfx, - .size = 0x20, - .tag = 0 - }, - [NAVGEAR_GFX_MAP_MENU_UNK1] = { - .data = gPokenavLeftHeaderHoennMap_Gfx, - .size = 0x40, - .tag = 0 - } -}; - -static const struct CompressedSpriteSheetNoSize sPokenavSubMenuLeftHeaderSpriteSheets[] = -{ - [NAVGEAR_GFX_PARTY_MENU - NAVGEAR_GFX_SUBMENUS_START] = { - .data = gPokenavLeftHeaderParty_Gfx, - .tag = 1 - }, - [NAVGEAR_GFX_SEARCH_MENU - NAVGEAR_GFX_SUBMENUS_START] = { - .data = gPokenavLeftHeaderSearch_Gfx, - .tag = 1 - }, - [NAVGEAR_GFX_COOL_MENU - NAVGEAR_GFX_SUBMENUS_START] = { - .data = gPokenavLeftHeaderCool_Gfx, - .tag = 4 - }, - [NAVGEAR_GFX_BEAUTY_MENU - NAVGEAR_GFX_SUBMENUS_START] = { - .data = gPokenavLeftHeaderBeauty_Gfx, - .tag = 1 - }, - [NAVGEAR_GFX_CUTE_MENU - NAVGEAR_GFX_SUBMENUS_START] = { - .data = gPokenavLeftHeaderCute_Gfx, - .tag = 2 - }, - [NAVGEAR_GFX_SMART_MENU - NAVGEAR_GFX_SUBMENUS_START] = { - .data = gPokenavLeftHeaderSmart_Gfx, - .tag = 0 - }, - [NAVGEAR_GFX_TOUGH_MENU - NAVGEAR_GFX_SUBMENUS_START] = { - .data = gPokenavLeftHeaderTough_Gfx, - .tag = 0 - } -}; - -static const struct OamData sSpinningNavgearSpriteOam = -{ - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, // FIXME: Use SPRITE_SHAPE - .x = 0, - .matrixNum = 0, - .size = 2, // FIXME: Use SPRITE_SIZE - .tileNum = 0, - .priority = 0, - .paletteNum = 0, - .affineParam = 0 -}; - -static const union AnimCmd sSpinningNavgearAnims[] = -{ - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(16, 8), - ANIMCMD_FRAME(32, 8), - ANIMCMD_FRAME(48, 8), - ANIMCMD_FRAME(64, 8), - ANIMCMD_FRAME(80, 8), - ANIMCMD_FRAME(96, 8), - ANIMCMD_FRAME(112, 8), - ANIMCMD_JUMP(0) -}; - -static const union AnimCmd *const sSpinningNavgearAnimTable[] = -{ - sSpinningNavgearAnims -}; - -static const struct SpriteTemplate sSpinningNavgearSpriteTemplate = -{ - .tileTag = 0, - .paletteTag = 0, - .oam = &sSpinningNavgearSpriteOam, - .anims = sSpinningNavgearAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCB_SpinningNavgear -}; - -static const struct OamData sPokenavLeftHeaderHoenMapSpriteOam = -{ - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 1, - .x = 0, - .matrixNum = 0, - .size = 3, - .tileNum = 0, - .priority = 1, - .paletteNum = 0, - .affineParam = 0 -}; - -static const struct OamData sUnknown_0861FB24 = -{ - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 1, - .x = 0, - .matrixNum = 0, - .size = 2, - .tileNum = 0, - .priority = 1, - .paletteNum = 0, - .affineParam = 0 -}; - -static const struct SpriteTemplate sPokenavLeftHeaderHoenMapSpriteTemplate = -{ - .tileTag = 2, - .paletteTag = 1, - .oam = &sPokenavLeftHeaderHoenMapSpriteOam, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy -}; - -static const struct SpriteTemplate sUnknown_0861FB44 = -{ - .tileTag = 2, - .paletteTag = 2, - .oam = &sUnknown_0861FB24, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy -}; - -static const u16 sMatchcallArrowPaletteData[] = INCBIN_U16("graphics/pokenav/arrows_matchcall.gbapal"); -static const u32 sMatchcallArrowSpriteSheetData[] = INCBIN_U32("graphics/pokenav/arrows_matchcall.4bpp.lz"); - -static const u8 sPokenavColors_0861FBE4[] = -{ - 0, 2, 5 -}; - -static const u8 *const sMatchCallFieldNames[] = -{ - gText_NavgearMatchCall_Strategy, - gText_NavgearMatchCall_TrainerPokemon, - gText_NavgearMatchCall_SelfIntroduction -}; - -static const u8 sMatchCallFieldColors[] = -{ - 1, 4, 5 -}; - -static const u8 sUnknown_0861FBF7[] = -{ - 2, 4, 6, 7, 0 -}; - -static const struct CompressedSpriteSheet sMatchcallArrowSpriteSheet[] = -{ - { - .data = sMatchcallArrowSpriteSheetData, - .size = 192, - .tag = 0xA - } -}; - -static const struct SpritePalette sMatchcallArrowPalette[] = -{ - { - .data = sMatchcallArrowPaletteData, - .tag = 0x14 - }, - {} -}; - -static const struct OamData sMatchCallRightArrowSpriteOam = -{ - .y = 0, - .affineMode = ST_OAM_AFFINE_OFF, - .objMode = ST_OAM_OBJ_NORMAL, - .bpp = ST_OAM_4BPP, - .shape = 2, //SPRITE_SHAPE(16x8), - .x = 0, - .size = 0, //SPRITE_SIZE(16x8), - .tileNum = 0, - .priority = 2, - .paletteNum = 0 -}; - -static const struct SpriteTemplate sMatchCallRightArrowSprite = -{ - .tileTag = 0xA, - .paletteTag = 0x14, - .oam = &sMatchCallRightArrowSpriteOam, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCB_MatchCallRightArrow -}; - -static const struct OamData sMatchCallUpDownArrowSpriteOam = -{ - .y = 0, - .affineMode = ST_OAM_AFFINE_OFF, - .objMode = ST_OAM_OBJ_NORMAL, - .bpp = ST_OAM_4BPP, - .shape = 1, //SPRITE_SHAPE(8x16), - .x = 0, - .size = 0, //SPRITE_SIZE(8x16), - .tileNum = 0, - .priority = 2, - .paletteNum = 0 -}; - -static const struct SpriteTemplate sMatchCallUpDownArrowSprite = -{ - .tileTag = 0xA, - .paletteTag = 0x14, - .oam = &sMatchCallUpDownArrowSpriteOam, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy -}; EWRAM_DATA u8 gNextLoopedTaskId = 0; EWRAM_DATA struct PokenavResources *gPokenavResources = NULL; -EWRAM_DATA u32 gUnknown_0203CF44 = 0; // code u32 CreateLoopedTask(LoopedTask loopedTask, u32 priority) @@ -1186,1716 +660,3 @@ bool32 CanViewRibbonsMenu(void) { return gPokenavResources->hasAnyRibbons; } - -bool32 InitPokenavMainMenu(void) -{ - struct PokenavMainMenuResources *structPtr; - - structPtr = AllocSubstruct(0, sizeof(struct PokenavMainMenuResources)); - if (structPtr == NULL) - return FALSE; - - ResetSpriteData(); - FreeAllSpritePalettes(); - structPtr->currentTaskId = CreateLoopedTask(LoopedTask_InitPokenavMenu, 1); - return TRUE; -} - -u32 PokenavMainMenuLoopedTaskIsActive(void) -{ - struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); - return IsLoopedTaskActive(structPtr->currentTaskId); -} - -void ShutdownPokenav(void) -{ - PlaySE(SE_PN_OFF); - sub_81CAADC(); - BeginNormalPaletteFade(0xFFFFFFFF, -1, 0, 16, RGB_BLACK); -} - -bool32 WaitForPokenavShutdownFade(void) -{ - if (!gPaletteFade.active) - { - sub_81C99D4(); - CleanupPokenavMainMenuResources(); - FreeAllWindowBuffers(); - return FALSE; - } - - return TRUE; -} - -u32 LoopedTask_InitPokenavMenu(s32 a0) -{ - struct PokenavMainMenuResources *structPtr; - - switch (a0) - { - case 0: - SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP); - FreeAllWindowBuffers(); - ResetBgsAndClearDma3BusyFlags(0); - InitBgsFromTemplates(0, gPokenavMainMenuBgTemplates, ARRAY_COUNT(gPokenavMainMenuBgTemplates)); - ResetBgPositions(); - reset_temp_tile_data_buffers(); - return LT_INC_AND_CONTINUE; - case 1: - structPtr = GetSubstructPtr(0); - decompress_and_copy_tile_data_to_vram(0, &gPokenavHeader_Gfx, 0, 0, 0); - SetBgTilemapBuffer(0, structPtr->tilemapBuffer); - CopyToBgTilemapBuffer(0, &gPokenavHeader_Tilemap, 0, 0); - CopyPaletteIntoBufferUnfaded(gPokenavHeader_Pal, 0, 0x20); - CopyBgTilemapBufferToVram(0); - return LT_INC_AND_PAUSE; - case 2: - if (free_temp_tile_data_buffers_if_possible()) - return LT_PAUSE; - - sub_81C7B74(); - return LT_INC_AND_PAUSE; - case 3: - if (IsDma3ManagerBusyWithBgCopy()) - return LT_PAUSE; - - InitPokenavMainMenuResources(); - InitHoenMapHeaderSprites(); - ShowBg(0); - return LT_FINISH; - default: - return LT_FINISH; - } -} - -void sub_81C7834(void *func1, void *func2) // Fix types later. -{ - struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); - structPtr->unk0 = func1; - structPtr->unk4 = func2; - structPtr->unk8 = 0; -} - -void sub_81C7850(u32 a0) -{ - struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); - structPtr->unk8 = 0; - structPtr->unk0(a0); -} - -u32 sub_81C786C(void) -{ - struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); - return structPtr->unk4(); -} - -void sub_81C7880(void) -{ - struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); - structPtr->currentTaskId = CreateLoopedTask(LoopedTask_ScrollMenuHeaderDown, 4); -} - -void sub_81C78A0(void) -{ - struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); - structPtr->currentTaskId = CreateLoopedTask(LoopedTask_ScrollMenuHeaderUp, 4); -} - -bool32 MainMenuLoopedTaskIsBusy(void) -{ - struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); - return IsLoopedTaskActive(structPtr->currentTaskId); -} - -u32 LoopedTask_ScrollMenuHeaderDown(s32 a0) -{ - switch (a0) - { - default: - return LT_FINISH; - case 1: - return LT_INC_AND_PAUSE; - case 0: - return LT_INC_AND_PAUSE; - case 2: - if (ChangeBgY(0, 384, 1) >= 0x2000u) - { - ChangeBgY(0, 0x2000, 0); - return LT_FINISH; - } - - return LT_PAUSE; - } -} - -u32 LoopedTask_ScrollMenuHeaderUp(s32 a0) -{ - if (ChangeBgY(0, 384, 2) <= 0) - { - ChangeBgY(0, 0, 0); - return 4; - } - return 2; -} - -void CopyPaletteIntoBufferUnfaded(const u16 *palette, u32 bufferOffset, u32 size) -{ - CpuCopy16(palette, gPlttBufferUnfaded + bufferOffset, size); -} - -void Pokenav_AllocAndLoadPalettes(const struct SpritePalette *palettes) -{ - const struct SpritePalette *current; - u32 index; - - for (current = palettes; current->data != NULL; current++) - { - index = AllocSpritePalette(current->tag); - if (index == 0xFF) - { - break; - } - else - { - index = (index * 16) + 0x100; - CopyPaletteIntoBufferUnfaded(current->data, index, 0x20); - } - } -} - -void sub_81C7990(u32 a0, u16 a1) -{ - CpuFill16(a1, gPlttBufferFaded + 0x100 + (a0 * 16), 16 * sizeof(u16)); -} - -__attribute__((naked)) -void sub_81C79BC(u16 *a0, u16 *a1, u32 a2, u32 a3, u32 a4, u32 a5) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0xC\n\ - str r0, [sp]\n\ - str r1, [sp, 0x4]\n\ - mov r10, r2\n\ - str r3, [sp, 0x8]\n\ - ldr r0, [sp, 0x2C]\n\ - cmp r0, 0\n\ - bne _081C79E4\n\ - ldr r2, =0x001fffff\n\ - mov r1, r10\n\ - ands r2, r1\n\ - ldr r0, [sp]\n\ - b _081C79F4\n\ - .pool\n\ -_081C79E4:\n\ - ldr r2, [sp, 0x2C]\n\ - ldr r0, [sp, 0x8]\n\ - cmp r2, r0\n\ - blt _081C7A00\n\ - ldr r2, =0x001fffff\n\ - mov r1, r10\n\ - ands r2, r1\n\ - ldr r0, [sp, 0x4]\n\ -_081C79F4:\n\ - ldr r1, [sp, 0x30]\n\ - bl CpuSet\n\ - b _081C7AAE\n\ - .pool\n\ -_081C7A00:\n\ - movs r2, 0x1\n\ - negs r2, r2\n\ - add r10, r2\n\ - b _081C7AA6\n\ -_081C7A08:\n\ - ldr r1, [sp]\n\ - ldrh r0, [r1]\n\ - movs r2, 0x1F\n\ - mov r9, r2\n\ - mov r1, r9\n\ - ands r1, r0\n\ - mov r9, r1\n\ - lsls r0, 16\n\ - lsrs r2, r0, 21\n\ - movs r1, 0x1F\n\ - ands r1, r2\n\ - mov r8, r1\n\ - lsrs r7, r0, 26\n\ - movs r2, 0x1F\n\ - ands r7, r2\n\ - ldr r0, [sp, 0x4]\n\ - ldrh r4, [r0]\n\ - movs r0, 0x1F\n\ - ands r0, r4\n\ - mov r1, r9\n\ - subs r0, r1\n\ - lsls r0, 8\n\ - ldr r1, [sp, 0x8]\n\ - bl __divsi3\n\ - ldr r2, [sp, 0x2C]\n\ - adds r6, r0, 0\n\ - muls r6, r2\n\ - asrs r6, 8\n\ - lsls r4, 16\n\ - lsrs r0, r4, 21\n\ - movs r1, 0x1F\n\ - ands r0, r1\n\ - mov r2, r8\n\ - subs r0, r2\n\ - lsls r0, 8\n\ - ldr r1, [sp, 0x8]\n\ - bl __divsi3\n\ - ldr r1, [sp, 0x2C]\n\ - adds r5, r0, 0\n\ - muls r5, r1\n\ - asrs r5, 8\n\ - lsrs r4, 26\n\ - movs r2, 0x1F\n\ - ands r4, r2\n\ - subs r4, r7\n\ - lsls r4, 8\n\ - adds r0, r4, 0\n\ - ldr r1, [sp, 0x8]\n\ - bl __divsi3\n\ - ldr r1, [sp, 0x2C]\n\ - muls r0, r1\n\ - asrs r0, 8\n\ - add r6, r9\n\ - movs r2, 0x1F\n\ - ands r6, r2\n\ - add r5, r8\n\ - ands r5, r2\n\ - adds r0, r7, r0\n\ - ands r0, r2\n\ - lsls r0, 10\n\ - lsls r5, 5\n\ - orrs r0, r5\n\ - orrs r0, r6\n\ - ldr r1, [sp, 0x30]\n\ - strh r0, [r1]\n\ - ldr r2, [sp]\n\ - adds r2, 0x2\n\ - str r2, [sp]\n\ - ldr r0, [sp, 0x4]\n\ - adds r0, 0x2\n\ - str r0, [sp, 0x4]\n\ - adds r1, 0x2\n\ - str r1, [sp, 0x30]\n\ - movs r1, 0x1\n\ - negs r1, r1\n\ - add r10, r1\n\ -_081C7AA6:\n\ - movs r0, 0x1\n\ - negs r0, r0\n\ - cmp r10, r0\n\ - bne _081C7A08\n\ -_081C7AAE:\n\ - add sp, 0xC\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .syntax divided"); -} - -void sub_81C7AC0(s32 a0) -{ - struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); - - switch (a0) - { - case 0: - BeginNormalPaletteFade(structPtr->unk14, -2, 0, 16, RGB_BLACK); - break; - case 1: - BeginNormalPaletteFade(structPtr->unk14, -2, 16, 0, RGB_BLACK); - break; - case 2: - BeginNormalPaletteFade(0xFFFFFFFF, -2, 0, 16, RGB_BLACK); - break; - case 3: - BeginNormalPaletteFade(0xFFFFFFFF, -2, 16, 0, RGB_BLACK); - break; - } -} - -bool32 IsPaletteFadeActive(void) -{ - return gPaletteFade.active; -} - -void sub_81C7B40(void) -{ - BlendPalettes(0xFFFEFFFE, 16, RGB_BLACK); -} - -void InitBgTemplates(const struct BgTemplate *templates, s32 count) -{ - s32 i; - - for (i = 0; i < count; i++) - InitBgFromTemplate(templates++); -} - -void sub_81C7B74(void) -{ - struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); - - InitWindows(&gUnknown_0861FA08[0]); - structPtr->unk10 = 0; - sub_81C7BF8(structPtr->unk10); - PutWindowTilemap(structPtr->unk10); - CopyWindowToVram(structPtr->unk10, 3); // TODO: Use a defined constant here. -} - -void sub_81C7BA4(u32 a0) -{ - struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); - - sub_81C7BF8(structPtr->unk10); - AddTextPrinterParameterized3(structPtr->unk10, 1, 0, 1, gMenuButtonReminderColor, 0, sMenuButtonReminders[a0]); -} - -bool32 IsDma3ManagerBusyWithBgCopy_(void) -{ - return IsDma3ManagerBusyWithBgCopy(); -} - -void sub_81C7BF8(u32 windowId) -{ - FillWindowPixelBuffer(windowId, PIXEL_FILL(4)); - FillWindowPixelRect(windowId, PIXEL_FILL(5), 0, 0, 0x80, 1); -} - -void InitPokenavMainMenuResources(void) -{ - s32 i; - u8 spriteId; - struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); - - for (i = 0; i < ARRAY_COUNT(gSpinningNavgearSpriteSheet); i++) - LoadCompressedSpriteSheet(&gSpinningNavgearSpriteSheet[i]); - - Pokenav_AllocAndLoadPalettes(gSpinningNavgearPalette); - structPtr->unk14 = ~1 & ~(0x10000 << IndexOfSpritePaletteTag(0)); - spriteId = CreateSprite(&sSpinningNavgearSpriteTemplate, 220, 12, 0); - structPtr->spinningNavgear = &gSprites[spriteId]; -} - -void CleanupPokenavMainMenuResources(void) -{ - struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); - - DestroySprite(structPtr->spinningNavgear); - FreeSpriteTilesByTag(0); - FreeSpritePaletteByTag(0); -} - -void SpriteCB_SpinningNavgear(struct Sprite *sprite) -{ - // If the background starts scrolling, follow it. - sprite->pos2.y = (GetBgY(0) / 256u) * -1; -} - -struct Sprite *PauseSpinningNavgearSprite(void) -{ - struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); - - structPtr->spinningNavgear->callback = SpriteCallbackDummy; - return structPtr->spinningNavgear; -} - -void ResumeSpinningNavgearSprite(void) -{ - struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); - - structPtr->spinningNavgear->pos1.x = 220; - structPtr->spinningNavgear->pos1.y = 12; - structPtr->spinningNavgear->callback = SpriteCB_SpinningNavgear; - structPtr->spinningNavgear->invisible = FALSE; - structPtr->spinningNavgear->oam.priority = 0; - structPtr->spinningNavgear->subpriority = 0; -} - -void InitHoenMapHeaderSprites(void) -{ - s32 i, spriteId; - struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); - - LoadCompressedSpriteSheet(&sPokenavHoenMapLeftHeaderSpriteSheet); - AllocSpritePalette(1); - AllocSpritePalette(2); - for (i = 0; i < (s32)ARRAY_COUNT(structPtr->leftHeaderSprites); i++) - { - spriteId = CreateSprite(&sPokenavLeftHeaderHoenMapSpriteTemplate, 0, 0, 1); - structPtr->leftHeaderSprites[i] = &gSprites[spriteId]; - structPtr->leftHeaderSprites[i]->invisible = TRUE; - structPtr->leftHeaderSprites[i]->pos2.x = i * 64; - - spriteId = CreateSprite(&sUnknown_0861FB44, 0, 0, 2); - structPtr->submenuLeftHeaderSprites[i] = &gSprites[spriteId]; - structPtr->submenuLeftHeaderSprites[i]->invisible = TRUE; - structPtr->submenuLeftHeaderSprites[i]->pos2.x = i * 32; - structPtr->submenuLeftHeaderSprites[i]->pos2.y = 18; - structPtr->submenuLeftHeaderSprites[i]->oam.tileNum += (i * 8) + 64; - } -} - -void LoadLeftHeaderGfxForIndex(u32 arg0) -{ - if (arg0 < NAVGEAR_GFX_SUBMENUS_START) - LoadLeftHeaderGfxForMenu(arg0); - else - LoadLeftHeaderGfxForSubMenu(arg0 - NAVGEAR_GFX_SUBMENUS_START); -} - -void sub_81C7E14(u32 arg0) -{ - struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); - - if (arg0 == 4) - structPtr->leftHeaderSprites[1]->oam.tileNum = GetSpriteTileStartByTag(2) + 32; - else - structPtr->leftHeaderSprites[1]->oam.tileNum = GetSpriteTileStartByTag(2) + 64; -} - -void LoadLeftHeaderGfxForMenu(u32 index) -{ - struct PokenavMainMenuResources *structPtr; - u32 size, tag; - - if (index >= NAVGEAR_GFX_SUBMENUS_START) - return; - - structPtr = GetSubstructPtr(0); - tag = sPokenavMenuLeftHeaderSpriteSheets[index].tag; - size = GetDecompressedDataSize(sPokenavMenuLeftHeaderSpriteSheets[index].data); - LoadPalette(&gPokenavLeftHeader_Pal[tag * 16], (IndexOfSpritePaletteTag(1) * 16) + 0x100, 0x20); - LZ77UnCompWram(sPokenavMenuLeftHeaderSpriteSheets[index].data, gDecompressionBuffer); - RequestDma3Copy(gDecompressionBuffer, (void *)VRAM + 0x10000 + (GetSpriteTileStartByTag(2) * 32), size, 1); - structPtr->leftHeaderSprites[1]->oam.tileNum = GetSpriteTileStartByTag(2) + sPokenavMenuLeftHeaderSpriteSheets[index].size; - - if (index == NAVGEAR_GFX_MAP_MENU_UNK0 || index == NAVGEAR_GFX_MAP_MENU_UNK1) - structPtr->leftHeaderSprites[1]->pos2.x = 56; - else - structPtr->leftHeaderSprites[1]->pos2.x = 64; -} - -void LoadLeftHeaderGfxForSubMenu(u32 arg0) -{ - u32 size, tag; - - if (arg0 >= NAVGEAR_GFX_MENUS_END - NAVGEAR_GFX_SUBMENUS_START) - return; - - tag = sPokenavSubMenuLeftHeaderSpriteSheets[arg0].tag; - size = GetDecompressedDataSize(sPokenavSubMenuLeftHeaderSpriteSheets[arg0].data); - LoadPalette(&gPokenavLeftHeader_Pal[tag * 16], (IndexOfSpritePaletteTag(2) * 16) + 0x100, 0x20); - LZ77UnCompWram(sPokenavSubMenuLeftHeaderSpriteSheets[arg0].data, &gDecompressionBuffer[0x1000]); - RequestDma3Copy(&gDecompressionBuffer[0x1000], (void *)VRAM + 0x10800 + (GetSpriteTileStartByTag(2) * 32), size, 1); -} - -void sub_81C7FA0(u32 arg0, bool32 arg1, bool32 arg2) -{ - u32 var; - - if (!arg1) - var = 0x30; - else - var = 0x10; - - if (arg0 < 6) - ShowLeftHeaderSprites(var, arg2); - else - ShowLeftHeaderSubmenuSprites(var, arg2); -} - -void sub_81C7FC4(u32 arg0, bool32 arg1) -{ - if (arg0 < 6) - HideLeftHeaderSprites(arg1); - else - HideLeftHeaderSubmenuSprites(arg1); -} - -void sub_81C7FDC(void) -{ - s32 i; - struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); - - for (i = 0; i < (s32)ARRAY_COUNT(structPtr->leftHeaderSprites); i++) - { - structPtr->leftHeaderSprites[i]->invisible = TRUE; - structPtr->submenuLeftHeaderSprites[i]->invisible = TRUE; - } -} - -bool32 sub_81C8010(void) -{ - struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); - - if (structPtr->leftHeaderSprites[0]->callback == SpriteCallbackDummy && structPtr->submenuLeftHeaderSprites[0]->callback == SpriteCallbackDummy) - return FALSE; - else - return TRUE; -} - -void ShowLeftHeaderSprites(u32 startY, bool32 isOnRightSide) -{ - s32 start, end, i; - struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); - - if (!isOnRightSide) - start = -96, end = 32; - else - start = 256, end = 160; - - for (i = 0; i < (s32)ARRAY_COUNT(structPtr->leftHeaderSprites); i++) - { - structPtr->leftHeaderSprites[i]->pos1.y = startY; - MoveLeftHeader(structPtr->leftHeaderSprites[i], start, end, 12); - } -} - -void ShowLeftHeaderSubmenuSprites(u32 startY, bool32 isOnRightSide) -{ - s32 start, end, i; - struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); - - if (!isOnRightSide) - start = -96, end = 16; - else - start = 256, end = 192; - - for (i = 0; i < (s32)ARRAY_COUNT(structPtr->submenuLeftHeaderSprites); i++) - { - structPtr->submenuLeftHeaderSprites[i]->pos1.y = startY; - MoveLeftHeader(structPtr->submenuLeftHeaderSprites[i], start, end, 12); - } -} - -void HideLeftHeaderSprites(bool32 isOnRightSide) -{ - s32 start, end, i; - struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); - - if (!isOnRightSide) - start = 32, end = -96; - else - start = 192, end = 256; - - for (i = 0; i < (s32)ARRAY_COUNT(structPtr->leftHeaderSprites); i++) - { - MoveLeftHeader(structPtr->leftHeaderSprites[i], start, end, 12); - } -} - -void HideLeftHeaderSubmenuSprites(bool32 isOnRightSide) -{ - s32 start, end, i; - struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); - - if (!isOnRightSide) - start = 16, end = -96; - else - start = 192, end = 256; - - for (i = 0; i < (s32)ARRAY_COUNT(structPtr->submenuLeftHeaderSprites); i++) - { - MoveLeftHeader(structPtr->submenuLeftHeaderSprites[i], start, end, 12); - } -} - -void MoveLeftHeader(struct Sprite *sprite, s32 startX, s32 endX, s32 duration) -{ - sprite->pos1.x = startX; - sprite->data[0] = startX * 16; - sprite->data[1] = (endX - startX) * 16 / duration; - sprite->data[2] = duration; - sprite->data[7] = endX; - sprite->callback = SpriteCB_MoveLeftHeader; -} - -void SpriteCB_MoveLeftHeader(struct Sprite *sprite) -{ - if (sprite->data[2] != 0) - { - sprite->data[2]--; - sprite->data[0] += sprite->data[1]; - sprite->pos1.x = sprite->data[0] >> 4; - if (sprite->pos1.x < -16 || sprite->pos1.x > 256) - sprite->invisible = TRUE; - else - sprite->invisible = FALSE; - } - else - { - sprite->pos1.x = sprite->data[7]; - sprite->callback = SpriteCallbackDummy; - } -} - -bool32 sub_81C81D4(const struct BgTemplate *arg0, struct MatchCallListTemplate *arg1, s32 arg2) -{ - u32 v1; - struct UnknownSubStruct_81C81D4 *structPtr; - - structPtr = AllocSubstruct(0x11, sizeof(struct UnknownSubStruct_81C81D4)); - - if (structPtr == NULL) - return FALSE; - - sub_81C9160(&structPtr->unk888, arg1); - - v1 = sub_81C91AC(&structPtr->unk0, arg0, arg1, arg2); - if (v1 == 0) - return FALSE; - - CreateLoopedTask(LoopedTask_sub_81C8254, 6); - return TRUE; -} - -bool32 sub_81C8224(void) -{ - return FuncIsActiveLoopedTask(LoopedTask_sub_81C8254); -} - -void sub_81C8234(void) -{ - struct UnknownSubStruct_81C81D4 *structPtr; - - structPtr = GetSubstructPtr(0x11); - sub_81C8FE0(&structPtr->unk0); - RemoveWindow(structPtr->unk0.unk0.windowId); - FreePokenavSubstruct(0x11); -} - -u32 LoopedTask_sub_81C8254(s32 a0) -{ - struct UnknownSubStruct_81C81D4 *structPtr; - - if (IsDma3ManagerBusyWithBgCopy()) - return 2; - - structPtr = GetSubstructPtr(0x11); - - switch (a0) - { - case 0: - sub_81C82E4(structPtr); - return 0; - case 1: - sub_81C835C(&structPtr->unk0.unk0); - return 0; - case 2: - sub_81C837C(&structPtr->unk888, &structPtr->unk0); - return 0; - case 3: - if (sub_81C83E0()) - { - return 2; - } - else - { - sub_81C8ED0(); - return 1; - } - case 4: - sub_81C8EF8(&structPtr->unk888, &structPtr->unk0); - return 4; - default: - return 4; - } -} - -void sub_81C82E4(struct UnknownSubStruct_81C81D4 *a0) -{ - u16 v1 = (a0->unk0.unk0.unk1 << 12) | a0->unk0.unk0.unk6; - // TODO: When #553 is merged, use a PALETTE_NUM_TO_FILL_VALUE(1) macro here... - sub_8199DF0(a0->unk0.unk0.bg, 0x11, a0->unk0.unk0.unk6, 1); - // ...and PALETTE_NUM_TO_FILL_VALUE(4) here. - sub_8199DF0(a0->unk0.unk0.bg, 0x44, a0->unk0.unk0.unk6 + 1, 1); - SetBgTilemapBuffer(a0->unk0.unk0.bg, a0->tilemapBuffer); - FillBgTilemapBufferRect_Palette0(a0->unk0.unk0.bg, v1, 0, 0, 32, 32); - ChangeBgY(a0->unk0.unk0.bg, 0, 0); - ChangeBgX(a0->unk0.unk0.bg, 0, 0); - ChangeBgY(a0->unk0.unk0.bg, a0->unk0.unk0.unk3 << 11, 2); - CopyBgTilemapBufferToVram(a0->unk0.unk0.bg); -} - -void sub_81C835C(struct UnknownSubSubStruct_0203CF40 *a0) -{ - FillWindowPixelBuffer(a0->windowId, PIXEL_FILL(1)); - PutWindowTilemap(a0->windowId); - CopyWindowToVram(a0->windowId, 1); -} - -void sub_81C837C(struct MatchCallWindowState *a0, struct UnknownInnerStruct_81C81D4 *a1) -{ - s32 v1; - s32 v2; - - // TODO: Clean this up. - v1 = a0->listLength - a0->windowTopIndex; - v2 = a0->visibleEntries; - if (v1 > a0->visibleEntries) - v1 = v2; - sub_81C83AC(a0->unk10, a0->windowTopIndex, v1, a0->unkC, 0, a1); -} - -void sub_81C83AC(u32 a0, u32 a1, u32 a2, u32 a3, u32 a4, struct UnknownInnerStruct_81C81D4 *a5) -{ - if (a2 == 0) - return; - - a5->unk1C = a0 + a1 * a3; - a5->unk18 = a3; - a5->unk0.unkC = 0; - a5->unk0.unkE = a2; - a5->unk14 = a1; - a5->unk10 = a4; - CreateLoopedTask(LoopedTask_sub_81C83F0, 5); -} - -bool32 sub_81C83E0(void) -{ - return FuncIsActiveLoopedTask(LoopedTask_sub_81C83F0); -} - -u32 LoopedTask_sub_81C83F0(s32 a0) -{ - struct UnknownInnerStruct_81C81D4 *structPtr; - u32 v1; - - structPtr = &((struct UnknownSubStruct_81C81D4*)GetSubstructPtr(0x11))->unk0; - switch (a0) - { - case 0: - v1 = (structPtr->unk0.unkA + structPtr->unk0.unkC + structPtr->unk10) & 0xF; - structPtr->unk34(structPtr->unk1C, structPtr->unkTextBuffer); - if (structPtr->unk38 != NULL) - // Accessing unk0.windowId as if it were a u16...? - // It's accessed as a u8 again in the very next line... - structPtr->unk38(*(u16*)(&structPtr->unk0.windowId), structPtr->unk14, v1); - - AddTextPrinterParameterized(structPtr->unk0.windowId, structPtr->unk0.fontId, structPtr->unkTextBuffer, 8, (v1 << 4) + 1, 255, NULL); - - if (++structPtr->unk0.unkC >= structPtr->unk0.unkE) - { - if (structPtr->unk38 != NULL) - CopyWindowToVram(structPtr->unk0.windowId, 3); - else - CopyWindowToVram(structPtr->unk0.windowId, 2); - return 0; - } - else - { - structPtr->unk1C += structPtr->unk18; - structPtr->unk14++; - return 3; - } - case 1: - if (IsDma3ManagerBusyWithBgCopy()) - return 2; - else - return 4; - default: - return 4; - } -} - -bool32 ShouldShowUpArrow(void) -{ - u16 v1; - s32 v2; - struct UnknownSubStruct_81C81D4 *structPtr; - structPtr = GetSubstructPtr(0x11); - - return structPtr->unk888.windowTopIndex != 0; -} - -bool32 ShouldShowDownArrow(void) -{ - struct MatchCallWindowState *subPtr; - struct UnknownSubStruct_81C81D4 *structPtr; - structPtr = GetSubstructPtr(0x11); - subPtr = &structPtr->unk888; - - return subPtr->windowTopIndex + subPtr->visibleEntries < subPtr->listLength; -} - - -#ifdef NONMATCHING -// This has some register renaming issues (r4, r5, and r6 are all switched around), and -// for some reason it's creating two copies of subPtr->unk0. -// TODO: Now I know why it's making two copies - one of them is UnknownInnerStruct_81C81D4. -void MatchCall_MoveWindow(s32 a0, bool32 a1) -{ - s32 v1; - struct MatchCallWindowState *subPtr; - struct UnknownSubStruct_81C81D4 *structPtr; - structPtr = GetSubstructPtr(0x11); - subPtr = &structPtr->unk888; - - if (a0 < 0) - { - // This is where the issue is. subPtr->windowTopIndex is being stored in r1 and then copied to - // r2... and then r2 is read for the if statement, r1 is read for the function call, - // and then both are clobbered as expected. Between those two uses, no writes to r1/r2 - // happen; it doesn't need to be duplicated/moved at all. - if (subPtr->windowTopIndex + a0 < 0) - v1 = -1 * subPtr->windowTopIndex; - else - v1 = a0; - if (a1) - sub_81C83AC(subPtr->unk10, subPtr->windowTopIndex + v1, v1 * -1, subPtr->unkC, v1, structPtr); - } - else if (a1) - { - - gUnknown_0203CF44 = subPtr->windowTopIndex + subPtr->visibleEntries; - if ((s32)(gUnknown_0203CF44) + a0 >= (s32)subPtr->listLength) - v1 = subPtr->listLength - gUnknown_0203CF44; - else - v1 = a0; - - sub_81C83AC(subPtr->unk10, gUnknown_0203CF44, v1, subPtr->unkC, subPtr->visibleEntries, structPtr); - // Needed to prevent GCC from combining the two sub_81C83AC calls. - asm(""); - } - else - { - v1 = a0; - } - - sub_81C8568(v1, structPtr); - subPtr->windowTopIndex++; -} -#else -NAKED -void MatchCall_MoveWindow(s32 a0, bool32 a1) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - sub sp, 0x8\n\ - adds r6, r0, 0\n\ - adds r4, r1, 0\n\ - movs r0, 0x11\n\ - bl GetSubstructPtr\n\ - adds r7, r0, 0\n\ - ldr r0, =0x00000888\n\ - adds r5, r7, r0\n\ - cmp r6, 0\n\ - bge _081C8524\n\ - ldrh r1, [r5]\n\ - adds r0, r1, r6\n\ - cmp r0, 0\n\ - bge _081C850A\n\ - negs r6, r1\n\ -_081C850A:\n\ - cmp r4, 0\n\ - beq _081C854E\n\ - ldr r0, [r5, 0x10]\n\ - adds r1, r6\n\ - negs r2, r6\n\ - ldr r3, [r5, 0xC]\n\ - str r6, [sp]\n\ - str r7, [sp, 0x4]\n\ - bl sub_81C83AC\n\ - b _081C854E\n\ - .pool\n\ -_081C8524:\n\ - cmp r4, 0\n\ - beq _081C854E\n\ - ldr r2, =gUnknown_0203CF44\n\ - ldrh r1, [r5]\n\ - ldrh r0, [r5, 0x8]\n\ - adds r4, r1, r0\n\ - str r4, [r2]\n\ - adds r0, r4, r6\n\ - ldrh r1, [r5, 0x2]\n\ - cmp r0, r1\n\ - blt _081C853C\n\ - subs r6, r1, r4\n\ -_081C853C:\n\ - ldr r0, [r5, 0x10]\n\ - ldr r3, [r5, 0xC]\n\ - ldrh r1, [r5, 0x8]\n\ - str r1, [sp]\n\ - str r7, [sp, 0x4]\n\ - adds r1, r4, 0\n\ - adds r2, r6, 0\n\ - bl sub_81C83AC\n\ -_081C854E:\n\ - adds r0, r6, 0\n\ - adds r1, r7, 0\n\ - bl sub_81C8568\n\ - ldrh r0, [r5]\n\ - adds r0, r6\n\ - strh r0, [r5]\n\ - add sp, 0x8\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .pool\n\ - .syntax divided"); -} -#endif - -void sub_81C8568(s32 a0, struct UnknownInnerStruct_81C81D4 *a1) -{ - a1->unk20 = GetBgY(a1->unk0.bg); - a1->unk24 = a1->unk20 + (a0 << 12); - if (a0 > 0) - a1->unk30 = 1; - else - a1->unk30 = 2; - a1->unk2C = a0; - a1->unk28 = CreateLoopedTask(LoopedTask_sub_81C85A0, 6); -} - -u32 LoopedTask_sub_81C85A0(s32 a0) -{ - s32 y; - s32 v1; - bool32 flag; - struct UnknownInnerStruct_81C81D4 *structPtr; - structPtr = &((struct UnknownSubStruct_81C81D4 *)GetSubstructPtr(0x11))->unk0; - - switch (a0) - { - case 0: - if (sub_81C83E0() == FALSE) - return 1; - else - return 2; - case 1: - flag = FALSE; - y = GetBgY(structPtr->unk0.bg); - v1 = ChangeBgY(structPtr->unk0.bg, 0x1000, structPtr->unk30); - if (structPtr->unk30 == 2) - { - if ((y > structPtr->unk24 || y <= structPtr->unk20) && v1 <= structPtr->unk24) - { - flag = TRUE; - } - } - else - { - if ((y < structPtr->unk24 || y >= structPtr->unk20) && v1 >= structPtr->unk24) - { - flag = TRUE; - } - } - if (flag) - { - structPtr->unk0.unkA = (structPtr->unk0.unkA + structPtr->unk2C) & 0xF; - ChangeBgY(structPtr->unk0.bg, structPtr->unk24, 0); - return 4; - } - else - { - return 2; - } - default: - return 4; - } -} - -bool32 sub_81C8630(void) -{ - struct UnknownSubStruct_81C81D4 *structPtr; - structPtr = GetSubstructPtr(0x11); - return IsLoopedTaskActive(structPtr->unk0.unk28); -} - -struct MatchCallWindowState *GetMatchCallWindowStruct(void) -{ - struct UnknownSubStruct_81C81D4 *structPtr; - structPtr = GetSubstructPtr(0x11); - return &structPtr->unk888; -} - -u32 MatchCall_MoveCursorUp(void) -{ - struct MatchCallWindowState *structPtr; - structPtr = GetMatchCallWindowStruct(); - - if (structPtr->selectedIndexOffset != 0) - { - structPtr->selectedIndexOffset--; - return 1; - } - else - { - if (ShouldShowUpArrow()) - { - MatchCall_MoveWindow(-1, TRUE); - return 2; - } - else - { - return 0; - } - } -} - -u32 MatchCall_MoveCursorDown(void) -{ - struct MatchCallWindowState *structPtr; - structPtr = GetMatchCallWindowStruct(); - - if (structPtr->windowTopIndex + structPtr->selectedIndexOffset < structPtr->listLength - 1) - { - if (structPtr->selectedIndexOffset < structPtr->visibleEntries - 1) - { - structPtr->selectedIndexOffset++; - return 1; - } - else if (!ShouldShowDownArrow()) - { - return 0; - } - } - else - { - return 0; - } - MatchCall_MoveWindow(1, TRUE); - return 2; -} - -u32 MatchCall_PageUp(void) -{ - struct MatchCallWindowState *structPtr; - s32 scroll; - - structPtr = GetMatchCallWindowStruct(); - if (ShouldShowUpArrow()) - { - if (structPtr->windowTopIndex >= structPtr->visibleEntries) - scroll = structPtr->visibleEntries; - else - scroll = structPtr->windowTopIndex; - MatchCall_MoveWindow(scroll * -1, TRUE); - return 2; - } - else if (structPtr->selectedIndexOffset != 0) - { - structPtr->selectedIndexOffset = 0; - return 1; - } - else - { - return 0; - } -} - -u32 MatchCall_PageDown(void) -{ - struct MatchCallWindowState *structPtr; - structPtr = GetMatchCallWindowStruct(); - - if (ShouldShowDownArrow()) - { - s32 scroll; - s32 windowBottomIndex; - s32 v3; - windowBottomIndex = structPtr->windowTopIndex + structPtr->visibleEntries; - scroll = structPtr->unk4 - structPtr->windowTopIndex; - if (windowBottomIndex <= structPtr->unk4) - scroll = structPtr->visibleEntries; - MatchCall_MoveWindow(scroll, TRUE); - return 2; - } - else - { - s32 cursor; - s32 lastVisibleIndex; - if (structPtr->listLength >= structPtr->visibleEntries) - { - cursor = structPtr->selectedIndexOffset; - lastVisibleIndex = structPtr->visibleEntries; - } - else - { - cursor = structPtr->selectedIndexOffset; - lastVisibleIndex = structPtr->listLength; - } - lastVisibleIndex -= 1; - if (cursor >= lastVisibleIndex) - { - return 0; - } - else - { - structPtr->selectedIndexOffset = lastVisibleIndex; - return 1; - } - } -} - -u32 GetSelectedMatchCall(void) -{ - struct MatchCallWindowState *structPtr; - structPtr = GetMatchCallWindowStruct(); - - return structPtr->windowTopIndex + structPtr->selectedIndexOffset; -} - -u32 GetMatchCallListTopIndex(void) -{ - struct MatchCallWindowState *structPtr; - structPtr = GetMatchCallWindowStruct(); - - return structPtr->windowTopIndex; -} - -void sub_81C877C(void) -{ - struct UnknownSubStruct_81C81D4 *structPtr; - structPtr = GetSubstructPtr(0x11); - structPtr->unk89C = 0; - structPtr->unk8A0 = CreateLoopedTask(LoopedTask_sub_81C8870, 6); -} - -void sub_81C87AC(u16 a0) -{ - u16 temp; - struct UnknownSubStruct_81C81D4 *structPtr; - structPtr = GetSubstructPtr(0x11); - temp = structPtr->unk888.windowTopIndex; - temp += a0; - structPtr->unk888.windowTopIndex = temp; - structPtr->unk89C = 0; - structPtr->unk8A0 = CreateLoopedTask(LoopedTask_sub_81C8958, 6); -} - -void sub_81C87F0(void) -{ - struct UnknownSubStruct_81C81D4 *structPtr; - structPtr = GetSubstructPtr(0x11); - structPtr->unk89C = 0; - structPtr->unk8A0 = CreateLoopedTask(LoopedTask_sub_81C8A28, 6); -} - -bool32 sub_81C8820(void) -{ - struct UnknownSubStruct_81C81D4 *structPtr; - structPtr = GetSubstructPtr(0x11); - return IsLoopedTaskActive(structPtr->unk8A0); -} - -void sub_81C8838(void) -{ - struct UnknownSubStruct_81C81D4 *structPtr; - struct MatchCallWindowState *subStr; - structPtr = GetSubstructPtr(0x11); - subStr = &structPtr->unk888; - structPtr->unk0.unk38(structPtr->unk0.unk0.windowId, subStr->windowTopIndex + subStr->selectedIndexOffset, (structPtr->unk0.unk0.unkA + subStr->selectedIndexOffset) & 0xF); - CopyWindowToVram(structPtr->unk0.unk0.windowId, 1); -} - -u32 LoopedTask_sub_81C8870(s32 a0) -{ - struct UnknownSubStruct_81C81D4 *structPtr; - u16 v1; - u32 v2; - - // Needed to fix a register renaming issue. - register u16* temp asm("r1"); - structPtr = GetSubstructPtr(0x11); - - switch (a0) - { - case 0: - ToggleMatchCallArrows(&structPtr->unk0, 1); - // fall-through - case 1: - if (structPtr->unk89C != structPtr->unk888.selectedIndexOffset) - sub_81C8B70(&structPtr->unk0.unk0, structPtr->unk89C, 1); - - structPtr->unk89C++; - return 0; - case 2: - if (IsDma3ManagerBusyWithBgCopy()) - return 2; - - if (structPtr->unk89C != structPtr->unk888.visibleEntries) - return 6; - - if (structPtr->unk888.selectedIndexOffset != 0) - sub_81C8B70(&structPtr->unk0.unk0, structPtr->unk89C, structPtr->unk888.selectedIndexOffset); - - return 0; - case 3: - if (IsDma3ManagerBusyWithBgCopy()) - return 2; - temp = &structPtr->unk888.selectedIndexOffset; - v1 = *temp; - if (v1 == 0) - return 4; - - MatchCall_MoveWindow(v1, FALSE); - return 0; - case 4: - v2 = sub_81C8630(); - if (v2) - return 2; - - structPtr->unk888.selectedIndexOffset = v2; - return 4; - default: - return 4; - } -} - -u32 LoopedTask_sub_81C8958(s32 a0) -{ - struct UnknownSubStruct_81C81D4 *structPtr; - structPtr = GetSubstructPtr(0x11); - if (IsDma3ManagerBusyWithBgCopy()) - return 2; - - switch (a0) - { - case 0: - sub_81C8CB4(&structPtr->unk888, &structPtr->unk0); - break; - case 1: - PrintMatchCallFieldNames(&structPtr->unk0, 0); - break; - case 2: - sub_81C8E54(&structPtr->unk888, &structPtr->unk0, 0); - break; - case 3: - PrintMatchCallFieldNames(&structPtr->unk0, 1); - break; - case 4: - sub_81C8E54(&structPtr->unk888, &structPtr->unk0, 1); - break; - case 5: - PrintMatchCallFieldNames(&structPtr->unk0, 2); - break; - case 6: - sub_81C8E54(&structPtr->unk888, &structPtr->unk0, 2); - break; - case 7: - sub_81C8E54(&structPtr->unk888, &structPtr->unk0, 3); - break; - default: - return 4; - } - return 0; -} - -u32 LoopedTask_sub_81C8A28(s32 a0) -{ - struct UnknownSubStruct_81C81D4 *structPtr; - struct MatchCallWindowState *subPtr888; - register struct UnknownInnerStruct_81C81D4 *subPtr0 asm("r2"); - s32 v4; - - if (IsDma3ManagerBusyWithBgCopy()) - { - return 2; - } - - structPtr = GetSubstructPtr(0x11); - subPtr888 = &structPtr->unk888; - subPtr0 = &structPtr->unk0; - - switch (a0) - { - default: - return 4; - case 0: - sub_81C8D4C(subPtr888, subPtr0); - return 0; - case 1: - { - s32 v1; - s32 v2; - u32 *v3; - register s32 v4 asm("r5"); - - v3 = &structPtr->unk89C; - v1 = *v3 + 1; - *v3 = v1; - if (v1 < structPtr->unk888.visibleEntries) - { - sub_81C8B70(&subPtr0->unk0, v1, 1); - return 2; - } - - *v3 = 0; - if (subPtr888->listLength <= subPtr888->visibleEntries) - { - register u32 temp asm("r0"); - temp = subPtr888->windowTopIndex; - if (temp == 0) - return 9; - v2 = temp; - } - else - { - register s32 temp asm("r1"); - v2 = subPtr888->windowTopIndex + subPtr888->visibleEntries; - temp = (s32)subPtr888->listLength; - if (v2 <= temp) - return 9; - v2 -= temp; - } - v4 = v2 * -1; - sub_81C8B70(&subPtr0->unk0, v4, v2); - subPtr888->selectedIndexOffset = v2; - *v3 = v4; - return 0; - } - case 2: - MatchCall_MoveWindow(structPtr->unk89C, FALSE); - return 0; - case 3: - if (sub_81C8630()) - return 2; - - structPtr->unk89C = 0; - return 1; - case 4: - sub_81C83AC(subPtr888->unk10, subPtr888->windowTopIndex + structPtr->unk89C, 1, subPtr888->unkC, structPtr->unk89C, &structPtr->unk0); - return 0; - case 5: - if (sub_81C83E0()) - return 2; - - v4 = ++structPtr->unk89C; - if (v4 >= subPtr888->listLength || v4 >= subPtr888->visibleEntries) - return 1; - return 9; - case 6: - ToggleMatchCallArrows(subPtr0, 0); - return 4; - } -} - -void sub_81C8B70(struct UnknownSubSubStruct_0203CF40 *a0, u32 a1, u32 a2) -{ - u8 *v1; - u32 v2; - - v1 = (u8*)GetWindowAttribute(a0->windowId, WINDOW_TILE_DATA); - v2 = a0->unk4 * 64; - - a1 = (a0->unkA + a1) & 0xF; - if ((s32)(a1 + a2) <= 16) - { - CpuFastFill8(PIXEL_FILL(1), v1 + a1 * v2, a2 * v2); - CopyWindowToVram(a0->windowId, 2); - } - else - { - u32 v3; - u32 v4; - - v3 = 16 - a1; - v4 = a2 - v3; - - CpuFastFill8(PIXEL_FILL(1), v1 + a1 * v2, v3 * v2); - CpuFastFill8(PIXEL_FILL(1), v1, v4 * v2); - CopyWindowToVram(a0->windowId, 2); - } - - a2 -= 1; - for (a2; a2 != -1; a1 = (a1 + 1) & 0xF, a2--) - { - sub_81CBD48(a0->windowId, a1); - } - - CopyWindowToVram(a0->windowId, 1); -} - -void sub_81C8C64(struct UnknownSubSubStruct_0203CF40 *a0, u32 a1) -{ - u16 *v1; - register u32 v2 asm("r0"); - u32 v3; - - v1 = (u16*)GetBgTilemapBuffer(GetWindowAttribute(a0->windowId, WINDOW_BG)); - - v1 = &v1[(a0->unkA << 6) + a0->unk2 - 1]; - - if (a1 != 0) - { - v2 = a0->unk1 << 12; - v3 = a0->unk6 + 1; - } - else - { - v2 = a0->unk1 << 12; - v3 = a0->unk6; - } - { - register u16 v5 asm("r1"); - register u32 v6 asm("r0"); - v6 = (v3 | v2); - v6 = v6 << 16; - v5 = v6 >> 16; - v1[0] = v5; - v1[0x20] = v5; - } -} - -void sub_81C8CB4(struct MatchCallWindowState *a0, struct UnknownInnerStruct_81C81D4 *a1) -{ - u8 colors[3]; - - - memcpy(colors, sPokenavColors_0861FBE4, ARRAY_COUNT(sPokenavColors_0861FBE4)); - - a1->unk34(a0->unk10 + a0->unkC * a0->windowTopIndex, a1->unkTextBuffer); - a1->unk38(a1->unk0.windowId, a0->windowTopIndex, a1->unk0.unkA); - FillWindowPixelRect(a1->unk0.windowId, PIXEL_FILL(4), 0, a1->unk0.unkA * 16, a1->unk0.unk4 * 8, 16); - AddTextPrinterParameterized3(a1->unk0.windowId, a1->unk0.fontId, 8, (a1->unk0.unkA * 16) + 1, colors, TEXT_SPEED_FF, a1->unkTextBuffer); - sub_81C8C64(&a1->unk0, 1); - CopyWindowRectToVram(a1->unk0.windowId, 3, 0, a1->unk0.unkA * 2, a1->unk0.unk4, 2); -} - -void sub_81C8D4C(struct MatchCallWindowState *a0, struct UnknownInnerStruct_81C81D4 *a1) -{ - a1->unk34(a0->unk10 + a0->unkC * a0->windowTopIndex, a1->unkTextBuffer); - FillWindowPixelRect(a1->unk0.windowId, PIXEL_FILL(1), 0, a1->unk0.unkA * 16, a1->unk0.unk4 * 8, 16); - AddTextPrinterParameterized(a1->unk0.windowId, a1->unk0.fontId, a1->unkTextBuffer, 8, a1->unk0.unkA * 16 + 1, TEXT_SPEED_FF, NULL); - sub_81C8C64(&a1->unk0, 0); - CopyWindowToVram(a1->unk0.windowId, 3); -} - -void PrintMatchCallFieldNames(struct UnknownInnerStruct_81C81D4 *a0, u32 fieldId) -{ - const u8 *fieldNames[3]; - u8 colors[3]; - u32 r4; - u32 r5; - u32 tmp; - u32 one; - - memcpy(fieldNames, sMatchCallFieldNames, sizeof(sMatchCallFieldNames)); - memcpy(colors, sMatchCallFieldColors, sizeof(sMatchCallFieldColors)); - - r4 = a0->unk0.unkA; - tmp = fieldId * 2 + 1; - r4 += tmp; - r4 &= 0xF; - FillWindowPixelRect(a0->unk0.windowId, PIXEL_FILL(1), 0, r4 << 4, a0->unk0.unk4, 16); - - // This is a fake match. It should be this: - // AddTextPrinterParameterized3(a0->unk0.windowId, 7, 2, r4 << 4 + 1, colors, TEXT_SPEED_FF, fieldNames[fieldId]); - // But the original GCC does some clever reuse of the `1` constant that the current GCC doesn't. - one = 1; - AddTextPrinterParameterized3(a0->unk0.windowId, 7, 2, (r4 << 4) + one, colors, one - 2, fieldNames[fieldId]); - CopyWindowRectToVram(a0->unk0.windowId, 2, 0, r4 << 1, a0->unk0.unk4, 2); -} - -void sub_81C8E54(struct MatchCallWindowState *a0, struct UnknownInnerStruct_81C81D4 *a1, u32 a2) -{ - const u8 *str; - u32 r6; - - r6 = (a1->unk0.unkA + sUnknown_0861FBF7[a2]) & 0xF; - - str = sub_81CAFD8(a0->windowTopIndex, a2); - if (str != NULL) { - sub_81DB620(a1->unk0.windowId, 1, r6 * 2, a1->unk0.unk4 - 1, 2); - AddTextPrinterParameterized(a1->unk0.windowId, 7, str, 2, (r6 << 4) + 1, TEXT_SPEED_FF, NULL); - CopyWindowRectToVram(a1->unk0.windowId, 2, 0, r6 * 2, a1->unk0.unk4, 2); - } -} - -void sub_81C8ED0(void) -{ - u32 i; - const struct CompressedSpriteSheet *ptr; - - for (i = 0, ptr = sMatchcallArrowSpriteSheet; i < ARRAY_COUNT(sMatchcallArrowSpriteSheet); ptr++, i++) - { - LoadCompressedSpriteSheet(ptr); - } - Pokenav_AllocAndLoadPalettes(sMatchcallArrowPalette); -} - -void sub_81C8EF8(struct MatchCallWindowState *a0, struct UnknownInnerStruct_81C81D4 *a1) -{ - register u32 spriteId asm("r3"); - s16 temp; - - spriteId = (u8)CreateSprite(&sMatchCallRightArrowSprite, a1->unk0.unk2 * 8 + 3, (a1->unk0.unk3 + 1) * 8, 7); - a1->rightArrow = &gSprites[spriteId]; - - temp = a1->unk0.unk2 * 8 + (a1->unk0.unk4 - 1) * 4; - spriteId = (u8)CreateSprite(&sMatchCallUpDownArrowSprite, temp, a1->unk0.unk3 * 8 + a0->visibleEntries * 16, 7); - a1->downArrow = &gSprites[spriteId]; - a1->downArrow->oam.tileNum += 2; - a1->downArrow->callback = SpriteCB_MatchCallDownArrow; - - spriteId = (u8)CreateSprite(&sMatchCallUpDownArrowSprite, temp, a1->unk0.unk3 * 8, 7); - a1->upArrow = &gSprites[spriteId]; - a1->upArrow->oam.tileNum += 4; - a1->upArrow->callback = SpriteCB_MatchCallUpArrow; -} - -void sub_81C8FE0(struct UnknownInnerStruct_81C81D4 *a0) -{ - DestroySprite(a0->rightArrow); - DestroySprite(a0->upArrow); - DestroySprite(a0->downArrow); - FreeSpriteTilesByTag(0xA); - FreeSpritePaletteByTag(0x14); -} - -void ToggleMatchCallArrows(struct UnknownInnerStruct_81C81D4 *a0, bool32 shouldHide) -{ - if (shouldHide) - { - a0->rightArrow->callback = SpriteCallbackDummy; - a0->upArrow->callback = SpriteCallbackDummy; - a0->downArrow->callback = SpriteCallbackDummy; - } - else - { - a0->rightArrow->callback = SpriteCB_MatchCallRightArrow; - a0->upArrow->callback = SpriteCB_MatchCallUpArrow; - a0->downArrow->callback = SpriteCB_MatchCallDownArrow; - } - a0->rightArrow->invisible = shouldHide; - a0->upArrow->invisible = shouldHide; - a0->downArrow->invisible = shouldHide; -} - -void SpriteCB_MatchCallRightArrow(struct Sprite *sprite) -{ - struct UnknownSubStruct_81C81D4 *structPtr; - structPtr = GetSubstructPtr(0x11); - sprite->pos2.y = structPtr->unk888.selectedIndexOffset << 4; -} - -void SpriteCB_MatchCallDownArrow(struct Sprite *sprite) -{ - if (sprite->data[7] == 0 && ShouldShowDownArrow()) - sprite->invisible = FALSE; - else - sprite->invisible = TRUE; - - if (++sprite->data[0] > 3) - { - s16 offset; - - sprite->data[0] = 0; - offset = (sprite->data[1] + 1) & 7; - sprite->data[1] = offset; - sprite->pos2.y = offset; - } -} - -void SpriteCB_MatchCallUpArrow(struct Sprite *sprite) -{ - if (sprite->data[7] == 0 && ShouldShowUpArrow()) - sprite->invisible = FALSE; - else - sprite->invisible = TRUE; - - if (++sprite->data[0] > 3) - { - s16 offset; - - sprite->data[0] = 0; - offset = (sprite->data[1] + 1) & 7; - sprite->data[1] = offset; - sprite->pos2.y = -1 * offset; - } -} - -void ToggleMatchCallVerticalArrows(bool32 shouldHide) -{ - struct UnknownSubStruct_81C81D4 *structPtr; - structPtr = GetSubstructPtr(0x11); - structPtr->unk0.upArrow->data[7] = shouldHide; - structPtr->unk0.downArrow->data[7] = shouldHide; -} - -void sub_81C9160(struct MatchCallWindowState *a0, struct MatchCallListTemplate *a1) -{ - u32 unused1 = a0->unk10 = a1->unk0; - u32 v0 = a1->unk6; - u32 zero = 0; - u32 unused2 = a0->windowTopIndex = v0; - u32 v1 = a0->listLength = a1->unk4; - - a0->unkC = a1->unk8; - a0->visibleEntries = a1->unkC; - if (a0->visibleEntries >= (u16)v1) - { - a0->windowTopIndex = 0; - a0->unk4 = 0; - a0->selectedIndexOffset = v0; - } - else - { - s32 v2; - a0->unk4 = a0->listLength - a0->visibleEntries; - v2 = a0->windowTopIndex + a0->visibleEntries; - if (v2 > a0->listLength) { - a0->selectedIndexOffset = v2 - a0->listLength; - a0->windowTopIndex = v0 - a0->selectedIndexOffset; - } - else - { - a0->selectedIndexOffset = 0; - } - } -} - -u32 sub_81C91AC(struct UnknownInnerStruct_81C81D4 *a0, const struct BgTemplate *a1, struct MatchCallListTemplate *a2, s32 a3) -{ - register u32 raw_bg asm("r4") = ((a1->bg) << 30); - u8 bg = raw_bg >> 30; - u32 unknown = 0; - struct WindowTemplate window; - u8 bg_again; - - a0->unk0.bg = bg; - a0->unk0.unk6 = a3; - a0->unk34 = a2->unk10; - a0->unk38 = a2->unk14; - a0->unk0.unk1 = a2->unkD; - a0->unk0.unk2 = a2->unk9; - a0->unk0.unk3 = a2->unkB; - a0->unk0.unk4 = a2->unkA; - a0->unk0.fontId = a2->unkE; - - window.bg = raw_bg >> 30; - window.tilemapLeft = a2->unk9; - window.tilemapTop = 0; - window.width = a2->unkA; - window.height = 32; - window.paletteNum = a2->unkD; - window.baseBlock = a3 + 2; - - a0->unk0.windowId = AddWindow(&window); - if (a0->unk0.windowId == 0xFF) - { - return 0; - } - else - { - a0->unk0.unkA = unknown; - a0->rightArrow = NULL; - a0->upArrow = NULL; - a0->downArrow = NULL; - return 1; - } -} \ No newline at end of file diff --git a/src/pokenav_main_menu.c b/src/pokenav_main_menu.c new file mode 100644 index 000000000..a7ea1b7dc --- /dev/null +++ b/src/pokenav_main_menu.c @@ -0,0 +1,990 @@ +#include "global.h" +#include "pokenav.h" +#include "constants/songs.h" +#include "sound.h" +#include "constants/rgb.h" +#include "palette.h" +#include "bg.h" +#include "window.h" +#include "strings.h" +#include "graphics.h" +#include "decompress.h" +#include "gpu_regs.h" +#include "menu.h" +#include "dma3.h" + +enum +{ + NAVGEAR_GFX_MAIN_MENU, + NAVGEAR_GFX_CONDITION_MENU, + NAVGEAR_GFX_RIBBONS_MENU, + NAVGEAR_GFX_MATCH_CALL_MENU, + + // One of these is for the zoomed-in map, and the other is for the + // zoomed-out map. Don't know which is which yet. + NAVGEAR_GFX_MAP_MENU_UNK0, + NAVGEAR_GFX_MAP_MENU_UNK1, + + NAVGEAR_GFX_PARTY_MENU, + NAVGEAR_GFX_SEARCH_MENU, + NAVGEAR_GFX_COOL_MENU, + NAVGEAR_GFX_BEAUTY_MENU, + NAVGEAR_GFX_CUTE_MENU, + NAVGEAR_GFX_SMART_MENU, + NAVGEAR_GFX_TOUGH_MENU, + + NAVGEAR_GFX_MENUS_END +}; + +#define NAVGEAR_GFX_SUBMENUS_START NAVGEAR_GFX_PARTY_MENU + +struct PokenavMainMenuResources +{ + void (*unk0)(u32); + u32 (*unk4)(void); + u32 unk8; + u32 currentTaskId; + u32 unk10; + u32 unk14; + struct Sprite *spinningNavgear; + struct Sprite *leftHeaderSprites[2]; + struct Sprite *submenuLeftHeaderSprites[2]; + u8 tilemapBuffer[0x800]; +}; + +// This struct uses a 32bit tag, and doesn't have a size field. +// Needed to match LoadLeftHeaderGfxForSubMenu. +struct CompressedSpriteSheetNoSize +{ + const u32 *data; // LZ77 compressed palette data + u32 tag; +}; + +extern void sub_81CAADC(void); +void CleanupPokenavMainMenuResources(void); +void LoadLeftHeaderGfxForSubMenu(u32 arg0); +void LoadLeftHeaderGfxForMenu(u32 arg0); +void HideLeftHeaderSubmenuSprites(bool32 arg0); +void HideLeftHeaderSprites(bool32 arg0); +void ShowLeftHeaderSprites(u32 arg0, bool32 arg1); +void ShowLeftHeaderSubmenuSprites(u32 arg0, bool32 arg1); +void MoveLeftHeader(struct Sprite *sprite, s32 arg1, s32 arg2, s32 arg3); +void SpriteCB_MoveLeftHeader(struct Sprite *sprite); +void InitPokenavMainMenuResources(void); +void InitHoenMapHeaderSprites(void); +void sub_81C7B74(void); +void CopyPaletteIntoBufferUnfaded(const u16 *palette, u32 a1, u32 a2); +u32 LoopedTask_ScrollMenuHeaderDown(s32 a0); +u32 LoopedTask_ScrollMenuHeaderUp(s32 a0); +void sub_81C7BF8(u32 a0); + + +void SpriteCB_SpinningNavgear(struct Sprite* sprite); +u32 LoopedTask_InitPokenavMenu(s32 a0); + +const u16 gSpinningNavgearPaletteData[] = INCBIN_U16("graphics/pokenav/icon2.gbapal"); +const u32 gSpinningNavgearGfx[] = INCBIN_U32("graphics/pokenav/icon2.4bpp.lz"); +const u32 gUnused_SpinningNavgearGfx2[] = INCBIN_U32("graphics/pokenav/icon2_unused.4bpp.lz"); + +const struct BgTemplate gPokenavMainMenuBgTemplates[] = +{ + { + .bg = 0, + .charBaseIndex = 0, + .mapBaseIndex = 5, + .screenSize = 0, + .paletteMode = 0, + .priority = 0, + .baseTile = 0, + } +}; + +const struct WindowTemplate gUnknown_0861FA08[2] = +{ + { + .bg = 0, + .tilemapLeft = 1, + .tilemapTop = 22, + .width = 16, + .height = 2, + .paletteNum = 0, + .baseBlock = 0x36, + }, + { + .bg = 0xFF, + .tilemapLeft = 0, + .tilemapTop = 0, + .width = 0, + .height = 0, + .paletteNum = 0, + .baseBlock = 0, + }, +}; + +const u8 *const (sMenuButtonReminders[12]) = +{ + gText_Navgear_ClearButtonList, + gText_NavgearMap_ZoomedOutButtons, + gText_NavgearMap_ZoomedInButtons, + gText_NavgearCondition_MonListButtons, + gText_NavgearCondition_MonStatusButtons, + gText_NavgearCondition_MarkingButtons, + gText_NavgearMatchCall_TrainerListButtons, + gText_NavgearMatchCall_CallMenuButtons, + gText_NavgearMatchCall_CheckTrainerButtons, + gText_NavgearRibbons_MonListButtons, + gText_NavgearRibbons_RibbonListButtons, + gText_NavgearRibbons_RibbonCheckButtons, +}; + +const u8 gMenuButtonReminderColor[4] = +{ + 4, 1, 2, 0 +}; + +static const struct CompressedSpriteSheet gSpinningNavgearSpriteSheet[] = +{ + { + .data = gSpinningNavgearGfx, + .size = 0x1000, + .tag = 0, + } +}; + +static const struct SpritePalette gSpinningNavgearPalette[] = +{ + { + .data = gSpinningNavgearPaletteData, + .tag = 0, + }, + {} +}; + +static const struct CompressedSpriteSheet sPokenavHoenMapLeftHeaderSpriteSheet = +{ + .data = gPokenavLeftHeaderHoennMap_Gfx, + .size = 0xC00, + .tag = 2 +}; + +static const struct CompressedSpriteSheet sPokenavMenuLeftHeaderSpriteSheets[] = +{ + [NAVGEAR_GFX_MAIN_MENU] = { + .data = gPokenavLeftHeaderMainMenu_Gfx, + .size = 0x20, + .tag = 3 + }, + [NAVGEAR_GFX_CONDITION_MENU] = { + .data = gPokenavLeftHeaderCondition_Gfx, + .size = 0x20, + .tag = 1 + }, + [NAVGEAR_GFX_RIBBONS_MENU] = { + .data = gPokenavLeftHeaderRibbons_Gfx, + .size = 0x20, + .tag = 2 + }, + [NAVGEAR_GFX_MATCH_CALL_MENU] = { + .data = gPokenavLeftHeaderMatchCall_Gfx, + .size = 0x20, + .tag = 4 + }, + [NAVGEAR_GFX_MAP_MENU_UNK0] = { + .data = gPokenavLeftHeaderHoennMap_Gfx, + .size = 0x20, + .tag = 0 + }, + [NAVGEAR_GFX_MAP_MENU_UNK1] = { + .data = gPokenavLeftHeaderHoennMap_Gfx, + .size = 0x40, + .tag = 0 + } +}; + +static const struct CompressedSpriteSheetNoSize sPokenavSubMenuLeftHeaderSpriteSheets[] = +{ + [NAVGEAR_GFX_PARTY_MENU - NAVGEAR_GFX_SUBMENUS_START] = { + .data = gPokenavLeftHeaderParty_Gfx, + .tag = 1 + }, + [NAVGEAR_GFX_SEARCH_MENU - NAVGEAR_GFX_SUBMENUS_START] = { + .data = gPokenavLeftHeaderSearch_Gfx, + .tag = 1 + }, + [NAVGEAR_GFX_COOL_MENU - NAVGEAR_GFX_SUBMENUS_START] = { + .data = gPokenavLeftHeaderCool_Gfx, + .tag = 4 + }, + [NAVGEAR_GFX_BEAUTY_MENU - NAVGEAR_GFX_SUBMENUS_START] = { + .data = gPokenavLeftHeaderBeauty_Gfx, + .tag = 1 + }, + [NAVGEAR_GFX_CUTE_MENU - NAVGEAR_GFX_SUBMENUS_START] = { + .data = gPokenavLeftHeaderCute_Gfx, + .tag = 2 + }, + [NAVGEAR_GFX_SMART_MENU - NAVGEAR_GFX_SUBMENUS_START] = { + .data = gPokenavLeftHeaderSmart_Gfx, + .tag = 0 + }, + [NAVGEAR_GFX_TOUGH_MENU - NAVGEAR_GFX_SUBMENUS_START] = { + .data = gPokenavLeftHeaderTough_Gfx, + .tag = 0 + } +}; + +static const struct OamData sSpinningNavgearSpriteOam = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, // FIXME: Use SPRITE_SHAPE + .x = 0, + .matrixNum = 0, + .size = 2, // FIXME: Use SPRITE_SIZE + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0 +}; + +static const union AnimCmd sSpinningNavgearAnims[] = +{ + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(16, 8), + ANIMCMD_FRAME(32, 8), + ANIMCMD_FRAME(48, 8), + ANIMCMD_FRAME(64, 8), + ANIMCMD_FRAME(80, 8), + ANIMCMD_FRAME(96, 8), + ANIMCMD_FRAME(112, 8), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd *const sSpinningNavgearAnimTable[] = +{ + sSpinningNavgearAnims +}; + +static const struct SpriteTemplate sSpinningNavgearSpriteTemplate = +{ + .tileTag = 0, + .paletteTag = 0, + .oam = &sSpinningNavgearSpriteOam, + .anims = sSpinningNavgearAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_SpinningNavgear +}; + +static const struct OamData sPokenavLeftHeaderHoenMapSpriteOam = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 1, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0 +}; + +static const struct OamData sUnknown_0861FB24 = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 1, + .x = 0, + .matrixNum = 0, + .size = 2, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0 +}; + +static const struct SpriteTemplate sPokenavLeftHeaderHoenMapSpriteTemplate = +{ + .tileTag = 2, + .paletteTag = 1, + .oam = &sPokenavLeftHeaderHoenMapSpriteOam, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy +}; + +static const struct SpriteTemplate sUnknown_0861FB44 = +{ + .tileTag = 2, + .paletteTag = 2, + .oam = &sUnknown_0861FB24, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy +}; + +bool32 InitPokenavMainMenu(void) +{ + struct PokenavMainMenuResources *structPtr; + + structPtr = AllocSubstruct(0, sizeof(struct PokenavMainMenuResources)); + if (structPtr == NULL) + return FALSE; + + ResetSpriteData(); + FreeAllSpritePalettes(); + structPtr->currentTaskId = CreateLoopedTask(LoopedTask_InitPokenavMenu, 1); + return TRUE; +} + +u32 PokenavMainMenuLoopedTaskIsActive(void) +{ + struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); + return IsLoopedTaskActive(structPtr->currentTaskId); +} + +void ShutdownPokenav(void) +{ + PlaySE(SE_PN_OFF); + sub_81CAADC(); + BeginNormalPaletteFade(0xFFFFFFFF, -1, 0, 16, RGB_BLACK); +} + +bool32 WaitForPokenavShutdownFade(void) +{ + if (!gPaletteFade.active) + { + sub_81C99D4(); + CleanupPokenavMainMenuResources(); + FreeAllWindowBuffers(); + return FALSE; + } + + return TRUE; +} + +u32 LoopedTask_InitPokenavMenu(s32 a0) +{ + struct PokenavMainMenuResources *structPtr; + + switch (a0) + { + case 0: + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP); + FreeAllWindowBuffers(); + ResetBgsAndClearDma3BusyFlags(0); + InitBgsFromTemplates(0, gPokenavMainMenuBgTemplates, ARRAY_COUNT(gPokenavMainMenuBgTemplates)); + ResetBgPositions(); + reset_temp_tile_data_buffers(); + return LT_INC_AND_CONTINUE; + case 1: + structPtr = GetSubstructPtr(0); + decompress_and_copy_tile_data_to_vram(0, &gPokenavHeader_Gfx, 0, 0, 0); + SetBgTilemapBuffer(0, structPtr->tilemapBuffer); + CopyToBgTilemapBuffer(0, &gPokenavHeader_Tilemap, 0, 0); + CopyPaletteIntoBufferUnfaded(gPokenavHeader_Pal, 0, 0x20); + CopyBgTilemapBufferToVram(0); + return LT_INC_AND_PAUSE; + case 2: + if (free_temp_tile_data_buffers_if_possible()) + return LT_PAUSE; + + sub_81C7B74(); + return LT_INC_AND_PAUSE; + case 3: + if (IsDma3ManagerBusyWithBgCopy()) + return LT_PAUSE; + + InitPokenavMainMenuResources(); + InitHoenMapHeaderSprites(); + ShowBg(0); + return LT_FINISH; + default: + return LT_FINISH; + } +} + +void sub_81C7834(void *func1, void *func2) // Fix types later. +{ + struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); + structPtr->unk0 = func1; + structPtr->unk4 = func2; + structPtr->unk8 = 0; +} + +void sub_81C7850(u32 a0) +{ + struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); + structPtr->unk8 = 0; + structPtr->unk0(a0); +} + +u32 sub_81C786C(void) +{ + struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); + return structPtr->unk4(); +} + +void sub_81C7880(void) +{ + struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); + structPtr->currentTaskId = CreateLoopedTask(LoopedTask_ScrollMenuHeaderDown, 4); +} + +void sub_81C78A0(void) +{ + struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); + structPtr->currentTaskId = CreateLoopedTask(LoopedTask_ScrollMenuHeaderUp, 4); +} + +bool32 MainMenuLoopedTaskIsBusy(void) +{ + struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); + return IsLoopedTaskActive(structPtr->currentTaskId); +} + +u32 LoopedTask_ScrollMenuHeaderDown(s32 a0) +{ + switch (a0) + { + default: + return LT_FINISH; + case 1: + return LT_INC_AND_PAUSE; + case 0: + return LT_INC_AND_PAUSE; + case 2: + if (ChangeBgY(0, 384, 1) >= 0x2000u) + { + ChangeBgY(0, 0x2000, 0); + return LT_FINISH; + } + + return LT_PAUSE; + } +} + +u32 LoopedTask_ScrollMenuHeaderUp(s32 a0) +{ + if (ChangeBgY(0, 384, 2) <= 0) + { + ChangeBgY(0, 0, 0); + return 4; + } + return 2; +} + +void CopyPaletteIntoBufferUnfaded(const u16 *palette, u32 bufferOffset, u32 size) +{ + CpuCopy16(palette, gPlttBufferUnfaded + bufferOffset, size); +} + +void Pokenav_AllocAndLoadPalettes(const struct SpritePalette *palettes) +{ + const struct SpritePalette *current; + u32 index; + + for (current = palettes; current->data != NULL; current++) + { + index = AllocSpritePalette(current->tag); + if (index == 0xFF) + { + break; + } + else + { + index = (index * 16) + 0x100; + CopyPaletteIntoBufferUnfaded(current->data, index, 0x20); + } + } +} + +void sub_81C7990(u32 a0, u16 a1) +{ + CpuFill16(a1, gPlttBufferFaded + 0x100 + (a0 * 16), 16 * sizeof(u16)); +} + +__attribute__((naked)) +void sub_81C79BC(u16 *a0, u16 *a1, u32 a2, u32 a3, u32 a4, u32 a5) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0xC\n\ + str r0, [sp]\n\ + str r1, [sp, 0x4]\n\ + mov r10, r2\n\ + str r3, [sp, 0x8]\n\ + ldr r0, [sp, 0x2C]\n\ + cmp r0, 0\n\ + bne _081C79E4\n\ + ldr r2, =0x001fffff\n\ + mov r1, r10\n\ + ands r2, r1\n\ + ldr r0, [sp]\n\ + b _081C79F4\n\ + .pool\n\ +_081C79E4:\n\ + ldr r2, [sp, 0x2C]\n\ + ldr r0, [sp, 0x8]\n\ + cmp r2, r0\n\ + blt _081C7A00\n\ + ldr r2, =0x001fffff\n\ + mov r1, r10\n\ + ands r2, r1\n\ + ldr r0, [sp, 0x4]\n\ +_081C79F4:\n\ + ldr r1, [sp, 0x30]\n\ + bl CpuSet\n\ + b _081C7AAE\n\ + .pool\n\ +_081C7A00:\n\ + movs r2, 0x1\n\ + negs r2, r2\n\ + add r10, r2\n\ + b _081C7AA6\n\ +_081C7A08:\n\ + ldr r1, [sp]\n\ + ldrh r0, [r1]\n\ + movs r2, 0x1F\n\ + mov r9, r2\n\ + mov r1, r9\n\ + ands r1, r0\n\ + mov r9, r1\n\ + lsls r0, 16\n\ + lsrs r2, r0, 21\n\ + movs r1, 0x1F\n\ + ands r1, r2\n\ + mov r8, r1\n\ + lsrs r7, r0, 26\n\ + movs r2, 0x1F\n\ + ands r7, r2\n\ + ldr r0, [sp, 0x4]\n\ + ldrh r4, [r0]\n\ + movs r0, 0x1F\n\ + ands r0, r4\n\ + mov r1, r9\n\ + subs r0, r1\n\ + lsls r0, 8\n\ + ldr r1, [sp, 0x8]\n\ + bl __divsi3\n\ + ldr r2, [sp, 0x2C]\n\ + adds r6, r0, 0\n\ + muls r6, r2\n\ + asrs r6, 8\n\ + lsls r4, 16\n\ + lsrs r0, r4, 21\n\ + movs r1, 0x1F\n\ + ands r0, r1\n\ + mov r2, r8\n\ + subs r0, r2\n\ + lsls r0, 8\n\ + ldr r1, [sp, 0x8]\n\ + bl __divsi3\n\ + ldr r1, [sp, 0x2C]\n\ + adds r5, r0, 0\n\ + muls r5, r1\n\ + asrs r5, 8\n\ + lsrs r4, 26\n\ + movs r2, 0x1F\n\ + ands r4, r2\n\ + subs r4, r7\n\ + lsls r4, 8\n\ + adds r0, r4, 0\n\ + ldr r1, [sp, 0x8]\n\ + bl __divsi3\n\ + ldr r1, [sp, 0x2C]\n\ + muls r0, r1\n\ + asrs r0, 8\n\ + add r6, r9\n\ + movs r2, 0x1F\n\ + ands r6, r2\n\ + add r5, r8\n\ + ands r5, r2\n\ + adds r0, r7, r0\n\ + ands r0, r2\n\ + lsls r0, 10\n\ + lsls r5, 5\n\ + orrs r0, r5\n\ + orrs r0, r6\n\ + ldr r1, [sp, 0x30]\n\ + strh r0, [r1]\n\ + ldr r2, [sp]\n\ + adds r2, 0x2\n\ + str r2, [sp]\n\ + ldr r0, [sp, 0x4]\n\ + adds r0, 0x2\n\ + str r0, [sp, 0x4]\n\ + adds r1, 0x2\n\ + str r1, [sp, 0x30]\n\ + movs r1, 0x1\n\ + negs r1, r1\n\ + add r10, r1\n\ +_081C7AA6:\n\ + movs r0, 0x1\n\ + negs r0, r0\n\ + cmp r10, r0\n\ + bne _081C7A08\n\ +_081C7AAE:\n\ + add sp, 0xC\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .syntax divided"); +} + +void sub_81C7AC0(s32 a0) +{ + struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); + + switch (a0) + { + case 0: + BeginNormalPaletteFade(structPtr->unk14, -2, 0, 16, RGB_BLACK); + break; + case 1: + BeginNormalPaletteFade(structPtr->unk14, -2, 16, 0, RGB_BLACK); + break; + case 2: + BeginNormalPaletteFade(0xFFFFFFFF, -2, 0, 16, RGB_BLACK); + break; + case 3: + BeginNormalPaletteFade(0xFFFFFFFF, -2, 16, 0, RGB_BLACK); + break; + } +} + +bool32 IsPaletteFadeActive(void) +{ + return gPaletteFade.active; +} + +void sub_81C7B40(void) +{ + BlendPalettes(0xFFFEFFFE, 16, RGB_BLACK); +} + +void InitBgTemplates(const struct BgTemplate *templates, s32 count) +{ + s32 i; + + for (i = 0; i < count; i++) + InitBgFromTemplate(templates++); +} + +void sub_81C7B74(void) +{ + struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); + + InitWindows(&gUnknown_0861FA08[0]); + structPtr->unk10 = 0; + sub_81C7BF8(structPtr->unk10); + PutWindowTilemap(structPtr->unk10); + CopyWindowToVram(structPtr->unk10, 3); // TODO: Use a defined constant here. +} + +void sub_81C7BA4(u32 a0) +{ + struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); + + sub_81C7BF8(structPtr->unk10); + AddTextPrinterParameterized3(structPtr->unk10, 1, 0, 1, gMenuButtonReminderColor, 0, sMenuButtonReminders[a0]); +} + +bool32 IsDma3ManagerBusyWithBgCopy_(void) +{ + return IsDma3ManagerBusyWithBgCopy(); +} + +void sub_81C7BF8(u32 windowId) +{ + FillWindowPixelBuffer(windowId, PIXEL_FILL(4)); + FillWindowPixelRect(windowId, PIXEL_FILL(5), 0, 0, 0x80, 1); +} + +void InitPokenavMainMenuResources(void) +{ + s32 i; + u8 spriteId; + struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); + + for (i = 0; i < ARRAY_COUNT(gSpinningNavgearSpriteSheet); i++) + LoadCompressedSpriteSheet(&gSpinningNavgearSpriteSheet[i]); + + Pokenav_AllocAndLoadPalettes(gSpinningNavgearPalette); + structPtr->unk14 = ~1 & ~(0x10000 << IndexOfSpritePaletteTag(0)); + spriteId = CreateSprite(&sSpinningNavgearSpriteTemplate, 220, 12, 0); + structPtr->spinningNavgear = &gSprites[spriteId]; +} + +void CleanupPokenavMainMenuResources(void) +{ + struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); + + DestroySprite(structPtr->spinningNavgear); + FreeSpriteTilesByTag(0); + FreeSpritePaletteByTag(0); +} + +void SpriteCB_SpinningNavgear(struct Sprite *sprite) +{ + // If the background starts scrolling, follow it. + sprite->pos2.y = (GetBgY(0) / 256u) * -1; +} + +struct Sprite *PauseSpinningNavgearSprite(void) +{ + struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); + + structPtr->spinningNavgear->callback = SpriteCallbackDummy; + return structPtr->spinningNavgear; +} + +void ResumeSpinningNavgearSprite(void) +{ + struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); + + structPtr->spinningNavgear->pos1.x = 220; + structPtr->spinningNavgear->pos1.y = 12; + structPtr->spinningNavgear->callback = SpriteCB_SpinningNavgear; + structPtr->spinningNavgear->invisible = FALSE; + structPtr->spinningNavgear->oam.priority = 0; + structPtr->spinningNavgear->subpriority = 0; +} + +void InitHoenMapHeaderSprites(void) +{ + s32 i, spriteId; + struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); + + LoadCompressedSpriteSheet(&sPokenavHoenMapLeftHeaderSpriteSheet); + AllocSpritePalette(1); + AllocSpritePalette(2); + for (i = 0; i < (s32)ARRAY_COUNT(structPtr->leftHeaderSprites); i++) + { + spriteId = CreateSprite(&sPokenavLeftHeaderHoenMapSpriteTemplate, 0, 0, 1); + structPtr->leftHeaderSprites[i] = &gSprites[spriteId]; + structPtr->leftHeaderSprites[i]->invisible = TRUE; + structPtr->leftHeaderSprites[i]->pos2.x = i * 64; + + spriteId = CreateSprite(&sUnknown_0861FB44, 0, 0, 2); + structPtr->submenuLeftHeaderSprites[i] = &gSprites[spriteId]; + structPtr->submenuLeftHeaderSprites[i]->invisible = TRUE; + structPtr->submenuLeftHeaderSprites[i]->pos2.x = i * 32; + structPtr->submenuLeftHeaderSprites[i]->pos2.y = 18; + structPtr->submenuLeftHeaderSprites[i]->oam.tileNum += (i * 8) + 64; + } +} + +void LoadLeftHeaderGfxForIndex(u32 arg0) +{ + if (arg0 < NAVGEAR_GFX_SUBMENUS_START) + LoadLeftHeaderGfxForMenu(arg0); + else + LoadLeftHeaderGfxForSubMenu(arg0 - NAVGEAR_GFX_SUBMENUS_START); +} + +void sub_81C7E14(u32 arg0) +{ + struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); + + if (arg0 == 4) + structPtr->leftHeaderSprites[1]->oam.tileNum = GetSpriteTileStartByTag(2) + 32; + else + structPtr->leftHeaderSprites[1]->oam.tileNum = GetSpriteTileStartByTag(2) + 64; +} + +void LoadLeftHeaderGfxForMenu(u32 index) +{ + struct PokenavMainMenuResources *structPtr; + u32 size, tag; + + if (index >= NAVGEAR_GFX_SUBMENUS_START) + return; + + structPtr = GetSubstructPtr(0); + tag = sPokenavMenuLeftHeaderSpriteSheets[index].tag; + size = GetDecompressedDataSize(sPokenavMenuLeftHeaderSpriteSheets[index].data); + LoadPalette(&gPokenavLeftHeader_Pal[tag * 16], (IndexOfSpritePaletteTag(1) * 16) + 0x100, 0x20); + LZ77UnCompWram(sPokenavMenuLeftHeaderSpriteSheets[index].data, gDecompressionBuffer); + RequestDma3Copy(gDecompressionBuffer, (void *)VRAM + 0x10000 + (GetSpriteTileStartByTag(2) * 32), size, 1); + structPtr->leftHeaderSprites[1]->oam.tileNum = GetSpriteTileStartByTag(2) + sPokenavMenuLeftHeaderSpriteSheets[index].size; + + if (index == NAVGEAR_GFX_MAP_MENU_UNK0 || index == NAVGEAR_GFX_MAP_MENU_UNK1) + structPtr->leftHeaderSprites[1]->pos2.x = 56; + else + structPtr->leftHeaderSprites[1]->pos2.x = 64; +} + +void LoadLeftHeaderGfxForSubMenu(u32 arg0) +{ + u32 size, tag; + + if (arg0 >= NAVGEAR_GFX_MENUS_END - NAVGEAR_GFX_SUBMENUS_START) + return; + + tag = sPokenavSubMenuLeftHeaderSpriteSheets[arg0].tag; + size = GetDecompressedDataSize(sPokenavSubMenuLeftHeaderSpriteSheets[arg0].data); + LoadPalette(&gPokenavLeftHeader_Pal[tag * 16], (IndexOfSpritePaletteTag(2) * 16) + 0x100, 0x20); + LZ77UnCompWram(sPokenavSubMenuLeftHeaderSpriteSheets[arg0].data, &gDecompressionBuffer[0x1000]); + RequestDma3Copy(&gDecompressionBuffer[0x1000], (void *)VRAM + 0x10800 + (GetSpriteTileStartByTag(2) * 32), size, 1); +} + +void sub_81C7FA0(u32 arg0, bool32 arg1, bool32 arg2) +{ + u32 var; + + if (!arg1) + var = 0x30; + else + var = 0x10; + + if (arg0 < 6) + ShowLeftHeaderSprites(var, arg2); + else + ShowLeftHeaderSubmenuSprites(var, arg2); +} + +void sub_81C7FC4(u32 arg0, bool32 arg1) +{ + if (arg0 < 6) + HideLeftHeaderSprites(arg1); + else + HideLeftHeaderSubmenuSprites(arg1); +} + +void sub_81C7FDC(void) +{ + s32 i; + struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); + + for (i = 0; i < (s32)ARRAY_COUNT(structPtr->leftHeaderSprites); i++) + { + structPtr->leftHeaderSprites[i]->invisible = TRUE; + structPtr->submenuLeftHeaderSprites[i]->invisible = TRUE; + } +} + +bool32 sub_81C8010(void) +{ + struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); + + if (structPtr->leftHeaderSprites[0]->callback == SpriteCallbackDummy && structPtr->submenuLeftHeaderSprites[0]->callback == SpriteCallbackDummy) + return FALSE; + else + return TRUE; +} + +void ShowLeftHeaderSprites(u32 startY, bool32 isOnRightSide) +{ + s32 start, end, i; + struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); + + if (!isOnRightSide) + start = -96, end = 32; + else + start = 256, end = 160; + + for (i = 0; i < (s32)ARRAY_COUNT(structPtr->leftHeaderSprites); i++) + { + structPtr->leftHeaderSprites[i]->pos1.y = startY; + MoveLeftHeader(structPtr->leftHeaderSprites[i], start, end, 12); + } +} + +void ShowLeftHeaderSubmenuSprites(u32 startY, bool32 isOnRightSide) +{ + s32 start, end, i; + struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); + + if (!isOnRightSide) + start = -96, end = 16; + else + start = 256, end = 192; + + for (i = 0; i < (s32)ARRAY_COUNT(structPtr->submenuLeftHeaderSprites); i++) + { + structPtr->submenuLeftHeaderSprites[i]->pos1.y = startY; + MoveLeftHeader(structPtr->submenuLeftHeaderSprites[i], start, end, 12); + } +} + +void HideLeftHeaderSprites(bool32 isOnRightSide) +{ + s32 start, end, i; + struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); + + if (!isOnRightSide) + start = 32, end = -96; + else + start = 192, end = 256; + + for (i = 0; i < (s32)ARRAY_COUNT(structPtr->leftHeaderSprites); i++) + { + MoveLeftHeader(structPtr->leftHeaderSprites[i], start, end, 12); + } +} + +void HideLeftHeaderSubmenuSprites(bool32 isOnRightSide) +{ + s32 start, end, i; + struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); + + if (!isOnRightSide) + start = 16, end = -96; + else + start = 192, end = 256; + + for (i = 0; i < (s32)ARRAY_COUNT(structPtr->submenuLeftHeaderSprites); i++) + { + MoveLeftHeader(structPtr->submenuLeftHeaderSprites[i], start, end, 12); + } +} + +void MoveLeftHeader(struct Sprite *sprite, s32 startX, s32 endX, s32 duration) +{ + sprite->pos1.x = startX; + sprite->data[0] = startX * 16; + sprite->data[1] = (endX - startX) * 16 / duration; + sprite->data[2] = duration; + sprite->data[7] = endX; + sprite->callback = SpriteCB_MoveLeftHeader; +} + +void SpriteCB_MoveLeftHeader(struct Sprite *sprite) +{ + if (sprite->data[2] != 0) + { + sprite->data[2]--; + sprite->data[0] += sprite->data[1]; + sprite->pos1.x = sprite->data[0] >> 4; + if (sprite->pos1.x < -16 || sprite->pos1.x > 256) + sprite->invisible = TRUE; + else + sprite->invisible = FALSE; + } + else + { + sprite->pos1.x = sprite->data[7]; + sprite->callback = SpriteCallbackDummy; + } +} diff --git a/src/pokenav_match_call.c b/src/pokenav_match_call.c deleted file mode 100644 index 1f621922d..000000000 --- a/src/pokenav_match_call.c +++ /dev/null @@ -1,1448 +0,0 @@ -#include "global.h" -#include "battle_setup.h" -#include "data.h" -#include "event_data.h" -#include "string_util.h" -#include "battle.h" -#include "gym_leader_rematch.h" -#include "match_call.h" - -// Static type declarations - -typedef struct MatchCallTextDataStruct { - const u8 *text; - u16 flag; - u16 flag2; -} match_call_text_data_t; - -struct MatchCallStructCommon { - u8 type; - u8 v1; - u16 flag; -}; - -struct MatchCallStruct0 { - u8 type; - u8 v1; - u16 flag; - const u8 *desc; - const u8 *name; - const match_call_text_data_t *textData; -}; - -struct MatchCallStruct1 { - u8 type; - u8 v1; - u16 flag; - u16 rematchTableIdx; - const u8 *desc; - const u8 *name; - const match_call_text_data_t *textData; -}; - -struct MatchCallSubstruct2 { - u16 flag; - u8 v2; -}; - -struct MatchCallStruct2 { - u8 type; - u8 v1; - u16 flag; - u16 rematchTableIdx; - const u8 *desc; - const match_call_text_data_t *textData; - const struct MatchCallSubstruct2 *v10; -}; - -struct MatchCallStruct3 { - u8 type; - u8 v1; - u16 flag; - const u8 *desc; - const u8 *name; -}; - -struct MatchCallStruct4 { - u8 type; - u8 gender; - u16 flag; - const u8 *desc; - const u8 *name; - const match_call_text_data_t *textData; -}; - -// Note: Type1 and Type5 have identical struct layouts. -struct MatchCallStruct5 { - u8 type; - u8 v1; - u16 flag; - u16 rematchTableIdx; - const u8 *desc; - const u8 *name; - const match_call_text_data_t *textData; -}; - -typedef union { - const struct MatchCallStructCommon *common; - const struct MatchCallStruct0 *type0; - const struct MatchCallStruct1 *type1; - const struct MatchCallStruct2 *type2; - const struct MatchCallStruct3 *type3; - const struct MatchCallStruct4 *type4; - const struct MatchCallStruct5 *type5; -} match_call_t; - -struct UnkStruct_08625388 { - u16 idx; - u16 v2; - u16 v4; - const u8 *v8[4]; -}; - -// Static RAM declarations - -// Static ROM declarations - -static bool32 MatchCallGetFlag_Type0(match_call_t); -static bool32 MatchCallGetFlag_Type1(match_call_t); -static bool32 MatchCallGetFlag_Type2(match_call_t); -static bool32 MatchCallGetFlag_Type3(match_call_t); -static bool32 MatchCallGetFlag_Type4(match_call_t); - -static u8 sub_81D1714(match_call_t); -static u8 sub_81D1718(match_call_t); -static u8 sub_81D171C(match_call_t); -static u8 sub_81D1750(match_call_t); -static u8 sub_81D1754(match_call_t); - -static bool32 MatchCall_IsRematchable_Type0(match_call_t); -static bool32 MatchCall_IsRematchable_Type1(match_call_t); -static bool32 MatchCall_IsRematchable_Type2(match_call_t); -static bool32 MatchCall_IsRematchable_Type3(match_call_t); -static bool32 MatchCall_IsRematchable_Type4(match_call_t); - -static bool32 sub_81D1840(match_call_t); -static bool32 sub_81D1844(match_call_t); -static bool32 sub_81D1848(match_call_t); -static bool32 sub_81D184C(match_call_t); -static bool32 sub_81D1850(match_call_t); - -static u32 MatchCall_GetRematchTableIdx_Type0(match_call_t); -static u32 MatchCall_GetRematchTableIdx_Type1(match_call_t); -static u32 MatchCall_GetRematchTableIdx_Type2(match_call_t); -static u32 MatchCall_GetRematchTableIdx_Type3(match_call_t); -static u32 MatchCall_GetRematchTableIdx_Type4(match_call_t); - -static void MatchCall_GetMessage_Type0(match_call_t, u8 *); -static void MatchCall_GetMessage_Type1(match_call_t, u8 *); -static void MatchCall_GetMessage_Type2(match_call_t, u8 *); -static void MatchCall_GetMessage_Type3(match_call_t, u8 *); -static void MatchCall_GetMessage_Type4(match_call_t, u8 *); - -static void MatchCall_GetNameAndDesc_Type0(match_call_t, const u8 **, const u8 **); -static void MatchCall_GetNameAndDesc_Type1(match_call_t, const u8 **, const u8 **); -static void MatchCall_GetNameAndDesc_Type2(match_call_t, const u8 **, const u8 **); -static void MatchCall_GetNameAndDesc_Type3(match_call_t, const u8 **, const u8 **); -static void MatchCall_GetNameAndDesc_Type4(match_call_t, const u8 **, const u8 **); - -static void sub_81D1920(const match_call_text_data_t *, u8 *); -static void sub_81D199C(const match_call_text_data_t *, u16, u8 *); -static void MatchCall_GetNameAndDescByRematchIdx(u32, const u8 **, const u8 **); - -extern const u8 gText_MrStone_Pokenav_2B60C0[]; -extern const u8 gText_MrStone_Pokenav_2B61E6[]; -extern const u8 gText_MrStone_Pokenav_2B6302[]; -extern const u8 gText_MrStone_Pokenav_2B63A0[]; -extern const u8 gText_MrStone_Pokenav_2B64A2[]; -extern const u8 gText_MrStone_Pokenav_2B6526[]; -extern const u8 gText_MrStone_Pokenav_2B65BB[]; -extern const u8 gText_MrStone_Pokenav_2B6664[]; -extern const u8 gText_MrStone_Pokenav_2B66B1[]; -extern const u8 gText_MrStone_Pokenav_2B6703[]; -extern const u8 gText_MrStone_Pokenav_2B67ED[]; - -extern const u8 gMrStoneMatchCallDesc[]; -extern const u8 gMrStoneMatchCallName[]; - -extern const u8 gText_Norman_Pokenav_2B5719[]; -extern const u8 gText_Norman_Pokenav_2B5795[]; -extern const u8 gText_Norman_Pokenav_2B584D[]; -extern const u8 gText_Norman_Pokenav_2B58E3[]; -extern const u8 gText_Norman_Pokenav_2B5979[]; -extern const u8 gText_Norman_Pokenav_2B5A07[]; -extern const u8 gText_Norman_Pokenav_2B5A69[]; -extern const u8 gText_Norman_Pokenav_2B5ACF[]; -extern const u8 gText_Norman_Pokenav_2B5B5E[]; - -extern const u8 gNormanMatchCallDesc[]; -extern const u8 gNormanMatchCallName[]; - -extern const u8 gProfBirchMatchCallDesc[]; -extern const u8 gProfBirchMatchCallName[]; - -extern const u8 gText_Mom_Pokenav_2B227B[]; -extern const u8 gText_Mom_Pokenav_2B2310[]; -extern const u8 gText_Mom_Pokenav_2B23F3[]; - -extern const u8 gMomMatchCallDesc[]; -extern const u8 gMomMatchCallName[]; - -extern const u8 gText_Steven_Pokenav_2B5B95[]; -extern const u8 gText_Steven_Pokenav_2B5C53[]; -extern const u8 gText_Steven_Pokenav_2B5CC9[]; -extern const u8 gText_Steven_Pokenav_2B5DB4[]; -extern const u8 gText_Steven_Pokenav_2B5E26[]; -extern const u8 gText_Steven_Pokenav_2B5EA2[]; -extern const u8 gText_Steven_Pokenav_2B5ED9[]; - -extern const u8 gStevenMatchCallDesc[]; -extern const u8 gStevenMatchCallName[]; - -extern const u8 gText_May_Pokenav_2B3AB3[]; -extern const u8 gText_May_Pokenav_2B3B3F[]; -extern const u8 gText_May_Pokenav_2B3C13[]; -extern const u8 gText_May_Pokenav_2B3CF3[]; -extern const u8 gText_May_Pokenav_2B3D4B[]; -extern const u8 gText_May_Pokenav_2B3DD1[]; -extern const u8 gText_May_Pokenav_2B3E69[]; -extern const u8 gText_May_Pokenav_2B3ECD[]; -extern const u8 gText_May_Pokenav_2B3F2B[]; -extern const u8 gText_May_Pokenav_2B3FFB[]; -extern const u8 gText_May_Pokenav_2B402B[]; -extern const u8 gText_May_Pokenav_2B414B[]; -extern const u8 gText_May_Pokenav_2B4228[]; -extern const u8 gText_May_Pokenav_2B42E0[]; -extern const u8 gText_May_Pokenav_2B4350[]; -extern const u8 gMayBrendanMatchCallDesc[]; -extern const u8 gExpandedPlaceholder_May[]; -extern const u8 gText_Brendan_Pokenav_2B43EF[]; -extern const u8 gText_Brendan_Pokenav_2B4486[]; -extern const u8 gText_Brendan_Pokenav_2B4560[]; -extern const u8 gText_Brendan_Pokenav_2B463F[]; -extern const u8 gText_Brendan_Pokenav_2B46B7[]; -extern const u8 gText_Brendan_Pokenav_2B4761[]; -extern const u8 gText_Brendan_Pokenav_2B47F4[]; -extern const u8 gText_Brendan_Pokenav_2B4882[]; -extern const u8 gText_Brendan_Pokenav_2B4909[]; -extern const u8 gText_Brendan_Pokenav_2B49C4[]; -extern const u8 gText_Brendan_Pokenav_2B4A44[]; -extern const u8 gText_Brendan_Pokenav_2B4B28[]; -extern const u8 gText_Brendan_Pokenav_2B4C15[]; -extern const u8 gText_Brendan_Pokenav_2B4CD8[]; -extern const u8 gText_Brendan_Pokenav_2B4D46[]; -extern const u8 gExpandedPlaceholder_Brendan[]; -extern const u8 gText_Wally_Pokenav_2B4DE2[]; -extern const u8 gText_Wally_Pokenav_2B4E57[]; -extern const u8 gText_Wally_Pokenav_2B4EA5[]; -extern const u8 gText_Wally_Pokenav_2B4F41[]; -extern const u8 gText_Wally_Pokenav_2B4FF3[]; -extern const u8 gText_Wally_Pokenav_2B50B1[]; -extern const u8 gText_Wally_Pokenav_2B5100[]; -extern const u8 gWallyMatchCallDesc[]; -extern const u8 gText_Scott_Pokenav_2B5184[]; -extern const u8 gText_Scott_Pokenav_2B5275[]; -extern const u8 gText_Scott_Pokenav_2B5323[]; -extern const u8 gText_Scott_Pokenav_2B53DB[]; -extern const u8 gText_Scott_Pokenav_2B54A5[]; -extern const u8 gText_Scott_Pokenav_2B5541[]; -extern const u8 gText_Scott_Pokenav_2B56CA[]; -extern const u8 gScottMatchCallDesc[]; -extern const u8 gScottMatchCallName[]; -extern const u8 gText_Roxanne_Pokenav_2B2456[]; -extern const u8 gText_Roxanne_Pokenav_2B250E[]; -extern const u8 gText_Roxanne_Pokenav_2B25C1[]; -extern const u8 gText_Roxanne_Pokenav_2B2607[]; -extern const u8 gRoxanneMatchCallDesc[]; -extern const u8 gText_Brawly_Pokenav_2B2659[]; -extern const u8 gText_Brawly_Pokenav_2B275D[]; -extern const u8 gText_Brawly_Pokenav_2B286F[]; -extern const u8 gText_Brawly_Pokenav_2B28D1[]; -extern const u8 gBrawlyMatchCallDesc[]; -extern const u8 gText_Wattson_Pokenav_2B2912[]; -extern const u8 gText_Wattson_Pokenav_2B29CA[]; -extern const u8 gText_Wattson_Pokenav_2B2AB6[]; -extern const u8 gText_Wattson_Pokenav_2B2B01[]; -extern const u8 gWattsonMatchCallDesc[]; -extern const u8 gText_Flannery_Pokenav_2B2B4D[]; -extern const u8 gText_Flannery_Pokenav_2B2C0E[]; -extern const u8 gText_Flannery_Pokenav_2B2CF1[]; -extern const u8 gText_Flannery_Pokenav_2B2D54[]; -extern const u8 gFlanneryMatchCallDesc[]; -extern const u8 gText_Winona_Pokenav_2B2DA4[]; -extern const u8 gText_Winona_Pokenav_2B2E2B[]; -extern const u8 gText_Winona_Pokenav_2B2EC2[]; -extern const u8 gText_Winona_Pokenav_2B2F16[]; -extern const u8 gWinonaMatchCallDesc[]; -extern const u8 gText_TateLiza_Pokenav_2B2F97[]; -extern const u8 gText_TateLiza_Pokenav_2B306E[]; -extern const u8 gText_TateLiza_Pokenav_2B3158[]; -extern const u8 gText_TateLiza_Pokenav_2B31CD[]; -extern const u8 gTateLizaMatchCallDesc[]; -extern const u8 gText_Juan_Pokenav_2B3249[]; -extern const u8 gText_Juan_Pokenav_2B32EC[]; -extern const u8 gText_Juan_Pokenav_2B33AA[]; -extern const u8 gText_Juan_Pokenav_2B341E[]; -extern const u8 gJuanMatchCallDesc[]; -extern const u8 gText_Sidney_Pokenav_2B34CC[]; -extern const u8 gEliteFourMatchCallDesc[]; -extern const u8 gText_Phoebe_Pokenav_2B3561[]; -extern const u8 gText_Glacia_Pokenav_2B35E4[]; -extern const u8 gText_Drake_Pokenav_2B368B[]; -extern const u8 gText_Wallace_Pokenav_2B3790[]; -extern const u8 gChampionMatchCallDesc[]; -extern const u8 gMatchCallStevenStrategyText[]; -extern const u8 gMatchCall_StevenTrainersPokemonText[]; -extern const u8 gMatchCall_StevenSelfIntroductionText_Line1_BeforeMeteorFallsBattle[]; -extern const u8 gMatchCall_StevenSelfIntroductionText_Line2_BeforeMeteorFallsBattle[]; -extern const u8 gMatchCall_StevenSelfIntroductionText_Line1_AfterMeteorFallsBattle[]; -extern const u8 gMatchCall_StevenSelfIntroductionText_Line2_AfterMeteorFallsBattle[]; -extern const u8 gMatchCall_BrendanStrategyText[]; -extern const u8 gMatchCall_BrendanTrainersPokemonText[]; -extern const u8 gMatchCall_BrendanSelfIntroductionText_Line1[]; -extern const u8 gMatchCall_BrendanSelfIntroductionText_Line2[]; -extern const u8 gMatchCall_MayStrategyText[]; -extern const u8 gMatchCall_MayTrainersPokemonText[]; -extern const u8 gMatchCall_MaySelfIntroductionText_Line1[]; -extern const u8 gMatchCall_MaySelfIntroductionText_Line2[]; -// .rodata - -static const match_call_text_data_t sMrStoneTextScripts[] = { - { gText_MrStone_Pokenav_2B60C0, 0xFFFF, FLAG_ENABLE_MR_STONE_POKENAV }, - { gText_MrStone_Pokenav_2B61E6, FLAG_ENABLE_MR_STONE_POKENAV, 0xFFFF }, - { gText_MrStone_Pokenav_2B6302, FLAG_DELIVERED_STEVEN_LETTER, 0xFFFF }, - { gText_MrStone_Pokenav_2B63A0, FLAG_RECEIVED_EXP_SHARE, 0xFFFF }, - { gText_MrStone_Pokenav_2B64A2, FLAG_RECEIVED_HM04, 0xFFFF }, - { gText_MrStone_Pokenav_2B6526, FLAG_DEFEATED_PETALBURG_GYM, 0xFFFF }, - { gText_MrStone_Pokenav_2B65BB, FLAG_RECEIVED_CASTFORM, 0xFFFF }, - { gText_MrStone_Pokenav_2B6664, FLAG_GROUDON_AWAKENED_MAGMA_HIDEOUT, 0xFFFF }, - { gText_MrStone_Pokenav_2B66B1, FLAG_TEAM_AQUA_ESCAPED_IN_SUBMARINE, 0xFFFF }, - { gText_MrStone_Pokenav_2B6703, FLAG_DEFEATED_SOOTOPOLIS_GYM, 0xFFFF }, - { gText_MrStone_Pokenav_2B67ED, FLAG_SYS_GAME_CLEAR, 0xFFFF }, - { NULL, 0xFFFF, 0xFFFF } -}; - -static const struct MatchCallStruct0 sMrStoneMatchCallHeader = -{ - .type = 0, - .v1 = 10, - .flag = 0xFFFF, - .desc = gMrStoneMatchCallDesc, - .name = gMrStoneMatchCallName, - .textData = sMrStoneTextScripts -}; - -static const match_call_text_data_t sNormanTextScripts[] = { - { gText_Norman_Pokenav_2B5719, FLAG_ENABLE_NORMAN_MATCH_CALL, 0xFFFF }, - { gText_Norman_Pokenav_2B5795, FLAG_DEFEATED_DEWFORD_GYM, 0xFFFF }, - { gText_Norman_Pokenav_2B584D, FLAG_DEFEATED_LAVARIDGE_GYM, 0xFFFF }, - { gText_Norman_Pokenav_2B58E3, FLAG_DEFEATED_PETALBURG_GYM, 0xFFFF }, - { gText_Norman_Pokenav_2B5979, FLAG_RECEIVED_RED_OR_BLUE_ORB, 0xFFFF }, - { gText_Norman_Pokenav_2B5A07, 0xFFFE, 0xFFFF }, - { gText_Norman_Pokenav_2B5A69, FLAG_SYS_GAME_CLEAR, 0xFFFF }, - { gText_Norman_Pokenav_2B5ACF, FLAG_SYS_GAME_CLEAR, 0xFFFF }, - { gText_Norman_Pokenav_2B5B5E, FLAG_SYS_GAME_CLEAR, 0xFFFF }, - { NULL, 0xFFFF, 0xFFFF } -}; - -static const struct MatchCallStruct5 sNormanMatchCallHeader = -{ - .type = 5, - .v1 = 7, - .flag = FLAG_ENABLE_NORMAN_MATCH_CALL, - .rematchTableIdx = REMATCH_NORMAN, - .desc = gNormanMatchCallDesc, - .name = gNormanMatchCallName, - .textData = sNormanTextScripts -}; - -static const struct MatchCallStruct3 sProfBirchMatchCallHeader = -{ - .type = 3, - .v1 = 0, - .flag = FLAG_ENABLE_PROF_BIRCH_MATCH_CALL, - .desc = gProfBirchMatchCallDesc, - .name = gProfBirchMatchCallName -}; - -static const match_call_text_data_t sMomTextScripts[] = { - { gText_Mom_Pokenav_2B227B, 0xffff, 0xffff }, - { gText_Mom_Pokenav_2B2310, FLAG_DEFEATED_PETALBURG_GYM, 0xffff }, - { gText_Mom_Pokenav_2B23F3, FLAG_SYS_GAME_CLEAR, 0xffff }, - { NULL, 0xffff, 0xffff } -}; - -static const struct MatchCallStruct0 sMomMatchCallHeader = -{ - .type = 0, - .v1 = 0, - .flag = FLAG_ENABLE_MOM_MATCH_CALL, - .desc = gMomMatchCallDesc, - .name = gMomMatchCallName, - .textData = sMomTextScripts -}; - -static const match_call_text_data_t sStevenTextScripts[] = { - { gText_Steven_Pokenav_2B5B95, 0xffff, 0xffff }, - { gText_Steven_Pokenav_2B5C53, FLAG_RUSTURF_TUNNEL_OPENED, 0xffff }, - { gText_Steven_Pokenav_2B5CC9, FLAG_RECEIVED_RED_OR_BLUE_ORB, 0xffff }, - { gText_Steven_Pokenav_2B5DB4, FLAG_TEAM_AQUA_ESCAPED_IN_SUBMARINE, 0xffff }, - { gText_Steven_Pokenav_2B5E26, FLAG_DEFEATED_MOSSDEEP_GYM, 0xffff }, - { gText_Steven_Pokenav_2B5EA2, FLAG_KYOGRE_ESCAPED_SEAFLOOR_CAVERN, 0xffff }, - { gText_Steven_Pokenav_2B5ED9, FLAG_SYS_GAME_CLEAR, 0xffff }, - { NULL, 0xffff, 0xffff }, -}; - -static const struct MatchCallStruct0 sStevenMatchCallHeader = -{ - .type = 0, - .v1 = 0xD5, - .flag = FLAG_REGISTERED_STEVEN_POKENAV, - .desc = gStevenMatchCallDesc, - .name = gStevenMatchCallName, - .textData = sStevenTextScripts -}; - -static const match_call_text_data_t sMayTextScripts[] = { - { gText_May_Pokenav_2B3AB3, 0xFFFF, 0xFFFF }, - { gText_May_Pokenav_2B3B3F, FLAG_DEFEATED_DEWFORD_GYM, 0xFFFF }, - { gText_May_Pokenav_2B3C13, FLAG_DELIVERED_DEVON_GOODS, 0xFFFF }, - { gText_May_Pokenav_2B3CF3, FLAG_HIDE_MAUVILLE_CITY_WALLY, 0xFFFF }, - { gText_May_Pokenav_2B3D4B, FLAG_RECEIVED_HM04, 0xFFFF }, - { gText_May_Pokenav_2B3DD1, FLAG_DEFEATED_LAVARIDGE_GYM, 0xFFFF }, - { gText_May_Pokenav_2B3E69, FLAG_DEFEATED_PETALBURG_GYM, 0xFFFF }, - { gText_May_Pokenav_2B3ECD, FLAG_RECEIVED_CASTFORM, 0xFFFF }, - { gText_May_Pokenav_2B3F2B, FLAG_RECEIVED_RED_OR_BLUE_ORB, 0xFFFF }, - { gText_May_Pokenav_2B3FFB, FLAG_GROUDON_AWAKENED_MAGMA_HIDEOUT, 0xFFFF }, - { gText_May_Pokenav_2B402B, FLAG_MET_TEAM_AQUA_HARBOR, 0xFFFF }, - { gText_May_Pokenav_2B414B, FLAG_TEAM_AQUA_ESCAPED_IN_SUBMARINE, 0xFFFF }, - { gText_May_Pokenav_2B4228, FLAG_KYOGRE_ESCAPED_SEAFLOOR_CAVERN, 0xFFFF }, - { gText_May_Pokenav_2B42E0, FLAG_DEFEATED_SOOTOPOLIS_GYM, 0xFFFF }, - { gText_May_Pokenav_2B4350, FLAG_SYS_GAME_CLEAR, 0xFFFF }, - { NULL, 0xFFFF, 0xFFFF } -}; - -static const struct MatchCallStruct4 sMayMatchCallHeader = -{ - .type = 4, - .gender = MALE, - .flag = FLAG_ENABLE_RIVAL_MATCH_CALL, - .desc = gMayBrendanMatchCallDesc, - .name = gExpandedPlaceholder_May, - .textData = sMayTextScripts -}; - -static const match_call_text_data_t sBrendanTextScripts[] = { - { gText_Brendan_Pokenav_2B43EF, 0xFFFF, 0xFFFF }, - { gText_Brendan_Pokenav_2B4486, FLAG_DEFEATED_DEWFORD_GYM, 0xFFFF }, - { gText_Brendan_Pokenav_2B4560, FLAG_DELIVERED_DEVON_GOODS, 0xFFFF }, - { gText_Brendan_Pokenav_2B463F, FLAG_HIDE_MAUVILLE_CITY_WALLY, 0xFFFF }, - { gText_Brendan_Pokenav_2B46B7, FLAG_RECEIVED_HM04, 0xFFFF }, - { gText_Brendan_Pokenav_2B4761, FLAG_DEFEATED_LAVARIDGE_GYM, 0xFFFF }, - { gText_Brendan_Pokenav_2B47F4, FLAG_DEFEATED_PETALBURG_GYM, 0xFFFF }, - { gText_Brendan_Pokenav_2B4882, FLAG_RECEIVED_CASTFORM, 0xFFFF }, - { gText_Brendan_Pokenav_2B4909, FLAG_RECEIVED_RED_OR_BLUE_ORB, 0xFFFF }, - { gText_Brendan_Pokenav_2B49C4, FLAG_GROUDON_AWAKENED_MAGMA_HIDEOUT, 0xFFFF }, - { gText_Brendan_Pokenav_2B4A44, FLAG_MET_TEAM_AQUA_HARBOR, 0xFFFF }, - { gText_Brendan_Pokenav_2B4B28, FLAG_TEAM_AQUA_ESCAPED_IN_SUBMARINE, 0xFFFF }, - { gText_Brendan_Pokenav_2B4C15, FLAG_KYOGRE_ESCAPED_SEAFLOOR_CAVERN, 0xFFFF }, - { gText_Brendan_Pokenav_2B4CD8, FLAG_DEFEATED_SOOTOPOLIS_GYM, 0xFFFF }, - { gText_Brendan_Pokenav_2B4D46, FLAG_SYS_GAME_CLEAR, 0xFFFF }, - { NULL, 0xFFFF, 0xFFFF } -}; - -static const struct MatchCallStruct4 sBrendanMatchCallHeader = -{ - .type = 4, - .gender = FEMALE, - .flag = FLAG_ENABLE_RIVAL_MATCH_CALL, - .desc = gMayBrendanMatchCallDesc, - .name = gExpandedPlaceholder_Brendan, - .textData = sBrendanTextScripts -}; - -static const match_call_text_data_t sWallyTextScripts[] = { - { gText_Wally_Pokenav_2B4DE2, 0xFFFF, 0xFFFF }, - { gText_Wally_Pokenav_2B4E57, FLAG_RUSTURF_TUNNEL_OPENED, 0xFFFF }, - { gText_Wally_Pokenav_2B4EA5, FLAG_DEFEATED_LAVARIDGE_GYM, 0xFFFF }, - { gText_Wally_Pokenav_2B4F41, FLAG_RECEIVED_CASTFORM, 0xFFFF }, - { gText_Wally_Pokenav_2B4FF3, FLAG_GROUDON_AWAKENED_MAGMA_HIDEOUT, 0xFFFF }, - { gText_Wally_Pokenav_2B50B1, FLAG_KYOGRE_ESCAPED_SEAFLOOR_CAVERN, 0xFFFF }, - { gText_Wally_Pokenav_2B5100, FLAG_DEFEATED_WALLY_VICTORY_ROAD, 0xFFFF }, - { NULL, 0xFFFF, 0xFFFF } -}; - -const struct MatchCallSubstruct2 sWallyAdditionalData[] = { - { FLAG_HIDE_MAUVILLE_CITY_WALLY, 0x05 }, - { FLAG_GROUDON_AWAKENED_MAGMA_HIDEOUT, 0xD5 }, - { FLAG_HIDE_VICTORY_ROAD_ENTRANCE_WALLY, 0x46 }, - { 0xFFFF, 0xD5 } -}; - -static const struct MatchCallStruct2 sWallyMatchCallHeader = -{ - .type = 2, - .v1 = 0, - .flag = FLAG_ENABLE_WALLY_MATCH_CALL, - .rematchTableIdx = REMATCH_WALLY_3, - .desc = gWallyMatchCallDesc, - .textData = sWallyTextScripts, - .v10 = sWallyAdditionalData -}; - -static const match_call_text_data_t sScottTextScripts[] = { - { gText_Scott_Pokenav_2B5184, 0xFFFF, 0xFFFF }, - { gText_Scott_Pokenav_2B5275, FLAG_DEFEATED_EVIL_TEAM_MT_CHIMNEY, 0xFFFF }, - { gText_Scott_Pokenav_2B5323, FLAG_RECEIVED_CASTFORM, 0xFFFF }, - { gText_Scott_Pokenav_2B53DB, FLAG_RECEIVED_RED_OR_BLUE_ORB, 0xFFFF }, - { gText_Scott_Pokenav_2B54A5, FLAG_TEAM_AQUA_ESCAPED_IN_SUBMARINE, 0xFFFF }, - { gText_Scott_Pokenav_2B5541, FLAG_DEFEATED_SOOTOPOLIS_GYM, 0xFFFF }, - { gText_Scott_Pokenav_2B56CA, FLAG_SYS_GAME_CLEAR, 0xFFFF }, - { NULL, 0xFFFF, 0xFFFF } -}; - - -static const struct MatchCallStruct0 sScottMatchCallHeader = -{ - .type = 0, - .v1 = 0xD5, - .flag = FLAG_ENABLE_SCOTT_MATCH_CALL, - .desc = gScottMatchCallDesc, - .name = gScottMatchCallName, - .textData = sScottTextScripts -}; - -static const match_call_text_data_t sRoxanneTextScripts[] = { - { gText_Roxanne_Pokenav_2B2456, 0xFFFE, 0xFFFF }, - { gText_Roxanne_Pokenav_2B250E, 0xFFFF, 0xFFFF }, - { gText_Roxanne_Pokenav_2B25C1, 0xFFFF, 0xFFFF }, - { gText_Roxanne_Pokenav_2B2607, FLAG_SYS_GAME_CLEAR, 0xFFFF }, - { NULL, 0xFFFF, 0xFFFF } -}; - -static const struct MatchCallStruct5 sRoxanneMatchCallHeader = -{ - .type = 5, - .v1 = 10, - .flag = FLAG_ENABLE_ROXANNE_MATCH_CALL, - .rematchTableIdx = REMATCH_ROXANNE, - .desc = gRoxanneMatchCallDesc, - .name = NULL, - .textData = sRoxanneTextScripts -}; - -static const match_call_text_data_t sBrawlyTextScripts[] = { - { gText_Brawly_Pokenav_2B2659, 0xFFFE, 0xFFFF }, - { gText_Brawly_Pokenav_2B275D, 0xFFFF, 0xFFFF }, - { gText_Brawly_Pokenav_2B286F, 0xFFFF, 0xFFFF }, - { gText_Brawly_Pokenav_2B28D1, FLAG_SYS_GAME_CLEAR, 0xFFFF }, - { NULL, 0xFFFF, 0xFFFF } -}; - -static const struct MatchCallStruct5 sBrawlyMatchCallHeader = -{ - .type = 5, - .v1 = 2, - .flag = FLAG_ENABLE_BRAWLY_MATCH_CALL, - .rematchTableIdx = REMATCH_BRAWLY, - .desc = gBrawlyMatchCallDesc, - .name = NULL, - .textData = sBrawlyTextScripts -}; - -static const match_call_text_data_t sWattsonTextScripts[] = { - { gText_Wattson_Pokenav_2B2912, 0xFFFE, 0xFFFF }, - { gText_Wattson_Pokenav_2B29CA, 0xFFFF, 0xFFFF }, - { gText_Wattson_Pokenav_2B2AB6, 0xFFFF, 0xFFFF }, - { gText_Wattson_Pokenav_2B2B01, FLAG_SYS_GAME_CLEAR, 0xFFFF }, - { NULL, 0xFFFF, 0xFFFF } -}; - -static const struct MatchCallStruct5 sWattsonMatchCallHeader = -{ - .type = 5, - .v1 = 9, - .flag = FLAG_ENABLE_WATTSON_MATCH_CALL, - .rematchTableIdx = REMATCH_WATTSON, - .desc = gWattsonMatchCallDesc, - .name = NULL, - .textData = sWattsonTextScripts -}; - -static const match_call_text_data_t sFlanneryTextScripts[] = { - { gText_Flannery_Pokenav_2B2B4D, 0xFFFE, 0xFFFF }, - { gText_Flannery_Pokenav_2B2C0E, 0xFFFF, 0xFFFF }, - { gText_Flannery_Pokenav_2B2CF1, 0xFFFF, 0xFFFF }, - { gText_Flannery_Pokenav_2B2D54, FLAG_SYS_GAME_CLEAR, 0xFFFF }, - { NULL, 0xFFFF, 0xFFFF } -}; - -static const struct MatchCallStruct5 sFlanneryMatchCallHeader = -{ - .type = 5, - .v1 = 3, - .flag = FLAG_ENABLE_FLANNERY_MATCH_CALL, - .rematchTableIdx = REMATCH_FLANNERY, - .desc = gFlanneryMatchCallDesc, - .name = NULL, - .textData = sFlanneryTextScripts -}; - -static const match_call_text_data_t sWinonaTextScripts[] = { - { gText_Winona_Pokenav_2B2DA4, 0xFFFE, 0xFFFF }, - { gText_Winona_Pokenav_2B2E2B, 0xFFFF, 0xFFFF }, - { gText_Winona_Pokenav_2B2EC2, 0xFFFF, 0xFFFF }, - { gText_Winona_Pokenav_2B2F16, FLAG_SYS_GAME_CLEAR, 0xFFFF }, - { NULL, 0xFFFF, 0xFFFF } -}; - -static const struct MatchCallStruct5 sWinonaMatchCallHeader = -{ - .type = 5, - .v1 = 11, - .flag = FLAG_ENABLE_WINONA_MATCH_CALL, - .rematchTableIdx = REMATCH_WINONA, - .desc = gWinonaMatchCallDesc, - .name = NULL, - .textData = sWinonaTextScripts -}; - -static const match_call_text_data_t sTateLizaTextScripts[] = { - { gText_TateLiza_Pokenav_2B2F97, 0xFFFE, 0xFFFF }, - { gText_TateLiza_Pokenav_2B306E, 0xFFFF, 0xFFFF }, - { gText_TateLiza_Pokenav_2B3158, 0xFFFF, 0xFFFF }, - { gText_TateLiza_Pokenav_2B31CD, FLAG_SYS_GAME_CLEAR, 0xFFFF }, - { NULL, 0xFFFF, 0xFFFF } -}; - -static const struct MatchCallStruct5 sTateLizaMatchCallHeader = -{ - .type = 5, - .v1 = 13, - .flag = FLAG_ENABLE_TATE_AND_LIZA_MATCH_CALL, - .rematchTableIdx = REMATCH_TATE_AND_LIZA, - .desc = gTateLizaMatchCallDesc, - .name = NULL, - .textData = sTateLizaTextScripts -}; - -static const match_call_text_data_t sJuanTextScripts[] = { - { gText_Juan_Pokenav_2B3249, 0xFFFE, 0xFFFF }, - { gText_Juan_Pokenav_2B32EC, 0xFFFF, 0xFFFF }, - { gText_Juan_Pokenav_2B33AA, 0xFFFF, 0xFFFF }, - { gText_Juan_Pokenav_2B341E, FLAG_SYS_GAME_CLEAR, 0xFFFF }, - { NULL, 0xFFFF, 0xFFFF } -}; - -static const struct MatchCallStruct5 sJuanMatchCallHeader = -{ - .type = 5, - .v1 = 14, - .flag = FLAG_ENABLE_JUAN_MATCH_CALL, - .rematchTableIdx = REMATCH_JUAN, - .desc = gJuanMatchCallDesc, - .name = NULL, - .textData = sJuanTextScripts -}; - -static const match_call_text_data_t sSidneyTextScripts[] = { - { gText_Sidney_Pokenav_2B34CC, 0xFFFF, 0xFFFF }, - { NULL, 0xFFFF, 0xFFFF } -}; - -static const struct MatchCallStruct5 sSidneyMatchCallHeader = -{ - .type = 5, - .v1 = 15, - .flag = FLAG_REMATCH_SIDNEY, - .rematchTableIdx = REMATCH_SIDNEY, - .desc = gEliteFourMatchCallDesc, - .name = NULL, - .textData = sSidneyTextScripts -}; - -static const match_call_text_data_t sPhoebeTextScripts[] = { - { gText_Phoebe_Pokenav_2B3561, 0xFFFF, 0xFFFF }, - { NULL, 0xFFFF, 0xFFFF } -}; - -static const struct MatchCallStruct5 sPhoebeMatchCallHeader = -{ - .type = 5, - .v1 = 15, - .flag = FLAG_REMATCH_PHOEBE, - .rematchTableIdx = REMATCH_PHOEBE, - .desc = gEliteFourMatchCallDesc, - .name = NULL, - .textData = sPhoebeTextScripts -}; - -static const match_call_text_data_t sGlaciaTextScripts[] = { - { gText_Glacia_Pokenav_2B35E4, 0xFFFF, 0xFFFF }, - { NULL, 0xFFFF, 0xFFFF } -}; - -static const struct MatchCallStruct5 sGlaciaMatchCallHeader = -{ - .type = 5, - .v1 = 15, - .flag = FLAG_REMATCH_GLACIA, - .rematchTableIdx = REMATCH_GLACIA, - .desc = gEliteFourMatchCallDesc, - .name = NULL, - .textData = sGlaciaTextScripts -}; - -static const match_call_text_data_t sDrakeTextScripts[] = { - { gText_Drake_Pokenav_2B368B, 0xFFFF, 0xFFFF }, - { NULL, 0xFFFF, 0xFFFF } -}; - -static const struct MatchCallStruct5 sDrakeMatchCallHeader = -{ - .type = 5, - .v1 = 15, - .flag = FLAG_REMATCH_DRAKE, - .rematchTableIdx = REMATCH_DRAKE, - .desc = gEliteFourMatchCallDesc, - .name = NULL, - .textData = sDrakeTextScripts -}; - -static const match_call_text_data_t sWallaceTextScripts[] = { - { gText_Wallace_Pokenav_2B3790, 0xFFFF, 0xFFFF }, - { NULL, 0xFFFF, 0xFFFF } -}; - -static const struct MatchCallStruct5 sWallaceMatchCallHeader = -{ - .type = 5, - .v1 = 15, - .flag = FLAG_REMATCH_WALLACE, - .rematchTableIdx = REMATCH_WALLACE, - .desc = gChampionMatchCallDesc, - .name = NULL, - .textData = sWallaceTextScripts -}; - -static const match_call_t sMatchCallHeaders[] = { - {.type0 = &sMrStoneMatchCallHeader}, - {.type3 = &sProfBirchMatchCallHeader}, - {.type4 = &sBrendanMatchCallHeader}, - {.type4 = &sMayMatchCallHeader}, - {.type2 = &sWallyMatchCallHeader}, - {.type5 = &sNormanMatchCallHeader}, - {.type0 = &sMomMatchCallHeader}, - {.type0 = &sStevenMatchCallHeader}, - {.type0 = &sScottMatchCallHeader}, - {.type5 = &sRoxanneMatchCallHeader}, - {.type5 = &sBrawlyMatchCallHeader}, - {.type5 = &sWattsonMatchCallHeader}, - {.type5 = &sFlanneryMatchCallHeader}, - {.type5 = &sWinonaMatchCallHeader}, - {.type5 = &sTateLizaMatchCallHeader}, - {.type5 = &sJuanMatchCallHeader}, - {.type5 = &sSidneyMatchCallHeader}, - {.type5 = &sPhoebeMatchCallHeader}, - {.type5 = &sGlaciaMatchCallHeader}, - {.type5 = &sDrakeMatchCallHeader}, - {.type5 = &sWallaceMatchCallHeader} -}; - -static bool32 (*const sMatchCallGetFlagFuncs[])(match_call_t) = { - MatchCallGetFlag_Type0, - MatchCallGetFlag_Type1, - MatchCallGetFlag_Type2, - MatchCallGetFlag_Type3, - MatchCallGetFlag_Type4 -}; - -static u8 (*const gUnknown_08625310[])(match_call_t) = { - sub_81D1714, - sub_81D1718, - sub_81D171C, - sub_81D1750, - sub_81D1754 -}; - -static bool32 (*const sMatchCall_IsRematchableFunctions[])(match_call_t) = { - MatchCall_IsRematchable_Type0, - MatchCall_IsRematchable_Type1, - MatchCall_IsRematchable_Type2, - MatchCall_IsRematchable_Type3, - MatchCall_IsRematchable_Type4 -}; - -static bool32 (*const gUnknown_08625338[])(match_call_t) = { - sub_81D1840, - sub_81D1844, - sub_81D1848, - sub_81D184C, - sub_81D1850 -}; - -static u32 (*const sMatchCall_GetRematchTableIdxFunctions[])(match_call_t) = { - MatchCall_GetRematchTableIdx_Type0, - MatchCall_GetRematchTableIdx_Type1, - MatchCall_GetRematchTableIdx_Type2, - MatchCall_GetRematchTableIdx_Type3, - MatchCall_GetRematchTableIdx_Type4 -}; - -static void (*const sMatchCall_GetMessageFunctions[])(match_call_t, u8 *) = { - MatchCall_GetMessage_Type0, - MatchCall_GetMessage_Type1, - MatchCall_GetMessage_Type2, - MatchCall_GetMessage_Type3, - MatchCall_GetMessage_Type4 -}; - -static void (*const sMatchCall_GetNameAndDescFunctions[])(match_call_t, const u8 **, const u8 **) = { - MatchCall_GetNameAndDesc_Type0, - MatchCall_GetNameAndDesc_Type1, - MatchCall_GetNameAndDesc_Type2, - MatchCall_GetNameAndDesc_Type3, - MatchCall_GetNameAndDesc_Type4 -}; - -static const struct UnkStruct_08625388 sMatchCallCheckPageOverrides[] = { - { 7, 0x4B, 0xffff, { gMatchCallStevenStrategyText, gMatchCall_StevenTrainersPokemonText, gMatchCall_StevenSelfIntroductionText_Line1_BeforeMeteorFallsBattle, gMatchCall_StevenSelfIntroductionText_Line2_BeforeMeteorFallsBattle } }, // STEVEN - { 7, 0x4B, FLAG_DEFEATED_MOSSDEEP_GYM, { gMatchCallStevenStrategyText, gMatchCall_StevenTrainersPokemonText, gMatchCall_StevenSelfIntroductionText_Line1_AfterMeteorFallsBattle, gMatchCall_StevenSelfIntroductionText_Line2_AfterMeteorFallsBattle } }, // STEVEN - { 2, 0x3c, 0xffff, { gMatchCall_BrendanStrategyText, gMatchCall_BrendanTrainersPokemonText, gMatchCall_BrendanSelfIntroductionText_Line1, gMatchCall_BrendanSelfIntroductionText_Line2 } }, // Brendan - { 3, 0x3f, 0xffff, { gMatchCall_MayStrategyText, gMatchCall_MayTrainersPokemonText, gMatchCall_MaySelfIntroductionText_Line1, gMatchCall_MaySelfIntroductionText_Line2 } } // May -}; - -// .text - -static u32 MatchCallGetFunctionIndex(match_call_t matchCall) -{ - switch (matchCall.common->type) - { - case 0: - default: - return 0; - case 1: - case 5: - return 1; - case 2: - return 2; - case 4: - return 3; - case 3: - return 4; - } -} - -u32 GetTrainerIdxByRematchIdx(u32 rematchIdx) -{ - return gRematchTable[rematchIdx].trainerIds[0]; -} - -s32 GetRematchIdxByTrainerIdx(s32 trainerIdx) -{ - s32 rematchIdx; - - for (rematchIdx = 0; rematchIdx < REMATCH_TABLE_ENTRIES; rematchIdx++) - { - if (gRematchTable[rematchIdx].trainerIds[0] == trainerIdx) - return rematchIdx; - } - return -1; -} - -bool32 MatchCallFlagGetByIndex(u32 idx) -{ - match_call_t matchCall; - u32 i; - - if (idx > ARRAY_COUNT(sMatchCallHeaders) - 1) - return FALSE; - matchCall = sMatchCallHeaders[idx]; - i = MatchCallGetFunctionIndex(matchCall); - return sMatchCallGetFlagFuncs[i](matchCall); -} - -static bool32 MatchCallGetFlag_Type0(match_call_t matchCall) -{ - if (matchCall.type0->flag == 0xffff) - return TRUE; - return FlagGet(matchCall.type0->flag); -} - -static bool32 MatchCallGetFlag_Type1(match_call_t matchCall) -{ - if (matchCall.type1->flag == 0xffff) - return TRUE; - return FlagGet(matchCall.type1->flag); -} - -static bool32 MatchCallGetFlag_Type2(match_call_t matchCall) -{ - if (matchCall.type2->flag == 0xffff) - return TRUE; - return FlagGet(matchCall.type2->flag); -} - -static bool32 MatchCallGetFlag_Type3(match_call_t matchCall) -{ - if (matchCall.type4->gender != gSaveBlock2Ptr->playerGender) - return FALSE; - if (matchCall.type4->flag == 0xffff) - return TRUE; - return FlagGet(matchCall.type4->flag); -} - -static bool32 MatchCallGetFlag_Type4(match_call_t matchCall) -{ - return FlagGet(matchCall.type3->flag); -} - -u8 sub_81D16DC(u32 idx) -{ - match_call_t matchCall; - u32 i; - - if (idx > ARRAY_COUNT(sMatchCallHeaders) - 1) - return 0; - matchCall = sMatchCallHeaders[idx]; - i = MatchCallGetFunctionIndex(matchCall); - return gUnknown_08625310[i](matchCall); -} - -static u8 sub_81D1714(match_call_t matchCall) -{ - return matchCall.type0->v1; -} - -static u8 sub_81D1718(match_call_t matchCall) -{ - return matchCall.type1->v1; -} - -static u8 sub_81D171C(match_call_t matchCall) -{ - s32 i; - - for (i = 0; matchCall.type2->v10[i].flag != 0xffff; i++) - { - if (!FlagGet(matchCall.type2->v10[i].flag)) - break; - } - return matchCall.type2->v10[i].v2; -} - -static u8 sub_81D1750(match_call_t matchCall) -{ - return 0xd5; -} - -static u8 sub_81D1754(match_call_t matchCall) -{ - return 0xd5; -} - -bool32 MatchCall_IsRematchable(u32 idx) -{ - match_call_t matchCall; - u32 i; - - if (idx > ARRAY_COUNT(sMatchCallHeaders) - 1) - return 0; - matchCall = sMatchCallHeaders[idx]; - i = MatchCallGetFunctionIndex(matchCall); - return sMatchCall_IsRematchableFunctions[i](matchCall); -} - -static bool32 MatchCall_IsRematchable_Type0(match_call_t matchCall) -{ - return FALSE; -} - -static bool32 MatchCall_IsRematchable_Type1(match_call_t matchCall) -{ - if (matchCall.type1->rematchTableIdx >= REMATCH_ELITE_FOUR_ENTRIES) - return FALSE; - return gSaveBlock1Ptr->trainerRematches[matchCall.type1->rematchTableIdx] ? TRUE : FALSE; -} - -static bool32 MatchCall_IsRematchable_Type2(match_call_t matchCall) -{ - return gSaveBlock1Ptr->trainerRematches[matchCall.type2->rematchTableIdx] ? TRUE : FALSE; -} - -static bool32 MatchCall_IsRematchable_Type3(match_call_t matchCall) -{ - return FALSE; -} - -static bool32 MatchCall_IsRematchable_Type4(match_call_t matchCall) -{ - return FALSE; -} - -bool32 sub_81D17E8(u32 idx) -{ - match_call_t matchCall; - u32 i; - - if (idx > ARRAY_COUNT(sMatchCallHeaders) - 1) - return FALSE; - matchCall = sMatchCallHeaders[idx]; - i = MatchCallGetFunctionIndex(matchCall); - if (gUnknown_08625338[i](matchCall)) - return TRUE; - for (i = 0; i < ARRAY_COUNT(sMatchCallCheckPageOverrides); i++) - { - if (sMatchCallCheckPageOverrides[i].idx == idx) - return TRUE; - } - return FALSE; -} - -static bool32 sub_81D1840(match_call_t matchCall) -{ - return FALSE; -} - -static bool32 sub_81D1844(match_call_t matchCall) -{ - return TRUE; -} - -static bool32 sub_81D1848(match_call_t matchCall) -{ - return TRUE; -} - -static bool32 sub_81D184C(match_call_t matchCall) -{ - return FALSE; -} - -static bool32 sub_81D1850(match_call_t matchCall) -{ - return FALSE; -} - -u32 MatchCall_GetRematchTableIdx(u32 idx) -{ - match_call_t matchCall; - u32 i; - - if (idx > ARRAY_COUNT(sMatchCallHeaders) - 1) - return REMATCH_TABLE_ENTRIES; - matchCall = sMatchCallHeaders[idx]; - i = MatchCallGetFunctionIndex(matchCall); - return sMatchCall_GetRematchTableIdxFunctions[i](matchCall); -} - -static u32 MatchCall_GetRematchTableIdx_Type0(match_call_t matchCall) -{ - return REMATCH_TABLE_ENTRIES; -} - -static u32 MatchCall_GetRematchTableIdx_Type1(match_call_t matchCall) -{ - return matchCall.type1->rematchTableIdx; -} - -static u32 MatchCall_GetRematchTableIdx_Type2(match_call_t matchCall) -{ - return matchCall.type2->rematchTableIdx; -} - -static u32 MatchCall_GetRematchTableIdx_Type3(match_call_t matchCall) -{ - return REMATCH_TABLE_ENTRIES; -} - -static u32 MatchCall_GetRematchTableIdx_Type4(match_call_t matchCall) -{ - return REMATCH_TABLE_ENTRIES; -} - -void MatchCall_GetMessage(u32 idx, u8 *dest) -{ - match_call_t matchCall; - u32 i; - - if (idx > ARRAY_COUNT(sMatchCallHeaders) - 1) - return; - matchCall = sMatchCallHeaders[idx]; - i = MatchCallGetFunctionIndex(matchCall); - sMatchCall_GetMessageFunctions[i](matchCall, dest); -} - -static void MatchCall_GetMessage_Type0(match_call_t matchCall, u8 *dest) -{ - sub_81D1920(matchCall.type0->textData, dest); -} - -static void MatchCall_GetMessage_Type1(match_call_t matchCall, u8 *dest) -{ - if (matchCall.common->type != 5) - sub_81D1920(matchCall.type1->textData, dest); - else - sub_81D199C(matchCall.type5->textData, matchCall.type5->rematchTableIdx, dest); -} - -static void MatchCall_GetMessage_Type2(match_call_t matchCall, u8 *dest) -{ - sub_81D1920(matchCall.type2->textData, dest); -} - -static void MatchCall_GetMessage_Type3(match_call_t matchCall, u8 *dest) -{ - sub_81D1920(matchCall.type4->textData, dest); -} - -static void MatchCall_GetMessage_Type4(match_call_t matchCall, u8 *dest) -{ - sub_8197080(dest); -} - -void sub_81D1920(const match_call_text_data_t *sub0, u8 *dest) -{ - u32 i; - for (i = 0; sub0[i].text != NULL; i++) - ; - if (i) - i--; - while (i) - { - if (sub0[i].flag != 0xffff && FlagGet(sub0[i].flag) == TRUE) - break; - i--; - } - if (sub0[i].flag2 != 0xffff) - FlagSet(sub0[i].flag2); - StringExpandPlaceholders(dest, sub0[i].text); -} - -#ifdef NONMATCHING -// There's some weird upmerge going on that I cannot replicate at this time. -static void sub_81D199C(const match_call_text_data_t *sub0, u16 idx, u8 *dest) -{ - u32 i; - for (i = 0; sub0[i].text != NULL; i++) - { - if (sub0[i].flag == 0xfffe) - break; - if (sub0[i].flag == 0xffff && !FlagGet(sub0[i].flag)) - break; - } - if (sub0[i].flag != 0xfffe) - { - if (i) - i--; - if (sub0[i].flag2 != 0xffff) - FlagSet(sub0[i].flag2); - StringExpandPlaceholders(dest, sub0[i].text); - } - else - { - if (!FlagGet(FLAG_SYS_GAME_CLEAR)) - ; - else if (gSaveBlock1Ptr->trainerRematches[idx]) - i += 2; - else if (CountBattledRematchTeams(idx) >= 2) - i += 3; - else - i++; - StringExpandPlaceholders(dest, sub0[i].text); - } -} -#else -static NAKED void sub_81D199C(const match_call_text_data_t *sub0, u16 idx, u8 *dest) -{ - asm_unified("\tpush {r4-r7,lr}\n" - "\tmov r7, r10\n" - "\tmov r6, r9\n" - "\tmov r5, r8\n" - "\tpush {r5-r7}\n" - "\tadds r6, r0, 0\n" - "\tmov r10, r2\n" - "\tlsls r1, 16\n" - "\tlsrs r7, r1, 16\n" - "\tmovs r5, 0\n" - "\tldr r0, [r6]\n" - "\tcmp r0, 0\n" - "\tbeq _081D19E6\n" - "\tldrh r0, [r6, 0x4]\n" - "\tldr r1, =0x0000fffe\n" - "\tcmp r0, r1\n" - "\tbeq _081D1A24\n" - "\tldr r0, =0x0000ffff\n" - "\tmov r9, r0\n" - "\tmov r8, r1\n" - "\tadds r4, r6, 0\n" - "_081D19C6:\n" - "\tldrh r0, [r4, 0x4]\n" - "\tcmp r0, r9\n" - "\tbeq _081D19D6\n" - "\tbl FlagGet\n" - "\tlsls r0, 24\n" - "\tcmp r0, 0\n" - "\tbeq _081D19E6\n" - "_081D19D6:\n" - "\tadds r4, 0x8\n" - "\tadds r5, 0x1\n" - "\tldr r0, [r4]\n" - "\tcmp r0, 0\n" - "\tbeq _081D19E6\n" - "\tldrh r0, [r4, 0x4]\n" - "\tcmp r0, r8\n" - "\tbne _081D19C6\n" - "_081D19E6:\n" - "\tlsls r0, r5, 3\n" - "\tadds r0, r6\n" - "\tldrh r1, [r0, 0x4]\n" - "\tldr r0, =0x0000fffe\n" - "\tcmp r1, r0\n" - "\tbeq _081D1A24\n" - "\tcmp r5, 0\n" - "\tbeq _081D19F8\n" - "\tsubs r5, 0x1\n" - "_081D19F8:\n" - "\tlsls r0, r5, 3\n" - "\tadds r4, r0, r6\n" - "\tldrh r1, [r4, 0x6]\n" - "\tldr r0, =0x0000ffff\n" - "\tcmp r1, r0\n" - "\tbeq _081D1A0A\n" - "\tadds r0, r1, 0\n" - "\tbl FlagSet\n" - "_081D1A0A:\n" - "\tldr r1, [r4]\n" - "\tmov r0, r10\n" - "\tbl StringExpandPlaceholders\n" - "\tb _081D1A5C\n" - "\t.pool\n" - "_081D1A1C:\n" - "\tadds r5, 0x2\n" - "\tb _081D1A50\n" - "_081D1A20:\n" - "\tadds r5, 0x3\n" - "\tb _081D1A50\n" - "_081D1A24:\n" - "\tldr r0, =0x00000864\n" - "\tbl FlagGet\n" - "\tlsls r0, 24\n" - "\tcmp r0, 0\n" - "\tbeq _081D1A50\n" - "\tldr r0, =gSaveBlock1Ptr\n" - "\tldr r0, [r0]\n" - "\tldr r1, =0x000009ca\n" - "\tadds r0, r1\n" - "\tadds r0, r7\n" - "\tldrb r0, [r0]\n" - "\tcmp r0, 0\n" - "\tbne _081D1A1C\n" - "\tadds r0, r7, 0\n" - "\tbl CountBattledRematchTeams\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tcmp r0, 0x1\n" - "\tbhi _081D1A20\n" - "\tadds r5, 0x1\n" - "_081D1A50:\n" - "\tlsls r0, r5, 3\n" - "\tadds r0, r6\n" - "\tldr r1, [r0]\n" - "\tmov r0, r10\n" - "\tbl StringExpandPlaceholders\n" - "_081D1A5C:\n" - "\tpop {r3-r5}\n" - "\tmov r8, r3\n" - "\tmov r9, r4\n" - "\tmov r10, r5\n" - "\tpop {r4-r7}\n" - "\tpop {r0}\n" - "\tbx r0\n" - "\t.pool"); -} -#endif - -void sub_81D1A78(u32 idx, const u8 **desc, const u8 **name) -{ - match_call_t matchCall; - u32 i; - - if (idx > ARRAY_COUNT(sMatchCallHeaders) - 1) - return; - matchCall = sMatchCallHeaders[idx]; - i = MatchCallGetFunctionIndex(matchCall); - sMatchCall_GetNameAndDescFunctions[i](matchCall, desc, name); -} - -static void MatchCall_GetNameAndDesc_Type0(match_call_t matchCall, const u8 **desc, const u8 **name) -{ - *desc = matchCall.type0->desc; - *name = matchCall.type0->name; -} - -static void MatchCall_GetNameAndDesc_Type1(match_call_t matchCall, const u8 **desc, const u8 **name) -{ - match_call_t _matchCall = matchCall; - if (_matchCall.type1->name == NULL) - MatchCall_GetNameAndDescByRematchIdx(_matchCall.type1->rematchTableIdx, desc, name); - else - *name = _matchCall.type1->name; - *desc = _matchCall.type1->desc; -} - -static void MatchCall_GetNameAndDesc_Type2(match_call_t matchCall, const u8 **desc, const u8 **name) -{ - MatchCall_GetNameAndDescByRematchIdx(matchCall.type2->rematchTableIdx, desc, name); - *desc = matchCall.type2->desc; -} - -static void MatchCall_GetNameAndDesc_Type3(match_call_t matchCall, const u8 **desc, const u8 **name) -{ - *desc = matchCall.type4->desc; - *name = matchCall.type4->name; -} - -static void MatchCall_GetNameAndDesc_Type4(match_call_t matchCall, const u8 **desc, const u8 **name) -{ - *desc = matchCall.type3->desc; - *name = matchCall.type3->name; -} - -static void MatchCall_GetNameAndDescByRematchIdx(u32 idx, const u8 **desc, const u8 **name) -{ - const struct Trainer *trainer = gTrainers + GetTrainerIdxByRematchIdx(idx); - *desc = gTrainerClassNames[trainer->trainerClass]; - *name = trainer->trainerName; -} - -#ifdef NONMATCHING -const u8 *sub_81D1B40(u32 idx, u32 offset) -{ - u32 i; - - for (i = 0; i < ARRAY_COUNT(sMatchCallCheckPageOverrides); i++) - { - if (sMatchCallCheckPageOverrides[i].idx == idx) - { - for (; i + 1 < ARRAY_COUNT(sMatchCallCheckPageOverrides) && sMatchCallCheckPageOverrides[i + 1].idx == idx; i++) - { - if (!FlagGet(sMatchCallCheckPageOverrides[i + 1].v4)) - break; - } - return sMatchCallCheckPageOverrides[i].v8[offset]; - } - } - return NULL; -} -#else -NAKED const u8 *sub_81D1B40(u32 idx, u32 offset) -{ - asm_unified("\tpush {r4-r7,lr}\n" - "\tmov r7, r9\n" - "\tmov r6, r8\n" - "\tpush {r6,r7}\n" - "\tadds r6, r0, 0\n" - "\tmovs r5, 0\n" - "\tldr r2, =sMatchCallCheckPageOverrides\n" - "\tmovs r0, 0x8\n" - "\tadds r0, r2\n" - "\tmov r9, r0\n" - "_081D1B54:\n" - "\tlsls r0, r5, 1\n" - "\tadds r0, r5\n" - "\tlsls r0, 3\n" - "\tadds r0, r2\n" - "\tldrh r0, [r0]\n" - "\tcmp r0, r6\n" - "\tbne _081D1BBC\n" - "\tadds r4, r5, 0x1\n" - "\tlsls r1, 2\n" - "\tmov r8, r1\n" - "\tcmp r4, 0x3\n" - "\tbhi _081D1BA8\n" - "\tlsls r0, r4, 1\n" - "\tadds r0, r4\n" - "\tlsls r0, 3\n" - "\tadds r0, r2\n" - "\tldrh r0, [r0]\n" - "\tcmp r0, r6\n" - "\tbne _081D1BA8\n" - "\tldr r7, =sMatchCallCheckPageOverrides\n" - "_081D1B7C:\n" - "\tlsls r0, r4, 1\n" - "\tadds r0, r4\n" - "\tlsls r0, 3\n" - "\tadds r1, r7, 0x4\n" - "\tadds r0, r1\n" - "\tldrh r0, [r0]\n" - "\tbl FlagGet\n" - "\tlsls r0, 24\n" - "\tcmp r0, 0\n" - "\tbeq _081D1BA8\n" - "\tadds r5, r4, 0\n" - "\tadds r4, r5, 0x1\n" - "\tcmp r4, 0x3\n" - "\tbhi _081D1BA8\n" - "\tlsls r0, r4, 1\n" - "\tadds r0, r4\n" - "\tlsls r0, 3\n" - "\tadds r0, r7\n" - "\tldrh r0, [r0]\n" - "\tcmp r0, r6\n" - "\tbeq _081D1B7C\n" - "_081D1BA8:\n" - "\tlsls r0, r5, 1\n" - "\tadds r0, r5\n" - "\tlsls r0, 3\n" - "\tadd r0, r8\n" - "\tadd r0, r9\n" - "\tldr r0, [r0]\n" - "\tb _081D1BC4\n" - "\t.pool\n" - "_081D1BBC:\n" - "\tadds r5, 0x1\n" - "\tcmp r5, 0x3\n" - "\tbls _081D1B54\n" - "\tmovs r0, 0\n" - "_081D1BC4:\n" - "\tpop {r3,r4}\n" - "\tmov r8, r3\n" - "\tmov r9, r4\n" - "\tpop {r4-r7}\n" - "\tpop {r1}\n" - "\tbx r1"); -} -#endif - -s32 sub_81D1BD0(u32 idx) -{ - u32 i; - - for (i = 0; i < ARRAY_COUNT(sMatchCallCheckPageOverrides); i++) - { - if (sMatchCallCheckPageOverrides[i].idx == idx) - return sMatchCallCheckPageOverrides[i].v2; - } - return -1; -} - -bool32 sub_81D1BF8(u32 idx) -{ - s32 i; - - for (i = 0; i < (s32)ARRAY_COUNT(sMatchCallHeaders); i++) - { - u32 r0 = MatchCall_GetRematchTableIdx(i); - if (r0 != REMATCH_TABLE_ENTRIES && r0 == idx) - return TRUE; - } - return FALSE; -} - -void SetMatchCallRegisteredFlag(void) -{ - s32 r0 = GetRematchIdxByTrainerIdx(gSpecialVar_0x8004); - if (r0 >= 0) - FlagSet(FLAG_MATCH_CALL_REGISTERED + r0); -} diff --git a/src/pokenav_match_call_data.c b/src/pokenav_match_call_data.c new file mode 100644 index 000000000..1f621922d --- /dev/null +++ b/src/pokenav_match_call_data.c @@ -0,0 +1,1448 @@ +#include "global.h" +#include "battle_setup.h" +#include "data.h" +#include "event_data.h" +#include "string_util.h" +#include "battle.h" +#include "gym_leader_rematch.h" +#include "match_call.h" + +// Static type declarations + +typedef struct MatchCallTextDataStruct { + const u8 *text; + u16 flag; + u16 flag2; +} match_call_text_data_t; + +struct MatchCallStructCommon { + u8 type; + u8 v1; + u16 flag; +}; + +struct MatchCallStruct0 { + u8 type; + u8 v1; + u16 flag; + const u8 *desc; + const u8 *name; + const match_call_text_data_t *textData; +}; + +struct MatchCallStruct1 { + u8 type; + u8 v1; + u16 flag; + u16 rematchTableIdx; + const u8 *desc; + const u8 *name; + const match_call_text_data_t *textData; +}; + +struct MatchCallSubstruct2 { + u16 flag; + u8 v2; +}; + +struct MatchCallStruct2 { + u8 type; + u8 v1; + u16 flag; + u16 rematchTableIdx; + const u8 *desc; + const match_call_text_data_t *textData; + const struct MatchCallSubstruct2 *v10; +}; + +struct MatchCallStruct3 { + u8 type; + u8 v1; + u16 flag; + const u8 *desc; + const u8 *name; +}; + +struct MatchCallStruct4 { + u8 type; + u8 gender; + u16 flag; + const u8 *desc; + const u8 *name; + const match_call_text_data_t *textData; +}; + +// Note: Type1 and Type5 have identical struct layouts. +struct MatchCallStruct5 { + u8 type; + u8 v1; + u16 flag; + u16 rematchTableIdx; + const u8 *desc; + const u8 *name; + const match_call_text_data_t *textData; +}; + +typedef union { + const struct MatchCallStructCommon *common; + const struct MatchCallStruct0 *type0; + const struct MatchCallStruct1 *type1; + const struct MatchCallStruct2 *type2; + const struct MatchCallStruct3 *type3; + const struct MatchCallStruct4 *type4; + const struct MatchCallStruct5 *type5; +} match_call_t; + +struct UnkStruct_08625388 { + u16 idx; + u16 v2; + u16 v4; + const u8 *v8[4]; +}; + +// Static RAM declarations + +// Static ROM declarations + +static bool32 MatchCallGetFlag_Type0(match_call_t); +static bool32 MatchCallGetFlag_Type1(match_call_t); +static bool32 MatchCallGetFlag_Type2(match_call_t); +static bool32 MatchCallGetFlag_Type3(match_call_t); +static bool32 MatchCallGetFlag_Type4(match_call_t); + +static u8 sub_81D1714(match_call_t); +static u8 sub_81D1718(match_call_t); +static u8 sub_81D171C(match_call_t); +static u8 sub_81D1750(match_call_t); +static u8 sub_81D1754(match_call_t); + +static bool32 MatchCall_IsRematchable_Type0(match_call_t); +static bool32 MatchCall_IsRematchable_Type1(match_call_t); +static bool32 MatchCall_IsRematchable_Type2(match_call_t); +static bool32 MatchCall_IsRematchable_Type3(match_call_t); +static bool32 MatchCall_IsRematchable_Type4(match_call_t); + +static bool32 sub_81D1840(match_call_t); +static bool32 sub_81D1844(match_call_t); +static bool32 sub_81D1848(match_call_t); +static bool32 sub_81D184C(match_call_t); +static bool32 sub_81D1850(match_call_t); + +static u32 MatchCall_GetRematchTableIdx_Type0(match_call_t); +static u32 MatchCall_GetRematchTableIdx_Type1(match_call_t); +static u32 MatchCall_GetRematchTableIdx_Type2(match_call_t); +static u32 MatchCall_GetRematchTableIdx_Type3(match_call_t); +static u32 MatchCall_GetRematchTableIdx_Type4(match_call_t); + +static void MatchCall_GetMessage_Type0(match_call_t, u8 *); +static void MatchCall_GetMessage_Type1(match_call_t, u8 *); +static void MatchCall_GetMessage_Type2(match_call_t, u8 *); +static void MatchCall_GetMessage_Type3(match_call_t, u8 *); +static void MatchCall_GetMessage_Type4(match_call_t, u8 *); + +static void MatchCall_GetNameAndDesc_Type0(match_call_t, const u8 **, const u8 **); +static void MatchCall_GetNameAndDesc_Type1(match_call_t, const u8 **, const u8 **); +static void MatchCall_GetNameAndDesc_Type2(match_call_t, const u8 **, const u8 **); +static void MatchCall_GetNameAndDesc_Type3(match_call_t, const u8 **, const u8 **); +static void MatchCall_GetNameAndDesc_Type4(match_call_t, const u8 **, const u8 **); + +static void sub_81D1920(const match_call_text_data_t *, u8 *); +static void sub_81D199C(const match_call_text_data_t *, u16, u8 *); +static void MatchCall_GetNameAndDescByRematchIdx(u32, const u8 **, const u8 **); + +extern const u8 gText_MrStone_Pokenav_2B60C0[]; +extern const u8 gText_MrStone_Pokenav_2B61E6[]; +extern const u8 gText_MrStone_Pokenav_2B6302[]; +extern const u8 gText_MrStone_Pokenav_2B63A0[]; +extern const u8 gText_MrStone_Pokenav_2B64A2[]; +extern const u8 gText_MrStone_Pokenav_2B6526[]; +extern const u8 gText_MrStone_Pokenav_2B65BB[]; +extern const u8 gText_MrStone_Pokenav_2B6664[]; +extern const u8 gText_MrStone_Pokenav_2B66B1[]; +extern const u8 gText_MrStone_Pokenav_2B6703[]; +extern const u8 gText_MrStone_Pokenav_2B67ED[]; + +extern const u8 gMrStoneMatchCallDesc[]; +extern const u8 gMrStoneMatchCallName[]; + +extern const u8 gText_Norman_Pokenav_2B5719[]; +extern const u8 gText_Norman_Pokenav_2B5795[]; +extern const u8 gText_Norman_Pokenav_2B584D[]; +extern const u8 gText_Norman_Pokenav_2B58E3[]; +extern const u8 gText_Norman_Pokenav_2B5979[]; +extern const u8 gText_Norman_Pokenav_2B5A07[]; +extern const u8 gText_Norman_Pokenav_2B5A69[]; +extern const u8 gText_Norman_Pokenav_2B5ACF[]; +extern const u8 gText_Norman_Pokenav_2B5B5E[]; + +extern const u8 gNormanMatchCallDesc[]; +extern const u8 gNormanMatchCallName[]; + +extern const u8 gProfBirchMatchCallDesc[]; +extern const u8 gProfBirchMatchCallName[]; + +extern const u8 gText_Mom_Pokenav_2B227B[]; +extern const u8 gText_Mom_Pokenav_2B2310[]; +extern const u8 gText_Mom_Pokenav_2B23F3[]; + +extern const u8 gMomMatchCallDesc[]; +extern const u8 gMomMatchCallName[]; + +extern const u8 gText_Steven_Pokenav_2B5B95[]; +extern const u8 gText_Steven_Pokenav_2B5C53[]; +extern const u8 gText_Steven_Pokenav_2B5CC9[]; +extern const u8 gText_Steven_Pokenav_2B5DB4[]; +extern const u8 gText_Steven_Pokenav_2B5E26[]; +extern const u8 gText_Steven_Pokenav_2B5EA2[]; +extern const u8 gText_Steven_Pokenav_2B5ED9[]; + +extern const u8 gStevenMatchCallDesc[]; +extern const u8 gStevenMatchCallName[]; + +extern const u8 gText_May_Pokenav_2B3AB3[]; +extern const u8 gText_May_Pokenav_2B3B3F[]; +extern const u8 gText_May_Pokenav_2B3C13[]; +extern const u8 gText_May_Pokenav_2B3CF3[]; +extern const u8 gText_May_Pokenav_2B3D4B[]; +extern const u8 gText_May_Pokenav_2B3DD1[]; +extern const u8 gText_May_Pokenav_2B3E69[]; +extern const u8 gText_May_Pokenav_2B3ECD[]; +extern const u8 gText_May_Pokenav_2B3F2B[]; +extern const u8 gText_May_Pokenav_2B3FFB[]; +extern const u8 gText_May_Pokenav_2B402B[]; +extern const u8 gText_May_Pokenav_2B414B[]; +extern const u8 gText_May_Pokenav_2B4228[]; +extern const u8 gText_May_Pokenav_2B42E0[]; +extern const u8 gText_May_Pokenav_2B4350[]; +extern const u8 gMayBrendanMatchCallDesc[]; +extern const u8 gExpandedPlaceholder_May[]; +extern const u8 gText_Brendan_Pokenav_2B43EF[]; +extern const u8 gText_Brendan_Pokenav_2B4486[]; +extern const u8 gText_Brendan_Pokenav_2B4560[]; +extern const u8 gText_Brendan_Pokenav_2B463F[]; +extern const u8 gText_Brendan_Pokenav_2B46B7[]; +extern const u8 gText_Brendan_Pokenav_2B4761[]; +extern const u8 gText_Brendan_Pokenav_2B47F4[]; +extern const u8 gText_Brendan_Pokenav_2B4882[]; +extern const u8 gText_Brendan_Pokenav_2B4909[]; +extern const u8 gText_Brendan_Pokenav_2B49C4[]; +extern const u8 gText_Brendan_Pokenav_2B4A44[]; +extern const u8 gText_Brendan_Pokenav_2B4B28[]; +extern const u8 gText_Brendan_Pokenav_2B4C15[]; +extern const u8 gText_Brendan_Pokenav_2B4CD8[]; +extern const u8 gText_Brendan_Pokenav_2B4D46[]; +extern const u8 gExpandedPlaceholder_Brendan[]; +extern const u8 gText_Wally_Pokenav_2B4DE2[]; +extern const u8 gText_Wally_Pokenav_2B4E57[]; +extern const u8 gText_Wally_Pokenav_2B4EA5[]; +extern const u8 gText_Wally_Pokenav_2B4F41[]; +extern const u8 gText_Wally_Pokenav_2B4FF3[]; +extern const u8 gText_Wally_Pokenav_2B50B1[]; +extern const u8 gText_Wally_Pokenav_2B5100[]; +extern const u8 gWallyMatchCallDesc[]; +extern const u8 gText_Scott_Pokenav_2B5184[]; +extern const u8 gText_Scott_Pokenav_2B5275[]; +extern const u8 gText_Scott_Pokenav_2B5323[]; +extern const u8 gText_Scott_Pokenav_2B53DB[]; +extern const u8 gText_Scott_Pokenav_2B54A5[]; +extern const u8 gText_Scott_Pokenav_2B5541[]; +extern const u8 gText_Scott_Pokenav_2B56CA[]; +extern const u8 gScottMatchCallDesc[]; +extern const u8 gScottMatchCallName[]; +extern const u8 gText_Roxanne_Pokenav_2B2456[]; +extern const u8 gText_Roxanne_Pokenav_2B250E[]; +extern const u8 gText_Roxanne_Pokenav_2B25C1[]; +extern const u8 gText_Roxanne_Pokenav_2B2607[]; +extern const u8 gRoxanneMatchCallDesc[]; +extern const u8 gText_Brawly_Pokenav_2B2659[]; +extern const u8 gText_Brawly_Pokenav_2B275D[]; +extern const u8 gText_Brawly_Pokenav_2B286F[]; +extern const u8 gText_Brawly_Pokenav_2B28D1[]; +extern const u8 gBrawlyMatchCallDesc[]; +extern const u8 gText_Wattson_Pokenav_2B2912[]; +extern const u8 gText_Wattson_Pokenav_2B29CA[]; +extern const u8 gText_Wattson_Pokenav_2B2AB6[]; +extern const u8 gText_Wattson_Pokenav_2B2B01[]; +extern const u8 gWattsonMatchCallDesc[]; +extern const u8 gText_Flannery_Pokenav_2B2B4D[]; +extern const u8 gText_Flannery_Pokenav_2B2C0E[]; +extern const u8 gText_Flannery_Pokenav_2B2CF1[]; +extern const u8 gText_Flannery_Pokenav_2B2D54[]; +extern const u8 gFlanneryMatchCallDesc[]; +extern const u8 gText_Winona_Pokenav_2B2DA4[]; +extern const u8 gText_Winona_Pokenav_2B2E2B[]; +extern const u8 gText_Winona_Pokenav_2B2EC2[]; +extern const u8 gText_Winona_Pokenav_2B2F16[]; +extern const u8 gWinonaMatchCallDesc[]; +extern const u8 gText_TateLiza_Pokenav_2B2F97[]; +extern const u8 gText_TateLiza_Pokenav_2B306E[]; +extern const u8 gText_TateLiza_Pokenav_2B3158[]; +extern const u8 gText_TateLiza_Pokenav_2B31CD[]; +extern const u8 gTateLizaMatchCallDesc[]; +extern const u8 gText_Juan_Pokenav_2B3249[]; +extern const u8 gText_Juan_Pokenav_2B32EC[]; +extern const u8 gText_Juan_Pokenav_2B33AA[]; +extern const u8 gText_Juan_Pokenav_2B341E[]; +extern const u8 gJuanMatchCallDesc[]; +extern const u8 gText_Sidney_Pokenav_2B34CC[]; +extern const u8 gEliteFourMatchCallDesc[]; +extern const u8 gText_Phoebe_Pokenav_2B3561[]; +extern const u8 gText_Glacia_Pokenav_2B35E4[]; +extern const u8 gText_Drake_Pokenav_2B368B[]; +extern const u8 gText_Wallace_Pokenav_2B3790[]; +extern const u8 gChampionMatchCallDesc[]; +extern const u8 gMatchCallStevenStrategyText[]; +extern const u8 gMatchCall_StevenTrainersPokemonText[]; +extern const u8 gMatchCall_StevenSelfIntroductionText_Line1_BeforeMeteorFallsBattle[]; +extern const u8 gMatchCall_StevenSelfIntroductionText_Line2_BeforeMeteorFallsBattle[]; +extern const u8 gMatchCall_StevenSelfIntroductionText_Line1_AfterMeteorFallsBattle[]; +extern const u8 gMatchCall_StevenSelfIntroductionText_Line2_AfterMeteorFallsBattle[]; +extern const u8 gMatchCall_BrendanStrategyText[]; +extern const u8 gMatchCall_BrendanTrainersPokemonText[]; +extern const u8 gMatchCall_BrendanSelfIntroductionText_Line1[]; +extern const u8 gMatchCall_BrendanSelfIntroductionText_Line2[]; +extern const u8 gMatchCall_MayStrategyText[]; +extern const u8 gMatchCall_MayTrainersPokemonText[]; +extern const u8 gMatchCall_MaySelfIntroductionText_Line1[]; +extern const u8 gMatchCall_MaySelfIntroductionText_Line2[]; +// .rodata + +static const match_call_text_data_t sMrStoneTextScripts[] = { + { gText_MrStone_Pokenav_2B60C0, 0xFFFF, FLAG_ENABLE_MR_STONE_POKENAV }, + { gText_MrStone_Pokenav_2B61E6, FLAG_ENABLE_MR_STONE_POKENAV, 0xFFFF }, + { gText_MrStone_Pokenav_2B6302, FLAG_DELIVERED_STEVEN_LETTER, 0xFFFF }, + { gText_MrStone_Pokenav_2B63A0, FLAG_RECEIVED_EXP_SHARE, 0xFFFF }, + { gText_MrStone_Pokenav_2B64A2, FLAG_RECEIVED_HM04, 0xFFFF }, + { gText_MrStone_Pokenav_2B6526, FLAG_DEFEATED_PETALBURG_GYM, 0xFFFF }, + { gText_MrStone_Pokenav_2B65BB, FLAG_RECEIVED_CASTFORM, 0xFFFF }, + { gText_MrStone_Pokenav_2B6664, FLAG_GROUDON_AWAKENED_MAGMA_HIDEOUT, 0xFFFF }, + { gText_MrStone_Pokenav_2B66B1, FLAG_TEAM_AQUA_ESCAPED_IN_SUBMARINE, 0xFFFF }, + { gText_MrStone_Pokenav_2B6703, FLAG_DEFEATED_SOOTOPOLIS_GYM, 0xFFFF }, + { gText_MrStone_Pokenav_2B67ED, FLAG_SYS_GAME_CLEAR, 0xFFFF }, + { NULL, 0xFFFF, 0xFFFF } +}; + +static const struct MatchCallStruct0 sMrStoneMatchCallHeader = +{ + .type = 0, + .v1 = 10, + .flag = 0xFFFF, + .desc = gMrStoneMatchCallDesc, + .name = gMrStoneMatchCallName, + .textData = sMrStoneTextScripts +}; + +static const match_call_text_data_t sNormanTextScripts[] = { + { gText_Norman_Pokenav_2B5719, FLAG_ENABLE_NORMAN_MATCH_CALL, 0xFFFF }, + { gText_Norman_Pokenav_2B5795, FLAG_DEFEATED_DEWFORD_GYM, 0xFFFF }, + { gText_Norman_Pokenav_2B584D, FLAG_DEFEATED_LAVARIDGE_GYM, 0xFFFF }, + { gText_Norman_Pokenav_2B58E3, FLAG_DEFEATED_PETALBURG_GYM, 0xFFFF }, + { gText_Norman_Pokenav_2B5979, FLAG_RECEIVED_RED_OR_BLUE_ORB, 0xFFFF }, + { gText_Norman_Pokenav_2B5A07, 0xFFFE, 0xFFFF }, + { gText_Norman_Pokenav_2B5A69, FLAG_SYS_GAME_CLEAR, 0xFFFF }, + { gText_Norman_Pokenav_2B5ACF, FLAG_SYS_GAME_CLEAR, 0xFFFF }, + { gText_Norman_Pokenav_2B5B5E, FLAG_SYS_GAME_CLEAR, 0xFFFF }, + { NULL, 0xFFFF, 0xFFFF } +}; + +static const struct MatchCallStruct5 sNormanMatchCallHeader = +{ + .type = 5, + .v1 = 7, + .flag = FLAG_ENABLE_NORMAN_MATCH_CALL, + .rematchTableIdx = REMATCH_NORMAN, + .desc = gNormanMatchCallDesc, + .name = gNormanMatchCallName, + .textData = sNormanTextScripts +}; + +static const struct MatchCallStruct3 sProfBirchMatchCallHeader = +{ + .type = 3, + .v1 = 0, + .flag = FLAG_ENABLE_PROF_BIRCH_MATCH_CALL, + .desc = gProfBirchMatchCallDesc, + .name = gProfBirchMatchCallName +}; + +static const match_call_text_data_t sMomTextScripts[] = { + { gText_Mom_Pokenav_2B227B, 0xffff, 0xffff }, + { gText_Mom_Pokenav_2B2310, FLAG_DEFEATED_PETALBURG_GYM, 0xffff }, + { gText_Mom_Pokenav_2B23F3, FLAG_SYS_GAME_CLEAR, 0xffff }, + { NULL, 0xffff, 0xffff } +}; + +static const struct MatchCallStruct0 sMomMatchCallHeader = +{ + .type = 0, + .v1 = 0, + .flag = FLAG_ENABLE_MOM_MATCH_CALL, + .desc = gMomMatchCallDesc, + .name = gMomMatchCallName, + .textData = sMomTextScripts +}; + +static const match_call_text_data_t sStevenTextScripts[] = { + { gText_Steven_Pokenav_2B5B95, 0xffff, 0xffff }, + { gText_Steven_Pokenav_2B5C53, FLAG_RUSTURF_TUNNEL_OPENED, 0xffff }, + { gText_Steven_Pokenav_2B5CC9, FLAG_RECEIVED_RED_OR_BLUE_ORB, 0xffff }, + { gText_Steven_Pokenav_2B5DB4, FLAG_TEAM_AQUA_ESCAPED_IN_SUBMARINE, 0xffff }, + { gText_Steven_Pokenav_2B5E26, FLAG_DEFEATED_MOSSDEEP_GYM, 0xffff }, + { gText_Steven_Pokenav_2B5EA2, FLAG_KYOGRE_ESCAPED_SEAFLOOR_CAVERN, 0xffff }, + { gText_Steven_Pokenav_2B5ED9, FLAG_SYS_GAME_CLEAR, 0xffff }, + { NULL, 0xffff, 0xffff }, +}; + +static const struct MatchCallStruct0 sStevenMatchCallHeader = +{ + .type = 0, + .v1 = 0xD5, + .flag = FLAG_REGISTERED_STEVEN_POKENAV, + .desc = gStevenMatchCallDesc, + .name = gStevenMatchCallName, + .textData = sStevenTextScripts +}; + +static const match_call_text_data_t sMayTextScripts[] = { + { gText_May_Pokenav_2B3AB3, 0xFFFF, 0xFFFF }, + { gText_May_Pokenav_2B3B3F, FLAG_DEFEATED_DEWFORD_GYM, 0xFFFF }, + { gText_May_Pokenav_2B3C13, FLAG_DELIVERED_DEVON_GOODS, 0xFFFF }, + { gText_May_Pokenav_2B3CF3, FLAG_HIDE_MAUVILLE_CITY_WALLY, 0xFFFF }, + { gText_May_Pokenav_2B3D4B, FLAG_RECEIVED_HM04, 0xFFFF }, + { gText_May_Pokenav_2B3DD1, FLAG_DEFEATED_LAVARIDGE_GYM, 0xFFFF }, + { gText_May_Pokenav_2B3E69, FLAG_DEFEATED_PETALBURG_GYM, 0xFFFF }, + { gText_May_Pokenav_2B3ECD, FLAG_RECEIVED_CASTFORM, 0xFFFF }, + { gText_May_Pokenav_2B3F2B, FLAG_RECEIVED_RED_OR_BLUE_ORB, 0xFFFF }, + { gText_May_Pokenav_2B3FFB, FLAG_GROUDON_AWAKENED_MAGMA_HIDEOUT, 0xFFFF }, + { gText_May_Pokenav_2B402B, FLAG_MET_TEAM_AQUA_HARBOR, 0xFFFF }, + { gText_May_Pokenav_2B414B, FLAG_TEAM_AQUA_ESCAPED_IN_SUBMARINE, 0xFFFF }, + { gText_May_Pokenav_2B4228, FLAG_KYOGRE_ESCAPED_SEAFLOOR_CAVERN, 0xFFFF }, + { gText_May_Pokenav_2B42E0, FLAG_DEFEATED_SOOTOPOLIS_GYM, 0xFFFF }, + { gText_May_Pokenav_2B4350, FLAG_SYS_GAME_CLEAR, 0xFFFF }, + { NULL, 0xFFFF, 0xFFFF } +}; + +static const struct MatchCallStruct4 sMayMatchCallHeader = +{ + .type = 4, + .gender = MALE, + .flag = FLAG_ENABLE_RIVAL_MATCH_CALL, + .desc = gMayBrendanMatchCallDesc, + .name = gExpandedPlaceholder_May, + .textData = sMayTextScripts +}; + +static const match_call_text_data_t sBrendanTextScripts[] = { + { gText_Brendan_Pokenav_2B43EF, 0xFFFF, 0xFFFF }, + { gText_Brendan_Pokenav_2B4486, FLAG_DEFEATED_DEWFORD_GYM, 0xFFFF }, + { gText_Brendan_Pokenav_2B4560, FLAG_DELIVERED_DEVON_GOODS, 0xFFFF }, + { gText_Brendan_Pokenav_2B463F, FLAG_HIDE_MAUVILLE_CITY_WALLY, 0xFFFF }, + { gText_Brendan_Pokenav_2B46B7, FLAG_RECEIVED_HM04, 0xFFFF }, + { gText_Brendan_Pokenav_2B4761, FLAG_DEFEATED_LAVARIDGE_GYM, 0xFFFF }, + { gText_Brendan_Pokenav_2B47F4, FLAG_DEFEATED_PETALBURG_GYM, 0xFFFF }, + { gText_Brendan_Pokenav_2B4882, FLAG_RECEIVED_CASTFORM, 0xFFFF }, + { gText_Brendan_Pokenav_2B4909, FLAG_RECEIVED_RED_OR_BLUE_ORB, 0xFFFF }, + { gText_Brendan_Pokenav_2B49C4, FLAG_GROUDON_AWAKENED_MAGMA_HIDEOUT, 0xFFFF }, + { gText_Brendan_Pokenav_2B4A44, FLAG_MET_TEAM_AQUA_HARBOR, 0xFFFF }, + { gText_Brendan_Pokenav_2B4B28, FLAG_TEAM_AQUA_ESCAPED_IN_SUBMARINE, 0xFFFF }, + { gText_Brendan_Pokenav_2B4C15, FLAG_KYOGRE_ESCAPED_SEAFLOOR_CAVERN, 0xFFFF }, + { gText_Brendan_Pokenav_2B4CD8, FLAG_DEFEATED_SOOTOPOLIS_GYM, 0xFFFF }, + { gText_Brendan_Pokenav_2B4D46, FLAG_SYS_GAME_CLEAR, 0xFFFF }, + { NULL, 0xFFFF, 0xFFFF } +}; + +static const struct MatchCallStruct4 sBrendanMatchCallHeader = +{ + .type = 4, + .gender = FEMALE, + .flag = FLAG_ENABLE_RIVAL_MATCH_CALL, + .desc = gMayBrendanMatchCallDesc, + .name = gExpandedPlaceholder_Brendan, + .textData = sBrendanTextScripts +}; + +static const match_call_text_data_t sWallyTextScripts[] = { + { gText_Wally_Pokenav_2B4DE2, 0xFFFF, 0xFFFF }, + { gText_Wally_Pokenav_2B4E57, FLAG_RUSTURF_TUNNEL_OPENED, 0xFFFF }, + { gText_Wally_Pokenav_2B4EA5, FLAG_DEFEATED_LAVARIDGE_GYM, 0xFFFF }, + { gText_Wally_Pokenav_2B4F41, FLAG_RECEIVED_CASTFORM, 0xFFFF }, + { gText_Wally_Pokenav_2B4FF3, FLAG_GROUDON_AWAKENED_MAGMA_HIDEOUT, 0xFFFF }, + { gText_Wally_Pokenav_2B50B1, FLAG_KYOGRE_ESCAPED_SEAFLOOR_CAVERN, 0xFFFF }, + { gText_Wally_Pokenav_2B5100, FLAG_DEFEATED_WALLY_VICTORY_ROAD, 0xFFFF }, + { NULL, 0xFFFF, 0xFFFF } +}; + +const struct MatchCallSubstruct2 sWallyAdditionalData[] = { + { FLAG_HIDE_MAUVILLE_CITY_WALLY, 0x05 }, + { FLAG_GROUDON_AWAKENED_MAGMA_HIDEOUT, 0xD5 }, + { FLAG_HIDE_VICTORY_ROAD_ENTRANCE_WALLY, 0x46 }, + { 0xFFFF, 0xD5 } +}; + +static const struct MatchCallStruct2 sWallyMatchCallHeader = +{ + .type = 2, + .v1 = 0, + .flag = FLAG_ENABLE_WALLY_MATCH_CALL, + .rematchTableIdx = REMATCH_WALLY_3, + .desc = gWallyMatchCallDesc, + .textData = sWallyTextScripts, + .v10 = sWallyAdditionalData +}; + +static const match_call_text_data_t sScottTextScripts[] = { + { gText_Scott_Pokenav_2B5184, 0xFFFF, 0xFFFF }, + { gText_Scott_Pokenav_2B5275, FLAG_DEFEATED_EVIL_TEAM_MT_CHIMNEY, 0xFFFF }, + { gText_Scott_Pokenav_2B5323, FLAG_RECEIVED_CASTFORM, 0xFFFF }, + { gText_Scott_Pokenav_2B53DB, FLAG_RECEIVED_RED_OR_BLUE_ORB, 0xFFFF }, + { gText_Scott_Pokenav_2B54A5, FLAG_TEAM_AQUA_ESCAPED_IN_SUBMARINE, 0xFFFF }, + { gText_Scott_Pokenav_2B5541, FLAG_DEFEATED_SOOTOPOLIS_GYM, 0xFFFF }, + { gText_Scott_Pokenav_2B56CA, FLAG_SYS_GAME_CLEAR, 0xFFFF }, + { NULL, 0xFFFF, 0xFFFF } +}; + + +static const struct MatchCallStruct0 sScottMatchCallHeader = +{ + .type = 0, + .v1 = 0xD5, + .flag = FLAG_ENABLE_SCOTT_MATCH_CALL, + .desc = gScottMatchCallDesc, + .name = gScottMatchCallName, + .textData = sScottTextScripts +}; + +static const match_call_text_data_t sRoxanneTextScripts[] = { + { gText_Roxanne_Pokenav_2B2456, 0xFFFE, 0xFFFF }, + { gText_Roxanne_Pokenav_2B250E, 0xFFFF, 0xFFFF }, + { gText_Roxanne_Pokenav_2B25C1, 0xFFFF, 0xFFFF }, + { gText_Roxanne_Pokenav_2B2607, FLAG_SYS_GAME_CLEAR, 0xFFFF }, + { NULL, 0xFFFF, 0xFFFF } +}; + +static const struct MatchCallStruct5 sRoxanneMatchCallHeader = +{ + .type = 5, + .v1 = 10, + .flag = FLAG_ENABLE_ROXANNE_MATCH_CALL, + .rematchTableIdx = REMATCH_ROXANNE, + .desc = gRoxanneMatchCallDesc, + .name = NULL, + .textData = sRoxanneTextScripts +}; + +static const match_call_text_data_t sBrawlyTextScripts[] = { + { gText_Brawly_Pokenav_2B2659, 0xFFFE, 0xFFFF }, + { gText_Brawly_Pokenav_2B275D, 0xFFFF, 0xFFFF }, + { gText_Brawly_Pokenav_2B286F, 0xFFFF, 0xFFFF }, + { gText_Brawly_Pokenav_2B28D1, FLAG_SYS_GAME_CLEAR, 0xFFFF }, + { NULL, 0xFFFF, 0xFFFF } +}; + +static const struct MatchCallStruct5 sBrawlyMatchCallHeader = +{ + .type = 5, + .v1 = 2, + .flag = FLAG_ENABLE_BRAWLY_MATCH_CALL, + .rematchTableIdx = REMATCH_BRAWLY, + .desc = gBrawlyMatchCallDesc, + .name = NULL, + .textData = sBrawlyTextScripts +}; + +static const match_call_text_data_t sWattsonTextScripts[] = { + { gText_Wattson_Pokenav_2B2912, 0xFFFE, 0xFFFF }, + { gText_Wattson_Pokenav_2B29CA, 0xFFFF, 0xFFFF }, + { gText_Wattson_Pokenav_2B2AB6, 0xFFFF, 0xFFFF }, + { gText_Wattson_Pokenav_2B2B01, FLAG_SYS_GAME_CLEAR, 0xFFFF }, + { NULL, 0xFFFF, 0xFFFF } +}; + +static const struct MatchCallStruct5 sWattsonMatchCallHeader = +{ + .type = 5, + .v1 = 9, + .flag = FLAG_ENABLE_WATTSON_MATCH_CALL, + .rematchTableIdx = REMATCH_WATTSON, + .desc = gWattsonMatchCallDesc, + .name = NULL, + .textData = sWattsonTextScripts +}; + +static const match_call_text_data_t sFlanneryTextScripts[] = { + { gText_Flannery_Pokenav_2B2B4D, 0xFFFE, 0xFFFF }, + { gText_Flannery_Pokenav_2B2C0E, 0xFFFF, 0xFFFF }, + { gText_Flannery_Pokenav_2B2CF1, 0xFFFF, 0xFFFF }, + { gText_Flannery_Pokenav_2B2D54, FLAG_SYS_GAME_CLEAR, 0xFFFF }, + { NULL, 0xFFFF, 0xFFFF } +}; + +static const struct MatchCallStruct5 sFlanneryMatchCallHeader = +{ + .type = 5, + .v1 = 3, + .flag = FLAG_ENABLE_FLANNERY_MATCH_CALL, + .rematchTableIdx = REMATCH_FLANNERY, + .desc = gFlanneryMatchCallDesc, + .name = NULL, + .textData = sFlanneryTextScripts +}; + +static const match_call_text_data_t sWinonaTextScripts[] = { + { gText_Winona_Pokenav_2B2DA4, 0xFFFE, 0xFFFF }, + { gText_Winona_Pokenav_2B2E2B, 0xFFFF, 0xFFFF }, + { gText_Winona_Pokenav_2B2EC2, 0xFFFF, 0xFFFF }, + { gText_Winona_Pokenav_2B2F16, FLAG_SYS_GAME_CLEAR, 0xFFFF }, + { NULL, 0xFFFF, 0xFFFF } +}; + +static const struct MatchCallStruct5 sWinonaMatchCallHeader = +{ + .type = 5, + .v1 = 11, + .flag = FLAG_ENABLE_WINONA_MATCH_CALL, + .rematchTableIdx = REMATCH_WINONA, + .desc = gWinonaMatchCallDesc, + .name = NULL, + .textData = sWinonaTextScripts +}; + +static const match_call_text_data_t sTateLizaTextScripts[] = { + { gText_TateLiza_Pokenav_2B2F97, 0xFFFE, 0xFFFF }, + { gText_TateLiza_Pokenav_2B306E, 0xFFFF, 0xFFFF }, + { gText_TateLiza_Pokenav_2B3158, 0xFFFF, 0xFFFF }, + { gText_TateLiza_Pokenav_2B31CD, FLAG_SYS_GAME_CLEAR, 0xFFFF }, + { NULL, 0xFFFF, 0xFFFF } +}; + +static const struct MatchCallStruct5 sTateLizaMatchCallHeader = +{ + .type = 5, + .v1 = 13, + .flag = FLAG_ENABLE_TATE_AND_LIZA_MATCH_CALL, + .rematchTableIdx = REMATCH_TATE_AND_LIZA, + .desc = gTateLizaMatchCallDesc, + .name = NULL, + .textData = sTateLizaTextScripts +}; + +static const match_call_text_data_t sJuanTextScripts[] = { + { gText_Juan_Pokenav_2B3249, 0xFFFE, 0xFFFF }, + { gText_Juan_Pokenav_2B32EC, 0xFFFF, 0xFFFF }, + { gText_Juan_Pokenav_2B33AA, 0xFFFF, 0xFFFF }, + { gText_Juan_Pokenav_2B341E, FLAG_SYS_GAME_CLEAR, 0xFFFF }, + { NULL, 0xFFFF, 0xFFFF } +}; + +static const struct MatchCallStruct5 sJuanMatchCallHeader = +{ + .type = 5, + .v1 = 14, + .flag = FLAG_ENABLE_JUAN_MATCH_CALL, + .rematchTableIdx = REMATCH_JUAN, + .desc = gJuanMatchCallDesc, + .name = NULL, + .textData = sJuanTextScripts +}; + +static const match_call_text_data_t sSidneyTextScripts[] = { + { gText_Sidney_Pokenav_2B34CC, 0xFFFF, 0xFFFF }, + { NULL, 0xFFFF, 0xFFFF } +}; + +static const struct MatchCallStruct5 sSidneyMatchCallHeader = +{ + .type = 5, + .v1 = 15, + .flag = FLAG_REMATCH_SIDNEY, + .rematchTableIdx = REMATCH_SIDNEY, + .desc = gEliteFourMatchCallDesc, + .name = NULL, + .textData = sSidneyTextScripts +}; + +static const match_call_text_data_t sPhoebeTextScripts[] = { + { gText_Phoebe_Pokenav_2B3561, 0xFFFF, 0xFFFF }, + { NULL, 0xFFFF, 0xFFFF } +}; + +static const struct MatchCallStruct5 sPhoebeMatchCallHeader = +{ + .type = 5, + .v1 = 15, + .flag = FLAG_REMATCH_PHOEBE, + .rematchTableIdx = REMATCH_PHOEBE, + .desc = gEliteFourMatchCallDesc, + .name = NULL, + .textData = sPhoebeTextScripts +}; + +static const match_call_text_data_t sGlaciaTextScripts[] = { + { gText_Glacia_Pokenav_2B35E4, 0xFFFF, 0xFFFF }, + { NULL, 0xFFFF, 0xFFFF } +}; + +static const struct MatchCallStruct5 sGlaciaMatchCallHeader = +{ + .type = 5, + .v1 = 15, + .flag = FLAG_REMATCH_GLACIA, + .rematchTableIdx = REMATCH_GLACIA, + .desc = gEliteFourMatchCallDesc, + .name = NULL, + .textData = sGlaciaTextScripts +}; + +static const match_call_text_data_t sDrakeTextScripts[] = { + { gText_Drake_Pokenav_2B368B, 0xFFFF, 0xFFFF }, + { NULL, 0xFFFF, 0xFFFF } +}; + +static const struct MatchCallStruct5 sDrakeMatchCallHeader = +{ + .type = 5, + .v1 = 15, + .flag = FLAG_REMATCH_DRAKE, + .rematchTableIdx = REMATCH_DRAKE, + .desc = gEliteFourMatchCallDesc, + .name = NULL, + .textData = sDrakeTextScripts +}; + +static const match_call_text_data_t sWallaceTextScripts[] = { + { gText_Wallace_Pokenav_2B3790, 0xFFFF, 0xFFFF }, + { NULL, 0xFFFF, 0xFFFF } +}; + +static const struct MatchCallStruct5 sWallaceMatchCallHeader = +{ + .type = 5, + .v1 = 15, + .flag = FLAG_REMATCH_WALLACE, + .rematchTableIdx = REMATCH_WALLACE, + .desc = gChampionMatchCallDesc, + .name = NULL, + .textData = sWallaceTextScripts +}; + +static const match_call_t sMatchCallHeaders[] = { + {.type0 = &sMrStoneMatchCallHeader}, + {.type3 = &sProfBirchMatchCallHeader}, + {.type4 = &sBrendanMatchCallHeader}, + {.type4 = &sMayMatchCallHeader}, + {.type2 = &sWallyMatchCallHeader}, + {.type5 = &sNormanMatchCallHeader}, + {.type0 = &sMomMatchCallHeader}, + {.type0 = &sStevenMatchCallHeader}, + {.type0 = &sScottMatchCallHeader}, + {.type5 = &sRoxanneMatchCallHeader}, + {.type5 = &sBrawlyMatchCallHeader}, + {.type5 = &sWattsonMatchCallHeader}, + {.type5 = &sFlanneryMatchCallHeader}, + {.type5 = &sWinonaMatchCallHeader}, + {.type5 = &sTateLizaMatchCallHeader}, + {.type5 = &sJuanMatchCallHeader}, + {.type5 = &sSidneyMatchCallHeader}, + {.type5 = &sPhoebeMatchCallHeader}, + {.type5 = &sGlaciaMatchCallHeader}, + {.type5 = &sDrakeMatchCallHeader}, + {.type5 = &sWallaceMatchCallHeader} +}; + +static bool32 (*const sMatchCallGetFlagFuncs[])(match_call_t) = { + MatchCallGetFlag_Type0, + MatchCallGetFlag_Type1, + MatchCallGetFlag_Type2, + MatchCallGetFlag_Type3, + MatchCallGetFlag_Type4 +}; + +static u8 (*const gUnknown_08625310[])(match_call_t) = { + sub_81D1714, + sub_81D1718, + sub_81D171C, + sub_81D1750, + sub_81D1754 +}; + +static bool32 (*const sMatchCall_IsRematchableFunctions[])(match_call_t) = { + MatchCall_IsRematchable_Type0, + MatchCall_IsRematchable_Type1, + MatchCall_IsRematchable_Type2, + MatchCall_IsRematchable_Type3, + MatchCall_IsRematchable_Type4 +}; + +static bool32 (*const gUnknown_08625338[])(match_call_t) = { + sub_81D1840, + sub_81D1844, + sub_81D1848, + sub_81D184C, + sub_81D1850 +}; + +static u32 (*const sMatchCall_GetRematchTableIdxFunctions[])(match_call_t) = { + MatchCall_GetRematchTableIdx_Type0, + MatchCall_GetRematchTableIdx_Type1, + MatchCall_GetRematchTableIdx_Type2, + MatchCall_GetRematchTableIdx_Type3, + MatchCall_GetRematchTableIdx_Type4 +}; + +static void (*const sMatchCall_GetMessageFunctions[])(match_call_t, u8 *) = { + MatchCall_GetMessage_Type0, + MatchCall_GetMessage_Type1, + MatchCall_GetMessage_Type2, + MatchCall_GetMessage_Type3, + MatchCall_GetMessage_Type4 +}; + +static void (*const sMatchCall_GetNameAndDescFunctions[])(match_call_t, const u8 **, const u8 **) = { + MatchCall_GetNameAndDesc_Type0, + MatchCall_GetNameAndDesc_Type1, + MatchCall_GetNameAndDesc_Type2, + MatchCall_GetNameAndDesc_Type3, + MatchCall_GetNameAndDesc_Type4 +}; + +static const struct UnkStruct_08625388 sMatchCallCheckPageOverrides[] = { + { 7, 0x4B, 0xffff, { gMatchCallStevenStrategyText, gMatchCall_StevenTrainersPokemonText, gMatchCall_StevenSelfIntroductionText_Line1_BeforeMeteorFallsBattle, gMatchCall_StevenSelfIntroductionText_Line2_BeforeMeteorFallsBattle } }, // STEVEN + { 7, 0x4B, FLAG_DEFEATED_MOSSDEEP_GYM, { gMatchCallStevenStrategyText, gMatchCall_StevenTrainersPokemonText, gMatchCall_StevenSelfIntroductionText_Line1_AfterMeteorFallsBattle, gMatchCall_StevenSelfIntroductionText_Line2_AfterMeteorFallsBattle } }, // STEVEN + { 2, 0x3c, 0xffff, { gMatchCall_BrendanStrategyText, gMatchCall_BrendanTrainersPokemonText, gMatchCall_BrendanSelfIntroductionText_Line1, gMatchCall_BrendanSelfIntroductionText_Line2 } }, // Brendan + { 3, 0x3f, 0xffff, { gMatchCall_MayStrategyText, gMatchCall_MayTrainersPokemonText, gMatchCall_MaySelfIntroductionText_Line1, gMatchCall_MaySelfIntroductionText_Line2 } } // May +}; + +// .text + +static u32 MatchCallGetFunctionIndex(match_call_t matchCall) +{ + switch (matchCall.common->type) + { + case 0: + default: + return 0; + case 1: + case 5: + return 1; + case 2: + return 2; + case 4: + return 3; + case 3: + return 4; + } +} + +u32 GetTrainerIdxByRematchIdx(u32 rematchIdx) +{ + return gRematchTable[rematchIdx].trainerIds[0]; +} + +s32 GetRematchIdxByTrainerIdx(s32 trainerIdx) +{ + s32 rematchIdx; + + for (rematchIdx = 0; rematchIdx < REMATCH_TABLE_ENTRIES; rematchIdx++) + { + if (gRematchTable[rematchIdx].trainerIds[0] == trainerIdx) + return rematchIdx; + } + return -1; +} + +bool32 MatchCallFlagGetByIndex(u32 idx) +{ + match_call_t matchCall; + u32 i; + + if (idx > ARRAY_COUNT(sMatchCallHeaders) - 1) + return FALSE; + matchCall = sMatchCallHeaders[idx]; + i = MatchCallGetFunctionIndex(matchCall); + return sMatchCallGetFlagFuncs[i](matchCall); +} + +static bool32 MatchCallGetFlag_Type0(match_call_t matchCall) +{ + if (matchCall.type0->flag == 0xffff) + return TRUE; + return FlagGet(matchCall.type0->flag); +} + +static bool32 MatchCallGetFlag_Type1(match_call_t matchCall) +{ + if (matchCall.type1->flag == 0xffff) + return TRUE; + return FlagGet(matchCall.type1->flag); +} + +static bool32 MatchCallGetFlag_Type2(match_call_t matchCall) +{ + if (matchCall.type2->flag == 0xffff) + return TRUE; + return FlagGet(matchCall.type2->flag); +} + +static bool32 MatchCallGetFlag_Type3(match_call_t matchCall) +{ + if (matchCall.type4->gender != gSaveBlock2Ptr->playerGender) + return FALSE; + if (matchCall.type4->flag == 0xffff) + return TRUE; + return FlagGet(matchCall.type4->flag); +} + +static bool32 MatchCallGetFlag_Type4(match_call_t matchCall) +{ + return FlagGet(matchCall.type3->flag); +} + +u8 sub_81D16DC(u32 idx) +{ + match_call_t matchCall; + u32 i; + + if (idx > ARRAY_COUNT(sMatchCallHeaders) - 1) + return 0; + matchCall = sMatchCallHeaders[idx]; + i = MatchCallGetFunctionIndex(matchCall); + return gUnknown_08625310[i](matchCall); +} + +static u8 sub_81D1714(match_call_t matchCall) +{ + return matchCall.type0->v1; +} + +static u8 sub_81D1718(match_call_t matchCall) +{ + return matchCall.type1->v1; +} + +static u8 sub_81D171C(match_call_t matchCall) +{ + s32 i; + + for (i = 0; matchCall.type2->v10[i].flag != 0xffff; i++) + { + if (!FlagGet(matchCall.type2->v10[i].flag)) + break; + } + return matchCall.type2->v10[i].v2; +} + +static u8 sub_81D1750(match_call_t matchCall) +{ + return 0xd5; +} + +static u8 sub_81D1754(match_call_t matchCall) +{ + return 0xd5; +} + +bool32 MatchCall_IsRematchable(u32 idx) +{ + match_call_t matchCall; + u32 i; + + if (idx > ARRAY_COUNT(sMatchCallHeaders) - 1) + return 0; + matchCall = sMatchCallHeaders[idx]; + i = MatchCallGetFunctionIndex(matchCall); + return sMatchCall_IsRematchableFunctions[i](matchCall); +} + +static bool32 MatchCall_IsRematchable_Type0(match_call_t matchCall) +{ + return FALSE; +} + +static bool32 MatchCall_IsRematchable_Type1(match_call_t matchCall) +{ + if (matchCall.type1->rematchTableIdx >= REMATCH_ELITE_FOUR_ENTRIES) + return FALSE; + return gSaveBlock1Ptr->trainerRematches[matchCall.type1->rematchTableIdx] ? TRUE : FALSE; +} + +static bool32 MatchCall_IsRematchable_Type2(match_call_t matchCall) +{ + return gSaveBlock1Ptr->trainerRematches[matchCall.type2->rematchTableIdx] ? TRUE : FALSE; +} + +static bool32 MatchCall_IsRematchable_Type3(match_call_t matchCall) +{ + return FALSE; +} + +static bool32 MatchCall_IsRematchable_Type4(match_call_t matchCall) +{ + return FALSE; +} + +bool32 sub_81D17E8(u32 idx) +{ + match_call_t matchCall; + u32 i; + + if (idx > ARRAY_COUNT(sMatchCallHeaders) - 1) + return FALSE; + matchCall = sMatchCallHeaders[idx]; + i = MatchCallGetFunctionIndex(matchCall); + if (gUnknown_08625338[i](matchCall)) + return TRUE; + for (i = 0; i < ARRAY_COUNT(sMatchCallCheckPageOverrides); i++) + { + if (sMatchCallCheckPageOverrides[i].idx == idx) + return TRUE; + } + return FALSE; +} + +static bool32 sub_81D1840(match_call_t matchCall) +{ + return FALSE; +} + +static bool32 sub_81D1844(match_call_t matchCall) +{ + return TRUE; +} + +static bool32 sub_81D1848(match_call_t matchCall) +{ + return TRUE; +} + +static bool32 sub_81D184C(match_call_t matchCall) +{ + return FALSE; +} + +static bool32 sub_81D1850(match_call_t matchCall) +{ + return FALSE; +} + +u32 MatchCall_GetRematchTableIdx(u32 idx) +{ + match_call_t matchCall; + u32 i; + + if (idx > ARRAY_COUNT(sMatchCallHeaders) - 1) + return REMATCH_TABLE_ENTRIES; + matchCall = sMatchCallHeaders[idx]; + i = MatchCallGetFunctionIndex(matchCall); + return sMatchCall_GetRematchTableIdxFunctions[i](matchCall); +} + +static u32 MatchCall_GetRematchTableIdx_Type0(match_call_t matchCall) +{ + return REMATCH_TABLE_ENTRIES; +} + +static u32 MatchCall_GetRematchTableIdx_Type1(match_call_t matchCall) +{ + return matchCall.type1->rematchTableIdx; +} + +static u32 MatchCall_GetRematchTableIdx_Type2(match_call_t matchCall) +{ + return matchCall.type2->rematchTableIdx; +} + +static u32 MatchCall_GetRematchTableIdx_Type3(match_call_t matchCall) +{ + return REMATCH_TABLE_ENTRIES; +} + +static u32 MatchCall_GetRematchTableIdx_Type4(match_call_t matchCall) +{ + return REMATCH_TABLE_ENTRIES; +} + +void MatchCall_GetMessage(u32 idx, u8 *dest) +{ + match_call_t matchCall; + u32 i; + + if (idx > ARRAY_COUNT(sMatchCallHeaders) - 1) + return; + matchCall = sMatchCallHeaders[idx]; + i = MatchCallGetFunctionIndex(matchCall); + sMatchCall_GetMessageFunctions[i](matchCall, dest); +} + +static void MatchCall_GetMessage_Type0(match_call_t matchCall, u8 *dest) +{ + sub_81D1920(matchCall.type0->textData, dest); +} + +static void MatchCall_GetMessage_Type1(match_call_t matchCall, u8 *dest) +{ + if (matchCall.common->type != 5) + sub_81D1920(matchCall.type1->textData, dest); + else + sub_81D199C(matchCall.type5->textData, matchCall.type5->rematchTableIdx, dest); +} + +static void MatchCall_GetMessage_Type2(match_call_t matchCall, u8 *dest) +{ + sub_81D1920(matchCall.type2->textData, dest); +} + +static void MatchCall_GetMessage_Type3(match_call_t matchCall, u8 *dest) +{ + sub_81D1920(matchCall.type4->textData, dest); +} + +static void MatchCall_GetMessage_Type4(match_call_t matchCall, u8 *dest) +{ + sub_8197080(dest); +} + +void sub_81D1920(const match_call_text_data_t *sub0, u8 *dest) +{ + u32 i; + for (i = 0; sub0[i].text != NULL; i++) + ; + if (i) + i--; + while (i) + { + if (sub0[i].flag != 0xffff && FlagGet(sub0[i].flag) == TRUE) + break; + i--; + } + if (sub0[i].flag2 != 0xffff) + FlagSet(sub0[i].flag2); + StringExpandPlaceholders(dest, sub0[i].text); +} + +#ifdef NONMATCHING +// There's some weird upmerge going on that I cannot replicate at this time. +static void sub_81D199C(const match_call_text_data_t *sub0, u16 idx, u8 *dest) +{ + u32 i; + for (i = 0; sub0[i].text != NULL; i++) + { + if (sub0[i].flag == 0xfffe) + break; + if (sub0[i].flag == 0xffff && !FlagGet(sub0[i].flag)) + break; + } + if (sub0[i].flag != 0xfffe) + { + if (i) + i--; + if (sub0[i].flag2 != 0xffff) + FlagSet(sub0[i].flag2); + StringExpandPlaceholders(dest, sub0[i].text); + } + else + { + if (!FlagGet(FLAG_SYS_GAME_CLEAR)) + ; + else if (gSaveBlock1Ptr->trainerRematches[idx]) + i += 2; + else if (CountBattledRematchTeams(idx) >= 2) + i += 3; + else + i++; + StringExpandPlaceholders(dest, sub0[i].text); + } +} +#else +static NAKED void sub_81D199C(const match_call_text_data_t *sub0, u16 idx, u8 *dest) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tmov r7, r10\n" + "\tmov r6, r9\n" + "\tmov r5, r8\n" + "\tpush {r5-r7}\n" + "\tadds r6, r0, 0\n" + "\tmov r10, r2\n" + "\tlsls r1, 16\n" + "\tlsrs r7, r1, 16\n" + "\tmovs r5, 0\n" + "\tldr r0, [r6]\n" + "\tcmp r0, 0\n" + "\tbeq _081D19E6\n" + "\tldrh r0, [r6, 0x4]\n" + "\tldr r1, =0x0000fffe\n" + "\tcmp r0, r1\n" + "\tbeq _081D1A24\n" + "\tldr r0, =0x0000ffff\n" + "\tmov r9, r0\n" + "\tmov r8, r1\n" + "\tadds r4, r6, 0\n" + "_081D19C6:\n" + "\tldrh r0, [r4, 0x4]\n" + "\tcmp r0, r9\n" + "\tbeq _081D19D6\n" + "\tbl FlagGet\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbeq _081D19E6\n" + "_081D19D6:\n" + "\tadds r4, 0x8\n" + "\tadds r5, 0x1\n" + "\tldr r0, [r4]\n" + "\tcmp r0, 0\n" + "\tbeq _081D19E6\n" + "\tldrh r0, [r4, 0x4]\n" + "\tcmp r0, r8\n" + "\tbne _081D19C6\n" + "_081D19E6:\n" + "\tlsls r0, r5, 3\n" + "\tadds r0, r6\n" + "\tldrh r1, [r0, 0x4]\n" + "\tldr r0, =0x0000fffe\n" + "\tcmp r1, r0\n" + "\tbeq _081D1A24\n" + "\tcmp r5, 0\n" + "\tbeq _081D19F8\n" + "\tsubs r5, 0x1\n" + "_081D19F8:\n" + "\tlsls r0, r5, 3\n" + "\tadds r4, r0, r6\n" + "\tldrh r1, [r4, 0x6]\n" + "\tldr r0, =0x0000ffff\n" + "\tcmp r1, r0\n" + "\tbeq _081D1A0A\n" + "\tadds r0, r1, 0\n" + "\tbl FlagSet\n" + "_081D1A0A:\n" + "\tldr r1, [r4]\n" + "\tmov r0, r10\n" + "\tbl StringExpandPlaceholders\n" + "\tb _081D1A5C\n" + "\t.pool\n" + "_081D1A1C:\n" + "\tadds r5, 0x2\n" + "\tb _081D1A50\n" + "_081D1A20:\n" + "\tadds r5, 0x3\n" + "\tb _081D1A50\n" + "_081D1A24:\n" + "\tldr r0, =0x00000864\n" + "\tbl FlagGet\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbeq _081D1A50\n" + "\tldr r0, =gSaveBlock1Ptr\n" + "\tldr r0, [r0]\n" + "\tldr r1, =0x000009ca\n" + "\tadds r0, r1\n" + "\tadds r0, r7\n" + "\tldrb r0, [r0]\n" + "\tcmp r0, 0\n" + "\tbne _081D1A1C\n" + "\tadds r0, r7, 0\n" + "\tbl CountBattledRematchTeams\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tcmp r0, 0x1\n" + "\tbhi _081D1A20\n" + "\tadds r5, 0x1\n" + "_081D1A50:\n" + "\tlsls r0, r5, 3\n" + "\tadds r0, r6\n" + "\tldr r1, [r0]\n" + "\tmov r0, r10\n" + "\tbl StringExpandPlaceholders\n" + "_081D1A5C:\n" + "\tpop {r3-r5}\n" + "\tmov r8, r3\n" + "\tmov r9, r4\n" + "\tmov r10, r5\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.pool"); +} +#endif + +void sub_81D1A78(u32 idx, const u8 **desc, const u8 **name) +{ + match_call_t matchCall; + u32 i; + + if (idx > ARRAY_COUNT(sMatchCallHeaders) - 1) + return; + matchCall = sMatchCallHeaders[idx]; + i = MatchCallGetFunctionIndex(matchCall); + sMatchCall_GetNameAndDescFunctions[i](matchCall, desc, name); +} + +static void MatchCall_GetNameAndDesc_Type0(match_call_t matchCall, const u8 **desc, const u8 **name) +{ + *desc = matchCall.type0->desc; + *name = matchCall.type0->name; +} + +static void MatchCall_GetNameAndDesc_Type1(match_call_t matchCall, const u8 **desc, const u8 **name) +{ + match_call_t _matchCall = matchCall; + if (_matchCall.type1->name == NULL) + MatchCall_GetNameAndDescByRematchIdx(_matchCall.type1->rematchTableIdx, desc, name); + else + *name = _matchCall.type1->name; + *desc = _matchCall.type1->desc; +} + +static void MatchCall_GetNameAndDesc_Type2(match_call_t matchCall, const u8 **desc, const u8 **name) +{ + MatchCall_GetNameAndDescByRematchIdx(matchCall.type2->rematchTableIdx, desc, name); + *desc = matchCall.type2->desc; +} + +static void MatchCall_GetNameAndDesc_Type3(match_call_t matchCall, const u8 **desc, const u8 **name) +{ + *desc = matchCall.type4->desc; + *name = matchCall.type4->name; +} + +static void MatchCall_GetNameAndDesc_Type4(match_call_t matchCall, const u8 **desc, const u8 **name) +{ + *desc = matchCall.type3->desc; + *name = matchCall.type3->name; +} + +static void MatchCall_GetNameAndDescByRematchIdx(u32 idx, const u8 **desc, const u8 **name) +{ + const struct Trainer *trainer = gTrainers + GetTrainerIdxByRematchIdx(idx); + *desc = gTrainerClassNames[trainer->trainerClass]; + *name = trainer->trainerName; +} + +#ifdef NONMATCHING +const u8 *sub_81D1B40(u32 idx, u32 offset) +{ + u32 i; + + for (i = 0; i < ARRAY_COUNT(sMatchCallCheckPageOverrides); i++) + { + if (sMatchCallCheckPageOverrides[i].idx == idx) + { + for (; i + 1 < ARRAY_COUNT(sMatchCallCheckPageOverrides) && sMatchCallCheckPageOverrides[i + 1].idx == idx; i++) + { + if (!FlagGet(sMatchCallCheckPageOverrides[i + 1].v4)) + break; + } + return sMatchCallCheckPageOverrides[i].v8[offset]; + } + } + return NULL; +} +#else +NAKED const u8 *sub_81D1B40(u32 idx, u32 offset) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tmov r7, r9\n" + "\tmov r6, r8\n" + "\tpush {r6,r7}\n" + "\tadds r6, r0, 0\n" + "\tmovs r5, 0\n" + "\tldr r2, =sMatchCallCheckPageOverrides\n" + "\tmovs r0, 0x8\n" + "\tadds r0, r2\n" + "\tmov r9, r0\n" + "_081D1B54:\n" + "\tlsls r0, r5, 1\n" + "\tadds r0, r5\n" + "\tlsls r0, 3\n" + "\tadds r0, r2\n" + "\tldrh r0, [r0]\n" + "\tcmp r0, r6\n" + "\tbne _081D1BBC\n" + "\tadds r4, r5, 0x1\n" + "\tlsls r1, 2\n" + "\tmov r8, r1\n" + "\tcmp r4, 0x3\n" + "\tbhi _081D1BA8\n" + "\tlsls r0, r4, 1\n" + "\tadds r0, r4\n" + "\tlsls r0, 3\n" + "\tadds r0, r2\n" + "\tldrh r0, [r0]\n" + "\tcmp r0, r6\n" + "\tbne _081D1BA8\n" + "\tldr r7, =sMatchCallCheckPageOverrides\n" + "_081D1B7C:\n" + "\tlsls r0, r4, 1\n" + "\tadds r0, r4\n" + "\tlsls r0, 3\n" + "\tadds r1, r7, 0x4\n" + "\tadds r0, r1\n" + "\tldrh r0, [r0]\n" + "\tbl FlagGet\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbeq _081D1BA8\n" + "\tadds r5, r4, 0\n" + "\tadds r4, r5, 0x1\n" + "\tcmp r4, 0x3\n" + "\tbhi _081D1BA8\n" + "\tlsls r0, r4, 1\n" + "\tadds r0, r4\n" + "\tlsls r0, 3\n" + "\tadds r0, r7\n" + "\tldrh r0, [r0]\n" + "\tcmp r0, r6\n" + "\tbeq _081D1B7C\n" + "_081D1BA8:\n" + "\tlsls r0, r5, 1\n" + "\tadds r0, r5\n" + "\tlsls r0, 3\n" + "\tadd r0, r8\n" + "\tadd r0, r9\n" + "\tldr r0, [r0]\n" + "\tb _081D1BC4\n" + "\t.pool\n" + "_081D1BBC:\n" + "\tadds r5, 0x1\n" + "\tcmp r5, 0x3\n" + "\tbls _081D1B54\n" + "\tmovs r0, 0\n" + "_081D1BC4:\n" + "\tpop {r3,r4}\n" + "\tmov r8, r3\n" + "\tmov r9, r4\n" + "\tpop {r4-r7}\n" + "\tpop {r1}\n" + "\tbx r1"); +} +#endif + +s32 sub_81D1BD0(u32 idx) +{ + u32 i; + + for (i = 0; i < ARRAY_COUNT(sMatchCallCheckPageOverrides); i++) + { + if (sMatchCallCheckPageOverrides[i].idx == idx) + return sMatchCallCheckPageOverrides[i].v2; + } + return -1; +} + +bool32 sub_81D1BF8(u32 idx) +{ + s32 i; + + for (i = 0; i < (s32)ARRAY_COUNT(sMatchCallHeaders); i++) + { + u32 r0 = MatchCall_GetRematchTableIdx(i); + if (r0 != REMATCH_TABLE_ENTRIES && r0 == idx) + return TRUE; + } + return FALSE; +} + +void SetMatchCallRegisteredFlag(void) +{ + s32 r0 = GetRematchIdxByTrainerIdx(gSpecialVar_0x8004); + if (r0 >= 0) + FlagSet(FLAG_MATCH_CALL_REGISTERED + r0); +} diff --git a/src/pokenav_match_call_ui.c b/src/pokenav_match_call_ui.c new file mode 100644 index 000000000..7443c0bdb --- /dev/null +++ b/src/pokenav_match_call_ui.c @@ -0,0 +1,1266 @@ +#include "global.h" +#include "pokenav.h" +#include "window.h" +#include "strings.h" +#include "text.h" +#include "bg.h" +#include "menu.h" +#include "decompress.h" + +struct UnknownSubSubStruct_0203CF40 { + u8 bg; + u8 unk1; + u8 unk2; + u8 unk3; + u8 unk4; + u8 fontId; + u16 unk6; + u16 windowId; + u16 unkA; + u16 unkC; + u16 unkE; +}; + +struct MatchCallWindowState { + // The index of the element at the top of the window. + u16 windowTopIndex; + u16 listLength; + u16 unk4; + // The index of the cursor, relative to the top of the window. + u16 selectedIndexOffset; + u16 visibleEntries; + u16 unkA; + u32 unkC; + u32 unk10; +}; + +struct UnknownInnerStruct_81C81D4 +{ + struct UnknownSubSubStruct_0203CF40 unk0; + u32 unk10; + u32 unk14; + u32 unk18; + u32 unk1C; + s32 unk20; + s32 unk24; + u32 unk28; + s32 unk2C; + u32 unk30; + void (*unk34)(u32, u8*); + void (*unk38)(u16, u32, u32); + struct Sprite *rightArrow; + struct Sprite *upArrow; + struct Sprite *downArrow; + u8 unkTextBuffer[0x40]; +}; + +// Generally at index 0x11 (17) +struct UnknownSubStruct_81C81D4 +{ + struct UnknownInnerStruct_81C81D4 unk0; + u8 tilemapBuffer[0x800]; + struct MatchCallWindowState unk888; + u32 unk89C; + u32 unk8A0; +}; + +struct MatchCallListTemplate +{ + u32 unk0; + u16 unk4; + u16 unk6; + u8 unk8; + u8 unk9; + u8 unkA; + u8 unkB; + u8 unkC; + u8 unkD; + u8 unkE; + void (*unk10)(u32, u8 *a1); + void (*unk14)(u16 a0, u32 a1, u32 a2); +}; + +extern void sub_81CBD48(u16 windowId, u32 a1); +extern void sub_81DB620(u32 windowId, u32 a1, u32 a2, u32 a3, u32 a4); +extern u8 *sub_81CAFD8(u16 a0, u32 a1); + +void sub_81C82E4(struct UnknownSubStruct_81C81D4 *a0); +u32 sub_81C91AC(struct UnknownInnerStruct_81C81D4 *a0, const struct BgTemplate *a1, struct MatchCallListTemplate *a2, s32 a3); +void sub_81C9160(struct MatchCallWindowState *a0, struct MatchCallListTemplate *a1); +void SpriteCB_MatchCallUpArrow(struct Sprite *sprite); +void SpriteCB_MatchCallDownArrow(struct Sprite *sprite); +void SpriteCB_MatchCallRightArrow(struct Sprite *sprite); +void ToggleMatchCallArrows(struct UnknownInnerStruct_81C81D4 *a0, u32 a1); +void sub_81C8FE0(struct UnknownInnerStruct_81C81D4 *a0); +void sub_81C8EF8(struct MatchCallWindowState *a0, struct UnknownInnerStruct_81C81D4 *a1); +void sub_81C8ED0(void); +void sub_81C8E54(struct MatchCallWindowState *a0, struct UnknownInnerStruct_81C81D4 *a1, u32 a2); +void PrintMatchCallFieldNames(struct UnknownInnerStruct_81C81D4 *a0, u32 a1); +void sub_81C8D4C(struct MatchCallWindowState *a0, struct UnknownInnerStruct_81C81D4 *a1); +void sub_81C8CB4(struct MatchCallWindowState *a0, struct UnknownInnerStruct_81C81D4 *a1); +void sub_81C8B70(struct UnknownSubSubStruct_0203CF40 *a0, u32 a1, u32 a2); +void sub_81C8568(s32 a0, struct UnknownInnerStruct_81C81D4 *a1); +void sub_81C83AC(u32 a0, u32 a1, u32 a2, u32 a3, u32 a4, struct UnknownInnerStruct_81C81D4 *a5); +void sub_81C837C(struct MatchCallWindowState *a0, struct UnknownInnerStruct_81C81D4 *a1); +void sub_81C835C(struct UnknownSubSubStruct_0203CF40 *a0); +u32 LoopedTask_sub_81C8254(s32 a0); +bool32 sub_81C83E0(void); +u32 LoopedTask_sub_81C83F0(s32 a0); +u32 LoopedTask_sub_81C85A0(s32 a0); +u32 LoopedTask_sub_81C8870(s32 a0); +u32 LoopedTask_sub_81C8A28(s32 a0); +u32 LoopedTask_sub_81C8958(s32 a0); + +static const u16 sMatchcallArrowPaletteData[] = INCBIN_U16("graphics/pokenav/arrows_matchcall.gbapal"); +static const u32 sMatchcallArrowSpriteSheetData[] = INCBIN_U32("graphics/pokenav/arrows_matchcall.4bpp.lz"); + +static const u8 sPokenavColors_0861FBE4[] = +{ + 0, 2, 5 +}; + +static const u8 *const sMatchCallFieldNames[] = +{ + gText_NavgearMatchCall_Strategy, + gText_NavgearMatchCall_TrainerPokemon, + gText_NavgearMatchCall_SelfIntroduction +}; + +static const u8 sMatchCallFieldColors[] = +{ + 1, 4, 5 +}; + +static const u8 sUnknown_0861FBF7[] = +{ + 2, 4, 6, 7, 0 +}; + +static const struct CompressedSpriteSheet sMatchcallArrowSpriteSheet[] = +{ + { + .data = sMatchcallArrowSpriteSheetData, + .size = 192, + .tag = 0xA + } +}; + +static const struct SpritePalette sMatchcallArrowPalette[] = +{ + { + .data = sMatchcallArrowPaletteData, + .tag = 0x14 + }, + {} +}; + +static const struct OamData sMatchCallRightArrowSpriteOam = +{ + .y = 0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .bpp = ST_OAM_4BPP, + .shape = 2, //SPRITE_SHAPE(16x8), + .x = 0, + .size = 0, //SPRITE_SIZE(16x8), + .tileNum = 0, + .priority = 2, + .paletteNum = 0 +}; + +static const struct SpriteTemplate sMatchCallRightArrowSprite = +{ + .tileTag = 0xA, + .paletteTag = 0x14, + .oam = &sMatchCallRightArrowSpriteOam, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_MatchCallRightArrow +}; + +static const struct OamData sMatchCallUpDownArrowSpriteOam = +{ + .y = 0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .bpp = ST_OAM_4BPP, + .shape = 1, //SPRITE_SHAPE(8x16), + .x = 0, + .size = 0, //SPRITE_SIZE(8x16), + .tileNum = 0, + .priority = 2, + .paletteNum = 0 +}; + +static const struct SpriteTemplate sMatchCallUpDownArrowSprite = +{ + .tileTag = 0xA, + .paletteTag = 0x14, + .oam = &sMatchCallUpDownArrowSpriteOam, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy +}; + +EWRAM_DATA u32 gUnknown_0203CF44 = 0; + +bool32 sub_81C81D4(const struct BgTemplate *arg0, struct MatchCallListTemplate *arg1, s32 arg2) +{ + u32 v1; + struct UnknownSubStruct_81C81D4 *structPtr; + + structPtr = AllocSubstruct(0x11, sizeof(struct UnknownSubStruct_81C81D4)); + + if (structPtr == NULL) + return FALSE; + + sub_81C9160(&structPtr->unk888, arg1); + + v1 = sub_81C91AC(&structPtr->unk0, arg0, arg1, arg2); + if (v1 == 0) + return FALSE; + + CreateLoopedTask(LoopedTask_sub_81C8254, 6); + return TRUE; +} + +bool32 sub_81C8224(void) +{ + return FuncIsActiveLoopedTask(LoopedTask_sub_81C8254); +} + +void sub_81C8234(void) +{ + struct UnknownSubStruct_81C81D4 *structPtr; + + structPtr = GetSubstructPtr(0x11); + sub_81C8FE0(&structPtr->unk0); + RemoveWindow(structPtr->unk0.unk0.windowId); + FreePokenavSubstruct(0x11); +} + +u32 LoopedTask_sub_81C8254(s32 a0) +{ + struct UnknownSubStruct_81C81D4 *structPtr; + + if (IsDma3ManagerBusyWithBgCopy()) + return 2; + + structPtr = GetSubstructPtr(0x11); + + switch (a0) + { + case 0: + sub_81C82E4(structPtr); + return 0; + case 1: + sub_81C835C(&structPtr->unk0.unk0); + return 0; + case 2: + sub_81C837C(&structPtr->unk888, &structPtr->unk0); + return 0; + case 3: + if (sub_81C83E0()) + { + return 2; + } + else + { + sub_81C8ED0(); + return 1; + } + case 4: + sub_81C8EF8(&structPtr->unk888, &structPtr->unk0); + return 4; + default: + return 4; + } +} + +void sub_81C82E4(struct UnknownSubStruct_81C81D4 *a0) +{ + u16 v1 = (a0->unk0.unk0.unk1 << 12) | a0->unk0.unk0.unk6; + // TODO: When #553 is merged, use a PALETTE_NUM_TO_FILL_VALUE(1) macro here... + sub_8199DF0(a0->unk0.unk0.bg, 0x11, a0->unk0.unk0.unk6, 1); + // ...and PALETTE_NUM_TO_FILL_VALUE(4) here. + sub_8199DF0(a0->unk0.unk0.bg, 0x44, a0->unk0.unk0.unk6 + 1, 1); + SetBgTilemapBuffer(a0->unk0.unk0.bg, a0->tilemapBuffer); + FillBgTilemapBufferRect_Palette0(a0->unk0.unk0.bg, v1, 0, 0, 32, 32); + ChangeBgY(a0->unk0.unk0.bg, 0, 0); + ChangeBgX(a0->unk0.unk0.bg, 0, 0); + ChangeBgY(a0->unk0.unk0.bg, a0->unk0.unk0.unk3 << 11, 2); + CopyBgTilemapBufferToVram(a0->unk0.unk0.bg); +} + +void sub_81C835C(struct UnknownSubSubStruct_0203CF40 *a0) +{ + FillWindowPixelBuffer(a0->windowId, PIXEL_FILL(1)); + PutWindowTilemap(a0->windowId); + CopyWindowToVram(a0->windowId, 1); +} + +void sub_81C837C(struct MatchCallWindowState *a0, struct UnknownInnerStruct_81C81D4 *a1) +{ + s32 v1; + s32 v2; + + // TODO: Clean this up. + v1 = a0->listLength - a0->windowTopIndex; + v2 = a0->visibleEntries; + if (v1 > a0->visibleEntries) + v1 = v2; + sub_81C83AC(a0->unk10, a0->windowTopIndex, v1, a0->unkC, 0, a1); +} + +void sub_81C83AC(u32 a0, u32 a1, u32 a2, u32 a3, u32 a4, struct UnknownInnerStruct_81C81D4 *a5) +{ + if (a2 == 0) + return; + + a5->unk1C = a0 + a1 * a3; + a5->unk18 = a3; + a5->unk0.unkC = 0; + a5->unk0.unkE = a2; + a5->unk14 = a1; + a5->unk10 = a4; + CreateLoopedTask(LoopedTask_sub_81C83F0, 5); +} + +bool32 sub_81C83E0(void) +{ + return FuncIsActiveLoopedTask(LoopedTask_sub_81C83F0); +} + +u32 LoopedTask_sub_81C83F0(s32 a0) +{ + struct UnknownInnerStruct_81C81D4 *structPtr; + u32 v1; + + structPtr = &((struct UnknownSubStruct_81C81D4*)GetSubstructPtr(0x11))->unk0; + switch (a0) + { + case 0: + v1 = (structPtr->unk0.unkA + structPtr->unk0.unkC + structPtr->unk10) & 0xF; + structPtr->unk34(structPtr->unk1C, structPtr->unkTextBuffer); + if (structPtr->unk38 != NULL) + // Accessing unk0.windowId as if it were a u16...? + // It's accessed as a u8 again in the very next line... + structPtr->unk38(*(u16*)(&structPtr->unk0.windowId), structPtr->unk14, v1); + + AddTextPrinterParameterized(structPtr->unk0.windowId, structPtr->unk0.fontId, structPtr->unkTextBuffer, 8, (v1 << 4) + 1, 255, NULL); + + if (++structPtr->unk0.unkC >= structPtr->unk0.unkE) + { + if (structPtr->unk38 != NULL) + CopyWindowToVram(structPtr->unk0.windowId, 3); + else + CopyWindowToVram(structPtr->unk0.windowId, 2); + return 0; + } + else + { + structPtr->unk1C += structPtr->unk18; + structPtr->unk14++; + return 3; + } + case 1: + if (IsDma3ManagerBusyWithBgCopy()) + return 2; + else + return 4; + default: + return 4; + } +} + +bool32 ShouldShowUpArrow(void) +{ + u16 v1; + s32 v2; + struct UnknownSubStruct_81C81D4 *structPtr; + structPtr = GetSubstructPtr(0x11); + + return structPtr->unk888.windowTopIndex != 0; +} + +bool32 ShouldShowDownArrow(void) +{ + struct MatchCallWindowState *subPtr; + struct UnknownSubStruct_81C81D4 *structPtr; + structPtr = GetSubstructPtr(0x11); + subPtr = &structPtr->unk888; + + return subPtr->windowTopIndex + subPtr->visibleEntries < subPtr->listLength; +} + + +#ifdef NONMATCHING +// This has some register renaming issues (r4, r5, and r6 are all switched around), and +// for some reason it's creating two copies of subPtr->unk0. +// TODO: Now I know why it's making two copies - one of them is UnknownInnerStruct_81C81D4. +void MatchCall_MoveWindow(s32 a0, bool32 a1) +{ + s32 v1; + struct MatchCallWindowState *subPtr; + struct UnknownSubStruct_81C81D4 *structPtr; + structPtr = GetSubstructPtr(0x11); + subPtr = &structPtr->unk888; + + if (a0 < 0) + { + // This is where the issue is. subPtr->windowTopIndex is being stored in r1 and then copied to + // r2... and then r2 is read for the if statement, r1 is read for the function call, + // and then both are clobbered as expected. Between those two uses, no writes to r1/r2 + // happen; it doesn't need to be duplicated/moved at all. + if (subPtr->windowTopIndex + a0 < 0) + v1 = -1 * subPtr->windowTopIndex; + else + v1 = a0; + if (a1) + sub_81C83AC(subPtr->unk10, subPtr->windowTopIndex + v1, v1 * -1, subPtr->unkC, v1, structPtr); + } + else if (a1) + { + + gUnknown_0203CF44 = subPtr->windowTopIndex + subPtr->visibleEntries; + if ((s32)(gUnknown_0203CF44) + a0 >= (s32)subPtr->listLength) + v1 = subPtr->listLength - gUnknown_0203CF44; + else + v1 = a0; + + sub_81C83AC(subPtr->unk10, gUnknown_0203CF44, v1, subPtr->unkC, subPtr->visibleEntries, structPtr); + // Needed to prevent GCC from combining the two sub_81C83AC calls. + asm(""); + } + else + { + v1 = a0; + } + + sub_81C8568(v1, structPtr); + subPtr->windowTopIndex++; +} +#else +NAKED +void MatchCall_MoveWindow(s32 a0, bool32 a1) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + sub sp, 0x8\n\ + adds r6, r0, 0\n\ + adds r4, r1, 0\n\ + movs r0, 0x11\n\ + bl GetSubstructPtr\n\ + adds r7, r0, 0\n\ + ldr r0, =0x00000888\n\ + adds r5, r7, r0\n\ + cmp r6, 0\n\ + bge _081C8524\n\ + ldrh r1, [r5]\n\ + adds r0, r1, r6\n\ + cmp r0, 0\n\ + bge _081C850A\n\ + negs r6, r1\n\ +_081C850A:\n\ + cmp r4, 0\n\ + beq _081C854E\n\ + ldr r0, [r5, 0x10]\n\ + adds r1, r6\n\ + negs r2, r6\n\ + ldr r3, [r5, 0xC]\n\ + str r6, [sp]\n\ + str r7, [sp, 0x4]\n\ + bl sub_81C83AC\n\ + b _081C854E\n\ + .pool\n\ +_081C8524:\n\ + cmp r4, 0\n\ + beq _081C854E\n\ + ldr r2, =gUnknown_0203CF44\n\ + ldrh r1, [r5]\n\ + ldrh r0, [r5, 0x8]\n\ + adds r4, r1, r0\n\ + str r4, [r2]\n\ + adds r0, r4, r6\n\ + ldrh r1, [r5, 0x2]\n\ + cmp r0, r1\n\ + blt _081C853C\n\ + subs r6, r1, r4\n\ +_081C853C:\n\ + ldr r0, [r5, 0x10]\n\ + ldr r3, [r5, 0xC]\n\ + ldrh r1, [r5, 0x8]\n\ + str r1, [sp]\n\ + str r7, [sp, 0x4]\n\ + adds r1, r4, 0\n\ + adds r2, r6, 0\n\ + bl sub_81C83AC\n\ +_081C854E:\n\ + adds r0, r6, 0\n\ + adds r1, r7, 0\n\ + bl sub_81C8568\n\ + ldrh r0, [r5]\n\ + adds r0, r6\n\ + strh r0, [r5]\n\ + add sp, 0x8\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .pool\n\ + .syntax divided"); +} +#endif + +void sub_81C8568(s32 a0, struct UnknownInnerStruct_81C81D4 *a1) +{ + a1->unk20 = GetBgY(a1->unk0.bg); + a1->unk24 = a1->unk20 + (a0 << 12); + if (a0 > 0) + a1->unk30 = 1; + else + a1->unk30 = 2; + a1->unk2C = a0; + a1->unk28 = CreateLoopedTask(LoopedTask_sub_81C85A0, 6); +} + +u32 LoopedTask_sub_81C85A0(s32 a0) +{ + s32 y; + s32 v1; + bool32 flag; + struct UnknownInnerStruct_81C81D4 *structPtr; + structPtr = &((struct UnknownSubStruct_81C81D4 *)GetSubstructPtr(0x11))->unk0; + + switch (a0) + { + case 0: + if (sub_81C83E0() == FALSE) + return 1; + else + return 2; + case 1: + flag = FALSE; + y = GetBgY(structPtr->unk0.bg); + v1 = ChangeBgY(structPtr->unk0.bg, 0x1000, structPtr->unk30); + if (structPtr->unk30 == 2) + { + if ((y > structPtr->unk24 || y <= structPtr->unk20) && v1 <= structPtr->unk24) + { + flag = TRUE; + } + } + else + { + if ((y < structPtr->unk24 || y >= structPtr->unk20) && v1 >= structPtr->unk24) + { + flag = TRUE; + } + } + if (flag) + { + structPtr->unk0.unkA = (structPtr->unk0.unkA + structPtr->unk2C) & 0xF; + ChangeBgY(structPtr->unk0.bg, structPtr->unk24, 0); + return 4; + } + else + { + return 2; + } + default: + return 4; + } +} + +bool32 sub_81C8630(void) +{ + struct UnknownSubStruct_81C81D4 *structPtr; + structPtr = GetSubstructPtr(0x11); + return IsLoopedTaskActive(structPtr->unk0.unk28); +} + +struct MatchCallWindowState *GetMatchCallWindowStruct(void) +{ + struct UnknownSubStruct_81C81D4 *structPtr; + structPtr = GetSubstructPtr(0x11); + return &structPtr->unk888; +} + +u32 MatchCall_MoveCursorUp(void) +{ + struct MatchCallWindowState *structPtr; + structPtr = GetMatchCallWindowStruct(); + + if (structPtr->selectedIndexOffset != 0) + { + structPtr->selectedIndexOffset--; + return 1; + } + else + { + if (ShouldShowUpArrow()) + { + MatchCall_MoveWindow(-1, TRUE); + return 2; + } + else + { + return 0; + } + } +} + +u32 MatchCall_MoveCursorDown(void) +{ + struct MatchCallWindowState *structPtr; + structPtr = GetMatchCallWindowStruct(); + + if (structPtr->windowTopIndex + structPtr->selectedIndexOffset < structPtr->listLength - 1) + { + if (structPtr->selectedIndexOffset < structPtr->visibleEntries - 1) + { + structPtr->selectedIndexOffset++; + return 1; + } + else if (!ShouldShowDownArrow()) + { + return 0; + } + } + else + { + return 0; + } + MatchCall_MoveWindow(1, TRUE); + return 2; +} + +u32 MatchCall_PageUp(void) +{ + struct MatchCallWindowState *structPtr; + s32 scroll; + + structPtr = GetMatchCallWindowStruct(); + if (ShouldShowUpArrow()) + { + if (structPtr->windowTopIndex >= structPtr->visibleEntries) + scroll = structPtr->visibleEntries; + else + scroll = structPtr->windowTopIndex; + MatchCall_MoveWindow(scroll * -1, TRUE); + return 2; + } + else if (structPtr->selectedIndexOffset != 0) + { + structPtr->selectedIndexOffset = 0; + return 1; + } + else + { + return 0; + } +} + +u32 MatchCall_PageDown(void) +{ + struct MatchCallWindowState *structPtr; + structPtr = GetMatchCallWindowStruct(); + + if (ShouldShowDownArrow()) + { + s32 scroll; + s32 windowBottomIndex; + s32 v3; + windowBottomIndex = structPtr->windowTopIndex + structPtr->visibleEntries; + scroll = structPtr->unk4 - structPtr->windowTopIndex; + if (windowBottomIndex <= structPtr->unk4) + scroll = structPtr->visibleEntries; + MatchCall_MoveWindow(scroll, TRUE); + return 2; + } + else + { + s32 cursor; + s32 lastVisibleIndex; + if (structPtr->listLength >= structPtr->visibleEntries) + { + cursor = structPtr->selectedIndexOffset; + lastVisibleIndex = structPtr->visibleEntries; + } + else + { + cursor = structPtr->selectedIndexOffset; + lastVisibleIndex = structPtr->listLength; + } + lastVisibleIndex -= 1; + if (cursor >= lastVisibleIndex) + { + return 0; + } + else + { + structPtr->selectedIndexOffset = lastVisibleIndex; + return 1; + } + } +} + +u32 GetSelectedMatchCall(void) +{ + struct MatchCallWindowState *structPtr; + structPtr = GetMatchCallWindowStruct(); + + return structPtr->windowTopIndex + structPtr->selectedIndexOffset; +} + +u32 GetMatchCallListTopIndex(void) +{ + struct MatchCallWindowState *structPtr; + structPtr = GetMatchCallWindowStruct(); + + return structPtr->windowTopIndex; +} + +void sub_81C877C(void) +{ + struct UnknownSubStruct_81C81D4 *structPtr; + structPtr = GetSubstructPtr(0x11); + structPtr->unk89C = 0; + structPtr->unk8A0 = CreateLoopedTask(LoopedTask_sub_81C8870, 6); +} + +void sub_81C87AC(u16 a0) +{ + u16 temp; + struct UnknownSubStruct_81C81D4 *structPtr; + structPtr = GetSubstructPtr(0x11); + temp = structPtr->unk888.windowTopIndex; + temp += a0; + structPtr->unk888.windowTopIndex = temp; + structPtr->unk89C = 0; + structPtr->unk8A0 = CreateLoopedTask(LoopedTask_sub_81C8958, 6); +} + +void sub_81C87F0(void) +{ + struct UnknownSubStruct_81C81D4 *structPtr; + structPtr = GetSubstructPtr(0x11); + structPtr->unk89C = 0; + structPtr->unk8A0 = CreateLoopedTask(LoopedTask_sub_81C8A28, 6); +} + +bool32 sub_81C8820(void) +{ + struct UnknownSubStruct_81C81D4 *structPtr; + structPtr = GetSubstructPtr(0x11); + return IsLoopedTaskActive(structPtr->unk8A0); +} + +void sub_81C8838(void) +{ + struct UnknownSubStruct_81C81D4 *structPtr; + struct MatchCallWindowState *subStr; + structPtr = GetSubstructPtr(0x11); + subStr = &structPtr->unk888; + structPtr->unk0.unk38(structPtr->unk0.unk0.windowId, subStr->windowTopIndex + subStr->selectedIndexOffset, (structPtr->unk0.unk0.unkA + subStr->selectedIndexOffset) & 0xF); + CopyWindowToVram(structPtr->unk0.unk0.windowId, 1); +} + +u32 LoopedTask_sub_81C8870(s32 a0) +{ + struct UnknownSubStruct_81C81D4 *structPtr; + u16 v1; + u32 v2; + + // Needed to fix a register renaming issue. + register u16* temp asm("r1"); + structPtr = GetSubstructPtr(0x11); + + switch (a0) + { + case 0: + ToggleMatchCallArrows(&structPtr->unk0, 1); + // fall-through + case 1: + if (structPtr->unk89C != structPtr->unk888.selectedIndexOffset) + sub_81C8B70(&structPtr->unk0.unk0, structPtr->unk89C, 1); + + structPtr->unk89C++; + return 0; + case 2: + if (IsDma3ManagerBusyWithBgCopy()) + return 2; + + if (structPtr->unk89C != structPtr->unk888.visibleEntries) + return 6; + + if (structPtr->unk888.selectedIndexOffset != 0) + sub_81C8B70(&structPtr->unk0.unk0, structPtr->unk89C, structPtr->unk888.selectedIndexOffset); + + return 0; + case 3: + if (IsDma3ManagerBusyWithBgCopy()) + return 2; + temp = &structPtr->unk888.selectedIndexOffset; + v1 = *temp; + if (v1 == 0) + return 4; + + MatchCall_MoveWindow(v1, FALSE); + return 0; + case 4: + v2 = sub_81C8630(); + if (v2) + return 2; + + structPtr->unk888.selectedIndexOffset = v2; + return 4; + default: + return 4; + } +} + +u32 LoopedTask_sub_81C8958(s32 a0) +{ + struct UnknownSubStruct_81C81D4 *structPtr; + structPtr = GetSubstructPtr(0x11); + if (IsDma3ManagerBusyWithBgCopy()) + return 2; + + switch (a0) + { + case 0: + sub_81C8CB4(&structPtr->unk888, &structPtr->unk0); + break; + case 1: + PrintMatchCallFieldNames(&structPtr->unk0, 0); + break; + case 2: + sub_81C8E54(&structPtr->unk888, &structPtr->unk0, 0); + break; + case 3: + PrintMatchCallFieldNames(&structPtr->unk0, 1); + break; + case 4: + sub_81C8E54(&structPtr->unk888, &structPtr->unk0, 1); + break; + case 5: + PrintMatchCallFieldNames(&structPtr->unk0, 2); + break; + case 6: + sub_81C8E54(&structPtr->unk888, &structPtr->unk0, 2); + break; + case 7: + sub_81C8E54(&structPtr->unk888, &structPtr->unk0, 3); + break; + default: + return 4; + } + return 0; +} + +u32 LoopedTask_sub_81C8A28(s32 a0) +{ + struct UnknownSubStruct_81C81D4 *structPtr; + struct MatchCallWindowState *subPtr888; + register struct UnknownInnerStruct_81C81D4 *subPtr0 asm("r2"); + s32 v4; + + if (IsDma3ManagerBusyWithBgCopy()) + { + return 2; + } + + structPtr = GetSubstructPtr(0x11); + subPtr888 = &structPtr->unk888; + subPtr0 = &structPtr->unk0; + + switch (a0) + { + default: + return 4; + case 0: + sub_81C8D4C(subPtr888, subPtr0); + return 0; + case 1: + { + s32 v1; + s32 v2; + u32 *v3; + register s32 v4 asm("r5"); + + v3 = &structPtr->unk89C; + v1 = *v3 + 1; + *v3 = v1; + if (v1 < structPtr->unk888.visibleEntries) + { + sub_81C8B70(&subPtr0->unk0, v1, 1); + return 2; + } + + *v3 = 0; + if (subPtr888->listLength <= subPtr888->visibleEntries) + { + register u32 temp asm("r0"); + temp = subPtr888->windowTopIndex; + if (temp == 0) + return 9; + v2 = temp; + } + else + { + register s32 temp asm("r1"); + v2 = subPtr888->windowTopIndex + subPtr888->visibleEntries; + temp = (s32)subPtr888->listLength; + if (v2 <= temp) + return 9; + v2 -= temp; + } + v4 = v2 * -1; + sub_81C8B70(&subPtr0->unk0, v4, v2); + subPtr888->selectedIndexOffset = v2; + *v3 = v4; + return 0; + } + case 2: + MatchCall_MoveWindow(structPtr->unk89C, FALSE); + return 0; + case 3: + if (sub_81C8630()) + return 2; + + structPtr->unk89C = 0; + return 1; + case 4: + sub_81C83AC(subPtr888->unk10, subPtr888->windowTopIndex + structPtr->unk89C, 1, subPtr888->unkC, structPtr->unk89C, &structPtr->unk0); + return 0; + case 5: + if (sub_81C83E0()) + return 2; + + v4 = ++structPtr->unk89C; + if (v4 >= subPtr888->listLength || v4 >= subPtr888->visibleEntries) + return 1; + return 9; + case 6: + ToggleMatchCallArrows(subPtr0, 0); + return 4; + } +} + +void sub_81C8B70(struct UnknownSubSubStruct_0203CF40 *a0, u32 a1, u32 a2) +{ + u8 *v1; + u32 v2; + + v1 = (u8*)GetWindowAttribute(a0->windowId, WINDOW_TILE_DATA); + v2 = a0->unk4 * 64; + + a1 = (a0->unkA + a1) & 0xF; + if ((s32)(a1 + a2) <= 16) + { + CpuFastFill8(PIXEL_FILL(1), v1 + a1 * v2, a2 * v2); + CopyWindowToVram(a0->windowId, 2); + } + else + { + u32 v3; + u32 v4; + + v3 = 16 - a1; + v4 = a2 - v3; + + CpuFastFill8(PIXEL_FILL(1), v1 + a1 * v2, v3 * v2); + CpuFastFill8(PIXEL_FILL(1), v1, v4 * v2); + CopyWindowToVram(a0->windowId, 2); + } + + a2 -= 1; + for (a2; a2 != -1; a1 = (a1 + 1) & 0xF, a2--) + { + sub_81CBD48(a0->windowId, a1); + } + + CopyWindowToVram(a0->windowId, 1); +} + +void sub_81C8C64(struct UnknownSubSubStruct_0203CF40 *a0, u32 a1) +{ + u16 *v1; + register u32 v2 asm("r0"); + u32 v3; + + v1 = (u16*)GetBgTilemapBuffer(GetWindowAttribute(a0->windowId, WINDOW_BG)); + + v1 = &v1[(a0->unkA << 6) + a0->unk2 - 1]; + + if (a1 != 0) + { + v2 = a0->unk1 << 12; + v3 = a0->unk6 + 1; + } + else + { + v2 = a0->unk1 << 12; + v3 = a0->unk6; + } + { + register u16 v5 asm("r1"); + register u32 v6 asm("r0"); + v6 = (v3 | v2); + v6 = v6 << 16; + v5 = v6 >> 16; + v1[0] = v5; + v1[0x20] = v5; + } +} + +void sub_81C8CB4(struct MatchCallWindowState *a0, struct UnknownInnerStruct_81C81D4 *a1) +{ + u8 colors[3]; + + + memcpy(colors, sPokenavColors_0861FBE4, ARRAY_COUNT(sPokenavColors_0861FBE4)); + + a1->unk34(a0->unk10 + a0->unkC * a0->windowTopIndex, a1->unkTextBuffer); + a1->unk38(a1->unk0.windowId, a0->windowTopIndex, a1->unk0.unkA); + FillWindowPixelRect(a1->unk0.windowId, PIXEL_FILL(4), 0, a1->unk0.unkA * 16, a1->unk0.unk4 * 8, 16); + AddTextPrinterParameterized3(a1->unk0.windowId, a1->unk0.fontId, 8, (a1->unk0.unkA * 16) + 1, colors, TEXT_SPEED_FF, a1->unkTextBuffer); + sub_81C8C64(&a1->unk0, 1); + CopyWindowRectToVram(a1->unk0.windowId, 3, 0, a1->unk0.unkA * 2, a1->unk0.unk4, 2); +} + +void sub_81C8D4C(struct MatchCallWindowState *a0, struct UnknownInnerStruct_81C81D4 *a1) +{ + a1->unk34(a0->unk10 + a0->unkC * a0->windowTopIndex, a1->unkTextBuffer); + FillWindowPixelRect(a1->unk0.windowId, PIXEL_FILL(1), 0, a1->unk0.unkA * 16, a1->unk0.unk4 * 8, 16); + AddTextPrinterParameterized(a1->unk0.windowId, a1->unk0.fontId, a1->unkTextBuffer, 8, a1->unk0.unkA * 16 + 1, TEXT_SPEED_FF, NULL); + sub_81C8C64(&a1->unk0, 0); + CopyWindowToVram(a1->unk0.windowId, 3); +} + +void PrintMatchCallFieldNames(struct UnknownInnerStruct_81C81D4 *a0, u32 fieldId) +{ + const u8 *fieldNames[3]; + u8 colors[3]; + u32 r4; + u32 r5; + u32 tmp; + u32 one; + + memcpy(fieldNames, sMatchCallFieldNames, sizeof(sMatchCallFieldNames)); + memcpy(colors, sMatchCallFieldColors, sizeof(sMatchCallFieldColors)); + + r4 = a0->unk0.unkA; + tmp = fieldId * 2 + 1; + r4 += tmp; + r4 &= 0xF; + FillWindowPixelRect(a0->unk0.windowId, PIXEL_FILL(1), 0, r4 << 4, a0->unk0.unk4, 16); + + // This is a fake match. It should be this: + // AddTextPrinterParameterized3(a0->unk0.windowId, 7, 2, r4 << 4 + 1, colors, TEXT_SPEED_FF, fieldNames[fieldId]); + // But the original GCC does some clever reuse of the `1` constant that the current GCC doesn't. + one = 1; + AddTextPrinterParameterized3(a0->unk0.windowId, 7, 2, (r4 << 4) + one, colors, one - 2, fieldNames[fieldId]); + CopyWindowRectToVram(a0->unk0.windowId, 2, 0, r4 << 1, a0->unk0.unk4, 2); +} + +void sub_81C8E54(struct MatchCallWindowState *a0, struct UnknownInnerStruct_81C81D4 *a1, u32 a2) +{ + const u8 *str; + u32 r6; + + r6 = (a1->unk0.unkA + sUnknown_0861FBF7[a2]) & 0xF; + + str = sub_81CAFD8(a0->windowTopIndex, a2); + if (str != NULL) { + sub_81DB620(a1->unk0.windowId, 1, r6 * 2, a1->unk0.unk4 - 1, 2); + AddTextPrinterParameterized(a1->unk0.windowId, 7, str, 2, (r6 << 4) + 1, TEXT_SPEED_FF, NULL); + CopyWindowRectToVram(a1->unk0.windowId, 2, 0, r6 * 2, a1->unk0.unk4, 2); + } +} + +void sub_81C8ED0(void) +{ + u32 i; + const struct CompressedSpriteSheet *ptr; + + for (i = 0, ptr = sMatchcallArrowSpriteSheet; i < ARRAY_COUNT(sMatchcallArrowSpriteSheet); ptr++, i++) + { + LoadCompressedSpriteSheet(ptr); + } + Pokenav_AllocAndLoadPalettes(sMatchcallArrowPalette); +} + +void sub_81C8EF8(struct MatchCallWindowState *a0, struct UnknownInnerStruct_81C81D4 *a1) +{ + register u32 spriteId asm("r3"); + s16 temp; + + spriteId = (u8)CreateSprite(&sMatchCallRightArrowSprite, a1->unk0.unk2 * 8 + 3, (a1->unk0.unk3 + 1) * 8, 7); + a1->rightArrow = &gSprites[spriteId]; + + temp = a1->unk0.unk2 * 8 + (a1->unk0.unk4 - 1) * 4; + spriteId = (u8)CreateSprite(&sMatchCallUpDownArrowSprite, temp, a1->unk0.unk3 * 8 + a0->visibleEntries * 16, 7); + a1->downArrow = &gSprites[spriteId]; + a1->downArrow->oam.tileNum += 2; + a1->downArrow->callback = SpriteCB_MatchCallDownArrow; + + spriteId = (u8)CreateSprite(&sMatchCallUpDownArrowSprite, temp, a1->unk0.unk3 * 8, 7); + a1->upArrow = &gSprites[spriteId]; + a1->upArrow->oam.tileNum += 4; + a1->upArrow->callback = SpriteCB_MatchCallUpArrow; +} + +void sub_81C8FE0(struct UnknownInnerStruct_81C81D4 *a0) +{ + DestroySprite(a0->rightArrow); + DestroySprite(a0->upArrow); + DestroySprite(a0->downArrow); + FreeSpriteTilesByTag(0xA); + FreeSpritePaletteByTag(0x14); +} + +void ToggleMatchCallArrows(struct UnknownInnerStruct_81C81D4 *a0, bool32 shouldHide) +{ + if (shouldHide) + { + a0->rightArrow->callback = SpriteCallbackDummy; + a0->upArrow->callback = SpriteCallbackDummy; + a0->downArrow->callback = SpriteCallbackDummy; + } + else + { + a0->rightArrow->callback = SpriteCB_MatchCallRightArrow; + a0->upArrow->callback = SpriteCB_MatchCallUpArrow; + a0->downArrow->callback = SpriteCB_MatchCallDownArrow; + } + a0->rightArrow->invisible = shouldHide; + a0->upArrow->invisible = shouldHide; + a0->downArrow->invisible = shouldHide; +} + +void SpriteCB_MatchCallRightArrow(struct Sprite *sprite) +{ + struct UnknownSubStruct_81C81D4 *structPtr; + structPtr = GetSubstructPtr(0x11); + sprite->pos2.y = structPtr->unk888.selectedIndexOffset << 4; +} + +void SpriteCB_MatchCallDownArrow(struct Sprite *sprite) +{ + if (sprite->data[7] == 0 && ShouldShowDownArrow()) + sprite->invisible = FALSE; + else + sprite->invisible = TRUE; + + if (++sprite->data[0] > 3) + { + s16 offset; + + sprite->data[0] = 0; + offset = (sprite->data[1] + 1) & 7; + sprite->data[1] = offset; + sprite->pos2.y = offset; + } +} + +void SpriteCB_MatchCallUpArrow(struct Sprite *sprite) +{ + if (sprite->data[7] == 0 && ShouldShowUpArrow()) + sprite->invisible = FALSE; + else + sprite->invisible = TRUE; + + if (++sprite->data[0] > 3) + { + s16 offset; + + sprite->data[0] = 0; + offset = (sprite->data[1] + 1) & 7; + sprite->data[1] = offset; + sprite->pos2.y = -1 * offset; + } +} + +void ToggleMatchCallVerticalArrows(bool32 shouldHide) +{ + struct UnknownSubStruct_81C81D4 *structPtr; + structPtr = GetSubstructPtr(0x11); + structPtr->unk0.upArrow->data[7] = shouldHide; + structPtr->unk0.downArrow->data[7] = shouldHide; +} + +void sub_81C9160(struct MatchCallWindowState *a0, struct MatchCallListTemplate *a1) +{ + u32 unused1 = a0->unk10 = a1->unk0; + u32 v0 = a1->unk6; + u32 zero = 0; + u32 unused2 = a0->windowTopIndex = v0; + u32 v1 = a0->listLength = a1->unk4; + + a0->unkC = a1->unk8; + a0->visibleEntries = a1->unkC; + if (a0->visibleEntries >= (u16)v1) + { + a0->windowTopIndex = 0; + a0->unk4 = 0; + a0->selectedIndexOffset = v0; + } + else + { + s32 v2; + a0->unk4 = a0->listLength - a0->visibleEntries; + v2 = a0->windowTopIndex + a0->visibleEntries; + if (v2 > a0->listLength) { + a0->selectedIndexOffset = v2 - a0->listLength; + a0->windowTopIndex = v0 - a0->selectedIndexOffset; + } + else + { + a0->selectedIndexOffset = 0; + } + } +} + +u32 sub_81C91AC(struct UnknownInnerStruct_81C81D4 *a0, const struct BgTemplate *a1, struct MatchCallListTemplate *a2, s32 a3) +{ + register u32 raw_bg asm("r4") = ((a1->bg) << 30); + u8 bg = raw_bg >> 30; + u32 unknown = 0; + struct WindowTemplate window; + u8 bg_again; + + a0->unk0.bg = bg; + a0->unk0.unk6 = a3; + a0->unk34 = a2->unk10; + a0->unk38 = a2->unk14; + a0->unk0.unk1 = a2->unkD; + a0->unk0.unk2 = a2->unk9; + a0->unk0.unk3 = a2->unkB; + a0->unk0.unk4 = a2->unkA; + a0->unk0.fontId = a2->unkE; + + window.bg = raw_bg >> 30; + window.tilemapLeft = a2->unk9; + window.tilemapTop = 0; + window.width = a2->unkA; + window.height = 32; + window.paletteNum = a2->unkD; + window.baseBlock = a3 + 2; + + a0->unk0.windowId = AddWindow(&window); + if (a0->unk0.windowId == 0xFF) + { + return 0; + } + else + { + a0->unk0.unkA = unknown; + a0->rightArrow = NULL; + a0->upArrow = NULL; + a0->downArrow = NULL; + return 1; + } +} \ No newline at end of file -- cgit v1.2.3 From d352999cd804f5ab4db4d3628f5a76eb5ba2e9ca Mon Sep 17 00:00:00 2001 From: Phlosioneer Date: Sun, 7 Apr 2019 18:10:53 -0400 Subject: Change "navgear" to "pokenav" --- src/pokenav_main_menu.c | 162 ++++++++++++++++++++++---------------------- src/pokenav_match_call_ui.c | 6 +- src/strings.c | 30 ++++---- 3 files changed, 99 insertions(+), 99 deletions(-) (limited to 'src') diff --git a/src/pokenav_main_menu.c b/src/pokenav_main_menu.c index a7ea1b7dc..7a3b51c21 100644 --- a/src/pokenav_main_menu.c +++ b/src/pokenav_main_menu.c @@ -15,28 +15,28 @@ enum { - NAVGEAR_GFX_MAIN_MENU, - NAVGEAR_GFX_CONDITION_MENU, - NAVGEAR_GFX_RIBBONS_MENU, - NAVGEAR_GFX_MATCH_CALL_MENU, + POKENAV_GFX_MAIN_MENU, + POKENAV_GFX_CONDITION_MENU, + POKENAV_GFX_RIBBONS_MENU, + POKENAV_GFX_MATCH_CALL_MENU, // One of these is for the zoomed-in map, and the other is for the // zoomed-out map. Don't know which is which yet. - NAVGEAR_GFX_MAP_MENU_UNK0, - NAVGEAR_GFX_MAP_MENU_UNK1, - - NAVGEAR_GFX_PARTY_MENU, - NAVGEAR_GFX_SEARCH_MENU, - NAVGEAR_GFX_COOL_MENU, - NAVGEAR_GFX_BEAUTY_MENU, - NAVGEAR_GFX_CUTE_MENU, - NAVGEAR_GFX_SMART_MENU, - NAVGEAR_GFX_TOUGH_MENU, - - NAVGEAR_GFX_MENUS_END + POKENAV_GFX_MAP_MENU_UNK0, + POKENAV_GFX_MAP_MENU_UNK1, + + POKENAV_GFX_PARTY_MENU, + POKENAV_GFX_SEARCH_MENU, + POKENAV_GFX_COOL_MENU, + POKENAV_GFX_BEAUTY_MENU, + POKENAV_GFX_CUTE_MENU, + POKENAV_GFX_SMART_MENU, + POKENAV_GFX_TOUGH_MENU, + + POKENAV_GFX_MENUS_END }; -#define NAVGEAR_GFX_SUBMENUS_START NAVGEAR_GFX_PARTY_MENU +#define POKENAV_GFX_SUBMENUS_START POKENAV_GFX_PARTY_MENU struct PokenavMainMenuResources { @@ -46,7 +46,7 @@ struct PokenavMainMenuResources u32 currentTaskId; u32 unk10; u32 unk14; - struct Sprite *spinningNavgear; + struct Sprite *spinningPokenav; struct Sprite *leftHeaderSprites[2]; struct Sprite *submenuLeftHeaderSprites[2]; u8 tilemapBuffer[0x800]; @@ -79,12 +79,12 @@ u32 LoopedTask_ScrollMenuHeaderUp(s32 a0); void sub_81C7BF8(u32 a0); -void SpriteCB_SpinningNavgear(struct Sprite* sprite); +void SpriteCB_SpinningPokenav(struct Sprite* sprite); u32 LoopedTask_InitPokenavMenu(s32 a0); -const u16 gSpinningNavgearPaletteData[] = INCBIN_U16("graphics/pokenav/icon2.gbapal"); -const u32 gSpinningNavgearGfx[] = INCBIN_U32("graphics/pokenav/icon2.4bpp.lz"); -const u32 gUnused_SpinningNavgearGfx2[] = INCBIN_U32("graphics/pokenav/icon2_unused.4bpp.lz"); +const u16 gSpinningPokenavPaletteData[] = INCBIN_U16("graphics/pokenav/icon2.gbapal"); +const u32 gSpinningPokenavGfx[] = INCBIN_U32("graphics/pokenav/icon2.4bpp.lz"); +const u32 gUnused_SpinningPokenavGfx2[] = INCBIN_U32("graphics/pokenav/icon2_unused.4bpp.lz"); const struct BgTemplate gPokenavMainMenuBgTemplates[] = { @@ -123,18 +123,18 @@ const struct WindowTemplate gUnknown_0861FA08[2] = const u8 *const (sMenuButtonReminders[12]) = { - gText_Navgear_ClearButtonList, - gText_NavgearMap_ZoomedOutButtons, - gText_NavgearMap_ZoomedInButtons, - gText_NavgearCondition_MonListButtons, - gText_NavgearCondition_MonStatusButtons, - gText_NavgearCondition_MarkingButtons, - gText_NavgearMatchCall_TrainerListButtons, - gText_NavgearMatchCall_CallMenuButtons, - gText_NavgearMatchCall_CheckTrainerButtons, - gText_NavgearRibbons_MonListButtons, - gText_NavgearRibbons_RibbonListButtons, - gText_NavgearRibbons_RibbonCheckButtons, + gText_Pokenav_ClearButtonList, + gText_PokenavMap_ZoomedOutButtons, + gText_PokenavMap_ZoomedInButtons, + gText_PokenavCondition_MonListButtons, + gText_PokenavCondition_MonStatusButtons, + gText_PokenavCondition_MarkingButtons, + gText_PokenavMatchCall_TrainerListButtons, + gText_PokenavMatchCall_CallMenuButtons, + gText_PokenavMatchCall_CheckTrainerButtons, + gText_PokenavRibbons_MonListButtons, + gText_PokenavRibbons_RibbonListButtons, + gText_PokenavRibbons_RibbonCheckButtons, }; const u8 gMenuButtonReminderColor[4] = @@ -142,19 +142,19 @@ const u8 gMenuButtonReminderColor[4] = 4, 1, 2, 0 }; -static const struct CompressedSpriteSheet gSpinningNavgearSpriteSheet[] = +static const struct CompressedSpriteSheet gSpinningPokenavSpriteSheet[] = { { - .data = gSpinningNavgearGfx, + .data = gSpinningPokenavGfx, .size = 0x1000, .tag = 0, } }; -static const struct SpritePalette gSpinningNavgearPalette[] = +static const struct SpritePalette gSpinningPokenavPalette[] = { { - .data = gSpinningNavgearPaletteData, + .data = gSpinningPokenavPaletteData, .tag = 0, }, {} @@ -169,32 +169,32 @@ static const struct CompressedSpriteSheet sPokenavHoenMapLeftHeaderSpriteSheet = static const struct CompressedSpriteSheet sPokenavMenuLeftHeaderSpriteSheets[] = { - [NAVGEAR_GFX_MAIN_MENU] = { + [POKENAV_GFX_MAIN_MENU] = { .data = gPokenavLeftHeaderMainMenu_Gfx, .size = 0x20, .tag = 3 }, - [NAVGEAR_GFX_CONDITION_MENU] = { + [POKENAV_GFX_CONDITION_MENU] = { .data = gPokenavLeftHeaderCondition_Gfx, .size = 0x20, .tag = 1 }, - [NAVGEAR_GFX_RIBBONS_MENU] = { + [POKENAV_GFX_RIBBONS_MENU] = { .data = gPokenavLeftHeaderRibbons_Gfx, .size = 0x20, .tag = 2 }, - [NAVGEAR_GFX_MATCH_CALL_MENU] = { + [POKENAV_GFX_MATCH_CALL_MENU] = { .data = gPokenavLeftHeaderMatchCall_Gfx, .size = 0x20, .tag = 4 }, - [NAVGEAR_GFX_MAP_MENU_UNK0] = { + [POKENAV_GFX_MAP_MENU_UNK0] = { .data = gPokenavLeftHeaderHoennMap_Gfx, .size = 0x20, .tag = 0 }, - [NAVGEAR_GFX_MAP_MENU_UNK1] = { + [POKENAV_GFX_MAP_MENU_UNK1] = { .data = gPokenavLeftHeaderHoennMap_Gfx, .size = 0x40, .tag = 0 @@ -203,37 +203,37 @@ static const struct CompressedSpriteSheet sPokenavMenuLeftHeaderSpriteSheets[] = static const struct CompressedSpriteSheetNoSize sPokenavSubMenuLeftHeaderSpriteSheets[] = { - [NAVGEAR_GFX_PARTY_MENU - NAVGEAR_GFX_SUBMENUS_START] = { + [POKENAV_GFX_PARTY_MENU - POKENAV_GFX_SUBMENUS_START] = { .data = gPokenavLeftHeaderParty_Gfx, .tag = 1 }, - [NAVGEAR_GFX_SEARCH_MENU - NAVGEAR_GFX_SUBMENUS_START] = { + [POKENAV_GFX_SEARCH_MENU - POKENAV_GFX_SUBMENUS_START] = { .data = gPokenavLeftHeaderSearch_Gfx, .tag = 1 }, - [NAVGEAR_GFX_COOL_MENU - NAVGEAR_GFX_SUBMENUS_START] = { + [POKENAV_GFX_COOL_MENU - POKENAV_GFX_SUBMENUS_START] = { .data = gPokenavLeftHeaderCool_Gfx, .tag = 4 }, - [NAVGEAR_GFX_BEAUTY_MENU - NAVGEAR_GFX_SUBMENUS_START] = { + [POKENAV_GFX_BEAUTY_MENU - POKENAV_GFX_SUBMENUS_START] = { .data = gPokenavLeftHeaderBeauty_Gfx, .tag = 1 }, - [NAVGEAR_GFX_CUTE_MENU - NAVGEAR_GFX_SUBMENUS_START] = { + [POKENAV_GFX_CUTE_MENU - POKENAV_GFX_SUBMENUS_START] = { .data = gPokenavLeftHeaderCute_Gfx, .tag = 2 }, - [NAVGEAR_GFX_SMART_MENU - NAVGEAR_GFX_SUBMENUS_START] = { + [POKENAV_GFX_SMART_MENU - POKENAV_GFX_SUBMENUS_START] = { .data = gPokenavLeftHeaderSmart_Gfx, .tag = 0 }, - [NAVGEAR_GFX_TOUGH_MENU - NAVGEAR_GFX_SUBMENUS_START] = { + [POKENAV_GFX_TOUGH_MENU - POKENAV_GFX_SUBMENUS_START] = { .data = gPokenavLeftHeaderTough_Gfx, .tag = 0 } }; -static const struct OamData sSpinningNavgearSpriteOam = +static const struct OamData sSpinningPokenavSpriteOam = { .y = 0, .affineMode = 0, @@ -250,7 +250,7 @@ static const struct OamData sSpinningNavgearSpriteOam = .affineParam = 0 }; -static const union AnimCmd sSpinningNavgearAnims[] = +static const union AnimCmd sSpinningPokenavAnims[] = { ANIMCMD_FRAME(0, 8), ANIMCMD_FRAME(16, 8), @@ -263,20 +263,20 @@ static const union AnimCmd sSpinningNavgearAnims[] = ANIMCMD_JUMP(0) }; -static const union AnimCmd *const sSpinningNavgearAnimTable[] = +static const union AnimCmd *const sSpinningPokenavAnimTable[] = { - sSpinningNavgearAnims + sSpinningPokenavAnims }; -static const struct SpriteTemplate sSpinningNavgearSpriteTemplate = +static const struct SpriteTemplate sSpinningPokenavSpriteTemplate = { .tileTag = 0, .paletteTag = 0, - .oam = &sSpinningNavgearSpriteOam, - .anims = sSpinningNavgearAnimTable, + .oam = &sSpinningPokenavSpriteOam, + .anims = sSpinningPokenavAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCB_SpinningNavgear + .callback = SpriteCB_SpinningPokenav }; static const struct OamData sPokenavLeftHeaderHoenMapSpriteOam = @@ -727,48 +727,48 @@ void InitPokenavMainMenuResources(void) u8 spriteId; struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); - for (i = 0; i < ARRAY_COUNT(gSpinningNavgearSpriteSheet); i++) - LoadCompressedSpriteSheet(&gSpinningNavgearSpriteSheet[i]); + for (i = 0; i < ARRAY_COUNT(gSpinningPokenavSpriteSheet); i++) + LoadCompressedSpriteSheet(&gSpinningPokenavSpriteSheet[i]); - Pokenav_AllocAndLoadPalettes(gSpinningNavgearPalette); + Pokenav_AllocAndLoadPalettes(gSpinningPokenavPalette); structPtr->unk14 = ~1 & ~(0x10000 << IndexOfSpritePaletteTag(0)); - spriteId = CreateSprite(&sSpinningNavgearSpriteTemplate, 220, 12, 0); - structPtr->spinningNavgear = &gSprites[spriteId]; + spriteId = CreateSprite(&sSpinningPokenavSpriteTemplate, 220, 12, 0); + structPtr->spinningPokenav = &gSprites[spriteId]; } void CleanupPokenavMainMenuResources(void) { struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); - DestroySprite(structPtr->spinningNavgear); + DestroySprite(structPtr->spinningPokenav); FreeSpriteTilesByTag(0); FreeSpritePaletteByTag(0); } -void SpriteCB_SpinningNavgear(struct Sprite *sprite) +void SpriteCB_SpinningPokenav(struct Sprite *sprite) { // If the background starts scrolling, follow it. sprite->pos2.y = (GetBgY(0) / 256u) * -1; } -struct Sprite *PauseSpinningNavgearSprite(void) +struct Sprite *PauseSpinningPokenavSprite(void) { struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); - structPtr->spinningNavgear->callback = SpriteCallbackDummy; - return structPtr->spinningNavgear; + structPtr->spinningPokenav->callback = SpriteCallbackDummy; + return structPtr->spinningPokenav; } -void ResumeSpinningNavgearSprite(void) +void ResumeSpinningPokenavSprite(void) { struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); - structPtr->spinningNavgear->pos1.x = 220; - structPtr->spinningNavgear->pos1.y = 12; - structPtr->spinningNavgear->callback = SpriteCB_SpinningNavgear; - structPtr->spinningNavgear->invisible = FALSE; - structPtr->spinningNavgear->oam.priority = 0; - structPtr->spinningNavgear->subpriority = 0; + structPtr->spinningPokenav->pos1.x = 220; + structPtr->spinningPokenav->pos1.y = 12; + structPtr->spinningPokenav->callback = SpriteCB_SpinningPokenav; + structPtr->spinningPokenav->invisible = FALSE; + structPtr->spinningPokenav->oam.priority = 0; + structPtr->spinningPokenav->subpriority = 0; } void InitHoenMapHeaderSprites(void) @@ -797,10 +797,10 @@ void InitHoenMapHeaderSprites(void) void LoadLeftHeaderGfxForIndex(u32 arg0) { - if (arg0 < NAVGEAR_GFX_SUBMENUS_START) + if (arg0 < POKENAV_GFX_SUBMENUS_START) LoadLeftHeaderGfxForMenu(arg0); else - LoadLeftHeaderGfxForSubMenu(arg0 - NAVGEAR_GFX_SUBMENUS_START); + LoadLeftHeaderGfxForSubMenu(arg0 - POKENAV_GFX_SUBMENUS_START); } void sub_81C7E14(u32 arg0) @@ -818,7 +818,7 @@ void LoadLeftHeaderGfxForMenu(u32 index) struct PokenavMainMenuResources *structPtr; u32 size, tag; - if (index >= NAVGEAR_GFX_SUBMENUS_START) + if (index >= POKENAV_GFX_SUBMENUS_START) return; structPtr = GetSubstructPtr(0); @@ -829,7 +829,7 @@ void LoadLeftHeaderGfxForMenu(u32 index) RequestDma3Copy(gDecompressionBuffer, (void *)VRAM + 0x10000 + (GetSpriteTileStartByTag(2) * 32), size, 1); structPtr->leftHeaderSprites[1]->oam.tileNum = GetSpriteTileStartByTag(2) + sPokenavMenuLeftHeaderSpriteSheets[index].size; - if (index == NAVGEAR_GFX_MAP_MENU_UNK0 || index == NAVGEAR_GFX_MAP_MENU_UNK1) + if (index == POKENAV_GFX_MAP_MENU_UNK0 || index == POKENAV_GFX_MAP_MENU_UNK1) structPtr->leftHeaderSprites[1]->pos2.x = 56; else structPtr->leftHeaderSprites[1]->pos2.x = 64; @@ -839,7 +839,7 @@ void LoadLeftHeaderGfxForSubMenu(u32 arg0) { u32 size, tag; - if (arg0 >= NAVGEAR_GFX_MENUS_END - NAVGEAR_GFX_SUBMENUS_START) + if (arg0 >= POKENAV_GFX_MENUS_END - POKENAV_GFX_SUBMENUS_START) return; tag = sPokenavSubMenuLeftHeaderSpriteSheets[arg0].tag; diff --git a/src/pokenav_match_call_ui.c b/src/pokenav_match_call_ui.c index 7443c0bdb..67d5d5cf9 100644 --- a/src/pokenav_match_call_ui.c +++ b/src/pokenav_match_call_ui.c @@ -121,9 +121,9 @@ static const u8 sPokenavColors_0861FBE4[] = static const u8 *const sMatchCallFieldNames[] = { - gText_NavgearMatchCall_Strategy, - gText_NavgearMatchCall_TrainerPokemon, - gText_NavgearMatchCall_SelfIntroduction + gText_PokenavMatchCall_Strategy, + gText_PokenavMatchCall_TrainerPokemon, + gText_PokenavMatchCall_SelfIntroduction }; static const u8 sMatchCallFieldColors[] = diff --git a/src/strings.c b/src/strings.c index 12cf9cacf..ac7a32709 100644 --- a/src/strings.c +++ b/src/strings.c @@ -962,21 +962,21 @@ const u8 gUnknown_085EBE7D[] = _("DETAIL"); const u8 gUnknown_085EBE84[] = _("CALL"); const u8 gUnknown_085EBE89[] = _("EXIT"); const u8 gUnknown_085EBE8E[] = _("Can't call opponent here."); -const u8 gText_NavgearMatchCall_Strategy[] = _("STRATEGY"); -const u8 gText_NavgearMatchCall_TrainerPokemon[] = _("TRAINER'S POKéMON"); -const u8 gText_NavgearMatchCall_SelfIntroduction[] = _("SELF-INTRODUCTION"); -const u8 gText_Navgear_ClearButtonList[] = _("{CLEAR 0x80}"); -const u8 gText_NavgearMap_ZoomedOutButtons[] = _("{A_BUTTON}ZOOM {B_BUTTON}CANCEL"); -const u8 gText_NavgearMap_ZoomedInButtons[] = _("{A_BUTTON}FULL {B_BUTTON}CANCEL"); -const u8 gText_NavgearCondition_MonListButtons[] = _("{A_BUTTON}CONDITION {B_BUTTON}CANCEL"); -const u8 gText_NavgearCondition_MonStatusButtons[] = _("{A_BUTTON}MARKINGS {B_BUTTON}CANCEL"); -const u8 gText_NavgearCondition_MarkingButtons[] = _("{A_BUTTON}SELECT MARK {B_BUTTON}CANCEL"); -const u8 gText_NavgearMatchCall_TrainerListButtons[] = _("{A_BUTTON}MENU {B_BUTTON}CANCEL"); -const u8 gText_NavgearMatchCall_CallMenuButtons[] = _("{A_BUTTON}OK {B_BUTTON}CANCEL"); -const u8 gText_NavgearMatchCall_CheckTrainerButtons[] = _("{B_BUTTON}CANCEL"); -const u8 gText_NavgearRibbons_MonListButtons[] = _("{A_BUTTON}RIBBONS {B_BUTTON}CANCEL"); -const u8 gText_NavgearRibbons_RibbonListButtons[] = _("{A_BUTTON}CHECK {B_BUTTON}CANCEL"); -const u8 gText_NavgearRibbons_RibbonCheckButtons[] = _("{B_BUTTON}CANCEL"); +const u8 gText_PokenavMatchCall_Strategy[] = _("STRATEGY"); +const u8 gText_PokenavMatchCall_TrainerPokemon[] = _("TRAINER'S POKéMON"); +const u8 gText_PokenavMatchCall_SelfIntroduction[] = _("SELF-INTRODUCTION"); +const u8 gText_Pokenav_ClearButtonList[] = _("{CLEAR 0x80}"); +const u8 gText_PokenavMap_ZoomedOutButtons[] = _("{A_BUTTON}ZOOM {B_BUTTON}CANCEL"); +const u8 gText_PokenavMap_ZoomedInButtons[] = _("{A_BUTTON}FULL {B_BUTTON}CANCEL"); +const u8 gText_PokenavCondition_MonListButtons[] = _("{A_BUTTON}CONDITION {B_BUTTON}CANCEL"); +const u8 gText_PokenavCondition_MonStatusButtons[] = _("{A_BUTTON}MARKINGS {B_BUTTON}CANCEL"); +const u8 gText_PokenavCondition_MarkingButtons[] = _("{A_BUTTON}SELECT MARK {B_BUTTON}CANCEL"); +const u8 gText_PokenavMatchCall_TrainerListButtons[] = _("{A_BUTTON}MENU {B_BUTTON}CANCEL"); +const u8 gText_PokenavMatchCall_CallMenuButtons[] = _("{A_BUTTON}OK {B_BUTTON}CANCEL"); +const u8 gText_PokenavMatchCall_CheckTrainerButtons[] = _("{B_BUTTON}CANCEL"); +const u8 gText_PokenavRibbons_MonListButtons[] = _("{A_BUTTON}RIBBONS {B_BUTTON}CANCEL"); +const u8 gText_PokenavRibbons_RibbonListButtons[] = _("{A_BUTTON}CHECK {B_BUTTON}CANCEL"); +const u8 gText_PokenavRibbons_RibbonCheckButtons[] = _("{B_BUTTON}CANCEL"); const u8 gText_NatureSlash[] = _("NATURE/"); const u8 gText_TrainerCloseBy[] = _("That TRAINER is close by.\nTalk to the TRAINER in person!"); const u8 gText_InParty[] = _("IN PARTY"); -- cgit v1.2.3 From 8de9c2d91227a8e2b3684d6fa50844e9a4a89477 Mon Sep 17 00:00:00 2001 From: Phlosioneer Date: Sun, 7 Apr 2019 18:31:01 -0400 Subject: First round of fixes --- src/field_screen_effect.c | 4 +-- src/pokenav.c | 1 - src/pokenav_main_menu.c | 64 +++++++++++++++++++------------------------ src/pokenav_match_call_data.c | 6 ++-- src/pokenav_match_call_ui.c | 22 +++++++-------- 5 files changed, 43 insertions(+), 54 deletions(-) (limited to 'src') diff --git a/src/field_screen_effect.c b/src/field_screen_effect.c index 5769f44af..9a5d47156 100644 --- a/src/field_screen_effect.c +++ b/src/field_screen_effect.c @@ -1132,7 +1132,7 @@ static void sub_80B0318(u8 taskId) data[0] = 1; break; case 1: - sub_8199DF0(0, 17, 0, 1); + sub_8199DF0(0, PIXEL_FILL(1), 0, 1); sub_80B028C(data[1]); sub_80B003C(data[2], data[3], 1, 160, 1, 2); data[0] = 2; @@ -1179,7 +1179,7 @@ static void sub_80B0318(u8 taskId) if (sub_80B02C8(data[5]) == TRUE) { data[0] = 5; - sub_8199DF0(0, 0, 0, 1); + sub_8199DF0(0, PIXEL_FILL(0), 0, 1); } } break; diff --git a/src/pokenav.c b/src/pokenav.c index b70d66599..68cdb0e89 100644 --- a/src/pokenav.c +++ b/src/pokenav.c @@ -278,7 +278,6 @@ u32 (*const PokenavMenuCallbacks[15][7])(void) = }, }; - EWRAM_DATA u8 gNextLoopedTaskId = 0; EWRAM_DATA struct PokenavResources *gPokenavResources = NULL; diff --git a/src/pokenav_main_menu.c b/src/pokenav_main_menu.c index 7a3b51c21..a0d00f1e6 100644 --- a/src/pokenav_main_menu.c +++ b/src/pokenav_main_menu.c @@ -71,7 +71,7 @@ void ShowLeftHeaderSubmenuSprites(u32 arg0, bool32 arg1); void MoveLeftHeader(struct Sprite *sprite, s32 arg1, s32 arg2, s32 arg3); void SpriteCB_MoveLeftHeader(struct Sprite *sprite); void InitPokenavMainMenuResources(void); -void InitHoenMapHeaderSprites(void); +void InitHoennMapHeaderSprites(void); void sub_81C7B74(void); void CopyPaletteIntoBufferUnfaded(const u16 *palette, u32 a1, u32 a2); u32 LoopedTask_ScrollMenuHeaderDown(s32 a0); @@ -121,7 +121,7 @@ const struct WindowTemplate gUnknown_0861FA08[2] = }, }; -const u8 *const (sMenuButtonReminders[12]) = +const u8 *const sMenuButtonReminders[12] = { gText_Pokenav_ClearButtonList, gText_PokenavMap_ZoomedOutButtons, @@ -137,9 +137,9 @@ const u8 *const (sMenuButtonReminders[12]) = gText_PokenavRibbons_RibbonCheckButtons, }; -const u8 gMenuButtonReminderColor[4] = +const u8 gMenuButtonReminderColor[3] = { - 4, 1, 2, 0 + 4, 1, 2 }; static const struct CompressedSpriteSheet gSpinningPokenavSpriteSheet[] = @@ -151,7 +151,7 @@ static const struct CompressedSpriteSheet gSpinningPokenavSpriteSheet[] = } }; -static const struct SpritePalette gSpinningPokenavPalette[] = +static const struct SpritePalette gSpinningNavgearPalettes[] = { { .data = gSpinningPokenavPaletteData, @@ -160,7 +160,7 @@ static const struct SpritePalette gSpinningPokenavPalette[] = {} }; -static const struct CompressedSpriteSheet sPokenavHoenMapLeftHeaderSpriteSheet = +static const struct CompressedSpriteSheet sPokenavHoennMapLeftHeaderSpriteSheet = { .data = gPokenavLeftHeaderHoennMap_Gfx, .size = 0xC00, @@ -236,18 +236,15 @@ static const struct CompressedSpriteSheetNoSize sPokenavSubMenuLeftHeaderSpriteS static const struct OamData sSpinningPokenavSpriteOam = { .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, // FIXME: Use SPRITE_SHAPE + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .bpp = ST_OAM_4BPP, + .shape = SPRITE_SHAPE(32x32), .x = 0, - .matrixNum = 0, - .size = 2, // FIXME: Use SPRITE_SIZE + .size = SPRITE_SIZE(32x32), .tileNum = 0, .priority = 0, .paletteNum = 0, - .affineParam = 0 }; static const union AnimCmd sSpinningPokenavAnims[] = @@ -279,45 +276,40 @@ static const struct SpriteTemplate sSpinningPokenavSpriteTemplate = .callback = SpriteCB_SpinningPokenav }; -static const struct OamData sPokenavLeftHeaderHoenMapSpriteOam = +static const struct OamData sPokenavLeftHeaderHoennMapSpriteOam = { .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 1, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .bpp = ST_OAM_4BPP, + .shape = SPRITE_SHAPE(64x32), .x = 0, - .matrixNum = 0, - .size = 3, + .size = SPRITE_SIZE(64x32), .tileNum = 0, .priority = 1, .paletteNum = 0, - .affineParam = 0 }; static const struct OamData sUnknown_0861FB24 = { .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, .bpp = 0, - .shape = 1, + .shape = SPRITE_SHAPE(32x16), .x = 0, .matrixNum = 0, - .size = 2, + .size = SPRITE_SIZE(32x16), .tileNum = 0, .priority = 1, .paletteNum = 0, - .affineParam = 0 }; -static const struct SpriteTemplate sPokenavLeftHeaderHoenMapSpriteTemplate = +static const struct SpriteTemplate sPokenavLeftHeaderHoennMapSpriteTemplate = { .tileTag = 2, .paletteTag = 1, - .oam = &sPokenavLeftHeaderHoenMapSpriteOam, + .oam = &sPokenavLeftHeaderHoennMapSpriteOam, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, @@ -408,7 +400,7 @@ u32 LoopedTask_InitPokenavMenu(s32 a0) return LT_PAUSE; InitPokenavMainMenuResources(); - InitHoenMapHeaderSprites(); + InitHoennMapHeaderSprites(); ShowBg(0); return LT_FINISH; default: @@ -730,7 +722,7 @@ void InitPokenavMainMenuResources(void) for (i = 0; i < ARRAY_COUNT(gSpinningPokenavSpriteSheet); i++) LoadCompressedSpriteSheet(&gSpinningPokenavSpriteSheet[i]); - Pokenav_AllocAndLoadPalettes(gSpinningPokenavPalette); + Pokenav_AllocAndLoadPalettes(gSpinningNavgearPalettes); structPtr->unk14 = ~1 & ~(0x10000 << IndexOfSpritePaletteTag(0)); spriteId = CreateSprite(&sSpinningPokenavSpriteTemplate, 220, 12, 0); structPtr->spinningPokenav = &gSprites[spriteId]; @@ -771,17 +763,17 @@ void ResumeSpinningPokenavSprite(void) structPtr->spinningPokenav->subpriority = 0; } -void InitHoenMapHeaderSprites(void) +void InitHoennMapHeaderSprites(void) { s32 i, spriteId; struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0); - LoadCompressedSpriteSheet(&sPokenavHoenMapLeftHeaderSpriteSheet); + LoadCompressedSpriteSheet(&sPokenavHoennMapLeftHeaderSpriteSheet); AllocSpritePalette(1); AllocSpritePalette(2); for (i = 0; i < (s32)ARRAY_COUNT(structPtr->leftHeaderSprites); i++) { - spriteId = CreateSprite(&sPokenavLeftHeaderHoenMapSpriteTemplate, 0, 0, 1); + spriteId = CreateSprite(&sPokenavLeftHeaderHoennMapSpriteTemplate, 0, 0, 1); structPtr->leftHeaderSprites[i] = &gSprites[spriteId]; structPtr->leftHeaderSprites[i]->invisible = TRUE; structPtr->leftHeaderSprites[i]->pos2.x = i * 64; diff --git a/src/pokenav_match_call_data.c b/src/pokenav_match_call_data.c index 1f621922d..773a5be3a 100644 --- a/src/pokenav_match_call_data.c +++ b/src/pokenav_match_call_data.c @@ -422,7 +422,7 @@ static const match_call_text_data_t sMayTextScripts[] = { { NULL, 0xFFFF, 0xFFFF } }; -static const struct MatchCallStruct4 sMayMatchCallHeader = +static const struct MatchCallStruct4 sBrendanMatchCallHeader = { .type = 4, .gender = MALE, @@ -451,7 +451,7 @@ static const match_call_text_data_t sBrendanTextScripts[] = { { NULL, 0xFFFF, 0xFFFF } }; -static const struct MatchCallStruct4 sBrendanMatchCallHeader = +static const struct MatchCallStruct4 sMayMatchCallHeader = { .type = 4, .gender = FEMALE, @@ -728,8 +728,8 @@ static const struct MatchCallStruct5 sWallaceMatchCallHeader = static const match_call_t sMatchCallHeaders[] = { {.type0 = &sMrStoneMatchCallHeader}, {.type3 = &sProfBirchMatchCallHeader}, - {.type4 = &sBrendanMatchCallHeader}, {.type4 = &sMayMatchCallHeader}, + {.type4 = &sBrendanMatchCallHeader}, {.type2 = &sWallyMatchCallHeader}, {.type5 = &sNormanMatchCallHeader}, {.type0 = &sMomMatchCallHeader}, diff --git a/src/pokenav_match_call_ui.c b/src/pokenav_match_call_ui.c index 67d5d5cf9..c4591da37 100644 --- a/src/pokenav_match_call_ui.c +++ b/src/pokenav_match_call_ui.c @@ -136,7 +136,7 @@ static const u8 sUnknown_0861FBF7[] = 2, 4, 6, 7, 0 }; -static const struct CompressedSpriteSheet sMatchcallArrowSpriteSheet[] = +static const struct CompressedSpriteSheet sMatchcallArrowSpriteSheets[] = { { .data = sMatchcallArrowSpriteSheetData, @@ -145,7 +145,7 @@ static const struct CompressedSpriteSheet sMatchcallArrowSpriteSheet[] = } }; -static const struct SpritePalette sMatchcallArrowPalette[] = +static const struct SpritePalette sMatchcallArrowPalettes[] = { { .data = sMatchcallArrowPaletteData, @@ -160,9 +160,9 @@ static const struct OamData sMatchCallRightArrowSpriteOam = .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .bpp = ST_OAM_4BPP, - .shape = 2, //SPRITE_SHAPE(16x8), + .shape = SPRITE_SHAPE(8x16), .x = 0, - .size = 0, //SPRITE_SIZE(16x8), + .size = SPRITE_SIZE(8x16), .tileNum = 0, .priority = 2, .paletteNum = 0 @@ -185,9 +185,9 @@ static const struct OamData sMatchCallUpDownArrowSpriteOam = .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .bpp = ST_OAM_4BPP, - .shape = 1, //SPRITE_SHAPE(8x16), + .shape = SPRITE_SHAPE(16x8), .x = 0, - .size = 0, //SPRITE_SIZE(8x16), + .size = SPRITE_SIZE(16x8), .tileNum = 0, .priority = 2, .paletteNum = 0 @@ -282,10 +282,8 @@ u32 LoopedTask_sub_81C8254(s32 a0) void sub_81C82E4(struct UnknownSubStruct_81C81D4 *a0) { u16 v1 = (a0->unk0.unk0.unk1 << 12) | a0->unk0.unk0.unk6; - // TODO: When #553 is merged, use a PALETTE_NUM_TO_FILL_VALUE(1) macro here... - sub_8199DF0(a0->unk0.unk0.bg, 0x11, a0->unk0.unk0.unk6, 1); - // ...and PALETTE_NUM_TO_FILL_VALUE(4) here. - sub_8199DF0(a0->unk0.unk0.bg, 0x44, a0->unk0.unk0.unk6 + 1, 1); + sub_8199DF0(a0->unk0.unk0.bg, PIXEL_FILL(1), a0->unk0.unk0.unk6, 1); + sub_8199DF0(a0->unk0.unk0.bg, PIXEL_FILL(4), a0->unk0.unk0.unk6 + 1, 1); SetBgTilemapBuffer(a0->unk0.unk0.bg, a0->tilemapBuffer); FillBgTilemapBufferRect_Palette0(a0->unk0.unk0.bg, v1, 0, 0, 32, 32); ChangeBgY(a0->unk0.unk0.bg, 0, 0); @@ -1086,11 +1084,11 @@ void sub_81C8ED0(void) u32 i; const struct CompressedSpriteSheet *ptr; - for (i = 0, ptr = sMatchcallArrowSpriteSheet; i < ARRAY_COUNT(sMatchcallArrowSpriteSheet); ptr++, i++) + for (i = 0, ptr = sMatchcallArrowSpriteSheets; i < ARRAY_COUNT(sMatchcallArrowSpriteSheets); ptr++, i++) { LoadCompressedSpriteSheet(ptr); } - Pokenav_AllocAndLoadPalettes(sMatchcallArrowPalette); + Pokenav_AllocAndLoadPalettes(sMatchcallArrowPalettes); } void sub_81C8EF8(struct MatchCallWindowState *a0, struct UnknownInnerStruct_81C81D4 *a1) -- cgit v1.2.3