summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorcamthesaxman <cameronghall@cox.net>2017-07-15 20:52:54 -0500
committercamthesaxman <cameronghall@cox.net>2017-07-15 20:52:54 -0500
commit32a9e2ae445e6f5674357edc4e8b9ee90c927c43 (patch)
treea792949c1015daf3ead068eb06ba518ada828929 /src
parent4d28489c65aba913e4169b3467dce49b54f38c87 (diff)
finish decompiling region_map
Diffstat (limited to 'src')
-rw-r--r--src/menu.c2
-rw-r--r--src/region_map.c746
2 files changed, 741 insertions, 7 deletions
diff --git a/src/menu.c b/src/menu.c
index d532fc602..8d80c35aa 100644
--- a/src/menu.c
+++ b/src/menu.c
@@ -710,7 +710,7 @@ _08072B3E:\n\
}
#endif
-void MenuPrint_RightAligned(u8 *str, u8 left, u8 top)
+void MenuPrint_RightAligned(const u8 *str, u8 left, u8 top)
{
sub_8004D38(gMenuWindowPtr, str, gMenuTextTileOffset, left, top);
}
diff --git a/src/region_map.c b/src/region_map.c
index 9e95c40d0..6318893ab 100644
--- a/src/region_map.c
+++ b/src/region_map.c
@@ -1,10 +1,19 @@
#include "global.h"
#include "event_data.h"
+#include "field_effect.h"
#include "field_specials.h"
+#include "m4a.h"
#include "main.h"
+#include "menu.h"
#include "palette.h"
+#include "pokemon_menu.h"
#include "rom4.h"
+#include "secret_base.h"
+#include "songs.h"
#include "sprite.h"
+#include "strings.h"
+#include "string_util.h"
+#include "text.h"
#include "trig.h"
struct UnknownStruct1
@@ -233,7 +242,21 @@ void sub_80FBB3C(u16, u16);
void sub_80FBCA0(void);
void sub_80FBDF8(void);
void sub_80FBE24(void);
-void sub_80FBFB4();
+void sub_80FBF34(struct Sprite *);
+void sub_80FBF40(struct Sprite *);
+void sub_80FBEA4(struct Sprite *);
+const u8 *sub_80FBFB4(u8 *, u16, u16);
+void sub_80FC214(void);
+void sub_80FC228(void);
+void sub_80FC244(void (*func)(void));
+void sub_80FC254(void);
+void sub_80FC31C(void);
+void sub_80FC374(void);
+void sub_80FC484(void);
+void sub_80FC55C(struct Sprite *);
+void sub_80FC5B4(void);
+void sub_80FC600(void);
+void sub_80FC69C(void);
void sub_80FA8EC(struct UnknownStruct1 *a, u8 b)
{
@@ -275,7 +298,7 @@ bool8 sub_80FA940(void)
gUnknown_020388CC->unk76 = gUnknown_020388CC->unk56;
gUnknown_020388CC->unk16 = sub_80FB758(gUnknown_020388CC->unk14);
gUnknown_020388CC->unk14 = sub_80FB9C0(gUnknown_020388CC->unk14);
- sub_80FBFB4(gUnknown_020388CC, gUnknown_020388CC->unk14, 16);
+ sub_80FBFB4(gUnknown_020388CC->filler0, gUnknown_020388CC->unk14, 16);
break;
case 6:
if (gUnknown_020388CC->unk78 == 0)
@@ -390,7 +413,7 @@ u8 _swiopen(void)
if (r4 != gUnknown_020388CC->unk14)
{
gUnknown_020388CC->unk14 = r4;
- sub_80FBFB4(gUnknown_020388CC, gUnknown_020388CC->unk14, 16);
+ sub_80FBFB4(gUnknown_020388CC->filler0, gUnknown_020388CC->unk14, 16);
}
sub_80FBA18();
gUnknown_020388CC->unk18 = sub_80FAB78;
@@ -456,7 +479,7 @@ u8 sub_80FADE4(void)
if (r4 != gUnknown_020388CC->unk14)
{
gUnknown_020388CC->unk14 = r4;
- sub_80FBFB4(gUnknown_020388CC, gUnknown_020388CC->unk14, 16);
+ sub_80FBFB4(gUnknown_020388CC->filler0, gUnknown_020388CC->unk14, 16);
}
sub_80FBA18();
}
@@ -1018,11 +1041,11 @@ void sub_80FBB3C(u16 tileTag, u16 paletteTag)
spriteSheet.tag = tileTag;
spriteTemplate.tileTag = tileTag;
gUnknown_020388CC->unk58 = tileTag;
-
+
spritePalette.tag = paletteTag;
spriteTemplate.paletteTag = paletteTag;
gUnknown_020388CC->unk5A = paletteTag;
-
+
if (gUnknown_020388CC->unk78 == 0)
{
spriteSheet.data = gUnknown_020388CC->unk180;
@@ -1059,3 +1082,714 @@ void sub_80FBB3C(u16 tileTag, u16 paletteTag)
gUnknown_020388CC->unk1C->data3 = 1;
}
}
+
+void sub_80FBCA0(void)
+{
+ if (gUnknown_020388CC->unk1C != NULL)
+ {
+ DestroySprite(gUnknown_020388CC->unk1C);
+ FreeSpriteTilesByTag(gUnknown_020388CC->unk58);
+ FreeSpritePaletteByTag(gUnknown_020388CC->unk5A);
+ }
+}
+
+void unref_sub_80FBCD0(void)
+{
+ gUnknown_020388CC->unk1C->data3 = 1;
+}
+
+void unref_sub_80FBCE0(void)
+{
+ gUnknown_020388CC->unk1C->data3 = 0;
+}
+
+const struct OamData gOamData_083E7708 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 1,
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+const union AnimCmd gSpriteAnim_83E7710[] =
+{
+ ANIMCMD_FRAME(0, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd *const gSpriteAnimTable_083E7718[] =
+{
+ gSpriteAnim_83E7710,
+};
+
+void sub_80FBCF0(u16 tileTag, u16 paletteTag)
+{
+ u8 spriteId;
+ struct SpriteSheet spriteSheet =
+ {
+ .data = gRegionMapBrendanIconTiles,
+ .size = 128,
+ .tag = tileTag,
+ };
+ struct SpritePalette spritePalette =
+ {
+ .data = gRegionMapBrendanIconPalette,
+ .tag = paletteTag,
+ };
+ struct SpriteTemplate spriteTemplate =
+ {
+ .tileTag = tileTag,
+ .paletteTag = paletteTag,
+ .oam = &gOamData_083E7708,
+ .anims = gSpriteAnimTable_083E7718,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+ };
+
+ if (gSaveBlock2.playerGender == FEMALE)
+ {
+ spriteSheet.data = gRegionMapMayIconTiles;
+ spritePalette.data = gRegionMapMayIconPalette;
+ }
+ LoadSpriteSheet(&spriteSheet);
+ LoadSpritePalette(&spritePalette);
+ spriteId = CreateSprite(&spriteTemplate, 0, 0, 1);
+ gUnknown_020388CC->unk20 = &gSprites[spriteId];
+ if (gUnknown_020388CC->unk78 == 0)
+ {
+ gUnknown_020388CC->unk20->pos1.x = gUnknown_020388CC->unk74 * 8 + 4;
+ gUnknown_020388CC->unk20->pos1.y = gUnknown_020388CC->unk76 * 8 + 4;
+ gUnknown_020388CC->unk20->callback = sub_80FBF34;
+ }
+ else
+ {
+ gUnknown_020388CC->unk20->pos1.x = gUnknown_020388CC->unk74 * 16 - 48;
+ gUnknown_020388CC->unk20->pos1.y = gUnknown_020388CC->unk76 * 16 - 66;
+ gUnknown_020388CC->unk20->callback = sub_80FBEA4;
+ }
+}
+
+void sub_80FBDF8(void)
+{
+ if (gUnknown_020388CC->unk20 != NULL)
+ {
+ gUnknown_020388CC->unk20->invisible = TRUE;
+ gUnknown_020388CC->unk20->callback = SpriteCallbackDummy;
+ }
+}
+
+void sub_80FBE24(void)
+{
+ if (gUnknown_020388CC->unk20 != NULL)
+ {
+ if (gUnknown_020388CC->unk78 == 1)
+ {
+ gUnknown_020388CC->unk20->pos1.x = gUnknown_020388CC->unk74 * 16 - 48;
+ gUnknown_020388CC->unk20->pos1.y = gUnknown_020388CC->unk76 * 16 - 66;
+ gUnknown_020388CC->unk20->callback = sub_80FBEA4;
+ gUnknown_020388CC->unk20->invisible = FALSE;
+ }
+ else
+ {
+ gUnknown_020388CC->unk20->pos1.x = gUnknown_020388CC->unk74 * 8 + 4;
+ gUnknown_020388CC->unk20->pos1.y = gUnknown_020388CC->unk76 * 8 + 4;
+ gUnknown_020388CC->unk20->pos2.x = 0;
+ gUnknown_020388CC->unk20->pos2.y = 0;
+ gUnknown_020388CC->unk20->callback = sub_80FBF34;
+ gUnknown_020388CC->unk20->invisible = FALSE;
+ }
+ }
+}
+
+void sub_80FBEA4(struct Sprite *sprite)
+{
+ sprite->pos2.x = -(gUnknown_020388CC->unk5C * 2);
+ sprite->pos2.y = -(gUnknown_020388CC->unk5E * 2);
+ sprite->data0 = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY;
+ sprite->data1 = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX;
+
+ if (sprite->data0 < -8 || sprite->data0 > 0xA8 || sprite->data1 < -8 || sprite->data1 > 0xF8)
+ sprite->data2 = 0;
+ else
+ sprite->data2 = 1;
+
+ if (sprite->data2 == 1)
+ sub_80FBF40(sprite);
+ else
+ sprite->invisible = TRUE;
+}
+
+void sub_80FBF34(struct Sprite *sprite)
+{
+ sub_80FBF40(sprite);
+}
+
+void sub_80FBF40(struct Sprite *sprite)
+{
+ if (gUnknown_020388CC->unk7E != 0)
+ {
+ sprite->data7++;
+ if (sprite->data7 > 16)
+ {
+ sprite->data7 = 0;
+ sprite->invisible = !sprite->invisible;
+ }
+ }
+ else
+ {
+ sprite->invisible = FALSE;
+ }
+}
+
+void sub_80FBF94(void)
+{
+ if (gUnknown_020388CC->unk7F != 0)
+ gUnknown_020388CC->unk7E = 1;
+}
+
+const u8 *sub_80FBFB4(u8 *dest, u16 b, u16 length)
+{
+ if (b == 86)
+ return GetSecretBaseMapName(dest);
+ if (b < 88)
+ return StringCopy(dest, gRegionMapLocations[b].name);
+ if (length == 0)
+ length = 18;
+ return StringFill(dest, CHAR_SPACE, length);
+}
+
+const u8 *CopyMapName(u8 *dest, u16 b)
+{
+ switch (b)
+ {
+ case 87:
+ return StringCopy(dest, gOtherText_Ferry);
+ case 86:
+ return StringCopy(dest, gOtherText_SecretBase);
+ default:
+ return sub_80FBFB4(dest, b, 0);
+ }
+}
+
+const u8 *CopyLocationName(u8 *dest, u16 b)
+{
+ if (b == 66)
+ return StringCopy(dest, gOtherText_Hideout);
+ else
+ return CopyMapName(dest, b);
+}
+
+void sub_80FC04C(u16 a, u16 *x, u16 *y, u16 *width, u16 *height)
+{
+ *x = gRegionMapLocations[a].x;
+ *y = gRegionMapLocations[a].y;
+ *width = gRegionMapLocations[a].width;
+ *height = gRegionMapLocations[a].height;
+}
+
+struct UnknownStruct3
+{
+ void (*unk0)(void);
+ u16 unk4;
+ u16 unk6;
+ struct UnknownStruct1 unk8;
+};
+
+extern u8 ewram[];
+#define ewram0 (*(struct UnknownStruct3 *)(ewram + 0))
+#define ewram888 (ewram + 0x888)
+#define ewramA6E (ewram[0xA6E])
+#define ewramA48 (ewram + 0xA48)
+
+const u16 gUnknown_083E771C[] = INCBIN_U16("graphics/pokenav/map_frame.gbapal");
+const u8 gUnknown_083E773C[] = INCBIN_U8("graphics/pokenav/map_frame.4bpp.lz");
+const u8 gUnknown_083E7774[] = INCBIN_U8("graphics/pokenav/map_frame.bin.lz");
+const u16 gPokenavMapMisc_Pal[] = INCBIN_U16("graphics/pokenav/map_misc.gbapal");
+const u8 gUnknown_083E784C[] = INCBIN_U8("graphics/pokenav/map_misc.4bpp.lz");
+
+const u8 gUnknown_083E7920[][3] =
+{
+ {0, 9, 1},
+ {0, 10, 14},
+ {0, 11, 15},
+ {0, 12, 16},
+ {0, 13, 17},
+ {0, 14, 18},
+ {0, 15, 19},
+ {0, 0, 3},
+ {0, 1, 4},
+ {0, 2, 5},
+ {0, 3, 6},
+ {0, 4, 7},
+ {0, 5, 8},
+ {0, 6, 9},
+ {0, 7, 10},
+ {0, 8, 11},
+ {0, 16, 0},
+ {0, 17, 0},
+ {0, 18, 0},
+ {0, 19, 0},
+ {0, 20, 0},
+ {0, 21, 0},
+ {0, 22, 0},
+ {0, 23, 0},
+ {0, 24, 0},
+ {0, 25, 0},
+ {0, 26, 0},
+ {0, 27, 0},
+ {0, 28, 0},
+ {0, 29, 0},
+ {0, 30, 0},
+ {0, 31, 0},
+ {0, 32, 0},
+ {0, 33, 0},
+ {0, 34, 0},
+ {0, 35, 0},
+ {0, 36, 0},
+ {0, 37, 0},
+ {0, 38, 0},
+ {0, 39, 0},
+ {0, 40, 0},
+ {0, 41, 0},
+ {0, 42, 0},
+ {0, 43, 0},
+ {0, 44, 0},
+ {0, 45, 0},
+ {0, 46, 0},
+ {0, 47, 0},
+ {0, 48, 0},
+ {0, 49, 0},
+};
+
+struct UnknownStruct4
+{
+ const u8 *const *unk0;
+ u16 unk4;
+ u16 unk6;
+};
+
+const u8 *const Unknown_3E79B8[] = {OtherText_PokeLeague, OtherText_PokeCenter};
+
+const struct UnknownStruct4 gUnknown_083E79C0[1] =
+{
+ {Unknown_3E79B8, 15, 0x854},
+};
+
+// XXX: what is this?
+static u8 *const ewram_ = ewram;
+
+const struct SpritePalette gUnknown_083E79CC = {gPokenavMapMisc_Pal, 2};
+
+const u16 gUnknown_083E79D4[][2] =
+{
+ {0x848, 58},
+ {0xFFFF, 88},
+};
+
+const struct OamData gOamData_83E79DC =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 0,
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+const union AnimCmd gSpriteAnim_83E79E4[] =
+{
+ ANIMCMD_FRAME(0, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83E79EC[] =
+{
+ ANIMCMD_FRAME(1, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83E79F4[] =
+{
+ ANIMCMD_FRAME(3, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83E79FC[] =
+{
+ ANIMCMD_FRAME(5, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83E7A04[] =
+{
+ ANIMCMD_FRAME(6, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83E7A0C[] =
+{
+ ANIMCMD_FRAME(8, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83E7A14[] =
+{
+ ANIMCMD_FRAME(10, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd *const gSpriteAnimTable_83E7A1C[] =
+{
+ gSpriteAnim_83E79E4,
+ gSpriteAnim_83E79EC,
+ gSpriteAnim_83E79F4,
+ gSpriteAnim_83E79FC,
+ gSpriteAnim_83E7A04,
+ gSpriteAnim_83E7A0C,
+ gSpriteAnim_83E7A14,
+};
+
+const struct SpriteTemplate gSpriteTemplate_83E7A38 =
+{
+ .tileTag = 2,
+ .paletteTag = 2,
+ .oam = &gOamData_83E79DC,
+ .anims = gSpriteAnimTable_83E7A1C,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+void sub_80FC074(void)
+{
+ switch (gMain.state)
+ {
+ case 0:
+ SetVBlankCallback(NULL);
+ REG_DISPCNT = 0;
+ REG_BG0HOFS = 0;
+ REG_BG0VOFS = 0;
+ REG_BG1HOFS = 0;
+ REG_BG1VOFS = 0;
+ REG_BG2VOFS = 0;
+ REG_BG2HOFS = 0;
+ REG_BG3HOFS = 0;
+ REG_BG3VOFS = 0;
+ ResetPaletteFade();
+ ResetSpriteData();
+ FreeSpriteTileRanges();
+ FreeAllSpritePalettes();
+ break;
+ case 1:
+ SetUpWindowConfig(&gWindowConfig_81E7224);
+ break;
+ case 2:
+ InitMenuWindow(&gWindowConfig_81E7224);
+ MenuZeroFillScreen();
+ break;
+ case 3:
+ sub_80FA8EC(&ewram0.unk8, 0);
+ sub_80FBB3C(0, 0);
+ sub_80FBCF0(1, 1);
+ ewram0.unk6 = ewram0.unk8.unk14;
+ StringFill(ewramA48, CHAR_SPACE, 12);
+ sub_80FC254();
+ break;
+ case 4:
+ LZ77UnCompVram(gUnknown_083E773C, (void *)(VRAM + 0xC000));
+ break;
+ case 5:
+ LZ77UnCompVram(gUnknown_083E7774, (void *)(VRAM + 0xF000));
+ break;
+ case 6:
+ LoadPalette(gUnknown_083E771C, 16, 32);
+ MenuPrint_PixelCoords(gOtherText_FlyToWhere, 1, 0x90, 1);
+ break;
+ case 7:
+ sub_80FC31C();
+ break;
+ case 8:
+ BlendPalettes(0xFFFFFFFF, 16, 0);
+ SetVBlankCallback(sub_80FC214);
+ break;
+ case 9:
+ REG_BLDCNT = 0;
+ REG_BG1CNT = 0x1E0D;
+ REG_DISPCNT = 0x1741;
+ sub_80FC244(sub_80FC5B4);
+ SetMainCallback2(sub_80FC228);
+ break;
+ default:
+ return;
+ }
+ gMain.state++;
+}
+
+void sub_80FC214(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+void sub_80FC228(void)
+{
+ ewram0.unk0();
+ AnimateSprites();
+ BuildOamBuffer();
+}
+
+void sub_80FC244(void (*func)(void))
+{
+ ewram0.unk0 = func;
+ ewram0.unk4 = 0;
+}
+
+void sub_80FC254(void)
+{
+ if (ewram0.unk8.unk16 == 2 || ewram0.unk8.unk16 == 4)
+ {
+ u16 i = 0;
+ int zero;
+
+ for (i = 0; i < 1; i++)
+ {
+ const struct UnknownStruct4 *r4 = &gUnknown_083E79C0[i];
+
+ if (ewram0.unk8.unk14 == r4->unk4)
+ {
+ if (FlagGet(r4->unk6))
+ {
+ MenuDrawTextWindow(16, 14, 29, 19);
+ MenuPrint(ewram0.unk8.filler0, 17, 15);
+ MenuPrint_RightAligned(r4->unk0[ewram0.unk8.unk17], 29, 17);
+ return;
+ }
+ break;
+ }
+ }
+ // This check is always true, but somehow the compiler still performed it.
+ asm("mov %0, #0\n":"=r"(zero)); // zero = 0
+ if (zero == 0)
+ {
+ MenuDrawTextWindow(16, 16, 29, 19);
+ MenuPrint(ewram0.unk8.filler0, 17, 17);
+ MenuZeroFillWindowRect(16, 14, 29, 15);
+ }
+ }
+ else
+ {
+ MenuDrawTextWindow(16, 16, 29, 19);
+ MenuPrint(ewramA48, 17, 17);
+ MenuZeroFillWindowRect(16, 14, 29, 15);
+ }
+}
+
+void sub_80FC31C(void)
+{
+ struct SpriteSheet spriteSheet;
+
+ LZ77UnCompWram(gUnknown_083E784C, ewram888);
+ spriteSheet.data = ewram888;
+ spriteSheet.size = 0x1C0;
+ spriteSheet.tag = 2;
+ LoadSpriteSheet(&spriteSheet);
+ LoadSpritePalette(&gUnknown_083E79CC);
+ sub_80FC374();
+ sub_80FC484();
+}
+
+void sub_80FC374(void)
+{
+ u16 flag = 0x80F;
+ u16 i;
+
+ for (i = 0; i < 16; i++)
+ {
+ u16 x;
+ u16 y;
+ u16 width;
+ u16 height;
+ u16 r7;
+ u8 spriteId;
+
+ sub_80FC04C(i, &x, &y, &width, &height);
+ x = (x + 1) * 8 + 4;
+ y = (y + 2) * 8 + 4;
+ if (width == 2)
+ r7 = 1;
+ else if (height == 2)
+ r7 = 2;
+ else
+ r7 = 0;
+ spriteId = CreateSprite(&gSpriteTemplate_83E7A38, x, y, 10);
+ if (spriteId != 64)
+ {
+ gSprites[spriteId].oam.shape = r7;
+ if (FlagGet(flag))
+ gSprites[spriteId].callback = sub_80FC55C;
+ else
+ r7 += 3;
+ StartSpriteAnim(&gSprites[spriteId], r7);
+ gSprites[spriteId].data0 = i;
+ }
+ flag++;
+ }
+}
+
+void sub_80FC484(void)
+{
+ u16 i;
+
+ for (i = 0; gUnknown_083E79D4[i][1] != 88; i++)
+ {
+ u16 x;
+ u16 y;
+ u16 width;
+ u16 height;
+
+ if (FlagGet(gUnknown_083E79D4[i][0]))
+ {
+ u16 r6 = gUnknown_083E79D4[i][1];
+ u8 spriteId;
+
+ sub_80FC04C(r6, &x, &y, &width, &height);
+ x = (x + 1) * 8;
+ y = (y + 2) * 8;
+ spriteId = CreateSprite(&gSpriteTemplate_83E7A38, x, y, 10);
+ if (spriteId != 64)
+ {
+ gSprites[spriteId].oam.size = 1;
+ gSprites[spriteId].callback = sub_80FC55C;
+ StartSpriteAnim(&gSprites[spriteId], 6);
+ gSprites[spriteId].data0 = r6;
+ }
+ }
+ }
+}
+
+void sub_80FC55C(struct Sprite *sprite)
+{
+ if (ewram0.unk8.unk14 == sprite->data0)
+ {
+ sprite->data1++;
+ if (sprite->data1 > 16)
+ {
+ sprite->data1 = 0;
+ sprite->invisible = !sprite->invisible;
+ }
+ }
+ else
+ {
+ sprite->data1 = 16;
+ sprite->invisible = FALSE;
+ }
+}
+
+void sub_80FC5B4(void)
+{
+ switch (ewram0.unk4)
+ {
+ case 0:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0);
+ ewram0.unk4++;
+ break;
+ case 1:
+ if (UpdatePaletteFade() != 0)
+ break;
+ sub_80FC244(sub_80FC600);
+ break;
+ }
+}
+
+void sub_80FC600(void)
+{
+ if (ewram0.unk4 == 0)
+ {
+ switch (sub_80FAB60())
+ {
+ case 0:
+ case 1:
+ case 2:
+ break;
+ case 3:
+ sub_80FC254();
+ break;
+ case 4:
+ if (ewram0.unk8.unk16 == 2 || ewram0.unk8.unk16 == 4)
+ {
+ m4aSongNumStart(SE_SELECT);
+ ewramA6E = 1;
+ sub_80FC244(sub_80FC69C);
+ }
+ break;
+ case 5:
+ m4aSongNumStart(SE_SELECT);
+ ewramA6E = 0;
+ sub_80FC244(sub_80FC69C);
+ break;
+ }
+ }
+}
+
+void sub_80FC69C(void)
+{
+ switch (ewram0.unk4)
+ {
+ case 0:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
+ ewram0.unk4++;
+ break;
+ case 1:
+ if (UpdatePaletteFade() != 0)
+ break;
+ sub_80FAB10();
+ if (ewramA6E != 0)
+ {
+ switch (ewram0.unk8.unk14)
+ {
+ case 0x49:
+ sub_8053538(22);
+ break;
+ case 0x3A:
+ sub_8053538(21);
+ break;
+ case 0:
+ sub_8053538((gSaveBlock2.playerGender == MALE) ? 12 : 13);
+ break;
+ case 15:
+ sub_8053538((FlagGet(0x854) && ewram0.unk8.unk17 == 0) ? 20 : 11);
+ break;
+ default:
+ if (gUnknown_083E7920[ewram0.unk8.unk14][2] != 0)
+ sub_8053538(gUnknown_083E7920[ewram0.unk8.unk14][2]);
+ else
+ warp1_set_2(gUnknown_083E7920[ewram0.unk8.unk14][0], gUnknown_083E7920[ewram0.unk8.unk14][1], -1);
+ break;
+ }
+ sub_80865BC();
+ }
+ else
+ {
+ SetMainCallback2(sub_808AD58);
+ }
+ break;
+ }
+}