diff --git a/data/maps/ViridianCity_Mart/scripts.inc b/data/maps/ViridianCity_Mart/scripts.inc index 3432106e7..89402be39 100644 --- a/data/maps/ViridianCity_Mart/scripts.inc +++ b/data/maps/ViridianCity_Mart/scripts.inc @@ -140,6 +140,7 @@ ViridianCity_Mart_Items:: .2byte ITEM_N_SOLARIZER .2byte ITEM_N_LUNARIZER .2byte ITEM_HONEY + .2byte ITEM_POKEMON_BOX_LINK .2byte ITEM_NONE release end diff --git a/data/scripts/pc.inc b/data/scripts/pc.inc index 77cf55e6f..88d8602c2 100644 --- a/data/scripts/pc.inc +++ b/data/scripts/pc.inc @@ -99,3 +99,11 @@ EventScript_ExitOaksPC:: msgbox Text_ClosedLinkToProfOaksPC goto EventScript_PCMainMenu end + +EventScript_AccessPokemonBoxLink:: + playse SE_PC_LOGIN + msgbox Text_OpenedPkmnStorage, MSGBOX_DEFAULT + special ShowPokemonStorageSystemPC + waitstate + goto EventScript_TurnOffPC + end diff --git a/include/event_scripts.h b/include/event_scripts.h index 4a386d5a9..1c79957f9 100644 --- a/include/event_scripts.h +++ b/include/event_scripts.h @@ -1169,6 +1169,7 @@ extern const u8 CableClub_Text_YouMayTradeHere[]; extern const u8 CableClub_Text_YouMayBattleHere[]; extern const u8 CableClub_Text_CanMakeBerryPowder[]; extern const u8 EventScript_PC[]; +extern const u8 EventScript_AccessPokemonBoxLink[]; extern const u8 EventScript_RepelWoreOff[]; diff --git a/include/item_use.h b/include/item_use.h index cf980e7d2..f09e4b2f5 100644 --- a/include/item_use.h +++ b/include/item_use.h @@ -21,6 +21,7 @@ void ItemUseOutOfBattle_Mail(u8 taskId); void ItemUseOutOfBattle_Medicine(u8 taskId); void ItemUseOutOfBattle_Mint(u8 taskId); void ItemUseOutOfBattle_PokeFlute(u8 taskId); +void ItemUseOutOfBattle_PokemonBoxLink(u8 taskId); void ItemUseOutOfBattle_PowderJar(u8 taskId); void ItemUseOutOfBattle_PPRecovery(u8 taskId); void ItemUseOutOfBattle_PPUp(u8 taskId); diff --git a/src/data/items.h b/src/data/items.h index 862fe4420..d9d7813bc 100644 --- a/src/data/items.h +++ b/src/data/items.h @@ -11114,7 +11114,7 @@ const struct Item gItemsInfo[] = .importance = 1, .pocket = POCKET_KEY_ITEMS, .type = ITEM_TYPE_FIELD, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .fieldUseFunc = ItemUseOutOfBattle_PokemonBoxLink, }, [ITEM_COIN_CASE] = diff --git a/src/field_specials.c b/src/field_specials.c index 2ad3bf8ad..6f9675b54 100644 --- a/src/field_specials.c +++ b/src/field_specials.c @@ -226,6 +226,20 @@ bool8 PlayerHasGrassPokemonInParty(void) return FALSE; } +static bool8 IsPlayerInFrontOfPC(void) +{ + s16 x, y; + u32 tileInFront; + + GetXYCoordsOneStepInFrontOfPlayer(&x, &y); + tileInFront = MapGridGetMetatileIdAt(x, y); + + return (tileInFront == METATILE_Building_PCOff + || tileInFront == METATILE_Building_PCOn + || tileInFront == METATILE_GenericBuilding1_PlayersPCOff + || tileInFront == METATILE_GenericBuilding1_PlayersPCOn); +} + #define tState data[0] #define tTimer data[1] @@ -233,7 +247,7 @@ void AnimatePcTurnOn(void) { u8 taskId; - if (FuncIsActiveTask(Task_AnimatePcTurnOn) != TRUE) + if (FuncIsActiveTask(Task_AnimatePcTurnOn) != TRUE && IsPlayerInFrontOfPC() == TRUE) { taskId = CreateTask(Task_AnimatePcTurnOn, 8); gTasks[taskId].tState = 0; @@ -310,6 +324,8 @@ void AnimatePcTurnOff() s8 deltaY = 0; u8 direction = GetPlayerFacingDirection(); + if (IsPlayerInFrontOfPC() == FALSE) + return; switch (direction) { case DIR_NORTH: diff --git a/src/item_use.c b/src/item_use.c index 450824ad0..a5ca60803 100644 --- a/src/item_use.c +++ b/src/item_use.c @@ -10,6 +10,7 @@ #include "field_effect.h" #include "field_fadetransition.h" #include "event_object_movement.h" +#include "event_scripts.h" #include "field_player_avatar.h" #include "field_specials.h" #include "field_weather.h" @@ -49,6 +50,7 @@ static void Task_ItemUse_CloseMessageBoxAndReturnToField(u8 taskId); static void Task_ItemUseWaitForFade(u8 taskId); static bool8 FieldCB2_UseItemFromField(void); static void CB2_CheckMail(void); +static void Task_AccessPokemonBoxLink(u8); static void ItemUseOnFieldCB_Bicycle(u8 taskId); static bool8 CanFish(void); static void ItemUseOnFieldCB_Rod(u8 taskId); @@ -361,6 +363,18 @@ void ItemUseOutOfBattle_Itemfinder(u8 taskId) SetUpItemUseOnFieldCallback(taskId); } +void ItemUseOutOfBattle_PokemonBoxLink(u8 taskId) +{ + sItemUseOnFieldCB = Task_AccessPokemonBoxLink; + SetUpItemUseOnFieldCallback(taskId); +} + +static void Task_AccessPokemonBoxLink(u8 taskId) +{ + ScriptContext_SetupScript(EventScript_AccessPokemonBoxLink); + DestroyTask(taskId); +} + #define tIsFieldUse data[3] void ItemUseOutOfBattle_CoinCase(u8 taskId)