From 08a3533682706283fa7e563f26bd06984010628e Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 25 Jan 2019 23:32:45 +0100 Subject: Start frontier pass --- src/frontier_pass.c | 444 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 444 insertions(+) (limited to 'src/frontier_pass.c') diff --git a/src/frontier_pass.c b/src/frontier_pass.c index 4473dfae0..7b25ca9b8 100644 --- a/src/frontier_pass.c +++ b/src/frontier_pass.c @@ -1,7 +1,103 @@ #include "global.h" #include "gpu_regs.h" +#include "main.h" +#include "trainer_card.h" +#include "event_data.h" +#include "recorded_battle.h" +#include "alloc.h" +#include "sprite.h" +#include "scanline_effect.h" +#include "text_window.h" +#include "task.h" +#include "graphics.h" +#include "palette.h" +#include "window.h" +#include "menu_helpers.h" +#include "menu.h" #include "bg.h" +#include "sound.h" +#include "battle_pyramid.h" +#include "overworld.h" +#include "constants/battle_frontier.h" +#include "constants/rgb.h" +#include "constants/region_map_sections.h" +#include "constants/songs.h" +enum +{ + CURSOR_AREA_NOTHING, + CURSOR_AREA_MAP, + CURSOR_AREA_CARD, + CURSOR_AREA_RECORD, + CURSOR_AREA_CANCEL, + CURSOR_AREA_POINTS, + CURSOR_AREA_EARNED_SYMBOLS, // The window. + CURSOR_AREA_SYMBOL, // All 7 symbols. + CURSOR_AREA_COUNT = CURSOR_AREA_SYMBOL + NUM_FRONTIER_FACILITIES, +}; + +struct FrontierPassData +{ + void (*callback)(void); + u16 state; + u16 battlePoints; + s16 x; + s16 y; + u8 cursorArea; + u8 previousCursorArea; + u8 hasBattleRecord:1; + u8 unkE:3; + u8 trainerStars:4; + u8 facilitySymbols[NUM_FRONTIER_FACILITIES]; +}; + +struct FrontierPassUnk +{ + u32 unk0[8]; + u8 *unk20; + u8 *unk24; + u8 *unk28; + bool8 unk2C; + s16 unk2E; + s16 unk30; + u8 tilemapBuff1[0x1000]; + u8 tilemapBuff2[0x1000]; + u8 tilemapBuff3[0x400]; +}; + +struct FrontierPassSaved +{ + void (*callback)(void); + s16 x; + s16 y; +}; + +extern struct FrontierPassData *gUnknown_02039CEC; +extern struct FrontierPassUnk *gUnknown_02039CF0; +extern struct FrontierPassSaved gUnknown_02039CF8; + +// This file's functions. +u32 sub_80C51F0(void (*callback)(void)); +void sub_80C544C(void); +void sub_80C629C(void); +void sub_80C63FC(void); +void sub_80C62DC(void); +u32 sub_80C52E4(void); +bool32 sub_80C5484(void); +bool32 sub_80C570C(void); +void sub_80C5A48(u8 taskId); +void sub_80C5BD8(u8 taskId); +void sub_80C6104(u8 cursorArea, u8 previousCursorArea); + +// Const rom data. +extern const s16 gUnknown_085713E0[][2]; +extern const struct BgTemplate gUnknown_085713E8[3]; +extern const struct WindowTemplate gUnknown_08571400[]; +extern const u32 gUnknown_085712F8[]; +extern const u32 gUnknown_085712C0[]; +extern const u32 gUnknown_08571060[]; + +// code void sub_80C50D0(void) { SetGpuReg(REG_OFFSET_DISPCNT, 0); @@ -29,3 +125,351 @@ void sub_80C50D0(void) CpuFill16(0, (void *)VRAM, VRAM_SIZE); CpuFill32(0, (void *)OAM, OAM_SIZE); } + +void sub_80C51C4(void (*callback)(void)) +{ + sub_80C51F0(callback); + SetMainCallback2(sub_80C544C); +} + +void sub_80C51D8(void) +{ + SetMainCallback2(gUnknown_02039CEC->callback); + sub_80C52E4(); +} + +u32 sub_80C51F0(void (*callback)(void)) +{ + u8 i; + + if (gUnknown_02039CEC != NULL) + return 1; + + gUnknown_02039CEC = AllocZeroed(sizeof(*gUnknown_02039CEC)); + if (gUnknown_02039CEC == NULL) + return 2; + + gUnknown_02039CEC->callback = callback; + i = GetCurrentRegionMapSectionId(); + if (i != MAPSEC_BATTLE_FRONTIER && i != MAPSEC_ARTISAN_CAVE) + { + gUnknown_02039CEC->x = 176; + gUnknown_02039CEC->y = 104; + } + else + { + gUnknown_02039CEC->x = 176; + gUnknown_02039CEC->y = 48; + } + + gUnknown_02039CEC->battlePoints = gSaveBlock2Ptr->frontier.battlePoints; + gUnknown_02039CEC->hasBattleRecord = CanCopyRecordedBattleSaveData(); + gUnknown_02039CEC->unkE = 0; + gUnknown_02039CEC->trainerStars = CountPlayerTrainerStars(); + for (i = 0; i < 7; i++) + { + if (FlagGet(FLAG_SYS_TOWER_SILVER + i * 2)) + gUnknown_02039CEC->facilitySymbols[i]++; + if (FlagGet(FLAG_SYS_TOWER_GOLD + i * 2)) + gUnknown_02039CEC->facilitySymbols[i]++; + } + + return 0; +} + +u32 sub_80C52E4(void) +{ + if (gUnknown_02039CEC == NULL) + return 1; + + memset(gUnknown_02039CEC, 0, sizeof(*gUnknown_02039CEC)); // Why clear data, if it's going to be freed anyway? + FREE_AND_SET_NULL(gUnknown_02039CEC); + return 0; +} + +u32 sub_80C5310(void) +{ + if (gUnknown_02039CF0 != NULL) + return 1; + + gUnknown_02039CF0 = AllocZeroed(sizeof(*gUnknown_02039CF0)); + if (gUnknown_02039CF0 == NULL) + return 2; + + return 0; +} + +u32 sub_80C5340(void) +{ + FreeAllWindowBuffers(); + if (gUnknown_02039CF0 == NULL) + return 1; + + if (gUnknown_02039CF0->unk28 != NULL) + FREE_AND_SET_NULL(gUnknown_02039CF0->unk28); + if (gUnknown_02039CF0->unk24 != NULL) + FREE_AND_SET_NULL(gUnknown_02039CF0->unk24); + if (gUnknown_02039CF0->unk20 != NULL) + FREE_AND_SET_NULL(gUnknown_02039CF0->unk20); + + memset(gUnknown_02039CF0, 0, sizeof(*gUnknown_02039CF0)); // Why clear data, if it's going to be freed anyway? + FREE_AND_SET_NULL(gUnknown_02039CF0); + return 0; +} + +void sub_80C53AC(void) +{ + if (gUnknown_02039CF0->unk2C) + { + SetBgAffine(2, + gUnknown_085713E0[gUnknown_02039CEC->unkE - 1][0] << 8, + gUnknown_085713E0[gUnknown_02039CEC->unkE - 1][1] << 8, + gUnknown_085713E0[gUnknown_02039CEC->unkE - 1][0], + gUnknown_085713E0[gUnknown_02039CEC->unkE - 1][1], + gUnknown_02039CF0->unk2E, + gUnknown_02039CF0->unk30, + 0); + } + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +void sub_80C5438(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); +} + +void sub_80C544C(void) +{ + if (sub_80C5484()) + { + CreateTask(sub_80C5A48, 0); + SetMainCallback2(sub_80C5438); + } +} + +void sub_80C5470(void) +{ + if (sub_80C570C()) + { + sub_80C51D8(); + } +} + +bool32 sub_80C5484(void) +{ + u32 sizeOut = 0; + + switch (gUnknown_02039CEC->state) + { + case 0: + SetVBlankCallback(NULL); + ScanlineEffect_Stop(); + SetVBlankHBlankCallbacksToNull(); + DisableInterrupts(INTR_FLAG_HBLANK); + break; + case 1: + sub_80C50D0(); + break; + case 2: + ResetTasks(); + ResetSpriteData(); + FreeAllSpritePalettes(); + ResetPaletteFade(); + reset_temp_tile_data_buffers(); + break; + case 3: + sub_80C5310(); + break; + case 4: + ResetBgsAndClearDma3BusyFlags(0); + InitBgsFromTemplates(1, gUnknown_085713E8, ARRAY_COUNT(gUnknown_085713E8)); + SetBgTilemapBuffer(1, gUnknown_02039CF0->tilemapBuff1); + SetBgTilemapBuffer(2, gUnknown_02039CF0->tilemapBuff2); + SetBgTilemapBuffer(3, gUnknown_02039CF0->tilemapBuff3); + SetBgAttribute(2, BG_ATTR_WRAPAROUND, 1); + break; + case 5: + InitWindows(gUnknown_08571400); + DeactivateAllTextPrinters(); + break; + case 6: + gUnknown_02039CF0->unk20 = malloc_and_decompress(gUnknown_085712F8, &sizeOut); + gUnknown_02039CF0->unk24 = malloc_and_decompress(gUnknown_08571060, &sizeOut); + gUnknown_02039CF0->unk28 = malloc_and_decompress(gUnknown_085712C0, &sizeOut); + decompress_and_copy_tile_data_to_vram(1, gUnknown_08DE08C8, 0, 0, 0); + decompress_and_copy_tile_data_to_vram(2, gUnknown_08DE2084, 0, 0, 0); + break; + case 7: + if (free_temp_tile_data_buffers_if_possible()) + return FALSE; + FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20); + FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 30, 20); + FillBgTilemapBufferRect_Palette0(2, 0, 0, 0, 30, 20); + CopyBgTilemapBufferToVram(0); + CopyBgTilemapBufferToVram(1); + CopyBgTilemapBufferToVram(2); + break; + case 8: + LoadPalette(gUnknown_08DE07C8[0], 0, 0x1A0); + LoadPalette(gUnknown_08DE07C8[1 + gUnknown_02039CEC->trainerStars], 0x10, 0x20); + LoadPalette(stdpal_get(0), 0xF0, 0x20); + sub_80C629C(); + sub_80C6104(gUnknown_02039CEC->cursorArea, gUnknown_02039CEC->previousCursorArea); + if (gUnknown_02039CEC->unkE == 1 || gUnknown_02039CEC->unkE == 2) + { + gUnknown_02039CEC->state = 0; + return TRUE; + } + break; + case 9: + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP); + ShowBg(0); + ShowBg(1); + ShowBg(2); + sub_80C62DC(); + SetVBlankCallback(sub_80C53AC); + BlendPalettes(0xFFFFFFFF, 0x10, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); + break; + case 10: + AnimateSprites(); + BuildOamBuffer(); + if (UpdatePaletteFade()) + return FALSE; + + gUnknown_02039CEC->state = 0; + return TRUE; + } + + gUnknown_02039CEC->state++; + return FALSE; +} + +bool32 sub_80C570C(void) +{ + switch (gUnknown_02039CEC->state) + { + case 0: + if (gUnknown_02039CEC->unkE != 1 && gUnknown_02039CEC->unkE != 2) + { + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + } + else + { + gUnknown_02039CEC->state = 2; + return FALSE; + } + break; + case 1: + if (UpdatePaletteFade()) + return FALSE; + break; + case 2: + SetGpuReg(REG_OFFSET_DISPCNT, 0); + HideBg(0); + HideBg(1); + HideBg(2); + SetVBlankCallback(NULL); + ScanlineEffect_Stop(); + SetVBlankHBlankCallbacksToNull(); + break; + case 3: + sub_80C63FC(); + break; + case 4: + sub_80C50D0(); + ResetTasks(); + ResetSpriteData(); + FreeAllSpritePalettes(); + break; + case 5: + UnsetBgTilemapBuffer(0); + UnsetBgTilemapBuffer(1); + UnsetBgTilemapBuffer(2); + sub_80C5340(); + gUnknown_02039CEC->state = 0; + return TRUE; + } + + gUnknown_02039CEC->state++; + return FALSE; +} + +struct +{ + s16 yStart; + s16 yEnd; + s16 xStart; + s16 xEnd; +} +extern const gUnknown_08571454[]; + +u8 sub_80C57FC(s16 x, s16 y) +{ + u8 i; + + // Minus/Plus 1, because the table doesn't take into account the nothing field. + for (i = 0; i < CURSOR_AREA_COUNT - 1; i++) + { + if (gUnknown_08571454[i].yStart <= y && gUnknown_08571454[i].yEnd >= y + && gUnknown_08571454[i].xStart <= x && gUnknown_08571454[i].xEnd >= x) + { + if (i >= CURSOR_AREA_SYMBOL - 1 && gUnknown_02039CEC->facilitySymbols[i - CURSOR_AREA_SYMBOL + 1] == 0) + break; + + return i + 1; + } + } + + return 0; +} + +void sub_80C5868(void) +{ + u8 taskId; + + if (!sub_80C5484()) + return; + + switch (gUnknown_02039CEC->unkE) + { + case 1: + case 2: + taskId = CreateTask(sub_80C5BD8, 0); + gTasks[taskId].data[0] = 1; + break; + case 3: + default: + gUnknown_02039CEC->unkE = 0; + taskId = CreateTask(sub_80C5A48, 0); + break; + } + + SetMainCallback2(sub_80C5438); +} + +void sub_80C58D4(void) +{ + sub_80C51F0(gUnknown_02039CF8.callback); + gUnknown_02039CEC->x = gUnknown_02039CF8.x; + gUnknown_02039CEC->y = gUnknown_02039CF8.y; + memset(&gUnknown_02039CF8, 0, sizeof(gUnknown_02039CF8)); + switch (InBattlePyramid()) + { + case 1: + PlayBGM(MUS_PYRAMID); + break; + case 2: + PlayBGM(MUS_PYRAMID_TOP); + break; + default: + Overworld_PlaySpecialMapMusic(); + break; + } + + SetMainCallback2(sub_80C5868); +} -- cgit v1.2.3 From 0688725afb36ae02c4f4904dfe02aa6b8e8e29fa Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 26 Jan 2019 14:50:24 +0100 Subject: Document and decompile more of frontier pass. --- src/frontier_pass.c | 579 ++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 520 insertions(+), 59 deletions(-) (limited to 'src/frontier_pass.c') diff --git a/src/frontier_pass.c b/src/frontier_pass.c index 7b25ca9b8..078baaff1 100644 --- a/src/frontier_pass.c +++ b/src/frontier_pass.c @@ -10,19 +10,36 @@ #include "text_window.h" #include "task.h" #include "graphics.h" +#include "strings.h" +#include "frontier_pass.h" +#include "international_string_util.h" #include "palette.h" #include "window.h" +#include "decompress.h" #include "menu_helpers.h" #include "menu.h" #include "bg.h" #include "sound.h" +#include "string_util.h" #include "battle_pyramid.h" #include "overworld.h" +#include "math_util.h" #include "constants/battle_frontier.h" #include "constants/rgb.h" #include "constants/region_map_sections.h" #include "constants/songs.h" +// All windows displayed in the frontier pass. +enum +{ + WINDOW_EARNED_SYMBOLS, + WINDOW_BATTLE_RECORD, + WINDOW_BATTLE_POINTS, + WINDOW_DESCRIPTION, + WINDOW_4, + WINDOW_COUNT +}; + enum { CURSOR_AREA_NOTHING, @@ -41,8 +58,8 @@ struct FrontierPassData void (*callback)(void); u16 state; u16 battlePoints; - s16 x; - s16 y; + s16 cursorX; + s16 cursorY; u8 cursorArea; u8 previousCursorArea; u8 hasBattleRecord:1; @@ -51,13 +68,14 @@ struct FrontierPassData u8 facilitySymbols[NUM_FRONTIER_FACILITIES]; }; -struct FrontierPassUnk +struct FrontierPassGfx { - u32 unk0[8]; + struct Sprite *cursorSprite; + struct Sprite *symbolSprites[NUM_FRONTIER_FACILITIES]; u8 *unk20; u8 *unk24; u8 *unk28; - bool8 unk2C; + bool8 setAffine; s16 unk2E; s16 unk30; u8 tilemapBuff1[0x1000]; @@ -68,26 +86,29 @@ struct FrontierPassUnk struct FrontierPassSaved { void (*callback)(void); - s16 x; - s16 y; + s16 cursorX; + s16 cursorY; }; extern struct FrontierPassData *gUnknown_02039CEC; -extern struct FrontierPassUnk *gUnknown_02039CF0; +extern struct FrontierPassGfx *gUnknown_02039CF0; extern struct FrontierPassSaved gUnknown_02039CF8; // This file's functions. -u32 sub_80C51F0(void (*callback)(void)); -void sub_80C544C(void); +u32 AllocateFrontierPassData(void (*callback)(void)); +void ShowFrontierMap(void (*callback)(void)); +void CB2_InitFrontierPass(void); void sub_80C629C(void); -void sub_80C63FC(void); -void sub_80C62DC(void); -u32 sub_80C52E4(void); -bool32 sub_80C5484(void); -bool32 sub_80C570C(void); -void sub_80C5A48(u8 taskId); -void sub_80C5BD8(u8 taskId); +void FreeCursorAndSymbolSprites(void); +void LoadCursorAndSymbolSprites(void); +u32 FreeFrontierPassData(void); +bool32 InitFrontierPass(void); +bool32 HideFrontierPass(void); +void Task_HandleFrontierPassInput(u8 taskId); +void Task_DoFadeEffect(u8 taskId); void sub_80C6104(u8 cursorArea, u8 previousCursorArea); +void PrintAreaDescription(u8 cursorArea); +void sub_80C5F58(bool8 arg0, bool8 arg1); // Const rom data. extern const s16 gUnknown_085713E0[][2]; @@ -96,6 +117,13 @@ extern const struct WindowTemplate gUnknown_08571400[]; extern const u32 gUnknown_085712F8[]; extern const u32 gUnknown_085712C0[]; extern const u32 gUnknown_08571060[]; +extern const u8 gUnknown_08571448[]; +extern const u8 gUnknown_0857144B[]; +extern const u8 *const gUnknown_08571614[]; +extern const struct SpritePalette gUnknown_085714E4[]; +extern const struct CompressedSpriteSheet gUnknown_085714BC[]; +extern const struct SpriteTemplate gUnknown_085715B4; +extern const struct SpriteTemplate gUnknown_085715E4; // code void sub_80C50D0(void) @@ -126,19 +154,19 @@ void sub_80C50D0(void) CpuFill32(0, (void *)OAM, OAM_SIZE); } -void sub_80C51C4(void (*callback)(void)) +void ShowFrontierPass(void (*callback)(void)) { - sub_80C51F0(callback); - SetMainCallback2(sub_80C544C); + AllocateFrontierPassData(callback); + SetMainCallback2(CB2_InitFrontierPass); } -void sub_80C51D8(void) +void LeaveFrontierPass(void) { SetMainCallback2(gUnknown_02039CEC->callback); - sub_80C52E4(); + FreeFrontierPassData(); } -u32 sub_80C51F0(void (*callback)(void)) +u32 AllocateFrontierPassData(void (*callback)(void)) { u8 i; @@ -153,13 +181,13 @@ u32 sub_80C51F0(void (*callback)(void)) i = GetCurrentRegionMapSectionId(); if (i != MAPSEC_BATTLE_FRONTIER && i != MAPSEC_ARTISAN_CAVE) { - gUnknown_02039CEC->x = 176; - gUnknown_02039CEC->y = 104; + gUnknown_02039CEC->cursorX = 176; + gUnknown_02039CEC->cursorY = 104; } else { - gUnknown_02039CEC->x = 176; - gUnknown_02039CEC->y = 48; + gUnknown_02039CEC->cursorX = 176; + gUnknown_02039CEC->cursorY = 48; } gUnknown_02039CEC->battlePoints = gSaveBlock2Ptr->frontier.battlePoints; @@ -177,7 +205,7 @@ u32 sub_80C51F0(void (*callback)(void)) return 0; } -u32 sub_80C52E4(void) +u32 FreeFrontierPassData(void) { if (gUnknown_02039CEC == NULL) return 1; @@ -187,7 +215,7 @@ u32 sub_80C52E4(void) return 0; } -u32 sub_80C5310(void) +u32 AllocateFrontierPassGfx(void) { if (gUnknown_02039CF0 != NULL) return 1; @@ -199,7 +227,7 @@ u32 sub_80C5310(void) return 0; } -u32 sub_80C5340(void) +u32 FreeFrontierPassGfx(void) { FreeAllWindowBuffers(); if (gUnknown_02039CF0 == NULL) @@ -217,9 +245,9 @@ u32 sub_80C5340(void) return 0; } -void sub_80C53AC(void) +void VblankCb_FrontierPass(void) { - if (gUnknown_02039CF0->unk2C) + if (gUnknown_02039CF0->setAffine) { SetBgAffine(2, gUnknown_085713E0[gUnknown_02039CEC->unkE - 1][0] << 8, @@ -235,31 +263,31 @@ void sub_80C53AC(void) TransferPlttBuffer(); } -void sub_80C5438(void) +void CB2_FrontierPass(void) { RunTasks(); AnimateSprites(); BuildOamBuffer(); } -void sub_80C544C(void) +void CB2_InitFrontierPass(void) { - if (sub_80C5484()) + if (InitFrontierPass()) { - CreateTask(sub_80C5A48, 0); - SetMainCallback2(sub_80C5438); + CreateTask(Task_HandleFrontierPassInput, 0); + SetMainCallback2(CB2_FrontierPass); } } -void sub_80C5470(void) +void CB2_HideFrontierPass(void) { - if (sub_80C570C()) + if (HideFrontierPass()) { - sub_80C51D8(); + LeaveFrontierPass(); } } -bool32 sub_80C5484(void) +bool32 InitFrontierPass(void) { u32 sizeOut = 0; @@ -282,7 +310,7 @@ bool32 sub_80C5484(void) reset_temp_tile_data_buffers(); break; case 3: - sub_80C5310(); + AllocateFrontierPassGfx(); break; case 4: ResetBgsAndClearDma3BusyFlags(0); @@ -330,8 +358,8 @@ bool32 sub_80C5484(void) ShowBg(0); ShowBg(1); ShowBg(2); - sub_80C62DC(); - SetVBlankCallback(sub_80C53AC); + LoadCursorAndSymbolSprites(); + SetVBlankCallback(VblankCb_FrontierPass); BlendPalettes(0xFFFFFFFF, 0x10, 0); BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); break; @@ -349,7 +377,7 @@ bool32 sub_80C5484(void) return FALSE; } -bool32 sub_80C570C(void) +bool32 HideFrontierPass(void) { switch (gUnknown_02039CEC->state) { @@ -378,7 +406,7 @@ bool32 sub_80C570C(void) SetVBlankHBlankCallbacksToNull(); break; case 3: - sub_80C63FC(); + FreeCursorAndSymbolSprites(); break; case 4: sub_80C50D0(); @@ -390,7 +418,7 @@ bool32 sub_80C570C(void) UnsetBgTilemapBuffer(0); UnsetBgTilemapBuffer(1); UnsetBgTilemapBuffer(2); - sub_80C5340(); + FreeFrontierPassGfx(); gUnknown_02039CEC->state = 0; return TRUE; } @@ -408,7 +436,7 @@ struct } extern const gUnknown_08571454[]; -u8 sub_80C57FC(s16 x, s16 y) +u8 GetCursorAreaFromCoords(s16 x, s16 y) { u8 i; @@ -428,35 +456,35 @@ u8 sub_80C57FC(s16 x, s16 y) return 0; } -void sub_80C5868(void) +void CB2_ReshowFrontierPass(void) { u8 taskId; - if (!sub_80C5484()) + if (!InitFrontierPass()) return; switch (gUnknown_02039CEC->unkE) { case 1: case 2: - taskId = CreateTask(sub_80C5BD8, 0); - gTasks[taskId].data[0] = 1; + taskId = CreateTask(Task_DoFadeEffect, 0); + gTasks[taskId].data[0] = TRUE; break; case 3: default: gUnknown_02039CEC->unkE = 0; - taskId = CreateTask(sub_80C5A48, 0); + taskId = CreateTask(Task_HandleFrontierPassInput, 0); break; } - SetMainCallback2(sub_80C5438); + SetMainCallback2(CB2_FrontierPass); } -void sub_80C58D4(void) +void CB2_ReturnFromRecord(void) { - sub_80C51F0(gUnknown_02039CF8.callback); - gUnknown_02039CEC->x = gUnknown_02039CF8.x; - gUnknown_02039CEC->y = gUnknown_02039CF8.y; + AllocateFrontierPassData(gUnknown_02039CF8.callback); + gUnknown_02039CEC->cursorX = gUnknown_02039CF8.cursorX; + gUnknown_02039CEC->cursorY = gUnknown_02039CF8.cursorY; memset(&gUnknown_02039CF8, 0, sizeof(gUnknown_02039CF8)); switch (InBattlePyramid()) { @@ -471,5 +499,438 @@ void sub_80C58D4(void) break; } - SetMainCallback2(sub_80C5868); + SetMainCallback2(CB2_ReshowFrontierPass); +} + +void CB2_ShowFrontierPassFeature(void) +{ + if (!HideFrontierPass()) + return; + + switch (gUnknown_02039CEC->unkE) + { + case 1: + ShowFrontierMap(CB2_ReshowFrontierPass); + break; + case 3: + gUnknown_02039CF8.callback = gUnknown_02039CEC->callback; + gUnknown_02039CF8.cursorX = gUnknown_02039CEC->cursorX; + gUnknown_02039CF8.cursorY = gUnknown_02039CEC->cursorY; + FreeFrontierPassData(); + PlayRecordedBattle(CB2_ReturnFromRecord); + break; + case 2: + ShowPlayerTrainerCard(CB2_ReshowFrontierPass); + break; + } +} + +bool32 TryCallPassAreaFunction(u8 taskId, u8 cursorArea) +{ + switch (cursorArea) + { + case CURSOR_AREA_RECORD: + if (!gUnknown_02039CEC->hasBattleRecord) + return FALSE; + gUnknown_02039CEC->unkE = 3; + DestroyTask(taskId); + SetMainCallback2(CB2_ShowFrontierPassFeature); + break; + case CURSOR_AREA_MAP: + case CURSOR_AREA_CARD: + gUnknown_02039CEC->unkE = cursorArea; + gTasks[taskId].func = Task_DoFadeEffect; + gTasks[taskId].data[0] = FALSE; + break; + default: + return FALSE; + } + + gUnknown_02039CEC->cursorX = gUnknown_02039CF0->cursorSprite->pos1.x; + gUnknown_02039CEC->cursorY = gUnknown_02039CF0->cursorSprite->pos1.y; + return TRUE; +} + +void Task_HandleFrontierPassInput(u8 taskId) +{ + u8 var = FALSE; // Reused, first informs whether the cursor moves, then used as the new cursor area. + + if (gMain.heldKeys & DPAD_UP && gUnknown_02039CF0->cursorSprite->pos1.y >= 9) + { + gUnknown_02039CF0->cursorSprite->pos1.y -= 2; + if (gUnknown_02039CF0->cursorSprite->pos1.y <= 7) + gUnknown_02039CF0->cursorSprite->pos1.y = 2; + var = TRUE; + } + if (gMain.heldKeys & DPAD_DOWN && gUnknown_02039CF0->cursorSprite->pos1.y <= 135) + { + gUnknown_02039CF0->cursorSprite->pos1.y += 2; + if (gUnknown_02039CF0->cursorSprite->pos1.y >= 137) + gUnknown_02039CF0->cursorSprite->pos1.y = 136; + var = TRUE; + } + + if (gMain.heldKeys & DPAD_LEFT && gUnknown_02039CF0->cursorSprite->pos1.x >= 6) + { + gUnknown_02039CF0->cursorSprite->pos1.x -= 2; + if (gUnknown_02039CF0->cursorSprite->pos1.x <= 4) + gUnknown_02039CF0->cursorSprite->pos1.x = 5; + var = TRUE; + } + if (gMain.heldKeys & DPAD_RIGHT && gUnknown_02039CF0->cursorSprite->pos1.x <= 231) + { + gUnknown_02039CF0->cursorSprite->pos1.x += 2; + if (gUnknown_02039CF0->cursorSprite->pos1.x >= 233) + gUnknown_02039CF0->cursorSprite->pos1.x = 232; + var = TRUE; + } + + if (!var) // Cursor did not change. + { + if (gUnknown_02039CEC->cursorArea != CURSOR_AREA_NOTHING && gMain.newKeys & A_BUTTON) + { + if (gUnknown_02039CEC->cursorArea <= CURSOR_AREA_RECORD) // Map, Card, Record + { + PlaySE(SE_SELECT); + if (TryCallPassAreaFunction(taskId, gUnknown_02039CEC->cursorArea)) + return; + } + else if (gUnknown_02039CEC->cursorArea == CURSOR_AREA_CANCEL) + { + PlaySE(SE_PC_OFF); + SetMainCallback2(CB2_HideFrontierPass); + DestroyTask(taskId); + // BUG. The function should return here. Otherwise, it can play the same sound twice and destroy the same task twice. + } + } + + if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_PC_OFF); + SetMainCallback2(CB2_HideFrontierPass); + DestroyTask(taskId); + } + } + else + { + var = GetCursorAreaFromCoords(gUnknown_02039CF0->cursorSprite->pos1.x - 5, gUnknown_02039CF0->cursorSprite->pos1.y + 5); + if (gUnknown_02039CEC->cursorArea != var) + { + PrintAreaDescription(var); + gUnknown_02039CEC->previousCursorArea = gUnknown_02039CEC->cursorArea; + gUnknown_02039CEC->cursorArea = var; + sub_80C6104(gUnknown_02039CEC->cursorArea, gUnknown_02039CEC->previousCursorArea); + } + } +} + +void Task_DoFadeEffect(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + switch (gUnknown_02039CEC->state) + { + case 0: + if (!data[0]) + { + sub_80C5F58(TRUE, FALSE); + data[1] = 0x100; + data[2] = 0x100; + data[3] = 0x15; + data[4] = 0x15; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_WHITE); + } + else + { + data[1] = 0x1FC; + data[2] = 0x1FC; + data[3] = -0x15; + data[4] = -0x15; + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP); + ShowBg(0); + ShowBg(1); + ShowBg(2); + LoadCursorAndSymbolSprites(); + SetVBlankCallback(VblankCb_FrontierPass); + BlendPalettes(0xFFFFFFFF, 0x10, RGB_WHITE); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_WHITE); + } + gUnknown_02039CF0->setAffine = TRUE; + gUnknown_02039CF0->unk2E = sub_8151624(data[1]); + gUnknown_02039CF0->unk30 = sub_8151624(data[2]); + break; + case 1: + UpdatePaletteFade(); + data[1] += data[3]; + data[2] += data[4]; + gUnknown_02039CF0->unk2E = sub_8151624(data[1]); + gUnknown_02039CF0->unk30 = sub_8151624(data[2]); + if (!data[0]) + { + if (data[1] <= 0x1FC) + return; + } + else + { + if (data[1] != 0x100) + return; + } + break; + case 2: + if (gUnknown_02039CF0->setAffine) // Nonsensical check. + gUnknown_02039CF0->setAffine = FALSE; + if (UpdatePaletteFade()) + return; + if (!data[0]) + { + DestroyTask(taskId); + SetMainCallback2(CB2_ShowFrontierPassFeature); + } + else + { + sub_80C5F58(FALSE, FALSE); + gUnknown_02039CEC->unkE = 0; + gTasks[taskId].func = Task_HandleFrontierPassInput; + } + SetBgAttribute(2, BG_ATTR_WRAPAROUND, 0); + gUnknown_02039CEC->state = 0; + return; + } + + gUnknown_02039CEC->state++; +} + +void ShowAndPrintWindows(void) +{ + s32 x; + u8 i; + + for (i = 0; i < WINDOW_COUNT; i++) + { + PutWindowTilemap(i); + FillWindowPixelBuffer(i, 0); + } + + x = GetStringCenterAlignXOffset(1, gText_SymbolsEarned, 0x60); + AddTextPrinterParameterized3(WINDOW_EARNED_SYMBOLS, 1, x, 5, gUnknown_08571448, 0, gText_SymbolsEarned); + + x = GetStringCenterAlignXOffset(1, gText_BattleRecord, 0x60); + AddTextPrinterParameterized3(WINDOW_BATTLE_RECORD, 1, x, 5, gUnknown_08571448, 0, gText_BattleRecord); + + AddTextPrinterParameterized3(WINDOW_BATTLE_POINTS, 8, 5, 4, gUnknown_08571448, 0, gText_BattlePoints); + ConvertIntToDecimalStringN(gStringVar4, gUnknown_02039CEC->battlePoints, STR_CONV_MODE_LEFT_ALIGN, 5); + x = GetStringRightAlignXOffset(8, gStringVar4, 0x5B); + AddTextPrinterParameterized3(WINDOW_BATTLE_POINTS, 8, x, 16, gUnknown_08571448, 0, gStringVar4); + + gUnknown_02039CEC->cursorArea = GetCursorAreaFromCoords(gUnknown_02039CEC->cursorX - 5, gUnknown_02039CEC->cursorY + 5); + gUnknown_02039CEC->previousCursorArea = CURSOR_AREA_NOTHING; + PrintAreaDescription(gUnknown_02039CEC->cursorArea); + + for (i = 0; i < WINDOW_COUNT; i++) + CopyWindowToVram(i, 3); + + CopyBgTilemapBufferToVram(0); +} + +void PrintAreaDescription(u8 cursorArea) +{ + FillWindowPixelBuffer(WINDOW_DESCRIPTION, 0); + if (cursorArea == CURSOR_AREA_RECORD && !gUnknown_02039CEC->hasBattleRecord) + AddTextPrinterParameterized3(WINDOW_DESCRIPTION, 1, 2, 0, gUnknown_0857144B, 0, gUnknown_08571614[0]); + else if (cursorArea != CURSOR_AREA_NOTHING) + AddTextPrinterParameterized3(WINDOW_DESCRIPTION, 1, 2, 0, gUnknown_0857144B, 0, gUnknown_08571614[cursorArea]); + + CopyWindowToVram(WINDOW_DESCRIPTION, 3); + CopyBgTilemapBufferToVram(0); +} + +void sub_80C5F58(bool8 arg0, bool8 arg1) +{ + switch (gUnknown_02039CEC->unkE) + { + case 1: + if (arg0) + CopyToBgTilemapBufferRect_ChangePalette(2, gUnknown_02039CF0->unk20, 16, 3, 12, 7, 16); + else + FillBgTilemapBufferRect(2, 0, 16, 3, 12, 7, 16); + break; + case 2: + if (arg0) + CopyToBgTilemapBufferRect_ChangePalette(2, gUnknown_02039CF0->unk20 + 84, 16, 10, 12, 7, 16); + else + FillBgTilemapBufferRect(2, 0, 16, 10, 12, 7, 16); + break; + default: + return; + } + + CopyBgTilemapBufferToVram(2); + if (arg1) + { + SetBgAffine(2, + gUnknown_085713E0[gUnknown_02039CEC->unkE - 1][0] << 8, + gUnknown_085713E0[gUnknown_02039CEC->unkE - 1][1] << 8, + gUnknown_085713E0[gUnknown_02039CEC->unkE - 1][0], + gUnknown_085713E0[gUnknown_02039CEC->unkE - 1][1], + sub_8151624(0x1FC), + sub_8151624(0x1FC), + 0); + } + else + { + SetBgAffine(2, + gUnknown_085713E0[gUnknown_02039CEC->unkE - 1][0] << 8, + gUnknown_085713E0[gUnknown_02039CEC->unkE - 1][1] << 8, + gUnknown_085713E0[gUnknown_02039CEC->unkE - 1][0], + gUnknown_085713E0[gUnknown_02039CEC->unkE - 1][1], + sub_8151624(0x100), + sub_8151624(0x100), + 0); + } +} + +void sub_80C6104(u8 cursorArea, u8 previousCursorArea) +{ + bool32 var; + + switch (previousCursorArea) + { + case CURSOR_AREA_MAP: + CopyToBgTilemapBufferRect_ChangePalette(1, gUnknown_02039CF0->unk24, 16, 3, 12, 7, 17); + var = TRUE; + break; + case CURSOR_AREA_CARD: + CopyToBgTilemapBufferRect_ChangePalette(1, gUnknown_02039CF0->unk24 + 336, 16, 10, 12, 7, 17); + var = TRUE; + break; + case CURSOR_AREA_RECORD: + if (!gUnknown_02039CEC->hasBattleRecord) + { + var = FALSE; + } + else + { + CopyToBgTilemapBufferRect_ChangePalette(1, gUnknown_02039CF0->unk28, 2, 10, 12, 3, 17); + var = TRUE; + } + break; + case CURSOR_AREA_CANCEL: + CopyToBgTilemapBufferRect_ChangePalette(1, gUnknown_08DE3350, 21, 0, 9, 2, 17); + var = TRUE; + break; + default: + var = FALSE; + break; + } + + if (!var) + { + if (cursorArea == CURSOR_AREA_NOTHING || cursorArea > CURSOR_AREA_CANCEL) + return; + } + + switch (cursorArea) + { + case CURSOR_AREA_MAP: + CopyToBgTilemapBufferRect_ChangePalette(1, gUnknown_02039CF0->unk24 + 168, 16, 3, 12, 7, 17); + var = TRUE; + break; + case CURSOR_AREA_CARD: + CopyToBgTilemapBufferRect_ChangePalette(1, gUnknown_02039CF0->unk24 + 504, 16, 10, 12, 7, 17); + var = TRUE; + break; + case CURSOR_AREA_RECORD: + if (!gUnknown_02039CEC->hasBattleRecord) + return; + + CopyToBgTilemapBufferRect_ChangePalette(1, gUnknown_02039CF0->unk28 + 72, 2, 10, 12, 3, 17); + var = TRUE; + break; + case CURSOR_AREA_CANCEL: + CopyToBgTilemapBufferRect_ChangePalette(1, gUnknown_08DE3374, 21, 0, 9, 2, 17); + var = TRUE; + break; + default: + var = FALSE; + break; + } + + if (!var) + { + asm("":::"r4"); + if (previousCursorArea == CURSOR_AREA_NOTHING || previousCursorArea > CURSOR_AREA_CANCEL) + return; + } + + CopyBgTilemapBufferToVram(1); +} + +void sub_80C629C(void) +{ + CopyToBgTilemapBuffer(1, gUnknown_08DE3060, 0, 0); + sub_80C6104(gUnknown_02039CEC->cursorArea, gUnknown_02039CEC->previousCursorArea); + sub_80C5F58(TRUE, gUnknown_02039CEC->unkE); + ShowAndPrintWindows(); + CopyBgTilemapBufferToVram(1); +} + +void LoadCursorAndSymbolSprites(void) +{ + u8 spriteId; + u8 i = 0; + + FreeAllSpritePalettes(); + ResetAffineAnimData(); + LoadSpritePalettes(gUnknown_085714E4); + LoadCompressedSpriteSheet(&gUnknown_085714BC[0]); + LoadCompressedSpriteSheet(&gUnknown_085714BC[2]); + spriteId = CreateSprite(&gUnknown_085715B4, gUnknown_02039CEC->cursorX, gUnknown_02039CEC->cursorY, 0); + gUnknown_02039CF0->cursorSprite = &gSprites[spriteId]; + gUnknown_02039CF0->cursorSprite->oam.priority = 0; + + for (i = 0; i < NUM_FRONTIER_FACILITIES; i++) + { + if (gUnknown_02039CEC->facilitySymbols[i] != 0) + { + struct SpriteTemplate sprite = gUnknown_085715E4; + + sprite.paletteTag += gUnknown_02039CEC->facilitySymbols[i] - 1; + spriteId = CreateSprite(&sprite, gUnknown_08571454[i + CURSOR_AREA_SYMBOL - 1].xStart + 8, gUnknown_08571454[i + CURSOR_AREA_SYMBOL - 1].yStart + 6, i + 1); + gUnknown_02039CF0->symbolSprites[i] = &gSprites[spriteId]; + gUnknown_02039CF0->symbolSprites[i]->oam.priority = 2; + StartSpriteAnim(gUnknown_02039CF0->symbolSprites[i], i); + } + } +} + +void FreeCursorAndSymbolSprites(void) +{ + u8 i = 0; + + DestroySprite(gUnknown_02039CF0->cursorSprite); + gUnknown_02039CF0->cursorSprite = NULL; + for (i = 0; i < NUM_FRONTIER_FACILITIES; i++) + { + if (gUnknown_02039CF0->symbolSprites[i] != NULL) + { + DestroySprite(gUnknown_02039CF0->symbolSprites[i]); + gUnknown_02039CF0->symbolSprites[i] = NULL; + } + } + FreeAllSpritePalettes(); + FreeSpriteTilesByTag(2); + FreeSpriteTilesByTag(0); +} + +void nullsub_39(void) +{ + +} + +// Frontier Map code. +/* +void ShowFrontierMap(void (*callback)(void)); +{ + } +*/ -- cgit v1.2.3 From 03549349f89ba464b1f4b4f7c87b204f3045741b Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 26 Jan 2019 19:20:14 +0100 Subject: Decompile all frontier pass --- src/frontier_pass.c | 457 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 444 insertions(+), 13 deletions(-) (limited to 'src/frontier_pass.c') diff --git a/src/frontier_pass.c b/src/frontier_pass.c index 078baaff1..f9d56a272 100644 --- a/src/frontier_pass.c +++ b/src/frontier_pass.c @@ -25,6 +25,7 @@ #include "overworld.h" #include "math_util.h" #include "constants/battle_frontier.h" +#include "constants/maps.h" #include "constants/rgb.h" #include "constants/region_map_sections.h" #include "constants/songs.h" @@ -117,12 +118,11 @@ extern const struct WindowTemplate gUnknown_08571400[]; extern const u32 gUnknown_085712F8[]; extern const u32 gUnknown_085712C0[]; extern const u32 gUnknown_08571060[]; -extern const u8 gUnknown_08571448[]; -extern const u8 gUnknown_0857144B[]; +extern const u8 gUnknown_08571448[][3]; extern const u8 *const gUnknown_08571614[]; extern const struct SpritePalette gUnknown_085714E4[]; extern const struct CompressedSpriteSheet gUnknown_085714BC[]; -extern const struct SpriteTemplate gUnknown_085715B4; +extern const struct SpriteTemplate gUnknown_085715B4[2]; extern const struct SpriteTemplate gUnknown_085715E4; // code @@ -712,15 +712,15 @@ void ShowAndPrintWindows(void) } x = GetStringCenterAlignXOffset(1, gText_SymbolsEarned, 0x60); - AddTextPrinterParameterized3(WINDOW_EARNED_SYMBOLS, 1, x, 5, gUnknown_08571448, 0, gText_SymbolsEarned); + AddTextPrinterParameterized3(WINDOW_EARNED_SYMBOLS, 1, x, 5, gUnknown_08571448[0], 0, gText_SymbolsEarned); x = GetStringCenterAlignXOffset(1, gText_BattleRecord, 0x60); - AddTextPrinterParameterized3(WINDOW_BATTLE_RECORD, 1, x, 5, gUnknown_08571448, 0, gText_BattleRecord); + AddTextPrinterParameterized3(WINDOW_BATTLE_RECORD, 1, x, 5, gUnknown_08571448[0], 0, gText_BattleRecord); - AddTextPrinterParameterized3(WINDOW_BATTLE_POINTS, 8, 5, 4, gUnknown_08571448, 0, gText_BattlePoints); + AddTextPrinterParameterized3(WINDOW_BATTLE_POINTS, 8, 5, 4, gUnknown_08571448[0], 0, gText_BattlePoints); ConvertIntToDecimalStringN(gStringVar4, gUnknown_02039CEC->battlePoints, STR_CONV_MODE_LEFT_ALIGN, 5); x = GetStringRightAlignXOffset(8, gStringVar4, 0x5B); - AddTextPrinterParameterized3(WINDOW_BATTLE_POINTS, 8, x, 16, gUnknown_08571448, 0, gStringVar4); + AddTextPrinterParameterized3(WINDOW_BATTLE_POINTS, 8, x, 16, gUnknown_08571448[0], 0, gStringVar4); gUnknown_02039CEC->cursorArea = GetCursorAreaFromCoords(gUnknown_02039CEC->cursorX - 5, gUnknown_02039CEC->cursorY + 5); gUnknown_02039CEC->previousCursorArea = CURSOR_AREA_NOTHING; @@ -736,9 +736,9 @@ void PrintAreaDescription(u8 cursorArea) { FillWindowPixelBuffer(WINDOW_DESCRIPTION, 0); if (cursorArea == CURSOR_AREA_RECORD && !gUnknown_02039CEC->hasBattleRecord) - AddTextPrinterParameterized3(WINDOW_DESCRIPTION, 1, 2, 0, gUnknown_0857144B, 0, gUnknown_08571614[0]); + AddTextPrinterParameterized3(WINDOW_DESCRIPTION, 1, 2, 0, gUnknown_08571448[1], 0, gUnknown_08571614[0]); else if (cursorArea != CURSOR_AREA_NOTHING) - AddTextPrinterParameterized3(WINDOW_DESCRIPTION, 1, 2, 0, gUnknown_0857144B, 0, gUnknown_08571614[cursorArea]); + AddTextPrinterParameterized3(WINDOW_DESCRIPTION, 1, 2, 0, gUnknown_08571448[1], 0, gUnknown_08571614[cursorArea]); CopyWindowToVram(WINDOW_DESCRIPTION, 3); CopyBgTilemapBufferToVram(0); @@ -884,7 +884,7 @@ void LoadCursorAndSymbolSprites(void) LoadSpritePalettes(gUnknown_085714E4); LoadCompressedSpriteSheet(&gUnknown_085714BC[0]); LoadCompressedSpriteSheet(&gUnknown_085714BC[2]); - spriteId = CreateSprite(&gUnknown_085715B4, gUnknown_02039CEC->cursorX, gUnknown_02039CEC->cursorY, 0); + spriteId = CreateSprite(&gUnknown_085715B4[0], gUnknown_02039CEC->cursorX, gUnknown_02039CEC->cursorY, 0); gUnknown_02039CF0->cursorSprite = &gSprites[spriteId]; gUnknown_02039CF0->cursorSprite->oam.priority = 0; @@ -928,9 +928,440 @@ void nullsub_39(void) } // Frontier Map code. -/* -void ShowFrontierMap(void (*callback)(void)); + +struct FrontierMapData +{ + void (*callback)(void); + struct Sprite *cursorSprite; + struct Sprite *playerHeadSprite; + struct Sprite *mapIndicatorSprite; + u8 cursorPos; + u8 unk11; + u8 tilemapBuff0[0x1000]; + u8 tilemapBuff1[0x1000]; + u8 tilemapBuff2[0x1000]; +}; + +extern struct FrontierMapData *gUnknown_02039CF4; + +// Forward declarations. +void sub_80C67BC(u8 taskId); +void sub_80C6B94(void); +void sub_80C6974(void); +void sub_80C6C70(u8 direction); + +extern const struct BgTemplate gUnknown_085713F4[3]; +extern const struct WindowTemplate gUnknown_08571428[]; +extern const u32 gUnknown_0856FBBC[]; +extern const u32 gUnknown_08570E00[]; + +void ShowFrontierMap(void (*callback)(void)) +{ + if (gUnknown_02039CF4 != NULL) + SetMainCallback2(callback); // This line doesn't make sense at all, since it gets overwritten later anyway. + + gUnknown_02039CF4 = AllocZeroed(sizeof(*gUnknown_02039CF4)); + gUnknown_02039CF4->callback = callback; + ResetTasks(); + CreateTask(sub_80C67BC, 0); + SetMainCallback2(CB2_FrontierPass); +} + +void sub_80C6498(void) +{ + ResetTasks(); + SetMainCallback2(gUnknown_02039CF4->callback); + memset(gUnknown_02039CF4, 0, sizeof(*gUnknown_02039CF4)); // Pointless memory clear. + FREE_AND_SET_NULL(gUnknown_02039CF4); +} + +bool32 sub_80C64CC(void) +{ + switch (gUnknown_02039CEC->state) + { + case 0: + SetVBlankCallback(NULL); + ScanlineEffect_Stop(); + SetVBlankHBlankCallbacksToNull(); + break; + case 1: + sub_80C50D0(); + break; + case 2: + ResetSpriteData(); + FreeAllSpritePalettes(); + ResetPaletteFade(); + reset_temp_tile_data_buffers(); + break; + case 3: + ResetBgsAndClearDma3BusyFlags(0); + InitBgsFromTemplates(0, gUnknown_085713F4, ARRAY_COUNT(gUnknown_085713F4)); + SetBgTilemapBuffer(0, gUnknown_02039CF4->tilemapBuff0); + SetBgTilemapBuffer(1, gUnknown_02039CF4->tilemapBuff1); + SetBgTilemapBuffer(2, gUnknown_02039CF4->tilemapBuff2); + FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20); + FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 30, 20); + FillBgTilemapBufferRect_Palette0(2, 0, 0, 0, 30, 20); + CopyBgTilemapBufferToVram(0); + CopyBgTilemapBufferToVram(1); + CopyBgTilemapBufferToVram(2); + break; + case 4: + InitWindows(gUnknown_08571428); + DeactivateAllTextPrinters(); + sub_80C6B94(); + decompress_and_copy_tile_data_to_vram(1, gUnknown_0856FBBC, 0, 0, 0); + break; + case 5: + if (free_temp_tile_data_buffers_if_possible()) + return FALSE; + LoadPalette(gUnknown_08DE07C8[0], 0, 0x1A0); + LoadPalette(stdpal_get(0), 0xF0, 0x20); + CopyToBgTilemapBuffer(2, gUnknown_08570E00, 0, 0); + CopyBgTilemapBufferToVram(2); + break; + case 6: + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP); + ShowBg(0); + ShowBg(1); + ShowBg(2); + sub_80C6974(); + SetVBlankCallback(VblankCb_FrontierPass); + BlendPalettes(0xFFFFFFFF, 0x10, RGB_WHITE); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_WHITE); + break; + case 7: + if (UpdatePaletteFade()) + return FALSE; + gUnknown_02039CEC->state = 0; + return TRUE; + } + + gUnknown_02039CEC->state++; + return FALSE; +} + +bool32 sub_80C66AC(void) { + switch (gUnknown_02039CEC->state) + { + case 0: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_WHITE); + break; + case 1: + if (UpdatePaletteFade()) + return FALSE; + SetGpuReg(REG_OFFSET_DISPCNT, 0); + HideBg(0); + HideBg(1); + HideBg(2); + break; + case 2: + SetVBlankCallback(NULL); + ScanlineEffect_Stop(); + SetVBlankHBlankCallbacksToNull(); + break; + case 3: + if (gUnknown_02039CF4->cursorSprite != NULL) + { + DestroySprite(gUnknown_02039CF4->cursorSprite); + FreeSpriteTilesByTag(0); + } + if (gUnknown_02039CF4->mapIndicatorSprite != NULL) + { + DestroySprite(gUnknown_02039CF4->mapIndicatorSprite); + FreeSpriteTilesByTag(1); + } + if (gUnknown_02039CF4->playerHeadSprite != NULL) + { + DestroySprite(gUnknown_02039CF4->playerHeadSprite); + FreeSpriteTilesByTag(4); + } + FreeAllWindowBuffers(); + break; + case 4: + sub_80C50D0(); + ResetSpriteData(); + FreeAllSpritePalettes(); + break; + case 5: + UnsetBgTilemapBuffer(0); + UnsetBgTilemapBuffer(1); + UnsetBgTilemapBuffer(2); + gUnknown_02039CEC->state = 0; + return TRUE; + } + gUnknown_02039CEC->state++; + return FALSE; +} + +void sub_80C67BC(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + switch (data[0]) + { + case 0: + if (sub_80C64CC()) + break; + return; + case 1: + if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_PC_OFF); + data[0] = 4; + } + else if (gMain.newKeys & DPAD_DOWN) + { + if (gUnknown_02039CF4->cursorPos >= NUM_FRONTIER_FACILITIES - 1) + sub_80C6C70(0); + else + data[0] = 2; + } + else if (gMain.newKeys & DPAD_UP) + { + if (gUnknown_02039CF4->cursorPos == 0) + sub_80C6C70(1); + else + data[0] = 3; + } + return; + case 2: + if (data[1] > 3) + { + sub_80C6C70(0); + data[1] = 0; + data[0] = 1; + } + else + { + gUnknown_02039CF4->cursorSprite->pos1.y += 4; + data[1]++; + } + return; + case 3: + if (data[1] > 3) + { + sub_80C6C70(1); + data[1] = 0; + data[0] = 1; + } + else + { + gUnknown_02039CF4->cursorSprite->pos1.y -= 4; + data[1]++; + } + return; + case 4: + if (sub_80C66AC()) + break; + return; + case 5: + DestroyTask(taskId); + sub_80C6498(); + return; + } + + data[0]++; +} + +u8 sub_80C68E8(u16 mapNum) // id + 1, zero means not a frontier map number +{ + if ((mapNum >= MAP_NUM(BATTLE_FRONTIER_BATTLE_TOWER_LOBBY) && mapNum <= MAP_NUM(BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM)) + || (mapNum >= MAP_NUM(BATTLE_FRONTIER_BATTLE_TOWER_MULTI_BATTLE_ROOM) && mapNum <= MAP_NUM(BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM2))) + return FRONTIER_FACILITY_TOWER + 1; + else if (mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_DOME_LOBBY) + || mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_DOME_CORRIDOR) + || mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_DOME_PRE_BATTLE_ROOM) + || mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_DOME_BATTLE_ROOM)) + return FRONTIER_FACILITY_DOME + 1; + else if (mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_PALACE_LOBBY) + || mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR) + || mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM)) + return FRONTIER_FACILITY_PALACE + 1; + else if (mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_ARENA_LOBBY) + || mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_ARENA_CORRIDOR) + || mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_ARENA_BATTLE_ROOM)) + return FRONTIER_FACILITY_ARENA + 1; + else if (mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY) + || mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_FACTORY_PRE_BATTLE_ROOM) + || mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_FACTORY_BATTLE_ROOM)) + return FRONTIER_FACILITY_FACTORY + 1; + else if (mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_PIKE_LOBBY) + || mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_PIKE_CORRIDOR) + || mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_PIKE_THREE_PATH_ROOM) + || mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_PIKE_RANDOM_ROOM1) + || mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_PIKE_RANDOM_ROOM2) + || mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_PIKE_RANDOM_ROOM3)) + return FRONTIER_FACILITY_PIKE + 1; + else if (mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY) + || mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_PYRAMID_EMPTY_SQUARE) + || mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_PYRAMID_TOP)) + return FRONTIER_FACILITY_PYRAMID + 1; + else + return 0; +} + +struct +{ + const u8 *name; + const u8 *description; + s16 x; + s16 y; + u8 animNum; +} extern const gUnknown_08571650[]; + +extern const struct CompressedSpriteSheet gUnknown_085714D4[]; +extern const struct SpriteTemplate gUnknown_085715FC; + +void sub_80C6974(void) +{ + struct SpriteTemplate sprite; + u8 spriteId; + u8 id; + s16 x = 0, y; + + FreeAllSpritePalettes(); + LoadSpritePalettes(gUnknown_085714E4); + + LoadCompressedSpriteSheet(&gUnknown_085714BC[0]); + spriteId = CreateSprite(&gUnknown_085715B4[0], 155, (gUnknown_02039CF4->cursorPos * 16) + 8, 2); + gUnknown_02039CF4->cursorSprite = &gSprites[spriteId]; + gUnknown_02039CF4->cursorSprite->oam.priority = 0; + gUnknown_02039CF4->cursorSprite->hFlip = TRUE; + StartSpriteAnim(gUnknown_02039CF4->cursorSprite, 1); + + LoadCompressedSpriteSheet(&gUnknown_085714BC[1]); + spriteId = CreateSprite(&gUnknown_085715B4[1], gUnknown_08571650[gUnknown_02039CF4->cursorPos].x, gUnknown_08571650[gUnknown_02039CF4->cursorPos].y, 1); + gUnknown_02039CF4->mapIndicatorSprite = &gSprites[spriteId]; + gUnknown_02039CF4->mapIndicatorSprite->oam.priority = 0; + StartSpriteAnim(gUnknown_02039CF4->mapIndicatorSprite, gUnknown_08571650[gUnknown_02039CF4->cursorPos].animNum); + + // Create player indicator head sprite only if it's in vicinity of battle frontier. + id = GetCurrentRegionMapSectionId(); + if (id == MAPSEC_BATTLE_FRONTIER || id == MAPSEC_ARTISAN_CAVE) + { + s8 mapNum = gSaveBlock1Ptr->location.mapNum; + + if (mapNum == MAP_NUM(BATTLE_FRONTIER_OUTSIDE_WEST) + || (mapNum == MAP_NUM(BATTLE_FRONTIER_OUTSIDE_EAST) && (x = 55))) + { + x += gSaveBlock1Ptr->pos.x; + y = gSaveBlock1Ptr->pos.y; + + x /= 8; + y /= 8; + + id = 0; + } + else + { + id = sub_80C68E8(mapNum); + if (id != 0) + { + x = gUnknown_08571650[id - 1].x; + y = gUnknown_08571650[id - 1].y; + } + else + { + // Handle Artisan Cave. + if (gSaveBlock1Ptr->escapeWarp.mapNum == MAP_NUM(BATTLE_FRONTIER_OUTSIDE_EAST)) + x = gSaveBlock1Ptr->escapeWarp.x + 55; + else + x = gSaveBlock1Ptr->escapeWarp.x; + + y = gSaveBlock1Ptr->escapeWarp.y; + + x /= 8; + y /= 8; + } + } + + LoadCompressedSpriteSheet(gUnknown_085714D4); + sprite = gUnknown_085715FC; + sprite.paletteTag = gSaveBlock2Ptr->playerGender + 4; + if (id != 0) + { + spriteId = CreateSprite(&sprite, x, y, 0); + } + else + { + x *= 8; + y *= 8; + spriteId = CreateSprite(&sprite, x + 20, y + 36, 0); + } + + gUnknown_02039CF4->playerHeadSprite = &gSprites[spriteId]; + gUnknown_02039CF4->playerHeadSprite->oam.priority = 0; + if (gSaveBlock2Ptr->playerGender != MALE) + StartSpriteAnim(gUnknown_02039CF4->playerHeadSprite, 1); + } +} + +enum +{ + MAP_WINDOW_0, + MAP_WINDOW_NAME, + MAP_WINDOW_DESCRIPTION, + MAP_WINDOW_COUNT +}; + +void sub_80C6B94(void) +{ + u8 i; + + for (i = 0; i < MAP_WINDOW_COUNT; i++) + { + PutWindowTilemap(i); + FillWindowPixelBuffer(i, 0); + } + + for (i = 0; i < NUM_FRONTIER_FACILITIES; i++) + { + if (i == gUnknown_02039CF4->cursorPos) + AddTextPrinterParameterized3(MAP_WINDOW_NAME, 7, 4, (i * 16) + 1, gUnknown_08571448[2], 0, gUnknown_08571650[i].name); + else + AddTextPrinterParameterized3(MAP_WINDOW_NAME, 7, 4, (i * 16) + 1, gUnknown_08571448[1], 0, gUnknown_08571650[i].name); + } + + AddTextPrinterParameterized3(MAP_WINDOW_DESCRIPTION, 1, 4, 0, gUnknown_08571448[0], 0, gUnknown_08571650[gUnknown_02039CF4->cursorPos].description); + + for (i = 0; i < MAP_WINDOW_COUNT; i++) + CopyWindowToVram(i, 3); + + CopyBgTilemapBufferToVram(0); +} + +void sub_80C6C70(u8 direction) +{ + u8 oldCursorPos, i; + + if (direction) + { + oldCursorPos = gUnknown_02039CF4->cursorPos; + gUnknown_02039CF4->cursorPos = (oldCursorPos + 6) % NUM_FRONTIER_FACILITIES; + } + else + { + oldCursorPos = gUnknown_02039CF4->cursorPos; + gUnknown_02039CF4->cursorPos = (oldCursorPos + 1) % NUM_FRONTIER_FACILITIES; + } + + AddTextPrinterParameterized3(MAP_WINDOW_NAME, 7, 4, (oldCursorPos * 16) + 1, gUnknown_08571448[1], 0, gUnknown_08571650[oldCursorPos].name); + AddTextPrinterParameterized3(MAP_WINDOW_NAME, 7, 4, (gUnknown_02039CF4->cursorPos * 16) + 1, gUnknown_08571448[2], 0, gUnknown_08571650[gUnknown_02039CF4->cursorPos].name); + + gUnknown_02039CF4->cursorSprite->pos1.y = (gUnknown_02039CF4->cursorPos * 16) + 8; + + StartSpriteAnim(gUnknown_02039CF4->mapIndicatorSprite, gUnknown_08571650[gUnknown_02039CF4->cursorPos].animNum); + gUnknown_02039CF4->mapIndicatorSprite->pos1.x = gUnknown_08571650[gUnknown_02039CF4->cursorPos].x; + gUnknown_02039CF4->mapIndicatorSprite->pos1.y = gUnknown_08571650[gUnknown_02039CF4->cursorPos].y; + FillWindowPixelBuffer(MAP_WINDOW_DESCRIPTION, 0); + AddTextPrinterParameterized3(MAP_WINDOW_DESCRIPTION, 1, 4, 0, gUnknown_08571448[0], 0, gUnknown_08571650[gUnknown_02039CF4->cursorPos].description); + + for (i = 0; i < 3; i++) + CopyWindowToVram(i, 3); + + CopyBgTilemapBufferToVram(0); + PlaySE(SE_Z_SCROLL); } -*/ -- cgit v1.2.3 From 01c3f3fc059b01b17ae7ceb0168be76617e1714d Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 26 Jan 2019 20:56:06 +0100 Subject: Document all of frontier pass --- src/frontier_pass.c | 1052 ++++++++++++++++++++++++++++++++++----------------- 1 file changed, 698 insertions(+), 354 deletions(-) (limited to 'src/frontier_pass.c') diff --git a/src/frontier_pass.c b/src/frontier_pass.c index f9d56a272..a0f6af73c 100644 --- a/src/frontier_pass.c +++ b/src/frontier_pass.c @@ -2,6 +2,7 @@ #include "gpu_regs.h" #include "main.h" #include "trainer_card.h" +#include "battle_anim.h" #include "event_data.h" #include "recorded_battle.h" #include "alloc.h" @@ -41,6 +42,15 @@ enum WINDOW_COUNT }; +// Windows displayed in the facilities map view. +enum +{ + MAP_WINDOW_0, + MAP_WINDOW_NAME, + MAP_WINDOW_DESCRIPTION, + MAP_WINDOW_COUNT +}; + enum { CURSOR_AREA_NOTHING, @@ -91,42 +101,425 @@ struct FrontierPassSaved s16 cursorY; }; -extern struct FrontierPassData *gUnknown_02039CEC; -extern struct FrontierPassGfx *gUnknown_02039CF0; -extern struct FrontierPassSaved gUnknown_02039CF8; +struct FrontierMapData +{ + void (*callback)(void); + struct Sprite *cursorSprite; + struct Sprite *playerHeadSprite; + struct Sprite *mapIndicatorSprite; + u8 cursorPos; + u8 unused; + u8 tilemapBuff0[0x1000]; + u8 tilemapBuff1[0x1000]; + u8 tilemapBuff2[0x1000]; +}; + +static EWRAM_DATA struct FrontierPassData *sPassData = NULL; +static EWRAM_DATA struct FrontierPassGfx *sPassGfx = NULL; +static EWRAM_DATA struct FrontierMapData *sMapData = NULL; +static EWRAM_DATA struct FrontierPassSaved sSavedPassData = {0}; // This file's functions. -u32 AllocateFrontierPassData(void (*callback)(void)); -void ShowFrontierMap(void (*callback)(void)); -void CB2_InitFrontierPass(void); -void sub_80C629C(void); -void FreeCursorAndSymbolSprites(void); -void LoadCursorAndSymbolSprites(void); -u32 FreeFrontierPassData(void); -bool32 InitFrontierPass(void); -bool32 HideFrontierPass(void); -void Task_HandleFrontierPassInput(u8 taskId); -void Task_DoFadeEffect(u8 taskId); -void sub_80C6104(u8 cursorArea, u8 previousCursorArea); -void PrintAreaDescription(u8 cursorArea); -void sub_80C5F58(bool8 arg0, bool8 arg1); +static u32 AllocateFrontierPassData(void (*callback)(void)); +static void ShowFrontierMap(void (*callback)(void)); +static void CB2_InitFrontierPass(void); +static void sub_80C629C(void); +static void FreeCursorAndSymbolSprites(void); +static void LoadCursorAndSymbolSprites(void); +static u32 FreeFrontierPassData(void); +static bool32 InitFrontierPass(void); +static bool32 HideFrontierPass(void); +static void Task_HandleFrontierPassInput(u8 taskId); +static void Task_DoFadeEffect(u8 taskId); +static void sub_80C6104(u8 cursorArea, u8 previousCursorArea); +static void PrintAreaDescription(u8 cursorArea); +static void sub_80C5F58(bool8 arg0, bool8 arg1); +static void SpriteCb_Dummy(struct Sprite *sprite); // Const rom data. -extern const s16 gUnknown_085713E0[][2]; -extern const struct BgTemplate gUnknown_085713E8[3]; -extern const struct WindowTemplate gUnknown_08571400[]; -extern const u32 gUnknown_085712F8[]; -extern const u32 gUnknown_085712C0[]; -extern const u32 gUnknown_08571060[]; -extern const u8 gUnknown_08571448[][3]; -extern const u8 *const gUnknown_08571614[]; -extern const struct SpritePalette gUnknown_085714E4[]; -extern const struct CompressedSpriteSheet gUnknown_085714BC[]; -extern const struct SpriteTemplate gUnknown_085715B4[2]; -extern const struct SpriteTemplate gUnknown_085715E4; +static const u16 sMaleHeadPalette[] = INCBIN_U16("graphics/frontier_pass/map_heads.gbapal"); +static const u16 sFemaleHeadPalette[] = INCBIN_U16("graphics/frontier_pass/map_heads_female.gbapal"); +static const u32 gUnknown_0856FBBC[] = INCBIN_U32("graphics/frontier_pass/map_screen.4bpp.lz"); +static const u32 sCursorGfx[] = INCBIN_U32("graphics/frontier_pass/cursor.4bpp.lz"); +static const u32 sHeadsGfx[] = INCBIN_U32("graphics/frontier_pass/map_heads.4bpp.lz"); +static const u32 sMapCursorGfx[] = INCBIN_U32("graphics/frontier_pass/map_cursor.4bpp.lz"); +static const u32 gUnknown_08570E00[] = INCBIN_U32("graphics/frontier_pass/map_screen.bin.lz"); +static const u32 gUnknown_08571060[] = INCBIN_U32("graphics/frontier_pass/small_map_and_card.bin.lz"); +static const u32 gUnknown_08571298[] = INCBIN_U32("graphics/frontier_pass/unknown_571298.bin"); +static const u32 gUnknown_085712C0[] = INCBIN_U32("graphics/frontier_pass/record_frame.bin.lz"); +static const u32 gUnknown_085712F8[] = INCBIN_U32("graphics/frontier_pass/small_map_and_card_affine.bin.lz"); + +static const s16 gUnknown_085713E0[][2] = {{216, 32}, {216, 128}}; + +static const struct BgTemplate sPassBgTemplates[] = +{ + { + .bg = 0, + .charBaseIndex = 2, + .mapBaseIndex = 31, + .screenSize = 0, + .paletteMode = 0, + .priority = 1, + .baseTile = 0 + }, + { + .bg = 1, + .charBaseIndex = 0, + .mapBaseIndex = 30, + .screenSize = 0, + .paletteMode = 0, + .priority = 2, + .baseTile = 0 + }, + { + .bg = 2, + .charBaseIndex = 1, + .mapBaseIndex = 29, + .screenSize = 1, + .paletteMode = 1, + .priority = 0, + .baseTile = 0 + }, +}; + +static const struct BgTemplate sMapBgTemplates[] = +{ + { + .bg = 0, + .charBaseIndex = 2, + .mapBaseIndex = 31, + .screenSize = 0, + .paletteMode = 0, + .priority = 0, + .baseTile = 0 + }, + { + .bg = 1, + .charBaseIndex = 0, + .mapBaseIndex = 30, + .screenSize = 0, + .paletteMode = 0, + .priority = 1, + .baseTile = 0 + }, + { + .bg = 2, + .charBaseIndex = 0, + .mapBaseIndex = 29, + .screenSize = 0, + .paletteMode = 0, + .priority = 2, + .baseTile = 0 + }, +}; + +static const struct WindowTemplate sPassWindowTemplates[] = +{ + { + .bg = 0, + .tilemapLeft = 2, + .tilemapTop = 3, + .width = 12, + .height = 3, + .paletteNum = 15, + .baseBlock = 0x1, + }, + { + .bg = 0, + .tilemapLeft = 2, + .tilemapTop = 10, + .width = 12, + .height = 3, + .paletteNum = 15, + .baseBlock = 0x26, + }, + { + .bg = 0, + .tilemapLeft = 2, + .tilemapTop = 13, + .width = 12, + .height = 4, + .paletteNum = 15, + .baseBlock = 0x4B, + }, + { + .bg = 0, + .tilemapLeft = 0, + .tilemapTop = 18, + .width = 30, + .height = 3, + .paletteNum = 15, + .baseBlock = 0x7C, + }, + DUMMY_WIN_TEMPLATE +}; + +static const struct WindowTemplate sMapWindowTemplates[] = +{ + { + .bg = 0, + .tilemapLeft = 0, + .tilemapTop = 1, + .width = 15, + .height = 5, + .paletteNum = 15, + .baseBlock = 0x1, + }, + { + .bg = 0, + .tilemapLeft = 20, + .tilemapTop = 1, + .width = 10, + .height = 14, + .paletteNum = 15, + .baseBlock = 0x4D, + }, + { + .bg = 0, + .tilemapLeft = 2, + .tilemapTop = 16, + .width = 26, + .height = 4, + .paletteNum = 15, + .baseBlock = 0xDA, + }, + DUMMY_WIN_TEMPLATE +}; + +static const u8 sTextColors[][3] = +{ + {0, 2, 3}, + {0, 1, 9}, + {0, 4, 5}, +}; + +struct +{ + s16 yStart; + s16 yEnd; + s16 xStart; + s16 xEnd; +} +static const sPassAreasLayout[] = +{ + {28, 76, 132, 220}, + {84, 132, 132, 220}, + {80, 102, 20, 108}, + {0, 16, 152, 240}, + {108, 134, 20, 108}, + {24, 48, 20, 108}, + {50, 66, 20, 36}, + {66, 82, 32, 48}, + {50, 66, 44, 60}, + {66, 82, 56, 72}, + {50, 66, 68, 84}, + {66, 82, 80, 96}, + {50, 66, 92, 108}, +}; + +static const struct CompressedSpriteSheet sCursorSpriteSheets[] = +{ + {sCursorGfx, 0x100, 0}, + {sMapCursorGfx, 0x400, 1}, + {gFrontierPassMedals_Gfx, 0x380, 2}, +}; + +static const struct CompressedSpriteSheet sHeadsSpriteSheet[] = +{ + {sHeadsGfx, 0x100, 4}, + {} +}; + +static const struct SpritePalette sSpritePalettes[] = +{ + {gFrontierPassCursor_Pal, 0}, + {gFrontierPassMapCursor_Pal, 1}, + {gFrontierPassMedalsSilver_Pal, 2}, + {gFrontierPassMedalsGold_Pal, 3}, + {sMaleHeadPalette, 4}, + {sFemaleHeadPalette, 5}, + {} +}; + +static const union AnimCmd sSpriteAnim_857151C[] = +{ + ANIMCMD_FRAME(0, 0), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_8571524[] = +{ + ANIMCMD_FRAME(0, 0), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_857152C[] = +{ + ANIMCMD_FRAME(4, 0), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_8571534[] = +{ + ANIMCMD_FRAME(8, 0), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_857153C[] = +{ + ANIMCMD_FRAME(12, 0), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_8571544[] = +{ + ANIMCMD_FRAME(16, 0), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_857154C[] = +{ + ANIMCMD_FRAME(20, 0), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_8571554[] = +{ + ANIMCMD_FRAME(24, 0), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_857155C[] = +{ + ANIMCMD_FRAME(0, 45), + ANIMCMD_FRAME(8, 45), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd sSpriteAnim_8571568[] = +{ + ANIMCMD_FRAME(16, 45), + ANIMCMD_FRAME(24, 45), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd *const sSpriteAnimTable_8571574[] = +{ + sSpriteAnim_8571524, + sSpriteAnim_857152C +}; + +static const union AnimCmd *const sSpriteAnimTable_857157C[] = +{ + sSpriteAnim_8571524, + sSpriteAnim_857152C, + sSpriteAnim_8571534, + sSpriteAnim_857153C, + sSpriteAnim_8571544, + sSpriteAnim_857154C, + sSpriteAnim_8571554 +}; + +static const union AnimCmd *const sSpriteAnimTable_8571598[] = +{ + sSpriteAnim_857155C, + sSpriteAnim_8571568 +}; + +static const union AffineAnimCmd sSpriteAffineAnim_85715A0[] = +{ + AFFINEANIMCMD_FRAME(256, 256, 0, 0), + AFFINEANIMCMD_END +}; + +static const union AffineAnimCmd *const sSpriteAffineAnimTable_85715B0[] = +{ + sSpriteAffineAnim_85715A0 +}; + +static const struct SpriteTemplate sSpriteTemplates_Cursors[] = +{ + { + .tileTag = 0, + .paletteTag = 0, + .oam = &gUnknown_0852490C, + .anims = sSpriteAnimTable_8571574, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, + }, + { + .tileTag = 1, + .paletteTag = 1, + .oam = &gUnknown_08524934, + .anims = sSpriteAnimTable_8571598, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, + }, +}; + +static const struct SpriteTemplate sSpriteTemplate_Medal = +{ + .tileTag = 2, + .paletteTag = 2, + .oam = &gUnknown_0852490C, + .anims = sSpriteAnimTable_857157C, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, +}; + +static const struct SpriteTemplate sSpriteTemplate_Head = +{ + .tileTag = 4, + .paletteTag = 4, + .oam = &gUnknown_0852490C, + .anims = sSpriteAnimTable_8571574, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCb_Dummy, +}; + +static const u8 *const sPassAreaDescriptions[] = +{ + gUnknown_085EDA96, + gUnknown_085ED932, + gUnknown_085ED94D, + gUnknown_085ED961, + gUnknown_085ED977, + gUnknown_085ED993, + gUnknown_085ED9AF, + gUnknown_085ED9C7, + gUnknown_085ED9E5, + gUnknown_085EDA02, + gUnknown_085EDA21, + gUnknown_085EDA3C, + gUnknown_085EDA5E, + gUnknown_085EDA78, + gUnknown_085ED931, +}; + +struct +{ + const u8 *name; + const u8 *description; + s16 x; + s16 y; + u8 animNum; +} static const sMapLandmarks[] = +{ + {gUnknown_085EDAB1, gUnknown_085EDB0F, 0x59, 0x28, 1}, + {gUnknown_085EDABE, gUnknown_085EDB4E, 0x21, 0x2A, 1}, + {gUnknown_085EDACA, gUnknown_085EDB8B, 0x78, 0x56, 0}, + {gUnknown_085EDAD8, gUnknown_085EDBC2, 0x72, 0x3B, 0}, + {gUnknown_085EDAE5, gUnknown_085EDC00, 0x19, 0x43, 0}, + {gUnknown_085EDAF4, gUnknown_085EDC45, 0x39, 0x39, 1}, + {gUnknown_085EDB00, gUnknown_085EDC84, 0x86, 0x29, 1}, +}; // code -void sub_80C50D0(void) +static void ResetGpuRegsAndBgs(void) { SetGpuReg(REG_OFFSET_DISPCNT, 0); SetGpuReg(REG_OFFSET_BG3CNT, 0); @@ -160,102 +553,102 @@ void ShowFrontierPass(void (*callback)(void)) SetMainCallback2(CB2_InitFrontierPass); } -void LeaveFrontierPass(void) +static void LeaveFrontierPass(void) { - SetMainCallback2(gUnknown_02039CEC->callback); + SetMainCallback2(sPassData->callback); FreeFrontierPassData(); } -u32 AllocateFrontierPassData(void (*callback)(void)) +static u32 AllocateFrontierPassData(void (*callback)(void)) { u8 i; - if (gUnknown_02039CEC != NULL) + if (sPassData != NULL) return 1; - gUnknown_02039CEC = AllocZeroed(sizeof(*gUnknown_02039CEC)); - if (gUnknown_02039CEC == NULL) + sPassData = AllocZeroed(sizeof(*sPassData)); + if (sPassData == NULL) return 2; - gUnknown_02039CEC->callback = callback; + sPassData->callback = callback; i = GetCurrentRegionMapSectionId(); if (i != MAPSEC_BATTLE_FRONTIER && i != MAPSEC_ARTISAN_CAVE) { - gUnknown_02039CEC->cursorX = 176; - gUnknown_02039CEC->cursorY = 104; + sPassData->cursorX = 176; + sPassData->cursorY = 104; } else { - gUnknown_02039CEC->cursorX = 176; - gUnknown_02039CEC->cursorY = 48; + sPassData->cursorX = 176; + sPassData->cursorY = 48; } - gUnknown_02039CEC->battlePoints = gSaveBlock2Ptr->frontier.battlePoints; - gUnknown_02039CEC->hasBattleRecord = CanCopyRecordedBattleSaveData(); - gUnknown_02039CEC->unkE = 0; - gUnknown_02039CEC->trainerStars = CountPlayerTrainerStars(); + sPassData->battlePoints = gSaveBlock2Ptr->frontier.battlePoints; + sPassData->hasBattleRecord = CanCopyRecordedBattleSaveData(); + sPassData->unkE = 0; + sPassData->trainerStars = CountPlayerTrainerStars(); for (i = 0; i < 7; i++) { if (FlagGet(FLAG_SYS_TOWER_SILVER + i * 2)) - gUnknown_02039CEC->facilitySymbols[i]++; + sPassData->facilitySymbols[i]++; if (FlagGet(FLAG_SYS_TOWER_GOLD + i * 2)) - gUnknown_02039CEC->facilitySymbols[i]++; + sPassData->facilitySymbols[i]++; } return 0; } -u32 FreeFrontierPassData(void) +static u32 FreeFrontierPassData(void) { - if (gUnknown_02039CEC == NULL) + if (sPassData == NULL) return 1; - memset(gUnknown_02039CEC, 0, sizeof(*gUnknown_02039CEC)); // Why clear data, if it's going to be freed anyway? - FREE_AND_SET_NULL(gUnknown_02039CEC); + memset(sPassData, 0, sizeof(*sPassData)); // Why clear data, if it's going to be freed anyway? + FREE_AND_SET_NULL(sPassData); return 0; } -u32 AllocateFrontierPassGfx(void) +static u32 AllocateFrontierPassGfx(void) { - if (gUnknown_02039CF0 != NULL) + if (sPassGfx != NULL) return 1; - gUnknown_02039CF0 = AllocZeroed(sizeof(*gUnknown_02039CF0)); - if (gUnknown_02039CF0 == NULL) + sPassGfx = AllocZeroed(sizeof(*sPassGfx)); + if (sPassGfx == NULL) return 2; return 0; } -u32 FreeFrontierPassGfx(void) +static u32 FreeFrontierPassGfx(void) { FreeAllWindowBuffers(); - if (gUnknown_02039CF0 == NULL) + if (sPassGfx == NULL) return 1; - if (gUnknown_02039CF0->unk28 != NULL) - FREE_AND_SET_NULL(gUnknown_02039CF0->unk28); - if (gUnknown_02039CF0->unk24 != NULL) - FREE_AND_SET_NULL(gUnknown_02039CF0->unk24); - if (gUnknown_02039CF0->unk20 != NULL) - FREE_AND_SET_NULL(gUnknown_02039CF0->unk20); + if (sPassGfx->unk28 != NULL) + FREE_AND_SET_NULL(sPassGfx->unk28); + if (sPassGfx->unk24 != NULL) + FREE_AND_SET_NULL(sPassGfx->unk24); + if (sPassGfx->unk20 != NULL) + FREE_AND_SET_NULL(sPassGfx->unk20); - memset(gUnknown_02039CF0, 0, sizeof(*gUnknown_02039CF0)); // Why clear data, if it's going to be freed anyway? - FREE_AND_SET_NULL(gUnknown_02039CF0); + memset(sPassGfx, 0, sizeof(*sPassGfx)); // Why clear data, if it's going to be freed anyway? + FREE_AND_SET_NULL(sPassGfx); return 0; } -void VblankCb_FrontierPass(void) +static void VblankCb_FrontierPass(void) { - if (gUnknown_02039CF0->setAffine) + if (sPassGfx->setAffine) { SetBgAffine(2, - gUnknown_085713E0[gUnknown_02039CEC->unkE - 1][0] << 8, - gUnknown_085713E0[gUnknown_02039CEC->unkE - 1][1] << 8, - gUnknown_085713E0[gUnknown_02039CEC->unkE - 1][0], - gUnknown_085713E0[gUnknown_02039CEC->unkE - 1][1], - gUnknown_02039CF0->unk2E, - gUnknown_02039CF0->unk30, + gUnknown_085713E0[sPassData->unkE - 1][0] << 8, + gUnknown_085713E0[sPassData->unkE - 1][1] << 8, + gUnknown_085713E0[sPassData->unkE - 1][0], + gUnknown_085713E0[sPassData->unkE - 1][1], + sPassGfx->unk2E, + sPassGfx->unk30, 0); } LoadOam(); @@ -263,14 +656,14 @@ void VblankCb_FrontierPass(void) TransferPlttBuffer(); } -void CB2_FrontierPass(void) +static void CB2_FrontierPass(void) { RunTasks(); AnimateSprites(); BuildOamBuffer(); } -void CB2_InitFrontierPass(void) +static void CB2_InitFrontierPass(void) { if (InitFrontierPass()) { @@ -279,7 +672,7 @@ void CB2_InitFrontierPass(void) } } -void CB2_HideFrontierPass(void) +static void CB2_HideFrontierPass(void) { if (HideFrontierPass()) { @@ -287,11 +680,11 @@ void CB2_HideFrontierPass(void) } } -bool32 InitFrontierPass(void) +static bool32 InitFrontierPass(void) { u32 sizeOut = 0; - switch (gUnknown_02039CEC->state) + switch (sPassData->state) { case 0: SetVBlankCallback(NULL); @@ -300,7 +693,7 @@ bool32 InitFrontierPass(void) DisableInterrupts(INTR_FLAG_HBLANK); break; case 1: - sub_80C50D0(); + ResetGpuRegsAndBgs(); break; case 2: ResetTasks(); @@ -314,20 +707,20 @@ bool32 InitFrontierPass(void) break; case 4: ResetBgsAndClearDma3BusyFlags(0); - InitBgsFromTemplates(1, gUnknown_085713E8, ARRAY_COUNT(gUnknown_085713E8)); - SetBgTilemapBuffer(1, gUnknown_02039CF0->tilemapBuff1); - SetBgTilemapBuffer(2, gUnknown_02039CF0->tilemapBuff2); - SetBgTilemapBuffer(3, gUnknown_02039CF0->tilemapBuff3); + InitBgsFromTemplates(1, sPassBgTemplates, ARRAY_COUNT(sPassBgTemplates)); + SetBgTilemapBuffer(1, sPassGfx->tilemapBuff1); + SetBgTilemapBuffer(2, sPassGfx->tilemapBuff2); + SetBgTilemapBuffer(3, sPassGfx->tilemapBuff3); SetBgAttribute(2, BG_ATTR_WRAPAROUND, 1); break; case 5: - InitWindows(gUnknown_08571400); + InitWindows(sPassWindowTemplates); DeactivateAllTextPrinters(); break; case 6: - gUnknown_02039CF0->unk20 = malloc_and_decompress(gUnknown_085712F8, &sizeOut); - gUnknown_02039CF0->unk24 = malloc_and_decompress(gUnknown_08571060, &sizeOut); - gUnknown_02039CF0->unk28 = malloc_and_decompress(gUnknown_085712C0, &sizeOut); + sPassGfx->unk20 = malloc_and_decompress(gUnknown_085712F8, &sizeOut); + sPassGfx->unk24 = malloc_and_decompress(gUnknown_08571060, &sizeOut); + sPassGfx->unk28 = malloc_and_decompress(gUnknown_085712C0, &sizeOut); decompress_and_copy_tile_data_to_vram(1, gUnknown_08DE08C8, 0, 0, 0); decompress_and_copy_tile_data_to_vram(2, gUnknown_08DE2084, 0, 0, 0); break; @@ -343,13 +736,13 @@ bool32 InitFrontierPass(void) break; case 8: LoadPalette(gUnknown_08DE07C8[0], 0, 0x1A0); - LoadPalette(gUnknown_08DE07C8[1 + gUnknown_02039CEC->trainerStars], 0x10, 0x20); + LoadPalette(gUnknown_08DE07C8[1 + sPassData->trainerStars], 0x10, 0x20); LoadPalette(stdpal_get(0), 0xF0, 0x20); sub_80C629C(); - sub_80C6104(gUnknown_02039CEC->cursorArea, gUnknown_02039CEC->previousCursorArea); - if (gUnknown_02039CEC->unkE == 1 || gUnknown_02039CEC->unkE == 2) + sub_80C6104(sPassData->cursorArea, sPassData->previousCursorArea); + if (sPassData->unkE == 1 || sPassData->unkE == 2) { - gUnknown_02039CEC->state = 0; + sPassData->state = 0; return TRUE; } break; @@ -369,26 +762,26 @@ bool32 InitFrontierPass(void) if (UpdatePaletteFade()) return FALSE; - gUnknown_02039CEC->state = 0; + sPassData->state = 0; return TRUE; } - gUnknown_02039CEC->state++; + sPassData->state++; return FALSE; } -bool32 HideFrontierPass(void) +static bool32 HideFrontierPass(void) { - switch (gUnknown_02039CEC->state) + switch (sPassData->state) { case 0: - if (gUnknown_02039CEC->unkE != 1 && gUnknown_02039CEC->unkE != 2) + if (sPassData->unkE != 1 && sPassData->unkE != 2) { BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); } else { - gUnknown_02039CEC->state = 2; + sPassData->state = 2; return FALSE; } break; @@ -409,7 +802,7 @@ bool32 HideFrontierPass(void) FreeCursorAndSymbolSprites(); break; case 4: - sub_80C50D0(); + ResetGpuRegsAndBgs(); ResetTasks(); ResetSpriteData(); FreeAllSpritePalettes(); @@ -419,34 +812,25 @@ bool32 HideFrontierPass(void) UnsetBgTilemapBuffer(1); UnsetBgTilemapBuffer(2); FreeFrontierPassGfx(); - gUnknown_02039CEC->state = 0; + sPassData->state = 0; return TRUE; } - gUnknown_02039CEC->state++; + sPassData->state++; return FALSE; } -struct -{ - s16 yStart; - s16 yEnd; - s16 xStart; - s16 xEnd; -} -extern const gUnknown_08571454[]; - -u8 GetCursorAreaFromCoords(s16 x, s16 y) +static u8 GetCursorAreaFromCoords(s16 x, s16 y) { u8 i; // Minus/Plus 1, because the table doesn't take into account the nothing field. for (i = 0; i < CURSOR_AREA_COUNT - 1; i++) { - if (gUnknown_08571454[i].yStart <= y && gUnknown_08571454[i].yEnd >= y - && gUnknown_08571454[i].xStart <= x && gUnknown_08571454[i].xEnd >= x) + if (sPassAreasLayout[i].yStart <= y && sPassAreasLayout[i].yEnd >= y + && sPassAreasLayout[i].xStart <= x && sPassAreasLayout[i].xEnd >= x) { - if (i >= CURSOR_AREA_SYMBOL - 1 && gUnknown_02039CEC->facilitySymbols[i - CURSOR_AREA_SYMBOL + 1] == 0) + if (i >= CURSOR_AREA_SYMBOL - 1 && sPassData->facilitySymbols[i - CURSOR_AREA_SYMBOL + 1] == 0) break; return i + 1; @@ -463,7 +847,7 @@ void CB2_ReshowFrontierPass(void) if (!InitFrontierPass()) return; - switch (gUnknown_02039CEC->unkE) + switch (sPassData->unkE) { case 1: case 2: @@ -472,7 +856,7 @@ void CB2_ReshowFrontierPass(void) break; case 3: default: - gUnknown_02039CEC->unkE = 0; + sPassData->unkE = 0; taskId = CreateTask(Task_HandleFrontierPassInput, 0); break; } @@ -480,12 +864,12 @@ void CB2_ReshowFrontierPass(void) SetMainCallback2(CB2_FrontierPass); } -void CB2_ReturnFromRecord(void) +static void CB2_ReturnFromRecord(void) { - AllocateFrontierPassData(gUnknown_02039CF8.callback); - gUnknown_02039CEC->cursorX = gUnknown_02039CF8.cursorX; - gUnknown_02039CEC->cursorY = gUnknown_02039CF8.cursorY; - memset(&gUnknown_02039CF8, 0, sizeof(gUnknown_02039CF8)); + AllocateFrontierPassData(sSavedPassData.callback); + sPassData->cursorX = sSavedPassData.cursorX; + sPassData->cursorY = sSavedPassData.cursorY; + memset(&sSavedPassData, 0, sizeof(sSavedPassData)); switch (InBattlePyramid()) { case 1: @@ -502,20 +886,20 @@ void CB2_ReturnFromRecord(void) SetMainCallback2(CB2_ReshowFrontierPass); } -void CB2_ShowFrontierPassFeature(void) +static void CB2_ShowFrontierPassFeature(void) { if (!HideFrontierPass()) return; - switch (gUnknown_02039CEC->unkE) + switch (sPassData->unkE) { case 1: ShowFrontierMap(CB2_ReshowFrontierPass); break; case 3: - gUnknown_02039CF8.callback = gUnknown_02039CEC->callback; - gUnknown_02039CF8.cursorX = gUnknown_02039CEC->cursorX; - gUnknown_02039CF8.cursorY = gUnknown_02039CEC->cursorY; + sSavedPassData.callback = sPassData->callback; + sSavedPassData.cursorX = sPassData->cursorX; + sSavedPassData.cursorY = sPassData->cursorY; FreeFrontierPassData(); PlayRecordedBattle(CB2_ReturnFromRecord); break; @@ -525,20 +909,20 @@ void CB2_ShowFrontierPassFeature(void) } } -bool32 TryCallPassAreaFunction(u8 taskId, u8 cursorArea) +static bool32 TryCallPassAreaFunction(u8 taskId, u8 cursorArea) { switch (cursorArea) { case CURSOR_AREA_RECORD: - if (!gUnknown_02039CEC->hasBattleRecord) + if (!sPassData->hasBattleRecord) return FALSE; - gUnknown_02039CEC->unkE = 3; + sPassData->unkE = 3; DestroyTask(taskId); SetMainCallback2(CB2_ShowFrontierPassFeature); break; case CURSOR_AREA_MAP: case CURSOR_AREA_CARD: - gUnknown_02039CEC->unkE = cursorArea; + sPassData->unkE = cursorArea; gTasks[taskId].func = Task_DoFadeEffect; gTasks[taskId].data[0] = FALSE; break; @@ -546,56 +930,56 @@ bool32 TryCallPassAreaFunction(u8 taskId, u8 cursorArea) return FALSE; } - gUnknown_02039CEC->cursorX = gUnknown_02039CF0->cursorSprite->pos1.x; - gUnknown_02039CEC->cursorY = gUnknown_02039CF0->cursorSprite->pos1.y; + sPassData->cursorX = sPassGfx->cursorSprite->pos1.x; + sPassData->cursorY = sPassGfx->cursorSprite->pos1.y; return TRUE; } -void Task_HandleFrontierPassInput(u8 taskId) +static void Task_HandleFrontierPassInput(u8 taskId) { u8 var = FALSE; // Reused, first informs whether the cursor moves, then used as the new cursor area. - if (gMain.heldKeys & DPAD_UP && gUnknown_02039CF0->cursorSprite->pos1.y >= 9) + if (gMain.heldKeys & DPAD_UP && sPassGfx->cursorSprite->pos1.y >= 9) { - gUnknown_02039CF0->cursorSprite->pos1.y -= 2; - if (gUnknown_02039CF0->cursorSprite->pos1.y <= 7) - gUnknown_02039CF0->cursorSprite->pos1.y = 2; + sPassGfx->cursorSprite->pos1.y -= 2; + if (sPassGfx->cursorSprite->pos1.y <= 7) + sPassGfx->cursorSprite->pos1.y = 2; var = TRUE; } - if (gMain.heldKeys & DPAD_DOWN && gUnknown_02039CF0->cursorSprite->pos1.y <= 135) + if (gMain.heldKeys & DPAD_DOWN && sPassGfx->cursorSprite->pos1.y <= 135) { - gUnknown_02039CF0->cursorSprite->pos1.y += 2; - if (gUnknown_02039CF0->cursorSprite->pos1.y >= 137) - gUnknown_02039CF0->cursorSprite->pos1.y = 136; + sPassGfx->cursorSprite->pos1.y += 2; + if (sPassGfx->cursorSprite->pos1.y >= 137) + sPassGfx->cursorSprite->pos1.y = 136; var = TRUE; } - if (gMain.heldKeys & DPAD_LEFT && gUnknown_02039CF0->cursorSprite->pos1.x >= 6) + if (gMain.heldKeys & DPAD_LEFT && sPassGfx->cursorSprite->pos1.x >= 6) { - gUnknown_02039CF0->cursorSprite->pos1.x -= 2; - if (gUnknown_02039CF0->cursorSprite->pos1.x <= 4) - gUnknown_02039CF0->cursorSprite->pos1.x = 5; + sPassGfx->cursorSprite->pos1.x -= 2; + if (sPassGfx->cursorSprite->pos1.x <= 4) + sPassGfx->cursorSprite->pos1.x = 5; var = TRUE; } - if (gMain.heldKeys & DPAD_RIGHT && gUnknown_02039CF0->cursorSprite->pos1.x <= 231) + if (gMain.heldKeys & DPAD_RIGHT && sPassGfx->cursorSprite->pos1.x <= 231) { - gUnknown_02039CF0->cursorSprite->pos1.x += 2; - if (gUnknown_02039CF0->cursorSprite->pos1.x >= 233) - gUnknown_02039CF0->cursorSprite->pos1.x = 232; + sPassGfx->cursorSprite->pos1.x += 2; + if (sPassGfx->cursorSprite->pos1.x >= 233) + sPassGfx->cursorSprite->pos1.x = 232; var = TRUE; } if (!var) // Cursor did not change. { - if (gUnknown_02039CEC->cursorArea != CURSOR_AREA_NOTHING && gMain.newKeys & A_BUTTON) + if (sPassData->cursorArea != CURSOR_AREA_NOTHING && gMain.newKeys & A_BUTTON) { - if (gUnknown_02039CEC->cursorArea <= CURSOR_AREA_RECORD) // Map, Card, Record + if (sPassData->cursorArea <= CURSOR_AREA_RECORD) // Map, Card, Record { PlaySE(SE_SELECT); - if (TryCallPassAreaFunction(taskId, gUnknown_02039CEC->cursorArea)) + if (TryCallPassAreaFunction(taskId, sPassData->cursorArea)) return; } - else if (gUnknown_02039CEC->cursorArea == CURSOR_AREA_CANCEL) + else if (sPassData->cursorArea == CURSOR_AREA_CANCEL) { PlaySE(SE_PC_OFF); SetMainCallback2(CB2_HideFrontierPass); @@ -613,22 +997,22 @@ void Task_HandleFrontierPassInput(u8 taskId) } else { - var = GetCursorAreaFromCoords(gUnknown_02039CF0->cursorSprite->pos1.x - 5, gUnknown_02039CF0->cursorSprite->pos1.y + 5); - if (gUnknown_02039CEC->cursorArea != var) + var = GetCursorAreaFromCoords(sPassGfx->cursorSprite->pos1.x - 5, sPassGfx->cursorSprite->pos1.y + 5); + if (sPassData->cursorArea != var) { PrintAreaDescription(var); - gUnknown_02039CEC->previousCursorArea = gUnknown_02039CEC->cursorArea; - gUnknown_02039CEC->cursorArea = var; - sub_80C6104(gUnknown_02039CEC->cursorArea, gUnknown_02039CEC->previousCursorArea); + sPassData->previousCursorArea = sPassData->cursorArea; + sPassData->cursorArea = var; + sub_80C6104(sPassData->cursorArea, sPassData->previousCursorArea); } } } -void Task_DoFadeEffect(u8 taskId) +static void Task_DoFadeEffect(u8 taskId) { s16 *data = gTasks[taskId].data; - switch (gUnknown_02039CEC->state) + switch (sPassData->state) { case 0: if (!data[0]) @@ -655,16 +1039,16 @@ void Task_DoFadeEffect(u8 taskId) BlendPalettes(0xFFFFFFFF, 0x10, RGB_WHITE); BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_WHITE); } - gUnknown_02039CF0->setAffine = TRUE; - gUnknown_02039CF0->unk2E = sub_8151624(data[1]); - gUnknown_02039CF0->unk30 = sub_8151624(data[2]); + sPassGfx->setAffine = TRUE; + sPassGfx->unk2E = sub_8151624(data[1]); + sPassGfx->unk30 = sub_8151624(data[2]); break; case 1: UpdatePaletteFade(); data[1] += data[3]; data[2] += data[4]; - gUnknown_02039CF0->unk2E = sub_8151624(data[1]); - gUnknown_02039CF0->unk30 = sub_8151624(data[2]); + sPassGfx->unk2E = sub_8151624(data[1]); + sPassGfx->unk30 = sub_8151624(data[2]); if (!data[0]) { if (data[1] <= 0x1FC) @@ -677,8 +1061,8 @@ void Task_DoFadeEffect(u8 taskId) } break; case 2: - if (gUnknown_02039CF0->setAffine) // Nonsensical check. - gUnknown_02039CF0->setAffine = FALSE; + if (sPassGfx->setAffine) // Nonsensical check. + sPassGfx->setAffine = FALSE; if (UpdatePaletteFade()) return; if (!data[0]) @@ -689,18 +1073,18 @@ void Task_DoFadeEffect(u8 taskId) else { sub_80C5F58(FALSE, FALSE); - gUnknown_02039CEC->unkE = 0; + sPassData->unkE = 0; gTasks[taskId].func = Task_HandleFrontierPassInput; } SetBgAttribute(2, BG_ATTR_WRAPAROUND, 0); - gUnknown_02039CEC->state = 0; + sPassData->state = 0; return; } - gUnknown_02039CEC->state++; + sPassData->state++; } -void ShowAndPrintWindows(void) +static void ShowAndPrintWindows(void) { s32 x; u8 i; @@ -712,19 +1096,19 @@ void ShowAndPrintWindows(void) } x = GetStringCenterAlignXOffset(1, gText_SymbolsEarned, 0x60); - AddTextPrinterParameterized3(WINDOW_EARNED_SYMBOLS, 1, x, 5, gUnknown_08571448[0], 0, gText_SymbolsEarned); + AddTextPrinterParameterized3(WINDOW_EARNED_SYMBOLS, 1, x, 5, sTextColors[0], 0, gText_SymbolsEarned); x = GetStringCenterAlignXOffset(1, gText_BattleRecord, 0x60); - AddTextPrinterParameterized3(WINDOW_BATTLE_RECORD, 1, x, 5, gUnknown_08571448[0], 0, gText_BattleRecord); + AddTextPrinterParameterized3(WINDOW_BATTLE_RECORD, 1, x, 5, sTextColors[0], 0, gText_BattleRecord); - AddTextPrinterParameterized3(WINDOW_BATTLE_POINTS, 8, 5, 4, gUnknown_08571448[0], 0, gText_BattlePoints); - ConvertIntToDecimalStringN(gStringVar4, gUnknown_02039CEC->battlePoints, STR_CONV_MODE_LEFT_ALIGN, 5); + AddTextPrinterParameterized3(WINDOW_BATTLE_POINTS, 8, 5, 4, sTextColors[0], 0, gText_BattlePoints); + ConvertIntToDecimalStringN(gStringVar4, sPassData->battlePoints, STR_CONV_MODE_LEFT_ALIGN, 5); x = GetStringRightAlignXOffset(8, gStringVar4, 0x5B); - AddTextPrinterParameterized3(WINDOW_BATTLE_POINTS, 8, x, 16, gUnknown_08571448[0], 0, gStringVar4); + AddTextPrinterParameterized3(WINDOW_BATTLE_POINTS, 8, x, 16, sTextColors[0], 0, gStringVar4); - gUnknown_02039CEC->cursorArea = GetCursorAreaFromCoords(gUnknown_02039CEC->cursorX - 5, gUnknown_02039CEC->cursorY + 5); - gUnknown_02039CEC->previousCursorArea = CURSOR_AREA_NOTHING; - PrintAreaDescription(gUnknown_02039CEC->cursorArea); + sPassData->cursorArea = GetCursorAreaFromCoords(sPassData->cursorX - 5, sPassData->cursorY + 5); + sPassData->previousCursorArea = CURSOR_AREA_NOTHING; + PrintAreaDescription(sPassData->cursorArea); for (i = 0; i < WINDOW_COUNT; i++) CopyWindowToVram(i, 3); @@ -732,31 +1116,31 @@ void ShowAndPrintWindows(void) CopyBgTilemapBufferToVram(0); } -void PrintAreaDescription(u8 cursorArea) +static void PrintAreaDescription(u8 cursorArea) { FillWindowPixelBuffer(WINDOW_DESCRIPTION, 0); - if (cursorArea == CURSOR_AREA_RECORD && !gUnknown_02039CEC->hasBattleRecord) - AddTextPrinterParameterized3(WINDOW_DESCRIPTION, 1, 2, 0, gUnknown_08571448[1], 0, gUnknown_08571614[0]); + if (cursorArea == CURSOR_AREA_RECORD && !sPassData->hasBattleRecord) + AddTextPrinterParameterized3(WINDOW_DESCRIPTION, 1, 2, 0, sTextColors[1], 0, sPassAreaDescriptions[0]); else if (cursorArea != CURSOR_AREA_NOTHING) - AddTextPrinterParameterized3(WINDOW_DESCRIPTION, 1, 2, 0, gUnknown_08571448[1], 0, gUnknown_08571614[cursorArea]); + AddTextPrinterParameterized3(WINDOW_DESCRIPTION, 1, 2, 0, sTextColors[1], 0, sPassAreaDescriptions[cursorArea]); CopyWindowToVram(WINDOW_DESCRIPTION, 3); CopyBgTilemapBufferToVram(0); } -void sub_80C5F58(bool8 arg0, bool8 arg1) +static void sub_80C5F58(bool8 arg0, bool8 arg1) { - switch (gUnknown_02039CEC->unkE) + switch (sPassData->unkE) { case 1: if (arg0) - CopyToBgTilemapBufferRect_ChangePalette(2, gUnknown_02039CF0->unk20, 16, 3, 12, 7, 16); + CopyToBgTilemapBufferRect_ChangePalette(2, sPassGfx->unk20, 16, 3, 12, 7, 16); else FillBgTilemapBufferRect(2, 0, 16, 3, 12, 7, 16); break; case 2: if (arg0) - CopyToBgTilemapBufferRect_ChangePalette(2, gUnknown_02039CF0->unk20 + 84, 16, 10, 12, 7, 16); + CopyToBgTilemapBufferRect_ChangePalette(2, sPassGfx->unk20 + 84, 16, 10, 12, 7, 16); else FillBgTilemapBufferRect(2, 0, 16, 10, 12, 7, 16); break; @@ -768,10 +1152,10 @@ void sub_80C5F58(bool8 arg0, bool8 arg1) if (arg1) { SetBgAffine(2, - gUnknown_085713E0[gUnknown_02039CEC->unkE - 1][0] << 8, - gUnknown_085713E0[gUnknown_02039CEC->unkE - 1][1] << 8, - gUnknown_085713E0[gUnknown_02039CEC->unkE - 1][0], - gUnknown_085713E0[gUnknown_02039CEC->unkE - 1][1], + gUnknown_085713E0[sPassData->unkE - 1][0] << 8, + gUnknown_085713E0[sPassData->unkE - 1][1] << 8, + gUnknown_085713E0[sPassData->unkE - 1][0], + gUnknown_085713E0[sPassData->unkE - 1][1], sub_8151624(0x1FC), sub_8151624(0x1FC), 0); @@ -779,38 +1163,38 @@ void sub_80C5F58(bool8 arg0, bool8 arg1) else { SetBgAffine(2, - gUnknown_085713E0[gUnknown_02039CEC->unkE - 1][0] << 8, - gUnknown_085713E0[gUnknown_02039CEC->unkE - 1][1] << 8, - gUnknown_085713E0[gUnknown_02039CEC->unkE - 1][0], - gUnknown_085713E0[gUnknown_02039CEC->unkE - 1][1], + gUnknown_085713E0[sPassData->unkE - 1][0] << 8, + gUnknown_085713E0[sPassData->unkE - 1][1] << 8, + gUnknown_085713E0[sPassData->unkE - 1][0], + gUnknown_085713E0[sPassData->unkE - 1][1], sub_8151624(0x100), sub_8151624(0x100), 0); } } -void sub_80C6104(u8 cursorArea, u8 previousCursorArea) +static void sub_80C6104(u8 cursorArea, u8 previousCursorArea) { bool32 var; switch (previousCursorArea) { case CURSOR_AREA_MAP: - CopyToBgTilemapBufferRect_ChangePalette(1, gUnknown_02039CF0->unk24, 16, 3, 12, 7, 17); + CopyToBgTilemapBufferRect_ChangePalette(1, sPassGfx->unk24, 16, 3, 12, 7, 17); var = TRUE; break; case CURSOR_AREA_CARD: - CopyToBgTilemapBufferRect_ChangePalette(1, gUnknown_02039CF0->unk24 + 336, 16, 10, 12, 7, 17); + CopyToBgTilemapBufferRect_ChangePalette(1, sPassGfx->unk24 + 336, 16, 10, 12, 7, 17); var = TRUE; break; case CURSOR_AREA_RECORD: - if (!gUnknown_02039CEC->hasBattleRecord) + if (!sPassData->hasBattleRecord) { var = FALSE; } else { - CopyToBgTilemapBufferRect_ChangePalette(1, gUnknown_02039CF0->unk28, 2, 10, 12, 3, 17); + CopyToBgTilemapBufferRect_ChangePalette(1, sPassGfx->unk28, 2, 10, 12, 3, 17); var = TRUE; } break; @@ -832,18 +1216,18 @@ void sub_80C6104(u8 cursorArea, u8 previousCursorArea) switch (cursorArea) { case CURSOR_AREA_MAP: - CopyToBgTilemapBufferRect_ChangePalette(1, gUnknown_02039CF0->unk24 + 168, 16, 3, 12, 7, 17); + CopyToBgTilemapBufferRect_ChangePalette(1, sPassGfx->unk24 + 168, 16, 3, 12, 7, 17); var = TRUE; break; case CURSOR_AREA_CARD: - CopyToBgTilemapBufferRect_ChangePalette(1, gUnknown_02039CF0->unk24 + 504, 16, 10, 12, 7, 17); + CopyToBgTilemapBufferRect_ChangePalette(1, sPassGfx->unk24 + 504, 16, 10, 12, 7, 17); var = TRUE; break; case CURSOR_AREA_RECORD: - if (!gUnknown_02039CEC->hasBattleRecord) + if (!sPassData->hasBattleRecord) return; - CopyToBgTilemapBufferRect_ChangePalette(1, gUnknown_02039CF0->unk28 + 72, 2, 10, 12, 3, 17); + CopyToBgTilemapBufferRect_ChangePalette(1, sPassGfx->unk28 + 72, 2, 10, 12, 3, 17); var = TRUE; break; case CURSOR_AREA_CANCEL: @@ -865,56 +1249,56 @@ void sub_80C6104(u8 cursorArea, u8 previousCursorArea) CopyBgTilemapBufferToVram(1); } -void sub_80C629C(void) +static void sub_80C629C(void) { CopyToBgTilemapBuffer(1, gUnknown_08DE3060, 0, 0); - sub_80C6104(gUnknown_02039CEC->cursorArea, gUnknown_02039CEC->previousCursorArea); - sub_80C5F58(TRUE, gUnknown_02039CEC->unkE); + sub_80C6104(sPassData->cursorArea, sPassData->previousCursorArea); + sub_80C5F58(TRUE, sPassData->unkE); ShowAndPrintWindows(); CopyBgTilemapBufferToVram(1); } -void LoadCursorAndSymbolSprites(void) +static void LoadCursorAndSymbolSprites(void) { u8 spriteId; u8 i = 0; FreeAllSpritePalettes(); ResetAffineAnimData(); - LoadSpritePalettes(gUnknown_085714E4); - LoadCompressedSpriteSheet(&gUnknown_085714BC[0]); - LoadCompressedSpriteSheet(&gUnknown_085714BC[2]); - spriteId = CreateSprite(&gUnknown_085715B4[0], gUnknown_02039CEC->cursorX, gUnknown_02039CEC->cursorY, 0); - gUnknown_02039CF0->cursorSprite = &gSprites[spriteId]; - gUnknown_02039CF0->cursorSprite->oam.priority = 0; + LoadSpritePalettes(sSpritePalettes); + LoadCompressedSpriteSheet(&sCursorSpriteSheets[0]); + LoadCompressedSpriteSheet(&sCursorSpriteSheets[2]); + spriteId = CreateSprite(&sSpriteTemplates_Cursors[0], sPassData->cursorX, sPassData->cursorY, 0); + sPassGfx->cursorSprite = &gSprites[spriteId]; + sPassGfx->cursorSprite->oam.priority = 0; for (i = 0; i < NUM_FRONTIER_FACILITIES; i++) { - if (gUnknown_02039CEC->facilitySymbols[i] != 0) + if (sPassData->facilitySymbols[i] != 0) { - struct SpriteTemplate sprite = gUnknown_085715E4; + struct SpriteTemplate sprite = sSpriteTemplate_Medal; - sprite.paletteTag += gUnknown_02039CEC->facilitySymbols[i] - 1; - spriteId = CreateSprite(&sprite, gUnknown_08571454[i + CURSOR_AREA_SYMBOL - 1].xStart + 8, gUnknown_08571454[i + CURSOR_AREA_SYMBOL - 1].yStart + 6, i + 1); - gUnknown_02039CF0->symbolSprites[i] = &gSprites[spriteId]; - gUnknown_02039CF0->symbolSprites[i]->oam.priority = 2; - StartSpriteAnim(gUnknown_02039CF0->symbolSprites[i], i); + sprite.paletteTag += sPassData->facilitySymbols[i] - 1; + spriteId = CreateSprite(&sprite, sPassAreasLayout[i + CURSOR_AREA_SYMBOL - 1].xStart + 8, sPassAreasLayout[i + CURSOR_AREA_SYMBOL - 1].yStart + 6, i + 1); + sPassGfx->symbolSprites[i] = &gSprites[spriteId]; + sPassGfx->symbolSprites[i]->oam.priority = 2; + StartSpriteAnim(sPassGfx->symbolSprites[i], i); } } } -void FreeCursorAndSymbolSprites(void) +static void FreeCursorAndSymbolSprites(void) { u8 i = 0; - DestroySprite(gUnknown_02039CF0->cursorSprite); - gUnknown_02039CF0->cursorSprite = NULL; + DestroySprite(sPassGfx->cursorSprite); + sPassGfx->cursorSprite = NULL; for (i = 0; i < NUM_FRONTIER_FACILITIES; i++) { - if (gUnknown_02039CF0->symbolSprites[i] != NULL) + if (sPassGfx->symbolSprites[i] != NULL) { - DestroySprite(gUnknown_02039CF0->symbolSprites[i]); - gUnknown_02039CF0->symbolSprites[i] = NULL; + DestroySprite(sPassGfx->symbolSprites[i]); + sPassGfx->symbolSprites[i] = NULL; } } FreeAllSpritePalettes(); @@ -922,62 +1306,42 @@ void FreeCursorAndSymbolSprites(void) FreeSpriteTilesByTag(0); } -void nullsub_39(void) +static void SpriteCb_Dummy(struct Sprite *sprite) { } // Frontier Map code. -struct FrontierMapData -{ - void (*callback)(void); - struct Sprite *cursorSprite; - struct Sprite *playerHeadSprite; - struct Sprite *mapIndicatorSprite; - u8 cursorPos; - u8 unk11; - u8 tilemapBuff0[0x1000]; - u8 tilemapBuff1[0x1000]; - u8 tilemapBuff2[0x1000]; -}; - -extern struct FrontierMapData *gUnknown_02039CF4; - // Forward declarations. -void sub_80C67BC(u8 taskId); -void sub_80C6B94(void); -void sub_80C6974(void); -void sub_80C6C70(u8 direction); - -extern const struct BgTemplate gUnknown_085713F4[3]; -extern const struct WindowTemplate gUnknown_08571428[]; -extern const u32 gUnknown_0856FBBC[]; -extern const u32 gUnknown_08570E00[]; +static void Task_HandleFrontierMap(u8 taskId); +static void PrintOnFrontierMap(void); +static void InitFrontierMapSprites(void); +static void HandleFrontierMapCursorMove(u8 direction); -void ShowFrontierMap(void (*callback)(void)) +static void ShowFrontierMap(void (*callback)(void)) { - if (gUnknown_02039CF4 != NULL) + if (sMapData != NULL) SetMainCallback2(callback); // This line doesn't make sense at all, since it gets overwritten later anyway. - gUnknown_02039CF4 = AllocZeroed(sizeof(*gUnknown_02039CF4)); - gUnknown_02039CF4->callback = callback; + sMapData = AllocZeroed(sizeof(*sMapData)); + sMapData->callback = callback; ResetTasks(); - CreateTask(sub_80C67BC, 0); + CreateTask(Task_HandleFrontierMap, 0); SetMainCallback2(CB2_FrontierPass); } -void sub_80C6498(void) +static void FreeFrontierMap(void) { ResetTasks(); - SetMainCallback2(gUnknown_02039CF4->callback); - memset(gUnknown_02039CF4, 0, sizeof(*gUnknown_02039CF4)); // Pointless memory clear. - FREE_AND_SET_NULL(gUnknown_02039CF4); + SetMainCallback2(sMapData->callback); + memset(sMapData, 0, sizeof(*sMapData)); // Pointless memory clear. + FREE_AND_SET_NULL(sMapData); } -bool32 sub_80C64CC(void) +static bool32 InitFrontierMap(void) { - switch (gUnknown_02039CEC->state) + switch (sPassData->state) { case 0: SetVBlankCallback(NULL); @@ -985,7 +1349,7 @@ bool32 sub_80C64CC(void) SetVBlankHBlankCallbacksToNull(); break; case 1: - sub_80C50D0(); + ResetGpuRegsAndBgs(); break; case 2: ResetSpriteData(); @@ -995,10 +1359,10 @@ bool32 sub_80C64CC(void) break; case 3: ResetBgsAndClearDma3BusyFlags(0); - InitBgsFromTemplates(0, gUnknown_085713F4, ARRAY_COUNT(gUnknown_085713F4)); - SetBgTilemapBuffer(0, gUnknown_02039CF4->tilemapBuff0); - SetBgTilemapBuffer(1, gUnknown_02039CF4->tilemapBuff1); - SetBgTilemapBuffer(2, gUnknown_02039CF4->tilemapBuff2); + InitBgsFromTemplates(0, sMapBgTemplates, ARRAY_COUNT(sMapBgTemplates)); + SetBgTilemapBuffer(0, sMapData->tilemapBuff0); + SetBgTilemapBuffer(1, sMapData->tilemapBuff1); + SetBgTilemapBuffer(2, sMapData->tilemapBuff2); FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20); FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 30, 20); FillBgTilemapBufferRect_Palette0(2, 0, 0, 0, 30, 20); @@ -1007,9 +1371,9 @@ bool32 sub_80C64CC(void) CopyBgTilemapBufferToVram(2); break; case 4: - InitWindows(gUnknown_08571428); + InitWindows(sMapWindowTemplates); DeactivateAllTextPrinters(); - sub_80C6B94(); + PrintOnFrontierMap(); decompress_and_copy_tile_data_to_vram(1, gUnknown_0856FBBC, 0, 0, 0); break; case 5: @@ -1025,7 +1389,7 @@ bool32 sub_80C64CC(void) ShowBg(0); ShowBg(1); ShowBg(2); - sub_80C6974(); + InitFrontierMapSprites(); SetVBlankCallback(VblankCb_FrontierPass); BlendPalettes(0xFFFFFFFF, 0x10, RGB_WHITE); BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_WHITE); @@ -1033,17 +1397,17 @@ bool32 sub_80C64CC(void) case 7: if (UpdatePaletteFade()) return FALSE; - gUnknown_02039CEC->state = 0; + sPassData->state = 0; return TRUE; } - gUnknown_02039CEC->state++; + sPassData->state++; return FALSE; } -bool32 sub_80C66AC(void) +static bool32 ExitFrontierMap(void) { - switch (gUnknown_02039CEC->state) + switch (sPassData->state) { case 0: BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_WHITE); @@ -1062,25 +1426,25 @@ bool32 sub_80C66AC(void) SetVBlankHBlankCallbacksToNull(); break; case 3: - if (gUnknown_02039CF4->cursorSprite != NULL) + if (sMapData->cursorSprite != NULL) { - DestroySprite(gUnknown_02039CF4->cursorSprite); + DestroySprite(sMapData->cursorSprite); FreeSpriteTilesByTag(0); } - if (gUnknown_02039CF4->mapIndicatorSprite != NULL) + if (sMapData->mapIndicatorSprite != NULL) { - DestroySprite(gUnknown_02039CF4->mapIndicatorSprite); + DestroySprite(sMapData->mapIndicatorSprite); FreeSpriteTilesByTag(1); } - if (gUnknown_02039CF4->playerHeadSprite != NULL) + if (sMapData->playerHeadSprite != NULL) { - DestroySprite(gUnknown_02039CF4->playerHeadSprite); + DestroySprite(sMapData->playerHeadSprite); FreeSpriteTilesByTag(4); } FreeAllWindowBuffers(); break; case 4: - sub_80C50D0(); + ResetGpuRegsAndBgs(); ResetSpriteData(); FreeAllSpritePalettes(); break; @@ -1088,22 +1452,22 @@ bool32 sub_80C66AC(void) UnsetBgTilemapBuffer(0); UnsetBgTilemapBuffer(1); UnsetBgTilemapBuffer(2); - gUnknown_02039CEC->state = 0; + sPassData->state = 0; return TRUE; } - gUnknown_02039CEC->state++; + sPassData->state++; return FALSE; } -void sub_80C67BC(u8 taskId) +static void Task_HandleFrontierMap(u8 taskId) { s16 *data = gTasks[taskId].data; switch (data[0]) { case 0: - if (sub_80C64CC()) + if (InitFrontierMap()) break; return; case 1: @@ -1114,15 +1478,15 @@ void sub_80C67BC(u8 taskId) } else if (gMain.newKeys & DPAD_DOWN) { - if (gUnknown_02039CF4->cursorPos >= NUM_FRONTIER_FACILITIES - 1) - sub_80C6C70(0); + if (sMapData->cursorPos >= NUM_FRONTIER_FACILITIES - 1) + HandleFrontierMapCursorMove(0); else data[0] = 2; } else if (gMain.newKeys & DPAD_UP) { - if (gUnknown_02039CF4->cursorPos == 0) - sub_80C6C70(1); + if (sMapData->cursorPos == 0) + HandleFrontierMapCursorMove(1); else data[0] = 3; } @@ -1130,43 +1494,43 @@ void sub_80C67BC(u8 taskId) case 2: if (data[1] > 3) { - sub_80C6C70(0); + HandleFrontierMapCursorMove(0); data[1] = 0; data[0] = 1; } else { - gUnknown_02039CF4->cursorSprite->pos1.y += 4; + sMapData->cursorSprite->pos1.y += 4; data[1]++; } return; case 3: if (data[1] > 3) { - sub_80C6C70(1); + HandleFrontierMapCursorMove(1); data[1] = 0; data[0] = 1; } else { - gUnknown_02039CF4->cursorSprite->pos1.y -= 4; + sMapData->cursorSprite->pos1.y -= 4; data[1]++; } return; case 4: - if (sub_80C66AC()) + if (ExitFrontierMap()) break; return; case 5: DestroyTask(taskId); - sub_80C6498(); + FreeFrontierMap(); return; } data[0]++; } -u8 sub_80C68E8(u16 mapNum) // id + 1, zero means not a frontier map number +static u8 MapNumToFrontierFacilityId(u16 mapNum) // id + 1, zero means not a frontier map number { if ((mapNum >= MAP_NUM(BATTLE_FRONTIER_BATTLE_TOWER_LOBBY) && mapNum <= MAP_NUM(BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM)) || (mapNum >= MAP_NUM(BATTLE_FRONTIER_BATTLE_TOWER_MULTI_BATTLE_ROOM) && mapNum <= MAP_NUM(BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM2))) @@ -1203,19 +1567,7 @@ u8 sub_80C68E8(u16 mapNum) // id + 1, zero means not a frontier map number return 0; } -struct -{ - const u8 *name; - const u8 *description; - s16 x; - s16 y; - u8 animNum; -} extern const gUnknown_08571650[]; - -extern const struct CompressedSpriteSheet gUnknown_085714D4[]; -extern const struct SpriteTemplate gUnknown_085715FC; - -void sub_80C6974(void) +static void InitFrontierMapSprites(void) { struct SpriteTemplate sprite; u8 spriteId; @@ -1223,20 +1575,20 @@ void sub_80C6974(void) s16 x = 0, y; FreeAllSpritePalettes(); - LoadSpritePalettes(gUnknown_085714E4); + LoadSpritePalettes(sSpritePalettes); - LoadCompressedSpriteSheet(&gUnknown_085714BC[0]); - spriteId = CreateSprite(&gUnknown_085715B4[0], 155, (gUnknown_02039CF4->cursorPos * 16) + 8, 2); - gUnknown_02039CF4->cursorSprite = &gSprites[spriteId]; - gUnknown_02039CF4->cursorSprite->oam.priority = 0; - gUnknown_02039CF4->cursorSprite->hFlip = TRUE; - StartSpriteAnim(gUnknown_02039CF4->cursorSprite, 1); + LoadCompressedSpriteSheet(&sCursorSpriteSheets[0]); + spriteId = CreateSprite(&sSpriteTemplates_Cursors[0], 155, (sMapData->cursorPos * 16) + 8, 2); + sMapData->cursorSprite = &gSprites[spriteId]; + sMapData->cursorSprite->oam.priority = 0; + sMapData->cursorSprite->hFlip = TRUE; + StartSpriteAnim(sMapData->cursorSprite, 1); - LoadCompressedSpriteSheet(&gUnknown_085714BC[1]); - spriteId = CreateSprite(&gUnknown_085715B4[1], gUnknown_08571650[gUnknown_02039CF4->cursorPos].x, gUnknown_08571650[gUnknown_02039CF4->cursorPos].y, 1); - gUnknown_02039CF4->mapIndicatorSprite = &gSprites[spriteId]; - gUnknown_02039CF4->mapIndicatorSprite->oam.priority = 0; - StartSpriteAnim(gUnknown_02039CF4->mapIndicatorSprite, gUnknown_08571650[gUnknown_02039CF4->cursorPos].animNum); + LoadCompressedSpriteSheet(&sCursorSpriteSheets[1]); + spriteId = CreateSprite(&sSpriteTemplates_Cursors[1], sMapLandmarks[sMapData->cursorPos].x, sMapLandmarks[sMapData->cursorPos].y, 1); + sMapData->mapIndicatorSprite = &gSprites[spriteId]; + sMapData->mapIndicatorSprite->oam.priority = 0; + StartSpriteAnim(sMapData->mapIndicatorSprite, sMapLandmarks[sMapData->cursorPos].animNum); // Create player indicator head sprite only if it's in vicinity of battle frontier. id = GetCurrentRegionMapSectionId(); @@ -1257,11 +1609,11 @@ void sub_80C6974(void) } else { - id = sub_80C68E8(mapNum); + id = MapNumToFrontierFacilityId(mapNum); if (id != 0) { - x = gUnknown_08571650[id - 1].x; - y = gUnknown_08571650[id - 1].y; + x = sMapLandmarks[id - 1].x; + y = sMapLandmarks[id - 1].y; } else { @@ -1278,8 +1630,8 @@ void sub_80C6974(void) } } - LoadCompressedSpriteSheet(gUnknown_085714D4); - sprite = gUnknown_085715FC; + LoadCompressedSpriteSheet(sHeadsSpriteSheet); + sprite = sSpriteTemplate_Head; sprite.paletteTag = gSaveBlock2Ptr->playerGender + 4; if (id != 0) { @@ -1292,22 +1644,14 @@ void sub_80C6974(void) spriteId = CreateSprite(&sprite, x + 20, y + 36, 0); } - gUnknown_02039CF4->playerHeadSprite = &gSprites[spriteId]; - gUnknown_02039CF4->playerHeadSprite->oam.priority = 0; + sMapData->playerHeadSprite = &gSprites[spriteId]; + sMapData->playerHeadSprite->oam.priority = 0; if (gSaveBlock2Ptr->playerGender != MALE) - StartSpriteAnim(gUnknown_02039CF4->playerHeadSprite, 1); + StartSpriteAnim(sMapData->playerHeadSprite, 1); } } -enum -{ - MAP_WINDOW_0, - MAP_WINDOW_NAME, - MAP_WINDOW_DESCRIPTION, - MAP_WINDOW_COUNT -}; - -void sub_80C6B94(void) +static void PrintOnFrontierMap(void) { u8 i; @@ -1319,13 +1663,13 @@ void sub_80C6B94(void) for (i = 0; i < NUM_FRONTIER_FACILITIES; i++) { - if (i == gUnknown_02039CF4->cursorPos) - AddTextPrinterParameterized3(MAP_WINDOW_NAME, 7, 4, (i * 16) + 1, gUnknown_08571448[2], 0, gUnknown_08571650[i].name); + if (i == sMapData->cursorPos) + AddTextPrinterParameterized3(MAP_WINDOW_NAME, 7, 4, (i * 16) + 1, sTextColors[2], 0, sMapLandmarks[i].name); else - AddTextPrinterParameterized3(MAP_WINDOW_NAME, 7, 4, (i * 16) + 1, gUnknown_08571448[1], 0, gUnknown_08571650[i].name); + AddTextPrinterParameterized3(MAP_WINDOW_NAME, 7, 4, (i * 16) + 1, sTextColors[1], 0, sMapLandmarks[i].name); } - AddTextPrinterParameterized3(MAP_WINDOW_DESCRIPTION, 1, 4, 0, gUnknown_08571448[0], 0, gUnknown_08571650[gUnknown_02039CF4->cursorPos].description); + AddTextPrinterParameterized3(MAP_WINDOW_DESCRIPTION, 1, 4, 0, sTextColors[0], 0, sMapLandmarks[sMapData->cursorPos].description); for (i = 0; i < MAP_WINDOW_COUNT; i++) CopyWindowToVram(i, 3); @@ -1333,31 +1677,31 @@ void sub_80C6B94(void) CopyBgTilemapBufferToVram(0); } -void sub_80C6C70(u8 direction) +static void HandleFrontierMapCursorMove(u8 direction) { u8 oldCursorPos, i; if (direction) { - oldCursorPos = gUnknown_02039CF4->cursorPos; - gUnknown_02039CF4->cursorPos = (oldCursorPos + 6) % NUM_FRONTIER_FACILITIES; + oldCursorPos = sMapData->cursorPos; + sMapData->cursorPos = (oldCursorPos + 6) % NUM_FRONTIER_FACILITIES; } else { - oldCursorPos = gUnknown_02039CF4->cursorPos; - gUnknown_02039CF4->cursorPos = (oldCursorPos + 1) % NUM_FRONTIER_FACILITIES; + oldCursorPos = sMapData->cursorPos; + sMapData->cursorPos = (oldCursorPos + 1) % NUM_FRONTIER_FACILITIES; } - AddTextPrinterParameterized3(MAP_WINDOW_NAME, 7, 4, (oldCursorPos * 16) + 1, gUnknown_08571448[1], 0, gUnknown_08571650[oldCursorPos].name); - AddTextPrinterParameterized3(MAP_WINDOW_NAME, 7, 4, (gUnknown_02039CF4->cursorPos * 16) + 1, gUnknown_08571448[2], 0, gUnknown_08571650[gUnknown_02039CF4->cursorPos].name); + AddTextPrinterParameterized3(MAP_WINDOW_NAME, 7, 4, (oldCursorPos * 16) + 1, sTextColors[1], 0, sMapLandmarks[oldCursorPos].name); + AddTextPrinterParameterized3(MAP_WINDOW_NAME, 7, 4, (sMapData->cursorPos * 16) + 1, sTextColors[2], 0, sMapLandmarks[sMapData->cursorPos].name); - gUnknown_02039CF4->cursorSprite->pos1.y = (gUnknown_02039CF4->cursorPos * 16) + 8; + sMapData->cursorSprite->pos1.y = (sMapData->cursorPos * 16) + 8; - StartSpriteAnim(gUnknown_02039CF4->mapIndicatorSprite, gUnknown_08571650[gUnknown_02039CF4->cursorPos].animNum); - gUnknown_02039CF4->mapIndicatorSprite->pos1.x = gUnknown_08571650[gUnknown_02039CF4->cursorPos].x; - gUnknown_02039CF4->mapIndicatorSprite->pos1.y = gUnknown_08571650[gUnknown_02039CF4->cursorPos].y; + StartSpriteAnim(sMapData->mapIndicatorSprite, sMapLandmarks[sMapData->cursorPos].animNum); + sMapData->mapIndicatorSprite->pos1.x = sMapLandmarks[sMapData->cursorPos].x; + sMapData->mapIndicatorSprite->pos1.y = sMapLandmarks[sMapData->cursorPos].y; FillWindowPixelBuffer(MAP_WINDOW_DESCRIPTION, 0); - AddTextPrinterParameterized3(MAP_WINDOW_DESCRIPTION, 1, 4, 0, gUnknown_08571448[0], 0, gUnknown_08571650[gUnknown_02039CF4->cursorPos].description); + AddTextPrinterParameterized3(MAP_WINDOW_DESCRIPTION, 1, 4, 0, sTextColors[0], 0, sMapLandmarks[sMapData->cursorPos].description); for (i = 0; i < 3; i++) CopyWindowToVram(i, 3); -- cgit v1.2.3 From 54ddbaaf0cef7aabf69521feb6dbec222e3df6f0 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 26 Jan 2019 22:09:24 +0100 Subject: Frontier pass clean-up --- src/frontier_pass.c | 152 ++++++++++++++++++++++++++-------------------------- 1 file changed, 75 insertions(+), 77 deletions(-) (limited to 'src/frontier_pass.c') diff --git a/src/frontier_pass.c b/src/frontier_pass.c index a0f6af73c..0db546c4d 100644 --- a/src/frontier_pass.c +++ b/src/frontier_pass.c @@ -34,12 +34,12 @@ // All windows displayed in the frontier pass. enum { - WINDOW_EARNED_SYMBOLS, - WINDOW_BATTLE_RECORD, - WINDOW_BATTLE_POINTS, - WINDOW_DESCRIPTION, - WINDOW_4, - WINDOW_COUNT + WINDOW_EARNED_SYMBOLS, + WINDOW_BATTLE_RECORD, + WINDOW_BATTLE_POINTS, + WINDOW_DESCRIPTION, + WINDOW_4, + WINDOW_COUNT }; // Windows displayed in the facilities map view. @@ -215,75 +215,75 @@ static const struct BgTemplate sMapBgTemplates[] = static const struct WindowTemplate sPassWindowTemplates[] = { - { - .bg = 0, - .tilemapLeft = 2, - .tilemapTop = 3, - .width = 12, - .height = 3, - .paletteNum = 15, - .baseBlock = 0x1, - }, - { - .bg = 0, - .tilemapLeft = 2, - .tilemapTop = 10, - .width = 12, - .height = 3, - .paletteNum = 15, - .baseBlock = 0x26, - }, - { - .bg = 0, - .tilemapLeft = 2, - .tilemapTop = 13, - .width = 12, - .height = 4, - .paletteNum = 15, - .baseBlock = 0x4B, - }, - { - .bg = 0, - .tilemapLeft = 0, - .tilemapTop = 18, - .width = 30, - .height = 3, - .paletteNum = 15, - .baseBlock = 0x7C, - }, - DUMMY_WIN_TEMPLATE + { + .bg = 0, + .tilemapLeft = 2, + .tilemapTop = 3, + .width = 12, + .height = 3, + .paletteNum = 15, + .baseBlock = 0x1, + }, + { + .bg = 0, + .tilemapLeft = 2, + .tilemapTop = 10, + .width = 12, + .height = 3, + .paletteNum = 15, + .baseBlock = 0x26, + }, + { + .bg = 0, + .tilemapLeft = 2, + .tilemapTop = 13, + .width = 12, + .height = 4, + .paletteNum = 15, + .baseBlock = 0x4B, + }, + { + .bg = 0, + .tilemapLeft = 0, + .tilemapTop = 18, + .width = 30, + .height = 3, + .paletteNum = 15, + .baseBlock = 0x7C, + }, + DUMMY_WIN_TEMPLATE }; static const struct WindowTemplate sMapWindowTemplates[] = { - { - .bg = 0, - .tilemapLeft = 0, - .tilemapTop = 1, - .width = 15, - .height = 5, - .paletteNum = 15, - .baseBlock = 0x1, - }, - { - .bg = 0, - .tilemapLeft = 20, - .tilemapTop = 1, - .width = 10, - .height = 14, - .paletteNum = 15, - .baseBlock = 0x4D, - }, - { - .bg = 0, - .tilemapLeft = 2, - .tilemapTop = 16, - .width = 26, - .height = 4, - .paletteNum = 15, - .baseBlock = 0xDA, - }, - DUMMY_WIN_TEMPLATE + { + .bg = 0, + .tilemapLeft = 0, + .tilemapTop = 1, + .width = 15, + .height = 5, + .paletteNum = 15, + .baseBlock = 0x1, + }, + { + .bg = 0, + .tilemapLeft = 20, + .tilemapTop = 1, + .width = 10, + .height = 14, + .paletteNum = 15, + .baseBlock = 0x4D, + }, + { + .bg = 0, + .tilemapLeft = 2, + .tilemapTop = 16, + .width = 26, + .height = 4, + .paletteNum = 15, + .baseBlock = 0xDA, + }, + DUMMY_WIN_TEMPLATE }; static const u8 sTextColors[][3] = @@ -675,9 +675,7 @@ static void CB2_InitFrontierPass(void) static void CB2_HideFrontierPass(void) { if (HideFrontierPass()) - { LeaveFrontierPass(); - } } static bool32 InitFrontierPass(void) @@ -753,7 +751,7 @@ static bool32 InitFrontierPass(void) ShowBg(2); LoadCursorAndSymbolSprites(); SetVBlankCallback(VblankCb_FrontierPass); - BlendPalettes(0xFFFFFFFF, 0x10, 0); + BlendPalettes(0xFFFFFFFF, 0x10, RGB_BLACK); BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); break; case 10: @@ -1095,15 +1093,15 @@ static void ShowAndPrintWindows(void) FillWindowPixelBuffer(i, 0); } - x = GetStringCenterAlignXOffset(1, gText_SymbolsEarned, 0x60); + x = GetStringCenterAlignXOffset(1, gText_SymbolsEarned, 96); AddTextPrinterParameterized3(WINDOW_EARNED_SYMBOLS, 1, x, 5, sTextColors[0], 0, gText_SymbolsEarned); - x = GetStringCenterAlignXOffset(1, gText_BattleRecord, 0x60); + x = GetStringCenterAlignXOffset(1, gText_BattleRecord, 96); AddTextPrinterParameterized3(WINDOW_BATTLE_RECORD, 1, x, 5, sTextColors[0], 0, gText_BattleRecord); AddTextPrinterParameterized3(WINDOW_BATTLE_POINTS, 8, 5, 4, sTextColors[0], 0, gText_BattlePoints); ConvertIntToDecimalStringN(gStringVar4, sPassData->battlePoints, STR_CONV_MODE_LEFT_ALIGN, 5); - x = GetStringRightAlignXOffset(8, gStringVar4, 0x5B); + x = GetStringRightAlignXOffset(8, gStringVar4, 91); AddTextPrinterParameterized3(WINDOW_BATTLE_POINTS, 8, x, 16, sTextColors[0], 0, gStringVar4); sPassData->cursorArea = GetCursorAreaFromCoords(sPassData->cursorX - 5, sPassData->cursorY + 5); -- cgit v1.2.3