mirror of
https://github.com/Ninjdai1/pokeemerald.git
synced 2024-12-26 19:54:21 +01:00
Implement Exp Charm and unevolved Exp multipliers + Exp formula fixes (#3301)
Co-authored-by: Eduardo Quezada D'Ottone <eduardo602002@gmail.com>
This commit is contained in:
parent
80ec67482e
commit
4a3ee0db7f
@ -14,6 +14,7 @@
|
|||||||
#define B_TRAINER_EXP_MULTIPLIER GEN_LATEST // In Gen7+, trainer battles no longer give a 1.5 multiplier to EXP gain.
|
#define B_TRAINER_EXP_MULTIPLIER GEN_LATEST // In Gen7+, trainer battles no longer give a 1.5 multiplier to EXP gain.
|
||||||
#define B_SPLIT_EXP GEN_LATEST // In Gen6+, all participating mon get full experience.
|
#define B_SPLIT_EXP GEN_LATEST // In Gen6+, all participating mon get full experience.
|
||||||
#define B_SCALED_EXP GEN_LATEST // In Gen5 and Gen7+, experience is weighted by level difference.
|
#define B_SCALED_EXP GEN_LATEST // In Gen5 and Gen7+, experience is weighted by level difference.
|
||||||
|
#define B_UNEVOLVED_EXP_MULTIPLIER GEN_LATEST // In Gen6+, if the Pokémon is at or past the level where it would be able to evolve, but it has not, it gets a ~1.2 multiplier to EXP gain. Only applies to Pokémon with EVO_LEVEL method.
|
||||||
|
|
||||||
// Stat settings
|
// Stat settings
|
||||||
#define B_BADGE_BOOST GEN_LATEST // In Gen4+, Gym Badges no longer boost a Pokémon's stats.
|
#define B_BADGE_BOOST GEN_LATEST // In Gen4+, Gym Badges no longer boost a Pokémon's stats.
|
||||||
|
@ -543,6 +543,7 @@ u8 *UseStatIncreaseItem(u16 itemId);
|
|||||||
u8 GetNature(struct Pokemon *mon);
|
u8 GetNature(struct Pokemon *mon);
|
||||||
u8 GetNatureFromPersonality(u32 personality);
|
u8 GetNatureFromPersonality(u32 personality);
|
||||||
u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem, struct Pokemon *tradePartner);
|
u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem, struct Pokemon *tradePartner);
|
||||||
|
bool8 IsMonPastEvolutionLevel(struct Pokemon *mon);
|
||||||
u16 HoennPokedexNumToSpecies(u16 hoennNum);
|
u16 HoennPokedexNumToSpecies(u16 hoennNum);
|
||||||
u16 NationalPokedexNumToSpecies(u16 nationalNum);
|
u16 NationalPokedexNumToSpecies(u16 nationalNum);
|
||||||
u16 NationalToHoennOrder(u16 nationalNum);
|
u16 NationalToHoennOrder(u16 nationalNum);
|
||||||
|
@ -4087,6 +4087,9 @@ static void Cmd_getexp(void)
|
|||||||
calculatedExp = gSpeciesInfo[gBattleMons[gBattlerFainted].species].expYield * gBattleMons[gBattlerFainted].level / 7;
|
calculatedExp = gSpeciesInfo[gBattleMons[gBattlerFainted].species].expYield * gBattleMons[gBattlerFainted].level / 7;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (B_TRAINER_EXP_MULTIPLIER <= GEN_7 && gBattleTypeFlags & BATTLE_TYPE_TRAINER)
|
||||||
|
calculatedExp = (calculatedExp * 150) / 100;
|
||||||
|
|
||||||
#if B_SPLIT_EXP < GEN_6
|
#if B_SPLIT_EXP < GEN_6
|
||||||
if (viaExpShare) // at least one mon is getting exp via exp share
|
if (viaExpShare) // at least one mon is getting exp via exp share
|
||||||
{
|
{
|
||||||
@ -4179,14 +4182,9 @@ static void Cmd_getexp(void)
|
|||||||
{
|
{
|
||||||
// check if the pokemon doesn't belong to the player
|
// check if the pokemon doesn't belong to the player
|
||||||
if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && gBattleStruct->expGetterMonId >= 3)
|
if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && gBattleStruct->expGetterMonId >= 3)
|
||||||
{
|
|
||||||
i = STRINGID_EMPTYSTRING4;
|
i = STRINGID_EMPTYSTRING4;
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
|
||||||
gBattleMoveDamage = (gBattleMoveDamage * 150) / 100;
|
|
||||||
i = STRINGID_ABOOSTED;
|
i = STRINGID_ABOOSTED;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -16029,13 +16027,15 @@ void ApplyExperienceMultipliers(s32 *expAmount, u8 expGetterMonId, u8 faintedBat
|
|||||||
else
|
else
|
||||||
holdEffect = ItemId_GetHoldEffect(item);
|
holdEffect = ItemId_GetHoldEffect(item);
|
||||||
|
|
||||||
|
if (IsTradedMon(&gPlayerParty[expGetterMonId]))
|
||||||
|
*expAmount = (*expAmount * 150) / 100;
|
||||||
if (holdEffect == HOLD_EFFECT_LUCKY_EGG)
|
if (holdEffect == HOLD_EFFECT_LUCKY_EGG)
|
||||||
*expAmount = (*expAmount * 150) / 100;
|
*expAmount = (*expAmount * 150) / 100;
|
||||||
if (B_TRAINER_EXP_MULTIPLIER <= GEN_7 && gBattleTypeFlags & BATTLE_TYPE_TRAINER)
|
if (B_UNEVOLVED_EXP_MULTIPLIER >= GEN_6 && IsMonPastEvolutionLevel(&gPlayerParty[expGetterMonId]))
|
||||||
*expAmount = (*expAmount * 150) / 100;
|
*expAmount = (*expAmount * 4915) / 4096;
|
||||||
if (B_AFFECTION_MECHANICS == TRUE && GetBattlerFriendshipScore(expGetterMonId) >= FRIENDSHIP_50_TO_99)
|
if (B_AFFECTION_MECHANICS == TRUE && GetBattlerFriendshipScore(expGetterMonId) >= FRIENDSHIP_50_TO_99)
|
||||||
*expAmount = (*expAmount * 120) / 100;
|
*expAmount = (*expAmount * 4915) / 4096;
|
||||||
if (IsTradedMon(&gPlayerParty[expGetterMonId]))
|
if (CheckBagHasItem(ITEM_EXP_CHARM, 1)) //is also for other exp boosting Powers if/when implemented
|
||||||
*expAmount = (*expAmount * 150) / 100;
|
*expAmount = (*expAmount * 150) / 100;
|
||||||
|
|
||||||
if (B_SCALED_EXP >= GEN_5 && B_SCALED_EXP != GEN_6)
|
if (B_SCALED_EXP >= GEN_5 && B_SCALED_EXP != GEN_6)
|
||||||
|
@ -6770,6 +6770,26 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 mode, u16 evolutionItem, s
|
|||||||
return targetSpecies;
|
return targetSpecies;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool8 IsMonPastEvolutionLevel(struct Pokemon *mon)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
u16 species = GetMonData(mon, MON_DATA_SPECIES, 0);
|
||||||
|
u8 level = GetMonData(mon, MON_DATA_LEVEL, 0);
|
||||||
|
|
||||||
|
for (i = 0; i < EVOS_PER_MON; i++)
|
||||||
|
{
|
||||||
|
switch (gEvolutionTable[species][i].method)
|
||||||
|
{
|
||||||
|
case EVO_LEVEL:
|
||||||
|
if (gEvolutionTable[species][i].param <= level)
|
||||||
|
return TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
u16 HoennPokedexNumToSpecies(u16 hoennNum)
|
u16 HoennPokedexNumToSpecies(u16 hoennNum)
|
||||||
{
|
{
|
||||||
u16 species;
|
u16 species;
|
||||||
|
Loading…
Reference in New Issue
Block a user