diff options
Diffstat (limited to 'src/pokenav_before.c')
-rw-r--r-- | src/pokenav_before.c | 4522 |
1 files changed, 4068 insertions, 454 deletions
diff --git a/src/pokenav_before.c b/src/pokenav_before.c index 21394f348..710756c11 100644 --- a/src/pokenav_before.c +++ b/src/pokenav_before.c @@ -5,6 +5,7 @@ #include "battle.h" #include "data2.h" #include "de_rom_8040FE0.h" +#include "decompress.h" #include "event_data.h" #include "constants/flags.h" #include "landmark.h" @@ -15,11 +16,16 @@ #include "region_map.h" #include "constants/songs.h" #include "string_util.h" +#include "strings.h" #include "sound.h" #include "task.h" #include "text.h" +#include "trig.h" #include "scanline_effect.h" #include "pokemon_storage_system.h" +#include "pokemon_summary_screen.h" +#include "use_pokeblock.h" +#include "constants/game_stat.h" struct UnknownPokenav0 { @@ -87,6 +93,11 @@ struct UnknownPokenav0_1 { s8 var6dae; }; +struct PokenavRibbonIconGfx { + u16 baseTile; + u8 paletteNum; +}; + IWRAM_DATA void (*gUnknown_03000744)(void); extern const u8 gUnknown_083E0314[]; @@ -129,6 +140,77 @@ extern const u8 gPokenavHoennMapMisc_Gfx[]; extern const u8 gUnknown_08E99FB0[]; extern const u8 gUnknown_08E9A100[]; extern const u16 gPokenavHoennMap1_Pal[]; +extern void (*const gUnknown_083E3270[])(u16, u16); +extern const u8 gUnknown_083E039C[]; +extern const u8 gUnknown_083E03A0[]; +extern const u8 gUnknown_083E01F4[]; +extern const u8 *const gTrainerEyeDescriptions[]; +extern const u8 gUnknown_08E9FBA0[]; +extern const u8 gPokenavRibbonView_Gfx[]; +extern const u8 gUnknown_083E040C[]; +extern const u16 gPokenavRibbonView_Pal[]; +extern const u16 gUnknown_083E03A8[]; +extern const u16 gUnknown_083E3C60[][16]; +extern const u16 gPokenavRibbonsIconGfx[][2]; +extern const u8 *const gRibbonDescriptions[][2]; +extern const u8 *const gGiftRibbonDescriptions[][2]; +extern const u8 gUnknown_08E9FF58[]; +extern const u8 gPokenavRibbonPokeView_Gfx[]; +extern const u16 gUnknown_083E0124[]; +extern const u16 gUnknown_083E0144[]; +extern const u8 gPokenavMenuOptions_Gfx[]; +extern const u8 gPokenavConditionMenu_Gfx[]; +extern const u8 gPokenavConditionSearch_Gfx[]; +extern const struct SpriteTemplate gSpriteTemplate_83E4454; +extern const union AffineAnimCmd *const gSpriteAffineAnimTable_83E4450[]; +extern const u16 gUnknown_083E42F8[]; +extern const u16 gPokenavMenuOptions1_Pal[]; +extern const u16 gPokenavMenuOptions2_Pal[]; +extern const u16 gPokenavConditionMenu_Pal[]; +extern const u16 gPokenavCondition6_Pal[]; +extern const u16 gPokenavCondition7_Pal[]; +extern const struct SpriteSheet gSpriteSheet_PokenavBlueLight; +extern const struct SpritePalette gSpritePalette_PokenavBlueLight; +extern const struct SpriteTemplate gSpriteTemplate_83E4484; +extern const u8 gPokenavMainMenu_Gfx[]; +extern const u8 gPokenavConditionMenuHeader_Gfx[]; +extern const u8 gPokenavRibbonsHeader_Gfx[]; +extern const u8 gPokenavHoennMapHeader_Gfx[]; +extern const u8 gPokenavConditionMenuOptions_Gfx[]; +extern const u8 gPokenavConditionMenuOptions2_Gfx[]; +extern const u8 gPokenavTrainersEyesHeader_Gfx[]; +extern const struct SpritePalette gUnknown_083E449C[]; +extern const struct SpriteTemplate gSpriteTemplate_83E4530; +extern const struct SpriteTemplate gSpriteTemplate_83E4548; +extern const struct SpriteTemplate gSpriteTemplate_83E44E0; +extern const struct SpriteTemplate gSpriteTemplate_83E44F8; +extern const struct SpriteSheet gUnknown_083E4568; +extern const struct SpriteTemplate gSpriteTemplate_83E4570; +extern const struct SpritePalette gUnknown_083E4588; +extern const struct SpriteSheet gUnknown_083E4590[3]; +extern const struct SpritePalette gUnknown_083E45A8; +extern const u16 gUnknown_08E9F988[]; +extern const struct SpriteTemplate gSpriteTemplate_83E45B8; +extern const struct SpriteTemplate gSpriteTemplate_83E45F0; +extern const struct SpriteSheet gUnknown_083E4628[4]; +extern const struct SpritePalette gUnknown_083E4648[3]; +extern const struct SpriteTemplate gSpriteTemplate_83E4660; +extern const u16 gUnknown_083E4678[]; +extern const u8 gUnknown_083E3D00[]; +extern const struct SpriteTemplate gSpriteTemplate_83E476C; +extern const struct SpriteSheet gUnknown_083E4784; +extern const struct SpritePalette gUnknown_083E478C; +extern const struct SpriteTemplate gSpriteTemplate_83E4800; +extern const s16 gUnknown_083E4794[][2]; +extern const u8 gUnknown_083E329C[]; +extern const struct SpritePalette gUnknown_083E4818; +extern const struct SpriteTemplate gSpriteTemplate_83E4850; +extern const struct SpritePalette gUnknown_083E4868; +extern const struct SpriteTemplate gSpriteTemplate_83E4878; + +extern u16 gUnknown_020388B4; +extern u8 gUnknown_020388B0[]; + // TODO: decompile the debug code so the compiler doesn't complain about // unused static functions @@ -171,20 +253,117 @@ static void sub_80EE58C(); static void sub_80EE658(); static void sub_80EE8F4(); static void sub_80EEDC4(); +static void ShowMapNamePopUpWindow(void); +static void sub_80F0954(u16, u16, u16); +static bool8 sub_80F098C(void); +static u8 *sub_80F445C(u8*, u16); +static void sub_80F081C(u8); +bool8 sub_80F0944(void); +static u8 *sub_80F4428(u8*, u16, u8); +void sub_80F700C(u8*, u16); +static void sub_80F0B24(void); +static bool8 sub_80F0B44(void); +static void sub_80F0C28(void); +static bool8 sub_80F0C48(void); +void LoadTrainerEyesDescriptionLines(void); +bool8 sub_80F0D5C(void); +static void sub_80F0EC0(void); +static bool8 sub_80F0EF4(void); +static void sub_80F0F64(void); +static void sub_80F0FA0(void); +static bool8 sub_80F0FEC(void); +static bool8 sub_80F0718(void); +void sub_80F0FFC(u8); +static void sub_80F19DC(u8*); +static bool8 sub_80F1080(void); +void sub_80F1614(void); +void DrawMonRibbonIcons(void); +void sub_80F13FC(void); +void sub_80F1438(void); +static void sub_80F1494(void); +bool8 sub_80F162C(u8); +static void sub_80F01E0(u16); +static void sub_80F19FC(void); +static void sub_80F1A74(void); +static void sub_80F1A80(void); +static void sub_80F1A90(void); +static bool8 sub_80F1AC4(void); +static void sub_80F1B8C(u8); +static bool8 sub_80F1BC8(u8); +static void sub_80F2458(u8); +static void sub_80F2514(u8); +static void sub_80F1DF0(void); +static void sub_80F2218(struct Sprite *sprite); +static bool8 sub_80F1E50(void); +static bool8 sub_80F22F8(void); +static void sub_80F2108(void); +static bool8 sub_80F1E6C(void); +static void sub_80F1E84(void); +static void sub_80F2148(void); +static void sub_80F2240(struct Sprite *sprite); +static bool8 sub_80F1F10(void); +static bool8 sub_80F2360(void); +static void sub_80F2170(void); +static bool8 sub_80F23C8(void); +static void sub_80F21F8(void); +static void sub_80F1FF0(void); +static void sub_80F208C(void); +static void sub_80F22B0(struct Sprite *sprite); +static void sub_80F240C(struct Sprite *sprite); +static void sub_80F2598(void); +static void sub_80F2620(void); +static bool8 sub_80F26BC(void); +static void sub_80F2C58(struct Sprite *sprite); +static void sub_80F2D04(u8); +static void sub_80F2D6C(u8); +static void sub_80F2DD8(void); +static void sub_80F2DF4(void); +static void sub_80F2FEC(struct Sprite *sprite); +static void sub_80F2FB0(void); +static void sub_80F3008(u8); +static void sub_80F3130(void); +static void sub_80F3264(void); +static void sub_80F3294(u8); +static void sub_80F35B4(void); +static void sub_80F363C(struct Sprite *sprite); +static void SetMonMarkings(u16, u16, u8); +static void sub_80F36F0(void); +static bool8 sub_80F3724(void); +static void sub_80F379C(void); +static bool8 sub_80F37D0(void); +static void sub_80F38B8(void); +static bool8 sub_80F38EC(void); +static void sub_80F3970(void); +static bool8 sub_80F39A4(void); +static void sub_80F3B00(void); +static bool8 sub_80F3B58(void); +static void sub_80F3B94(void); +static bool8 sub_80F3BD4(void); +static void sub_80F3C2C(void); +static void sub_80F3F20(u8, u8); +static void sub_80F3FAC(void); +static void sub_80F3FF0(void); +static bool8 sub_80F4024(void); +static void sub_80F42C4(u8*); +static void sub_80F4394(void); +u8 *sub_80F6514(u8*, u16, u8); +static u8 *sub_80F443C(u8 *, u16); +void sub_80F55AC(u8*, struct UnkPokenav11 *); +static void sub_80F4CF0(void); +static void sub_80F4D44(void); +static bool8 sub_80F4D88(void); +static void sub_80F53EC(struct UnkPokenav11*, struct UnkPokenav11*); +static bool8 sub_80F5504(void); +static bool8 sub_80F5264(void); +static bool8 sub_80F52F8(void); +static bool8 sub_80F5364(void); -extern bool8 sub_80F0944(void); -extern void sub_80F081C(); extern void sub_80F0900(void); -extern void sub_80F443C(u8 *, u16); -extern bool8 sub_80F162C(u8); -extern void sub_80F01E0(u16); extern void sub_80F01A4(void); -extern void sub_80F1614(void); extern void sub_80EFD3C(void); extern void sub_8095C8C(); extern void sub_80EFDA0(void); extern void sub_80EFD74(void); -extern void sub_80F1A80(void); extern bool8 sub_80EFC64(void); extern void sub_80EFC3C(void); extern void sub_80EF624(const u16 *, const u16 *, u8, u8, u16 *); @@ -192,109 +371,50 @@ extern void sub_80EF7D4(void); extern void sub_80EF54C(u8); extern void sub_80EF58C(u8); extern void sub_80F6FFC(); -extern void sub_80F3294(); -extern void sub_80F0B24(); -extern bool8 sub_80F0B44(); -extern void sub_80F0F64(); -extern bool8 sub_80F0FEC(); extern void sub_80F6FB8(); extern void sub_80F6DB8(); -extern void sub_80F0CD8(); extern bool8 sub_80F6E9C(); -extern bool8 sub_80F0D5C(); extern bool8 sub_80F6ED4(); -extern bool8 sub_80F0EF4(); -extern void sub_80F2FB0(); -extern void sub_80F0FA0(); -extern void sub_80F0C28(); -extern bool8 sub_80F0C48(); extern bool8 sub_80F70FC(); extern void sub_80F708C(u32); -extern void sub_80F4394(); -extern void sub_80F0EC0(); -extern void sub_80F700C(); -extern void sub_80F42C4(); -extern void sub_80F0FFC(); extern void sub_80F6F10(); -extern void sub_80F3C2C(); -extern void sub_80F15A8(); +static extern void sub_80F15A8(void); extern void sub_80F6A4C(); extern bool8 sub_80F6AF0(); -extern void sub_80F3B00(); -extern bool8 sub_80F3B58(); -extern void sub_80F1494(); extern u8 sub_80F68E8(); -extern void sub_80F3B94(); -extern bool8 sub_80F3BD4(); extern void sub_80F66E0(); -extern bool8 sub_80F1080(); -extern void sub_80F38B8(); -extern bool8 sub_80F38EC(); extern void sub_80F638C(); extern bool8 sub_80F63D0(); -extern void sub_80F4CF0(); extern void sub_80EFF34(); extern bool8 sub_80EFF68(); -extern void sub_80F35B4(); extern void sub_80F6134(); extern u8 sub_80F5DD4(); -extern void ShowMapNamePopUpWindow(); -extern bool8 sub_80F0718(); -extern bool8 sub_80F3264(); -extern void sub_80F4D44(); -extern bool8 sub_80F4D88(); extern void sub_80F0264(u8); extern bool8 sub_80F02A0(); -extern void sub_80F3008(); -extern void sub_80F3130(); -extern void sub_80F2D6C(u32); -extern bool8 sub_80F1E6C(); extern void sub_80EF9F8(void); extern bool8 sub_80EFBDC(bool8); extern void sub_80EFBB0(void); -extern void sub_80F2DF4(); -extern void sub_80F1E84(); -extern bool8 sub_80F1F10(); extern void sub_80EEFBC(u8); -extern void sub_80F2620(); extern void sub_80EF814(void); extern void sub_80EF840(void); extern bool8 sub_80EF874(void); -extern void sub_80F2DD8(); extern bool8 sub_80F6250(); extern void sub_80F6208(); -extern void sub_80F208C(); extern void sub_80F6C20(); -extern void sub_80F3FF0(); -extern bool8 sub_80F4024(); -extern void sub_80F2598(); extern void sub_80EF248(u8); extern bool8 sub_80EF284(u8); -extern void sub_80F1B8C(); -extern bool8 sub_80F1BC8(u32 unk); -extern void sub_80F1DF0(); -extern bool8 sub_80F1E50(); extern void sub_80EF428(u8, u8); extern bool8 sub_80EEF78(); -extern void sub_80F1A90(); -extern void sub_80F2D04(u32); -extern bool8 sub_80F1AC4(); -extern void sub_80F36F0(); -extern bool8 sub_80F3724(); extern void sub_80EBC10(); extern void sub_80EBDBC(void (*func)(void)); extern void sub_80EBBE8(); -extern bool8 sub_80F26BC(void); extern void sub_80EBDD8(); extern void sub_80EBD90(); extern void sub_80EBD18(); -extern void sub_80F1A74(); -extern void sub_80F1FF0(); extern void sub_80FB260(); extern void sub_80EFE7C(void); extern void sub_80F5BF0(); extern void sub_80F6F64(); -extern void sub_80F19FC(); extern u16 gKeyRepeatStartDelay; @@ -1194,11 +1314,11 @@ void sub_80ECD80() ewram0_10.var304++; break; case 9: - sub_80F1B8C(0x2); + sub_80F1B8C(2); ewram0_10.var304++; // fall through case 10: - if (!sub_80F1BC8(0x2)) + if (!sub_80F1BC8(2)) ewram0_10.var304++; break; case 11: @@ -3131,7 +3251,7 @@ void sub_80EE658() ewram0_10.var304++; break; case 6: - sub_80F0CD8(); + LoadTrainerEyesDescriptionLines(); ewram0_10.var304++; case 7: if (!sub_80F6E9C() && !sub_80F0D5C()) @@ -3662,7 +3782,7 @@ bool8 sub_80EEE54(void) sub_80EF58C(2); break; case 4: - gUnknown_083DFEC4->unk030C.unk030C.unk0 = 0; + gUnknown_083DFEC4->unk030C = 0; REG_BG1HOFS = 0; REG_BG1VOFS = 0; REG_BG1CNT = 0x1B0C; @@ -3678,17 +3798,17 @@ bool8 sub_80EEF34(void) { bool8 retVal = TRUE; - if (gUnknown_083DFEC4->unk030C.unk030C.unk0 == 32) + if (gUnknown_083DFEC4->unk030C == 32) return FALSE; - gUnknown_083DFEC4->unk030C.unk030C.unk0 += 2; - if (gUnknown_083DFEC4->unk030C.unk030C.unk0 > 31) + gUnknown_083DFEC4->unk030C += 2; + if (gUnknown_083DFEC4->unk030C > 31) { - gUnknown_083DFEC4->unk030C.unk030C.unk0 = 32; + gUnknown_083DFEC4->unk030C = 32; retVal = FALSE; } - REG_BG1VOFS = gUnknown_083DFEC4->unk030C.unk030C.unk0; + REG_BG1VOFS = gUnknown_083DFEC4->unk030C; return retVal; } @@ -3696,17 +3816,17 @@ bool8 sub_80EEF78(void) { bool8 retVal = TRUE; - if (gUnknown_083DFEC4->unk030C.unk030C.unk0 == 0) + if (gUnknown_083DFEC4->unk030C == 0) return FALSE; - gUnknown_083DFEC4->unk030C.unk030C.unk0 -= 2; - if (gUnknown_083DFEC4->unk030C.unk030C.unk0 <= 0) + gUnknown_083DFEC4->unk030C -= 2; + if (gUnknown_083DFEC4->unk030C <= 0) { - gUnknown_083DFEC4->unk030C.unk030C.unk0 = 0; + gUnknown_083DFEC4->unk030C = 0; retVal = FALSE; } - REG_BG1VOFS = gUnknown_083DFEC4->unk030C.unk030C.unk0; + REG_BG1VOFS = gUnknown_083DFEC4->unk030C; return retVal; } @@ -4484,7 +4604,7 @@ bool8 sub_80EFF68(void) { case 0: sub_80EEDE8(); - gUnknown_083DFEC4->unkD162[0] = 11; + gUnknown_083DFEC4->unkD162 = 11; break; case 1: Text_LoadWindowTemplate(&gWindowTemplate_81E7080); @@ -4529,7 +4649,7 @@ bool8 sub_80EFF68(void) sub_80F01A4(); break; case 12: - sub_80F01E0((u16)gUnknown_083DFEC4->unk8fe9); + sub_80F01E0(gUnknown_083DFEC4->unk8fe9); break; case 13: REG_BG3CNT = 0x1E03; @@ -4563,7 +4683,7 @@ void sub_80F01A4(void) REG_WINOUT = 0x001B; } -void sub_80F01E0(u16 a) +static void sub_80F01E0(u16 a) { Menu_PrintText(gUnknown_083DFEC4->unk8829[a], 13, 1); @@ -4587,7 +4707,6 @@ void sub_80F0264(u8 a) } } -#ifdef NONMATCHING // small nonmatching part is in the third else clause in case 7. bool8 sub_80F02A0(void) { const u16 *pointer; @@ -4598,7 +4717,7 @@ bool8 sub_80F02A0(void) sub_80EEDE8(); gUnknown_083DFEC4->unk87C8 = gUnknown_083DFEC4->unk87CA == 1; - gUnknown_083DFEC4->unkD162[0] = 11; + gUnknown_083DFEC4->unkD162 = 11; break; case 1: Text_LoadWindowTemplate(&gWindowTemplate_81E70D4); @@ -4647,8 +4766,7 @@ bool8 sub_80F02A0(void) else { LoadPalette(gUnknown_08E9F9E8, 0x30, 0x20); - pointer = &gUnknown_08E9F9E8[5]; - gPlttBufferUnfaded[0] = gUnknown_08E9F9E8[5]; + gPlttBufferUnfaded[0] = *(pointer = &gUnknown_08E9F9E8[5]); LoadPalette(gUnknown_083E0314, 0x50, 0x20); LoadPalette(&gUnknown_083E02B4[1], 0xB1, 0x2); LoadPalette(&gUnknown_083E02B4[8], 0xB5, 0x2); @@ -4690,7 +4808,7 @@ bool8 sub_80F02A0(void) else { sub_80F081C(0); - sub_80F0FFC(gUnknown_083DFEC4->unk876E); + sub_80F0FFC((u8)gUnknown_083DFEC4->unk876E); } break; case 14: @@ -4712,414 +4830,3910 @@ bool8 sub_80F02A0(void) gUnknown_083DFEC4->unk306++; return TRUE; } + +void sub_80F063C(s16 arg0) +{ + s16 var0; + s16 var1; + s16 var2; + + gUnknown_083DFEC4->unk877C = arg0 * 16; + gUnknown_083DFEC4->unk877A = (arg0 == 1 || arg0 == -1) ? 4 : 8; + if (arg0 < 0) + { + gUnknown_083DFEC4->unk877A *= -1; + var0 = arg0 * 2 + gUnknown_083DFEC4->unk8778; + var1 = arg0 + gUnknown_083DFEC4->unk8770; + if (var1 < 0) + var1 += gUnknown_083DFEC4->unk8774 + 1; + + arg0 *= -1; + } + else + { + var0 = gUnknown_083DFEC4->unk8778 + 16; + var1 = gUnknown_083DFEC4->unk8772 + 1; + } + + if (var1 > gUnknown_083DFEC4->unk8774) + var1 = 0; + + var2 = var0 & 0x1F; + sub_80F0954(var1, var2, arg0); +} + +static bool8 sub_80F0718(void) +{ + if (!sub_80F098C()) + { + if (gUnknown_083DFEC4->unk877C == 0) + return FALSE; + + gUnknown_083DFEC4->unk877C -= gUnknown_083DFEC4->unk877A; + gUnknown_083DFEC4->unk8776 += gUnknown_083DFEC4->unk877A; + gUnknown_083DFEC4->unk8776 &= 0xFF; + REG_BG3VOFS = gUnknown_083DFEC4->unk8776; + if (gUnknown_083DFEC4->unk877C == 0) + { + gUnknown_083DFEC4->unk8778 = ((8 + gUnknown_083DFEC4->unk8776) & 0xFF) / 8; + return FALSE; + } + } + + return TRUE; +} + +static void ShowMapNamePopUpWindow(void) +{ + switch (gUnknown_083DFEC4->unk87CA) + { + case 0: + sub_80F443C(gUnknown_083DFEC4->unk8788, gUnknown_083DFEC4->unk893c[gUnknown_083DFEC4->unk876E].unk2); + break; + case 1: + sub_80F445C(gUnknown_083DFEC4->unk8788, gUnknown_083DFEC4->unk876E + 1); + break; + default: + return; + } + + BasicInitMenuWindow(&gWindowTemplate_81E710C); + Menu_PrintText(gUnknown_083DFEC4->unk8788, 1, 6); +} + +void sub_80F081C(u8 arg0) +{ + u32 numTrainerBattles; + + BasicInitMenuWindow(&gWindowTemplate_81E710C); + switch (arg0) + { + case 0: + case 1: + MenuPrint_RightAligned(gOtherText_NumberRegistered, 10, 9); + if (arg0 != 0) + break; + // fall through + case 2: + ConvertIntToDecimalStringN( + gUnknown_083DFEC4->unk8788, + gUnknown_083DFEC4->unk8774 + 1, + STR_CONV_MODE_RIGHT_ALIGN, + 5); + MenuPrint_RightAligned(gUnknown_083DFEC4->unk8788, 10, 11); + if (arg0 != 0) + break; + // fall through + case 3: + MenuPrint_RightAligned(gOtherText_NumberBattles, 10, 13); + if (arg0 != 0) + break; + // fall through + case 4: + numTrainerBattles = GetGameStat(GAME_STAT_TRAINER_BATTLES); + if (numTrainerBattles > 99999) + numTrainerBattles = 99999; + + ConvertIntToDecimalStringN( + gUnknown_083DFEC4->unk8788, + numTrainerBattles, + STR_CONV_MODE_RIGHT_ALIGN, + 5); + MenuPrint_RightAligned(gUnknown_083DFEC4->unk8788, 10, 15); + break; + } +} + +static void sub_80F08E4(void) +{ + BasicInitMenuWindow(&gWindowTemplate_81E710C); + Menu_EraseWindowRect(0, 9, 11, 16); +} + +void sub_80F0900(void) +{ + s16 var0 = (gUnknown_083DFEC4->unk8772 - gUnknown_083DFEC4->unk8770) + 1; + if (var0 < 8) + Menu_EraseWindowRect(12, 1, 31, 15); + + sub_80F0954(gUnknown_083DFEC4->unk8770, 0, var0); +} + +bool8 sub_80F0944(void) +{ + return sub_80F098C(); +} + +static void sub_80F0954(u16 arg0, u16 arg1, u16 arg2) +{ + gUnknown_083DFEC4->unk877E = arg0; + gUnknown_083DFEC4->unk8780 = arg1; + gUnknown_083DFEC4->unk8784 = arg2; + gUnknown_083DFEC4->unk8786 = 0; +} + +#ifdef NONMATCHING +static bool8 sub_80F098C(void) +{ + register u16 zero asm("r8"); + if (!gUnknown_083DFEC4->unk8784) + { + DONE: + return FALSE; + } + + zero = 0; + gUnknown_083E3270[gUnknown_083DFEC4->unk87CA](gUnknown_083DFEC4->unk877E, gUnknown_083DFEC4->unk8780); + if (!--gUnknown_083DFEC4->unk8784) + goto DONE; + + if ((++gUnknown_083DFEC4->unk877E & 0xFFFF) > gUnknown_083DFEC4->unk8774) + gUnknown_083DFEC4->unk877E = zero; + + gUnknown_083DFEC4->unk8780 += 2; + gUnknown_083DFEC4->unk8780 &= 0x1F; + return TRUE; +} #else NAKED -bool8 sub_80F02A0(void) +static bool8 sub_80F098C(void) { asm(".syntax unified\n\ - push {r4-r6,lr}\n\ - mov r6, r8\n\ - push {r6}\n\ - sub sp, 0x18\n\ - ldr r1, _080F02C4 @ =gUnknown_083DFEC4\n\ - ldr r0, [r1]\n\ - ldr r2, _080F02C8 @ =0x00000306\n\ - adds r0, r2\n\ - ldrh r0, [r0]\n\ - adds r2, r1, 0\n\ - cmp r0, 0xE\n\ - bls _080F02BA\n\ - b _080F05FA\n\ -_080F02BA:\n\ - lsls r0, 2\n\ - ldr r1, _080F02CC @ =_080F02D0\n\ + push {r4-r7,lr}\n\ + mov r7, r8\n\ + push {r7}\n\ + ldr r0, _080F09A4 @ =gUnknown_083DFEC4\n\ + ldr r6, [r0]\n\ + ldr r0, _080F09A8 @ =0x00008784\n\ + adds r7, r6, r0\n\ + ldrh r0, [r7]\n\ + cmp r0, 0\n\ + bne _080F09AC\n\ +_080F09A0:\n\ + movs r0, 0\n\ + b _080F0A02\n\ + .align 2, 0\n\ +_080F09A4: .4byte gUnknown_083DFEC4\n\ +_080F09A8: .4byte 0x00008784\n\ +_080F09AC:\n\ + movs r1, 0\n\ + mov r8, r1\n\ + ldr r1, _080F0A0C @ =gUnknown_083E3270\n\ + ldr r2, _080F0A10 @ =0x000087ca\n\ + adds r0, r6, r2\n\ + ldrb r2, [r0]\n\ + lsls r2, 2\n\ + adds r2, r1\n\ + ldr r0, _080F0A14 @ =0x0000877e\n\ + adds r4, r6, r0\n\ + ldrh r0, [r4]\n\ + ldr r1, _080F0A18 @ =0x00008780\n\ + adds r5, r6, r1\n\ + ldrh r1, [r5]\n\ + ldr r2, [r2]\n\ + bl _call_via_r2\n\ + ldrh r0, [r7]\n\ + subs r0, 0x1\n\ + strh r0, [r7]\n\ + ldr r2, _080F0A1C @ =0x0000ffff\n\ + adds r1, r2, 0\n\ + lsls r0, 16\n\ + cmp r0, 0\n\ + beq _080F09A0\n\ + ldrh r0, [r4]\n\ + adds r0, 0x1\n\ + strh r0, [r4]\n\ + ands r0, r1\n\ + ldr r2, _080F0A20 @ =0x00008774\n\ + adds r1, r6, r2\n\ + movs r2, 0\n\ + ldrsh r1, [r1, r2]\n\ + cmp r0, r1\n\ + ble _080F09F6\n\ + mov r0, r8\n\ + strh r0, [r4]\n\ +_080F09F6:\n\ + ldrh r0, [r5]\n\ + adds r0, 0x2\n\ + movs r1, 0x1F\n\ + ands r0, r1\n\ + strh r0, [r5]\n\ + movs r0, 0x1\n\ +_080F0A02:\n\ + pop {r3}\n\ + mov r8, r3\n\ + pop {r4-r7}\n\ + pop {r1}\n\ + bx r1\n\ + .align 2, 0\n\ +_080F0A0C: .4byte gUnknown_083E3270\n\ +_080F0A10: .4byte 0x000087ca\n\ +_080F0A14: .4byte 0x0000877e\n\ +_080F0A18: .4byte 0x00008780\n\ +_080F0A1C: .4byte 0x0000ffff\n\ +_080F0A20: .4byte 0x00008774\n\ + .syntax divided\n"); +} +#endif // NONMATCHING + +void sub_80F0A24(u16 arg0, u16 arg1) +{ + u8 var0 = gUnknown_083DFEC4->unk87C8 == 0 ? 2 : 1; + sub_80F4428(gUnknown_083DFEC4->unk8788, arg0, var0); + BasicInitMenuWindow(&gWindowTemplate_81E70D4); + Menu_PrintText(gUnknown_083DFEC4->unk8788, 13, arg1); +} + +static void sub_80F0A74(u16 arg0, u16 arg1) +{ + sub_80F700C(gUnknown_083DFEC4->unk8788, arg0); + arg1 &= 0x1F; + BasicInitMenuWindow(&gWindowTemplate_81E70D4); + Menu_PrintTextPixelCoords(gUnknown_083DFEC4->unk8788, 97, arg1 * 8, 0); + if (arg0 < gUnknown_083DFEC4->unkD158 && gUnknown_083DFEC4->unkCEE8[arg0].unk5) + sub_8095C8C((void *)VRAM + 0xF000, 29, arg1, gUnknown_083E039C, 0, 0, 1, 2, 1); + else + sub_8095C8C((void *)VRAM + 0xF000, 29, arg1, gUnknown_083E03A0, 0, 0, 1, 2, 1); +} + +static void sub_80F0B24(void) +{ + gUnknown_083DFEC4->unkD15C = 0; + gUnknown_083DFEC4->unk306 = 0; +} + +static bool8 sub_80F0B44(void) +{ + int top; + if (gUnknown_083DFEC4->unkD15C > 8) + { + return FALSE; + } + + if (++gUnknown_083DFEC4->unk306 > 1) + { + gUnknown_083DFEC4->unk306 = 0; + if (gUnknown_083DFEC4->unkD15C < 8) + { + top = (gUnknown_083DFEC4->unk8778 + (gUnknown_083DFEC4->unkD15C * 2)) & 0x1F; + if (gUnknown_083DFEC4->unkD15C != gUnknown_083DFEC4->unk876C) + { + BasicInitMenuWindow(&gWindowTemplate_81E70D4); + Menu_EraseWindowRect(12, top, 31, top + 1); + } + + if (!gUnknown_083DFEC4->unkD15C) + sub_80F08E4(); + + gUnknown_083DFEC4->unkD15C++; + return TRUE; + } + else + { + u16 i; + BasicInitMenuWindow(&gWindowTemplate_81E70D4); + top = (gUnknown_083DFEC4->unk8778 + 16) & 0x1F; + for (i = 0; i < 8; i++) + { + Menu_EraseWindowRect(12, top, 31, top + 1); + top = (top + 2) & 0x1F; + } + + gUnknown_083DFEC4->unkD15C++; + return FALSE; + } + } + else + { + return TRUE; + } +} + +static void sub_80F0C28(void) +{ + gUnknown_083DFEC4->unkD15C = 0; + gUnknown_083DFEC4->unk306 = 0; +} + +static bool8 sub_80F0C48(void) +{ + if (gUnknown_083DFEC4->unkD15C > 7) + return FALSE; + + if (++gUnknown_083DFEC4->unk306 > 1) + { + gUnknown_083DFEC4->unk306 = 0; + BasicInitMenuWindow(&gWindowTemplate_81E70D4); + sub_80F0A74(gUnknown_083DFEC4->unk8770 + gUnknown_083DFEC4->unkD15C, + gUnknown_083DFEC4->unk8778 + gUnknown_083DFEC4->unkD15C * 2); + + if ((++gUnknown_083DFEC4->unkD15C) > 7) + { + sub_80F081C(0); + return FALSE; + } + } + + return TRUE; +} + +void LoadTrainerEyesDescriptionLines(void) +{ + u16 i; + int trainerEyesId; + const u8 *curChar; + + gUnknown_083DFEC4->unk306 = 0; + gUnknown_083DFEC4->unkD15C = 0; + trainerEyesId = gUnknown_083DFEC4->unkCEE8[gUnknown_083DFEC4->unk876E].unk4; + gUnknown_083DFEC4->trainerEyeDescriptionLines[0] = gTrainerEyeDescriptions[trainerEyesId]; + + // Find the start of the 3 other lines in the Trainer's Eyes description. + curChar = gUnknown_083DFEC4->trainerEyeDescriptionLines[0]; + for (i = 0; i < 3; i++) + { + while (*curChar != EOS) + curChar++; + gUnknown_083DFEC4->trainerEyeDescriptionLines[i + 1] = ++curChar; + } +} + +#ifdef NONMATCHING +// small register mismatch (r2/r3) on the line where var0 is set. +bool8 sub_80F0D5C(void) +{ + int var0; + if (gUnknown_083DFEC4->unkD15C == 7) + return FALSE; + + if (++gUnknown_083DFEC4->unk306 > 1) + { + gUnknown_083DFEC4->unk306 = 0; + BasicInitMenuWindow(&gWindowTemplate_81E70D4); + var0 = (gUnknown_083DFEC4->unk8778 + 2 + gUnknown_083DFEC4->unkD15C * 2) & 0x1F; + switch (gUnknown_083DFEC4->unkD15C) + { + case 0: + Menu_PrintTextPixelCoords(gOtherText_Strategy, 97, var0 * 8, 0); + break; + case 1: + AlignStringInMenuWindow( + gUnknown_083DFEC4->unk8788, + gUnknown_083DFEC4->trainerEyeDescriptionLines[0], + 136, + 0); + Menu_PrintTextPixelCoords(gUnknown_083DFEC4->unk8788, 97, var0 * 8, 0); + break; + case 2: + Menu_PrintTextPixelCoords(gOtherText_TrainersPokemon, 97, var0 * 8, 0); + break; + case 3: + AlignStringInMenuWindow( + gUnknown_083DFEC4->unk8788, + gUnknown_083DFEC4->trainerEyeDescriptionLines[1], + 136, + 0); + Menu_PrintTextPixelCoords(gUnknown_083DFEC4->unk8788, 97, var0 * 8, 0); + break; + case 4: + Menu_PrintTextPixelCoords(gOtherText_SelfIntroduction, 97, var0 * 8, 0); + break; + case 5: + AlignStringInMenuWindow( + gUnknown_083DFEC4->unk8788, + gUnknown_083DFEC4->trainerEyeDescriptionLines[2], + 136, + 0); + Menu_PrintTextPixelCoords(gUnknown_083DFEC4->unk8788, 97, var0 * 8, 0); + break; + case 6: + AlignStringInMenuWindow( + gUnknown_083DFEC4->unk8788, + gUnknown_083DFEC4->trainerEyeDescriptionLines[3], + 136, + 0); + Menu_PrintTextPixelCoords(gUnknown_083DFEC4->unk8788, 97, var0 * 8, 0); + default: + return FALSE; + } + + gUnknown_083DFEC4->unkD15C++; + return TRUE; + } + else + { + return TRUE; + } +} +#else +NAKED +bool8 sub_80F0D5C(void) +{ + asm(".syntax unified\n\ + push {r4,r5,lr}\n\ + ldr r0, _080F0D70 @ =gUnknown_083DFEC4\n\ + ldr r4, [r0]\n\ + ldr r0, _080F0D74 @ =0x0000d15c\n\ + adds r5, r4, r0\n\ + ldrh r0, [r5]\n\ + cmp r0, 0x7\n\ + bne _080F0D78\n\ +_080F0D6C:\n\ + movs r0, 0\n\ + b _080F0EB0\n\ + .align 2, 0\n\ +_080F0D70: .4byte gUnknown_083DFEC4\n\ +_080F0D74: .4byte 0x0000d15c\n\ +_080F0D78:\n\ + ldr r0, _080F0DB8 @ =0x00000306\n\ + adds r1, r4, r0\n\ + ldrh r0, [r1]\n\ + adds r0, 0x1\n\ + strh r0, [r1]\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + cmp r0, 0x1\n\ + bhi _080F0D8C\n\ + b _080F0EAE\n\ +_080F0D8C:\n\ + movs r0, 0\n\ + strh r0, [r1]\n\ + ldr r0, _080F0DBC @ =gWindowTemplate_81E70D4\n\ + bl BasicInitMenuWindow\n\ + ldr r0, _080F0DC0 @ =0x00008778\n\ + adds r1, r4, r0\n\ + ldrh r3, [r5]\n\ + lsls r0, r3, 1\n\ + adds r0, 0x2\n\ + ldrh r1, [r1]\n\ + adds r5, r0, r1\n\ + movs r0, 0x1F\n\ + ands r5, r0\n\ + cmp r3, 0x6\n\ + bhi _080F0D6C\n\ + lsls r0, r3, 2\n\ + ldr r1, _080F0DC4 @ =_080F0DC8\n\ adds r0, r1\n\ ldr r0, [r0]\n\ mov pc, r0\n\ .align 2, 0\n\ -_080F02C4: .4byte gUnknown_083DFEC4\n\ -_080F02C8: .4byte 0x00000306\n\ -_080F02CC: .4byte _080F02D0\n\ +_080F0DB8: .4byte 0x00000306\n\ +_080F0DBC: .4byte gWindowTemplate_81E70D4\n\ +_080F0DC0: .4byte 0x00008778\n\ +_080F0DC4: .4byte _080F0DC8\n\ .align 2, 0\n\ -_080F02D0:\n\ - .4byte _080F030C\n\ - .4byte _080F0344\n\ - .4byte _080F0350\n\ - .4byte _080F035C\n\ - .4byte _080F0368\n\ - .4byte _080F036E\n\ - .4byte _080F0380\n\ - .4byte _080F0394\n\ - .4byte _080F04BC\n\ - .4byte _080F053C\n\ - .4byte _080F0550\n\ - .4byte _080F0574\n\ - .4byte _080F057A\n\ - .4byte _080F0586\n\ - .4byte _080F05BC\n\ -_080F030C:\n\ - bl sub_80EEDE8\n\ - ldr r0, _080F0334 @ =gUnknown_083DFEC4\n\ - ldr r1, [r0]\n\ - movs r2, 0\n\ - ldr r3, _080F0338 @ =0x000087ca\n\ - adds r0, r1, r3\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x1\n\ - bne _080F0322\n\ - movs r2, 0x1\n\ -_080F0322:\n\ - ldr r3, _080F033C @ =0x000087c8\n\ - adds r0, r1, r3\n\ - strb r2, [r0]\n\ - ldr r0, _080F0340 @ =0x0000d162\n\ - adds r1, r0\n\ - movs r0, 0xB\n\ - strb r0, [r1]\n\ - b _080F0618\n\ +_080F0DC8:\n\ + .4byte _080F0DE4\n\ + .4byte _080F0DF0\n\ + .4byte _080F0E08\n\ + .4byte _080F0E14\n\ + .4byte _080F0E2C\n\ + .4byte _080F0E38\n\ + .4byte _080F0E6C\n\ +_080F0DE4:\n\ + ldr r0, _080F0DEC @ =gOtherText_Strategy\n\ + lsls r2, r5, 3\n\ + b _080F0E54\n\ .align 2, 0\n\ -_080F0334: .4byte gUnknown_083DFEC4\n\ -_080F0338: .4byte 0x000087ca\n\ -_080F033C: .4byte 0x000087c8\n\ -_080F0340: .4byte 0x0000d162\n\ -_080F0344:\n\ - ldr r0, _080F034C @ =gWindowTemplate_81E70D4\n\ - bl Text_LoadWindowTemplate\n\ - b _080F0618\n\ +_080F0DEC: .4byte gOtherText_Strategy\n\ +_080F0DF0:\n\ + ldr r0, _080F0DFC @ =gUnknown_083DFEC4\n\ + ldr r0, [r0]\n\ + ldr r1, _080F0E00 @ =0x00008788\n\ + adds r4, r0, r1\n\ + ldr r1, _080F0E04 @ =0x0000d110\n\ + b _080F0E42\n\ .align 2, 0\n\ -_080F034C: .4byte gWindowTemplate_81E70D4\n\ -_080F0350:\n\ - ldr r0, _080F0358 @ =gWindowTemplate_81E70D4\n\ - bl MultistepInitMenuWindowBegin\n\ - b _080F0618\n\ +_080F0DFC: .4byte gUnknown_083DFEC4\n\ +_080F0E00: .4byte 0x00008788\n\ +_080F0E04: .4byte 0x0000d110\n\ +_080F0E08:\n\ + ldr r0, _080F0E10 @ =gOtherText_TrainersPokemon\n\ + lsls r2, r5, 3\n\ + b _080F0E54\n\ .align 2, 0\n\ -_080F0358: .4byte gWindowTemplate_81E70D4\n\ -_080F035C:\n\ - bl MultistepInitMenuWindowContinue\n\ - cmp r0, 0\n\ - beq _080F0366\n\ - b _080F0618\n\ -_080F0366:\n\ - b _080F0626\n\ -_080F0368:\n\ - bl Menu_EraseScreen\n\ - b _080F0618\n\ -_080F036E:\n\ - ldr r0, _080F0378 @ =gUnknown_08E9FC64\n\ - ldr r1, _080F037C @ =0x0600e800\n\ - bl LZ77UnCompVram\n\ - b _080F0618\n\ +_080F0E10: .4byte gOtherText_TrainersPokemon\n\ +_080F0E14:\n\ + ldr r0, _080F0E20 @ =gUnknown_083DFEC4\n\ + ldr r0, [r0]\n\ + ldr r1, _080F0E24 @ =0x00008788\n\ + adds r4, r0, r1\n\ + ldr r1, _080F0E28 @ =0x0000d114\n\ + b _080F0E42\n\ .align 2, 0\n\ -_080F0378: .4byte gUnknown_08E9FC64\n\ -_080F037C: .4byte 0x0600e800\n\ -_080F0380:\n\ - ldr r0, _080F038C @ =gPokenavConditionSearch2_Gfx\n\ - ldr r1, _080F0390 @ =0x06008000\n\ - bl LZ77UnCompVram\n\ - b _080F0618\n\ +_080F0E20: .4byte gUnknown_083DFEC4\n\ +_080F0E24: .4byte 0x00008788\n\ +_080F0E28: .4byte 0x0000d114\n\ +_080F0E2C:\n\ + ldr r0, _080F0E34 @ =gOtherText_SelfIntroduction\n\ + lsls r2, r5, 3\n\ + b _080F0E54\n\ .align 2, 0\n\ -_080F038C: .4byte gPokenavConditionSearch2_Gfx\n\ -_080F0390: .4byte 0x06008000\n\ -_080F0394:\n\ - ldr r6, _080F03FC @ =gUnknown_083E02B4\n\ - adds r0, r6, 0\n\ - movs r1, 0xB0\n\ - movs r2, 0x20\n\ - bl LoadPalette\n\ - adds r0, r6, 0\n\ - movs r1, 0xF0\n\ - movs r2, 0x20\n\ - bl LoadPalette\n\ - ldr r0, _080F0400 @ =gUnknown_083E0334\n\ - movs r1, 0x40\n\ - movs r2, 0x20\n\ - bl LoadPalette\n\ - ldr r0, _080F0404 @ =gUnknown_083DFEC4\n\ +_080F0E34: .4byte gOtherText_SelfIntroduction\n\ +_080F0E38:\n\ + ldr r0, _080F0E60 @ =gUnknown_083DFEC4\n\ ldr r0, [r0]\n\ - ldr r1, _080F0408 @ =0x000087ca\n\ + ldr r1, _080F0E64 @ =0x00008788\n\ + adds r4, r0, r1\n\ + ldr r1, _080F0E68 @ =0x0000d118\n\ +_080F0E42:\n\ adds r0, r1\n\ - ldrb r0, [r0]\n\ - cmp r0, 0\n\ - bne _080F0418\n\ - ldr r4, _080F040C @ =gPokenavConditionSearch2_Pal\n\ + ldr r1, [r0]\n\ adds r0, r4, 0\n\ - movs r1, 0x30\n\ - movs r2, 0x20\n\ - bl LoadPalette\n\ - ldr r1, _080F0410 @ =gPlttBufferUnfaded\n\ - ldrh r0, [r4, 0xA]\n\ - strh r0, [r1]\n\ - ldr r0, _080F0414 @ =gUnknownPalette_81E6692\n\ - movs r1, 0xB0\n\ - movs r2, 0x20\n\ - bl LoadPalette\n\ - adds r0, r6, 0x2\n\ - movs r1, 0xB1\n\ - movs r2, 0x2\n\ - bl LoadPalette\n\ - adds r0, r6, 0\n\ - adds r0, 0x10\n\ - movs r1, 0xB5\n\ - movs r2, 0x2\n\ - bl LoadPalette\n\ - adds r4, 0xA\n\ + movs r2, 0x88\n\ + movs r3, 0\n\ + bl AlignStringInMenuWindow\n\ + lsls r2, r5, 3\n\ adds r0, r4, 0\n\ - movs r1, 0xBF\n\ - b _080F04A8\n\ +_080F0E54:\n\ + movs r1, 0x61\n\ + movs r3, 0\n\ + bl Menu_PrintTextPixelCoords\n\ + b _080F0EA0\n\ .align 2, 0\n\ -_080F03FC: .4byte gUnknown_083E02B4\n\ -_080F0400: .4byte gUnknown_083E0334\n\ -_080F0404: .4byte gUnknown_083DFEC4\n\ -_080F0408: .4byte 0x000087ca\n\ -_080F040C: .4byte gPokenavConditionSearch2_Pal\n\ -_080F0410: .4byte gPlttBufferUnfaded\n\ -_080F0414: .4byte gUnknownPalette_81E6692\n\ -_080F0418:\n\ - cmp r0, 0x1\n\ - bne _080F0464\n\ - ldr r4, _080F0458 @ =gUnknown_083E0274\n\ +_080F0E60: .4byte gUnknown_083DFEC4\n\ +_080F0E64: .4byte 0x00008788\n\ +_080F0E68: .4byte 0x0000d118\n\ +_080F0E6C:\n\ + ldr r0, _080F0E94 @ =gUnknown_083DFEC4\n\ + ldr r0, [r0]\n\ + ldr r1, _080F0E98 @ =0x00008788\n\ + adds r4, r0, r1\n\ + ldr r1, _080F0E9C @ =0x0000d11c\n\ + adds r0, r1\n\ + ldr r1, [r0]\n\ adds r0, r4, 0\n\ - movs r1, 0x30\n\ - movs r2, 0x20\n\ - bl LoadPalette\n\ - ldr r1, _080F045C @ =gPlttBufferUnfaded\n\ - ldrh r0, [r4, 0xA]\n\ - strh r0, [r1]\n\ - ldr r0, _080F0460 @ =gUnknownPalette_81E6692\n\ - movs r1, 0xB0\n\ - movs r2, 0x20\n\ - bl LoadPalette\n\ - adds r0, r6, 0x2\n\ - movs r1, 0xB1\n\ - movs r2, 0x2\n\ - bl LoadPalette\n\ - adds r0, r6, 0\n\ - adds r0, 0x10\n\ - movs r1, 0xB5\n\ - movs r2, 0x2\n\ - bl LoadPalette\n\ - adds r4, 0xA\n\ + movs r2, 0x88\n\ + movs r3, 0\n\ + bl AlignStringInMenuWindow\n\ + lsls r2, r5, 3\n\ adds r0, r4, 0\n\ - movs r1, 0xBF\n\ - b _080F04A8\n\ + movs r1, 0x61\n\ + movs r3, 0\n\ + bl Menu_PrintTextPixelCoords\n\ + b _080F0D6C\n\ .align 2, 0\n\ -_080F0458: .4byte gUnknown_083E0274\n\ -_080F045C: .4byte gPlttBufferUnfaded\n\ -_080F0460: .4byte gUnknownPalette_81E6692\n\ -_080F0464:\n\ - ldr r4, _080F04B0 @ =gUnknown_08E9F9E8\n\ - adds r0, r4, 0\n\ - movs r1, 0x30\n\ - movs r2, 0x20\n\ - bl LoadPalette\n\ - ldr r1, _080F04B4 @ =gPlttBufferUnfaded\n\ - adds r5, r4, 0\n\ - adds r5, 0xA\n\ - ldrh r0, [r4, 0xA]\n\ +_080F0E94: .4byte gUnknown_083DFEC4\n\ +_080F0E98: .4byte 0x00008788\n\ +_080F0E9C: .4byte 0x0000d11c\n\ +_080F0EA0:\n\ + ldr r0, _080F0EB8 @ =gUnknown_083DFEC4\n\ + ldr r1, [r0]\n\ + ldr r0, _080F0EBC @ =0x0000d15c\n\ + adds r1, r0\n\ + ldrh r0, [r1]\n\ + adds r0, 0x1\n\ strh r0, [r1]\n\ - ldr r0, _080F04B8 @ =gUnknown_083E0314\n\ - movs r1, 0x50\n\ - movs r2, 0x20\n\ - bl LoadPalette\n\ - adds r0, r6, 0x2\n\ - movs r1, 0xB1\n\ - movs r2, 0x2\n\ - bl LoadPalette\n\ - adds r0, r6, 0\n\ - adds r0, 0x10\n\ - movs r1, 0xB5\n\ - movs r2, 0x2\n\ - bl LoadPalette\n\ - adds r0, r5, 0\n\ - movs r1, 0xBF\n\ - movs r2, 0x2\n\ - bl LoadPalette\n\ - adds r0, r5, 0\n\ - movs r1, 0x5F\n\ -_080F04A8:\n\ - movs r2, 0x2\n\ - bl LoadPalette\n\ - b _080F0618\n\ - .align 2, 0\n\ -_080F04B0: .4byte gUnknown_08E9F9E8\n\ -_080F04B4: .4byte gPlttBufferUnfaded\n\ -_080F04B8: .4byte gUnknown_083E0314\n\ -_080F04BC:\n\ - ldr r0, _080F04E8 @ =gUnknown_083DFEC4\n\ - ldr r0, [r0]\n\ - ldr r2, _080F04EC @ =0x000087ca\n\ - adds r0, r2\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x2\n\ - beq _080F04F8\n\ - ldr r0, _080F04F0 @ =0x0600e800\n\ - ldr r3, _080F04F4 @ =gUnknown_08E9FD1C\n\ - movs r1, 0\n\ - str r1, [sp]\n\ - str r1, [sp, 0x4]\n\ - movs r2, 0x9\n\ - str r2, [sp, 0x8]\n\ - movs r1, 0x4\n\ - str r1, [sp, 0xC]\n\ - str r2, [sp, 0x10]\n\ - movs r1, 0\n\ - movs r2, 0x5\n\ - bl sub_8095C8C\n\ - b _080F0618\n\ +_080F0EAE:\n\ + movs r0, 0x1\n\ +_080F0EB0:\n\ + pop {r4,r5}\n\ + pop {r1}\n\ + bx r1\n\ .align 2, 0\n\ -_080F04E8: .4byte gUnknown_083DFEC4\n\ -_080F04EC: .4byte 0x000087ca\n\ -_080F04F0: .4byte 0x0600e800\n\ -_080F04F4: .4byte gUnknown_08E9FD1C\n\ -_080F04F8:\n\ - ldr r3, _080F0530 @ =0x0600e800\n\ - mov r8, r3\n\ - ldr r3, _080F0534 @ =gUnknown_08E9FE54\n\ - movs r4, 0\n\ - str r4, [sp]\n\ - str r4, [sp, 0x4]\n\ - movs r5, 0xC\n\ - str r5, [sp, 0x8]\n\ - movs r6, 0xA\n\ - str r6, [sp, 0xC]\n\ - str r5, [sp, 0x10]\n\ - mov r0, r8\n\ - movs r1, 0\n\ - movs r2, 0x4\n\ - bl sub_8095C8C\n\ - ldr r3, _080F0538 @ =gUnknown_08E9FD64\n\ - str r4, [sp]\n\ - str r4, [sp, 0x4]\n\ - str r5, [sp, 0x8]\n\ - str r6, [sp, 0xC]\n\ - str r5, [sp, 0x10]\n\ - mov r0, r8\n\ - movs r1, 0\n\ - movs r2, 0x8\n\ - bl sub_8095C8C\n\ - b _080F0618\n\ +_080F0EB8: .4byte gUnknown_083DFEC4\n\ +_080F0EBC: .4byte 0x0000d15c\n\ + .syntax divided\n"); +} +#endif + +static void sub_80F0EC0(void) +{ + gUnknown_083DFEC4->unk306 = 0; + gUnknown_083DFEC4->unkD15C = 0; + StringFill(gUnknown_083DFEC4->unk8788, CHAR_SPACE, 16); +} + +static bool8 sub_80F0EF4(void) +{ + int top; + if (gUnknown_083DFEC4->unkD15C > 6) + return FALSE; + + if (++gUnknown_083DFEC4->unk306 > 1) + { + gUnknown_083DFEC4->unk306 = 0; + top = (gUnknown_083DFEC4->unk8778 + 2 + gUnknown_083DFEC4->unkD15C * 2) & 0x1F; + BasicInitMenuWindow(&gWindowTemplate_81E70D4); + Menu_EraseWindowRect(12, top, 31, top + 1); + gUnknown_083DFEC4->unkD15C++; + } + + return TRUE; +} + +static void sub_80F0F64(void) +{ + s16 var0 = gUnknown_083DFEC4->unk876C; + gUnknown_083DFEC4->unk877C = var0 * 16; + gUnknown_083DFEC4->unk877A = var0 == 1 ? 4 : 8; +} + +static void sub_80F0FA0(void) +{ + s16 var0 = gUnknown_083DFEC4->unk876C * -1; + gUnknown_083DFEC4->unk877C = var0 * 16; + gUnknown_083DFEC4->unk877A = var0 == -1 ? -4 : -8; +} + +static bool8 sub_80F0FEC(void) +{ + return sub_80F0718(); +} + +void sub_80F0FFC(u8 arg0) +{ + GetMapSectionName(gUnknown_083DFEC4->unk8788, gUnknown_083DFEC4->unkCEE8[arg0].unk2, 0); + BasicInitMenuWindow(&gWindowTemplate_81E710C); + sub_80F19DC(gUnknown_083DFEC4->unk8788); + AlignStringInMenuWindow(gUnknown_083DFEC4->unkD138, gUnknown_083DFEC4->unk8788, 88, 2); + Menu_PrintText(gUnknown_083DFEC4->unkD138, 0, 5); +} + +void sub_80F105C(void) +{ + sub_80F0A74(gUnknown_083DFEC4->unk876E, gUnknown_083DFEC4->unk8778); +} + +static bool8 sub_80F1080(void) +{ + switch (gUnknown_083DFEC4->unkD160) + { + case 0: + sub_80EEDE8(); + gUnknown_083DFEC4->unkD162 = 11; + break; + case 1: + Text_LoadWindowTemplate(&gWindowTemplate_81E70B8); + break; + case 2: + MultistepInitMenuWindowBegin(&gWindowTemplate_81E70B8); + break; + case 3: + if (!MultistepInitMenuWindowContinue()) + return TRUE; + break; + case 4: + Menu_EraseScreen(); + break; + case 5: + sub_80F1614(); + break; + case 6: + if (sub_80F162C(1)) + return TRUE; + break; + case 7: + LZ77UnCompWram(gUnknown_08E9FBA0, gUnknown_083DFEC4->unk934C); + break; + case 8: + DrawMonRibbonIcons(); + break; + case 9: + sub_80F13FC(); + break; + case 10: + LZ77UnCompVram(gPokenavRibbonView_Gfx, (void *)(VRAM + 0x8000)); + break; + case 11: + LZ77UnCompVram(gUnknown_083E040C, (void *)(VRAM + 0x8200)); + break; + case 12: + LoadPalette(gPokenavRibbonView_Pal, 0x20, 0x20); + LoadPalette(gUnknown_083E03A8, 0xF0, 0x20); + LoadPalette(gUnknown_083E3C60[0], 0x30, 0xA0); + LoadPalette(gUnknownPalette_81E6692, 0xB0, 0x20); + LoadPalette(gUnknown_083E03A8 + 0xF, 0xBF, 0x2); + break; + case 13: + sub_80F1438(); + break; + case 14: + REG_BG2CNT = 0x1E02; + REG_BG3CNT = 0x170B; + REG_BLDCNT = 0; + gUnknown_083DFEC4->unkD160++; + return FALSE; + default: + return FALSE; + } + + gUnknown_083DFEC4->unkD160++; + return TRUE; +} + +void DrawMonRibbonIcons(void) +{ + u16 i; + u16 offset; + u8 index, palette, tile; + u8 var0; + + offset = 0x8B; + var0 = gUnknown_083DFEC4->unkBC8E - gUnknown_083DFEC4->unkBC8F; + + for (i = 0; i < 8; i++) + CpuFill16(0x2000, &gUnknown_083DFEC4->unk934C[offset + i * 32], 0x24); + + for (i = 0; i < var0; i++) + { + index = gUnknown_083DFEC4->unkBC4C[i]; + palette = gPokenavRibbonsIconGfx[index][1] + 3; + tile = gPokenavRibbonsIconGfx[index][0] * 2 + 0x10; + gUnknown_083DFEC4->unk934C[offset] = (palette << 12) | tile; + gUnknown_083DFEC4->unk934C[offset + 1] = ((palette << 12) | 0x400) | tile; + gUnknown_083DFEC4->unk934C[offset + 0x20] = (palette << 12) | (tile + 1); + gUnknown_083DFEC4->unk934C[offset + 0x21] = (palette << 12) | 0x400 | (tile + 1); + + if ((i + 1) % 9 == 0) + offset += 0x30; + else + offset += 2; + } + + offset = 0x14B; + for (i = 0; i < gUnknown_083DFEC4->unkBC8F; i++) + { + index = gUnknown_083DFEC4->unkBC4C[var0 + i]; + palette = gPokenavRibbonsIconGfx[index][1] + 3; + tile = gPokenavRibbonsIconGfx[index][0] * 2 + 0x10; + gUnknown_083DFEC4->unk934C[offset] = (palette << 12) | tile; + gUnknown_083DFEC4->unk934C[offset + 1] = ((palette << 12) | 0x400) | tile; + gUnknown_083DFEC4->unk934C[offset + 0x20] = (palette << 12) | (tile + 1); + gUnknown_083DFEC4->unk934C[offset + 0x21] = (palette << 12) | 0x400 | (tile + 1); + + offset += 2; + } +} + +void sub_80F13FC(void) +{ + u16 *src = gUnknown_083DFEC4->unk934C; + u16 *dest = (u16 *)(VRAM + 0xB800); + DmaCopy32(3, src, dest, 0x500); + gPlttBufferUnfaded[0] = *(gPokenavRibbonView_Pal + 14); +} + +void sub_80F1438(void) +{ + Menu_PrintText(gUnknown_083DFEC4->unk8829[0], 13, 1); + sub_80F445C(gUnknown_083DFEC4->unk8788, gUnknown_083DFEC4->unk876E + 1); + Menu_PrintText(gUnknown_083DFEC4->unk8788, 1, 5); +} + +void sub_80F1480(void) +{ + Menu_EraseWindowRect(12, 13, 27, 16); +} + +// This is a fakematching function, due to a hardcoded access of gSaveBlock1. +// Due to this hardcoded address access, gift ribbons do not properly display +// their descriptions, since the hardcoded access is inside of the LinkBattleRecords +// save data, rather than the giftRibbons array, which is almost certainly what the +// intended access is. +static void sub_80F1494(void) +{ + u8 *arr; + u8 *tileBuffer1 = &gUnknown_083DFEC8[0x800]; + u8 *tileBuffer2 = &gUnknown_083DFEC8[0xA98]; + + if (gUnknown_083DFEC4->unkBC91 < 3) + { + gUnknown_020388B4 = gUnknown_083DFEC4->unkBC91 * 9 + gUnknown_083DFEC4->unkBC90; + gUnknown_020388B4 = gUnknown_083DFEC4->unkBC4C[gUnknown_020388B4]; + AlignStringInMenuWindow(tileBuffer1, gRibbonDescriptions[gUnknown_020388B4][0], 128, 0); + AlignStringInMenuWindow(tileBuffer2, gRibbonDescriptions[gUnknown_020388B4][1], 128, 0); + } + else + { + gUnknown_020388B4 = gUnknown_083DFEC4->unkBC8E - gUnknown_083DFEC4->unkBC8F; + gUnknown_020388B4 = gUnknown_083DFEC4->unkBC4C[gUnknown_020388B4 + gUnknown_083DFEC4->unkBC90]; + + // FIXME! + arr = ((u8*)&gSaveBlock1); + asm("ldrh r1, [r5]\n\ + add r0, r0, r1"); + gUnknown_020388B4 = arr[0x30F7]; + // The bug fix for this code is the following: + // gUnknown_020388B4 = gSaveBlock1.externalReservedData.giftRibbons[gUnknown_020388B4]; + if (gUnknown_020388B4) + { + gUnknown_020388B4--; + AlignStringInMenuWindow(tileBuffer1, gGiftRibbonDescriptions[gUnknown_020388B4][0], 128, 0); + AlignStringInMenuWindow(tileBuffer2, gGiftRibbonDescriptions[gUnknown_020388B4][1], 128, 0); + } + else + { + AlignStringInMenuWindow(tileBuffer1, gEmptyString_81E72B0, 128, 0); + AlignStringInMenuWindow(tileBuffer2, gEmptyString_81E72B0, 128, 0); + } + } + + Menu_PrintText(tileBuffer1, 12, 13); + Menu_PrintText(tileBuffer2, 12, 15); +} + +static void sub_80F15A8(void) +{ + u8 *buffer; + Menu_EraseWindowRect(12, 13, 27, 16); + buffer = StringCopy(gUnknown_083DFEC4->unk8788, gOtherText_Ribbons); + buffer[0] = CHAR_SPACE; + buffer++; + buffer = ConvertIntToDecimalStringN( + buffer, + gUnknown_083DFEC4->unk893c[gUnknown_083DFEC4->unk87DC].unk0, + STR_CONV_MODE_LEFT_ALIGN, + 2); + buffer[0] = EOS; + Menu_PrintText(gUnknown_083DFEC4->unk8788, 12, 13); +} + +void sub_80F1614(void) +{ + gUnknown_083DFEC4->unk8764 = 0; +} + +bool8 sub_80F162C(u8 arg0) +{ + switch (gUnknown_083DFEC4->unk8764) + { + case 0: + break; + case 1: + LZ77UnCompVram(gUnknown_08E9FF58, (void *)(VRAM + 0xE800)); + break; + case 2: + DmaCopy16Defvars(3, gPokenavRibbonPokeView_Gfx, (void *)(VRAM + 0xE000), 0xE0); + break; + case 3: + if (!arg0) + LoadPalette(gUnknown_083E0124, 0xD0, 0x20); + else + LoadPalette(gUnknown_083E0144, 0xD0, 0x20); + + gUnknown_083DFEC4->unk8766 = -80; + REG_BG0CNT = 0x1D0D; + gUnknown_083DFEC4->unk8764++; + return FALSE; + default: + return FALSE; + } + + gUnknown_083DFEC4->unk8764++; + return TRUE; +} + +bool8 sub_80F170C(void) +{ + gUnknown_083DFEC4->unk8766 += 0x10; + if (gUnknown_083DFEC4->unk8766 > 0) + gUnknown_083DFEC4->unk8766 = 0; + + return gUnknown_083DFEC4->unk8766 != 0; +} + +bool8 sub_80F173C(void) +{ + gUnknown_083DFEC4->unk8766 -= 0x10; + if (gUnknown_083DFEC4->unk8766 < -0x50) + gUnknown_083DFEC4->unk8766 = -0x50; + + return gUnknown_083DFEC4->unk8766 != -0x50; +} + +bool8 sub_80F1778(void) +{ + switch (gUnknown_083DFEC4->unkD160) + { + case 0: + sub_80EEDE8(); + gUnknown_083DFEC4->unkD162 = 2; + break; + case 1: + sub_80F1614(); + break; + case 2: + if (sub_80F162C(0)) + return TRUE; + break; + case 3: + LZ77UnCompVram(gPokenavConditionView_Gfx, (void *)(VRAM + 0x5000)); + break; + case 4: + LZ77UnCompVram(gUnknown_08E9AC4C, (void *)(VRAM + 0xF000)); + LoadPalette(gPokenavConditionMenu2_Pal, 0x20, 0x20); + break; + case 5: + sub_8095C8C((void *)VRAM + 0xF000, 0, 13, gUnknown_083E01F4, 0, 0, 12, 4, 12); + break; + case 6: + LZ77UnCompVram(gUnknown_08E9FEB4, (void *)(VRAM + 0xB800)); + break; + case 7: + LoadPalette(gUnknown_083E0254, 0x30, 0x20); + LoadPalette(gUnknownPalette_81E6692, 0xB0, 0x20); + LoadPalette(&gPokenavConditionMenu2_Pal[2], 0xB1, 0x2); + LoadPalette(&gPokenavConditionMenu2_Pal[16], 0xB5, 0x2); + LoadPalette(&gPokenavConditionMenu2_Pal[30], 0xBF, 0x2); + sub_80F01A4(); + break; + case 8: + sub_80F01E0(gUnknown_083DFEC4->unk8fe9); + break; + case 9: + REG_BG3CNT = 0x1E03; + REG_BG2CNT = 0x1702; + REG_BLDCNT = 0x844; + REG_BLDALPHA = 0x40B; + break; + default: + return FALSE; + } + + gUnknown_083DFEC4->unkD160++; + return TRUE; +} + +void sub_80F1934(void) +{ + u8 *buffer = gUnknown_083DFEC4->unk8788; + if (gUnknown_083DFEC4->unk893c[gUnknown_083DFEC4->unk87DC].unk4) + { + u8 nature = GetNature(&gPlayerParty[sub_8137124(gUnknown_083DFEC4->unk87DC)]); + buffer = StringCopy(buffer, gOtherText_Nature2); + AlignStringInMenuWindow(buffer, gNatureNames[nature], 87, 0); + } + else + { + AlignStringInMenuWindow(buffer, gEmptyString_81E72B0, 87, 0); + } + + Menu_PrintTextPixelCoords(gUnknown_083DFEC4->unk8788, 1, 112, 1); +} + +static void sub_80F19DC(u8 *text) +{ + while (text[0] != EOS) + { + if (text[0] == EXT_CTRL_CODE_BEGIN && text[1] == CHAR_SPACE) + { + text[0] = EOS; + break; + } + + text++; + } +} + +static void sub_80F19FC(void) +{ + // FIXME r4/r5 swapped + register u8 *ptr asm("r5") = gUnknown_020388B0; + if (ptr[0] == 1) + { + const u8 *landmarkName = GetLandmarkName( + gUnknown_083DFEC4->regionMap.mapSectionId, + gUnknown_083DFEC4->regionMap.everGrandeCityArea, + ptr[1]); + + if (landmarkName) + { + sub_8072A18(landmarkName, 0x70, 4 * (ptr[1] * 4 + 12), 0x78, 1); + if (++ptr[1] != 4) + return; + } + + Menu_BlankWindowRect(14, ptr[1] * 2 + 6, 28, 15); + ptr[0] = 0; + } +} + +static void sub_80F1A74(void) +{ + gUnknown_020388B0[0] = 0; +} + +static void sub_80F1A80(void) +{ + gUnknown_020388B0[0] = 1; + gUnknown_020388B0[1] = 0; +} + +static void sub_80F1A90(void) +{ + gUnknown_083DFEC4->unk306 = 0; + if (gUnknown_083DFEC4->unk6DAC == 0) + while (sub_80F1AC4()); +} + +static bool8 sub_80F1AC4(void) +{ + u16 i, j; + + switch (gUnknown_083DFEC4->unk306) + { + case 0: + for (i = 0; i < 6; i++) + { + for (j = 0; j < 4; j++) + gUnknown_083DFEC4->unk320[i][j] = NULL; + } + + gUnknown_083DFEC4->unk311 = 0; + break; + case 1: + LZ77UnCompWram(gPokenavMenuOptions_Gfx, gUnknown_083DFEC4->unk388); + break; + case 2: + LZ77UnCompWram(gPokenavConditionMenu_Gfx, gUnknown_083DFEC4->unk1788); + break; + case 3: + LZ77UnCompWram(gPokenavConditionSearch_Gfx, gUnknown_083DFEC4->unk2388); + return FALSE; + } + + gUnknown_083DFEC4->unk306++; + return TRUE; +} + +static void sub_80F1B8C(u8 arg0) +{ + gUnknown_083DFEC4->unk306 = 0; + if (gUnknown_083DFEC4->unk6DAC == 0) + while (sub_80F1BC8(arg0)); +} + +#ifdef NONMATCHING +// very close, but for some reason, (i + 1) is being stored in sp[0x10] +static bool8 sub_80F1BC8(u8 arg0) +{ + u16 i, j; + u16 animNum; + u16 topOffset; + u16 height; + u16 middle; + u8 spriteId; + + switch (gUnknown_083DFEC4->unk306) + { + case 0: + sub_80F2458(arg0); + break; + case 1: + sub_80F2514(arg0); + break; + case 2: + switch (arg0) + { + case 0: + topOffset = 42; + height = 20; + gUnknown_083DFEC4->unk30E = 5; + break; + case 1: + topOffset = 56; + height = 20; + gUnknown_083DFEC4->unk30E = 3; + break; + case 2: + topOffset = 40; + height = 16; + gUnknown_083DFEC4->unk30E = 6; + break; + default: + return FALSE; + } + + animNum = 0; + for (i = 0; i < gUnknown_083DFEC4->unk30E; i++) + { + middle = (height * i) + topOffset - 8; + gUnknown_083DFEC4->unk314[i] = (middle << 8) | (middle + 0x11); + if (!arg0) + { + if (gUnknown_083DFEC4->unk6DB2[i] == 0) + { + for (j = 0; j < 4; j++) + gUnknown_083DFEC4->unk320[i][j] = NULL; + continue; + } + else + { + animNum = (gUnknown_083DFEC4->unk6DB2[i] - 1) * 4; + } + } + + for (j = 0; j < 4; j++) + { + spriteId = CreateSprite(&gSpriteTemplate_83E4454, j * 32 + 256, (height * i) + topOffset, 0); + if (spriteId != MAX_SPRITES) + { + gUnknown_083DFEC4->unk320[i][j] = &gSprites[spriteId]; + gUnknown_083DFEC4->unk320[i][j]->data[0] = i; + gUnknown_083DFEC4->unk320[i][j]->data[1] = j; + gUnknown_083DFEC4->unk320[i][j]->data[2] = j * 32 + 152; + gUnknown_083DFEC4->unk320[i][j]->data[3] = j * 32 + 256; + StartSpriteAnim(gUnknown_083DFEC4->unk320[i][j], animNum++); + + if ((arg0 == 2 || arg0 == 0) && i > 2) + gUnknown_083DFEC4->unk320[i][j]->oam.paletteNum = IndexOfSpritePaletteTag(0x1); + } + } + } + break; + default: + return FALSE; + } + + gUnknown_083DFEC4->unk306++; + return TRUE; +} +#else +NAKED +static bool8 sub_80F1BC8(u8 arg0) +{ + 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\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + mov r9, r0\n\ + ldr r1, _080F1BF4 @ =gUnknown_083DFEC4\n\ + ldr r2, [r1]\n\ + ldr r3, _080F1BF8 @ =0x00000306\n\ + adds r0, r2, r3\n\ + ldrh r0, [r0]\n\ + adds r3, r1, 0\n\ + cmp r0, 0x1\n\ + beq _080F1C0A\n\ + cmp r0, 0x1\n\ + bgt _080F1BFC\n\ + cmp r0, 0\n\ + beq _080F1C02\n\ + b _080F1DC4\n\ .align 2, 0\n\ -_080F0530: .4byte 0x0600e800\n\ -_080F0534: .4byte gUnknown_08E9FE54\n\ -_080F0538: .4byte gUnknown_08E9FD64\n\ -_080F053C:\n\ - ldr r0, _080F0548 @ =gUnknown_083E0354\n\ - ldr r1, _080F054C @ =0x06005000\n\ - bl LZ77UnCompVram\n\ - b _080F0618\n\ +_080F1BF4: .4byte gUnknown_083DFEC4\n\ +_080F1BF8: .4byte 0x00000306\n\ +_080F1BFC:\n\ + cmp r0, 0x2\n\ + beq _080F1C12\n\ + b _080F1DC4\n\ +_080F1C02:\n\ + mov r0, r9\n\ + bl sub_80F2458\n\ + b _080F1DC8\n\ +_080F1C0A:\n\ + mov r0, r9\n\ + bl sub_80F2514\n\ + b _080F1DC8\n\ +_080F1C12:\n\ + mov r4, r9\n\ + cmp r4, 0x1\n\ + beq _080F1C40\n\ + cmp r4, 0x1\n\ + bgt _080F1C22\n\ + cmp r4, 0\n\ + beq _080F1C2A\n\ + b _080F1DC4\n\ +_080F1C22:\n\ + mov r5, r9\n\ + cmp r5, 0x2\n\ + beq _080F1C54\n\ + b _080F1DC4\n\ +_080F1C2A:\n\ + movs r0, 0x2A\n\ + str r0, [sp, 0x4]\n\ + movs r1, 0x14\n\ + str r1, [sp, 0x8]\n\ + ldr r4, _080F1C3C @ =0x0000030e\n\ + adds r1, r2, r4\n\ + movs r0, 0x5\n\ + b _080F1C62\n\ .align 2, 0\n\ -_080F0548: .4byte gUnknown_083E0354\n\ -_080F054C: .4byte 0x06005000\n\ -_080F0550:\n\ - ldr r2, _080F0568 @ =0x0600f800\n\ - add r1, sp, 0x14\n\ - movs r0, 0\n\ - strh r0, [r1]\n\ - ldr r0, _080F056C @ =0x040000d4\n\ - str r1, [r0]\n\ - str r2, [r0, 0x4]\n\ - ldr r1, _080F0570 @ =0x81000400\n\ - str r1, [r0, 0x8]\n\ - ldr r0, [r0, 0x8]\n\ - b _080F0618\n\ +_080F1C3C: .4byte 0x0000030e\n\ +_080F1C40:\n\ + movs r5, 0x38\n\ + str r5, [sp, 0x4]\n\ + movs r0, 0x14\n\ + str r0, [sp, 0x8]\n\ + ldr r4, _080F1C50 @ =0x0000030e\n\ + adds r1, r2, r4\n\ + movs r0, 0x3\n\ + b _080F1C62\n\ .align 2, 0\n\ -_080F0568: .4byte 0x0600f800\n\ -_080F056C: .4byte 0x040000d4\n\ -_080F0570: .4byte 0x81000400\n\ -_080F0574:\n\ - bl sub_80F0900\n\ - b _080F0618\n\ -_080F057A:\n\ - bl sub_80F0944\n\ +_080F1C50: .4byte 0x0000030e\n\ +_080F1C54:\n\ + movs r5, 0x28\n\ + str r5, [sp, 0x4]\n\ + movs r0, 0x10\n\ + str r0, [sp, 0x8]\n\ + ldr r4, _080F1CDC @ =0x0000030e\n\ + adds r1, r2, r4\n\ + movs r0, 0x6\n\ +_080F1C62:\n\ + strb r0, [r1]\n\ + movs r5, 0\n\ + str r5, [sp]\n\ + mov r8, r5\n\ + adds r1, r3, 0\n\ + ldr r0, [r1]\n\ + ldr r2, _080F1CDC @ =0x0000030e\n\ + adds r0, r2\n\ + ldrb r0, [r0]\n\ lsls r0, 24\n\ + asrs r0, 24\n\ + cmp r8, r0\n\ + blt _080F1C7E\n\ + b _080F1DC8\n\ +_080F1C7E:\n\ + ldr r4, [sp, 0x8]\n\ + mov r3, r8\n\ + muls r3, r4\n\ + ldr r5, [sp, 0x4]\n\ + adds r0, r5, r3\n\ + subs r0, 0x8\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + ldr r4, [r1]\n\ + mov r2, r8\n\ + lsls r1, r2, 1\n\ + movs r5, 0xC5\n\ + lsls r5, 2\n\ + adds r2, r4, r5\n\ + adds r2, r1\n\ + lsls r1, r0, 8\n\ + adds r0, 0x11\n\ + orrs r1, r0\n\ + strh r1, [r2]\n\ + mov r0, r9\n\ cmp r0, 0\n\ - beq _080F0618\n\ - b _080F0626\n\ -_080F0586:\n\ - ldr r0, _080F059C @ =gUnknown_083DFEC4\n\ - ldr r4, [r0]\n\ - ldr r1, _080F05A0 @ =0x000087ca\n\ + bne _080F1CF2\n\ + ldr r1, _080F1CE0 @ =0x00006db2\n\ adds r0, r4, r1\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x2\n\ - beq _080F05A4\n\ - bl ShowMapNamePopUpWindow\n\ - b _080F0618\n\ - .align 2, 0\n\ -_080F059C: .4byte gUnknown_083DFEC4\n\ -_080F05A0: .4byte 0x000087ca\n\ -_080F05A4:\n\ - movs r0, 0\n\ - bl sub_80F081C\n\ - ldr r2, _080F05B8 @ =0x0000876e\n\ - adds r0, r4, r2\n\ - ldrb r0, [r0]\n\ - bl sub_80F0FFC\n\ - b _080F0618\n\ + mov r2, r8\n\ + adds r1, r0, r2\n\ + ldrb r0, [r1]\n\ + cmp r0, 0\n\ + bne _080F1CE8\n\ + movs r5, 0\n\ + ldr r0, _080F1CE4 @ =gUnknown_083DFEC4\n\ + ldr r0, [r0]\n\ + lsls r2, 4\n\ + movs r3, 0xC8\n\ + lsls r3, 2\n\ + adds r1, r0, r3\n\ + movs r3, 0\n\ +_080F1CC8:\n\ + lsls r0, r5, 2\n\ + adds r0, r2\n\ + adds r0, r1, r0\n\ + str r3, [r0]\n\ + adds r0, r5, 0x1\n\ + lsls r0, 16\n\ + lsrs r5, r0, 16\n\ + cmp r5, 0x3\n\ + bls _080F1CC8\n\ + b _080F1D92\n\ .align 2, 0\n\ -_080F05B8: .4byte 0x0000876e\n\ -_080F05BC:\n\ - ldr r1, _080F0600 @ =REG_BG2CNT\n\ - ldr r3, _080F0604 @ =0x00001d0a\n\ - adds r0, r3, 0\n\ - strh r0, [r1]\n\ - adds r1, 0x2\n\ - adds r3, 0xF9\n\ - adds r0, r3, 0\n\ - strh r0, [r1]\n\ - subs r1, 0x6\n\ - adds r3, 0xFE\n\ - adds r0, r3, 0\n\ - strh r0, [r1]\n\ - adds r1, 0x16\n\ - movs r0, 0xF8\n\ - strh r0, [r1]\n\ - ldr r1, [r2]\n\ - ldr r0, _080F0608 @ =0x00008776\n\ - adds r2, r1, r0\n\ +_080F1CDC: .4byte 0x0000030e\n\ +_080F1CE0: .4byte 0x00006db2\n\ +_080F1CE4: .4byte gUnknown_083DFEC4\n\ +_080F1CE8:\n\ + ldrb r0, [r1]\n\ + subs r0, 0x1\n\ + lsls r0, 18\n\ + lsrs r0, 16\n\ + str r0, [sp]\n\ +_080F1CF2:\n\ + movs r5, 0\n\ + ldr r4, [sp, 0x4]\n\ + adds r0, r4, r3\n\ + lsls r0, 16\n\ + mov r10, r0\n\ +_080F1CFC:\n\ + lsls r6, r5, 5\n\ + movs r0, 0x80\n\ + lsls r0, 1\n\ + adds r7, r6, r0\n\ + lsls r1, r7, 16\n\ + asrs r1, 16\n\ + ldr r0, _080F1DB4 @ =gSpriteTemplate_83E4454\n\ + mov r3, r10\n\ + asrs r2, r3, 16\n\ movs r3, 0\n\ - movs r0, 0xF8\n\ - strh r0, [r2]\n\ - ldr r2, _080F060C @ =0x00008778\n\ - adds r0, r1, r2\n\ - strh r3, [r0]\n\ - ldr r0, _080F0610 @ =REG_BLDCNT\n\ - strh r3, [r0]\n\ - ldr r3, _080F0614 @ =0x0000d160\n\ - adds r1, r3\n\ - ldrh r0, [r1]\n\ + bl CreateSprite\n\ + lsls r0, 24\n\ + lsrs r3, r0, 24\n\ + cmp r3, 0x40\n\ + beq _080F1DC4\n\ + ldr r0, _080F1DB8 @ =gUnknown_083DFEC4\n\ + ldr r2, [r0]\n\ + lsls r1, r5, 2\n\ + mov r4, r8\n\ + lsls r0, r4, 4\n\ + adds r1, r0\n\ + movs r0, 0xC8\n\ + lsls r0, 2\n\ + adds r2, r0\n\ + adds r4, r2, r1\n\ + lsls r0, r3, 4\n\ + adds r0, r3\n\ + lsls r0, 2\n\ + ldr r1, _080F1DBC @ =gSprites\n\ + adds r0, r1\n\ + str r0, [r4]\n\ + mov r1, r8\n\ + strh r1, [r0, 0x2E]\n\ + ldr r0, [r4]\n\ + strh r5, [r0, 0x30]\n\ + ldr r1, [r4]\n\ + adds r0, r6, 0\n\ + adds r0, 0x98\n\ + strh r0, [r1, 0x32]\n\ + ldr r0, [r4]\n\ + strh r7, [r0, 0x34]\n\ + ldr r0, [r4]\n\ + ldr r1, [sp]\n\ + adds r2, r1, 0x1\n\ + lsls r2, 16\n\ + lsrs r2, 16\n\ + str r2, [sp]\n\ + lsls r1, 24\n\ + lsrs r1, 24\n\ + bl StartSpriteAnim\n\ + mov r2, r9\n\ + cmp r2, 0x2\n\ + beq _080F1D6E\n\ + cmp r2, 0\n\ + bne _080F1D88\n\ +_080F1D6E:\n\ + mov r3, r8\n\ + cmp r3, 0x2\n\ + bls _080F1D88\n\ + movs r0, 0x1\n\ + bl IndexOfSpritePaletteTag\n\ + ldr r3, [r4]\n\ + lsls r0, 4\n\ + ldrb r2, [r3, 0x5]\n\ + movs r1, 0xF\n\ + ands r1, r2\n\ + orrs r1, r0\n\ + strb r1, [r3, 0x5]\n\ +_080F1D88:\n\ + adds r0, r5, 0x1\n\ + lsls r0, 16\n\ + lsrs r5, r0, 16\n\ + cmp r5, 0x3\n\ + bls _080F1CFC\n\ +_080F1D92:\n\ + mov r0, r8\n\ adds r0, 0x1\n\ - strh r0, [r1]\n\ -_080F05FA:\n\ - movs r0, 0\n\ - b _080F0628\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + mov r8, r0\n\ + ldr r1, _080F1DB8 @ =gUnknown_083DFEC4\n\ + ldr r0, [r1]\n\ + ldr r4, _080F1DC0 @ =0x0000030e\n\ + adds r0, r4\n\ + ldrb r0, [r0]\n\ + lsls r0, 24\n\ + asrs r0, 24\n\ + cmp r8, r0\n\ + bge _080F1DB0\n\ + b _080F1C7E\n\ +_080F1DB0:\n\ + b _080F1DC8\n\ .align 2, 0\n\ -_080F0600: .4byte REG_BG2CNT\n\ -_080F0604: .4byte 0x00001d0a\n\ -_080F0608: .4byte 0x00008776\n\ -_080F060C: .4byte 0x00008778\n\ -_080F0610: .4byte REG_BLDCNT\n\ -_080F0614: .4byte 0x0000d160\n\ -_080F0618:\n\ - ldr r0, _080F0634 @ =gUnknown_083DFEC4\n\ +_080F1DB4: .4byte gSpriteTemplate_83E4454\n\ +_080F1DB8: .4byte gUnknown_083DFEC4\n\ +_080F1DBC: .4byte gSprites\n\ +_080F1DC0: .4byte 0x0000030e\n\ +_080F1DC4:\n\ + movs r0, 0\n\ + b _080F1DD8\n\ +_080F1DC8:\n\ + ldr r0, _080F1DE8 @ =gUnknown_083DFEC4\n\ ldr r1, [r0]\n\ - ldr r0, _080F0638 @ =0x00000306\n\ - adds r1, r0\n\ + ldr r5, _080F1DEC @ =0x00000306\n\ + adds r1, r5\n\ ldrh r0, [r1]\n\ adds r0, 0x1\n\ strh r0, [r1]\n\ -_080F0626:\n\ movs r0, 0x1\n\ -_080F0628:\n\ - add sp, 0x18\n\ - pop {r3}\n\ +_080F1DD8:\n\ + add sp, 0xC\n\ + pop {r3-r5}\n\ mov r8, r3\n\ - pop {r4-r6}\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ pop {r1}\n\ bx r1\n\ .align 2, 0\n\ -_080F0634: .4byte gUnknown_083DFEC4\n\ -_080F0638: .4byte 0x00000306\n\ +_080F1DE8: .4byte gUnknown_083DFEC4\n\ +_080F1DEC: .4byte 0x00000306\n\ + .syntax divided\n"); +} +#endif // NONMATCHING + +static void sub_80F1DF0(void) +{ + u16 i, j; + for (i = 0; i < gUnknown_083DFEC4->unk30E; i++) + { + for (j = 0; j < 4; j++) + { + if (gUnknown_083DFEC4->unk320[i][j]) + gUnknown_083DFEC4->unk320[i][j]->callback = sub_80F2218; + } + } + + PlaySE(SE_WIN_OPEN); +} + +static bool8 sub_80F1E50(void) +{ + if (sub_80F22F8()) + { + sub_80F2108(); + return FALSE; + } + else + { + return TRUE; + } +} + +static bool8 sub_80F1E6C(void) +{ + return !sub_80F22F8(); +} + +static void sub_80F1E84(void) +{ + u16 i, j; + + gUnknown_083DFEC4->unk30F = 0; + sub_80F2148(); + for (i = 0; i < gUnknown_083DFEC4->unk30E; i++) + { + if (i != gUnknown_083DFEC4->unk6DAD) + { + for (j = 0; j < 4; j++) + { + if (gUnknown_083DFEC4->unk320[i][j]) + gUnknown_083DFEC4->unk320[i][j]->callback = sub_80F2240; + } + } + } +} + +static bool8 sub_80F1F10(void) +{ + u16 j; + + switch (gUnknown_083DFEC4->unk30F) + { + case 0: + if (sub_80F2360()) + { + for (j = 0; j < 4; j++) + { + struct Sprite *sprite = gUnknown_083DFEC4->unk320[gUnknown_083DFEC4->unk6DAD][j]; + sprite->oam.affineMode = ST_OAM_AFFINE_DOUBLE; + sprite->affineAnims = gSpriteAffineAnimTable_83E4450; + InitSpriteAffineAnim(sprite); + sprite->data[4] = j * 4 - 6; + sprite->data[4] /= 2; + sprite->data[5] = sprite->data[4] * 8; + sprite->callback = sub_80F2240; + } + + sub_80F2170(); + gUnknown_083DFEC4->unk30F++; + } + break; + case 1: + if (sub_80F23C8()) + { + sub_80F21F8(); + FreeSpriteTilesByTag(0x0); + FreeSpritePaletteByTag(0x0); + FreeSpritePaletteByTag(0x1); + return FALSE; + } + break; + } + + return TRUE; +} + +static void sub_80F1FF0(void) +{ + if (gUnknown_083DFEC4->unk311 == 1) + { + REG_WIN0V = gUnknown_083DFEC4->unk314[gUnknown_083DFEC4->unk6DAD]; + REG_BLDY = gSineTable[gUnknown_083DFEC4->unk312] >> 5; + gUnknown_083DFEC4->unk312 += 3; + gUnknown_083DFEC4->unk312 &= 0x7F; + } + else if (gUnknown_083DFEC4->unk311 == 2) + { + REG_BLDALPHA = gUnknown_083E42F8[gUnknown_083DFEC4->unk312]; + if (gUnknown_083DFEC4->unk312 < 15) + gUnknown_083DFEC4->unk312++; + } +} + +static void sub_80F208C(void) +{ + sub_80F2148(); +} + +static void sub_80F2098(void) +{ + REG_WIN0H = 0x77F0; + REG_WIN0V = gUnknown_083DFEC4->unk314[gUnknown_083DFEC4->unk6DAD]; + REG_WININ = 0x3F; + REG_WINOUT = 0x1F; + REG_DISPCNT |= DISPCNT_WIN0_ON; +} + +static void sub_80F20F4(void) +{ + REG_DISPCNT &= ~DISPCNT_WIN0_ON; +} + +static void sub_80F2108(void) +{ + if (!gUnknown_083DFEC4->unk311) + { + gUnknown_083DFEC4->unk311 = 1; + gUnknown_083DFEC4->unk312 = 0; + REG_BLDCNT = 0x90; + REG_BLDY = 0; + sub_80F2098(); + } +} + +static void sub_80F2148(void) +{ + gUnknown_083DFEC4->unk311 = 0; + REG_BLDCNT = 0; + sub_80F20F4(); +} + +static void sub_80F2170(void) +{ + u16 j; + + if (!gUnknown_083DFEC4->unk311) + { + sub_80F20F4(); + for (j = 0; j < 4; j++) + { + struct Sprite *sprite = gUnknown_083DFEC4->unk320[gUnknown_083DFEC4->unk6DAD][j]; + sprite->oam.objMode = ST_OAM_OBJ_BLEND; + } + + gUnknown_083DFEC4->unk311 = 2; + gUnknown_083DFEC4->unk312 = 0; + REG_BLDCNT = 0x3F40; + REG_BLDALPHA = 0x10; + } +} + +static void sub_80F21F8() +{ + gUnknown_083DFEC4->unk311 = 0; + REG_BLDCNT = 0; +} + +static void sub_80F2218(struct Sprite *sprite) +{ + sprite->pos1.x -= 8; + if (sprite->pos1.x <= sprite->data[2]) + { + sprite->pos1.x = sprite->data[2]; + sprite->callback = sub_80F22B0; + } +} + +static void sub_80F2240(struct Sprite *sprite) +{ + if (sprite->data[0] == gUnknown_083DFEC4->unk6DAD) + { + if (sprite->data[5]) + { + sprite->pos1.x += sprite->data[4]; + sprite->data[5] -= sprite->data[4]; + } + + if (sprite->affineAnimEnded) + sub_80F240C(sprite); + } + else + { + sprite->pos1.x += 8; + if (sprite->pos1.x >= sprite->data[3]) + sub_80F240C(sprite); + } +} + +static void sub_80F22B0(struct Sprite *sprite) +{ + if (sprite->data[0] == gUnknown_083DFEC4->unk6DAD) + { + if (sprite->pos2.x > -16) + sprite->pos2.x -= 4; + } + else + { + if (sprite->pos2.x < 0) + sprite->pos2.x += 4; + } +} + +static bool8 sub_80F22F8(void) +{ + u16 i, j; + + for (i = 0; i < gUnknown_083DFEC4->unk6DAE; i++) + { + for (j = 0; j < 4; j++) + { + struct Sprite *sprite = gUnknown_083DFEC4->unk320[i][j]; + if (!sprite) + return TRUE; + + if (sprite->pos2.x != 0 && sprite->pos2.x != -16) + return FALSE; + } + } + + return TRUE; +} + +static bool8 sub_80F2360(void) +{ + u16 i, j; + + for (i = 0; i < gUnknown_083DFEC4->unk30E; i++) + { + if (i != gUnknown_083DFEC4->unk6DAD) + { + for (j = 0; j < 4; j++) + { + struct Sprite *sprite = gUnknown_083DFEC4->unk320[i][j]; + if (sprite) + return FALSE; + } + } + } + + return TRUE; +} + +static bool8 sub_80F23C8(void) +{ + u16 j; + + for (j = 0; j < 4; j++) + { + struct Sprite *sprite = gUnknown_083DFEC4->unk320[gUnknown_083DFEC4->unk6DAD][j]; + if (sprite) + return FALSE; + } + + return TRUE; +} + +static void sub_80F240C(struct Sprite *sprite) +{ + gUnknown_083DFEC4->unk320[sprite->data[0]][sprite->data[1]] = NULL; + if (sprite->affineAnimEnded) + FreeOamMatrix(sprite->oam.matrixNum); + + DestroySprite(sprite); +} + +static void sub_80F2458(u8 arg0) +{ + switch (arg0) + { + case 0: + gUnknown_083DFEC4->unk380.data = gUnknown_083DFEC4->unk388; + gUnknown_083DFEC4->unk380.size = sizeof(gUnknown_083DFEC4->unk388); + gUnknown_083DFEC4->unk380.tag = 0x0; + break; + case 1: + gUnknown_083DFEC4->unk380.data = gUnknown_083DFEC4->unk1788; + gUnknown_083DFEC4->unk380.size = sizeof(gUnknown_083DFEC4->unk1788); + gUnknown_083DFEC4->unk380.tag = 0x0; + break; + case 2: + gUnknown_083DFEC4->unk380.data = gUnknown_083DFEC4->unk2388; + gUnknown_083DFEC4->unk380.size = sizeof(gUnknown_083DFEC4->unk2388); + gUnknown_083DFEC4->unk380.tag = 0x0; + break; + default: + return; + } + + LoadSpriteSheet(&gUnknown_083DFEC4->unk380); +} + +static void sub_80F2514(u8 arg0) +{ + struct SpritePalette spritePalette; + + switch (arg0) + { + case 0: + spritePalette.data = gPokenavMenuOptions1_Pal; + spritePalette.tag = 0; + LoadSpritePalette(&spritePalette); + spritePalette.data = gPokenavMenuOptions2_Pal; + spritePalette.tag = 0x1; + break; + case 1: + spritePalette.data = gPokenavConditionMenu_Pal; + spritePalette.tag = 0x0; + break; + case 2: + spritePalette.data = gPokenavCondition6_Pal; + spritePalette.tag = 0; + LoadSpritePalette(&spritePalette); + spritePalette.data = gPokenavCondition7_Pal; + spritePalette.tag = 0x1; + break; + default: + return; + } + + LoadSpritePalette(&spritePalette); +} + +static void sub_80F2598(void) +{ + u8 spriteId; + + gUnknown_083DFEC4->unk6D9C = NULL; + if (DoesSomeoneWantRematchIn(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum) == TRUE) + { + LoadSpriteSheet(&gSpriteSheet_PokenavBlueLight); + LoadSpritePalette(&gSpritePalette_PokenavBlueLight); + spriteId = CreateSprite(&gSpriteTemplate_83E4484, 12, 96, 0); + if (spriteId != MAX_SPRITES) + { + gUnknown_083DFEC4->unk6D9C = &gSprites[spriteId]; + } + else + { + FreeSpriteTilesByTag(0x19); + FreeSpritePaletteByTag(0x11); + } + } +} + +static void sub_80F2620(void) +{ + if (gUnknown_083DFEC4->unk6D9C) + { + DestroySprite(gUnknown_083DFEC4->unk6D9C); + FreeSpriteTilesByTag(0x19); + FreeSpritePaletteByTag(0x11); + gUnknown_083DFEC4->unk6D9C = NULL; + } +} + +void sub_80F2654(struct Sprite *sprite) +{ + if (++sprite->data[0] > 6) + { + sprite->data[0] = 0; + sprite->invisible = !sprite->invisible; + } +} + +void sub_80F2688(void) +{ + gUnknown_083DFEC4->unk306 = 0; + if (!gUnknown_083DFEC4->unk6DAC) + while(sub_80F26BC()); +} + +static bool8 sub_80F26BC(void) +{ + switch (gUnknown_083DFEC4->unk306) + { + case 0: + LZ77UnCompWram(gPokenavMainMenu_Gfx, gUnknown_083DFEC4->unk3B98); + break; + case 1: + LZ77UnCompWram(gPokenavConditionMenuHeader_Gfx, gUnknown_083DFEC4->unk4198); + break; + case 2: + LZ77UnCompWram(gPokenavRibbonsHeader_Gfx, gUnknown_083DFEC4->unk4D98); + break; + case 3: + LZ77UnCompWram(gPokenavHoennMapHeader_Gfx, gUnknown_083DFEC4->unk5398); + break; + case 4: + LZ77UnCompWram(gPokenavConditionMenuOptions_Gfx, gUnknown_083DFEC4->unk5F98); + break; + case 5: + LZ77UnCompWram(gPokenavConditionMenuOptions2_Gfx, gUnknown_083DFEC4->unk6798); + break; + case 6: + LZ77UnCompWram(gPokenavTrainersEyesHeader_Gfx, gUnknown_083DFEC4->unk4798); + break; + case 7: + LoadSpritePalettes(gUnknown_083E449C); + break; + default: + return FALSE; + } + + gUnknown_083DFEC4->unk306++; + return TRUE; +} + +static void sub_80F27DC(u8 arg0) +{ + struct SpriteSheet spriteSheet; + + switch (arg0) + { + case 0: + spriteSheet.data = gUnknown_083DFEC4->unk3B98; + spriteSheet.size = sizeof(gUnknown_083DFEC4->unk3B98); + spriteSheet.tag = 0x1; + break; + case 1: + spriteSheet.data = gUnknown_083DFEC4->unk4198; + spriteSheet.size = sizeof(gUnknown_083DFEC4->unk4198); + spriteSheet.tag = 0x1; + break; + case 3: + spriteSheet.data = gUnknown_083DFEC4->unk4798; + spriteSheet.size = sizeof(gUnknown_083DFEC4->unk4798); + spriteSheet.tag = 0x1; + break; + case 2: + spriteSheet.data = gUnknown_083DFEC4->unk4D98; + spriteSheet.size = sizeof(gUnknown_083DFEC4->unk4D98); + spriteSheet.tag = 0x1; + break; + case 4: + spriteSheet.data = gUnknown_083DFEC4->unk5398; + spriteSheet.size = sizeof(gUnknown_083DFEC4->unk5398); + spriteSheet.tag = 0x1; + break; + case 5: + spriteSheet.data = gUnknown_083DFEC4->unk5F98; + spriteSheet.size = sizeof(gUnknown_083DFEC4->unk5F98); + spriteSheet.tag = 0x2; + break; + case 6: + spriteSheet.data = gUnknown_083DFEC4->unk6198; + spriteSheet.size = sizeof(gUnknown_083DFEC4->unk6198); + spriteSheet.tag = 0x2; + break; + case 8: + spriteSheet.data = gUnknown_083DFEC4->unk6398; + spriteSheet.size = sizeof(gUnknown_083DFEC4->unk6398); + spriteSheet.tag = 0x2; + break; + case 9: + spriteSheet.data = gUnknown_083DFEC4->unk6598; + spriteSheet.size = sizeof(gUnknown_083DFEC4->unk6598); + spriteSheet.tag = 0x2; + break; + case 11: + spriteSheet.data = gUnknown_083DFEC4->unk6998; + spriteSheet.size = sizeof(gUnknown_083DFEC4->unk6998); + spriteSheet.tag = 0x2; + break; + case 10: + spriteSheet.data = gUnknown_083DFEC4->unk6798; + spriteSheet.size = sizeof(gUnknown_083DFEC4->unk6798); + spriteSheet.tag = 0x2; + break; + case 7: + spriteSheet.data = gUnknown_083DFEC4->unk6B98; + spriteSheet.size = sizeof(gUnknown_083DFEC4->unk6B98); + spriteSheet.tag = 0x2; + break; + default: + return; + } + + LoadSpriteSheet(&spriteSheet); +} + +void sub_80F29B8(u8 arg0) +{ + u16 i; + s16 deltaX, endX, initialX; + u16 y; + s16 width; + struct Sprite **sprites; + const struct SpriteTemplate *spriteTemplate; + u8 spriteId; + + spriteTemplate = NULL; + switch (arg0) + { + case 0: + case 1: + case 2: + case 3: + initialX = -96; + y = 49 - gUnknown_083DFEC4->unk030C; + deltaX = 8; + endX = 32; + width = 64; + sprites = gUnknown_083DFEC4->unk3B88; + spriteTemplate = arg0 != 3 ? &gSpriteTemplate_83E44E0 : &gSpriteTemplate_83E44F8; + break; + case 4: + initialX = 272; + y = 49 - gUnknown_083DFEC4->unk030C; + deltaX = -8; + endX = 152; + width = 64; + spriteTemplate = &gSpriteTemplate_83E44E0; + sprites = gUnknown_083DFEC4->unk3B88; + break; + case 5: + case 6: + case 8: + case 9: + spriteTemplate = &gSpriteTemplate_83E4530; + // fall through + case 7: + case 10: + case 11: + if (spriteTemplate == NULL) + spriteTemplate = &gSpriteTemplate_83E4548; + + initialX = -96; + y = 68 - gUnknown_083DFEC4->unk030C; + deltaX = 8; + endX = 16; + width = 32; + sprites = gUnknown_083DFEC4->unk3B90; + break; + default: + return; + } + + for (i = 0; i < 2; i++) + { + spriteId = CreateSprite(spriteTemplate, i * width + initialX, y, 0); + if (spriteId != MAX_SPRITES) + { + gSprites[spriteId].data[0] = deltaX; + gSprites[spriteId].data[1] = endX + i * width; + gSprites[spriteId].data[2] = i; + gSprites[spriteId].data[3] = arg0; + if (arg0 == 4 && i == 1) + { + int anim = !gUnknown_083DFEC4->regionMap.zoomed ? 1 : 2; + StartSpriteAnim(&gSprites[spriteId], anim); + } + else + { + StartSpriteAnim(&gSprites[spriteId], i); + } + + if (arg0 < 4 && i == 1) + { + gSprites[spriteId].oam.shape = ST_OAM_SQUARE; + gSprites[spriteId].oam.size = 2; + } + + sprites[i] = &gSprites[spriteId]; + } + } +} + +#define sEndX sprite->data[1] +void sub_80F2BBC(struct Sprite *sprite) +{ + s16 x = sprite->pos1.x; + sprite->pos1.x += sprite->data[0]; + if ((x <= sEndX && sprite->pos1.x >= sEndX) || (x >= sEndX && sprite->pos1.x <= sEndX)) + { + sprite->pos1.x = sEndX; + if (sprite->data[3] == 4 && sprite->data[2] == 1) + sprite->callback = sub_80F2C58; + else + sprite->callback = SpriteCallbackDummy; + } +} +#undef sEndX + +static void sub_80F2C14(struct Sprite *sprite) +{ + u16 right; + + sprite->pos1.x -= sprite->data[0]; + right = sprite->pos1.x + 32; + if (right > 304) + { + if (sprite->data[2] == 1) + { + if (sprite->data[3] < 5) + FreeSpriteTilesByTag(0x1); + else + FreeSpriteTilesByTag(0x2); + } + + DestroySprite(sprite); + } +} + +static void sub_80F2C58(struct Sprite *sprite) +{ + int anim = !gUnknown_083DFEC4->regionMap.zoomed ? 1 : 2; + StartSpriteAnim(sprite, anim); +} + +void sub_80F2C80(u8 arg0) +{ + gUnknown_083DFEC4->unk306 = 0; + if (!gUnknown_083DFEC4->unk6DAC) + while (sub_80F2CBC(arg0)); +} + +bool8 sub_80F2CBC(u8 arg0) +{ + switch (gUnknown_083DFEC4->unk306) + { + case 0: + sub_80F27DC(arg0); + gUnknown_083DFEC4->unk306++; + return TRUE; + case 1: + sub_80F29B8(arg0); + gUnknown_083DFEC4->unk306++; + return FALSE; + default: + return FALSE; + } +} + +static void sub_80F2D04(u8 arg0) +{ + u16 i; + + if (arg0 < 5) + { + for (i = 0; i < 2; i++) + gUnknown_083DFEC4->unk3B88[i]->callback = sub_80F2C14; + } + else + { + for (i = 0; i < 2; i++) + gUnknown_083DFEC4->unk3B90[i]->callback = sub_80F2C14; + } +} + +static void sub_80F2D6C(u8 arg0) +{ + u16 i; + + if (arg0 < 5) + { + FreeSpriteTilesByTag(0x1); + for (i = 0; i < 2; i++) + DestroySprite(gUnknown_083DFEC4->unk3B88[i]); + } + else + { + FreeSpriteTilesByTag(0x2); + for (i = 0; i < 2; i++) + DestroySprite(gUnknown_083DFEC4->unk3B90[i]); + } +} + +static void sub_80F2DD8(void) +{ + CreateRegionMapCursor(7, 7); + CreateRegionMapPlayerIcon(8, 8); + sub_80FBF94(); +} + +static void sub_80F2DF4(void) +{ + FreeRegionMapIconResources(); +} + +void sub_80F2E00(struct Sprite *sprite) +{ + sprite->pos1.x = gUnknown_083DFEC4->unk8766 + 38; +} + +static void sub_80F2E18(u8 arg0) +{ + u8 spriteId; + struct SpriteTemplate spriteTemplate; + struct SpritePalette spritePalette; + struct SpriteSheet spriteSheet; + + if (!gUnknown_083DFEC4->unk8768) + { + spriteSheet = gUnknown_083E4568; + spriteTemplate = gSpriteTemplate_83E4570; + spritePalette = gUnknown_083E4588; + + spriteSheet.data = gUnknown_083DFEC4->unkD1E4[arg0]; + spritePalette.data = gUnknown_083DFEC4->unk0[arg0]; + gUnknown_083DFEC4->unkD1DC = LoadSpritePalette(&spritePalette); + gUnknown_083DFEC4->unkD1DE = LoadSpriteSheet(&spriteSheet); + + spriteId = CreateSprite(&spriteTemplate, 38, 104, 0); + if (spriteId == MAX_SPRITES) + { + FreeSpriteTilesByTag(0x6); + FreeSpritePaletteByTag(0x6); + gUnknown_083DFEC4->unk8768 = NULL; + } + else + { + gUnknown_083DFEC4->unk8768 = &gSprites[spriteId]; + gUnknown_083DFEC4->unkD1E0 = (void *)(VRAM + 0x10000) + gUnknown_083DFEC4->unkD1DE * 32; + gUnknown_083DFEC4->unkD1DC = gUnknown_083DFEC4->unkD1DC * 16 + 0x100; + } + } + else + { + DmaCopy16Defvars(3, gUnknown_083DFEC4->unkD1E4[arg0], gUnknown_083DFEC4->unkD1E0, 0x800); + LoadPalette(gUnknown_083DFEC4->unk0[arg0], gUnknown_083DFEC4->unkD1DC, 0x20); + } +} + +void sub_80F2F48(void) +{ + if (gUnknown_083DFEC4->unk8768) + { + DestroySprite(gUnknown_083DFEC4->unk8768); + FreeSpriteTilesByTag(0x6); + FreeSpritePaletteByTag(0x6); + gUnknown_083DFEC4->unk8768 = NULL; + } +} + +void sub_80F2F7C(u8 arg0) +{ + sub_80F2E18(arg0); + gUnknown_083DFEC4->unkCED0 = gUnknown_083DFEC4->unk8768; + gUnknown_083DFEC4->unkCED0->callback = sub_80F2FEC; +} + +static void sub_80F2FB0(void) +{ + if (gUnknown_083DFEC4->unkCED0) + { + DestroySprite(gUnknown_083DFEC4->unkCED0); + FreeSpriteTilesByTag(0x6); + FreeSpritePaletteByTag(0x6); + gUnknown_083DFEC4->unkCED0 = NULL; + gUnknown_083DFEC4->unk8768 = NULL; + } +} + +static void sub_80F2FEC(struct Sprite *sprite) +{ + sprite->pos1.x = gUnknown_083DFEC4->unkD15A + 40; + sprite->pos1.y = 104; +} + +static void sub_80F3008(u8 arg0) +{ + u16 i; + u8 spriteId; + struct SpritePalette spritePalette; + struct SpriteSheet spriteSheets[3]; + + memcpy(spriteSheets, gUnknown_083E4590, sizeof(gUnknown_083E4590)); + spritePalette = gUnknown_083E45A8; + switch (arg0) + { + case 1: + case 2: + spritePalette.data = gUnknown_08E9F988; + break; + } + + LoadSpriteSheets(spriteSheets); + LoadSpritePalette(&spritePalette); + spriteId = CreateSprite(&gSpriteTemplate_83E45B8, 95, 0, 0); + if (spriteId == MAX_SPRITES) + { + gUnknown_083DFEC4->unk87CC = NULL; + } + else + { + gUnknown_083DFEC4->unk87CC = &gSprites[spriteId]; + for (i = 0; i < 2; i++) + { + spriteId = CreateSprite(&gSpriteTemplate_83E45F0, 168, i * 128 + 8, 0); + if (spriteId != MAX_SPRITES) + { + gUnknown_083DFEC4->unk87D0[i] = &gSprites[spriteId]; + gSprites[spriteId].invisible = 1; + gSprites[spriteId].data[0] = 0; + gSprites[spriteId].data[1] = 0; + gSprites[spriteId].data[2] = i == 0 ? -1 : 1; + gSprites[spriteId].data[3] = i; + gSprites[spriteId].data[4] = 1; + StartSpriteAnim(&gSprites[spriteId], i); + } + else + { + gUnknown_083DFEC4->unk87D0[i] = NULL; + } + } + } +} + +static void sub_80F3130(void) +{ + u16 i; + + if (gUnknown_083DFEC4->unk87CC) + { + DestroySprite(gUnknown_083DFEC4->unk87CC); + FreeSpriteTilesByTag(0x9); + FreeSpritePaletteByTag(0x9); + gUnknown_083DFEC4->unk87CC = NULL; + } + + for (i = 0; i < 2; i++) + { + if (gUnknown_083DFEC4->unk87D0[i]) + { + DestroySprite(gUnknown_083DFEC4->unk87D0[i]); + gUnknown_083DFEC4->unk87D0[i] = NULL; + } + } + + FreeSpriteTilesByTag(0xA); +} + +void sub_80F3190(struct Sprite *sprite) +{ + sprite->pos1.y = gUnknown_083DFEC4->unk876C * 16 + 16; +} + +void sub_80F31AC(struct Sprite *sprite) +{ + if (gUnknown_083DFEC4->unk87C9) + { + if (sprite->data[4]) + { + if (!sprite->data[3]) + sprite->invisible = gUnknown_083DFEC4->unk8770 == 0; + else + sprite->invisible = gUnknown_083DFEC4->unk8772 == gUnknown_083DFEC4->unk8774; + + sprite->data[4] = 0; + } + + if (++sprite->data[0] > 4) + { + sprite->data[0] = 0; + if (++sprite->data[1] < 5) + { + sprite->pos2.y += sprite->data[2]; + } + else + { + sprite->data[1] = 0; + sprite->pos2.y = 0; + } + } + } +} + +static void sub_80F3264(void) +{ + u16 i; + + for (i = 0; i < 2; i++) + { + if (gUnknown_083DFEC4->unk87D0[i]) + gUnknown_083DFEC4->unk87D0[i]->data[4] = 1; + } +} + +static void sub_80F3294(u8 arg0) +{ + gUnknown_083DFEC4->unk87CC->invisible = arg0; + if (gUnknown_083DFEC4->unk87C9) + { + if (arg0 == 1) + { + gUnknown_083DFEC4->unk87D0[0]->invisible = arg0; + gUnknown_083DFEC4->unk87D0[1]->invisible = arg0; + } + else + { + gUnknown_083DFEC4->unk87D0[0]->data[4] = 1; + gUnknown_083DFEC4->unk87D0[1]->data[4] = 1; + } + } +} + +void sub_80F3328(struct Sprite *sprite) +{ + if (sprite->data[0] == gUnknown_083DFEC4->unk87DC) + StartSpriteAnim(sprite, 0); + else + StartSpriteAnim(sprite, 1); +} + +static void sub_80F3360(struct Sprite *sprite) +{ + if (gUnknown_083DFEC4->unk87DC == gUnknown_083DFEC4->unk87DA - 1) + sprite->oam.paletteNum = IndexOfSpritePaletteTag(0x4); + else + sprite->oam.paletteNum = IndexOfSpritePaletteTag(0x5); +} + +void sub_80F33A8(void) +{ + u16 i; + u8 spriteId; + struct SpriteSheet spriteSheets[4]; + struct SpritePalette spritePalettes[3]; + struct SpriteTemplate spriteTemplate; + + memcpy(spriteSheets, gUnknown_083E4628, sizeof(gUnknown_083E4628)); + memcpy(spritePalettes, gUnknown_083E4648, sizeof(gUnknown_083E4648)); + spriteTemplate = gSpriteTemplate_83E4660; + LoadSpriteSheets(spriteSheets); + LoadSpritePalettes(spritePalettes); + + for (i = 0; i < gUnknown_083DFEC4->unk87DA - 1; i++) + { + spriteId = CreateSprite(&spriteTemplate, 226, i * 20 + 8, 0); + if (spriteId != MAX_SPRITES) + { + gUnknown_083DFEC4->unk87E4[i] = &gSprites[spriteId]; + gUnknown_083DFEC4->unk87E4[i]->data[0] = i; + } + else + { + gUnknown_083DFEC4->unk87E4[i] = NULL; + } + } + + spriteTemplate.tileTag = 0x4; + spriteTemplate.callback = SpriteCallbackDummy; + for (; i < 6; i++) + { + spriteId = CreateSprite(&spriteTemplate, 230, i * 20 + 8, 0); + if (spriteId != MAX_SPRITES) + { + gUnknown_083DFEC4->unk87E4[i] = &gSprites[spriteId]; + gUnknown_083DFEC4->unk87E4[i]->oam.size = 0; + } + else + { + gUnknown_083DFEC4->unk87E4[i] = NULL; + } + } + + spriteTemplate.tileTag = 0x5; + spriteTemplate.callback = sub_80F3360; + spriteId = CreateSprite(&spriteTemplate, 222, i * 20 + 8, 0); + if (spriteId != MAX_SPRITES) + { + gUnknown_083DFEC4->unk87E4[i] = &gSprites[spriteId]; + gUnknown_083DFEC4->unk87E4[i]->oam.shape = ST_OAM_H_RECTANGLE; + gUnknown_083DFEC4->unk87E4[i]->oam.size = 2; + } + else + { + gUnknown_083DFEC4->unk87E4[i] = NULL; + } +} + +void sub_80F357C(void) +{ + u16 i; + + for (i = 0; i < 7; i++) + { + if (gUnknown_083DFEC4->unk87E4[i]) + { + DestroySprite(gUnknown_083DFEC4->unk87E4[i]); + gUnknown_083DFEC4->unk87E4[i] = NULL; + } + } +} + +static void sub_80F35B4(void) +{ + struct Sprite *sprite; + + gUnknown_083DFEC4->unk76B0.baseTileTag = 0x1C; + gUnknown_083DFEC4->unk76B0.basePaletteTag = 0x13; + sub_80F727C(&gUnknown_083DFEC4->unk76B0); + sub_80F7404(); + sprite = sub_80F7920(27, 21, gUnknown_083E4678); + sprite->oam.priority = 3; + sprite->pos1.x = 192; + sprite->pos1.y = 32; + sprite->callback = sub_80F363C; + gUnknown_083DFEC4->unk76AC = sprite; +} + +void sub_80F3614(void) +{ + DestroySprite(gUnknown_083DFEC4->unk76AC); + FreeSpriteTilesByTag(0x1B); + FreeSpritePaletteByTag(0x15); +} + +static void sub_80F363C(struct Sprite *sprite) +{ + StartSpriteAnim(sprite, gUnknown_083DFEC4->unk8934[gUnknown_083DFEC4->unk8fe9]); +} + +void sub_80F3668(void) +{ + sub_80F7418(gUnknown_083DFEC4->unk8934[gUnknown_083DFEC4->unk8fe9], 176, 32); +} + +void sub_80F3698(void) +{ + struct UnkUsePokeblockSub *var0 = &gUnknown_083DFEC4->unk893c[gUnknown_083DFEC4->unk87DC]; + gUnknown_083DFEC4->unk8934[gUnknown_083DFEC4->unk8fe9] = gUnknown_083DFEC4->unk76B0.markings; + SetMonMarkings(var0->unk1, var0->partyIdx, gUnknown_083DFEC4->unk76B0.markings); + sub_80F7470(); +} + +static void sub_80F36F0(void) +{ + gUnknown_083DFEC4->unk306 = 0; + if (!gUnknown_083DFEC4->unk6DAC) + while (sub_80F3724()); +} + +static bool8 sub_80F3724(void) +{ + switch (gUnknown_083DFEC4->unk306) + { + case 0: + LZ77UnCompWram(gUnknown_083E3D00, gUnknown_083DFEC4->unk984C); + break; + case 1: + sub_80F379C(); + gUnknown_083DFEC4->unk306++; + // fall through + case 2: + if (sub_80F37D0()) + return TRUE; + break; + default: + return FALSE; + } + + gUnknown_083DFEC4->unk306++; + return TRUE; +} + +static void sub_80F379C(void) +{ + gUnknown_083DFEC4->unkBC93 = 0; + if (!gUnknown_083DFEC4->unk6DAC) + while (sub_80F37D0()); +} + +static bool8 sub_80F37D0(void) +{ + u16 i; + u8 j, k, l, m; + + if (gUnknown_083DFEC4->unkBC93 > 11) + return FALSE; + + for (i = 0; i < 2; i++) + { + u8 *r4 = &gUnknown_083DFEC4->unk984C[gUnknown_083DFEC4->unkBC93][0]; + u8 *r5 = &gUnknown_083DFEC4->unkA44C[gUnknown_083DFEC4->unkBC93][0]; + for (j = 0; j < 4; j++) + { + CpuFastSet(r4, r5, 0x10); + r5 += 0x40; + r4 += 0x20; + for (k = 0; k < 2; k++) + { + for (l = 0; l < 8; l++) + { + r4 += 4; + for (m = 0; m < 4; m++) + { + r4 -= 1; + *r5 = (*r4 << 4) | ((*r4 >> 4) & 0xF); + r5++; + } + + r4 += 4; + } + + r4 -= 0x40; + } + + r4 += 0x60; + } + + if (++gUnknown_083DFEC4->unkBC93 > 11) + return FALSE; + } + + if (gUnknown_083DFEC4->unkBC93 > 11) + return FALSE; + + return TRUE; +} + +static void sub_80F38B8(void) +{ + gUnknown_083DFEC4->unk306 = 0; + if (!gUnknown_083DFEC4->unk6DAC) + while (sub_80F38EC()); +} + +static bool8 sub_80F38EC(void) +{ + switch (gUnknown_083DFEC4->unk306) + { + case 0: + gUnknown_083DFEC4->unk9348 = NULL; + gUnknown_083DFEC4->unkBC92 = 0; + break; + case 1: + sub_80F2E18(0); + break; + case 2: + sub_80F3970(); + gUnknown_083DFEC4->unk306++; + // fall through + case 3: + if (sub_80F39A4()) + return TRUE; + break; + default: + return FALSE; + } + + gUnknown_083DFEC4->unk306++; + return TRUE; +} + +static void sub_80F3970(void) +{ + gUnknown_083DFEC4->unkBC93 = 0; + if (!gUnknown_083DFEC4->unk6DAC) + while (sub_80F39A4()); +} + +static bool8 sub_80F39A4(void) +{ + struct SpriteSheet spriteSheet; + struct SpritePalette spritePalette; + if (gUnknown_083DFEC4->unkBC93 > 11) + return FALSE; + + spriteSheet.data = &gUnknown_083DFEC4->unkA44C[gUnknown_083DFEC4->unkBC93][0]; + spriteSheet.size = 0x200; + spriteSheet.tag = gUnknown_083DFEC4->unkBC93 + 11; + LoadSpriteSheet(&spriteSheet); + if (gUnknown_083DFEC4->unkBC93 < 5) + { + spritePalette.data = gUnknown_083E3C60[gUnknown_083DFEC4->unkBC93]; + spritePalette.tag = gUnknown_083DFEC4->unkBC93 + 10; + LoadSpritePalette(&spritePalette); + } + + if (++gUnknown_083DFEC4->unkBC93 > 11) + return FALSE; + + return TRUE; +} + +static struct Sprite *sub_80F3A3C(u16 arg0, u16 arg1) +{ + struct SpriteTemplate spriteTemplate; + u16 var0; + u8 ribbon; + u8 spriteId; + + if (arg1 < 3) + var0 = arg0 + arg1 * 9; + else + var0 = arg0 + (gUnknown_083DFEC4->unkBC8E - gUnknown_083DFEC4->unkBC8F); + + ribbon = gUnknown_083DFEC4->unkBC4C[var0]; + spriteTemplate = gSpriteTemplate_83E476C; + spriteTemplate.tileTag = gPokenavRibbonsIconGfx[ribbon][0] + 11; + spriteTemplate.paletteTag = gPokenavRibbonsIconGfx[ribbon][1] + 10; + spriteId = CreateSprite(&spriteTemplate, arg0 * 16 + 96, arg1 * 16 + 40, 2); + if (spriteId != MAX_SPRITES) + return &gSprites[spriteId]; + else + return NULL; +} + +static void sub_80F3B00(void) +{ + gUnknown_083DFEC4->unk9348 = sub_80F3A3C(gUnknown_083DFEC4->unkBC90, gUnknown_083DFEC4->unkBC91); + if (gUnknown_083DFEC4->unk9348) + { + StartSpriteAffineAnim(gUnknown_083DFEC4->unk9348, 1); + gUnknown_083DFEC4->unkBC92 = 1; + } + else + { + gUnknown_083DFEC4->unkBC92 = 0; + } +} + +static bool8 sub_80F3B58(void) +{ + if (gUnknown_083DFEC4->unkBC92) + { + gUnknown_083DFEC4->unkBC92 = !gUnknown_083DFEC4->unk9348->affineAnimEnded; + return gUnknown_083DFEC4->unkBC92; + } + else + { + return FALSE; + } +} + +static void sub_80F3B94(void) +{ + if (gUnknown_083DFEC4->unk9348) + { + StartSpriteAffineAnim(gUnknown_083DFEC4->unk9348, 2); + gUnknown_083DFEC4->unkBC92 = 1; + } + else + { + gUnknown_083DFEC4->unkBC92 = 0; + } +} + +static bool8 sub_80F3BD4(void) +{ + if (gUnknown_083DFEC4->unkBC92) + { + gUnknown_083DFEC4->unkBC92 = !gUnknown_083DFEC4->unk9348->affineAnimEnded; + if (!gUnknown_083DFEC4->unkBC92) + { + FreeOamMatrix(gUnknown_083DFEC4->unk9348->oam.matrixNum); + DestroySprite(gUnknown_083DFEC4->unk9348); + gUnknown_083DFEC4->unk9348 = NULL; + } + + return gUnknown_083DFEC4->unkBC92; + } + else + { + return FALSE; + } +} + +static void sub_80F3C2C(void) +{ + u16 i; + + if (gUnknown_083DFEC4->unk9348) + { + FreeOamMatrix(gUnknown_083DFEC4->unk9348->oam.matrixNum); + DestroySprite(gUnknown_083DFEC4->unk9348); + gUnknown_083DFEC4->unk9348 = NULL; + } + + for (i = 0; i < 12; i++) + FreeSpriteTilesByTag(i + 0xB); + + for (i = 0; i < 5; i++) + FreeSpritePaletteByTag(i + 0xA); + + sub_80F2F48(); +} + +void sub_80F3C94(void) +{ + u16 i; + struct SpriteSheet spriteSheet; + struct SpritePalette spritePalette; + + spriteSheet = gUnknown_083E4784; + spritePalette = gUnknown_083E478C; + LoadSpriteSheet(&spriteSheet); + LoadSpritePalette(&spritePalette); + for (i = 0; i < 10; i++) + gUnknown_083DFEC4->unk8800[i] = NULL; +} + +void sub_80F3CE8(void) +{ + move_anim_execute(); + FreeSpriteTilesByTag(0x17); + FreeSpritePaletteByTag(0xF); +} + +void sub_80F3D00(void) +{ + u8 spriteId; + u16 i; + u8 var1; + struct UnkUsePokeblockSub *var0 = &gUnknown_083DFEC4->unk893c[gUnknown_083DFEC4->unk87DC]; + + if (!var0->unk4) + return; + + var1 = gUnknown_083DFEC4->unk8931[gUnknown_083DFEC4->unk8fe9]; + for (i = 0; i < var1 + 1; i++) + { + spriteId = CreateSprite(&gSpriteTemplate_83E4800, 0, 0, 0); + if (spriteId != MAX_SPRITES) + { + gUnknown_083DFEC4->unk8800[i] = &gSprites[spriteId]; + gUnknown_083DFEC4->unk8800[i]->invisible = 1; + } + else + { + break; + } + } + + sub_80F3F20(var1, 1); +} + +void move_anim_execute(void) +{ + u16 i; + + for (i = 0; i < 10; i++) + { + if (!gUnknown_083DFEC4->unk8800[i]) + return; + + DestroySprite(gUnknown_083DFEC4->unk8800[i]); + gUnknown_083DFEC4->unk8800[i] = NULL; + } +} + +void sub_80F3DDC(struct Sprite *sprite) +{ + if (++sprite->data[1] > 60) + { + sprite->data[1] = 0; + sub_80F3F20(sprite->data[2], 0); + } +} + +static void sub_80F3E04(struct Sprite *sprite) +{ + if (sprite->animEnded) + { + sprite->data[1] = 0; + sprite->callback = sub_80F3DDC; + } +} + +static void sub_80F3E24(struct Sprite *sprite) +{ + if (gUnknown_083DFEC4->unk8768) + { + sprite->pos1.x = gUnknown_083DFEC4->unk8768->pos1.x + + gUnknown_083DFEC4->unk8768->pos2.x + + gUnknown_083E4794[sprite->data[0]][0]; + sprite->pos1.y = gUnknown_083DFEC4->unk8768->pos1.y + + gUnknown_083DFEC4->unk8768->pos2.y + + gUnknown_083E4794[sprite->data[0]][1]; + } + else + { + sprite->pos1.x = gUnknown_083E4794[sprite->data[0]][0] + 40; + sprite->pos1.y = gUnknown_083E4794[sprite->data[0]][1] + 104; + } +} + +static void sub_80F3E9C(struct Sprite *sprite) +{ + if (sprite->data[1]) + { + if (--sprite->data[1]) + return; + + SeekSpriteAnim(sprite, 0); + sprite->invisible = 0; + } + + sub_80F3E24(sprite); + if (sprite->animEnded) + { + sprite->invisible = 1; + if (sprite->data[3] == sprite->data[2]) + { + if (sprite->data[3] == 9) + { + sub_80F3FAC(); + sprite->callback = sub_80F3E04; + } + else + { + sprite->callback = sub_80F3DDC; + } + } + else + { + sprite->callback = SpriteCallbackDummy; + } + } +} + +static void sub_80F3F20(u8 arg0, u8 arg1) +{ + u16 i; + + for (i = 0; i < 10; i++) + { + if (gUnknown_083DFEC4->unk8800[i]) + { + gUnknown_083DFEC4->unk8800[i]->data[0] = i; + gUnknown_083DFEC4->unk8800[i]->data[1] = i * 16 + 1; + gUnknown_083DFEC4->unk8800[i]->data[2] = arg0; + gUnknown_083DFEC4->unk8800[i]->data[3] = i; + + if (!arg1 || arg0 != 9) + { + gUnknown_083DFEC4->unk8800[i]->callback = sub_80F3E9C; + } + else + { + sub_80F3E24(gUnknown_083DFEC4->unk8800[i]); + sub_80F3FAC(); + gUnknown_083DFEC4->unk8800[i]->callback = sub_80F3E04; + gUnknown_083DFEC4->unk8800[i]->invisible = 0; + } + } + } +} + +static void sub_80F3FAC(void) +{ + u16 i; + + for (i = 0; i < 10; i++) + { + if (gUnknown_083DFEC4->unk8800[i]) + { + SeekSpriteAnim(gUnknown_083DFEC4->unk8800[i], 0); + gUnknown_083DFEC4->unk8800[i]->invisible = 0; + } + } +} + +static void sub_80F3FF0(void) +{ + gUnknown_083DFEC4->unk306 = 0; + if (!gUnknown_083DFEC4->unk6DAC) + while (sub_80F4024()); +} + +static bool8 sub_80F4024(void) +{ + u8 paletteIndex; + u8 spriteId; + struct SpritePalette spritePalette; + + switch (gUnknown_083DFEC4->unk306) + { + case 0: + LZ77UnCompWram(gUnknown_083E329C, gUnknown_083DFEC4->unk131E4); + break; + case 1: + { + struct SpriteSheet spriteSheet = { + .data = gUnknown_083DFEC4->unk131E4, + .size = sizeof(gUnknown_083DFEC4->unk131E4), + .tag = 0x18, + }; + LoadSpriteSheet(&spriteSheet); + break; + } + case 2: + spritePalette = gUnknown_083E4818; + LoadSpritePalette(&spritePalette); + paletteIndex = IndexOfSpritePaletteTag(0x10); + gUnknown_083DFEC4->unk308 = -3 & ~(1 << (paletteIndex + 0x10)); + break; + case 3: + spriteId = CreateSprite(&gSpriteTemplate_83E4850, 218, 14, 0); + if (spriteId != MAX_SPRITES) + { + gUnknown_083DFEC4->unk6D98 = &gSprites[spriteId]; + gUnknown_083DFEC4->unk6D98->data[0] = 0; + } + else + { + gUnknown_083DFEC4->unk6D98 = NULL; + } + + gUnknown_083DFEC4->unk306++; + return FALSE; + default: + return FALSE; + } + + gUnknown_083DFEC4->unk306++; + return TRUE; +} + +void sub_80F4138(struct Sprite *sprite) +{ + sprite->pos2.y = -gUnknown_083DFEC4->unk030C; + if (sprite->pos2.y <= -32) + { + if (sprite->data[0] == 0) + { + sprite->invisible = 1; + sprite->data[0] = 1; + } + } + else + { + if (sprite->data[0] == 1) + { + sprite->invisible = 0; + sprite->data[0] = 0; + } + } +} + +#ifdef NONMATCHING +// close, but the last DmaCopy16 is sharing the 0x400 value from the beginning of the function. +void sub_80F4194(u8 *arg0, u8 *text) +{ + u8 i; + u8 *tileBuffer; + u32 *tileBuf2; + + tileBuffer = gUnknown_083DFEC8; + DmaFill16(3, 0x1111, tileBuffer, 0x280); + DmaFill16Defvars(3, 0x1111, 0x400 + tileBuffer, 0x280); + Text_InitWindow8004E3C(&gWindowTemplate_81E70F0, tileBuffer, text); + + DmaClear16(3, tileBuffer + 0x220, 0x60); + DmaClear16(3, tileBuffer + 0x620, 0x60); + + tileBuf2 = (int *)tileBuffer + 0x80; + tileBuf2[0] &= 0x0FFFFFFF; + tileBuf2[1] &= 0x0FFFFFFF; + tileBuf2[2] &= 0x0FFFFFFF; + tileBuf2[3] &= 0x0FFFFFFF; + tileBuf2[4] &= 0x0FFFFFFF; + tileBuf2[5] &= 0x0FFFFFFF; + tileBuf2[6] &= 0x0FFFFFFF; + tileBuf2[7] &= 0x0FFFFFFF; + + tileBuf2 = (int *)tileBuffer + 0x180; + tileBuf2[0] &= 0x0FFFFFFF; + tileBuf2[1] &= 0x0FFFFFFF; + tileBuf2[2] &= 0x0FFFFFFF; + tileBuf2[3] &= 0x0FFFFFFF; + tileBuf2[4] &= 0x0FFFFFFF; + tileBuf2[5] &= 0x0FFFFFFF; + tileBuf2[6] &= 0x0FFFFFFF; + tileBuf2[7] &= 0x0FFFFFFF; + + for (i = 0; i < 5; i++) + { + DmaCopy16(3, &tileBuffer[128 * i], &arg0[i * 256], 128); + DmaCopy16(3, &tileBuffer[128 * i + 0x400], &arg0[32 * ((i * 8) + 4)], 128); + } +} +#else +NAKED +void sub_80F4194(u8 *arg0, u8 *text) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + sub sp, 0x4\n\ + adds r7, r0, 0\n\ + adds r2, r1, 0\n\ + ldr r0, _080F42A4 @ =gUnknown_083DFEC8\n\ + ldr r6, [r0] @ r6 = tileBuffer\n\ + mov r0, sp \n\ + ldr r1, _080F42A8 @ =0x00001111\n\ + adds r5, r1, 0\n\ + strh r5, [r0]\n\ + ldr r4, _080F42AC @ =0x040000d4\n\ + str r0, [r4]\n\ + str r6, [r4, 0x4]\n\ + ldr r3, _080F42B0 @ =0x81000140\n\ + str r3, [r4, 0x8]\n\ + ldr r0, [r4, 0x8]\n\ + movs r0, 0x80\n\ + lsls r0, 3\n\ + adds r1, r6, r0\n\ + mov r0, sp\n\ + strh r5, [r0]\n\ + str r0, [r4]\n\ + str r1, [r4, 0x4]\n\ + str r3, [r4, 0x8]\n\ + ldr r0, [r4, 0x8]\n\ + ldr r0, _080F42B4 @ =gWindowTemplate_81E70F0\n\ + adds r1, r6, 0\n\ + bl Text_InitWindow8004E3C\n\ + movs r3, 0x88\n\ + lsls r3, 2\n\ + adds r1, r6, r3\n\ + mov r0, sp\n\ + movs r3, 0\n\ + strh r3, [r0]\n\ + str r0, [r4]\n\ + str r1, [r4, 0x4]\n\ + ldr r2, _080F42B8 @ =0x81000030\n\ + str r2, [r4, 0x8]\n\ + ldr r0, [r4, 0x8]\n\ + movs r0, 0xC4\n\ + lsls r0, 3\n\ + adds r1, r6, r0\n\ + mov r0, sp\n\ + strh r3, [r0]\n\ + str r0, [r4]\n\ + str r1, [r4, 0x4]\n\ + str r2, [r4, 0x8]\n\ + ldr r0, [r4, 0x8]\n\ + movs r1, 0x80\n\ + lsls r1, 2\n\ + adds r2, r6, r1\n\ + ldr r0, [r2]\n\ + ldr r1, _080F42BC @ =0x0fffffff\n\ + ands r0, r1\n\ + str r0, [r2]\n\ + ldr r0, [r2, 0x4]\n\ + ands r0, r1\n\ + str r0, [r2, 0x4]\n\ + ldr r0, [r2, 0x8]\n\ + ands r0, r1\n\ + str r0, [r2, 0x8]\n\ + ldr r0, [r2, 0xC]\n\ + ands r0, r1\n\ + str r0, [r2, 0xC]\n\ + ldr r0, [r2, 0x10]\n\ + ands r0, r1\n\ + str r0, [r2, 0x10]\n\ + ldr r0, [r2, 0x14]\n\ + ands r0, r1\n\ + str r0, [r2, 0x14]\n\ + ldr r0, [r2, 0x18]\n\ + ands r0, r1\n\ + str r0, [r2, 0x18]\n\ + ldr r0, [r2, 0x1C]\n\ + ands r0, r1\n\ + str r0, [r2, 0x1C]\n\ + movs r3, 0xC0\n\ + lsls r3, 3\n\ + adds r2, r6, r3\n\ + ldr r0, [r2]\n\ + ands r0, r1\n\ + str r0, [r2]\n\ + ldr r0, [r2, 0x4]\n\ + ands r0, r1\n\ + str r0, [r2, 0x4]\n\ + ldr r0, [r2, 0x8]\n\ + ands r0, r1\n\ + str r0, [r2, 0x8]\n\ + ldr r0, [r2, 0xC]\n\ + ands r0, r1\n\ + str r0, [r2, 0xC]\n\ + ldr r0, [r2, 0x10]\n\ + ands r0, r1\n\ + str r0, [r2, 0x10]\n\ + ldr r0, [r2, 0x14]\n\ + ands r0, r1\n\ + str r0, [r2, 0x14]\n\ + ldr r0, [r2, 0x18]\n\ + ands r0, r1\n\ + str r0, [r2, 0x18]\n\ + ldr r0, [r2, 0x1C]\n\ + ands r0, r1\n\ + str r0, [r2, 0x1C]\n\ + movs r1, 0\n\ + ldr r2, _080F42C0 @ =0x80000040\n\ +_080F4268:\n\ + lsls r0, r1, 7\n\ + adds r0, r6, r0\n\ + str r0, [r4]\n\ + lsls r0, r1, 8\n\ + adds r0, r7, r0\n\ + str r0, [r4, 0x4]\n\ + str r2, [r4, 0x8]\n\ + ldr r0, [r4, 0x8]\n\ + lsls r0, r1, 7\n\ + movs r3, 0x80\n\ + lsls r3, 3\n\ + adds r0, r3\n\ + adds r0, r6, r0\n\ + str r0, [r4]\n\ + lsls r0, r1, 3\n\ + adds r0, 0x4\n\ + lsls r0, 5\n\ + adds r0, r7, r0\n\ + str r0, [r4, 0x4]\n\ + str r2, [r4, 0x8]\n\ + ldr r0, [r4, 0x8]\n\ + adds r0, r1, 0x1\n\ + lsls r0, 24\n\ + lsrs r1, r0, 24\n\ + cmp r1, 0x4\n\ + bls _080F4268\n\ + add sp, 0x4\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080F42A4: .4byte gUnknown_083DFEC8\n\ +_080F42A8: .4byte 0x00001111\n\ +_080F42AC: .4byte 0x040000d4\n\ +_080F42B0: .4byte 0x81000140\n\ +_080F42B4: .4byte gWindowTemplate_81E70F0\n\ +_080F42B8: .4byte 0x81000030\n\ +_080F42BC: .4byte 0x0fffffff\n\ +_080F42C0: .4byte 0x80000040\n\ + .syntax divided\n"); +} +#endif // NONMATCHING + +static void sub_80F42C4(u8 *arg0) +{ + u16 i, tileOffset; + u8 spriteId; + struct SpriteSheet spriteSheet = { + .data = gUnknown_083DFEC4->unkD1E4[0], + .size = 0x500, + .tag = 0x1A, + }; + + sub_80F4194(gUnknown_083DFEC4->unkD1E4[0], arg0); + LoadSpriteSheet(&spriteSheet); + LoadSpritePalette(&gUnknown_083E4868); + + tileOffset = 0; + for (i = 0; i < 5; i++) + { + spriteId = CreateSprite(&gSpriteTemplate_83E4878, i * 32 + 113, 16, 0); + if (spriteId != MAX_SPRITES) + { + gSprites[spriteId].oam.tileNum += tileOffset; + gUnknown_083DFEC4->unkCED4[i] = &gSprites[spriteId]; + } + else + { + gUnknown_083DFEC4->unkCED4[i] = NULL; + } + + tileOffset += 8; + } +} + +static void sub_80F4394(void) +{ + u16 i; + + for (i = 0; i < 5; i++) + { + if (gUnknown_083DFEC4->unkCED4[i]) + DestroySprite(gUnknown_083DFEC4->unkCED4[i]); + } + + FreeSpriteTilesByTag(0x1A); + FreeSpritePaletteByTag(0x12); +} + +void sub_80F43D4(u8 *arg0) +{ + u16 tile; + + sub_80F4194(gUnknown_083DFEC4->unkD1E4[0], arg0); + tile = GetSpriteTileStartByTag(0x1A); + if (tile != 0xFFFF) + DmaCopy32Defvars(3, gUnknown_083DFEC4->unkD1E4[0], (void *)(VRAM + 0x10000 + (tile * 32)), 0x500); +} + +static u8 *sub_80F4428(u8 *arg0, u16 arg1, u8 arg2) +{ + return sub_80F6514(arg0, arg1, arg2); +} + +static u8 *sub_80F443C(u8 *arg0, u16 arg1) +{ + return AlignInt1InMenuWindow(StringCopy(arg0, gOtherText_Number), arg1, 56, 1); +} + +static u8 *sub_80F445C(u8 *arg0, u16 arg1) +{ + u8 *buffer = AlignInt1InMenuWindow(arg0, arg1, 23, 1); + buffer[0] = EXT_CTRL_CODE_BEGIN; + buffer[1] = 0x11; + buffer[2] = 1; + buffer += 3; + buffer[0] = CHAR_SLASH; + buffer += 1; + buffer[0] = EXT_CTRL_CODE_BEGIN; + buffer[1] = 0x11; + buffer[2] = 1; + buffer += 3; + buffer = AlignInt1InMenuWindow(buffer, gUnknown_083DFEC4->unk8774 + 1, 50, 1); + return buffer; +} + +u32 sub_80F44B0(u16 box, u16 monIndex, int monDataField, int *text) +{ + if (box == 14) + { + if (monDataField == MON_DATA_NICKNAME || monDataField == MON_DATA_OT_NAME) + return GetMonData(&gPlayerParty[monIndex], monDataField, text); + else + return GetMonData(&gPlayerParty[monIndex], monDataField); + } + else + { + if (monDataField == MON_DATA_NICKNAME || monDataField == MON_DATA_OT_NAME) + return GetBoxMonData(&gPokemonStorage.boxes[box][monIndex], monDataField, text); + else + return GetBoxMonData(&gPokemonStorage.boxes[box][monIndex], monDataField); + } +} + +static void SetMonMarkings(u16 box, u16 monIndex, u8 markings) +{ + if (box == 14) + SetMonData(&gPlayerParty[monIndex], MON_DATA_MARKINGS, &markings); + else + SetBoxMonData(&gPokemonStorage.boxes[box][monIndex], MON_DATA_MARKINGS, &markings); +} + +static void sub_80F45A0(s16 arg0, u8 arg1) +{ + u8 box; + u8 var0 = gUnknown_083DFEC4->unk893c[arg0].unk4; + if (var0) + { + sub_80F4428(gUnknown_083DFEC4->unk8829[arg1], arg0, 0); + box = gUnknown_083DFEC4->unk893c[arg0].unk1; + if (box == 14) + AlignStringInMenuWindow(gUnknown_083DFEC4->unk88E9[arg1], gOtherText_InParty, 64, 0); + else + AlignStringInMenuWindow(gUnknown_083DFEC4->unk88E9[arg1], gPokemonStorage.boxNames[box], 64, 0); + + gUnknown_083DFEC4->unk8937[arg1] = 1; + } + else + { + AlignStringInMenuWindow(gUnknown_083DFEC4->unk8829[arg1], gEmptyString_81E72B0, 104, 0); + AlignStringInMenuWindow(gUnknown_083DFEC4->unk88E9[arg1], gEmptyString_81E72B0, 64, 0); + gUnknown_083DFEC4->unk8937[arg1] = var0; + } +} + +static void sub_80F468C(s16 arg0, u8 arg1) +{ + u16 i; + u16 box; + u16 monIndex; + + if (gUnknown_083DFEC4->unk893c[arg0].unk4) + { + box = gUnknown_083DFEC4->unk893c[arg0].unk1; + monIndex = gUnknown_083DFEC4->unk893c[arg0].partyIdx; + gUnknown_083DFEC4->unk8ff0[arg1][0] = sub_80F44B0(box, monIndex, MON_DATA_COOL, NULL); + gUnknown_083DFEC4->unk8ff0[arg1][1] = sub_80F44B0(box, monIndex, MON_DATA_TOUGH, NULL); + gUnknown_083DFEC4->unk8ff0[arg1][2] = sub_80F44B0(box, monIndex, MON_DATA_SMART, NULL); + gUnknown_083DFEC4->unk8ff0[arg1][3] = sub_80F44B0(box, monIndex, MON_DATA_CUTE, NULL); + gUnknown_083DFEC4->unk8ff0[arg1][4] = sub_80F44B0(box, monIndex, MON_DATA_BEAUTY, NULL); + + gUnknown_083DFEC4->unk8931[arg1] = sub_80F44B0(box, monIndex, MON_DATA_SHEEN, NULL) != 255 + ? sub_80F44B0(box, monIndex, MON_DATA_SHEEN, NULL) / 29 + : 9; + + gUnknown_083DFEC4->unk8934[arg1] = sub_80F44B0(box, monIndex, MON_DATA_MARKINGS, NULL); + sub_80F55AC(gUnknown_083DFEC4->unk8ff0[arg1], gUnknown_083DFEC4->unk9004[arg1]); + } + else + { + for (i = 0; i < 5; i++) + { + gUnknown_083DFEC4->unk8ff0[arg1][i] = 0; + gUnknown_083DFEC4->unk9004[arg1][i].unk0 = 0x9B; + gUnknown_083DFEC4->unk9004[arg1][i].unk2 = 0x5B; + } + } +} + +static void sub_80F4824(s16 arg0, u8 arg1) +{ + u16 species; + u32 otId; + u32 personality; + u16 box; + u16 monIndex; + + if (gUnknown_083DFEC4->unk893c[arg0].unk4) + { + box = gUnknown_083DFEC4->unk893c[arg0].unk1; + monIndex = gUnknown_083DFEC4->unk893c[arg0].partyIdx; + species = sub_80F44B0(box, monIndex, MON_DATA_SPECIES2, NULL); + otId = sub_80F44B0(box, monIndex, MON_DATA_OT_ID, NULL); + personality = sub_80F44B0(box, monIndex, MON_DATA_PERSONALITY, NULL); + + HandleLoadSpecialPokePic( + &gMonFrontPicTable[species], + gMonFrontPicCoords[species].coords, + 1, + (intptr_t)gUnknown_083DFEC4->unk131E4, + gUnknown_083DFEC4->unkD1E4[arg1], + species, + personality); + + LZ77UnCompWram(GetMonSpritePalFromOtIdPersonality(species, otId, personality), gUnknown_083DFEC4->unk0[arg1]); + gUnknown_083DFEC4->unkD1D6[arg1] = species; + } +} + +void sub_80F4900(s16 arg0, u8 arg1) +{ + sub_80F45A0(arg0, arg1); + sub_80F468C(arg0, arg1); + sub_80F4824(arg0, arg1); +} + +void sub_80F492C(void) +{ + gUnknown_083DFEC4->unk8FE4 = 0; +} + +#ifdef NONMATCHING +// registers r3/r4 are swapped +void sub_80F4944(struct UnkUsePokeblockSub *arg0) +{ + u16 i; + u16 r3; + u16 r4; + + i = 0; + r4 = gUnknown_083DFEC4->unk8FE4; + r3 = r4 / 2; + while (r3 != r4) + { + if (arg0->unk0 > gUnknown_083DFEC4->unk893c[r3].unk0) + r4 = r3; + else + i = r3 + 1; + + r3 = ((r4 - i) / 2) + i; + } + + r4 = gUnknown_083DFEC4->unk8FE4; + while (r4 > r3) + { + gUnknown_083DFEC4->unk893c[r4] = gUnknown_083DFEC4->unk893c[r4 - 1]; + r4--; + } + + gUnknown_083DFEC4->unk893c[r3] = *arg0; + gUnknown_083DFEC4->unk8FE4++; +} +#else +NAKED +void sub_80F4944(struct UnkUsePokeblockSub *arg0) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r8\n\ + push {r7}\n\ + mov r12, r0\n\ + movs r2, 0\n\ + ldr r1, _080F4978 @ =gUnknown_083DFEC4\n\ + ldr r5, [r1]\n\ + ldr r3, _080F497C @ =0x00008fe4\n\ + adds r0, r5, r3\n\ + ldrh r4, [r0]\n\ + lsrs r3, r4, 1\n\ + mov r8, r1\n\ + cmp r4, r3\n\ + beq _080F499C\n\ + adds r6, r5, 0\n\ + mov r0, r12\n\ + ldrb r5, [r0]\n\ + ldr r7, _080F4980 @ =0x0000893c\n\ +_080F4968:\n\ + lsls r0, r3, 2\n\ + adds r0, r6, r0\n\ + adds r0, r7\n\ + ldrb r0, [r0]\n\ + cmp r5, r0\n\ + bls _080F4984\n\ + adds r4, r3, 0\n\ + b _080F498A\n\ + .align 2, 0\n\ +_080F4978: .4byte gUnknown_083DFEC4\n\ +_080F497C: .4byte 0x00008fe4\n\ +_080F4980: .4byte 0x0000893c\n\ +_080F4984:\n\ + adds r0, r3, 0x1\n\ + lsls r0, 16\n\ + lsrs r2, r0, 16\n\ +_080F498A:\n\ + subs r0, r4, r2\n\ + lsrs r1, r0, 31\n\ + adds r0, r1\n\ + asrs r0, 1\n\ + adds r0, r2, r0\n\ + lsls r0, 16\n\ + lsrs r3, r0, 16\n\ + cmp r4, r3\n\ + bne _080F4968\n\ +_080F499C:\n\ + mov r1, r8\n\ + ldr r2, [r1]\n\ + ldr r1, _080F49EC @ =0x00008fe4\n\ + adds r0, r2, r1\n\ + ldrh r4, [r0]\n\ + lsls r6, r3, 2\n\ + cmp r4, r3\n\ + bls _080F49C6\n\ + ldr r0, _080F49F0 @ =0x0000893c\n\ + adds r5, r2, r0\n\ +_080F49B0:\n\ + lsls r2, r4, 2\n\ + adds r2, r5, r2\n\ + subs r1, r4, 0x1\n\ + lsls r0, r1, 2\n\ + adds r0, r5, r0\n\ + ldr r0, [r0]\n\ + str r0, [r2]\n\ + lsls r1, 16\n\ + lsrs r4, r1, 16\n\ + cmp r4, r3\n\ + bhi _080F49B0\n\ +_080F49C6:\n\ + mov r1, r8\n\ + ldr r2, [r1]\n\ + ldr r3, _080F49F0 @ =0x0000893c\n\ + adds r0, r2, r3\n\ + adds r0, r6\n\ + mov r3, r12\n\ + ldr r1, [r3]\n\ + str r1, [r0]\n\ + ldr r0, _080F49EC @ =0x00008fe4\n\ + adds r2, r0\n\ + ldrh r0, [r2]\n\ + adds r0, 0x1\n\ + strh r0, [r2]\n\ + pop {r3}\n\ + mov r8, r3\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080F49EC: .4byte 0x00008fe4\n\ +_080F49F0: .4byte 0x0000893c\n\ .syntax divided\n"); } #endif // NONMATCHING + +void sub_80F49F4(void) +{ + u16 i; + + gUnknown_083DFEC4->unk893c[0].unk2 = 1; + for (i = 1; i < gUnknown_083DFEC4->unk8FE4; i++) + { + if (gUnknown_083DFEC4->unk893c[i].unk0 == gUnknown_083DFEC4->unk893c[i - 1].unk0) + gUnknown_083DFEC4->unk893c[i].unk2 = gUnknown_083DFEC4->unk893c[i - 1].unk2; + else + gUnknown_083DFEC4->unk893c[i].unk2 = i + 1; + } + + gUnknown_083DFEC4->unk876C = 0; + gUnknown_083DFEC4->unk8770 = 0; + gUnknown_083DFEC4->unk876E = 0; + gUnknown_083DFEC4->unk8772 = gUnknown_083DFEC4->unk8FE4 < 9 ? (gUnknown_083DFEC4->unk8FE4 - 1) : 7; + gUnknown_083DFEC4->unk8774 = gUnknown_083DFEC4->unk8FE4 - 1; + gUnknown_083DFEC4->unk87C9 = gUnknown_083DFEC4->unk8774 > 7; +} + +void sub_80F4B20(void) +{ + s16 var0; + s16 var1; + + sub_80F4900(gUnknown_083DFEC4->unk87DC, 0); + sub_80F2E18(0); + if (gUnknown_083DFEC4->unk87DA == 1) + { + gUnknown_083DFEC4->unk8fe9 = 0; + gUnknown_083DFEC4->unk8FEA = 0; + gUnknown_083DFEC4->unk8FEB = 0; + } + else + { + gUnknown_083DFEC4->unk8fe9 = 0; + gUnknown_083DFEC4->unk8FEA = 1; + gUnknown_083DFEC4->unk8FEB = 2; + + var0 = gUnknown_083DFEC4->unk87DC + 1; + if (var0 >= gUnknown_083DFEC4->unk87DA) + var0 = 0; + + var1 = gUnknown_083DFEC4->unk87DC - 1; + if (var1 < 0) + var1 = gUnknown_083DFEC4->unk87DA - 1; + + sub_80F4900(var0, 1); + sub_80F4900(var1, 2); + } +} + +void sub_80F4BD0(void) +{ + u16 i, j; + + for (i = 0, j = 0; i < gUnknown_083DFEC4->unk8828; i++) + { + if (!GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG)) + { + gUnknown_083DFEC4->unk893c[j].unk1 = 14; + gUnknown_083DFEC4->unk893c[j].partyIdx = i; + gUnknown_083DFEC4->unk893c[j].unk2 = j + 1; + gUnknown_083DFEC4->unk893c[j].unk4 = 1; + j++; + } + } + + gUnknown_083DFEC4->unk893c[j].unk1 = 0; + gUnknown_083DFEC4->unk893c[j].partyIdx = 0; + gUnknown_083DFEC4->unk893c[j].unk2 = 0; + gUnknown_083DFEC4->unk893c[j].unk4 = 0; + gUnknown_083DFEC4->unk87DC = 0; + gUnknown_083DFEC4->unk87DA = j + 1; + sub_80F4B20(); + gUnknown_083DFEC4->unk87CB = 1; +} + +static void sub_80F4CF0(void) +{ + gUnknown_083DFEC4->unk87DC = gUnknown_083DFEC4->unk876E; + sub_80F4B20(); + + if (gUnknown_083DFEC4->unk8774 == 0) + gUnknown_083DFEC4->unk87CB = 0; + else + gUnknown_083DFEC4->unk87CB = 1; +} + +static void sub_80F4D44(void) +{ + gUnknown_083DFEC4->unk8FE6 = 0; + gUnknown_083DFEC4->unk8FE7 = 0; + sub_80F492C(); + + if (!gUnknown_083DFEC4->unk6DAC) + while (sub_80F4D88()); +} + +static bool8 sub_80F4D88(void) +{ + u16 i; + register int mask asm("r3"); // FIXME + int nextValue; + struct UnkUsePokeblockSub var0; + + switch (gUnknown_083DFEC4->unk8FE6) + { + default: + var0.unk4 = 1; + for (i = 0; i < 15; i++) + { + + if (GetBoxMonData(&gPokemonStorage.boxes[gUnknown_083DFEC4->unk8FE6][gUnknown_083DFEC4->unk8FE7], MON_DATA_SPECIES) + && !GetBoxMonData(&gPokemonStorage.boxes[gUnknown_083DFEC4->unk8FE6][gUnknown_083DFEC4->unk8FE7], MON_DATA_IS_EGG)) + { + var0.unk1 = gUnknown_083DFEC4->unk8FE6; + var0.partyIdx = gUnknown_083DFEC4->unk8FE7; + var0.unk0 = GetBoxMonData( + &gPokemonStorage.boxes[gUnknown_083DFEC4->unk8FE6][gUnknown_083DFEC4->unk8FE7], + gUnknown_083DFEC4->unk87D8); + sub_80F4944(&var0); + } + + gUnknown_083DFEC4->unk8FE7++; + mask = 0xFF; + if (gUnknown_083DFEC4->unk8FE7 == 30) + { + gUnknown_083DFEC4->unk8FE7 = 0; + nextValue = gUnknown_083DFEC4->unk8FE6 + 1; + gUnknown_083DFEC4->unk8FE6 = nextValue; + if ((nextValue & mask) == 14) + break; + } + } + break; + case 14: + var0.unk4 = 1; + var0.unk1 = 14; + for (i = 0; i < gUnknown_083DFEC4->unk8828; i++) + { + if (!GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG)) + { + var0.partyIdx = i; + var0.unk0 = GetMonData(&gPlayerParty[i], gUnknown_083DFEC4->unk87D8); + sub_80F4944(&var0); + } + } + + sub_80F49F4(); + gUnknown_083DFEC4->unk87DA = gUnknown_083DFEC4->unk8FE4; + gUnknown_083DFEC4->unk8FE6++; + break; + case 15: + return FALSE; + } + + return TRUE; +} + +void sub_80F4F78(void) +{ + sub_80F53EC(gUnknown_083DFEC4->unk9040, gUnknown_083DFEC4->unk9004[gUnknown_083DFEC4->unk8fe9]); + sub_80F5504(); +} + +bool8 sub_80F4FB4(void) +{ + bool8 var0 = sub_80F5504(); + bool8 var1 = sub_80F170C(); + return var0 || var1; +} + +void sub_80F4FDC(void) +{ + if (gUnknown_083DFEC4->unk76AA || gUnknown_083DFEC4->unk87DC != gUnknown_083DFEC4->unk8828) + sub_80F53EC(gUnknown_083DFEC4->unk9004[gUnknown_083DFEC4->unk8fe9], gUnknown_083DFEC4->unk9040); +} + +bool8 sub_80F5038(void) +{ + bool8 var0 = sub_80F5504(); + bool8 var1 = sub_80F173C(); + return var0 || var1; +} + +void sub_80F5060(u8 arg0) +{ + u16 var0; + u8 var1; + u8 var2; + + if (arg0) + var0 = gUnknown_083DFEC4->unk8FEB; + else + var0 = gUnknown_083DFEC4->unk8FEA; + + sub_80F53EC(gUnknown_083DFEC4->unk9004[gUnknown_083DFEC4->unk8fe9], gUnknown_083DFEC4->unk9004[var0]); + var1 = gUnknown_083DFEC4->unk893c[gUnknown_083DFEC4->unk87DC].unk4; + if (arg0) + { + gUnknown_083DFEC4->unk8FEB = gUnknown_083DFEC4->unk8FEA; + gUnknown_083DFEC4->unk8FEA = gUnknown_083DFEC4->unk8fe9; + gUnknown_083DFEC4->unk8fe9 = var0; + gUnknown_083DFEC4->unk8FEC = gUnknown_083DFEC4->unk8FEB; + + gUnknown_083DFEC4->unk87DC = gUnknown_083DFEC4->unk87DC + ? gUnknown_083DFEC4->unk87DC - 1 + : gUnknown_083DFEC4->unk87DA - 1; + gUnknown_083DFEC4->unk8FEE = gUnknown_083DFEC4->unk87DC + ? gUnknown_083DFEC4->unk87DC - 1 + : gUnknown_083DFEC4->unk87DA - 1; + } + else + { + gUnknown_083DFEC4->unk8FEA = gUnknown_083DFEC4->unk8FEB; + gUnknown_083DFEC4->unk8FEB = gUnknown_083DFEC4->unk8fe9; + gUnknown_083DFEC4->unk8fe9 = var0; + gUnknown_083DFEC4->unk8FEC = gUnknown_083DFEC4->unk8FEA; + + gUnknown_083DFEC4->unk87DC = (gUnknown_083DFEC4->unk87DC < gUnknown_083DFEC4->unk87DA - 1) + ? gUnknown_083DFEC4->unk87DC + 1 + : 0; + gUnknown_083DFEC4->unk8FEE = (gUnknown_083DFEC4->unk87DC < gUnknown_083DFEC4->unk87DA - 1) + ? gUnknown_083DFEC4->unk87DC + 1 + : 0; + } + + var2 = gUnknown_083DFEC4->unk893c[gUnknown_083DFEC4->unk87DC].unk4; + if (!var1) + gUnknown_083DFEC4->unk87E0 = sub_80F5264; + else if (!var2) + gUnknown_083DFEC4->unk87E0 = sub_80F52F8; + else + gUnknown_083DFEC4->unk87E0 = sub_80F5364; + + gUnknown_083DFEC4->unk87DE = 0; +} + +bool8 gpu_sync_bg_show(void) +{ + return gUnknown_083DFEC4->unk87E0(); +} + +static bool8 sub_80F5264(void) +{ + switch (gUnknown_083DFEC4->unk87DE) + { + case 0: + sub_80F2E18(gUnknown_083DFEC4->unk8fe9); + sub_80F01E0(gUnknown_083DFEC4->unk8fe9); + gUnknown_083DFEC4->unk87DE++; + // fall through + case 1: + if (!sub_80F4FB4()) + { + sub_80F4900(gUnknown_083DFEC4->unk8FEE, gUnknown_083DFEC4->unk8FEC); + gUnknown_083DFEC4->unk87DE++; + } + break; + case 2: + return FALSE; + } + + return TRUE; +} + +static bool8 sub_80F52F8(void) +{ + switch (gUnknown_083DFEC4->unk87DE) + { + case 0: + if (!sub_80F5038()) + { + sub_80F01E0(gUnknown_083DFEC4->unk8fe9); + sub_80F4900(gUnknown_083DFEC4->unk8FEE, gUnknown_083DFEC4->unk8FEC); + gUnknown_083DFEC4->unk87DE++; + } + break; + case 1: + return FALSE; + } + + return TRUE; +} + +static bool8 sub_80F5364(void) +{ + switch (gUnknown_083DFEC4->unk87DE) + { + case 0: + sub_80F5504(); + if (!sub_80F173C()) + { + sub_80F2E18(gUnknown_083DFEC4->unk8fe9); + sub_80F01E0(gUnknown_083DFEC4->unk8fe9); + gUnknown_083DFEC4->unk87DE++; + } + break; + case 1: + if (!sub_80F4FB4()) + gUnknown_083DFEC4->unk87DE++; + break; + case 2: + sub_80F4900(gUnknown_083DFEC4->unk8FEE, gUnknown_083DFEC4->unk8FEC); + return FALSE; + } + + return TRUE; +} + +static void sub_80F53EC(struct UnkPokenav11 *arg0, struct UnkPokenav11 *arg1) +{ + u16 i, j; + int r5; + int r6; + + for (i = 0; i < 5; i++) + { + r5 = arg0[i].unk0 << 8; + r6 = ((arg1[i].unk0 - arg0[i].unk0) << 8) / 10; + for (j = 0; j < 9; j++) + { + gUnknown_083DFEC4->unk9054[j][i].unk0 = (r5 >> 8) + ((r5 >> 7) & 1); + r5 += r6; + } + + gUnknown_083DFEC4->unk9054[j][i].unk0 = arg1[i].unk0; + r5 = arg0[i].unk2 << 8; + r6 = ((arg1[i].unk2 - arg0[i].unk2) << 8) / 10; + for (j = 0; j < 9; j++) + { + gUnknown_083DFEC4->unk9054[j][i].unk2 = (r5 >> 8) + ((r5 >> 7) & 1); + r5 += r6; + } + + gUnknown_083DFEC4->unk9054[j][i].unk2 = arg1[i].unk2; + } + + gUnknown_083DFEC4->unk9342 = 0; +} + +static bool8 sub_80F5504(void) +{ + if (gUnknown_083DFEC4->unk9342 < 10) + { + sub_80F556C(gUnknown_083DFEC4->unk9054[gUnknown_083DFEC4->unk9342++]); + return gUnknown_083DFEC4->unk9342 != 10; + } + else + { + return FALSE; + } +} + +void sub_80F5550(struct UnkPokenav11 *arg0, struct UnkPokenav11 *arg1) +{ + sub_80F53EC(arg0, arg1); +} + +bool8 sub_80F555C(void) +{ + return sub_80F5504(); +} + +void sub_80F556C(struct UnkPokenav11 *arg0) +{ + u16 i; + + for (i = 0; i < 5; i++) + gUnknown_083DFEC4->unk911C[i] = arg0[i]; + + gUnknown_083DFEC4->unk9344 = 1; +} |