Updated moves that raise the target's own stats

To do: moves like CC, Overheat that LOWER stats; did NOT remove the effect for raising all stats due to an AI function
This commit is contained in:
Nephrite 2023-12-24 22:54:41 +09:00
parent 460eeff3e5
commit a244d7b8b6
7 changed files with 271 additions and 227 deletions

View file

@ -95,7 +95,7 @@ gBattleScriptsForMoveEffects::
.4byte BattleScript_EffectHit @ EFFECT_UNUSED_70
.4byte BattleScript_EffectHit @ EFFECT_UNUSED_71
.4byte BattleScript_EffectHit @ EFFECT_UNUSED_72
.4byte BattleScript_EffectHit @ EFFECT_EVASION_DOWN_HIT
.4byte BattleScript_EffectHit @ EFFECT_UNUSED_73
.4byte BattleScript_EffectTwoTurnsAttack @ EFFECT_TWO_TURNS_ATTACK
.4byte BattleScript_EffectHit @ EFFECT_UNUSED_75
.4byte BattleScript_EffectHit @ EFFECT_VITAL_THROW
@ -157,9 +157,9 @@ gBattleScriptsForMoveEffects::
.4byte BattleScript_EffectHit @ EFFECT_HIDDEN_POWER
.4byte BattleScript_EffectRainDance @ EFFECT_RAIN_DANCE
.4byte BattleScript_EffectSunnyDay @ EFFECT_SUNNY_DAY
.4byte BattleScript_EffectDefenseUpHit @ EFFECT_DEFENSE_UP_HIT
.4byte BattleScript_EffectAttackUpHit @ EFFECT_ATTACK_UP_HIT
.4byte BattleScript_EffectAllStatsUpHit @ EFFECT_ALL_STATS_UP_HIT
.4byte BattleScript_EffectHit @ EFFECT_UNUSED_135
.4byte BattleScript_EffectHit @ EFFECT_UNUSED_136
.4byte BattleScript_EffectHit @ EFFECT_ALL_STATS_UP_HIT
.4byte BattleScript_EffectHit @ EFFECT_FELL_STINGER
.4byte BattleScript_EffectBellyDrum @ EFFECT_BELLY_DRUM
.4byte BattleScript_EffectPsychUp @ EFFECT_PSYCH_UP
@ -294,7 +294,7 @@ gBattleScriptsForMoveEffects::
.4byte BattleScript_EffectHit @ EFFECT_HURRICANE
.4byte BattleScript_EffectHit @ EFFECT_TWO_TYPED_MOVE
.4byte BattleScript_EffectMeFirst @ EFFECT_ME_FIRST
.4byte BattleScript_EffectSpeedUpHit @ EFFECT_SPEED_UP_HIT
.4byte BattleScript_EffectHit @ EFFECT_UNUSED_272
.4byte BattleScript_EffectQuiverDance @ EFFECT_QUIVER_DANCE
.4byte BattleScript_EffectCoil @ EFFECT_COIL
.4byte BattleScript_EffectElectrify @ EFFECT_ELECTRIFY
@ -340,7 +340,7 @@ gBattleScriptsForMoveEffects::
.4byte BattleScript_EffectAcupressure @ EFFECT_ACUPRESSURE
.4byte BattleScript_EffectAromaticMist @ EFFECT_AROMATIC_MIST
.4byte BattleScript_EffectPowder @ EFFECT_POWDER
.4byte BattleScript_EffectSpAtkUpHit @ EFFECT_SP_ATTACK_UP_HIT
.4byte BattleScript_EffectHit @ EFFECT_UNUSED_318
.4byte BattleScript_EffectHit @ EFFECT_BELCH
.4byte BattleScript_EffectPartingShot @ EFFECT_PARTING_SHOT
.4byte BattleScript_EffectHit @ EFFECT_UNUSED_321
@ -377,7 +377,7 @@ gBattleScriptsForMoveEffects::
.4byte BattleScript_EffectRecoilHP25 @ EFFECT_RECOIL_HP_25
.4byte BattleScript_EffectStuffCheeks @ EFFECT_STUFF_CHEEKS
.4byte BattleScript_EffectHit @ EFFECT_GRAV_APPLE
.4byte BattleScript_EffectEvasionUpHit @ EFFECT_EVASION_UP_HIT
.4byte BattleScript_EffectHit @ EFFECT_UNUSED_355
.4byte BattleScript_EffectGlitzyGlow @ EFFECT_GLITZY_GLOW
.4byte BattleScript_EffectBaddyBad @ EFFECT_BADDY_BAD
.4byte BattleScript_EffectSappySeed @ EFFECT_SAPPY_SEED
@ -408,7 +408,7 @@ gBattleScriptsForMoveEffects::
.4byte BattleScript_EffectDarkVoid @ EFFECT_DARK_VOID
.4byte BattleScript_EffectHit @ EFFET_UNUSED_384
.4byte BattleScript_EffectDoubleShock @ EFFECT_DOUBLE_SHOCK
.4byte BattleScript_EffectSpecialAttackUpHit @ EFFECT_SPECIAL_ATTACK_UP_HIT
.4byte BattleScript_EffectHit @ EFFECT_UNUSED_387
.4byte BattleScript_EffectVictoryDance @ EFFECT_VICTORY_DANCE
.4byte BattleScript_EffectTeatime @ EFFECT_TEATIME
.4byte BattleScript_EffectAttackUpUserAlly @ EFFECT_ATTACK_UP_USER_ALLY
@ -1180,10 +1180,6 @@ BattleScript_EffectGlitzyGlow:
waitmessage B_WAIT_TIME_LONG
goto BattleScript_MoveEnd
BattleScript_EffectEvasionUpHit:
setmoveeffect MOVE_EFFECT_EVS_PLUS_1 | MOVE_EFFECT_AFFECTS_USER
goto BattleScript_EffectHit
BattleScript_EffectStuffCheeks::
attackcanceler
attackstring
@ -1564,10 +1560,6 @@ BattleScript_EffectPartingShotSwitch:
BattleScript_PartingShotEnd:
end
BattleScript_EffectSpAtkUpHit:
setmoveeffect MOVE_EFFECT_SP_ATK_PLUS_1 | MOVE_EFFECT_AFFECTS_USER
goto BattleScript_EffectHit
BattleScript_EffectPowder:
attackcanceler
accuracycheck BattleScript_PrintMoveMissed, NO_ACC_CALC_CHECK_LOCK_ON
@ -5000,22 +4992,6 @@ BattleScript_BlockedByPrimalWeatherRet::
jumpifhalfword CMP_COMMON_BITS, gBattleWeather, B_WEATHER_STRONG_WINDS, BattleScript_MysteriousAirCurrentBlowsOnRet
return
BattleScript_EffectDefenseUpHit::
setmoveeffect MOVE_EFFECT_DEF_PLUS_1 | MOVE_EFFECT_AFFECTS_USER
goto BattleScript_EffectHit
BattleScript_EffectAttackUpHit::
setmoveeffect MOVE_EFFECT_ATK_PLUS_1 | MOVE_EFFECT_AFFECTS_USER
goto BattleScript_EffectHit
BattleScript_EffectSpecialAttackUpHit::
setmoveeffect MOVE_EFFECT_SP_ATK_PLUS_1 | MOVE_EFFECT_AFFECTS_USER
goto BattleScript_EffectHit
BattleScript_EffectAllStatsUpHit::
setmoveeffect MOVE_EFFECT_ALL_STATS_UP | MOVE_EFFECT_AFFECTS_USER
goto BattleScript_EffectHit
BattleScript_EffectBellyDrum::
attackcanceler
attackstring

View file

@ -136,8 +136,8 @@
#define EFFECT_HIDDEN_POWER 132
#define EFFECT_RAIN_DANCE 133
#define EFFECT_SUNNY_DAY 134
#define EFFECT_DEFENSE_UP_HIT 135
#define EFFECT_ATTACK_UP_HIT 136
#define EFFECT_UNUSED_135 135
#define EFFECT_UNUSED_136 136
#define EFFECT_ALL_STATS_UP_HIT 137
#define EFFECT_FELL_STINGER 138
#define EFFECT_BELLY_DRUM 139
@ -275,7 +275,7 @@
#define EFFECT_HURRICANE 269
#define EFFECT_TWO_TYPED_MOVE 270
#define EFFECT_ME_FIRST 271
#define EFFECT_SPEED_UP_HIT 272
#define EFFECT_UNUSED_272 272
#define EFFECT_QUIVER_DANCE 273
#define EFFECT_COIL 274
#define EFFECT_ELECTRIFY 275
@ -321,7 +321,7 @@
#define EFFECT_ACUPRESSURE 315
#define EFFECT_AROMATIC_MIST 316
#define EFFECT_POWDER 317
#define EFFECT_SP_ATTACK_UP_HIT 318
#define EFFECT_UNUSED_318 318
#define EFFECT_BELCH 319
#define EFFECT_PARTING_SHOT 320
#define EFFECT_UNUSED_321 321
@ -358,7 +358,7 @@
#define EFFECT_RECOIL_HP_25 352
#define EFFECT_STUFF_CHEEKS 353
#define EFFECT_GRAV_APPLE 354
#define EFFECT_EVASION_UP_HIT 355
#define EFFECT_UNUSED_355 355
#define EFFECT_GLITZY_GLOW 356
#define EFFECT_BADDY_BAD 357
#define EFFECT_SAPPY_SEED 358
@ -389,7 +389,7 @@
#define EFFECT_DARK_VOID 383
#define EFFET_UNUSED_384 384
#define EFFECT_DOUBLE_SHOCK 385
#define EFFECT_SPECIAL_ATTACK_UP_HIT 386
#define EFFECT_UNUSED_387 386
#define EFFECT_VICTORY_DANCE 387
#define EFFECT_TEATIME 388
#define EFFECT_ATTACK_UP_USER_ALLY 389 // Howl 8th Gen

View file

@ -400,8 +400,10 @@ struct BattleMove
};
#define ADDITIONAL_EFFECTS(...) \
.numAdditionalEffects = NARG_8(__VA_ARGS__) / 3, \
.additionalEffects = (const struct AdditionalEffect[]) { __VA_ARGS__ }
.numAdditionalEffects = ARRAY_COUNT(EFFECTS_ARR( __VA_ARGS__ )), \
.additionalEffects = EFFECTS_ARR( __VA_ARGS__ )
#define EFFECTS_ARR(...) (const struct AdditionalEffect[]) { __VA_ARGS__ }
#define PRIMARY_EFFECT(_moveEffect) {.self = FALSE, .chance = 0, .moveEffect = _moveEffect}
#define PRIMARY_EFFECT_SELF(_moveEffect) {.self = TRUE, .chance = 0, .moveEffect = _moveEffect}

View file

@ -3509,14 +3509,22 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score
ADJUST_SCORE(-3);
break;
}
goto SHOULD_USE_PHAZING_MOVE;
if (isDoubleBattle)
score += min(CountPositiveStatStages(battlerDef) + CountPositiveStatStages(BATTLE_PARTNER(battlerDef)), 7);
else
score += min(CountPositiveStatStages(battlerDef), 4);
break;
case EFFECT_ROAR:
if (aiData->abilities[battlerDef] == ABILITY_SOUNDPROOF || aiData->abilities[battlerDef] == ABILITY_SUCTION_CUPS)
{
ADJUST_SCORE(-3);
break;
}
goto SHOULD_USE_PHAZING_MOVE;
if (isDoubleBattle)
score += min(CountPositiveStatStages(battlerDef) + CountPositiveStatStages(BATTLE_PARTNER(battlerDef)), 7);
else
score += min(CountPositiveStatStages(battlerDef), 4);
break;
case EFFECT_MULTI_HIT:
case EFFECT_TRIPLE_KICK:
if (AI_MoveMakesContact(aiData->abilities[battlerAtk], aiData->holdEffects[battlerAtk], move)
@ -3762,10 +3770,6 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score
else if (HasMoveWithLowAccuracy(battlerAtk, battlerDef, 90, TRUE, aiData->abilities[battlerAtk], aiData->abilities[battlerDef], aiData->holdEffects[battlerAtk], aiData->holdEffects[battlerDef]))
ADJUST_SCORE(1);
break;
case EFFECT_SPEED_UP_HIT:
if (sereneGraceBoost && aiData->abilities[battlerDef] != ABILITY_CONTRARY && !AI_STRIKES_FIRST(battlerAtk, battlerDef, move))
ADJUST_SCORE(3);
break;
case EFFECT_DESTINY_BOND:
if (AI_WhoStrikesFirst(battlerAtk, battlerDef, move) == AI_IS_FASTER && CanTargetFaintAi(battlerDef, battlerAtk))
ADJUST_SCORE(3);
@ -4021,14 +4025,6 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score
ADJUST_SCORE(1);
}
break;
case EFFECT_ATTACK_UP_HIT:
if (sereneGraceBoost)
IncreaseStatUpScore(battlerAtk, battlerDef, STAT_ATK, &score);
break;
case EFFECT_SPECIAL_ATTACK_UP_HIT:
if (sereneGraceBoost)
IncreaseStatUpScore(battlerAtk, battlerDef, STAT_SPATK, &score);
break;
case EFFECT_FELL_STINGER:
if (gBattleMons[battlerAtk].statStages[STAT_ATK] < MAX_STAT_STAGE
&& aiData->abilities[battlerAtk] != ABILITY_CONTRARY
@ -4045,7 +4041,35 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score
score += (MAX_STAT_STAGE - gBattleMons[battlerAtk].statStages[STAT_ATK]);
break;
case EFFECT_PSYCH_UP:
goto SHOULD_USE_STAT_COPY_MOVE;
// Want to copy positive stat changes
for (i = STAT_ATK; i < NUM_BATTLE_STATS; i++)
{
if (gBattleMons[battlerDef].statStages[i] > gBattleMons[battlerAtk].statStages[i])
{
switch (i)
{
case STAT_ATK:
if (HasMoveWithSplit(battlerAtk, SPLIT_PHYSICAL))
ADJUST_SCORE(1);
break;
case STAT_SPATK:
if (HasMoveWithSplit(battlerAtk, SPLIT_SPECIAL))
ADJUST_SCORE(1);
break;
case STAT_ACC:
case STAT_EVASION:
case STAT_SPEED:
ADJUST_SCORE(1);
break;
case STAT_DEF:
case STAT_SPDEF:
if (AI_THINKING_STRUCT->aiFlags & AI_FLAG_STALL)
ADJUST_SCORE(1);
break;
}
}
}
break;
case EFFECT_SEMI_INVULNERABLE:
ADJUST_SCORE(1);
if (predictedMove != MOVE_NONE && !isDoubleBattle)
@ -4831,31 +4855,50 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score
for (i = 0; i < gBattleMoves[move].numAdditionalEffects; i++)
{
if (gBattleMoves[move].additionalEffects[i].self)
continue;
switch (gBattleMoves[move].additionalEffects[i].moveEffect)
{
case MOVE_EFFECT_FLINCH:
score += ShouldTryToFlinch(battlerAtk, battlerDef, aiData->abilities[battlerAtk], aiData->abilities[battlerDef], move);
break;
case MOVE_EFFECT_ATK_MINUS_1:
case MOVE_EFFECT_DEF_MINUS_1:
case MOVE_EFFECT_SP_ATK_MINUS_1:
case MOVE_EFFECT_SP_DEF_MINUS_1:
case MOVE_EFFECT_ACC_MINUS_1:
case MOVE_EFFECT_EVS_MINUS_1:
if (sereneGraceBoost && aiData->abilities[battlerDef] != ABILITY_CONTRARY)
ADJUST_SCORE(2);
break;
case MOVE_EFFECT_SPD_MINUS_1:
if (ShouldLowerSpeed(battlerAtk, battlerDef, aiData->abilities[battlerDef]))
{
// Consider move effects that target self
switch (gBattleMoves[move].additionalEffects[i].moveEffect)
{
case MOVE_EFFECT_SPD_PLUS_1:
if (sereneGraceBoost && aiData->abilities[battlerAtk] != ABILITY_CONTRARY && !AI_STRIKES_FIRST(battlerAtk, battlerDef, move))
ADJUST_SCORE(3);
break;
case MOVE_EFFECT_ATK_PLUS_1:
if (sereneGraceBoost)
IncreaseStatUpScore(battlerAtk, battlerDef, STAT_ATK, &score);
break;
case MOVE_EFFECT_SP_ATK_PLUS_1:
if (sereneGraceBoost)
IncreaseStatUpScore(battlerAtk, battlerDef, STAT_SPATK, &score);
break;
}
}
else // consider move effects that hinder the target
{
switch (gBattleMoves[move].additionalEffects[i].moveEffect)
{
case MOVE_EFFECT_FLINCH:
score += ShouldTryToFlinch(battlerAtk, battlerDef, aiData->abilities[battlerAtk], aiData->abilities[battlerDef], move);
break;
case MOVE_EFFECT_ATK_MINUS_1:
case MOVE_EFFECT_DEF_MINUS_1:
case MOVE_EFFECT_SP_ATK_MINUS_1:
case MOVE_EFFECT_SP_DEF_MINUS_1:
case MOVE_EFFECT_ACC_MINUS_1:
case MOVE_EFFECT_EVS_MINUS_1:
if (sereneGraceBoost && aiData->abilities[battlerDef] != ABILITY_CONTRARY)
ADJUST_SCORE(5);
else
ADJUST_SCORE(2);
}
break;
break;
case MOVE_EFFECT_SPD_MINUS_1:
if (ShouldLowerSpeed(battlerAtk, battlerDef, aiData->abilities[battlerDef]))
{
if (sereneGraceBoost && aiData->abilities[battlerDef] != ABILITY_CONTRARY)
ADJUST_SCORE(5);
else
ADJUST_SCORE(2);
}
break;
}
}
// Only consider the below if they're certain to happen
@ -4868,14 +4911,12 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score
IncreasePoisonScore(battlerAtk, battlerDef, move, &score);
break;
case MOVE_EFFECT_CLEAR_SMOG:
SHOULD_USE_PHAZING_MOVE:
if (isDoubleBattle)
score += min(CountPositiveStatStages(battlerDef) + CountPositiveStatStages(BATTLE_PARTNER(battlerDef)), 7);
else
score += min(CountPositiveStatStages(battlerDef), 4);
break;
case MOVE_EFFECT_SPECTRAL_THIEF:
SHOULD_USE_STAT_COPY_MOVE:
// Want to copy positive stat changes
for (i = STAT_ATK; i < NUM_BATTLE_STATS; i++)
{

View file

@ -850,87 +850,96 @@ static bool32 AI_IsMoveEffectInPlus(u32 battlerAtk, u32 battlerDef, u32 move, s3
if (CountUsablePartyMons(battlerAtk) != 0 && ShouldPivot(battlerAtk, battlerDef, abilityDef, move, AI_THINKING_STRUCT->movesetIndex))
return TRUE;
break;
case EFFECT_ATTACK_UP_HIT:
case EFFECT_FELL_STINGER:
if (BattlerStatCanRise(battlerAtk, abilityAtk, STAT_ATK))
return TRUE;
break;
case EFFECT_DEFENSE_UP2_HIT:
case EFFECT_DEFENSE_UP_HIT:
if (BattlerStatCanRise(battlerAtk, abilityAtk, STAT_DEF))
return TRUE;
break;
case EFFECT_SPEED_UP_HIT:
if (BattlerStatCanRise(battlerAtk, abilityAtk, STAT_SPEED))
return TRUE;
break;
case EFFECT_SPECIAL_ATTACK_UP_HIT:
if (BattlerStatCanRise(battlerAtk, abilityAtk, STAT_SPATK))
return TRUE;
break;
case EFFECT_ALL_STATS_UP_HIT:
for (i = STAT_ATK; i <= NUM_STATS; i++)
{
if (BattlerStatCanRise(battlerAtk, abilityAtk, i))
return TRUE;
}
break;
}
// check ADDITIONAL_EFFECTS
for (i = 0; i < gBattleMoves[move].numAdditionalEffects; i++)
{
// Obviously ignore moves that target self
// Consider move effects that target self
if (gBattleMoves[move].additionalEffects[i].self)
continue;
switch (gBattleMoves[move].additionalEffects[i].moveEffect)
{
case MOVE_EFFECT_POISON:
case MOVE_EFFECT_TOXIC:
if (AI_CanPoison(battlerAtk, battlerDef, abilityDef, move, MOVE_NONE))
return TRUE;
break;
case MOVE_EFFECT_BURN:
if (AI_CanBurn(battlerAtk, battlerDef, abilityDef, BATTLE_PARTNER(battlerAtk), move, MOVE_NONE))
return TRUE;
break;
case MOVE_EFFECT_FREEZE_OR_FROSTBITE:
if (AI_CanGetFrostbite(battlerDef, abilityDef))
return TRUE;
break;
case MOVE_EFFECT_PARALYSIS:
if (AI_CanParalyze(battlerAtk, battlerDef, abilityDef, move, MOVE_NONE))
return TRUE;
break;
case MOVE_EFFECT_CONFUSION:
if (AI_CanConfuse(battlerAtk, battlerDef, abilityDef, BATTLE_PARTNER(battlerAtk), move, MOVE_NONE))
return TRUE;
break;
case MOVE_EFFECT_FLINCH:
if (ShouldTryToFlinch(battlerAtk, battlerDef, abilityAtk, abilityDef, move))
return TRUE;
break;
case MOVE_EFFECT_ATK_MINUS_1:
case MOVE_EFFECT_DEF_MINUS_1:
case MOVE_EFFECT_SPD_MINUS_1:
case MOVE_EFFECT_SP_ATK_MINUS_1:
case MOVE_EFFECT_SP_DEF_MINUS_1:
case MOVE_EFFECT_ACC_MINUS_1:
case MOVE_EFFECT_EVS_MINUS_1:
if (ShouldLowerStat(battlerDef, abilityDef, STAT_ATK + (gBattleMoves[move].additionalEffects[i].moveEffect - MOVE_EFFECT_ATK_MINUS_1)) && noOfHitsToKo != 1)
return TRUE;
break;
case MOVE_EFFECT_ATK_MINUS_2:
case MOVE_EFFECT_DEF_MINUS_2:
case MOVE_EFFECT_SPD_MINUS_2:
case MOVE_EFFECT_SP_ATK_MINUS_2:
case MOVE_EFFECT_SP_DEF_MINUS_2:
case MOVE_EFFECT_ACC_MINUS_2:
case MOVE_EFFECT_EVS_MINUS_2:
if (ShouldLowerStat(battlerDef, abilityDef, STAT_ATK + (gBattleMoves[move].additionalEffects[i].moveEffect - MOVE_EFFECT_ATK_MINUS_2)) && noOfHitsToKo != 1)
return TRUE;
break;
switch (gBattleMoves[move].additionalEffects[i].moveEffect)
{
case MOVE_EFFECT_ATK_PLUS_1:
if (BattlerStatCanRise(battlerAtk, abilityAtk, STAT_ATK))
return TRUE;
break;
case MOVE_EFFECT_DEF_PLUS_2:
case MOVE_EFFECT_DEF_PLUS_1:
if (BattlerStatCanRise(battlerAtk, abilityAtk, STAT_DEF))
return TRUE;
break;
case MOVE_EFFECT_SPD_PLUS_1:
if (BattlerStatCanRise(battlerAtk, abilityAtk, STAT_SPEED))
return TRUE;
break;
case MOVE_EFFECT_SP_ATK_PLUS_1:
if (BattlerStatCanRise(battlerAtk, abilityAtk, STAT_SPATK))
return TRUE;
break;
case MOVE_EFFECT_ALL_STATS_UP:
for (i = STAT_ATK; i <= NUM_STATS; i++)
{
if (BattlerStatCanRise(battlerAtk, abilityAtk, i))
return TRUE;
}
break;
}
}
else // consider move effects that hinder the target
{
switch (gBattleMoves[move].additionalEffects[i].moveEffect)
{
case MOVE_EFFECT_POISON:
case MOVE_EFFECT_TOXIC:
if (AI_CanPoison(battlerAtk, battlerDef, abilityDef, move, MOVE_NONE))
return TRUE;
break;
case MOVE_EFFECT_BURN:
if (AI_CanBurn(battlerAtk, battlerDef, abilityDef, BATTLE_PARTNER(battlerAtk), move, MOVE_NONE))
return TRUE;
break;
case MOVE_EFFECT_FREEZE_OR_FROSTBITE:
if (AI_CanGetFrostbite(battlerDef, abilityDef))
return TRUE;
break;
case MOVE_EFFECT_PARALYSIS:
if (AI_CanParalyze(battlerAtk, battlerDef, abilityDef, move, MOVE_NONE))
return TRUE;
break;
case MOVE_EFFECT_CONFUSION:
if (AI_CanConfuse(battlerAtk, battlerDef, abilityDef, BATTLE_PARTNER(battlerAtk), move, MOVE_NONE))
return TRUE;
break;
case MOVE_EFFECT_FLINCH:
if (ShouldTryToFlinch(battlerAtk, battlerDef, abilityAtk, abilityDef, move))
return TRUE;
break;
case MOVE_EFFECT_ATK_MINUS_1:
case MOVE_EFFECT_DEF_MINUS_1:
case MOVE_EFFECT_SPD_MINUS_1:
case MOVE_EFFECT_SP_ATK_MINUS_1:
case MOVE_EFFECT_SP_DEF_MINUS_1:
case MOVE_EFFECT_ACC_MINUS_1:
case MOVE_EFFECT_EVS_MINUS_1:
if (ShouldLowerStat(battlerDef, abilityDef, STAT_ATK + (gBattleMoves[move].additionalEffects[i].moveEffect - MOVE_EFFECT_ATK_MINUS_1)) && noOfHitsToKo != 1)
return TRUE;
break;
case MOVE_EFFECT_ATK_MINUS_2:
case MOVE_EFFECT_DEF_MINUS_2:
case MOVE_EFFECT_SPD_MINUS_2:
case MOVE_EFFECT_SP_ATK_MINUS_2:
case MOVE_EFFECT_SP_DEF_MINUS_2:
case MOVE_EFFECT_ACC_MINUS_2:
case MOVE_EFFECT_EVS_MINUS_2:
if (ShouldLowerStat(battlerDef, abilityDef, STAT_ATK + (gBattleMoves[move].additionalEffects[i].moveEffect - MOVE_EFFECT_ATK_MINUS_2)) && noOfHitsToKo != 1)
return TRUE;
break;
}
}
}

View file

@ -206,9 +206,6 @@ static const u16 sPoints_MoveEffect[NUM_BATTLE_MOVE_EFFECTS] =
[EFFECT_HIDDEN_POWER] = 1,
[EFFECT_RAIN_DANCE] = 4,
[EFFECT_SUNNY_DAY] = 4,
[EFFECT_DEFENSE_UP_HIT] = 1,
[EFFECT_ATTACK_UP_HIT] = 1,
[EFFECT_ALL_STATS_UP_HIT] = 1,
[EFFECT_BELLY_DRUM] = 7,
[EFFECT_PSYCH_UP] = 7,
[EFFECT_MIRROR_COAT] = 6,
@ -342,7 +339,6 @@ static const u16 sPoints_MoveEffect[NUM_BATTLE_MOVE_EFFECTS] =
[EFFECT_HURRICANE] = 0, // TODO: Assign points
[EFFECT_TWO_TYPED_MOVE] = 0, // TODO: Assign points
[EFFECT_ME_FIRST] = 0, // TODO: Assign points
[EFFECT_SPEED_UP_HIT] = 0, // TODO: Assign points
[EFFECT_QUIVER_DANCE] = 0, // TODO: Assign points
[EFFECT_COIL] = 0, // TODO: Assign points
[EFFECT_ELECTRIFY] = 0, // TODO: Assign points
@ -386,7 +382,6 @@ static const u16 sPoints_MoveEffect[NUM_BATTLE_MOVE_EFFECTS] =
[EFFECT_ACUPRESSURE] = 0, // TODO: Assign points
[EFFECT_AROMATIC_MIST] = 0, // TODO: Assign points
[EFFECT_POWDER] = 0, // TODO: Assign points
[EFFECT_SP_ATTACK_UP_HIT] = 0, // TODO: Assign points
[EFFECT_BELCH] = 0, // TODO: Assign points
[EFFECT_PARTING_SHOT] = 0, // TODO: Assign points
[EFFECT_MAT_BLOCK] = 0, // TODO: Assign points
@ -419,7 +414,6 @@ static const u16 sPoints_MoveEffect[NUM_BATTLE_MOVE_EFFECTS] =
[EFFECT_RECOIL_HP_25] = 0, // TODO: Assign points
[EFFECT_STUFF_CHEEKS] = 0, // TODO: Assign points
[EFFECT_GRAV_APPLE] = 0, // TODO: Assign points
[EFFECT_EVASION_UP_HIT] = 0, // TODO: Assign points
[EFFECT_GLITZY_GLOW] = 0, // TODO: Assign points
[EFFECT_BADDY_BAD] = 0, // TODO: Assign points
[EFFECT_SAPPY_SEED] = 0, // TODO: Assign points
@ -448,7 +442,6 @@ static const u16 sPoints_MoveEffect[NUM_BATTLE_MOVE_EFFECTS] =
[EFFECT_HIT_SET_REMOVE_TERRAIN] = 0, // TODO: Assign points
[EFFECT_DARK_VOID] = 0, // TODO: Assign points
[EFFECT_DOUBLE_SHOCK] = 0, // TODO: Assign points
[EFFECT_SPECIAL_ATTACK_UP_HIT] = 1,
[EFFECT_VICTORY_DANCE] = 0, // TODO: Assign points
};

View file

@ -3872,18 +3872,20 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_STEEL_WING] =
{
.effect = EFFECT_DEFENSE_UP_HIT,
.effect = EFFECT_HIT,
.power = 70,
.type = TYPE_STEEL,
.accuracy = 90,
.pp = 25,
.secondaryEffectChance = 10,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.split = SPLIT_PHYSICAL,
.zMoveEffect = Z_EFFECT_NONE,
.makesContact = TRUE,
.sheerForceBoost = TRUE,
ADDITIONAL_EFFECTS(
SECONDARY_EFFECT_SELF(MOVE_EFFECT_DEF_PLUS_1, 10),
),
},
[MOVE_MEAN_LOOK] =
@ -4228,18 +4230,20 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_METAL_CLAW] =
{
.effect = EFFECT_ATTACK_UP_HIT,
.effect = EFFECT_HIT,
.power = 50,
.type = TYPE_STEEL,
.accuracy = 95,
.pp = 35,
.secondaryEffectChance = 10,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.split = SPLIT_PHYSICAL,
.zMoveEffect = Z_EFFECT_NONE,
.makesContact = TRUE,
.sheerForceBoost = TRUE,
ADDITIONAL_EFFECTS(
SECONDARY_EFFECT_SELF(MOVE_EFFECT_ATK_PLUS_1, 10)
),
},
[MOVE_VITAL_THROW] =
@ -4478,20 +4482,20 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_ANCIENT_POWER] =
{
#if B_UPDATED_MOVE_DATA < GEN_4
.makesContact = TRUE,
#endif
.effect = EFFECT_ALL_STATS_UP_HIT,
.effect = EFFECT_HIT,
.power = 60,
.type = TYPE_ROCK,
.accuracy = 100,
.pp = 5,
.secondaryEffectChance = 10,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.split = SPLIT_SPECIAL,
.zMoveEffect = Z_EFFECT_NONE,
.makesContact = B_UPDATED_MOVE_DATA < GEN_4,
.sheerForceBoost = TRUE,
ADDITIONAL_EFFECTS(
SECONDARY_EFFECT_SELF(MOVE_EFFECT_ALL_STATS_UP, 10)
),
},
[MOVE_SHADOW_BALL] =
@ -5632,10 +5636,9 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
.power = 100,
.accuracy = 85,
#endif
.effect = EFFECT_ATTACK_UP_HIT,
.effect = EFFECT_HIT,
.type = TYPE_STEEL,
.pp = 10,
.secondaryEffectChance = 20,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.split = SPLIT_PHYSICAL,
@ -5643,6 +5646,9 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
.makesContact = TRUE,
.punchingMove = TRUE,
.sheerForceBoost = TRUE,
ADDITIONAL_EFFECTS(
SECONDARY_EFFECT_SELF(MOVE_EFFECT_ATK_PLUS_1, 20)
),
},
[MOVE_ASTONISH] =
@ -5798,18 +5804,20 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_SILVER_WIND] =
{
.effect = EFFECT_ALL_STATS_UP_HIT,
.effect = EFFECT_HIT,
.power = 60,
.type = TYPE_BUG,
.accuracy = 100,
.pp = 5,
.secondaryEffectChance = 10,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.split = SPLIT_SPECIAL,
.zMoveEffect = Z_EFFECT_NONE,
.sheerForceBoost = TRUE,
.windMove = B_EXTRAPOLATED_MOVE_FLAGS,
ADDITIONAL_EFFECTS(
SECONDARY_EFFECT_SELF(MOVE_EFFECT_ALL_STATS_UP, 10)
),
},
[MOVE_METAL_SOUND] =
@ -8062,25 +8070,18 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
.makesContact = TRUE,
},
#if B_UPDATED_MOVE_DATA == GEN_5
#define CHATTER_EFFECT_CHANCE 10
#elif B_UPDATED_MOVE_DATA >= GEN_6
#define CHATTER_EFFECT_CHANCE 100
#else
#define CHATTER_EFFECT_CHANCE 31
#endif
[MOVE_CHATTER] =
{
#if B_UPDATED_MOVE_DATA >= GEN_6
.power = 65,
ADDITIONAL_EFFECTS(
SECONDARY_EFFECT(MOVE_EFFECT_CONFUSION, 100)
),
#elif B_UPDATED_MOVE_DATA == GEN_5
.power = 60,
ADDITIONAL_EFFECTS(
SECONDARY_EFFECT(MOVE_EFFECT_CONFUSION, 10)
),
#else
.power = 60,
ADDITIONAL_EFFECTS(
SECONDARY_EFFECT(MOVE_EFFECT_CONFUSION, 31)
),
#endif
.effect = EFFECT_HIT,
.power = B_UPDATED_MOVE_DATA >= GEN_6 ? 65 : 60,
.type = TYPE_FLYING,
.accuracy = 100,
.pp = 20,
@ -8098,6 +8099,9 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
.sleepTalkBanned = TRUE,
.instructBanned = TRUE,
.assistBanned = TRUE,
ADDITIONAL_EFFECTS(
SECONDARY_EFFECT(MOVE_EFFECT_CONFUSION, CHATTER_EFFECT_CHANCE)
),
},
[MOVE_JUDGMENT] =
@ -8132,17 +8136,19 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_CHARGE_BEAM] =
{
.effect = EFFECT_SP_ATTACK_UP_HIT,
.effect = EFFECT_HIT,
.power = 50,
.type = TYPE_ELECTRIC,
.accuracy = 90,
.pp = 10,
.secondaryEffectChance = 70,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.split = SPLIT_SPECIAL,
.zMoveEffect = Z_EFFECT_NONE,
.sheerForceBoost = TRUE,
ADDITIONAL_EFFECTS(
SECONDARY_EFFECT_SELF(MOVE_EFFECT_SP_ATK_PLUS_1, 70)
),
},
[MOVE_WOOD_HAMMER] =
@ -8381,18 +8387,20 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_OMINOUS_WIND] =
{
.effect = EFFECT_ALL_STATS_UP_HIT,
.effect = EFFECT_HIT,
.power = 60,
.type = TYPE_GHOST,
.accuracy = 100,
.pp = 5,
.secondaryEffectChance = 10,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.split = SPLIT_SPECIAL,
.zMoveEffect = Z_EFFECT_NONE,
.sheerForceBoost = TRUE,
.windMove = B_EXTRAPOLATED_MOVE_FLAGS,
ADDITIONAL_EFFECTS(
SECONDARY_EFFECT_SELF(MOVE_EFFECT_ALL_STATS_UP, 10)
),
},
[MOVE_SHADOW_FORCE] =
@ -8758,18 +8766,20 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_FLAME_CHARGE] =
{
.effect = EFFECT_SPEED_UP_HIT,
.effect = EFFECT_HIT,
.power = 50,
.type = TYPE_FIRE,
.accuracy = 100,
.pp = 20,
.secondaryEffectChance = 100,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.split = SPLIT_PHYSICAL,
.zMoveEffect = Z_EFFECT_NONE,
.makesContact = TRUE,
.sheerForceBoost = TRUE,
ADDITIONAL_EFFECTS(
SECONDARY_EFFECT_SELF(MOVE_EFFECT_SPD_PLUS_1, 100)
),
},
[MOVE_COIL] =
@ -9860,18 +9870,20 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_FIERY_DANCE] =
{
.effect = EFFECT_SP_ATTACK_UP_HIT,
.effect = EFFECT_HIT,
.power = 80,
.type = TYPE_FIRE,
.accuracy = 100,
.pp = 10,
.secondaryEffectChance = 50,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.split = SPLIT_SPECIAL,
.zMoveEffect = Z_EFFECT_NONE,
.sheerForceBoost = TRUE,
.danceMove = TRUE,
ADDITIONAL_EFFECTS(
SECONDARY_EFFECT_SELF(MOVE_EFFECT_SP_ATK_PLUS_1, 50)
),
},
[MOVE_FREEZE_SHOCK] =
@ -10543,22 +10555,19 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_DIAMOND_STORM] =
{
#if B_UPDATED_MOVE_DATA >= GEN_7
.effect = EFFECT_DEFENSE_UP2_HIT,
#else
.effect = EFFECT_DEFENSE_UP_HIT,
#endif
.power = 100,
.type = TYPE_ROCK,
.accuracy = 95,
.pp = 5,
.secondaryEffectChance = 50,
.target = MOVE_TARGET_BOTH,
.priority = 0,
.split = SPLIT_PHYSICAL,
.zMoveEffect = Z_EFFECT_NONE,
.sheerForceBoost = TRUE,
.metronomeBanned = TRUE,
ADDITIONAL_EFFECTS(
SECONDARY_EFFECT_SELF(B_UPDATED_MOVE_DATA >= GEN_7 ? MOVE_EFFECT_DEF_PLUS_2: MOVE_EFFECT_DEF_PLUS_1, 50),
),
},
[MOVE_STEAM_ERUPTION] =
@ -10910,12 +10919,11 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_POWER_UP_PUNCH] =
{
.effect = EFFECT_ATTACK_UP_HIT,
.effect = EFFECT_HIT,
.power = 40,
.type = TYPE_FIGHTING,
.accuracy = 100,
.pp = 20,
.secondaryEffectChance = 100,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.split = SPLIT_PHYSICAL,
@ -10923,6 +10931,9 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
.makesContact = TRUE,
.punchingMove = TRUE,
.sheerForceBoost = TRUE,
ADDITIONAL_EFFECTS(
SECONDARY_EFFECT_SELF(MOVE_EFFECT_ATK_PLUS_1, 100)
),
},
[MOVE_OBLIVION_WING] =
@ -11976,26 +11987,24 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_ZIPPY_ZAP] =
{
#if B_UPDATED_MOVE_DATA >= GEN_8
.power = 80,
.effect = EFFECT_EVASION_UP_HIT,
.pp = 10,
.sheerForceBoost = TRUE,
#else
.effect = EFFECT_ALWAYS_CRIT,
.power = 50,
.pp = 15,
#endif
.effect = B_UPDATED_MOVE_DATA >= GEN_8 ? EFFECT_HIT : EFFECT_ALWAYS_CRIT,
.power = B_UPDATED_MOVE_DATA >= GEN_8 ? 80 : 50,
.type = TYPE_ELECTRIC,
.accuracy = 100,
.secondaryEffectChance = 100,
.pp = B_UPDATED_MOVE_DATA >= GEN_8 ? 10 : 15,
.target = MOVE_TARGET_SELECTED,
.priority = 2,
.split = SPLIT_PHYSICAL,
.zMoveEffect = Z_EFFECT_NONE,
.makesContact = TRUE,
.mirrorMoveBanned = B_UPDATED_MOVE_FLAGS < GEN_8,
.sheerForceBoost = B_UPDATED_MOVE_DATA >= GEN_8,
.metronomeBanned = TRUE,
#if B_UPDATED_MOVE_DATA < GEN_8
ADDITIONAL_EFFECTS(
SECONDARY_EFFECT(MOVE_EFFECT_EVS_PLUS_1, 100)
),
#endif
},
[MOVE_SPLISHY_SPLASH] =
@ -12014,7 +12023,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
.metronomeBanned = TRUE,
ADDITIONAL_EFFECTS(
SECONDARY_EFFECT(MOVE_EFFECT_PARALYSIS, 30)
)
),
},
[MOVE_FLOATY_FALL] =
@ -13394,18 +13403,20 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_PSYSHIELD_BASH] =
{
.effect = EFFECT_DEFENSE_UP_HIT,
.effect = EFFECT_HIT,
.power = 70,
.type = TYPE_PSYCHIC,
.accuracy = 90,
.pp = 10,
.secondaryEffectChance = 100,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.split = SPLIT_PHYSICAL,
.zMoveEffect = Z_EFFECT_NONE,
.makesContact = TRUE,
.sheerForceBoost = TRUE,
ADDITIONAL_EFFECTS(
SECONDARY_EFFECT_SELF(MOVE_EFFECT_DEF_PLUS_1, 100)
),
},
[MOVE_POWER_SHIFT] =
@ -13470,17 +13481,19 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_MYSTICAL_POWER] =
{
.effect = EFFECT_SPECIAL_ATTACK_UP_HIT,
.effect = EFFECT_HIT,
.power = 70,
.type = TYPE_PSYCHIC,
.accuracy = 90,
.pp = 10,
.secondaryEffectChance = 100,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.split = SPLIT_SPECIAL,
.zMoveEffect = Z_EFFECT_NONE,
.sheerForceBoost = TRUE,
ADDITIONAL_EFFECTS(
SECONDARY_EFFECT_SELF(MOVE_EFFECT_SP_ATK_PLUS_1, 100)
),
},
[MOVE_RAGING_FURY] =
@ -13624,16 +13637,18 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
.power = 75,
.accuracy = 90,
#endif
.effect = EFFECT_SPEED_UP_HIT,
.effect = EFFECT_HIT,
.type = TYPE_PSYCHIC,
.pp = 10,
.secondaryEffectChance = 100,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.split = SPLIT_SPECIAL,
.zMoveEffect = Z_EFFECT_NONE,
.highCritRatio = TRUE,
.sheerForceBoost = TRUE,
ADDITIONAL_EFFECTS(
SECONDARY_EFFECT_SELF(MOVE_EFFECT_SPD_PLUS_1, 100)
),
},
[MOVE_BITTER_MALICE] =
@ -14177,12 +14192,11 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_TORCH_SONG] =
{
.effect = EFFECT_SP_ATTACK_UP_HIT,
.effect = EFFECT_HIT,
.power = 80,
.type = TYPE_FIRE,
.accuracy = 100,
.pp = 10,
.secondaryEffectChance = 100,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.split = SPLIT_SPECIAL,
@ -14190,16 +14204,18 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
.sheerForceBoost = TRUE,
.soundMove = TRUE,
.ignoresSubstitute = B_UPDATED_MOVE_FLAGS >= GEN_6,
ADDITIONAL_EFFECTS(
SECONDARY_EFFECT_SELF(MOVE_EFFECT_SP_ATK_PLUS_1, 100)
),
},
[MOVE_AQUA_STEP] =
{
.effect = EFFECT_SPEED_UP_HIT,
.effect = EFFECT_HIT,
.power = 80,
.type = TYPE_WATER,
.accuracy = 100,
.pp = 10,
.secondaryEffectChance = 100,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.split = SPLIT_PHYSICAL,
@ -14207,6 +14223,9 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
.makesContact = TRUE,
.sheerForceBoost = TRUE,
.danceMove = TRUE,
ADDITIONAL_EFFECTS(
SECONDARY_EFFECT_SELF(MOVE_EFFECT_SPD_PLUS_1, 100)
),
},
[MOVE_RAGING_BULL] =
@ -14376,18 +14395,20 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
[MOVE_TRAILBLAZE] =
{
.effect = EFFECT_SPEED_UP_HIT,
.effect = EFFECT_HIT,
.power = 50,
.type = TYPE_GRASS,
.accuracy = 100,
.pp = 20,
.secondaryEffectChance = 100,
.target = MOVE_TARGET_SELECTED,
.priority = 0,
.split = SPLIT_PHYSICAL,
.zMoveEffect = Z_EFFECT_NONE,
.makesContact = TRUE,
.metronomeBanned = TRUE,
ADDITIONAL_EFFECTS(
SECONDARY_EFFECT_SELF(MOVE_EFFECT_SPD_PLUS_1, 100)
),
},
[MOVE_CHILLING_WATER] =
@ -15165,18 +15186,20 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] =
},
[MOVE_CLANGOROUS_SOULBLAZE] =
{
.effect = EFFECT_ALL_STATS_UP_HIT,
.effect = EFFECT_HIT,
.power = 185,
.type = TYPE_DRAGON,
.accuracy = 0,
.pp = 1,
.secondaryEffectChance = 100,
.target = MOVE_TARGET_BOTH,
.priority = 0,
.split = SPLIT_SPECIAL,
.zMoveEffect = 0,
.soundMove = TRUE,
.ignoresSubstitute = B_UPDATED_MOVE_FLAGS >= GEN_6,
ADDITIONAL_EFFECTS(
SECONDARY_EFFECT_SELF(MOVE_EFFECT_ALL_STATS_UP, 100)
),
},
[MOVE_GUARDIAN_OF_ALOLA] =
{