From 51bfdffac3e26a497f510839a69b46195993cbaa Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 17 Aug 2019 12:47:25 +0200 Subject: [PATCH] Ability Capsule --- include/constants/item_effects.h | 4 +- include/item_use.h | 1 + include/party_menu.h | 1 + src/data/items.h | 4 +- src/data/pokemon/item_effects.h | 12 ++-- src/item_use.c | 6 ++ src/party_menu.c | 94 ++++++++++++++++++++++++++++++++ src/pokemon.c | 4 +- 8 files changed, 115 insertions(+), 11 deletions(-) diff --git a/include/constants/item_effects.h b/include/constants/item_effects.h index a5bb770355..a7440b0cb5 100644 --- a/include/constants/item_effects.h +++ b/include/constants/item_effects.h @@ -49,7 +49,9 @@ #define ITEM5_FRIENDSHIP_ALL (ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID | ITEM5_FRIENDSHIP_HIGH) -// fields 6 and onwards are item-specific arguments +// fields 6 - 9 are item-specific arguments + +#define ITEM10_IS_VITAMIN 0x1 // Used for GetItemEffectType. #define ITEM_EFFECT_X_ITEM 0 diff --git a/include/item_use.h b/include/item_use.h index 37343f6e7a..456222808c 100644 --- a/include/item_use.h +++ b/include/item_use.h @@ -25,6 +25,7 @@ void sub_80C9D00(u8); void ItemUseOutOfBattle_WailmerPail(u8); void sub_80C9D74(u8); void ItemUseOutOfBattle_Medicine(u8); +void ItemUseOutOfBattle_AbilityCapsule(u8); void ItemUseOutOfBattle_ReduceEV(u8); void ItemUseOutOfBattle_SacredAsh(u8); void ItemUseOutOfBattle_PPRecovery(u8); diff --git a/include/party_menu.h b/include/party_menu.h index c9843e484d..7ff129201d 100644 --- a/include/party_menu.h +++ b/include/party_menu.h @@ -71,6 +71,7 @@ void LoadHeldItemIcons(void); void sub_81B5D4C(u8 *a, u8 *b, u8 c); void sub_81B617C(void); void ItemUseCB_Medicine(u8 taskId, TaskFunc task); +void ItemUseCB_AbilityCapsule(u8 taskId, TaskFunc task); void sub_81B67C8(u8 taskId, TaskFunc task); void dp05_ether(u8 taskId, TaskFunc task); void dp05_pp_up(u8 taskId, TaskFunc task); diff --git a/src/data/items.h b/src/data/items.h index 18615ae215..b50451f67a 100644 --- a/src/data/items.h +++ b/src/data/items.h @@ -1216,8 +1216,8 @@ const struct Item gItems[] = .holdEffectParam = 0, .description = sAbilityCapsuleDesc, .pocket = POCKET_ITEMS, - .type = 4, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, // Placeholder + .type = 1, + .fieldUseFunc = ItemUseOutOfBattle_AbilityCapsule, .secondaryId = 0, }, diff --git a/src/data/pokemon/item_effects.h b/src/data/pokemon/item_effects.h index d231c4d203..57926f31e1 100644 --- a/src/data/pokemon/item_effects.h +++ b/src/data/pokemon/item_effects.h @@ -180,7 +180,7 @@ const u8 gItemEffect_HPUp[11] = { [7] = 5, [8] = 3, [9] = 2, - [10] = 1, + [10] = ITEM10_IS_VITAMIN, }; const u8 gItemEffect_Protein[11] = { @@ -190,7 +190,7 @@ const u8 gItemEffect_Protein[11] = { [7] = 5, [8] = 3, [9] = 2, - [10] = 1, + [10] = ITEM10_IS_VITAMIN, }; const u8 gItemEffect_Iron[11] = { @@ -199,7 +199,7 @@ const u8 gItemEffect_Iron[11] = { [7] = 5, [8] = 3, [9] = 2, - [10] = 1, + [10] = ITEM10_IS_VITAMIN, }; const u8 gItemEffect_Carbos[11] = { @@ -208,7 +208,7 @@ const u8 gItemEffect_Carbos[11] = { [7] = 5, [8] = 3, [9] = 2, - [10] = 1, + [10] = ITEM10_IS_VITAMIN, }; const u8 gItemEffect_Calcium[11] = { @@ -217,7 +217,7 @@ const u8 gItemEffect_Calcium[11] = { [7] = 5, [8] = 3, [9] = 2, - [10] = 1, + [10] = ITEM10_IS_VITAMIN, }; const u8 gItemEffect_Zinc[11] = { @@ -226,7 +226,7 @@ const u8 gItemEffect_Zinc[11] = { [7] = 5, [8] = 3, [9] = 2, - [10] = 1, + [10] = ITEM10_IS_VITAMIN, }; const u8 gItemEffect_HpWing[11] = { diff --git a/src/item_use.c b/src/item_use.c index 2f43744238..0064acef32 100755 --- a/src/item_use.c +++ b/src/item_use.c @@ -726,6 +726,12 @@ void ItemUseOutOfBattle_Medicine(u8 taskId) SetUpItemUseCallback(taskId); } +void ItemUseOutOfBattle_AbilityCapsule(u8 taskId) +{ + gUnknown_03006328 = ItemUseCB_AbilityCapsule; + SetUpItemUseCallback(taskId); +} + void ItemUseOutOfBattle_ReduceEV(u8 taskId) { gUnknown_03006328 = sub_81B67C8; diff --git a/src/party_menu.c b/src/party_menu.c index dd0a4dabd3..56d58b2dea 100755 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -5482,6 +5482,100 @@ void ItemUseCB_Medicine(u8 taskId, TaskFunc task) } } +#define tState data[0] +#define tSpecies data[1] +#define tAbilityNum data[2] +#define tMonId data[3] +#define tOldFunc 4 + +void Task_AbilityCapsule(u8 taskId) +{ + static const u8 askText[] = _("Would you like to change {STR_VAR_1}'s\nability to {STR_VAR_2}?"); + static const u8 doneText[] = _("{STR_VAR_1}'s ability became\n{STR_VAR_2}!{PAUSE_UNTIL_PRESS}"); + s16 *data = gTasks[taskId].data; + + switch (tState) + { + case 0: + // Can't use. + if (gBaseStats[tSpecies].abilities[0] == gBaseStats[tSpecies].abilities[1] + || gBaseStats[tSpecies].abilities[1] == 0 + || tAbilityNum > 1 + || !tSpecies) + { + gUnknown_0203CEE8 = 0; + PlaySE(SE_SELECT); + sub_81B1B5C(gText_WontHaveEffect, 1); + schedule_bg_copy_tilemap_to_vram(2); + gTasks[taskId].func = sub_81B6794; + return; + } + gUnknown_0203CEE8 = 1; + GetMonNickname(&gPlayerParty[tMonId], gStringVar1); + StringCopy(gStringVar2, gAbilityNames[GetAbilityBySpecies(tSpecies, tAbilityNum)]); + StringExpandPlaceholders(gStringVar4, askText); + PlaySE(SE_SELECT); + sub_81B1B5C(gStringVar4, 1); + schedule_bg_copy_tilemap_to_vram(2); + tState++; + break; + case 1: + if (!sub_81B1BD4()) + { + sub_81B334C(); + tState++; + } + break; + case 2: + switch (Menu_ProcessInputNoWrapClearOnChoose()) + { + case 0: + tState++; + break; + case 1: + case MENU_B_PRESSED: + gUnknown_0203CEE8 = 0; + PlaySE(SE_SELECT); + schedule_bg_copy_tilemap_to_vram(2); + // Don't exit party selections screen, return to choosing a mon. + ClearStdWindowAndFrameToTransparent(6, 0); + ClearWindowTilemap(6); + display_pokemon_menu_message(5); + gTasks[taskId].func = (void *)GetWordTaskArg(taskId, tOldFunc); + return; + } + break; + case 3: + PlaySE(SE_KAIFUKU); + StringExpandPlaceholders(gStringVar4, doneText); + sub_81B1B5C(gStringVar4, 1); + schedule_bg_copy_tilemap_to_vram(2); + tState++; + break; + case 4: + if (!sub_81B1BD4()) + tState++; + break; + case 5: + SetMonData(&gPlayerParty[tMonId], MON_DATA_ABILITY_NUM, &tAbilityNum); + RemoveBagItem(gSpecialVar_ItemId, 1); + gTasks[taskId].func = sub_81B12C0; + break; + } +} + +void ItemUseCB_AbilityCapsule(u8 taskId, TaskFunc task) +{ + s16 *data = gTasks[taskId].data; + + tState = 0; + tMonId = gUnknown_0203CEC8.slotId; + tSpecies = GetMonData(&gPlayerParty[tMonId], MON_DATA_SPECIES, NULL); + tAbilityNum = GetMonData(&gPlayerParty[tMonId], MON_DATA_ABILITY_NUM, NULL) ^ 1; + SetWordTaskArg(taskId, tOldFunc, (uintptr_t)(gTasks[taskId].func)); + gTasks[taskId].func = Task_AbilityCapsule; +} + static void sub_81B672C(u8 taskId) { GetMonNickname(&gPlayerParty[gUnknown_0203CEC8.slotId], gStringVar1); diff --git a/src/pokemon.c b/src/pokemon.c index b56a19dc8f..0539079bd5 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -4818,7 +4818,7 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov if (evCount >= MAX_TOTAL_EVS) return TRUE; - if (itemEffect[10]) + if (itemEffect[10] & ITEM10_IS_VITAMIN) evCap = 100; else evCap = 252; @@ -5028,7 +5028,7 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov if (evCount >= MAX_TOTAL_EVS) return TRUE; - if (itemEffect[10]) + if (itemEffect[10] & ITEM10_IS_VITAMIN) evCap = 100; else evCap = 252;