summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/pokenav.c185
1 files changed, 142 insertions, 43 deletions
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