FRLG+ whiteout message (#4967)

* FRLG whiteout message + post whiteout event
This commit is contained in:
cawtds 2024-08-02 17:28:05 +02:00 committed by GitHub
parent 4082adf5b1
commit 3af93bdfee
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
12 changed files with 461 additions and 2 deletions

View file

@ -587,6 +587,37 @@ EventScript_WhiteOut::
goto EventScript_ResetMrBriney
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::
goto_if_eq VAR_BRINEY_LOCATION, 1, EventScript_MoveMrBrineyToHouse
goto_if_eq VAR_BRINEY_LOCATION, 2, EventScript_MoveMrBrineyToDewford
@ -887,6 +918,48 @@ gText_PlayerWhitedOut::
.string "{PLAYER} is out of usable\n"
.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::
.string "Registered {STR_VAR_1} {STR_VAR_2}\n"
.string "in the POKéNAV.$"

View file

@ -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_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_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
#define GEN_6_XY GEN_6

View file

@ -24,5 +24,6 @@
#define HEAL_LOCATION_EVER_GRANDE_CITY_POKEMON_LEAGUE 20
#define HEAL_LOCATION_SOUTHERN_ISLAND_EXTERIOR 21
#define HEAL_LOCATION_BATTLE_FRONTIER_OUTSIDE_EAST 22
#define HEAL_LOCATION_COUNT 23
#endif // GUARD_CONSTANTS_HEAL_LOCATIONS_H

View file

@ -620,6 +620,8 @@ extern const u8 EventScript_SelectWithoutRegisteredItem[];
// overworld
extern const u8 EventScript_WhiteOut[];
extern const u8 EventScript_AfterWhiteOutMomHeal[];
extern const u8 EventScript_AfterWhiteOutHeal[];
extern const u8 EventScript_ResetMrBriney[];
extern const u8 EventScript_DoLinkRoomExit[];
extern const u8 CableClub_EventScript_TooBusyToNotice[];

View file

@ -16,6 +16,7 @@ void FieldCB_ReturnToFieldWirelessLink(void);
void FieldCB_DefaultWarpExit(void);
void FieldCB_WarpExitFadeFromBlack(void);
void FieldCB_WarpExitFadeFromWhite(void);
void FieldCB_RushInjuredPokemonToCenter(void);
bool8 FieldCB_ReturnToFieldOpenStartMenu(void);
void ReturnToFieldOpenStartMenu(void);
void FieldCB_ReturnToFieldNoScript(void);

View file

@ -10,7 +10,11 @@ struct HealLocation
};
u32 GetHealLocationIndexByMap(u16 mapGroup, u16 mapNum);
u32 GetHealLocationIndexByWarpData(struct WarpData *warp);
const struct HealLocation *GetHealLocationByMap(u16 mapGroup, u16 mapNum);
const struct HealLocation *GetHealLocation(u32 index);
bool32 IsLastHealLocationPlayerHouse();
void SetWhiteoutRespawnWarpAndHealerNPC(struct WarpData * warp);
u32 GetHealNpcLocalId(u32 healLocationId);
#endif // GUARD_HEAL_LOCATION_H

View file

@ -3046,4 +3046,8 @@ extern const u8 gText_PlantBerry[];
extern const u8 gText_AM[];
extern const u8 gText_PM[];
// FRLG whiteout
extern const u8 gText_PlayerScurriedToCenter[];
extern const u8 gText_PlayerScurriedBackHome[];
#endif // GUARD_STRINGS_H

View 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,
};

View file

@ -7,11 +7,13 @@
#include "field_effect.h"
#include "event_object_lock.h"
#include "event_object_movement.h"
#include "event_scripts.h"
#include "field_player_avatar.h"
#include "field_screen_effect.h"
#include "field_special_scene.h"
#include "field_weather.h"
#include "gpu_regs.h"
#include "heal_location.h"
#include "io_reg.h"
#include "link.h"
#include "link_rfu.h"
@ -26,10 +28,13 @@
#include "script.h"
#include "sound.h"
#include "start_menu.h"
#include "strings.h"
#include "string_util.h"
#include "task.h"
#include "text.h"
#include "constants/event_object_movement.h"
#include "constants/event_objects.h"
#include "constants/heal_locations.h"
#include "constants/songs.h"
#include "constants/rgb.h"
#include "trainer_hill.h"
@ -1274,3 +1279,112 @@ static void Task_EnableScriptAfterMusicFade(u8 taskId)
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;
}

View file

@ -1,8 +1,11 @@
#include "global.h"
#include "event_data.h"
#include "heal_location.h"
#include "constants/heal_locations.h"
#include "constants/maps.h"
#include "data/heal_locations.h"
#include "data/heal_locations_pkm_center.h"
u32 GetHealLocationIndexByMap(u16 mapGroup, u16 mapNum)
{
@ -26,6 +29,20 @@ const struct HealLocation *GetHealLocationByMap(u16 mapGroup, u16 mapNum)
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)
{
if (index == HEAL_LOCATION_NONE)
@ -35,3 +52,55 @@ const struct HealLocation *GetHealLocation(u32 index)
else
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;
}

View file

@ -689,9 +689,19 @@ void SetWarpDestinationToHealLocation(u8 healLocationId)
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)
{
sWarpDestination = gSaveBlock1Ptr->lastHealLocation;
if (IsFRLGWhiteout())
SetWhiteoutRespawnWarpAndHealerNPC(&sWarpDestination);
else
sWarpDestination = gSaveBlock1Ptr->lastHealLocation;
}
void SetLastHealLocationWarp(u8 healLocationId)
@ -1611,7 +1621,10 @@ void CB2_WhiteOut(void)
ResetInitialPlayerAvatarState();
ScriptContext_Init();
UnlockPlayerFieldControls();
gFieldCallback = FieldCB_WarpExitFadeFromBlack;
if (IsFRLGWhiteout())
gFieldCallback = FieldCB_RushInjuredPokemonToCenter;
else
gFieldCallback = FieldCB_WarpExitFadeFromBlack;
state = 0;
DoMapLoadLoop(&state);
SetFieldVBlankCallback();

View file

@ -1295,6 +1295,8 @@ const u8 gText_Sorry[] = _("SORRY");
const u8 gText_YaySmileEmoji[] = _("YAY{EMOJI_BIGSMILE}");
const u8 gText_ThankYou[] = _("THANK YOU");
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_Pokemon[] = _("Ultimate STEEL POKéMON.");
const u8 gText_MatchCallSteven_Intro1_BeforeMeteorFallsBattle[] = _("I'd climb even waterfalls");