DamageContext: chosenMove (#8224)

This commit is contained in:
Martin Griffin 2025-11-11 20:59:18 +00:00 committed by GitHub
parent b8fc084daa
commit 12b65b565b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 20 additions and 15 deletions

View File

@ -167,6 +167,8 @@ struct DamageContext
u32 weather:16;
u32 fixedBasePower:8;
u32 padding2:8;
u32 chosenMove:16; // May be different to 'move', e.g. for Z moves.
u32 padding3:16;
uq4_12_t typeEffectivenessModifier;
enum Ability abilityAtk;
enum Ability abilityDef;

View File

@ -584,7 +584,7 @@ bool32 MovesWithCategoryUnusable(u32 attacker, u32 target, enum DamageCategory c
if (GetBattleMoveCategory(moves[i]) == category)
{
SetTypeBeforeUsingMove(moves[i], attacker);
ctx.move = moves[i];
ctx.move = ctx.chosenMove = moves[i];
ctx.moveType = GetBattleMoveType(moves[i]);
if (CalcTypeEffectivenessMultiplier(&ctx))
@ -929,7 +929,7 @@ struct SimulatedDamage AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, u
struct DamageContext ctx = {0};
ctx.battlerAtk = battlerAtk;
ctx.battlerDef = battlerDef;
ctx.move = move;
ctx.move = ctx.chosenMove = move;
ctx.moveType = GetBattleMoveType(move);
ctx.isCrit = ShouldCalcCritDamage(battlerAtk, battlerDef, move, aiData);
ctx.randomFactor = FALSE;
@ -1382,7 +1382,7 @@ uq4_12_t AI_GetMoveEffectiveness(u32 move, u32 battlerAtk, u32 battlerDef)
struct DamageContext ctx = {0};
ctx.battlerAtk = battlerAtk;
ctx.battlerDef = battlerDef;
ctx.move = move;
ctx.move = ctx.chosenMove = move;
ctx.moveType = GetBattleMoveType(move);
ctx.updateFlags = FALSE;
ctx.abilityAtk = gAiLogicData->abilities[battlerAtk];

View File

@ -1428,6 +1428,7 @@ static void AccuracyCheck(bool32 recalcDragonDarts, const u8 *nextInstr, const u
ctx.battlerAtk = gBattlerAttacker;
ctx.battlerDef = battlerDef;
ctx.move = move;
ctx.chosenMove = gChosenMove;
ctx.moveType = moveType;
ctx.updateFlags = TRUE;
ctx.abilityAtk = abilityAtk;
@ -1728,6 +1729,7 @@ static void Cmd_damagecalc(void)
struct DamageContext ctx = {0};
ctx.battlerAtk = gBattlerAttacker;
ctx.move = gCurrentMove;
ctx.chosenMove = gChosenMove;
ctx.moveType = GetBattleMoveType(gCurrentMove);
ctx.randomFactor = TRUE;
ctx.updateFlags = TRUE;
@ -1765,6 +1767,7 @@ static void Cmd_typecalc(void)
ctx.battlerAtk = gBattlerAttacker;
ctx.battlerDef = gBattlerTarget;
ctx.move = gCurrentMove;
ctx.chosenMove = gChosenMove;
ctx.moveType = GetBattleMoveType(gCurrentMove);
ctx.updateFlags = TRUE;
ctx.abilityAtk = GetBattlerAbility(gBattlerAttacker);

View File

@ -1271,10 +1271,10 @@ static void TrySetBattleSeminarShow(void)
powerOverride = 0;
if (ShouldCalculateDamage(gCurrentMove, &dmgByMove[i], &powerOverride))
{
struct DamageContext ctx;
struct DamageContext ctx = {0};
ctx.battlerAtk = gBattlerAttacker;
ctx.battlerDef = gBattlerTarget;
ctx.move = gCurrentMove;
ctx.move = ctx.chosenMove = gCurrentMove;
ctx.moveType = GetMoveType(gCurrentMove);
ctx.isCrit = FALSE;
ctx.randomFactor = FALSE;

View File

@ -219,7 +219,7 @@ static uq4_12_t CalcTypeEffectivenessMultiplierHelper(u32 move, enum Type moveTy
struct DamageContext ctx = {0};
ctx.battlerAtk = battlerAtk;
ctx.battlerDef = battlerDef;
ctx.move = move;
ctx.move = ctx.chosenMove = move;
ctx.moveType = moveType;
ctx.updateFlags = recordAbilities;
ctx.abilityAtk = abilityAtk;
@ -2068,9 +2068,9 @@ static enum MoveCanceller CancellerObedience(struct BattleContext *ctx)
return MOVE_STEP_FAILURE;
case DISOBEYS_HITS_SELF:
gBattlerTarget = ctx->battlerAtk;
struct DamageContext dmgCtx;
struct DamageContext dmgCtx = {0};
dmgCtx.battlerAtk = dmgCtx.battlerDef = ctx->battlerAtk;
dmgCtx.move = MOVE_NONE;
dmgCtx.move = dmgCtx.chosenMove = MOVE_NONE;
dmgCtx.moveType = TYPE_MYSTERY;
dmgCtx.isCrit = FALSE;
dmgCtx.randomFactor = FALSE;
@ -2234,9 +2234,9 @@ static enum MoveCanceller CancellerConfused(struct BattleContext *ctx)
if (RandomPercentage(RNG_CONFUSION, (GetGenConfig(GEN_CONFIG_CONFUSION_SELF_DMG_CHANCE) >= GEN_7 ? 33 : 50)))
{
gBattleCommunication[MULTISTRING_CHOOSER] = TRUE;
struct DamageContext dmgCtx;
struct DamageContext dmgCtx = {0};
dmgCtx.battlerAtk = dmgCtx.battlerDef = ctx->battlerAtk;
dmgCtx.move = MOVE_NONE;
dmgCtx.move = dmgCtx.chosenMove = MOVE_NONE;
dmgCtx.moveType = TYPE_MYSTERY;
dmgCtx.isCrit = FALSE;
dmgCtx.randomFactor = FALSE;
@ -4044,7 +4044,7 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab
ctx.battlerAtk = i;
ctx.battlerDef = battler;
ctx.move = move;
ctx.move = ctx.chosenMove = move;
ctx.moveType = moveType;
ctx.isAnticipation = TRUE;
modifier = CalcTypeEffectivenessMultiplier(&ctx);
@ -7125,7 +7125,7 @@ static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageContext *ctx)
modifier = uq4_12_multiply(modifier, uq4_12_add(UQ_4_12(1.0), PercentToUQ4_12(gSpecialStatuses[battlerAtk].gemParam)));
if (gBattleMons[battlerAtk].volatiles.charge && moveType == TYPE_ELECTRIC)
modifier = uq4_12_multiply(modifier, UQ_4_12(2.0));
if (GetMoveEffect(gChosenMove) == EFFECT_ME_FIRST)
if (GetMoveEffect(ctx->chosenMove) == EFFECT_ME_FIRST)
modifier = uq4_12_multiply(modifier, UQ_4_12(1.5));
if (IsBattlerTerrainAffected(battlerAtk, ctx->abilityAtk, ctx->holdEffectAtk, STATUS_FIELD_GRASSY_TERRAIN) && moveType == TYPE_GRASS)
modifier = uq4_12_multiply(modifier, (B_TERRAIN_TYPE_BOOST >= GEN_8 ? UQ_4_12(1.3) : UQ_4_12(1.5)));
@ -8483,7 +8483,7 @@ static inline void TryNoticeIllusionInTypeEffectiveness(u32 move, enum Type move
struct DamageContext ctx = {0};
ctx.battlerAtk = battlerAtk;
ctx.battlerDef = battlerDef;
ctx.move = move;
ctx.move = ctx.chosenMove = move;
ctx.moveType = moveType;
ctx.updateFlags = FALSE;
ctx.abilityAtk = GetBattlerAbility(battlerAtk);
@ -8630,7 +8630,7 @@ uq4_12_t CalcPartyMonTypeEffectivenessMultiplier(u16 move, u16 speciesDef, enum
if (move != MOVE_STRUGGLE && moveType != TYPE_MYSTERY)
{
struct DamageContext ctx = {0};
ctx.move = move;
ctx.move = ctx.chosenMove = move;
ctx.moveType = moveType;
ctx.updateFlags = FALSE;
ctx.abilityDef = abilityDef;
@ -8675,7 +8675,7 @@ uq4_12_t GetOverworldTypeEffectiveness(struct Pokemon *mon, enum Type moveType)
return modifier;
struct DamageContext ctx = {0};
ctx.move = MOVE_POUND;
ctx.move = ctx.chosenMove = MOVE_POUND;
ctx.moveType = moveType;
ctx.updateFlags = FALSE;