diff options
author | PikalaxALT <PikalaxALT@users.noreply.github.com> | 2020-01-08 19:35:48 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-01-08 19:35:48 -0500 |
commit | 7e2330e7fd01f5eebb7fdeb157d3dd29b4da3f0f (patch) | |
tree | 8e197c66593ace92b61cebf95ca67fb2592aa6f1 /src | |
parent | 26f7ba482384ad4f63063797a527b7fb33572aa1 (diff) | |
parent | 4e87e3567f91b0b2ebf792a7a2f9030a63578dfd (diff) |
Merge pull request #206 from PikalaxALT/region_map
Region map
Diffstat (limited to 'src')
-rw-r--r-- | src/data/text/map_section_names.h | 109 | ||||
-rw-r--r-- | src/image_processing_effects.c | 4425 | ||||
-rw-r--r-- | src/main.c | 4 | ||||
-rw-r--r-- | src/map_preview_screen.c | 2 | ||||
-rw-r--r-- | src/party_menu.c | 2 | ||||
-rw-r--r-- | src/quest_log.c | 4 | ||||
-rw-r--r-- | src/region_map.c | 4399 |
7 files changed, 8939 insertions, 6 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/image_processing_effects.c b/src/image_processing_effects.c new file mode 100644 index 000000000..fdd62f7a5 --- /dev/null +++ b/src/image_processing_effects.c @@ -0,0 +1,4425 @@ +#include "global.h" +#include "image_processing_effects.h" + +// IWRAM common +u8 gCanvasColumnStart; +u16 (*gCanvasPixels)[][32]; +u8 gCanvasRowEnd; +u8 gCanvasHeight; +u8 gCanvasColumnEnd; +u8 gCanvasRowStart; +u8 gCanvasMonPersonality; +u8 gCanvasWidth; +u16 *gCanvasPalette; +u16 gCanvasPaletteStart; + +static void ApplyImageEffect_Pointillism(void); +static void ApplyImageEffect_Blur(void); +static void ApplyImageEffect_BlackOutline(void); +static void ApplyImageEffect_Invert(void); +static void ApplyImageEffect_BlackAndWhite(void); +static void ApplyImageEffect_BlurRight(void); +static void ApplyImageEffect_BlurDown(void); +static void ApplyImageEffect_Shimmer(void); +static void ApplyImageEffect_Grayscale(void); +static void ApplyImageEffect_PersonalityColor(u8); +static void ApplyImageEffect_RedChannelGrayscale(u8); +static void ApplyImageEffect_RedChannelGrayscaleHighlight(u8); +static void AddPointillismPoints(u16); +static u16 ConvertColorToGrayscale(u16*); +static u16 QuantizePixel_Blur(u16*, u16*, u16*); +static u16 QuantizePixel_PersonalityColor(u16*, u8); +static u16 QuantizePixel_BlackAndWhite(u16*); +static u16 QuantizePixel_BlackOutline(u16*, u16*); +static u16 QuantizePixel_Invert(u16*); +static u16 QuantizePixel_BlurHard(u16*, u16*, u16*); +static u16 QuantizePixel_MotionBlur(u16*, u16*); +static u16 GetColorFromPersonality(u8); +static void QuantizePalette_Standard(bool8); +static void SetPresetPalette_PrimaryColors(void); +static void QuantizePalette_PrimaryColors(void); +static void SetPresetPalette_Grayscale(void); +static void QuantizePalette_Grayscale(void); +static void SetPresetPalette_GrayscaleSmall(void); +static void QuantizePalette_GrayscaleSmall(void); +static void SetPresetPalette_BlackAndWhite(void); +static void QuantizePalette_BlackAndWhite(void); +static u16 QuantizePixel_Standard(u16*); +static u16 QuantizePixel_GrayscaleSmall(u16*); +static u16 QuantizePixel_Grayscale(u16*); +static u16 QuantizePixel_PrimaryColors(u16*); + +static const u8 sPointillismPoints[][3] = { + {0x00, 0x1d, 0x1c}, + {0x0e, 0x1e, 0x1b}, + {0x00, 0x01, 0x32}, + {0x2e, 0x1e, 0x37}, + {0x0a, 0x22, 0x1f}, + {0x05, 0x26, 0x2e}, + {0x12, 0x17, 0x1e}, + {0x1a, 0x03, 0x11}, + {0x05, 0x11, 0x18}, + {0x05, 0x27, 0x2f}, + {0x1a, 0x3f, 0x12}, + {0x22, 0x3f, 0x16}, + {0x2b, 0x2f, 0x2e}, + {0x11, 0x02, 0x2d}, + {0x23, 0x0d, 0x28}, + {0x17, 0x0c, 0x19}, + {0x2f, 0x0e, 0x13}, + {0x30, 0x18, 0x20}, + {0x2d, 0x28, 0x22}, + {0x01, 0x03, 0x19}, + {0x0e, 0x2a, 0x2b}, + {0x22, 0x15, 0x25}, + {0x22, 0x0a, 0x26}, + {0x39, 0x06, 0x23}, + {0x16, 0x07, 0x2f}, + {0x22, 0x3a, 0x1b}, + {0x3b, 0x36, 0x35}, + {0x0a, 0x2b, 0x24}, + {0x36, 0x09, 0x12}, + {0x1c, 0x2f, 0x23}, + {0x2e, 0x38, 0x2c}, + {0x05, 0x2a, 0x20}, + {0x07, 0x14, 0x32}, + {0x31, 0x08, 0x17}, + {0x1a, 0x24, 0x2d}, + {0x22, 0x0a, 0x16}, + {0x1b, 0x26, 0x2b}, + {0x29, 0x16, 0x11}, + {0x35, 0x08, 0x14}, + {0x1e, 0x08, 0x14}, + {0x05, 0x31, 0x14}, + {0x38, 0x31, 0x17}, + {0x34, 0x33, 0x12}, + {0x11, 0x09, 0x1f}, + {0x28, 0x3d, 0x32}, + {0x35, 0x03, 0x1e}, + {0x3c, 0x2b, 0x2e}, + {0x10, 0x01, 0x17}, + {0x03, 0x3e, 0x22}, + {0x17, 0x18, 0x34}, + {0x08, 0x29, 0x19}, + {0x03, 0x24, 0x28}, + {0x3d, 0x33, 0x2f}, + {0x31, 0x24, 0x19}, + {0x1b, 0x18, 0x26}, + {0x07, 0x0d, 0x25}, + {0x2d, 0x3f, 0x12}, + {0x2f, 0x15, 0x25}, + {0x29, 0x0f, 0x12}, + {0x07, 0x2c, 0x12}, + {0x2c, 0x0b, 0x26}, + {0x12, 0x1a, 0x16}, + {0x00, 0x0b, 0x2f}, + {0x16, 0x35, 0x24}, + {0x1f, 0x1c, 0x22}, + {0x29, 0x33, 0x27}, + {0x3b, 0x30, 0x17}, + {0x11, 0x06, 0x35}, + {0x3e, 0x31, 0x2f}, + {0x11, 0x3a, 0x25}, + {0x2a, 0x02, 0x19}, + {0x33, 0x18, 0x35}, + {0x2a, 0x20, 0x21}, + {0x2e, 0x32, 0x1b}, + {0x3b, 0x1f, 0x23}, + {0x39, 0x29, 0x2a}, + {0x2e, 0x31, 0x29}, + {0x2a, 0x0e, 0x2d}, + {0x2d, 0x00, 0x1f}, + {0x38, 0x28, 0x1b}, + {0x14, 0x3b, 0x2b}, + {0x2e, 0x04, 0x26}, + {0x36, 0x30, 0x11}, + {0x3b, 0x21, 0x2d}, + {0x2b, 0x3f, 0x1b}, + {0x20, 0x13, 0x31}, + {0x33, 0x0c, 0x30}, + {0x22, 0x2b, 0x2b}, + {0x16, 0x02, 0x1e}, + {0x1c, 0x12, 0x1c}, + {0x0f, 0x3c, 0x36}, + {0x38, 0x10, 0x2d}, + {0x18, 0x2f, 0x2d}, + {0x35, 0x3b, 0x11}, + {0x37, 0x31, 0x13}, + {0x13, 0x3d, 0x2f}, + {0x1e, 0x2c, 0x33}, + {0x2e, 0x37, 0x12}, + {0x3c, 0x1f, 0x33}, + {0x32, 0x2a, 0x27}, + {0x0d, 0x3b, 0x1c}, + {0x35, 0x2a, 0x27}, + {0x09, 0x3d, 0x27}, + {0x12, 0x0b, 0x18}, + {0x0c, 0x15, 0x1d}, + {0x20, 0x01, 0x1c}, + {0x08, 0x3b, 0x1c}, + {0x12, 0x37, 0x33}, + {0x15, 0x03, 0x2c}, + {0x2a, 0x3b, 0x31}, + {0x0f, 0x04, 0x35}, + {0x08, 0x17, 0x33}, + {0x38, 0x3d, 0x2a}, + {0x2f, 0x35, 0x16}, + {0x10, 0x35, 0x16}, + {0x23, 0x13, 0x2c}, + {0x2f, 0x06, 0x20}, + {0x27, 0x3a, 0x24}, + {0x00, 0x1c, 0x2a}, + {0x03, 0x39, 0x1d}, + {0x28, 0x07, 0x1a}, + {0x20, 0x0a, 0x37}, + {0x07, 0x35, 0x2d}, + {0x15, 0x2f, 0x2c}, + {0x10, 0x2c, 0x23}, + {0x3f, 0x29, 0x14}, + {0x2a, 0x21, 0x36}, + {0x34, 0x1a, 0x2c}, + {0x1c, 0x3d, 0x33}, + {0x38, 0x2b, 0x22}, + {0x35, 0x28, 0x1f}, + {0x3d, 0x0f, 0x1c}, + {0x1e, 0x3e, 0x1b}, + {0x0c, 0x3e, 0x1f}, + {0x2b, 0x31, 0x2c}, + {0x32, 0x39, 0x11}, + {0x05, 0x09, 0x11}, + {0x04, 0x38, 0x2a}, + {0x32, 0x00, 0x16}, + {0x13, 0x0b, 0x31}, + {0x34, 0x2a, 0x13}, + {0x2c, 0x22, 0x21}, + {0x39, 0x2f, 0x15}, + {0x37, 0x28, 0x1e}, + {0x07, 0x3b, 0x2d}, + {0x11, 0x03, 0x28}, + {0x2d, 0x30, 0x1e}, + {0x31, 0x11, 0x11}, + {0x23, 0x01, 0x1e}, + {0x3d, 0x31, 0x34}, + {0x1c, 0x02, 0x34}, + {0x21, 0x0e, 0x25}, + {0x3d, 0x07, 0x17}, + {0x33, 0x15, 0x10}, + {0x29, 0x32, 0x32}, + {0x18, 0x1f, 0x30}, + {0x2d, 0x3b, 0x30}, + {0x27, 0x3e, 0x16}, + {0x31, 0x15, 0x12}, + {0x30, 0x25, 0x17}, + {0x33, 0x06, 0x34}, + {0x00, 0x29, 0x18}, + {0x3c, 0x03, 0x12}, + {0x2c, 0x0c, 0x11}, + {0x09, 0x30, 0x30}, + {0x10, 0x0e, 0x11}, + {0x27, 0x16, 0x1b}, + {0x0c, 0x3b, 0x2e}, + {0x2b, 0x33, 0x1e}, + {0x13, 0x2d, 0x2d}, + {0x11, 0x24, 0x29}, + {0x34, 0x3e, 0x2b}, + {0x24, 0x1e, 0x21}, + {0x27, 0x1a, 0x2d}, + {0x04, 0x39, 0x16}, + {0x3e, 0x33, 0x26}, + {0x1b, 0x2e, 0x25}, + {0x0c, 0x06, 0x19}, + {0x25, 0x19, 0x18}, + {0x1d, 0x33, 0x33}, + {0x1d, 0x28, 0x2d}, + {0x1c, 0x10, 0x2a}, + {0x1f, 0x35, 0x1e}, + {0x34, 0x02, 0x10}, + {0x2b, 0x3a, 0x14}, + {0x0d, 0x0b, 0x15}, + {0x0c, 0x2c, 0x10}, + {0x37, 0x3a, 0x19}, + {0x06, 0x13, 0x17}, + {0x24, 0x10, 0x25}, + {0x24, 0x04, 0x1e}, + {0x00, 0x35, 0x34}, + {0x3a, 0x00, 0x37}, + {0x3c, 0x07, 0x1a}, + {0x2b, 0x28, 0x36}, + {0x34, 0x39, 0x2f}, + {0x28, 0x09, 0x1f}, + {0x38, 0x31, 0x30}, + {0x16, 0x25, 0x31}, + {0x18, 0x28, 0x31}, + {0x18, 0x0c, 0x22}, + {0x06, 0x39, 0x2d}, + {0x3d, 0x20, 0x24}, + {0x2e, 0x27, 0x21}, + {0x3e, 0x18, 0x18}, + {0x15, 0x3c, 0x24}, + {0x06, 0x1b, 0x26}, + {0x15, 0x0e, 0x22}, + {0x0a, 0x0d, 0x1f}, + {0x18, 0x16, 0x34}, + {0x10, 0x28, 0x21}, + {0x20, 0x11, 0x11}, + {0x36, 0x32, 0x15}, + {0x3b, 0x2e, 0x24}, + {0x1f, 0x2d, 0x12}, + {0x36, 0x2e, 0x20}, + {0x0b, 0x17, 0x33}, + {0x26, 0x03, 0x1f}, + {0x08, 0x19, 0x31}, + {0x2a, 0x18, 0x25}, + {0x35, 0x2d, 0x2d}, + {0x30, 0x38, 0x18}, + {0x1c, 0x25, 0x14}, + {0x1c, 0x22, 0x28}, + {0x08, 0x23, 0x21}, + {0x26, 0x1e, 0x30}, + {0x19, 0x0f, 0x15}, + {0x10, 0x2f, 0x22}, + {0x12, 0x02, 0x25}, + {0x3c, 0x01, 0x1d}, + {0x0e, 0x14, 0x18}, + {0x0d, 0x18, 0x17}, + {0x22, 0x0b, 0x31}, + {0x13, 0x34, 0x21}, + {0x0f, 0x2d, 0x36}, + {0x39, 0x1f, 0x25}, + {0x18, 0x10, 0x1f}, + {0x2d, 0x20, 0x20}, + {0x19, 0x0b, 0x31}, + {0x33, 0x13, 0x14}, + {0x2e, 0x11, 0x21}, + {0x2d, 0x0a, 0x37}, + {0x07, 0x15, 0x1b}, + {0x32, 0x04, 0x32}, + {0x06, 0x18, 0x1b}, + {0x13, 0x24, 0x12}, + {0x36, 0x22, 0x16}, + {0x1d, 0x29, 0x1c}, + {0x35, 0x17, 0x21}, + {0x36, 0x17, 0x2b}, + {0x35, 0x32, 0x19}, + {0x2a, 0x0f, 0x2e}, + {0x10, 0x00, 0x34}, + {0x02, 0x0e, 0x28}, + {0x31, 0x32, 0x32}, + {0x3b, 0x05, 0x20}, + {0x36, 0x26, 0x12}, + {0x34, 0x06, 0x34}, + {0x1e, 0x31, 0x32}, + {0x35, 0x05, 0x34}, + {0x1e, 0x13, 0x15}, + {0x15, 0x14, 0x2c}, + {0x29, 0x1c, 0x18}, + {0x24, 0x24, 0x12}, + {0x22, 0x29, 0x18}, + {0x34, 0x36, 0x30}, + {0x1e, 0x01, 0x23}, + {0x0c, 0x3c, 0x24}, + {0x0a, 0x3d, 0x16}, + {0x27, 0x1e, 0x23}, + {0x15, 0x02, 0x12}, + {0x11, 0x19, 0x2a}, + {0x1d, 0x31, 0x15}, + {0x03, 0x3b, 0x2a}, + {0x21, 0x19, 0x2c}, + {0x0a, 0x23, 0x11}, + {0x25, 0x11, 0x1a}, + {0x1a, 0x0a, 0x34}, + {0x3b, 0x0b, 0x33}, + {0x21, 0x0b, 0x37}, + {0x01, 0x31, 0x28}, + {0x35, 0x1d, 0x27}, + {0x2c, 0x30, 0x31}, + {0x2e, 0x39, 0x2d}, + {0x30, 0x05, 0x2c}, + {0x12, 0x2a, 0x2b}, + {0x39, 0x22, 0x20}, + {0x15, 0x34, 0x1c}, + {0x1c, 0x01, 0x15}, + {0x20, 0x16, 0x22}, + {0x13, 0x04, 0x18}, + {0x1e, 0x13, 0x10}, + {0x25, 0x33, 0x15}, + {0x39, 0x03, 0x31}, + {0x3f, 0x36, 0x18}, + {0x14, 0x23, 0x10}, + {0x2f, 0x1e, 0x1f}, + {0x1f, 0x17, 0x2c}, + {0x02, 0x16, 0x31}, + {0x20, 0x18, 0x30}, + {0x2e, 0x18, 0x37}, + {0x3b, 0x0e, 0x30}, + {0x10, 0x39, 0x24}, + {0x26, 0x39, 0x1e}, + {0x30, 0x26, 0x2e}, + {0x12, 0x01, 0x14}, + {0x37, 0x2a, 0x2e}, + {0x21, 0x06, 0x1d}, + {0x2a, 0x16, 0x32}, + {0x09, 0x38, 0x1c}, + {0x07, 0x22, 0x17}, + {0x3b, 0x2d, 0x15}, + {0x07, 0x1e, 0x2e}, + {0x1b, 0x2e, 0x1d}, + {0x04, 0x09, 0x30}, + {0x30, 0x2d, 0x37}, + {0x2d, 0x34, 0x24}, + {0x18, 0x24, 0x25}, + {0x0e, 0x2d, 0x26}, + {0x23, 0x0a, 0x16}, + {0x12, 0x2d, 0x11}, + {0x21, 0x28, 0x2e}, + {0x0f, 0x01, 0x21}, + {0x01, 0x31, 0x12}, + {0x3f, 0x1b, 0x1e}, + {0x21, 0x25, 0x2b}, + {0x26, 0x18, 0x13}, + {0x15, 0x2d, 0x34}, + {0x23, 0x21, 0x36}, + {0x0e, 0x2e, 0x1c}, + {0x14, 0x22, 0x1c}, + {0x2c, 0x0b, 0x28}, + {0x1a, 0x18, 0x21}, + {0x21, 0x07, 0x1a}, + {0x24, 0x26, 0x29}, + {0x2b, 0x0a, 0x34}, + {0x3e, 0x27, 0x33}, + {0x12, 0x34, 0x1b}, + {0x1f, 0x01, 0x2a}, + {0x2e, 0x06, 0x23}, + {0x2f, 0x1f, 0x14}, + {0x18, 0x06, 0x26}, + {0x31, 0x1f, 0x2b}, + {0x22, 0x26, 0x2e}, + {0x1e, 0x15, 0x16}, + {0x20, 0x22, 0x28}, + {0x15, 0x37, 0x12}, + {0x25, 0x04, 0x2c}, + {0x1f, 0x04, 0x2e}, + {0x0c, 0x13, 0x18}, + {0x07, 0x0b, 0x36}, + {0x1d, 0x1c, 0x2a}, + {0x30, 0x22, 0x1c}, + {0x2e, 0x12, 0x2f}, + {0x2b, 0x21, 0x1e}, + {0x16, 0x38, 0x30}, + {0x04, 0x02, 0x16}, + {0x05, 0x14, 0x20}, + {0x38, 0x3c, 0x33}, + {0x21, 0x1b, 0x2f}, + {0x14, 0x2a, 0x27}, + {0x38, 0x14, 0x1b}, + {0x2b, 0x1f, 0x2b}, + {0x29, 0x2b, 0x25}, + {0x27, 0x36, 0x21}, + {0x11, 0x22, 0x1b}, + {0x29, 0x03, 0x1b}, + {0x18, 0x24, 0x28}, + {0x21, 0x2d, 0x36}, + {0x3c, 0x2c, 0x24}, + {0x33, 0x17, 0x1f}, + {0x2a, 0x3a, 0x21}, + {0x0a, 0x23, 0x37}, + {0x00, 0x0b, 0x21}, + {0x11, 0x38, 0x19}, + {0x0f, 0x0e, 0x1c}, + {0x1f, 0x0f, 0x37}, + {0x3c, 0x10, 0x37}, + {0x38, 0x31, 0x35}, + {0x07, 0x15, 0x28}, + {0x1e, 0x2e, 0x19}, + {0x26, 0x10, 0x33}, + {0x3d, 0x35, 0x2f}, + {0x3a, 0x04, 0x34}, + {0x0d, 0x18, 0x1a}, + {0x01, 0x2d, 0x15}, + {0x3d, 0x1a, 0x17}, + {0x17, 0x3f, 0x32}, + {0x0b, 0x21, 0x11}, + {0x1e, 0x26, 0x2b}, + {0x0d, 0x19, 0x24}, + {0x2e, 0x04, 0x1b}, + {0x1b, 0x33, 0x20}, + {0x15, 0x21, 0x1d}, + {0x1f, 0x04, 0x21}, + {0x0f, 0x12, 0x1f}, + {0x2d, 0x2a, 0x32}, + {0x03, 0x37, 0x1f}, + {0x35, 0x07, 0x27}, + {0x24, 0x1f, 0x31}, + {0x2f, 0x30, 0x15}, + {0x06, 0x00, 0x24}, + {0x0b, 0x22, 0x1a}, + {0x0c, 0x3b, 0x29}, + {0x14, 0x1a, 0x17}, + {0x37, 0x20, 0x25}, + {0x3f, 0x26, 0x37}, + {0x3a, 0x3e, 0x10}, + {0x22, 0x04, 0x11}, + {0x28, 0x12, 0x1c}, + {0x03, 0x2e, 0x2e}, + {0x0e, 0x38, 0x28}, + {0x01, 0x29, 0x22}, + {0x1e, 0x33, 0x19}, + {0x06, 0x21, 0x27}, + {0x33, 0x19, 0x1a}, + {0x02, 0x05, 0x17}, + {0x11, 0x11, 0x2c}, + {0x1f, 0x26, 0x1e}, + {0x39, 0x1f, 0x28}, + {0x2e, 0x2f, 0x12}, + {0x22, 0x34, 0x13}, + {0x3b, 0x26, 0x2f}, + {0x34, 0x00, 0x14}, + {0x10, 0x31, 0x11}, + {0x1d, 0x2d, 0x2a}, + {0x08, 0x08, 0x37}, + {0x15, 0x18, 0x34}, + {0x04, 0x2b, 0x24}, + {0x2f, 0x1e, 0x27}, + {0x22, 0x2a, 0x24}, + {0x07, 0x14, 0x25}, + {0x01, 0x27, 0x19}, + {0x29, 0x0a, 0x29}, + {0x3d, 0x1c, 0x2f}, + {0x0d, 0x1f, 0x1c}, + {0x24, 0x3d, 0x32}, + {0x36, 0x1d, 0x24}, + {0x14, 0x21, 0x16}, + {0x1a, 0x0d, 0x29}, + {0x3f, 0x2b, 0x2a}, + {0x1a, 0x3e, 0x35}, + {0x11, 0x28, 0x18}, + {0x32, 0x05, 0x15}, + {0x21, 0x2e, 0x34}, + {0x2d, 0x14, 0x2a}, + {0x3c, 0x08, 0x37}, + {0x3f, 0x34, 0x1e}, + {0x27, 0x24, 0x1c}, + {0x16, 0x16, 0x33}, + {0x29, 0x3b, 0x19}, + {0x36, 0x2f, 0x1c}, + {0x03, 0x25, 0x2c}, + {0x0b, 0x16, 0x36}, + {0x1c, 0x1d, 0x1b}, + {0x2c, 0x27, 0x1b}, + {0x0b, 0x1f, 0x2b}, + {0x08, 0x10, 0x27}, + {0x3f, 0x25, 0x2f}, + {0x33, 0x13, 0x1f}, + {0x04, 0x31, 0x37}, + {0x0e, 0x2f, 0x12}, + {0x08, 0x23, 0x20}, + {0x3a, 0x1a, 0x1e}, + {0x2f, 0x0b, 0x1f}, + {0x1e, 0x20, 0x19}, + {0x23, 0x3b, 0x14}, + {0x25, 0x00, 0x27}, + {0x14, 0x04, 0x25}, + {0x36, 0x1a, 0x2b}, + {0x27, 0x21, 0x15}, + {0x28, 0x13, 0x2c}, + {0x0e, 0x3c, 0x35}, + {0x0c, 0x2d, 0x2b}, + {0x37, 0x16, 0x15}, + {0x29, 0x15, 0x1d}, + {0x17, 0x34, 0x36}, + {0x09, 0x0a, 0x31}, + {0x37, 0x22, 0x28}, + {0x17, 0x2b, 0x35}, + {0x14, 0x2b, 0x12}, + {0x08, 0x13, 0x1f}, + {0x31, 0x13, 0x28}, + {0x06, 0x07, 0x35}, + {0x23, 0x3a, 0x29}, + {0x0f, 0x24, 0x2e}, + {0x07, 0x35, 0x26}, + {0x0e, 0x12, 0x15}, + {0x23, 0x33, 0x2c}, + {0x0e, 0x21, 0x26}, + {0x1c, 0x12, 0x25}, + {0x23, 0x1d, 0x2f}, + {0x04, 0x35, 0x33}, + {0x16, 0x01, 0x24}, + {0x3d, 0x2c, 0x2e}, + {0x35, 0x0a, 0x25}, + {0x11, 0x13, 0x25}, + {0x1b, 0x1b, 0x15}, + {0x15, 0x39, 0x10}, + {0x0b, 0x35, 0x24}, + {0x3a, 0x27, 0x30}, + {0x2e, 0x2f, 0x15}, + {0x10, 0x1f, 0x35}, + {0x1b, 0x28, 0x35}, + {0x26, 0x30, 0x37}, + {0x34, 0x37, 0x2b}, + {0x0f, 0x30, 0x29}, + {0x2e, 0x3f, 0x2b}, + {0x38, 0x34, 0x2b}, + {0x2b, 0x2f, 0x25}, + {0x0d, 0x28, 0x2a}, + {0x33, 0x18, 0x10}, + {0x21, 0x12, 0x11}, + {0x1f, 0x22, 0x34}, + {0x11, 0x25, 0x23}, + {0x21, 0x3f, 0x11}, + {0x26, 0x27, 0x25}, + {0x28, 0x36, 0x12}, + {0x15, 0x26, 0x32}, + {0x11, 0x18, 0x24}, + {0x32, 0x25, 0x37}, + {0x27, 0x3a, 0x33}, + {0x35, 0x07, 0x1c}, + {0x1a, 0x0e, 0x2a}, + {0x1e, 0x2f, 0x1f}, + {0x00, 0x2e, 0x21}, + {0x1b, 0x3c, 0x14}, + {0x2f, 0x3a, 0x2f}, + {0x3e, 0x38, 0x15}, + {0x1a, 0x13, 0x2f}, + {0x29, 0x0d, 0x2f}, + {0x37, 0x17, 0x18}, + {0x30, 0x1c, 0x35}, + {0x15, 0x34, 0x14}, + {0x28, 0x11, 0x2c}, + {0x2c, 0x25, 0x2a}, + {0x20, 0x3f, 0x28}, + {0x0c, 0x34, 0x1b}, + {0x30, 0x2e, 0x25}, + {0x37, 0x1c, 0x24}, + {0x1f, 0x25, 0x26}, + {0x0c, 0x19, 0x34}, + {0x18, 0x10, 0x35}, + {0x0a, 0x13, 0x11}, + {0x25, 0x13, 0x20}, + {0x13, 0x19, 0x11}, + {0x20, 0x28, 0x1d}, + {0x3e, 0x30, 0x1b}, + {0x23, 0x24, 0x21}, + {0x0d, 0x23, 0x23}, + {0x1d, 0x28, 0x2e}, + {0x2d, 0x12, 0x1f}, + {0x0e, 0x2e, 0x2b}, + {0x0b, 0x31, 0x32}, + {0x24, 0x3c, 0x2c}, + {0x13, 0x3c, 0x12}, + {0x28, 0x16, 0x2a}, + {0x05, 0x0c, 0x32}, + {0x39, 0x0b, 0x32}, + {0x21, 0x04, 0x14}, + {0x10, 0x31, 0x32}, + {0x12, 0x1f, 0x23}, + {0x39, 0x2e, 0x2e}, + {0x22, 0x3d, 0x27}, + {0x0c, 0x1e, 0x18}, + {0x25, 0x00, 0x17}, + {0x06, 0x31, 0x14}, + {0x13, 0x21, 0x1a}, + {0x14, 0x20, 0x35}, + {0x0a, 0x3b, 0x25}, + {0x33, 0x08, 0x28}, + {0x3d, 0x02, 0x33}, + {0x23, 0x00, 0x13}, + {0x22, 0x21, 0x28}, + {0x30, 0x14, 0x2e}, + {0x14, 0x32, 0x36}, + {0x39, 0x23, 0x1e}, + {0x1c, 0x11, 0x30}, + {0x37, 0x16, 0x30}, + {0x15, 0x31, 0x1f}, + {0x34, 0x28, 0x2c}, + {0x35, 0x05, 0x29}, + {0x37, 0x33, 0x2a}, + {0x1c, 0x17, 0x2e}, + {0x10, 0x06, 0x16}, + {0x32, 0x1f, 0x2f}, + {0x00, 0x29, 0x1e}, + {0x04, 0x01, 0x16}, + {0x3b, 0x23, 0x1e}, + {0x1b, 0x34, 0x2a}, + {0x30, 0x11, 0x2b}, + {0x03, 0x00, 0x1f}, + {0x1d, 0x37, 0x1a}, + {0x3a, 0x18, 0x25}, + {0x1c, 0x16, 0x2c}, + {0x04, 0x3f, 0x33}, + {0x26, 0x23, 0x2d}, + {0x15, 0x2c, 0x27}, + {0x02, 0x35, 0x27}, + {0x07, 0x35, 0x33}, + {0x1a, 0x0c, 0x10}, + {0x28, 0x26, 0x2c}, + {0x2f, 0x36, 0x16}, + {0x37, 0x0b, 0x27}, + {0x1b, 0x3d, 0x18}, + {0x27, 0x1f, 0x20}, + {0x2b, 0x2a, 0x33}, + {0x0b, 0x0f, 0x20}, + {0x35, 0x3c, 0x2f}, + {0x33, 0x21, 0x15}, + {0x2d, 0x26, 0x34}, + {0x1f, 0x1a, 0x21}, + {0x2f, 0x2c, 0x2a}, + {0x1a, 0x32, 0x1a}, + {0x3b, 0x3f, 0x21}, + {0x13, 0x3f, 0x13}, + {0x0f, 0x24, 0x22}, + {0x14, 0x1b, 0x10}, + {0x21, 0x06, 0x28}, + {0x25, 0x34, 0x10}, + {0x2e, 0x0e, 0x14}, + {0x3c, 0x3e, 0x25}, + {0x16, 0x06, 0x30}, + {0x0b, 0x04, 0x1f}, + {0x3e, 0x02, 0x24}, + {0x0c, 0x17, 0x25}, + {0x2b, 0x3c, 0x2d}, + {0x15, 0x36, 0x33}, + {0x18, 0x23, 0x2a}, + {0x1d, 0x10, 0x2a}, + {0x35, 0x17, 0x28}, + {0x00, 0x37, 0x24}, + {0x0a, 0x3b, 0x15}, + {0x1d, 0x0b, 0x1f}, + {0x3c, 0x31, 0x25}, + {0x1d, 0x0f, 0x1d}, + {0x20, 0x13, 0x34}, + {0x11, 0x2b, 0x2e}, + {0x23, 0x0c, 0x2e}, + {0x24, 0x02, 0x14}, + {0x31, 0x16, 0x19}, + {0x0e, 0x23, 0x35}, + {0x1a, 0x10, 0x16}, + {0x14, 0x04, 0x19}, + {0x2d, 0x27, 0x37}, + {0x33, 0x02, 0x31}, + {0x02, 0x04, 0x16}, + {0x0d, 0x22, 0x25}, + {0x25, 0x00, 0x16}, + {0x2a, 0x3f, 0x26}, + {0x20, 0x0c, 0x12}, + {0x2f, 0x2e, 0x35}, + {0x1b, 0x0d, 0x22}, + {0x1e, 0x01, 0x34}, + {0x05, 0x22, 0x21}, + {0x34, 0x2a, 0x32}, + {0x0b, 0x09, 0x1d}, + {0x3f, 0x32, 0x2f}, + {0x3d, 0x18, 0x2d}, + {0x0b, 0x38, 0x36}, + {0x39, 0x17, 0x28}, + {0x34, 0x04, 0x24}, + {0x36, 0x0e, 0x2a}, + {0x38, 0x01, 0x14}, + {0x3c, 0x24, 0x22}, + {0x21, 0x03, 0x18}, + {0x32, 0x2f, 0x12}, + {0x29, 0x24, 0x31}, + {0x0a, 0x3b, 0x12}, + {0x1a, 0x1c, 0x20}, + {0x30, 0x31, 0x1b}, + {0x1a, 0x21, 0x10}, + {0x05, 0x29, 0x10}, + {0x26, 0x2d, 0x13}, + {0x16, 0x0c, 0x1d}, + {0x2b, 0x06, 0x1b}, + {0x06, 0x12, 0x14}, + {0x38, 0x0f, 0x35}, + {0x23, 0x3a, 0x2c}, + {0x00, 0x19, 0x33}, + {0x29, 0x14, 0x2d}, + {0x2a, 0x21, 0x29}, + {0x14, 0x31, 0x14}, + {0x1a, 0x06, 0x1e}, + {0x18, 0x1b, 0x28}, + {0x3b, 0x16, 0x29}, + {0x15, 0x1e, 0x12}, + {0x34, 0x0a, 0x14}, + {0x1b, 0x05, 0x27}, + {0x0b, 0x01, 0x26}, + {0x2a, 0x22, 0x35}, + {0x21, 0x20, 0x18}, + {0x20, 0x37, 0x17}, + {0x14, 0x1f, 0x11}, + {0x1d, 0x11, 0x25}, + {0x24, 0x2b, 0x2f}, + {0x07, 0x3f, 0x1f}, + {0x2c, 0x25, 0x25}, + {0x2a, 0x29, 0x18}, + {0x11, 0x24, 0x28}, + {0x31, 0x2c, 0x2a}, + {0x39, 0x0b, 0x26}, + {0x28, 0x10, 0x26}, + {0x22, 0x06, 0x16}, + {0x09, 0x2c, 0x13}, + {0x34, 0x19, 0x15}, + {0x3a, 0x12, 0x21}, + {0x1d, 0x38, 0x23}, + {0x12, 0x25, 0x24}, + {0x21, 0x30, 0x12}, + {0x37, 0x1a, 0x12}, + {0x24, 0x3b, 0x25}, + {0x32, 0x15, 0x23}, + {0x0d, 0x1a, 0x10}, + {0x16, 0x2e, 0x26}, + {0x1d, 0x14, 0x16}, + {0x3e, 0x2e, 0x1f}, + {0x0a, 0x16, 0x10}, + {0x1d, 0x30, 0x2b}, + {0x04, 0x3a, 0x19}, + {0x08, 0x2d, 0x2e}, + {0x28, 0x1e, 0x33}, + {0x0a, 0x12, 0x2e}, + {0x0d, 0x03, 0x2f}, + {0x26, 0x3a, 0x1e}, + {0x35, 0x3b, 0x2a}, + {0x03, 0x1a, 0x18}, + {0x3f, 0x0b, 0x27}, + {0x04, 0x05, 0x34}, + {0x36, 0x0b, 0x27}, + {0x3b, 0x17, 0x11}, + {0x0d, 0x27, 0x26}, + {0x2c, 0x1f, 0x20}, + {0x26, 0x10, 0x20}, + {0x25, 0x23, 0x2d}, + {0x37, 0x09, 0x13}, + {0x14, 0x17, 0x2d}, + {0x2e, 0x3d, 0x23}, + {0x1d, 0x1a, 0x1f}, + {0x21, 0x33, 0x2e}, + {0x28, 0x17, 0x13}, + {0x26, 0x3c, 0x36}, + {0x14, 0x1a, 0x33}, + {0x32, 0x20, 0x2b}, + {0x19, 0x3e, 0x20}, + {0x0c, 0x02, 0x2d}, + {0x3c, 0x3c, 0x2a}, + {0x30, 0x30, 0x28}, + {0x25, 0x3f, 0x1e}, + {0x03, 0x17, 0x1e}, + {0x35, 0x11, 0x1c}, + {0x1b, 0x14, 0x2a}, + {0x28, 0x3a, 0x23}, + {0x0e, 0x1f, 0x12}, + {0x36, 0x21, 0x20}, + {0x07, 0x3b, 0x10}, + {0x23, 0x19, 0x34}, + {0x0d, 0x2e, 0x18}, + {0x3f, 0x20, 0x25}, + {0x3e, 0x3b, 0x15}, + {0x0b, 0x2e, 0x12}, + {0x37, 0x0b, 0x23}, + {0x3d, 0x32, 0x1f}, + {0x16, 0x03, 0x27}, + {0x14, 0x0c, 0x21}, + {0x18, 0x03, 0x30}, + {0x3e, 0x21, 0x13}, + {0x0f, 0x00, 0x32}, + {0x3f, 0x23, 0x16}, + {0x0e, 0x31, 0x1d}, + {0x18, 0x1c, 0x1d}, + {0x30, 0x0e, 0x1e}, + {0x21, 0x20, 0x23}, + {0x3f, 0x0c, 0x1e}, + {0x14, 0x33, 0x22}, + {0x22, 0x21, 0x15}, + {0x36, 0x05, 0x1e}, + {0x1d, 0x31, 0x14}, + {0x20, 0x11, 0x37}, + {0x0d, 0x33, 0x19}, + {0x25, 0x05, 0x36}, + {0x1e, 0x31, 0x20}, + {0x35, 0x3a, 0x2f}, + {0x32, 0x2f, 0x30}, + {0x14, 0x23, 0x2d}, + {0x35, 0x1e, 0x29}, + {0x05, 0x05, 0x1b}, + {0x09, 0x1f, 0x26}, + {0x2f, 0x0b, 0x15}, + {0x15, 0x11, 0x13}, + {0x29, 0x1b, 0x18}, + {0x1c, 0x13, 0x35}, + {0x34, 0x31, 0x23}, + {0x27, 0x3f, 0x2f}, + {0x09, 0x30, 0x19}, + {0x23, 0x12, 0x34}, + {0x02, 0x2a, 0x21}, + {0x09, 0x3c, 0x1d}, + {0x0c, 0x02, 0x10}, + {0x22, 0x05, 0x17}, + {0x22, 0x08, 0x1b}, + {0x0a, 0x0f, 0x15}, + {0x02, 0x11, 0x13}, + {0x01, 0x21, 0x22}, + {0x16, 0x39, 0x33}, + {0x24, 0x38, 0x34}, + {0x0f, 0x1e, 0x2b}, + {0x2b, 0x15, 0x15}, + {0x20, 0x22, 0x2e}, + {0x3a, 0x3f, 0x31}, + {0x1a, 0x27, 0x2b}, + {0x29, 0x34, 0x14}, + {0x16, 0x39, 0x2f}, + {0x13, 0x3e, 0x16}, + {0x36, 0x21, 0x30}, + {0x00, 0x24, 0x2b}, + {0x24, 0x21, 0x30}, + {0x15, 0x31, 0x13}, + {0x10, 0x37, 0x24}, + {0x08, 0x07, 0x23}, + {0x21, 0x09, 0x25}, + {0x05, 0x3c, 0x32}, + {0x19, 0x03, 0x25}, + {0x0f, 0x29, 0x2b}, + {0x16, 0x07, 0x13}, + {0x3e, 0x3d, 0x25}, + {0x36, 0x0b, 0x28}, + {0x2e, 0x2b, 0x16}, + {0x0c, 0x31, 0x11}, + {0x30, 0x13, 0x2d}, + {0x26, 0x3e, 0x37}, + {0x29, 0x2f, 0x2e}, + {0x15, 0x3d, 0x17}, + {0x1c, 0x2e, 0x21}, + {0x33, 0x2f, 0x10}, + {0x0d, 0x05, 0x1d}, + {0x1c, 0x1a, 0x12}, + {0x0e, 0x18, 0x37}, + {0x1b, 0x11, 0x14}, + {0x06, 0x14, 0x21}, + {0x31, 0x0e, 0x27}, + {0x1a, 0x03, 0x10}, + {0x00, 0x34, 0x31}, + {0x3f, 0x0b, 0x1d}, + {0x0f, 0x12, 0x1f}, + {0x1a, 0x15, 0x10}, + {0x0f, 0x00, 0x24}, + {0x3e, 0x0a, 0x2a}, + {0x30, 0x2b, 0x24}, + {0x26, 0x31, 0x10}, + {0x2d, 0x2f, 0x2f}, + {0x3f, 0x0c, 0x13}, + {0x12, 0x0b, 0x16}, + {0x15, 0x07, 0x1f}, + {0x28, 0x10, 0x32}, + {0x0f, 0x17, 0x15}, + {0x0b, 0x27, 0x33}, + {0x34, 0x1d, 0x10}, + {0x1c, 0x3a, 0x12}, + {0x2c, 0x27, 0x37}, + {0x0a, 0x1a, 0x32}, + {0x05, 0x1f, 0x21}, + {0x24, 0x0d, 0x1f}, + {0x1c, 0x17, 0x24}, + {0x2f, 0x3b, 0x32}, + {0x3b, 0x25, 0x10}, + {0x03, 0x2f, 0x21}, + {0x0c, 0x10, 0x23}, + {0x0e, 0x3a, 0x2c}, + {0x33, 0x03, 0x2c}, + {0x12, 0x06, 0x1c}, + {0x2a, 0x37, 0x30}, + {0x3f, 0x01, 0x1e}, + {0x35, 0x16, 0x37}, + {0x2c, 0x32, 0x35}, + {0x05, 0x11, 0x22}, + {0x29, 0x09, 0x20}, + {0x2b, 0x0d, 0x1f}, + {0x18, 0x0d, 0x20}, + {0x23, 0x39, 0x16}, + {0x0f, 0x3a, 0x18}, + {0x21, 0x35, 0x2b}, + {0x36, 0x26, 0x2b}, + {0x23, 0x05, 0x2f}, + {0x1b, 0x08, 0x17}, + {0x3e, 0x09, 0x16}, + {0x2d, 0x3a, 0x37}, + {0x15, 0x35, 0x35}, + {0x29, 0x0a, 0x12}, + {0x02, 0x39, 0x1f}, + {0x14, 0x34, 0x33}, + {0x17, 0x1d, 0x18}, + {0x16, 0x1d, 0x1a}, + {0x01, 0x39, 0x22}, + {0x1e, 0x27, 0x36}, + {0x32, 0x14, 0x26}, + {0x0a, 0x39, 0x36}, + {0x1f, 0x0d, 0x1e}, + {0x0b, 0x0a, 0x19}, + {0x35, 0x1d, 0x34}, + {0x03, 0x12, 0x16}, + {0x0c, 0x13, 0x2e}, + {0x0c, 0x34, 0x1e}, + {0x10, 0x14, 0x1e}, + {0x23, 0x32, 0x27}, + {0x02, 0x10, 0x29}, + {0x35, 0x18, 0x33}, + {0x33, 0x1d, 0x1a}, + {0x3c, 0x15, 0x23}, + {0x3e, 0x3f, 0x22}, + {0x2a, 0x02, 0x2c}, + {0x28, 0x0a, 0x2f}, + {0x1a, 0x06, 0x35}, + {0x3c, 0x17, 0x2b}, + {0x03, 0x12, 0x17}, + {0x2f, 0x0a, 0x26}, + {0x12, 0x38, 0x11}, + {0x36, 0x1b, 0x23}, + {0x01, 0x39, 0x35}, + {0x19, 0x19, 0x17}, + {0x09, 0x28, 0x22}, + {0x1e, 0x27, 0x2c}, + {0x35, 0x33, 0x2c}, + {0x27, 0x25, 0x31}, + {0x06, 0x31, 0x2d}, + {0x1a, 0x39, 0x28}, + {0x2d, 0x04, 0x1e}, + {0x24, 0x3e, 0x1c}, + {0x3c, 0x30, 0x1b}, + {0x3f, 0x3e, 0x37}, + {0x22, 0x36, 0x11}, + {0x00, 0x01, 0x1c}, + {0x12, 0x1a, 0x10}, + {0x12, 0x1e, 0x2c}, + {0x1f, 0x12, 0x2a}, + {0x2f, 0x06, 0x19}, + {0x35, 0x1a, 0x18}, + {0x3b, 0x09, 0x36}, + {0x34, 0x1d, 0x13}, + {0x02, 0x07, 0x10}, + {0x20, 0x2f, 0x1d}, + {0x0b, 0x03, 0x33}, + {0x1c, 0x16, 0x31}, + {0x05, 0x13, 0x1b}, + {0x29, 0x06, 0x13}, + {0x30, 0x2d, 0x36}, + {0x2a, 0x2d, 0x2c}, + {0x19, 0x34, 0x1c}, + {0x0f, 0x15, 0x12}, + {0x36, 0x15, 0x2c}, + {0x3a, 0x06, 0x1c}, + {0x12, 0x1d, 0x26}, + {0x03, 0x38, 0x1d}, + {0x01, 0x01, 0x2d}, + {0x17, 0x2e, 0x10}, + {0x14, 0x17, 0x1c}, + {0x34, 0x0f, 0x28}, + {0x09, 0x37, 0x1b}, + {0x28, 0x1d, 0x26}, + {0x29, 0x2d, 0x36}, + {0x1e, 0x17, 0x28}, + {0x15, 0x0f, 0x1c}, + {0x20, 0x2d, 0x10}, + {0x27, 0x16, 0x2e}, + {0x14, 0x09, 0x12}, + {0x3b, 0x3d, 0x21}, + {0x25, 0x1a, 0x2c}, + {0x00, 0x22, 0x36}, + {0x0d, 0x30, 0x10}, + {0x17, 0x19, 0x1b}, + {0x00, 0x3b, 0x21}, + {0x2a, 0x28, 0x34}, + {0x2d, 0x0f, 0x16}, + {0x0a, 0x30, 0x28}, + {0x06, 0x00, 0x25}, + {0x31, 0x2e, 0x2a}, + {0x14, 0x33, 0x28}, + {0x36, 0x10, 0x2e}, + {0x05, 0x2e, 0x19}, + {0x19, 0x1a, 0x15}, + {0x2c, 0x14, 0x17}, + {0x37, 0x0f, 0x13}, + {0x32, 0x17, 0x1b}, + {0x39, 0x18, 0x32}, + {0x2e, 0x32, 0x1e}, + {0x24, 0x1d, 0x31}, + {0x12, 0x1d, 0x2b}, + {0x14, 0x0c, 0x27}, + {0x36, 0x2e, 0x32}, + {0x06, 0x0a, 0x1a}, + {0x28, 0x28, 0x20}, + {0x3a, 0x3a, 0x17}, + {0x08, 0x27, 0x36}, + {0x18, 0x1a, 0x10}, + {0x1e, 0x26, 0x1b}, + {0x1f, 0x33, 0x1f}, + {0x21, 0x17, 0x2f}, + {0x01, 0x08, 0x20}, + {0x35, 0x03, 0x19}, + {0x3b, 0x02, 0x20}, + {0x02, 0x2d, 0x23}, + {0x0e, 0x17, 0x32}, + {0x31, 0x29, 0x11}, + {0x22, 0x17, 0x22}, + {0x3a, 0x2c, 0x23}, + {0x34, 0x20, 0x18}, + {0x00, 0x3a, 0x22}, + {0x25, 0x33, 0x21}, + {0x33, 0x04, 0x27}, + {0x04, 0x18, 0x32}, + {0x2c, 0x0c, 0x2f}, + {0x28, 0x14, 0x2c}, + {0x3f, 0x30, 0x2b}, + {0x30, 0x21, 0x1d}, + {0x01, 0x25, 0x32}, + {0x05, 0x23, 0x34}, + {0x24, 0x10, 0x30}, + {0x3d, 0x14, 0x1b}, + {0x3f, 0x38, 0x2f}, + {0x22, 0x1b, 0x32}, + {0x25, 0x07, 0x37}, + {0x0a, 0x0c, 0x1d}, + {0x03, 0x1e, 0x1a}, + {0x0f, 0x3c, 0x12}, + {0x11, 0x18, 0x1d}, + {0x00, 0x35, 0x2f}, + {0x32, 0x18, 0x14}, + {0x23, 0x30, 0x1b}, + {0x11, 0x3d, 0x12}, + {0x1a, 0x16, 0x35}, + {0x28, 0x05, 0x24}, + {0x17, 0x3d, 0x37}, + {0x2e, 0x09, 0x2e}, + {0x18, 0x1d, 0x17}, + {0x20, 0x1f, 0x18}, + {0x23, 0x2c, 0x2f}, + {0x20, 0x3f, 0x16}, + {0x3f, 0x29, 0x2e}, + {0x23, 0x3b, 0x29}, + {0x18, 0x39, 0x13}, + {0x1e, 0x32, 0x35}, + {0x14, 0x1d, 0x2a}, + {0x35, 0x01, 0x1d}, + {0x3e, 0x3b, 0x1e}, + {0x22, 0x1e, 0x16}, + {0x18, 0x22, 0x12}, + {0x3e, 0x29, 0x33}, + {0x2f, 0x14, 0x19}, + {0x3b, 0x07, 0x15}, + {0x06, 0x3d, 0x29}, + {0x35, 0x37, 0x23}, + {0x34, 0x1d, 0x2d}, + {0x18, 0x12, 0x1b}, + {0x0b, 0x13, 0x24}, + {0x13, 0x38, 0x1c}, + {0x1f, 0x0b, 0x1b}, + {0x13, 0x21, 0x1c}, + {0x06, 0x39, 0x32}, + {0x37, 0x3d, 0x26}, + {0x29, 0x26, 0x15}, + {0x3c, 0x33, 0x27}, + {0x00, 0x01, 0x2e}, + {0x15, 0x18, 0x31}, + {0x0d, 0x2c, 0x13}, + {0x27, 0x3b, 0x20}, + {0x2d, 0x01, 0x26}, + {0x23, 0x15, 0x30}, + {0x24, 0x00, 0x17}, + {0x37, 0x3f, 0x33}, + {0x25, 0x24, 0x31}, + {0x06, 0x3b, 0x37}, + {0x03, 0x18, 0x1a}, + {0x2c, 0x34, 0x14}, + {0x1d, 0x36, 0x18}, + {0x3a, 0x04, 0x23}, + {0x12, 0x26, 0x15}, + {0x2b, 0x19, 0x1a}, + {0x29, 0x2c, 0x36}, + {0x01, 0x19, 0x1d}, + {0x2f, 0x06, 0x2b}, + {0x0c, 0x12, 0x26}, + {0x36, 0x32, 0x1d}, + {0x0d, 0x12, 0x28}, + {0x03, 0x28, 0x13}, + {0x29, 0x06, 0x17}, + {0x03, 0x38, 0x21}, + {0x30, 0x2c, 0x10}, + {0x22, 0x00, 0x28}, + {0x24, 0x3b, 0x1c}, + {0x20, 0x3e, 0x13}, + {0x02, 0x0c, 0x19}, + {0x29, 0x2c, 0x1a}, + {0x39, 0x30, 0x22}, + {0x2a, 0x1f, 0x22}, + {0x14, 0x34, 0x2c}, + {0x14, 0x25, 0x1b}, + {0x06, 0x3b, 0x15}, + {0x06, 0x1c, 0x13}, + {0x15, 0x03, 0x18}, + {0x1e, 0x2a, 0x1b}, + {0x17, 0x25, 0x2f}, + {0x1c, 0x29, 0x2e}, + {0x02, 0x32, 0x1e}, + {0x1d, 0x28, 0x35}, + {0x36, 0x03, 0x34}, + {0x16, 0x3d, 0x2a}, + {0x12, 0x0d, 0x13}, + {0x1d, 0x2d, 0x21}, + {0x32, 0x17, 0x2e}, + {0x1a, 0x15, 0x26}, + {0x22, 0x2f, 0x15}, + {0x3c, 0x0e, 0x20}, + {0x2f, 0x27, 0x13}, + {0x04, 0x09, 0x32}, + {0x1e, 0x01, 0x34}, + {0x06, 0x16, 0x1e}, + {0x2e, 0x1b, 0x1c}, + {0x28, 0x13, 0x2a}, + {0x30, 0x34, 0x12}, + {0x12, 0x32, 0x18}, + {0x1d, 0x1d, 0x35}, + {0x07, 0x1c, 0x16}, + {0x2d, 0x3d, 0x35}, + {0x1c, 0x1b, 0x24}, + {0x21, 0x2d, 0x1e}, + {0x10, 0x09, 0x14}, + {0x3d, 0x11, 0x12}, + {0x25, 0x02, 0x26}, + {0x23, 0x02, 0x19}, + {0x19, 0x05, 0x14}, + {0x0b, 0x21, 0x1a}, + {0x09, 0x02, 0x2c}, + {0x18, 0x28, 0x2d}, + {0x1e, 0x10, 0x12}, + {0x2e, 0x18, 0x2e}, + {0x1f, 0x02, 0x2c}, + {0x14, 0x17, 0x24}, + {0x39, 0x08, 0x32}, + {0x16, 0x14, 0x22}, + {0x16, 0x28, 0x21}, + {0x11, 0x10, 0x2c}, + {0x23, 0x36, 0x2b}, + {0x39, 0x21, 0x26}, + {0x0e, 0x06, 0x2d}, + {0x3c, 0x3e, 0x26}, + {0x2a, 0x1b, 0x1f}, + {0x00, 0x3c, 0x33}, + {0x35, 0x3f, 0x14}, + {0x00, 0x0b, 0x10}, + {0x34, 0x3c, 0x17}, + {0x2d, 0x07, 0x1f}, + {0x24, 0x39, 0x27}, + {0x16, 0x00, 0x1d}, + {0x33, 0x2b, 0x1e}, + {0x0f, 0x08, 0x31}, + {0x3a, 0x09, 0x13}, + {0x0c, 0x21, 0x1c}, + {0x2a, 0x17, 0x34}, + {0x29, 0x27, 0x10}, + {0x37, 0x1b, 0x18}, + {0x15, 0x08, 0x2f}, + {0x1f, 0x16, 0x12}, + {0x1f, 0x28, 0x34}, + {0x1c, 0x20, 0x22}, + {0x12, 0x01, 0x12}, + {0x21, 0x31, 0x10}, + {0x22, 0x26, 0x1e}, + {0x01, 0x3d, 0x11}, + {0x1e, 0x27, 0x25}, + {0x3d, 0x30, 0x24}, + {0x1d, 0x11, 0x22}, + {0x36, 0x30, 0x16}, + {0x1f, 0x3e, 0x2a}, + {0x3c, 0x27, 0x1b}, + {0x1f, 0x29, 0x10}, + {0x1e, 0x05, 0x2a}, + {0x0a, 0x10, 0x14}, + {0x1f, 0x00, 0x2e}, + {0x0b, 0x3b, 0x18}, + {0x0a, 0x39, 0x30}, + {0x37, 0x0b, 0x1f}, + {0x1d, 0x0a, 0x29}, + {0x3e, 0x1c, 0x33}, + {0x13, 0x2e, 0x28}, + {0x27, 0x1b, 0x1e}, + {0x1d, 0x02, 0x1c}, + {0x01, 0x25, 0x14}, + {0x3a, 0x10, 0x1c}, + {0x12, 0x05, 0x2a}, + {0x30, 0x20, 0x26}, + {0x2f, 0x2e, 0x2e}, + {0x03, 0x07, 0x24}, + {0x36, 0x04, 0x2b}, + {0x11, 0x25, 0x2d}, + {0x28, 0x0e, 0x2e}, + {0x0f, 0x1d, 0x15}, + {0x1c, 0x28, 0x30}, + {0x1f, 0x23, 0x26}, + {0x36, 0x12, 0x37}, + {0x3a, 0x31, 0x10}, + {0x2c, 0x2c, 0x2f}, + {0x1a, 0x0d, 0x15}, + {0x3f, 0x3c, 0x32}, + {0x35, 0x1c, 0x16}, + {0x33, 0x16, 0x28}, + {0x1d, 0x3f, 0x21}, + {0x2c, 0x3e, 0x2b}, + {0x24, 0x23, 0x2f}, + {0x32, 0x15, 0x2a}, + {0x1b, 0x10, 0x35}, + {0x18, 0x37, 0x10}, + {0x3b, 0x1e, 0x11}, + {0x2b, 0x16, 0x24}, + {0x1d, 0x16, 0x26}, + {0x3c, 0x2d, 0x11}, + {0x15, 0x28, 0x28}, + {0x27, 0x27, 0x27}, + {0x3b, 0x3a, 0x16}, + {0x1a, 0x0c, 0x1a}, + {0x15, 0x08, 0x25}, + {0x0b, 0x10, 0x22}, + {0x1a, 0x3e, 0x17}, + {0x28, 0x1f, 0x1e}, + {0x01, 0x1e, 0x1e}, + {0x1c, 0x2f, 0x10}, + {0x25, 0x0b, 0x34}, + {0x3e, 0x0c, 0x1a}, + {0x1b, 0x10, 0x2a}, + {0x0f, 0x14, 0x17}, + {0x0f, 0x3f, 0x17}, + {0x03, 0x15, 0x1f}, + {0x02, 0x36, 0x17}, + {0x15, 0x1d, 0x18}, + {0x08, 0x36, 0x10}, + {0x14, 0x0d, 0x2b}, + {0x0a, 0x05, 0x1d}, + {0x26, 0x12, 0x1e}, + {0x3e, 0x18, 0x19}, + {0x36, 0x18, 0x37}, + {0x17, 0x39, 0x2e}, + {0x0d, 0x04, 0x19}, + {0x16, 0x22, 0x15}, + {0x3e, 0x26, 0x1f}, + {0x00, 0x06, 0x17}, + {0x33, 0x22, 0x1d}, + {0x2b, 0x39, 0x2b}, + {0x3e, 0x31, 0x1c}, + {0x22, 0x3f, 0x13}, + {0x30, 0x1c, 0x31}, + {0x07, 0x2b, 0x14}, + {0x32, 0x35, 0x1e}, + {0x02, 0x07, 0x20}, + {0x0f, 0x3b, 0x11}, + {0x20, 0x07, 0x12}, + {0x2a, 0x30, 0x1d}, + {0x28, 0x38, 0x36}, + {0x20, 0x01, 0x17}, + {0x15, 0x20, 0x21}, + {0x3a, 0x1b, 0x1e}, + {0x38, 0x12, 0x24}, + {0x03, 0x3e, 0x1f}, + {0x29, 0x1d, 0x13}, + {0x20, 0x27, 0x19}, + {0x12, 0x25, 0x20}, + {0x32, 0x33, 0x2b}, + {0x3f, 0x05, 0x31}, + {0x35, 0x3c, 0x2d}, + {0x2d, 0x02, 0x2e}, + {0x10, 0x2a, 0x16}, + {0x17, 0x08, 0x31}, + {0x17, 0x2e, 0x2b}, + {0x30, 0x1e, 0x15}, + {0x31, 0x15, 0x26}, + {0x08, 0x10, 0x33}, + {0x15, 0x01, 0x27}, + {0x12, 0x07, 0x2f}, + {0x29, 0x27, 0x34}, + {0x3f, 0x08, 0x31}, + {0x1c, 0x20, 0x1a}, + {0x33, 0x0c, 0x13}, + {0x18, 0x31, 0x24}, + {0x37, 0x2d, 0x2e}, + {0x21, 0x18, 0x24}, + {0x3a, 0x27, 0x31}, + {0x35, 0x3e, 0x30}, + {0x3a, 0x14, 0x33}, + {0x0f, 0x1a, 0x2d}, + {0x30, 0x2e, 0x11}, + {0x1a, 0x31, 0x1d}, + {0x17, 0x3c, 0x18}, + {0x33, 0x31, 0x23}, + {0x1d, 0x39, 0x2d}, + {0x10, 0x1d, 0x2f}, + {0x24, 0x15, 0x1c}, + {0x25, 0x01, 0x2b}, + {0x22, 0x16, 0x2e}, + {0x1b, 0x25, 0x35}, + {0x37, 0x10, 0x26}, + {0x39, 0x01, 0x36}, + {0x17, 0x2b, 0x14}, + {0x09, 0x16, 0x17}, + {0x20, 0x28, 0x23}, + {0x26, 0x3a, 0x26}, + {0x27, 0x2a, 0x24}, + {0x36, 0x02, 0x2c}, + {0x29, 0x30, 0x35}, + {0x36, 0x01, 0x1f}, + {0x28, 0x3b, 0x1d}, + {0x23, 0x1e, 0x2d}, + {0x11, 0x1e, 0x2c}, + {0x2f, 0x32, 0x19}, + {0x3f, 0x26, 0x31}, + {0x38, 0x1e, 0x17}, + {0x05, 0x18, 0x2e}, + {0x00, 0x2e, 0x12}, + {0x34, 0x3f, 0x34}, + {0x16, 0x10, 0x29}, + {0x20, 0x3d, 0x36}, + {0x2f, 0x16, 0x25}, + {0x12, 0x17, 0x10}, + {0x21, 0x37, 0x35}, + {0x25, 0x37, 0x2d}, + {0x01, 0x08, 0x27}, + {0x03, 0x1f, 0x29}, + {0x0d, 0x2a, 0x16}, + {0x3a, 0x3f, 0x33}, + {0x2b, 0x19, 0x1d}, + {0x2a, 0x1f, 0x29}, + {0x28, 0x2c, 0x10}, + {0x28, 0x30, 0x10}, + {0x39, 0x14, 0x1b}, + {0x00, 0x18, 0x21}, + {0x28, 0x0c, 0x37}, + {0x11, 0x10, 0x11}, + {0x3c, 0x33, 0x32}, + {0x33, 0x36, 0x1a}, + {0x36, 0x00, 0x1c}, + {0x31, 0x1b, 0x1d}, + {0x38, 0x1d, 0x10}, + {0x3c, 0x39, 0x27}, + {0x3a, 0x3f, 0x14}, + {0x19, 0x12, 0x14}, + {0x0d, 0x1f, 0x18}, + {0x00, 0x25, 0x18}, + {0x28, 0x1c, 0x32}, + {0x27, 0x03, 0x1a}, + {0x26, 0x2d, 0x2a}, + {0x29, 0x28, 0x27}, + {0x0a, 0x2a, 0x18}, + {0x0a, 0x1a, 0x30}, + {0x20, 0x1a, 0x2e}, + {0x06, 0x0b, 0x1d}, + {0x0f, 0x0c, 0x1c}, + {0x35, 0x28, 0x1c}, + {0x3d, 0x16, 0x23}, + {0x21, 0x1c, 0x31}, + {0x14, 0x1c, 0x2e}, + {0x22, 0x32, 0x35}, + {0x09, 0x29, 0x30}, + {0x20, 0x1a, 0x10}, + {0x31, 0x3f, 0x2c}, + {0x0a, 0x3d, 0x37}, + {0x0b, 0x2e, 0x2d}, + {0x1f, 0x22, 0x31}, + {0x06, 0x07, 0x29}, + {0x22, 0x17, 0x2d}, + {0x30, 0x11, 0x18}, + {0x0c, 0x19, 0x15}, + {0x07, 0x0a, 0x34}, + {0x18, 0x29, 0x27}, + {0x33, 0x0c, 0x30}, + {0x03, 0x1a, 0x37}, + {0x06, 0x01, 0x2d}, + {0x0f, 0x3b, 0x2b}, + {0x11, 0x1f, 0x37}, + {0x2b, 0x21, 0x36}, + {0x3f, 0x23, 0x17}, + {0x17, 0x07, 0x2b}, + {0x2b, 0x0e, 0x30}, + {0x11, 0x39, 0x1d}, + {0x29, 0x03, 0x33}, + {0x30, 0x03, 0x2f}, + {0x3c, 0x20, 0x26}, + {0x03, 0x22, 0x14}, + {0x3a, 0x28, 0x35}, + {0x01, 0x28, 0x2b}, + {0x3e, 0x15, 0x18}, + {0x30, 0x07, 0x17}, + {0x3b, 0x2c, 0x30}, + {0x15, 0x07, 0x2c}, + {0x17, 0x27, 0x1d}, + {0x3f, 0x1e, 0x33}, + {0x0d, 0x17, 0x10}, + {0x15, 0x0e, 0x30}, + {0x09, 0x05, 0x30}, + {0x2d, 0x20, 0x15}, + {0x3c, 0x3d, 0x30}, + {0x0c, 0x17, 0x1c}, + {0x1a, 0x0d, 0x25}, + {0x2b, 0x2b, 0x2a}, + {0x02, 0x16, 0x2d}, + {0x17, 0x31, 0x17}, + {0x00, 0x08, 0x13}, + {0x37, 0x35, 0x21}, + {0x1e, 0x1c, 0x1f}, + {0x2b, 0x32, 0x1c}, + {0x10, 0x2a, 0x16}, + {0x3a, 0x33, 0x31}, + {0x17, 0x2b, 0x2a}, + {0x0c, 0x3d, 0x11}, + {0x28, 0x0a, 0x30}, + {0x23, 0x0a, 0x26}, + {0x0a, 0x14, 0x24}, + {0x0b, 0x0f, 0x30}, + {0x1b, 0x1e, 0x29}, + {0x02, 0x35, 0x28}, + {0x3b, 0x02, 0x14}, + {0x00, 0x0f, 0x35}, + {0x1c, 0x3c, 0x2e}, + {0x28, 0x38, 0x19}, + {0x1b, 0x11, 0x12}, + {0x09, 0x16, 0x10}, + {0x2e, 0x0d, 0x20}, + {0x3d, 0x04, 0x32}, + {0x16, 0x2c, 0x25}, + {0x02, 0x3d, 0x18}, + {0x0b, 0x13, 0x1c}, + {0x22, 0x2a, 0x1c}, + {0x20, 0x27, 0x22}, + {0x05, 0x26, 0x22}, + {0x12, 0x1d, 0x2c}, + {0x08, 0x05, 0x2e}, + {0x3f, 0x1c, 0x17}, + {0x24, 0x0d, 0x33}, + {0x36, 0x08, 0x24}, + {0x10, 0x22, 0x29}, + {0x1c, 0x0a, 0x11}, + {0x25, 0x0f, 0x10}, + {0x24, 0x38, 0x2f}, + {0x25, 0x32, 0x1e}, + {0x06, 0x2a, 0x29}, + {0x3e, 0x3a, 0x28}, + {0x34, 0x17, 0x33}, + {0x18, 0x33, 0x17}, + {0x07, 0x14, 0x1f}, + {0x11, 0x17, 0x20}, + {0x13, 0x0e, 0x14}, + {0x3b, 0x1c, 0x12}, + {0x2a, 0x13, 0x37}, + {0x2a, 0x35, 0x32}, + {0x30, 0x02, 0x25}, + {0x00, 0x07, 0x1f}, + {0x0c, 0x04, 0x2c}, + {0x37, 0x37, 0x30}, + {0x25, 0x12, 0x25}, + {0x12, 0x22, 0x21}, + {0x22, 0x35, 0x33}, + {0x07, 0x20, 0x2d}, + {0x27, 0x0e, 0x30}, + {0x34, 0x19, 0x1a}, + {0x0a, 0x3c, 0x25}, + {0x07, 0x1d, 0x2b}, + {0x31, 0x3a, 0x12}, + {0x1a, 0x3d, 0x37}, + {0x16, 0x15, 0x16}, + {0x39, 0x13, 0x15}, + {0x2d, 0x03, 0x2e}, + {0x06, 0x39, 0x2c}, + {0x16, 0x00, 0x13}, + {0x35, 0x2a, 0x35}, + {0x24, 0x01, 0x18}, + {0x24, 0x37, 0x28}, + {0x25, 0x1b, 0x34}, + {0x25, 0x19, 0x17}, + {0x27, 0x2f, 0x1b}, + {0x27, 0x0d, 0x10}, + {0x36, 0x3c, 0x30}, + {0x3c, 0x33, 0x23}, + {0x3e, 0x27, 0x1e}, + {0x25, 0x2d, 0x29}, + {0x1f, 0x12, 0x21}, + {0x37, 0x32, 0x1f}, + {0x11, 0x21, 0x35}, + {0x30, 0x0c, 0x19}, + {0x25, 0x3d, 0x26}, + {0x17, 0x02, 0x1d}, + {0x14, 0x2e, 0x11}, + {0x38, 0x13, 0x30}, + {0x0a, 0x2b, 0x20}, + {0x1e, 0x10, 0x15}, + {0x37, 0x30, 0x2e}, + {0x1e, 0x04, 0x2c}, + {0x14, 0x34, 0x19}, + {0x08, 0x14, 0x18}, + {0x0e, 0x1c, 0x30}, + {0x1a, 0x2e, 0x1b}, + {0x1f, 0x39, 0x31}, + {0x0c, 0x1c, 0x28}, + {0x3e, 0x33, 0x23}, + {0x0f, 0x13, 0x16}, + {0x25, 0x39, 0x2f}, + {0x14, 0x1b, 0x1a}, + {0x28, 0x3e, 0x21}, + {0x2d, 0x19, 0x11}, + {0x0c, 0x34, 0x32}, + {0x39, 0x31, 0x19}, + {0x1a, 0x08, 0x34}, + {0x09, 0x2f, 0x11}, + {0x30, 0x04, 0x1c}, + {0x02, 0x3b, 0x1b}, + {0x33, 0x21, 0x33}, + {0x38, 0x02, 0x1a}, + {0x31, 0x38, 0x32}, + {0x1f, 0x1d, 0x16}, + {0x17, 0x10, 0x1b}, + {0x32, 0x20, 0x17}, + {0x00, 0x33, 0x12}, + {0x21, 0x0f, 0x27}, + {0x14, 0x19, 0x27}, + {0x24, 0x2c, 0x37}, + {0x25, 0x05, 0x2f}, + {0x3d, 0x25, 0x11}, + {0x12, 0x30, 0x1a}, + {0x16, 0x03, 0x1a}, + {0x14, 0x09, 0x13}, + {0x02, 0x23, 0x22}, + {0x01, 0x3c, 0x10}, + {0x3f, 0x2d, 0x23}, + {0x31, 0x3f, 0x23}, + {0x17, 0x00, 0x33}, + {0x3f, 0x0f, 0x2f}, + {0x26, 0x07, 0x15}, + {0x21, 0x2b, 0x2a}, + {0x38, 0x39, 0x1e}, + {0x09, 0x25, 0x2b}, + {0x3b, 0x30, 0x25}, + {0x12, 0x2d, 0x13}, + {0x32, 0x19, 0x28}, + {0x24, 0x1c, 0x2d}, + {0x35, 0x32, 0x26}, + {0x0d, 0x23, 0x1e}, + {0x1d, 0x07, 0x21}, + {0x0b, 0x34, 0x17}, + {0x2d, 0x32, 0x32}, + {0x3a, 0x3c, 0x35}, + {0x1a, 0x10, 0x33}, + {0x1a, 0x07, 0x22}, + {0x3b, 0x1b, 0x2a}, + {0x33, 0x1f, 0x26}, + {0x0e, 0x35, 0x1a}, + {0x3b, 0x0a, 0x1c}, + {0x11, 0x07, 0x11}, + {0x0d, 0x3c, 0x2d}, + {0x1e, 0x37, 0x29}, + {0x11, 0x05, 0x12}, + {0x15, 0x2f, 0x1c}, + {0x24, 0x31, 0x16}, + {0x2b, 0x21, 0x1b}, + {0x23, 0x10, 0x31}, + {0x02, 0x14, 0x29}, + {0x26, 0x20, 0x16}, + {0x10, 0x17, 0x10}, + {0x0b, 0x0f, 0x33}, + {0x01, 0x2e, 0x14}, + {0x21, 0x0e, 0x37}, + {0x1a, 0x1d, 0x2f}, + {0x1e, 0x30, 0x24}, + {0x04, 0x14, 0x2d}, + {0x11, 0x00, 0x30}, + {0x08, 0x2a, 0x1d}, + {0x1d, 0x22, 0x21}, + {0x24, 0x2c, 0x37}, + {0x24, 0x11, 0x12}, + {0x04, 0x2e, 0x28}, + {0x1d, 0x18, 0x23}, + {0x3c, 0x16, 0x16}, + {0x10, 0x17, 0x31}, + {0x20, 0x21, 0x12}, + {0x33, 0x3e, 0x34}, + {0x06, 0x13, 0x13}, + {0x17, 0x38, 0x2b}, + {0x14, 0x0d, 0x15}, + {0x24, 0x3b, 0x2b}, + {0x34, 0x3b, 0x1e}, + {0x18, 0x07, 0x34}, + {0x37, 0x1d, 0x1f}, + {0x0b, 0x29, 0x20}, + {0x12, 0x1e, 0x1d}, + {0x1a, 0x24, 0x24}, + {0x3d, 0x28, 0x24}, + {0x0b, 0x12, 0x33}, + {0x1b, 0x3a, 0x22}, + {0x14, 0x13, 0x2a}, + {0x31, 0x38, 0x15}, + {0x37, 0x2b, 0x2e}, + {0x19, 0x1e, 0x2c}, + {0x3f, 0x1b, 0x2a}, + {0x33, 0x1f, 0x33}, + {0x3f, 0x15, 0x29}, + {0x01, 0x1e, 0x18}, + {0x1f, 0x22, 0x19}, + {0x33, 0x3c, 0x34}, + {0x1e, 0x12, 0x22}, + {0x0d, 0x37, 0x2c}, + {0x0f, 0x08, 0x31}, + {0x2e, 0x09, 0x36}, + {0x01, 0x05, 0x1e}, + {0x1c, 0x04, 0x1e}, + {0x0c, 0x01, 0x1c}, + {0x29, 0x28, 0x2f}, + {0x39, 0x2d, 0x14}, + {0x09, 0x22, 0x36}, + {0x04, 0x37, 0x37}, + {0x2d, 0x2f, 0x35}, + {0x24, 0x23, 0x1b}, + {0x08, 0x20, 0x32}, + {0x20, 0x1f, 0x34}, + {0x02, 0x31, 0x19}, + {0x18, 0x13, 0x36}, + {0x06, 0x2b, 0x1e}, + {0x0e, 0x1b, 0x10}, + {0x2f, 0x0e, 0x1c}, + {0x11, 0x38, 0x13}, + {0x01, 0x37, 0x19}, + {0x14, 0x11, 0x26}, + {0x31, 0x3d, 0x33}, + {0x1d, 0x1b, 0x34}, + {0x25, 0x31, 0x2f}, + {0x11, 0x0a, 0x2f}, + {0x39, 0x17, 0x1b}, + {0x05, 0x0e, 0x13}, + {0x29, 0x25, 0x22}, + {0x15, 0x0d, 0x20}, + {0x2b, 0x27, 0x21}, + {0x3e, 0x24, 0x27}, + {0x2a, 0x2b, 0x16}, + {0x24, 0x3d, 0x15}, + {0x15, 0x30, 0x31}, + {0x0f, 0x33, 0x24}, + {0x06, 0x16, 0x13}, + {0x06, 0x31, 0x10}, + {0x2e, 0x3f, 0x10}, + {0x05, 0x0d, 0x2f}, + {0x3c, 0x1f, 0x19}, + {0x12, 0x13, 0x24}, + {0x0f, 0x33, 0x36}, + {0x15, 0x3b, 0x33}, + {0x03, 0x0f, 0x2a}, + {0x3b, 0x3c, 0x2c}, + {0x36, 0x09, 0x29}, + {0x11, 0x3b, 0x27}, + {0x28, 0x2b, 0x31}, + {0x1a, 0x0e, 0x2f}, + {0x39, 0x2c, 0x31}, + {0x0e, 0x3c, 0x35}, + {0x2c, 0x24, 0x33}, + {0x3d, 0x11, 0x2b}, + {0x07, 0x3c, 0x37}, + {0x14, 0x18, 0x13}, + {0x1d, 0x3f, 0x2e}, + {0x30, 0x12, 0x25}, + {0x26, 0x1d, 0x11}, + {0x07, 0x11, 0x1e}, + {0x34, 0x01, 0x11}, + {0x0b, 0x39, 0x21}, + {0x29, 0x02, 0x29}, + {0x15, 0x10, 0x1a}, + {0x30, 0x1f, 0x35}, + {0x3c, 0x2b, 0x2a}, + {0x30, 0x3b, 0x36}, + {0x20, 0x1a, 0x23}, + {0x32, 0x24, 0x2b}, + {0x15, 0x20, 0x1c}, + {0x25, 0x3d, 0x36}, + {0x2d, 0x14, 0x31}, + {0x18, 0x23, 0x17}, + {0x18, 0x05, 0x13}, + {0x34, 0x30, 0x37}, + {0x0e, 0x39, 0x23}, + {0x1d, 0x1f, 0x17}, + {0x01, 0x15, 0x2f}, + {0x0b, 0x3e, 0x1b}, + {0x0d, 0x19, 0x2e}, + {0x31, 0x38, 0x1c}, + {0x15, 0x34, 0x15}, + {0x13, 0x19, 0x29}, + {0x19, 0x14, 0x27}, + {0x15, 0x18, 0x23}, + {0x29, 0x0c, 0x27}, + {0x2d, 0x0e, 0x17}, + {0x34, 0x18, 0x10}, + {0x3b, 0x1e, 0x29}, + {0x34, 0x2c, 0x22}, + {0x31, 0x08, 0x13}, + {0x1d, 0x18, 0x1a}, + {0x1c, 0x0b, 0x2a}, + {0x19, 0x1e, 0x1a}, + {0x23, 0x27, 0x17}, + {0x3b, 0x0e, 0x37}, + {0x19, 0x2b, 0x16}, + {0x2f, 0x08, 0x21}, + {0x37, 0x02, 0x20}, + {0x0b, 0x32, 0x30}, + {0x16, 0x05, 0x30}, + {0x13, 0x05, 0x1a}, + {0x07, 0x39, 0x19}, + {0x0c, 0x3b, 0x2a}, + {0x15, 0x05, 0x30}, + {0x30, 0x05, 0x19}, + {0x13, 0x00, 0x12}, + {0x27, 0x16, 0x2a}, + {0x0f, 0x28, 0x27}, + {0x0c, 0x23, 0x2f}, + {0x39, 0x28, 0x2a}, + {0x24, 0x25, 0x1f}, + {0x18, 0x29, 0x14}, + {0x16, 0x05, 0x1a}, + {0x35, 0x2f, 0x26}, + {0x0a, 0x3a, 0x29}, + {0x34, 0x2c, 0x36}, + {0x2e, 0x3a, 0x15}, + {0x1a, 0x0a, 0x2d}, + {0x16, 0x14, 0x2e}, + {0x35, 0x28, 0x2a}, + {0x35, 0x0f, 0x11}, + {0x11, 0x32, 0x19}, + {0x20, 0x1a, 0x28}, + {0x17, 0x1a, 0x28}, + {0x16, 0x33, 0x25}, + {0x13, 0x2c, 0x29}, + {0x09, 0x16, 0x33}, + {0x1d, 0x27, 0x26}, + {0x15, 0x0c, 0x2f}, + {0x22, 0x1c, 0x19}, + {0x29, 0x33, 0x10}, + {0x2d, 0x11, 0x1b}, + {0x16, 0x19, 0x2e}, + {0x0d, 0x0c, 0x28}, + {0x37, 0x3a, 0x34}, + {0x2a, 0x1d, 0x37}, + {0x30, 0x0a, 0x36}, + {0x24, 0x39, 0x1b}, + {0x39, 0x0a, 0x32}, + {0x11, 0x03, 0x2d}, + {0x32, 0x1d, 0x30}, + {0x38, 0x1e, 0x27}, + {0x2e, 0x17, 0x18}, + {0x16, 0x17, 0x2a}, + {0x36, 0x3b, 0x31}, + {0x17, 0x04, 0x19}, + {0x3a, 0x25, 0x2d}, + {0x00, 0x36, 0x27}, + {0x25, 0x12, 0x33}, + {0x06, 0x0a, 0x14}, + {0x11, 0x05, 0x2f}, + {0x03, 0x35, 0x2f}, + {0x0b, 0x34, 0x29}, + {0x00, 0x31, 0x13}, + {0x27, 0x0f, 0x1c}, + {0x1d, 0x06, 0x2d}, + {0x1c, 0x30, 0x27}, + {0x2f, 0x2a, 0x27}, + {0x16, 0x20, 0x31}, + {0x33, 0x2b, 0x2b}, + {0x05, 0x30, 0x36}, + {0x29, 0x23, 0x35}, + {0x10, 0x16, 0x2f}, + {0x2d, 0x20, 0x29}, + {0x37, 0x13, 0x24}, + {0x2d, 0x0e, 0x25}, + {0x08, 0x0a, 0x18}, + {0x0f, 0x03, 0x1b}, + {0x31, 0x0c, 0x37}, + {0x1e, 0x34, 0x31}, + {0x1b, 0x0e, 0x25}, + {0x1a, 0x07, 0x34}, + {0x0d, 0x3c, 0x33}, + {0x00, 0x3a, 0x36}, + {0x04, 0x27, 0x12}, + {0x23, 0x18, 0x24}, + {0x0d, 0x0b, 0x18}, + {0x31, 0x32, 0x37}, + {0x00, 0x0d, 0x21}, + {0x32, 0x10, 0x12}, + {0x26, 0x0d, 0x19}, + {0x29, 0x24, 0x2b}, + {0x3d, 0x21, 0x1f}, + {0x1e, 0x1b, 0x28}, + {0x0d, 0x12, 0x28}, + {0x35, 0x1e, 0x23}, + {0x0a, 0x2e, 0x22}, + {0x27, 0x27, 0x35}, + {0x01, 0x0e, 0x20}, + {0x31, 0x39, 0x29}, + {0x3b, 0x24, 0x36}, + {0x14, 0x10, 0x33}, + {0x18, 0x2c, 0x26}, + {0x04, 0x2d, 0x15}, + {0x1a, 0x11, 0x37}, + {0x0f, 0x0b, 0x14}, + {0x0e, 0x2c, 0x2c}, + {0x21, 0x17, 0x2c}, + {0x16, 0x21, 0x35}, + {0x3e, 0x10, 0x10}, + {0x0a, 0x05, 0x1e}, + {0x3b, 0x09, 0x13}, + {0x26, 0x18, 0x1e}, + {0x23, 0x0c, 0x1a}, + {0x33, 0x37, 0x1f}, + {0x09, 0x12, 0x35}, + {0x3d, 0x0d, 0x15}, + {0x36, 0x06, 0x24}, + {0x33, 0x30, 0x29}, + {0x3b, 0x0f, 0x28}, + {0x34, 0x2a, 0x2c}, + {0x02, 0x12, 0x35}, + {0x09, 0x22, 0x31}, + {0x3b, 0x31, 0x1c}, + {0x33, 0x22, 0x27}, + {0x3d, 0x34, 0x15}, + {0x14, 0x22, 0x28}, + {0x28, 0x10, 0x1e}, + {0x21, 0x31, 0x10}, + {0x2d, 0x16, 0x21}, + {0x1e, 0x05, 0x33}, + {0x0f, 0x30, 0x31}, + {0x0e, 0x1a, 0x35}, + {0x38, 0x2e, 0x28}, + {0x26, 0x37, 0x1e}, + {0x2b, 0x13, 0x33}, + {0x1f, 0x1e, 0x37}, + {0x0a, 0x28, 0x24}, + {0x32, 0x1c, 0x1a}, + {0x1f, 0x3f, 0x19}, + {0x39, 0x39, 0x29}, + {0x2c, 0x1b, 0x14}, + {0x15, 0x2a, 0x17}, + {0x32, 0x0f, 0x21}, + {0x30, 0x21, 0x18}, + {0x23, 0x2a, 0x27}, + {0x3d, 0x07, 0x10}, + {0x0b, 0x3f, 0x2f}, + {0x31, 0x02, 0x2e}, + {0x08, 0x39, 0x2f}, + {0x3f, 0x20, 0x18}, + {0x2d, 0x34, 0x11}, + {0x2e, 0x34, 0x10}, + {0x26, 0x12, 0x23}, + {0x25, 0x0a, 0x37}, + {0x34, 0x09, 0x25}, + {0x0a, 0x3e, 0x16}, + {0x1a, 0x17, 0x11}, + {0x38, 0x1c, 0x20}, + {0x11, 0x21, 0x26}, + {0x05, 0x0f, 0x18}, + {0x26, 0x2b, 0x32}, + {0x0a, 0x0c, 0x16}, + {0x03, 0x29, 0x1d}, + {0x29, 0x3b, 0x23}, + {0x16, 0x1b, 0x29}, + {0x07, 0x09, 0x17}, + {0x17, 0x2c, 0x1c}, + {0x35, 0x33, 0x30}, + {0x17, 0x12, 0x1e}, + {0x3d, 0x1a, 0x2b}, + {0x21, 0x1d, 0x10}, + {0x0a, 0x08, 0x17}, + {0x14, 0x3c, 0x36}, + {0x28, 0x36, 0x36}, + {0x3b, 0x20, 0x1b}, + {0x13, 0x22, 0x1d}, + {0x13, 0x3a, 0x15}, + {0x02, 0x23, 0x2c}, + {0x3e, 0x19, 0x14}, + {0x39, 0x3c, 0x1a}, + {0x10, 0x08, 0x1e}, + {0x0a, 0x13, 0x29}, + {0x3f, 0x38, 0x2c}, + {0x07, 0x23, 0x1f}, + {0x19, 0x2a, 0x24}, + {0x14, 0x3c, 0x1f}, + {0x0d, 0x04, 0x37}, + {0x1a, 0x2f, 0x28}, + {0x2a, 0x1d, 0x1e}, + {0x11, 0x37, 0x29}, + {0x28, 0x27, 0x12}, + {0x0d, 0x00, 0x26}, + {0x0a, 0x3c, 0x26}, + {0x1f, 0x1c, 0x33}, + {0x04, 0x3a, 0x2c}, + {0x24, 0x3d, 0x2b}, + {0x26, 0x31, 0x2f}, + {0x13, 0x1c, 0x21}, + {0x3e, 0x12, 0x23}, + {0x36, 0x0a, 0x1a}, + {0x2d, 0x1e, 0x19}, + {0x05, 0x1f, 0x1b}, + {0x1e, 0x0a, 0x1f}, + {0x20, 0x08, 0x24}, + {0x2c, 0x0c, 0x33}, + {0x1d, 0x1f, 0x11}, + {0x0e, 0x12, 0x10}, + {0x27, 0x12, 0x19}, + {0x2a, 0x13, 0x31}, + {0x1c, 0x04, 0x30}, + {0x1a, 0x38, 0x1f}, + {0x2c, 0x35, 0x25}, + {0x07, 0x0b, 0x33}, + {0x2d, 0x02, 0x1a}, + {0x2a, 0x35, 0x35}, + {0x16, 0x2f, 0x14}, + {0x11, 0x31, 0x33}, + {0x2c, 0x31, 0x1e}, + {0x3c, 0x3a, 0x27}, + {0x3c, 0x2b, 0x12}, + {0x27, 0x1d, 0x12}, + {0x36, 0x2c, 0x2b}, + {0x25, 0x3b, 0x35}, + {0x12, 0x3d, 0x27}, + {0x13, 0x23, 0x19}, + {0x33, 0x2c, 0x26}, + {0x09, 0x3c, 0x12}, + {0x15, 0x1a, 0x23}, + {0x21, 0x07, 0x1a}, + {0x22, 0x25, 0x20}, + {0x19, 0x1b, 0x2c}, + {0x3a, 0x19, 0x35}, + {0x05, 0x26, 0x1d}, + {0x23, 0x22, 0x25}, + {0x0e, 0x1e, 0x11}, + {0x13, 0x30, 0x12}, + {0x2c, 0x22, 0x25}, + {0x0a, 0x1d, 0x18}, + {0x23, 0x3e, 0x1d}, + {0x02, 0x28, 0x25}, + {0x21, 0x0e, 0x20}, + {0x21, 0x22, 0x37}, + {0x18, 0x33, 0x27}, + {0x23, 0x23, 0x31}, + {0x24, 0x1a, 0x1a}, + {0x3e, 0x25, 0x24}, + {0x24, 0x01, 0x18}, + {0x34, 0x10, 0x22}, + {0x07, 0x00, 0x37}, + {0x06, 0x20, 0x20}, + {0x3a, 0x02, 0x2b}, + {0x07, 0x2c, 0x2c}, + {0x09, 0x2f, 0x2a}, + {0x01, 0x32, 0x2c}, + {0x00, 0x35, 0x13}, + {0x2b, 0x3c, 0x1f}, + {0x36, 0x37, 0x1e}, + {0x20, 0x35, 0x1d}, + {0x0c, 0x07, 0x33}, + {0x16, 0x08, 0x12}, + {0x3f, 0x36, 0x11}, + {0x0b, 0x1f, 0x2d}, + {0x21, 0x20, 0x33}, + {0x17, 0x1a, 0x2e}, + {0x16, 0x01, 0x2f}, + {0x2f, 0x1c, 0x34}, + {0x29, 0x31, 0x2e}, + {0x3b, 0x38, 0x31}, + {0x0d, 0x16, 0x12}, + {0x07, 0x29, 0x24}, + {0x33, 0x3c, 0x34}, + {0x3e, 0x1e, 0x18}, + {0x30, 0x02, 0x34}, + {0x2a, 0x34, 0x1b}, + {0x2e, 0x23, 0x18}, + {0x34, 0x00, 0x1f}, + {0x20, 0x0e, 0x28}, + {0x15, 0x33, 0x37}, + {0x27, 0x35, 0x23}, + {0x37, 0x3e, 0x11}, + {0x32, 0x2e, 0x36}, + {0x3a, 0x02, 0x2b}, + {0x00, 0x36, 0x1d}, + {0x13, 0x29, 0x16}, + {0x08, 0x2b, 0x37}, + {0x08, 0x02, 0x27}, + {0x32, 0x2d, 0x34}, + {0x30, 0x36, 0x29}, + {0x2e, 0x10, 0x12}, + {0x3c, 0x2e, 0x2a}, + {0x04, 0x33, 0x30}, + {0x3f, 0x01, 0x22}, + {0x37, 0x14, 0x1d}, + {0x27, 0x00, 0x2f}, + {0x0c, 0x39, 0x26}, + {0x27, 0x04, 0x21}, + {0x19, 0x08, 0x1d}, + {0x01, 0x04, 0x1e}, + {0x27, 0x1b, 0x2b}, + {0x31, 0x17, 0x1f}, + {0x07, 0x01, 0x2d}, + {0x2e, 0x3b, 0x1f}, + {0x34, 0x24, 0x31}, + {0x32, 0x2b, 0x24}, + {0x0e, 0x07, 0x1e}, + {0x0f, 0x33, 0x10}, + {0x16, 0x21, 0x32}, + {0x39, 0x02, 0x1a}, + {0x33, 0x3d, 0x22}, + {0x0c, 0x25, 0x1a}, + {0x29, 0x29, 0x28}, + {0x3a, 0x32, 0x26}, + {0x0b, 0x13, 0x22}, + {0x1f, 0x0f, 0x1c}, + {0x04, 0x2c, 0x20}, + {0x39, 0x1a, 0x1b}, + {0x1a, 0x2a, 0x1f}, + {0x24, 0x13, 0x1a}, + {0x31, 0x3b, 0x33}, + {0x39, 0x23, 0x28}, + {0x31, 0x07, 0x31}, + {0x1f, 0x10, 0x20}, + {0x29, 0x17, 0x32}, + {0x26, 0x3b, 0x2d}, + {0x02, 0x3c, 0x1c}, + {0x0e, 0x00, 0x20}, + {0x14, 0x3e, 0x37}, + {0x01, 0x0f, 0x2d}, + {0x06, 0x12, 0x27}, + {0x30, 0x13, 0x19}, + {0x00, 0x33, 0x2a}, + {0x0c, 0x07, 0x27}, + {0x11, 0x3a, 0x1c}, + {0x15, 0x0a, 0x13}, + {0x1f, 0x0d, 0x2a}, + {0x37, 0x07, 0x2a}, + {0x34, 0x35, 0x34}, + {0x28, 0x16, 0x27}, + {0x06, 0x02, 0x36}, + {0x09, 0x23, 0x30}, + {0x14, 0x02, 0x28}, + {0x39, 0x32, 0x34}, + {0x24, 0x35, 0x12}, + {0x12, 0x22, 0x26}, + {0x09, 0x07, 0x33}, + {0x0f, 0x3e, 0x1e}, + {0x00, 0x3c, 0x33}, + {0x10, 0x37, 0x14}, + {0x3a, 0x03, 0x25}, + {0x2d, 0x1e, 0x24}, + {0x36, 0x36, 0x26}, + {0x1f, 0x3c, 0x1a}, + {0x37, 0x33, 0x25}, + {0x23, 0x13, 0x1f}, + {0x33, 0x0d, 0x13}, + {0x25, 0x30, 0x1e}, + {0x17, 0x03, 0x18}, + {0x18, 0x18, 0x14}, + {0x30, 0x07, 0x22}, + {0x3e, 0x33, 0x21}, + {0x14, 0x37, 0x16}, + {0x16, 0x00, 0x12}, + {0x2c, 0x12, 0x2f}, + {0x25, 0x3f, 0x1e}, + {0x24, 0x19, 0x16}, + {0x16, 0x0f, 0x35}, + {0x2d, 0x10, 0x11}, + {0x24, 0x2a, 0x28}, + {0x19, 0x25, 0x2e}, + {0x0c, 0x16, 0x1f}, + {0x38, 0x21, 0x36}, + {0x3d, 0x1a, 0x2f}, + {0x3b, 0x32, 0x12}, + {0x36, 0x13, 0x29}, + {0x0e, 0x30, 0x31}, + {0x19, 0x07, 0x2f}, + {0x25, 0x23, 0x28}, + {0x20, 0x08, 0x29}, + {0x2a, 0x00, 0x30}, + {0x30, 0x38, 0x23}, + {0x1e, 0x0f, 0x1f}, + {0x3b, 0x1b, 0x30}, + {0x3a, 0x37, 0x2f}, + {0x39, 0x37, 0x35}, + {0x39, 0x2d, 0x2f}, + {0x1f, 0x2e, 0x1e}, + {0x1a, 0x2b, 0x1e}, + {0x14, 0x17, 0x20}, + {0x2f, 0x03, 0x11}, + {0x1d, 0x00, 0x30}, + {0x17, 0x2b, 0x1d}, + {0x35, 0x28, 0x25}, + {0x3b, 0x0f, 0x11}, + {0x09, 0x04, 0x2e}, + {0x23, 0x11, 0x1e}, + {0x13, 0x37, 0x1e}, + {0x37, 0x37, 0x1e}, + {0x07, 0x01, 0x32}, + {0x14, 0x06, 0x32}, + {0x11, 0x0c, 0x2e}, + {0x36, 0x2e, 0x24}, + {0x15, 0x2a, 0x1c}, + {0x22, 0x15, 0x34}, + {0x2c, 0x1e, 0x35}, + {0x22, 0x27, 0x33}, + {0x19, 0x3f, 0x2d}, + {0x21, 0x33, 0x15}, + {0x26, 0x1a, 0x11}, + {0x16, 0x3e, 0x12}, + {0x2b, 0x24, 0x15}, + {0x3c, 0x0f, 0x2d}, + {0x31, 0x15, 0x36}, + {0x3f, 0x24, 0x1d}, + {0x25, 0x01, 0x37}, + {0x33, 0x16, 0x1a}, + {0x1f, 0x0e, 0x10}, + {0x2f, 0x0b, 0x12}, + {0x2a, 0x1a, 0x25}, + {0x17, 0x0a, 0x35}, + {0x09, 0x28, 0x35}, + {0x02, 0x13, 0x36}, + {0x34, 0x2f, 0x17}, + {0x03, 0x04, 0x31}, + {0x3e, 0x26, 0x11}, + {0x35, 0x33, 0x31}, + {0x22, 0x17, 0x23}, + {0x1d, 0x05, 0x2b}, + {0x2e, 0x27, 0x20}, + {0x03, 0x2b, 0x1d}, + {0x01, 0x19, 0x1e}, + {0x0e, 0x05, 0x18}, + {0x16, 0x25, 0x17}, + {0x02, 0x28, 0x18}, + {0x19, 0x0b, 0x24}, + {0x3e, 0x35, 0x16}, + {0x2e, 0x29, 0x25}, + {0x3e, 0x38, 0x1e}, + {0x3a, 0x2f, 0x12}, + {0x14, 0x17, 0x2d}, + {0x11, 0x12, 0x30}, + {0x15, 0x31, 0x18}, + {0x08, 0x0b, 0x29}, + {0x2d, 0x00, 0x33}, + {0x2c, 0x06, 0x1a}, + {0x14, 0x1c, 0x2e}, + {0x04, 0x08, 0x12}, + {0x1b, 0x2b, 0x2d}, + {0x2a, 0x37, 0x33}, + {0x10, 0x27, 0x2c}, + {0x1d, 0x0e, 0x34}, + {0x20, 0x02, 0x12}, + {0x1e, 0x1a, 0x2e}, + {0x07, 0x0b, 0x10}, + {0x36, 0x1e, 0x33}, + {0x2b, 0x28, 0x1b}, + {0x31, 0x25, 0x1f}, + {0x38, 0x3a, 0x2f}, + {0x39, 0x30, 0x2f}, + {0x12, 0x09, 0x14}, + {0x0e, 0x08, 0x19}, + {0x00, 0x0d, 0x2c}, + {0x1b, 0x0e, 0x34}, + {0x11, 0x25, 0x15}, + {0x0c, 0x2d, 0x26}, + {0x36, 0x2c, 0x16}, + {0x31, 0x31, 0x2c}, + {0x03, 0x1a, 0x16}, + {0x1c, 0x32, 0x14}, + {0x0a, 0x3e, 0x36}, + {0x33, 0x1b, 0x27}, + {0x1f, 0x32, 0x18}, + {0x33, 0x26, 0x33}, + {0x1a, 0x13, 0x1a}, + {0x0f, 0x34, 0x1c}, + {0x35, 0x2c, 0x2f}, + {0x38, 0x03, 0x18}, + {0x15, 0x0f, 0x27}, + {0x31, 0x29, 0x20}, + {0x28, 0x0e, 0x28}, + {0x31, 0x2c, 0x2e}, + {0x15, 0x19, 0x1b}, + {0x10, 0x03, 0x2f}, + {0x2e, 0x2a, 0x32}, + {0x2a, 0x27, 0x1b}, + {0x36, 0x04, 0x1e}, + {0x3b, 0x04, 0x21}, + {0x07, 0x2f, 0x19}, + {0x27, 0x1d, 0x1d}, + {0x3c, 0x3d, 0x2e}, + {0x25, 0x08, 0x32}, + {0x3b, 0x34, 0x2a}, + {0x0c, 0x10, 0x13}, + {0x25, 0x35, 0x1a}, + {0x2f, 0x19, 0x28}, + {0x17, 0x00, 0x2b}, + {0x0a, 0x1c, 0x17}, + {0x0a, 0x11, 0x1b}, + {0x35, 0x13, 0x37}, + {0x29, 0x1c, 0x28}, + {0x0c, 0x31, 0x35}, + {0x3c, 0x10, 0x1a}, + {0x1b, 0x3a, 0x2d}, + {0x3a, 0x1c, 0x18}, + {0x22, 0x10, 0x2d}, + {0x1c, 0x3c, 0x12}, + {0x17, 0x18, 0x2a}, + {0x0b, 0x2b, 0x2f}, + {0x2d, 0x04, 0x2e}, + {0x3c, 0x13, 0x23}, + {0x01, 0x1c, 0x2e}, + {0x14, 0x16, 0x22}, + {0x0c, 0x24, 0x13}, + {0x35, 0x37, 0x34}, + {0x1b, 0x30, 0x1e}, + {0x3a, 0x1c, 0x20}, + {0x06, 0x06, 0x36}, + {0x09, 0x15, 0x1a}, + {0x1b, 0x1a, 0x27}, + {0x0f, 0x33, 0x35}, + {0x37, 0x06, 0x23}, + {0x3a, 0x12, 0x1d}, + {0x00, 0x16, 0x29}, + {0x0e, 0x1d, 0x35}, + {0x3f, 0x38, 0x16}, + {0x2a, 0x3c, 0x34}, + {0x13, 0x32, 0x10}, + {0x17, 0x2c, 0x37}, + {0x29, 0x2a, 0x1e}, + {0x35, 0x2f, 0x2d}, + {0x3c, 0x2a, 0x11}, + {0x28, 0x13, 0x21}, + {0x19, 0x1e, 0x34}, + {0x0c, 0x06, 0x2d}, + {0x09, 0x04, 0x1c}, + {0x1d, 0x2f, 0x26}, + {0x39, 0x07, 0x16}, + {0x14, 0x04, 0x2d}, + {0x3a, 0x2f, 0x2e}, + {0x29, 0x15, 0x35}, + {0x24, 0x02, 0x36}, + {0x3f, 0x02, 0x1a}, + {0x0f, 0x18, 0x24}, + {0x16, 0x1d, 0x19}, + {0x14, 0x16, 0x10}, + {0x29, 0x1b, 0x13}, + {0x15, 0x0e, 0x19}, + {0x3a, 0x2e, 0x2b}, + {0x08, 0x30, 0x15}, + {0x35, 0x16, 0x30}, + {0x2e, 0x18, 0x35}, + {0x3b, 0x0b, 0x1c}, + {0x3a, 0x18, 0x13}, + {0x29, 0x13, 0x1e}, + {0x20, 0x13, 0x27}, + {0x04, 0x1d, 0x34}, + {0x00, 0x38, 0x19}, + {0x08, 0x39, 0x32}, + {0x20, 0x10, 0x26}, + {0x08, 0x02, 0x28}, + {0x3f, 0x0f, 0x16}, + {0x30, 0x1f, 0x19}, + {0x20, 0x2d, 0x10}, + {0x38, 0x17, 0x1c}, + {0x18, 0x31, 0x27}, + {0x33, 0x38, 0x30}, + {0x16, 0x33, 0x23}, + {0x00, 0x01, 0x36}, + {0x0d, 0x02, 0x23}, + {0x39, 0x04, 0x1f}, + {0x0e, 0x30, 0x24}, + {0x06, 0x01, 0x2c}, + {0x34, 0x33, 0x35}, + {0x16, 0x34, 0x2e}, + {0x32, 0x16, 0x24}, + {0x26, 0x39, 0x34}, + {0x1f, 0x3c, 0x1d}, + {0x28, 0x1d, 0x37}, + {0x17, 0x15, 0x2b}, + {0x27, 0x39, 0x30}, + {0x0b, 0x1b, 0x18}, + {0x35, 0x20, 0x2d}, + {0x0b, 0x35, 0x1c}, + {0x03, 0x0e, 0x21}, + {0x06, 0x0c, 0x20}, + {0x02, 0x18, 0x34}, + {0x1e, 0x36, 0x2d}, + {0x16, 0x0c, 0x19}, + {0x25, 0x09, 0x2c}, + {0x37, 0x05, 0x2e}, + {0x2e, 0x2b, 0x2c}, + {0x24, 0x1a, 0x14}, + {0x27, 0x04, 0x10}, + {0x32, 0x38, 0x33}, + {0x37, 0x15, 0x35}, + {0x11, 0x3f, 0x1d}, + {0x23, 0x23, 0x1f}, + {0x29, 0x3f, 0x1d}, + {0x1a, 0x3c, 0x2b}, + {0x1b, 0x2c, 0x2c}, + {0x38, 0x3b, 0x36}, + {0x04, 0x13, 0x33}, + {0x2c, 0x14, 0x12}, + {0x1a, 0x09, 0x1b}, + {0x36, 0x11, 0x24}, + {0x3a, 0x3f, 0x11}, + {0x01, 0x0e, 0x2b}, + {0x3b, 0x03, 0x2a}, + {0x08, 0x0d, 0x2b}, + {0x2b, 0x13, 0x27}, + {0x3a, 0x3c, 0x1c}, + {0x3a, 0x15, 0x2a}, + {0x24, 0x00, 0x17}, + {0x3e, 0x0a, 0x15}, + {0x0c, 0x29, 0x2d}, + {0x1f, 0x15, 0x30}, + {0x35, 0x18, 0x19}, + {0x3d, 0x37, 0x37}, + {0x12, 0x38, 0x1b}, + {0x3b, 0x02, 0x20}, + {0x08, 0x21, 0x19}, + {0x2e, 0x36, 0x1d}, + {0x15, 0x3d, 0x24}, + {0x22, 0x0c, 0x27}, + {0x36, 0x3f, 0x33}, + {0x33, 0x12, 0x11}, + {0x1a, 0x19, 0x1f}, + {0x2b, 0x24, 0x12}, + {0x11, 0x2a, 0x18}, + {0x25, 0x32, 0x2a}, + {0x2c, 0x1a, 0x12}, + {0x26, 0x06, 0x10}, + {0x11, 0x29, 0x33}, + {0x2c, 0x09, 0x14}, + {0x2b, 0x12, 0x2b}, + {0x1d, 0x03, 0x24}, + {0x00, 0x12, 0x15}, + {0x22, 0x3d, 0x26}, + {0x15, 0x37, 0x1a}, + {0x0f, 0x12, 0x37}, + {0x24, 0x01, 0x18}, + {0x2a, 0x17, 0x13}, + {0x14, 0x3b, 0x29}, + {0x2a, 0x19, 0x32}, + {0x2d, 0x17, 0x17}, + {0x0b, 0x2c, 0x33}, + {0x07, 0x2d, 0x34}, + {0x07, 0x38, 0x1d}, + {0x1f, 0x36, 0x22}, + {0x11, 0x0a, 0x17}, + {0x14, 0x11, 0x13}, + {0x2a, 0x17, 0x25}, + {0x01, 0x3a, 0x1c}, + {0x26, 0x27, 0x30}, + {0x2d, 0x3b, 0x35}, + {0x3a, 0x30, 0x34}, + {0x06, 0x3a, 0x1c}, + {0x2d, 0x05, 0x13}, + {0x21, 0x32, 0x12}, + {0x3e, 0x1e, 0x2c}, + {0x3a, 0x3f, 0x2d}, + {0x20, 0x2a, 0x34}, + {0x26, 0x03, 0x1a}, + {0x19, 0x27, 0x2e}, + {0x31, 0x04, 0x26}, + {0x2a, 0x3f, 0x30}, + {0x25, 0x23, 0x2a}, + {0x08, 0x08, 0x35}, + {0x2c, 0x30, 0x1e}, + {0x08, 0x05, 0x18}, + {0x06, 0x09, 0x2d}, + {0x19, 0x00, 0x27}, + {0x0d, 0x10, 0x19}, + {0x1c, 0x00, 0x13}, + {0x3d, 0x0b, 0x24}, + {0x2e, 0x1f, 0x16}, + {0x3d, 0x18, 0x34}, + {0x12, 0x1e, 0x15}, + {0x15, 0x39, 0x25}, + {0x33, 0x0f, 0x17}, + {0x1a, 0x1c, 0x1b}, + {0x37, 0x29, 0x1b}, + {0x3b, 0x38, 0x12}, + {0x1d, 0x22, 0x34}, + {0x26, 0x0a, 0x31}, + {0x16, 0x2d, 0x13}, + {0x0d, 0x20, 0x27}, + {0x24, 0x1d, 0x16}, + {0x2e, 0x2b, 0x18}, + {0x16, 0x2a, 0x1b}, + {0x24, 0x17, 0x36}, + {0x02, 0x05, 0x2b}, + {0x37, 0x1a, 0x17}, + {0x11, 0x3d, 0x2c}, + {0x1e, 0x2f, 0x22}, + {0x2c, 0x29, 0x1a}, + {0x2f, 0x04, 0x25}, + {0x36, 0x0c, 0x35}, + {0x30, 0x3e, 0x12}, + {0x11, 0x30, 0x37}, + {0x12, 0x21, 0x2e}, + {0x21, 0x30, 0x17}, + {0x2c, 0x3d, 0x24}, + {0x11, 0x23, 0x14}, + {0x1a, 0x32, 0x17}, + {0x39, 0x27, 0x18}, + {0x0f, 0x24, 0x19}, + {0x00, 0x3d, 0x37}, + {0x2c, 0x3c, 0x1c}, + {0x0b, 0x39, 0x23}, + {0x0e, 0x04, 0x1f}, + {0x1c, 0x31, 0x14}, + {0x00, 0x04, 0x15}, + {0x26, 0x2a, 0x2a}, + {0x20, 0x25, 0x2a}, + {0x0b, 0x3c, 0x33}, + {0x11, 0x0b, 0x2e}, + {0x37, 0x22, 0x2e}, + {0x0e, 0x22, 0x26}, + {0x18, 0x2d, 0x27}, + {0x06, 0x0c, 0x1c}, + {0x26, 0x18, 0x2f}, + {0x3a, 0x01, 0x2a}, + {0x2f, 0x31, 0x34}, + {0x1f, 0x34, 0x1a}, + {0x31, 0x05, 0x10}, + {0x2e, 0x17, 0x34}, + {0x18, 0x22, 0x23}, + {0x23, 0x21, 0x32}, + {0x07, 0x08, 0x22}, + {0x26, 0x1c, 0x22}, + {0x31, 0x12, 0x2f}, + {0x08, 0x1f, 0x10}, + {0x27, 0x15, 0x2a}, + {0x1f, 0x0b, 0x26}, + {0x2f, 0x14, 0x35}, + {0x24, 0x1f, 0x26}, + {0x3b, 0x23, 0x33}, + {0x20, 0x3e, 0x2d}, + {0x17, 0x0c, 0x15}, + {0x13, 0x39, 0x1a}, + {0x30, 0x14, 0x25}, + {0x09, 0x07, 0x17}, + {0x38, 0x38, 0x1f}, + {0x29, 0x24, 0x27}, + {0x17, 0x27, 0x28}, + {0x1b, 0x12, 0x2a}, + {0x2b, 0x3d, 0x2d}, + {0x19, 0x34, 0x1c}, + {0x01, 0x1d, 0x10}, + {0x08, 0x39, 0x11}, + {0x0e, 0x36, 0x1b}, + {0x26, 0x13, 0x10}, + {0x16, 0x28, 0x1e}, + {0x3c, 0x28, 0x17}, + {0x3e, 0x39, 0x34}, + {0x0a, 0x03, 0x2e}, + {0x37, 0x1a, 0x13}, + {0x2b, 0x33, 0x26}, + {0x13, 0x2c, 0x21}, + {0x25, 0x14, 0x10}, + {0x16, 0x0b, 0x35}, + {0x1d, 0x35, 0x33}, + {0x21, 0x08, 0x33}, + {0x28, 0x21, 0x1a}, + {0x12, 0x0c, 0x1b}, + {0x36, 0x2a, 0x19}, + {0x2c, 0x2b, 0x23}, + {0x01, 0x0f, 0x26}, + {0x17, 0x0c, 0x18}, + {0x09, 0x0f, 0x11}, + {0x2b, 0x24, 0x1c}, + {0x09, 0x09, 0x15}, + {0x36, 0x08, 0x13}, + {0x20, 0x39, 0x21}, + {0x00, 0x3a, 0x1f}, + {0x2b, 0x36, 0x31}, + {0x02, 0x37, 0x13}, + {0x04, 0x34, 0x35}, + {0x37, 0x3d, 0x1a}, + {0x17, 0x3d, 0x13}, + {0x2b, 0x36, 0x2f}, + {0x13, 0x1e, 0x13}, + {0x3e, 0x11, 0x33}, + {0x27, 0x3a, 0x2d}, + {0x1e, 0x31, 0x1a}, + {0x03, 0x03, 0x2d}, + {0x25, 0x37, 0x1f}, + {0x11, 0x01, 0x22}, + {0x1c, 0x12, 0x17}, + {0x30, 0x3a, 0x30}, + {0x17, 0x1d, 0x29}, + {0x0e, 0x13, 0x27}, + {0x1a, 0x2e, 0x24}, + {0x2d, 0x00, 0x1c}, + {0x17, 0x28, 0x1d}, + {0x09, 0x1f, 0x2e}, + {0x1a, 0x2d, 0x26}, + {0x0a, 0x13, 0x32}, + {0x3e, 0x00, 0x27}, + {0x0b, 0x3b, 0x30}, + {0x08, 0x3a, 0x2d}, + {0x22, 0x12, 0x1e}, + {0x34, 0x1d, 0x2b}, + {0x26, 0x22, 0x35}, + {0x17, 0x2c, 0x17}, + {0x29, 0x13, 0x2d}, + {0x2d, 0x10, 0x10}, + {0x20, 0x31, 0x23}, + {0x1e, 0x33, 0x18}, + {0x33, 0x06, 0x2d}, + {0x26, 0x14, 0x27}, + {0x22, 0x1d, 0x2a}, + {0x2d, 0x06, 0x18}, + {0x07, 0x09, 0x2e}, + {0x21, 0x15, 0x2e}, + {0x21, 0x38, 0x23}, + {0x35, 0x0b, 0x34}, + {0x24, 0x0b, 0x22}, + {0x1e, 0x01, 0x17}, + {0x0b, 0x24, 0x11}, + {0x17, 0x07, 0x20}, + {0x14, 0x25, 0x32}, + {0x1a, 0x0e, 0x2f}, + {0x35, 0x17, 0x1f}, + {0x0c, 0x08, 0x21}, + {0x30, 0x35, 0x1f}, + {0x0c, 0x0b, 0x20}, + {0x04, 0x10, 0x11}, + {0x35, 0x11, 0x1e}, + {0x33, 0x3d, 0x16}, + {0x1e, 0x2b, 0x1d}, + {0x1a, 0x19, 0x10}, + {0x04, 0x06, 0x22}, + {0x03, 0x3d, 0x24}, + {0x2a, 0x0e, 0x35}, + {0x03, 0x3e, 0x17}, + {0x0b, 0x18, 0x36}, + {0x3d, 0x0d, 0x26}, + {0x35, 0x12, 0x20}, + {0x1f, 0x0d, 0x16}, + {0x23, 0x32, 0x1a}, + {0x00, 0x3d, 0x26}, + {0x30, 0x19, 0x36}, + {0x12, 0x0e, 0x23}, + {0x01, 0x23, 0x28}, + {0x3b, 0x31, 0x11}, + {0x2d, 0x1c, 0x36}, + {0x2a, 0x05, 0x16}, + {0x14, 0x0e, 0x30}, + {0x3a, 0x37, 0x19}, + {0x1f, 0x30, 0x25}, + {0x10, 0x26, 0x2f}, + {0x22, 0x11, 0x1f}, + {0x2e, 0x2b, 0x1e}, + {0x16, 0x16, 0x21}, + {0x32, 0x18, 0x35}, + {0x23, 0x32, 0x1a}, + {0x3d, 0x0d, 0x19}, + {0x39, 0x09, 0x23}, + {0x30, 0x2e, 0x24}, + {0x1e, 0x0f, 0x24}, + {0x09, 0x21, 0x31}, + {0x05, 0x03, 0x11}, + {0x05, 0x22, 0x2a}, + {0x03, 0x07, 0x37}, + {0x04, 0x08, 0x13}, + {0x05, 0x10, 0x34}, + {0x37, 0x14, 0x29}, + {0x0a, 0x24, 0x32}, + {0x34, 0x1e, 0x1b}, + {0x12, 0x17, 0x2e}, + {0x01, 0x02, 0x13}, + {0x0a, 0x0c, 0x11}, + {0x02, 0x14, 0x13}, + {0x0d, 0x25, 0x23}, + {0x00, 0x07, 0x1a}, + {0x1c, 0x28, 0x35}, + {0x08, 0x0e, 0x2c}, + {0x1b, 0x3c, 0x15}, + {0x1c, 0x19, 0x1d}, + {0x32, 0x13, 0x1a}, + {0x1c, 0x00, 0x37}, + {0x22, 0x1b, 0x35}, + {0x39, 0x3e, 0x14}, + {0x32, 0x06, 0x31}, + {0x17, 0x05, 0x2b}, + {0x01, 0x0f, 0x20}, + {0x1e, 0x0f, 0x34}, + {0x18, 0x03, 0x1f}, + {0x2b, 0x00, 0x14}, + {0x15, 0x3a, 0x30}, + {0x25, 0x30, 0x21}, + {0x0b, 0x00, 0x37}, + {0x24, 0x37, 0x1d}, + {0x29, 0x21, 0x16}, + {0x24, 0x0f, 0x2c}, + {0x3e, 0x15, 0x36}, + {0x3c, 0x2d, 0x23}, + {0x3d, 0x3c, 0x17}, + {0x1a, 0x1c, 0x13}, + {0x0a, 0x29, 0x22}, + {0x25, 0x3f, 0x26}, + {0x3b, 0x39, 0x2f}, + {0x1d, 0x08, 0x16}, + {0x0b, 0x19, 0x14}, + {0x12, 0x01, 0x2c}, + {0x35, 0x11, 0x2a}, + {0x02, 0x00, 0x13}, + {0x39, 0x2a, 0x35}, + {0x07, 0x1a, 0x11}, + {0x24, 0x0e, 0x1e}, + {0x0e, 0x2c, 0x15}, + {0x08, 0x31, 0x1b}, + {0x21, 0x1d, 0x26}, + {0x1d, 0x1c, 0x2a}, + {0x1d, 0x24, 0x13}, + {0x01, 0x00, 0x18}, + {0x28, 0x2a, 0x37}, + {0x15, 0x0f, 0x13}, + {0x10, 0x32, 0x36}, + {0x22, 0x13, 0x31}, + {0x13, 0x05, 0x1e}, + {0x17, 0x35, 0x35}, + {0x3b, 0x0e, 0x24}, + {0x35, 0x3a, 0x1d}, + {0x1b, 0x36, 0x1b}, + {0x03, 0x1d, 0x24}, + {0x0f, 0x16, 0x30}, + {0x2d, 0x09, 0x25}, + {0x05, 0x21, 0x13}, + {0x0a, 0x27, 0x36}, + {0x04, 0x0d, 0x1c}, + {0x06, 0x3e, 0x21}, + {0x2a, 0x27, 0x33}, + {0x28, 0x0e, 0x15}, + {0x0b, 0x17, 0x1d}, + {0x1d, 0x32, 0x2d}, + {0x08, 0x3d, 0x29}, + {0x21, 0x32, 0x17}, + {0x33, 0x31, 0x22}, + {0x0e, 0x03, 0x21}, + {0x0d, 0x0b, 0x16}, + {0x3e, 0x2a, 0x2e}, + {0x19, 0x36, 0x2a}, + {0x0d, 0x00, 0x14}, + {0x22, 0x07, 0x36}, + {0x0a, 0x09, 0x15}, + {0x14, 0x10, 0x22}, + {0x07, 0x16, 0x2c}, + {0x36, 0x13, 0x15}, + {0x09, 0x2f, 0x1b}, + {0x20, 0x3b, 0x2e}, + {0x3a, 0x3a, 0x16}, + {0x0d, 0x15, 0x2a}, + {0x39, 0x13, 0x2b}, + {0x0b, 0x01, 0x2a}, + {0x13, 0x17, 0x1e}, + {0x08, 0x17, 0x1e}, + {0x0c, 0x0f, 0x34}, + {0x1f, 0x31, 0x12}, + {0x07, 0x3a, 0x1d}, + {0x35, 0x1e, 0x12}, + {0x24, 0x2c, 0x15}, + {0x0e, 0x21, 0x19}, + {0x34, 0x3b, 0x33}, + {0x19, 0x0f, 0x28}, + {0x10, 0x2f, 0x2e}, + {0x23, 0x27, 0x31}, + {0x39, 0x2e, 0x18}, + {0x3c, 0x3f, 0x24}, + {0x07, 0x23, 0x30}, + {0x28, 0x13, 0x35}, + {0x13, 0x0a, 0x10}, + {0x35, 0x19, 0x33}, + {0x23, 0x28, 0x29}, + {0x13, 0x2f, 0x1a}, + {0x3a, 0x19, 0x14}, + {0x37, 0x36, 0x26}, + {0x20, 0x3b, 0x15}, + {0x37, 0x39, 0x10}, + {0x3c, 0x21, 0x34}, + {0x1c, 0x38, 0x30}, + {0x15, 0x07, 0x26}, + {0x27, 0x21, 0x19}, + {0x18, 0x11, 0x23}, + {0x30, 0x28, 0x37}, + {0x32, 0x2d, 0x1f}, + {0x2c, 0x3f, 0x30}, + {0x1d, 0x2f, 0x26}, + {0x01, 0x11, 0x1c}, + {0x3b, 0x0f, 0x12}, + {0x2a, 0x17, 0x27}, + {0x05, 0x00, 0x1b}, + {0x25, 0x1c, 0x32}, + {0x04, 0x22, 0x2d}, + {0x10, 0x0f, 0x25}, + {0x0d, 0x39, 0x30}, + {0x0b, 0x2e, 0x27}, + {0x2d, 0x34, 0x15}, + {0x3e, 0x30, 0x36}, + {0x16, 0x26, 0x2a}, + {0x05, 0x3f, 0x2b}, + {0x20, 0x3b, 0x2e}, + {0x3b, 0x1c, 0x2f}, + {0x01, 0x18, 0x16}, + {0x16, 0x3d, 0x10}, + {0x0a, 0x1f, 0x18}, + {0x17, 0x0f, 0x22}, + {0x06, 0x13, 0x11}, + {0x38, 0x21, 0x17}, + {0x17, 0x0a, 0x37}, + {0x1c, 0x19, 0x30}, + {0x16, 0x38, 0x31}, + {0x30, 0x10, 0x36}, + {0x31, 0x2f, 0x26}, + {0x3c, 0x1b, 0x23}, + {0x33, 0x2f, 0x19}, + {0x16, 0x35, 0x25}, + {0x3a, 0x18, 0x1f}, + {0x37, 0x01, 0x1e}, + {0x0d, 0x18, 0x12}, + {0x1f, 0x1c, 0x1b}, + {0x07, 0x34, 0x2d}, + {0x0b, 0x3f, 0x33}, + {0x1e, 0x34, 0x1d}, + {0x2c, 0x13, 0x2c}, + {0x20, 0x20, 0x13}, + {0x20, 0x0f, 0x31}, + {0x08, 0x0f, 0x24}, + {0x18, 0x3d, 0x1c}, + {0x36, 0x34, 0x27}, + {0x33, 0x2a, 0x25}, + {0x2d, 0x30, 0x26}, + {0x3d, 0x37, 0x26}, + {0x25, 0x11, 0x11}, + {0x03, 0x05, 0x18}, + {0x10, 0x04, 0x29}, + {0x07, 0x2e, 0x36}, + {0x2a, 0x29, 0x15}, + {0x3a, 0x0e, 0x33}, + {0x2a, 0x06, 0x29}, + {0x3d, 0x01, 0x29}, + {0x27, 0x0e, 0x16}, + {0x1d, 0x28, 0x1b}, + {0x10, 0x33, 0x2b}, + {0x0c, 0x14, 0x1d}, + {0x15, 0x3f, 0x25}, + {0x37, 0x23, 0x1e}, + {0x04, 0x2c, 0x1c}, + {0x15, 0x34, 0x2a}, + {0x09, 0x2f, 0x15}, + {0x02, 0x3f, 0x14}, + {0x19, 0x2c, 0x33}, + {0x39, 0x32, 0x20}, + {0x2a, 0x18, 0x32}, + {0x17, 0x23, 0x21}, + {0x0b, 0x2d, 0x25}, + {0x24, 0x3a, 0x2d}, + {0x31, 0x3f, 0x34}, + {0x18, 0x19, 0x24}, + {0x1e, 0x15, 0x1a}, + {0x17, 0x33, 0x2b}, + {0x23, 0x09, 0x26}, + {0x1b, 0x0d, 0x15}, + {0x36, 0x26, 0x28}, + {0x3a, 0x1c, 0x14}, + {0x0c, 0x3e, 0x10}, + {0x18, 0x06, 0x35}, + {0x37, 0x26, 0x36}, + {0x21, 0x26, 0x17}, + {0x3d, 0x1c, 0x2c}, + {0x16, 0x25, 0x1d}, + {0x1e, 0x0b, 0x1e}, + {0x1d, 0x0d, 0x32}, + {0x08, 0x1f, 0x1b}, + {0x12, 0x1c, 0x12}, + {0x20, 0x2a, 0x28}, + {0x06, 0x3b, 0x35}, + {0x39, 0x0e, 0x1e}, + {0x31, 0x30, 0x28}, + {0x02, 0x21, 0x14}, + {0x06, 0x1e, 0x29}, + {0x16, 0x09, 0x1c}, + {0x27, 0x32, 0x2d}, + {0x39, 0x03, 0x27}, + {0x29, 0x09, 0x1e}, + {0x1b, 0x11, 0x1c}, + {0x28, 0x3a, 0x2c}, + {0x03, 0x03, 0x18}, + {0x23, 0x09, 0x2f}, + {0x30, 0x17, 0x23}, + {0x0f, 0x25, 0x33}, + {0x06, 0x24, 0x37}, + {0x22, 0x09, 0x33}, + {0x2c, 0x09, 0x2a}, + {0x0c, 0x12, 0x2a}, + {0x28, 0x20, 0x10}, + {0x15, 0x29, 0x33}, + {0x0f, 0x1a, 0x13}, + {0x13, 0x18, 0x36}, + {0x2e, 0x16, 0x13}, + {0x3c, 0x1a, 0x15}, + {0x3a, 0x11, 0x32}, + {0x02, 0x0a, 0x2c}, + {0x19, 0x39, 0x11}, + {0x31, 0x3e, 0x1d}, + {0x32, 0x14, 0x32}, + {0x12, 0x2e, 0x34}, + {0x3e, 0x36, 0x23}, + {0x37, 0x3e, 0x15}, + {0x15, 0x35, 0x34}, + {0x01, 0x3a, 0x2c}, + {0x26, 0x25, 0x22}, + {0x01, 0x2b, 0x37}, + {0x1c, 0x3d, 0x33}, + {0x3e, 0x10, 0x1c}, + {0x26, 0x33, 0x19}, + {0x05, 0x19, 0x17}, + {0x12, 0x38, 0x1c}, + {0x15, 0x3c, 0x32}, + {0x3f, 0x0f, 0x37}, + {0x02, 0x39, 0x32}, + {0x13, 0x00, 0x1d}, + {0x1d, 0x2c, 0x10}, + {0x39, 0x13, 0x31}, + {0x0f, 0x37, 0x19}, + {0x09, 0x0d, 0x2a}, + {0x20, 0x2f, 0x32}, + {0x3b, 0x34, 0x22}, + {0x26, 0x14, 0x10}, + {0x24, 0x3d, 0x22}, + {0x0b, 0x31, 0x23}, + {0x2f, 0x2d, 0x2a}, + {0x30, 0x04, 0x35}, + {0x19, 0x20, 0x2a}, + {0x16, 0x36, 0x37}, + {0x14, 0x28, 0x37}, + {0x11, 0x0b, 0x27}, + {0x1d, 0x06, 0x29}, + {0x35, 0x16, 0x2e}, + {0x24, 0x2e, 0x29}, + {0x36, 0x14, 0x2a}, + {0x21, 0x0c, 0x1f}, + {0x3f, 0x39, 0x19}, + {0x27, 0x10, 0x2a}, + {0x1e, 0x12, 0x34}, + {0x10, 0x24, 0x34}, + {0x1d, 0x13, 0x1d}, + {0x17, 0x16, 0x37}, + {0x27, 0x1b, 0x27}, + {0x07, 0x24, 0x21}, + {0x37, 0x21, 0x11}, + {0x37, 0x28, 0x24}, + {0x19, 0x02, 0x1c}, + {0x14, 0x12, 0x1d}, + {0x1b, 0x24, 0x2e}, + {0x2e, 0x3a, 0x15}, + {0x37, 0x34, 0x21}, + {0x33, 0x2d, 0x29}, + {0x2f, 0x1e, 0x34}, + {0x29, 0x3c, 0x12}, + {0x05, 0x15, 0x20}, + {0x05, 0x3e, 0x19}, + {0x18, 0x0b, 0x30}, + {0x2f, 0x02, 0x27}, + {0x14, 0x1c, 0x34}, + {0x12, 0x20, 0x30}, + {0x2b, 0x22, 0x1b}, + {0x06, 0x31, 0x28}, + {0x15, 0x2d, 0x12}, + {0x01, 0x0e, 0x13}, + {0x13, 0x0c, 0x28}, + {0x07, 0x2a, 0x14}, + {0x1d, 0x36, 0x14}, + {0x15, 0x2b, 0x26}, + {0x03, 0x25, 0x15}, + {0x3e, 0x3b, 0x20}, + {0x35, 0x0c, 0x25}, + {0x2b, 0x16, 0x35}, + {0x1e, 0x31, 0x2c}, + {0x06, 0x03, 0x29}, + {0x24, 0x07, 0x1f}, + {0x32, 0x2f, 0x19}, + {0x25, 0x21, 0x31}, + {0x22, 0x26, 0x1d}, + {0x00, 0x1b, 0x18}, + {0x2a, 0x24, 0x31}, + {0x20, 0x06, 0x2f}, + {0x1e, 0x32, 0x26}, + {0x32, 0x39, 0x12}, + {0x20, 0x01, 0x19}, + {0x0f, 0x15, 0x15}, + {0x27, 0x10, 0x2e}, + {0x09, 0x25, 0x19}, + {0x29, 0x37, 0x30}, + {0x13, 0x1c, 0x1d}, + {0x29, 0x2d, 0x26}, + {0x02, 0x1a, 0x16}, + {0x1d, 0x2b, 0x1c}, + {0x18, 0x04, 0x34}, + {0x28, 0x2a, 0x21}, + {0x15, 0x1b, 0x2e}, + {0x16, 0x01, 0x10}, + {0x05, 0x09, 0x14}, + {0x22, 0x03, 0x22}, + {0x02, 0x1b, 0x34}, + {0x29, 0x2a, 0x23}, + {0x26, 0x36, 0x13}, + {0x23, 0x3d, 0x1a}, + {0x1d, 0x10, 0x24}, + {0x25, 0x2b, 0x37}, + {0x19, 0x24, 0x26}, + {0x28, 0x13, 0x16}, + {0x17, 0x14, 0x19}, + {0x0b, 0x2f, 0x25}, + {0x37, 0x34, 0x37}, + {0x39, 0x21, 0x1b}, + {0x0f, 0x3d, 0x2d}, + {0x0d, 0x10, 0x20}, + {0x05, 0x0b, 0x2d}, + {0x01, 0x12, 0x24}, + {0x18, 0x3d, 0x32}, + {0x09, 0x21, 0x26}, + {0x1a, 0x0e, 0x1f}, + {0x30, 0x06, 0x1f}, + {0x0b, 0x3c, 0x29}, + {0x07, 0x3e, 0x27}, + {0x13, 0x1e, 0x1a}, + {0x13, 0x07, 0x23}, + {0x10, 0x34, 0x1e}, + {0x32, 0x17, 0x23}, + {0x35, 0x16, 0x31}, + {0x32, 0x2e, 0x1b}, + {0x28, 0x0e, 0x22}, + {0x14, 0x3a, 0x23}, + {0x22, 0x03, 0x29}, + {0x2a, 0x10, 0x20}, + {0x3e, 0x3c, 0x27}, + {0x16, 0x20, 0x12}, + {0x3f, 0x24, 0x31}, + {0x0d, 0x2e, 0x32}, + {0x2f, 0x17, 0x2d}, + {0x36, 0x3b, 0x17}, + {0x24, 0x23, 0x18}, + {0x37, 0x1d, 0x13}, + {0x17, 0x3a, 0x1a}, + {0x0a, 0x3d, 0x1e}, + {0x05, 0x12, 0x16}, + {0x33, 0x32, 0x25}, + {0x1d, 0x1f, 0x29}, + {0x34, 0x2c, 0x26}, + {0x20, 0x29, 0x35}, + {0x0e, 0x32, 0x17}, + {0x01, 0x39, 0x2d}, + {0x27, 0x24, 0x23}, + {0x28, 0x3f, 0x18}, + {0x39, 0x38, 0x25}, + {0x23, 0x11, 0x11}, + {0x19, 0x2c, 0x29}, + {0x30, 0x08, 0x28}, + {0x25, 0x27, 0x1d}, + {0x17, 0x25, 0x21}, + {0x09, 0x3d, 0x16}, + {0x1b, 0x0f, 0x2c}, + {0x1b, 0x12, 0x22}, + {0x28, 0x3e, 0x26}, + {0x34, 0x10, 0x1b}, + {0x02, 0x34, 0x15}, + {0x1a, 0x29, 0x19}, + {0x29, 0x11, 0x31}, + {0x12, 0x27, 0x17}, + {0x27, 0x27, 0x2f}, + {0x34, 0x27, 0x24}, + {0x03, 0x19, 0x36}, + {0x17, 0x1d, 0x33}, + {0x19, 0x25, 0x1a}, + {0x2b, 0x39, 0x13}, + {0x3b, 0x33, 0x1d}, + {0x27, 0x31, 0x34}, + {0x28, 0x33, 0x37}, + {0x09, 0x30, 0x1b}, + {0x03, 0x3a, 0x27}, + {0x19, 0x11, 0x1f}, + {0x0b, 0x1a, 0x34}, + {0x3d, 0x2a, 0x15}, + {0x04, 0x24, 0x36}, + {0x30, 0x23, 0x30}, + {0x0f, 0x22, 0x1b}, + {0x3d, 0x3d, 0x24}, + {0x29, 0x1d, 0x12}, + {0x16, 0x19, 0x2e}, + {0x03, 0x12, 0x17}, + {0x18, 0x25, 0x33}, + {0x2f, 0x23, 0x1a}, + {0x1a, 0x35, 0x27}, + {0x21, 0x26, 0x19}, + {0x1b, 0x30, 0x18}, + {0x2b, 0x22, 0x2d}, + {0x2c, 0x1a, 0x34}, + {0x3e, 0x12, 0x19}, + {0x28, 0x27, 0x15}, + {0x1b, 0x11, 0x12}, + {0x17, 0x15, 0x10}, + {0x34, 0x37, 0x25}, + {0x12, 0x3f, 0x15}, + {0x31, 0x0d, 0x37}, + {0x3e, 0x2a, 0x2d}, + {0x0f, 0x24, 0x24}, + {0x3c, 0x3f, 0x1f}, + {0x1d, 0x34, 0x17}, + {0x1a, 0x23, 0x1f}, + {0x37, 0x0f, 0x10}, + {0x32, 0x34, 0x35}, + {0x19, 0x05, 0x22}, + {0x33, 0x16, 0x34}, + {0x1e, 0x14, 0x1e}, + {0x08, 0x13, 0x29}, + {0x3a, 0x37, 0x30}, + {0x1d, 0x36, 0x15}, + {0x29, 0x2e, 0x1d}, + {0x32, 0x2e, 0x23}, + {0x35, 0x17, 0x1c}, + {0x36, 0x1d, 0x13}, + {0x23, 0x34, 0x34}, + {0x24, 0x1a, 0x37}, + {0x2f, 0x26, 0x2e}, + {0x1e, 0x17, 0x1a}, + {0x1f, 0x15, 0x1f}, + {0x2b, 0x1f, 0x19}, + {0x0a, 0x33, 0x1a}, + {0x35, 0x31, 0x24}, + {0x2d, 0x17, 0x2c}, + {0x0c, 0x21, 0x36}, + {0x2c, 0x35, 0x35}, + {0x1b, 0x03, 0x27}, + {0x01, 0x0d, 0x1d}, + {0x1c, 0x0e, 0x11}, + {0x11, 0x2b, 0x10}, + {0x25, 0x3b, 0x20}, + {0x1f, 0x17, 0x19}, + {0x20, 0x08, 0x36}, + {0x13, 0x38, 0x19}, + {0x1b, 0x2b, 0x24}, + {0x0b, 0x1f, 0x29}, + {0x27, 0x15, 0x2c}, + {0x37, 0x39, 0x10}, + {0x3a, 0x15, 0x2e}, + {0x2f, 0x11, 0x36}, + {0x24, 0x04, 0x20}, + {0x3b, 0x2a, 0x35}, + {0x27, 0x35, 0x34}, + {0x0d, 0x1b, 0x20}, + {0x10, 0x22, 0x37}, + {0x1f, 0x38, 0x27}, + {0x31, 0x0f, 0x28}, + {0x28, 0x25, 0x15}, + {0x00, 0x1d, 0x25}, + {0x31, 0x28, 0x28}, + {0x0b, 0x3a, 0x1d}, + {0x2d, 0x13, 0x1b}, + {0x03, 0x37, 0x2e}, + {0x1d, 0x28, 0x19}, + {0x08, 0x2d, 0x22}, + {0x27, 0x39, 0x32}, + {0x3f, 0x2f, 0x1d}, + {0x33, 0x34, 0x28}, + {0x18, 0x08, 0x31}, + {0x23, 0x1f, 0x13}, + {0x0d, 0x2c, 0x23}, + {0x3a, 0x2d, 0x1a}, + {0x02, 0x25, 0x13}, + {0x20, 0x36, 0x34}, + {0x12, 0x2b, 0x2d}, + {0x35, 0x35, 0x34}, + {0x23, 0x20, 0x21}, + {0x3a, 0x19, 0x1b}, + {0x1f, 0x2b, 0x19}, + {0x35, 0x0e, 0x19}, + {0x26, 0x24, 0x37}, + {0x18, 0x08, 0x10}, + {0x0c, 0x16, 0x2d}, + {0x1f, 0x34, 0x21}, + {0x05, 0x38, 0x19}, + {0x14, 0x21, 0x24}, + {0x11, 0x31, 0x14}, + {0x3e, 0x38, 0x29}, + {0x3f, 0x08, 0x25}, + {0x2a, 0x1f, 0x25}, + {0x25, 0x06, 0x28}, + {0x0b, 0x1e, 0x14}, + {0x1a, 0x38, 0x22}, + {0x24, 0x18, 0x29}, + {0x1a, 0x11, 0x20}, + {0x3b, 0x3a, 0x1e}, + {0x1c, 0x26, 0x1a}, + {0x05, 0x32, 0x19}, + {0x39, 0x2a, 0x31}, + {0x09, 0x07, 0x25}, + {0x05, 0x3e, 0x16}, + {0x34, 0x26, 0x14}, + {0x1b, 0x32, 0x26}, + {0x05, 0x08, 0x37}, + {0x0f, 0x03, 0x20}, + {0x2a, 0x39, 0x31}, + {0x08, 0x01, 0x1e}, + {0x1d, 0x23, 0x31}, + {0x28, 0x1b, 0x28}, + {0x1e, 0x37, 0x14}, + {0x13, 0x0e, 0x28}, + {0x2a, 0x3b, 0x37}, + {0x2f, 0x1c, 0x28}, + {0x30, 0x30, 0x1a}, + {0x36, 0x1f, 0x16}, + {0x3e, 0x0d, 0x15}, + {0x2e, 0x16, 0x18}, + {0x15, 0x37, 0x20}, + {0x2a, 0x33, 0x30}, + {0x2b, 0x0e, 0x25}, + {0x18, 0x20, 0x16}, + {0x02, 0x19, 0x25}, + {0x0a, 0x2e, 0x30}, + {0x16, 0x03, 0x11}, + {0x04, 0x27, 0x25}, + {0x1b, 0x1c, 0x21}, + {0x29, 0x04, 0x27}, + {0x3d, 0x20, 0x1e}, + {0x28, 0x33, 0x31}, + {0x1e, 0x39, 0x10}, + {0x31, 0x29, 0x1e}, + {0x06, 0x25, 0x28}, + {0x19, 0x3b, 0x12}, + {0x0b, 0x1b, 0x1c}, + {0x3e, 0x37, 0x20}, + {0x0a, 0x37, 0x33}, + {0x02, 0x2c, 0x25}, + {0x15, 0x18, 0x14}, + {0x3b, 0x20, 0x1c}, + {0x22, 0x3b, 0x1c}, + {0x24, 0x34, 0x35}, + {0x0f, 0x2f, 0x31}, + {0x3b, 0x17, 0x35}, + {0x30, 0x39, 0x37}, + {0x0d, 0x15, 0x11}, + {0x10, 0x03, 0x1e}, + {0x1a, 0x39, 0x33}, + {0x2f, 0x2e, 0x28}, + {0x1c, 0x28, 0x36}, + {0x28, 0x18, 0x1f}, + {0x15, 0x01, 0x30}, + {0x3e, 0x32, 0x28}, + {0x34, 0x2f, 0x23}, + {0x07, 0x0c, 0x36}, + {0x28, 0x2c, 0x34}, + {0x2a, 0x0c, 0x1f}, + {0x3f, 0x20, 0x13}, + {0x2b, 0x17, 0x27}, + {0x28, 0x29, 0x2a}, + {0x3c, 0x13, 0x36}, + {0x26, 0x2d, 0x2a}, + {0x0a, 0x06, 0x1e}, + {0x20, 0x04, 0x1a}, + {0x02, 0x07, 0x35}, + {0x0e, 0x18, 0x30}, + {0x00, 0x34, 0x34}, + {0x2f, 0x14, 0x37}, + {0x21, 0x30, 0x1f}, + {0x15, 0x37, 0x1b}, + {0x3a, 0x0b, 0x32}, + {0x22, 0x22, 0x21}, + {0x1b, 0x35, 0x23}, + {0x0d, 0x03, 0x1c}, + {0x23, 0x3b, 0x13}, + {0x0e, 0x1d, 0x1f}, + {0x1d, 0x3f, 0x2e}, + {0x39, 0x27, 0x2e}, + {0x0f, 0x38, 0x20}, + {0x31, 0x3c, 0x35}, + {0x0b, 0x0f, 0x2e}, + {0x06, 0x06, 0x28}, + {0x25, 0x39, 0x23}, + {0x0a, 0x32, 0x15}, + {0x0f, 0x1d, 0x25}, + {0x0c, 0x0d, 0x34}, + {0x12, 0x2e, 0x21}, + {0x36, 0x18, 0x1f}, + {0x1f, 0x34, 0x1b}, + {0x05, 0x3a, 0x36}, + {0x2b, 0x01, 0x17}, + {0x0e, 0x16, 0x2b}, + {0x0e, 0x0b, 0x26}, + {0x0d, 0x2d, 0x10}, + {0x21, 0x11, 0x27}, + {0x3d, 0x13, 0x32}, + {0x15, 0x25, 0x2a}, + {0x1b, 0x2d, 0x35}, + {0x2c, 0x2b, 0x26}, + {0x26, 0x1f, 0x20}, + {0x22, 0x2b, 0x12}, + {0x3f, 0x3d, 0x27}, + {0x30, 0x0a, 0x36}, + {0x35, 0x1f, 0x17}, + {0x21, 0x08, 0x29}, + {0x1d, 0x20, 0x33}, + {0x34, 0x11, 0x16}, + {0x05, 0x38, 0x2d} +}; + +void ApplyImageProcessingEffects(struct ImageProcessingContext *context) +{ + gCanvasPixels = context->canvasPixels; + gCanvasMonPersonality = context->personality; + gCanvasColumnStart = context->columnStart; + gCanvasRowStart = context->rowStart; + gCanvasColumnEnd = context->columnEnd; + gCanvasRowEnd = context->rowEnd; + gCanvasWidth = context->canvasWidth; + gCanvasHeight = context->canvasHeight; + + switch (context->effect) + { + case IMAGE_EFFECT_POINTILLISM: + ApplyImageEffect_Pointillism(); + break; + case IMAGE_EFFECT_BLUR: + ApplyImageEffect_Blur(); + break; + case IMAGE_EFFECT_OUTLINE_COLORED: + ApplyImageEffect_BlackOutline(); + ApplyImageEffect_PersonalityColor(gCanvasMonPersonality); + break; + case IMAGE_EFFECT_INVERT_BLACK_WHITE: + ApplyImageEffect_BlackOutline(); + ApplyImageEffect_Invert(); + ApplyImageEffect_BlackAndWhite(); + case IMAGE_EFFECT_INVERT: + ApplyImageEffect_Invert(); + break; + case IMAGE_EFFECT_THICK_BLACK_WHITE: + ApplyImageEffect_BlackOutline(); + ApplyImageEffect_BlurRight(); + ApplyImageEffect_BlurRight(); + ApplyImageEffect_BlurDown(); + ApplyImageEffect_BlackAndWhite(); + break; + case IMAGE_EFFECT_SHIMMER: + ApplyImageEffect_Shimmer(); + break; + case IMAGE_EFFECT_OUTLINE: + ApplyImageEffect_BlackOutline(); + break; + case IMAGE_EFFECT_BLUR_RIGHT: + ApplyImageEffect_BlurRight(); + break; + case IMAGE_EFFECT_BLUR_DOWN: + ApplyImageEffect_BlurDown(); + break; + case IMAGE_EFFECT_GRAYSCALE_LIGHT: + ApplyImageEffect_Grayscale(); + ApplyImageEffect_RedChannelGrayscale(3); + break; + case IMAGE_EFFECT_CHARCOAL: + ApplyImageEffect_BlackOutline(); + ApplyImageEffect_BlurRight(); + ApplyImageEffect_BlurDown(); + ApplyImageEffect_BlackAndWhite(); + ApplyImageEffect_Blur(); + ApplyImageEffect_Blur(); + ApplyImageEffect_RedChannelGrayscale(2); + ApplyImageEffect_RedChannelGrayscaleHighlight(4); + break; + } +} + +static void ApplyImageEffect_RedChannelGrayscale(u8 delta) +{ + u8 i, j; + + for (j = 0; j < gCanvasRowEnd; j++) + { + u16 *pixelRow = &(*gCanvasPixels)[0][(gCanvasRowStart + j) * gCanvasWidth]; + u16 *pixel = &pixelRow[gCanvasColumnStart]; + for (i = 0; i < gCanvasColumnEnd; i++, pixel++) + { + if (!(0x8000 & *pixel)) + { + // Gets the grayscale value, based on the pixel's red channel. + // Also adds a delta to skew lighter or darker. + u8 grayValue = (31 & *pixel); + grayValue += delta; + if (grayValue > 31) + grayValue = 31; + + *pixel = RGB2(grayValue, grayValue, grayValue); + } + } + } +} + +static void ApplyImageEffect_RedChannelGrayscaleHighlight(u8 highlight) +{ + u8 i, j; + + for (j = 0; j < gCanvasRowEnd; j++) + { + u16 *pixelRow = &(*gCanvasPixels)[0][(gCanvasRowStart + j) * gCanvasWidth]; + u16 *pixel = &pixelRow[gCanvasColumnStart]; + for (i = 0; i < gCanvasColumnEnd; i++, pixel++) + { + if (!(0x8000 & *pixel)) + { + u8 grayValue = (31 & *pixel); + if (grayValue > 31 - highlight) + grayValue = 31 - (highlight >> 1); + + *pixel = RGB2(grayValue, grayValue, grayValue); + } + } + } +} + +static void ApplyImageEffect_Pointillism(void) +{ + u32 i; + for (i = 0; i < NELEMS(sPointillismPoints); i++) + AddPointillismPoints(i); +} + +static void ApplyImageEffect_Grayscale(void) +{ + u8 i, j; + + for (j = 0; j < gCanvasRowEnd; j++) + { + u16 *pixelRow = &(*gCanvasPixels)[0][(gCanvasRowStart + j) * gCanvasWidth]; + u16 *pixel = &pixelRow[gCanvasColumnStart]; + for (i = 0; i < gCanvasColumnEnd; i++, pixel++) + { + if (!(0x8000 & *pixel)) + *pixel = ConvertColorToGrayscale(pixel); + } + } +} + +static void ApplyImageEffect_Blur(void) +{ + u8 i, j; + + for (i = 0; i < gCanvasColumnEnd; i++) + { + u16 *pixelRow = &(*gCanvasPixels)[0][gCanvasRowStart * gCanvasWidth]; + u16 *pixel = &pixelRow[gCanvasColumnStart + i]; + u16 prevPixel = *pixel; + + j = 1; + pixel += gCanvasWidth; + while (j < gCanvasRowEnd - 1) + { + if (!(0x8000 & *pixel)) + { + *pixel = QuantizePixel_Blur(&prevPixel, pixel, pixel + gCanvasWidth); + prevPixel = *pixel; + } + + j++; + pixel += gCanvasWidth; + } + } +} + +static void ApplyImageEffect_PersonalityColor(u8 personality) +{ + u8 i, j; + + for (j = 0; j < gCanvasRowEnd; j++) + { + u16 *pixelRow = &(*gCanvasPixels)[0][(gCanvasRowStart + j) * gCanvasWidth]; + u16 *pixel = &pixelRow[gCanvasColumnStart]; + for (i = 0; i < gCanvasColumnEnd; i++, pixel++) + { + if (!(0x8000 & *pixel)) + *pixel = QuantizePixel_PersonalityColor(pixel, personality); + } + } +} + +static void ApplyImageEffect_BlackAndWhite(void) +{ + u8 i, j; + + for (j = 0; j < gCanvasRowEnd; j++) + { + u16 *pixelRow = &(*gCanvasPixels)[0][(gCanvasRowStart + j) * gCanvasWidth]; + u16 *pixel = &pixelRow[gCanvasColumnStart]; + for (i = 0; i < gCanvasColumnEnd; i++, pixel++) + { + if (!(0x8000 & *pixel)) + *pixel = QuantizePixel_BlackAndWhite(pixel); + } + } +} + +static void ApplyImageEffect_BlackOutline(void) +{ + u8 i, j; + u16 *pixel; + + // Handle top row of pixels first. + for (j = 0; j < gCanvasRowEnd; j++) + { + u16 *pixelRow = &(*gCanvasPixels)[0][(gCanvasRowStart + j) * gCanvasWidth]; + pixel = &pixelRow[gCanvasColumnStart]; + *pixel = QuantizePixel_BlackOutline(pixel, pixel + 1); + for (i = 1, pixel++; i < gCanvasColumnEnd - 1; i++, pixel++) + { + *pixel = QuantizePixel_BlackOutline(pixel, pixel + 1); + *pixel = QuantizePixel_BlackOutline(pixel, pixel - 1); + } + + *pixel = QuantizePixel_BlackOutline(pixel, pixel - 1); + } + + // Handle each column from left to right. + for (i = 0; i < gCanvasColumnEnd; i++) + { + u16 *pixelRow = &(*gCanvasPixels)[0][gCanvasRowStart * gCanvasWidth]; + pixel = &pixelRow[gCanvasColumnStart + i]; + *pixel = QuantizePixel_BlackOutline(pixel, pixel + gCanvasWidth); + for (j = 1, pixel += gCanvasWidth; j < gCanvasRowEnd - 1; j++, pixel += gCanvasWidth) + { + *pixel = QuantizePixel_BlackOutline(pixel, pixel + gCanvasWidth); + *pixel = QuantizePixel_BlackOutline(pixel, pixel - gCanvasWidth); + } + + *pixel = QuantizePixel_BlackOutline(pixel, pixel - gCanvasWidth); + } +} + +static void ApplyImageEffect_Invert(void) +{ + u8 i, j; + + for (j = 0; j < gCanvasRowEnd; j++) + { + u16 *pixelRow = &(*gCanvasPixels)[0][(gCanvasRowStart + j) * gCanvasWidth]; + u16 *pixel = &pixelRow[gCanvasColumnStart]; + for (i = 0; i < gCanvasColumnEnd; i++, pixel++) + { + if (!(0x8000 & *pixel)) + *pixel = QuantizePixel_Invert(pixel); + } + } +} + +static void ApplyImageEffect_Shimmer(void) +{ + u8 i, j; + u16 *pixel; + u16 prevPixel; + + // First, invert all of the colors. + pixel = (*gCanvasPixels)[0]; + for (i = 0; i < 64; i++) + { + for (j = 0; j < 64; j++, pixel++) + { + if (!(0x8000 & *pixel)) + *pixel = QuantizePixel_Invert(pixel); + } + } + + // Blur the pixels twice. + for (j = 0; j < 64; j++) + { + pixel = &(*gCanvasPixels)[0][j]; + prevPixel = *pixel; + *pixel = 0x8000; + for (i = 1, pixel += 64; i < 63; i++, pixel += 64) + { + if (!(0x8000 & *pixel)) + { + *pixel = QuantizePixel_BlurHard(&prevPixel, pixel, pixel + 64); + prevPixel = *pixel; + } + } + + *pixel = 0x8000; + pixel = &(*gCanvasPixels)[0][j]; + prevPixel = *pixel; + *pixel = 0x8000; + for (i = 1, pixel += 64; i < 63; i++, pixel += 64) + { + if (!(0x8000 & *pixel)) + { + *pixel = QuantizePixel_BlurHard(&prevPixel, pixel, pixel + 64); + prevPixel = *pixel; + } + } + + *pixel = 0x8000; + } + + // Finally, invert colors back to the original color space. + // The above blur causes the outline areas to darken, which makes + // this inversion give the effect of light outlines. + pixel = (*gCanvasPixels)[0]; + for (i = 0; i < 64; i++) + { + for (j = 0; j < 64; j++, pixel++) + { + if (!(0x8000 & *pixel)) + *pixel = QuantizePixel_Invert(pixel); + } + } +} + +static void ApplyImageEffect_BlurRight(void) +{ + u8 i, j; + + for (j = 0; j < gCanvasRowEnd; j++) + { + u16 *pixelRow = &(*gCanvasPixels)[0][(gCanvasRowStart + j) * gCanvasWidth]; + u16 *pixel = &pixelRow[gCanvasColumnStart]; + u16 prevPixel = *pixel; + for (i = 1, pixel++; i < gCanvasColumnEnd - 1; i++, pixel++) + { + if (!(0x8000 & *pixel)) + { + *pixel = QuantizePixel_MotionBlur(&prevPixel, pixel); + prevPixel = *pixel; + } + } + } +} + +static void ApplyImageEffect_BlurDown(void) +{ + u8 i, j; + + for (i = 0; i < gCanvasColumnEnd; i++) + { + u16 *pixelRow = &(*gCanvasPixels)[0][gCanvasRowStart * gCanvasWidth]; + u16 *pixel = &pixelRow[gCanvasColumnStart + i]; + u16 prevPixel = *pixel; + for (j = 1, pixel += gCanvasWidth; j < gCanvasRowEnd - 1; j++, pixel += gCanvasWidth) + { + if (!(0x8000 & *pixel)) + { + *pixel = QuantizePixel_MotionBlur(&prevPixel, pixel); + prevPixel = *pixel; + } + } + } +} + +struct PointillismPoint +{ + u8 column; + u8 row; + u16 delta; +}; + +static void AddPointillismPoints(u16 arg0) +{ + u8 i; + bool8 offsetDownLeft; + u8 colorType; + struct PointillismPoint points[6]; + + points[0].column = sPointillismPoints[arg0][0]; + points[0].row = sPointillismPoints[arg0][1]; + points[0].delta = (sPointillismPoints[arg0][2] >> 3) & 7; + + colorType = (sPointillismPoints[arg0][2] >> 1) & 3; + offsetDownLeft = sPointillismPoints[arg0][2] & 1; + for (i = 1; i < points[0].delta; i++) + { + if (!offsetDownLeft) + { + points[i].column = points[0].column - i; + points[i].row = points[0].row + i; + } + else + { + points[i].column = points[0].column + 1; + points[i].row = points[0].row - 1; + } + + if (points[i].column > 63 || points[i].row > 63) + { + points[0].delta = i - 1; + break; + } + + points[i].delta = points[0].delta - i; + } + + for (i = 0; i < points[0].delta; i++) + { + u16 *pixel = &(*gCanvasPixels)[points[i].row * 2][points[i].column]; + + if (!(0x8000 & *pixel)) + { + u16 red = (*pixel) & 0x1F; + u16 green = (*pixel >> 5) & 0x1F; + u16 blue = (*pixel >> 10) & 0x1F; + + switch (colorType) + { + case 0: + case 1: + switch (((sPointillismPoints[arg0][2] >> 3) & 7) % 3) + { + case 0: + if (red >= points[i].delta) + red -= points[i].delta; + else + red = 0; + break; + case 1: + if (green >= points[i].delta) + green -= points[i].delta; + else + green = 0; + break; + case 2: + if (blue >= points[i].delta) + blue -= points[i].delta; + else + blue = 0; + break; + } + break; + case 2: + case 3: + red += points[i].delta; + green += points[i].delta; + blue += points[i].delta; + if (red > 31) + red = 31; + if (green > 31) + green = 31; + if (blue > 31) + blue = 31; + break; + } + + *pixel = RGB2(red, green, blue); + } + } +} + +static u16 ConvertColorToGrayscale(u16 *color) +{ + u16 red = *color & 0x1F; + u16 green = (*color >> 5) & 0x1F; + u16 blue = (*color >> 10) & 0x1F; + + u16 gray = (red + green + blue) / 3; + return RGB2(gray, gray, gray); +} + +// The dark colors are the colored edges of the Cool painting effect. +// Everything else is white. +static u16 QuantizePixel_PersonalityColor(u16 *color, u8 personality) +{ + u16 red = *color & 0x1F; + u16 green = (*color >> 5) & 0x1F; + u16 blue = (*color >> 10) & 0x1F; + + if (red < 17 && green < 17 && blue < 17) + return GetColorFromPersonality(personality); + else + return RGB_WHITE; +} + +// Based on the given value, which comes from the first 8 bits of +// the mon's personality value, return a color. +static u16 GetColorFromPersonality(u8 personality) +{ + u16 red = 0; + u16 green = 0; + u16 blue = 0; + u8 strength = (personality / 6) % 3; + u8 colorType = personality % 6; + + switch (colorType) + { + case 0: + // Teal color + green = 21 - strength; + blue = green; + red = 0; + break; + case 1: + // Yellow color + blue = 0; + red = 21 - strength; + green = red; + break; + case 2: + // Purple color + blue = 21 - strength; + green = 0; + red = blue; + break; + case 3: + // Red color + blue = 0; + green = 0; + red = 23 - strength; + break; + case 4: + // Blue color + blue = 23 - strength; + green = 0; + red = 0; + break; + case 5: + // Green color + blue = 0; + green = 23 - strength; + red = 0; + break; + } + + return RGB2(red, green, blue); +} + +static u16 QuantizePixel_BlackAndWhite(u16 *color) +{ + u16 red = *color & 0x1F; + u16 green = (*color >> 5) & 0x1F; + u16 blue = (*color >> 10) & 0x1F; + + if (red < 17 && green < 17 && blue < 17) + return RGB_BLACK; + else + return RGB_WHITE; +} + +static u16 QuantizePixel_BlackOutline(u16 *pixelA, u16 *pixelB) +{ + if (*pixelA != RGB_BLACK) + { + if (*pixelA & 0x8000) + return 0x8000; + if (*pixelB & 0x8000) + return RGB_BLACK; + + return *pixelA; + } + + return RGB_BLACK; +} + +static u16 QuantizePixel_Invert(u16 *color) +{ + u16 red = *color & 0x1F; + u16 green = (*color >> 5) & 0x1F; + u16 blue = (*color >> 10) & 0x1F; + + red = 31 - red; + green = 31 - green; + blue = 31 - blue; + + return RGB2(red, green, blue); +} + +static u16 QuantizePixel_MotionBlur(u16 *prevPixel, u16 *curPixel) +{ + u16 pixelChannels[2][3]; + u16 diffs[3]; + u8 i; + u16 largestDiff; + u16 red, green, blue; + + if (*prevPixel == *curPixel) + return *curPixel; + + pixelChannels[0][0] = (*prevPixel >> 0) & 0x1F; + pixelChannels[0][1] = (*prevPixel >> 5) & 0x1F; + pixelChannels[0][2] = (*prevPixel >> 10) & 0x1F; + pixelChannels[1][0] = (*curPixel >> 0) & 0x1F; + pixelChannels[1][1] = (*curPixel >> 5) & 0x1F; + pixelChannels[1][2] = (*curPixel >> 10) & 0x1F; + + // Don't blur light colors. + if (pixelChannels[0][0] > 25 && pixelChannels[0][1] > 25 && pixelChannels[0][2] > 25) + return *curPixel; + if (pixelChannels[1][0] > 25 && pixelChannels[1][1] > 25 && pixelChannels[1][2] > 25) + return *curPixel; + + for (i = 0; i < 3; i++) + { + if (pixelChannels[0][i] > pixelChannels[1][i]) + diffs[i] = pixelChannels[0][i] - pixelChannels[1][i]; + else + diffs[i] = pixelChannels[1][i] - pixelChannels[0][i]; + } + + // Find the largest diff of any of the color channels. + if (diffs[0] >= diffs[1]) + { + if (diffs[0] >= diffs[2]) + largestDiff = diffs[0]; + else if (diffs[1] >= diffs[2]) + largestDiff = diffs[1]; + else + largestDiff = diffs[2]; + } + else + { + if (diffs[1] >= diffs[2]) + largestDiff = diffs[1]; + else if (diffs[2] >= diffs[0]) + largestDiff = diffs[2]; + else + largestDiff = diffs[0]; + } + + red = (pixelChannels[1][0] * (31 - largestDiff / 2)) / 31; + green = (pixelChannels[1][1] * (31 - largestDiff / 2)) / 31; + blue = (pixelChannels[1][2] * (31 - largestDiff / 2)) / 31; + return RGB2(red, green, blue); +} + +static u16 QuantizePixel_Blur(u16 *prevPixel, u16 *curPixel, u16 *nextPixel) +{ + u16 red, green, blue; + u16 prevAvg, curAvg, nextAvg; + u16 prevDiff, nextDiff; + u32 diff; + u16 factor; + + if (*prevPixel == *curPixel && *nextPixel == *curPixel) + return *curPixel; + + red = (*curPixel >> 0) & 0x1F; + green = (*curPixel >> 5) & 0x1F; + blue = (*curPixel >> 10) & 0x1F; + + prevAvg = (((*prevPixel >> 0) & 0x1F) + ((*prevPixel >> 5) & 0x1F) + ((*prevPixel >> 10) & 0x1F)) / 3; + curAvg = (((*curPixel >> 0) & 0x1F) + ((*curPixel >> 5) & 0x1F) + ((*curPixel >> 10) & 0x1F)) / 3; + nextAvg = (((*nextPixel >> 0) & 0x1F) + ((*nextPixel >> 5) & 0x1F) + ((*nextPixel >> 10) & 0x1F)) / 3; + + if (prevAvg == curAvg && nextAvg == curAvg) + return *curPixel; + + if (prevAvg > curAvg) + prevDiff = prevAvg - curAvg; + else + prevDiff = curAvg - prevAvg; + + if (nextAvg > curAvg) + nextDiff = nextAvg - curAvg; + else + nextDiff = curAvg - nextAvg; + + if (prevDiff >= nextDiff) + diff = prevDiff; + else + diff = nextDiff; + + factor = 31 - diff / 2; + red = (red * factor) / 31; + green = (green * factor) / 31; + blue = (blue * factor) / 31; + return RGB2(red, green, blue); +} + +static u16 QuantizePixel_BlurHard(u16 *prevPixel, u16 *curPixel, u16 *nextPixel) +{ + u16 red, green, blue; + u16 prevAvg, curAvg, nextAvg; + u16 prevDiff, nextDiff; + u32 diff; + u16 factor; + + if (*prevPixel == *curPixel && *nextPixel == *curPixel) + return *curPixel; + + red = (*curPixel >> 0) & 0x1F; + green = (*curPixel >> 5) & 0x1F; + blue = (*curPixel >> 10) & 0x1F; + + prevAvg = (((*prevPixel >> 0) & 0x1F) + ((*prevPixel >> 5) & 0x1F) + ((*prevPixel >> 10) & 0x1F)) / 3; + curAvg = (((*curPixel >> 0) & 0x1F) + ((*curPixel >> 5) & 0x1F) + ((*curPixel >> 10) & 0x1F)) / 3; + nextAvg = (((*nextPixel >> 0) & 0x1F) + ((*nextPixel >> 5) & 0x1F) + ((*nextPixel >> 10) & 0x1F)) / 3; + + if (prevAvg == curAvg && nextAvg == curAvg) + return *curPixel; + + if (prevAvg > curAvg) + prevDiff = prevAvg - curAvg; + else + prevDiff = curAvg - prevAvg; + + if (nextAvg > curAvg) + nextDiff = nextAvg - curAvg; + else + nextDiff = curAvg - nextAvg; + + if (prevDiff >= nextDiff) + diff = prevDiff; + else + diff = nextDiff; + + factor = 31 - diff; + red = (red * factor) / 31; + green = (green * factor) / 31; + blue = (blue * factor) / 31; + return RGB2(red, green, blue); +} + +void ConvertImageProcessingToGBA(struct ImageProcessingContext *context) +{ + u16 i, j, k; + u16 *src, *dest, *src_, *dest_; + u16 width, height; + + width = context->canvasWidth >> 3; + height = context->canvasHeight >> 3; + src_ = context->canvasPixels; + dest_ = context->dest; + + if (context->var_16 == 2) + { + for (i = 0; i < height; i++) + { + for (j = 0; j < width; j++) + { + for (k = 0; k < 8; k++) + { + dest = dest_ + ((i * width + j) << 5) + (k << 2); + src = src_ + ((((i << 3) + k) << 3) * width) + (j << 3); + + dest[0] = src[0] | (src[1] << 8); + dest[1] = src[2] | (src[3] << 8); + dest[2] = src[4] | (src[5] << 8); + dest[3] = src[6] | (src[7] << 8); + } + } + } + } + else + { + for (i = 0; i < height; i++) + { + for (j = 0; j < width; j++) + { + for (k = 0; k < 8; k++) + { + dest = dest_ + ((i * width + j) << 4) + (k << 1); + src = src_ + ((((i << 3) + k) << 3) * width) + (j << 3); + + dest[0] = src[0] | (src[1] << 4) | (src[2] << 8) | (src[3] << 0xC); + dest[1] = src[4] | (src[5] << 4) | (src[6] << 8) | (src[7] << 0xC); + } + } + } + } +} + +void ApplyImageProcessingQuantization(struct ImageProcessingContext *context) +{ + gCanvasPaletteStart = context->paletteStart * 16; + gCanvasPalette = &context->canvasPalette[gCanvasPaletteStart]; + gCanvasPixels = context->canvasPixels; + gCanvasColumnStart = context->columnStart; + gCanvasRowStart = context->rowStart; + gCanvasColumnEnd = context->columnEnd; + gCanvasRowEnd = context->rowEnd; + gCanvasWidth = context->canvasWidth; + gCanvasHeight = context->canvasHeight; + + switch (context->quantizeEffect) + { + case QUANTIZE_EFFECT_STANDARD: + QuantizePalette_Standard(FALSE); + break; + case QUANTIZE_EFFECT_STANDARD_LIMITED_COLORS: + QuantizePalette_Standard(TRUE); + break; + case QUANTIZE_EFFECT_PRIMARY_COLORS: + SetPresetPalette_PrimaryColors(); + QuantizePalette_PrimaryColors(); + break; + case QUANTIZE_EFFECT_GRAYSCALE: + SetPresetPalette_Grayscale(); + QuantizePalette_Grayscale(); + break; + case QUANTIZE_EFFECT_GRAYSCALE_SMALL: + SetPresetPalette_GrayscaleSmall(); + QuantizePalette_GrayscaleSmall(); + break; + case QUANTIZE_EFFECT_BLACK_WHITE: + SetPresetPalette_BlackAndWhite(); + QuantizePalette_BlackAndWhite(); + break; + } +} + +static void SetPresetPalette_PrimaryColors(void) +{ + gCanvasPalette[0] = RGB2(0, 0, 0); + gCanvasPalette[1] = RGB2(6, 6, 6); + gCanvasPalette[2] = RGB2(29, 29, 29); + gCanvasPalette[3] = RGB2(11, 11, 11); + gCanvasPalette[4] = RGB2(29, 6, 6); + gCanvasPalette[5] = RGB2(6, 29, 6); + gCanvasPalette[6] = RGB2(6, 6, 29); + gCanvasPalette[7] = RGB2(29, 29, 6); + gCanvasPalette[8] = RGB2(29, 6, 29); + gCanvasPalette[9] = RGB2(6, 29, 29); + gCanvasPalette[10] = RGB2(29, 11, 6); + gCanvasPalette[11] = RGB2(11, 29, 6); + gCanvasPalette[12] = RGB2(6, 11, 29); + gCanvasPalette[13] = RGB2(29, 6, 11); + gCanvasPalette[14] = RGB2(6, 29, 11); + gCanvasPalette[15] = RGB2(11, 6, 29); +} + +static void SetPresetPalette_BlackAndWhite(void) +{ + gCanvasPalette[0] = RGB2(0, 0, 0); + gCanvasPalette[1] = RGB2(0, 0, 0); + gCanvasPalette[2] = RGB2(31, 31, 31); +} + +static void SetPresetPalette_GrayscaleSmall(void) +{ + u8 i; + + gCanvasPalette[0] = RGB2(0, 0, 0); + gCanvasPalette[1] = RGB2(0, 0, 0); + for (i = 0; i < 14; i++) + gCanvasPalette[i + 2] = RGB2(2 * (i + 2), 2 * (i + 2), 2 * (i + 2)); +} + +static void SetPresetPalette_Grayscale(void) +{ + u8 i; + + gCanvasPalette[0] = RGB2(0, 0, 0); + for (i = 0; i < 32; i++) + gCanvasPalette[i + 1] = RGB2(i, i, i); +} + +static void QuantizePalette_Standard(bool8 useLimitedPalette) +{ + u8 i, j; + u16 maxIndex; + + maxIndex = 0xDF; + if (!useLimitedPalette) + maxIndex = 0xFF; + + for (i = 0; i < maxIndex; i++) + gCanvasPalette[i] = RGB_BLACK; + + gCanvasPalette[maxIndex] = RGB2(15, 15, 15); + for (j = 0; j < gCanvasRowEnd; j++) + { + u16 *pixelRow = &(*gCanvasPixels)[0][(gCanvasRowStart + j) * gCanvasWidth]; + u16 *pixel = &pixelRow[gCanvasColumnStart]; + for (i = 0; i < gCanvasColumnEnd; i++, pixel++) + { + if (*pixel & 0x8000) + { + *pixel = gCanvasPaletteStart; + } + else + { + u16 quantizedColor = QuantizePixel_Standard(pixel); + u8 curIndex = 1; + if (curIndex < maxIndex) + { + if (gCanvasPalette[curIndex] == RGB_BLACK) + { + // The quantized color does not match any existing color in the + // palette, so we add it to the palette. + // This if block seems pointless because the below while loop handles + // this same logic. + gCanvasPalette[curIndex] = quantizedColor; + *pixel = gCanvasPaletteStart + curIndex; + } + else + { + while (curIndex < maxIndex) + { + if (gCanvasPalette[curIndex] == RGB_BLACK) + { + // The quantized color does not match any existing color in the + // palette, so we add it to the palette. + gCanvasPalette[curIndex] = quantizedColor; + *pixel = gCanvasPaletteStart + curIndex; + break; + } + + if (gCanvasPalette[curIndex] == quantizedColor) + { + // The quantized color matches this existing color in the + // palette, so we use this existing color for the pixel. + *pixel = gCanvasPaletteStart + curIndex; + break; + } + + curIndex++; + } + } + } + + if (curIndex == maxIndex) + { + // The entire palette's colors are already in use, which means + // the base image has too many colors to handle. This error is handled + // by marking such pixels as gray color. + curIndex = maxIndex; + *pixel = curIndex; + } + } + } + } +} + +static void QuantizePalette_BlackAndWhite(void) +{ + u8 i, j; + + for (j = 0; j < gCanvasRowEnd; j++) + { + u16 *pixelRow = &(*gCanvasPixels)[0][(gCanvasRowStart + j) * gCanvasWidth]; + u16 *pixel = &pixelRow[gCanvasColumnStart]; + for (i = 0; i < gCanvasColumnEnd; i++, pixel++) + { + if (*pixel & 0x8000) + { + *pixel = gCanvasPaletteStart; + } + else + { + if (QuantizePixel_BlackAndWhite(pixel) == RGB_BLACK) + { + // Black is the first color in the quantized palette. + *pixel = gCanvasPaletteStart + 1; + } + else + { + // White is the second color in the quantized palette. + *pixel = gCanvasPaletteStart + 2; + } + } + } + } +} + +static void QuantizePalette_GrayscaleSmall(void) +{ + u8 i, j; + + for (j = 0; j < gCanvasRowEnd; j++) + { + u16 *pixelRow = &(*gCanvasPixels)[0][(gCanvasRowStart + j) * gCanvasWidth]; + u16 *pixel = &pixelRow[gCanvasColumnStart]; + for (i = 0; i < gCanvasColumnEnd; i++, pixel++) + { + if (*pixel & 0x8000) + *pixel = gCanvasPaletteStart; + else + *pixel = QuantizePixel_GrayscaleSmall(pixel) + gCanvasPaletteStart; + } + } +} + +static void QuantizePalette_Grayscale(void) +{ + u8 i, j; + + for (j = 0; j < gCanvasRowEnd; j++) + { + u16 *pixelRow = &(*gCanvasPixels)[0][(gCanvasRowStart + j) * gCanvasWidth]; + u16 *pixel = &pixelRow[gCanvasColumnStart]; + for (i = 0; i < gCanvasColumnEnd; i++, pixel++) + { + if (*pixel & 0x8000) + *pixel = gCanvasPaletteStart; + else + *pixel = QuantizePixel_Grayscale(pixel) + gCanvasPaletteStart; + } + } +} + +static void QuantizePalette_PrimaryColors(void) +{ + u8 i, j; + + for (j = 0; j < gCanvasRowEnd; j++) + { + u16 *pixelRow = &(*gCanvasPixels)[0][(gCanvasRowStart + j) * gCanvasWidth]; + u16 *pixel = &pixelRow[gCanvasColumnStart]; + for (i = 0; i < gCanvasColumnEnd; i++, pixel++) + { + if (*pixel & 0x8000) + *pixel = gCanvasPaletteStart; + else + *pixel = QuantizePixel_PrimaryColors(pixel) + gCanvasPaletteStart; + } + } +} + +// Quantizes the pixel's color channels to nearest multiple of 4, and clamps to [6, 30]. +static u16 QuantizePixel_Standard(u16 *pixel) +{ + u16 red = *pixel & 0x1F; + u16 green = (*pixel >> 5) & 0x1F; + u16 blue = (*pixel >> 10) & 0x1F; + + // Quantize color channels to muliples of 4, rounding up. + if (red & 3) + red = (red & 0x1C) + 4; + if (green & 3) + green = (green & 0x1C) + 4; + if (blue & 3) + blue = (blue & 0x1C) + 4; + + // Clamp channels to [6, 30]. + if (red < 6) + red = 6; + if (red > 30) + red = 30; + if (green < 6) + green = 6; + if (green > 30) + green = 30; + if (blue < 6) + blue = 6; + if (blue > 30) + blue = 30; + + return RGB2(red, green, blue); +} + +static u16 QuantizePixel_PrimaryColors(u16* color) +{ + u16 red = *color & 0x1F; + u16 green = (*color >> 5) & 0x1F; + u16 blue = (*color >> 10) & 0x1F; + + if (red < 12 && green < 11 && blue < 11) + return 1; + + if (red > 19 && green > 19 && blue > 19) + return 2; + + if (red > 19) + { + if (green > 19) + { + if (blue > 14) + return 2; + else + return 7; + } + else if (blue > 19) + { + if (green > 14) + return 2; + else + return 8; + } + } + + if (green > 19 && blue > 19) + { + if (red > 14) + return 2; + else + return 9; + } + + if (red > 19) + { + if (green > 11) + { + if (blue > 11) + { + if (green < blue) + return 8; + else + return 7; + } + else + { + return 10; + } + } + else if (blue > 11) + { + return 13; + } + else + { + return 4; + } + } + + if (green > 19) + { + if (red > 11) + { + if (blue > 11) + { + if (red < blue) + return 9; + else + return 7; + } + else + { + return 11; + } + } + else + { + if (blue > 11) + return 14; + else + return 5; + } + } + + if (blue > 19) + { + if (red > 11) + { + if (green > 11) + { + if (red < green) + return 9; + else + return 8; + } + } + else if (green > 11) + { + return 12; + } + + if (blue > 11) + return 15; + else + return 6; + } + + return 3; +} + +static u16 QuantizePixel_GrayscaleSmall(u16 *color) +{ + u16 red = *color & 0x1F; + u16 green = (*color >> 5) & 0x1F; + u16 blue = (*color >> 10) & 0x1F; + u16 average = ((red + green + blue) / 3) & 0x1E; + if (average == 0) + return 1; + else + return average / 2; +} + +static u16 QuantizePixel_Grayscale(u16 *color) +{ + u16 red = *color & 0x1F; + u16 green = (*color >> 5) & 0x1F; + u16 blue = (*color >> 10) & 0x1F; + u16 average = (red + green + blue) / 3; + return average + 1; +} diff --git a/src/main.c b/src/main.c index c96e4cc3a..60f762a62 100644 --- a/src/main.c +++ b/src/main.c @@ -36,7 +36,7 @@ extern bool32 sub_80F5118(void); extern struct SoundInfo gSoundInfo; extern u32 gFlashMemoryPresent; -extern u32 IntrMain[]; +extern u32 intr_main[]; extern u8 gHeap[]; extern struct SaveBlock1 gSaveBlock1; extern struct SaveBlock2 gSaveBlock2; @@ -313,7 +313,7 @@ void InitIntrHandlers(void) for (i = 0; i < INTR_COUNT; i++) gIntrTable[i] = gIntrTableTemplate[i]; - DmaCopy32(3, IntrMain, IntrMain_Buffer, sizeof(IntrMain_Buffer)); + DmaCopy32(3, intr_main, IntrMain_Buffer, sizeof(IntrMain_Buffer)); INTR_VECTOR = IntrMain_Buffer; diff --git a/src/map_preview_screen.c b/src/map_preview_screen.c index 0747e8ade..c5b41a7c1 100644 --- a/src/map_preview_screen.c +++ b/src/map_preview_screen.c @@ -552,7 +552,7 @@ static void sub_80F83D0(u8 taskId) } } -const struct MapPreviewScreen * sub_80F8544(u8 mapsec) +const struct MapPreviewScreen * GetDungeonMapPreviewScreenInfo(u8 mapsec) { u8 idx; diff --git a/src/party_menu.c b/src/party_menu.c index 399794b2d..6e0b411bf 100644 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -4201,7 +4201,7 @@ static void sub_8124BB0(struct Pokemon *mon, u8 fieldMove) Free(ptr); } -void sub_8124C1C(const u8 *healLocCtrlData) // TODO: confirm the type of data chunk at 0x83F2EE0 +void sub_8124C1C(const u8 *healLocCtrlData) { const struct MapHeader *mapHeader; struct FieldMoveWarpParams *ptr2; diff --git a/src/quest_log.c b/src/quest_log.c index 970071a0f..4d94c78ad 100644 --- a/src/quest_log.c +++ b/src/quest_log.c @@ -3119,7 +3119,7 @@ static const u16 *sub_8113FBC(const u16 *a0) StringCopy(gStringVar1, ItemId_GetName(r5[0])); if (r5[0] == ITEM_ESCAPE_ROPE) { - GetMapNameGeneric(gStringVar2, r5[2]); + GetMapNameGeneric(gStringVar2, (u8)r5[2]); StringExpandPlaceholders(gStringVar4, gUnknown_841AFA6); } else if (r5[1] != 0xFFFF) @@ -4373,7 +4373,7 @@ static u16 *sub_81157DC(u16 *a0, const u16 *a1) static const u16 *sub_8115800(const u16 *a0) { const u16 *r4 = sub_8113E88(42, a0); - GetMapNameGeneric(gStringVar1, r4[0]); + GetMapNameGeneric(gStringVar1, (u8)r4[0]); StringExpandPlaceholders(gStringVar4, gUnknown_841B064); return r4 + 1; } diff --git a/src/region_map.c b/src/region_map.c new file mode 100644 index 000000000..271ce548f --- /dev/null +++ b/src/region_map.c @@ -0,0 +1,4399 @@ +#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/spawn_points.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 layouts[5][600]; + // Inefficiency: these should be u8 or have half the elements each + u16 bgTilemapBuffers[3][BG_SCREEN_SIZE]; + u8 mapType; + bool8 regionMapPermissions[4]; + u8 field_479B; + u8 field_479C; + u8 ALIGNED(4) field_47A0; + u8 ALIGNED(4) field_47A4; + u8 ALIGNED(4) field_47A8; + u16 field_47AA; + u16 field_47AC; + u16 field_47AE; + u16 field_47B0; + u8 filler_47B2[6]; + TaskFunc field_47B8; + MainCallback savedCallback; +}; // size = 0x47C0 + +struct SelectionCursorSubspriteData +{ + u8 tiles[0x400]; + struct Sprite * sprite; + u16 tileTag; + u16 paletteTag; + s16 xCoord; +}; + +struct UnkStruct_20399D8 +{ + u8 bgTiles[0x1000]; + u16 tileMap[0x258]; + struct SelectionCursorSubspriteData selectionCursorSubspriteData[2]; + u8 field_1CC8; + u8 selectionCursorLoadState; + 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 GpuWindowParams +{ + u16 v0; + u16 v2; + u16 v4; + u16 v6; +}; + +struct UnkStruct_83F1B3C +{ + u16 id; + const u8 *name; + const u8 *desc; +}; + +struct DungeonMapPreviewManagerStruct +{ + u16 tiles[0x1C20]; + u16 tilemap[0x280]; + const struct MapPreviewScreen * mapPreviewInfo; + TaskFunc savedTask; + u8 dungeonMapPreviewPrepState; + u8 dungeonMapPreviewDrawState; + 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; +}; + +static EWRAM_DATA struct UnkStruct_20399D4 * gUnknown_20399D4 = NULL; +static EWRAM_DATA struct UnkStruct_20399D8 * gUnknown_20399D8 = NULL; +static EWRAM_DATA struct DungeonMapPreviewManagerStruct * sDungeonMapPreviewManager = NULL; +static EWRAM_DATA struct UnkStruct_20399E0 * gUnknown_20399E0 = NULL; +static EWRAM_DATA struct UnkStruct_20399E4 * gUnknown_20399E4 = NULL; +static EWRAM_DATA struct UnkStruct_20399E8 * gUnknown_20399E8 = NULL; +static EWRAM_DATA struct UnkStruct_20399EC * gUnknown_20399EC = NULL; +static EWRAM_DATA struct UnkStruct_20399F0 * gUnknown_20399F0[3] = {}; +static EWRAM_DATA struct UnkStruct_20399FC * gUnknown_20399FC = NULL; + +static void sub_80BFFD0(void); +static void CB2_OpenRegionMap(void); +static bool8 HandleLoadRegionMapGfx(void); +static void sub_80C03E8(void); +static void sub_80C04E4(u8 taskId); +static void sub_80C07F8(u8 taskId); +static void sub_80C0820(u8 taskId); +static void sub_80C08B4(void); +static void NullVBlankHBlankCallbacks(void); +static void sub_80C08F4(void); +static void ResetGpu(void); +static void SetBgTilemapBuffers(void); +static void ResetOamForRegionMap(void); +static void SetBg0andBg3Visibility(u8 a0); +static void sub_80C0AB8(void); +static void sub_80C0B18(void); +static void sub_80C0B9C(void); +static void sub_80C0BB0(void); +static void sub_80C0CC8(u8 bg, u16 *map); +static bool8 GetRegionMapPermission(u8 a0); +static u8 GetWhichRegionMap(void); +static void sub_80C0E70(u8 a0, u8 taskId, TaskFunc taskFunc); +static void sub_80C1098(u8 taskId); +static void sub_80C1280(u8 taskId); +static bool8 sub_80C12EC(void); +static void sub_80C1324(u8 bg, u16 *map); +static void sub_80C1390(void); +static bool8 sub_80C144C(void); +static bool8 sub_80C1478(void); +static bool8 LoadAndCreateSelectionCursorSpriteGfx(void); +static void CreateSelectionCursorSubsprite(u8 whichSprite, u16 tileTag, u16 paletteTag); +static void RealCreateSelectionCursorSubsprite(u8 whichSprite, u16 tileTag, u16 paletteTag); +static void DestroySelectionCursorSprites(void); +static void RegionMapCreateDungeonMapPreview(u8 a0, u8 taskId, TaskFunc taskFunc); +static void Task_PrepDungeonMapPreviewAndFlavorText(u8 taskId); +static void Task_DrawDungeonMapPreviewAndFlavorText(u8 taskId); +static void DestroyMapPreviewAssets(u8 taskId); +static void sub_80C1E94(void); +static void CopyMapPreviewTilemapToBgTilemapBuffer(u8 bgId, const u16 * tilemap); +static bool8 sub_80C1F80(bool8 a0); +static void sub_80C2208(u8 taskId, TaskFunc taskFunc); +static void sub_80C24BC(void); +static void sub_80C267C(u8 taskId); +static void sub_80C25BC(void); +static void sub_80C2604(void); +static bool8 sub_80C29A4(void); +static void sub_80C2B48(void); +static void sub_80C2C1C(u8 taskId); +static void sub_80C2C7C(u8 taskId); +static bool8 sub_80C2E1C(void); +static void sub_80C3008(u16 a0, u16 a1); +static void sub_80C309C(void); +static void sub_80C3154(bool8 a0); +static void sub_80C3178(void); +static void sub_80C3188(void); +static u8 sub_80C31C0(void); +static u8 sub_80C3348(void); +static u8 sub_80C3400(void); +static void sub_80C3418(void); +static u16 GetMapCursorX(void); +static u16 GetMapCursorY(void); +static u16 sub_80C3520(void); +static u16 GetMapSecUnderCursor(void); +static u8 sub_80C35DC(u8 a0); +static u8 sub_80C3878(u8 a0); +static u8 sub_80C3AC8(u8 a0); +static void GetPlayerPositionOnRegionMap_HandleOverrides(void); +static u8 GetSelectedMapSection(u8 a0, u8 a1, s16 a2, s16 a3); +static void sub_80C41D8(u16 a0, u16 a1); +static void sub_80C4244(void); +static void sub_80C4324(bool8 a0); +static void sub_80C4348(void); +static u16 sub_80C4380(void); +static u16 sub_80C438C(void); +static void sub_80C4398(u8 a0, u8 taskId, TaskFunc taskFunc); +static void sub_80C440C(u8 taskId); +static void sub_80C44E4(u8 taskId); +static void sub_80C4750(void); +static void sub_80C47F0(void); +static void sub_80C48BC(u8 a0, u8 a1, bool8 a2); +static void sub_80C4960(u8 a0, u8 a1, bool8 a2); +static void sub_80C4A04(void); +static bool8 sub_80C4AAC(u8 a0); +static bool8 sub_80C4B30(u8 a0); +static void sub_80C4BE4(void); +static void sub_80C4C2C(u8 a0, u16 a1, u16 a2); +static void sub_80C4C48(u16 a0); +static void sub_80C4C5C(u16 a0, u16 a1); +static void sub_80C4C74(u16 a0, u16 a1); +static void sub_80C4C88(u16 a0); +static void sub_80C4C9C(u8 a0, u8 a1); +static void SetGpuWindowDims(u8 a0, const struct GpuWindowParams *a1); +static void sub_80C4D30(void); +static void sub_80C4E18(const u8 *str); +static void sub_80C4E74(const u8 *str); +static void sub_80C4ED0(bool8 a0); +static void sub_80C4F08(u8 taskId); +static void sub_80C51E8(void); +static void sub_80C5208(u8 taskId); +static void sub_80C527C(u16 a0); + +#include "data/text/map_section_names.h" + +static const u16 gUnknown_83EF23C[] = INCBIN_U16("graphics/region_map/unk_83EF23C.gbapal"); +static const u16 gUnknown_83EF25C[] = INCBIN_U16("graphics/region_map/unk_83EF25C.gbapal"); +static const u16 gUnknown_83EF27C[] = INCBIN_U16("graphics/region_map/unk_83EF27C.gbapal"); +static const u16 gUnknown_83EF29C[] = INCBIN_U16("graphics/region_map/unk_83EF29C.gbapal"); +static const u16 gUnknown_83EF2BC[] = INCBIN_U16("graphics/region_map/unk_83EF2BC.gbapal"); +static const u16 gUnknown_83EF2DC[] = INCBIN_U16("graphics/region_map/unk_83EF2DC.gbapal"); +static const u16 unref_83EF37C[] = { + RGB(0, 0, 31), + RGB(0, 12, 31), + RGB_WHITE, + RGB_WHITE +}; +static const u16 sSelectionCursorPals[] = INCBIN_U16("graphics/region_map/unk_83EF384.gbapal"); +static const u16 gUnknown_83EF3A4[] = INCBIN_U16("graphics/region_map/unk_83EF3A4.gbapal"); +static const u32 sSelectionCursorLeftTiles[] = INCBIN_U32("graphics/region_map/unk_83EF3C4.4bpp.lz"); +static const u32 sSelectionCursorRightTiles[] = INCBIN_U32("graphics/region_map/unk_83EF450.4bpp.lz"); +static const u32 gUnknown_83EF4E0[] = INCBIN_U32("graphics/region_map/unk_83EF4E0.4bpp.lz"); +static const u32 gUnknown_83EF524[] = INCBIN_U32("graphics/region_map/unk_83EF524.4bpp.lz"); +static const u32 gUnknown_83EF59C[] = INCBIN_U32("graphics/region_map/unk_83EF59C.4bpp.lz"); +static const u32 gUnknown_83EF61C[] = INCBIN_U32("graphics/region_map/unk_83EF61C.4bpp.lz"); +static const u32 gUnknown_83F0330[] = INCBIN_U32("graphics/region_map/unk_83F0330.4bpp.lz"); +static const u32 gUnknown_83F0580[] = INCBIN_U32("graphics/region_map/unk_83F0580.bin.lz"); +static const u32 sRegionMapLayout_Kanto[] = INCBIN_U32("graphics/region_map/unk_83F089C.bin.lz"); +static const u32 sRegionMapLayout_Sevii123[] = INCBIN_U32("graphics/region_map/unk_83F0AFC.bin.lz"); +static const u32 sRegionMapLayout_Sevii45[] = INCBIN_U32("graphics/region_map/unk_83F0C0C.bin.lz"); +static const u32 sRegionMapLayout_Sevii67[] = INCBIN_U32("graphics/region_map/unk_83F0CF0.bin.lz"); +static const u32 gUnknown_83F0E0C[] = INCBIN_U32("graphics/region_map/unk_83F0E0C.bin.lz"); +static const u32 gUnknown_83F0F1C[] = INCBIN_U32("graphics/region_map/unk_83F0F1C.bin.lz"); +static const u32 gUnknown_83F1084[] = INCBIN_U32("graphics/region_map/unk_83F1084.bin.lz"); +static const u32 gUnknown_83F1190[] = INCBIN_U32("graphics/region_map/unk_83F1190.bin.lz"); +static const u32 gUnknown_83F12CC[] = INCBIN_U32("graphics/region_map/unk_83F12CC.4bpp.lz"); +static const u32 gUnknown_83F13EC[] = INCBIN_U32("graphics/region_map/unk_83F13EC.4bpp.lz"); +static const u32 gUnknown_83F1550[] = INCBIN_U32("graphics/region_map/unk_83F1550.4bpp.lz"); +static const u32 gUnknown_83F1640[] = INCBIN_U32("graphics/region_map/unk_83F1640.4bpp.lz"); +static const u32 gUnknown_83F1738[] = INCBIN_U32("graphics/region_map/unk_83F1738.4bpp.lz"); +static const u32 gUnknown_83F1804[] = INCBIN_U32("graphics/region_map/unk_83F1804.4bpp.lz"); +static const u32 gUnknown_83F18D8[] = INCBIN_U32("graphics/region_map/unk_83F18D8.4bpp.lz"); +static const u32 gUnknown_83F1908[] = INCBIN_U32("graphics/region_map/unk_83F1908.4bpp.lz"); +static const u32 gUnknown_83F1978[] = INCBIN_U32("graphics/region_map/unk_83F1978.4bpp.lz"); +static const u32 gUnknown_83F19A0[] = INCBIN_U32("graphics/region_map/unk_83F19A0.bin.lz"); + +static const struct BgTemplate gUnknown_83F1A50[] = { + { + .bg = 0, + .charBaseIndex = 0, + .mapBaseIndex = 30, + .screenSize = 0, + .paletteMode = 0, + .priority = 2, + .baseTile = 0x000 + }, { + .bg = 1, + .charBaseIndex = 1, + .mapBaseIndex = 15, + .screenSize = 0, + .paletteMode = 0, + .priority = 3, + .baseTile = 0x000 + }, { + .bg = 2, + .charBaseIndex = 2, + .mapBaseIndex = 23, + .screenSize = 0, + .paletteMode = 0, + .priority = 1, + .baseTile = 0x000 + }, { + .bg = 3, + .charBaseIndex = 3, + .mapBaseIndex = 31, + .screenSize = 0, + .paletteMode = 0, + .priority = 0, + .baseTile = 0x000 + } +}; + +static const struct WindowTemplate gUnknown_83F1A60[] = { + { + .bg = 3, + .tilemapLeft = 3, + .tilemapTop = 2, + .width = 15, + .height = 2, + .paletteNum = 12, + .baseBlock = 0x001 + }, { + .bg = 3, + .tilemapLeft = 3, + .tilemapTop = 4, + .width = 15, + .height = 2, + .paletteNum = 12, + .baseBlock = 0x01f + }, { + .bg = 3, + .tilemapLeft = 3, + .tilemapTop = 6, + .width = 25, + .height = 11, + .paletteNum = 12, + .baseBlock = 0x03d + }, { + .bg = 3, + .tilemapLeft = 18, + .tilemapTop = 0, + .width = 5, + .height = 2, + .paletteNum = 12, + .baseBlock = 0x150 + }, { + .bg = 3, + .tilemapLeft = 24, + .tilemapTop = 0, + .width = 5, + .height = 2, + .paletteNum = 12, + .baseBlock = 0x15a + }, DUMMY_WIN_TEMPLATE +}; + +ALIGNED(4) const u8 sTextColor_White[] = {0, 1, 2}; +ALIGNED(4) const u8 sTextColor_Green[] = {0, 7, 2}; +ALIGNED(4) const u8 gUnknown_83F1A98[] = {0, 10, 2}; + +static const u8 *const gUnknown_83F1A9C[] = { + sTextColor_Green, + gUnknown_83F1A98 +}; + +static const u8 sSeviiMapsecs[3][30] = { + { + MAPSEC_ONE_ISLAND, + MAPSEC_TWO_ISLAND, + MAPSEC_THREE_ISLAND, + MAPSEC_KINDLE_ROAD, + MAPSEC_TREASURE_BEACH, + MAPSEC_CAPE_BRINK, + MAPSEC_BOND_BRIDGE, + MAPSEC_THREE_ISLE_PORT, + MAPSEC_MT_EMBER, + MAPSEC_BERRY_FOREST, + MAPSEC_THREE_ISLE_PATH, + MAPSEC_EMBER_SPA, + MAPSEC_NONE + }, { + MAPSEC_FOUR_ISLAND, + MAPSEC_FIVE_ISLAND, + MAPSEC_SEVII_ISLE_6, + MAPSEC_SEVII_ISLE_7, + MAPSEC_SEVII_ISLE_8, + MAPSEC_SEVII_ISLE_9, + MAPSEC_RESORT_GORGEOUS, + MAPSEC_WATER_LABYRINTH, + MAPSEC_FIVE_ISLE_MEADOW, + MAPSEC_MEMORIAL_PILLAR, + MAPSEC_NAVEL_ROCK, + MAPSEC_ICEFALL_CAVE, + MAPSEC_ROCKET_WAREHOUSE, + MAPSEC_LOST_CAVE, + MAPSEC_NONE + }, { + MAPSEC_SEVEN_ISLAND, + MAPSEC_SIX_ISLAND, + MAPSEC_OUTCAST_ISLAND, + MAPSEC_GREEN_PATH, + MAPSEC_WATER_PATH, + MAPSEC_RUIN_VALLEY, + MAPSEC_TRAINER_TOWER, + MAPSEC_CANYON_ENTRANCE, + MAPSEC_SEVAULT_CANYON, + MAPSEC_TANOBY_RUINS, + MAPSEC_SEVII_ISLE_22, + MAPSEC_SEVII_ISLE_23, + MAPSEC_SEVII_ISLE_24, + MAPSEC_TRAINER_TOWER_2, + MAPSEC_DOTTED_HOLE, + MAPSEC_PATTERN_BUSH, + MAPSEC_ALTERING_CAVE, + MAPSEC_TANOBY_CHAMBERS, + MAPSEC_TANOBY_KEY, + MAPSEC_BIRTH_ISLAND, + MAPSEC_MONEAN_CHAMBER, + MAPSEC_LIPTOO_CHAMBER, + MAPSEC_WEEPTH_CHAMBER, + MAPSEC_DILFORD_CHAMBER, + MAPSEC_SCUFIB_CHAMBER, + MAPSEC_RIXY_CHAMBER, + MAPSEC_VIAPOIS_CHAMBER, + MAPSEC_NONE + } +}; + +ALIGNED(4) const bool8 sRegionMapPermissions[3][4] = { + {TRUE , TRUE , TRUE , FALSE}, + {FALSE, FALSE, FALSE, FALSE}, + {FALSE, FALSE, FALSE, TRUE } +}; + +static const struct GpuWindowParams sStdWindowDims[3] = { + {0x18, 0x10, 0x90, 0x20}, + {0x18, 0x20, 0x90, 0x30}, + {0x00, 0x00, 0x00, 0x00} +}; + +static const struct OamData sSelectionCursorOam = { + .shape = SPRITE_SHAPE(32x32), + .size = SPRITE_SIZE(32x32) +}; + +static const union AnimCmd gUnknown_83F1B2C[] = { + ANIMCMD_FRAME(0x00, 20), + ANIMCMD_FRAME(0x10, 20), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd *const sSelectionCursorAnims[] = { + gUnknown_83F1B2C +}; + +static const struct UnkStruct_83F1B3C sDungeonHighlights[] = { + { + .id = MAPSEC_VIRIDIAN_FOREST, + .name = gMapSecName_ViridianForest, + .desc = gText_RegionMap_AreaDesc_ViridianForest + }, { + .id = MAPSEC_MT_MOON, + .name = gMapSecName_MtMoon, + .desc = gText_RegionMap_AreaDesc_MtMoon + }, { + .id = MAPSEC_DIGLETTS_CAVE, + .name = gMapSecName_DiglettsCave, + .desc = gText_RegionMap_AreaDesc_DiglettsCave + }, { + .id = MAPSEC_KANTO_VICTORY_ROAD, + .name = gMapSecName_VictoryRoad, + .desc = gText_RegionMap_AreaDesc_VictoryRoad + }, { + .id = MAPSEC_POKEMON_MANSION, + .name = gMapSecName_PokemonMansion, + .desc = gText_RegionMap_AreaDesc_PokemonMansion + }, { + .id = MAPSEC_KANTO_SAFARI_ZONE, + .name = gMapSecName_SafariZone, + .desc = gText_RegionMap_AreaDesc_SafariZone + }, { + .id = MAPSEC_ROCK_TUNNEL, + .name = gMapSecName_RockTunnel, + .desc = gText_RegionMap_AreaDesc_RockTunnel + }, { + .id = MAPSEC_SEAFOAM_ISLANDS, + .name = gMapSecName_SeafoamIslands, + .desc = gText_RegionMap_AreaDesc_SeafoamIslands + }, { + .id = MAPSEC_POKEMON_TOWER, + .name = gMapSecName_PokemonTower, + .desc = gText_RegionMap_AreaDesc_PokemonTower + }, { + .id = MAPSEC_CERULEAN_CAVE, + .name = gMapSecName_CeruleanCave, + .desc = gText_RegionMap_AreaDesc_CeruleanCave + }, { + .id = MAPSEC_POWER_PLANT, + .name = gMapSecName_PowerPlant, + .desc = gText_RegionMap_AreaDesc_PowerPlant + }, { + .id = MAPSEC_MT_EMBER, + .name = gMapSecName_MtEmber, + .desc = gText_RegionMap_AreaDesc_MtEmber + }, { + .id = MAPSEC_BERRY_FOREST, + .name = gMapSecName_BerryForest, + .desc = gText_RegionMap_AreaDesc_BerryForest + }, { + .id = MAPSEC_ICEFALL_CAVE, + .name = gMapSecName_IcefallCave, + .desc = gText_RegionMap_AreaDesc_IcefallCave + }, { + .id = MAPSEC_LOST_CAVE, + .name = gMapSecName_LostCave, + .desc = gText_RegionMap_AreaDesc_LostCave + }, { + .id = MAPSEC_TANOBY_CHAMBERS, + .name = gMapSecName_TanobyChambers, + .desc = gText_RegionMap_AreaDesc_TanobyRuins + }, { + .id = MAPSEC_ALTERING_CAVE, + .name = gMapSecName_AlteringCave, + .desc = gText_RegionMap_AreaDesc_AlteringCave + }, { + .id = MAPSEC_PATTERN_BUSH, + .name = gMapSecName_PatternBush, + .desc = gText_RegionMap_AreaDesc_PatternBush + }, { + .id = MAPSEC_DOTTED_HOLE, + .name = gMapSecName_DottedHole, + .desc = gText_RegionMap_AreaDesc_DottedHole + } +}; + +static const struct OamData gUnknown_83F1C20 = { + .shape = SPRITE_SHAPE(32x64), + .size = SPRITE_SIZE(32x64) +}; + +static const union AnimCmd gAnimCmd_83F1C28[] = { + ANIMCMD_FRAME(0, 0), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd *const gUnknown_83F1C30[] = { + gAnimCmd_83F1C28 +}; + +static const struct GpuWindowParams gUnknown_83F1C34 = { + 0x18, 0x10, 0xD8, 0xA0 +}; + +static const struct OamData gUnknown_83F1C3C = { + .shape = SPRITE_SHAPE(16x16), + .size = SPRITE_SIZE(16x16), + .priority = 2 +}; + +static const union AnimCmd gAnimCmd_83F1C44[] = { + ANIMCMD_FRAME(0, 20), + ANIMCMD_FRAME(4, 20), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd *const gUnknown_83F1C50[] = { + gAnimCmd_83F1C44 +}; + +static const struct OamData gUnknown_83F1C54 = { + .shape = SPRITE_SHAPE(16x16), + .size = SPRITE_SIZE(16x16), + .priority = 2 +}; + +static const union AnimCmd gAnimCmd_83F1C5C[] = { + ANIMCMD_FRAME(0, 5), + ANIMCMD_END +}; + +static const union AnimCmd *const gUnknown_83F1C64[] = { + gAnimCmd_83F1C5C +}; + +static const struct OamData gUnknown_83F1C68 = { + .shape = SPRITE_SHAPE(16x16), + .size = SPRITE_SIZE(16x16), + .priority = 2 +}; + +static const struct OamData gUnknown_83F1C70 = { + .shape = SPRITE_SHAPE(8x8), + .size = SPRITE_SIZE(8x8), + .priority = 2 +}; + +static const union AnimCmd gAnimCmd_83F1C78[] = { + ANIMCMD_FRAME(0, 30), + ANIMCMD_FRAME(4, 60), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd gAnimCmd_83F1C84[] = { + ANIMCMD_FRAME(1, 20), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd gAnimCmd_83F1C8C[] = { + ANIMCMD_FRAME(0, 20), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd *const gUnknown_83F1C94[] = { + gAnimCmd_83F1C78 +}; + +static const union AnimCmd *const gUnknown_83F1C98[] = { + gAnimCmd_83F1C84, + gAnimCmd_83F1C8C +}; + +static const u16 sWinFlags[] = { + DISPCNT_WIN0_ON, + DISPCNT_WIN1_ON +}; + +static const u8 sWinRegs[][2] = { + {REG_OFFSET_WIN0V, REG_OFFSET_WIN0H}, + {REG_OFFSET_WIN1V, REG_OFFSET_WIN1H} +}; + +static const u8 gUnknown_83F1CA8[] = {15, 1, 2}; + +static const u8 *const sMapNames[] = { + [MAPSEC_PALLET_TOWN - MAPSECS_KANTO] = gMapSecName_PalletTown, + [MAPSEC_VIRIDIAN_CITY - MAPSECS_KANTO] = gMapSecName_ViridianCity, + [MAPSEC_PEWTER_CITY - MAPSECS_KANTO] = gMapSecName_PewterCity, + [MAPSEC_CERULEAN_CITY - MAPSECS_KANTO] = gMapSecName_CeruleanCity, + [MAPSEC_LAVENDER_TOWN - MAPSECS_KANTO] = gMapSecName_LavenderTown, + [MAPSEC_VERMILION_CITY - MAPSECS_KANTO] = gMapSecName_VermilionCity, + [MAPSEC_CELADON_CITY - MAPSECS_KANTO] = gMapSecName_CeladonCity, + [MAPSEC_FUCHSIA_CITY - MAPSECS_KANTO] = gMapSecName_FuchsiaCity, + [MAPSEC_CINNABAR_ISLAND - MAPSECS_KANTO] = gMapSecName_CinnabarIsland, + [MAPSEC_INDIGO_PLATEAU - MAPSECS_KANTO] = gMapSecName_IndigoPlateau, + [MAPSEC_SAFFRON_CITY - MAPSECS_KANTO] = gMapSecName_SaffronCity, + [MAPSEC_ROUTE_4_FLYDUP - MAPSECS_KANTO] = gMapSecName_Route4, + [MAPSEC_ROUTE_10_FLYDUP - MAPSECS_KANTO] = gMapSecName_Route10, + [MAPSEC_ROUTE_1 - MAPSECS_KANTO] = gMapSecName_Route1, + [MAPSEC_ROUTE_2 - MAPSECS_KANTO] = gMapSecName_Route2, + [MAPSEC_ROUTE_3 - MAPSECS_KANTO] = gMapSecName_Route3, + [MAPSEC_ROUTE_4 - MAPSECS_KANTO] = gMapSecName_Route4_2, + [MAPSEC_ROUTE_5 - MAPSECS_KANTO] = gMapSecName_Route5, + [MAPSEC_ROUTE_6 - MAPSECS_KANTO] = gMapSecName_Route6, + [MAPSEC_ROUTE_7 - MAPSECS_KANTO] = gMapSecName_Route7, + [MAPSEC_ROUTE_8 - MAPSECS_KANTO] = gMapSecName_Route8, + [MAPSEC_ROUTE_9 - MAPSECS_KANTO] = gMapSecName_Route9, + [MAPSEC_ROUTE_10 - MAPSECS_KANTO] = gMapSecName_Route10_2, + [MAPSEC_ROUTE_11 - MAPSECS_KANTO] = gMapSecName_Route11, + [MAPSEC_ROUTE_12 - MAPSECS_KANTO] = gMapSecName_Route12, + [MAPSEC_ROUTE_13 - MAPSECS_KANTO] = gMapSecName_Route13, + [MAPSEC_ROUTE_14 - MAPSECS_KANTO] = gMapSecName_Route14, + [MAPSEC_ROUTE_15 - MAPSECS_KANTO] = gMapSecName_Route15, + [MAPSEC_ROUTE_16 - MAPSECS_KANTO] = gMapSecName_Route16, + [MAPSEC_ROUTE_17 - MAPSECS_KANTO] = gMapSecName_Route17, + [MAPSEC_ROUTE_18 - MAPSECS_KANTO] = gMapSecName_Route18, + [MAPSEC_ROUTE_19 - MAPSECS_KANTO] = gMapSecName_Route19, + [MAPSEC_ROUTE_20 - MAPSECS_KANTO] = gMapSecName_Route20, + [MAPSEC_ROUTE_21 - MAPSECS_KANTO] = gMapSecName_Route21, + [MAPSEC_ROUTE_22 - MAPSECS_KANTO] = gMapSecName_Route22, + [MAPSEC_ROUTE_23 - MAPSECS_KANTO] = gMapSecName_Route23, + [MAPSEC_ROUTE_24 - MAPSECS_KANTO] = gMapSecName_Route24, + [MAPSEC_ROUTE_25 - MAPSECS_KANTO] = gMapSecName_Route25, + [MAPSEC_VIRIDIAN_FOREST - MAPSECS_KANTO] = gMapSecName_ViridianForest, + [MAPSEC_MT_MOON - MAPSECS_KANTO] = gMapSecName_MtMoon, + [MAPSEC_S_S_ANNE - MAPSECS_KANTO] = gMapSecName_SSAnne, + [MAPSEC_UNDERGROUND_PATH - MAPSECS_KANTO] = gMapSecName_UndergroundPath, + [MAPSEC_UNDERGROUND_PATH_2 - MAPSECS_KANTO] = gMapSecName_UndergroundPath_2, + [MAPSEC_DIGLETTS_CAVE - MAPSECS_KANTO] = gMapSecName_DiglettsCave, + [MAPSEC_KANTO_VICTORY_ROAD - MAPSECS_KANTO] = gMapSecName_VictoryRoad, + [MAPSEC_ROCKET_HIDEOUT - MAPSECS_KANTO] = gMapSecName_RocketHideout, + [MAPSEC_SILPH_CO - MAPSECS_KANTO] = gMapSecName_SilphCo, + [MAPSEC_POKEMON_MANSION - MAPSECS_KANTO] = gMapSecName_PokemonMansion, + [MAPSEC_KANTO_SAFARI_ZONE - MAPSECS_KANTO] = gMapSecName_SafariZone, + [MAPSEC_POKEMON_LEAGUE - MAPSECS_KANTO] = gMapSecName_PokemonLeague, + [MAPSEC_ROCK_TUNNEL - MAPSECS_KANTO] = gMapSecName_RockTunnel, + [MAPSEC_SEAFOAM_ISLANDS - MAPSECS_KANTO] = gMapSecName_SeafoamIslands, + [MAPSEC_POKEMON_TOWER - MAPSECS_KANTO] = gMapSecName_PokemonTower, + [MAPSEC_CERULEAN_CAVE - MAPSECS_KANTO] = gMapSecName_CeruleanCave, + [MAPSEC_POWER_PLANT - MAPSECS_KANTO] = gMapSecName_PowerPlant, + [MAPSEC_ONE_ISLAND - MAPSECS_KANTO] = gMapSecName_OneIsland, + [MAPSEC_TWO_ISLAND - MAPSECS_KANTO] = gMapSecName_TwoIsland, + [MAPSEC_THREE_ISLAND - MAPSECS_KANTO] = gMapSecName_ThreeIsland, + [MAPSEC_FOUR_ISLAND - MAPSECS_KANTO] = gMapSecName_FourIsland, + [MAPSEC_FIVE_ISLAND - MAPSECS_KANTO] = gMapSecName_FiveIsland, + [MAPSEC_SEVEN_ISLAND - MAPSECS_KANTO] = gMapSecName_SevenIsland, + [MAPSEC_SIX_ISLAND - MAPSECS_KANTO] = gMapSecName_SixIsland, + [MAPSEC_KINDLE_ROAD - MAPSECS_KANTO] = gMapSecName_KindleRoad, + [MAPSEC_TREASURE_BEACH - MAPSECS_KANTO] = gMapSecName_TreasureBeach, + [MAPSEC_CAPE_BRINK - MAPSECS_KANTO] = gMapSecName_CapeBrink, + [MAPSEC_BOND_BRIDGE - MAPSECS_KANTO] = gMapSecName_BondBridge, + [MAPSEC_THREE_ISLE_PORT - MAPSECS_KANTO] = gMapSecName_ThreeIslePort, + [MAPSEC_SEVII_ISLE_6 - MAPSECS_KANTO] = gMapSecName_SeviiIsle6, + [MAPSEC_SEVII_ISLE_7 - MAPSECS_KANTO] = gMapSecName_SeviiIsle7, + [MAPSEC_SEVII_ISLE_8 - MAPSECS_KANTO] = gMapSecName_SeviiIsle8, + [MAPSEC_SEVII_ISLE_9 - MAPSECS_KANTO] = gMapSecName_SeviiIsle9, + [MAPSEC_RESORT_GORGEOUS - MAPSECS_KANTO] = gMapSecName_ResortGorgeous, + [MAPSEC_WATER_LABYRINTH - MAPSECS_KANTO] = gMapSecName_WaterLabyrinth, + [MAPSEC_FIVE_ISLE_MEADOW - MAPSECS_KANTO] = gMapSecName_FiveIsleMeadow, + [MAPSEC_MEMORIAL_PILLAR - MAPSECS_KANTO] = gMapSecName_MemorialPillar, + [MAPSEC_OUTCAST_ISLAND - MAPSECS_KANTO] = gMapSecName_OutcastIsland, + [MAPSEC_GREEN_PATH - MAPSECS_KANTO] = gMapSecName_GreenPath, + [MAPSEC_WATER_PATH - MAPSECS_KANTO] = gMapSecName_WaterPath, + [MAPSEC_RUIN_VALLEY - MAPSECS_KANTO] = gMapSecName_RuinValley, + [MAPSEC_TRAINER_TOWER - MAPSECS_KANTO] = gMapSecName_TrainerTower, + [MAPSEC_CANYON_ENTRANCE - MAPSECS_KANTO] = gMapSecName_CanyonEntrance, + [MAPSEC_SEVAULT_CANYON - MAPSECS_KANTO] = gMapSecName_SevaultCanyon, + [MAPSEC_TANOBY_RUINS - MAPSECS_KANTO] = gMapSecName_TanobyRuins, + [MAPSEC_SEVII_ISLE_22 - MAPSECS_KANTO] = gMapSecName_SeviiIsle22, + [MAPSEC_SEVII_ISLE_23 - MAPSECS_KANTO] = gMapSecName_SeviiIsle23, + [MAPSEC_SEVII_ISLE_24 - MAPSECS_KANTO] = gMapSecName_SeviiIsle24, + [MAPSEC_NAVEL_ROCK - MAPSECS_KANTO] = gMapSecName_NavelRock, + [MAPSEC_MT_EMBER - MAPSECS_KANTO] = gMapSecName_MtEmber, + [MAPSEC_BERRY_FOREST - MAPSECS_KANTO] = gMapSecName_BerryForest, + [MAPSEC_ICEFALL_CAVE - MAPSECS_KANTO] = gMapSecName_IcefallCave, + [MAPSEC_ROCKET_WAREHOUSE - MAPSECS_KANTO] = gMapSecName_RocketWarehouse, + [MAPSEC_TRAINER_TOWER_2 - MAPSECS_KANTO] = gMapSecName_TrainerTower_2, + [MAPSEC_DOTTED_HOLE - MAPSECS_KANTO] = gMapSecName_DottedHole, + [MAPSEC_LOST_CAVE - MAPSECS_KANTO] = gMapSecName_LostCave, + [MAPSEC_PATTERN_BUSH - MAPSECS_KANTO] = gMapSecName_PatternBush, + [MAPSEC_ALTERING_CAVE - MAPSECS_KANTO] = gMapSecName_AlteringCave, + [MAPSEC_TANOBY_CHAMBERS - MAPSECS_KANTO] = gMapSecName_TanobyChambers, + [MAPSEC_THREE_ISLE_PATH - MAPSECS_KANTO] = gMapSecName_ThreeIslePath, + [MAPSEC_TANOBY_KEY - MAPSECS_KANTO] = gMapSecName_TanobyKey, + [MAPSEC_BIRTH_ISLAND - MAPSECS_KANTO] = gMapSecName_BirthIsland, + [MAPSEC_MONEAN_CHAMBER - MAPSECS_KANTO] = gMapSecName_MoneanChamber, + [MAPSEC_LIPTOO_CHAMBER - MAPSECS_KANTO] = gMapSecName_LiptooChamber, + [MAPSEC_WEEPTH_CHAMBER - MAPSECS_KANTO] = gMapSecName_WeepthChamber, + [MAPSEC_DILFORD_CHAMBER - MAPSECS_KANTO] = gMapSecName_DilfordChamber, + [MAPSEC_SCUFIB_CHAMBER - MAPSECS_KANTO] = gMapSecName_ScufibChamber, + [MAPSEC_RIXY_CHAMBER - MAPSECS_KANTO] = gMapSecName_RixyChamber, + [MAPSEC_VIAPOIS_CHAMBER - MAPSECS_KANTO] = gMapSecName_ViapoisChamber, + [MAPSEC_EMBER_SPA - MAPSECS_KANTO] = gMapSecName_EmberSpa, + [MAPSEC_SPECIAL_AREA - MAPSECS_KANTO] = gMapSecName_CeladonDept +}; + +static const u16 sMapSectionTopLeftCorners[0xC6][2] = { + [MAPSEC_PALLET_TOWN - MAPSECS_KANTO] = {0x04, 0x0b}, + [MAPSEC_VIRIDIAN_CITY - MAPSECS_KANTO] = {0x04, 0x08}, + [MAPSEC_PEWTER_CITY - MAPSECS_KANTO] = {0x04, 0x04}, + [MAPSEC_CERULEAN_CITY - MAPSECS_KANTO] = {0x0e, 0x03}, + [MAPSEC_LAVENDER_TOWN - MAPSECS_KANTO] = {0x12, 0x06}, + [MAPSEC_VERMILION_CITY - MAPSECS_KANTO] = {0x0e, 0x09}, + [MAPSEC_CELADON_CITY - MAPSECS_KANTO] = {0x0b, 0x06}, + [MAPSEC_FUCHSIA_CITY - MAPSECS_KANTO] = {0x0c, 0x0c}, + [MAPSEC_CINNABAR_ISLAND - MAPSECS_KANTO] = {0x04, 0x0e}, + [MAPSEC_INDIGO_PLATEAU - MAPSECS_KANTO] = {0x02, 0x03}, + [MAPSEC_SAFFRON_CITY - MAPSECS_KANTO] = {0x0e, 0x06}, + [MAPSEC_ROUTE_4_FLYDUP - MAPSECS_KANTO] = {0x08, 0x03}, + [MAPSEC_ROUTE_10_FLYDUP - MAPSECS_KANTO] = {0x12, 0x03}, + [MAPSEC_ROUTE_1 - MAPSECS_KANTO] = {0x04, 0x09}, + [MAPSEC_ROUTE_2 - MAPSECS_KANTO] = {0x04, 0x05}, + [MAPSEC_ROUTE_3 - MAPSECS_KANTO] = {0x05, 0x04}, + [MAPSEC_ROUTE_4 - MAPSECS_KANTO] = {0x08, 0x03}, + [MAPSEC_ROUTE_5 - MAPSECS_KANTO] = {0x0e, 0x04}, + [MAPSEC_ROUTE_6 - MAPSECS_KANTO] = {0x0e, 0x07}, + [MAPSEC_ROUTE_7 - MAPSECS_KANTO] = {0x0c, 0x06}, + [MAPSEC_ROUTE_8 - MAPSECS_KANTO] = {0x0f, 0x06}, + [MAPSEC_ROUTE_9 - MAPSECS_KANTO] = {0x0f, 0x03}, + [MAPSEC_ROUTE_10 - MAPSECS_KANTO] = {0x12, 0x03}, + [MAPSEC_ROUTE_11 - MAPSECS_KANTO] = {0x0f, 0x09}, + [MAPSEC_ROUTE_12 - MAPSECS_KANTO] = {0x12, 0x07}, + [MAPSEC_ROUTE_13 - MAPSECS_KANTO] = {0x10, 0x0b}, + [MAPSEC_ROUTE_14 - MAPSECS_KANTO] = {0x0f, 0x0b}, + [MAPSEC_ROUTE_15 - MAPSECS_KANTO] = {0x0d, 0x0c}, + [MAPSEC_ROUTE_16 - MAPSECS_KANTO] = {0x07, 0x06}, + [MAPSEC_ROUTE_17 - MAPSECS_KANTO] = {0x07, 0x07}, + [MAPSEC_ROUTE_18 - MAPSECS_KANTO] = {0x07, 0x0c}, + [MAPSEC_ROUTE_19 - MAPSECS_KANTO] = {0x0c, 0x0d}, + [MAPSEC_ROUTE_20 - MAPSECS_KANTO] = {0x05, 0x0e}, + [MAPSEC_ROUTE_21 - MAPSECS_KANTO] = {0x04, 0x0c}, + [MAPSEC_ROUTE_22 - MAPSECS_KANTO] = {0x02, 0x08}, + [MAPSEC_ROUTE_23 - MAPSECS_KANTO] = {0x02, 0x04}, + [MAPSEC_ROUTE_24 - MAPSECS_KANTO] = {0x0e, 0x01}, + [MAPSEC_ROUTE_25 - MAPSECS_KANTO] = {0x0f, 0x01}, + [MAPSEC_ONE_ISLAND - MAPSECS_KANTO] = {0x01, 0x08}, + [MAPSEC_TWO_ISLAND - MAPSECS_KANTO] = {0x09, 0x09}, + [MAPSEC_THREE_ISLAND - MAPSECS_KANTO] = {0x12, 0x0c}, + [MAPSEC_FOUR_ISLAND - MAPSECS_KANTO] = {0x03, 0x04}, + [MAPSEC_FIVE_ISLAND - MAPSECS_KANTO] = {0x10, 0x0b}, + [MAPSEC_SEVEN_ISLAND - MAPSECS_KANTO] = {0x05, 0x08}, + [MAPSEC_SIX_ISLAND - MAPSECS_KANTO] = {0x11, 0x05}, + [MAPSEC_KINDLE_ROAD - MAPSECS_KANTO] = {0x02, 0x03}, + [MAPSEC_TREASURE_BEACH - MAPSECS_KANTO] = {0x01, 0x09}, + [MAPSEC_CAPE_BRINK - MAPSECS_KANTO] = {0x09, 0x07}, + [MAPSEC_BOND_BRIDGE - MAPSECS_KANTO] = {0x0d, 0x0c}, + [MAPSEC_THREE_ISLE_PORT - MAPSECS_KANTO] = {0x12, 0x0d}, + [MAPSEC_SEVII_ISLE_6 - MAPSECS_KANTO] = {0x04, 0x03}, + [MAPSEC_SEVII_ISLE_7 - MAPSECS_KANTO] = {0x05, 0x04}, + [MAPSEC_SEVII_ISLE_8 - MAPSECS_KANTO] = {0x01, 0x04}, + [MAPSEC_SEVII_ISLE_9 - MAPSECS_KANTO] = {0x04, 0x05}, + [MAPSEC_RESORT_GORGEOUS - MAPSECS_KANTO] = {0x10, 0x09}, + [MAPSEC_WATER_LABYRINTH - MAPSECS_KANTO] = {0x0e, 0x0a}, + [MAPSEC_FIVE_ISLE_MEADOW - MAPSECS_KANTO] = {0x11, 0x0a}, + [MAPSEC_MEMORIAL_PILLAR - MAPSECS_KANTO] = {0x12, 0x0c}, + [MAPSEC_OUTCAST_ISLAND - MAPSECS_KANTO] = {0x0f, 0x00}, + [MAPSEC_GREEN_PATH - MAPSECS_KANTO] = {0x0f, 0x03}, + [MAPSEC_WATER_PATH - MAPSECS_KANTO] = {0x12, 0x03}, + [MAPSEC_RUIN_VALLEY - MAPSECS_KANTO] = {0x10, 0x07}, + [MAPSEC_TRAINER_TOWER - MAPSECS_KANTO] = {0x05, 0x06}, + [MAPSEC_CANYON_ENTRANCE - MAPSECS_KANTO] = {0x05, 0x09}, + [MAPSEC_SEVAULT_CANYON - MAPSECS_KANTO] = {0x06, 0x09}, + [MAPSEC_TANOBY_RUINS - MAPSECS_KANTO] = {0x03, 0x0c}, + [MAPSEC_SEVII_ISLE_22 - MAPSECS_KANTO] = {0x09, 0x0c}, + [MAPSEC_SEVII_ISLE_23 - MAPSECS_KANTO] = {0x03, 0x0e}, + [MAPSEC_SEVII_ISLE_24 - MAPSECS_KANTO] = {0x02, 0x0c}, + [MAPSEC_NAVEL_ROCK - MAPSECS_KANTO] = {0x0a, 0x08}, + [MAPSEC_BIRTH_ISLAND - MAPSECS_KANTO] = {0x12, 0x0d}, +}; + +static const u16 sMapSectionDimensions[0xC6][2] = { + [MAPSEC_PALLET_TOWN - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_VIRIDIAN_CITY - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_PEWTER_CITY - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_CERULEAN_CITY - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_LAVENDER_TOWN - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_VERMILION_CITY - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_CELADON_CITY - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_FUCHSIA_CITY - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_CINNABAR_ISLAND - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_INDIGO_PLATEAU - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_SAFFRON_CITY - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_ROUTE_4_FLYDUP - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_ROUTE_10_FLYDUP - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_ROUTE_1 - MAPSECS_KANTO] = {0x01, 0x02}, + [MAPSEC_ROUTE_2 - MAPSECS_KANTO] = {0x01, 0x03}, + [MAPSEC_ROUTE_3 - MAPSECS_KANTO] = {0x04, 0x01}, + [MAPSEC_ROUTE_4 - MAPSECS_KANTO] = {0x06, 0x01}, + [MAPSEC_ROUTE_5 - MAPSECS_KANTO] = {0x01, 0x02}, + [MAPSEC_ROUTE_6 - MAPSECS_KANTO] = {0x01, 0x02}, + [MAPSEC_ROUTE_7 - MAPSECS_KANTO] = {0x02, 0x01}, + [MAPSEC_ROUTE_8 - MAPSECS_KANTO] = {0x03, 0x01}, + [MAPSEC_ROUTE_9 - MAPSECS_KANTO] = {0x03, 0x01}, + [MAPSEC_ROUTE_10 - MAPSECS_KANTO] = {0x01, 0x03}, + [MAPSEC_ROUTE_11 - MAPSECS_KANTO] = {0x03, 0x01}, + [MAPSEC_ROUTE_12 - MAPSECS_KANTO] = {0x01, 0x05}, + [MAPSEC_ROUTE_13 - MAPSECS_KANTO] = {0x02, 0x01}, + [MAPSEC_ROUTE_14 - MAPSECS_KANTO] = {0x01, 0x02}, + [MAPSEC_ROUTE_15 - MAPSECS_KANTO] = {0x02, 0x01}, + [MAPSEC_ROUTE_16 - MAPSECS_KANTO] = {0x04, 0x01}, + [MAPSEC_ROUTE_17 - MAPSECS_KANTO] = {0x01, 0x05}, + [MAPSEC_ROUTE_18 - MAPSECS_KANTO] = {0x05, 0x01}, + [MAPSEC_ROUTE_19 - MAPSECS_KANTO] = {0x01, 0x02}, + [MAPSEC_ROUTE_20 - MAPSECS_KANTO] = {0x07, 0x01}, + [MAPSEC_ROUTE_21 - MAPSECS_KANTO] = {0x01, 0x02}, + [MAPSEC_ROUTE_22 - MAPSECS_KANTO] = {0x02, 0x01}, + [MAPSEC_ROUTE_23 - MAPSECS_KANTO] = {0x01, 0x04}, + [MAPSEC_ROUTE_24 - MAPSECS_KANTO] = {0x01, 0x02}, + [MAPSEC_ROUTE_25 - MAPSECS_KANTO] = {0x02, 0x01}, + [MAPSEC_VIRIDIAN_FOREST - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_MT_MOON - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_S_S_ANNE - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_UNDERGROUND_PATH - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_UNDERGROUND_PATH_2 - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_DIGLETTS_CAVE - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_KANTO_VICTORY_ROAD - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_ROCKET_HIDEOUT - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_SILPH_CO - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_POKEMON_MANSION - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_KANTO_SAFARI_ZONE - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_POKEMON_LEAGUE - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_ROCK_TUNNEL - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_SEAFOAM_ISLANDS - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_POKEMON_TOWER - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_CERULEAN_CAVE - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_POWER_PLANT - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_ONE_ISLAND - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_TWO_ISLAND - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_THREE_ISLAND - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_FOUR_ISLAND - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_FIVE_ISLAND - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_SEVEN_ISLAND - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_SIX_ISLAND - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_KINDLE_ROAD - MAPSECS_KANTO] = {0x01, 0x06}, + [MAPSEC_TREASURE_BEACH - MAPSECS_KANTO] = {0x01, 0x02}, + [MAPSEC_CAPE_BRINK - MAPSECS_KANTO] = {0x01, 0x02}, + [MAPSEC_BOND_BRIDGE - MAPSECS_KANTO] = {0x04, 0x01}, + [MAPSEC_THREE_ISLE_PORT - MAPSECS_KANTO] = {0x02, 0x01}, + [MAPSEC_SEVII_ISLE_6 - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_SEVII_ISLE_7 - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_SEVII_ISLE_8 - MAPSECS_KANTO] = {0x03, 0x01}, + [MAPSEC_SEVII_ISLE_9 - MAPSECS_KANTO] = {0x01, 0x02}, + [MAPSEC_RESORT_GORGEOUS - MAPSECS_KANTO] = {0x03, 0x01}, + [MAPSEC_WATER_LABYRINTH - MAPSECS_KANTO] = {0x03, 0x01}, + [MAPSEC_FIVE_ISLE_MEADOW - MAPSECS_KANTO] = {0x01, 0x03}, + [MAPSEC_MEMORIAL_PILLAR - MAPSECS_KANTO] = {0x01, 0x03}, + [MAPSEC_OUTCAST_ISLAND - MAPSECS_KANTO] = {0x01, 0x03}, + [MAPSEC_GREEN_PATH - MAPSECS_KANTO] = {0x03, 0x01}, + [MAPSEC_WATER_PATH - MAPSECS_KANTO] = {0x01, 0x05}, + [MAPSEC_RUIN_VALLEY - MAPSECS_KANTO] = {0x02, 0x02}, + [MAPSEC_TRAINER_TOWER - MAPSECS_KANTO] = {0x01, 0x02}, + [MAPSEC_CANYON_ENTRANCE - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_SEVAULT_CANYON - MAPSECS_KANTO] = {0x01, 0x03}, + [MAPSEC_TANOBY_RUINS - MAPSECS_KANTO] = {0x07, 0x01}, + [MAPSEC_SEVII_ISLE_22 - MAPSECS_KANTO] = {0x01, 0x03}, + [MAPSEC_SEVII_ISLE_23 - MAPSECS_KANTO] = {0x06, 0x01}, + [MAPSEC_SEVII_ISLE_24 - MAPSECS_KANTO] = {0x01, 0x03}, + [MAPSEC_NAVEL_ROCK - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_MT_EMBER - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_BERRY_FOREST - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_ICEFALL_CAVE - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_ROCKET_WAREHOUSE - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_TRAINER_TOWER_2 - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_DOTTED_HOLE - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_LOST_CAVE - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_PATTERN_BUSH - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_ALTERING_CAVE - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_TANOBY_CHAMBERS - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_THREE_ISLE_PATH - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_TANOBY_KEY - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_BIRTH_ISLAND - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_MONEAN_CHAMBER - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_LIPTOO_CHAMBER - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_WEEPTH_CHAMBER - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_DILFORD_CHAMBER - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_SCUFIB_CHAMBER - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_RIXY_CHAMBER - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_VIAPOIS_CHAMBER - MAPSECS_KANTO] = {0x01, 0x01}, + [MAPSEC_EMBER_SPA - MAPSECS_KANTO] = {0x01, 0x01} +}; + +static const u8 sRegionMapSections_Kanto[][15][22] = { + { + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, + MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, + MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, + MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_24, MAPSEC_ROUTE_25, + MAPSEC_ROUTE_25, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, + MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_24, MAPSEC_NONE, + MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_INDIGO_PLATEAU, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, + MAPSEC_NONE, MAPSEC_ROUTE_4_FLYDUP, MAPSEC_ROUTE_4, MAPSEC_ROUTE_4, MAPSEC_ROUTE_4, MAPSEC_ROUTE_4, + MAPSEC_ROUTE_4, MAPSEC_CERULEAN_CITY, MAPSEC_ROUTE_9, MAPSEC_ROUTE_9, MAPSEC_ROUTE_9, MAPSEC_ROUTE_10_FLYDUP, + MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_23, MAPSEC_NONE, MAPSEC_PEWTER_CITY, MAPSEC_ROUTE_3, MAPSEC_ROUTE_3, + MAPSEC_ROUTE_3, MAPSEC_ROUTE_3, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, + MAPSEC_ROUTE_5, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_10, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_23, MAPSEC_NONE, MAPSEC_ROUTE_2, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, + MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_5, MAPSEC_NONE, + MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_10, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_23, MAPSEC_NONE, MAPSEC_ROUTE_2, MAPSEC_NONE, MAPSEC_NONE, + MAPSEC_ROUTE_16, MAPSEC_ROUTE_16, MAPSEC_ROUTE_16, MAPSEC_ROUTE_16, MAPSEC_CELADON_CITY, MAPSEC_ROUTE_7, + MAPSEC_ROUTE_7, MAPSEC_SAFFRON_CITY, MAPSEC_ROUTE_8, MAPSEC_ROUTE_8, MAPSEC_ROUTE_8, MAPSEC_LAVENDER_TOWN, + MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_23, MAPSEC_NONE, MAPSEC_ROUTE_2, MAPSEC_NONE, MAPSEC_NONE, + MAPSEC_ROUTE_17, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_6, + MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_12, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_22, MAPSEC_ROUTE_22, MAPSEC_VIRIDIAN_CITY, MAPSEC_NONE, MAPSEC_NONE, + MAPSEC_ROUTE_17, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_6, + MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_12, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_1, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_17, + MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_VERMILION_CITY, + MAPSEC_ROUTE_11, MAPSEC_ROUTE_11, MAPSEC_ROUTE_11, MAPSEC_ROUTE_12, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_1, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_17, + MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, + MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_12, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_PALLET_TOWN, MAPSEC_NONE, MAPSEC_NONE, + MAPSEC_ROUTE_17, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, + MAPSEC_ROUTE_14, MAPSEC_ROUTE_13, MAPSEC_ROUTE_13, MAPSEC_ROUTE_12, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_21, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_18, + MAPSEC_ROUTE_18, MAPSEC_ROUTE_18, MAPSEC_ROUTE_18, MAPSEC_ROUTE_18, MAPSEC_FUCHSIA_CITY, MAPSEC_ROUTE_15, + MAPSEC_ROUTE_15, MAPSEC_ROUTE_14, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, + MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_21, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, + MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROUTE_19, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, + MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_CINNABAR_ISLAND, MAPSEC_ROUTE_20, MAPSEC_ROUTE_20, + MAPSEC_ROUTE_20, MAPSEC_ROUTE_20, MAPSEC_ROUTE_20, MAPSEC_ROUTE_20, MAPSEC_ROUTE_20, MAPSEC_ROUTE_19, + MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, + MAPSEC_NONE} + }, { + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_MT_MOON, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_CERULEAN_CAVE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ROCK_TUNNEL, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_KANTO_VICTORY_ROAD, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_POWER_PLANT, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_DIGLETTS_CAVE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_VIRIDIAN_FOREST, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_POKEMON_TOWER, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_DIGLETTS_CAVE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_KANTO_SAFARI_ZONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_POKEMON_MANSION, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_SEAFOAM_ISLANDS, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE} + } +}; + +static const u8 sRegionMapSections_Sevii123[][15][22] = { + { + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_KINDLE_ROAD, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_KINDLE_ROAD, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_KINDLE_ROAD, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_KINDLE_ROAD, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_KINDLE_ROAD, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_CAPE_BRINK, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_ONE_ISLAND, MAPSEC_KINDLE_ROAD, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_CAPE_BRINK, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_TREASURE_BEACH, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_TWO_ISLAND, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_TREASURE_BEACH, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_BOND_BRIDGE, MAPSEC_BOND_BRIDGE, MAPSEC_BOND_BRIDGE, MAPSEC_BOND_BRIDGE, MAPSEC_THREE_ISLAND, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_THREE_ISLE_PORT, MAPSEC_THREE_ISLE_PORT, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE} + }, { + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_MT_EMBER, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_BERRY_FOREST, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE} + } +}; + +static const u8 sRegionMapSections_Sevii45[][15][22] = { + { + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_FOUR_ISLAND, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NAVEL_ROCK, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_RESORT_GORGEOUS, MAPSEC_RESORT_GORGEOUS, MAPSEC_RESORT_GORGEOUS, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_WATER_LABYRINTH, MAPSEC_WATER_LABYRINTH, MAPSEC_WATER_LABYRINTH, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_FIVE_ISLAND, MAPSEC_FIVE_ISLE_MEADOW, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_FIVE_ISLE_MEADOW, MAPSEC_MEMORIAL_PILLAR, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_MEMORIAL_PILLAR, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_MEMORIAL_PILLAR, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE} + }, { + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ICEFALL_CAVE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_LOST_CAVE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE} + } +}; + +static const u8 sRegionMapSections_Sevii67[][15][22] = { + { + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_OUTCAST_ISLAND, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_OUTCAST_ISLAND, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_OUTCAST_ISLAND, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_GREEN_PATH, MAPSEC_GREEN_PATH, MAPSEC_GREEN_PATH, MAPSEC_WATER_PATH, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_WATER_PATH, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_SIX_ISLAND, MAPSEC_WATER_PATH, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_TRAINER_TOWER, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_WATER_PATH, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_TRAINER_TOWER, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_RUIN_VALLEY, MAPSEC_RUIN_VALLEY, MAPSEC_WATER_PATH, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_SEVEN_ISLAND, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_RUIN_VALLEY, MAPSEC_RUIN_VALLEY, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_CANYON_ENTRANCE, MAPSEC_SEVAULT_CANYON, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_SEVAULT_CANYON, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_SEVAULT_CANYON, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_TANOBY_RUINS, MAPSEC_TANOBY_RUINS, MAPSEC_TANOBY_RUINS, MAPSEC_TANOBY_RUINS, MAPSEC_TANOBY_RUINS, MAPSEC_TANOBY_RUINS, MAPSEC_TANOBY_RUINS, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_BIRTH_ISLAND, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE} + }, { + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_ALTERING_CAVE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_PATTERN_BUSH, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_DOTTED_HOLE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_TANOBY_CHAMBERS, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE}, + {MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE, MAPSEC_NONE} + } +}; + +static const u8 sMapsecToSpawn[][3] = { + [MAPSEC_PALLET_TOWN - MAPSECS_KANTO] = {MAP_GROUP(PALLET_TOWN), MAP_NUM(PALLET_TOWN), SPAWN_PALLET_TOWN}, + [MAPSEC_VIRIDIAN_CITY - MAPSECS_KANTO] = {MAP_GROUP(VIRIDIAN_CITY), MAP_NUM(VIRIDIAN_CITY), SPAWN_VIRIDIAN_CITY}, + [MAPSEC_PEWTER_CITY - MAPSECS_KANTO] = {MAP_GROUP(PEWTER_CITY), MAP_NUM(PEWTER_CITY), SPAWN_PEWTER_CITY}, + [MAPSEC_CERULEAN_CITY - MAPSECS_KANTO] = {MAP_GROUP(CERULEAN_CITY), MAP_NUM(CERULEAN_CITY), SPAWN_CERULEAN_CITY}, + [MAPSEC_LAVENDER_TOWN - MAPSECS_KANTO] = {MAP_GROUP(LAVENDER_TOWN), MAP_NUM(LAVENDER_TOWN), SPAWN_LAVENDER_TOWN}, + [MAPSEC_VERMILION_CITY - MAPSECS_KANTO] = {MAP_GROUP(VERMILION_CITY), MAP_NUM(VERMILION_CITY), SPAWN_VERMILION_CITY}, + [MAPSEC_CELADON_CITY - MAPSECS_KANTO] = {MAP_GROUP(CELADON_CITY), MAP_NUM(CELADON_CITY), SPAWN_CELADON_CITY}, + [MAPSEC_FUCHSIA_CITY - MAPSECS_KANTO] = {MAP_GROUP(FUCHSIA_CITY), MAP_NUM(FUCHSIA_CITY), SPAWN_FUCHSIA_CITY}, + [MAPSEC_CINNABAR_ISLAND - MAPSECS_KANTO] = {MAP_GROUP(CINNABAR_ISLAND), MAP_NUM(CINNABAR_ISLAND), SPAWN_CINNABAR_ISLAND}, + [MAPSEC_INDIGO_PLATEAU - MAPSECS_KANTO] = {MAP_GROUP(INDIGO_PLATEAU_EXTERIOR), MAP_NUM(INDIGO_PLATEAU_EXTERIOR), SPAWN_INDIGO_PLATEAU}, + [MAPSEC_SAFFRON_CITY - MAPSECS_KANTO] = {MAP_GROUP(SAFFRON_CITY), MAP_NUM(SAFFRON_CITY), SPAWN_SAFFRON_CITY}, + [MAPSEC_ROUTE_4_FLYDUP - MAPSECS_KANTO] = {MAP_GROUP(ROUTE4), MAP_NUM(ROUTE4), SPAWN_ROUTE4}, + [MAPSEC_ROUTE_10_FLYDUP - MAPSECS_KANTO] = {MAP_GROUP(ROUTE10), MAP_NUM(ROUTE10), SPAWN_ROUTE10}, + [MAPSEC_ROUTE_1 - MAPSECS_KANTO] = {MAP_GROUP(ROUTE1), MAP_NUM(ROUTE1), 0}, + [MAPSEC_ROUTE_2 - MAPSECS_KANTO] = {MAP_GROUP(ROUTE2), MAP_NUM(ROUTE2), 0}, + [MAPSEC_ROUTE_3 - MAPSECS_KANTO] = {MAP_GROUP(ROUTE3), MAP_NUM(ROUTE3), 0}, + [MAPSEC_ROUTE_4 - MAPSECS_KANTO] = {MAP_GROUP(ROUTE4), MAP_NUM(ROUTE4), 0}, + [MAPSEC_ROUTE_5 - MAPSECS_KANTO] = {MAP_GROUP(ROUTE5), MAP_NUM(ROUTE5), 0}, + [MAPSEC_ROUTE_6 - MAPSECS_KANTO] = {MAP_GROUP(ROUTE6), MAP_NUM(ROUTE6), 0}, + [MAPSEC_ROUTE_7 - MAPSECS_KANTO] = {MAP_GROUP(ROUTE7), MAP_NUM(ROUTE7), 0}, + [MAPSEC_ROUTE_8 - MAPSECS_KANTO] = {MAP_GROUP(ROUTE8), MAP_NUM(ROUTE8), 0}, + [MAPSEC_ROUTE_9 - MAPSECS_KANTO] = {MAP_GROUP(ROUTE9), MAP_NUM(ROUTE9), 0}, + [MAPSEC_ROUTE_10 - MAPSECS_KANTO] = {MAP_GROUP(ROUTE10), MAP_NUM(ROUTE10), 0}, + [MAPSEC_ROUTE_11 - MAPSECS_KANTO] = {MAP_GROUP(ROUTE11), MAP_NUM(ROUTE11), 0}, + [MAPSEC_ROUTE_12 - MAPSECS_KANTO] = {MAP_GROUP(ROUTE12), MAP_NUM(ROUTE12), 0}, + [MAPSEC_ROUTE_13 - MAPSECS_KANTO] = {MAP_GROUP(ROUTE13), MAP_NUM(ROUTE13), 0}, + [MAPSEC_ROUTE_14 - MAPSECS_KANTO] = {MAP_GROUP(ROUTE14), MAP_NUM(ROUTE14), 0}, + [MAPSEC_ROUTE_15 - MAPSECS_KANTO] = {MAP_GROUP(ROUTE15), MAP_NUM(ROUTE15), 0}, + [MAPSEC_ROUTE_16 - MAPSECS_KANTO] = {MAP_GROUP(ROUTE16), MAP_NUM(ROUTE16), 0}, + [MAPSEC_ROUTE_17 - MAPSECS_KANTO] = {MAP_GROUP(ROUTE17), MAP_NUM(ROUTE17), 0}, + [MAPSEC_ROUTE_18 - MAPSECS_KANTO] = {MAP_GROUP(ROUTE18), MAP_NUM(ROUTE18), 0}, + [MAPSEC_ROUTE_19 - MAPSECS_KANTO] = {MAP_GROUP(ROUTE19), MAP_NUM(ROUTE19), 0}, + [MAPSEC_ROUTE_20 - MAPSECS_KANTO] = {MAP_GROUP(ROUTE20), MAP_NUM(ROUTE20), 0}, + [MAPSEC_ROUTE_21 - MAPSECS_KANTO] = {MAP_GROUP(ROUTE21_NORTH), MAP_NUM(ROUTE21_NORTH), 0}, + [MAPSEC_ROUTE_22 - MAPSECS_KANTO] = {MAP_GROUP(ROUTE22), MAP_NUM(ROUTE22), 0}, + [MAPSEC_ROUTE_23 - MAPSECS_KANTO] = {MAP_GROUP(ROUTE23), MAP_NUM(ROUTE23), 0}, + [MAPSEC_ROUTE_24 - MAPSECS_KANTO] = {MAP_GROUP(ROUTE24), MAP_NUM(ROUTE24), 0}, + [MAPSEC_ROUTE_25 - MAPSECS_KANTO] = {MAP_GROUP(ROUTE25), MAP_NUM(ROUTE25), 0}, + [MAPSEC_VIRIDIAN_FOREST - MAPSECS_KANTO] = {MAP_GROUP(PALLET_TOWN), MAP_NUM(PALLET_TOWN), 0}, + [MAPSEC_MT_MOON - MAPSECS_KANTO] = {MAP_GROUP(PALLET_TOWN), MAP_NUM(PALLET_TOWN), 0}, + [MAPSEC_S_S_ANNE - MAPSECS_KANTO] = {MAP_GROUP(PALLET_TOWN), MAP_NUM(PALLET_TOWN), 0}, + [MAPSEC_UNDERGROUND_PATH - MAPSECS_KANTO] = {MAP_GROUP(PALLET_TOWN), MAP_NUM(PALLET_TOWN), 0}, + [MAPSEC_UNDERGROUND_PATH_2 - MAPSECS_KANTO] = {MAP_GROUP(PALLET_TOWN), MAP_NUM(PALLET_TOWN), 0}, + [MAPSEC_DIGLETTS_CAVE - MAPSECS_KANTO] = {MAP_GROUP(PALLET_TOWN), MAP_NUM(PALLET_TOWN), 0}, + [MAPSEC_KANTO_VICTORY_ROAD - MAPSECS_KANTO] = {MAP_GROUP(PALLET_TOWN), MAP_NUM(PALLET_TOWN), 0}, + [MAPSEC_ROCKET_HIDEOUT - MAPSECS_KANTO] = {MAP_GROUP(PALLET_TOWN), MAP_NUM(PALLET_TOWN), 0}, + [MAPSEC_SILPH_CO - MAPSECS_KANTO] = {MAP_GROUP(PALLET_TOWN), MAP_NUM(PALLET_TOWN), 0}, + [MAPSEC_POKEMON_MANSION - MAPSECS_KANTO] = {MAP_GROUP(PALLET_TOWN), MAP_NUM(PALLET_TOWN), 0}, + [MAPSEC_KANTO_SAFARI_ZONE - MAPSECS_KANTO] = {MAP_GROUP(PALLET_TOWN), MAP_NUM(PALLET_TOWN), 0}, + [MAPSEC_POKEMON_LEAGUE - MAPSECS_KANTO] = {MAP_GROUP(PALLET_TOWN), MAP_NUM(PALLET_TOWN), 0}, + [MAPSEC_ROCK_TUNNEL - MAPSECS_KANTO] = {MAP_GROUP(PALLET_TOWN), MAP_NUM(PALLET_TOWN), 0}, + [MAPSEC_SEAFOAM_ISLANDS - MAPSECS_KANTO] = {MAP_GROUP(PALLET_TOWN), MAP_NUM(PALLET_TOWN), 0}, + [MAPSEC_POKEMON_TOWER - MAPSECS_KANTO] = {MAP_GROUP(PALLET_TOWN), MAP_NUM(PALLET_TOWN), 0}, + [MAPSEC_CERULEAN_CAVE - MAPSECS_KANTO] = {MAP_GROUP(PALLET_TOWN), MAP_NUM(PALLET_TOWN), 0}, + [MAPSEC_POWER_PLANT - MAPSECS_KANTO] = {MAP_GROUP(PALLET_TOWN), MAP_NUM(PALLET_TOWN), 0}, + [MAPSEC_ONE_ISLAND - MAPSECS_KANTO] = {MAP_GROUP(ONE_ISLAND), MAP_NUM(ONE_ISLAND), SPAWN_ONE_ISLAND}, + [MAPSEC_TWO_ISLAND - MAPSECS_KANTO] = {MAP_GROUP(TWO_ISLAND), MAP_NUM(TWO_ISLAND), SPAWN_TWO_ISLAND}, + [MAPSEC_THREE_ISLAND - MAPSECS_KANTO] = {MAP_GROUP(THREE_ISLAND), MAP_NUM(THREE_ISLAND), SPAWN_THREE_ISLAND}, + [MAPSEC_FOUR_ISLAND - MAPSECS_KANTO] = {MAP_GROUP(FOUR_ISLAND), MAP_NUM(FOUR_ISLAND), SPAWN_FOUR_ISLAND}, + [MAPSEC_FIVE_ISLAND - MAPSECS_KANTO] = {MAP_GROUP(FIVE_ISLAND), MAP_NUM(FIVE_ISLAND), SPAWN_FIVE_ISLAND}, + [MAPSEC_SEVEN_ISLAND - MAPSECS_KANTO] = {MAP_GROUP(SEVEN_ISLAND), MAP_NUM(SEVEN_ISLAND), SPAWN_SEVEN_ISLAND}, + [MAPSEC_SIX_ISLAND - MAPSECS_KANTO] = {MAP_GROUP(SIX_ISLAND), MAP_NUM(SIX_ISLAND), SPAWN_SIX_ISLAND}, + [MAPSEC_KINDLE_ROAD - MAPSECS_KANTO] = {MAP_GROUP(ONE_ISLAND_KINDLE_ROAD), MAP_NUM(ONE_ISLAND_KINDLE_ROAD), 0}, + [MAPSEC_TREASURE_BEACH - MAPSECS_KANTO] = {MAP_GROUP(ONE_ISLAND_TREASURE_BEACH), MAP_NUM(ONE_ISLAND_TREASURE_BEACH), 0}, + [MAPSEC_CAPE_BRINK - MAPSECS_KANTO] = {MAP_GROUP(TWO_ISLAND_CAPE_BRINK), MAP_NUM(TWO_ISLAND_CAPE_BRINK), 0}, + [MAPSEC_BOND_BRIDGE - MAPSECS_KANTO] = {MAP_GROUP(THREE_ISLAND_BOND_BRIDGE), MAP_NUM(THREE_ISLAND_BOND_BRIDGE), 0}, + [MAPSEC_THREE_ISLE_PORT - MAPSECS_KANTO] = {MAP_GROUP(THREE_ISLAND_PORT), MAP_NUM(THREE_ISLAND_PORT), 0}, + [MAPSEC_SEVII_ISLE_6 - MAPSECS_KANTO] = {MAP_GROUP(UNKNOWN_MAP_03_50), MAP_NUM(UNKNOWN_MAP_03_50), 0}, + [MAPSEC_SEVII_ISLE_7 - MAPSECS_KANTO] = {MAP_GROUP(UNKNOWN_MAP_03_51), MAP_NUM(UNKNOWN_MAP_03_51), 0}, + [MAPSEC_SEVII_ISLE_8 - MAPSECS_KANTO] = {MAP_GROUP(UNKNOWN_MAP_03_52), MAP_NUM(UNKNOWN_MAP_03_52), 0}, + [MAPSEC_SEVII_ISLE_9 - MAPSECS_KANTO] = {MAP_GROUP(UNKNOWN_MAP_03_53), MAP_NUM(UNKNOWN_MAP_03_53), 0}, + [MAPSEC_RESORT_GORGEOUS - MAPSECS_KANTO] = {MAP_GROUP(FIVE_ISLAND_RESORT_GORGEOUS), MAP_NUM(FIVE_ISLAND_RESORT_GORGEOUS), 0}, + [MAPSEC_WATER_LABYRINTH - MAPSECS_KANTO] = {MAP_GROUP(FIVE_ISLAND_WATER_LABYRINTH), MAP_NUM(FIVE_ISLAND_WATER_LABYRINTH), 0}, + [MAPSEC_FIVE_ISLE_MEADOW - MAPSECS_KANTO] = {MAP_GROUP(FIVE_ISLAND_MEADOW), MAP_NUM(FIVE_ISLAND_MEADOW), 0}, + [MAPSEC_MEMORIAL_PILLAR - MAPSECS_KANTO] = {MAP_GROUP(FIVE_ISLAND_MEMORIAL_PILLAR), MAP_NUM(FIVE_ISLAND_MEMORIAL_PILLAR), 0}, + [MAPSEC_OUTCAST_ISLAND - MAPSECS_KANTO] = {MAP_GROUP(SIX_ISLAND_OUTCAST_ISLAND), MAP_NUM(SIX_ISLAND_OUTCAST_ISLAND), 0}, + [MAPSEC_GREEN_PATH - MAPSECS_KANTO] = {MAP_GROUP(SIX_ISLAND_GREEN_PATH), MAP_NUM(SIX_ISLAND_GREEN_PATH), 0}, + [MAPSEC_WATER_PATH - MAPSECS_KANTO] = {MAP_GROUP(SIX_ISLAND_WATER_PATH), MAP_NUM(SIX_ISLAND_WATER_PATH), 0}, + [MAPSEC_RUIN_VALLEY - MAPSECS_KANTO] = {MAP_GROUP(SIX_ISLAND_RUIN_VALLEY), MAP_NUM(SIX_ISLAND_RUIN_VALLEY), 0}, + [MAPSEC_TRAINER_TOWER - MAPSECS_KANTO] = {MAP_GROUP(SEVEN_ISLAND_TRAINER_TOWER), MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER), 0}, + [MAPSEC_CANYON_ENTRANCE - MAPSECS_KANTO] = {MAP_GROUP(SEVEN_ISLAND_SEVAULT_CANYON_ENTRANCE), MAP_NUM(SEVEN_ISLAND_SEVAULT_CANYON_ENTRANCE), 0}, + [MAPSEC_SEVAULT_CANYON - MAPSECS_KANTO] = {MAP_GROUP(SEVEN_ISLAND_SEVAULT_CANYON), MAP_NUM(SEVEN_ISLAND_SEVAULT_CANYON), 0}, + [MAPSEC_TANOBY_RUINS - MAPSECS_KANTO] = {MAP_GROUP(SEVEN_ISLAND_TANOBY_RUINS), MAP_NUM(SEVEN_ISLAND_TANOBY_RUINS), 0}, + [MAPSEC_SEVII_ISLE_22 - MAPSECS_KANTO] = {MAP_GROUP(PALLET_TOWN), MAP_NUM(PALLET_TOWN), 0}, + [MAPSEC_SEVII_ISLE_23 - MAPSECS_KANTO] = {MAP_GROUP(PALLET_TOWN), MAP_NUM(PALLET_TOWN), 0}, + [MAPSEC_SEVII_ISLE_24 - MAPSECS_KANTO] = {MAP_GROUP(PALLET_TOWN), MAP_NUM(PALLET_TOWN), 0}, + [MAPSEC_NAVEL_ROCK - MAPSECS_KANTO] = {MAP_GROUP(NAVEL_ROCK_EXTERIOR), MAP_NUM(NAVEL_ROCK_EXTERIOR), 0}, + [MAPSEC_MT_EMBER - MAPSECS_KANTO] = {MAP_GROUP(PALLET_TOWN), MAP_NUM(PALLET_TOWN), 0}, + [MAPSEC_BERRY_FOREST - MAPSECS_KANTO] = {MAP_GROUP(PALLET_TOWN), MAP_NUM(PALLET_TOWN), 0}, + [MAPSEC_ICEFALL_CAVE - MAPSECS_KANTO] = {MAP_GROUP(PALLET_TOWN), MAP_NUM(PALLET_TOWN), 0}, + [MAPSEC_ROCKET_WAREHOUSE - MAPSECS_KANTO] = {MAP_GROUP(PALLET_TOWN), MAP_NUM(PALLET_TOWN), 0}, + [MAPSEC_TRAINER_TOWER_2 - MAPSECS_KANTO] = {MAP_GROUP(PALLET_TOWN), MAP_NUM(PALLET_TOWN), 0}, + [MAPSEC_DOTTED_HOLE - MAPSECS_KANTO] = {MAP_GROUP(PALLET_TOWN), MAP_NUM(PALLET_TOWN), 0}, + [MAPSEC_LOST_CAVE - MAPSECS_KANTO] = {MAP_GROUP(PALLET_TOWN), MAP_NUM(PALLET_TOWN), 0}, + [MAPSEC_PATTERN_BUSH - MAPSECS_KANTO] = {MAP_GROUP(PALLET_TOWN), MAP_NUM(PALLET_TOWN), 0}, + [MAPSEC_ALTERING_CAVE - MAPSECS_KANTO] = {MAP_GROUP(PALLET_TOWN), MAP_NUM(PALLET_TOWN), 0}, + [MAPSEC_TANOBY_CHAMBERS - MAPSECS_KANTO] = {MAP_GROUP(PALLET_TOWN), MAP_NUM(PALLET_TOWN), 0}, + [MAPSEC_THREE_ISLE_PATH - MAPSECS_KANTO] = {MAP_GROUP(PALLET_TOWN), MAP_NUM(PALLET_TOWN), 0}, + [MAPSEC_TANOBY_KEY - MAPSECS_KANTO] = {MAP_GROUP(PALLET_TOWN), MAP_NUM(PALLET_TOWN), 0}, + [MAPSEC_BIRTH_ISLAND - MAPSECS_KANTO] = {MAP_GROUP(BIRTH_ISLAND_EXTERIOR), MAP_NUM(BIRTH_ISLAND_EXTERIOR), 0}, + [MAPSEC_MONEAN_CHAMBER - MAPSECS_KANTO] = {MAP_GROUP(PALLET_TOWN), MAP_NUM(PALLET_TOWN), 0}, + [MAPSEC_LIPTOO_CHAMBER - MAPSECS_KANTO] = {MAP_GROUP(PALLET_TOWN), MAP_NUM(PALLET_TOWN), 0}, + [MAPSEC_WEEPTH_CHAMBER - MAPSECS_KANTO] = {MAP_GROUP(PALLET_TOWN), MAP_NUM(PALLET_TOWN), 0}, + [MAPSEC_DILFORD_CHAMBER - MAPSECS_KANTO] = {MAP_GROUP(PALLET_TOWN), MAP_NUM(PALLET_TOWN), 0}, + [MAPSEC_SCUFIB_CHAMBER - MAPSECS_KANTO] = {MAP_GROUP(PALLET_TOWN), MAP_NUM(PALLET_TOWN), 0}, + [MAPSEC_RIXY_CHAMBER - MAPSECS_KANTO] = {MAP_GROUP(PALLET_TOWN), MAP_NUM(PALLET_TOWN), 0}, + [MAPSEC_VIAPOIS_CHAMBER - MAPSECS_KANTO] = {MAP_GROUP(PALLET_TOWN), MAP_NUM(PALLET_TOWN), 0}, + [MAPSEC_EMBER_SPA - MAPSECS_KANTO] = {MAP_GROUP(PALLET_TOWN), MAP_NUM(PALLET_TOWN), 0}, +}; + +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++; + } +} + +static 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)); +} + +static 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->mapType = kind; + gUnknown_20399D4->field_47A0 = 0; + gUnknown_20399D4->field_47A4 = 0; + gUnknown_20399D4->field_47A8 = 0; + sub_80BFFD0(); + SetMainCallback2(CB2_OpenRegionMap); + } +} + +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->mapType = kind; + gUnknown_20399D4->field_47A0 = 0; + gUnknown_20399D4->field_47A4 = 0; + gUnknown_20399D4->field_47A8 = 0; + gUnknown_20399D4->savedCallback = cb; + sub_80BFFD0(); + SetMainCallback2(CB2_OpenRegionMap); + } +} + +static void sub_80BFFD0(void) +{ + u8 i; + u8 j; + u8 r7; + + switch (gUnknown_20399D4->mapType) + { + 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->regionMapPermissions[i] = sRegionMapPermissions[gUnknown_20399D4->mapType][i]; + } + if (!FlagGet(FLAG_SYS_SEVII_MAP_123)) + gUnknown_20399D4->regionMapPermissions[MAPPERM_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; +} + +static void CB2_OpenRegionMap(void) +{ + switch (gUnknown_20399D4->field_47A4) + { + case 0: + NullVBlankHBlankCallbacks(); + break; + case 1: + ResetGpu(); + break; + case 2: + ResetOamForRegionMap(); + break; + case 3: + if (!HandleLoadRegionMapGfx()) + return; + break; + case 4: + FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 30, 20); + CopyBgTilemapBufferToVram(1); + break; + case 5: + sub_80C0CC8(0, gUnknown_20399D4->layouts[gUnknown_20399D4->field_479B]); + CopyBgTilemapBufferToVram(0); + if (gUnknown_20399D4->mapType != 0) + { + sub_80C0CC8(1, gUnknown_20399D4->layouts[4]); + CopyBgTilemapBufferToVram(1); + } + break; + case 6: + sub_80C0B18(); + PutWindowTilemap(0); + break; + case 7: + sub_80C0BB0(); + PutWindowTilemap(1); + break; + case 8: + if (GetRegionMapPermission(MAPPERM_2) == TRUE) + SetBg0andBg3Visibility(1); + break; + default: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + sub_80C03E8(); + sub_80C08F4(); + break; + } + gUnknown_20399D4->field_47A4++; +} + +static bool8 HandleLoadRegionMapGfx(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->mapType != 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->mapType != 0) + { + DecompressAndCopyTileDataToVram(1, gUnknown_83F1978, 0, 0, 0); + } + break; + case 4: + if (FreeTempTileDataBuffersIfPossible() == TRUE) + return FALSE; + break; + case 5: + LZ77UnCompWram(sRegionMapLayout_Kanto, gUnknown_20399D4->layouts[0]); + break; + case 6: + LZ77UnCompWram(sRegionMapLayout_Sevii123, gUnknown_20399D4->layouts[1]); + break; + case 7: + LZ77UnCompWram(sRegionMapLayout_Sevii45, gUnknown_20399D4->layouts[2]); + break; + case 8: + LZ77UnCompWram(sRegionMapLayout_Sevii67, gUnknown_20399D4->layouts[3]); + break; + default: + LZ77UnCompWram(gUnknown_83F19A0, gUnknown_20399D4->layouts[4]); + return TRUE; + } + gUnknown_20399D4->field_47A8++; + return FALSE; +} + +static void sub_80C03E8(void) +{ + CreateTask(gUnknown_20399D4->field_47B8, 0); + SetMainCallback2(sub_80C08B4); +} + +static bool32 sub_80C0410(void) +{ + if (GetSelectedMapSection(GetWhichRegionMap(), 0, GetMapCursorY(), GetMapCursorX()) == 99) + return FALSE; + else + return TRUE; +} + +static 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 (GetMapCursorX() == 21 && GetMapCursorY() == 11 && GetRegionMapPermission(MAPPERM_0) == TRUE) + PlaySE(SE_W255); + else if (GetMapCursorX() == 21 && GetMapCursorY() == 13) + PlaySE(SE_W255); + } +} + +static void sub_80C04E4(u8 taskId) +{ + switch (gUnknown_20399D4->field_47A0) + { + case 0: + sub_80C4398(GetWhichRegionMap(), taskId, gUnknown_20399D4->field_47B8); + sub_80C3008(0, 0); + sub_80C41D8(1, 1); + gUnknown_20399D4->field_47A0++; + break; + case 1: + if (gUnknown_20399D4->regionMapPermissions[MAPPERM_2] == TRUE) + { + sub_80C2208(taskId, gUnknown_20399D4->field_47B8); + } + else + { + ShowBg(0); + ShowBg(3); + ShowBg(1); + sub_80C4E18(gText_RegionMap_DPadMove); + sub_80C4E74(gText_RegionMap_Space); + sub_80C4ED0(FALSE); + sub_80C4324(FALSE); + sub_80C3154(FALSE); + sub_80C48BC(GetWhichRegionMap(), 25, FALSE); + sub_80C4960(GetWhichRegionMap(), 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 (GetMapSecUnderCursor() != MAPSEC_NONE) + { + if (GetRegionMapPermission(MAPPERM_1) == TRUE) + { + if (sub_80C3AC8(1) == 2) + { + sub_80C4E74(gText_RegionMap_AButtonGuide); + } + else + { + sub_80C4E74(gText_RegionMap_Space); + } + } + } + else + { + if (GetMapCursorX() == 21 && GetMapCursorY() == 11 && GetRegionMapPermission(MAPPERM_0) == TRUE) + { + sub_80C4E74(gText_RegionMap_AButtonSwitch); + } + else if (GetMapCursorX() == 21 && GetMapCursorY() == 13) + { + sub_80C4E74(gText_RegionMap_AButtonCancel); + } + else + { + sub_80C4E74(gText_RegionMap_Space); + } + } + break; + case 4: + if (sub_80C3AC8(1) == 2 && gUnknown_20399D4->regionMapPermissions[MAPPERM_1] == TRUE) + { + RegionMapCreateDungeonMapPreview(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 (GetRegionMapPermission(MAPPERM_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; + } +} + +static void sub_80C07D0(TaskFunc taskFunc) +{ + gUnknown_20399D4->field_47B8 = taskFunc; +} + +TaskFunc sub_80C07E4(void) +{ + return gUnknown_20399D4->field_47B8; +} + +static void sub_80C07F8(u8 taskId) +{ + gTasks[taskId].func = gUnknown_20399D4->field_47B8; +} + +static void sub_80C0820(u8 taskId) +{ + if (GetRegionMapPermission(MAPPERM_2) == TRUE) + sub_80C25BC(); + sub_80C4A04(); + sub_80C3188(); + sub_80C4348(); + sub_80C4D30(); + DestroyTask(taskId); + FreeAllWindowBuffers(); + if (gUnknown_20399D4->savedCallback == NULL) + SetMainCallback2(gMain.savedCallback); + else + SetMainCallback2(gUnknown_20399D4->savedCallback); + FREE_IF_NOT_NULL(gUnknown_20399D4); +} + +static void sub_80C0898(void) +{ + FREE_IF_NOT_NULL(gUnknown_20399D4); +} + +static void sub_80C08B4(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void sub_80C08CC(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +static void NullVBlankHBlankCallbacks(void) +{ + SetVBlankCallback(NULL); + SetHBlankCallback(NULL); +} + +static void sub_80C08F4(void) +{ + SetVBlankCallback(sub_80C08CC); +} + +static void ResetGpu(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); + SetBgTilemapBuffers(); + sub_80C0AB8(); +} + +static void SetBgTilemapBuffers(void) +{ + SetBgTilemapBuffer(0, gUnknown_20399D4->bgTilemapBuffers[0]); + SetBgTilemapBuffer(1, gUnknown_20399D4->bgTilemapBuffers[1]); + SetBgTilemapBuffer(2, gUnknown_20399D4->bgTilemapBuffers[2]); +} + +static void ResetOamForRegionMap(void) +{ + ResetSpriteData(); + ResetPaletteFade(); + FreeAllSpritePalettes(); + ResetTasks(); + ScanlineEffect_Stop(); +} + +static void SetBg0andBg3Visibility(u8 mode) +{ + switch (mode) + { + case 0: + ShowBg(0); + ShowBg(3); + break; + case 1: + HideBg(0); + HideBg(3); + break; + } +} + +static void sub_80C0AB8(void) +{ + sub_80C4BE4(); + sub_80C4C2C(0, 0x11, 0xc0); + sub_80C4C48(6); + sub_80C4C74(0x39, 0x39); + sub_80C4C88(0x1b); + SetGpuWindowDims(0, &sStdWindowDims[0]); + SetGpuWindowDims(1, &sStdWindowDims[1]); + sub_80C4C9C(0, 0); + if (GetMapSecUnderCursor() != MAPSEC_NONE) + sub_80C4C9C(1, 0); +} + +static void sub_80C0B18(void) +{ + ClearWindowTilemap(0); + FillWindowPixelBuffer(0, PIXEL_FILL(0)); + if (sub_80C3520() == MAPSEC_NONE) + { + SetGpuWindowDims(0, &sStdWindowDims[2]); + } + else + { + GetMapName(gUnknown_20399D4->field_0000, sub_80C3520(), 0); + AddTextPrinterParameterized3(0, 2, 2, 2, sTextColor_White, 0, gUnknown_20399D4->field_0000); + PutWindowTilemap(0); + CopyWindowToVram(0, 2); + SetGpuWindowDims(0, &sStdWindowDims[0]); + } +} + +static void sub_80C0B9C(void) +{ + SetGpuWindowDims(1, &sStdWindowDims[1]); +} + +static 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 = GetMapSecUnderCursor(); + if (mapsecId != MAPSEC_NONE) + { + descOffset = mapsecId - MAPSECS_KANTO; + sub_80C4C9C(1, 0); + gUnknown_20399D4->field_47AC = 1; + gUnknown_20399D4->field_47AA = StringLength(sMapNames[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, sMapNames[descOffset]); + AddTextPrinterParameterized3(1, 2, 12, 2, gUnknown_83F1A9C[sub_80C3AC8(1) - 2], 0, gUnknown_20399D4->field_0013); + PutWindowTilemap(1); + CopyWindowToVram(1, 3); + } +} + +static void sub_80C0CA0(void) +{ + FillWindowPixelBuffer(0, PIXEL_FILL(0)); + CopyWindowToVram(0, 3); + FillWindowPixelBuffer(1, PIXEL_FILL(0)); + CopyWindowToVram(1, 3); +} + +static void sub_80C0CC8(u8 bg, u16 *map) +{ + s16 i; + s16 j; + u8 r4; + u16 *buffer = gUnknown_20399D4->bgTilemapBuffers[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->regionMapPermissions[MAPPERM_0] == TRUE) + { + 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 == REGIONMAP_SEVII45 && !FlagGet(FLAG_WORLD_MAP_NAVEL_ROCK_EXTERIOR)) + FillBgTilemapBufferRect_Palette0(0, 0x003, 13, 11, 3, 2); + if (r4 == REGIONMAP_SEVII67 && !FlagGet(FLAG_WORLD_MAP_BIRTH_ISLAND_EXTERIOR)) + FillBgTilemapBufferRect_Palette0(0, 0x003, 21, 16, 3, 3); +} + +static bool8 GetRegionMapPermission(u8 attr) +{ + return gUnknown_20399D4->regionMapPermissions[attr]; +} + +static u8 GetWhichRegionMap(void) +{ + return gUnknown_20399D4->field_479B; +} + +static u8 sub_80C0E34(void) +{ + return gUnknown_20399D4->field_479C; +} + +static void SetWhichRegionMap(u8 a0) +{ + gUnknown_20399D4->field_479B = a0; +} + +static void sub_80C0E5C(u8 a0) +{ + gUnknown_20399D4->field_479C = a0; +} + +static 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->selectionCursorSubspriteData[0].xCoord = 0x58; + gUnknown_20399D8->selectionCursorSubspriteData[1].xCoord = 0x98; + switch (gUnknown_20399D8->field_1CCC) + { + case 1: + LZ77UnCompWram(gUnknown_83F1084, gUnknown_20399D8->tileMap); + gUnknown_20399D8->field_1CCE = 6; + break; + case 2: // never reached + LZ77UnCompWram(gUnknown_83F1190, gUnknown_20399D8->tileMap); + gUnknown_20399D8->field_1CCE = 4; + break; + case 3: + default: + gUnknown_20399D8->field_1CCE = 3; + LZ77UnCompWram(gUnknown_83F0F1C, gUnknown_20399D8->tileMap); + break; + } + LZ77UnCompWram(gUnknown_83F0580, gUnknown_20399D8->bgTiles); + 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(gText_RegionMap_AButtonOK); + gTasks[taskId].func = sub_80C1098; +} + +static void sub_80C0FE0(void) +{ + sub_80C4BE4(); + sub_80C4C2C(27, 4, 64); + sub_80C4C5C(16 - gUnknown_20399D8->field_1CCD, gUnknown_20399D8->field_1CCD); +} + +static 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; + } +} + +static 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; + } +} + +static void sub_80C1098(u8 taskId) +{ + switch (gUnknown_20399D8->field_1CC8) + { + case 0: + NullVBlankHBlankCallbacks(); + sub_80C4E18(gText_RegionMap_UpDownPick); + gUnknown_20399D8->field_1CC8++; + break; + case 1: + LoadBgTiles(2, gUnknown_20399D8->bgTiles, 0x1000, 0x000); + gUnknown_20399D8->field_1CC8++; + break; + case 2: + sub_80C1324(2, gUnknown_20399D8->tileMap); + 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 (LoadAndCreateSelectionCursorSpriteGfx() == TRUE) + { + gUnknown_20399D8->field_1CC8++; + } + break; + case 9: + if (sub_80C1478() == TRUE) + { + SetWhichRegionMap(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) + { + DestroySelectionCursorSprites(); + 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; + } +} + +static void sub_80C1280(u8 taskId) +{ + gTasks[taskId].func = gUnknown_20399D8->field_1CD0; + HideBg(2); + sub_80C4E18(gText_RegionMap_DPadMove); + sub_80C4E74(gText_RegionMap_AButtonSwitch); + sub_80C0AB8(); + sub_80C0B9C(); + SetGpuWindowDims(0, &sStdWindowDims[2]); + FREE_IF_NOT_NULL(gUnknown_20399D8); +} + +static 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; + } +} + +static void sub_80C1324(u8 bg, u16 *map) +{ + s16 i; + s16 j; + u16 *buffer = gUnknown_20399D4->bgTilemapBuffers[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]; + } + } +} + +static void sub_80C1390(void) +{ + struct GpuWindowParams 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); + SetGpuWindowDims(1, &data); +} + +static 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; + } +} + +static bool8 sub_80C1478(void) +{ + bool8 r6 = FALSE; + struct GpuWindowParams 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->layouts[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->layouts[gUnknown_20399D8->field_1CCA]); + sub_80C4E74(gText_RegionMap_AButtonOK); + 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); + SetGpuWindowDims(1, &data); + return FALSE; +} + +static void SpriteCB_SelectionCursor(struct Sprite * sprite) +{ + sprite->pos1.y = gUnknown_20399D8->field_1CD4[1] + 16; +} + +static bool8 LoadAndCreateSelectionCursorSpriteGfx(void) +{ + switch (gUnknown_20399D8->selectionCursorLoadState) + { + case 0: + LZ77UnCompWram(sSelectionCursorLeftTiles, gUnknown_20399D8->selectionCursorSubspriteData[0].tiles); + break; + case 1: + LZ77UnCompWram(sSelectionCursorRightTiles, gUnknown_20399D8->selectionCursorSubspriteData[1].tiles); + break; + case 2: + CreateSelectionCursorSubsprite(0, 2, 2); + CreateSelectionCursorSubsprite(1, 3, 3); + break; + default: + return TRUE; + } + gUnknown_20399D8->selectionCursorLoadState++; + return FALSE; +} + +static void CreateSelectionCursorSubsprite(u8 whichSprite, u16 tileTag, u16 paletteTag) +{ + RealCreateSelectionCursorSubsprite(whichSprite, tileTag, paletteTag); +} + +static void RealCreateSelectionCursorSubsprite(u8 whichSprite, u16 tileTag, u16 paletteTag) +{ + u8 spriteId; + + struct SpriteSheet spriteSheet = { + .data = gUnknown_20399D8->selectionCursorSubspriteData[whichSprite].tiles, + .size = 0x400, + .tag = tileTag + }; + struct SpritePalette spritePalette = { + .data = sSelectionCursorPals, + .tag = paletteTag + }; + struct SpriteTemplate template = { + .tileTag = tileTag, + .paletteTag = paletteTag, + .oam = &sSelectionCursorOam, + .anims = sSelectionCursorAnims, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_SelectionCursor + }; + + gUnknown_20399D8->selectionCursorSubspriteData[whichSprite].tileTag = tileTag; + gUnknown_20399D8->selectionCursorSubspriteData[whichSprite].paletteTag = paletteTag; + + LoadSpriteSheet(&spriteSheet); + LoadSpritePalette(&spritePalette); + + spriteId = CreateSprite(&template, gUnknown_20399D8->selectionCursorSubspriteData[whichSprite].xCoord, 8 * (gUnknown_20399D8->field_1CCE + 4 * gUnknown_20399D8->field_1CCA), 0); + gUnknown_20399D8->selectionCursorSubspriteData[whichSprite].sprite = &gSprites[spriteId]; + gSprites[spriteId].invisible = FALSE; +} + +static void DestroySelectionCursorSprites(void) +{ + u8 i; + for (i = 0; i < 2; i++) + { + if (gUnknown_20399D8->selectionCursorSubspriteData[i].sprite != NULL) + { + DestroySprite(gUnknown_20399D8->selectionCursorSubspriteData[i].sprite); + FreeSpriteTilesByTag(gUnknown_20399D8->selectionCursorSubspriteData[i].tileTag); + FreeSpritePaletteByTag(gUnknown_20399D8->selectionCursorSubspriteData[i].paletteTag); + } + } +} + +static const u8 *GetDungeonFlavorText(u16 mapsec) +{ + u8 i; + for (i = 0; i < NELEMS(sDungeonHighlights); i++) + { + if (sDungeonHighlights[i].id == mapsec) + return sDungeonHighlights[i].desc; + } + return gText_RegionMap_NoData; +} + +static const u8 *GetDungeonName(u16 mapsec) +{ + u8 i; + for (i = 0; i < NELEMS(sDungeonHighlights); i++) + { + if (sDungeonHighlights[i].id == mapsec) + return sDungeonHighlights[i].name; + } + return gText_RegionMap_NoData; +} + +static void RegionMapCreateDungeonMapPreview(u8 a0, u8 taskId, TaskFunc taskFunc) +{ + u8 r0; + sDungeonMapPreviewManager = AllocZeroed(sizeof(struct DungeonMapPreviewManagerStruct)); + r0 = GetMapSecUnderCursor(); + if (r0 == MAPSEC_TANOBY_CHAMBERS) + r0 = MAPSEC_MONEAN_CHAMBER; + sDungeonMapPreviewManager->mapPreviewInfo = GetDungeonMapPreviewScreenInfo(r0); + if (sDungeonMapPreviewManager->mapPreviewInfo == NULL) + sDungeonMapPreviewManager->mapPreviewInfo = GetDungeonMapPreviewScreenInfo(MAPSEC_ROCK_TUNNEL); + sDungeonMapPreviewManager->dungeonMapPreviewPrepState = 0; + sDungeonMapPreviewManager->field_3D4A = 0; + sDungeonMapPreviewManager->savedTask = taskFunc; + sDungeonMapPreviewManager->field_3E14 = 0; + sub_80C4AAC(0); + sub_80C4BE4(); + sub_80C0CA0(); + gTasks[taskId].func = Task_PrepDungeonMapPreviewAndFlavorText; +} + +static bool8 HandleLoadMapPreviewScreenGfx(void) +{ + switch (sDungeonMapPreviewManager->field_3D4A) + { + case 0: + LZ77UnCompWram(sDungeonMapPreviewManager->mapPreviewInfo->tilesptr, sDungeonMapPreviewManager->tiles); + break; + case 1: + LZ77UnCompWram(sDungeonMapPreviewManager->mapPreviewInfo->tilemapptr, sDungeonMapPreviewManager->tilemap); + break; + case 2: + LoadBgTiles(2, sDungeonMapPreviewManager->tiles, 0x3840, 0x000); + break; + case 3: + LoadPalette(sDungeonMapPreviewManager->mapPreviewInfo->palptr, 0xD0, 0x60); + break; + default: + return TRUE; + } + sDungeonMapPreviewManager->field_3D4A++; + return FALSE; +} + +static void Task_PrepDungeonMapPreviewAndFlavorText(u8 taskId) +{ + switch (sDungeonMapPreviewManager->dungeonMapPreviewPrepState) + { + case 0: + NullVBlankHBlankCallbacks(); + sDungeonMapPreviewManager->dungeonMapPreviewPrepState++; + break; + case 1: + if (HandleLoadMapPreviewScreenGfx() == TRUE) + sDungeonMapPreviewManager->dungeonMapPreviewPrepState++; + break; + case 2: + sub_80C1E94(); + sub_80C4E74(gText_RegionMap_AButtonCancel2); + sDungeonMapPreviewManager->dungeonMapPreviewPrepState++; + break; + case 3: + CopyMapPreviewTilemapToBgTilemapBuffer(2, sDungeonMapPreviewManager->tilemap); + CopyBgTilemapBufferToVram(2); + sDungeonMapPreviewManager->dungeonMapPreviewPrepState++; + break; + case 4: + ShowBg(2); + sDungeonMapPreviewManager->dungeonMapPreviewPrepState++; + break; + case 5: + sub_80C08F4(); + sDungeonMapPreviewManager->dungeonMapPreviewPrepState++; + break; + case 6: + if (sub_80C1F80(FALSE) == TRUE) + sDungeonMapPreviewManager->dungeonMapPreviewPrepState++; + break; + case 7: + gTasks[taskId].func = Task_DrawDungeonMapPreviewAndFlavorText; + break; + case 8: + if (sub_80C1F80(TRUE) == TRUE) + { + sDungeonMapPreviewManager->dungeonMapPreviewPrepState++; + } + break; + case 9: + DestroyMapPreviewAssets(taskId); + sDungeonMapPreviewManager->dungeonMapPreviewPrepState++; + break; + } +} + +static void Task_DrawDungeonMapPreviewAndFlavorText(u8 taskId) +{ + switch (sDungeonMapPreviewManager->dungeonMapPreviewDrawState) + { + case 0: + sDungeonMapPreviewManager->field_3E0E = 0x0133; + sDungeonMapPreviewManager->field_3E10 = 0x0100; + sDungeonMapPreviewManager->field_3E12 = 0x00F0; + sDungeonMapPreviewManager->dungeonMapPreviewDrawState++; + break; + case 1: + if (sDungeonMapPreviewManager->field_3D4C++ > 40) + { + sDungeonMapPreviewManager->field_3D4C = 0; + sDungeonMapPreviewManager->dungeonMapPreviewDrawState++; + } + break; + case 2: + FillWindowPixelBuffer(2, PIXEL_FILL(0)); + CopyWindowToVram(2, 3); + PutWindowTilemap(2); + sDungeonMapPreviewManager->dungeonMapPreviewDrawState++; + break; + case 3: + if (sDungeonMapPreviewManager->field_3D4C > 25) + { + AddTextPrinterParameterized3(2, 2, 4, 0, sTextColor_Green, -1, GetDungeonName(GetMapSecUnderCursor())); + AddTextPrinterParameterized3(2, 2, 2, 14, sTextColor_White, -1, GetDungeonFlavorText(GetMapSecUnderCursor())); + CopyWindowToVram(2, 3); + sDungeonMapPreviewManager->dungeonMapPreviewDrawState++; + } + else if (sDungeonMapPreviewManager->field_3D4C > 20) + { + sDungeonMapPreviewManager->field_3E0E -= 6; + sDungeonMapPreviewManager->field_3E10 -= 5; + sDungeonMapPreviewManager->field_3E12 -= 5; + CpuCopy16(sDungeonMapPreviewManager->mapPreviewInfo->palptr, sDungeonMapPreviewManager->field_3D4E, 0x60); + TintPalette_CustomTone(sDungeonMapPreviewManager->field_3D4E, 0x30, sDungeonMapPreviewManager->field_3E0E, sDungeonMapPreviewManager->field_3E10, sDungeonMapPreviewManager->field_3E12); + LoadPalette(sDungeonMapPreviewManager->field_3D4E, 0xD0, 0x60); + } + sDungeonMapPreviewManager->field_3D4C++; + break; + case 4: + if (JOY_NEW(B_BUTTON) || JOY_NEW(A_BUTTON)) + { + FillWindowPixelBuffer(2, PIXEL_FILL(0)); + CopyWindowToVram(2, 3); + sDungeonMapPreviewManager->dungeonMapPreviewPrepState++; + sDungeonMapPreviewManager->dungeonMapPreviewDrawState++; + } + break; + default: + gTasks[taskId].func = Task_PrepDungeonMapPreviewAndFlavorText; + break; + } +} + +static void DestroyMapPreviewAssets(u8 taskId) +{ + gTasks[taskId].func = sDungeonMapPreviewManager->savedTask; + HideBg(2); + sub_80C4B30(0); + sub_80C0B18(); + sub_80C0BB0(); + sub_80C0AB8(); + sub_80C0B9C(); + sub_80C4E74(gText_RegionMap_AButtonGuide); + FREE_IF_NOT_NULL(sDungeonMapPreviewManager); +} + +static void CopyMapPreviewTilemapToBgTilemapBuffer(u8 bgId, const u16 * tilemap) +{ + CopyToBgTilemapBufferRect(2, tilemap, 0, 0, 32, 20); +} + +static void sub_80C1E94(void) +{ + u16 r4; + u16 r0; + sub_80C4BE4(); + sub_80C4C2C(0, 17, 192); + sub_80C4C48(sDungeonMapPreviewManager->field_3E14); + sub_80C4C74(0, 13); + sub_80C4C88(59); + sub_80C4C9C(1, 0); + r4 = GetMapCursorX(); + r0 = GetMapCursorY(); + sDungeonMapPreviewManager->field_3E16 = 8 * r4 + 32; + sDungeonMapPreviewManager->field_3E18 = 8 * r0 + 24; + sDungeonMapPreviewManager->field_3E1A = sDungeonMapPreviewManager->field_3E16 + 8; + sDungeonMapPreviewManager->field_3E1C = sDungeonMapPreviewManager->field_3E18 + 8; + sDungeonMapPreviewManager->field_3E1E = (0x10 - sDungeonMapPreviewManager->field_3E16) / 8; + sDungeonMapPreviewManager->field_3E20 = (0x20 - sDungeonMapPreviewManager->field_3E18) / 8; + sDungeonMapPreviewManager->field_3E22 = (0xE0 - sDungeonMapPreviewManager->field_3E1A) / 8; + sDungeonMapPreviewManager->field_3E24 = (0x88 - sDungeonMapPreviewManager->field_3E1C) / 8; +} + +static bool8 sub_80C1F80(bool8 a0) +{ + struct GpuWindowParams data; + + if (!a0) + { + if (sDungeonMapPreviewManager->field_3D4B < 8) + { + sDungeonMapPreviewManager->field_3E16 += sDungeonMapPreviewManager->field_3E1E; + sDungeonMapPreviewManager->field_3E18 += sDungeonMapPreviewManager->field_3E20; + sDungeonMapPreviewManager->field_3E1A += sDungeonMapPreviewManager->field_3E22; + sDungeonMapPreviewManager->field_3E1C += sDungeonMapPreviewManager->field_3E24; + sDungeonMapPreviewManager->field_3D4B++; + if (sDungeonMapPreviewManager->field_3E14 < 6) + sDungeonMapPreviewManager->field_3E14++; + } + else + { + return TRUE; + } + } + else + { + if (sDungeonMapPreviewManager->field_3D4B == 0) + { + return TRUE; + } + else + { + sDungeonMapPreviewManager->field_3E16 -= sDungeonMapPreviewManager->field_3E1E; + sDungeonMapPreviewManager->field_3E18 -= sDungeonMapPreviewManager->field_3E20; + sDungeonMapPreviewManager->field_3E1A -= sDungeonMapPreviewManager->field_3E22; + sDungeonMapPreviewManager->field_3E1C -= sDungeonMapPreviewManager->field_3E24; + sDungeonMapPreviewManager->field_3D4B--; + if (sDungeonMapPreviewManager->field_3E14 > 0) + sDungeonMapPreviewManager->field_3E14--; + } + } + data.v0 = sDungeonMapPreviewManager->field_3E16; + data.v2 = sDungeonMapPreviewManager->field_3E18; + data.v4 = sDungeonMapPreviewManager->field_3E1A; + data.v6 = sDungeonMapPreviewManager->field_3E1C; + SetGpuWindowDims(1, &data); + sub_80C4C48(sDungeonMapPreviewManager->field_3E14); + return FALSE; +} + +static void nullsub_63(struct Sprite * sprite) +{ + +} + +static 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; +} + +static 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(); + SetBg0andBg3Visibility(1); + gUnknown_20399E0->field_CC8 = taskFunc; + gTasks[taskId].func = sub_80C267C; +} + +static 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; + } +} + +static 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; +} + +static void sub_80C24BC(void) +{ + struct GpuWindowParams 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); + SetGpuWindowDims(0, &data); + sub_80C4C9C(0, 0); +} + +static void sub_80C253C(void) +{ + struct GpuWindowParams data = gUnknown_83F1C34; + sub_80C4BE4(); + sub_80C4C2C(2, 41, 128); + sub_80C4C48(gUnknown_20399E0->field_CD0); + sub_80C4C74(55, 0); + sub_80C4C88(18); + SetGpuWindowDims(0, &data); + sub_80C4C9C(0, 0); +} + +static void sub_80C2594(u8 taskId) +{ + gTasks[taskId].func = gUnknown_20399E0->field_CC8; +} + +static 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); +} + +static 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); + } + } +} + +static void sub_80C267C(u8 taskId) +{ + switch (gUnknown_20399E0->field_CCC) + { + case 0: + NullVBlankHBlankCallbacks(); + 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(); + SetBg0andBg3Visibility(0); + sub_80C48BC(GetWhichRegionMap(), 25, FALSE); + sub_80C4960(GetWhichRegionMap(), 25, FALSE); + gUnknown_20399E0->field_CCC++; + break; + case 9: + sub_80C4E18(gText_RegionMap_DPadMove); + if (sub_80C3AC8(1) != 2) + sub_80C4E74(gText_RegionMap_Space); + else + sub_80C4E74(gText_RegionMap_AButtonGuide); + 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; + } +} + +static 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; +} + +static void sub_80C2B48(void) +{ + struct GpuWindowParams 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; + SetGpuWindowDims(0, &data); +} + +static void sub_80C2B9C(void) +{ + struct GpuWindowParams 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); + SetGpuWindowDims(0, &data); + sub_80C4C9C(0, 0); +} + +static void sub_80C2C1C(u8 taskId) +{ + gTasks[taskId].func = sub_80C2C7C; +} + +static 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); +} + +static 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; + } +} + + +static 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; +} + +static 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; + } +} + +static 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; + GetPlayerPositionOnRegionMap_HandleOverrides(); + 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(GetSelectedMapSection(GetWhichRegionMap(), 1, gUnknown_20399E4->field_002, gUnknown_20399E4->field_000)); + sub_80C309C(); +} + +static 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); +} + +static void sub_80C3154(bool8 a0) +{ + gUnknown_20399E4->field_01C->invisible = a0; +} + +static void sub_80C3178(void) +{ + gUnknown_20399E4->field_00E = 0; +} + +static 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); +} + +static 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 (GetRegionMapPermission(MAPPERM_0) == TRUE) + { + PlaySE(SE_W063B); + ret = 5; + } + } + } + else if (!JOY_NEW(B_BUTTON)) + { + if (JOY_REPT(START_BUTTON)) + { + sub_80C3418(); + gUnknown_20399E4->field_014 = GetSelectedMapSection(GetWhichRegionMap(), 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(GetSelectedMapSection(GetWhichRegionMap(), 1, gUnknown_20399E4->field_002, gUnknown_20399E4->field_000)); + return 3; + } + else if (JOY_NEW(SELECT_BUTTON) && gUnknown_20399D4->savedCallback == CB2_ReturnToField) + { + ret = 6; + } + } + else + { + ret = 6; + } + if (ret == 1) + { + gUnknown_20399E4->field_00C = 4; + gUnknown_20399E4->field_010 = sub_80C3348; + } + return ret; +} + +static 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 = GetSelectedMapSection(GetWhichRegionMap(), 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(GetSelectedMapSection(GetWhichRegionMap(), 1, gUnknown_20399E4->field_002, gUnknown_20399E4->field_000)); + gUnknown_20399E4->field_010 = sub_80C31C0; + return 3; +} + +static u8 sub_80C3400(void) +{ + return gUnknown_20399E4->field_010(); +} + +static void sub_80C3418(void) +{ + if (GetRegionMapPermission(MAPPERM_0) == 1) + { + gUnknown_20399E4->field_00E++; + gUnknown_20399E4->field_00E %= 3; + if (gUnknown_20399E4->field_00E == 0 && GetWhichRegionMap() != 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 = GetSelectedMapSection(GetWhichRegionMap(), 0, gUnknown_20399E4->field_002, gUnknown_20399E4->field_000); +} + +static u16 GetMapCursorX(void) +{ + return gUnknown_20399E4->field_000; +} + +static u16 GetMapCursorY(void) +{ + return gUnknown_20399E4->field_002; +} + +static 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 = GetSelectedMapSection(GetWhichRegionMap(), 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; +} + +static u16 GetMapSecUnderCursor(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 = GetSelectedMapSection(GetWhichRegionMap(), 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; +} + +static 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 (!GetRegionMapPermission(MAPPERM_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; + } +} + +static 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; + } +} + +static 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; + } +} + +static u16 GetPlayerCurrentMapSectionId(void) +{ + return Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum)->regionMapSectionId; +} + +static void GetPlayerPositionOnRegionMap(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 / sMapSectionDimensions[gUnknown_20399E4->field_014][0]; + if (divisor == 0) + divisor = 1; + x /= divisor; + if (x >= sMapSectionDimensions[gUnknown_20399E4->field_014][0]) + x = sMapSectionDimensions[gUnknown_20399E4->field_014][0] - 1; + divisor = height / sMapSectionDimensions[gUnknown_20399E4->field_014][1]; + if (divisor == 0) + divisor = 1; + y /= divisor; + if (y >= sMapSectionDimensions[gUnknown_20399E4->field_014][1]) + y = sMapSectionDimensions[gUnknown_20399E4->field_014][1] - 1; + gUnknown_20399E4->field_000 = x + sMapSectionTopLeftCorners[gUnknown_20399E4->field_014][0]; + gUnknown_20399E4->field_002 = y + sMapSectionTopLeftCorners[gUnknown_20399E4->field_014][1]; +} + +static void GetPlayerPositionOnRegionMap_HandleOverrides(void) +{ + switch (GetPlayerCurrentMapSectionId()) + { + 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 + { + GetPlayerPositionOnRegionMap(); + } + 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 + { + GetPlayerPositionOnRegionMap(); + } + break; + case MAPSEC_ROUTE_6: + if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(PALLET_TOWN)) + { + gUnknown_20399E4->field_000 = 14; + gUnknown_20399E4->field_002 = 7; + } + else + { + GetPlayerPositionOnRegionMap(); + } + break; + case MAPSEC_ROUTE_7: + if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(PALLET_TOWN)) + { + gUnknown_20399E4->field_000 = 13; + gUnknown_20399E4->field_002 = 6; + } + else + { + GetPlayerPositionOnRegionMap(); + } + break; + case MAPSEC_ROUTE_8: + if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(PALLET_TOWN)) + { + gUnknown_20399E4->field_000 = 15; + gUnknown_20399E4->field_002 = 6; + } + else + { + GetPlayerPositionOnRegionMap(); + } + break; + default: + GetPlayerPositionOnRegionMap(); + break; + } + gUnknown_20399E4->field_014 = GetSelectedMapSection(GetWhichRegionMap(), 0, gUnknown_20399E4->field_002, gUnknown_20399E4->field_000); +} + +static u8 GetSelectedMapSection(u8 whichMap, u8 layer, s16 y, s16 x) +{ + switch (whichMap) + { + case 0: + return sRegionMapSections_Kanto[layer][y][x]; + case 1: + return sRegionMapSections_Sevii123[layer][y][x]; + case 2: + return sRegionMapSections_Sevii45[layer][y][x]; + case 3: + return sRegionMapSections_Sevii67[layer][y][x]; + default: + return MAPSEC_NONE; + } +} + +static 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 = GetMapCursorX(); + gUnknown_20399E8->field_02 = GetMapCursorY(); + sub_80C4244(); +} + +static 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); +} + +static void sub_80C4324(bool8 a0) +{ + gUnknown_20399E8->field_04->invisible = a0; +} + +static 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); +} + +static u16 sub_80C4380(void) +{ + return gUnknown_20399E8->field_00; +} + +static u16 sub_80C438C(void) +{ + return gUnknown_20399E8->field_02; +} + +static 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; +} + +static void sub_80C440C(u8 taskId) +{ + switch (gUnknown_20399EC->field_463) + { + case 0: + NullVBlankHBlankCallbacks(); + 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; + } +} + +static void sub_80C44E4(u8 taskId) +{ + gTasks[taskId].func = gUnknown_20399EC->field_468; +} + +static 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; +} + +static 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 = GetSelectedMapSection(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; +} + +static void sub_80C4750(void) +{ + u16 i, j, k; + u8 r7 = 0; + if (GetRegionMapPermission(MAPPERM_3)) + { + for (i = 0; i < 4; i++) + { + for (j = 0; j < 15; j++) + { + for (k = 0; k < 22; k++) + { + if (sub_80C35DC(GetSelectedMapSection(i, 0, j, k)) == 2) + { + sub_80C450C(i, r7, k, j, r7 + 10, 10); + r7++; + } + } + } + } + } +} + +static 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 = GetSelectedMapSection(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++; + } + } + } +} + +static 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; + } +} + +static 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; + } +} + +static 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); +} + +static 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; +} + +static 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; +} + +static void sub_80C4BB8(void) +{ + u8 i; + for (i = 0; i < 3; i++) + { + FREE_IF_NOT_NULL(gUnknown_20399F0[i]); + } +} + +static void sub_80C4BE4(void) +{ + struct GpuWindowParams data = {}; + sub_80C4C2C(0, 0, 0); + sub_80C4C48(0); + SetGpuWindowDims(0, &data); + SetGpuWindowDims(1, &data); + sub_80C4C74(0, 0); + sub_80C4C9C(0, 1); + sub_80C4C9C(1, 1); +} + +static void sub_80C4C2C(u8 a0, u16 a1, u16 a2) +{ + u16 regval = a0 << 8; + regval |= a1; + regval |= a2; + SetGpuReg(REG_OFFSET_BLDCNT, regval); +} + +static void sub_80C4C48(u16 a0) +{ + SetGpuReg(REG_OFFSET_BLDY, a0); +} + +static void sub_80C4C5C(u16 a0, u16 a1) +{ + u16 regval = a0 << 8; + regval |= a1; + SetGpuReg(REG_OFFSET_BLDALPHA, regval); +} + +static void sub_80C4C74(u16 a0, u16 a1) +{ + u16 regval = a1 << 8; + regval |= a0; + SetGpuReg(REG_OFFSET_WININ, regval); +} + +static void sub_80C4C88(u16 a0) +{ + SetGpuReg(REG_OFFSET_WINOUT, a0); +} + +static void sub_80C4C9C(u8 a0, u8 a1) +{ + u16 data[2]; + memcpy(data, sWinFlags, 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; + } +} + +static void SetGpuWindowDims(u8 winIdx, const struct GpuWindowParams *data) +{ + SetGpuReg(sWinRegs[winIdx][0], (data->v2 << 8) | data->v6); + SetGpuReg(sWinRegs[winIdx][1], (data->v0 << 8) | data->v4); +} + +static void sub_80C4D30(void) +{ + sub_80C4BB8(); + sub_80C4BE4(); +} + +static 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, sMapNames[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); +} + +static void sub_80C4E18(const u8 *str) +{ + if (gUnknown_20399D4->regionMapPermissions[MAPPERM_2] == TRUE) + FillWindowPixelBuffer(3, PIXEL_FILL(0)); + else + FillWindowPixelBuffer(3, PIXEL_FILL(15)); + AddTextPrinterParameterized3(3, 0, 0, 0, gUnknown_83F1CA8, 0, str); + CopyWindowToVram(3, 2); +} + +static void sub_80C4E74(const u8 *str) +{ + if (gUnknown_20399D4->regionMapPermissions[MAPPERM_2] == TRUE) + FillWindowPixelBuffer(4, PIXEL_FILL(0)); + else + FillWindowPixelBuffer(4, PIXEL_FILL(15)); + AddTextPrinterParameterized3(4, 0, 0, 0, gUnknown_83F1CA8, 0, str); + CopyWindowToVram(4, 3); +} + +static 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); +} + +static void sub_80C4F08(u8 taskId) +{ + switch (gUnknown_20399FC->field_0) + { + case 0: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + sub_80C4398(GetWhichRegionMap(), 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 (GetRegionMapPermission(MAPPERM_2) == TRUE) + { + sub_80C2208(taskId, sub_80C07E4()); + } + else + { + ShowBg(0); + ShowBg(3); + ShowBg(1); + sub_80C4E18(gText_RegionMap_DPadMove); + sub_80C48BC(GetWhichRegionMap(), 25, FALSE); + sub_80C4960(GetWhichRegionMap(), 25, FALSE); + } + gUnknown_20399FC->field_0++; + break; + case 2: + sub_80C4E74(gText_RegionMap_AButtonOK); + 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 (GetMapCursorX() == 21 && GetMapCursorY() == 13) + { + PlaySE(SE_W255); + sub_80C4E74(gText_RegionMap_AButtonCancel); + } + else if (sub_80C3AC8(0) == 2 || sub_80C3AC8(0) == 4) + { + sub_80C4E74(gText_RegionMap_AButtonOK); + } + else + { + sub_80C4E74(gText_RegionMap_Space); + } + break; + case 4: + if ((sub_80C3AC8(0) == 2 || sub_80C3AC8(0) == 4) && GetRegionMapPermission(MAPPERM_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(GetWhichRegionMap(), taskId, sub_80C07F8); + break; + } + break; + case 5: + if (GetRegionMapPermission(MAPPERM_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; + } +} + +static void sub_80C51E8(void) +{ + gUnknown_20399FC = AllocZeroed(sizeof(struct UnkStruct_20399FC)); + gUnknown_20399FC->field_0 = 0; + gUnknown_20399FC->field_1 = 0; +} + +static void sub_80C5208(u8 taskId) +{ + if (GetRegionMapPermission(MAPPERM_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); +} + +static void sub_80C527C(u16 mapsec) +{ + u16 idx = mapsec - MAPSECS_KANTO; + if (sMapsecToSpawn[idx][2]) + { + sub_805546C(sMapsecToSpawn[idx][2]); + sub_8124C1C(sMapsecToSpawn[idx]); + } + else + { + warp1_set_2(sMapsecToSpawn[idx][0], sMapsecToSpawn[idx][1], -1); + } + sub_80842C8(); +} |