From 03c21c3b71f848340baf90bad318c0027622b6e5 Mon Sep 17 00:00:00 2001 From: AgustinGDLV Date: Sun, 15 May 2022 21:28:23 -0700 Subject: [PATCH 01/17] implementation of EXP candies --- src/data/items.h | 36 ++++++++++++++++++++++++--------- src/data/pokemon/item_effects.h | 10 ++++----- src/pokemon.c | 26 +++++++++++++++++++++++- 3 files changed, 56 insertions(+), 16 deletions(-) diff --git a/src/data/items.h b/src/data/items.h index 63ad66dfec..298f65b4a6 100644 --- a/src/data/items.h +++ b/src/data/items.h @@ -1354,11 +1354,17 @@ const struct Item gItems[] = // Candy +#define ONE_HUNDRED 1 << 4 +#define ONE_THOUSAND 1 << 5 +#define TEN_THOUSAND 1 << 6 +#define FULL_LEVEL 1 << 7 + [ITEM_RARE_CANDY] = { .name = _("Rare Candy"), .itemId = ITEM_RARE_CANDY, .price = 10000, + .holdEffectParam = FULL_LEVEL, .description = sRareCandyDesc, .pocket = POCKET_ITEMS, .type = ITEM_USE_PARTY_MENU, @@ -1371,10 +1377,11 @@ const struct Item gItems[] = .name = _("Exp.Candy XS"), .itemId = ITEM_EXP_CANDY_XS, .price = 20, + .holdEffectParam = 1 | ONE_HUNDRED, .description = sExpCandyXSDesc, .pocket = POCKET_ITEMS, - .type = ITEM_USE_BAG_MENU, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, // Todo + .type = ITEM_USE_PARTY_MENU, + .fieldUseFunc = ItemUseOutOfBattle_RareCandy, // Todo .flingPower = 30, }, @@ -1383,10 +1390,11 @@ const struct Item gItems[] = .name = _("Exp.Candy S"), .itemId = ITEM_EXP_CANDY_S, .price = 240, + .holdEffectParam = 8 | ONE_HUNDRED, .description = sExpCandyXSDesc, .pocket = POCKET_ITEMS, - .type = ITEM_USE_BAG_MENU, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, // Todo + .type = ITEM_USE_PARTY_MENU, + .fieldUseFunc = ItemUseOutOfBattle_RareCandy, // Todo .flingPower = 30, }, @@ -1395,10 +1403,11 @@ const struct Item gItems[] = .name = _("Exp.Candy M"), .itemId = ITEM_EXP_CANDY_M, .price = 1000, + .holdEffectParam = 3 | ONE_THOUSAND, .description = sExpCandyMDesc, .pocket = POCKET_ITEMS, - .type = ITEM_USE_BAG_MENU, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, // Todo + .type = ITEM_USE_PARTY_MENU, + .fieldUseFunc = ItemUseOutOfBattle_RareCandy, // Todo .flingPower = 30, }, @@ -1407,10 +1416,11 @@ const struct Item gItems[] = .name = _("Exp.Candy L"), .itemId = ITEM_EXP_CANDY_L, .price = 3000, + .holdEffectParam = 1 | TEN_THOUSAND, .description = sExpCandyLDesc, .pocket = POCKET_ITEMS, - .type = ITEM_USE_BAG_MENU, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, // Todo + .type = ITEM_USE_PARTY_MENU, + .fieldUseFunc = ItemUseOutOfBattle_RareCandy, // Todo .flingPower = 30, }, @@ -1419,10 +1429,11 @@ const struct Item gItems[] = .name = _("Exp.Candy XL"), .itemId = ITEM_EXP_CANDY_XL, .price = 10000, + .holdEffectParam = 3 | TEN_THOUSAND, .description = sExpCandyXLDesc, .pocket = POCKET_ITEMS, - .type = ITEM_USE_BAG_MENU, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, // Todo + .type = ITEM_USE_PARTY_MENU, + .fieldUseFunc = ItemUseOutOfBattle_RareCandy, // Todo .flingPower = 30, }, @@ -1438,6 +1449,11 @@ const struct Item gItems[] = .flingPower = 30, }, +#undef ONE_HUNDRED +#undef ONE_THOUSAND +#undef TEN_THOUSAND +#undef FULL_LEVEL + // Medicinal Flutes [ITEM_BLUE_FLUTE] = diff --git a/src/data/pokemon/item_effects.h b/src/data/pokemon/item_effects.h index ff621356e1..8892cb66f3 100644 --- a/src/data/pokemon/item_effects.h +++ b/src/data/pokemon/item_effects.h @@ -532,11 +532,11 @@ const u8 *const gItemEffectTable[] = // Candy [ITEM_RARE_CANDY - ITEM_POTION] = gItemEffect_RareCandy, - //[ITEM_EXP_CANDY_XS - ITEM_POTION] = gItemEffect_ExpCandy, // Todo - //[ITEM_EXP_CANDY_S - ITEM_POTION] = gItemEffect_ExpCandy, // Todo - //[ITEM_EXP_CANDY_M - ITEM_POTION] = gItemEffect_ExpCandy, // Todo - //[ITEM_EXP_CANDY_L - ITEM_POTION] = gItemEffect_ExpCandy, // Todo - //[ITEM_EXP_CANDY_XL - ITEM_POTION] = gItemEffect_ExpCandy, // Todo + [ITEM_EXP_CANDY_XS - ITEM_POTION] = gItemEffect_RareCandy, // Todo + [ITEM_EXP_CANDY_S - ITEM_POTION] = gItemEffect_RareCandy, // Todo + [ITEM_EXP_CANDY_M - ITEM_POTION] = gItemEffect_RareCandy, // Todo + [ITEM_EXP_CANDY_L - ITEM_POTION] = gItemEffect_RareCandy, // Todo + [ITEM_EXP_CANDY_XL - ITEM_POTION] = gItemEffect_RareCandy, // Todo //[ITEM_DYNAMAX_CANDY - ITEM_POTION] = gItemEffect_DynamaxCandy, // Todo // Medicinal Flutes diff --git a/src/pokemon.c b/src/pokemon.c index 11be4da1f7..f987b24a89 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -4873,16 +4873,40 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov retVal = FALSE; } +#define ONE_HUNDRED 1 << 4 +#define ONE_THOUSAND 1 << 5 +#define TEN_THOUSAND 1 << 6 +#define FULL_LEVEL 1 << 7 + // Rare Candy if ((itemEffect[i] & ITEM3_LEVEL_UP) && GetMonData(mon, MON_DATA_LEVEL, NULL) != MAX_LEVEL) { - dataUnsigned = gExperienceTables[gBaseStats[GetMonData(mon, MON_DATA_SPECIES, NULL)].growthRate][GetMonData(mon, MON_DATA_LEVEL, NULL) + 1]; + if (ItemId_GetHoldEffectParam(item) & FULL_LEVEL) + dataUnsigned = gExperienceTables[gBaseStats[GetMonData(mon, MON_DATA_SPECIES, NULL)].growthRate][GetMonData(mon, MON_DATA_LEVEL, NULL) + 1]; + else + { + temp1 = ItemId_GetHoldEffectParam(item) & 0x0F; + if (ItemId_GetHoldEffectParam(item) & ONE_HUNDRED) + temp1 *= 100; + if (ItemId_GetHoldEffectParam(item) & ONE_THOUSAND) + temp1 *= 1000; + if (ItemId_GetHoldEffectParam(item) & TEN_THOUSAND) + temp1 *= 10000; + dataUnsigned = temp1 + gExperienceTables[gBaseStats[GetMonData(mon, MON_DATA_SPECIES, NULL)].growthRate][GetMonData(mon, MON_DATA_LEVEL, NULL)]; + if (dataUnsigned > gExperienceTables[gBaseStats[GetMonData(mon, MON_DATA_SPECIES, NULL)].growthRate][MAX_LEVEL]) + dataUnsigned = gExperienceTables[gBaseStats[GetMonData(mon, MON_DATA_SPECIES, NULL)].growthRate][MAX_LEVEL]; + } SetMonData(mon, MON_DATA_EXP, &dataUnsigned); CalculateMonStats(mon); retVal = FALSE; } +#undef ONE_HUNDRED +#undef ONE_THOUSAND +#undef TEN_THOUSAND +#undef FULL_LEVEL + // Cure status if ((itemEffect[i] & ITEM3_SLEEP) && HealStatusConditions(mon, partyIndex, STATUS1_SLEEP, battlerId) == 0) From 3e44ce08b35e5f97ba6eb8c11b0492e332732182 Mon Sep 17 00:00:00 2001 From: AgustinGDLV Date: Sun, 15 May 2022 21:34:50 -0700 Subject: [PATCH 02/17] Revert "implementation of EXP candies" This reverts commit 03c21c3b71f848340baf90bad318c0027622b6e5. --- src/data/items.h | 36 +++++++++------------------------ src/data/pokemon/item_effects.h | 10 ++++----- src/pokemon.c | 26 +----------------------- 3 files changed, 16 insertions(+), 56 deletions(-) diff --git a/src/data/items.h b/src/data/items.h index 298f65b4a6..63ad66dfec 100644 --- a/src/data/items.h +++ b/src/data/items.h @@ -1354,17 +1354,11 @@ const struct Item gItems[] = // Candy -#define ONE_HUNDRED 1 << 4 -#define ONE_THOUSAND 1 << 5 -#define TEN_THOUSAND 1 << 6 -#define FULL_LEVEL 1 << 7 - [ITEM_RARE_CANDY] = { .name = _("Rare Candy"), .itemId = ITEM_RARE_CANDY, .price = 10000, - .holdEffectParam = FULL_LEVEL, .description = sRareCandyDesc, .pocket = POCKET_ITEMS, .type = ITEM_USE_PARTY_MENU, @@ -1377,11 +1371,10 @@ const struct Item gItems[] = .name = _("Exp.Candy XS"), .itemId = ITEM_EXP_CANDY_XS, .price = 20, - .holdEffectParam = 1 | ONE_HUNDRED, .description = sExpCandyXSDesc, .pocket = POCKET_ITEMS, - .type = ITEM_USE_PARTY_MENU, - .fieldUseFunc = ItemUseOutOfBattle_RareCandy, // Todo + .type = ITEM_USE_BAG_MENU, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, // Todo .flingPower = 30, }, @@ -1390,11 +1383,10 @@ const struct Item gItems[] = .name = _("Exp.Candy S"), .itemId = ITEM_EXP_CANDY_S, .price = 240, - .holdEffectParam = 8 | ONE_HUNDRED, .description = sExpCandyXSDesc, .pocket = POCKET_ITEMS, - .type = ITEM_USE_PARTY_MENU, - .fieldUseFunc = ItemUseOutOfBattle_RareCandy, // Todo + .type = ITEM_USE_BAG_MENU, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, // Todo .flingPower = 30, }, @@ -1403,11 +1395,10 @@ const struct Item gItems[] = .name = _("Exp.Candy M"), .itemId = ITEM_EXP_CANDY_M, .price = 1000, - .holdEffectParam = 3 | ONE_THOUSAND, .description = sExpCandyMDesc, .pocket = POCKET_ITEMS, - .type = ITEM_USE_PARTY_MENU, - .fieldUseFunc = ItemUseOutOfBattle_RareCandy, // Todo + .type = ITEM_USE_BAG_MENU, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, // Todo .flingPower = 30, }, @@ -1416,11 +1407,10 @@ const struct Item gItems[] = .name = _("Exp.Candy L"), .itemId = ITEM_EXP_CANDY_L, .price = 3000, - .holdEffectParam = 1 | TEN_THOUSAND, .description = sExpCandyLDesc, .pocket = POCKET_ITEMS, - .type = ITEM_USE_PARTY_MENU, - .fieldUseFunc = ItemUseOutOfBattle_RareCandy, // Todo + .type = ITEM_USE_BAG_MENU, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, // Todo .flingPower = 30, }, @@ -1429,11 +1419,10 @@ const struct Item gItems[] = .name = _("Exp.Candy XL"), .itemId = ITEM_EXP_CANDY_XL, .price = 10000, - .holdEffectParam = 3 | TEN_THOUSAND, .description = sExpCandyXLDesc, .pocket = POCKET_ITEMS, - .type = ITEM_USE_PARTY_MENU, - .fieldUseFunc = ItemUseOutOfBattle_RareCandy, // Todo + .type = ITEM_USE_BAG_MENU, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, // Todo .flingPower = 30, }, @@ -1449,11 +1438,6 @@ const struct Item gItems[] = .flingPower = 30, }, -#undef ONE_HUNDRED -#undef ONE_THOUSAND -#undef TEN_THOUSAND -#undef FULL_LEVEL - // Medicinal Flutes [ITEM_BLUE_FLUTE] = diff --git a/src/data/pokemon/item_effects.h b/src/data/pokemon/item_effects.h index 8892cb66f3..ff621356e1 100644 --- a/src/data/pokemon/item_effects.h +++ b/src/data/pokemon/item_effects.h @@ -532,11 +532,11 @@ const u8 *const gItemEffectTable[] = // Candy [ITEM_RARE_CANDY - ITEM_POTION] = gItemEffect_RareCandy, - [ITEM_EXP_CANDY_XS - ITEM_POTION] = gItemEffect_RareCandy, // Todo - [ITEM_EXP_CANDY_S - ITEM_POTION] = gItemEffect_RareCandy, // Todo - [ITEM_EXP_CANDY_M - ITEM_POTION] = gItemEffect_RareCandy, // Todo - [ITEM_EXP_CANDY_L - ITEM_POTION] = gItemEffect_RareCandy, // Todo - [ITEM_EXP_CANDY_XL - ITEM_POTION] = gItemEffect_RareCandy, // Todo + //[ITEM_EXP_CANDY_XS - ITEM_POTION] = gItemEffect_ExpCandy, // Todo + //[ITEM_EXP_CANDY_S - ITEM_POTION] = gItemEffect_ExpCandy, // Todo + //[ITEM_EXP_CANDY_M - ITEM_POTION] = gItemEffect_ExpCandy, // Todo + //[ITEM_EXP_CANDY_L - ITEM_POTION] = gItemEffect_ExpCandy, // Todo + //[ITEM_EXP_CANDY_XL - ITEM_POTION] = gItemEffect_ExpCandy, // Todo //[ITEM_DYNAMAX_CANDY - ITEM_POTION] = gItemEffect_DynamaxCandy, // Todo // Medicinal Flutes diff --git a/src/pokemon.c b/src/pokemon.c index f987b24a89..11be4da1f7 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -4873,40 +4873,16 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov retVal = FALSE; } -#define ONE_HUNDRED 1 << 4 -#define ONE_THOUSAND 1 << 5 -#define TEN_THOUSAND 1 << 6 -#define FULL_LEVEL 1 << 7 - // Rare Candy if ((itemEffect[i] & ITEM3_LEVEL_UP) && GetMonData(mon, MON_DATA_LEVEL, NULL) != MAX_LEVEL) { - if (ItemId_GetHoldEffectParam(item) & FULL_LEVEL) - dataUnsigned = gExperienceTables[gBaseStats[GetMonData(mon, MON_DATA_SPECIES, NULL)].growthRate][GetMonData(mon, MON_DATA_LEVEL, NULL) + 1]; - else - { - temp1 = ItemId_GetHoldEffectParam(item) & 0x0F; - if (ItemId_GetHoldEffectParam(item) & ONE_HUNDRED) - temp1 *= 100; - if (ItemId_GetHoldEffectParam(item) & ONE_THOUSAND) - temp1 *= 1000; - if (ItemId_GetHoldEffectParam(item) & TEN_THOUSAND) - temp1 *= 10000; - dataUnsigned = temp1 + gExperienceTables[gBaseStats[GetMonData(mon, MON_DATA_SPECIES, NULL)].growthRate][GetMonData(mon, MON_DATA_LEVEL, NULL)]; - if (dataUnsigned > gExperienceTables[gBaseStats[GetMonData(mon, MON_DATA_SPECIES, NULL)].growthRate][MAX_LEVEL]) - dataUnsigned = gExperienceTables[gBaseStats[GetMonData(mon, MON_DATA_SPECIES, NULL)].growthRate][MAX_LEVEL]; - } + dataUnsigned = gExperienceTables[gBaseStats[GetMonData(mon, MON_DATA_SPECIES, NULL)].growthRate][GetMonData(mon, MON_DATA_LEVEL, NULL) + 1]; SetMonData(mon, MON_DATA_EXP, &dataUnsigned); CalculateMonStats(mon); retVal = FALSE; } -#undef ONE_HUNDRED -#undef ONE_THOUSAND -#undef TEN_THOUSAND -#undef FULL_LEVEL - // Cure status if ((itemEffect[i] & ITEM3_SLEEP) && HealStatusConditions(mon, partyIndex, STATUS1_SLEEP, battlerId) == 0) From 793e8ef5a47504cc60f96c06040186dbf63f9e67 Mon Sep 17 00:00:00 2001 From: AgustinGDLV Date: Mon, 16 May 2022 13:12:41 -0700 Subject: [PATCH 03/17] fixed learning moves --- src/data/items.h | 12 +++---- src/party_menu.c | 89 +++++++++++++++++++++++++++++++----------------- src/pokemon.c | 20 +++++------ 3 files changed, 74 insertions(+), 47 deletions(-) diff --git a/src/data/items.h b/src/data/items.h index 298f65b4a6..12ca812475 100644 --- a/src/data/items.h +++ b/src/data/items.h @@ -1381,7 +1381,7 @@ const struct Item gItems[] = .description = sExpCandyXSDesc, .pocket = POCKET_ITEMS, .type = ITEM_USE_PARTY_MENU, - .fieldUseFunc = ItemUseOutOfBattle_RareCandy, // Todo + .fieldUseFunc = ItemUseOutOfBattle_RareCandy, .flingPower = 30, }, @@ -1394,7 +1394,7 @@ const struct Item gItems[] = .description = sExpCandyXSDesc, .pocket = POCKET_ITEMS, .type = ITEM_USE_PARTY_MENU, - .fieldUseFunc = ItemUseOutOfBattle_RareCandy, // Todo + .fieldUseFunc = ItemUseOutOfBattle_RareCandy, .flingPower = 30, }, @@ -1407,7 +1407,7 @@ const struct Item gItems[] = .description = sExpCandyMDesc, .pocket = POCKET_ITEMS, .type = ITEM_USE_PARTY_MENU, - .fieldUseFunc = ItemUseOutOfBattle_RareCandy, // Todo + .fieldUseFunc = ItemUseOutOfBattle_RareCandy, .flingPower = 30, }, @@ -1420,7 +1420,7 @@ const struct Item gItems[] = .description = sExpCandyLDesc, .pocket = POCKET_ITEMS, .type = ITEM_USE_PARTY_MENU, - .fieldUseFunc = ItemUseOutOfBattle_RareCandy, // Todo + .fieldUseFunc = ItemUseOutOfBattle_RareCandy, .flingPower = 30, }, @@ -1433,7 +1433,7 @@ const struct Item gItems[] = .description = sExpCandyXLDesc, .pocket = POCKET_ITEMS, .type = ITEM_USE_PARTY_MENU, - .fieldUseFunc = ItemUseOutOfBattle_RareCandy, // Todo + .fieldUseFunc = ItemUseOutOfBattle_RareCandy, .flingPower = 30, }, @@ -1445,7 +1445,7 @@ const struct Item gItems[] = .description = sDynamaxCandyDesc, .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, // Todo + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, }, diff --git a/src/party_menu.c b/src/party_menu.c index 4091437772..cef8e617e9 100755 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -151,6 +151,8 @@ EWRAM_DATA u8 gSelectedOrderFromParty[MAX_FRONTIER_PARTY_SIZE] = {0}; static EWRAM_DATA u16 sPartyMenuItemId = 0; static EWRAM_DATA u16 sUnused = 0; EWRAM_DATA u8 gBattlePartyCurrentOrder[PARTY_SIZE / 2] = {0}; // bits 0-3 are the current pos of Slot 1, 4-7 are Slot 2, and so on +static EWRAM_DATA u8 sInitialLevel = 0; +static EWRAM_DATA u8 sFinalLevel = 0; // IWRAM common void (*gItemUseCB)(u8, TaskFunc); @@ -4822,7 +4824,10 @@ static void Task_LearnNextMoveOrClosePartyMenu(u8 taskId) if (IsFanfareTaskInactive() && ((JOY_NEW(A_BUTTON)) || (JOY_NEW(B_BUTTON)))) { if (gPartyMenu.learnMoveState == 1) - Task_TryLearningNextMove(taskId); + if (sInitialLevel < sFinalLevel) + Task_TryLearnNewMoves(taskId); + else + Task_TryLearningNextMove(taskId); else { if (gPartyMenu.learnMoveState == 2) // never occurs @@ -4874,6 +4879,7 @@ static void CB2_ShowSummaryScreenToForgetMove(void) static void CB2_ReturnToPartyMenuWhileLearningMove(void) { + SetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_LEVEL, &sFinalLevel); // to avoid displaying incorrect level InitPartyMenu(PARTY_MENU_TYPE_FIELD, PARTY_LAYOUT_SINGLE, PARTY_ACTION_CHOOSE_MON, TRUE, PARTY_MSG_NONE, Task_ReturnToPartyMenuWhileLearningMove, gPartyMenu.exitCallback); } @@ -4979,8 +4985,9 @@ void ItemUseCB_RareCandy(u8 taskId, TaskFunc task) s16 *arrayPtr = ptr->data; u16 *itemPtr = &gSpecialVar_ItemId; bool8 cannotUseEffect; + sInitialLevel = GetMonData(mon, MON_DATA_LEVEL); - if (GetMonData(mon, MON_DATA_LEVEL) != MAX_LEVEL) + if (sInitialLevel != MAX_LEVEL) { BufferMonStatsToTaskData(mon, arrayPtr); cannotUseEffect = ExecuteTableBasedItemEffect_(gPartyMenu.slotId, *itemPtr, 0); @@ -5009,6 +5016,7 @@ void ItemUseCB_RareCandy(u8 taskId, TaskFunc task) StringExpandPlaceholders(gStringVar4, gText_PkmnElevatedToLvVar2); DisplayPartyMenuMessage(gStringVar4, TRUE); ScheduleBgCopyTilemapToVram(2); + sFinalLevel = GetMonData(mon, MON_DATA_LEVEL, NULL); gTasks[taskId].func = Task_DisplayLevelUpStatsPg1; } } @@ -5067,49 +5075,68 @@ static void DisplayLevelUpStatsPg2(u8 taskId) static void Task_TryLearnNewMoves(u8 taskId) { + u8 i; u16 learnMove; if (WaitFanfare(0) && ((JOY_NEW(A_BUTTON)) || (JOY_NEW(B_BUTTON)))) { RemoveLevelUpStatsWindow(); - learnMove = MonTryLearningNewMove(&gPlayerParty[gPartyMenu.slotId], TRUE); - gPartyMenu.learnMoveState = 1; - switch (learnMove) + for (; sInitialLevel < sFinalLevel; sInitialLevel++) { - case 0: // No moves to learn - PartyMenuTryEvolution(taskId); - break; - case MON_HAS_MAX_MOVES: - DisplayMonNeedsToReplaceMove(taskId); - break; - case MON_ALREADY_KNOWS_MOVE: - gTasks[taskId].func = Task_TryLearningNextMove; - break; - default: - DisplayMonLearnedMove(taskId, learnMove); - break; + SetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_LEVEL, &sInitialLevel); + learnMove = MonTryLearningNewMove(&gPlayerParty[gPartyMenu.slotId], TRUE); + gPartyMenu.learnMoveState = 1; + switch (learnMove) + { + case 0: // No moves to learn + if(sInitialLevel >= sFinalLevel) + PartyMenuTryEvolution(taskId); + break; + case MON_HAS_MAX_MOVES: + DisplayMonNeedsToReplaceMove(taskId); + break; + case MON_ALREADY_KNOWS_MOVE: + gTasks[taskId].func = Task_TryLearningNextMove; + break; + default: + DisplayMonLearnedMove(taskId, learnMove); + break; + } + if (learnMove) + break; } } } static void Task_TryLearningNextMove(u8 taskId) { - u16 result = MonTryLearningNewMove(&gPlayerParty[gPartyMenu.slotId], FALSE); - - switch (result) + u8 i; + u16 result; + for (; sInitialLevel < sFinalLevel; sInitialLevel++) { - case 0: // No moves to learn - PartyMenuTryEvolution(taskId); - break; - case MON_HAS_MAX_MOVES: - DisplayMonNeedsToReplaceMove(taskId); - break; - case MON_ALREADY_KNOWS_MOVE: - return; - default: - DisplayMonLearnedMove(taskId, result); - break; + SetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_LEVEL, &sInitialLevel); + result = MonTryLearningNewMove(&gPlayerParty[gPartyMenu.slotId], FALSE); + gPartyMenu.learnMoveState = 1; + switch (result) + { + case 0: // No moves to learn + if(sInitialLevel >= sFinalLevel) + PartyMenuTryEvolution(taskId); + break; + case MON_HAS_MAX_MOVES: + DisplayMonNeedsToReplaceMove(taskId); + break; + case MON_ALREADY_KNOWS_MOVE: + return; + default: + DisplayMonLearnedMove(taskId, result); + break; + } + if (result) + break; } + if(sInitialLevel >= sFinalLevel) + PartyMenuTryEvolution(taskId); } static void PartyMenuTryEvolution(u8 taskId) diff --git a/src/pokemon.c b/src/pokemon.c index f987b24a89..a064d6acc6 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -4708,6 +4708,11 @@ bool8 ExecuteTableBasedItemEffect(struct Pokemon *mon, u16 item, u8 partyIndex, } \ } +#define ONE_HUNDRED 1 << 4 +#define ONE_THOUSAND 1 << 5 +#define TEN_THOUSAND 1 << 6 +#define FULL_LEVEL 1 << 7 + // Returns TRUE if the item has no effect on the Pokémon, FALSE otherwise bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 moveIndex, bool8 usedByAI) { @@ -4873,11 +4878,6 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov retVal = FALSE; } -#define ONE_HUNDRED 1 << 4 -#define ONE_THOUSAND 1 << 5 -#define TEN_THOUSAND 1 << 6 -#define FULL_LEVEL 1 << 7 - // Rare Candy if ((itemEffect[i] & ITEM3_LEVEL_UP) && GetMonData(mon, MON_DATA_LEVEL, NULL) != MAX_LEVEL) @@ -4902,11 +4902,6 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov retVal = FALSE; } -#undef ONE_HUNDRED -#undef ONE_THOUSAND -#undef TEN_THOUSAND -#undef FULL_LEVEL - // Cure status if ((itemEffect[i] & ITEM3_SLEEP) && HealStatusConditions(mon, partyIndex, STATUS1_SLEEP, battlerId) == 0) @@ -5301,6 +5296,11 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov return retVal; } +#undef ONE_HUNDRED +#undef ONE_THOUSAND +#undef TEN_THOUSAND +#undef FULL_LEVEL + bool8 HealStatusConditions(struct Pokemon *mon, u32 battlePartyId, u32 healMask, u8 battlerId) { u32 status = GetMonData(mon, MON_DATA_STATUS, 0); From d212a136dacfc2f4223186067cd4fbedc824cb7d Mon Sep 17 00:00:00 2001 From: AgustinGDLV Date: Mon, 16 May 2022 13:25:30 -0700 Subject: [PATCH 04/17] clean-up --- src/party_menu.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/party_menu.c b/src/party_menu.c index cef8e617e9..1b1755d0c7 100755 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -5075,7 +5075,6 @@ static void DisplayLevelUpStatsPg2(u8 taskId) static void Task_TryLearnNewMoves(u8 taskId) { - u8 i; u16 learnMove; if (WaitFanfare(0) && ((JOY_NEW(A_BUTTON)) || (JOY_NEW(B_BUTTON)))) @@ -5110,7 +5109,6 @@ static void Task_TryLearnNewMoves(u8 taskId) static void Task_TryLearningNextMove(u8 taskId) { - u8 i; u16 result; for (; sInitialLevel < sFinalLevel; sInitialLevel++) { From 0de15db56417f57c52fbd006519c8650036f1c19 Mon Sep 17 00:00:00 2001 From: AgustinGDLV Date: Mon, 16 May 2022 13:26:26 -0700 Subject: [PATCH 05/17] clean-up --- src/data/pokemon/item_effects.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/data/pokemon/item_effects.h b/src/data/pokemon/item_effects.h index 8892cb66f3..49293889a7 100644 --- a/src/data/pokemon/item_effects.h +++ b/src/data/pokemon/item_effects.h @@ -532,11 +532,11 @@ const u8 *const gItemEffectTable[] = // Candy [ITEM_RARE_CANDY - ITEM_POTION] = gItemEffect_RareCandy, - [ITEM_EXP_CANDY_XS - ITEM_POTION] = gItemEffect_RareCandy, // Todo - [ITEM_EXP_CANDY_S - ITEM_POTION] = gItemEffect_RareCandy, // Todo - [ITEM_EXP_CANDY_M - ITEM_POTION] = gItemEffect_RareCandy, // Todo - [ITEM_EXP_CANDY_L - ITEM_POTION] = gItemEffect_RareCandy, // Todo - [ITEM_EXP_CANDY_XL - ITEM_POTION] = gItemEffect_RareCandy, // Todo + [ITEM_EXP_CANDY_XS - ITEM_POTION] = gItemEffect_RareCandy, + [ITEM_EXP_CANDY_S - ITEM_POTION] = gItemEffect_RareCandy, + [ITEM_EXP_CANDY_M - ITEM_POTION] = gItemEffect_RareCandy, + [ITEM_EXP_CANDY_L - ITEM_POTION] = gItemEffect_RareCandy, + [ITEM_EXP_CANDY_XL - ITEM_POTION] = gItemEffect_RareCandy, //[ITEM_DYNAMAX_CANDY - ITEM_POTION] = gItemEffect_DynamaxCandy, // Todo // Medicinal Flutes From 6cb152e45271884603c32d7e227ebeb01261defd Mon Sep 17 00:00:00 2001 From: AgustinGDLV Date: Mon, 16 May 2022 13:51:28 -0700 Subject: [PATCH 06/17] removing nonessential stuff --- src/party_menu.c | 12 +++--------- src/pokemon.c | 2 ++ 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/src/party_menu.c b/src/party_menu.c index 1b1755d0c7..f0069300bf 100755 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -4824,10 +4824,7 @@ static void Task_LearnNextMoveOrClosePartyMenu(u8 taskId) if (IsFanfareTaskInactive() && ((JOY_NEW(A_BUTTON)) || (JOY_NEW(B_BUTTON)))) { if (gPartyMenu.learnMoveState == 1) - if (sInitialLevel < sFinalLevel) - Task_TryLearnNewMoves(taskId); - else - Task_TryLearningNextMove(taskId); + Task_TryLearningNextMove(taskId); else { if (gPartyMenu.learnMoveState == 2) // never occurs @@ -5088,7 +5085,7 @@ static void Task_TryLearnNewMoves(u8 taskId) switch (learnMove) { case 0: // No moves to learn - if(sInitialLevel >= sFinalLevel) + if (sInitialLevel >= sFinalLevel) PartyMenuTryEvolution(taskId); break; case MON_HAS_MAX_MOVES: @@ -5114,12 +5111,9 @@ static void Task_TryLearningNextMove(u8 taskId) { SetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_LEVEL, &sInitialLevel); result = MonTryLearningNewMove(&gPlayerParty[gPartyMenu.slotId], FALSE); - gPartyMenu.learnMoveState = 1; switch (result) { case 0: // No moves to learn - if(sInitialLevel >= sFinalLevel) - PartyMenuTryEvolution(taskId); break; case MON_HAS_MAX_MOVES: DisplayMonNeedsToReplaceMove(taskId); @@ -5133,7 +5127,7 @@ static void Task_TryLearningNextMove(u8 taskId) if (result) break; } - if(sInitialLevel >= sFinalLevel) + if (sInitialLevel >= sFinalLevel) PartyMenuTryEvolution(taskId); } diff --git a/src/pokemon.c b/src/pokemon.c index a064d6acc6..953278846a 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -4883,7 +4883,9 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov && GetMonData(mon, MON_DATA_LEVEL, NULL) != MAX_LEVEL) { if (ItemId_GetHoldEffectParam(item) & FULL_LEVEL) + { dataUnsigned = gExperienceTables[gBaseStats[GetMonData(mon, MON_DATA_SPECIES, NULL)].growthRate][GetMonData(mon, MON_DATA_LEVEL, NULL) + 1]; + } else { temp1 = ItemId_GetHoldEffectParam(item) & 0x0F; From 01665c0213fd52219d6b9b118295dca3a3ac5f27 Mon Sep 17 00:00:00 2001 From: AgustinGDLV Date: Mon, 16 May 2022 13:52:38 -0700 Subject: [PATCH 07/17] reverted todo for dynamax candy --- src/data/items.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/items.h b/src/data/items.h index 12ca812475..af62f0abed 100644 --- a/src/data/items.h +++ b/src/data/items.h @@ -1445,7 +1445,7 @@ const struct Item gItems[] = .description = sDynamaxCandyDesc, .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, - .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .fieldUseFunc = ItemUseOutOfBattle_CannotUse, // Todo .flingPower = 30, }, From bd008e4c80515c4d299b9ba98f9ed689bb2b2fe7 Mon Sep 17 00:00:00 2001 From: AgustinGDLV Date: Mon, 16 May 2022 15:25:13 -0700 Subject: [PATCH 08/17] fixed softlocks / messages --- include/strings.h | 1 + src/party_menu.c | 31 ++++++++++++++++++++++--------- src/strings.c | 1 + 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/include/strings.h b/include/strings.h index a22aa307bb..f3a86eb464 100644 --- a/include/strings.h +++ b/include/strings.h @@ -498,6 +498,7 @@ extern const u8 gText_12PoofForgotMove[]; extern const u8 gText_StopLearningMove2[]; extern const u8 gText_MoveNotLearned[]; extern const u8 gText_PkmnElevatedToLvVar2[]; +extern const u8 gText_PkmnGainedExp[]; extern const u8 gText_RemoveMailBeforeItem[]; extern const u8 gText_PkmnHoldingItemCantHoldMail[]; extern const u8 gText_MailTransferredFromMailbox[]; diff --git a/src/party_menu.c b/src/party_menu.c index f0069300bf..07d4d9a155 100755 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -5004,17 +5004,29 @@ void ItemUseCB_RareCandy(u8 taskId, TaskFunc task) } else { + sFinalLevel = GetMonData(mon, MON_DATA_LEVEL, NULL); gPartyMenuUseExitCallback = TRUE; - PlayFanfareByFanfareNum(FANFARE_LEVEL_UP); UpdateMonDisplayInfoAfterRareCandy(gPartyMenu.slotId, mon); RemoveBagItem(gSpecialVar_ItemId, 1); GetMonNickname(mon, gStringVar1); - ConvertIntToDecimalStringN(gStringVar2, GetMonData(mon, MON_DATA_LEVEL), STR_CONV_MODE_LEFT_ALIGN, 3); - StringExpandPlaceholders(gStringVar4, gText_PkmnElevatedToLvVar2); - DisplayPartyMenuMessage(gStringVar4, TRUE); - ScheduleBgCopyTilemapToVram(2); - sFinalLevel = GetMonData(mon, MON_DATA_LEVEL, NULL); - gTasks[taskId].func = Task_DisplayLevelUpStatsPg1; + if (sFinalLevel > sInitialLevel) + { + PlayFanfareByFanfareNum(FANFARE_LEVEL_UP); + ConvertIntToDecimalStringN(gStringVar2, GetMonData(mon, MON_DATA_LEVEL), STR_CONV_MODE_LEFT_ALIGN, 3); + StringExpandPlaceholders(gStringVar4, gText_PkmnElevatedToLvVar2); + DisplayPartyMenuMessage(gStringVar4, TRUE); + ScheduleBgCopyTilemapToVram(2); + gTasks[taskId].func = Task_DisplayLevelUpStatsPg1; + } + else + { + PlaySE(SE_USE_ITEM); + gPartyMenuUseExitCallback = FALSE; + StringExpandPlaceholders(gStringVar4, gText_PkmnGainedExp); + DisplayPartyMenuMessage(gStringVar4, FALSE); + ScheduleBgCopyTilemapToVram(2); + gTasks[taskId].func = task; + } } } @@ -5047,6 +5059,7 @@ static void Task_DisplayLevelUpStatsPg2(u8 taskId) { PlaySE(SE_SELECT); DisplayLevelUpStatsPg2(taskId); + sInitialLevel += 1; // so the Pokemon doesn't learn a move meant for its previous level gTasks[taskId].func = Task_TryLearnNewMoves; } } @@ -5077,7 +5090,7 @@ static void Task_TryLearnNewMoves(u8 taskId) if (WaitFanfare(0) && ((JOY_NEW(A_BUTTON)) || (JOY_NEW(B_BUTTON)))) { RemoveLevelUpStatsWindow(); - for (; sInitialLevel < sFinalLevel; sInitialLevel++) + for (; sInitialLevel <= sFinalLevel; sInitialLevel++) { SetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_LEVEL, &sInitialLevel); learnMove = MonTryLearningNewMove(&gPlayerParty[gPartyMenu.slotId], TRUE); @@ -5107,7 +5120,7 @@ static void Task_TryLearnNewMoves(u8 taskId) static void Task_TryLearningNextMove(u8 taskId) { u16 result; - for (; sInitialLevel < sFinalLevel; sInitialLevel++) + for (; sInitialLevel <= sFinalLevel; sInitialLevel++) { SetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_LEVEL, &sInitialLevel); result = MonTryLearningNewMove(&gPlayerParty[gPartyMenu.slotId], FALSE); diff --git a/src/strings.c b/src/strings.c index 492a9601d2..731cde1a36 100644 --- a/src/strings.c +++ b/src/strings.c @@ -417,6 +417,7 @@ const u8 gText_PkmnRegainhedHealth[] = _("{STR_VAR_1} regained health.{PAUSE_UNT const u8 gText_PkmnBecameHealthy[] = _("{STR_VAR_1} became healthy.{PAUSE_UNTIL_PRESS}"); const u8 gText_MovesPPIncreased[] = _("{STR_VAR_1}'s PP increased.{PAUSE_UNTIL_PRESS}"); const u8 gText_PkmnElevatedToLvVar2[] = _("{STR_VAR_1} was elevated to\nLv. {STR_VAR_2}."); +const u8 gText_PkmnGainedExp[] = _("{STR_VAR_1} gained EXP. POINTS.{PAUSE_UNTIL_PRESS}"); const u8 gText_PkmnBaseVar2StatIncreased[] = _("{STR_VAR_1}'s base {STR_VAR_2}\nstat was raised.{PAUSE_UNTIL_PRESS}"); const u8 gText_PkmnFriendlyBaseVar2Fell[] = _("{STR_VAR_1} turned friendly.\nThe base {STR_VAR_2} fell!{PAUSE_UNTIL_PRESS}"); const u8 gText_PkmnAdoresBaseVar2Fell[] = _("{STR_VAR_1} adores you!\nThe base {STR_VAR_2} fell!{PAUSE_UNTIL_PRESS}"); From d385b838c8fd6ca32f35a4327dc17f9d2a7434b3 Mon Sep 17 00:00:00 2001 From: AgustinGDLV Date: Mon, 16 May 2022 15:53:42 -0700 Subject: [PATCH 09/17] fixed exp resetting --- src/pokemon.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pokemon.c b/src/pokemon.c index 953278846a..7cb72b37f6 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -4895,7 +4895,7 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov temp1 *= 1000; if (ItemId_GetHoldEffectParam(item) & TEN_THOUSAND) temp1 *= 10000; - dataUnsigned = temp1 + gExperienceTables[gBaseStats[GetMonData(mon, MON_DATA_SPECIES, NULL)].growthRate][GetMonData(mon, MON_DATA_LEVEL, NULL)]; + dataUnsigned = temp1 + GetMonData(mon, MON_DATA_EXP, NULL); if (dataUnsigned > gExperienceTables[gBaseStats[GetMonData(mon, MON_DATA_SPECIES, NULL)].growthRate][MAX_LEVEL]) dataUnsigned = gExperienceTables[gBaseStats[GetMonData(mon, MON_DATA_SPECIES, NULL)].growthRate][MAX_LEVEL]; } From b197da077f6c14a1108f50aa643c556a12fc071e Mon Sep 17 00:00:00 2001 From: AgustinGDLV <103095241+AgustinGDLV@users.noreply.github.com> Date: Mon, 16 May 2022 16:08:26 -0700 Subject: [PATCH 10/17] Update src/strings.c Co-authored-by: LOuroboros --- src/strings.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings.c b/src/strings.c index 731cde1a36..edd9522072 100644 --- a/src/strings.c +++ b/src/strings.c @@ -417,7 +417,7 @@ const u8 gText_PkmnRegainhedHealth[] = _("{STR_VAR_1} regained health.{PAUSE_UNT const u8 gText_PkmnBecameHealthy[] = _("{STR_VAR_1} became healthy.{PAUSE_UNTIL_PRESS}"); const u8 gText_MovesPPIncreased[] = _("{STR_VAR_1}'s PP increased.{PAUSE_UNTIL_PRESS}"); const u8 gText_PkmnElevatedToLvVar2[] = _("{STR_VAR_1} was elevated to\nLv. {STR_VAR_2}."); -const u8 gText_PkmnGainedExp[] = _("{STR_VAR_1} gained EXP. POINTS.{PAUSE_UNTIL_PRESS}"); +const u8 gText_PkmnGainedExp[] = _("{STR_VAR_1} gained Exp. Points!{PAUSE_UNTIL_PRESS}"); const u8 gText_PkmnBaseVar2StatIncreased[] = _("{STR_VAR_1}'s base {STR_VAR_2}\nstat was raised.{PAUSE_UNTIL_PRESS}"); const u8 gText_PkmnFriendlyBaseVar2Fell[] = _("{STR_VAR_1} turned friendly.\nThe base {STR_VAR_2} fell!{PAUSE_UNTIL_PRESS}"); const u8 gText_PkmnAdoresBaseVar2Fell[] = _("{STR_VAR_1} adores you!\nThe base {STR_VAR_2} fell!{PAUSE_UNTIL_PRESS}"); From 2d25cd56b987062357806ca1ba652abe78b89e39 Mon Sep 17 00:00:00 2001 From: AgustinGDLV <103095241+AgustinGDLV@users.noreply.github.com> Date: Mon, 16 May 2022 16:58:08 -0700 Subject: [PATCH 11/17] Apply suggestions from code review Co-authored-by: sneed <56992013+Sneed69@users.noreply.github.com> --- src/pokemon.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/pokemon.c b/src/pokemon.c index 7cb72b37f6..095d7f414b 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -4885,9 +4885,13 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov if (ItemId_GetHoldEffectParam(item) & FULL_LEVEL) { dataUnsigned = gExperienceTables[gBaseStats[GetMonData(mon, MON_DATA_SPECIES, NULL)].growthRate][GetMonData(mon, MON_DATA_LEVEL, NULL) + 1]; + SetMonData(mon, MON_DATA_EXP, &dataUnsigned); + CalculateMonStats(mon); } else { + u32 species = GetMonData(mon, MON_DATA_SPECIES, NULL); + temp1 = ItemId_GetHoldEffectParam(item) & 0x0F; if (ItemId_GetHoldEffectParam(item) & ONE_HUNDRED) temp1 *= 100; @@ -4896,11 +4900,12 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov if (ItemId_GetHoldEffectParam(item) & TEN_THOUSAND) temp1 *= 10000; dataUnsigned = temp1 + GetMonData(mon, MON_DATA_EXP, NULL); - if (dataUnsigned > gExperienceTables[gBaseStats[GetMonData(mon, MON_DATA_SPECIES, NULL)].growthRate][MAX_LEVEL]) - dataUnsigned = gExperienceTables[gBaseStats[GetMonData(mon, MON_DATA_SPECIES, NULL)].growthRate][MAX_LEVEL]; + if (dataUnsigned > gExperienceTables[gBaseStats[species].growthRate][MAX_LEVEL]) + dataUnsigned = gExperienceTables[gBaseStats[species].growthRate][MAX_LEVEL]; + SetMonData(mon, MON_DATA_EXP, &dataUnsigned); + if (dataUnsigned >= gExperienceTables[gBaseStats[species].growthRate][GetMonData(mon, MON_DATA_LEVEL, NULL) + 1]) + CalculateMonStats(mon); } - SetMonData(mon, MON_DATA_EXP, &dataUnsigned); - CalculateMonStats(mon); retVal = FALSE; } From e9669ccbfeaef5cfd03ae37298af0f88dd8d311a Mon Sep 17 00:00:00 2001 From: AgustinGDLV <103095241+AgustinGDLV@users.noreply.github.com> Date: Mon, 16 May 2022 17:41:18 -0700 Subject: [PATCH 12/17] Update src/pokemon.c Co-authored-by: sneed <56992013+Sneed69@users.noreply.github.com> --- src/pokemon.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pokemon.c b/src/pokemon.c index 095d7f414b..d0f4f8a717 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -4892,6 +4892,7 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov { u32 species = GetMonData(mon, MON_DATA_SPECIES, NULL); + gBattleScripting.levelUpHP = 0; // Prevents reviving mons that don't level up. temp1 = ItemId_GetHoldEffectParam(item) & 0x0F; if (ItemId_GetHoldEffectParam(item) & ONE_HUNDRED) temp1 *= 100; From 9c73cb322e83deb528a58d58223b2a5d0ce9320e Mon Sep 17 00:00:00 2001 From: AgustinGDLV Date: Wed, 20 Jul 2022 10:48:09 -0700 Subject: [PATCH 13/17] replaced bitfield with LUT --- src/data/items.h | 22 ++++++---------------- src/pokemon.c | 28 ++++++++-------------------- 2 files changed, 14 insertions(+), 36 deletions(-) diff --git a/src/data/items.h b/src/data/items.h index af62f0abed..8d08f0fde8 100644 --- a/src/data/items.h +++ b/src/data/items.h @@ -1354,17 +1354,12 @@ const struct Item gItems[] = // Candy -#define ONE_HUNDRED 1 << 4 -#define ONE_THOUSAND 1 << 5 -#define TEN_THOUSAND 1 << 6 -#define FULL_LEVEL 1 << 7 - [ITEM_RARE_CANDY] = { .name = _("Rare Candy"), .itemId = ITEM_RARE_CANDY, .price = 10000, - .holdEffectParam = FULL_LEVEL, + .holdEffectParam = 0xFF, .description = sRareCandyDesc, .pocket = POCKET_ITEMS, .type = ITEM_USE_PARTY_MENU, @@ -1377,7 +1372,7 @@ const struct Item gItems[] = .name = _("Exp.Candy XS"), .itemId = ITEM_EXP_CANDY_XS, .price = 20, - .holdEffectParam = 1 | ONE_HUNDRED, + .holdEffectParam = 0, .description = sExpCandyXSDesc, .pocket = POCKET_ITEMS, .type = ITEM_USE_PARTY_MENU, @@ -1390,7 +1385,7 @@ const struct Item gItems[] = .name = _("Exp.Candy S"), .itemId = ITEM_EXP_CANDY_S, .price = 240, - .holdEffectParam = 8 | ONE_HUNDRED, + .holdEffectParam = 1, .description = sExpCandyXSDesc, .pocket = POCKET_ITEMS, .type = ITEM_USE_PARTY_MENU, @@ -1403,7 +1398,7 @@ const struct Item gItems[] = .name = _("Exp.Candy M"), .itemId = ITEM_EXP_CANDY_M, .price = 1000, - .holdEffectParam = 3 | ONE_THOUSAND, + .holdEffectParam = 2, .description = sExpCandyMDesc, .pocket = POCKET_ITEMS, .type = ITEM_USE_PARTY_MENU, @@ -1416,7 +1411,7 @@ const struct Item gItems[] = .name = _("Exp.Candy L"), .itemId = ITEM_EXP_CANDY_L, .price = 3000, - .holdEffectParam = 1 | TEN_THOUSAND, + .holdEffectParam = 3, .description = sExpCandyLDesc, .pocket = POCKET_ITEMS, .type = ITEM_USE_PARTY_MENU, @@ -1429,7 +1424,7 @@ const struct Item gItems[] = .name = _("Exp.Candy XL"), .itemId = ITEM_EXP_CANDY_XL, .price = 10000, - .holdEffectParam = 3 | TEN_THOUSAND, + .holdEffectParam = 4, .description = sExpCandyXLDesc, .pocket = POCKET_ITEMS, .type = ITEM_USE_PARTY_MENU, @@ -1449,11 +1444,6 @@ const struct Item gItems[] = .flingPower = 30, }, -#undef ONE_HUNDRED -#undef ONE_THOUSAND -#undef TEN_THOUSAND -#undef FULL_LEVEL - // Medicinal Flutes [ITEM_BLUE_FLUTE] = diff --git a/src/pokemon.c b/src/pokemon.c index 7cb72b37f6..9ebfcd1a57 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -4708,10 +4708,9 @@ bool8 ExecuteTableBasedItemEffect(struct Pokemon *mon, u16 item, u8 partyIndex, } \ } -#define ONE_HUNDRED 1 << 4 -#define ONE_THOUSAND 1 << 5 -#define TEN_THOUSAND 1 << 6 -#define FULL_LEVEL 1 << 7 +// EXP candies store an index for this table in their holdEffectParam. +#define NUM_EXP_CANDY_SIZES 5 +static const u32 sExpCandyExperienceTable[] = {100, 800, 3000, 10000, 30000}; // Returns TRUE if the item has no effect on the Pokémon, FALSE otherwise bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 moveIndex, bool8 usedByAI) @@ -4878,24 +4877,18 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov retVal = FALSE; } - // Rare Candy + // Rare Candy / EXP Candy if ((itemEffect[i] & ITEM3_LEVEL_UP) && GetMonData(mon, MON_DATA_LEVEL, NULL) != MAX_LEVEL) { - if (ItemId_GetHoldEffectParam(item) & FULL_LEVEL) + u8 param = ItemId_GetHoldEffectParam(item); + if (param == 0xFF) // Rare Candy { dataUnsigned = gExperienceTables[gBaseStats[GetMonData(mon, MON_DATA_SPECIES, NULL)].growthRate][GetMonData(mon, MON_DATA_LEVEL, NULL) + 1]; } - else + else if (param < NUM_EXP_CANDY_SIZES) // EXP Candies { - temp1 = ItemId_GetHoldEffectParam(item) & 0x0F; - if (ItemId_GetHoldEffectParam(item) & ONE_HUNDRED) - temp1 *= 100; - if (ItemId_GetHoldEffectParam(item) & ONE_THOUSAND) - temp1 *= 1000; - if (ItemId_GetHoldEffectParam(item) & TEN_THOUSAND) - temp1 *= 10000; - dataUnsigned = temp1 + GetMonData(mon, MON_DATA_EXP, NULL); + dataUnsigned = sExpCandyExperienceTable[param] + GetMonData(mon, MON_DATA_EXP, NULL); if (dataUnsigned > gExperienceTables[gBaseStats[GetMonData(mon, MON_DATA_SPECIES, NULL)].growthRate][MAX_LEVEL]) dataUnsigned = gExperienceTables[gBaseStats[GetMonData(mon, MON_DATA_SPECIES, NULL)].growthRate][MAX_LEVEL]; } @@ -5298,11 +5291,6 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov return retVal; } -#undef ONE_HUNDRED -#undef ONE_THOUSAND -#undef TEN_THOUSAND -#undef FULL_LEVEL - bool8 HealStatusConditions(struct Pokemon *mon, u32 battlePartyId, u32 healMask, u8 battlerId) { u32 status = GetMonData(mon, MON_DATA_STATUS, 0); From a5e742afcd78d98cdc94f3d4526a993777314669 Mon Sep 17 00:00:00 2001 From: AgustinGDLV Date: Fri, 12 Aug 2022 12:00:05 -0700 Subject: [PATCH 14/17] implemented review changes --- src/pokemon.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/pokemon.c b/src/pokemon.c index 854c4c2b29..ca519729d5 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -4709,7 +4709,6 @@ bool8 ExecuteTableBasedItemEffect(struct Pokemon *mon, u16 item, u8 partyIndex, } // EXP candies store an index for this table in their holdEffectParam. -#define NUM_EXP_CANDY_SIZES 5 static const u32 sExpCandyExperienceTable[] = {100, 800, 3000, 10000, 30000}; // Returns TRUE if the item has no effect on the Pokémon, FALSE otherwise @@ -4885,15 +4884,15 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov if (param == 0xFF) // Rare Candy { dataUnsigned = gExperienceTables[gBaseStats[GetMonData(mon, MON_DATA_SPECIES, NULL)].growthRate][GetMonData(mon, MON_DATA_LEVEL, NULL) + 1]; - SetMonData(mon, MON_DATA_EXP, &dataUnsigned); - CalculateMonStats(mon); } - else if (param < NUM_EXP_CANDY_SIZES) // EXP Candies + else if (param < ARRAY_COUNT(sExpCandyExperienceTable)) // EXP Candies { dataUnsigned = sExpCandyExperienceTable[param] + GetMonData(mon, MON_DATA_EXP, NULL); if (dataUnsigned > gExperienceTables[gBaseStats[GetMonData(mon, MON_DATA_SPECIES, NULL)].growthRate][MAX_LEVEL]) dataUnsigned = gExperienceTables[gBaseStats[GetMonData(mon, MON_DATA_SPECIES, NULL)].growthRate][MAX_LEVEL]; } + SetMonData(mon, MON_DATA_EXP, &dataUnsigned); + CalculateMonStats(mon); retVal = FALSE; } From e204527f439824689bb873e2f451cf2321e5025f Mon Sep 17 00:00:00 2001 From: AgustinGDLV Date: Thu, 25 Aug 2022 15:52:47 -0700 Subject: [PATCH 15/17] changed candy item parameters --- include/constants/items.h | 7 +++++++ src/data/items.h | 12 ++++++------ src/party_menu.c | 2 +- src/pokemon.c | 15 +++++++++++---- 4 files changed, 25 insertions(+), 11 deletions(-) diff --git a/include/constants/items.h b/include/constants/items.h index 5413a7afef..b6dbc7329b 100644 --- a/include/constants/items.h +++ b/include/constants/items.h @@ -973,6 +973,13 @@ #define MACH_BIKE 0 #define ACRO_BIKE 1 +// Item parameters for EXP Candies +#define EXP_100 1 +#define EXP_800 2 +#define EXP_3000 3 +#define EXP_10000 4 +#define EXP_30000 5 + // Item type IDs (used to determine the exit callback) #define ITEM_USE_MAIL 0 #define ITEM_USE_PARTY_MENU 1 diff --git a/src/data/items.h b/src/data/items.h index 8d08f0fde8..f4be3c6dcb 100644 --- a/src/data/items.h +++ b/src/data/items.h @@ -1359,7 +1359,7 @@ const struct Item gItems[] = .name = _("Rare Candy"), .itemId = ITEM_RARE_CANDY, .price = 10000, - .holdEffectParam = 0xFF, + .holdEffectParam = 0, .description = sRareCandyDesc, .pocket = POCKET_ITEMS, .type = ITEM_USE_PARTY_MENU, @@ -1372,7 +1372,7 @@ const struct Item gItems[] = .name = _("Exp.Candy XS"), .itemId = ITEM_EXP_CANDY_XS, .price = 20, - .holdEffectParam = 0, + .holdEffectParam = EXP_100, .description = sExpCandyXSDesc, .pocket = POCKET_ITEMS, .type = ITEM_USE_PARTY_MENU, @@ -1385,7 +1385,7 @@ const struct Item gItems[] = .name = _("Exp.Candy S"), .itemId = ITEM_EXP_CANDY_S, .price = 240, - .holdEffectParam = 1, + .holdEffectParam = EXP_800, .description = sExpCandyXSDesc, .pocket = POCKET_ITEMS, .type = ITEM_USE_PARTY_MENU, @@ -1398,7 +1398,7 @@ const struct Item gItems[] = .name = _("Exp.Candy M"), .itemId = ITEM_EXP_CANDY_M, .price = 1000, - .holdEffectParam = 2, + .holdEffectParam = EXP_3000, .description = sExpCandyMDesc, .pocket = POCKET_ITEMS, .type = ITEM_USE_PARTY_MENU, @@ -1411,7 +1411,7 @@ const struct Item gItems[] = .name = _("Exp.Candy L"), .itemId = ITEM_EXP_CANDY_L, .price = 3000, - .holdEffectParam = 3, + .holdEffectParam = EXP_10000, .description = sExpCandyLDesc, .pocket = POCKET_ITEMS, .type = ITEM_USE_PARTY_MENU, @@ -1424,7 +1424,7 @@ const struct Item gItems[] = .name = _("Exp.Candy XL"), .itemId = ITEM_EXP_CANDY_XL, .price = 10000, - .holdEffectParam = 4, + .holdEffectParam = EXP_30000, .description = sExpCandyXLDesc, .pocket = POCKET_ITEMS, .type = ITEM_USE_PARTY_MENU, diff --git a/src/party_menu.c b/src/party_menu.c index 07d4d9a155..abfcc05512 100755 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -5012,7 +5012,7 @@ void ItemUseCB_RareCandy(u8 taskId, TaskFunc task) if (sFinalLevel > sInitialLevel) { PlayFanfareByFanfareNum(FANFARE_LEVEL_UP); - ConvertIntToDecimalStringN(gStringVar2, GetMonData(mon, MON_DATA_LEVEL), STR_CONV_MODE_LEFT_ALIGN, 3); + ConvertIntToDecimalStringN(gStringVar2, sFinalLevel, STR_CONV_MODE_LEFT_ALIGN, 3); StringExpandPlaceholders(gStringVar4, gText_PkmnElevatedToLvVar2); DisplayPartyMenuMessage(gStringVar4, TRUE); ScheduleBgCopyTilemapToVram(2); diff --git a/src/pokemon.c b/src/pokemon.c index ca519729d5..956a870686 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -4709,7 +4709,13 @@ bool8 ExecuteTableBasedItemEffect(struct Pokemon *mon, u16 item, u8 partyIndex, } // EXP candies store an index for this table in their holdEffectParam. -static const u32 sExpCandyExperienceTable[] = {100, 800, 3000, 10000, 30000}; +static const u32 sExpCandyExperienceTable[] = { + [EXP_100 - 1] = 100, + [EXP_800 - 1] = 800, + [EXP_3000 - 1] = 3000, + [EXP_10000 - 1] = 10000, + [EXP_30000 - 1] = 30000, +}; // Returns TRUE if the item has no effect on the Pokémon, FALSE otherwise bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 moveIndex, bool8 usedByAI) @@ -4881,15 +4887,16 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov && GetMonData(mon, MON_DATA_LEVEL, NULL) != MAX_LEVEL) { u8 param = ItemId_GetHoldEffectParam(item); - if (param == 0xFF) // Rare Candy + if (param == 0) // Rare Candy { dataUnsigned = gExperienceTables[gBaseStats[GetMonData(mon, MON_DATA_SPECIES, NULL)].growthRate][GetMonData(mon, MON_DATA_LEVEL, NULL) + 1]; } else if (param < ARRAY_COUNT(sExpCandyExperienceTable)) // EXP Candies { + u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); dataUnsigned = sExpCandyExperienceTable[param] + GetMonData(mon, MON_DATA_EXP, NULL); - if (dataUnsigned > gExperienceTables[gBaseStats[GetMonData(mon, MON_DATA_SPECIES, NULL)].growthRate][MAX_LEVEL]) - dataUnsigned = gExperienceTables[gBaseStats[GetMonData(mon, MON_DATA_SPECIES, NULL)].growthRate][MAX_LEVEL]; + if (dataUnsigned > gExperienceTables[gBaseStats[species].growthRate][MAX_LEVEL]) + dataUnsigned = gExperienceTables[gBaseStats[species].growthRate][MAX_LEVEL]; } SetMonData(mon, MON_DATA_EXP, &dataUnsigned); CalculateMonStats(mon); From 6b414d9555d443e6de28805ab2d64bfb5f3c94ec Mon Sep 17 00:00:00 2001 From: Eduardo Quezada D'Ottone Date: Thu, 25 Aug 2022 22:40:19 -0400 Subject: [PATCH 16/17] Apply suggestions from code review Co-authored-by: LOuroboros --- include/constants/items.h | 6 +++--- src/data/items.h | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/include/constants/items.h b/include/constants/items.h index b6dbc7329b..1448bf5914 100644 --- a/include/constants/items.h +++ b/include/constants/items.h @@ -974,9 +974,9 @@ #define ACRO_BIKE 1 // Item parameters for EXP Candies -#define EXP_100 1 -#define EXP_800 2 -#define EXP_3000 3 +#define EXP_100 1 +#define EXP_800 2 +#define EXP_3000 3 #define EXP_10000 4 #define EXP_30000 5 diff --git a/src/data/items.h b/src/data/items.h index f4be3c6dcb..ccd6aaee28 100644 --- a/src/data/items.h +++ b/src/data/items.h @@ -1359,7 +1359,6 @@ const struct Item gItems[] = .name = _("Rare Candy"), .itemId = ITEM_RARE_CANDY, .price = 10000, - .holdEffectParam = 0, .description = sRareCandyDesc, .pocket = POCKET_ITEMS, .type = ITEM_USE_PARTY_MENU, From 57d583b783a2e8cc77ccc927b2a39f43060613dd Mon Sep 17 00:00:00 2001 From: Eduardo Quezada D'Ottone Date: Thu, 25 Aug 2022 22:49:23 -0400 Subject: [PATCH 17/17] Fixed call to sExpCandyExperienceTable --- src/pokemon.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pokemon.c b/src/pokemon.c index 956a870686..35522c9ab1 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -4894,7 +4894,7 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov else if (param < ARRAY_COUNT(sExpCandyExperienceTable)) // EXP Candies { u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); - dataUnsigned = sExpCandyExperienceTable[param] + GetMonData(mon, MON_DATA_EXP, NULL); + dataUnsigned = sExpCandyExperienceTable[param - 1] + GetMonData(mon, MON_DATA_EXP, NULL); if (dataUnsigned > gExperienceTables[gBaseStats[species].growthRate][MAX_LEVEL]) dataUnsigned = gExperienceTables[gBaseStats[species].growthRate][MAX_LEVEL]; }