Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fly from Pokenav #5679

Open
wants to merge 11 commits into
base: upcoming
Choose a base branch
from
Open
9 changes: 5 additions & 4 deletions include/config/overworld.h
Original file line number Diff line number Diff line change
Expand Up @@ -81,10 +81,11 @@
// Overworld flags
// To use the following features in scripting, replace the 0s with the flag ID you're assigning it to.
// Eg: Replace with FLAG_UNUSED_0x264 so you can use that flag to toggle the feature.
#define OW_FLAG_PAUSE_TIME 0 // If this flag is set and OW_USE_FAKE_RTC is enabled, seconds on the in-game clock will not advance.
#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_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_PAUSE_TIME 0 // If this flag is set and OW_USE_FAKE_RTC is enabled, seconds on the in-game clock will not advance.
#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_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 section by pressing 'R' on a city/location they have been to.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
#define OW_FLAG_PAUSE_TIME 0 // If this flag is set and OW_USE_FAKE_RTC is enabled, seconds on the in-game clock will not advance.
#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_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 section by pressing 'R' on a city/location they have been to.
#define OW_FLAG_PAUSE_TIME 0 // If this flag is set and OW_USE_FAKE_RTC is enabled, seconds on the in-game clock will not advance.
#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_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 section by pressing 'R' on a city/location they have been to.

Match previous alignment


#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)

Expand Down
2 changes: 2 additions & 0 deletions include/overworld.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@

#define SKIP_OBJECT_EVENT_LOAD 1

extern EWRAM_DATA bool8 gSkipShowMonAnim;

struct InitialPlayerAvatarState
{
u8 transitionFlags;
Expand Down
4 changes: 4 additions & 0 deletions include/pokenav.h
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,8 @@ enum
HELPBAR_NONE,
HELPBAR_MAP_ZOOMED_OUT,
HELPBAR_MAP_ZOOMED_IN,
HELPBAR_MAP_ZOOMED_OUT_CANFLY,
HELPBAR_MAP_ZOOMED_IN_CANFLY,
HELPBAR_CONDITION_MON_LIST,
HELPBAR_CONDITION_MON_STATUS,
HELPBAR_CONDITION_MARKINGS,
Expand Down Expand Up @@ -295,6 +297,7 @@ enum
POKENAV_MAP_FUNC_ZOOM_OUT,
POKENAV_MAP_FUNC_ZOOM_IN,
POKENAV_MAP_FUNC_EXIT,
POKENAV_MAP_FUNC_FLY
};

// Modes for PokenavFadeScreen
Expand Down Expand Up @@ -438,6 +441,7 @@ void CreateRegionMapLoopedTask(s32);
bool32 IsRegionMapLoopedTaskActive(void);
void FreeRegionMapSubstruct1(void);
void FreeRegionMapSubstruct2(void);
void UpdateRegionMapHelpBarText(void);

// pokenav_conditions.c
u32 PokenavCallback_Init_ConditionGraph_Party(void);
Expand Down
5 changes: 5 additions & 0 deletions include/region_map.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ enum
MAP_INPUT_MOVE_END,
MAP_INPUT_A_BUTTON,
MAP_INPUT_B_BUTTON,
MAP_INPUT_R_BUTTON
};

enum {
Expand Down Expand Up @@ -115,6 +116,10 @@ void TrySetPlayerIconBlink(void);
void BlendRegionMap(u16 color, u32 coeff);
void SetRegionMapDataForZoom(void);

//Pokenav Fly funcs
u32 FilterFlyDestination(struct RegionMap* regionMap);
void SetFlyDestination(struct RegionMap* regionMap);

extern const struct RegionMapLocation gRegionMapEntries[];

#endif //GUARD_REGION_MAP_H
9 changes: 7 additions & 2 deletions src/field_effect.c
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#include "global.h"
#include "data.h"
#include "decompress.h"
#include "event_data.h"
#include "event_object_movement.h"
#include "field_camera.h"
#include "field_control_avatar.h"
Expand Down Expand Up @@ -28,9 +29,10 @@
#include "trainer_pokemon_sprites.h"
#include "trig.h"
#include "util.h"
#include "constants/field_effects.h"
#include "constants/event_objects.h"
#include "constants/event_object_movement.h"
#include "constants/field_effects.h"
#include "constants/flags.h"
#include "constants/metatile_behaviors.h"
#include "constants/rgb.h"
#include "constants/songs.h"
Expand All @@ -39,6 +41,7 @@
#define subsprite_table(ptr) {.subsprites = ptr, .subspriteCount = (sizeof ptr) / (sizeof(struct Subsprite))}

EWRAM_DATA s32 gFieldEffectArguments[8] = {0};
EWRAM_DATA bool8 gSkipShowMonAnim = FALSE;

// Static type declarations

Expand Down Expand Up @@ -3226,7 +3229,8 @@ static void FlyOutFieldEffect_ShowMon(struct Task *task)
{
task->tState++;
gFieldEffectArguments[0] = task->tMonId;
FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT);
if (!gSkipShowMonAnim)
FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT);
}
}

Expand Down Expand Up @@ -3475,6 +3479,7 @@ static void StartFlyBirdReturnToBall(u8 spriteId)
u8 FldEff_FlyIn(void)
{
CreateTask(Task_FlyIn, 254);
gSkipShowMonAnim = FALSE; // Clears this variable so flying via the party menu keeps the show mon animation
return 0;
}

Expand Down
26 changes: 14 additions & 12 deletions src/pokenav_main_menu.c
Original file line number Diff line number Diff line change
Expand Up @@ -86,18 +86,20 @@ static const struct WindowTemplate sHelpBarWindowTemplate[] =

static const u8 *const sHelpBarTexts[HELPBAR_COUNT] =
{
[HELPBAR_NONE] = COMPOUND_STRING("{CLEAR 0x80}"),
[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_CONDITION_MON_LIST] = COMPOUND_STRING("{A_BUTTON}CONDITION {B_BUTTON}CANCEL"),
[HELPBAR_CONDITION_MON_STATUS] = COMPOUND_STRING("{A_BUTTON}MARKINGS {B_BUTTON}CANCEL"),
[HELPBAR_CONDITION_MARKINGS] = COMPOUND_STRING("{A_BUTTON}SELECT MARK {B_BUTTON}CANCEL"),
[HELPBAR_MC_TRAINER_LIST] = COMPOUND_STRING("{A_BUTTON}MENU {B_BUTTON}CANCEL"),
[HELPBAR_MC_CALL_MENU] = COMPOUND_STRING("{A_BUTTON}OK {B_BUTTON}CANCEL"),
[HELPBAR_MC_CHECK_PAGE] = 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"),
[HELPBAR_NONE] = COMPOUND_STRING("{CLEAR 0x80}"),
[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_OUT_CANFLY] = COMPOUND_STRING("{A_BUTTON}ZOOM {B_BUTTON}CANCEL {R_BUTTON}FLY"),
[HELPBAR_MAP_ZOOMED_IN_CANFLY] = COMPOUND_STRING("{A_BUTTON}FULL {B_BUTTON}CANCEL {R_BUTTON}FLY"),
[HELPBAR_CONDITION_MON_LIST] = COMPOUND_STRING("{A_BUTTON}CONDITION {B_BUTTON}CANCEL"),
[HELPBAR_CONDITION_MON_STATUS] = COMPOUND_STRING("{A_BUTTON}MARKINGS {B_BUTTON}CANCEL"),
[HELPBAR_CONDITION_MARKINGS] = COMPOUND_STRING("{A_BUTTON}SELECT MARK {B_BUTTON}CANCEL"),
[HELPBAR_MC_TRAINER_LIST] = COMPOUND_STRING("{A_BUTTON}MENU {B_BUTTON}CANCEL"),
[HELPBAR_MC_CALL_MENU] = COMPOUND_STRING("{A_BUTTON}OK {B_BUTTON}CANCEL"),
[HELPBAR_MC_CHECK_PAGE] = 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] =
Expand Down
55 changes: 52 additions & 3 deletions src/pokenav_region_map.c
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,11 @@
#include "bg.h"
#include "decompress.h"
#include "landmark.h"
#include "event_data.h"
#include "field_effect.h"
#include "main.h"
#include "menu.h"
#include "overworld.h"
#include "palette.h"
#include "pokenav.h"
#include "region_map.h"
Expand Down Expand Up @@ -73,6 +76,7 @@ static u32 LoopedTask_UpdateInfoAfterCursorMove(s32);
static u32 LoopedTask_RegionMapZoomOut(s32);
static u32 LoopedTask_RegionMapZoomIn(s32);
static u32 LoopedTask_ExitRegionMap(s32);
static u32 LoopedTask_TreatAsPokeNavFlyMap(s32);

extern const u16 gRegionMapCityZoomTiles_Pal[];
extern const u32 gRegionMapCityZoomText_Gfx[];
Expand Down Expand Up @@ -119,7 +123,8 @@ static const LoopedTask sRegionMapLoopTaskFuncs[] =
[POKENAV_MAP_FUNC_CURSOR_MOVED] = LoopedTask_UpdateInfoAfterCursorMove,
[POKENAV_MAP_FUNC_ZOOM_OUT] = LoopedTask_RegionMapZoomOut,
[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] =
Expand Down Expand Up @@ -204,6 +209,8 @@ u32 GetRegionMapCallback(void)

static u32 HandleRegionMapInput(struct Pokenav_RegionMapMenu *state)
{
struct RegionMap* regionMap = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP);

switch (DoRegionMapInputCallback())
{
case MAP_INPUT_MOVE_END:
Expand All @@ -215,6 +222,9 @@ static u32 HandleRegionMapInput(struct Pokenav_RegionMapMenu *state)
case MAP_INPUT_B_BUTTON:
state->callback = GetExitRegionMapMenuId;
return POKENAV_MAP_FUNC_EXIT;
case MAP_INPUT_R_BUTTON:
if (regionMap->mapSecType == MAPSECTYPE_CITY_CANFLY && OW_FLAG_POKE_RIDER)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
if (regionMap->mapSecType == MAPSECTYPE_CITY_CANFLY && OW_FLAG_POKE_RIDER)
if (regionMap->mapSecType == MAPSECTYPE_CITY_CANFLY && OW_FLAG_POKE_RIDER && Overworld_MapTypeAllowsTeleportAndFly(gMapHeader.mapType) == TRUE)

return POKENAV_MAP_FUNC_FLY;
}

return POKENAV_MAP_FUNC_NONE;
Expand Down Expand Up @@ -365,6 +375,7 @@ static u32 LoopedTask_OpenRegionMap(s32 taskState)
else
menuGfxId = POKENAV_GFX_MAP_MENU_ZOOMED_IN;

UpdateRegionMapHelpBarText();
LoadLeftHeaderGfxForIndex(menuGfxId);
ShowLeftHeaderGfx(menuGfxId, TRUE, TRUE);
PokenavFadeScreen(POKENAV_FADE_FROM_BLACK);
Expand All @@ -385,6 +396,7 @@ static u32 LoopedTask_UpdateInfoAfterCursorMove(s32 taskState)
{
case 0:
UpdateMapSecInfoWindow(state);
UpdateRegionMapHelpBarText();
return LT_INC_AND_PAUSE;
case 1:
if (IsDma3ManagerBusyWithBgCopy_(state))
Expand All @@ -408,7 +420,7 @@ static u32 LoopedTask_RegionMapZoomOut(s32 taskState)
if (UpdateRegionMapZoom() || IsChangeBgYForZoomActive())
return LT_PAUSE;

PrintHelpBarText(HELPBAR_MAP_ZOOMED_OUT);
UpdateRegionMapHelpBarText();
return LT_INC_AND_PAUSE;
case 2:
if (WaitForHelpBar())
Expand Down Expand Up @@ -441,7 +453,7 @@ static u32 LoopedTask_RegionMapZoomIn(s32 taskState)
if (UpdateRegionMapZoom() || IsChangeBgYForZoomActive())
return LT_PAUSE;

PrintHelpBarText(HELPBAR_MAP_ZOOMED_IN);
UpdateRegionMapHelpBarText();
return LT_INC_AND_PAUSE;
case 3:
if (WaitForHelpBar())
Expand Down Expand Up @@ -482,6 +494,23 @@ static u32 LoopedTask_ExitRegionMap(s32 taskState)
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)
{
int i;
Expand Down Expand Up @@ -740,3 +769,23 @@ static void SetCityZoomTextInvisibility(bool32 invisible)
for (i = 0; i < (int)ARRAY_COUNT(state->cityZoomTextSprites); i++)
state->cityZoomTextSprites[i]->invisible = invisible;
}

void UpdateRegionMapHelpBarText(void)
{
struct RegionMap* regionMap = GetSubstructPtr(POKENAV_SUBSTRUCT_REGION_MAP);

if (regionMap->mapSecType == MAPSECTYPE_CITY_CANFLY && OW_FLAG_POKE_RIDER)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
if (regionMap->mapSecType == MAPSECTYPE_CITY_CANFLY && OW_FLAG_POKE_RIDER)
if (regionMap->mapSecType == MAPSECTYPE_CITY_CANFLY && OW_FLAG_POKE_RIDER && Overworld_MapTypeAllowsTeleportAndFly(gMapHeader.mapType))

Handling for prevention of flying indoors etc.

{
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);
}
}
61 changes: 40 additions & 21 deletions src/region_map.c
Original file line number Diff line number Diff line change
Expand Up @@ -680,6 +680,10 @@ static u8 ProcessRegionMapInput_Full(void)
{
input = MAP_INPUT_B_BUTTON;
}
else if (JOY_NEW(R_BUTTON))
{
input = MAP_INPUT_R_BUTTON;
}
if (input == MAP_INPUT_MOVE_START)
{
sRegionMap->cursorMovementFrameCounter = 4;
Expand Down Expand Up @@ -759,6 +763,10 @@ static u8 ProcessRegionMapInput_Zoomed(void)
{
input = MAP_INPUT_B_BUTTON;
}
else if (JOY_NEW(R_BUTTON))
{
input = MAP_INPUT_R_BUTTON;
}
if (input == MAP_INPUT_MOVE_START)
{
sRegionMap->inputCallback = MoveRegionMapCursor_Zoomed;
Expand Down Expand Up @@ -1992,27 +2000,9 @@ static void CB_ExitFlyMap(void)
FreeRegionMapIconResources();
if (sFlyMap->choseFlyLocation)
{
switch (sFlyMap->regionMap.mapSecId)
{
case MAPSEC_SOUTHERN_ISLAND:
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;
}
struct RegionMap* tempRegionMap = &sFlyMap->regionMap;

SetFlyDestination(tempRegionMap);
ReturnToFieldFromFlyMapSelect();
}
else
Expand All @@ -2025,3 +2015,32 @@ static void CB_ExitFlyMap(void)
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)
{
u8 flyDestination = FilterFlyDestination(regionMap);
if (flyDestination != WARP_ID_NONE)
SetWarpDestinationToHealLocation(flyDestination);
else
SetWarpDestinationToMapWarp(sMapHealLocations[regionMap->mapSecId][0], sMapHealLocations[regionMap->mapSecId][1], WARP_ID_NONE);
}
Loading