#include "global.h" #include "palette.h" #include "gpu_regs.h" #include "scanline_effect.h" #include "task.h" #include "m4a.h" #include "malloc.h" #include "overworld.h" #include "event_data.h" #include "region_map.h" #include "window.h" #include "sound.h" #include "party_menu.h" #include "field_effect.h" #include "new_menu_helpers.h" #include "menu.h" #include "string_util.h" #include "strings.h" #include "map_preview_screen.h" #include "constants/flags.h" #include "constants/songs.h" #include "constants/region_map.h" #include "constants/maps.h" #define FREE_IF_NOT_NULL(ptr) ({ \ if (ptr) { \ FREE_AND_SET_NULL(ptr); \ } \ }) struct UnkStruct_20399D4 { u8 field_0000[19]; u8 field_0013[19]; u16 field_0026[5][600]; // Inefficiency: these should be u8 or have half the elements each u16 field_1796[3][BG_SCREEN_SIZE]; u8 field_4796; u8 field_4797[4]; u8 field_479B; u8 field_479C; u8 filler_479D[3]; u8 field_47A0; u8 filler_47A1[3]; u8 field_47A4; u8 filler_47A5[3]; u8 field_47A8; u16 field_47AA; u16 field_47AC; u16 field_47AE; u16 field_47B0; u8 filler_47B2[6]; TaskFunc field_47B8; MainCallback field_47BC; }; // size = 0x47C0 struct UnkStruct_20399D8_14B0 { u8 field_000[0x400]; struct Sprite * field_400; u16 field_404; u16 field_406; s16 field_408; }; struct UnkStruct_20399D8 { u8 field_0000[0x1000]; u16 field_1000[0x258]; struct UnkStruct_20399D8_14B0 field_14B0[2]; u8 field_1CC8; u8 field_1CC9; u8 field_1CCA; u8 field_1CCB; u8 field_1CCC; u8 field_1CCD; u16 field_1CCE; TaskFunc field_1CD0; u16 field_1CD4[4]; u16 field_1CDC; }; // size = 0x1CE0 struct UnkStruct_80C4CF0 { u16 v0; u16 v2; u16 v4; u16 v6; }; struct UnkStruct_83F1B3C { u16 field_0; const u8 *field_4; const u8 *field_8; }; struct UnkStruct_20399DC { u16 field_0000[0x1C20]; u16 field_3840[0x280]; const struct MapPreviewScreen * field_3D40; TaskFunc field_3D44; u8 field_3D48; u8 field_3D49; u8 field_3D4A; u8 field_3D4B; u8 field_3D4C; u16 field_3D4E[0x30]; u8 filler_3DAE[0x60]; u16 field_3E0E; u16 field_3E10; u16 field_3E12; u16 field_3E14; u16 field_3E16; u16 field_3E18; u16 field_3E1A; u16 field_3E1C; u16 field_3E1E; u16 field_3E20; u16 field_3E22; u16 field_3E24; }; // size = 0x3E28 struct UnkStruct_20399E0_000 { u16 field_000[0x200]; struct Sprite * field_400; s16 field_404; s16 field_406; u16 field_408; u16 field_40A; }; struct UnkStruct_20399E0 { struct UnkStruct_20399E0_000 * field_000[6]; u16 field_018[0x400]; u16 field_818[0x258]; TaskFunc field_CC8; u8 field_CCC; u8 field_CCD; u8 field_CCE; u8 field_CCF; u8 field_CD0; }; // size = 0xCD4 struct UnkStruct_20399E4 { s16 field_000; s16 field_002; u16 field_004; u16 field_006; s16 field_008; s16 field_00A; u16 field_00C; u8 field_00E; u8 (*field_010)(void); u16 field_014; u16 field_016; u16 field_018; struct Sprite * field_01C; u16 field_020; u16 field_022; u16 field_024[0x80]; }; // size = 0x124 struct UnkStruct_20399E8 { s16 field_00; s16 field_02; struct Sprite * field_04; u16 field_08; u16 field_0A; u16 field_0C[0x40]; }; // size = 0x8C struct UnkStruct_20399EC_140 { u8 filler_0[4]; u8 field_4; struct Sprite * field_8; u16 field_C; u16 field_E; }; struct UnkStruct_20399EC { u8 field_000[0x40]; u8 field_040[0x100]; struct UnkStruct_20399EC_140 field_140[25]; struct UnkStruct_20399EC_140 field_2D0[25]; u8 field_460; u8 filler_461[2]; u8 field_463; u8 filler_464[4]; TaskFunc field_468; }; // size = 0x46C struct UnkStruct_20399F0 { u16 bldcnt; u16 bldy; u16 bldalpha; u16 winin; u16 winout; u16 win0h; u16 win1h; u16 win0v; u16 win1v; }; struct UnkStruct_20399FC { u8 field_0; u8 field_1; u8 field_2; }; EWRAM_DATA struct UnkStruct_20399D4 * gUnknown_20399D4 = NULL; EWRAM_DATA struct UnkStruct_20399D8 * gUnknown_20399D8 = NULL; EWRAM_DATA struct UnkStruct_20399DC * gUnknown_20399DC = NULL; EWRAM_DATA struct UnkStruct_20399E0 * gUnknown_20399E0 = NULL; EWRAM_DATA struct UnkStruct_20399E4 * gUnknown_20399E4 = NULL; EWRAM_DATA struct UnkStruct_20399E8 * gUnknown_20399E8 = NULL; EWRAM_DATA struct UnkStruct_20399EC * gUnknown_20399EC = NULL; EWRAM_DATA struct UnkStruct_20399F0 * gUnknown_20399F0[3] = {}; EWRAM_DATA struct UnkStruct_20399FC * gUnknown_20399FC = NULL; static void sub_80BFFD0(void); void sub_80C0100(void); bool8 sub_80C0238(void); void sub_80C03E8(void); void sub_80C04E4(u8 taskId); void sub_80C07F8(u8 taskId); void sub_80C0820(u8 taskId); void sub_80C08B4(void); void sub_80C08E0(void); void sub_80C08F4(void); void sub_80C0904(void); void sub_80C0A2C(void); void sub_80C0A6C(void); void sub_80C0A88(u8 a0); void sub_80C0AB8(void); void sub_80C0B18(void); void sub_80C0B9C(void); void sub_80C0BB0(void); void sub_80C0CC8(u8 bg, u16 *map); bool8 sub_80C0E04(u8 a0); u8 sub_80C0E20(void); void sub_80C0E70(u8 a0, u8 taskId, TaskFunc taskFunc); void sub_80C1098(u8 taskId); void sub_80C1280(u8 taskId); bool8 sub_80C12EC(void); void sub_80C1324(u8 bg, u16 *map); void sub_80C1390(void); bool8 sub_80C144C(void); bool8 sub_80C1478(void); bool8 sub_80C16D0(void); void sub_80C1754(u8 a0, u16 a1, u16 a2); void sub_80C176C(u8 a0, u16 a1, u16 a2); void sub_80C1880(void); void sub_80C195C(u8 a0, u8 taskId, TaskFunc taskFunc); void sub_80C1A94(u8 taskId); void sub_80C1BE0(u8 taskId); void sub_80C1E14(u8 taskId); void sub_80C1E94(void); void sub_80C1E78(u8 bgId, const u16 * tilemap); bool8 sub_80C1F80(bool8 a0); void sub_80C2208(u8 taskId, TaskFunc taskFunc); void sub_80C24BC(void); void sub_80C267C(u8 taskId); void sub_80C25BC(void); void sub_80C2604(void); bool8 sub_80C29A4(void); void sub_80C2B48(void); void sub_80C2C1C(u8 taskId); void sub_80C2C7C(u8 taskId); bool8 sub_80C2E1C(void); void sub_80C3008(u16 a0, u16 a1); void sub_80C309C(void); void sub_80C3154(bool8 a0); void sub_80C3178(void); void sub_80C3188(void); u8 sub_80C31C0(void); u8 sub_80C3348(void); u8 sub_80C3400(void); void sub_80C3418(void); u16 sub_80C3508(void); u16 sub_80C3514(void); u16 sub_80C3520(void); u16 sub_80C3580(void); u8 sub_80C35DC(u8 a0); u8 sub_80C3878(u8 a0); u8 sub_80C3AC8(u8 a0); void sub_80C3D40(void); u8 sub_80C4164(u8 a0, u8 a1, s16 a2, s16 a3); void sub_80C41D8(u16 a0, u16 a1); void sub_80C4244(void); void sub_80C4324(bool8 a0); void sub_80C4348(void); u16 sub_80C4380(); u16 sub_80C438C(); void sub_80C4398(u8 a0, u8 taskId, TaskFunc taskFunc); void sub_80C440C(u8 taskId); void sub_80C44E4(u8 taskId); void sub_80C4750(void); void sub_80C47F0(void); void sub_80C48BC(u8 a0, u8 a1, bool8 a2); void sub_80C4960(u8 a0, u8 a1, bool8 a2); void sub_80C4A04(void); bool8 sub_80C4AAC(u8 a0); bool8 sub_80C4B30(u8 a0); void sub_80C4BE4(void); void sub_80C4C2C(u8 a0, u16 a1, u16 a2); void sub_80C4C48(u16 a0); void sub_80C4C5C(u16 a0, u16 a1); void sub_80C4C74(u16 a0, u16 a1); void sub_80C4C88(u16 a0); void sub_80C4C9C(u8 a0, u8 a1); void sub_80C4CF0(u8 a0, const struct UnkStruct_80C4CF0 *a1); void sub_80C4D30(void); void sub_80C4E18(const u8 *str); void sub_80C4E74(const u8 *str); void sub_80C4ED0(bool8 a0); void sub_80C4F08(u8 taskId); void sub_80C51E8(void); void sub_80C5208(u8 taskId); void sub_80C527C(u16 a0); #include "data/text/map_section_names.h" extern const u16 gUnknown_83EF23C[]; extern const u16 gUnknown_83EF25C[]; extern const u16 gUnknown_83EF27C[]; extern const u16 gUnknown_83EF29C[]; extern const u16 gUnknown_83EF2BC[]; extern const u16 gUnknown_83EF2DC[]; extern const u16 gUnknown_83EF384[]; extern const u16 gUnknown_83EF3A4[]; extern const u32 gUnknown_83EF3C4[]; extern const u32 gUnknown_83EF450[]; extern const u32 gUnknown_83EF4E0[]; extern const u32 gUnknown_83EF524[]; extern const u32 gUnknown_83EF59C[]; extern const u32 gUnknown_83EF61C[]; extern const u32 gUnknown_83F0330[]; extern const u32 gUnknown_83F0E0C[]; extern const u32 gUnknown_83F0580[]; extern const u32 gUnknown_83F089C[]; extern const u32 gUnknown_83F0AFC[]; extern const u32 gUnknown_83F0C0C[]; extern const u32 gUnknown_83F0CF0[]; extern const u32 gUnknown_83F0F1C[]; extern const u32 gUnknown_83F1084[]; extern const u32 gUnknown_83F1190[]; extern const u32 gUnknown_83F12CC[]; extern const u32 gUnknown_83F13EC[]; extern const u32 gUnknown_83F1550[]; extern const u32 gUnknown_83F1640[]; extern const u32 gUnknown_83F1738[]; extern const u32 gUnknown_83F1804[]; extern const u32 gUnknown_83F18D8[]; extern const u32 gUnknown_83F1908[]; extern const u32 gUnknown_83F1978[]; extern const u32 gUnknown_83F19A0[]; extern const struct BgTemplate gUnknown_83F1A50[4]; extern const struct WindowTemplate gUnknown_83F1A60[]; extern const u8 gUnknown_83F1A90[]; extern const u8 gUnknown_83F1A94[]; extern const u8 *const gUnknown_83F1A9C[]; extern const u8 sSeviiMapsecs[3][30]; extern const u8 gUnknown_83F1B00[3][4]; extern const struct UnkStruct_80C4CF0 gUnknown_83F1B0C[3]; extern const struct OamData gUnknown_83F1B24; extern const union AnimCmd *const gUnknown_83F1B38[]; extern const struct UnkStruct_83F1B3C gUnknown_83F1B3C[]; extern const struct OamData gUnknown_83F1C20; extern const union AnimCmd *const gUnknown_83F1C30[]; extern const struct UnkStruct_80C4CF0 gUnknown_83F1C34; extern const struct OamData gUnknown_83F1C3C; extern const union AnimCmd *const gUnknown_83F1C50[]; extern const struct OamData gUnknown_83F1C54; extern const union AnimCmd *const gUnknown_83F1C64[]; extern const struct OamData gUnknown_83F1C68; extern const struct OamData gUnknown_83F1C70; extern const union AnimCmd *const gUnknown_83F1C94[]; extern const union AnimCmd *const gUnknown_83F1C98[]; extern const u16 gUnknown_83F1CA0[]; extern const u8 gUnknown_83F1CA4[][2]; extern const u8 gUnknown_83F1CA8[]; extern const u8 *const gUnknown_83F1CAC[]; extern const u16 gUnknown_83F1E60[][2]; extern const u16 gUnknown_83F2178[][2]; extern const u8 gUnknown_83F2490[][15][22]; extern const u8 gUnknown_83F2724[][15][22]; extern const u8 gUnknown_83F29B8[][15][22]; extern const u8 gUnknown_83F2C4C[][15][22]; extern const u8 gUnknown_83F2EE0[][3]; static void RegionMap_DarkenPalette(u16 *pal, u16 size, u16 tint) { int i; int r, g, b; for (i = 0; i < size; i++) { r = (*pal) & 0x1F; g = ((*pal) >> 5) & 0x1F; b = ((*pal) >> 10) & 0x1F; r = (((r << 8) / 100) * tint) >> 8; g = (((g << 8) / 100) * tint) >> 8; b = (((b << 8) / 100) * tint) >> 8; *pal = RGB2(r, g, b); pal++; } } void sub_80BFEA0(void) { u16 pal[16]; CpuCopy16(&gUnknown_83EF2DC[0x20], pal, sizeof(pal)); RegionMap_DarkenPalette(pal, NELEMS(pal), 95); LoadPalette(pal, 0x20, 0x20); LoadPalette(&gUnknown_83EF2DC[0x2F], 0x2F, sizeof(u16)); } void sub_80BFEDC(u8 kind) { gUnknown_20399D4 = AllocZeroed(sizeof(struct UnkStruct_20399D4)); if (gUnknown_20399D4 == NULL) { SetMainCallback2(CB2_ReturnToField); } else { gUnknown_2031DE0 = TRUE; gUnknown_20399D4->field_4796 = kind; gUnknown_20399D4->field_47A0 = 0; gUnknown_20399D4->field_47A4 = 0; gUnknown_20399D4->field_47A8 = 0; sub_80BFFD0(); SetMainCallback2(sub_80C0100); } } void sub_80BFF50(u8 kind, MainCallback cb) { gUnknown_20399D4 = AllocZeroed(sizeof(struct UnkStruct_20399D4)); if (gUnknown_20399D4 == NULL) { SetMainCallback2(CB2_ReturnToField); } else { gUnknown_2031DE0 = TRUE; gUnknown_20399D4->field_4796 = kind; gUnknown_20399D4->field_47A0 = 0; gUnknown_20399D4->field_47A4 = 0; gUnknown_20399D4->field_47A8 = 0; gUnknown_20399D4->field_47BC = cb; sub_80BFFD0(); SetMainCallback2(sub_80C0100); } } static void sub_80BFFD0(void) { u8 i; u8 j; u8 r7; switch (gUnknown_20399D4->field_4796) { default: case 0: case 1: gUnknown_20399D4->field_47B8 = sub_80C04E4; break; case 2: gUnknown_20399D4->field_47B8 = sub_80C4F08; break; } for (i = 0; i < 4; i++) { gUnknown_20399D4->field_4797[i] = gUnknown_83F1B00[gUnknown_20399D4->field_4796][i]; } if (!FlagGet(FLAG_SYS_SEVII_MAP_123)) gUnknown_20399D4->field_4797[0] = FALSE; r7 = 0; j = 0; if (gMapHeader.regionMapSectionId >= MAPSECS_SEVII_123) { while (r7 == 0) { for (i = 0; sSeviiMapsecs[j][i] != MAPSEC_NONE; i++) { if (gMapHeader.regionMapSectionId == sSeviiMapsecs[j][i]) { r7 = j + 1; break; } } j++; } } gUnknown_20399D4->field_479B = r7; gUnknown_20399D4->field_479C = r7; } void sub_80C0100(void) { switch (gUnknown_20399D4->field_47A4) { case 0: sub_80C08E0(); break; case 1: sub_80C0904(); break; case 2: sub_80C0A6C(); break; case 3: if (!sub_80C0238()) return; break; case 4: FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 30, 20); CopyBgTilemapBufferToVram(1); break; case 5: sub_80C0CC8(0, gUnknown_20399D4->field_0026[gUnknown_20399D4->field_479B]); CopyBgTilemapBufferToVram(0); if (gUnknown_20399D4->field_4796 != 0) { sub_80C0CC8(1, gUnknown_20399D4->field_0026[4]); CopyBgTilemapBufferToVram(1); } break; case 6: sub_80C0B18(); PutWindowTilemap(0); break; case 7: sub_80C0BB0(); PutWindowTilemap(1); break; case 8: if (sub_80C0E04(2) == TRUE) sub_80C0A88(1); break; default: BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); sub_80C03E8(); sub_80C08F4(); break; } gUnknown_20399D4->field_47A4++; } bool8 sub_80C0238(void) { switch (gUnknown_20399D4->field_47A8) { case 0: LoadPalette(gUnknown_83EF23C, 0xC0, 0x20); break; case 1: LoadPalette(gUnknown_83EF2DC, 0x00, 0xA0); sub_80BFEA0(); if (gUnknown_20399D4->field_4796 != 0) { LoadPalette(&gUnknown_83EF23C[15], 0x00, 0x02); LoadPalette(&gUnknown_83EF23C[15], 0x10, 0x02); LoadPalette(&gUnknown_83EF23C[15], 0x20, 0x02); LoadPalette(&gUnknown_83EF23C[15], 0x30, 0x02); LoadPalette(&gUnknown_83EF23C[15], 0x40, 0x02); } break; case 2: ResetTempTileDataBuffers(); break; case 3: DecompressAndCopyTileDataToVram(0, gUnknown_83EF61C, 0, 0, 0); if (gUnknown_20399D4->field_4796 != 0) { DecompressAndCopyTileDataToVram(1, gUnknown_83F1978, 0, 0, 0); } break; case 4: if (FreeTempTileDataBuffersIfPossible() == TRUE) return FALSE; break; case 5: LZ77UnCompWram(gUnknown_83F089C, gUnknown_20399D4->field_0026[0]); break; case 6: LZ77UnCompWram(gUnknown_83F0AFC, gUnknown_20399D4->field_0026[1]); break; case 7: LZ77UnCompWram(gUnknown_83F0C0C, gUnknown_20399D4->field_0026[2]); break; case 8: LZ77UnCompWram(gUnknown_83F0CF0, gUnknown_20399D4->field_0026[3]); break; default: LZ77UnCompWram(gUnknown_83F19A0, gUnknown_20399D4->field_0026[4]); return TRUE; } gUnknown_20399D4->field_47A8++; return FALSE; } void sub_80C03E8(void) { CreateTask(gUnknown_20399D4->field_47B8, 0); SetMainCallback2(sub_80C08B4); } bool32 sub_80C0410(void) { if (sub_80C4164(sub_80C0E20(), 0, sub_80C3514(), sub_80C3508()) == 99) return FALSE; else return TRUE; } void sub_80C0450(void) { if (sub_80C0410()) { if ((sub_80C3AC8(0) != 1 && sub_80C3AC8(0) != 0) || (sub_80C3AC8(1) != 1 && sub_80C3AC8(1) != 0)) PlaySE(SE_Z_SCROLL); if (sub_80C3508() == 21 && sub_80C3514() == 11 && sub_80C0E04(0) == TRUE) PlaySE(SE_W255); else if (sub_80C3508() == 21 && sub_80C3514() == 13) PlaySE(SE_W255); } } void sub_80C04E4(u8 taskId) { switch (gUnknown_20399D4->field_47A0) { case 0: sub_80C4398(sub_80C0E20(), taskId, gUnknown_20399D4->field_47B8); sub_80C3008(0, 0); sub_80C41D8(1, 1); gUnknown_20399D4->field_47A0++; break; case 1: if (gUnknown_20399D4->field_4797[2] == 1) { sub_80C2208(taskId, gUnknown_20399D4->field_47B8); } else { ShowBg(0); ShowBg(3); ShowBg(1); sub_80C4E18(gUnknown_8418EB5); sub_80C4E74(gUnknown_8418E8B); sub_80C4ED0(FALSE); sub_80C4324(FALSE); sub_80C3154(FALSE); sub_80C48BC(sub_80C0E20(), 25, FALSE); sub_80C4960(sub_80C0E20(), 25, FALSE); } gUnknown_20399D4->field_47A0++; break; case 2: if (!gPaletteFade.active && !IsDma3ManagerBusyWithBgCopy()) { sub_80C0B18(); PutWindowTilemap(0); sub_80C0BB0(); PutWindowTilemap(1); gUnknown_20399D4->field_47A0++; } break; case 3: switch (sub_80C3400()) { case 1: sub_80C3178(); break; case 2: break; case 3: sub_80C0B18(); sub_80C0BB0(); sub_80C0B9C(); sub_80C0450(); if (sub_80C3580() != MAPSEC_NONE) { if (sub_80C0E04(1) == TRUE) { if (sub_80C3AC8(1) == 2) { sub_80C4E74(gUnknown_8418E8D); } else { sub_80C4E74(gUnknown_8418E8B); } } } else { if (sub_80C3508() == 21 && sub_80C3514() == 11 && sub_80C0E04(0) == TRUE) { sub_80C4E74(gUnknown_8418EA7); } else if (sub_80C3508() == 21 && sub_80C3514() == 13) { sub_80C4E74(gUnknown_8418E95); } else { sub_80C4E74(gUnknown_8418E8B); } } break; case 4: if (sub_80C3AC8(1) == 2 && gUnknown_20399D4->field_4797[1] == 1) { sub_80C195C(0, taskId, sub_80C07F8); } break; case 5: sub_80C0E70(gUnknown_20399D4->field_479B, taskId, sub_80C07F8); break; case 6: gUnknown_20399D4->field_47A0++; break; } break; case 4: if (sub_80C0E04(2) == 1) { sub_80C2C1C(taskId); // FIXME: goto required to match // gUnknown_20399D4->field_47A0++; goto _080C0798; } else { gUnknown_20399D4->field_47A0++; } break; case 5: BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); _080C0798: gUnknown_20399D4->field_47A0++; break; default: if (!gPaletteFade.active) { sub_80C0820(taskId); } break; } } void sub_80C07D0(TaskFunc taskFunc) { gUnknown_20399D4->field_47B8 = taskFunc; } TaskFunc sub_80C07E4(void) { return gUnknown_20399D4->field_47B8; } void sub_80C07F8(u8 taskId) { gTasks[taskId].func = gUnknown_20399D4->field_47B8; } void sub_80C0820(u8 taskId) { if (sub_80C0E04(2) == TRUE) sub_80C25BC(); sub_80C4A04(); sub_80C3188(); sub_80C4348(); sub_80C4D30(); DestroyTask(taskId); FreeAllWindowBuffers(); if (gUnknown_20399D4->field_47BC == NULL) SetMainCallback2(gMain.savedCallback); else SetMainCallback2(gUnknown_20399D4->field_47BC); FREE_IF_NOT_NULL(gUnknown_20399D4); } void sub_80C0898(void) { FREE_IF_NOT_NULL(gUnknown_20399D4); } void sub_80C08B4(void) { RunTasks(); AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); } void sub_80C08CC(void) { LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); } void sub_80C08E0(void) { SetVBlankCallback(NULL); SetHBlankCallback(NULL); } void sub_80C08F4(void) { SetVBlankCallback(sub_80C08CC); } void sub_80C0904(void) { DmaFillLarge16(3, 0, (void *)VRAM, VRAM_SIZE, 0x1000); DmaFill32Defvars(3, 0, (void *)OAM, OAM_SIZE); DmaFill16Defvars(3, 0, (void *)PLTT, PLTT_SIZE); SetGpuReg(REG_OFFSET_DISPCNT, 0); ResetBgsAndClearDma3BusyFlags(FALSE); InitBgsFromTemplates(0, gUnknown_83F1A50, NELEMS(gUnknown_83F1A50)); ChangeBgX(0, 0, 0); ChangeBgY(0, 0, 0); ChangeBgX(1, 0, 0); ChangeBgY(1, 0, 0); ChangeBgX(2, 0, 0); ChangeBgY(2, 0, 0); ChangeBgX(3, 0, 0); ChangeBgY(3, 0, 0); InitWindows(gUnknown_83F1A60); DeactivateAllTextPrinters(); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_WIN0_ON | DISPCNT_WIN1_ON); sub_80C0A2C(); sub_80C0AB8(); } void sub_80C0A2C(void) { SetBgTilemapBuffer(0, gUnknown_20399D4->field_1796[0]); SetBgTilemapBuffer(1, gUnknown_20399D4->field_1796[1]); SetBgTilemapBuffer(2, gUnknown_20399D4->field_1796[2]); } void sub_80C0A6C(void) { ResetSpriteData(); ResetPaletteFade(); FreeAllSpritePalettes(); ResetTasks(); ScanlineEffect_Stop(); } void sub_80C0A88(u8 mode) { switch (mode) { case 0: ShowBg(0); ShowBg(3); break; case 1: HideBg(0); HideBg(3); break; } } void sub_80C0AB8(void) { sub_80C4BE4(); sub_80C4C2C(0, 0x11, 0xc0); sub_80C4C48(6); sub_80C4C74(0x39, 0x39); sub_80C4C88(0x1b); sub_80C4CF0(0, &gUnknown_83F1B0C[0]); sub_80C4CF0(1, &gUnknown_83F1B0C[1]); sub_80C4C9C(0, 0); if (sub_80C3580() != MAPSEC_NONE) sub_80C4C9C(1, 0); } void sub_80C0B18(void) { ClearWindowTilemap(0); FillWindowPixelBuffer(0, PIXEL_FILL(0)); if (sub_80C3520() == MAPSEC_NONE) { sub_80C4CF0(0, &gUnknown_83F1B0C[2]); } else { GetMapName(gUnknown_20399D4->field_0000, sub_80C3520(), 0); AddTextPrinterParameterized3(0, 2, 2, 2, gUnknown_83F1A90, 0, gUnknown_20399D4->field_0000); PutWindowTilemap(0); CopyWindowToVram(0, 2); sub_80C4CF0(0, &gUnknown_83F1B0C[0]); } } void sub_80C0B9C(void) { sub_80C4CF0(1, &gUnknown_83F1B0C[1]); } void sub_80C0BB0(void) { u16 mapsecId; u16 descOffset; gUnknown_20399D4->field_47AC = 0; gUnknown_20399D4->field_47AE = 24; gUnknown_20399D4->field_47B0 = 32; sub_80C4C9C(1, 1); ClearWindowTilemap(1); mapsecId = sub_80C3580(); if (mapsecId != MAPSEC_NONE) { descOffset = mapsecId - MAPSECS_KANTO; sub_80C4C9C(1, 0); gUnknown_20399D4->field_47AC = 1; gUnknown_20399D4->field_47AA = StringLength(gUnknown_83F1CAC[descOffset]); gUnknown_20399D4->field_47AE = gUnknown_20399D4->field_47AA * 10 + 50; gUnknown_20399D4->field_47B0 = 48; FillWindowPixelBuffer(1, PIXEL_FILL(0)); StringCopy(gUnknown_20399D4->field_0013, gUnknown_83F1CAC[descOffset]); AddTextPrinterParameterized3(1, 2, 12, 2, gUnknown_83F1A9C[sub_80C3AC8(1) - 2], 0, gUnknown_20399D4->field_0013); PutWindowTilemap(1); CopyWindowToVram(1, 3); } } void sub_80C0CA0(void) { FillWindowPixelBuffer(0, PIXEL_FILL(0)); CopyWindowToVram(0, 3); FillWindowPixelBuffer(1, PIXEL_FILL(0)); CopyWindowToVram(1, 3); } void sub_80C0CC8(u8 bg, u16 *map) { s16 i; s16 j; u8 r4; u16 *buffer = gUnknown_20399D4->field_1796[bg]; for (i = 0; i < 20; i++) { for (j = 0; j < 32; j++) { if (j < 30) buffer[32 * i + j] = map[30 * i + j]; else buffer[32 * i + j] = map[0]; } } if (gUnknown_20399D4->field_4797[0] == 1) { WriteSequenceToBgTilemapBuffer(0, 0x0F0, 0x18, 0x0E, 3, 1, 0x3, 0x001); WriteSequenceToBgTilemapBuffer(0, 0x100, 0x18, 0x0F, 3, 1, 0x3, 0x001); WriteSequenceToBgTilemapBuffer(0, 0x110, 0x18, 0x10, 3, 1, 0x3, 0x001); } if (gUnknown_20399D8 != NULL) r4 = gUnknown_20399D8->field_1CCA; else r4 = gUnknown_20399D4->field_479B; if (r4 == 2 && !FlagGet(FLAG_WORLD_MAP_NAVEL_ROCK_EXTERIOR)) FillBgTilemapBufferRect_Palette0(0, 0x003, 13, 11, 3, 2); if (r4 == 3 && !FlagGet(FLAG_WORLD_MAP_BIRTH_ISLAND_EXTERIOR)) FillBgTilemapBufferRect_Palette0(0, 0x003, 21, 16, 3, 3); } u8 sub_80C0E04(u8 a0) { return gUnknown_20399D4->field_4797[a0]; } u8 sub_80C0E20(void) { return gUnknown_20399D4->field_479B; } u8 sub_80C0E34(void) { return gUnknown_20399D4->field_479C; } void sub_80C0E48(u8 a0) { gUnknown_20399D4->field_479B = a0; } void sub_80C0E5C(u8 a0) { gUnknown_20399D4->field_479C = a0; } void sub_80C0E70(u8 a0, u8 taskId, TaskFunc taskFunc) { gUnknown_20399D8 = AllocZeroed(sizeof(struct UnkStruct_20399D8)); if (FlagGet(FLAG_SYS_SEVII_MAP_4567)) gUnknown_20399D8->field_1CCC = 3; else if (FlagGet(FLAG_SYS_SEVII_MAP_123)) gUnknown_20399D8->field_1CCC = 1; else gUnknown_20399D8->field_1CCC = 0; gUnknown_20399D8->field_14B0[0].field_408 = 0x58; gUnknown_20399D8->field_14B0[1].field_408 = 0x98; switch (gUnknown_20399D8->field_1CCC) { case 1: LZ77UnCompWram(gUnknown_83F1084, gUnknown_20399D8->field_1000); gUnknown_20399D8->field_1CCE = 6; break; case 2: // never reached LZ77UnCompWram(gUnknown_83F1190, gUnknown_20399D8->field_1000); gUnknown_20399D8->field_1CCE = 4; break; case 3: default: gUnknown_20399D8->field_1CCE = 3; LZ77UnCompWram(gUnknown_83F0F1C, gUnknown_20399D8->field_1000); break; } LZ77UnCompWram(gUnknown_83F0580, gUnknown_20399D8->field_0000); gUnknown_20399D8->field_1CC8 = 0; gUnknown_20399D8->field_1CCA = a0; gUnknown_20399D8->field_1CD0 = taskFunc; gUnknown_20399D8->field_1CCB = sub_80C0E34(); sub_80C4AAC(0); sub_80C4E74(gUnknown_8418EB0); gTasks[taskId].func = sub_80C1098; } void sub_80C0FE0(void) { sub_80C4BE4(); sub_80C4C2C(27, 4, 64); sub_80C4C5C(16 - gUnknown_20399D8->field_1CCD, gUnknown_20399D8->field_1CCD); } bool8 sub_80C1014(void) { if (gUnknown_20399D8->field_1CCD < 16) { sub_80C4C5C(16 - gUnknown_20399D8->field_1CCD, gUnknown_20399D8->field_1CCD); gUnknown_20399D8->field_1CCD += 2; return FALSE; } else { return TRUE; } } bool8 sub_80C1058(void) { if (gUnknown_20399D8->field_1CCD >= 2) { gUnknown_20399D8->field_1CCD -= 2; sub_80C4C5C(16 - gUnknown_20399D8->field_1CCD, gUnknown_20399D8->field_1CCD); return FALSE; } else { return TRUE; } } void sub_80C1098(u8 taskId) { switch (gUnknown_20399D8->field_1CC8) { case 0: sub_80C08E0(); sub_80C4E18(gUnknown_8418EBC); gUnknown_20399D8->field_1CC8++; break; case 1: LoadBgTiles(2, gUnknown_20399D8->field_0000, 0x1000, 0x000); gUnknown_20399D8->field_1CC8++; break; case 2: sub_80C1324(2, gUnknown_20399D8->field_1000); CopyBgTilemapBufferToVram(2); gUnknown_20399D8->field_1CC8++; break; case 3: sub_80C0CA0(); gUnknown_20399D8->field_1CC8++; break; case 4: sub_80C0FE0(); ShowBg(2); gUnknown_20399D8->field_1CC8++; break; case 5: sub_80C08F4(); gUnknown_20399D8->field_1CC8++; break; case 6: if (sub_80C1014() == TRUE) { sub_80C1390(); gUnknown_20399D8->field_1CC8++; } break; case 7: if (sub_80C144C() == TRUE) { gUnknown_20399D8->field_1CC8++; } break; case 8: if (sub_80C16D0() == TRUE) { gUnknown_20399D8->field_1CC8++; } break; case 9: if (sub_80C1478() == TRUE) { sub_80C0E48(gUnknown_20399D8->field_1CCA); if (sub_80C0E34() == gUnknown_20399D8->field_1CCA) { sub_80C4324(FALSE); sub_80C48BC(gUnknown_20399D8->field_1CCA, 25, FALSE); sub_80C4960(gUnknown_20399D8->field_1CCA, 25, FALSE); } gUnknown_20399D8->field_1CC8++; } break; case 10: if (sub_80C12EC() == TRUE) { sub_80C1880(); sub_80C0FE0(); gUnknown_20399D8->field_1CC8++; } break; case 11: if (sub_80C1058() == TRUE) { gUnknown_20399D8->field_1CC8++; } break; case 12: sub_80C3154(FALSE); gUnknown_20399D8->field_1CC8++; break; default: sub_80C1280(taskId); break; } } void sub_80C1280(u8 taskId) { gTasks[taskId].func = gUnknown_20399D8->field_1CD0; HideBg(2); sub_80C4E18(gUnknown_8418EB5); sub_80C4E74(gUnknown_8418EA7); sub_80C0AB8(); sub_80C0B9C(); sub_80C4CF0(0, &gUnknown_83F1B0C[2]); FREE_IF_NOT_NULL(gUnknown_20399D8); } bool8 sub_80C12EC(void) { if (gUnknown_20399D8->field_1CDC != 0) { gUnknown_20399D8->field_1CDC--; SetGpuReg(REG_OFFSET_BLDY, gUnknown_20399D8->field_1CDC); return FALSE; } else { SetGpuReg(REG_OFFSET_BLDY, 0); return TRUE; } } void sub_80C1324(u8 bg, u16 *map) { s16 i; s16 j; u16 *buffer = gUnknown_20399D4->field_1796[bg]; for (i = 0; i < 20; i++) { for (j = 0; j < 32; j++) { if (j < 30) buffer[32 * i + j] = map[30 * i + j]; else buffer[32 * i + j] = map[0]; } } } void sub_80C1390(void) { struct UnkStruct_80C4CF0 data; data.v0 = gUnknown_20399D8->field_1CD4[0] = 0x48; data.v2 = gUnknown_20399D8->field_1CD4[1] = 8 * (gUnknown_20399D8->field_1CCE + 4 * gUnknown_20399D8->field_1CCA); data.v4 = gUnknown_20399D8->field_1CD4[2] = 0xA8; data.v6 = gUnknown_20399D8->field_1CD4[3] = gUnknown_20399D8->field_1CD4[1] + 32; sub_80C4BE4(); sub_80C4C2C(0, 0x15, 0xc0); sub_80C4C74(0x1f, 0x15); sub_80C4C88(0x3f); sub_80C4C9C(1, 0); sub_80C4CF0(1, &data); } bool8 sub_80C144C(void) { if (gUnknown_20399D8->field_1CDC < 6) { gUnknown_20399D8->field_1CDC++; sub_80C4C48(gUnknown_20399D8->field_1CDC); return FALSE; } else { return TRUE; } } bool8 sub_80C1478(void) { bool8 r6 = FALSE; struct UnkStruct_80C4CF0 data; data.v0 = gUnknown_20399D8->field_1CD4[0] = 0x48; data.v2 = gUnknown_20399D8->field_1CD4[1] = 8 * (gUnknown_20399D8->field_1CCE + 4 * gUnknown_20399D8->field_1CCA); data.v4 = gUnknown_20399D8->field_1CD4[2] = 0xA8; data.v6 = gUnknown_20399D8->field_1CD4[3] = gUnknown_20399D8->field_1CD4[1] + 32; if (JOY_NEW(DPAD_UP) && gUnknown_20399D8->field_1CCA != 0) { PlaySE(SE_BAG1); gUnknown_20399D8->field_1CCA--; r6 = TRUE; } if (JOY_NEW(DPAD_DOWN) && gUnknown_20399D8->field_1CCA < gUnknown_20399D8->field_1CCC) { PlaySE(SE_BAG1); gUnknown_20399D8->field_1CCA++; r6 = TRUE; } if (JOY_NEW(A_BUTTON) && gUnknown_20399D8->field_1CDC == 6) { PlaySE(SE_W129); gUnknown_20399D8->field_1CCB = gUnknown_20399D8->field_1CCA; return TRUE; } if (JOY_NEW(B_BUTTON)) { gUnknown_20399D8->field_1CCA = gUnknown_20399D8->field_1CCB; sub_80C0CC8(0, gUnknown_20399D4->field_0026[gUnknown_20399D8->field_1CCA]); CopyBgTilemapBufferToVram(0); sub_80C48BC(255, 25, TRUE); sub_80C4960(255, 25, TRUE); return TRUE; } if (r6) { sub_80C0CC8(0, gUnknown_20399D4->field_0026[gUnknown_20399D8->field_1CCA]); sub_80C4E74(gUnknown_8418EB0); CopyBgTilemapBufferToVram(0); CopyBgTilemapBufferToVram(3); sub_80C48BC(255, 25, TRUE); sub_80C4960(255, 25, TRUE); sub_80C48BC(gUnknown_20399D8->field_1CCA, 25, FALSE); sub_80C4960(gUnknown_20399D8->field_1CCA, 25, FALSE); } if (gUnknown_20399D8->field_1CCA != sub_80C0E34()) sub_80C4324(TRUE); else sub_80C4324(FALSE); sub_80C4CF0(1, &data); return FALSE; } void sub_80C16B8(struct Sprite * sprite) { sprite->pos1.y = gUnknown_20399D8->field_1CD4[1] + 16; } bool8 sub_80C16D0(void) { switch (gUnknown_20399D8->field_1CC9) { case 0: LZ77UnCompWram(gUnknown_83EF3C4, gUnknown_20399D8->field_14B0[0].field_000); break; case 1: LZ77UnCompWram(gUnknown_83EF450, gUnknown_20399D8->field_14B0[1].field_000); break; case 2: sub_80C1754(0, 2, 2); sub_80C1754(1, 3, 3); break; default: return TRUE; } gUnknown_20399D8->field_1CC9++; return FALSE; } void sub_80C1754(u8 a0, u16 a1, u16 a2) { sub_80C176C(a0, a1, a2); } void sub_80C176C(u8 a0, u16 a1, u16 a2) { u8 spriteId; struct SpriteSheet spriteSheet = { .data = gUnknown_20399D8->field_14B0[a0].field_000, .size = 0x400, .tag = a1 }; struct SpritePalette spritePalette = { .data = gUnknown_83EF384, .tag = a2 }; struct SpriteTemplate template = { .tileTag = a1, .paletteTag = a2, .oam = &gUnknown_83F1B24, .anims = gUnknown_83F1B38, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = sub_80C16B8 }; gUnknown_20399D8->field_14B0[a0].field_404 = a1; gUnknown_20399D8->field_14B0[a0].field_406 = a2; LoadSpriteSheet(&spriteSheet); LoadSpritePalette(&spritePalette); spriteId = CreateSprite(&template, gUnknown_20399D8->field_14B0[a0].field_408, 8 * (gUnknown_20399D8->field_1CCE + 4 * gUnknown_20399D8->field_1CCA), 0); gUnknown_20399D8->field_14B0[a0].field_400 = &gSprites[spriteId]; gSprites[spriteId].invisible = FALSE; } void sub_80C1880(void) { u8 i; for (i = 0; i < 2; i++) { if (gUnknown_20399D8->field_14B0[i].field_400 != NULL) { DestroySprite(gUnknown_20399D8->field_14B0[i].field_400); FreeSpriteTilesByTag(gUnknown_20399D8->field_14B0[i].field_404); FreeSpritePaletteByTag(gUnknown_20399D8->field_14B0[i].field_406); } } } const u8 *sub_80C18E0(u16 a0) { u8 i; for (i = 0; i < 19; i++) { if (gUnknown_83F1B3C[i].field_0 == a0) return gUnknown_83F1B3C[i].field_8; } return gUnknown_8418EC3; } const u8 *sub_80C1920(u16 a0) { u8 i; for (i = 0; i < 19; i++) { if (gUnknown_83F1B3C[i].field_0 == a0) return gUnknown_83F1B3C[i].field_4; } return gUnknown_8418EC3; } void sub_80C195C(u8 a0, u8 taskId, TaskFunc taskFunc) { u8 r0; gUnknown_20399DC = AllocZeroed(sizeof(struct UnkStruct_20399DC)); r0 = sub_80C3580(); if (r0 == MAPSEC_TANOBY_CHAMBERS) r0 = MAPSEC_MONEAN_CHAMBER; gUnknown_20399DC->field_3D40 = sub_80F8544(r0); if (gUnknown_20399DC->field_3D40 == NULL) gUnknown_20399DC->field_3D40 = sub_80F8544(MAPSEC_ROCK_TUNNEL); gUnknown_20399DC->field_3D48 = 0; gUnknown_20399DC->field_3D4A = 0; gUnknown_20399DC->field_3D44 = taskFunc; gUnknown_20399DC->field_3E14 = 0; sub_80C4AAC(0); sub_80C4BE4(); sub_80C0CA0(); gTasks[taskId].func = sub_80C1A94; } bool8 sub_80C19FC(void) { switch (gUnknown_20399DC->field_3D4A) { case 0: LZ77UnCompWram(gUnknown_20399DC->field_3D40->tilesptr, gUnknown_20399DC->field_0000); break; case 1: LZ77UnCompWram(gUnknown_20399DC->field_3D40->tilemapptr, gUnknown_20399DC->field_3840); break; case 2: LoadBgTiles(2, gUnknown_20399DC->field_0000, 0x3840, 0x000); break; case 3: LoadPalette(gUnknown_20399DC->field_3D40->palptr, 0xD0, 0x60); break; default: return TRUE; } gUnknown_20399DC->field_3D4A++; return FALSE; } void sub_80C1A94(u8 taskId) { switch (gUnknown_20399DC->field_3D48) { case 0: sub_80C08E0(); gUnknown_20399DC->field_3D48++; break; case 1: if (sub_80C19FC() == TRUE) gUnknown_20399DC->field_3D48++; break; case 2: sub_80C1E94(); sub_80C4E74(gUnknown_8418E9E); gUnknown_20399DC->field_3D48++; break; case 3: sub_80C1E78(2, gUnknown_20399DC->field_3840); CopyBgTilemapBufferToVram(2); gUnknown_20399DC->field_3D48++; break; case 4: ShowBg(2); gUnknown_20399DC->field_3D48++; break; case 5: sub_80C08F4(); gUnknown_20399DC->field_3D48++; break; case 6: if (sub_80C1F80(FALSE) == TRUE) gUnknown_20399DC->field_3D48++; break; case 7: gTasks[taskId].func = sub_80C1BE0; break; case 8: if (sub_80C1F80(TRUE) == TRUE) { gUnknown_20399DC->field_3D48++; } break; case 9: sub_80C1E14(taskId); gUnknown_20399DC->field_3D48++; break; } } void sub_80C1BE0(u8 taskId) { switch (gUnknown_20399DC->field_3D49) { case 0: gUnknown_20399DC->field_3E0E = 0x0133; gUnknown_20399DC->field_3E10 = 0x0100; gUnknown_20399DC->field_3E12 = 0x00F0; gUnknown_20399DC->field_3D49++; break; case 1: if (gUnknown_20399DC->field_3D4C++ > 40) { gUnknown_20399DC->field_3D4C = 0; gUnknown_20399DC->field_3D49++; } break; case 2: FillWindowPixelBuffer(2, PIXEL_FILL(0)); CopyWindowToVram(2, 3); PutWindowTilemap(2); gUnknown_20399DC->field_3D49++; break; case 3: if (gUnknown_20399DC->field_3D4C > 25) { AddTextPrinterParameterized3(2, 2, 4, 0, gUnknown_83F1A94, -1, sub_80C1920(sub_80C3580())); AddTextPrinterParameterized3(2, 2, 2, 14, gUnknown_83F1A90, -1, sub_80C18E0(sub_80C3580())); CopyWindowToVram(2, 3); gUnknown_20399DC->field_3D49++; } else if (gUnknown_20399DC->field_3D4C > 20) { gUnknown_20399DC->field_3E0E -= 6; gUnknown_20399DC->field_3E10 -= 5; gUnknown_20399DC->field_3E12 -= 5; CpuCopy16(gUnknown_20399DC->field_3D40->palptr, gUnknown_20399DC->field_3D4E, 0x60); TintPalette_CustomTone(gUnknown_20399DC->field_3D4E, 0x30, gUnknown_20399DC->field_3E0E, gUnknown_20399DC->field_3E10, gUnknown_20399DC->field_3E12); LoadPalette(gUnknown_20399DC->field_3D4E, 0xD0, 0x60); } gUnknown_20399DC->field_3D4C++; break; case 4: if (JOY_NEW(B_BUTTON) || JOY_NEW(A_BUTTON)) { FillWindowPixelBuffer(2, PIXEL_FILL(0)); CopyWindowToVram(2, 3); gUnknown_20399DC->field_3D48++; gUnknown_20399DC->field_3D49++; } break; default: gTasks[taskId].func = sub_80C1A94; break; } } void sub_80C1E14(u8 taskId) { gTasks[taskId].func = gUnknown_20399DC->field_3D44; HideBg(2); sub_80C4B30(0); sub_80C0B18(); sub_80C0BB0(); sub_80C0AB8(); sub_80C0B9C(); sub_80C4E74(gUnknown_8418E8D); FREE_IF_NOT_NULL(gUnknown_20399DC); } void sub_80C1E78(u8 bgId, const u16 * tilemap) { CopyToBgTilemapBufferRect(2, tilemap, 0, 0, 32, 20); } void sub_80C1E94(void) { u16 r4; u16 r0; sub_80C4BE4(); sub_80C4C2C(0, 17, 192); sub_80C4C48(gUnknown_20399DC->field_3E14); sub_80C4C74(0, 13); sub_80C4C88(59); sub_80C4C9C(1, 0); r4 = sub_80C3508(); r0 = sub_80C3514(); gUnknown_20399DC->field_3E16 = 8 * r4 + 32; gUnknown_20399DC->field_3E18 = 8 * r0 + 24; gUnknown_20399DC->field_3E1A = gUnknown_20399DC->field_3E16 + 8; gUnknown_20399DC->field_3E1C = gUnknown_20399DC->field_3E18 + 8; gUnknown_20399DC->field_3E1E = (0x10 - gUnknown_20399DC->field_3E16) / 8; gUnknown_20399DC->field_3E20 = (0x20 - gUnknown_20399DC->field_3E18) / 8; gUnknown_20399DC->field_3E22 = (0xE0 - gUnknown_20399DC->field_3E1A) / 8; gUnknown_20399DC->field_3E24 = (0x88 - gUnknown_20399DC->field_3E1C) / 8; } bool8 sub_80C1F80(bool8 a0) { struct UnkStruct_80C4CF0 data; if (!a0) { if (gUnknown_20399DC->field_3D4B < 8) { gUnknown_20399DC->field_3E16 += gUnknown_20399DC->field_3E1E; gUnknown_20399DC->field_3E18 += gUnknown_20399DC->field_3E20; gUnknown_20399DC->field_3E1A += gUnknown_20399DC->field_3E22; gUnknown_20399DC->field_3E1C += gUnknown_20399DC->field_3E24; gUnknown_20399DC->field_3D4B++; if (gUnknown_20399DC->field_3E14 < 6) gUnknown_20399DC->field_3E14++; } else { return TRUE; } } else { if (gUnknown_20399DC->field_3D4B == 0) { return TRUE; } else { gUnknown_20399DC->field_3E16 -= gUnknown_20399DC->field_3E1E; gUnknown_20399DC->field_3E18 -= gUnknown_20399DC->field_3E20; gUnknown_20399DC->field_3E1A -= gUnknown_20399DC->field_3E22; gUnknown_20399DC->field_3E1C -= gUnknown_20399DC->field_3E24; gUnknown_20399DC->field_3D4B--; if (gUnknown_20399DC->field_3E14 > 0) gUnknown_20399DC->field_3E14--; } } data.v0 = gUnknown_20399DC->field_3E16; data.v2 = gUnknown_20399DC->field_3E18; data.v4 = gUnknown_20399DC->field_3E1A; data.v6 = gUnknown_20399DC->field_3E1C; sub_80C4CF0(1, &data); sub_80C4C48(gUnknown_20399DC->field_3E14); return FALSE; } void nullsub_63(struct Sprite * sprite) { } void sub_80C210C(u8 a0, u8 a1, u8 a2) { u8 spriteId; struct SpriteSheet spriteSheet = { .data = gUnknown_20399E0->field_000[a0], .size = 0x400, .tag = a1 }; struct SpritePalette spritePalette = { .data = gUnknown_83EF3A4, .tag = a2 }; struct SpriteTemplate template = { .tileTag = a1, .paletteTag = a2, .oam = &gUnknown_83F1C20, .anims = gUnknown_83F1C30, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = nullsub_63 }; gUnknown_20399E0->field_000[a0]->field_408 = a1; gUnknown_20399E0->field_000[a0]->field_40A = a2; LoadSpriteSheet(&spriteSheet); LoadSpritePalette(&spritePalette); spriteId = CreateSprite(&template, gUnknown_20399E0->field_000[a0]->field_404, gUnknown_20399E0->field_000[a0]->field_406, 0); gUnknown_20399E0->field_000[a0]->field_400 = &gSprites[spriteId]; gSprites[spriteId].invisible = TRUE; } void sub_80C2208(u8 taskId, TaskFunc taskFunc) { u8 i; gUnknown_20399E0 = AllocZeroed(sizeof(struct UnkStruct_20399E0)); for (i = 0; i < 6; i++) { gUnknown_20399E0->field_000[i] = AllocZeroed(sizeof(struct UnkStruct_20399E0_000)); gUnknown_20399E0->field_000[i]->field_404 = 32 * (i / 3) + 0x68; gUnknown_20399E0->field_000[i]->field_406 = 64 * (i % 3) + 0x28; } sub_80C4AAC(0); sub_80C4BE4(); sub_80C24BC(); sub_80C0A88(1); gUnknown_20399E0->field_CC8 = taskFunc; gTasks[taskId].func = sub_80C267C; } void sub_80C22C4(u8 a0, bool8 a1) { u8 i; if (a0 == 6) { for (i = 0; i < 6; i++) { gUnknown_20399E0->field_000[i]->field_400->invisible = a1; } } else { gUnknown_20399E0->field_000[a0]->field_400->invisible = a1; } } bool8 sub_80C2344(void) { switch (gUnknown_20399E0->field_CCD) { case 0: LZ77UnCompWram(gUnknown_83F12CC, gUnknown_20399E0->field_000[0]->field_000); sub_80C210C(0, 4, 4); break; case 1: LZ77UnCompWram(gUnknown_83F1550, gUnknown_20399E0->field_000[1]->field_000); sub_80C210C(1, 5, 5); break; case 2: LZ77UnCompWram(gUnknown_83F1738, gUnknown_20399E0->field_000[2]->field_000); sub_80C210C(2, 6, 6); break; case 3: LZ77UnCompWram(gUnknown_83F13EC, gUnknown_20399E0->field_000[3]->field_000); sub_80C210C(3, 7, 7); break; case 4: LZ77UnCompWram(gUnknown_83F1640, gUnknown_20399E0->field_000[4]->field_000); sub_80C210C(4, 8, 8); break; case 5: LZ77UnCompWram(gUnknown_83F1804, gUnknown_20399E0->field_000[5]->field_000); sub_80C210C(5, 9, 9); break; case 6: LZ77UnCompWram(gUnknown_83F0330, gUnknown_20399E0->field_018); break; case 7: LZ77UnCompWram(gUnknown_83F0E0C, gUnknown_20399E0->field_818); break; case 8: LoadBgTiles(1, gUnknown_20399E0->field_018, BG_SCREEN_SIZE, 0x000); break; default: return TRUE; } gUnknown_20399E0->field_CCD++; return FALSE; } void sub_80C24BC(void) { struct UnkStruct_80C4CF0 data; data.v0 = gUnknown_20399E0->field_000[0]->field_404 + 8; data.v2 = 0x10; data.v4 = gUnknown_20399E0->field_000[3]->field_404 - 8; data.v6 = 0xA0; sub_80C4C2C(0, 2, 0); sub_80C4C74(18, 0); sub_80C4C88(16); sub_80C4CF0(0, &data); sub_80C4C9C(0, 0); } void sub_80C253C(void) { struct UnkStruct_80C4CF0 data = gUnknown_83F1C34; sub_80C4BE4(); sub_80C4C2C(2, 41, 128); sub_80C4C48(gUnknown_20399E0->field_CD0); sub_80C4C74(55, 0); sub_80C4C88(18); sub_80C4CF0(0, &data); sub_80C4C9C(0, 0); } void sub_80C2594(u8 taskId) { gTasks[taskId].func = gUnknown_20399E0->field_CC8; } void sub_80C25BC(void) { u8 i; sub_80C2604(); for (i = 0; i < 6; i++) { FREE_IF_NOT_NULL(gUnknown_20399E0->field_000[i]); } FREE_IF_NOT_NULL(gUnknown_20399E0); } void sub_80C2604(void) { u8 i; for (i = 0; i < 6; i++) { gUnknown_20399E0->field_000[i]->field_404 = gUnknown_20399E0->field_000[i]->field_400->pos1.x; gUnknown_20399E0->field_000[i]->field_406 = gUnknown_20399E0->field_000[i]->field_400->pos1.y; if (gUnknown_20399E0->field_000[i]->field_400 != NULL) { DestroySprite(gUnknown_20399E0->field_000[i]->field_400); FreeSpriteTilesByTag(gUnknown_20399E0->field_000[i]->field_408); FreeSpritePaletteByTag(gUnknown_20399E0->field_000[i]->field_40A); } } } void sub_80C267C(u8 taskId) { switch (gUnknown_20399E0->field_CCC) { case 0: sub_80C08E0(); gUnknown_20399E0->field_CCC++; break; case 1: if (sub_80C2344() == TRUE) gUnknown_20399E0->field_CCC++; break; case 2: CopyToBgTilemapBufferRect(1, gUnknown_20399E0->field_818, 0, 0, 30, 20); gUnknown_20399E0->field_CCC++; break; case 3: CopyBgTilemapBufferToVram(1); BlendPalettes(0xFFFFFFFF, 0x10, RGB_BLACK); BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); sub_80C08F4(); gUnknown_20399E0->field_CCC++; break; case 4: ShowBg(0); ShowBg(3); ShowBg(1); sub_80C22C4(6, FALSE); sub_80C2B48(); gUnknown_20399E0->field_CCC++; break; case 5: if (!gPaletteFade.active) { gUnknown_20399E0->field_CCC++; PlaySE(SE_CARD3); } break; case 6: if (sub_80C29A4() == TRUE) gUnknown_20399E0->field_CCC++; break; case 7: sub_80C4324(FALSE); sub_80C3154(FALSE); gUnknown_20399E0->field_CCC++; break; case 8: gUnknown_20399E0->field_CD0 = 15; sub_80C253C(); sub_80C0A88(0); sub_80C48BC(sub_80C0E20(), 25, FALSE); sub_80C4960(sub_80C0E20(), 25, FALSE); gUnknown_20399E0->field_CCC++; break; case 9: sub_80C4E18(gUnknown_8418EB5); if (sub_80C3AC8(1) != 2) sub_80C4E74(gUnknown_8418E8B); else sub_80C4E74(gUnknown_8418E8D); sub_80C4ED0(FALSE); gUnknown_20399E0->field_CCC++; break; case 10: LoadPalette(&gUnknown_83EF23C[15], 0x00, 2); LoadPalette(&gUnknown_83EF23C[15], 0x10, 2); LoadPalette(&gUnknown_83EF23C[15], 0x20, 2); LoadPalette(&gUnknown_83EF23C[15], 0x30, 2); LoadPalette(&gUnknown_83EF23C[15], 0x40, 2); gUnknown_20399E0->field_CCC++; break; case 11: FillBgTilemapBufferRect(1, 0x002, 0, 1, 1, 1, 0x2); FillBgTilemapBufferRect(1, 0x003, 1, 1, 1, 1, 0x2); FillBgTilemapBufferRect(1, 0x03E, 28, 1, 1, 1, 0x2); FillBgTilemapBufferRect(1, 0x03F, 29, 1, 1, 1, 0x2); FillBgTilemapBufferRect(1, 0x03D, 2, 1, 26, 1, 0x2); CopyBgTilemapBufferToVram(1); m4aSongNumStop(SE_CARD3); PlaySE(SE_HI_TURUN); gUnknown_20399E0->field_CCC++; break; case 12: if (gUnknown_20399E0->field_CD0 == 2) { sub_80C22C4(6, TRUE); gUnknown_20399E0->field_CCC++; sub_80C4C48(0); } else { gUnknown_20399E0->field_CD0--; sub_80C4C48(gUnknown_20399E0->field_CD0); } break; case 13: sub_80C4B30(0); sub_80C0BB0(); gUnknown_20399E0->field_CCC++; break; default: sub_80C2604(); sub_80C2594(taskId); break; } } bool8 sub_80C29A4(void) { sub_80C2B48(); if (gUnknown_20399E0->field_000[0]->field_400->pos1.x == 0) { return TRUE; } else if (gUnknown_20399E0->field_CCE > 17) { gUnknown_20399E0->field_000[0]->field_400->pos1.x -= 1; gUnknown_20399E0->field_000[1]->field_400->pos1.x -= 1; gUnknown_20399E0->field_000[2]->field_400->pos1.x -= 1; gUnknown_20399E0->field_000[3]->field_400->pos1.x += 1; gUnknown_20399E0->field_000[4]->field_400->pos1.x += 1; gUnknown_20399E0->field_000[5]->field_400->pos1.x += 1; } else if (gUnknown_20399E0->field_CCE > 14) { gUnknown_20399E0->field_000[0]->field_400->pos1.x -= 2; gUnknown_20399E0->field_000[1]->field_400->pos1.x -= 2; gUnknown_20399E0->field_000[2]->field_400->pos1.x -= 2; gUnknown_20399E0->field_000[3]->field_400->pos1.x += 2; gUnknown_20399E0->field_000[4]->field_400->pos1.x += 2; gUnknown_20399E0->field_000[5]->field_400->pos1.x += 2; } else if (gUnknown_20399E0->field_CCE > 10) { gUnknown_20399E0->field_000[0]->field_400->pos1.x -= 3; gUnknown_20399E0->field_000[1]->field_400->pos1.x -= 3; gUnknown_20399E0->field_000[2]->field_400->pos1.x -= 3; gUnknown_20399E0->field_000[3]->field_400->pos1.x += 3; gUnknown_20399E0->field_000[4]->field_400->pos1.x += 3; gUnknown_20399E0->field_000[5]->field_400->pos1.x += 3; } else if (gUnknown_20399E0->field_CCE > 6) { gUnknown_20399E0->field_000[0]->field_400->pos1.x -= 5; gUnknown_20399E0->field_000[1]->field_400->pos1.x -= 5; gUnknown_20399E0->field_000[2]->field_400->pos1.x -= 5; gUnknown_20399E0->field_000[3]->field_400->pos1.x += 5; gUnknown_20399E0->field_000[4]->field_400->pos1.x += 5; gUnknown_20399E0->field_000[5]->field_400->pos1.x += 5; } else { gUnknown_20399E0->field_000[0]->field_400->pos1.x -= 8; gUnknown_20399E0->field_000[1]->field_400->pos1.x -= 8; gUnknown_20399E0->field_000[2]->field_400->pos1.x -= 8; gUnknown_20399E0->field_000[3]->field_400->pos1.x += 8; gUnknown_20399E0->field_000[4]->field_400->pos1.x += 8; gUnknown_20399E0->field_000[5]->field_400->pos1.x += 8; } gUnknown_20399E0->field_CCE++; return FALSE; } void sub_80C2B48(void) { struct UnkStruct_80C4CF0 data; data.v0 = gUnknown_20399E0->field_000[0]->field_400->pos1.x; data.v2 = 0x10; data.v4 = gUnknown_20399E0->field_000[3]->field_400->pos1.x; data.v6 = 0xA0; sub_80C4CF0(0, &data); } void sub_80C2B9C(void) { struct UnkStruct_80C4CF0 data; data.v0 = gUnknown_20399E0->field_000[0]->field_404 + 16; data.v2 = 0x10; data.v4 = gUnknown_20399E0->field_000[3]->field_404 - 16; data.v6 = 0xA0; sub_80C4C2C(0, 2, 0); sub_80C4C74(18, 0); sub_80C4C88(16); sub_80C4CF0(0, &data); sub_80C4C9C(0, 0); } void sub_80C2C1C(u8 taskId) { gTasks[taskId].func = sub_80C2C7C; } void sub_80C2C38(void) { sub_80C210C(0, 4, 4); sub_80C210C(1, 5, 5); sub_80C210C(2, 6, 6); sub_80C210C(3, 7, 7); sub_80C210C(4, 8, 8); sub_80C210C(5, 9, 9); } void sub_80C2C7C(u8 taskId) { switch (gUnknown_20399E0->field_CCF) { case 0: sub_80C4ED0(TRUE); CopyWindowToVram(3, 3); CopyWindowToVram(4, 3); gUnknown_20399E0->field_CCF++; break; case 1: sub_80C2C38(); gUnknown_20399E0->field_CCF++; break; case 2: LoadPalette(gUnknown_83EF2DC, 0x00, 0xA0); gUnknown_20399E0->field_CCF++; break; case 3: sub_80C22C4(6, FALSE); sub_80C4324(TRUE); sub_80C3154(TRUE); sub_80C4960(255, 25, TRUE); sub_80C48BC(255, 25, TRUE); gUnknown_20399E0->field_CCE = 0; gUnknown_20399E0->field_CD0 = 0; gUnknown_20399E0->field_CCF++; break; case 4: sub_80C253C(); gUnknown_20399E0->field_CCF++; break; case 5: if (gUnknown_20399E0->field_CD0 == 15) { sub_80C4C48(gUnknown_20399E0->field_CD0); gUnknown_20399E0->field_CCF++; } else { gUnknown_20399E0->field_CD0++; sub_80C4C48(gUnknown_20399E0->field_CD0); } break; case 6: sub_80C2B9C(); sub_80C2B48(); PlaySE(SE_CARD2); gUnknown_20399E0->field_CCF++; break; case 7: if (sub_80C2E1C() == TRUE) gUnknown_20399E0->field_CCF++; break; default: gTasks[taskId].func = gUnknown_20399E0->field_CC8; break; } } bool8 sub_80C2E1C(void) { sub_80C2B48(); if (gUnknown_20399E0->field_000[0]->field_400->pos1.x == 104) { return TRUE; } else if (gUnknown_20399E0->field_CCE > 17) { gUnknown_20399E0->field_000[0]->field_400->pos1.x += 1; gUnknown_20399E0->field_000[1]->field_400->pos1.x += 1; gUnknown_20399E0->field_000[2]->field_400->pos1.x += 1; gUnknown_20399E0->field_000[3]->field_400->pos1.x -= 1; gUnknown_20399E0->field_000[4]->field_400->pos1.x -= 1; gUnknown_20399E0->field_000[5]->field_400->pos1.x -= 1; } else if (gUnknown_20399E0->field_CCE > 14) { gUnknown_20399E0->field_000[0]->field_400->pos1.x += 2; gUnknown_20399E0->field_000[1]->field_400->pos1.x += 2; gUnknown_20399E0->field_000[2]->field_400->pos1.x += 2; gUnknown_20399E0->field_000[3]->field_400->pos1.x -= 2; gUnknown_20399E0->field_000[4]->field_400->pos1.x -= 2; gUnknown_20399E0->field_000[5]->field_400->pos1.x -= 2; } else if (gUnknown_20399E0->field_CCE > 10) { gUnknown_20399E0->field_000[0]->field_400->pos1.x += 3; gUnknown_20399E0->field_000[1]->field_400->pos1.x += 3; gUnknown_20399E0->field_000[2]->field_400->pos1.x += 3; gUnknown_20399E0->field_000[3]->field_400->pos1.x -= 3; gUnknown_20399E0->field_000[4]->field_400->pos1.x -= 3; gUnknown_20399E0->field_000[5]->field_400->pos1.x -= 3; } else if (gUnknown_20399E0->field_CCE > 6) { gUnknown_20399E0->field_000[0]->field_400->pos1.x += 5; gUnknown_20399E0->field_000[1]->field_400->pos1.x += 5; gUnknown_20399E0->field_000[2]->field_400->pos1.x += 5; gUnknown_20399E0->field_000[3]->field_400->pos1.x -= 5; gUnknown_20399E0->field_000[4]->field_400->pos1.x -= 5; gUnknown_20399E0->field_000[5]->field_400->pos1.x -= 5; } else { gUnknown_20399E0->field_000[0]->field_400->pos1.x += 8; gUnknown_20399E0->field_000[1]->field_400->pos1.x += 8; gUnknown_20399E0->field_000[2]->field_400->pos1.x += 8; gUnknown_20399E0->field_000[3]->field_400->pos1.x -= 8; gUnknown_20399E0->field_000[4]->field_400->pos1.x -= 8; gUnknown_20399E0->field_000[5]->field_400->pos1.x -= 8; } gUnknown_20399E0->field_CCE++; return FALSE; } void sub_80C2FC0(struct Sprite * sprite) { if (gUnknown_20399E4->field_00C != 0) { sprite->pos1.x += gUnknown_20399E4->field_008; sprite->pos1.y += gUnknown_20399E4->field_00A; gUnknown_20399E4->field_00C--; } else { gUnknown_20399E4->field_01C->pos1.x = 8 * gUnknown_20399E4->field_000 + 36; gUnknown_20399E4->field_01C->pos1.y = 8 * gUnknown_20399E4->field_002 + 36; } } void sub_80C3008(u16 a0, u16 a1) { gUnknown_20399E4 = AllocZeroed(sizeof(struct UnkStruct_20399E4)); LZ77UnCompWram(gUnknown_83EF4E0, gUnknown_20399E4->field_024); gUnknown_20399E4->field_020 = a0; gUnknown_20399E4->field_022 = a1; sub_80C3D40(); gUnknown_20399E4->field_004 = 8 * gUnknown_20399E4->field_000 + 36; gUnknown_20399E4->field_006 = 8 * gUnknown_20399E4->field_002 + 36; gUnknown_20399E4->field_010 = sub_80C31C0; gUnknown_20399E4->field_016 = sub_80C35DC(gUnknown_20399E4->field_014); gUnknown_20399E4->field_018 = sub_80C3878(sub_80C4164(sub_80C0E20(), 1, gUnknown_20399E4->field_002, gUnknown_20399E4->field_000)); sub_80C309C(); } void sub_80C309C(void) { u8 spriteId; struct SpriteSheet spriteSheet = { .data = gUnknown_20399E4->field_024, .size = 0x100, .tag = gUnknown_20399E4->field_020 }; struct SpritePalette spritePalette = { .data = gUnknown_83EF25C, .tag = gUnknown_20399E4->field_022 }; struct SpriteTemplate template = { .tileTag = gUnknown_20399E4->field_020, .paletteTag = gUnknown_20399E4->field_022, .oam = &gUnknown_83F1C3C, .anims = gUnknown_83F1C50, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = sub_80C2FC0 }; LoadSpriteSheet(&spriteSheet); LoadSpritePalette(&spritePalette); spriteId = CreateSprite(&template, gUnknown_20399E4->field_004, gUnknown_20399E4->field_006, 0); gUnknown_20399E4->field_01C = &gSprites[spriteId]; sub_80C3154(TRUE); } void sub_80C3154(bool8 a0) { gUnknown_20399E4->field_01C->invisible = a0; } void sub_80C3178(void) { gUnknown_20399E4->field_00E = 0; } void sub_80C3188(void) { if (gUnknown_20399E4->field_01C != NULL) { DestroySprite(gUnknown_20399E4->field_01C); FreeSpriteTilesByTag(gUnknown_20399E4->field_020); FreeSpritePaletteByTag(gUnknown_20399E4->field_022); } FREE_IF_NOT_NULL(gUnknown_20399E4); } u8 sub_80C31C0(void) { u8 ret = 0; gUnknown_20399E4->field_008 = 0; gUnknown_20399E4->field_00A = 0; if (JOY_HELD(DPAD_UP)) { if (gUnknown_20399E4->field_002 > 0) { gUnknown_20399E4->field_00A = -2; ret = 1; } } if (JOY_HELD(DPAD_DOWN)) { if (gUnknown_20399E4->field_002 < 14) { gUnknown_20399E4->field_00A = 2; ret = 1; } } if (JOY_HELD(DPAD_RIGHT)) { if (gUnknown_20399E4->field_000 < 21) { gUnknown_20399E4->field_008 = 2; ret = 1; } } if (JOY_HELD(DPAD_LEFT)) { if (gUnknown_20399E4->field_000 > 0) { gUnknown_20399E4->field_008 = -2; ret = 1; } } if (JOY_NEW(A_BUTTON)) { ret = 4; if (gUnknown_20399E4->field_000 == 21 && gUnknown_20399E4->field_002 == 13) { PlaySE(SE_W063B); ret = 6; } if (gUnknown_20399E4->field_000 == 21 && gUnknown_20399E4->field_002 == 11) { if (sub_80C0E04(0) == TRUE) { PlaySE(SE_W063B); ret = 5; } } } else if (!JOY_NEW(B_BUTTON)) { if (JOY_REPT(START_BUTTON)) { sub_80C3418(); gUnknown_20399E4->field_014 = sub_80C4164(sub_80C0E20(), 0, gUnknown_20399E4->field_002, gUnknown_20399E4->field_000); gUnknown_20399E4->field_016 = sub_80C35DC(gUnknown_20399E4->field_014); gUnknown_20399E4->field_018 = sub_80C3878(sub_80C4164(sub_80C0E20(), 1, gUnknown_20399E4->field_002, gUnknown_20399E4->field_000)); return 3; } else if (JOY_NEW(SELECT_BUTTON) && gUnknown_20399D4->field_47BC == CB2_ReturnToField) { ret = 6; } } else { ret = 6; } if (ret == 1) { gUnknown_20399E4->field_00C = 4; gUnknown_20399E4->field_010 = sub_80C3348; } return ret; } u8 sub_80C3348(void) { if (gUnknown_20399E4->field_00C != 0) return 2; if (gUnknown_20399E4->field_008 > 0) gUnknown_20399E4->field_000++; if (gUnknown_20399E4->field_008 < 0) gUnknown_20399E4->field_000--; if (gUnknown_20399E4->field_00A > 0) gUnknown_20399E4->field_002++; if (gUnknown_20399E4->field_00A < 0) gUnknown_20399E4->field_002--; gUnknown_20399E4->field_014 = sub_80C4164(sub_80C0E20(), 0, gUnknown_20399E4->field_002, gUnknown_20399E4->field_000); gUnknown_20399E4->field_016 = sub_80C35DC(gUnknown_20399E4->field_014); gUnknown_20399E4->field_018 = sub_80C3878(sub_80C4164(sub_80C0E20(), 1, gUnknown_20399E4->field_002, gUnknown_20399E4->field_000)); gUnknown_20399E4->field_010 = sub_80C31C0; return 3; } u8 sub_80C3400(void) { return gUnknown_20399E4->field_010(); } void sub_80C3418(void) { if (sub_80C0E04(0) == 1) { gUnknown_20399E4->field_00E++; gUnknown_20399E4->field_00E %= 3; if (gUnknown_20399E4->field_00E == 0 && sub_80C0E20() != sub_80C0E34()) { gUnknown_20399E4->field_00E++; } switch (gUnknown_20399E4->field_00E) { case 0: default: gUnknown_20399E4->field_000 = sub_80C4380(); gUnknown_20399E4->field_002 = sub_80C438C(); break; case 1: gUnknown_20399E4->field_000 = 21; gUnknown_20399E4->field_002 = 11; break; case 2: gUnknown_20399E4->field_002 = 13; gUnknown_20399E4->field_000 = 21; break; } } else { gUnknown_20399E4->field_00E++; gUnknown_20399E4->field_00E %= 2; switch (gUnknown_20399E4->field_00E) { case 0: default: gUnknown_20399E4->field_000 = sub_80C4380(); gUnknown_20399E4->field_002 = sub_80C438C(); break; case 1: gUnknown_20399E4->field_002 = 13; gUnknown_20399E4->field_000 = 21; break; } } gUnknown_20399E4->field_01C->pos1.x = 8 * gUnknown_20399E4->field_000 + 36; gUnknown_20399E4->field_01C->pos1.y = 8 * gUnknown_20399E4->field_002 + 36; gUnknown_20399E4->field_014 = sub_80C4164(sub_80C0E20(), 0, gUnknown_20399E4->field_002, gUnknown_20399E4->field_000); } u16 sub_80C3508(void) { return gUnknown_20399E4->field_000; } u16 sub_80C3514(void) { return gUnknown_20399E4->field_002; } u16 sub_80C3520(void) { u8 ret; if (gUnknown_20399E4->field_002 < 0 || gUnknown_20399E4->field_002 > 14 || gUnknown_20399E4->field_000 < 0 || gUnknown_20399E4->field_000 > 21) return MAPSEC_NONE; ret = sub_80C4164(sub_80C0E20(), 0, gUnknown_20399E4->field_002, gUnknown_20399E4->field_000); if ((ret == MAPSEC_NAVEL_ROCK || ret == MAPSEC_BIRTH_ISLAND) && !FlagGet(FLAG_WORLD_MAP_NAVEL_ROCK_EXTERIOR)) ret = MAPSEC_NONE; return ret; } u16 sub_80C3580(void) { u8 ret; if (gUnknown_20399E4->field_002 < 0 || gUnknown_20399E4->field_002 > 14 || gUnknown_20399E4->field_000 < 0 || gUnknown_20399E4->field_000 > 21) return MAPSEC_NONE; ret = sub_80C4164(sub_80C0E20(), 1, gUnknown_20399E4->field_002, gUnknown_20399E4->field_000); if (ret == MAPSEC_CERULEAN_CAVE && !FlagGet(FLAG_SYS_CAN_LINK_WITH_RS)) ret = MAPSEC_NONE; return ret; } u8 sub_80C35DC(u8 mapsec) { switch (mapsec) { case MAPSEC_PALLET_TOWN: return FlagGet(FLAG_WORLD_MAP_PALLET_TOWN) ? 2 : 3; case MAPSEC_VIRIDIAN_CITY: return FlagGet(FLAG_WORLD_MAP_VIRIDIAN_CITY) ? 2 : 3; case MAPSEC_PEWTER_CITY: return FlagGet(FLAG_WORLD_MAP_PEWTER_CITY) ? 2 : 3; case MAPSEC_CERULEAN_CITY: return FlagGet(FLAG_WORLD_MAP_CERULEAN_CITY) ? 2 : 3; case MAPSEC_LAVENDER_TOWN: return FlagGet(FLAG_WORLD_MAP_LAVENDER_TOWN) ? 2 : 3; case MAPSEC_VERMILION_CITY: return FlagGet(FLAG_WORLD_MAP_VERMILION_CITY) ? 2 : 3; case MAPSEC_CELADON_CITY: return FlagGet(FLAG_WORLD_MAP_CELADON_CITY) ? 2 : 3; case MAPSEC_FUCHSIA_CITY: return FlagGet(FLAG_WORLD_MAP_FUCHSIA_CITY) ? 2 : 3; case MAPSEC_CINNABAR_ISLAND: return FlagGet(FLAG_WORLD_MAP_CINNABAR_ISLAND) ? 2 : 3; case MAPSEC_INDIGO_PLATEAU: return FlagGet(FLAG_WORLD_MAP_INDIGO_PLATEAU_EXTERIOR) ? 2 : 3; case MAPSEC_SAFFRON_CITY: return FlagGet(FLAG_WORLD_MAP_SAFFRON_CITY) ? 2 : 3; case MAPSEC_ONE_ISLAND: return FlagGet(FLAG_WORLD_MAP_ONE_ISLAND) ? 2 : 3; case MAPSEC_TWO_ISLAND: return FlagGet(FLAG_WORLD_MAP_TWO_ISLAND) ? 2 : 3; case MAPSEC_THREE_ISLAND: return FlagGet(FLAG_WORLD_MAP_THREE_ISLAND) ? 2 : 3; case MAPSEC_FOUR_ISLAND: return FlagGet(FLAG_WORLD_MAP_FOUR_ISLAND) ? 2 : 3; case MAPSEC_FIVE_ISLAND: return FlagGet(FLAG_WORLD_MAP_FIVE_ISLAND) ? 2 : 3; case MAPSEC_SEVEN_ISLAND: return FlagGet(FLAG_WORLD_MAP_SEVEN_ISLAND) ? 2 : 3; case MAPSEC_SIX_ISLAND: return FlagGet(FLAG_WORLD_MAP_SIX_ISLAND) ? 2 : 3; case MAPSEC_ROUTE_4_FLYDUP: if (!sub_80C0E04(3)) return 0; return FlagGet(FLAG_WORLD_MAP_ROUTE4_POKEMON_CENTER_1F) ? 2 : 3; case MAPSEC_ROUTE_10_FLYDUP: return FlagGet(FLAG_WORLD_MAP_ROUTE10_POKEMON_CENTER_1F) ? 2 : 3; case MAPSEC_NONE: return 0; default: return 1; } } u8 sub_80C3878(u8 mapsec) { switch (mapsec) { case MAPSEC_NONE: return 0; case MAPSEC_VIRIDIAN_FOREST: return FlagGet(FLAG_WORLD_MAP_VIRIDIAN_FOREST) ? 2 : 3; case MAPSEC_MT_MOON: return FlagGet(FLAG_WORLD_MAP_MT_MOON_1F) ? 2 : 3; case MAPSEC_S_S_ANNE: return FlagGet(FLAG_WORLD_MAP_SSANNE_EXTERIOR) ? 2 : 3; case MAPSEC_UNDERGROUND_PATH: return FlagGet(FLAG_WORLD_MAP_UNDERGROUND_PATH_NORTH_SOUTH_TUNNEL) ? 2 : 3; case MAPSEC_UNDERGROUND_PATH_2: return FlagGet(FLAG_WORLD_MAP_UNDERGROUND_PATH_EAST_WEST_TUNNEL) ? 2 : 3; case MAPSEC_DIGLETTS_CAVE: return FlagGet(FLAG_WORLD_MAP_DIGLETTS_CAVE_B1F) ? 2 : 3; case MAPSEC_KANTO_VICTORY_ROAD: return FlagGet(FLAG_WORLD_MAP_VICTORY_ROAD_1F) ? 2 : 3; case MAPSEC_ROCKET_HIDEOUT: return FlagGet(FLAG_WORLD_MAP_ROCKET_HIDEOUT_B1F) ? 2 : 3; case MAPSEC_SILPH_CO: return FlagGet(FLAG_WORLD_MAP_SILPH_CO_1F) ? 2 : 3; case MAPSEC_POKEMON_MANSION: return FlagGet(FLAG_WORLD_MAP_POKEMON_MANSION_1F) ? 2 : 3; case MAPSEC_KANTO_SAFARI_ZONE: return FlagGet(FLAG_WORLD_MAP_SAFARI_ZONE_CENTER) ? 2 : 3; case MAPSEC_POKEMON_LEAGUE: return FlagGet(FLAG_WORLD_MAP_POKEMON_LEAGUE_LORELEIS_ROOM) ? 2 : 3; case MAPSEC_ROCK_TUNNEL: return FlagGet(FLAG_WORLD_MAP_ROCK_TUNNEL_1F) ? 2 : 3; case MAPSEC_SEAFOAM_ISLANDS: return FlagGet(FLAG_WORLD_MAP_SEAFOAM_ISLANDS_1F) ? 2 : 3; case MAPSEC_POKEMON_TOWER: return FlagGet(FLAG_WORLD_MAP_POKEMON_TOWER_1F) ? 2 : 3; case MAPSEC_CERULEAN_CAVE: return FlagGet(FLAG_WORLD_MAP_CERULEAN_CAVE_1F) ? 2 : 3; case MAPSEC_POWER_PLANT: return FlagGet(FLAG_WORLD_MAP_POWER_PLANT) ? 2 : 3; case MAPSEC_NAVEL_ROCK: return FlagGet(FLAG_WORLD_MAP_NAVEL_ROCK_EXTERIOR) ? 2 : 3; case MAPSEC_MT_EMBER: return FlagGet(FLAG_WORLD_MAP_MT_EMBER_EXTERIOR) ? 2 : 3; case MAPSEC_BERRY_FOREST: return FlagGet(FLAG_WORLD_MAP_THREE_ISLAND_BERRY_FOREST) ? 2 : 3; case MAPSEC_ICEFALL_CAVE: return FlagGet(FLAG_WORLD_MAP_FOUR_ISLAND_ICEFALL_CAVE_ENTRANCE) ? 2 : 3; case MAPSEC_ROCKET_WAREHOUSE: return FlagGet(FLAG_WORLD_MAP_FIVE_ISLAND_ROCKET_WAREHOUSE) ? 2 : 3; case MAPSEC_TRAINER_TOWER_2: return FlagGet(FLAG_WORLD_MAP_SEVEN_ISLAND_TRAINER_TOWER_LOBBY) ? 2 : 3; case MAPSEC_DOTTED_HOLE: return FlagGet(FLAG_WORLD_MAP_SIX_ISLAND_DOTTED_HOLE_1F) ? 2 : 3; case MAPSEC_LOST_CAVE: return FlagGet(FLAG_WORLD_MAP_FIVE_ISLAND_LOST_CAVE_ENTRANCE) ? 2 : 3; case MAPSEC_PATTERN_BUSH: return FlagGet(FLAG_WORLD_MAP_SIX_ISLAND_PATTERN_BUSH) ? 2 : 3; case MAPSEC_ALTERING_CAVE: return FlagGet(FLAG_WORLD_MAP_SIX_ISLAND_ALTERING_CAVE) ? 2 : 3; case MAPSEC_TANOBY_CHAMBERS: return FlagGet(FLAG_WORLD_MAP_SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER) ? 2 : 3; case MAPSEC_THREE_ISLE_PATH: return FlagGet(FLAG_WORLD_MAP_THREE_ISLAND_DUNSPARCE_TUNNEL) ? 2 : 3; case MAPSEC_TANOBY_KEY: return FlagGet(FLAG_WORLD_MAP_SEVEN_ISLAND_SEVAULT_CANYON_TANOBY_KEY) ? 2 : 3; case MAPSEC_BIRTH_ISLAND: return FlagGet(FLAG_WORLD_MAP_BIRTH_ISLAND_EXTERIOR) ? 2 : 3; default: return 1; } } u8 sub_80C3AC8(u8 a0) { switch (a0) { default: return gUnknown_20399E4->field_016; case 0: return gUnknown_20399E4->field_016; case 1: return gUnknown_20399E4->field_018; } } u16 sub_80C3B00(void) { return Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum)->regionMapSectionId; } void sub_80C3B28(void) { u16 width; u32 divisor; u16 height; u16 x; u16 y; u32 r6; const struct MapHeader * mapHeader; struct WarpData * warp; switch (get_map_light_level_by_bank_and_number(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum)) { default: case 1: case 2: case 3: case 5: case 6: gUnknown_20399E4->field_014 = gMapHeader.regionMapSectionId; width = gMapHeader.mapLayout->width; height = gMapHeader.mapLayout->height; x = gSaveBlock1Ptr->pos.x; y = gSaveBlock1Ptr->pos.y; break; case 4: case 7: mapHeader = Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->escapeWarp.mapGroup, gSaveBlock1Ptr->escapeWarp.mapNum); gUnknown_20399E4->field_014 = mapHeader->regionMapSectionId; width = mapHeader->mapLayout->width; height = mapHeader->mapLayout->height; x = gSaveBlock1Ptr->escapeWarp.x; y = gSaveBlock1Ptr->escapeWarp.y; break; case 9: mapHeader = Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->warp2.mapGroup, gSaveBlock1Ptr->warp2.mapNum); gUnknown_20399E4->field_014 = mapHeader->regionMapSectionId; width = mapHeader->mapLayout->width; height = mapHeader->mapLayout->height; x = gSaveBlock1Ptr->warp2.x; y = gSaveBlock1Ptr->warp2.y; break; case 8: if ((gUnknown_20399E4->field_014 = gMapHeader.regionMapSectionId) != MAPSEC_SPECIAL_AREA) { warp = &gSaveBlock1Ptr->escapeWarp; mapHeader = Overworld_GetMapHeaderByGroupAndId(warp->mapGroup, warp->mapNum); } else { warp = &gSaveBlock1Ptr->warp2; mapHeader = Overworld_GetMapHeaderByGroupAndId(warp->mapGroup, warp->mapNum); gUnknown_20399E4->field_014 = mapHeader->regionMapSectionId; } width = mapHeader->mapLayout->width; height = mapHeader->mapLayout->height; x = warp->x; y = warp->y; break; } gUnknown_20399E4->field_014 -= MAPSECS_KANTO; divisor = width / gUnknown_83F2178[gUnknown_20399E4->field_014][0]; if (divisor == 0) divisor = 1; x /= divisor; if (x >= gUnknown_83F2178[gUnknown_20399E4->field_014][0]) x = gUnknown_83F2178[gUnknown_20399E4->field_014][0] - 1; divisor = height / gUnknown_83F2178[gUnknown_20399E4->field_014][1]; if (divisor == 0) divisor = 1; y /= divisor; if (y >= gUnknown_83F2178[gUnknown_20399E4->field_014][1]) y = gUnknown_83F2178[gUnknown_20399E4->field_014][1] - 1; gUnknown_20399E4->field_000 = x + gUnknown_83F1E60[gUnknown_20399E4->field_014][0]; gUnknown_20399E4->field_002 = y + gUnknown_83F1E60[gUnknown_20399E4->field_014][1]; } void sub_80C3D40(void) { switch (sub_80C3B00()) { case MAPSEC_KANTO_SAFARI_ZONE: gUnknown_20399E4->field_000 = 12; gUnknown_20399E4->field_002 = 12; break; case MAPSEC_SILPH_CO: gUnknown_20399E4->field_000 = 14; gUnknown_20399E4->field_002 = 6; break; case MAPSEC_POKEMON_MANSION: gUnknown_20399E4->field_000 = 4; gUnknown_20399E4->field_002 = 14; break; case MAPSEC_POKEMON_TOWER: gUnknown_20399E4->field_000 = 18; gUnknown_20399E4->field_002 = 6; break; case MAPSEC_POWER_PLANT: gUnknown_20399E4->field_000 = 18; gUnknown_20399E4->field_002 = 4; break; case MAPSEC_S_S_ANNE: gUnknown_20399E4->field_000 = 14; gUnknown_20399E4->field_002 = 9; break; case MAPSEC_POKEMON_LEAGUE: gUnknown_20399E4->field_000 = 2; gUnknown_20399E4->field_002 = 3; break; case MAPSEC_ROCKET_HIDEOUT: gUnknown_20399E4->field_000 = 11; gUnknown_20399E4->field_002 = 6; break; case MAPSEC_UNDERGROUND_PATH: gUnknown_20399E4->field_000 = 14; gUnknown_20399E4->field_002 = 7; if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(UNDERGROUND_PATH_NORTH_ENTRANCE)) { gUnknown_20399E4->field_000 = 14; // optimized out but required to match gUnknown_20399E4->field_002 = 5; } break; case MAPSEC_UNDERGROUND_PATH_2: gUnknown_20399E4->field_000 = 12; gUnknown_20399E4->field_002 = 6; if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(UNDERGROUND_PATH_EAST_ENTRANCE)) { gUnknown_20399E4->field_000 = 15; gUnknown_20399E4->field_002 = 6; // optimized out but required to match } break; case MAPSEC_BIRTH_ISLAND: gUnknown_20399E4->field_000 = 18; gUnknown_20399E4->field_002 = 13; break; case MAPSEC_NAVEL_ROCK: gUnknown_20399E4->field_000 = 10; gUnknown_20399E4->field_002 = 8; break; case MAPSEC_TRAINER_TOWER_2: gUnknown_20399E4->field_000 = 5; gUnknown_20399E4->field_002 = 6; break; case MAPSEC_MT_EMBER: gUnknown_20399E4->field_000 = 2; gUnknown_20399E4->field_002 = 3; break; case MAPSEC_BERRY_FOREST: gUnknown_20399E4->field_000 = 14; gUnknown_20399E4->field_002 = 12; break; case MAPSEC_PATTERN_BUSH: gUnknown_20399E4->field_000 = 17; gUnknown_20399E4->field_002 = 3; break; case MAPSEC_ROCKET_WAREHOUSE: gUnknown_20399E4->field_000 = 17; gUnknown_20399E4->field_002 = 11; break; case MAPSEC_DILFORD_CHAMBER: case MAPSEC_LIPTOO_CHAMBER: case MAPSEC_MONEAN_CHAMBER: case MAPSEC_RIXY_CHAMBER: case MAPSEC_SCUFIB_CHAMBER: case MAPSEC_TANOBY_CHAMBERS: case MAPSEC_VIAPOIS_CHAMBER: case MAPSEC_WEEPTH_CHAMBER: gUnknown_20399E4->field_000 = 9; gUnknown_20399E4->field_002 = 12; break; case MAPSEC_DOTTED_HOLE: gUnknown_20399E4->field_000 = 16; gUnknown_20399E4->field_002 = 8; break; case MAPSEC_VIRIDIAN_FOREST: gUnknown_20399E4->field_000 = 4; gUnknown_20399E4->field_002 = 6; break; case MAPSEC_ROUTE_2: if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(PALLET_TOWN)) { gUnknown_20399E4->field_000 = 4; gUnknown_20399E4->field_002 = 7; } else if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(CERULEAN_CITY)) { gUnknown_20399E4->field_000 = 4; gUnknown_20399E4->field_002 = 5; } else { sub_80C3B28(); } break; case MAPSEC_ROUTE_21: if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE21_NORTH)) { gUnknown_20399E4->field_000 = 4; gUnknown_20399E4->field_002 = 12; } else if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE21_SOUTH)) { gUnknown_20399E4->field_000 = 4; gUnknown_20399E4->field_002 = 13; } break; case MAPSEC_ROUTE_5: if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(VIRIDIAN_CITY)) { gUnknown_20399E4->field_000 = 14; gUnknown_20399E4->field_002 = 5; } else { sub_80C3B28(); } break; case MAPSEC_ROUTE_6: if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(PALLET_TOWN)) { gUnknown_20399E4->field_000 = 14; gUnknown_20399E4->field_002 = 7; } else { sub_80C3B28(); } break; case MAPSEC_ROUTE_7: if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(PALLET_TOWN)) { gUnknown_20399E4->field_000 = 13; gUnknown_20399E4->field_002 = 6; } else { sub_80C3B28(); } break; case MAPSEC_ROUTE_8: if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(PALLET_TOWN)) { gUnknown_20399E4->field_000 = 15; gUnknown_20399E4->field_002 = 6; } else { sub_80C3B28(); } break; default: sub_80C3B28(); break; } gUnknown_20399E4->field_014 = sub_80C4164(sub_80C0E20(), 0, gUnknown_20399E4->field_002, gUnknown_20399E4->field_000); } u8 sub_80C4164(u8 a0, u8 a1, s16 a2, s16 a3) { switch (a0) { case 0: return gUnknown_83F2490[a1][a2][a3]; case 1: return gUnknown_83F2724[a1][a2][a3]; case 2: return gUnknown_83F29B8[a1][a2][a3]; case 3: return gUnknown_83F2C4C[a1][a2][a3]; default: return MAPSEC_NONE; } } void sub_80C41D8(u16 a0, u16 a1) { gUnknown_20399E8 = AllocZeroed(sizeof(struct UnkStruct_20399E8)); if (gSaveBlock2Ptr->playerGender == FEMALE) LZ77UnCompWram(gUnknown_83EF59C, gUnknown_20399E8->field_0C); else LZ77UnCompWram(gUnknown_83EF524, gUnknown_20399E8->field_0C); gUnknown_20399E8->field_08 = a0; gUnknown_20399E8->field_0A = a1; gUnknown_20399E8->field_00 = sub_80C3508(); gUnknown_20399E8->field_02 = sub_80C3514(); sub_80C4244(); } void sub_80C4244(void) { u8 spriteId; struct SpriteSheet spriteSheet = { .data = gUnknown_20399E8->field_0C, .size = 0x80, .tag = gUnknown_20399E8->field_08 }; struct SpritePalette spritePalette = { .data = gUnknown_83EF27C, .tag = gUnknown_20399E8->field_0A }; struct SpriteTemplate template = { .tileTag = gUnknown_20399E8->field_08, .paletteTag = gUnknown_20399E8->field_0A, .oam = &gUnknown_83F1C54, .anims = gUnknown_83F1C64, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; if (gSaveBlock2Ptr->playerGender == FEMALE) spritePalette.data = gUnknown_83EF29C; LoadSpriteSheet(&spriteSheet); LoadSpritePalette(&spritePalette); spriteId = CreateSprite(&template, 8 * gUnknown_20399E8->field_00 + 36, 8 * gUnknown_20399E8->field_02 + 36, 2); gUnknown_20399E8->field_04 = &gSprites[spriteId]; sub_80C4324(TRUE); } void sub_80C4324(bool8 a0) { gUnknown_20399E8->field_04->invisible = a0; } void sub_80C4348(void) { if (gUnknown_20399E8->field_04 != NULL) { DestroySprite(gUnknown_20399E8->field_04); FreeSpriteTilesByTag(gUnknown_20399E8->field_08); FreeSpritePaletteByTag(gUnknown_20399E8->field_0A); } FREE_IF_NOT_NULL(gUnknown_20399E8); } u16 sub_80C4380(void) { return gUnknown_20399E8->field_00; } u16 sub_80C438C(void) { return gUnknown_20399E8->field_02; } void sub_80C4398(u8 a0, u8 taskId, TaskFunc taskFunc) { gUnknown_20399EC = AllocZeroed(sizeof(struct UnkStruct_20399EC)); gUnknown_20399EC->field_468 = taskFunc; gUnknown_20399EC->field_460 = a0; LZ77UnCompWram(gUnknown_83F18D8, gUnknown_20399EC->field_000); LZ77UnCompWram(gUnknown_83F1908, gUnknown_20399EC->field_040); gTasks[taskId].func = sub_80C440C; } void sub_80C440C(u8 taskId) { switch (gUnknown_20399EC->field_463) { case 0: sub_80C08E0(); gUnknown_20399EC->field_463++; break; case 1: sub_80C47F0(); gUnknown_20399EC->field_463++; break; case 2: sub_80C4750(); gUnknown_20399EC->field_463++; break; case 3: BlendPalettes(0xFFFFFFFF, 16, RGB_BLACK); BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); gUnknown_20399EC->field_463++; break; case 4: sub_80C08F4(); gUnknown_20399EC->field_463++; break; default: SetGpuReg(REG_OFFSET_DISPCNT, GetGpuReg(REG_OFFSET_DISPCNT) | DISPCNT_OBJ_ON); sub_80C44E4(taskId); break; } } void sub_80C44E4(u8 taskId) { gTasks[taskId].func = gUnknown_20399EC->field_468; } void sub_80C450C(u8 a0, u8 a1, u16 a2, u16 a3, u8 a4, u8 a5) { u8 spriteId; struct SpriteSheet spriteSheet = { .data = gUnknown_20399EC->field_040, .size = 0x100, .tag = a4 }; struct SpritePalette spritePalette = { .data = gUnknown_83EF2BC, .tag = a5 }; struct SpriteTemplate template = { .tileTag = a4, .paletteTag = a5, .oam = &gUnknown_83F1C68, .anims = gUnknown_83F1C94, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; LoadSpriteSheet(&spriteSheet); LoadSpritePalette(&spritePalette); spriteId = CreateSprite(&template, 8 * a2 + 36, 8 * a3 + 36, 1); gUnknown_20399EC->field_2D0[a1].field_8 = &gSprites[spriteId]; gSprites[spriteId].invisible = TRUE; gUnknown_20399EC->field_2D0[a1].field_4 = a0; } void sub_80C4614(u8 a0, u8 a1, u16 a2, u16 a3, u8 a4, u8 a5) { u8 spriteId; u8 r4; s16 r7 = 0; struct SpriteSheet spriteSheet = { .data = gUnknown_20399EC->field_000, .size = 0x40, .tag = a4 }; struct SpritePalette spritePalette = { .data = gUnknown_83EF2BC, .tag = a5 }; struct SpriteTemplate template = { .tileTag = a4, .paletteTag = a5, .oam = &gUnknown_83F1C70, .anims = gUnknown_83F1C98, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; LoadSpriteSheet(&spriteSheet); LoadSpritePalette(&spritePalette); r4 = sub_80C4164(a0, 0, a3, a2); if ((sub_80C35DC(r4) == 2 || sub_80C35DC(r4) == 3) && r4 != MAPSEC_ROUTE_10_FLYDUP) r7 = 2; spriteId = CreateSprite(&template, 8 * a2 + 36 + r7, 8 * a3 + 36 + r7, 3); gUnknown_20399EC->field_140[a1].field_8 = &gSprites[spriteId]; gSprites[spriteId].invisible = TRUE; gUnknown_20399EC->field_140[a1].field_4 = a0; } void sub_80C4750(void) { u16 i, j, k; u8 r7 = 0; if (sub_80C0E04(3)) { for (i = 0; i < 4; i++) { for (j = 0; j < 15; j++) { for (k = 0; k < 22; k++) { if (sub_80C35DC(sub_80C4164(i, 0, j, k)) == 2) { sub_80C450C(i, r7, k, j, r7 + 10, 10); r7++; } } } } } } void sub_80C47F0(void) { u16 i, j, k; u8 r6 = 0; u8 mapsec; for (i = 0; i < 4; i++) { for (j = 0; j < 15; j++) { for (k = 0; k < 22; k++) { mapsec = sub_80C4164(i, 1, j, k); if (mapsec == MAPSEC_NONE) continue; if (mapsec == MAPSEC_CERULEAN_CAVE && !FlagGet(FLAG_SYS_CAN_LINK_WITH_RS)) continue; sub_80C4614(i, r6, k, j, r6 + 35, 10); if (sub_80C3878(mapsec) != 2) { StartSpriteAnim(gUnknown_20399EC->field_140[r6].field_8, 1); } r6++; } } } } void sub_80C48BC(u8 a0, u8 a1, bool8 a2) { u8 i; if (a1 == 25) { for (i = 0; i < 25; i++) { if (gUnknown_20399EC->field_2D0[i].field_4 == a0 || a0 == 0xFF) gUnknown_20399EC->field_2D0[i].field_8->invisible = a2; } } else { if (gUnknown_20399EC->field_2D0[a1].field_4 == a0) gUnknown_20399EC->field_2D0[a1].field_8->invisible = a2; } } void sub_80C4960(u8 a0, u8 a1, bool8 a2) { u8 i; if (a1 == 25) { for (i = 0; i < 25; i++) { if (gUnknown_20399EC->field_140[i].field_4 == a0 || a0 == 0xFF) gUnknown_20399EC->field_140[i].field_8->invisible = a2; } } else { if (gUnknown_20399EC->field_140[a1].field_4 != a0) gUnknown_20399EC->field_140[a1].field_8->invisible = a2; } } void sub_80C4A04(void) { u8 i; for (i = 0; i < 25; i++) { if (gUnknown_20399EC->field_2D0[i].field_8 != NULL) { DestroySprite(gUnknown_20399EC->field_2D0[i].field_8); FreeSpriteTilesByTag(gUnknown_20399EC->field_2D0[i].field_C); FreeSpritePaletteByTag(gUnknown_20399EC->field_2D0[i].field_E); } } for (i = 0; i < 25; i++) { if (gUnknown_20399EC->field_140[i].field_8 != NULL) { DestroySprite(gUnknown_20399EC->field_140[i].field_8); FreeSpriteTilesByTag(gUnknown_20399EC->field_140[i].field_C); FreeSpritePaletteByTag(gUnknown_20399EC->field_140[i].field_E); } } FREE_IF_NOT_NULL(gUnknown_20399EC); } bool8 sub_80C4AAC(u8 a0) { if (gUnknown_20399F0[a0] != NULL) return FALSE; gUnknown_20399F0[a0] = AllocZeroed(sizeof(struct UnkStruct_20399F0)); gUnknown_20399F0[a0]->bldcnt = GetGpuReg(REG_OFFSET_BLDCNT); gUnknown_20399F0[a0]->bldy = GetGpuReg(REG_OFFSET_BLDY); gUnknown_20399F0[a0]->bldalpha = GetGpuReg(REG_OFFSET_BLDALPHA); gUnknown_20399F0[a0]->winin = GetGpuReg(REG_OFFSET_WININ); gUnknown_20399F0[a0]->winout = GetGpuReg(REG_OFFSET_WINOUT); gUnknown_20399F0[a0]->win0h = GetGpuReg(REG_OFFSET_WIN0H); gUnknown_20399F0[a0]->win1h = GetGpuReg(REG_OFFSET_WIN1H); gUnknown_20399F0[a0]->win0v = GetGpuReg(REG_OFFSET_WIN0V); gUnknown_20399F0[a0]->win1v = GetGpuReg(REG_OFFSET_WIN1V); return TRUE; } bool8 sub_80C4B30(u8 a0) { if (gUnknown_20399F0[a0] == NULL) return FALSE; SetGpuReg(REG_OFFSET_BLDCNT, gUnknown_20399F0[a0]->bldcnt); SetGpuReg(REG_OFFSET_BLDY, gUnknown_20399F0[a0]->bldy); SetGpuReg(REG_OFFSET_BLDALPHA, gUnknown_20399F0[a0]->bldalpha); SetGpuReg(REG_OFFSET_WININ, gUnknown_20399F0[a0]->winin); SetGpuReg(REG_OFFSET_WINOUT, gUnknown_20399F0[a0]->winout); SetGpuReg(REG_OFFSET_WIN0H, gUnknown_20399F0[a0]->win0h); SetGpuReg(REG_OFFSET_WIN1H, gUnknown_20399F0[a0]->win1h); SetGpuReg(REG_OFFSET_WIN0V, gUnknown_20399F0[a0]->win0v); SetGpuReg(REG_OFFSET_WIN1V, gUnknown_20399F0[a0]->win1v); FREE_IF_NOT_NULL(gUnknown_20399F0[a0]); return TRUE; } void sub_80C4BB8(void) { u8 i; for (i = 0; i < 3; i++) { FREE_IF_NOT_NULL(gUnknown_20399F0[i]); } } void sub_80C4BE4(void) { struct UnkStruct_80C4CF0 data = {}; sub_80C4C2C(0, 0, 0); sub_80C4C48(0); sub_80C4CF0(0, &data); sub_80C4CF0(1, &data); sub_80C4C74(0, 0); sub_80C4C9C(0, 1); sub_80C4C9C(1, 1); } void sub_80C4C2C(u8 a0, u16 a1, u16 a2) { u16 regval = a0 << 8; regval |= a1; regval |= a2; SetGpuReg(REG_OFFSET_BLDCNT, regval); } void sub_80C4C48(u16 a0) { SetGpuReg(REG_OFFSET_BLDY, a0); } void sub_80C4C5C(u16 a0, u16 a1) { u16 regval = a0 << 8; regval |= a1; SetGpuReg(REG_OFFSET_BLDALPHA, regval); } void sub_80C4C74(u16 a0, u16 a1) { u16 regval = a1 << 8; regval |= a0; SetGpuReg(REG_OFFSET_WININ, regval); } void sub_80C4C88(u16 a0) { SetGpuReg(REG_OFFSET_WINOUT, a0); } void sub_80C4C9C(u8 a0, u8 a1) { u16 data[2]; memcpy(data, gUnknown_83F1CA0, 4); switch (a1) { case 0: SetGpuReg(REG_OFFSET_DISPCNT, GetGpuReg(REG_OFFSET_DISPCNT) | data[a0]); break; case 1: ClearGpuRegBits(REG_OFFSET_DISPCNT, data[a0]); break; } } void sub_80C4CF0(u8 a0, const struct UnkStruct_80C4CF0 *a1) { SetGpuReg(gUnknown_83F1CA4[a0][0], (a1->v2 << 8) | a1->v6); SetGpuReg(gUnknown_83F1CA4[a0][1], (a1->v0 << 8) | a1->v4); } void sub_80C4D30(void) { sub_80C4BB8(); sub_80C4BE4(); } bool32 sub_80C4D40(u16 a0) { if (gUnknown_20399D4 != NULL) return FALSE; if (a0 != MAPSEC_CELADON_CITY) return FALSE; if (gSaveBlock1Ptr->location.mapGroup != MAP_GROUP(CELADON_CITY_DEPARTMENT_STORE_1F)) return FALSE; if (gSaveBlock1Ptr->location.mapNum != MAP_NUM(CELADON_CITY_DEPARTMENT_STORE_1F) && gSaveBlock1Ptr->location.mapNum != MAP_NUM(CELADON_CITY_DEPARTMENT_STORE_2F) && gSaveBlock1Ptr->location.mapNum != MAP_NUM(CELADON_CITY_DEPARTMENT_STORE_3F) && gSaveBlock1Ptr->location.mapNum != MAP_NUM(CELADON_CITY_DEPARTMENT_STORE_4F) && gSaveBlock1Ptr->location.mapNum != MAP_NUM(CELADON_CITY_DEPARTMENT_STORE_5F) && gSaveBlock1Ptr->location.mapNum != MAP_NUM(CELADON_CITY_DEPARTMENT_STORE_ROOF) && gSaveBlock1Ptr->location.mapNum != MAP_NUM(CELADON_CITY_DEPARTMENT_STORE_ELEVATOR)) return FALSE; return TRUE; } u8 *GetMapName(u8 *dst0, u16 mapsec, u16 fill) { u8 *dst; u16 i; u16 idx;; if ((idx = mapsec - MAPSECS_KANTO) <= MAPSEC_SPECIAL_AREA - MAPSECS_KANTO) { if (sub_80C4D40(mapsec) == TRUE) dst = StringCopy(dst0, gMapSecName_CeladonDept); else dst = StringCopy(dst0, gUnknown_83F1CAC[idx]); } else { if (fill == 0) fill = 18; return StringFill(dst0, CHAR_SPACE, fill); } if (fill != 0) { for (i = dst - dst0; i < fill; i++) *dst++ = CHAR_SPACE; *dst = EOS; } return dst; } u8 *GetMapNameGeneric(u8 *dest, u16 mapsec) { return GetMapName(dest, mapsec, 0); } u8 *sub_80C4E08(u8 *dest, u16 mapsec) { return GetMapNameGeneric(dest, mapsec); } void sub_80C4E18(const u8 *str) { if (gUnknown_20399D4->field_4797[2] == 1) FillWindowPixelBuffer(3, PIXEL_FILL(0)); else FillWindowPixelBuffer(3, PIXEL_FILL(15)); AddTextPrinterParameterized3(3, 0, 0, 0, gUnknown_83F1CA8, 0, str); CopyWindowToVram(3, 2); } void sub_80C4E74(const u8 *str) { if (gUnknown_20399D4->field_4797[2] == 1) FillWindowPixelBuffer(4, PIXEL_FILL(0)); else FillWindowPixelBuffer(4, PIXEL_FILL(15)); AddTextPrinterParameterized3(4, 0, 0, 0, gUnknown_83F1CA8, 0, str); CopyWindowToVram(4, 3); } void sub_80C4ED0(bool8 mode) { if (!mode) { PutWindowTilemap(3); PutWindowTilemap(4); } else { ClearWindowTilemap(3); ClearWindowTilemap(4); } } void MCB2_FlyMap(void) { sub_80C51E8(); sub_80BFEDC(2); } void sub_80C4F08(u8 taskId) { switch (gUnknown_20399FC->field_0) { case 0: BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); sub_80C4398(sub_80C0E20(), taskId, sub_80C07E4()); sub_80C3008(0, 0); sub_80C41D8(1, 1); sub_80C3154(FALSE); sub_80C4324(FALSE); gUnknown_20399FC->field_0++; break; case 1: if (sub_80C0E04(2) == TRUE) { sub_80C2208(taskId, sub_80C07E4()); } else { ShowBg(0); ShowBg(3); ShowBg(1); sub_80C4E18(gUnknown_8418EB5); sub_80C48BC(sub_80C0E20(), 25, FALSE); sub_80C4960(sub_80C0E20(), 25, FALSE); } gUnknown_20399FC->field_0++; break; case 2: sub_80C4E74(gUnknown_8418EB0); sub_80C4ED0(FALSE); gUnknown_20399FC->field_0++; break; case 3: if (!gPaletteFade.active) { sub_80C0B18(); PutWindowTilemap(0); sub_80C0BB0(); PutWindowTilemap(1); gUnknown_20399FC->field_0++; } break; case 4: switch (sub_80C3400()) { case 1: case 2: break; case 6: gUnknown_20399FC->field_0 = 6; break; case 3: if (sub_80C3AC8(0) == 2) PlaySE(SE_Z_PAGE); else sub_80C0450(); sub_80C3178(); sub_80C0B18(); sub_80C0BB0(); sub_80C0B9C(); if (sub_80C3508() == 21 && sub_80C3514() == 13) { PlaySE(SE_W255); sub_80C4E74(gUnknown_8418E95); } else if (sub_80C3AC8(0) == 2 || sub_80C3AC8(0) == 4) { sub_80C4E74(gUnknown_8418EB0); } else { sub_80C4E74(gUnknown_8418E8B); } break; case 4: if ((sub_80C3AC8(0) == 2 || sub_80C3AC8(0) == 4) && sub_80C0E04(3) == TRUE) { switch (get_map_light_level_by_bank_and_number(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum)) { case 4: case 8: gUnknown_20399FC->field_2 = FALSE; gUnknown_20399FC->field_0++; break; default: PlaySE(SE_KAIFUKU); gUnknown_20399FC->field_2 = TRUE; gUnknown_20399FC->field_0++; break; } } break; case 5: sub_80C0E70(sub_80C0E20(), taskId, sub_80C07F8); break; } break; case 5: if (sub_80C0E04(2) == TRUE) sub_80C2C1C(taskId); gUnknown_20399FC->field_0++; break; case 6: BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); gUnknown_20399FC->field_0++; break; default: if (!gPaletteFade.active) { if (gUnknown_20399FC->field_2 == TRUE) sub_80C527C(sub_80C3520()); sub_80C5208(taskId); } break; } } void sub_80C51E8(void) { gUnknown_20399FC = AllocZeroed(sizeof(struct UnkStruct_20399FC)); gUnknown_20399FC->field_0 = 0; gUnknown_20399FC->field_1 = 0; } void sub_80C5208(u8 taskId) { if (sub_80C0E04(2) == TRUE) sub_80C25BC(); sub_80C4A04(); sub_80C3188(); sub_80C4348(); sub_80C4D30(); sub_80C0898(); DestroyTask(taskId); FreeAllWindowBuffers(); if (gUnknown_20399FC->field_2 == TRUE) SetMainCallback2(CB2_ReturnToField); else SetMainCallback2(CB2_ReturnToPartyMenuFromFlyMap); FREE_IF_NOT_NULL(gUnknown_20399FC); } void sub_80C527C(u16 mapsec) { u16 idx = mapsec - MAPSECS_KANTO; if (gUnknown_83F2EE0[idx][2]) { sub_805546C(gUnknown_83F2EE0[idx][2]); sub_8124C1C(gUnknown_83F2EE0[idx]); } else { warp1_set_2(gUnknown_83F2EE0[idx][0], gUnknown_83F2EE0[idx][1], -1); } sub_80842C8(); }