summaryrefslogtreecommitdiff
path: root/src/field/region_map.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/field/region_map.c')
-rw-r--r--src/field/region_map.c1841
1 files changed, 0 insertions, 1841 deletions
diff --git a/src/field/region_map.c b/src/field/region_map.c
deleted file mode 100644
index 1378820fe..000000000
--- a/src/field/region_map.c
+++ /dev/null
@@ -1,1841 +0,0 @@
-#include "global.h"
-#include "event_data.h"
-#include "field_effect.h"
-#include "field_specials.h"
-#include "m4a.h"
-#include "main.h"
-#include "constants/maps.h"
-#include "menu.h"
-#include "palette.h"
-#include "pokemon_menu.h"
-#include "region_map.h"
-#include "overworld.h"
-#include "secret_base.h"
-#include "constants/songs.h"
-#include "sprite.h"
-#include "strings.h"
-#include "string_util.h"
-#include "text.h"
-#include "trig.h"
-#include "ewram.h"
-
-// Map Section IDs
-#define MAPSEC_LITTLEROOT_TOWN 0
-#define MAPSEC_OLDALE_TOWN 1
-#define MAPSEC_DEWFORD_TOWN 2
-#define MAPSEC_LAVARIDGE_TOWN 3
-#define MAPSEC_FALLARBOR_TOWN 4
-#define MAPSEC_VERDANTURF_TOWN 5
-#define MAPSEC_PACIFIDLOG_TOWN 6
-#define MAPSEC_PETALBURG_CITY 7
-#define MAPSEC_SLATEPORT_CITY 8
-#define MAPSEC_MAUVILLE_CITY 9
-#define MAPSEC_RUSTBORO_CITY 10
-#define MAPSEC_FORTREE_CITY 11
-#define MAPSEC_LILYCOVE_CITY 12
-#define MAPSEC_MOSSDEEP_CITY 13
-#define MAPSEC_SOOTOPOLIS_CITY 14
-#define MAPSEC_EVER_GRANDE_CITY 15
-#define MAPSEC_ROUTE_101 0x10
-#define MAPSEC_ROUTE_102 0x11
-#define MAPSEC_ROUTE_103 0x12
-#define MAPSEC_ROUTE_104 0x13
-#define MAPSEC_ROUTE_105 0x14
-#define MAPSEC_ROUTE_106 0x15
-#define MAPSEC_ROUTE_107 0x16
-#define MAPSEC_ROUTE_108 0x17
-#define MAPSEC_ROUTE_109 0x18
-#define MAPSEC_ROUTE_110 0x19
-#define MAPSEC_ROUTE_111 0x1A
-#define MAPSEC_ROUTE_112 0x1B
-#define MAPSEC_ROUTE_113 0x1C
-#define MAPSEC_ROUTE_114 0x1D
-#define MAPSEC_ROUTE_115 0x1E
-#define MAPSEC_ROUTE_116 0x1F
-#define MAPSEC_ROUTE_117 0x20
-#define MAPSEC_ROUTE_118 0x21
-#define MAPSEC_ROUTE_119 0x22
-#define MAPSEC_ROUTE_120 0x23
-#define MAPSEC_ROUTE_121 0x24
-#define MAPSEC_ROUTE_122 0x25
-#define MAPSEC_ROUTE_123 0x26
-#define MAPSEC_ROUTE_124 0x27
-#define MAPSEC_ROUTE_125 0x28
-#define MAPSEC_ROUTE_126 0x29
-#define MAPSEC_ROUTE_127 0x2A
-#define MAPSEC_ROUTE_128 0x2B
-#define MAPSEC_ROUTE_129 0x2C
-#define MAPSEC_ROUTE_130 0x2D
-#define MAPSEC_ROUTE_131 0x2E
-#define MAPSEC_ROUTE_132 0x2F
-#define MAPSEC_ROUTE_133 0x30
-#define MAPSEC_ROUTE_134 0x31
-#define MAPSEC_UNDERWATER1 0x32
-#define MAPSEC_UNDERWATER2 0x33
-#define MAPSEC_UNDERWATER3 0x34
-#define MAPSEC_UNDERWATER4 0x35
-#define MAPSEC_UNDERWATER5 0x36
-#define MAPSEC_GRANITE_CAVE 0x37
-#define MAPSEC_MT_CHIMNEY 0x38
-#define MAPSEC_SAFARI_ZONE 0x39
-#define MAPSEC_BATTLE_TOWER 0x3A
-#define MAPSEC_PETALBURG_WOODS 0x3B
-#define MAPSEC_RUSTURF_TUNNEL 0x3C
-#define MAPSEC_ABANDONED_SHIP 0x3D
-#define MAPSEC_NEW_MAUVILLE 0x3E
-#define MAPSEC_METEOR_FALLS_1 0x3F
-#define MAPSEC_METEOR_FALLS_2 0x40
-#define MAPSEC_MT_PYRE 0x41
-#define MAPSEC_EVIL_TEAM_HIDEOUT 0x42
-#define MAPSEC_SHOAL_CAVE 0x43
-#define MAPSEC_SEAFLOOR_CAVERN 0x44
-#define MAPSEC_UNDERWATER6 0x45
-#define MAPSEC_VICTORY_ROAD 0x46
-#define MAPSEC_MIRAGE_ISLAND 0x47
-#define MAPSEC_CAVE_OF_ORIGIN 0x48
-#define MAPSEC_SOUTHERN_ISLAND 0x49
-#define MAPSEC_FIERY_PATH_1 0x4A
-#define MAPSEC_FIERY_PATH_2 0x4B
-#define MAPSEC_JAGGED_PASS_1 0x4C
-#define MAPSEC_JAGGED_PASS_2 0x4D
-#define MAPSEC_SEALED_CHAMBER 0x4E
-#define MAPSEC_UNDERWATER7 0x4F
-#define MAPSEC_SCORCHED_SLAB 0x50
-#define MAPSEC_ISLAND_CAVE 0x51
-#define MAPSEC_DESERT_RUINS 0x52
-#define MAPSEC_ANCIENT_TOMB 0x53
-#define MAPSEC_INSIDE_OF_TRUCK 0x54
-#define MAPSEC_SKY_PILLAR 0x55
-#define MAPSEC_SECRET_BASE 0x56
-#define MAPSEC_UNK_0x57 0x57
-#define MAPSEC_NONE 0x58
-
-#define MAP_WIDTH 28
-#define MAP_HEIGHT 15
-#define MAPCURSOR_X_MIN 1
-#define MAPCURSOR_Y_MIN 2
-#define MAPCURSOR_X_MAX (MAPCURSOR_X_MIN + MAP_WIDTH - 1)
-#define MAPCURSOR_Y_MAX (MAPCURSOR_Y_MIN + MAP_HEIGHT - 1)
-
-// Input events
-enum
-{
- INPUT_EVENT_NONE,
- INPUT_EVENT_DPAD,
- INPUT_EVENT_2,
- INPUT_EVENT_3,
- INPUT_EVENT_A_BUTTON,
- INPUT_EVENT_B_BUTTON,
-};
-
-static EWRAM_DATA struct RegionMap *gRegionMap = NULL;
-
-static const u16 sRegionMapCursor_Pal[] = INCBIN_U16("graphics/pokenav/cursor.gbapal");
-static const u8 sRegionMapCursorSmall_ImageLZ[] = INCBIN_U8("graphics/pokenav/cursor_small.4bpp.lz");
-static const u8 sRegionMapCursorLarge_ImageLZ[] = INCBIN_U8("graphics/pokenav/cursor_large.4bpp.lz");
-static const u16 sRegionMapBrendanIcon_Pal[] = INCBIN_U16("graphics/pokenav/brendan_icon.gbapal");
-static const u8 sRegionMapBrendanIcon_Image[] = INCBIN_U8("graphics/pokenav/brendan_icon.4bpp");
-static const u16 sRegionMapMayIcon_Pal[] = INCBIN_U16("graphics/pokenav/may_icon.gbapal");
-static const u8 sRegionMapMayIcon_Image[] = INCBIN_U8("graphics/pokenav/may_icon.4bpp");
-static const u16 sRegionMapBkgnd_Pal[] = INCBIN_U16("graphics/pokenav/region_map.gbapal");
-static const u8 sRegionMapBkgnd_ImageLZ[] = INCBIN_U8("graphics/pokenav/region_map.8bpp.lz");
-static const u8 sRegionMapBkgnd_TilemapLZ[] = INCBIN_U8("graphics/pokenav/region_map_map.bin.lz");
-
-#include "../data/region_map_layout.h"
-
-#if ENGLISH
-#include "../data/region_map_names_en.h"
-#elif GERMAN
-#include "../data/region_map_names_de.h"
-#endif
-
-struct RegionMapLocation
-{
- u8 x, y;
- u8 width, height;
- const u8 *regionMapSectionId;
-};
-
-const struct RegionMapLocation gRegionMapLocations[] =
-{
- { 4, 11, 1, 1, gMapName_LittlerootTown},
- { 4, 9, 1, 1, gMapName_OldaleTown},
- { 2, 14, 1, 1, gMapName_DewfordTown},
- { 5, 3, 1, 1, gMapName_LavaridgeTown},
- { 3, 0, 1, 1, gMapName_FallarborTown},
- { 4, 6, 1, 1, gMapName_VerdanturfTown},
- {17, 10, 1, 1, gMapName_PacifidlogTown},
- { 1, 9, 1, 1, gMapName_PetalburgCity},
- { 8, 10, 1, 2, gMapName_SlateportCity},
- { 8, 6, 2, 1, gMapName_MauvilleCity},
- { 0, 5, 1, 2, gMapName_RustboroCity},
- {12, 0, 1, 1, gMapName_FortreeCity},
- {18, 3, 2, 1, gMapName_LilycoveCity},
- {24, 5, 2, 1, gMapName_MossdeepCity},
- {21, 7, 1, 1, gMapName_SootopolisCity},
- {27, 8, 1, 2, gMapName_EverGrandeCity},
- { 4, 10, 1, 1, gMapName_Route101},
- { 2, 9, 2, 1, gMapName_Route102},
- { 4, 8, 4, 1, gMapName_Route103},
- { 0, 7, 1, 3, gMapName_Route104},
- { 0, 10, 1, 3, gMapName_Route105},
- { 0, 13, 2, 1, gMapName_Route106},
- { 3, 14, 3, 1, gMapName_Route107},
- { 6, 14, 2, 1, gMapName_Route108},
- { 8, 12, 1, 3, gMapName_Route109},
- { 8, 7, 1, 3, gMapName_Route110},
- { 8, 0, 1, 6, gMapName_Route111},
- { 6, 3, 2, 1, gMapName_Route112},
- { 4, 0, 4, 1, gMapName_Route113},
- { 1, 0, 2, 3, gMapName_Route114},
- { 0, 2, 1, 3, gMapName_Route115},
- { 1, 5, 4, 1, gMapName_Route116},
- { 5, 6, 3, 1, gMapName_Route117},
- {10, 6, 2, 1, gMapName_Route118},
- {11, 0, 1, 6, gMapName_Route119},
- {13, 0, 1, 4, gMapName_Route120},
- {14, 3, 4, 1, gMapName_Route121},
- {16, 4, 1, 2, gMapName_Route122},
- {12, 6, 5, 1, gMapName_Route123},
- {20, 3, 4, 3, gMapName_Route124},
- {24, 3, 2, 2, gMapName_Route125},
- {20, 6, 3, 3, gMapName_Route126},
- {23, 6, 3, 3, gMapName_Route127},
- {23, 9, 4, 1, gMapName_Route128},
- {24, 10, 2, 1, gMapName_Route129},
- {21, 10, 3, 1, gMapName_Route130},
- {18, 10, 3, 1, gMapName_Route131},
- {15, 10, 2, 1, gMapName_Route132},
- {12, 10, 3, 1, gMapName_Route133},
- { 9, 10, 3, 1, gMapName_Route134},
- {20, 3, 4, 3, gMapName_Underwater},
- {20, 6, 3, 3, gMapName_Underwater},
- {23, 6, 3, 3, gMapName_Underwater},
- {23, 9, 4, 1, gMapName_Underwater},
- {21, 7, 1, 1, gMapName_Underwater},
- { 1, 13, 1, 1, gMapName_GraniteCave},
- { 6, 2, 1, 1, gMapName_MtChimney},
- {16, 2, 1, 1, gMapName_SafariZone},
- {22, 12, 1, 1, gMapName_BattleTower},
- { 0, 8, 1, 1, gMapName_PetalburgWoods},
- { 2, 5, 1, 1, gMapName_RusturfTunnel},
- { 6, 14, 1, 1, gMapName_AbandonedShip},
- { 8, 7, 1, 1, gMapName_NewMauville},
- { 0, 3, 1, 1, gMapName_MeteorFalls},
- { 1, 2, 1, 1, gMapName_MeteorFalls},
- {16, 4, 1, 1, gMapName_MtPyre},
- {19, 3, 1, 1, gMapName_EvilTeamHideout},
- {24, 4, 1, 1, gMapName_ShoalCave},
- {24, 9, 1, 1, gMapName_SeafloorCavern},
- {24, 9, 1, 1, gMapName_Underwater},
- {27, 9, 1, 1, gMapName_VictoryRoad},
- {17, 10, 1, 1, gMapName_MirageIsland},
- {21, 7, 1, 1, gMapName_CaveOfOrigin},
- {12, 14, 1, 1, gMapName_SouthernIsland},
- { 6, 3, 1, 1, gMapName_FieryPath},
- { 7, 3, 1, 1, gMapName_FieryPath},
- { 6, 3, 1, 1, gMapName_JaggedPass},
- { 7, 2, 1, 1, gMapName_JaggedPass},
- {11, 10, 1, 1, gMapName_SealedChamber},
- {11, 10, 1, 1, gMapName_Underwater},
- {13, 0, 1, 1, gMapName_ScorchedSlab},
- {0, 10, 1, 1, gMapName_IslandCave},
- { 8, 3, 1, 1, gMapName_DesertRuins},
- {13, 2, 1, 1, gMapName_AncientTomb},
- { 0, 0, 1, 1, gMapName_InsideOfTruck},
- {19, 10, 1, 1, gMapName_SkyPillar},
- { 0, 0, 1, 1, gMapName_SecretBase},
- { 0, 0, 1, 1, gMapName_None},
-};
-
-static const u16 gUnknown_083E7684[][2] =
-{
- {MAPSEC_UNDERWATER1, MAPSEC_ROUTE_124},
- {MAPSEC_UNDERWATER2, MAPSEC_ROUTE_126},
- {MAPSEC_UNDERWATER3, MAPSEC_ROUTE_127},
- {MAPSEC_UNDERWATER4, MAPSEC_ROUTE_128},
- {MAPSEC_UNDERWATER5, MAPSEC_SOOTOPOLIS_CITY},
- {MAPSEC_UNDERWATER6, MAPSEC_ROUTE_128},
- {MAPSEC_EVIL_TEAM_HIDEOUT, MAPSEC_LILYCOVE_CITY},
- {MAPSEC_UNDERWATER7, MAPSEC_ROUTE_134},
- {MAPSEC_PETALBURG_WOODS, MAPSEC_ROUTE_104},
- {MAPSEC_JAGGED_PASS_1, MAPSEC_ROUTE_112},
- {MAPSEC_MT_PYRE, MAPSEC_ROUTE_122},
- {MAPSEC_SKY_PILLAR, MAPSEC_ROUTE_131},
- {MAPSEC_NONE, MAPSEC_NONE},
-};
-
-static u8 sub_80FAB78(void);
-static u8 _swiopen(void);
-static u8 sub_80FAD04(void);
-static u8 sub_80FADE4(void);
-static void CalcZoomScrollParams(s16, s16, s16, s16, u16, u16, u8);
-static void sub_80FB238(s16, s16);
-void UpdateRegionMapVideoRegs(void);
-static u16 GetRegionMapSectionAt(u16, u16);
-static void InitializeCursorPosition(void);
-static void sub_80FB600(void);
-static u16 sub_80FB758(u16);
-static u16 sub_80FB9C0(u16);
-static void sub_80FBA18(void);
-static bool8 sub_80FBAA0(u16);
-void CreateRegionMapCursor(u16, u16);
-static void sub_80FBCA0(void);
-static void sub_80FBDF8(void);
-static void sub_80FBE24(void);
-static void SpriteCB_PlayerIconZoomedOut(struct Sprite *);
-static void UpdateIconBlink(struct Sprite *);
-static void SpriteCB_PlayerIconZoomedIn(struct Sprite *);
-const u8 *GetMapSectionName(u8 *, u16, u16);
-static void VBlankCB_FlyRegionMap(void);
-static void CB2_FlyRegionMap(void);
-static void sub_80FC244(void (*func)(void));
-static void PrintFlyTargetName(void);
-static void CreateFlyTargetGraphics(void);
-static void CreateCityTownFlyTargetIcons(void);
-static void CreateSpecialAreaFlyTargetIcons(void);
-static void SpriteCB_FlyTargetIcons(struct Sprite *);
-static void sub_80FC5B4(void);
-static void sub_80FC600(void);
-static void sub_80FC69C(void);
-
-void InitRegionMap(struct RegionMap *regionMap, bool8 zoomed)
-{
- sub_80FA904(regionMap, zoomed);
- while (sub_80FA940())
- ;
-}
-
-void sub_80FA904(struct RegionMap *regionMap, bool8 zoomed)
-{
- gRegionMap = regionMap;
- gRegionMap->initStep = 0;
- gRegionMap->zoomed = zoomed;
- gRegionMap->inputCallback = (zoomed == 0) ? sub_80FAB78 : sub_80FAD04;
-}
-
-bool8 sub_80FA940(void)
-{
- switch (gRegionMap->initStep)
- {
- case 0:
- LZ77UnCompVram(sRegionMapBkgnd_ImageLZ, (void *)(VRAM + 0x8000));
- break;
- case 1:
- LZ77UnCompVram(sRegionMapBkgnd_TilemapLZ, (void *)(VRAM + 0xE000));
- break;
- case 2:
- LoadPalette(sRegionMapBkgnd_Pal, 0x70, 0x60); // Why isn't this the right size?
- break;
- case 3:
- LZ77UnCompWram(sRegionMapCursorSmall_ImageLZ, gRegionMap->cursorSmallImage);
- break;
- case 4:
- LZ77UnCompWram(sRegionMapCursorLarge_ImageLZ, gRegionMap->cursorLargeImage);
- break;
- case 5:
- InitializeCursorPosition();
- gRegionMap->unk74 = gRegionMap->cursorPosX;
- gRegionMap->unk76 = gRegionMap->cursorPosY;
- gRegionMap->unk16 = sub_80FB758(gRegionMap->mapSectionId);
- gRegionMap->mapSectionId = sub_80FB9C0(gRegionMap->mapSectionId);
- GetMapSectionName(gRegionMap->mapSectionName, gRegionMap->mapSectionId, 16);
- break;
- case 6:
- if (gRegionMap->zoomed == FALSE)
- {
- CalcZoomScrollParams(0, 0, 0, 0, 0x100, 0x100, 0);
- }
- else
- {
- gRegionMap->scrollX = gRegionMap->cursorPosX * 8 - 52;
- gRegionMap->scrollY = gRegionMap->cursorPosY * 8 - 68;
- gRegionMap->unk64 = gRegionMap->cursorPosX;
- gRegionMap->unk66 = gRegionMap->cursorPosY;
- CalcZoomScrollParams(gRegionMap->scrollX, gRegionMap->scrollY, 0x38, 0x48, 0x80, 0x80, 0);
- }
- break;
- case 7:
- sub_80FBA18();
- UpdateRegionMapVideoRegs();
- gRegionMap->cursorSprite = NULL;
- gRegionMap->playerIconSprite = NULL;
- gRegionMap->unk7A = 0;
- gRegionMap->blinkPlayerIcon = FALSE;
- REG_BG2CNT = 0xBC8A;
- gRegionMap->initStep++;
- default:
- return FALSE;
- }
- gRegionMap->initStep++;
- return TRUE;
-}
-
-void FreeRegionMapIconResources(void)
-{
- if (gRegionMap->cursorSprite != NULL)
- {
- DestroySprite(gRegionMap->cursorSprite);
- FreeSpriteTilesByTag(gRegionMap->cursorTileTag);
- FreeSpritePaletteByTag(gRegionMap->cursorPaletteTag);
- }
- if (gRegionMap->playerIconSprite != NULL)
- {
- DestroySprite(gRegionMap->playerIconSprite);
- FreeSpriteTilesByTag(gRegionMap->playerIconTileTag);
- FreeSpritePaletteByTag(gRegionMap->playerIconPaletteTag);
- }
-}
-
-u8 sub_80FAB60(void)
-{
- return gRegionMap->inputCallback();
-}
-
-static u8 sub_80FAB78(void)
-{
- u8 event = INPUT_EVENT_NONE;
-
- gRegionMap->cursorDeltaX = 0;
- gRegionMap->cursorDeltaY = 0;
- if ((gMain.heldKeys & DPAD_UP) && gRegionMap->cursorPosY > MAPCURSOR_Y_MIN)
- {
- gRegionMap->cursorDeltaY = -1;
- event = INPUT_EVENT_DPAD;
- }
- if ((gMain.heldKeys & DPAD_DOWN) && gRegionMap->cursorPosY < MAPCURSOR_Y_MAX)
- {
- gRegionMap->cursorDeltaY = 1;
- event = INPUT_EVENT_DPAD;
- }
- if ((gMain.heldKeys & DPAD_LEFT) && gRegionMap->cursorPosX > MAPCURSOR_X_MIN)
- {
- gRegionMap->cursorDeltaX = -1;
- event = INPUT_EVENT_DPAD;
- }
- if ((gMain.heldKeys & DPAD_RIGHT) && gRegionMap->cursorPosX < MAPCURSOR_X_MAX)
- {
- gRegionMap->cursorDeltaX = 1;
- event = INPUT_EVENT_DPAD;
- }
-
- if (gMain.newKeys & A_BUTTON)
- event = INPUT_EVENT_A_BUTTON;
- else if (gMain.newKeys & B_BUTTON)
- event = INPUT_EVENT_B_BUTTON;
-
- if (event == INPUT_EVENT_DPAD)
- {
- gRegionMap->unk7A = 4;
- gRegionMap->inputCallback = _swiopen;
- }
- return event;
-}
-
-static u8 _swiopen(void)
-{
- u16 mapSectionId;
-
- if (gRegionMap->unk7A != 0)
- return INPUT_EVENT_2;
-
- if (gRegionMap->cursorDeltaX > 0)
- gRegionMap->cursorPosX++;
-
- if (gRegionMap->cursorDeltaX < 0)
- gRegionMap->cursorPosX--;
-
- if (gRegionMap->cursorDeltaY > 0)
- gRegionMap->cursorPosY++;
-
- if (gRegionMap->cursorDeltaY < 0)
- gRegionMap->cursorPosY--;
-
- mapSectionId = GetRegionMapSectionAt(gRegionMap->cursorPosX, gRegionMap->cursorPosY);
- gRegionMap->unk16 = sub_80FB758(mapSectionId);
- if (mapSectionId != gRegionMap->mapSectionId)
- {
- gRegionMap->mapSectionId = mapSectionId;
- GetMapSectionName(gRegionMap->mapSectionName, gRegionMap->mapSectionId, 16);
- }
- sub_80FBA18();
- gRegionMap->inputCallback = sub_80FAB78;
- return INPUT_EVENT_3;
-}
-
-static u8 sub_80FAD04(void)
-{
- u8 event = INPUT_EVENT_NONE;
-
- gRegionMap->unk6A = 0;
- gRegionMap->unk68 = 0;
- if ((gMain.heldKeys & DPAD_UP) && gRegionMap->scrollY > -52)
- {
- gRegionMap->unk68 = -1;
- event = INPUT_EVENT_DPAD;
- }
- if ((gMain.heldKeys & DPAD_DOWN) && gRegionMap->scrollY < 60)
- {
- gRegionMap->unk68 = 1;
- event = INPUT_EVENT_DPAD;
- }
- if ((gMain.heldKeys & DPAD_LEFT) && gRegionMap->scrollX > -44)
- {
- gRegionMap->unk6A = -1;
- event = INPUT_EVENT_DPAD;
- }
- if ((gMain.heldKeys & DPAD_RIGHT) && gRegionMap->scrollX < 172)
- {
- gRegionMap->unk6A = 1;
- event = INPUT_EVENT_DPAD;
- }
-
- if (gMain.newKeys & A_BUTTON)
- event = INPUT_EVENT_A_BUTTON;
- if (gMain.newKeys & B_BUTTON)
- event = INPUT_EVENT_B_BUTTON;
-
- if (event == INPUT_EVENT_DPAD)
- {
- gRegionMap->inputCallback = sub_80FADE4;
- gRegionMap->unk6C = 0;
- }
- return event;
-}
-
-static u8 sub_80FADE4(void)
-{
- gRegionMap->scrollY += gRegionMap->unk68;
- gRegionMap->scrollX += gRegionMap->unk6A;
- sub_80FB238(gRegionMap->scrollX, gRegionMap->scrollY);
- gRegionMap->unk6C++;
- if (gRegionMap->unk6C == 8)
- {
- u16 r3 = (gRegionMap->scrollX + 44) / 8 + 1;
- u16 r1 = (gRegionMap->scrollY + 52) / 8 + 2;
-
- if (r3 != gRegionMap->unk64 || r1 != gRegionMap->unk66)
- {
- u16 mapSectionId;
-
- gRegionMap->unk64 = r3;
- gRegionMap->unk66 = r1;
- mapSectionId = GetRegionMapSectionAt(r3, r1);
- gRegionMap->unk16 = sub_80FB758(mapSectionId);
- if (mapSectionId != gRegionMap->mapSectionId)
- {
- gRegionMap->mapSectionId = mapSectionId;
- GetMapSectionName(gRegionMap->mapSectionName, gRegionMap->mapSectionId, 16);
- }
- sub_80FBA18();
- }
- gRegionMap->unk6C = 0;
- gRegionMap->inputCallback = sub_80FAD04;
- return INPUT_EVENT_3;
- }
- return INPUT_EVENT_2;
-}
-
-void sub_80FAEC4(void)
-{
- if (gRegionMap->zoomed == FALSE)
- {
- gRegionMap->scrollY = 0;
- gRegionMap->scrollX = 0;
- gRegionMap->unk40 = 0;
- gRegionMap->unk3C = 0;
- gRegionMap->unk60 = gRegionMap->cursorPosX * 8 - 52;
- gRegionMap->unk62 = gRegionMap->cursorPosY * 8 - 68;
- gRegionMap->unk44 = (gRegionMap->unk60 << 8) / 16;
- gRegionMap->unk48 = (gRegionMap->unk62 << 8) / 16;
- gRegionMap->unk64 = gRegionMap->cursorPosX;
- gRegionMap->unk66 = gRegionMap->cursorPosY;
- gRegionMap->unk4C = (256 << 8);
- gRegionMap->unk50 = -0x800;
- }
- else
- {
- gRegionMap->unk3C = gRegionMap->scrollX * 256;
- gRegionMap->unk40 = gRegionMap->scrollY * 256;
- gRegionMap->unk60 = 0;
- gRegionMap->unk62 = 0;
- gRegionMap->unk44 = -(gRegionMap->unk3C / 16);
- gRegionMap->unk48 = -(gRegionMap->unk40 / 16);
- gRegionMap->cursorPosX = gRegionMap->unk64;
- gRegionMap->cursorPosY = gRegionMap->unk66;
- gRegionMap->unk4C = (128 << 8);
- gRegionMap->unk50 = 0x800;
- }
- gRegionMap->unk6E = 0;
- sub_80FBCA0();
- sub_80FBDF8();
-}
-
-u8 sub_80FAFC0(void)
-{
- u8 r4;
-
- if (gRegionMap->unk6E >= 16)
- return 0;
- gRegionMap->unk6E++;
- if (gRegionMap->unk6E == 16)
- {
- gRegionMap->unk44 = 0;
- gRegionMap->unk48 = 0;
- gRegionMap->scrollX = gRegionMap->unk60;
- gRegionMap->scrollY = gRegionMap->unk62;
- gRegionMap->unk4C = (gRegionMap->zoomed == FALSE) ? (128 << 8) : (256 << 8);
- gRegionMap->zoomed = !gRegionMap->zoomed;
- gRegionMap->inputCallback = (gRegionMap->zoomed == FALSE) ? sub_80FAB78 : sub_80FAD04;
- CreateRegionMapCursor(gRegionMap->cursorTileTag, gRegionMap->cursorPaletteTag);
- sub_80FBE24();
- r4 = 0;
- }
- else
- {
- gRegionMap->unk3C += gRegionMap->unk44;
- gRegionMap->unk40 += gRegionMap->unk48;
- gRegionMap->scrollX = gRegionMap->unk3C >> 8;
- gRegionMap->scrollY = gRegionMap->unk40 >> 8;
- gRegionMap->unk4C += gRegionMap->unk50;
- if ((gRegionMap->unk44 < 0 && gRegionMap->scrollX < gRegionMap->unk60)
- || (gRegionMap->unk44 > 0 && gRegionMap->scrollX > gRegionMap->unk60))
- {
- gRegionMap->scrollX = gRegionMap->unk60;
- gRegionMap->unk44 = 0;
- }
- if ((gRegionMap->unk48 < 0 && gRegionMap->scrollY < gRegionMap->unk62)
- || (gRegionMap->unk48 > 0 && gRegionMap->scrollY > gRegionMap->unk62))
- {
- gRegionMap->scrollY = gRegionMap->unk62;
- gRegionMap->unk48 = 0;
- }
- if (gRegionMap->zoomed == FALSE)
- {
- if (gRegionMap->unk4C < (128 << 8))
- {
- gRegionMap->unk4C = (128 << 8);
- gRegionMap->unk50 = 0;
- }
- }
- else
- {
- if (gRegionMap->unk4C > (256 << 8))
- {
- gRegionMap->unk4C = (256 << 8);
- gRegionMap->unk50 = 0;
- }
- }
- r4 = 1;
- }
- CalcZoomScrollParams(gRegionMap->scrollX, gRegionMap->scrollY, 0x38, 0x48, gRegionMap->unk4C >> 8, gRegionMap->unk4C >> 8, 0);
- return r4;
-}
-
-static void CalcZoomScrollParams(s16 a, s16 b, s16 c, s16 d, u16 e, u16 f, u8 rotation)
-{
- s32 var1;
- s32 var2;
- s32 var3;
- s32 var4;
-
- gRegionMap->unk2C = e * gSineTable[rotation + 64] >> 8;
- gRegionMap->unk30 = e * -gSineTable[rotation] >> 8;
- gRegionMap->unk34 = f * gSineTable[rotation] >> 8;
- gRegionMap->unk38 = f * gSineTable[rotation + 64] >> 8;
-
- var1 = (a << 8) + (c << 8);
- var2 = d * gRegionMap->unk34 + gRegionMap->unk2C * c;
- gRegionMap->bg2x = var1 - var2;
-
- var3 = (b << 8) + (d << 8);
- var4 = gRegionMap->unk38 * d + gRegionMap->unk30 * c;
- gRegionMap->bg2y = var3 - var4;
-
- gRegionMap->needUpdateVideoRegs = TRUE;
-}
-
-static void sub_80FB238(s16 x, s16 y)
-{
- gRegionMap->bg2x = (0x1C << 8) + (x << 8);
- gRegionMap->bg2y = (0x24 << 8) + (y << 8);
- gRegionMap->needUpdateVideoRegs = TRUE;
-}
-
-void UpdateRegionMapVideoRegs(void)
-{
- if (gRegionMap->needUpdateVideoRegs)
- {
- REG_BG2PA = gRegionMap->unk2C;
- REG_BG2PB = gRegionMap->unk34;
- REG_BG2PC = gRegionMap->unk30;
- REG_BG2PD = gRegionMap->unk38;
- REG_BG2X = gRegionMap->bg2x;
- REG_BG2Y = gRegionMap->bg2y;
- gRegionMap->needUpdateVideoRegs = FALSE;
- }
-}
-
-void sub_80FB2A4(s16 a, s16 b)
-{
- CalcZoomScrollParams(a, b, 0x38, 0x48, 0x100, 0x100, 0);
- UpdateRegionMapVideoRegs();
- if (gRegionMap->playerIconSprite != NULL)
- {
- gRegionMap->playerIconSprite->pos2.x = -a;
- gRegionMap->playerIconSprite->pos2.y = -b;
- }
-}
-
-static u16 GetRegionMapSectionAt(u16 x, u16 y)
-{
- if (y < MAPCURSOR_Y_MIN || y > MAPCURSOR_Y_MAX || x < MAPCURSOR_X_MIN || x > MAPCURSOR_X_MAX)
- return MAPSEC_NONE;
- y -= MAPCURSOR_Y_MIN;
- x -= MAPCURSOR_X_MIN;
- return sRegionMapLayout[x + y * 28];
-}
-
-static void InitializeCursorPosition(void)
-{
- struct MapHeader *mapHeader;
- u16 mapWidth;
- u16 mapHeight;
- u16 x;
- u16 y;
- u16 r1;
- u16 r9;
-
- if (gSaveBlock1.location.mapGroup == 25
- && (gSaveBlock1.location.mapNum == MAP_NUM(SS_TIDAL_CORRIDOR)
- || gSaveBlock1.location.mapNum == MAP_NUM(SS_TIDAL_LOWER_DECK)
- || gSaveBlock1.location.mapNum == MAP_NUM(SS_TIDAL_ROOMS)))
- {
- sub_80FB600();
- return;
- }
-
- switch (GetMapTypeByGroupAndId(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum) - 1)
- {
- default:
- case 0:
- case 1:
- case 2:
- case 4:
- case 5:
- gRegionMap->mapSectionId = gMapHeader.regionMapSectionId;
- gRegionMap->playerIsInCave = FALSE;
- mapWidth = gMapHeader.mapData->width;
- mapHeight = gMapHeader.mapData->height;
- x = gSaveBlock1.pos.x;
- y = gSaveBlock1.pos.y;
- if (gRegionMap->mapSectionId == MAPSEC_UNDERWATER6)
- gRegionMap->playerIsInCave = TRUE;
- break;
- case 3:
- case 6:
- mapHeader = Overworld_GetMapHeaderByGroupAndId(gSaveBlock1.warp4.mapGroup, gSaveBlock1.warp4.mapNum);
- gRegionMap->mapSectionId = mapHeader->regionMapSectionId;
- gRegionMap->playerIsInCave = TRUE;
- mapWidth = mapHeader->mapData->width;
- mapHeight = mapHeader->mapData->height;
- x = gSaveBlock1.warp4.x;
- y = gSaveBlock1.warp4.y;
- break;
- case 8:
- mapHeader = Overworld_GetMapHeaderByGroupAndId(gSaveBlock1.warp2.mapGroup, gSaveBlock1.warp2.mapNum);
- gRegionMap->mapSectionId = mapHeader->regionMapSectionId;
- gRegionMap->playerIsInCave = TRUE;
- mapWidth = mapHeader->mapData->width;
- mapHeight = mapHeader->mapData->height;
- x = gSaveBlock1.warp2.x;
- y = gSaveBlock1.warp2.y;
- break;
- case 7:
- {
- struct WarpData *r4;
-
- gRegionMap->mapSectionId = gMapHeader.regionMapSectionId;
- if (gRegionMap->mapSectionId != MAPSEC_UNK_0x57)
- {
- r4 = &gSaveBlock1.warp4;
- mapHeader = Overworld_GetMapHeaderByGroupAndId(r4->mapGroup, r4->mapNum);
- }
- else
- {
- r4 = &gSaveBlock1.warp2;
- mapHeader = Overworld_GetMapHeaderByGroupAndId(r4->mapGroup, r4->mapNum);
- gRegionMap->mapSectionId = mapHeader->regionMapSectionId;
- }
- gRegionMap->playerIsInCave = FALSE;
- mapWidth = mapHeader->mapData->width;
- mapHeight = mapHeader->mapData->height;
- x = r4->x;
- y = r4->y;
- }
- break;
- }
-
- r9 = x;
-
- r1 = mapWidth / gRegionMapLocations[gRegionMap->mapSectionId].width;
- if (r1 == 0)
- r1 = 1;
- x /= r1;
- if (x >= gRegionMapLocations[gRegionMap->mapSectionId].width)
- x = gRegionMapLocations[gRegionMap->mapSectionId].width - 1;
-
- r1 = mapHeight / gRegionMapLocations[gRegionMap->mapSectionId].height;
- if (r1 == 0)
- r1 = 1;
- y /= r1;
- if (y >= gRegionMapLocations[gRegionMap->mapSectionId].height)
- y = gRegionMapLocations[gRegionMap->mapSectionId].height - 1;
-
- switch (gRegionMap->mapSectionId)
- {
- case MAPSEC_ROUTE_114:
- if (y != 0)
- x = 0;
- break;
- case MAPSEC_ROUTE_126:
- case MAPSEC_UNDERWATER2:
- x = 0;
- if (gSaveBlock1.pos.x > 32)
- x = 1;
- if (gSaveBlock1.pos.x > 0x33)
- x++;
- y = 0;
- if (gSaveBlock1.pos.y > 0x25)
- y = 1;
- if (gSaveBlock1.pos.y > 0x38)
- y++;
- break;
- case MAPSEC_ROUTE_121:
- x = 0;
- if (r9 > 14)
- x = 1;
- if (r9 > 0x1C)
- x++;
- if (r9 > 0x36)
- x++;
- break;
- }
- gRegionMap->cursorPosX = gRegionMapLocations[gRegionMap->mapSectionId].x + x + MAPCURSOR_X_MIN;
- gRegionMap->cursorPosY = gRegionMapLocations[gRegionMap->mapSectionId].y + y + MAPCURSOR_Y_MIN;
-}
-
-static void sub_80FB600(void)
-{
- u16 y = 0;
- u16 x = 0;
- u8 mapGroup;
- u8 mapNum;
- s16 sp2;
- s16 sp4;
-
- switch (GetSSTidalLocation(&mapGroup, &mapNum, &sp2, &sp4))
- {
- case 1:
- gRegionMap->mapSectionId = MAPSEC_SLATEPORT_CITY;
- break;
- case 2:
- gRegionMap->mapSectionId = MAPSEC_LILYCOVE_CITY;
- break;
- case 3:
- gRegionMap->mapSectionId = MAPSEC_ROUTE_124;
- break;
- case 4:
- gRegionMap->mapSectionId = MAPSEC_ROUTE_131;
- break;
- default:
- case 0:
- {
- struct MapHeader *mapHeader = Overworld_GetMapHeaderByGroupAndId(mapGroup, mapNum);
- u16 r1;
-
- gRegionMap->mapSectionId = mapHeader->regionMapSectionId;
- r1 = mapHeader->mapData->width / gRegionMapLocations[gRegionMap->mapSectionId].width;
- if (r1 == 0)
- r1 = 1;
- x = sp2 / r1;
- if (x >= gRegionMapLocations[gRegionMap->mapSectionId].width)
- x = gRegionMapLocations[gRegionMap->mapSectionId].width - 1;
-
- r1 = mapHeader->mapData->height / gRegionMapLocations[gRegionMap->mapSectionId].height;
- if (r1 == 0)
- r1 = 1;
- y = sp4 / r1;
- if (y >= gRegionMapLocations[gRegionMap->mapSectionId].height)
- y = gRegionMapLocations[gRegionMap->mapSectionId].height - 1;
- }
- break;
- }
- gRegionMap->playerIsInCave = FALSE;
- gRegionMap->cursorPosX = gRegionMapLocations[gRegionMap->mapSectionId].x + x + MAPCURSOR_X_MIN;
- gRegionMap->cursorPosY = gRegionMapLocations[gRegionMap->mapSectionId].y + y + MAPCURSOR_Y_MIN;
-}
-
-static u16 sub_80FB758(u16 mapSectionId)
-{
- switch (mapSectionId)
- {
- case MAPSEC_NONE:
- return 0;
- case MAPSEC_LITTLEROOT_TOWN:
- return FlagGet(FLAG_VISITED_LITTLEROOT_TOWN) ? 2 : 3;
- case MAPSEC_OLDALE_TOWN:
- return FlagGet(FLAG_VISITED_OLDALE_TOWN) ? 2 : 3;
- case MAPSEC_DEWFORD_TOWN:
- return FlagGet(FLAG_VISITED_DEWFORD_TOWN) ? 2 : 3;
- case MAPSEC_LAVARIDGE_TOWN:
- return FlagGet(FLAG_VISITED_LAVARIDGE_TOWN) ? 2 : 3;
- case MAPSEC_FALLARBOR_TOWN:
- return FlagGet(FLAG_VISITED_FALLARBOR_TOWN) ? 2 : 3;
- case MAPSEC_VERDANTURF_TOWN:
- return FlagGet(FLAG_VISITED_VERDANTURF_TOWN) ? 2 : 3;
- case MAPSEC_PACIFIDLOG_TOWN:
- return FlagGet(FLAG_VISITED_PACIFIDLOG_TOWN) ? 2 : 3;
- case MAPSEC_PETALBURG_CITY:
- return FlagGet(FLAG_VISITED_PETALBURG_CITY) ? 2 : 3;
- case MAPSEC_SLATEPORT_CITY:
- return FlagGet(FLAG_VISITED_SLATEPORT_CITY) ? 2 : 3;
- case MAPSEC_MAUVILLE_CITY:
- return FlagGet(FLAG_VISITED_MAUVILLE_CITY) ? 2 : 3;
- case MAPSEC_RUSTBORO_CITY:
- return FlagGet(FLAG_VISITED_RUSTBORO_CITY) ? 2 : 3;
- case MAPSEC_FORTREE_CITY:
- return FlagGet(FLAG_VISITED_FORTREE_CITY) ? 2 : 3;
- case MAPSEC_LILYCOVE_CITY:
- return FlagGet(FLAG_VISITED_LILYCOVE_CITY) ? 2 : 3;
- case MAPSEC_MOSSDEEP_CITY:
- return FlagGet(FLAG_VISITED_MOSSDEEP_CITY) ? 2 : 3;
- case MAPSEC_SOOTOPOLIS_CITY:
- return FlagGet(FLAG_VISITED_SOOTOPOLIS_CITY) ? 2 : 3;
- case MAPSEC_EVER_GRANDE_CITY:
- return FlagGet(FLAG_VISITED_EVER_GRANDE_CITY) ? 2 : 3;
-
- case MAPSEC_BATTLE_TOWER:
- return FlagGet(FLAG_LANDMARK_BATTLE_TOWER) ? 4 : 0;
- case MAPSEC_SOUTHERN_ISLAND:
- return FlagGet(FLAG_LANDMARK_SOUTHERN_ISLAND) ? 1 : 0;
- default:
- return 1;
- }
-}
-
-u16 GetRegionMapSectionAt_(u16 x, u16 y)
-{
- return GetRegionMapSectionAt(x, y);
-}
-
-static u16 sub_80FB9C0(u16 mapSectionId)
-{
- u16 i;
-
- for (i = 0; gUnknown_083E7684[i][0] != MAPSEC_NONE; i++)
- {
- if (gUnknown_083E7684[i][0] == mapSectionId)
- return gUnknown_083E7684[i][1];
- }
- return mapSectionId;
-}
-
-u16 sub_80FBA04(u16 mapSectionId)
-{
- return sub_80FB9C0(mapSectionId);
-}
-
-static void sub_80FBA18(void)
-{
- u16 x;
- u16 y;
- u16 i;
-
- if (gRegionMap->mapSectionId == MAPSEC_NONE)
- {
- gRegionMap->everGrandeCityArea = 0;
- return;
- }
-
- if (gRegionMap->zoomed == FALSE)
- {
- x = gRegionMap->cursorPosX;
- y = gRegionMap->cursorPosY;
- }
- else
- {
- x = gRegionMap->unk64;
- y = gRegionMap->unk66;
- }
-
- i = 0;
- while (1)
- {
- if (x <= 1)
- {
- if (sub_80FBAA0(y))
- {
- y--;
- x = 0x1D;
- }
- else
- {
- break;
- }
- }
- else
- {
- x--;
- if (GetRegionMapSectionAt(x, y) == gRegionMap->mapSectionId)
- i++;
- }
- }
-
- gRegionMap->everGrandeCityArea = i;
-}
-
-static bool8 sub_80FBAA0(u16 a)
-{
- u16 x;
- u16 y;
-
- y = a - 1;
- if (y == 0xFFFF)
- return FALSE;
-
- for (x = MAPCURSOR_X_MIN; x <= MAPCURSOR_X_MAX; x++)
- {
- if (GetRegionMapSectionAt(x, y) == gRegionMap->mapSectionId)
- return TRUE;
- }
- return FALSE;
-}
-
-static const struct OamData sCursorOamData =
-{
- .y = 0,
- .affineMode = 0,
- .objMode = 0,
- .mosaic = 0,
- .bpp = 0,
- .shape = 0,
- .x = 0,
- .matrixNum = 0,
- .size = 1,
- .tileNum = 0,
- .priority = 1,
- .paletteNum = 0,
- .affineParam = 0,
-};
-
-static const union AnimCmd sCursorAnimSeq0[] =
-{
- ANIMCMD_FRAME(0, 20),
- ANIMCMD_FRAME(4, 20),
- ANIMCMD_JUMP(0),
-};
-
-static const union AnimCmd sCursorAnimSeq1[] =
-{
- ANIMCMD_FRAME(0, 10),
- ANIMCMD_FRAME(16, 10),
- ANIMCMD_FRAME(32, 10),
- ANIMCMD_FRAME(16, 10),
- ANIMCMD_JUMP(0),
-};
-
-static const union AnimCmd *const sCursorAnimTable[] =
-{
- sCursorAnimSeq0,
- sCursorAnimSeq1,
-};
-
-static void SpriteCB_Cursor(struct Sprite *sprite)
-{
- if (gRegionMap->unk7A != 0)
- {
- sprite->pos1.x += gRegionMap->cursorDeltaX * 2;
- sprite->pos1.y += gRegionMap->cursorDeltaY * 2;
- gRegionMap->unk7A--;
- }
-}
-
-static void nullsub_66(struct Sprite *sprite)
-{
-}
-
-void CreateRegionMapCursor(u16 tileTag, u16 paletteTag)
-{
- u8 spriteId;
- struct SpriteSheet spriteSheet;
- struct SpritePalette spritePalette =
- {
- .data = sRegionMapCursor_Pal,
- };
- struct SpriteTemplate spriteTemplate =
- {
- .oam = &sCursorOamData,
- .anims = sCursorAnimTable,
- .images = NULL,
- .affineAnims = gDummySpriteAffineAnimTable,
- .callback = SpriteCB_Cursor,
- };
-
- spriteSheet.tag = tileTag;
- spriteTemplate.tileTag = tileTag;
- gRegionMap->cursorTileTag = tileTag;
-
- spritePalette.tag = paletteTag;
- spriteTemplate.paletteTag = paletteTag;
- gRegionMap->cursorPaletteTag = paletteTag;
-
- if (gRegionMap->zoomed == FALSE)
- {
- spriteSheet.data = gRegionMap->cursorSmallImage;
- spriteSheet.size = 0x100;
- spriteTemplate.callback = SpriteCB_Cursor;
- }
- else
- {
- spriteSheet.data = gRegionMap->cursorLargeImage;
- spriteSheet.size = 0x600;
- spriteTemplate.callback = nullsub_66;
- }
- LoadSpriteSheet(&spriteSheet);
- LoadSpritePalette(&spritePalette);
- spriteId = CreateSprite(&spriteTemplate, 0x38, 0x48, 0);
- if (spriteId != 64)
- {
- gRegionMap->cursorSprite = &gSprites[spriteId];
- if (gRegionMap->zoomed == TRUE)
- {
- gRegionMap->cursorSprite->oam.size = 2;
- gRegionMap->cursorSprite->pos1.x -= 8;
- gRegionMap->cursorSprite->pos1.y -= 8;
- StartSpriteAnim(gRegionMap->cursorSprite, 1);
- }
- else
- {
- gRegionMap->cursorSprite->oam.size = 1;
- gRegionMap->cursorSprite->pos1.x = gRegionMap->cursorPosX * 8 + 4;
- gRegionMap->cursorSprite->pos1.y = gRegionMap->cursorPosY * 8 + 4;
- }
- gRegionMap->cursorSprite->data[1] = 2;
- gRegionMap->cursorSprite->data[2] = IndexOfSpritePaletteTag(paletteTag) * 16 + 0x0101;
- gRegionMap->cursorSprite->data[3] = 1;
- }
-}
-
-static void sub_80FBCA0(void)
-{
- if (gRegionMap->cursorSprite != NULL)
- {
- DestroySprite(gRegionMap->cursorSprite);
- FreeSpriteTilesByTag(gRegionMap->cursorTileTag);
- FreeSpritePaletteByTag(gRegionMap->cursorPaletteTag);
- }
-}
-
-void unref_sub_80FBCD0(void)
-{
- gRegionMap->cursorSprite->data[3] = 1;
-}
-
-void unref_sub_80FBCE0(void)
-{
- gRegionMap->cursorSprite->data[3] = 0;
-}
-
-static const struct OamData sPlayerIconOamData =
-{
- .y = 0,
- .affineMode = 0,
- .objMode = 0,
- .mosaic = 0,
- .bpp = 0,
- .shape = 0,
- .x = 0,
- .matrixNum = 0,
- .size = 1,
- .tileNum = 0,
- .priority = 2,
- .paletteNum = 0,
- .affineParam = 0,
-};
-
-static const union AnimCmd sPlayerIconAnimSeq0[] =
-{
- ANIMCMD_FRAME(0, 5),
- ANIMCMD_END,
-};
-
-static const union AnimCmd *const sPlayerIconAnimTable[] =
-{
- sPlayerIconAnimSeq0,
-};
-
-void CreateRegionMapPlayerIcon(u16 tileTag, u16 paletteTag)
-{
- u8 spriteId;
- struct SpriteSheet playerIconSpriteSheet =
- {
- .data = sRegionMapBrendanIcon_Image,
- .size = 128,
- .tag = tileTag,
- };
- struct SpritePalette playerIconSpritePalette =
- {
- .data = sRegionMapBrendanIcon_Pal,
- .tag = paletteTag,
- };
- struct SpriteTemplate playerIconSpriteTemplate =
- {
- .tileTag = tileTag,
- .paletteTag = paletteTag,
- .oam = &sPlayerIconOamData,
- .anims = sPlayerIconAnimTable,
- .images = NULL,
- .affineAnims = gDummySpriteAffineAnimTable,
- .callback = SpriteCallbackDummy,
- };
-
- if (gSaveBlock2.playerGender == FEMALE)
- {
- playerIconSpriteSheet.data = sRegionMapMayIcon_Image;
- playerIconSpritePalette.data = sRegionMapMayIcon_Pal;
- }
- LoadSpriteSheet(&playerIconSpriteSheet);
- LoadSpritePalette(&playerIconSpritePalette);
- spriteId = CreateSprite(&playerIconSpriteTemplate, 0, 0, 1);
- gRegionMap->playerIconSprite = &gSprites[spriteId];
- if (gRegionMap->zoomed == FALSE)
- {
- gRegionMap->playerIconSprite->pos1.x = gRegionMap->unk74 * 8 + 4;
- gRegionMap->playerIconSprite->pos1.y = gRegionMap->unk76 * 8 + 4;
- gRegionMap->playerIconSprite->callback = SpriteCB_PlayerIconZoomedOut;
- }
- else
- {
- gRegionMap->playerIconSprite->pos1.x = gRegionMap->unk74 * 16 - 48;
- gRegionMap->playerIconSprite->pos1.y = gRegionMap->unk76 * 16 - 66;
- gRegionMap->playerIconSprite->callback = SpriteCB_PlayerIconZoomedIn;
- }
-}
-
-static void sub_80FBDF8(void)
-{
- if (gRegionMap->playerIconSprite != NULL)
- {
- gRegionMap->playerIconSprite->invisible = TRUE;
- gRegionMap->playerIconSprite->callback = SpriteCallbackDummy;
- }
-}
-
-static void sub_80FBE24(void)
-{
- if (gRegionMap->playerIconSprite != NULL)
- {
- if (gRegionMap->zoomed == TRUE)
- {
- gRegionMap->playerIconSprite->pos1.x = gRegionMap->unk74 * 16 - 48;
- gRegionMap->playerIconSprite->pos1.y = gRegionMap->unk76 * 16 - 66;
- gRegionMap->playerIconSprite->callback = SpriteCB_PlayerIconZoomedIn;
- gRegionMap->playerIconSprite->invisible = FALSE;
- }
- else
- {
- gRegionMap->playerIconSprite->pos1.x = gRegionMap->unk74 * 8 + 4;
- gRegionMap->playerIconSprite->pos1.y = gRegionMap->unk76 * 8 + 4;
- gRegionMap->playerIconSprite->pos2.x = 0;
- gRegionMap->playerIconSprite->pos2.y = 0;
- gRegionMap->playerIconSprite->callback = SpriteCB_PlayerIconZoomedOut;
- gRegionMap->playerIconSprite->invisible = FALSE;
- }
- }
-}
-
-static void SpriteCB_PlayerIconZoomedIn(struct Sprite *sprite)
-{
- sprite->pos2.x = -(gRegionMap->scrollX * 2);
- sprite->pos2.y = -(gRegionMap->scrollY * 2);
- sprite->data[0] = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY;
- sprite->data[1] = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX;
-
- // Determine if sprite is on screen
- if (sprite->data[0] < -8 || sprite->data[0] > 0xA8 || sprite->data[1] < -8 || sprite->data[1] > 0xF8)
- sprite->data[2] = FALSE;
- else
- sprite->data[2] = TRUE;
-
- if (sprite->data[2] == TRUE)
- UpdateIconBlink(sprite);
- else
- sprite->invisible = TRUE;
-}
-
-static void SpriteCB_PlayerIconZoomedOut(struct Sprite *sprite)
-{
- UpdateIconBlink(sprite);
-}
-
-static void UpdateIconBlink(struct Sprite *sprite)
-{
- if (gRegionMap->blinkPlayerIcon)
- {
- // Toggle visibility every 16 frames
- sprite->data[7]++;
- if (sprite->data[7] > 16)
- {
- sprite->data[7] = 0;
- sprite->invisible = !sprite->invisible;
- }
- }
- else
- {
- sprite->invisible = FALSE;
- }
-}
-
-void sub_80FBF94(void)
-{
- if (gRegionMap->playerIsInCave)
- gRegionMap->blinkPlayerIcon = TRUE;
-}
-
-const u8 *GetMapSectionName(u8 *dest, u16 mapSectionId, u16 length)
-{
- if (mapSectionId == MAPSEC_SECRET_BASE)
- return GetSecretBaseMapName(dest);
- if (mapSectionId < MAPSEC_NONE)
- return StringCopy(dest, gRegionMapLocations[mapSectionId].regionMapSectionId);
- if (length == 0)
- length = 18;
- return StringFill(dest, CHAR_SPACE, length);
-}
-
-const u8 *CopyMapName(u8 *dest, u16 mapSectionId)
-{
- switch (mapSectionId)
- {
- case MAPSEC_UNK_0x57:
- return StringCopy(dest, gOtherText_Ferry);
- case MAPSEC_SECRET_BASE:
- return StringCopy(dest, gOtherText_SecretBase);
- default:
- return GetMapSectionName(dest, mapSectionId, 0);
- }
-}
-
-const u8 *CopyLocationName(u8 *dest, u16 mapSectionId)
-{
- if (mapSectionId == MAPSEC_EVIL_TEAM_HIDEOUT)
- return StringCopy(dest, gOtherText_Hideout);
- else
- return CopyMapName(dest, mapSectionId);
-}
-
-static void GetRegionMapLocationPosition(u16 mapSectionId, u16 *x, u16 *y, u16 *width, u16 *height)
-{
- *x = gRegionMapLocations[mapSectionId].x;
- *y = gRegionMapLocations[mapSectionId].y;
- *width = gRegionMapLocations[mapSectionId].width;
- *height = gRegionMapLocations[mapSectionId].height;
-}
-
-struct UnknownStruct3
-{
- void (*unk0)(void);
- u16 unk4;
- u16 unk6;
- struct RegionMap regionMap;
-};
-
-static const u16 sFlyRegionMapFrame_Pal[] = INCBIN_U16("graphics/pokenav/map_frame.gbapal");
-static const u8 sFlyRegionMapFrame_ImageLZ[] = INCBIN_U8("graphics/pokenav/map_frame.4bpp.lz");
-static const u8 sFlyRegionMapFrame_TilemapLZ[] = INCBIN_U8("graphics/pokenav/map_frame.bin.lz");
-static const u16 sFlyTargetIcons_Pal[] = INCBIN_U16("graphics/pokenav/fly_target_icons.gbapal");
-static const u8 sFlyTargetIcons_ImageLZ[] = INCBIN_U8("graphics/pokenav/fly_target_icons.4bpp.lz");
-
-static const u8 sUnknown_083E7920[][3] =
-{
- {0, 9, 1},
- {0, 10, 14},
- {0, 11, 15},
- {0, 12, 16},
- {0, 13, 17},
- {0, 14, 18},
- {0, 15, 19},
- {0, 0, 3},
- {0, 1, 4},
- {0, 2, 5},
- {0, 3, 6},
- {0, 4, 7},
- {0, 5, 8},
- {0, 6, 9},
- {0, 7, 10},
- {0, 8, 11},
- {0, 16, 0},
- {0, 17, 0},
- {0, 18, 0},
- {0, 19, 0},
- {0, 20, 0},
- {0, 21, 0},
- {0, 22, 0},
- {0, 23, 0},
- {0, 24, 0},
- {0, 25, 0},
- {0, 26, 0},
- {0, 27, 0},
- {0, 28, 0},
- {0, 29, 0},
- {0, 30, 0},
- {0, 31, 0},
- {0, 32, 0},
- {0, 33, 0},
- {0, 34, 0},
- {0, 35, 0},
- {0, 36, 0},
- {0, 37, 0},
- {0, 38, 0},
- {0, 39, 0},
- {0, 40, 0},
- {0, 41, 0},
- {0, 42, 0},
- {0, 43, 0},
- {0, 44, 0},
- {0, 45, 0},
- {0, 46, 0},
- {0, 47, 0},
- {0, 48, 0},
- {0, 49, 0},
-};
-
-struct UnknownStruct4
-{
- const u8 *const *unk0;
- u16 mapSectionId;
- u16 flag;
-};
-
-static const u8 *const sEverGrandeCityAreaNames[] = {OtherText_PokeLeague, OtherText_PokeCenter};
-
-static const struct UnknownStruct4 sUnknown_083E79C0[1] =
-{
- {sEverGrandeCityAreaNames, MAPSEC_EVER_GRANDE_CITY, FLAG_SYS_POKEMON_LEAGUE_FLY},
-};
-
-// XXX: what is this?
-static u8 *const ewram_ = gSharedMem;
-
-static const struct SpritePalette sFlyTargetIconSpritePalette = {sFlyTargetIcons_Pal, 2};
-
-// Fly targets that are not cities or towns
-static const u16 sSpecialFlyAreas[][2] =
-{
- // flag, mapSectionId
- {0x848, MAPSEC_BATTLE_TOWER},
- {0xFFFF, MAPSEC_NONE},
-};
-
-static const struct OamData sFlyTargetOamData =
-{
- .y = 0,
- .affineMode = 0,
- .objMode = 0,
- .mosaic = 0,
- .bpp = 0,
- .shape = 0,
- .x = 0,
- .matrixNum = 0,
- .size = 0,
- .tileNum = 0,
- .priority = 2,
- .paletteNum = 0,
- .affineParam = 0,
-};
-
-static const union AnimCmd sFlyTargetAnimSeq0[] =
-{
- ANIMCMD_FRAME(0, 5),
- ANIMCMD_END,
-};
-
-static const union AnimCmd sFlyTargetAnimSeq1[] =
-{
- ANIMCMD_FRAME(1, 5),
- ANIMCMD_END,
-};
-
-static const union AnimCmd sFlyTargetAnimSeq2[] =
-{
- ANIMCMD_FRAME(3, 5),
- ANIMCMD_END,
-};
-
-static const union AnimCmd sFlyTargetAnimSeq3[] =
-{
- ANIMCMD_FRAME(5, 5),
- ANIMCMD_END,
-};
-
-static const union AnimCmd sFlyTargetAnimSeq4[] =
-{
- ANIMCMD_FRAME(6, 5),
- ANIMCMD_END,
-};
-
-static const union AnimCmd sFlyTargetAnimSeq5[] =
-{
- ANIMCMD_FRAME(8, 5),
- ANIMCMD_END,
-};
-
-static const union AnimCmd sFlyTargetAnimSeq6[] =
-{
- ANIMCMD_FRAME(10, 5),
- ANIMCMD_END,
-};
-
-static const union AnimCmd *const sFlyTargetAnimTable[] =
-{
- sFlyTargetAnimSeq0,
- sFlyTargetAnimSeq1,
- sFlyTargetAnimSeq2,
- sFlyTargetAnimSeq3,
- sFlyTargetAnimSeq4,
- sFlyTargetAnimSeq5,
- sFlyTargetAnimSeq6,
-};
-
-static const struct SpriteTemplate gFlyTargetSpriteTemplate =
-{
- .tileTag = 2,
- .paletteTag = 2,
- .oam = &sFlyTargetOamData,
- .anims = sFlyTargetAnimTable,
- .images = NULL,
- .affineAnims = gDummySpriteAffineAnimTable,
- .callback = SpriteCallbackDummy,
-};
-
-void CB2_InitFlyRegionMap(void)
-{
- switch (gMain.state)
- {
- case 0:
- SetVBlankCallback(NULL);
- REG_DISPCNT = 0;
- REG_BG0HOFS = 0;
- REG_BG0VOFS = 0;
- REG_BG1HOFS = 0;
- REG_BG1VOFS = 0;
- REG_BG2VOFS = 0;
- REG_BG2HOFS = 0;
- REG_BG3HOFS = 0;
- REG_BG3VOFS = 0;
- ResetPaletteFade();
- ResetSpriteData();
- FreeSpriteTileRanges();
- FreeAllSpritePalettes();
- break;
- case 1:
- Text_LoadWindowTemplate(&gWindowTemplate_81E7224);
- break;
- case 2:
- InitMenuWindow(&gWindowTemplate_81E7224);
- Menu_EraseScreen();
- break;
- case 3:
- InitRegionMap(&ewram0_3.regionMap, 0);
- CreateRegionMapCursor(0, 0);
- CreateRegionMapPlayerIcon(1, 1);
- ewram0_3.unk6 = ewram0_3.regionMap.mapSectionId;
- StringFill(ewramBlankMapName, CHAR_SPACE, 12);
- PrintFlyTargetName();
- break;
- case 4:
- LZ77UnCompVram(sFlyRegionMapFrame_ImageLZ, (void *)(VRAM + 0xC000));
- break;
- case 5:
- LZ77UnCompVram(sFlyRegionMapFrame_TilemapLZ, (void *)(VRAM + 0xF000));
- break;
- case 6:
- LoadPalette(sFlyRegionMapFrame_Pal, 16, 32);
- Menu_PrintTextPixelCoords(gOtherText_FlyToWhere, 1, 0x90, 1);
- break;
- case 7:
- CreateFlyTargetGraphics();
- break;
- case 8:
- BlendPalettes(0xFFFFFFFF, 16, 0);
- SetVBlankCallback(VBlankCB_FlyRegionMap);
- break;
- case 9:
- REG_BLDCNT = 0;
- REG_BG1CNT = 0x1E0D;
- REG_DISPCNT = 0x1741;
- sub_80FC244(sub_80FC5B4);
- SetMainCallback2(CB2_FlyRegionMap);
- break;
- default:
- return;
- }
- gMain.state++;
-}
-
-static void VBlankCB_FlyRegionMap(void)
-{
- LoadOam();
- ProcessSpriteCopyRequests();
- TransferPlttBuffer();
-}
-
-static void CB2_FlyRegionMap(void)
-{
- ewram0_3.unk0();
- AnimateSprites();
- BuildOamBuffer();
-}
-
-static void sub_80FC244(void (*func)(void))
-{
- ewram0_3.unk0 = func;
- ewram0_3.unk4 = 0;
-}
-
-static void PrintFlyTargetName(void)
-{
- if (ewram0_3.regionMap.unk16 == 2 || ewram0_3.regionMap.unk16 == 4)
- {
- u16 i;
- bool32 drawFrameDisabled = FALSE;
-
- for (i = 0; i < ARRAY_COUNT(sUnknown_083E79C0); i++)
- {
- const struct UnknownStruct4 *r4 = &sUnknown_083E79C0[i];
-
- if (ewram0_3.regionMap.mapSectionId == r4->mapSectionId)
- {
- if (FlagGet(r4->flag))
- {
- Menu_DrawStdWindowFrame(16, 14, 29, 19);
- Menu_PrintText(ewram0_3.regionMap.mapSectionName, 17, 15);
- MenuPrint_RightAligned(r4->unk0[ewram0_3.regionMap.everGrandeCityArea], 29, 17);
- return;
- }
- break;
- }
- }
-
- if (!drawFrameDisabled)
- {
- Menu_DrawStdWindowFrame(16, 16, 29, 19);
- Menu_PrintText(ewram0_3.regionMap.mapSectionName, 17, 17);
- Menu_EraseWindowRect(16, 14, 29, 15);
- }
- }
- else
- {
- Menu_DrawStdWindowFrame(16, 16, 29, 19);
- Menu_PrintText(ewramBlankMapName, 17, 17);
- Menu_EraseWindowRect(16, 14, 29, 15);
- }
-}
-
-static void CreateFlyTargetGraphics(void)
-{
- struct SpriteSheet spriteSheet;
-
- LZ77UnCompWram(sFlyTargetIcons_ImageLZ, ewram888);
- spriteSheet.data = ewram888;
- spriteSheet.size = 0x1C0;
- spriteSheet.tag = 2;
- LoadSpriteSheet(&spriteSheet);
- LoadSpritePalette(&sFlyTargetIconSpritePalette);
- CreateCityTownFlyTargetIcons();
- CreateSpecialAreaFlyTargetIcons();
-}
-
-// Draws a light overlay on cities and towns that the player can fly to
-static void CreateCityTownFlyTargetIcons(void)
-{
- u16 canFlyFlag = 0x80F;
- u16 i;
-
- for (i = 0; i < 16; i++)
- {
- u16 x;
- u16 y;
- u16 width;
- u16 height;
- u16 r7;
- u8 spriteId;
-
- GetRegionMapLocationPosition(i, &x, &y, &width, &height);
- x = (x + 1) * 8 + 4;
- y = (y + 2) * 8 + 4;
- if (width == 2)
- r7 = 1;
- else if (height == 2)
- r7 = 2;
- else
- r7 = 0;
- spriteId = CreateSprite(&gFlyTargetSpriteTemplate, x, y, 10);
- if (spriteId != 64)
- {
- gSprites[spriteId].oam.shape = r7;
- if (FlagGet(canFlyFlag))
- gSprites[spriteId].callback = SpriteCB_FlyTargetIcons;
- else
- r7 += 3;
- StartSpriteAnim(&gSprites[spriteId], r7);
- gSprites[spriteId].data[0] = i;
- }
- canFlyFlag++;
- }
-}
-
-// Draws a red box on other fly targets
-// The Battle Tower is the only one of these
-static void CreateSpecialAreaFlyTargetIcons(void)
-{
- u16 i;
-
- for (i = 0; sSpecialFlyAreas[i][1] != MAPSEC_NONE; i++)
- {
- u16 x;
- u16 y;
- u16 width;
- u16 height;
-
- if (FlagGet(sSpecialFlyAreas[i][0]))
- {
- u16 mapSectionId = sSpecialFlyAreas[i][1];
- u8 spriteId;
-
- GetRegionMapLocationPosition(mapSectionId, &x, &y, &width, &height);
- x = (x + 1) * 8;
- y = (y + 2) * 8;
- spriteId = CreateSprite(&gFlyTargetSpriteTemplate, x, y, 10);
- if (spriteId != 64)
- {
- gSprites[spriteId].oam.size = 1;
- gSprites[spriteId].callback = SpriteCB_FlyTargetIcons;
- StartSpriteAnim(&gSprites[spriteId], 6);
- gSprites[spriteId].data[0] = mapSectionId;
- }
- }
- }
-}
-
-static void SpriteCB_FlyTargetIcons(struct Sprite *sprite)
-{
- // Blink if our mapSectionId is the one selected on the map
- if (ewram0_3.regionMap.mapSectionId == sprite->data[0])
- {
- // Toggle visibility every 16 frames
- sprite->data[1]++;
- if (sprite->data[1] > 16)
- {
- sprite->data[1] = 0;
- sprite->invisible = !sprite->invisible;
- }
- }
- else
- {
- sprite->data[1] = 16;
- sprite->invisible = FALSE;
- }
-}
-
-static void sub_80FC5B4(void)
-{
- switch (ewram0_3.unk4)
- {
- case 0:
- BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0);
- ewram0_3.unk4++;
- break;
- case 1:
- if (UpdatePaletteFade() != 0)
- break;
- sub_80FC244(sub_80FC600);
- break;
- }
-}
-
-static void sub_80FC600(void)
-{
- if (ewram0_3.unk4 == 0)
- {
- switch (sub_80FAB60())
- {
- case INPUT_EVENT_NONE:
- case INPUT_EVENT_DPAD:
- case INPUT_EVENT_2:
- break;
- case INPUT_EVENT_3:
- PrintFlyTargetName();
- break;
- case INPUT_EVENT_A_BUTTON:
- if (ewram0_3.regionMap.unk16 == 2 || ewram0_3.regionMap.unk16 == 4)
- {
- m4aSongNumStart(SE_SELECT);
- ewramA6E = 1;
- sub_80FC244(sub_80FC69C);
- }
- break;
- case INPUT_EVENT_B_BUTTON:
- m4aSongNumStart(SE_SELECT);
- ewramA6E = 0;
- sub_80FC244(sub_80FC69C);
- break;
- }
- }
-}
-
-static void sub_80FC69C(void)
-{
- switch (ewram0_3.unk4)
- {
- case 0:
- BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
- ewram0_3.unk4++;
- break;
- case 1:
- if (UpdatePaletteFade() != 0)
- break;
- FreeRegionMapIconResources();
- if (ewramA6E != 0)
- {
- switch (ewram0_3.regionMap.mapSectionId)
- {
- case MAPSEC_SOUTHERN_ISLAND:
- sub_8053538(22);
- break;
- case MAPSEC_BATTLE_TOWER:
- sub_8053538(21);
- break;
- case MAPSEC_LITTLEROOT_TOWN:
- sub_8053538((gSaveBlock2.playerGender == MALE) ? 12 : 13);
- break;
- case MAPSEC_EVER_GRANDE_CITY:
- sub_8053538((FlagGet(FLAG_SYS_POKEMON_LEAGUE_FLY) && ewram0_3.regionMap.everGrandeCityArea == 0) ? 20 : 11);
- break;
- default:
- if (sUnknown_083E7920[ewram0_3.regionMap.mapSectionId][2] != 0)
- sub_8053538(sUnknown_083E7920[ewram0_3.regionMap.mapSectionId][2]);
- else
- warp1_set_2(sUnknown_083E7920[ewram0_3.regionMap.mapSectionId][0], sUnknown_083E7920[ewram0_3.regionMap.mapSectionId][1], -1);
- break;
- }
- sub_80865BC();
- }
- else
- {
- SetMainCallback2(sub_808AD58);
- }
- break;
- }
-}