From d7519b540e24df073a9cafdc32af73f125b5a175 Mon Sep 17 00:00:00 2001 From: cawtds Date: Sat, 1 Jun 2024 21:12:29 +0200 Subject: [PATCH] dynamax candy functionality --- data/maps/ViridianCity_Mart/scripts.inc | 1 + include/item_use.h | 1 + include/party_menu.h | 3 +- src/data/items.h | 2 +- src/item_use.c | 6 +++ src/party_menu.c | 64 +++++++++++++++++++++++++ 6 files changed, 74 insertions(+), 3 deletions(-) diff --git a/data/maps/ViridianCity_Mart/scripts.inc b/data/maps/ViridianCity_Mart/scripts.inc index 28438446e..7817f2246 100644 --- a/data/maps/ViridianCity_Mart/scripts.inc +++ b/data/maps/ViridianCity_Mart/scripts.inc @@ -131,6 +131,7 @@ ViridianCity_Mart_Items:: .2byte ITEM_BOLD_MINT .2byte ITEM_ADAMANT_MINT .2byte ITEM_SERIOUS_MINT + .2byte ITEM_DYNAMAX_CANDY .2byte ITEM_NONE release end diff --git a/include/item_use.h b/include/item_use.h index 3a8990195..5b0d4f69d 100644 --- a/include/item_use.h +++ b/include/item_use.h @@ -13,6 +13,7 @@ void ItemUseOutOfBattle_BerryPouch(u8 taskId); void ItemUseOutOfBattle_Bike(u8 taskId); void ItemUseOutOfBattle_BlackWhiteFlute(u8 taskId); void ItemUseOutOfBattle_CoinCase(u8 taskId); +void ItemUseOutOfBattle_DynamaxCandy(u8); void ItemUseOutOfBattle_EscapeRope(u8 taskId); void ItemUseOutOfBattle_EnigmaBerry(u8 taskId); void ItemUseOutOfBattle_EvolutionStone(u8 taskId); diff --git a/include/party_menu.h b/include/party_menu.h index cd199b855..062617409 100644 --- a/include/party_menu.h +++ b/include/party_menu.h @@ -65,6 +65,7 @@ bool8 MonKnowsMove(struct Pokemon *mon, u16 move); bool8 BoxMonKnowsMove(struct BoxPokemon *boxMon, u16 move); void ItemUseCB_TMHM(u8 taskId, TaskFunc func); void ItemUseCB_RareCandy(u8 taskId, TaskFunc func); +void ItemUseCB_DynamaxCandy(u8 taskId, TaskFunc task); void ItemUseCB_SacredAsh(u8 taskId, TaskFunc func); void ItemUseCB_EvolutionStone(u8 taskId, TaskFunc func); u8 GetItemEffectType(u16 item); @@ -88,8 +89,6 @@ u8 GetPartyIdFromBattlePartyId(u8 battlePartyId); void ShowPartyMenuToShowcaseMultiBattleParty(void); void ChooseMonForDaycare(void); void ChoosePartyMonByMenuType(u8 menuType); - -// pokeemerald void ItemUseCB_BattleChooseMove(u8 taskId, TaskFunc task); const u8* GetItemEffect(u16 item); diff --git a/src/data/items.h b/src/data/items.h index caeff0a2e..87a2a90f1 100644 --- a/src/data/items.h +++ b/src/data/items.h @@ -1806,7 +1806,7 @@ const struct Item gItemsInfo[] = "Pokémon by one."), .pocket = POCKET_ITEMS, .type = ITEM_TYPE_PARTY_MENU, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .fieldUseFunc = ItemUseOutOfBattle_DynamaxCandy, .flingPower = 30, }, diff --git a/src/item_use.c b/src/item_use.c index 9b41db7ff..dafac5a63 100644 --- a/src/item_use.c +++ b/src/item_use.c @@ -301,6 +301,12 @@ void ItemUseOutOfBattle_CoinCase(u8 taskId) DisplayItemMessageOnField(taskId, FONT_NORMAL, gStringVar4, Task_ItemUse_CloseMessageBoxAndReturnToField); } +void ItemUseOutOfBattle_DynamaxCandy(u8 taskId) +{ + gItemUseCB = ItemUseCB_DynamaxCandy; + SetUpItemUseCallback(taskId); +} + void ItemUseOutOfBattle_PowderJar(u8 taskId) { ConvertIntToDecimalStringN(gStringVar1, GetBerryPowder(), STR_CONV_MODE_LEFT_ALIGN, 5); diff --git a/src/party_menu.c b/src/party_menu.c index b19bea22f..5ac51fbaf 100644 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -5751,6 +5751,70 @@ static void DisplayMonLearnedMove(u8 taskId, u16 move) #define tHadEffect data[1] #define tLastSlotUsed data[2] +#define tState data[0] +#define tMonId data[1] +#define tDynamaxLevel data[2] +#define tOldFunc 4 + +void Task_DynamaxCandy(u8 taskId) +{ + static const u8 doneText[] = _("{STR_VAR_1}'s Dynamax Level\nincreased by 1!{PAUSE_UNTIL_PRESS}"); + s16 *data = gTasks[taskId].data; + + switch (tState) + { + case 0: + // Can't use. + if (tDynamaxLevel == MAX_DYNAMAX_LEVEL) + { + gPartyMenuUseExitCallback = FALSE; + PlaySE(SE_SELECT); + DisplayPartyMenuMessage(gText_WontHaveEffect, 1); + ScheduleBgCopyTilemapToVram(2); + gTasks[taskId].func = Task_ClosePartyMenuAfterText; + return; + } + gPartyMenuUseExitCallback = TRUE; + GetMonNickname(&gPlayerParty[tMonId], gStringVar1); + CopyItemName(gSpecialVar_ItemId, gStringVar2); + tState++; + break; + case 1: + PlaySE(SE_USE_ITEM); + StringExpandPlaceholders(gStringVar4, doneText); + DisplayPartyMenuMessage(gStringVar4, 1); + ScheduleBgCopyTilemapToVram(2); + tState++; + break; + case 2: + if (!IsPartyMenuTextPrinterActive()) + tState++; + break; + case 3: + tDynamaxLevel++; + SetMonData(&gPlayerParty[tMonId], MON_DATA_DYNAMAX_LEVEL, &tDynamaxLevel); + RemoveBagItem(gSpecialVar_ItemId, 1); + gTasks[taskId].func = Task_ClosePartyMenu; + break; + } +} + +void ItemUseCB_DynamaxCandy(u8 taskId, TaskFunc task) +{ + s16 *data = gTasks[taskId].data; + + tState = 0; + tMonId = gPartyMenu.slotId; + tDynamaxLevel = GetMonData(&gPlayerParty[tMonId], MON_DATA_DYNAMAX_LEVEL); + SetWordTaskArg(taskId, tOldFunc, (uintptr_t)(gTasks[taskId].func)); + gTasks[taskId].func = Task_DynamaxCandy; +} + +#undef tState +#undef tMonId +#undef tDynamaxLevel +#undef tOldFunc + void ItemUseCB_SacredAsh(u8 taskId, TaskFunc func) { sPartyMenuInternal->tUsedOnSlot = FALSE;