Removed ALWAYS_CRIT, renamed critBoost (#3779)

Replaced ALWAYS_CRIT with an alwaysCriticalHit flag to account for the fact that in earlier generations, there is no crit stage at which crits are guaranteed. Renamed critBoost to criticalHitStage (at Edu's prompting). Reorder .criticalHitStage defines in battle_moves.h to be aligned with struct order.
This commit is contained in:
Nephrite 2023-12-21 00:16:02 +09:00 committed by GitHub
parent 6137db102e
commit 1708c80200
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 46 additions and 49 deletions

View File

@ -230,9 +230,6 @@
#define BATTLE_CATEGORY_SPECIAL 1
#define BATTLE_CATEGORY_STATUS 2
// Just for readability
#define ALWAYS_CRIT 3
// Growth rates
#define GROWTH_MEDIUM_FAST 0
#define GROWTH_ERRATIC 1

View File

@ -412,12 +412,12 @@ struct BattleMove
u16 accuracy:7;
u16 recoil:7;
u16 critBoost:2;
u16 criticalHitStage:2;
u8 pp;
u8 secondaryEffectChance;
s8 priority;
u16 target;
u8 pp;
s8 priority;
union {
u8 effect;
u8 powerOverride;
@ -430,6 +430,7 @@ struct BattleMove
u32 snatchAffected:1;
u32 mirrorMoveBanned:1;
u32 ignoresKingsRock:1;
u32 alwaysCriticalHit:1;
u32 twoTurnMove:1;
u32 punchingMove:1;
u32 sheerForceBoost:1;

View File

@ -2721,7 +2721,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
} // check partner move effect
// Adjust for always crit moves
if (gBattleMoves[aiData->partnerMove].critBoost == ALWAYS_CRIT && aiData->abilities[battlerAtk] == ABILITY_ANGER_POINT)
if (gBattleMoves[aiData->partnerMove].alwaysCriticalHit && aiData->abilities[battlerAtk] == ABILITY_ANGER_POINT)
{
if (AI_WhoStrikesFirst(battlerAtk, battlerAtkPartner, move) == AI_IS_SLOWER) // Partner moving first
{
@ -4976,7 +4976,7 @@ static s32 AI_Risky(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
if (IS_TARGETING_PARTNER(battlerAtk, battlerDef))
return score;
if (gBattleMoves[move].critBoost > 0)
if (gBattleMoves[move].criticalHitStage > 0)
ADJUST_SCORE(2);
switch (gBattleMoves[move].effect)

View File

@ -2236,8 +2236,7 @@ bool32 HasHighCritRatioMove(u32 battler)
for (i = 0; i < MAX_MON_MOVES; i++)
{
if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && gBattleMoves[moves[i]].critBoost > 0
&& gBattleMoves[moves[i]].critBoost < ALWAYS_CRIT) // don't count always crit moves
if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && gBattleMoves[moves[i]].criticalHitStage > 0)
return TRUE;
}

View File

@ -1902,7 +1902,7 @@ s32 CalcCritChanceStageArgs(u32 battlerAtk, u32 battlerDef, u32 move, bool32 rec
critChance = -1;
}
else if (gStatuses3[battlerAtk] & STATUS3_LASER_FOCUS
|| gBattleMoves[gCurrentMove].critBoost == ALWAYS_CRIT
|| gBattleMoves[gCurrentMove].alwaysCriticalHit
|| (abilityAtk == ABILITY_MERCILESS && gBattleMons[battlerDef].status1 & STATUS1_PSN_ANY))
{
critChance = -2;
@ -1910,7 +1910,7 @@ s32 CalcCritChanceStageArgs(u32 battlerAtk, u32 battlerDef, u32 move, bool32 rec
else
{
critChance = 2 * ((gBattleMons[battlerAtk].status2 & STATUS2_FOCUS_ENERGY) != 0)
+ gBattleMoves[gCurrentMove].critBoost
+ gBattleMoves[gCurrentMove].criticalHitStage
+ (holdEffectAtk == HOLD_EFFECT_SCOPE_LENS)
+ 2 * (holdEffectAtk == HOLD_EFFECT_LUCKY_PUNCH && gBattleMons[battlerAtk].species == SPECIES_CHANSEY)
+ 2 * BENEFITS_FROM_LEEK(battlerAtk, holdEffectAtk)

View File

@ -36,11 +36,11 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
.power = 50,
.type = TYPE_FIGHTING,
.accuracy = 100,
.criticalHitStage = 1,
.pp = 25,
.secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.critBoost = 1,
.category = BATTLE_CATEGORY_PHYSICAL,
.makesContact = TRUE,
},
@ -202,11 +202,11 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
.power = 80,
.type = TYPE_NORMAL,
.accuracy = 100,
.criticalHitStage = 1,
.pp = 10,
.secondaryEffectChance = 0,
.target = MOVE_TARGET_BOTH,
.priority = 0,
.critBoost = 1,
.category = BATTLE_CATEGORY_SPECIAL,
.twoTurnMove = TRUE,
.sleepTalkBanned = TRUE,
@ -1266,11 +1266,11 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
.power = 55,
.type = TYPE_GRASS,
.accuracy = 95,
.criticalHitStage = 1,
.pp = 25,
.secondaryEffectChance = 0,
.target = MOVE_TARGET_BOTH,
.priority = 0,
.critBoost = 1,
.category = BATTLE_CATEGORY_PHYSICAL,
.slicingMove = TRUE,
},
@ -2617,11 +2617,11 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
#endif
.effect = EFFECT_HIT,
.type = TYPE_WATER,
.criticalHitStage = 1,
.pp = 10,
.secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.critBoost = 1,
.category = BATTLE_CATEGORY_PHYSICAL,
.makesContact = TRUE,
},
@ -2789,11 +2789,11 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
.power = 70,
.type = TYPE_NORMAL,
.accuracy = 100,
.criticalHitStage = 1,
.pp = 20,
.secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.critBoost = 1,
.category = BATTLE_CATEGORY_PHYSICAL,
.makesContact = TRUE,
.slicingMove = TRUE,
@ -3057,11 +3057,11 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
.power = 100,
.type = TYPE_FLYING,
.accuracy = 95,
.criticalHitStage = 1,
.pp = 5,
.secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.critBoost = 1,
.category = BATTLE_CATEGORY_SPECIAL,
},
@ -4115,11 +4115,11 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
.power = 100,
.type = TYPE_FIGHTING,
.accuracy = 80,
.criticalHitStage = 1,
.pp = 5,
.secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.critBoost = 1,
.category = BATTLE_CATEGORY_PHYSICAL,
.makesContact = TRUE,
},
@ -5181,11 +5181,11 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
.power = 85,
.type = TYPE_FIRE,
.accuracy = 90,
.criticalHitStage = 1,
.pp = 10,
.secondaryEffectChance = 10,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.critBoost = 1,
.category = BATTLE_CATEGORY_PHYSICAL,
.makesContact = TRUE,
.sheerForceBoost = TRUE,
@ -5432,11 +5432,11 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
.effect = EFFECT_HIT,
.type = TYPE_FLYING,
.accuracy = 95,
.criticalHitStage = 1,
.pp = 25,
.secondaryEffectChance = 0,
.target = MOVE_TARGET_BOTH,
.priority = 0,
.critBoost = 1,
.category = BATTLE_CATEGORY_SPECIAL,
.windMove = TRUE,
.slicingMove = TRUE,
@ -5901,11 +5901,11 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
.power = 50,
.type = TYPE_POISON,
.accuracy = 100,
.criticalHitStage = 1,
.pp = 25,
.secondaryEffectChance = 10,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.critBoost = 1,
.category = BATTLE_CATEGORY_PHYSICAL,
.makesContact = TRUE,
.sheerForceBoost = TRUE,
@ -6018,11 +6018,11 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
.effect = EFFECT_HIT,
.type = TYPE_GRASS,
.accuracy = 100,
.criticalHitStage = 1,
.pp = 15,
.secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.critBoost = 1,
.category = BATTLE_CATEGORY_PHYSICAL,
.makesContact = TRUE,
.slicingMove = TRUE,
@ -6876,11 +6876,11 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
.power = 70,
.type = TYPE_DARK,
.accuracy = 100,
.criticalHitStage = 1,
.pp = 15,
.secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.critBoost = 1,
.category = BATTLE_CATEGORY_PHYSICAL,
.makesContact = TRUE,
.slicingMove = TRUE,
@ -7209,11 +7209,11 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
.power = 70,
.type = TYPE_GHOST,
.accuracy = 100,
.criticalHitStage = 1,
.pp = 15,
.secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.critBoost = 1,
.category = BATTLE_CATEGORY_PHYSICAL,
.makesContact = TRUE,
},
@ -7308,11 +7308,11 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
.power = 70,
.type = TYPE_PSYCHIC,
.accuracy = 100,
.criticalHitStage = 1,
.pp = 20,
.secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.critBoost = 1,
.category = BATTLE_CATEGORY_PHYSICAL,
.slicingMove = TRUE,
},
@ -7502,11 +7502,11 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
.power = 70,
.type = TYPE_POISON,
.accuracy = 100,
.criticalHitStage = 1,
.pp = 20,
.secondaryEffectChance = 10,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.critBoost = 1,
.category = BATTLE_CATEGORY_PHYSICAL,
.makesContact = TRUE,
.sheerForceBoost = TRUE,
@ -7566,11 +7566,11 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
.power = 100,
.type = TYPE_ROCK,
.accuracy = 80,
.criticalHitStage = 1,
.pp = 5,
.secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.critBoost = 1,
.category = BATTLE_CATEGORY_PHYSICAL,
},
@ -7730,11 +7730,11 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
.power = 90,
.type = TYPE_BUG,
.accuracy = 100,
.criticalHitStage = 1,
.pp = 15,
.secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.critBoost = 1,
.category = BATTLE_CATEGORY_PHYSICAL,
},
@ -7822,11 +7822,11 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
.power = 100,
.type = TYPE_DRAGON,
.accuracy = 95,
.criticalHitStage = 1,
.pp = 5,
.secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.critBoost = 1,
.category = BATTLE_CATEGORY_SPECIAL,
},
@ -8169,9 +8169,9 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
.secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.critBoost = ALWAYS_CRIT,
.category = BATTLE_CATEGORY_PHYSICAL,
.makesContact = TRUE,
.alwaysCriticalHit = TRUE,
},
[MOVE_FLAME_BURST] =
@ -8878,8 +8878,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
.secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.critBoost = ALWAYS_CRIT,
.category = BATTLE_CATEGORY_SPECIAL,
.alwaysCriticalHit = TRUE,
},
[MOVE_DRAGON_TAIL] =
@ -8950,11 +8950,11 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
.power = 80,
.type = TYPE_GROUND,
.accuracy = 95,
.criticalHitStage = 1,
.pp = 10,
.secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.critBoost = 1,
.category = BATTLE_CATEGORY_PHYSICAL,
.makesContact = TRUE,
},
@ -11327,10 +11327,10 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
.secondaryEffectChance = 100,
.target = MOVE_TARGET_SELECTED,
.priority = 2,
.critBoost = ALWAYS_CRIT,
.category = BATTLE_CATEGORY_PHYSICAL,
.makesContact = TRUE,
.mirrorMoveBanned = B_UPDATED_MOVE_FLAGS < GEN_8,
.alwaysCriticalHit = TRUE,
.metronomeBanned = TRUE,
},
@ -11614,11 +11614,11 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
.power = 80,
.type = TYPE_WATER,
.accuracy = 100,
.criticalHitStage = 1,
.pp = 15,
.secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.critBoost = 1,
.category = BATTLE_CATEGORY_SPECIAL,
},
@ -12447,9 +12447,9 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
.secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.critBoost = ALWAYS_CRIT,
.category = BATTLE_CATEGORY_PHYSICAL,
.makesContact = TRUE,
.alwaysCriticalHit = TRUE,
.punchingMove = TRUE,
.metronomeBanned = TRUE,
},
@ -12461,12 +12461,12 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
.type = TYPE_WATER,
.accuracy = 100,
.pp = 5,
.critBoost = ALWAYS_CRIT,
.secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.category = BATTLE_CATEGORY_PHYSICAL,
.makesContact = TRUE,
.alwaysCriticalHit = TRUE,
.punchingMove = TRUE,
.strikeCount = 3,
.metronomeBanned = TRUE,
@ -12833,11 +12833,11 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
#endif
.effect = EFFECT_SPEED_UP_HIT,
.type = TYPE_PSYCHIC,
.criticalHitStage = 1,
.pp = 10,
.secondaryEffectChance = 100,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.critBoost = 1,
.category = BATTLE_CATEGORY_SPECIAL,
.sheerForceBoost = TRUE,
},
@ -12888,7 +12888,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
.effect = EFFECT_TRIPLE_ARROWS,
.type = TYPE_FIGHTING,
.accuracy = 100,
.critBoost = 1,
.criticalHitStage = 1,
.secondaryEffectChance = 100, // 50% Defense down, 30% Flinch. Can be modified in 'SetMoveEffect'
.target = MOVE_TARGET_SELECTED,
.priority = 0,
@ -13326,8 +13326,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
.secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.critBoost = ALWAYS_CRIT,
.category = BATTLE_CATEGORY_PHYSICAL,
.alwaysCriticalHit = TRUE,
},
[MOVE_TORCH_SONG] =
@ -13674,11 +13674,11 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
.power = 70,
.type = TYPE_WATER,
.accuracy = 100,
.criticalHitStage = 1,
.pp = 20,
.secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.critBoost = 1,
.category = BATTLE_CATEGORY_PHYSICAL,
.slicingMove = TRUE,
},
@ -13879,11 +13879,11 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
.type = TYPE_GRASS,
.accuracy = 100,
.pp = 10,
.criticalHitStage = 1,
.secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.category = BATTLE_CATEGORY_PHYSICAL,
.critBoost = 1,
.argument = HOLD_EFFECT_MASK,
.metronomeBanned = TRUE,
},
@ -14124,11 +14124,11 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
.power = 195,
.type = TYPE_ELECTRIC,
.accuracy = 0,
.criticalHitStage = 2,
.pp = 1,
.secondaryEffectChance = 0,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.critBoost = 2,
.category = BATTLE_CATEGORY_SPECIAL,
},
[MOVE_STOKED_SPARKSURFER] =

View File

@ -152,7 +152,7 @@ SINGLE_BATTLE_TEST("High crit rate increases the critical hit ratio by one stage
{
PASSES_RANDOMLY(1, 8, RNG_CRITICAL_HIT);
GIVEN {
ASSUME(gBattleMoves[MOVE_SLASH].critBoost == 1);
ASSUME(gBattleMoves[MOVE_SLASH].criticalHitStage == 1);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
@ -195,7 +195,7 @@ SINGLE_BATTLE_TEST("Scope Lens increases the critical hit ratio by one stage")
SINGLE_BATTLE_TEST("High crit rate, Super Luck and Scope Lens cause the move to result in a critical hit")
{
GIVEN {
ASSUME(gBattleMoves[MOVE_SLASH].critBoost == 1);
ASSUME(gBattleMoves[MOVE_SLASH].criticalHitStage == 1);
ASSUME(gItems[ITEM_SCOPE_LENS].holdEffect == HOLD_EFFECT_SCOPE_LENS);
PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_SUPER_LUCK); Item(ITEM_SCOPE_LENS); };
OPPONENT(SPECIES_WOBBUFFET);

View File

@ -51,7 +51,7 @@ SINGLE_BATTLE_TEST("Lansat Berry raises the holder's critical-hit-ratio by two s
{
PASSES_RANDOMLY(1, 2, RNG_CRITICAL_HIT);
GIVEN {
ASSUME(gBattleMoves[MOVE_TACKLE].critBoost == 0);
ASSUME(gBattleMoves[MOVE_TACKLE].criticalHitStage == 0);
ASSUME(B_CRIT_CHANCE >= GEN_6);
PLAYER(SPECIES_WOBBUFFET) { MaxHP(160); HP(80); Item(ITEM_LANSAT_BERRY); }
OPPONENT(SPECIES_WOBBUFFET);

View File

@ -99,7 +99,7 @@ SINGLE_BATTLE_TEST("Critical hits occur at a 1/24 rate")
SINGLE_BATTLE_TEST("Slash's critical hits occur at a 1/8 rate")
{
ASSUME(B_CRIT_CHANCE >= GEN_7);
ASSUME(gBattleMoves[MOVE_SLASH].critBoost == 1);
ASSUME(gBattleMoves[MOVE_SLASH].criticalHitStage == 1);
PASSES_RANDOMLY(1, 8, RNG_CRITICAL_HIT);
GIVEN {
PLAYER(SPECIES_WOBBUFFET);

View File

@ -46,7 +46,7 @@ SINGLE_BATTLE_TEST("Triple Arrows makes the foe flinch 30% of the time")
SINGLE_BATTLE_TEST("Triple Arrows lands a critical hit")
{
ASSUME(B_CRIT_CHANCE >= GEN_7);
ASSUME(gBattleMoves[MOVE_TRIPLE_ARROWS].critBoost == 1);
ASSUME(gBattleMoves[MOVE_TRIPLE_ARROWS].criticalHitStage == 1);
PASSES_RANDOMLY(1, 8, RNG_CRITICAL_HIT);
GIVEN {
PLAYER(SPECIES_WOBBUFFET);

View File

@ -50,7 +50,7 @@ SINGLE_BATTLE_TEST("Surging Strikes hits 3 times with each hit being a critical
GIVEN {
ASSUME(gBattleMoves[MOVE_SURGING_STRIKES].strikeCount == 3);
ASSUME(gBattleMoves[MOVE_SURGING_STRIKES].critBoost == ALWAYS_CRIT);
ASSUME(gBattleMoves[MOVE_SURGING_STRIKES].alwaysCriticalHit == TRUE);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {