Removes Crit Chance preproc (#5520)
* Removes Crit Chance preproc * renamed the function wrongly before pushing * add assumes back where needed * addresses review comments * GetHoldEffectCritChanceIncrease * remove redudant var call * define for gen1 leek scale * gen1 adjustments and fix test * inline leek check * clean up
This commit is contained in:
parent
9882e0aea6
commit
2e7d856ee3
2 changed files with 75 additions and 35 deletions
|
@ -1895,15 +1895,55 @@ static void Cmd_ppreduce(void)
|
|||
}
|
||||
|
||||
// The chance is 1/N for each stage.
|
||||
#if B_CRIT_CHANCE >= GEN_7
|
||||
static const u8 sCriticalHitOdds[] = {24, 8, 2, 1, 1};
|
||||
#elif B_CRIT_CHANCE == GEN_6
|
||||
static const u8 sCriticalHitOdds[] = {16, 8, 2, 1, 1};
|
||||
#else
|
||||
static const u8 sCriticalHitOdds[] = {16, 8, 4, 3, 2}; // Gens 2,3,4,5
|
||||
#endif // B_CRIT_CHANCE
|
||||
static const u32 sGen7CriticalHitOdds[] = {24, 8, 2, 1, 1};
|
||||
static const u32 sGen6CriticalHitOdds[] = {16, 8, 2, 1, 1};
|
||||
static const u32 sCriticalHitOdds[] = {16, 8, 4, 3, 2}; // Gens 2,3,4,5
|
||||
|
||||
static inline u32 GetCriticalHitOdds(u32 critChance)
|
||||
{
|
||||
if (B_CRIT_CHANCE >= GEN_7)
|
||||
return sGen7CriticalHitOdds[critChance];
|
||||
if (B_CRIT_CHANCE == GEN_6)
|
||||
return sGen6CriticalHitOdds[critChance];
|
||||
|
||||
return sCriticalHitOdds[critChance];
|
||||
}
|
||||
|
||||
static inline u32 IsBattlerLeekAffected(u32 battler, u32 holdEffect)
|
||||
{
|
||||
if (holdEffect == HOLD_EFFECT_LEEK)
|
||||
{
|
||||
return GET_BASE_SPECIES_ID(gBattleMons[battler].species) == SPECIES_FARFETCHD
|
||||
|| gBattleMons[battler].species == SPECIES_SIRFETCHD;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static inline u32 GetHoldEffectCritChanceIncrease(u32 battler, u32 holdEffect)
|
||||
{
|
||||
u32 critStageIncrease = 0;
|
||||
|
||||
switch (holdEffect)
|
||||
{
|
||||
case HOLD_EFFECT_SCOPE_LENS:
|
||||
critStageIncrease = 1;
|
||||
break;
|
||||
case HOLD_EFFECT_LUCKY_PUNCH:
|
||||
if (gBattleMons[battler].species == SPECIES_CHANSEY)
|
||||
critStageIncrease = 2;
|
||||
break;
|
||||
case HOLD_EFFECT_LEEK:
|
||||
if (IsBattlerLeekAffected(battler, holdEffect))
|
||||
critStageIncrease = 2;
|
||||
break;
|
||||
default:
|
||||
critStageIncrease = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
return critStageIncrease;
|
||||
}
|
||||
|
||||
#define BENEFITS_FROM_LEEK(battler, holdEffect)((holdEffect == HOLD_EFFECT_LEEK) && (GET_BASE_SPECIES_ID(gBattleMons[battler].species) == SPECIES_FARFETCHD || gBattleMons[battler].species == SPECIES_SIRFETCHD))
|
||||
s32 CalcCritChanceStageArgs(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordAbility, u32 abilityAtk, u32 abilityDef, u32 holdEffectAtk)
|
||||
{
|
||||
s32 critChance = 0;
|
||||
|
@ -1923,9 +1963,7 @@ s32 CalcCritChanceStageArgs(u32 battlerAtk, u32 battlerDef, u32 move, bool32 rec
|
|||
critChance = 2 * ((gBattleMons[battlerAtk].status2 & STATUS2_FOCUS_ENERGY) != 0)
|
||||
+ 1 * ((gBattleMons[battlerAtk].status2 & STATUS2_DRAGON_CHEER) != 0)
|
||||
+ gMovesInfo[move].criticalHitStage
|
||||
+ (holdEffectAtk == HOLD_EFFECT_SCOPE_LENS)
|
||||
+ 2 * (holdEffectAtk == HOLD_EFFECT_LUCKY_PUNCH && gBattleMons[battlerAtk].species == SPECIES_CHANSEY)
|
||||
+ 2 * BENEFITS_FROM_LEEK(battlerAtk, holdEffectAtk)
|
||||
+ GetHoldEffectCritChanceIncrease(battlerAtk, holdEffectAtk)
|
||||
+ 2 * (B_AFFECTION_MECHANICS == TRUE && GetBattlerAffectionHearts(battlerAtk) == AFFECTION_FIVE_HEARTS)
|
||||
+ (abilityAtk == ABILITY_SUPER_LUCK)
|
||||
+ gBattleStruct->bonusCritStages[gBattlerAttacker];
|
||||
|
@ -1941,7 +1979,7 @@ s32 CalcCritChanceStageArgs(u32 battlerAtk, u32 battlerDef, u32 move, bool32 rec
|
|||
{
|
||||
if (critChance == -2)
|
||||
RecordAbilityBattle(battlerDef, abilityDef);
|
||||
else if (sCriticalHitOdds[critChance] == 1)
|
||||
else if (GetCriticalHitOdds(critChance) == 1)
|
||||
RecordAbilityBattle(battlerDef, abilityDef);
|
||||
}
|
||||
critChance = -1;
|
||||
|
@ -1963,7 +2001,7 @@ s32 CalcCritChanceStage(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordA
|
|||
// Threshold = Base Speed / 2
|
||||
// High crit move = 8 * (Base Speed / 2)
|
||||
// Focus Energy = 4 * (Base Speed / 2)
|
||||
s32 CalcCritChanceStageGen1(u8 battlerAtk, u8 battlerDef, u32 move, bool32 recordAbility)
|
||||
s32 CalcCritChanceStageGen1(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordAbility)
|
||||
{
|
||||
// Vanilla
|
||||
u32 focusEnergyScaler = 4;
|
||||
|
@ -1973,13 +2011,13 @@ s32 CalcCritChanceStageGen1(u8 battlerAtk, u8 battlerDef, u32 move, bool32 recor
|
|||
u32 superLuckScaler = 4;
|
||||
u32 scopeLensScaler = 4;
|
||||
u32 luckyPunchScaler = 8;
|
||||
u32 farfetchedLeekScaler = 8;
|
||||
u32 farfetchdLeekScaler = 8;
|
||||
|
||||
s32 critChance = 0;
|
||||
s32 moveCritStage = gMovesInfo[gCurrentMove].criticalHitStage;
|
||||
s32 bonusCritStage = gBattleStruct->bonusCritStages[gBattlerAttacker]; // G-Max Chi Strike
|
||||
u32 abilityAtk = GetBattlerAbility(gBattlerAttacker);
|
||||
u32 abilityDef = GetBattlerAbility(gBattlerTarget);
|
||||
s32 bonusCritStage = gBattleStruct->bonusCritStages[battlerAtk]; // G-Max Chi Strike
|
||||
u32 abilityAtk = GetBattlerAbility(battlerAtk);
|
||||
u32 abilityDef = GetBattlerAbility(battlerDef);
|
||||
u32 holdEffectAtk = GetBattlerHoldEffect(battlerAtk, TRUE);
|
||||
u16 baseSpeed = gSpeciesInfo[gBattleMons[battlerAtk].species].baseSpeed;
|
||||
|
||||
|
@ -1992,17 +2030,15 @@ s32 CalcCritChanceStageGen1(u8 battlerAtk, u8 battlerDef, u32 move, bool32 recor
|
|||
if (bonusCritStage > 0)
|
||||
critChance = critChance * bonusCritStage;
|
||||
|
||||
if ((gBattleMons[gBattlerAttacker].status2 & STATUS2_FOCUS_ENERGY_ANY) != 0)
|
||||
if ((gBattleMons[battlerAtk].status2 & STATUS2_FOCUS_ENERGY_ANY) != 0)
|
||||
critChance = critChance * focusEnergyScaler;
|
||||
|
||||
if (holdEffectAtk == HOLD_EFFECT_SCOPE_LENS)
|
||||
critChance = critChance * scopeLensScaler;
|
||||
|
||||
if (holdEffectAtk == HOLD_EFFECT_LUCKY_PUNCH && gBattleMons[gBattlerAttacker].species == SPECIES_CHANSEY)
|
||||
else if (holdEffectAtk == HOLD_EFFECT_LUCKY_PUNCH && gBattleMons[battlerAtk].species == SPECIES_CHANSEY)
|
||||
critChance = critChance * luckyPunchScaler;
|
||||
|
||||
if (BENEFITS_FROM_LEEK(battlerAtk, holdEffectAtk))
|
||||
critChance = critChance * farfetchedLeekScaler;
|
||||
else if (IsBattlerLeekAffected(battlerAtk, holdEffectAtk))
|
||||
critChance = critChance * farfetchdLeekScaler;
|
||||
|
||||
if (abilityAtk == ABILITY_SUPER_LUCK)
|
||||
critChance = critChance * superLuckScaler;
|
||||
|
@ -2030,14 +2066,13 @@ s32 CalcCritChanceStageGen1(u8 battlerAtk, u8 battlerDef, u32 move, bool32 recor
|
|||
|
||||
return critChance;
|
||||
}
|
||||
#undef BENEFITS_FROM_LEEK
|
||||
|
||||
s32 GetCritHitOdds(s32 critChanceIndex)
|
||||
{
|
||||
if (critChanceIndex < 0)
|
||||
return -1;
|
||||
else
|
||||
return sCriticalHitOdds[critChanceIndex];
|
||||
return GetCriticalHitOdds(critChanceIndex);
|
||||
}
|
||||
|
||||
static void Cmd_critcalc(void)
|
||||
|
@ -2071,7 +2106,7 @@ static void Cmd_critcalc(void)
|
|||
gIsCriticalHit = 0;
|
||||
}
|
||||
else
|
||||
gIsCriticalHit = RandomChance(RNG_CRITICAL_HIT, 1, sCriticalHitOdds[critChance]);
|
||||
gIsCriticalHit = RandomChance(RNG_CRITICAL_HIT, 1, GetCriticalHitOdds(critChance));
|
||||
}
|
||||
|
||||
// Counter for EVO_CRITICAL_HITS.
|
||||
|
@ -6998,7 +7033,7 @@ static void Cmd_openpartyscreen(void)
|
|||
else if (IsDoubleBattle())
|
||||
{
|
||||
bool32 hasReplacement;
|
||||
|
||||
|
||||
hitmarkerFaintBits = gHitMarker >> 28;
|
||||
for (i = 0; i < gBattlersCount; i++)
|
||||
{
|
||||
|
@ -7006,7 +7041,7 @@ static void Cmd_openpartyscreen(void)
|
|||
{
|
||||
if (i > 1 && ((1u << BATTLE_PARTNER(i)) & hitmarkerFaintBits))
|
||||
continue;
|
||||
|
||||
|
||||
battler = i;
|
||||
if (HasNoMonsToSwitch(battler, PARTY_SIZE, PARTY_SIZE))
|
||||
{
|
||||
|
@ -7028,7 +7063,7 @@ static void Cmd_openpartyscreen(void)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
for (i = 0; i < NUM_BATTLE_SIDES; i++)
|
||||
{
|
||||
if (!(gSpecialStatuses[i].faintedHasReplacement))
|
||||
|
@ -8856,7 +8891,7 @@ u32 GetHighestStatId(u32 battler)
|
|||
}
|
||||
if (gBattleMons[battler].speed > highestStat)
|
||||
highestId = STAT_SPEED;
|
||||
|
||||
|
||||
return highestId;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,11 +1,6 @@
|
|||
#include "global.h"
|
||||
#include "test/battle.h"
|
||||
|
||||
ASSUMPTIONS
|
||||
{
|
||||
ASSUME(B_CRIT_CHANCE >= GEN_7);
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Crit Chance: Side effected by Lucky Chant blocks critical hits")
|
||||
{
|
||||
GIVEN {
|
||||
|
@ -135,6 +130,7 @@ SINGLE_BATTLE_TEST("Crit Chance: Focus Energy increases the user's critical hit
|
|||
{
|
||||
PASSES_RANDOMLY(1, 2, RNG_CRITICAL_HIT);
|
||||
GIVEN {
|
||||
ASSUME(B_CRIT_CHANCE >= GEN_7);
|
||||
ASSUME(gMovesInfo[MOVE_FOCUS_ENERGY].effect == EFFECT_FOCUS_ENERGY);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
|
@ -152,6 +148,7 @@ SINGLE_BATTLE_TEST("Crit Chance: High crit rate increases the critical hit ratio
|
|||
{
|
||||
PASSES_RANDOMLY(1, 8, RNG_CRITICAL_HIT);
|
||||
GIVEN {
|
||||
ASSUME(B_CRIT_CHANCE >= GEN_7);
|
||||
ASSUME(gMovesInfo[MOVE_SLASH].criticalHitStage == 1);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
|
@ -167,6 +164,7 @@ SINGLE_BATTLE_TEST("Crit Chance: Super Luck increases the critical hit ratio by
|
|||
{
|
||||
PASSES_RANDOMLY(1, 8, RNG_CRITICAL_HIT);
|
||||
GIVEN {
|
||||
ASSUME(B_CRIT_CHANCE >= GEN_7);
|
||||
PLAYER(SPECIES_TOGEPI) { Ability(ABILITY_SUPER_LUCK); };
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
|
@ -181,6 +179,7 @@ SINGLE_BATTLE_TEST("Crit Chance: Scope Lens increases the critical hit ratio by
|
|||
{
|
||||
PASSES_RANDOMLY(1, 8, RNG_CRITICAL_HIT);
|
||||
GIVEN {
|
||||
ASSUME(B_CRIT_CHANCE >= GEN_7);
|
||||
ASSUME(gItemsInfo[ITEM_SCOPE_LENS].holdEffect == HOLD_EFFECT_SCOPE_LENS);
|
||||
PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_SCOPE_LENS); };
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
|
@ -195,6 +194,7 @@ SINGLE_BATTLE_TEST("Crit Chance: Scope Lens increases the critical hit ratio by
|
|||
SINGLE_BATTLE_TEST("Crit Chance: High crit rate, Super Luck and Scope Lens cause the move to result in a critical hit")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(B_CRIT_CHANCE >= GEN_7);
|
||||
ASSUME(gMovesInfo[MOVE_SLASH].criticalHitStage == 1);
|
||||
ASSUME(gItemsInfo[ITEM_SCOPE_LENS].holdEffect == HOLD_EFFECT_SCOPE_LENS);
|
||||
PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_SUPER_LUCK); Item(ITEM_SCOPE_LENS); };
|
||||
|
@ -220,6 +220,7 @@ SINGLE_BATTLE_TEST("Crit Chance: Signature items Leek and Lucky Punch increase t
|
|||
PARAMETRIZE { species = SPECIES_CHANSEY; item = ITEM_LUCKY_PUNCH; }
|
||||
|
||||
GIVEN {
|
||||
ASSUME(B_CRIT_CHANCE >= GEN_7);
|
||||
ASSUME(gItemsInfo[ITEM_LEEK].holdEffect == HOLD_EFFECT_LEEK);
|
||||
ASSUME(gItemsInfo[ITEM_LUCKY_PUNCH].holdEffect == HOLD_EFFECT_LUCKY_PUNCH);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
|
@ -236,6 +237,7 @@ SINGLE_BATTLE_TEST("Crit Chance: Dire Hit increases a battler's critical hit cha
|
|||
{
|
||||
PASSES_RANDOMLY(1, 2, RNG_CRITICAL_HIT);
|
||||
GIVEN {
|
||||
ASSUME(B_CRIT_CHANCE >= GEN_7);
|
||||
ASSUME(gItemsInfo[ITEM_DIRE_HIT].battleUsage == EFFECT_ITEM_SET_FOCUS_ENERGY);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
|
@ -254,6 +256,7 @@ SINGLE_BATTLE_TEST("Crit Chance: Focus Energy increases critical hit ratio by tw
|
|||
{
|
||||
PASSES_RANDOMLY(8, 8, RNG_CRITICAL_HIT);
|
||||
GIVEN {
|
||||
ASSUME(B_CRIT_CHANCE >= GEN_7);
|
||||
ASSUME(gMovesInfo[MOVE_SLASH].criticalHitStage == 1);
|
||||
ASSUME(gMovesInfo[MOVE_FOCUS_ENERGY].effect == EFFECT_FOCUS_ENERGY);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
|
@ -286,6 +289,7 @@ DOUBLE_BATTLE_TEST("Crit Chance: Dragon Cheer increases critical hit ratio by on
|
|||
{
|
||||
PASSES_RANDOMLY(1, 8, RNG_CRITICAL_HIT);
|
||||
GIVEN {
|
||||
ASSUME(B_CRIT_CHANCE >= GEN_7);
|
||||
ASSUME(gMovesInfo[MOVE_TACKLE].criticalHitStage == 0);
|
||||
ASSUME(gMovesInfo[MOVE_DRAGON_CHEER].effect == EFFECT_DRAGON_CHEER);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
|
@ -306,6 +310,7 @@ DOUBLE_BATTLE_TEST("Crit Chance: Dragon Cheer increases critical hit ratio by tw
|
|||
{
|
||||
PASSES_RANDOMLY(1, 2, RNG_CRITICAL_HIT);
|
||||
GIVEN {
|
||||
ASSUME(B_CRIT_CHANCE >= GEN_7);
|
||||
ASSUME(gMovesInfo[MOVE_TACKLE].criticalHitStage == 0);
|
||||
ASSUME(gMovesInfo[MOVE_DRAGON_CHEER].effect == EFFECT_DRAGON_CHEER);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
|
|
Loading…
Reference in a new issue