fix and tweak level cap code (#4505)

Co-authored-by: Baptiste-Lecoutre <59924283+Baptiste-Lecoutre@users.noreply.github.com>
This commit is contained in:
Nopinou 2024-05-07 15:53:09 +02:00 committed by GitHub
parent 2d7c79e860
commit 82b626aef1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 29 additions and 19 deletions

View file

@ -4431,15 +4431,19 @@ static void Cmd_getexp(void)
gBattleMoveDamage += GetSoftLevelCapExpValue(gPlayerParty[*expMonId].level, gBattleStruct->expShareExpValue);;
}
if (EXP_CAP_HARD && gBattleMoveDamage != 0)
ApplyExperienceMultipliers(&gBattleMoveDamage, *expMonId, gBattlerFainted);
if (B_EXP_CAP_TYPE == EXP_CAP_HARD && gBattleMoveDamage != 0)
{
u32 growthRate = gSpeciesInfo[GetMonData(&gPlayerParty[*expMonId], MON_DATA_SPECIES)].growthRate;
if (gExperienceTables[growthRate][GetCurrentLevelCap()] < gExperienceTables[growthRate][GetMonData(&gPlayerParty[*expMonId], MON_DATA_LEVEL)] + gBattleMoveDamage)
gBattleMoveDamage = gExperienceTables[growthRate][GetCurrentLevelCap()];
}
u32 currentExp = GetMonData(&gPlayerParty[*expMonId], MON_DATA_EXP);
u32 levelCap = GetCurrentLevelCap();
if (!EXP_CAP_HARD || gBattleMoveDamage != 0) // Edge case for hard level caps. Prevents mons from getting 1 exp
ApplyExperienceMultipliers(&gBattleMoveDamage, *expMonId, gBattlerFainted);
if (GetMonData(&gPlayerParty[*expMonId], MON_DATA_LEVEL) >= levelCap)
gBattleMoveDamage = 0;
else if (gExperienceTables[growthRate][levelCap] < currentExp + gBattleMoveDamage)
gBattleMoveDamage = gExperienceTables[growthRate][levelCap] - currentExp;
}
if (IsTradedMon(&gPlayerParty[*expMonId]))
{

View file

@ -49,15 +49,26 @@ u32 GetSoftLevelCapExpValue(u32 level, u32 expValue)
if (B_EXP_CAP_TYPE == EXP_CAP_NONE)
return expValue;
if (B_LEVEL_CAP_EXP_UP && level < currentLevelCap)
if (level < currentLevelCap)
{
levelDifference = currentLevelCap - level;
if (levelDifference > ARRAY_COUNT(sExpScalingDown))
return expValue + (expValue / sExpScalingUp[ARRAY_COUNT(sExpScalingDown) - 1]);
if (B_LEVEL_CAP_EXP_UP)
{
levelDifference = currentLevelCap - level;
if (levelDifference > ARRAY_COUNT(sExpScalingUp))
return expValue + (expValue / sExpScalingUp[ARRAY_COUNT(sExpScalingUp) - 1]);
else
return expValue + (expValue / sExpScalingUp[levelDifference]);
}
else
return expValue + (expValue / sExpScalingUp[levelDifference]);
{
return expValue;
}
}
else if (B_EXP_CAP_TYPE == EXP_CAP_SOFT && level >= currentLevelCap)
else if (B_EXP_CAP_TYPE == EXP_CAP_HARD)
{
return 0;
}
else if (B_EXP_CAP_TYPE == EXP_CAP_SOFT)
{
levelDifference = level - currentLevelCap;
if (levelDifference > ARRAY_COUNT(sExpScalingDown))
@ -65,13 +76,8 @@ u32 GetSoftLevelCapExpValue(u32 level, u32 expValue)
else
return expValue / sExpScalingDown[levelDifference];
}
else if (level < currentLevelCap)
else
{
return expValue;
}
else
{
return 0;
}
}

View file

@ -3531,7 +3531,7 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov
u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL);
dataUnsigned = sExpCandyExperienceTable[param - 1] + GetMonData(mon, MON_DATA_EXP, NULL);
if (B_RARE_CANDY_CAP && EXP_CAP_HARD)
if (B_RARE_CANDY_CAP && B_EXP_CAP_TYPE == EXP_CAP_HARD)
{
u32 currentLevelCap = GetCurrentLevelCap();
if (dataUnsigned > gExperienceTables[gSpeciesInfo[species].growthRate][currentLevelCap])