summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDiegoisawesome <Diegoisawesome@users.noreply.github.com>2019-02-23 16:04:59 -0600
committerGitHub <noreply@github.com>2019-02-23 16:04:59 -0600
commit7995cf5b6162e5c88b3c565b00cf95645a499fe2 (patch)
tree822880b7ba7e8bde846c7add27c99aa827dc9325 /src
parentf34903bc45b157bb5fe2bb7074122713eadb920b (diff)
parent788caa4fe2fcc7bd4673e947f8f30a0a0d3899ef (diff)
Merge pull request #578 from DizzyEggg/pokenav
pokenav
Diffstat (limited to 'src')
-rw-r--r--src/pokenav.c736
1 files changed, 479 insertions, 257 deletions
diff --git a/src/pokenav.c b/src/pokenav.c
index ff687e8dc..d09c3da94 100644
--- a/src/pokenav.c
+++ b/src/pokenav.c
@@ -13,26 +13,45 @@
#include "bg.h"
#include "menu.h"
#include "graphics.h"
+#include "dma3.h"
#include "gba/macro.h"
#include "decompress.h"
#include "strings.h"
#include "constants/rgb.h"
+enum
+{
+ MODE_NORMAL, // Chosen from Start menu.
+ MODE_FORCE_CALL_1, // Used for the script's special. Has to choose Match Call and make a call.
+ MODE_FORCE_CALL_2, // Set after making a call, has to exit Pokenav.
+};
+
#define UNKNOWN_OFFSET 100000
+struct UnknownSubStruct_0203CF40
+{
+ void (*unk0)(u32);
+ u32 (*unk4)(void);
+ u32 unk8;
+ u32 unkC;
+ u32 unk10;
+ u32 unk14;
+ struct Sprite *unk18;
+ struct Sprite *unk1C[2];
+ struct Sprite *unk24[2];
+ u8 tilemapBuffer[0x1000];
+};
+
+#define SUBSTRUCT_COUNT 19
+
struct UnknownStruct_0203CF40
{
u32 (*field0)(void);
u32 field4;
- u16 field8;
+ u16 mode;
u16 fieldA;
- u32 fieldC;
- void *field10[19];
-};
-
-struct UnknownStruct_sub_81C76C4
-{
- u32 data[523];
+ bool32 hasAnyRibbons;
+ struct UnknownSubStruct_0203CF40 *field10[SUBSTRUCT_COUNT];
};
extern u32 sub_81C9430(void);
@@ -101,34 +120,42 @@ extern u32 sub_81CFE08(void);
u32 sub_81C791C(s32 a0);
bool32 sub_81C756C(u32 a0);
bool32 sub_81C76C4(void);
-u32 AnyMonHasRibbon(void);
+static bool32 AnyMonHasRibbon(void);
u32 sub_81C75E0(void);
u32 sub_81C75D4(void);
u32 sub_81C76FC(void);
u32 sub_81C786C(void);
u32 sub_81C7764(s32 a0);
-u32 atk47_cmd47(s32 a0);
+u32 sub_81C78D4(s32 a0);
bool32 sub_81C7738(void);
void CopyPaletteIntoBufferUnfaded(const u16 *palette, u32 a1, u32 a2);
-void sub_81C7834(u32 (*a0)(void), u32(*a1)(void));
-void sub_81C7360(struct UnknownStruct_0203CF40 *a0);
-void sub_81C7650(u32 index);
+void sub_81C7834(void *func1, void *func2);
+static void InitMainStruct(struct UnknownStruct_0203CF40 *a0);
+void FreeSubstruct(u32 index);
void sub_81C7850(u32 a0);
void sub_81C7BF8(u32 a0);
void sub_81C71E4(u8 a0);
-void sub_81C7170(u8 a0);
+void sub_81C7170(u8 taskId);
void sub_81C742C(u8 taskId);
void sub_81C7710(void);
-void sub_81C75F4(void);
-void sub_81C7334(void);
-void sub_81C7418(void);
-void sub_81C7400(void);
+static void InitKeys_(void);
+static void FreeVars(void);
+static void VblankCb_Pokenav(void);
+static void Cb2_Pokenav(void);
void sub_81C7C28(void);
void sub_81C72BC(void);
void sub_81C7B74(void);
void sub_81C7C94(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);
+
+// Const rom data.
u32 (*const gUnknown_0861F3EC[15][7])(void) =
{
{
@@ -272,15 +299,17 @@ 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 struct BgTemplate gUnknown_0861FA04 =
+const struct BgTemplate gUnknown_0861FA04[] =
{
- .bg = 0,
- .charBaseIndex = 0,
- .mapBaseIndex = 5,
- .screenSize = 0,
- .paletteMode = 0,
- .priority = 0,
- .baseTile = 0,
+ {
+ .bg = 0,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 5,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 0,
+ .baseTile = 0,
+ }
};
const struct WindowTemplate gUnknown_0861FA08[2] =
@@ -305,7 +334,7 @@ const struct WindowTemplate gUnknown_0861FA08[2] =
},
};
-const u8 *const (MenuButtonReminders[12]) =
+const u8 *const (sMenuButtonReminders[12]) =
{
gText_Navgear_ClearButtonList,
gText_NavgearMap_ZoomedOutButtons,
@@ -341,10 +370,6 @@ const struct SpritePalette gUnknown_0861FA54[2] =
.data = gUnknown_0861F590,
.tag = 0,
},
- {
- .data = NULL,
- .tag = 0,
- }
};
const struct CompressedSpriteSheet gUnknown_0861FA64 =
@@ -358,16 +383,17 @@ extern struct UnknownStruct_0203CF40 *gUnknown_0203CF40;
extern u8 gUnknown_0203CF3C;
extern const struct SpriteTemplate gUnknown_0861FB04;
-u32 sub_81C7078(u32 (*a0)(s32), u32 a1)
+// code
+u32 sub_81C7078(u32 (*func)(s32), u32 priority)
{
u16 taskId;
if (!is_c1_link_related_active())
- taskId = CreateTask(sub_81C7170, a1);
+ taskId = CreateTask(sub_81C7170, priority);
else
- taskId = CreateTask(sub_81C71E4, a1);
+ taskId = CreateTask(sub_81C71E4, priority);
- SetWordTaskArg(taskId, 1, (u32)a0);
+ SetWordTaskArg(taskId, 1, (u32)func);
gTasks[taskId].data[3] = gUnknown_0203CF3C;
return ((gUnknown_0203CF3C++) << 16) | taskId;
@@ -375,62 +401,52 @@ u32 sub_81C7078(u32 (*a0)(s32), u32 a1)
bool32 sub_81C70D8(u32 a0)
{
- u32 v1 = a0 & 0xFFFF;
+ u32 taskId = a0 & 0xFFFF;
u32 v2 = a0 >> 16;
- if (gTasks[v1].isActive
- && (gTasks[v1].func == sub_81C7170 || gTasks[v1].func == sub_81C71E4)
- && gTasks[v1].data[3] == v2)
- {
-
+
+ if (gTasks[taskId].isActive
+ && (gTasks[taskId].func == sub_81C7170 || gTasks[taskId].func == sub_81C71E4)
+ && gTasks[taskId].data[3] == v2)
return TRUE;
- }
else
- {
return FALSE;
- }
}
bool32 sub_81C7124(u32 a0)
{
s32 i;
- for (i = 0; i < 16; i++)
+ for (i = 0; i < NUM_TASKS; i++)
{
if (gTasks[i].isActive
- && (gTasks[i].func == sub_81C7170 || gTasks[i].func == sub_81C71E4))
- {
- u32 arg = GetWordTaskArg((u8)i, 1);
- if (arg == a0)
- return TRUE;
- }
+ && (gTasks[i].func == sub_81C7170 || gTasks[i].func == sub_81C71E4)
+ && GetWordTaskArg(i, 1) == a0)
+ return TRUE;
}
return FALSE;
}
void sub_81C7170(u8 taskId)
{
- s16 *dataPtr;
- u32 (*func)(u32);
- bool32 exitLoop;
+ u32 (*func)(s32) = (void *)GetWordTaskArg(taskId, 1);
+ s16 *data = gTasks[taskId].data;
+ bool32 exitLoop = FALSE;
- func = (u32 (*)(u32))GetWordTaskArg(taskId, 1);
- dataPtr = gTasks[taskId].data;
- exitLoop = FALSE;
while (!exitLoop)
{
- u32 v1 =((u32 (*)(u32))func)(dataPtr[0]);
- switch (v1)
+ u32 var = func(data[0]);
+ switch (var)
{
case 1:
- dataPtr[0] = dataPtr[0] + 1;
+ data[0] = data[0] + 1;
break;
case 0:
- dataPtr[0]++;
+ data[0]++;
return;
case 4:
DestroyTask(taskId);
return;
default:
- dataPtr[0] = v1 - 5;
+ data[0] = var - 5;
break;
case 3:
break;
@@ -471,91 +487,81 @@ void sub_81C71E4(u8 taskId)
void CB2_PokeNav(void)
{
- gUnknown_0203CF40 = Alloc(sizeof(struct UnknownStruct_0203CF40));
+ gUnknown_0203CF40 = Alloc(sizeof(*gUnknown_0203CF40));
if (gUnknown_0203CF40 == NULL)
{
SetMainCallback2(CB2_ReturnToFieldWithOpenMenu);
}
else
{
- sub_81C7360(gUnknown_0203CF40);
+ InitMainStruct(gUnknown_0203CF40);
ResetTasks();
SetVBlankCallback(NULL);
CreateTask(sub_81C742C, 0);
- SetMainCallback2(sub_81C7400);
- SetVBlankCallback(sub_81C7418);
+ SetMainCallback2(Cb2_Pokenav);
+ SetVBlankCallback(VblankCb_Pokenav);
}
}
-void sub_81C72A4()
+void sub_81C72A4(void)
{
SetMainCallback2(sub_81C72BC);
FadeScreen(1, 0);
}
-void sub_81C72BC()
+void sub_81C72BC(void)
{
UpdatePaletteFade();
- if (!gPaletteFade.active)
+ if (gPaletteFade.active)
+ return;
+
+ gUnknown_0203CF40 = Alloc(sizeof(*gUnknown_0203CF40));
+ if (gUnknown_0203CF40 == NULL)
{
- gUnknown_0203CF40 = Alloc(sizeof(struct UnknownStruct_0203CF40));
- if (gUnknown_0203CF40 == NULL)
- {
- SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);
- }
- else
- {
- sub_81C7360(gUnknown_0203CF40);
- gUnknown_0203CF40->field8 = 1;
- ResetTasks();
- ResetSpriteData();
- FreeAllSpritePalettes();
- SetVBlankCallback(NULL);
- CreateTask(sub_81C742C, 0);
- SetMainCallback2(sub_81C7400);
- SetVBlankCallback(sub_81C7418);
- }
+ SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);
+ }
+ else
+ {
+ InitMainStruct(gUnknown_0203CF40);
+ gUnknown_0203CF40->mode = MODE_FORCE_CALL_1;
+ ResetTasks();
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ SetVBlankCallback(NULL);
+ CreateTask(sub_81C742C, 0);
+ SetMainCallback2(Cb2_Pokenav);
+ SetVBlankCallback(VblankCb_Pokenav);
}
}
-void sub_81C7334()
+static void FreeVars(void)
{
s32 i;
- for (i = 0; i < 19; i++)
- {
- sub_81C7650(i);
- }
- Free(gUnknown_0203CF40);
- gUnknown_0203CF40 = NULL;
+ for (i = 0; i < SUBSTRUCT_COUNT; i++)
+ FreeSubstruct(i);
+
+ FREE_AND_SET_NULL(gUnknown_0203CF40);
InitKeys();
}
// Clears UnknownStruct_0203CF40
-void sub_81C7360(struct UnknownStruct_0203CF40 *a0)
+static void InitMainStruct(struct UnknownStruct_0203CF40 *a0)
{
s32 i;
- void **arrayPtr;
- void *fill;
- fill = NULL;
- i = 18;
- arrayPtr = &(a0->field10[18]);
- for (i; i >= 0; i--)
- {
- *arrayPtr = fill;
- arrayPtr -= 1;
- }
- a0->field8 = 0;
+ for (i = 0; i < SUBSTRUCT_COUNT; i++)
+ a0->field10[i] = NULL;
+
+ a0->mode = MODE_NORMAL;
a0->field4 = 0;
- a0->fieldC = AnyMonHasRibbon();
+ a0->hasAnyRibbons = AnyMonHasRibbon();
a0->field0 = NULL;
}
-bool32 AnyMonHasRibbon()
+static bool32 AnyMonHasRibbon(void)
{
- s32 i;
- s32 j;
+ s32 i, j;
for (i = 0; i < PARTY_SIZE; i++)
{
@@ -569,7 +575,7 @@ bool32 AnyMonHasRibbon()
for (j = 0; j < TOTAL_BOXES_COUNT; j++)
{
- for (i = 0; i < IN_BOX_COUNT; i++)
+ for (i = 0; i < IN_BOX_COUNT; i++)
{
if (CheckBoxMonSanityAt(j, i)
&& GetBoxMonDataAt(j, i, MON_DATA_RIBBON_COUNT) != 0)
@@ -582,7 +588,7 @@ bool32 AnyMonHasRibbon()
return FALSE;
}
-void sub_81C7400()
+static void Cb2_Pokenav(void)
{
RunTasks();
AnimateSprites();
@@ -590,7 +596,7 @@ void sub_81C7400()
UpdatePaletteFade();
}
-void sub_81C7418()
+static void VblankCb_Pokenav(void)
{
TransferPlttBuffer();
LoadOam();
@@ -599,34 +605,31 @@ void sub_81C7418()
void sub_81C742C(u8 taskId)
{
- s16 *dataPtr;
u32 v1;
- bool32 v2;
-
- dataPtr = gTasks[taskId].data;
+ s16 *data = gTasks[taskId].data;
- switch (dataPtr[0])
+ switch (data[0])
{
case 0:
sub_81C76C4();
- dataPtr[0] = 1;
+ data[0] = 1;
break;
case 1:
if (sub_81C76FC())
break;
sub_81C756C(UNKNOWN_OFFSET);
- dataPtr[0] = 4;
+ data[0] = 4;
break;
case 2:
if (sub_81C786C())
break;
- dataPtr[0] = 3;
+ data[0] = 3;
case 3:
v1 = sub_81C75E0();
if (v1 == -1)
{
sub_81C7710();
- dataPtr[0] = 5;
+ data[0] = 5;
}
else if (v1 >= UNKNOWN_OFFSET)
{
@@ -634,32 +637,33 @@ void sub_81C742C(u8 taskId)
gUnknown_0861F3EC[gUnknown_0203CF40->field4][5]();
if (sub_81C756C(v1))
{
- dataPtr[0] = 4;
+ data[0] = 4;
}
else
{
sub_81C7710();
- dataPtr[0] = 5;
+ data[0] = 5;
}
}
else if (v1 != 0)
{
sub_81C7850(v1);
if (sub_81C786C())
- dataPtr[0] = 2;
+ data[0] = 2;
}
break;
case 4:
if (!sub_81C75D4())
- dataPtr[0] = 3;
+ data[0] = 3;
break;
case 5:
if (!sub_81C7738())
{
- v2 = gUnknown_0203CF40->field8 != 0;
+ bool32 calledFromScript = (gUnknown_0203CF40->mode != MODE_NORMAL);
+
sub_81C9430();
- sub_81C7334();
- if (v2)
+ FreeVars();
+ if (calledFromScript)
SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);
else
SetMainCallback2(CB2_ReturnToFieldWithOpenMenu);
@@ -670,14 +674,14 @@ void sub_81C742C(u8 taskId)
bool32 sub_81C756C(u32 a0)
{
- u32 index;
+ u32 index = a0 - UNKNOWN_OFFSET;
- index = a0 - UNKNOWN_OFFSET;
- sub_81C75F4();
+ InitKeys_();
if (!gUnknown_0861F3EC[index][0]())
return FALSE;
if (!gUnknown_0861F3EC[index][2]())
return FALSE;
+
sub_81C7834(gUnknown_0861F3EC[index][3], gUnknown_0861F3EC[index][4]);
gUnknown_0203CF40->field0 = gUnknown_0861F3EC[index][1];
gUnknown_0203CF40->field4 = index;
@@ -694,52 +698,52 @@ u32 sub_81C75E0(void)
return gUnknown_0203CF40->field0();
}
-void sub_81C75F4(void)
+static void InitKeys_(void)
{
InitKeys();
}
-void IndirectSetVBlankCallback(IntrCallback callback)
+void SetVBlankCallback_(IntrCallback callback)
{
SetVBlankCallback(callback);
}
-void sub_81C760C(void)
+void SetPokenavVBlankCallback(void)
{
- SetVBlankCallback(sub_81C7418);
+ SetVBlankCallback(VblankCb_Pokenav);
}
-void *sub_81C761C(u32 index, u32 size)
+void *AllocSubstruct(u32 index, u32 size)
{
- return gUnknown_0203CF40->field10[index] = (void*)Alloc(size);
+ return gUnknown_0203CF40->field10[index] = Alloc(size);
}
-void *sub_81C763C(u32 index)
+struct UnknownSubStruct_0203CF40 *GetSubstructPtr(u32 index)
{
return gUnknown_0203CF40->field10[index];
}
-void sub_81C7650(u32 index)
+void FreeSubstruct(u32 index)
{
if (gUnknown_0203CF40->field10[index] != NULL)
FREE_AND_SET_NULL(gUnknown_0203CF40->field10[index]);
}
-u16 sub_81C767C(void)
+u16 GetPokenavMode(void)
{
- return gUnknown_0203CF40->field8;
+ return gUnknown_0203CF40->mode;
}
-void sub_81C7688(u16 a0)
+void SetPokenavMode(u16 mode)
{
- gUnknown_0203CF40->field8 = a0;
+ gUnknown_0203CF40->mode = mode;
}
void sub_81C7694(u32 a0)
{
- u32 value;
- value = a0;
- if (a0 > 4)
+ u32 value = a0;
+
+ if (value > 4)
value = 0;
gUnknown_0203CF40->fieldA = value;
}
@@ -749,34 +753,27 @@ u16 sub_81C76AC(void)
return gUnknown_0203CF40->fieldA;
}
-u32 sub_81C76B8(void)
+bool32 CanViewRibbonsMenu(void)
{
- return gUnknown_0203CF40->fieldC;
+ return gUnknown_0203CF40->hasAnyRibbons;
}
bool32 sub_81C76C4(void)
{
- struct UnknownStruct_sub_81C76C4 *v1;
-
- v1 = (struct UnknownStruct_sub_81C76C4*)sub_81C761C(0, sizeof(struct UnknownStruct_sub_81C76C4));
- if (v1 == NULL)
- {
+ struct UnknownSubStruct_0203CF40 *structPtr = AllocSubstruct(0, 0x82C);
+ if (structPtr == NULL)
return FALSE;
- }
- else
- {
- ResetSpriteData();
- FreeAllSpritePalettes();
- v1->data[3] = sub_81C7078(sub_81C7764, 1);
- return TRUE;
- }
+
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ structPtr->unkC = sub_81C7078(sub_81C7764, 1);
+ return TRUE;
}
u32 sub_81C76FC(void)
{
- u32 *v1;
- v1 = sub_81C763C(0);
- return sub_81C70D8(v1[3]);
+ struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0);
+ return sub_81C70D8(structPtr->unkC);
}
void sub_81C7710(void)
@@ -794,15 +791,14 @@ bool32 sub_81C7738(void)
sub_81C7C94();
FreeAllWindowBuffers();
return FALSE;
- } else
- {
- return TRUE;
}
+
+ return TRUE;
}
u32 sub_81C7764(s32 a0)
{
- u32 *v1;
+ struct UnknownSubStruct_0203CF40 *structPtr;
switch (a0)
{
@@ -810,14 +806,14 @@ u32 sub_81C7764(s32 a0)
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP);
FreeAllWindowBuffers();
ResetBgsAndClearDma3BusyFlags(0);
- InitBgsFromTemplates(0, &gUnknown_0861FA04, 1);
+ InitBgsFromTemplates(0, gUnknown_0861FA04, ARRAY_COUNT(gUnknown_0861FA04));
sub_8199D98();
reset_temp_tile_data_buffers();
return 1;
case 1:
- v1 = sub_81C763C(0);
+ structPtr = GetSubstructPtr(0);
decompress_and_copy_tile_data_to_vram(0, &gPokenavHeader_Gfx, 0, 0, 0);
- SetBgTilemapBuffer(0, &v1[11]);
+ SetBgTilemapBuffer(0, structPtr->tilemapBuffer);
CopyToBgTilemapBuffer(0, &gPokenavHeader_Tilemap, 0, 0);
CopyPaletteIntoBufferUnfaded(gPokenavHeader_Pal, 0, 0x20);
CopyBgTilemapBufferToVram(0);
@@ -825,7 +821,7 @@ u32 sub_81C7764(s32 a0)
case 2:
if (free_temp_tile_data_buffers_if_possible())
return 2;
-
+
sub_81C7B74();
return 0;
case 3:
@@ -841,58 +837,46 @@ u32 sub_81C7764(s32 a0)
}
}
-void sub_81C7834(u32 (*a0)(void), u32(*a1)(void))
+void sub_81C7834(void *func1, void *func2) // Fix types later.
{
- u32 (**v1)(void);
-
- v1 = sub_81C763C(0);
- v1[0] = a0;
- v1[1] = a1;
- v1[2] = NULL;
+ struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0);
+ structPtr->unk0 = func1;
+ structPtr->unk4 = func2;
+ structPtr->unk8 = 0;
}
void sub_81C7850(u32 a0)
{
- void (**v1)(u32);
-
- v1 = sub_81C763C(0);
- v1[2] = NULL;
- v1[0](a0);
+ struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0);
+ structPtr->unk8 = 0;
+ structPtr->unk0(a0);
}
u32 sub_81C786C(void)
{
- u32 (**v1)(void);
-
- v1 = sub_81C763C(0);
- return v1[1]();
+ struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0);
+ return structPtr->unk4();
}
void sub_81C7880(void)
{
- u32 *v1;
-
- v1 = sub_81C763C(0);
- v1[3] = sub_81C7078(atk47_cmd47, 4);
+ struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0);
+ structPtr->unkC = sub_81C7078(sub_81C78D4, 4);
}
void sub_81C78A0(void)
{
- u32 *v1;
-
- v1 = sub_81C763C(0);
- v1[3] = sub_81C7078(sub_81C791C, 4);
+ struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0);
+ structPtr->unkC = sub_81C7078(sub_81C791C, 4);
}
bool32 sub_81C78C0(void)
{
- u32 *v1;
-
- v1 = sub_81C763C(0);
- return sub_81C70D8(v1[3]);
+ struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0);
+ return sub_81C70D8(structPtr->unkC);
}
-u32 atk47_cmd47(s32 a0)
+u32 sub_81C78D4(s32 a0)
{
switch (a0)
{
@@ -903,12 +887,12 @@ u32 atk47_cmd47(s32 a0)
case 0:
return 0;
case 2:
- if ((u32)ChangeBgY(0, 384, 1) >= 0x2000)
+ if (ChangeBgY(0, 384, 1) >= 0x2000u)
{
ChangeBgY(0, 0x2000, 0);
return 4;
}
-
+
return 2;
}
}
@@ -923,7 +907,8 @@ u32 sub_81C791C(s32 a0)
return 2;
}
-void CopyPaletteIntoBufferUnfaded(const u16 *palette, u32 bufferOffset, u32 size) {
+void CopyPaletteIntoBufferUnfaded(const u16 *palette, u32 bufferOffset, u32 size)
+{
CpuCopy16(palette, gPlttBufferUnfaded + bufferOffset, size);
}
@@ -932,7 +917,7 @@ void sub_81C795C(const struct SpritePalette *palettes)
const struct SpritePalette *current;
u32 index;
- for (current = palettes; current->data != NULL; current++)
+ for (current = palettes; current->data != NULL; current++)
{
index = AllocSpritePalette(current->tag);
if (index == 0xFF)
@@ -953,7 +938,7 @@ void sub_81C7990(u32 a0, u16 a1)
}
__attribute__((naked))
-void sub_81C79BC(u16 *a0, u16 *a1, u32 a2, u32 a3, u32 unused, u32 a5, u32 a6)
+void sub_81C79BC(u16 *a0, u16 *a1, u32 a2, u32 a3, u32 a4, u32 a5)
{
asm(".syntax unified\n\
push {r4-r7,lr}\n\
@@ -1090,15 +1075,15 @@ _081C7AAE:\n\
void sub_81C7AC0(s32 a0)
{
- u32 *v1;
- v1 = sub_81C763C(0);
+ struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0);
+
switch (a0)
{
case 0:
- BeginNormalPaletteFade(v1[5], -2, 0, 16, RGB_BLACK);
+ BeginNormalPaletteFade(structPtr->unk14, -2, 0, 16, RGB_BLACK);
break;
case 1:
- BeginNormalPaletteFade(v1[5], -2, 16, 0, RGB_BLACK);
+ BeginNormalPaletteFade(structPtr->unk14, -2, 16, 0, RGB_BLACK);
break;
case 2:
BeginNormalPaletteFade(0xFFFFFFFF, -2, 0, 16, RGB_BLACK);
@@ -1119,93 +1104,330 @@ void sub_81C7B40(void)
BlendPalettes(0xFFFEFFFE, 16, RGB_BLACK);
}
-void sub_81C7B54(const struct BgTemplate *a0, s32 a1)
+void InitBgTemplates(const struct BgTemplate *templates, s32 count)
{
s32 i;
- if (a1 <= 0)
- return;
- for (i = a1; i != 0; i--)
- {
- InitBgFromTemplate(a0++);
- }
+
+ for (i = 0; i < count; i++)
+ InitBgFromTemplate(templates++);
}
void sub_81C7B74(void)
{
- u32 *v1;
+ struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0);
- v1 = sub_81C763C(0);
InitWindows(&gUnknown_0861FA08[0]);
- v1[4] = 0;
- sub_81C7BF8(0);
- PutWindowTilemap(v1[4]);
- CopyWindowToVram(v1[4], 3); // TODO: Use a defined constant here.
+ 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)
{
- u32 *v1;
+ struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0);
- v1 = sub_81C763C(0);
- sub_81C7BF8(v1[4]);
- AddTextPrinterParameterized3(v1[4], 1, 0, 1, gMenuButtonReminderColor, 0, MenuButtonReminders[a0]);
+ sub_81C7BF8(structPtr->unk10);
+ AddTextPrinterParameterized3(structPtr->unk10, 1, 0, 1, gMenuButtonReminderColor, 0, sMenuButtonReminders[a0]);
}
-bool8 sub_81C7BE8(void)
+bool32 IsDma3ManagerBusyWithBgCopy_(void)
{
return IsDma3ManagerBusyWithBgCopy();
}
-void sub_81C7BF8(u32 a0)
+void sub_81C7BF8(u32 windowId)
{
- FillWindowPixelBuffer(a0, 0x44);
- FillWindowPixelRect(a0, 0x55, 0, 0, 0x80, 1);
+ FillWindowPixelBuffer(windowId, 0x44);
+ FillWindowPixelRect(windowId, 0x55, 0, 0, 0x80, 1);
}
void sub_81C7C28(void)
{
- u32 *v1;
- u32 i;
- u8 v2;
- u32 v3;
- u32 v4;
+ s32 i;
u8 spriteId;
+ struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0);
- v1 = sub_81C763C(0);
for (i = 0; i < ARRAY_COUNT(gUnknown_0861FA4C); i++)
- {
LoadCompressedSpriteSheet(&gUnknown_0861FA4C[i]);
- }
sub_81C795C(gUnknown_0861FA54);
- v2 = IndexOfSpritePaletteTag(0);
- v1[5] = ~1 & ~(0x10000 << v2);
+ structPtr->unk14 = ~1 & ~(0x10000 << IndexOfSpritePaletteTag(0));
spriteId = CreateSprite(&gUnknown_0861FB04, 220, 12, 0);
- v1[6] = (u32)(&gSprites[spriteId]);
+ structPtr->unk18 = &gSprites[spriteId];
}
void sub_81C7C94(void)
{
- void **v1;
- v1 = sub_81C763C(0);
- DestroySprite(v1[6]);
+ struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0);
+
+ DestroySprite(structPtr->unk18);
FreeSpriteTilesByTag(0);
FreeSpritePaletteByTag(0);
}
-void sub_81C7CB4(u16 *a0)
+void sub_81C7CB4(struct Sprite *sprite)
{
- u32 v1;
- v1 = GetBgY(0);
- a0[19] = (v1 >> 8) * -1;
+ sprite->pos2.y = (GetBgY(0) / 256u) * -1;
}
struct Sprite *sub_81C7CCC(void)
{
- struct Sprite **v1;
- struct Sprite *v2;
- v1 = sub_81C763C(0);
- v2 = v1[6];
- v2->callback = SpriteCallbackDummy;
- return v2;
+ struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0);
+
+ structPtr->unk18->callback = SpriteCallbackDummy;
+ return structPtr->unk18;
+}
+
+void sub_81C7CE4(void)
+{
+ struct UnknownSubStruct_0203CF40 *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;
+}
+
+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);
+ AllocSpritePalette(1);
+ AllocSpritePalette(2);
+ for (i = 0; i < 2; i++)
+ {
+ spriteId = CreateSprite(&gUnknown_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);
+ 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;
+ }
+}
+
+void sub_81C7DFC(u32 arg0)
+{
+ if (arg0 < 6)
+ sub_81C7E58(arg0);
+ else
+ sub_81C7F24(arg0 - 6);
+}
+
+void sub_81C7E14(u32 arg0)
+{
+ struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0);
+
+ if (arg0 == 4)
+ structPtr->unk1C[1]->oam.tileNum = GetSpriteTileStartByTag(2) + 32;
+ else
+ structPtr->unk1C[1]->oam.tileNum = GetSpriteTileStartByTag(2) + 64;
+}
+
+void sub_81C7E58(u32 arg0)
+{
+ struct UnknownSubStruct_0203CF40 *structPtr;
+ u32 size, tag;
+
+ if (arg0 >= 6)
+ return;
+
+ structPtr = GetSubstructPtr(0);
+ tag = gUnknown_0861FA6C[arg0].tag;
+ size = GetDecompressedDataSize(gUnknown_0861FA6C[arg0].data);
+ LoadPalette(&gPokenavLeftHeader_Pal[tag * 16], (IndexOfSpritePaletteTag(1) * 16) + 0x100, 0x20);
+ LZ77UnCompWram(gUnknown_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;
+
+ if (arg0 == 4 || arg0 == 5)
+ structPtr->unk1C[1]->pos2.x = 56;
+ else
+ 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;
+
+ if (arg0 >= 7)
+ return;
+
+ tag = gUnknown_0861FA9C[arg0].tag;
+ size = GetDecompressedDataSize(gUnknown_0861FA9C[arg0].data);
+ LoadPalette(&gPokenavLeftHeader_Pal[tag * 16], (IndexOfSpritePaletteTag(2) * 16) + 0x100, 0x20);
+ LZ77UnCompWram(gUnknown_0861FA9C[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)
+ sub_81C803C(var, arg2);
+ else
+ sub_81C8088(var, arg2);
+}
+
+void sub_81C7FC4(u32 arg0, bool32 arg1)
+{
+ if (arg0 < 6)
+ sub_81C80D4(arg1);
+ else
+ sub_81C8110(arg1);
+}
+
+void sub_81C7FDC(void)
+{
+ s32 i;
+ struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0);
+
+ for (i = 0; i < 2; i++)
+ {
+ structPtr->unk1C[i]->invisible = TRUE;
+ structPtr->unk24[i]->invisible = TRUE;
+ }
+}
+
+bool32 sub_81C8010(void)
+{
+ struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0);
+
+ if (structPtr->unk1C[0]->callback == SpriteCallbackDummy && structPtr->unk24[0]->callback == SpriteCallbackDummy)
+ return FALSE;
+ else
+ return TRUE;
+}
+
+void sub_81C803C(u32 arg0, bool32 arg1)
+{
+ s32 var1, var2, i;
+ struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0);
+
+ if (!arg1)
+ var1 = -96, var2 = 32;
+ else
+ var1 = 256, var2 = 160;
+
+ for (i = 0; i < 2; i++)
+ {
+ structPtr->unk1C[i]->pos1.y = arg0;
+ sub_81C814C(structPtr->unk1C[i], var1, var2, 12);
+ }
+}
+
+void sub_81C8088(u32 arg0, bool32 arg1)
+{
+ s32 var1, var2, i;
+ struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0);
+
+ if (!arg1)
+ var1 = -96, var2 = 16;
+ else
+ var1 = 256, var2 = 192;
+
+ for (i = 0; i < 2; i++)
+ {
+ structPtr->unk24[i]->pos1.y = arg0;
+ sub_81C814C(structPtr->unk24[i], var1, var2, 12);
+ }
+}
+
+void sub_81C80D4(bool32 arg0)
+{
+ s32 var1, var2, i;
+ struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0);
+
+ if (!arg0)
+ var1 = 32, var2 = -96;
+ else
+ var1 = 192, var2 = 256;
+
+ for (i = 0; i < 2; i++)
+ {
+ sub_81C814C(structPtr->unk1C[i], var1, var2, 12);
+ }
+}
+
+void sub_81C8110(bool32 arg0)
+{
+ s32 var1, var2, i;
+ struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0);
+
+ if (!arg0)
+ var1 = 16, var2 = -96;
+ else
+ var1 = 192, var2 = 256;
+
+ for (i = 0; i < 2; i++)
+ {
+ sub_81C814C(structPtr->unk24[i], var1, var2, 12);
+ }
+}
+
+void sub_81C814C(struct Sprite *sprite, s32 arg1, s32 arg2, s32 arg3)
+{
+ 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;
+}
+
+void sub_81C817C(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 void *arg0, void *arg1, s32 arg3)
+{
+ struct UnknownSubStruct_0203CF40 *structPtr = AllocSubstruct(0x11, 0x8A4);
+
+ if (structPtr == NULL)
+ return FALSE;
}
+*/