summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/data/text/map_section_names.h109
-rw-r--r--src/region_map.c2225
2 files changed, 2334 insertions, 0 deletions
diff --git a/src/data/text/map_section_names.h b/src/data/text/map_section_names.h
new file mode 100644
index 000000000..5a18fa7c9
--- /dev/null
+++ b/src/data/text/map_section_names.h
@@ -0,0 +1,109 @@
+const u8 gMapSecName_PalletTown[] = _("PALLET TOWN");
+const u8 gMapSecName_ViridianCity[] = _("VIRIDIAN CITY");
+const u8 gMapSecName_PewterCity[] = _("PEWTER CITY");
+const u8 gMapSecName_CeruleanCity[] = _("CERULEAN CITY");
+const u8 gMapSecName_LavenderTown[] = _("LAVENDER TOWN");
+const u8 gMapSecName_VermilionCity[] = _("VERMILION CITY");
+const u8 gMapSecName_CeladonCity[] = _("CELADON CITY");
+const u8 gMapSecName_FuchsiaCity[] = _("FUCHSIA CITY");
+const u8 gMapSecName_CinnabarIsland[] = _("CINNABAR ISLAND");
+const u8 gMapSecName_IndigoPlateau[] = _("INDIGO PLATEAU");
+const u8 gMapSecName_SaffronCity[] = _("SAFFRON CITY");
+const u8 gMapSecName_Route4[] = _("ROUTE 4");
+const u8 gMapSecName_Route10[] = _("ROUTE 10");
+const u8 gMapSecName_Route1[] = _("ROUTE 1");
+const u8 gMapSecName_Route2[] = _("ROUTE 2");
+const u8 gMapSecName_Route3[] = _("ROUTE 3");
+const u8 gMapSecName_Route4_2[] = _("ROUTE 4");
+const u8 gMapSecName_Route5[] = _("ROUTE 5");
+const u8 gMapSecName_Route6[] = _("ROUTE 6");
+const u8 gMapSecName_Route7[] = _("ROUTE 7");
+const u8 gMapSecName_Route8[] = _("ROUTE 8");
+const u8 gMapSecName_Route9[] = _("ROUTE 9");
+const u8 gMapSecName_Route10_2[] = _("ROUTE 10");
+const u8 gMapSecName_Route11[] = _("ROUTE 11");
+const u8 gMapSecName_Route12[] = _("ROUTE 12");
+const u8 gMapSecName_Route13[] = _("ROUTE 13");
+const u8 gMapSecName_Route14[] = _("ROUTE 14");
+const u8 gMapSecName_Route15[] = _("ROUTE 15");
+const u8 gMapSecName_Route16[] = _("ROUTE 16");
+const u8 gMapSecName_Route17[] = _("ROUTE 17");
+const u8 gMapSecName_Route18[] = _("ROUTE 18");
+const u8 gMapSecName_Route19[] = _("ROUTE 19");
+const u8 gMapSecName_Route20[] = _("ROUTE 20");
+const u8 gMapSecName_Route21[] = _("ROUTE 21");
+const u8 gMapSecName_Route22[] = _("ROUTE 22");
+const u8 gMapSecName_Route23[] = _("ROUTE 23");
+const u8 gMapSecName_Route24[] = _("ROUTE 24");
+const u8 gMapSecName_Route25[] = _("ROUTE 25");
+const u8 gMapSecName_ViridianForest[] = _("VIRIDIAN FOREST");
+const u8 gMapSecName_MtMoon[] = _("MT. MOON");
+const u8 gMapSecName_SSAnne[] = _("S.S. ANNE");
+const u8 gMapSecName_UndergroundPath[] = _("UNDERGROUND PATH");
+const u8 gMapSecName_UndergroundPath_2[] = _("UNDERGROUND PATH");
+const u8 gMapSecName_DiglettsCave[] = _("DIGLETT'S CAVE");
+const u8 gMapSecName_VictoryRoad[] = _("VICTORY ROAD");
+const u8 gMapSecName_RocketHideout[] = _("ROCKET HIDEOUT");
+const u8 gMapSecName_SilphCo[] = _("SILPH CO.");
+const u8 gMapSecName_PokemonMansion[] = _("POKéMON MANSION");
+const u8 gMapSecName_SafariZone[] = _("SAFARI ZONE");
+const u8 gMapSecName_PokemonLeague[] = _("POKéMON LEAGUE");
+const u8 gMapSecName_RockTunnel[] = _("ROCK TUNNEL");
+const u8 gMapSecName_SeafoamIslands[] = _("SEAFOAM ISLANDS");
+const u8 gMapSecName_PokemonTower[] = _("POKéMON TOWER");
+const u8 gMapSecName_CeruleanCave[] = _("CERULEAN CAVE");
+const u8 gMapSecName_PowerPlant[] = _("POWER PLANT");
+const u8 gMapSecName_OneIsland[] = _("ONE ISLAND");
+const u8 gMapSecName_TwoIsland[] = _("TWO ISLAND");
+const u8 gMapSecName_ThreeIsland[] = _("THREE ISLAND");
+const u8 gMapSecName_FourIsland[] = _("FOUR ISLAND");
+const u8 gMapSecName_FiveIsland[] = _("FIVE ISLAND");
+const u8 gMapSecName_SevenIsland[] = _("SEVEN ISLAND");
+const u8 gMapSecName_SixIsland[] = _("SIX ISLAND");
+const u8 gMapSecName_KindleRoad[] = _("KINDLE ROAD");
+const u8 gMapSecName_TreasureBeach[] = _("TREASURE BEACH");
+const u8 gMapSecName_CapeBrink[] = _("CAPE BRINK");
+const u8 gMapSecName_BondBridge[] = _("BOND BRIDGE");
+const u8 gMapSecName_ThreeIslePort[] = _("THREE ISLE PORT");
+const u8 gMapSecName_SeviiIsle6[] = _("SEVII ISLE 6");
+const u8 gMapSecName_SeviiIsle7[] = _("SEVII ISLE 7");
+const u8 gMapSecName_SeviiIsle8[] = _("SEVII ISLE 8");
+const u8 gMapSecName_SeviiIsle9[] = _("SEVII ISLE 9");
+const u8 gMapSecName_ResortGorgeous[] = _("RESORT GORGEOUS");
+const u8 gMapSecName_WaterLabyrinth[] = _("WATER LABYRINTH");
+const u8 gMapSecName_FiveIsleMeadow[] = _("FIVE ISLE MEADOW");
+const u8 gMapSecName_MemorialPillar[] = _("MEMORIAL PILLAR");
+const u8 gMapSecName_OutcastIsland[] = _("OUTCAST ISLAND");
+const u8 gMapSecName_GreenPath[] = _("GREEN PATH");
+const u8 gMapSecName_WaterPath[] = _("WATER PATH");
+const u8 gMapSecName_RuinValley[] = _("RUIN VALLEY");
+const u8 gMapSecName_TrainerTower[] = _("TRAINER TOWER");
+const u8 gMapSecName_CanyonEntrance[] = _("CANYON ENTRANCE");
+const u8 gMapSecName_SevaultCanyon[] = _("SEVAULT CANYON");
+const u8 gMapSecName_TanobyRuins[] = _("TANOBY RUINS");
+const u8 gMapSecName_SeviiIsle22[] = _("SEVII ISLE 22");
+const u8 gMapSecName_SeviiIsle23[] = _("SEVII ISLE 23");
+const u8 gMapSecName_SeviiIsle24[] = _("SEVII ISLE 24");
+const u8 gMapSecName_NavelRock[] = _("NAVEL ROCK");
+const u8 gMapSecName_MtEmber[] = _("MT. EMBER");
+const u8 gMapSecName_BerryForest[] = _("BERRY FOREST");
+const u8 gMapSecName_IcefallCave[] = _("ICEFALL CAVE");
+const u8 gMapSecName_RocketWarehouse[] = _("ROCKET WAREHOUSE");
+const u8 gMapSecName_TrainerTower_2[] = _("TRAINER TOWER");
+const u8 gMapSecName_DottedHole[] = _("DOTTED HOLE");
+const u8 gMapSecName_LostCave[] = _("LOST CAVE");
+const u8 gMapSecName_PatternBush[] = _("PATTERN BUSH");
+const u8 gMapSecName_AlteringCave[] = _("ALTERING CAVE");
+const u8 gMapSecName_TanobyChambers[] = _("TANOBY CHAMBERS");
+const u8 gMapSecName_ThreeIslePath[] = _("THREE ISLE PATH");
+const u8 gMapSecName_TanobyKey[] = _("TANOBY KEY");
+const u8 gMapSecName_BirthIsland[] = _("BIRTH ISLAND");
+const u8 gMapSecName_MoneanChamber[] = _("MONEAN CHAMBER");
+const u8 gMapSecName_LiptooChamber[] = _("LIPTOO CHAMBER");
+const u8 gMapSecName_WeepthChamber[] = _("WEEPTH CHAMBER");
+const u8 gMapSecName_DilfordChamber[] = _("DILFORD CHAMBER");
+const u8 gMapSecName_ScufibChamber[] = _("SCUFIB CHAMBER");
+const u8 gMapSecName_RixyChamber[] = _("RIXY CHAMBER");
+const u8 gMapSecName_ViapoisChamber[] = _("VIAPOIS CHAMBER");
+const u8 gMapSecName_EmberSpa[] = _("EMBER SPA");
+const u8 gMapSecName_CeladonDept[] = _("CELADON DEPT.");
diff --git a/src/region_map.c b/src/region_map.c
new file mode 100644
index 000000000..8ea4c9bb6
--- /dev/null
+++ b/src/region_map.c
@@ -0,0 +1,2225 @@
+#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 "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"
+
+#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[0x080];
+};
+
+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 void * gUnknown_20399E8 = NULL;
+EWRAM_DATA void * gUnknown_20399EC = NULL;
+EWRAM_DATA void * gUnknown_20399F0[3] = {};
+EWRAM_DATA void * 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);
+u8 sub_80C3878(u8 a0);
+u16 sub_80C3520(void);
+u8 sub_80C35DC(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_80C4324(u8 a0);
+void sub_80C4398(u8 a0, u8 taskId, TaskFunc taskFunc);
+void sub_80C4348(void);
+void sub_80C48BC(u8 a0, u8 a1, u8 a2);
+void sub_80C4960(u8 a0, u8 a1, u8 a2);
+void sub_80C4A04(void);
+void sub_80C4B30(u8 a0);
+void sub_80C4AAC(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);
+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);
+u16 sub_80C3508(void);
+u16 sub_80C3514(void);
+u16 sub_80C3580(void);
+
+#include "data/text/map_section_names.h"
+extern const u16 gUnknown_83EF23C[];
+extern const u16 gUnknown_83EF25C[];
+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_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_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 u8 *const gUnknown_83F1CAC[];
+
+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(0);
+ sub_80C3154(FALSE);
+ sub_80C48BC(sub_80C0E20(), 25, 0);
+ sub_80C4960(sub_80C0E20(), 25, 0);
+ }
+ 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);
+}
+
+bool8 sub_80C1014(void)
+{
+ if (gUnknown_20399D8->field_1CCD < 16)
+ {
+ sub_80C4C5C(16 - 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);
+ 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(0);
+ sub_80C48BC(gUnknown_20399D8->field_1CCA, 25, 0);
+ sub_80C4960(gUnknown_20399D8->field_1CCA, 25, 0);
+ }
+ 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, 1);
+ sub_80C4960(255, 25, 1);
+ 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, 1);
+ sub_80C4960(255, 25, 1);
+ sub_80C48BC(gUnknown_20399D8->field_1CCA, 25, 0);
+ sub_80C4960(gUnknown_20399D8->field_1CCA, 25, 0);
+ }
+ if (gUnknown_20399D8->field_1CCA != sub_80C0E34())
+ sub_80C4324(1);
+ else
+ sub_80C4324(0);
+ 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(0);
+ 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, 0);
+ sub_80C4960(sub_80C0E20(), 25, 0);
+ 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(1);
+ sub_80C3154(TRUE);
+ sub_80C4960(255, 25, 1);
+ sub_80C48BC(255, 25, 1);
+ 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();
+}