Merge pull request #2282 from AsparagusEduardo/RHH/pr/tutorFix
Exp Candy Fixes
This commit is contained in:
commit
7825153bb2
5 changed files with 48 additions and 11 deletions
|
@ -409,6 +409,7 @@ extern const u16 gLinkPlayerFacilityClasses[];
|
||||||
extern const struct SpriteTemplate gBattlerSpriteTemplates[];
|
extern const struct SpriteTemplate gBattlerSpriteTemplates[];
|
||||||
extern const s8 gNatureStatTable[][5];
|
extern const s8 gNatureStatTable[][5];
|
||||||
extern const u16 *const gFormSpeciesIdTables[NUM_SPECIES];
|
extern const u16 *const gFormSpeciesIdTables[NUM_SPECIES];
|
||||||
|
extern const u32 sExpCandyExperienceTable[];
|
||||||
|
|
||||||
void ZeroBoxMonData(struct BoxPokemon *boxMon);
|
void ZeroBoxMonData(struct BoxPokemon *boxMon);
|
||||||
void ZeroMonData(struct Pokemon *mon);
|
void ZeroMonData(struct Pokemon *mon);
|
||||||
|
|
|
@ -500,6 +500,7 @@ extern const u8 gText_StopLearningMove2[];
|
||||||
extern const u8 gText_MoveNotLearned[];
|
extern const u8 gText_MoveNotLearned[];
|
||||||
extern const u8 gText_PkmnElevatedToLvVar2[];
|
extern const u8 gText_PkmnElevatedToLvVar2[];
|
||||||
extern const u8 gText_PkmnGainedExp[];
|
extern const u8 gText_PkmnGainedExp[];
|
||||||
|
extern const u8 gText_PkmnGainedExpAndElevatedToLvVar3[];
|
||||||
extern const u8 gText_RemoveMailBeforeItem[];
|
extern const u8 gText_RemoveMailBeforeItem[];
|
||||||
extern const u8 gText_PkmnHoldingItemCantHoldMail[];
|
extern const u8 gText_PkmnHoldingItemCantHoldMail[];
|
||||||
extern const u8 gText_MailTransferredFromMailbox[];
|
extern const u8 gText_MailTransferredFromMailbox[];
|
||||||
|
|
|
@ -5040,7 +5040,8 @@ static void CB2_ShowSummaryScreenToForgetMove(void)
|
||||||
|
|
||||||
static void CB2_ReturnToPartyMenuWhileLearningMove(void)
|
static void CB2_ReturnToPartyMenuWhileLearningMove(void)
|
||||||
{
|
{
|
||||||
SetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_LEVEL, &sFinalLevel); // to avoid displaying incorrect level
|
if (sFinalLevel != 0)
|
||||||
|
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);
|
InitPartyMenu(PARTY_MENU_TYPE_FIELD, PARTY_LAYOUT_SINGLE, PARTY_ACTION_CHOOSE_MON, TRUE, PARTY_MSG_NONE, Task_ReturnToPartyMenuWhileLearningMove, gPartyMenu.exitCallback);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5139,6 +5140,16 @@ static void Task_TryLearningNextMoveAfterText(u8 taskId)
|
||||||
Task_TryLearningNextMove(taskId);
|
Task_TryLearningNextMove(taskId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void DisplayExpPoints(u8 taskId, TaskFunc task, u8 holdEffectParam)
|
||||||
|
{
|
||||||
|
PlaySE(SE_USE_ITEM);
|
||||||
|
ConvertIntToDecimalStringN(gStringVar2, sExpCandyExperienceTable[holdEffectParam], STR_CONV_MODE_LEFT_ALIGN, 3);
|
||||||
|
StringExpandPlaceholders(gStringVar4, gText_PkmnGainedExp);
|
||||||
|
DisplayPartyMenuMessage(gStringVar4, FALSE);
|
||||||
|
ScheduleBgCopyTilemapToVram(2);
|
||||||
|
gTasks[taskId].func = task;
|
||||||
|
}
|
||||||
|
|
||||||
void ItemUseCB_RareCandy(u8 taskId, TaskFunc task)
|
void ItemUseCB_RareCandy(u8 taskId, TaskFunc task)
|
||||||
{
|
{
|
||||||
struct Pokemon *mon = &gPlayerParty[gPartyMenu.slotId];
|
struct Pokemon *mon = &gPlayerParty[gPartyMenu.slotId];
|
||||||
|
@ -5146,6 +5157,7 @@ void ItemUseCB_RareCandy(u8 taskId, TaskFunc task)
|
||||||
s16 *arrayPtr = ptr->data;
|
s16 *arrayPtr = ptr->data;
|
||||||
u16 *itemPtr = &gSpecialVar_ItemId;
|
u16 *itemPtr = &gSpecialVar_ItemId;
|
||||||
bool8 cannotUseEffect;
|
bool8 cannotUseEffect;
|
||||||
|
u8 holdEffectParam = ItemId_GetHoldEffectParam(*itemPtr);
|
||||||
sInitialLevel = GetMonData(mon, MON_DATA_LEVEL);
|
sInitialLevel = GetMonData(mon, MON_DATA_LEVEL);
|
||||||
|
|
||||||
if (sInitialLevel != MAX_LEVEL)
|
if (sInitialLevel != MAX_LEVEL)
|
||||||
|
@ -5176,8 +5188,18 @@ void ItemUseCB_RareCandy(u8 taskId, TaskFunc task)
|
||||||
if (sFinalLevel > sInitialLevel)
|
if (sFinalLevel > sInitialLevel)
|
||||||
{
|
{
|
||||||
PlayFanfareByFanfareNum(FANFARE_LEVEL_UP);
|
PlayFanfareByFanfareNum(FANFARE_LEVEL_UP);
|
||||||
ConvertIntToDecimalStringN(gStringVar2, sFinalLevel, STR_CONV_MODE_LEFT_ALIGN, 3);
|
if (holdEffectParam == 0) // Rare Candy
|
||||||
StringExpandPlaceholders(gStringVar4, gText_PkmnElevatedToLvVar2);
|
{
|
||||||
|
ConvertIntToDecimalStringN(gStringVar2, sFinalLevel, STR_CONV_MODE_LEFT_ALIGN, 3);
|
||||||
|
StringExpandPlaceholders(gStringVar4, gText_PkmnElevatedToLvVar2);
|
||||||
|
}
|
||||||
|
else // Exp Candies
|
||||||
|
{
|
||||||
|
ConvertIntToDecimalStringN(gStringVar2, sExpCandyExperienceTable[holdEffectParam - 1], STR_CONV_MODE_LEFT_ALIGN, 6);
|
||||||
|
ConvertIntToDecimalStringN(gStringVar3, sFinalLevel, STR_CONV_MODE_LEFT_ALIGN, 3);
|
||||||
|
StringExpandPlaceholders(gStringVar4, gText_PkmnGainedExpAndElevatedToLvVar3);
|
||||||
|
}
|
||||||
|
|
||||||
DisplayPartyMenuMessage(gStringVar4, TRUE);
|
DisplayPartyMenuMessage(gStringVar4, TRUE);
|
||||||
ScheduleBgCopyTilemapToVram(2);
|
ScheduleBgCopyTilemapToVram(2);
|
||||||
gTasks[taskId].func = Task_DisplayLevelUpStatsPg1;
|
gTasks[taskId].func = Task_DisplayLevelUpStatsPg1;
|
||||||
|
@ -5186,6 +5208,7 @@ void ItemUseCB_RareCandy(u8 taskId, TaskFunc task)
|
||||||
{
|
{
|
||||||
PlaySE(SE_USE_ITEM);
|
PlaySE(SE_USE_ITEM);
|
||||||
gPartyMenuUseExitCallback = FALSE;
|
gPartyMenuUseExitCallback = FALSE;
|
||||||
|
ConvertIntToDecimalStringN(gStringVar2, sExpCandyExperienceTable[holdEffectParam - 1], STR_CONV_MODE_LEFT_ALIGN, 6);
|
||||||
StringExpandPlaceholders(gStringVar4, gText_PkmnGainedExp);
|
StringExpandPlaceholders(gStringVar4, gText_PkmnGainedExp);
|
||||||
DisplayPartyMenuMessage(gStringVar4, FALSE);
|
DisplayPartyMenuMessage(gStringVar4, FALSE);
|
||||||
ScheduleBgCopyTilemapToVram(2);
|
ScheduleBgCopyTilemapToVram(2);
|
||||||
|
@ -5291,11 +5314,14 @@ static void Task_TryLearningNextMove(u8 taskId)
|
||||||
switch (result)
|
switch (result)
|
||||||
{
|
{
|
||||||
case 0: // No moves to learn
|
case 0: // No moves to learn
|
||||||
|
if (sInitialLevel >= sFinalLevel)
|
||||||
|
PartyMenuTryEvolution(taskId);
|
||||||
break;
|
break;
|
||||||
case MON_HAS_MAX_MOVES:
|
case MON_HAS_MAX_MOVES:
|
||||||
DisplayMonNeedsToReplaceMove(taskId);
|
DisplayMonNeedsToReplaceMove(taskId);
|
||||||
break;
|
break;
|
||||||
case MON_ALREADY_KNOWS_MOVE:
|
case MON_ALREADY_KNOWS_MOVE:
|
||||||
|
gTasks[taskId].func = Task_TryLearningNextMove;
|
||||||
return;
|
return;
|
||||||
default:
|
default:
|
||||||
DisplayMonLearnedMove(taskId, result);
|
DisplayMonLearnedMove(taskId, result);
|
||||||
|
@ -5304,8 +5330,6 @@ static void Task_TryLearningNextMove(u8 taskId)
|
||||||
if (result)
|
if (result)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (sInitialLevel >= sFinalLevel)
|
|
||||||
PartyMenuTryEvolution(taskId);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void PartyMenuTryEvolution(u8 taskId)
|
static void PartyMenuTryEvolution(u8 taskId)
|
||||||
|
@ -5313,6 +5337,10 @@ static void PartyMenuTryEvolution(u8 taskId)
|
||||||
struct Pokemon *mon = &gPlayerParty[gPartyMenu.slotId];
|
struct Pokemon *mon = &gPlayerParty[gPartyMenu.slotId];
|
||||||
u16 targetSpecies = GetEvolutionTargetSpecies(mon, EVO_MODE_NORMAL, ITEM_NONE, NULL);
|
u16 targetSpecies = GetEvolutionTargetSpecies(mon, EVO_MODE_NORMAL, ITEM_NONE, NULL);
|
||||||
|
|
||||||
|
// Resets values to 0 so other means of teaching moves doesn't overwrite levels
|
||||||
|
sInitialLevel = 0;
|
||||||
|
sFinalLevel = 0;
|
||||||
|
|
||||||
if (targetSpecies != SPECIES_NONE)
|
if (targetSpecies != SPECIES_NONE)
|
||||||
{
|
{
|
||||||
FreePartyPointers();
|
FreePartyPointers();
|
||||||
|
|
|
@ -5512,7 +5512,7 @@ bool8 ExecuteTableBasedItemEffect(struct Pokemon *mon, u16 item, u8 partyIndex,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// EXP candies store an index for this table in their holdEffectParam.
|
// EXP candies store an index for this table in their holdEffectParam.
|
||||||
static const u32 sExpCandyExperienceTable[] = {
|
const u32 sExpCandyExperienceTable[] = {
|
||||||
[EXP_100 - 1] = 100,
|
[EXP_100 - 1] = 100,
|
||||||
[EXP_800 - 1] = 800,
|
[EXP_800 - 1] = 800,
|
||||||
[EXP_3000 - 1] = 3000,
|
[EXP_3000 - 1] = 3000,
|
||||||
|
@ -5701,20 +5701,26 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov
|
||||||
&& GetMonData(mon, MON_DATA_LEVEL, NULL) != MAX_LEVEL)
|
&& GetMonData(mon, MON_DATA_LEVEL, NULL) != MAX_LEVEL)
|
||||||
{
|
{
|
||||||
u8 param = ItemId_GetHoldEffectParam(item);
|
u8 param = ItemId_GetHoldEffectParam(item);
|
||||||
|
dataUnsigned = 0;
|
||||||
|
|
||||||
if (param == 0) // Rare Candy
|
if (param == 0) // Rare Candy
|
||||||
{
|
{
|
||||||
dataUnsigned = gExperienceTables[gBaseStats[GetMonData(mon, MON_DATA_SPECIES, NULL)].growthRate][GetMonData(mon, MON_DATA_LEVEL, NULL) + 1];
|
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
|
else if (param - 1 < ARRAY_COUNT(sExpCandyExperienceTable)) // EXP Candies
|
||||||
{
|
{
|
||||||
u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL);
|
u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL);
|
||||||
dataUnsigned = sExpCandyExperienceTable[param - 1] + GetMonData(mon, MON_DATA_EXP, NULL);
|
dataUnsigned = sExpCandyExperienceTable[param - 1] + GetMonData(mon, MON_DATA_EXP, NULL);
|
||||||
if (dataUnsigned > gExperienceTables[gBaseStats[species].growthRate][MAX_LEVEL])
|
if (dataUnsigned > gExperienceTables[gBaseStats[species].growthRate][MAX_LEVEL])
|
||||||
dataUnsigned = gExperienceTables[gBaseStats[species].growthRate][MAX_LEVEL];
|
dataUnsigned = gExperienceTables[gBaseStats[species].growthRate][MAX_LEVEL];
|
||||||
}
|
}
|
||||||
SetMonData(mon, MON_DATA_EXP, &dataUnsigned);
|
|
||||||
CalculateMonStats(mon);
|
if (dataUnsigned != 0) // Failsafe
|
||||||
retVal = FALSE;
|
{
|
||||||
|
SetMonData(mon, MON_DATA_EXP, &dataUnsigned);
|
||||||
|
CalculateMonStats(mon);
|
||||||
|
retVal = FALSE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Cure status
|
// Cure status
|
||||||
|
|
|
@ -417,7 +417,8 @@ 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_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_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_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 {STR_VAR_2} Exp. Points!{PAUSE_UNTIL_PRESS}");
|
||||||
|
const u8 gText_PkmnGainedExpAndElevatedToLvVar3[] = _("{STR_VAR_1} gained {STR_VAR_2} Exp. Points\nand was elevated to Lv. {STR_VAR_3}!");
|
||||||
const u8 gText_PkmnBaseVar2StatIncreased[] = _("{STR_VAR_1}'s base {STR_VAR_2}\nstat was raised.{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_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}");
|
const u8 gText_PkmnAdoresBaseVar2Fell[] = _("{STR_VAR_1} adores you!\nThe base {STR_VAR_2} fell!{PAUSE_UNTIL_PRESS}");
|
||||||
|
|
Loading…
Reference in a new issue