Fly from Pokenav (#5679)

This commit is contained in:
khbsd 2025-01-04 17:24:58 -06:00 committed by GitHub
parent d7bbb2e628
commit 76964dd96a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 167 additions and 43 deletions

View File

@ -85,6 +85,7 @@
#define OW_FLAG_NO_ENCOUNTER 0 // If this flag is set, wild encounters will be disabled. #define OW_FLAG_NO_ENCOUNTER 0 // If this flag is set, wild encounters will be disabled.
#define OW_FLAG_NO_TRAINER_SEE 0 // If this flag is set, trainers will not battle the player unless they're talked to. #define OW_FLAG_NO_TRAINER_SEE 0 // If this flag is set, trainers will not battle the player unless they're talked to.
#define OW_FLAG_NO_COLLISION 0 // If this flag is set, the player will be able to walk over tiles with collision. Mainly intended for debugging purposes. #define OW_FLAG_NO_COLLISION 0 // If this flag is set, the player will be able to walk over tiles with collision. Mainly intended for debugging purposes.
#define OW_FLAG_POKE_RIDER 0 // If this flag is set, the player will be able to use fly from the Pokenav Region Map and the Town Map key item by pressing 'R' on a city/location they are able to fly to.
#define BATTLE_PYRAMID_RANDOM_ENCOUNTERS FALSE // If set to TRUE, battle pyramid Pokemon will be generated randomly based on the round's challenge instead of hardcoded in src/data/battle_frontier/battle_pyramid_level_50_wild_mons.h (or open_level_wild_mons.h) #define BATTLE_PYRAMID_RANDOM_ENCOUNTERS FALSE // If set to TRUE, battle pyramid Pokemon will be generated randomly based on the round's challenge instead of hardcoded in src/data/battle_frontier/battle_pyramid_level_50_wild_mons.h (or open_level_wild_mons.h)

View File

@ -52,6 +52,7 @@ extern bool8 (*gFieldCallback2)(void);
extern u8 gLocalLinkPlayerId; extern u8 gLocalLinkPlayerId;
extern u8 gFieldLinkPlayerCount; extern u8 gFieldLinkPlayerCount;
extern bool8 gExitStairsMovementDisabled; extern bool8 gExitStairsMovementDisabled;
extern bool8 gSkipShowMonAnim;
extern const struct UCoords32 gDirectionToVectors[]; extern const struct UCoords32 gDirectionToVectors[];

View File

@ -171,6 +171,8 @@ enum
HELPBAR_NONE, HELPBAR_NONE,
HELPBAR_MAP_ZOOMED_OUT, HELPBAR_MAP_ZOOMED_OUT,
HELPBAR_MAP_ZOOMED_IN, HELPBAR_MAP_ZOOMED_IN,
HELPBAR_MAP_ZOOMED_OUT_CANFLY,
HELPBAR_MAP_ZOOMED_IN_CANFLY,
HELPBAR_CONDITION_MON_LIST, HELPBAR_CONDITION_MON_LIST,
HELPBAR_CONDITION_MON_STATUS, HELPBAR_CONDITION_MON_STATUS,
HELPBAR_CONDITION_MARKINGS, HELPBAR_CONDITION_MARKINGS,
@ -295,6 +297,7 @@ enum
POKENAV_MAP_FUNC_ZOOM_OUT, POKENAV_MAP_FUNC_ZOOM_OUT,
POKENAV_MAP_FUNC_ZOOM_IN, POKENAV_MAP_FUNC_ZOOM_IN,
POKENAV_MAP_FUNC_EXIT, POKENAV_MAP_FUNC_EXIT,
POKENAV_MAP_FUNC_FLY
}; };
// Modes for PokenavFadeScreen // Modes for PokenavFadeScreen
@ -438,6 +441,7 @@ void CreateRegionMapLoopedTask(s32);
bool32 IsRegionMapLoopedTaskActive(void); bool32 IsRegionMapLoopedTaskActive(void);
void FreeRegionMapSubstruct1(void); void FreeRegionMapSubstruct1(void);
void FreeRegionMapSubstruct2(void); void FreeRegionMapSubstruct2(void);
void UpdateRegionMapHelpBarText(void);
// pokenav_conditions.c // pokenav_conditions.c
u32 PokenavCallback_Init_ConditionGraph_Party(void); u32 PokenavCallback_Init_ConditionGraph_Party(void);

View File

@ -14,6 +14,7 @@ enum
MAP_INPUT_MOVE_END, MAP_INPUT_MOVE_END,
MAP_INPUT_A_BUTTON, MAP_INPUT_A_BUTTON,
MAP_INPUT_B_BUTTON, MAP_INPUT_B_BUTTON,
MAP_INPUT_R_BUTTON
}; };
enum { enum {
@ -115,6 +116,10 @@ void TrySetPlayerIconBlink(void);
void BlendRegionMap(u16 color, u32 coeff); void BlendRegionMap(u16 color, u32 coeff);
void SetRegionMapDataForZoom(void); void SetRegionMapDataForZoom(void);
//Pokenav Fly funcs
u32 FilterFlyDestination(struct RegionMap* regionMap);
void SetFlyDestination(struct RegionMap* regionMap);
extern const struct RegionMapLocation gRegionMapEntries[]; extern const struct RegionMapLocation gRegionMapEntries[];
#endif //GUARD_REGION_MAP_H #endif //GUARD_REGION_MAP_H

View File

@ -1,6 +1,7 @@
#include "global.h" #include "global.h"
#include "data.h" #include "data.h"
#include "decompress.h" #include "decompress.h"
#include "event_data.h"
#include "event_object_movement.h" #include "event_object_movement.h"
#include "field_camera.h" #include "field_camera.h"
#include "field_control_avatar.h" #include "field_control_avatar.h"
@ -28,9 +29,10 @@
#include "trainer_pokemon_sprites.h" #include "trainer_pokemon_sprites.h"
#include "trig.h" #include "trig.h"
#include "util.h" #include "util.h"
#include "constants/field_effects.h"
#include "constants/event_objects.h" #include "constants/event_objects.h"
#include "constants/event_object_movement.h" #include "constants/event_object_movement.h"
#include "constants/field_effects.h"
#include "constants/flags.h"
#include "constants/metatile_behaviors.h" #include "constants/metatile_behaviors.h"
#include "constants/rgb.h" #include "constants/rgb.h"
#include "constants/songs.h" #include "constants/songs.h"
@ -39,6 +41,7 @@
#define subsprite_table(ptr) {.subsprites = ptr, .subspriteCount = (sizeof ptr) / (sizeof(struct Subsprite))} #define subsprite_table(ptr) {.subsprites = ptr, .subspriteCount = (sizeof ptr) / (sizeof(struct Subsprite))}
EWRAM_DATA s32 gFieldEffectArguments[8] = {0}; EWRAM_DATA s32 gFieldEffectArguments[8] = {0};
EWRAM_DATA bool8 gSkipShowMonAnim = FALSE;
// Static type declarations // Static type declarations
@ -3231,7 +3234,8 @@ static void FlyOutFieldEffect_ShowMon(struct Task *task)
{ {
task->tState++; task->tState++;
gFieldEffectArguments[0] = task->tMonId; gFieldEffectArguments[0] = task->tMonId;
FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); if (!gSkipShowMonAnim)
FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT);
} }
} }
@ -3480,6 +3484,7 @@ static void StartFlyBirdReturnToBall(u8 spriteId)
u8 FldEff_FlyIn(void) u8 FldEff_FlyIn(void)
{ {
CreateTask(Task_FlyIn, 254); CreateTask(Task_FlyIn, 254);
gSkipShowMonAnim = FALSE; // Clears this variable so flying via the party menu keeps the show mon animation
return 0; return 0;
} }

View File

@ -1,17 +1,22 @@
#include "global.h" #include "global.h"
#include "bg.h" #include "bg.h"
#include "event_data.h"
#include "field_effect.h"
#include "gpu_regs.h" #include "gpu_regs.h"
#include "international_string_util.h" #include "international_string_util.h"
#include "main.h" #include "main.h"
#include "malloc.h" #include "malloc.h"
#include "menu.h" #include "menu.h"
#include "overworld.h"
#include "palette.h" #include "palette.h"
#include "region_map.h" #include "region_map.h"
#include "sound.h"
#include "strings.h" #include "strings.h"
#include "text.h" #include "text.h"
#include "text_window.h" #include "text_window.h"
#include "window.h" #include "window.h"
#include "constants/rgb.h" #include "constants/rgb.h"
#include "constants/songs.h"
/* /*
* This is the type of map shown when interacting with the metatiles for * This is the type of map shown when interacting with the metatiles for
@ -44,7 +49,8 @@ static void MCB2_InitRegionMapRegisters(void);
static void VBCB_FieldUpdateRegionMap(void); static void VBCB_FieldUpdateRegionMap(void);
static void MCB2_FieldUpdateRegionMap(void); static void MCB2_FieldUpdateRegionMap(void);
static void FieldUpdateRegionMap(void); static void FieldUpdateRegionMap(void);
static void PrintRegionMapSecName(void); static void PrintRegionMapSecName();
static void PrintTitleWindowText();
static const struct BgTemplate sFieldRegionMapBgTemplates[] = { static const struct BgTemplate sFieldRegionMapBgTemplates[] = {
{ {
@ -139,8 +145,6 @@ static void MCB2_FieldUpdateRegionMap(void)
static void FieldUpdateRegionMap(void) static void FieldUpdateRegionMap(void)
{ {
u8 offset;
switch (sFieldRegionMapHandler->state) switch (sFieldRegionMapHandler->state)
{ {
case 0: case 0:
@ -151,8 +155,8 @@ static void FieldUpdateRegionMap(void)
break; break;
case 1: case 1:
DrawStdFrameWithCustomTileAndPalette(WIN_TITLE, FALSE, 0x27, 0xd); DrawStdFrameWithCustomTileAndPalette(WIN_TITLE, FALSE, 0x27, 0xd);
offset = GetStringCenterAlignXOffset(FONT_NORMAL, gText_Hoenn, 0x38); FillWindowPixelBuffer(WIN_TITLE, PIXEL_FILL(1));
AddTextPrinterParameterized(WIN_TITLE, FONT_NORMAL, gText_Hoenn, offset, 1, 0, NULL); PrintTitleWindowText();
ScheduleBgCopyTilemapToVram(0); ScheduleBgCopyTilemapToVram(0);
DrawStdFrameWithCustomTileAndPalette(WIN_MAPSEC_NAME, FALSE, 0x27, 0xd); DrawStdFrameWithCustomTileAndPalette(WIN_MAPSEC_NAME, FALSE, 0x27, 0xd);
PrintRegionMapSecName(); PrintRegionMapSecName();
@ -176,11 +180,21 @@ static void FieldUpdateRegionMap(void)
{ {
case MAP_INPUT_MOVE_END: case MAP_INPUT_MOVE_END:
PrintRegionMapSecName(); PrintRegionMapSecName();
PrintTitleWindowText();
break; break;
case MAP_INPUT_A_BUTTON: case MAP_INPUT_A_BUTTON:
case MAP_INPUT_B_BUTTON: case MAP_INPUT_B_BUTTON:
sFieldRegionMapHandler->state++; sFieldRegionMapHandler->state++;
break; break;
case MAP_INPUT_R_BUTTON:
if (sFieldRegionMapHandler->regionMap.mapSecType == MAPSECTYPE_CITY_CANFLY
&& FlagGet(OW_FLAG_POKE_RIDER) && Overworld_MapTypeAllowsTeleportAndFly(gMapHeader.mapType) == TRUE)
{
PlaySE(SE_SELECT);
SetFlyDestination(&sFieldRegionMapHandler->regionMap);
gSkipShowMonAnim = TRUE;
ReturnToFieldFromFlyMapSelect();
}
} }
break; break;
case 5: case 5:
@ -213,3 +227,24 @@ static void PrintRegionMapSecName(void)
CopyWindowToVram(WIN_MAPSEC_NAME, COPYWIN_FULL); CopyWindowToVram(WIN_MAPSEC_NAME, COPYWIN_FULL);
} }
} }
static void PrintTitleWindowText(void)
{
static const u8 FlyPromptText[] = _("{R_BUTTON} FLY");
u32 hoennOffset = GetStringCenterAlignXOffset(FONT_NORMAL, gText_Hoenn, 0x38);
u32 flyOffset = GetStringCenterAlignXOffset(FONT_NORMAL, FlyPromptText, 0x38);
FillWindowPixelBuffer(WIN_TITLE, PIXEL_FILL(1));
if (sFieldRegionMapHandler->regionMap.mapSecType == MAPSECTYPE_CITY_CANFLY
&& FlagGet(OW_FLAG_POKE_RIDER) && Overworld_MapTypeAllowsTeleportAndFly(gMapHeader.mapType) == TRUE)
{
AddTextPrinterParameterized(WIN_TITLE, FONT_NORMAL, FlyPromptText, flyOffset, 1, 0, NULL);
ScheduleBgCopyTilemapToVram(WIN_TITLE);
}
else
{
AddTextPrinterParameterized(WIN_TITLE, FONT_NORMAL, gText_Hoenn, hoennOffset, 1, 0, NULL);
CopyWindowToVram(WIN_TITLE, COPYWIN_FULL);
}
}

View File

@ -86,18 +86,20 @@ static const struct WindowTemplate sHelpBarWindowTemplate[] =
static const u8 *const sHelpBarTexts[HELPBAR_COUNT] = static const u8 *const sHelpBarTexts[HELPBAR_COUNT] =
{ {
[HELPBAR_NONE] = COMPOUND_STRING("{CLEAR 0x80}"), [HELPBAR_NONE] = COMPOUND_STRING("{CLEAR 0x80}"),
[HELPBAR_MAP_ZOOMED_OUT] = COMPOUND_STRING("{A_BUTTON}ZOOM {B_BUTTON}CANCEL"), [HELPBAR_MAP_ZOOMED_OUT] = COMPOUND_STRING("{A_BUTTON}ZOOM {B_BUTTON}CANCEL"),
[HELPBAR_MAP_ZOOMED_IN] = COMPOUND_STRING("{A_BUTTON}FULL {B_BUTTON}CANCEL"), [HELPBAR_MAP_ZOOMED_IN] = COMPOUND_STRING("{A_BUTTON}FULL {B_BUTTON}CANCEL"),
[HELPBAR_CONDITION_MON_LIST] = COMPOUND_STRING("{A_BUTTON}CONDITION {B_BUTTON}CANCEL"), [HELPBAR_MAP_ZOOMED_OUT_CANFLY] = COMPOUND_STRING("{A_BUTTON}ZOOM {B_BUTTON}CANCEL {R_BUTTON}FLY"),
[HELPBAR_CONDITION_MON_STATUS] = COMPOUND_STRING("{A_BUTTON}MARKINGS {B_BUTTON}CANCEL"), [HELPBAR_MAP_ZOOMED_IN_CANFLY] = COMPOUND_STRING("{A_BUTTON}FULL {B_BUTTON}CANCEL {R_BUTTON}FLY"),
[HELPBAR_CONDITION_MARKINGS] = COMPOUND_STRING("{A_BUTTON}SELECT MARK {B_BUTTON}CANCEL"), [HELPBAR_CONDITION_MON_LIST] = COMPOUND_STRING("{A_BUTTON}CONDITION {B_BUTTON}CANCEL"),
[HELPBAR_MC_TRAINER_LIST] = COMPOUND_STRING("{A_BUTTON}MENU {B_BUTTON}CANCEL"), [HELPBAR_CONDITION_MON_STATUS] = COMPOUND_STRING("{A_BUTTON}MARKINGS {B_BUTTON}CANCEL"),
[HELPBAR_MC_CALL_MENU] = COMPOUND_STRING("{A_BUTTON}OK {B_BUTTON}CANCEL"), [HELPBAR_CONDITION_MARKINGS] = COMPOUND_STRING("{A_BUTTON}SELECT MARK {B_BUTTON}CANCEL"),
[HELPBAR_MC_CHECK_PAGE] = COMPOUND_STRING("{B_BUTTON}CANCEL"), [HELPBAR_MC_TRAINER_LIST] = COMPOUND_STRING("{A_BUTTON}MENU {B_BUTTON}CANCEL"),
[HELPBAR_RIBBONS_MON_LIST] = COMPOUND_STRING("{A_BUTTON}RIBBONS {B_BUTTON}CANCEL"), [HELPBAR_MC_CALL_MENU] = COMPOUND_STRING("{A_BUTTON}OK {B_BUTTON}CANCEL"),
[HELPBAR_RIBBONS_LIST] = COMPOUND_STRING("{A_BUTTON}CHECK {B_BUTTON}CANCEL"), [HELPBAR_MC_CHECK_PAGE] = COMPOUND_STRING("{B_BUTTON}CANCEL"),
[HELPBAR_RIBBONS_CHECK] = COMPOUND_STRING("{B_BUTTON}CANCEL"), [HELPBAR_RIBBONS_MON_LIST] = COMPOUND_STRING("{A_BUTTON}RIBBONS {B_BUTTON}CANCEL"),
[HELPBAR_RIBBONS_LIST] = COMPOUND_STRING("{A_BUTTON}CHECK {B_BUTTON}CANCEL"),
[HELPBAR_RIBBONS_CHECK] = COMPOUND_STRING("{B_BUTTON}CANCEL"),
}; };
static const u8 sHelpBarTextColors[3] = static const u8 sHelpBarTextColors[3] =

View File

@ -2,8 +2,11 @@
#include "bg.h" #include "bg.h"
#include "decompress.h" #include "decompress.h"
#include "landmark.h" #include "landmark.h"
#include "event_data.h"
#include "field_effect.h"
#include "main.h" #include "main.h"
#include "menu.h" #include "menu.h"
#include "overworld.h"
#include "palette.h" #include "palette.h"
#include "pokenav.h" #include "pokenav.h"
#include "region_map.h" #include "region_map.h"
@ -73,6 +76,7 @@ static u32 LoopedTask_UpdateInfoAfterCursorMove(s32);
static u32 LoopedTask_RegionMapZoomOut(s32); static u32 LoopedTask_RegionMapZoomOut(s32);
static u32 LoopedTask_RegionMapZoomIn(s32); static u32 LoopedTask_RegionMapZoomIn(s32);
static u32 LoopedTask_ExitRegionMap(s32); static u32 LoopedTask_ExitRegionMap(s32);
static u32 LoopedTask_TreatAsPokeNavFlyMap(s32);
extern const u16 gRegionMapCityZoomTiles_Pal[]; extern const u16 gRegionMapCityZoomTiles_Pal[];
extern const u32 gRegionMapCityZoomText_Gfx[]; extern const u32 gRegionMapCityZoomText_Gfx[];
@ -119,7 +123,8 @@ static const LoopedTask sRegionMapLoopTaskFuncs[] =
[POKENAV_MAP_FUNC_CURSOR_MOVED] = LoopedTask_UpdateInfoAfterCursorMove, [POKENAV_MAP_FUNC_CURSOR_MOVED] = LoopedTask_UpdateInfoAfterCursorMove,
[POKENAV_MAP_FUNC_ZOOM_OUT] = LoopedTask_RegionMapZoomOut, [POKENAV_MAP_FUNC_ZOOM_OUT] = LoopedTask_RegionMapZoomOut,
[POKENAV_MAP_FUNC_ZOOM_IN] = LoopedTask_RegionMapZoomIn, [POKENAV_MAP_FUNC_ZOOM_IN] = LoopedTask_RegionMapZoomIn,
[POKENAV_MAP_FUNC_EXIT] = LoopedTask_ExitRegionMap [POKENAV_MAP_FUNC_EXIT] = LoopedTask_ExitRegionMap,
[POKENAV_MAP_FUNC_FLY] = LoopedTask_TreatAsPokeNavFlyMap,
}; };
static const struct CompressedSpriteSheet sCityZoomTextSpriteSheet[1] = static const struct CompressedSpriteSheet sCityZoomTextSpriteSheet[1] =
@ -204,6 +209,8 @@ u32 GetRegionMapCallback(void)
static u32 HandleRegionMapInput(struct Pokenav_RegionMapMenu *state) static u32 HandleRegionMapInput(struct Pokenav_RegionMapMenu *state)
{ {
struct RegionMap* regionMap = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP);
switch (DoRegionMapInputCallback()) switch (DoRegionMapInputCallback())
{ {
case MAP_INPUT_MOVE_END: case MAP_INPUT_MOVE_END:
@ -215,6 +222,10 @@ static u32 HandleRegionMapInput(struct Pokenav_RegionMapMenu *state)
case MAP_INPUT_B_BUTTON: case MAP_INPUT_B_BUTTON:
state->callback = GetExitRegionMapMenuId; state->callback = GetExitRegionMapMenuId;
return POKENAV_MAP_FUNC_EXIT; return POKENAV_MAP_FUNC_EXIT;
case MAP_INPUT_R_BUTTON:
if (regionMap->mapSecType == MAPSECTYPE_CITY_CANFLY && FlagGet(OW_FLAG_POKE_RIDER)
&& Overworld_MapTypeAllowsTeleportAndFly(gMapHeader.mapType) == TRUE)
return POKENAV_MAP_FUNC_FLY;
} }
return POKENAV_MAP_FUNC_NONE; return POKENAV_MAP_FUNC_NONE;
@ -365,6 +376,7 @@ static u32 LoopedTask_OpenRegionMap(s32 taskState)
else else
menuGfxId = POKENAV_GFX_MAP_MENU_ZOOMED_IN; menuGfxId = POKENAV_GFX_MAP_MENU_ZOOMED_IN;
UpdateRegionMapHelpBarText();
LoadLeftHeaderGfxForIndex(menuGfxId); LoadLeftHeaderGfxForIndex(menuGfxId);
ShowLeftHeaderGfx(menuGfxId, TRUE, TRUE); ShowLeftHeaderGfx(menuGfxId, TRUE, TRUE);
PokenavFadeScreen(POKENAV_FADE_FROM_BLACK); PokenavFadeScreen(POKENAV_FADE_FROM_BLACK);
@ -385,6 +397,7 @@ static u32 LoopedTask_UpdateInfoAfterCursorMove(s32 taskState)
{ {
case 0: case 0:
UpdateMapSecInfoWindow(state); UpdateMapSecInfoWindow(state);
UpdateRegionMapHelpBarText();
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
case 1: case 1:
if (IsDma3ManagerBusyWithBgCopy_(state)) if (IsDma3ManagerBusyWithBgCopy_(state))
@ -408,7 +421,7 @@ static u32 LoopedTask_RegionMapZoomOut(s32 taskState)
if (UpdateRegionMapZoom() || IsChangeBgYForZoomActive()) if (UpdateRegionMapZoom() || IsChangeBgYForZoomActive())
return LT_PAUSE; return LT_PAUSE;
PrintHelpBarText(HELPBAR_MAP_ZOOMED_OUT); UpdateRegionMapHelpBarText();
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
case 2: case 2:
if (WaitForHelpBar()) if (WaitForHelpBar())
@ -441,7 +454,7 @@ static u32 LoopedTask_RegionMapZoomIn(s32 taskState)
if (UpdateRegionMapZoom() || IsChangeBgYForZoomActive()) if (UpdateRegionMapZoom() || IsChangeBgYForZoomActive())
return LT_PAUSE; return LT_PAUSE;
PrintHelpBarText(HELPBAR_MAP_ZOOMED_IN); UpdateRegionMapHelpBarText();
return LT_INC_AND_PAUSE; return LT_INC_AND_PAUSE;
case 3: case 3:
if (WaitForHelpBar()) if (WaitForHelpBar())
@ -482,6 +495,23 @@ static u32 LoopedTask_ExitRegionMap(s32 taskState)
return LT_FINISH; return LT_FINISH;
} }
static u32 LoopedTask_TreatAsPokeNavFlyMap(s32 taskState)
{
switch (taskState)
{
case 0:
PlaySE(SE_SELECT);
struct RegionMap* regionMap = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP);
SetFlyDestination(regionMap);
gSkipShowMonAnim = TRUE;
ReturnToFieldFromFlyMapSelect();
return LT_FINISH;
}
return LT_FINISH;
}
static void LoadCityZoomViewGfx(void) static void LoadCityZoomViewGfx(void)
{ {
int i; int i;
@ -740,3 +770,24 @@ static void SetCityZoomTextInvisibility(bool32 invisible)
for (i = 0; i < (int)ARRAY_COUNT(state->cityZoomTextSprites); i++) for (i = 0; i < (int)ARRAY_COUNT(state->cityZoomTextSprites); i++)
state->cityZoomTextSprites[i]->invisible = invisible; state->cityZoomTextSprites[i]->invisible = invisible;
} }
void UpdateRegionMapHelpBarText(void)
{
struct RegionMap* regionMap = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP);
if (regionMap->mapSecType == MAPSECTYPE_CITY_CANFLY && FlagGet(OW_FLAG_POKE_RIDER)
&& Overworld_MapTypeAllowsTeleportAndFly(gMapHeader.mapType) == TRUE)
{
if (IsRegionMapZoomed())
PrintHelpBarText(HELPBAR_MAP_ZOOMED_IN_CANFLY);
else
PrintHelpBarText(HELPBAR_MAP_ZOOMED_OUT_CANFLY);
}
else
{
if (IsRegionMapZoomed())
PrintHelpBarText(HELPBAR_MAP_ZOOMED_IN);
else
PrintHelpBarText(HELPBAR_MAP_ZOOMED_OUT);
}
}

View File

@ -680,6 +680,10 @@ static u8 ProcessRegionMapInput_Full(void)
{ {
input = MAP_INPUT_B_BUTTON; input = MAP_INPUT_B_BUTTON;
} }
else if (JOY_NEW(R_BUTTON))
{
input = MAP_INPUT_R_BUTTON;
}
if (input == MAP_INPUT_MOVE_START) if (input == MAP_INPUT_MOVE_START)
{ {
sRegionMap->cursorMovementFrameCounter = 4; sRegionMap->cursorMovementFrameCounter = 4;
@ -759,6 +763,10 @@ static u8 ProcessRegionMapInput_Zoomed(void)
{ {
input = MAP_INPUT_B_BUTTON; input = MAP_INPUT_B_BUTTON;
} }
else if (JOY_NEW(R_BUTTON))
{
input = MAP_INPUT_R_BUTTON;
}
if (input == MAP_INPUT_MOVE_START) if (input == MAP_INPUT_MOVE_START)
{ {
sRegionMap->inputCallback = MoveRegionMapCursor_Zoomed; sRegionMap->inputCallback = MoveRegionMapCursor_Zoomed;
@ -1992,27 +2000,9 @@ static void CB_ExitFlyMap(void)
FreeRegionMapIconResources(); FreeRegionMapIconResources();
if (sFlyMap->choseFlyLocation) if (sFlyMap->choseFlyLocation)
{ {
switch (sFlyMap->regionMap.mapSecId) struct RegionMap* tempRegionMap = &sFlyMap->regionMap;
{
case MAPSEC_SOUTHERN_ISLAND: SetFlyDestination(tempRegionMap);
SetWarpDestinationToHealLocation(HEAL_LOCATION_SOUTHERN_ISLAND_EXTERIOR);
break;
case MAPSEC_BATTLE_FRONTIER:
SetWarpDestinationToHealLocation(HEAL_LOCATION_BATTLE_FRONTIER_OUTSIDE_EAST);
break;
case MAPSEC_LITTLEROOT_TOWN:
SetWarpDestinationToHealLocation(gSaveBlock2Ptr->playerGender == MALE ? HEAL_LOCATION_LITTLEROOT_TOWN_BRENDANS_HOUSE : HEAL_LOCATION_LITTLEROOT_TOWN_MAYS_HOUSE);
break;
case MAPSEC_EVER_GRANDE_CITY:
SetWarpDestinationToHealLocation(FlagGet(FLAG_LANDMARK_POKEMON_LEAGUE) && sFlyMap->regionMap.posWithinMapSec == 0 ? HEAL_LOCATION_EVER_GRANDE_CITY_POKEMON_LEAGUE : HEAL_LOCATION_EVER_GRANDE_CITY);
break;
default:
if (sMapHealLocations[sFlyMap->regionMap.mapSecId][2] != HEAL_LOCATION_NONE)
SetWarpDestinationToHealLocation(sMapHealLocations[sFlyMap->regionMap.mapSecId][2]);
else
SetWarpDestinationToMapWarp(sMapHealLocations[sFlyMap->regionMap.mapSecId][0], sMapHealLocations[sFlyMap->regionMap.mapSecId][1], WARP_ID_NONE);
break;
}
ReturnToFieldFromFlyMapSelect(); ReturnToFieldFromFlyMapSelect();
} }
else else
@ -2025,3 +2015,33 @@ static void CB_ExitFlyMap(void)
break; break;
} }
} }
u32 FilterFlyDestination(struct RegionMap* regionMap)
{
switch (regionMap->mapSecId)
{
case MAPSEC_SOUTHERN_ISLAND:
return HEAL_LOCATION_SOUTHERN_ISLAND_EXTERIOR;
case MAPSEC_BATTLE_FRONTIER:
return HEAL_LOCATION_BATTLE_FRONTIER_OUTSIDE_EAST;
case MAPSEC_LITTLEROOT_TOWN:
return (gSaveBlock2Ptr->playerGender == MALE ? HEAL_LOCATION_LITTLEROOT_TOWN_BRENDANS_HOUSE : HEAL_LOCATION_LITTLEROOT_TOWN_MAYS_HOUSE);
case MAPSEC_EVER_GRANDE_CITY:
return (FlagGet(FLAG_LANDMARK_POKEMON_LEAGUE) && regionMap->posWithinMapSec == 0 ? HEAL_LOCATION_EVER_GRANDE_CITY_POKEMON_LEAGUE : HEAL_LOCATION_EVER_GRANDE_CITY);
default:
if (sMapHealLocations[regionMap->mapSecId][2] != HEAL_LOCATION_NONE)
return sMapHealLocations[regionMap->mapSecId][2];
else
return WARP_ID_NONE;
}
}
void SetFlyDestination(struct RegionMap* regionMap)
{
u32 flyDestination = FilterFlyDestination(regionMap);
if (flyDestination != WARP_ID_NONE)
SetWarpDestinationToHealLocation(flyDestination);
else
SetWarpDestinationToMapWarp(sMapHealLocations[regionMap->mapSecId][0], sMapHealLocations[regionMap->mapSecId][1], WARP_ID_NONE);
}