FRLG+ whiteout message (#4967)
* FRLG whiteout message + post whiteout event
This commit is contained in:
parent
4082adf5b1
commit
3af93bdfee
12 changed files with 461 additions and 2 deletions
|
@ -587,6 +587,37 @@ EventScript_WhiteOut::
|
||||||
goto EventScript_ResetMrBriney
|
goto EventScript_ResetMrBriney
|
||||||
end
|
end
|
||||||
|
|
||||||
|
EventScript_AfterWhiteOutHeal::
|
||||||
|
lockall
|
||||||
|
msgbox gText_FirstShouldRestoreMonsHealth
|
||||||
|
call EventScript_PkmnCenterNurse_TakeAndHealPkmn
|
||||||
|
call_if_unset FLAG_DEFEATED_RUSTBORO_GYM, EventScript_AfterWhiteOutHealMsgPreRoxanne
|
||||||
|
call_if_set FLAG_DEFEATED_RUSTBORO_GYM, EventScript_AfterWhiteOutHealMsg
|
||||||
|
applymovement VAR_LAST_TALKED, Movement_PkmnCenterNurse_Bow
|
||||||
|
waitmovement 0
|
||||||
|
fadedefaultbgm
|
||||||
|
releaseall
|
||||||
|
end
|
||||||
|
|
||||||
|
EventScript_AfterWhiteOutHealMsgPreRoxanne::
|
||||||
|
msgbox gText_MonsHealedShouldBuyPotions
|
||||||
|
return
|
||||||
|
|
||||||
|
EventScript_AfterWhiteOutHealMsg::
|
||||||
|
msgbox gText_MonsHealed
|
||||||
|
return
|
||||||
|
|
||||||
|
EventScript_AfterWhiteOutMomHeal::
|
||||||
|
lockall
|
||||||
|
applymovement LOCALID_MOM, Common_Movement_WalkInPlaceFasterDown
|
||||||
|
waitmovement 0
|
||||||
|
msgbox gText_HadQuiteAnExperienceTakeRest
|
||||||
|
call Common_EventScript_OutOfCenterPartyHeal
|
||||||
|
msgbox gText_MomExplainHPGetPotions
|
||||||
|
fadedefaultbgm
|
||||||
|
releaseall
|
||||||
|
end
|
||||||
|
|
||||||
EventScript_ResetMrBriney::
|
EventScript_ResetMrBriney::
|
||||||
goto_if_eq VAR_BRINEY_LOCATION, 1, EventScript_MoveMrBrineyToHouse
|
goto_if_eq VAR_BRINEY_LOCATION, 1, EventScript_MoveMrBrineyToHouse
|
||||||
goto_if_eq VAR_BRINEY_LOCATION, 2, EventScript_MoveMrBrineyToDewford
|
goto_if_eq VAR_BRINEY_LOCATION, 2, EventScript_MoveMrBrineyToDewford
|
||||||
|
@ -887,6 +918,48 @@ gText_PlayerWhitedOut::
|
||||||
.string "{PLAYER} is out of usable\n"
|
.string "{PLAYER} is out of usable\n"
|
||||||
.string "POKéMON!\p{PLAYER} whited out!$"
|
.string "POKéMON!\p{PLAYER} whited out!$"
|
||||||
|
|
||||||
|
gText_FirstShouldRestoreMonsHealth::
|
||||||
|
.string "First, you should restore your\n"
|
||||||
|
.string "POKéMON to full health.$"
|
||||||
|
|
||||||
|
gText_MonsHealedShouldBuyPotions::
|
||||||
|
.string "Your POKéMON have been healed\n"
|
||||||
|
.string "to perfect health.\p"
|
||||||
|
.string "If your POKéMON's energy, HP,\n"
|
||||||
|
.string "is down, please come see us.\p"
|
||||||
|
.string "If you're planning to go far in the\n"
|
||||||
|
.string "field, you should buy some POTIONS\l"
|
||||||
|
.string "at the POKéMON MART.\p"
|
||||||
|
.string "We hope you excel!$"
|
||||||
|
|
||||||
|
gText_MonsHealed::
|
||||||
|
.string "Your POKéMON have been healed\n"
|
||||||
|
.string "to perfect health.\p"
|
||||||
|
.string "We hope you excel!$"
|
||||||
|
|
||||||
|
gText_HadQuiteAnExperienceTakeRest::
|
||||||
|
.string "MOM: {PLAYER}!\n"
|
||||||
|
.string "Welcome home.\p"
|
||||||
|
.string "It sounds like you had quite\n"
|
||||||
|
.string "an experience.\p"
|
||||||
|
.string "Maybe you should take a quick\n"
|
||||||
|
.string "rest.$"
|
||||||
|
|
||||||
|
gText_MomExplainHPGetPotions::
|
||||||
|
.string "MOM: Oh, good! You and your\n"
|
||||||
|
.string "POKéMON are looking great.\p"
|
||||||
|
.string "I just heard from PROF. BIRCH.\p"
|
||||||
|
.string "He said that POKéMON's energy is\n"
|
||||||
|
.string "measured in HP.\p"
|
||||||
|
.string "If your POKéMON lose their HP,\n"
|
||||||
|
.string "you can restore them at any\l"
|
||||||
|
.string "POKéMON CENTER.\p"
|
||||||
|
.string "If you're going to travel far away,\n"
|
||||||
|
.string "the smart TRAINER stocks up on\l"
|
||||||
|
.string "POTIONS at the POKéMON MART.\p"
|
||||||
|
.string "Make me proud, honey!\p"
|
||||||
|
.string "Take care!$"
|
||||||
|
|
||||||
gText_RegisteredTrainerinPokeNav::
|
gText_RegisteredTrainerinPokeNav::
|
||||||
.string "Registered {STR_VAR_1} {STR_VAR_2}\n"
|
.string "Registered {STR_VAR_1} {STR_VAR_2}\n"
|
||||||
.string "in the POKéNAV.$"
|
.string "in the POKéNAV.$"
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
#define OW_POISON_DAMAGE GEN_LATEST // In Gen4, Pokémon no longer faint from Poison in the overworld. In Gen5+, they no longer take damage at all.
|
#define OW_POISON_DAMAGE GEN_LATEST // In Gen4, Pokémon no longer faint from Poison in the overworld. In Gen5+, they no longer take damage at all.
|
||||||
#define OW_DOUBLE_APPROACH_WITH_ONE_MON FALSE // If enabled, you can be spotted by two trainers at the same time even if you only have one eligible Pokémon in your party.
|
#define OW_DOUBLE_APPROACH_WITH_ONE_MON FALSE // If enabled, you can be spotted by two trainers at the same time even if you only have one eligible Pokémon in your party.
|
||||||
#define OW_HIDE_REPEAT_MAP_POPUP FALSE // If enabled, map popups will not appear if entering a map with the same Map Section Id as the last.
|
#define OW_HIDE_REPEAT_MAP_POPUP FALSE // If enabled, map popups will not appear if entering a map with the same Map Section Id as the last.
|
||||||
|
#define OW_FRLG_WHITEOUT FALSE // If enabled, shows an additional whiteout message and post whiteout event script with healing NPC.
|
||||||
|
|
||||||
// These generational defines only make a distinction for Berries and the OW_PC_MOVE_ORDER
|
// These generational defines only make a distinction for Berries and the OW_PC_MOVE_ORDER
|
||||||
#define GEN_6_XY GEN_6
|
#define GEN_6_XY GEN_6
|
||||||
|
|
|
@ -24,5 +24,6 @@
|
||||||
#define HEAL_LOCATION_EVER_GRANDE_CITY_POKEMON_LEAGUE 20
|
#define HEAL_LOCATION_EVER_GRANDE_CITY_POKEMON_LEAGUE 20
|
||||||
#define HEAL_LOCATION_SOUTHERN_ISLAND_EXTERIOR 21
|
#define HEAL_LOCATION_SOUTHERN_ISLAND_EXTERIOR 21
|
||||||
#define HEAL_LOCATION_BATTLE_FRONTIER_OUTSIDE_EAST 22
|
#define HEAL_LOCATION_BATTLE_FRONTIER_OUTSIDE_EAST 22
|
||||||
|
#define HEAL_LOCATION_COUNT 23
|
||||||
|
|
||||||
#endif // GUARD_CONSTANTS_HEAL_LOCATIONS_H
|
#endif // GUARD_CONSTANTS_HEAL_LOCATIONS_H
|
||||||
|
|
|
@ -620,6 +620,8 @@ extern const u8 EventScript_SelectWithoutRegisteredItem[];
|
||||||
|
|
||||||
// overworld
|
// overworld
|
||||||
extern const u8 EventScript_WhiteOut[];
|
extern const u8 EventScript_WhiteOut[];
|
||||||
|
extern const u8 EventScript_AfterWhiteOutMomHeal[];
|
||||||
|
extern const u8 EventScript_AfterWhiteOutHeal[];
|
||||||
extern const u8 EventScript_ResetMrBriney[];
|
extern const u8 EventScript_ResetMrBriney[];
|
||||||
extern const u8 EventScript_DoLinkRoomExit[];
|
extern const u8 EventScript_DoLinkRoomExit[];
|
||||||
extern const u8 CableClub_EventScript_TooBusyToNotice[];
|
extern const u8 CableClub_EventScript_TooBusyToNotice[];
|
||||||
|
|
|
@ -16,6 +16,7 @@ void FieldCB_ReturnToFieldWirelessLink(void);
|
||||||
void FieldCB_DefaultWarpExit(void);
|
void FieldCB_DefaultWarpExit(void);
|
||||||
void FieldCB_WarpExitFadeFromBlack(void);
|
void FieldCB_WarpExitFadeFromBlack(void);
|
||||||
void FieldCB_WarpExitFadeFromWhite(void);
|
void FieldCB_WarpExitFadeFromWhite(void);
|
||||||
|
void FieldCB_RushInjuredPokemonToCenter(void);
|
||||||
bool8 FieldCB_ReturnToFieldOpenStartMenu(void);
|
bool8 FieldCB_ReturnToFieldOpenStartMenu(void);
|
||||||
void ReturnToFieldOpenStartMenu(void);
|
void ReturnToFieldOpenStartMenu(void);
|
||||||
void FieldCB_ReturnToFieldNoScript(void);
|
void FieldCB_ReturnToFieldNoScript(void);
|
||||||
|
|
|
@ -10,7 +10,11 @@ struct HealLocation
|
||||||
};
|
};
|
||||||
|
|
||||||
u32 GetHealLocationIndexByMap(u16 mapGroup, u16 mapNum);
|
u32 GetHealLocationIndexByMap(u16 mapGroup, u16 mapNum);
|
||||||
|
u32 GetHealLocationIndexByWarpData(struct WarpData *warp);
|
||||||
const struct HealLocation *GetHealLocationByMap(u16 mapGroup, u16 mapNum);
|
const struct HealLocation *GetHealLocationByMap(u16 mapGroup, u16 mapNum);
|
||||||
const struct HealLocation *GetHealLocation(u32 index);
|
const struct HealLocation *GetHealLocation(u32 index);
|
||||||
|
bool32 IsLastHealLocationPlayerHouse();
|
||||||
|
void SetWhiteoutRespawnWarpAndHealerNPC(struct WarpData * warp);
|
||||||
|
u32 GetHealNpcLocalId(u32 healLocationId);
|
||||||
|
|
||||||
#endif // GUARD_HEAL_LOCATION_H
|
#endif // GUARD_HEAL_LOCATION_H
|
||||||
|
|
|
@ -3046,4 +3046,8 @@ extern const u8 gText_PlantBerry[];
|
||||||
extern const u8 gText_AM[];
|
extern const u8 gText_AM[];
|
||||||
extern const u8 gText_PM[];
|
extern const u8 gText_PM[];
|
||||||
|
|
||||||
|
// FRLG whiteout
|
||||||
|
extern const u8 gText_PlayerScurriedToCenter[];
|
||||||
|
extern const u8 gText_PlayerScurriedBackHome[];
|
||||||
|
|
||||||
#endif // GUARD_STRINGS_H
|
#endif // GUARD_STRINGS_H
|
||||||
|
|
175
src/data/heal_locations_pkm_center.h
Normal file
175
src/data/heal_locations_pkm_center.h
Normal file
|
@ -0,0 +1,175 @@
|
||||||
|
#define DEFAULT_POKEMON_CENTER_COORDS .x = 7, .y = 4
|
||||||
|
|
||||||
|
static const struct HealLocation sHealLocationsPokemonCenter[HEAL_LOCATION_COUNT - 1] =
|
||||||
|
{
|
||||||
|
[HEAL_LOCATION_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F - 1] =
|
||||||
|
{
|
||||||
|
.group = MAP_GROUP(LITTLEROOT_TOWN_BRENDANS_HOUSE_1F),
|
||||||
|
.map = MAP_NUM(LITTLEROOT_TOWN_BRENDANS_HOUSE_1F),
|
||||||
|
.x = 2,
|
||||||
|
.y = 7,
|
||||||
|
},
|
||||||
|
[HEAL_LOCATION_LITTLEROOT_TOWN_MAYS_HOUSE_2F - 1] =
|
||||||
|
{
|
||||||
|
.group = MAP_GROUP(LITTLEROOT_TOWN_MAYS_HOUSE_1F),
|
||||||
|
.map = MAP_NUM(LITTLEROOT_TOWN_MAYS_HOUSE_1F),
|
||||||
|
.x = 8,
|
||||||
|
.y = 7,
|
||||||
|
},
|
||||||
|
[HEAL_LOCATION_PETALBURG_CITY - 1] =
|
||||||
|
{
|
||||||
|
.group = MAP_GROUP(PETALBURG_CITY_POKEMON_CENTER_1F),
|
||||||
|
.map = MAP_NUM(PETALBURG_CITY_POKEMON_CENTER_1F),
|
||||||
|
DEFAULT_POKEMON_CENTER_COORDS,
|
||||||
|
},
|
||||||
|
[HEAL_LOCATION_SLATEPORT_CITY - 1] =
|
||||||
|
{
|
||||||
|
.group = MAP_GROUP(SLATEPORT_CITY_POKEMON_CENTER_1F),
|
||||||
|
.map = MAP_NUM(SLATEPORT_CITY_POKEMON_CENTER_1F),
|
||||||
|
DEFAULT_POKEMON_CENTER_COORDS,
|
||||||
|
},
|
||||||
|
[HEAL_LOCATION_MAUVILLE_CITY - 1] =
|
||||||
|
{
|
||||||
|
.group = MAP_GROUP(MAUVILLE_CITY_POKEMON_CENTER_1F),
|
||||||
|
.map = MAP_NUM(MAUVILLE_CITY_POKEMON_CENTER_1F),
|
||||||
|
DEFAULT_POKEMON_CENTER_COORDS,
|
||||||
|
},
|
||||||
|
[HEAL_LOCATION_RUSTBORO_CITY - 1] =
|
||||||
|
{
|
||||||
|
.group = MAP_GROUP(RUSTBORO_CITY_POKEMON_CENTER_1F),
|
||||||
|
.map = MAP_NUM(RUSTBORO_CITY_POKEMON_CENTER_1F),
|
||||||
|
DEFAULT_POKEMON_CENTER_COORDS,
|
||||||
|
},
|
||||||
|
[HEAL_LOCATION_FORTREE_CITY - 1] =
|
||||||
|
{
|
||||||
|
.group = MAP_GROUP(FORTREE_CITY_POKEMON_CENTER_1F),
|
||||||
|
.map = MAP_NUM(FORTREE_CITY_POKEMON_CENTER_1F),
|
||||||
|
DEFAULT_POKEMON_CENTER_COORDS,
|
||||||
|
},
|
||||||
|
[HEAL_LOCATION_LILYCOVE_CITY - 1] =
|
||||||
|
{
|
||||||
|
.group = MAP_GROUP(LILYCOVE_CITY_POKEMON_CENTER_1F),
|
||||||
|
.map = MAP_NUM(LILYCOVE_CITY_POKEMON_CENTER_1F),
|
||||||
|
DEFAULT_POKEMON_CENTER_COORDS,
|
||||||
|
},
|
||||||
|
[HEAL_LOCATION_MOSSDEEP_CITY - 1] =
|
||||||
|
{
|
||||||
|
.group = MAP_GROUP(MOSSDEEP_CITY_POKEMON_CENTER_1F),
|
||||||
|
.map = MAP_NUM(MOSSDEEP_CITY_POKEMON_CENTER_1F),
|
||||||
|
DEFAULT_POKEMON_CENTER_COORDS,
|
||||||
|
},
|
||||||
|
[HEAL_LOCATION_SOOTOPOLIS_CITY - 1] =
|
||||||
|
{
|
||||||
|
.group = MAP_GROUP(SOOTOPOLIS_CITY_POKEMON_CENTER_1F),
|
||||||
|
.map = MAP_NUM(SOOTOPOLIS_CITY_POKEMON_CENTER_1F),
|
||||||
|
DEFAULT_POKEMON_CENTER_COORDS,
|
||||||
|
},
|
||||||
|
[HEAL_LOCATION_EVER_GRANDE_CITY - 1] =
|
||||||
|
{
|
||||||
|
.group = MAP_GROUP(EVER_GRANDE_CITY_POKEMON_CENTER_1F),
|
||||||
|
.map = MAP_NUM(EVER_GRANDE_CITY_POKEMON_CENTER_1F),
|
||||||
|
DEFAULT_POKEMON_CENTER_COORDS,
|
||||||
|
},
|
||||||
|
[HEAL_LOCATION_LITTLEROOT_TOWN_BRENDANS_HOUSE - 1] =
|
||||||
|
{
|
||||||
|
.group = MAP_GROUP(LITTLEROOT_TOWN_BRENDANS_HOUSE_1F),
|
||||||
|
.map = MAP_NUM(LITTLEROOT_TOWN_BRENDANS_HOUSE_1F),
|
||||||
|
.x = 2,
|
||||||
|
.y = 7,
|
||||||
|
},
|
||||||
|
[HEAL_LOCATION_LITTLEROOT_TOWN_MAYS_HOUSE - 1] =
|
||||||
|
{
|
||||||
|
.group = MAP_GROUP(LITTLEROOT_TOWN_MAYS_HOUSE_1F),
|
||||||
|
.map = MAP_NUM(LITTLEROOT_TOWN_MAYS_HOUSE_1F),
|
||||||
|
.x = 8,
|
||||||
|
.y = 7,
|
||||||
|
},
|
||||||
|
[HEAL_LOCATION_OLDALE_TOWN - 1] =
|
||||||
|
{
|
||||||
|
.group = MAP_GROUP(OLDALE_TOWN_POKEMON_CENTER_1F),
|
||||||
|
.map = MAP_NUM(OLDALE_TOWN_POKEMON_CENTER_1F),
|
||||||
|
DEFAULT_POKEMON_CENTER_COORDS,
|
||||||
|
},
|
||||||
|
[HEAL_LOCATION_DEWFORD_TOWN - 1] =
|
||||||
|
{
|
||||||
|
.group = MAP_GROUP(DEWFORD_TOWN_POKEMON_CENTER_1F),
|
||||||
|
.map = MAP_NUM(DEWFORD_TOWN_POKEMON_CENTER_1F),
|
||||||
|
DEFAULT_POKEMON_CENTER_COORDS,
|
||||||
|
},
|
||||||
|
[HEAL_LOCATION_LAVARIDGE_TOWN - 1] =
|
||||||
|
{
|
||||||
|
.group = MAP_GROUP(LAVARIDGE_TOWN_POKEMON_CENTER_1F),
|
||||||
|
.map = MAP_NUM(LAVARIDGE_TOWN_POKEMON_CENTER_1F),
|
||||||
|
DEFAULT_POKEMON_CENTER_COORDS,
|
||||||
|
},
|
||||||
|
[HEAL_LOCATION_FALLARBOR_TOWN - 1] =
|
||||||
|
{
|
||||||
|
.group = MAP_GROUP(FALLARBOR_TOWN_POKEMON_CENTER_1F),
|
||||||
|
.map = MAP_NUM(FALLARBOR_TOWN_POKEMON_CENTER_1F),
|
||||||
|
DEFAULT_POKEMON_CENTER_COORDS,
|
||||||
|
},
|
||||||
|
[HEAL_LOCATION_VERDANTURF_TOWN - 1] =
|
||||||
|
{
|
||||||
|
.group = MAP_GROUP(VERDANTURF_TOWN_POKEMON_CENTER_1F),
|
||||||
|
.map = MAP_NUM(VERDANTURF_TOWN_POKEMON_CENTER_1F),
|
||||||
|
DEFAULT_POKEMON_CENTER_COORDS,
|
||||||
|
},
|
||||||
|
[HEAL_LOCATION_PACIFIDLOG_TOWN - 1] =
|
||||||
|
{
|
||||||
|
.group = MAP_GROUP(PACIFIDLOG_TOWN_POKEMON_CENTER_1F),
|
||||||
|
.map = MAP_NUM(PACIFIDLOG_TOWN_POKEMON_CENTER_1F),
|
||||||
|
DEFAULT_POKEMON_CENTER_COORDS,
|
||||||
|
},
|
||||||
|
[HEAL_LOCATION_EVER_GRANDE_CITY_POKEMON_LEAGUE - 1] =
|
||||||
|
{
|
||||||
|
.group = MAP_GROUP(EVER_GRANDE_CITY_POKEMON_LEAGUE_1F),
|
||||||
|
.map = MAP_NUM(EVER_GRANDE_CITY_POKEMON_LEAGUE_1F),
|
||||||
|
.x = 3,
|
||||||
|
.y = 4,
|
||||||
|
},
|
||||||
|
[HEAL_LOCATION_SOUTHERN_ISLAND_EXTERIOR - 1] =
|
||||||
|
{
|
||||||
|
.group = MAP_GROUP(SOUTHERN_ISLAND_EXTERIOR),
|
||||||
|
.map = MAP_NUM(SOUTHERN_ISLAND_EXTERIOR),
|
||||||
|
.x = 15,
|
||||||
|
.y = 20,
|
||||||
|
},
|
||||||
|
[HEAL_LOCATION_BATTLE_FRONTIER_OUTSIDE_EAST - 1] =
|
||||||
|
{
|
||||||
|
.group = MAP_GROUP(BATTLE_FRONTIER_POKEMON_CENTER_1F),
|
||||||
|
.map = MAP_NUM(BATTLE_FRONTIER_POKEMON_CENTER_1F),
|
||||||
|
DEFAULT_POKEMON_CENTER_COORDS,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
#undef DEFAULT_POKEMON_CENTER_COORDS
|
||||||
|
|
||||||
|
// localIds can be found in the generated events.inc file for the specific heal location map
|
||||||
|
// e.g. for OldaleTown_PokemonCenter1F/events.inc the following entry gets generated:
|
||||||
|
// object_event 1, OBJ_EVENT_GFX_NURSE, 7, 2, 3, MOVEMENT_TYPE_FACE_DOWN, 0, 0, TRAINER_TYPE_NONE, 0, OldaleTown_PokemonCenter_1F_EventScript_Nurse, 0
|
||||||
|
// In this case the localId is 1.
|
||||||
|
static const u8 sHealNpcLocalId[HEAL_LOCATION_COUNT - 1] =
|
||||||
|
{
|
||||||
|
[HEAL_LOCATION_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F - 1] = 1,
|
||||||
|
[HEAL_LOCATION_LITTLEROOT_TOWN_MAYS_HOUSE_2F - 1] = 1,
|
||||||
|
[HEAL_LOCATION_PETALBURG_CITY - 1] = 1,
|
||||||
|
[HEAL_LOCATION_SLATEPORT_CITY - 1] = 1,
|
||||||
|
[HEAL_LOCATION_MAUVILLE_CITY - 1] = 1,
|
||||||
|
[HEAL_LOCATION_RUSTBORO_CITY - 1] = 1,
|
||||||
|
[HEAL_LOCATION_FORTREE_CITY - 1] = 1,
|
||||||
|
[HEAL_LOCATION_LILYCOVE_CITY - 1] = 1,
|
||||||
|
[HEAL_LOCATION_MOSSDEEP_CITY - 1] = 1,
|
||||||
|
[HEAL_LOCATION_SOOTOPOLIS_CITY - 1] = 1,
|
||||||
|
[HEAL_LOCATION_EVER_GRANDE_CITY - 1] = 1,
|
||||||
|
[HEAL_LOCATION_LITTLEROOT_TOWN_BRENDANS_HOUSE - 1] = 1,
|
||||||
|
[HEAL_LOCATION_LITTLEROOT_TOWN_MAYS_HOUSE - 1] = 1,
|
||||||
|
[HEAL_LOCATION_OLDALE_TOWN - 1] = 1,
|
||||||
|
[HEAL_LOCATION_DEWFORD_TOWN - 1] = 1,
|
||||||
|
[HEAL_LOCATION_LAVARIDGE_TOWN - 1] = 1,
|
||||||
|
[HEAL_LOCATION_FALLARBOR_TOWN - 1] = 1,
|
||||||
|
[HEAL_LOCATION_VERDANTURF_TOWN - 1] = 1,
|
||||||
|
[HEAL_LOCATION_PACIFIDLOG_TOWN - 1] = 1,
|
||||||
|
[HEAL_LOCATION_EVER_GRANDE_CITY_POKEMON_LEAGUE - 1] = 1,
|
||||||
|
[HEAL_LOCATION_SOUTHERN_ISLAND_EXTERIOR - 1] = 0, // no heal npc
|
||||||
|
[HEAL_LOCATION_BATTLE_FRONTIER_OUTSIDE_EAST - 1] = 1,
|
||||||
|
};
|
|
@ -7,11 +7,13 @@
|
||||||
#include "field_effect.h"
|
#include "field_effect.h"
|
||||||
#include "event_object_lock.h"
|
#include "event_object_lock.h"
|
||||||
#include "event_object_movement.h"
|
#include "event_object_movement.h"
|
||||||
|
#include "event_scripts.h"
|
||||||
#include "field_player_avatar.h"
|
#include "field_player_avatar.h"
|
||||||
#include "field_screen_effect.h"
|
#include "field_screen_effect.h"
|
||||||
#include "field_special_scene.h"
|
#include "field_special_scene.h"
|
||||||
#include "field_weather.h"
|
#include "field_weather.h"
|
||||||
#include "gpu_regs.h"
|
#include "gpu_regs.h"
|
||||||
|
#include "heal_location.h"
|
||||||
#include "io_reg.h"
|
#include "io_reg.h"
|
||||||
#include "link.h"
|
#include "link.h"
|
||||||
#include "link_rfu.h"
|
#include "link_rfu.h"
|
||||||
|
@ -26,10 +28,13 @@
|
||||||
#include "script.h"
|
#include "script.h"
|
||||||
#include "sound.h"
|
#include "sound.h"
|
||||||
#include "start_menu.h"
|
#include "start_menu.h"
|
||||||
|
#include "strings.h"
|
||||||
|
#include "string_util.h"
|
||||||
#include "task.h"
|
#include "task.h"
|
||||||
#include "text.h"
|
#include "text.h"
|
||||||
#include "constants/event_object_movement.h"
|
#include "constants/event_object_movement.h"
|
||||||
#include "constants/event_objects.h"
|
#include "constants/event_objects.h"
|
||||||
|
#include "constants/heal_locations.h"
|
||||||
#include "constants/songs.h"
|
#include "constants/songs.h"
|
||||||
#include "constants/rgb.h"
|
#include "constants/rgb.h"
|
||||||
#include "trainer_hill.h"
|
#include "trainer_hill.h"
|
||||||
|
@ -1274,3 +1279,112 @@ static void Task_EnableScriptAfterMusicFade(u8 taskId)
|
||||||
ScriptContext_Enable();
|
ScriptContext_Enable();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const struct WindowTemplate sWindowTemplate_WhiteoutText =
|
||||||
|
{
|
||||||
|
.bg = 0,
|
||||||
|
.tilemapLeft = 0,
|
||||||
|
.tilemapTop = 5,
|
||||||
|
.width = 30,
|
||||||
|
.height = 11,
|
||||||
|
.paletteNum = 15,
|
||||||
|
.baseBlock = 1,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const u8 sWhiteoutTextColors[] = { TEXT_COLOR_TRANSPARENT, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY };
|
||||||
|
|
||||||
|
#define tState data[0]
|
||||||
|
#define tWindowId data[1]
|
||||||
|
#define tPrintState data[2]
|
||||||
|
#define tIsPlayerHouse data[3]
|
||||||
|
|
||||||
|
static bool32 PrintWhiteOutRecoveryMessage(u8 taskId, const u8 *text, u32 x, u32 y)
|
||||||
|
{
|
||||||
|
u32 windowId = gTasks[taskId].tWindowId;
|
||||||
|
|
||||||
|
switch (gTasks[taskId].tPrintState)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
FillWindowPixelBuffer(windowId, PIXEL_FILL(0));
|
||||||
|
StringExpandPlaceholders(gStringVar4, text);
|
||||||
|
AddTextPrinterParameterized4(windowId, FONT_NORMAL, x, y, 1, 0, sWhiteoutTextColors, 1, gStringVar4);
|
||||||
|
gTextFlags.canABSpeedUpPrint = FALSE;
|
||||||
|
gTasks[taskId].tPrintState = 1;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
RunTextPrinters();
|
||||||
|
if (!IsTextPrinterActive(windowId))
|
||||||
|
{
|
||||||
|
gTasks[taskId].tPrintState = 0;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
enum {
|
||||||
|
FRLG_WHITEOUT_ENTER_MSG_SCREEN,
|
||||||
|
FRLG_WHITEOUT_PRINT_MSG,
|
||||||
|
FRLG_WHITEOUT_LEAVE_MSG_SCREEN,
|
||||||
|
FRLG_WHITEOUT_HEAL_SCRIPT,
|
||||||
|
};
|
||||||
|
|
||||||
|
static void Task_RushInjuredPokemonToCenter(u8 taskId)
|
||||||
|
{
|
||||||
|
u32 windowId;
|
||||||
|
|
||||||
|
switch (gTasks[taskId].tState)
|
||||||
|
{
|
||||||
|
case FRLG_WHITEOUT_ENTER_MSG_SCREEN:
|
||||||
|
windowId = AddWindow(&sWindowTemplate_WhiteoutText);
|
||||||
|
gTasks[taskId].tWindowId = windowId;
|
||||||
|
Menu_LoadStdPalAt(BG_PLTT_ID(15));
|
||||||
|
FillWindowPixelBuffer(windowId, PIXEL_FILL(0));
|
||||||
|
PutWindowTilemap(windowId);
|
||||||
|
CopyWindowToVram(windowId, COPYWIN_FULL);
|
||||||
|
|
||||||
|
gTasks[taskId].tIsPlayerHouse = IsLastHealLocationPlayerHouse();
|
||||||
|
gTasks[taskId].tState = FRLG_WHITEOUT_PRINT_MSG;
|
||||||
|
break;
|
||||||
|
case FRLG_WHITEOUT_PRINT_MSG:
|
||||||
|
{
|
||||||
|
const u8 *recoveryMessage = gTasks[taskId].tIsPlayerHouse == TRUE ? gText_PlayerScurriedBackHome : gText_PlayerScurriedToCenter;
|
||||||
|
if (PrintWhiteOutRecoveryMessage(taskId, recoveryMessage, 2, 8))
|
||||||
|
{
|
||||||
|
ObjectEventTurn(&gObjectEvents[gPlayerAvatar.objectEventId], DIR_NORTH);
|
||||||
|
gTasks[taskId].tState = FRLG_WHITEOUT_LEAVE_MSG_SCREEN;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case FRLG_WHITEOUT_LEAVE_MSG_SCREEN:
|
||||||
|
windowId = gTasks[taskId].tWindowId;
|
||||||
|
ClearWindowTilemap(windowId);
|
||||||
|
CopyWindowToVram(windowId, COPYWIN_MAP);
|
||||||
|
RemoveWindow(windowId);
|
||||||
|
FillPalBufferBlack();
|
||||||
|
FadeInFromBlack();
|
||||||
|
gTasks[taskId].tState = FRLG_WHITEOUT_HEAL_SCRIPT;
|
||||||
|
break;
|
||||||
|
case FRLG_WHITEOUT_HEAL_SCRIPT:
|
||||||
|
if (WaitForWeatherFadeIn() == TRUE)
|
||||||
|
{
|
||||||
|
DestroyTask(taskId);
|
||||||
|
if (gTasks[taskId].tIsPlayerHouse)
|
||||||
|
ScriptContext_SetupScript(EventScript_AfterWhiteOutMomHeal);
|
||||||
|
else
|
||||||
|
ScriptContext_SetupScript(EventScript_AfterWhiteOutHeal);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void FieldCB_RushInjuredPokemonToCenter(void)
|
||||||
|
{
|
||||||
|
u8 taskId;
|
||||||
|
|
||||||
|
LockPlayerFieldControls();
|
||||||
|
FillPalBufferBlack();
|
||||||
|
taskId = CreateTask(Task_RushInjuredPokemonToCenter, 10);
|
||||||
|
gTasks[taskId].tState = FRLG_WHITEOUT_ENTER_MSG_SCREEN;
|
||||||
|
}
|
||||||
|
|
|
@ -1,8 +1,11 @@
|
||||||
#include "global.h"
|
#include "global.h"
|
||||||
|
#include "event_data.h"
|
||||||
#include "heal_location.h"
|
#include "heal_location.h"
|
||||||
#include "constants/heal_locations.h"
|
#include "constants/heal_locations.h"
|
||||||
|
#include "constants/maps.h"
|
||||||
|
|
||||||
#include "data/heal_locations.h"
|
#include "data/heal_locations.h"
|
||||||
|
#include "data/heal_locations_pkm_center.h"
|
||||||
|
|
||||||
u32 GetHealLocationIndexByMap(u16 mapGroup, u16 mapNum)
|
u32 GetHealLocationIndexByMap(u16 mapGroup, u16 mapNum)
|
||||||
{
|
{
|
||||||
|
@ -26,6 +29,20 @@ const struct HealLocation *GetHealLocationByMap(u16 mapGroup, u16 mapNum)
|
||||||
return &sHealLocations[index - 1];
|
return &sHealLocations[index - 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
u32 GetHealLocationIndexByWarpData(struct WarpData *warp)
|
||||||
|
{
|
||||||
|
u32 i;
|
||||||
|
for (i = 0; i < ARRAY_COUNT(sHealLocations); i++)
|
||||||
|
{
|
||||||
|
if (sHealLocations[i].group == warp->mapGroup
|
||||||
|
&& sHealLocations[i].map == warp->mapNum
|
||||||
|
&& sHealLocations[i].x == warp->x
|
||||||
|
&& sHealLocations[i].y == warp->y)
|
||||||
|
return i + 1;
|
||||||
|
}
|
||||||
|
return HEAL_LOCATION_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
const struct HealLocation *GetHealLocation(u32 index)
|
const struct HealLocation *GetHealLocation(u32 index)
|
||||||
{
|
{
|
||||||
if (index == HEAL_LOCATION_NONE)
|
if (index == HEAL_LOCATION_NONE)
|
||||||
|
@ -35,3 +52,55 @@ const struct HealLocation *GetHealLocation(u32 index)
|
||||||
else
|
else
|
||||||
return &sHealLocations[index - 1];
|
return &sHealLocations[index - 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool32 IsLastHealLocation(u32 healLocation)
|
||||||
|
{
|
||||||
|
const struct HealLocation *loc = GetHealLocation(healLocation);
|
||||||
|
const struct WarpData *warpData = &gSaveBlock1Ptr->lastHealLocation;
|
||||||
|
|
||||||
|
return warpData->mapGroup == loc->group
|
||||||
|
&& warpData->mapNum == loc->map
|
||||||
|
&& warpData->warpId == WARP_ID_NONE
|
||||||
|
&& warpData->x == loc->x
|
||||||
|
&& warpData->y == loc->y;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool32 IsLastHealLocationPlayerHouse()
|
||||||
|
{
|
||||||
|
if (IsLastHealLocation(HEAL_LOCATION_LITTLEROOT_TOWN_MAYS_HOUSE)
|
||||||
|
|| IsLastHealLocation(HEAL_LOCATION_LITTLEROOT_TOWN_MAYS_HOUSE_2F)
|
||||||
|
|| IsLastHealLocation(HEAL_LOCATION_LITTLEROOT_TOWN_BRENDANS_HOUSE)
|
||||||
|
|| IsLastHealLocation(HEAL_LOCATION_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F))
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
u32 GetHealNpcLocalId(u32 healLocationId)
|
||||||
|
{
|
||||||
|
if (healLocationId == HEAL_LOCATION_NONE || healLocationId >= HEAL_LOCATION_COUNT)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return sHealNpcLocalId[healLocationId - 1];
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetWhiteoutRespawnWarpAndHealerNPC(struct WarpData *warp)
|
||||||
|
{
|
||||||
|
u32 healLocationId = GetHealLocationIndexByWarpData(&gSaveBlock1Ptr->lastHealLocation);
|
||||||
|
u32 healNpcLocalId = GetHealNpcLocalId(healLocationId);
|
||||||
|
struct HealLocation pkmCenterHealLocation;
|
||||||
|
|
||||||
|
if (!healNpcLocalId)
|
||||||
|
{
|
||||||
|
*(warp) = gSaveBlock1Ptr->lastHealLocation;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
pkmCenterHealLocation = sHealLocationsPokemonCenter[healLocationId - 1];
|
||||||
|
warp->mapGroup = pkmCenterHealLocation.group;
|
||||||
|
warp->mapNum = pkmCenterHealLocation.map;
|
||||||
|
warp->warpId = WARP_ID_NONE;
|
||||||
|
warp->x = pkmCenterHealLocation.x;
|
||||||
|
warp->y = pkmCenterHealLocation.y;
|
||||||
|
gSpecialVar_LastTalked = healNpcLocalId;
|
||||||
|
}
|
||||||
|
|
|
@ -689,9 +689,19 @@ void SetWarpDestinationToHealLocation(u8 healLocationId)
|
||||||
SetWarpDestination(healLocation->group, healLocation->map, WARP_ID_NONE, healLocation->x, healLocation->y);
|
SetWarpDestination(healLocation->group, healLocation->map, WARP_ID_NONE, healLocation->x, healLocation->y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool32 IsFRLGWhiteout(void)
|
||||||
|
{
|
||||||
|
if (!OW_FRLG_WHITEOUT)
|
||||||
|
return FALSE;
|
||||||
|
return GetHealNpcLocalId(GetHealLocationIndexByWarpData(&gSaveBlock1Ptr->lastHealLocation)) > 0;
|
||||||
|
}
|
||||||
|
|
||||||
void SetWarpDestinationToLastHealLocation(void)
|
void SetWarpDestinationToLastHealLocation(void)
|
||||||
{
|
{
|
||||||
sWarpDestination = gSaveBlock1Ptr->lastHealLocation;
|
if (IsFRLGWhiteout())
|
||||||
|
SetWhiteoutRespawnWarpAndHealerNPC(&sWarpDestination);
|
||||||
|
else
|
||||||
|
sWarpDestination = gSaveBlock1Ptr->lastHealLocation;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetLastHealLocationWarp(u8 healLocationId)
|
void SetLastHealLocationWarp(u8 healLocationId)
|
||||||
|
@ -1611,7 +1621,10 @@ void CB2_WhiteOut(void)
|
||||||
ResetInitialPlayerAvatarState();
|
ResetInitialPlayerAvatarState();
|
||||||
ScriptContext_Init();
|
ScriptContext_Init();
|
||||||
UnlockPlayerFieldControls();
|
UnlockPlayerFieldControls();
|
||||||
gFieldCallback = FieldCB_WarpExitFadeFromBlack;
|
if (IsFRLGWhiteout())
|
||||||
|
gFieldCallback = FieldCB_RushInjuredPokemonToCenter;
|
||||||
|
else
|
||||||
|
gFieldCallback = FieldCB_WarpExitFadeFromBlack;
|
||||||
state = 0;
|
state = 0;
|
||||||
DoMapLoadLoop(&state);
|
DoMapLoadLoop(&state);
|
||||||
SetFieldVBlankCallback();
|
SetFieldVBlankCallback();
|
||||||
|
|
|
@ -1295,6 +1295,8 @@ const u8 gText_Sorry[] = _("SORRY");
|
||||||
const u8 gText_YaySmileEmoji[] = _("YAY{EMOJI_BIGSMILE}");
|
const u8 gText_YaySmileEmoji[] = _("YAY{EMOJI_BIGSMILE}");
|
||||||
const u8 gText_ThankYou[] = _("THANK YOU");
|
const u8 gText_ThankYou[] = _("THANK YOU");
|
||||||
const u8 gText_ByeBye[] = _("BYE-BYE!");
|
const u8 gText_ByeBye[] = _("BYE-BYE!");
|
||||||
|
const u8 gText_PlayerScurriedToCenter[] = _("{PLAYER} scurried to a POKéMON CENTER,\nprotecting the exhausted and fainted\nPOKéMON from further harm…\p");
|
||||||
|
const u8 gText_PlayerScurriedBackHome[] = _("{PLAYER} scurried back home, protecting\nthe exhausted and fainted POKéMON from\nfurther harm…\p");
|
||||||
const u8 gText_MatchCallSteven_Strategy[] = _("Attack the weak points!");
|
const u8 gText_MatchCallSteven_Strategy[] = _("Attack the weak points!");
|
||||||
const u8 gText_MatchCallSteven_Pokemon[] = _("Ultimate STEEL POKéMON.");
|
const u8 gText_MatchCallSteven_Pokemon[] = _("Ultimate STEEL POKéMON.");
|
||||||
const u8 gText_MatchCallSteven_Intro1_BeforeMeteorFallsBattle[] = _("I'd climb even waterfalls");
|
const u8 gText_MatchCallSteven_Intro1_BeforeMeteorFallsBattle[] = _("I'd climb even waterfalls");
|
||||||
|
|
Loading…
Reference in a new issue