pokeemmo/test/battle/crit_chance.c
2026-01-02 18:01:43 +01:00

50 lines
2.0 KiB
C

#include "global.h"
#include "test/battle.h"
SINGLE_BATTLE_TEST("Critical hits without modifiers occur at different rates by generation")
{
u32 genConfig, passes, trials;
PARAMETRIZE { genConfig = GEN_1; passes = 1; trials = 16; } // 6.25% with Wobbuffet's base speed
PARAMETRIZE { genConfig = GEN_2; passes = 17; trials = 256; } // ~6.64%
for (u32 j = GEN_3; j <= GEN_6; j++)
PARAMETRIZE { genConfig = j; passes = 1, trials = 16; } // 6.25%
for (u32 j = GEN_7; j <= GEN_9; j++)
PARAMETRIZE { genConfig = j; passes = 1, trials = 24; } // ~4.17%
PASSES_RANDOMLY(passes, trials, RNG_CRITICAL_HIT);
GIVEN {
WITH_CONFIG(CONFIG_CRIT_CHANCE, genConfig);
ASSUME(GetSpeciesBaseSpeed(SPECIES_WOBBUFFET) == 33);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { MOVE(player, MOVE_SCRATCH); }
} SCENE {
MESSAGE("A critical hit!");
}
}
SINGLE_BATTLE_TEST("Crit Chance: Raising critical hit rate to 3 guarantees a critical hit (Gen 6+)")
{
u32 genConfig = 0, passes, trials;
PARAMETRIZE { genConfig = GEN_1; passes = 255; trials = 256; } // ~99.6%
PARAMETRIZE { genConfig = GEN_2; passes = 85; trials = 256; } // ~33.2%
for (u32 j = GEN_3; j <= GEN_5; j++)
PARAMETRIZE { genConfig = j; passes = 1, trials = 3; } // ~33.3%
for (u32 j = GEN_6; j <= GEN_9; j++)
PARAMETRIZE { genConfig = j; passes = 1, trials = 1; } // 100%
PASSES_RANDOMLY(passes, trials, RNG_CRITICAL_HIT);
GIVEN {
WITH_CONFIG(CONFIG_CRIT_CHANCE, genConfig);
ASSUME(GetMoveCriticalHitStage(MOVE_SLASH) == 1);
ASSUME(gItemsInfo[ITEM_SCOPE_LENS].holdEffect == HOLD_EFFECT_SCOPE_LENS);
PLAYER(SPECIES_TOGEKISS) { Ability(ABILITY_SUPER_LUCK); Item(ITEM_SCOPE_LENS); }
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { MOVE(player, MOVE_SLASH); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_SLASH, player);
MESSAGE("A critical hit!");
}
}