From 77c722ea098ef1568e546c8a5a71e837c1309ffb Mon Sep 17 00:00:00 2001 From: Nephrite Date: Wed, 27 Dec 2023 17:41:45 +0900 Subject: [PATCH] Obsoleted 22 more effects Also added a better way of calculating battle_tv score properly; to do: Make it Rain --- data/battle_scripts_1.s | 82 +++------ include/battle.h | 4 +- include/battle_ai_util.h | 3 +- include/constants/battle_move_effects.h | 46 ++--- src/battle_ai_main.c | 133 +++++++------ src/battle_ai_util.c | 51 +++-- src/battle_dome.c | 9 +- src/battle_script_commands.c | 38 ++-- src/battle_tv.c | 45 +++-- src/battle_util.c | 19 +- .../battle_pyramid_wild_requirements.h | 2 +- src/data/battle_moves.h | 174 +++++++++--------- test/battle/ability/sheer_force.c | 2 +- test/battle/ai_check_viability.c | 7 +- test/battle/hold_effect/air_balloon.c | 2 +- test/battle/hold_effect/red_card.c | 2 +- test/battle/hold_effect/white_herb.c | 2 +- test/battle/move_effect/barb_barrage.c | 3 +- test/battle/move_effect/hex.c | 3 +- .../move_effect/hit_set_entry_hazardss.c | 4 +- test/battle/move_effect/infernal_parade.c | 5 +- test/battle/move_effect/protect.c | 8 +- test/battle/move_effect/recoil.c | 4 - test/battle/move_effect/venoshock.c | 3 +- 24 files changed, 316 insertions(+), 335 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index a53d977f0b..13e6dede1c 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -57,12 +57,12 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectHit @ EFFECT_FUSION_COMBO .4byte BattleScript_EffectSuperFang @ EFFECT_SUPER_FANG .4byte BattleScript_EffectDragonRage @ EFFECT_DRAGON_RAGE - .4byte BattleScript_EffectTrap @ EFFECT_TRAP + .4byte BattleScript_EffectHit @ EFFECT_UNUSED_35 .4byte BattleScript_EffectHealBlock @ EFFECT_HEAL_BLOCK .4byte BattleScript_EffectRecoilIfMiss @ EFFECT_RECOIL_IF_MISS .4byte BattleScript_EffectMist @ EFFECT_MIST .4byte BattleScript_EffectFocusEnergy @ EFFECT_FOCUS_ENERGY - .4byte BattleScript_EffectHit @ EFFECT_RECOIL + .4byte BattleScript_EffectHit @ EFFECT_UNUSED_40 .4byte BattleScript_EffectConfuse @ EFFECT_CONFUSE .4byte BattleScript_EffectAttackUp2 @ EFFECT_ATTACK_UP_2 .4byte BattleScript_EffectDefenseUp2 @ EFFECT_DEFENSE_UP_2 @@ -83,9 +83,9 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectPoison @ EFFECT_POISON .4byte BattleScript_EffectParalyze @ EFFECT_PARALYZE .4byte BattleScript_EffectTwoTurnsAttack @ EFFECT_TWO_TURNS_ATTACK - .4byte BattleScript_EffectHit @ EFFECT_VITAL_THROW + .4byte BattleScript_EffectHit @ EFFECT_UNUSED_61 .4byte BattleScript_EffectSubstitute @ EFFECT_SUBSTITUTE - .4byte BattleScript_EffectHit @ EFFECT_RECHARGE + .4byte BattleScript_EffectHit @ EFFECT_UNUSED_63 .4byte BattleScript_EffectRage @ EFFECT_RAGE .4byte BattleScript_EffectMimic @ EFFECT_MIMIC .4byte BattleScript_EffectMetronome @ EFFECT_METRONOME @@ -108,7 +108,7 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectHit @ EFFECT_FALSE_SWIPE .4byte BattleScript_EffectHealBell @ EFFECT_HEAL_BELL .4byte BattleScript_EffectTripleKick @ EFFECT_TRIPLE_KICK - .4byte BattleScript_EffectHit @ EFFECT_THIEF + .4byte BattleScript_EffectHit @ EFFECT_UNUSED_86 .4byte BattleScript_EffectMeanLook @ EFFECT_MEAN_LOOK .4byte BattleScript_EffectNightmare @ EFFECT_NIGHTMARE .4byte BattleScript_EffectMinimize @ EFFECT_MINIMIZE @@ -140,7 +140,7 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectHit @ EFFECT_HIDDEN_POWER .4byte BattleScript_EffectRainDance @ EFFECT_RAIN_DANCE .4byte BattleScript_EffectSunnyDay @ EFFECT_SUNNY_DAY - .4byte BattleScript_EffectHit @ EFFECT_ALL_STATS_UP_HIT + .4byte BattleScript_EffectHit @ EFFECT_UNUSED_118 .4byte BattleScript_EffectHit @ EFFECT_FELL_STINGER .4byte BattleScript_EffectBellyDrum @ EFFECT_BELLY_DRUM .4byte BattleScript_EffectPsychUp @ EFFECT_PSYCH_UP @@ -169,7 +169,7 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectMemento @ EFFECT_MEMENTO .4byte BattleScript_EffectHit @ EFFECT_FACADE .4byte BattleScript_EffectFocusPunch @ EFFECT_FOCUS_PUNCH - .4byte BattleScript_EffectSmellingsalt @ EFFECT_SMELLING_SALTS + .4byte BattleScript_EffectHit @ EFFECT_DOUBLE_POWER_ON_ARG_STATUS .4byte BattleScript_EffectFollowMe @ EFFECT_FOLLOW_ME .4byte BattleScript_EffectNaturePower @ EFFECT_NATURE_POWER .4byte BattleScript_EffectCharge @ EFFECT_CHARGE @@ -194,7 +194,7 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectGrudge @ EFFECT_GRUDGE .4byte BattleScript_EffectSnatch @ EFFECT_SNATCH .4byte BattleScript_EffectHit @ EFFECT_LOW_KICK - .4byte BattleScript_EffectHit @ EFFECT_SECRET_POWER + .4byte BattleScript_EffectHit @ EFFECT_UNUSED_172 .4byte BattleScript_EffectTeeterDance @ EFFECT_TEETER_DANCE .4byte BattleScript_EffectHitEscape @ EFFECT_HIT_ESCAPE .4byte BattleScript_EffectMudSport @ EFFECT_MUD_SPORT @@ -211,9 +211,9 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectPledge @ EFFECT_PLEDGE .4byte BattleScript_EffectFling @ EFFECT_FLING .4byte BattleScript_EffectNaturalGift @ EFFECT_NATURAL_GIFT - .4byte BattleScript_EffectWakeUpSlap @ EFFECT_WAKE_UP_SLAP + .4byte BattleScript_EffectHit @ EFFECT_UNUSED_189 .4byte BattleScript_EffectHit @ EFFECT_WRING_OUT - .4byte BattleScript_EffectHit @ EFFECT_HEX + .4byte BattleScript_EffectHit @ EFFECT_UNUSED_191 .4byte BattleScript_EffectHit @ EFFECT_ASSURANCE .4byte BattleScript_EffectHit @ EFFECT_TRUMP_CARD .4byte BattleScript_EffectHit @ EFFECT_ACROBATICS @@ -226,7 +226,7 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectHit @ EFFECT_PAYBACK .4byte BattleScript_EffectHit @ EFFECT_ROUND .4byte BattleScript_EffectHit @ EFFECT_BRINE - .4byte BattleScript_EffectHit @ EFFECT_VENOSHOCK + .4byte BattleScript_EffectHit @ EFFECT_UNUSED_204 .4byte BattleScript_EffectHit @ EFFECT_RETALIATE .4byte BattleScript_EffectHit @ EFFECT_BULLDOZE .4byte BattleScript_EffectHit @ EFFECT_FOUL_PLAY @@ -290,23 +290,23 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectCopycat @ EFFECT_COPYCAT .4byte BattleScript_EffectDefog @ EFFECT_DEFOG .4byte BattleScript_EffectHitEnemyHealAlly @ EFFECT_HIT_ENEMY_HEAL_ALLY - .4byte BattleScript_EffectSmackDown @ EFFECT_SMACK_DOWN + .4byte BattleScript_EffectHit @ EFFECT_UNUSED_268 .4byte BattleScript_EffectSynchronoise @ EFFECT_SYNCHRONOISE .4byte BattleScript_EffectPsychoShift @ EFFECT_PSYCHO_SHIFT .4byte BattleScript_EffectPowerTrick @ EFFECT_POWER_TRICK - .4byte BattleScript_EffectFlameBurst @ EFFECT_FLAME_BURST + .4byte BattleScript_EffectHit @ EFFECT_UNUSED_272 .4byte BattleScript_EffectAfterYou @ EFFECT_AFTER_YOU .4byte BattleScript_EffectBestow @ EFFECT_BESTOW .4byte BattleScript_EffectRototiller @ EFFECT_ROTOTILLER .4byte BattleScript_EffectFlowerShield @ EFFECT_FLOWER_SHIELD - .4byte BattleScript_EffectHit @ EFFECT_HIT_PREVENT_ESCAPE + .4byte BattleScript_EffectHit @ EFFECT_UNUSED_277 .4byte BattleScript_EffectSpeedSwap @ EFFECT_SPEED_SWAP - .4byte BattleScript_EffectDefenseUp2Hit @ EFFECT_DEFENSE_UP2_HIT + .4byte BattleScript_EffectHit @ EFFECT_UNUSED_279 .4byte BattleScript_EffectHit @ EFFECT_REVELATION_DANCE .4byte BattleScript_EffectAuroraVeil @ EFFECT_AURORA_VEIL .4byte BattleScript_EffectThirdType @ EFFECT_THIRD_TYPE - .4byte BattleScript_EffectHit @ EFFECT_FEINT - .4byte BattleScript_EffectSparklingAria @ EFFECT_SPARKLING_ARIA + .4byte BattleScript_EffectHit @ EFFECT_UNUSED_283 + .4byte BattleScript_EffectHit @ EFFECT_UNUSED_284 .4byte BattleScript_EffectAcupressure @ EFFECT_ACUPRESSURE .4byte BattleScript_EffectAromaticMist @ EFFECT_AROMATIC_MIST .4byte BattleScript_EffectPowder @ EFFECT_POWDER @@ -315,12 +315,12 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectMatBlock @ EFFECT_MAT_BLOCK .4byte BattleScript_EffectHit @ EFFECT_STOMPING_TANTRUM .4byte BattleScript_EffectInstruct @ EFFECT_INSTRUCT - .4byte BattleScript_EffectThroatChop @ EFFECT_THROAT_CHOP + .4byte BattleScript_EffectHit @ EFFECT_UNUSED_293 .4byte BattleScript_EffectLaserFocus @ EFFECT_LASER_FOCUS .4byte BattleScript_EffectMagneticFlux @ EFFECT_MAGNETIC_FLUX .4byte BattleScript_EffectGearUp @ EFFECT_GEAR_UP - .4byte BattleScript_EffectHit @ EFFECT_INCINERATE - .4byte BattleScript_EffectHit @ EFFECT_BUG_BITE + .4byte BattleScript_EffectHit @ EFFECT_UNUSED_297 + .4byte BattleScript_EffectHit @ EFFECT_UNUSED_298 .4byte BattleScript_EffectStrengthSap @ EFFECT_STRENGTH_SAP .4byte BattleScript_EffectMindBlown @ EFFECT_MIND_BLOWN .4byte BattleScript_EffectPurify @ EFFECT_PURIFY @@ -376,11 +376,11 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectShellTrap @ EFFECT_SHELL_TRAP .4byte BattleScript_EffectHit @ EFFECT_PSYBLADE .4byte BattleScript_EffectHit @ EFFECT_HYDRO_STEAM - .4byte BattleScript_EffectHit @ EFFECT_HIT_SET_ENTRY_HAZARD - .4byte BattleScript_EffectHit @ EFFECT_BARB_BARRAGE + .4byte BattleScript_EffectHit @ EFFECT_UNUSED_354 + .4byte BattleScript_EffectHit @ EFFECT_UNUSED_355 .4byte BattleScript_EffectRevivalBlessing @ EFFECT_REVIVAL_BLESSING .4byte BattleScript_EffectSnow @ EFFECT_SNOWSCAPE - .4byte BattleScript_EffectHit @ EFFECT_INFERNAL_PARADE + .4byte BattleScript_EffectHit @ EFFECT_UNUSED_358 .4byte BattleScript_EffectTakeHeart @ EFFECT_TAKE_HEART .4byte BattleScript_EffectHit @ EFFECT_COLLISION_COURSE .4byte BattleScript_EffectMakeItRain @ EFFECT_MAKE_IT_RAIN @@ -1187,7 +1187,7 @@ BattleScript_EffectNoRetreat: waitanimation call BattleScript_AllStatsUp jumpifstatus2 BS_TARGET, STATUS2_ESCAPE_PREVENTION, BattleScript_MoveEnd - setmoveeffect MOVE_EFFECT_PREVENT_ESCAPE + setmoveeffect MOVE_EFFECT_PREVENT_ESCAPE | MOVE_EFFECT_AFFECTS_USER seteffectprimary printstring STRINGID_CANTESCAPEDUETOUSEDMOVE waitmessage B_WAIT_TIME_LONG @@ -1786,10 +1786,6 @@ BattleScript_EffectThirdType: waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd -BattleScript_EffectDefenseUp2Hit: - setmoveeffect MOVE_EFFECT_DEF_PLUS_2 | MOVE_EFFECT_AFFECTS_USER - goto BattleScript_EffectHit - BattleScript_EffectFlowerShield: attackcanceler attackstring @@ -1899,10 +1895,6 @@ BattleScript_EffectAfterYou: waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd -BattleScript_EffectFlameBurst: - setmoveeffect MOVE_EFFECT_FLAME_BURST | MOVE_EFFECT_AFFECTS_USER - goto BattleScript_EffectHit - BattleScript_MoveEffectFlameBurst:: tryfaintmon BS_TARGET copybyte sBATTLER, sSAVED_BATTLER @@ -1992,10 +1984,6 @@ BattleScript_SynchronoiseNoEffect: waitmessage B_WAIT_TIME_LONG goto BattleScript_SynchronoiseMoveTargetEnd -BattleScript_EffectSmackDown: - setmoveeffect MOVE_EFFECT_SMACK_DOWN - goto BattleScript_EffectHit - BattleScript_MoveEffectSmackDown:: printstring STRINGID_FELLSTRAIGHTDOWN waitmessage B_WAIT_TIME_LONG @@ -3063,11 +3051,6 @@ BattleScript_EffectHealBlock: waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd -BattleScript_EffectThroatChop: - jumpifsubstituteblocks BattleScript_EffectHit - setmoveeffect MOVE_EFFECT_THROAT_CHOP | MOVE_EFFECT_CERTAIN - goto BattleScript_EffectHit - BattleScript_EffectHitEscape: call BattleScript_EffectHit_Ret jumpifmovehadnoeffect BattleScript_MoveEnd @@ -3885,10 +3868,6 @@ BattleScript_EffectDragonRage:: adjustdamage goto BattleScript_HitFromAtkAnimation -BattleScript_EffectTrap:: - setmoveeffect MOVE_EFFECT_WRAP - goto BattleScript_EffectHit - BattleScript_EffectRecoilIfMiss:: attackcanceler accuracycheck BattleScript_MoveMissedDoDamage, ACC_CURR_MOVE @@ -5073,11 +5052,6 @@ BattleScript_SkullBashEnd:: call BattleScript_PowerHerbActivation goto BattleScript_TwoTurnMovesSecondTurn -BattleScript_EffectBulldoze: - setmoveeffect MOVE_EFFECT_SPD_MINUS_1 -BattleScript_EffectEarthquake: - goto BattleScript_EffectHit - BattleScript_EffectFutureSight:: attackcanceler attackstring @@ -5519,13 +5493,6 @@ BattleScript_EffectFocusPunch:: waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd -BattleScript_EffectSmellingsalt: -BattleScript_EffectWakeUpSlap: -BattleScript_EffectSparklingAria: - jumpifsubstituteblocks BattleScript_EffectHit - setmoveeffect MOVE_EFFECT_REMOVE_STATUS | MOVE_EFFECT_CERTAIN - goto BattleScript_EffectHit - BattleScript_EffectFollowMe:: attackcanceler attackstring @@ -5830,7 +5797,6 @@ BattleScript_EffectSnatch: goto BattleScript_MoveEnd BattleScript_EffectRecoilHP25: - setmoveeffect MOVE_EFFECT_RECOIL_HP_25 | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN jumpifnotmove MOVE_STRUGGLE, BattleScript_EffectHit incrementgamestat GAME_STAT_USED_STRUGGLE goto BattleScript_EffectHit diff --git a/include/battle.h b/include/battle.h index b3e6b5fd9b..17fd247bd0 100644 --- a/include/battle.h +++ b/include/battle.h @@ -780,9 +780,7 @@ STATIC_ASSERT(sizeof(((struct BattleStruct *)0)->palaceFlags) * 8 >= MAX_BATTLER #define IS_MOVE_SPECIAL(move)(GetBattleMoveCategory(move) == BATTLE_CATEGORY_SPECIAL) #define IS_MOVE_STATUS(move)(gBattleMoves[move].category == BATTLE_CATEGORY_STATUS) -#define IS_EFFECT_RECOIL(effect)(effect == EFFECT_RECOIL || effect == EFFECT_RECOIL_IF_MISS) - -#define IS_MOVE_RECOIL(move)(IS_EFFECT_RECOIL(gBattleMoves[move].effect)) +#define IS_MOVE_RECOIL(move)(gBattleMoves[move].recoil > 0 || gBattleMoves[move].effect == EFFECT_RECOIL_IF_MISS) #define BATTLER_MAX_HP(battlerId)(gBattleMons[battlerId].hp == gBattleMons[battlerId].maxHP) #define TARGET_TURN_DAMAGED ((gSpecialStatuses[gBattlerTarget].physicalDmg != 0 || gSpecialStatuses[gBattlerTarget].specialDmg != 0) || (gBattleStruct->enduredDamage & gBitTable[gBattlerTarget])) diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index dc848e049d..832c231401 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -66,6 +66,7 @@ u32 AI_GetBattlerMoveTargetType(u32 battlerId, u32 move); bool32 ShouldUseZMove(u32 battlerAtk, u32 battlerDef, u32 chosenMove); u32 AI_CalcSecondaryEffectChance(u32 battler, u32 secondaryEffectChance); bool32 AI_ShouldCopyStatChanges(u32 battlerAtk, u32 battlerDef); +u32 AI_ShouldSetUpHazards(struct AiLogicData *aiData, u32 battlerAtk, u32 battlerDef); // stat stage checks bool32 AnyStatIsRaised(u32 battlerId); @@ -122,7 +123,7 @@ bool32 ShouldSetSun(u32 battlerAtk, u32 atkAbility, u32 holdEffect); bool32 HasSleepMoveWithLowAccuracy(u32 battlerAtk, u32 battlerDef); bool32 IsHealingMoveEffect(u32 effect); bool32 HasHealingEffect(u32 battler); -bool32 IsTrappingMoveEffect(u32 effect); +bool32 IsTrappingMove(u32 move); bool32 HasTrappingMoveEffect(u32 battler); bool32 ShouldFakeOut(u32 battlerAtk, u32 battlerDef, u32 move); bool32 HasThawingMove(u32 battler); diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index ca5b640c85..ac6495cbcd 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -36,12 +36,12 @@ #define EFFECT_FUSION_COMBO 32 #define EFFECT_SUPER_FANG 33 #define EFFECT_DRAGON_RAGE 34 -#define EFFECT_TRAP 35 +#define EFFECT_UNUSED_35 35 #define EFFECT_HEAL_BLOCK 36 #define EFFECT_RECOIL_IF_MISS 37 #define EFFECT_MIST 38 #define EFFECT_FOCUS_ENERGY 39 -#define EFFECT_RECOIL 40 +#define EFFECT_UNUSED_40 40 #define EFFECT_CONFUSE 41 #define EFFECT_ATTACK_UP_2 42 #define EFFECT_DEFENSE_UP_2 43 @@ -62,9 +62,9 @@ #define EFFECT_POISON 58 #define EFFECT_PARALYZE 59 #define EFFECT_TWO_TURNS_ATTACK 60 -#define EFFECT_VITAL_THROW 61 +#define EFFECT_UNUSED_61 61 #define EFFECT_SUBSTITUTE 62 -#define EFFECT_RECHARGE 63 +#define EFFECT_UNUSED_63 63 #define EFFECT_RAGE 64 #define EFFECT_MIMIC 65 #define EFFECT_METRONOME 66 @@ -87,7 +87,7 @@ #define EFFECT_FALSE_SWIPE 83 #define EFFECT_HEAL_BELL 84 #define EFFECT_TRIPLE_KICK 85 -#define EFFECT_THIEF 86 +#define EFFECT_UNUSED_86 86 #define EFFECT_MEAN_LOOK 87 #define EFFECT_NIGHTMARE 88 #define EFFECT_MINIMIZE 89 @@ -119,7 +119,7 @@ #define EFFECT_HIDDEN_POWER 115 #define EFFECT_RAIN_DANCE 116 #define EFFECT_SUNNY_DAY 117 -#define EFFECT_ALL_STATS_UP_HIT 118 +#define EFFECT_UNUSED_118 118 #define EFFECT_FELL_STINGER 119 #define EFFECT_BELLY_DRUM 120 #define EFFECT_PSYCH_UP 121 @@ -148,7 +148,7 @@ #define EFFECT_MEMENTO 144 #define EFFECT_FACADE 145 #define EFFECT_FOCUS_PUNCH 146 -#define EFFECT_SMELLING_SALTS 147 +#define EFFECT_DOUBLE_POWER_ON_ARG_STATUS 147 #define EFFECT_FOLLOW_ME 148 #define EFFECT_NATURE_POWER 149 #define EFFECT_CHARGE 150 @@ -173,7 +173,7 @@ #define EFFECT_GRUDGE 169 #define EFFECT_SNATCH 170 #define EFFECT_LOW_KICK 171 -#define EFFECT_SECRET_POWER 172 +#define EFFECT_UNUSED_172 172 #define EFFECT_TEETER_DANCE 173 #define EFFECT_HIT_ESCAPE 174 #define EFFECT_MUD_SPORT 175 @@ -190,9 +190,9 @@ #define EFFECT_PLEDGE 186 #define EFFECT_FLING 187 #define EFFECT_NATURAL_GIFT 188 -#define EFFECT_WAKE_UP_SLAP 189 +#define EFFECT_UNUSED_189 189 #define EFFECT_WRING_OUT 190 -#define EFFECT_HEX 191 +#define EFFECT_UNUSED_191 191 #define EFFECT_ASSURANCE 192 #define EFFECT_TRUMP_CARD 193 #define EFFECT_ACROBATICS 194 @@ -205,7 +205,7 @@ #define EFFECT_PAYBACK 201 #define EFFECT_ROUND 202 #define EFFECT_BRINE 203 -#define EFFECT_VENOSHOCK 204 +#define EFFECT_UNUSED_204 204 #define EFFECT_RETALIATE 205 #define EFFECT_BULLDOZE 206 #define EFFECT_FOUL_PLAY 207 @@ -269,23 +269,23 @@ #define EFFECT_COPYCAT 265 #define EFFECT_DEFOG 266 #define EFFECT_HIT_ENEMY_HEAL_ALLY 267 -#define EFFECT_SMACK_DOWN 268 +#define EFFECT_UNUSED_268 268 #define EFFECT_SYNCHRONOISE 269 #define EFFECT_PSYCHO_SHIFT 270 #define EFFECT_POWER_TRICK 271 -#define EFFECT_FLAME_BURST 272 +#define EFFECT_UNUSED_272 272 #define EFFECT_AFTER_YOU 273 #define EFFECT_BESTOW 274 #define EFFECT_ROTOTILLER 275 #define EFFECT_FLOWER_SHIELD 276 -#define EFFECT_HIT_PREVENT_ESCAPE 277 +#define EFFECT_UNUSED_277 277 #define EFFECT_SPEED_SWAP 278 -#define EFFECT_DEFENSE_UP2_HIT 279 +#define EFFECT_UNUSED_279 279 #define EFFECT_REVELATION_DANCE 280 #define EFFECT_AURORA_VEIL 281 #define EFFECT_THIRD_TYPE 282 -#define EFFECT_FEINT 283 -#define EFFECT_SPARKLING_ARIA 284 +#define EFFECT_UNUSED_283 283 +#define EFFECT_UNUSED_284 284 #define EFFECT_ACUPRESSURE 285 #define EFFECT_AROMATIC_MIST 286 #define EFFECT_POWDER 287 @@ -294,12 +294,12 @@ #define EFFECT_MAT_BLOCK 290 #define EFFECT_STOMPING_TANTRUM 291 #define EFFECT_INSTRUCT 292 -#define EFFECT_THROAT_CHOP 293 +#define EFFECT_UNUSED_293 293 #define EFFECT_LASER_FOCUS 294 #define EFFECT_MAGNETIC_FLUX 295 #define EFFECT_GEAR_UP 296 -#define EFFECT_INCINERATE 297 -#define EFFECT_BUG_BITE 298 +#define EFFECT_UNUSED_297 297 +#define EFFECT_UNUSED_298 298 #define EFFECT_STRENGTH_SAP 299 #define EFFECT_MIND_BLOWN 300 #define EFFECT_PURIFY 301 @@ -355,11 +355,11 @@ #define EFFECT_SHELL_TRAP 351 #define EFFECT_PSYBLADE 352 #define EFFECT_HYDRO_STEAM 353 -#define EFFECT_HIT_SET_ENTRY_HAZARD 354 -#define EFFECT_BARB_BARRAGE 355 +#define EFFECT_UNUSED_354 354 +#define EFFECT_UNUSED_355 355 #define EFFECT_REVIVAL_BLESSING 356 #define EFFECT_SNOWSCAPE 357 -#define EFFECT_INFERNAL_PARADE 358 +#define EFFECT_UNUSED_358 358 #define EFFECT_TAKE_HEART 359 #define EFFECT_COLLISION_COURSE 360 #define EFFECT_MAKE_IT_RAIN 361 diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 92d1852d23..7bebdb5b92 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -1006,10 +1006,24 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } } + // check things that aren't move effects (recoil) + if (gBattleMoves[move].recoil > 0) + { + if (AI_IsDamagedByRecoil(battlerAtk)) + { + u32 recoilDmg = max(1, aiData->simulatedDmg[battlerAtk][battlerDef][AI_THINKING_STRUCT->movesetIndex] * max(1, gBattleMoves[move].recoil) / 100); + if (!ShouldUseRecoilMove(battlerAtk, battlerDef, recoilDmg, AI_THINKING_STRUCT->movesetIndex)) + ADJUST_SCORE(-10); + } + } + // check move effects switch (moveEffect) { - case EFFECT_HIT: + case EFFECT_HIT: // only applies to Vital Throw + if (gBattleMoves[move].priority < 0 && AI_STRIKES_FIRST(battlerAtk, battlerDef, move) && aiData->hpPercents[battlerAtk] < 40) + ADJUST_SCORE(-1); // don't want to move last + break; default: break; // check move damage case EFFECT_SLEEP: @@ -1361,7 +1375,6 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } break; //case EFFECT_BIDE: - //case EFFECT_RECHARGE: //case EFFECT_COUNTER: case EFFECT_PRESENT: case EFFECT_SONICBOOM: @@ -1856,15 +1869,6 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (aiData->abilities[battlerAtk] != ABILITY_MAGIC_GUARD && AI_DATA->moveAccuracy[battlerAtk][battlerDef][AI_THINKING_STRUCT->movesetIndex] < 75) ADJUST_SCORE(-6); break; - case EFFECT_RECOIL: - if (AI_IsDamagedByRecoil(battlerAtk)) - { - u32 recoilDmg = max(1, aiData->simulatedDmg[battlerAtk][battlerDef][AI_THINKING_STRUCT->movesetIndex] * max(1, gBattleMoves[move].recoil) / 100); - if (!ShouldUseRecoilMove(battlerAtk, battlerDef, recoilDmg, AI_THINKING_STRUCT->movesetIndex)) - ADJUST_SCORE(-10); - break; - } - break; case EFFECT_TEETER_DANCE: if (((gBattleMons[battlerDef].status2 & STATUS2_CONFUSION) || (!DoesBattlerIgnoreAbilityChecks(aiData->abilities[battlerAtk], move) && aiData->abilities[battlerDef] == ABILITY_OWN_TEMPO) @@ -2056,7 +2060,6 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) || ((aiData->abilities[battlerDef] == ABILITY_CONTRARY) && !IS_TARGETING_PARTNER(battlerAtk, battlerDef))) // don't want to raise target stats unless its your partner ADJUST_SCORE(-10); break; - case EFFECT_PSYCH_UP: // haze stats check { for (i = STAT_ATK; i < NUM_BATTLE_STATS; i++) @@ -2392,8 +2395,6 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) || PartnerMoveIsSameAsAttacker(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) ADJUST_SCORE(-10); break; - case EFFECT_THROAT_CHOP: - break; case EFFECT_HEAL_BLOCK: if (gDisableStructs[battlerDef].healBlockTimer != 0 || PartnerMoveIsSameAsAttacker(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) @@ -2475,7 +2476,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (instructedMove == MOVE_NONE || gBattleMoves[instructedMove].instructBanned || gBattleMoves[instructedMove].twoTurnMove - || gBattleMoves[instructedMove].effect == EFFECT_RECHARGE + || MoveHasMoveEffectSelf(instructedMove, MOVE_EFFECT_RECHARGE) || IsZMove(instructedMove) || (gLockedMoves[battlerDef] != 0 && gLockedMoves[battlerDef] != 0xFFFF) || gBattleMons[battlerDef].status2 & STATUS2_MULTIPLETURNS @@ -2566,10 +2567,6 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (aiData->hpPercents[battlerDef] < 50) ADJUST_SCORE(-1); break; - case EFFECT_VITAL_THROW: - if (AI_STRIKES_FIRST(battlerAtk, battlerDef, move) && aiData->hpPercents[battlerAtk] < 40) - ADJUST_SCORE(-1); // don't want to move last - break; case EFFECT_FLAIL: if (AI_WhoStrikesFirst(battlerAtk, battlerDef, move) == AI_IS_SLOWER // Opponent should go first || aiData->hpPercents[battlerAtk] > 50) @@ -2700,7 +2697,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_PERISH_SONG: if (!(gBattleMons[battlerDef].status2 & (STATUS2_ESCAPE_PREVENTION | STATUS2_WRAPPED))) { - if (IsTrappingMoveEffect(effect) || predictedMove == MOVE_INGRAIN) + if (IsTrappingMove(aiData->partnerMove) || predictedMove == MOVE_INGRAIN) ADJUST_SCORE(1); } break; @@ -3549,7 +3546,6 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score break; case EFFECT_TOXIC: case EFFECT_POISON: - case EFFECT_BARB_BARRAGE: IncreasePoisonScore(battlerAtk, battlerDef, move, &score); break; case EFFECT_LIGHT_SCREEN: @@ -3591,14 +3587,8 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score if (gStatuses3[battlerAtk] & STATUS3_ALWAYS_HITS) ADJUST_SCORE(5); break; - case EFFECT_TRAP: - if (HasMoveEffect(battlerDef, EFFECT_RAPID_SPIN)) - break; - //fallthrough case EFFECT_MEAN_LOOK: - if (IsBattlerTrapped(battlerDef, TRUE)) - break; // in this case its a bad attacking move - else if (ShouldTrap(battlerAtk, battlerDef, move)) + if (!IsBattlerTrapped(battlerDef, TRUE) && ShouldTrap(battlerAtk, battlerDef, move)) ADJUST_SCORE(5); break; case EFFECT_MIST: @@ -3847,15 +3837,10 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score break; case EFFECT_SPIKES: - case EFFECT_HIT_SET_ENTRY_HAZARD: case EFFECT_STEALTH_ROCK: case EFFECT_STICKY_WEB: case EFFECT_TOXIC_SPIKES: - if (aiData->abilities[battlerDef] == ABILITY_MAGIC_BOUNCE || CountUsablePartyMons(battlerDef) == 0) - break; - if (gDisableStructs[battlerAtk].isFirstTurn) - ADJUST_SCORE(2); - //TODO - track entire opponent party data to determine hazard effectiveness + score += AI_ShouldSetUpHazards(aiData, battlerAtk, battlerDef); break; case EFFECT_FORESIGHT: if (aiData->abilities[battlerAtk] == ABILITY_SCRAPPY || aiData->abilities[battlerAtk] == ABILITY_MINDS_EYE) @@ -4522,10 +4507,6 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score break; }*/ break; - case EFFECT_FEINT: - if (gBattleMoves[predictedMove].effect == EFFECT_PROTECT) - ADJUST_SCORE(3); - break; case EFFECT_EMBARGO: if (aiData->holdEffects[battlerDef] != HOLD_EFFECT_NONE) ADJUST_SCORE(1); @@ -4539,12 +4520,6 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score || !IsBattlerGrounded(battlerDef)) ADJUST_SCORE(1); break; - case EFFECT_THROAT_CHOP: - if (predictedMove != MOVE_NONE && gBattleMoves[predictedMove].soundMove && AI_WhoStrikesFirst(battlerAtk, battlerDef, move) == AI_IS_FASTER) - ADJUST_SCORE(3); // Ai goes first and predicts the target will use a sound move - else if (HasSoundMove(battlerDef)) - ADJUST_SCORE(3); - break; case EFFECT_HEAL_BLOCK: if (AI_WhoStrikesFirst(battlerAtk, battlerDef, move) == AI_IS_FASTER && predictedMove != MOVE_NONE && IsHealingMoveEffect(gBattleMoves[predictedMove].effect)) ADJUST_SCORE(3); // Try to cancel healing move @@ -4623,16 +4598,6 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score && !IS_MOVE_STATUS(move) && AI_GetTypeEffectiveness(predictedMove, battlerDef, battlerAtk) != AI_EFFECTIVENESS_x0) ADJUST_SCORE(1); break; - case EFFECT_FLAME_BURST: - if (isDoubleBattle) - { - if (IsBattlerAlive(BATTLE_PARTNER(battlerDef)) - && aiData->hpPercents[BATTLE_PARTNER(battlerDef)] < 12 - && aiData->abilities[BATTLE_PARTNER(battlerDef)] != ABILITY_MAGIC_GUARD - && !IS_BATTLER_OF_TYPE(BATTLE_PARTNER(battlerDef), TYPE_FIRE)) - ADJUST_SCORE(1); - } - break; case EFFECT_TOXIC_THREAD: IncreasePoisonScore(battlerAtk, battlerDef, move, &score); IncreaseStatUpScore(battlerAtk, battlerDef, STAT_SPEED, &score); @@ -4859,6 +4824,34 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score break; } break; + case MOVE_EFFECT_STEALTH_ROCK: + case MOVE_EFFECT_SPIKES: + score += AI_ShouldSetUpHazards(aiData, battlerAtk, battlerDef); + break; + case MOVE_EFFECT_FEINT: + if (gBattleMoves[predictedMove].effect == EFFECT_PROTECT) + ADJUST_SCORE(3); + break; + case MOVE_EFFECT_THROAT_CHOP: + if (predictedMove != MOVE_NONE && gBattleMoves[predictedMove].soundMove && AI_WhoStrikesFirst(battlerAtk, battlerDef, move) == AI_IS_FASTER) + ADJUST_SCORE(3); // Ai goes first and predicts the target will use a sound move + else if (HasSoundMove(battlerDef)) + ADJUST_SCORE(3); + break; + case MOVE_EFFECT_FLAME_BURST: + if (isDoubleBattle) + { + if (IsBattlerAlive(BATTLE_PARTNER(battlerDef)) + && aiData->hpPercents[BATTLE_PARTNER(battlerDef)] < 12 + && aiData->abilities[BATTLE_PARTNER(battlerDef)] != ABILITY_MAGIC_GUARD + && !IS_BATTLER_OF_TYPE(BATTLE_PARTNER(battlerDef), TYPE_FIRE)) + ADJUST_SCORE(1); + } + break; + case MOVE_EFFECT_WRAP: + if (!HasMoveEffect(battlerDef, EFFECT_RAPID_SPIN) && !IsBattlerTrapped(battlerDef, TRUE) && ShouldTrap(battlerAtk, battlerDef, move)) + ADJUST_SCORE(5); + break; } } } @@ -4869,6 +4862,7 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score // Effects that are encouraged on the first turn of battle static s32 AI_SetupFirstTurn(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { + u8 i; if (IS_TARGETING_PARTNER(battlerAtk, battlerDef) || gBattleResults.battleTurnCounter != 0) return score; @@ -4967,19 +4961,33 @@ static s32 AI_SetupFirstTurn(u32 battlerAtk, u32 battlerDef, u32 move, s32 score case EFFECT_SNOWSCAPE: case EFFECT_GEOMANCY: case EFFECT_VICTORY_DANCE: - case EFFECT_HIT_SET_ENTRY_HAZARD: ADJUST_SCORE(2); break; default: break; } + // Consider move effects + for (i = 0; i < gBattleMoves[move].numAdditionalEffects; i++) + { + switch (gBattleMoves[move].additionalEffects[i].moveEffect) + { + case MOVE_EFFECT_STEALTH_ROCK: + case MOVE_EFFECT_SPIKES: + ADJUST_SCORE(2); + break; + default: + break; + } + } + return score; } // Adds score bonus to 'riskier' move effects and high crit moves static s32 AI_Risky(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { + u8 i; if (IS_TARGETING_PARTNER(battlerAtk, battlerDef)) return score; @@ -5000,7 +5008,6 @@ static s32 AI_Risky(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_SWAGGER: case EFFECT_ATTRACT: case EFFECT_PRESENT: - case EFFECT_ALL_STATS_UP_HIT: case EFFECT_BELLY_DRUM: case EFFECT_MIRROR_COAT: case EFFECT_FOCUS_PUNCH: @@ -5013,6 +5020,20 @@ static s32 AI_Risky(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) break; } + // Consider move effects + for (i = 0; i < gBattleMoves[move].numAdditionalEffects; i++) + { + switch (gBattleMoves[move].additionalEffects[i].moveEffect) + { + case MOVE_EFFECT_ALL_STATS_UP: + if (Random() & 1) + ADJUST_SCORE(2); + break; + default: + break; + } + } + return score; } diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index d8f11117c4..6501e05d8b 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -954,15 +954,17 @@ static bool32 AI_IsMoveEffectInMinus(u32 battlerAtk, u32 battlerDef, u32 move, s u32 abilityDef = AI_DATA->abilities[battlerDef]; u8 i; + // recoil + if (gBattleMoves[move].recoil > 0 && AI_IsDamagedByRecoil(battlerAtk)) + return TRUE; + switch (gBattleMoves[move].effect) { - case EFFECT_RECHARGE: case EFFECT_MAKE_IT_RAIN: case EFFECT_MIND_BLOWN: case EFFECT_STEEL_BEAM: return TRUE; case EFFECT_RECOIL_IF_MISS: - case EFFECT_RECOIL: if (AI_IsDamagedByRecoil(battlerAtk)) return TRUE; break; @@ -985,6 +987,8 @@ static bool32 AI_IsMoveEffectInMinus(u32 battlerAtk, u32 battlerDef, u32 move, s || (noOfHitsToKo != 1 && abilityDef == ABILITY_CONTRARY && !IsMoldBreakerTypeAbility(abilityAtk))) return TRUE; break; + case MOVE_EFFECT_RECHARGE: + return gBattleMoves[move].additionalEffects[i].self; } } break; @@ -1494,7 +1498,6 @@ bool32 IsMoveEncouragedToHit(u32 battlerAtk, u32 battlerDef, u32 move) // increased accuracy but don't always hit if ((((weather & B_WEATHER_RAIN) && (gBattleMoves[move].effect == EFFECT_THUNDER || gBattleMoves[move].effect == EFFECT_HURRICANE)) || (((weather & (B_WEATHER_HAIL | B_WEATHER_SNOW)) && move == MOVE_BLIZZARD))) - || (gBattleMoves[move].effect == EFFECT_VITAL_THROW) || (B_MINIMIZE_DMG_ACC >= GEN_6 && (gStatuses3[battlerDef] & STATUS3_MINIMIZED) && gBattleMoves[move].minimizeDoubleDamage) || (gBattleMoves[move].accuracy == 0)) { @@ -2080,18 +2083,17 @@ bool32 HasHealingEffect(u32 battlerId) return FALSE; } -bool32 IsTrappingMoveEffect(u32 effect) +bool32 IsTrappingMove(u32 move) { - switch (effect) + switch (gBattleMoves[move].effect) { case EFFECT_MEAN_LOOK: - case EFFECT_TRAP: - case EFFECT_HIT_PREVENT_ESCAPE: case EFFECT_FAIRY_LOCK: //case EFFECT_NO_RETREAT: // TODO return TRUE; default: - return FALSE; + return MoveHasMoveEffect(move, MOVE_EFFECT_PREVENT_ESCAPE, FALSE) + || MoveHasMoveEffect(move, MOVE_EFFECT_WRAP, FALSE); } } @@ -2102,7 +2104,7 @@ bool32 HasTrappingMoveEffect(u32 battler) for (i = 0; i < MAX_MON_MOVES; i++) { - if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && IsTrappingMoveEffect(gBattleMoves[moves[i]].effect)) + if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && IsTrappingMove(moves[i])) return TRUE; } @@ -3666,8 +3668,8 @@ void IncreasePoisonScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) if (AI_THINKING_STRUCT->aiFlags & AI_FLAG_STALL && HasMoveEffect(battlerAtk, EFFECT_PROTECT)) ADJUST_SCORE_PTR(1); // stall tactic - if (HasMoveEffect(battlerAtk, EFFECT_VENOSHOCK) - || HasMoveEffect(battlerAtk, EFFECT_HEX) + if ((HasMoveEffect(battlerAtk, EFFECT_DOUBLE_POWER_ON_ARG_STATUS) + && gBattleMoves[move].argument & STATUS1_PSN_ANY) || HasMoveEffect(battlerAtk, EFFECT_VENOM_DRENCH) || AI_DATA->abilities[battlerAtk] == ABILITY_MERCILESS) ADJUST_SCORE_PTR(2); @@ -3691,7 +3693,10 @@ void IncreaseBurnScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) ADJUST_SCORE_PTR(2); // burning the target to stay alive is cool } - if (HasMoveEffect(battlerAtk, EFFECT_HEX) || HasMoveEffect(BATTLE_PARTNER(battlerAtk), EFFECT_HEX)) + if ((HasMoveEffect(battlerAtk, EFFECT_DOUBLE_POWER_ON_ARG_STATUS) + && gBattleMoves[move].argument & STATUS1_BURN) + || (HasMoveEffect(BATTLE_PARTNER(battlerAtk), EFFECT_DOUBLE_POWER_ON_ARG_STATUS) + && gBattleMoves[move].argument & STATUS1_BURN)) ADJUST_SCORE_PTR(1); } } @@ -3708,7 +3713,8 @@ void IncreaseParalyzeScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) u32 defSpeed = AI_DATA->speedStats[battlerDef]; if ((defSpeed >= atkSpeed && defSpeed / 2 < atkSpeed) // You'll go first after paralyzing foe - || HasMoveEffect(battlerAtk, EFFECT_HEX) + || (HasMoveEffect(battlerAtk, EFFECT_DOUBLE_POWER_ON_ARG_STATUS) + && gBattleMoves[move].argument & STATUS1_PARALYSIS) || HasMoveWithMoveEffect(battlerAtk, MOVE_EFFECT_FLINCH, TRUE) // filter out Fake Out || gBattleMons[battlerDef].status2 & STATUS2_INFATUATION || gBattleMons[battlerDef].status2 & STATUS2_CONFUSION) @@ -3733,7 +3739,10 @@ void IncreaseSleepScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) && !(HasMoveEffect(battlerDef, EFFECT_SNORE) || HasMoveEffect(battlerDef, EFFECT_SLEEP_TALK))) ADJUST_SCORE_PTR(1); - if (HasMoveEffect(battlerAtk, EFFECT_HEX) || HasMoveEffect(BATTLE_PARTNER(battlerAtk), EFFECT_HEX)) + if ((HasMoveEffect(battlerAtk, EFFECT_DOUBLE_POWER_ON_ARG_STATUS) + && gBattleMoves[move].argument & STATUS1_SLEEP) + || (HasMoveEffect(BATTLE_PARTNER(battlerAtk), EFFECT_DOUBLE_POWER_ON_ARG_STATUS) + && gBattleMoves[move].argument & STATUS1_SLEEP)) ADJUST_SCORE_PTR(1); } @@ -3770,7 +3779,10 @@ void IncreaseFrostbiteScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score ADJUST_SCORE_PTR(2); // frostbiting the target to stay alive is cool } - if (HasMoveEffect(battlerAtk, EFFECT_HEX) || HasMoveEffect(BATTLE_PARTNER(battlerAtk), EFFECT_HEX)) + if ((HasMoveEffect(battlerAtk, EFFECT_DOUBLE_POWER_ON_ARG_STATUS) + && gBattleMoves[move].argument & STATUS1_FROSTBITE) + || (HasMoveEffect(BATTLE_PARTNER(battlerAtk), EFFECT_DOUBLE_POWER_ON_ARG_STATUS) + && gBattleMoves[move].argument & STATUS1_FROSTBITE)) ADJUST_SCORE_PTR(1); } } @@ -3856,3 +3868,12 @@ bool32 AI_ShouldCopyStatChanges(u32 battlerAtk, u32 battlerDef) return FALSE; } + +//TODO - track entire opponent party data to determine hazard effectiveness +u32 AI_ShouldSetUpHazards(struct AiLogicData *aiData, u32 battlerAtk, u32 battlerDef) +{ + if (aiData->abilities[battlerDef] == ABILITY_MAGIC_BOUNCE || CountUsablePartyMons(battlerDef) == 0) + return 0; + + return 2 * gDisableStructs[battlerAtk].isFirstTurn; +} diff --git a/src/battle_dome.c b/src/battle_dome.c index fd5890b281..a3a180637a 100644 --- a/src/battle_dome.c +++ b/src/battle_dome.c @@ -4041,11 +4041,10 @@ static bool32 IsDomePopularMove(u32 move) } } -static bool32 IsDomeStatusMoveEffect(u32 effect) +static bool32 IsDomeStatusMoveEffect(u32 move) { - switch(effect) + switch(gBattleMoves[move].effect) { - case EFFECT_TRAP: case EFFECT_SLEEP: case EFFECT_CONFUSE: case EFFECT_DISABLE: @@ -4063,7 +4062,7 @@ static bool32 IsDomeStatusMoveEffect(u32 effect) case EFFECT_CURSE: return TRUE; default: - return FALSE; + return MoveHasMoveEffect(move, MOVE_EFFECT_WRAP, FALSE); } } @@ -4365,7 +4364,7 @@ static void DisplayTrainerInfoOnCard(u8 flags, u8 trainerTourneyId) allocatedArray[k] = IsDomeRiskyMoveEffect(gBattleMoves[move].effect) ? 1 : 0; break; case MOVE_POINTS_STATUS: - allocatedArray[k] = IsDomeStatusMoveEffect(gBattleMoves[move].effect) ? 1 : 0; + allocatedArray[k] = IsDomeStatusMoveEffect(move); break; case MOVE_POINTS_DMG: allocatedArray[k] = (gBattleMoves[move].power != 0) ? 1 : 0; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 4ce8ee1ecc..e94c49a7b9 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -971,20 +971,16 @@ static const u16 sProtectSuccessRates[] = {USHRT_MAX, USHRT_MAX / 2, USHRT_MAX / static const u16 sFinalStrikeOnlyEffects[] = { - EFFECT_RELIC_SONG, - EFFECT_BUG_BITE, - EFFECT_THIEF, - EFFECT_BURN_UP, - EFFECT_DOUBLE_SHOCK, - EFFECT_SECRET_POWER, - EFFECT_SMACK_DOWN, - EFFECT_SPARKLING_ARIA, - EFFECT_SMELLING_SALTS, - EFFECT_WAKE_UP_SLAP, - EFFECT_HIT_ESCAPE, - EFFECT_RECOIL_HP_25, - EFFECT_HIT_PREVENT_ESCAPE, - EFFECT_HIT_SWITCH_TARGET, + MOVE_EFFECT_BUG_BITE, + MOVE_EFFECT_STEAL_ITEM, + MOVE_EFFECT_BURN_UP, + MOVE_EFFECT_DOUBLE_SHOCK, + MOVE_EFFECT_SECRET_POWER, + MOVE_EFFECT_SMACK_DOWN, + MOVE_EFFECT_REMOVE_STATUS, + MOVE_EFFECT_RECOIL_HP_25, + MOVE_EFFECT_PREVENT_ESCAPE, + MOVE_EFFECT_WRAP, }; static const u16 sNaturePowerMoves[BATTLE_TERRAIN_COUNT] = @@ -1602,12 +1598,6 @@ static bool32 AccuracyCalcHelper(u16 move) } } - if (gBattleMoves[move].effect == EFFECT_VITAL_THROW) - { - JumpIfMoveFailed(7, move); - return TRUE; - } - if (B_MINIMIZE_DMG_ACC >= GEN_6 && (gStatuses3[gBattlerTarget] & STATUS3_MINIMIZED) && gBattleMoves[move].minimizeDoubleDamage) @@ -2769,7 +2759,7 @@ void SetMoveEffect(bool32 primary, u32 certain) if (gSpecialStatuses[gBattlerAttacker].parentalBondState == PARENTAL_BOND_1ST_HIT && gBattleMons[gBattlerTarget].hp != 0 - && IsFinalStrikeEffect(gCurrentMove)) + && IsFinalStrikeEffect(gBattleScripting.moveEffect)) { gBattlescriptCurrInstr++; return; @@ -5413,14 +5403,12 @@ static void Cmd_moveend(void) && IsBattlerAlive(gBattlerAttacker) && gBattleScripting.savedDmg != 0) // Some checks may be redundant alongside this one { - switch (gBattleMoves[gCurrentMove].effect) + if (gBattleMoves[gCurrentMove].recoil > 0) { - case EFFECT_RECOIL: gBattleMoveDamage = max(1, gBattleScripting.savedDmg * max(1, gBattleMoves[gCurrentMove].recoil) / 100); BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_MoveEffectRecoil; effect = TRUE; - break; } } gBattleScripting.moveendState++; @@ -9549,7 +9537,7 @@ static void Cmd_various(void) { VARIOUS_ARGS(const u8 *failInstr); u16 move = gLastPrintedMoves[gBattlerTarget]; - if (move == MOVE_NONE || move == MOVE_UNAVAILABLE || gBattleMoves[move].effect == EFFECT_RECHARGE + if (move == MOVE_NONE || move == MOVE_UNAVAILABLE || MoveHasMoveEffectSelf(move, MOVE_EFFECT_RECHARGE) || gBattleMoves[move].instructBanned || gBattleMoves[move].twoTurnMove || IsDynamaxed(gBattlerTarget)) { gBattlescriptCurrInstr = cmd->failInstr; diff --git a/src/battle_tv.c b/src/battle_tv.c index 9d86389632..62071b5bed 100644 --- a/src/battle_tv.c +++ b/src/battle_tv.c @@ -121,13 +121,11 @@ static const u16 sPoints_MoveEffect[NUM_BATTLE_MOVE_EFFECTS] = // [EFFECT_RAZOR_WIND] = 1, [EFFECT_SUPER_FANG] = 5, [EFFECT_DRAGON_RAGE] = 2, - [EFFECT_TRAP] = 4, // [EFFECT_HIGH_CRITICAL] = 1, // [EFFECT_DOUBLE_HIT] = 1, [EFFECT_RECOIL_IF_MISS] = 1, [EFFECT_MIST] = 5, [EFFECT_FOCUS_ENERGY] = 1, - [EFFECT_RECOIL] = 2, [EFFECT_CONFUSE] = 4, [EFFECT_ATTACK_UP_2] = 1, [EFFECT_DEFENSE_UP_2] = 1, @@ -149,9 +147,7 @@ static const u16 sPoints_MoveEffect[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_PARALYZE] = 4, // [EFFECT_SKY_ATTACK] = 4, // [EFFECT_TWINEEDLE] = 1, - [EFFECT_VITAL_THROW] = 1, [EFFECT_SUBSTITUTE] = 4, - [EFFECT_RECHARGE] = 5, [EFFECT_RAGE] = 2, [EFFECT_MIMIC] = 4, [EFFECT_METRONOME] = 1, @@ -175,7 +171,6 @@ static const u16 sPoints_MoveEffect[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_HEAL_BELL] = 5, // [EFFECT_QUICK_ATTACK] = 1, [EFFECT_TRIPLE_KICK] = 1, - [EFFECT_THIEF] = 4, [EFFECT_MEAN_LOOK] = 5, [EFFECT_NIGHTMARE] = 3, [EFFECT_MINIMIZE] = 1, @@ -194,7 +189,6 @@ static const u16 sPoints_MoveEffect[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_PRESENT] = 1, [EFFECT_FRUSTRATION] = 1, [EFFECT_SAFEGUARD] = 5, -// [EFFECT_THAW_HIT] = 1, Now unused [EFFECT_MAGNITUDE] = 1, [EFFECT_BATON_PASS] = 7, [EFFECT_PURSUIT] = 2, @@ -235,7 +229,7 @@ static const u16 sPoints_MoveEffect[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_MEMENTO] = 7, [EFFECT_FACADE] = 1, [EFFECT_FOCUS_PUNCH] = 7, - [EFFECT_SMELLING_SALTS] = 1, + [EFFECT_DOUBLE_POWER_ON_ARG_STATUS] = 1, [EFFECT_FOLLOW_ME] = 5, [EFFECT_NATURE_POWER] = 0, [EFFECT_CHARGE] = 4, @@ -260,7 +254,6 @@ static const u16 sPoints_MoveEffect[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_GRUDGE] = 1, [EFFECT_SNATCH] = 1, [EFFECT_LOW_KICK] = 1, - [EFFECT_SECRET_POWER] = 1, [EFFECT_TEETER_DANCE] = 6, // [EFFECT_BLAZE_KICK] = 1, [EFFECT_MUD_SPORT] = 4, @@ -277,9 +270,7 @@ static const u16 sPoints_MoveEffect[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_PLEDGE] = 0, // TODO: Assign points [EFFECT_FLING] = 0, // TODO: Assign points [EFFECT_NATURAL_GIFT] = 0, // TODO: Assign points - [EFFECT_WAKE_UP_SLAP] = 0, // TODO: Assign points [EFFECT_WRING_OUT] = 0, // TODO: Assign points - [EFFECT_HEX] = 0, // TODO: Assign points [EFFECT_ASSURANCE] = 0, // TODO: Assign points [EFFECT_TRUMP_CARD] = 0, // TODO: Assign points [EFFECT_ACROBATICS] = 0, // TODO: Assign points @@ -292,7 +283,6 @@ static const u16 sPoints_MoveEffect[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_PAYBACK] = 0, // TODO: Assign points [EFFECT_ROUND] = 0, // TODO: Assign points [EFFECT_BRINE] = 0, // TODO: Assign points - [EFFECT_VENOSHOCK] = 0, // TODO: Assign points [EFFECT_RETALIATE] = 0, // TODO: Assign points [EFFECT_BULLDOZE] = 0, // TODO: Assign points [EFFECT_FOUL_PLAY] = 0, // TODO: Assign points @@ -356,23 +346,17 @@ static const u16 sPoints_MoveEffect[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_COPYCAT] = 0, // TODO: Assign points [EFFECT_DEFOG] = 0, // TODO: Assign points [EFFECT_HIT_ENEMY_HEAL_ALLY] = 0, // TODO: Assign points - [EFFECT_SMACK_DOWN] = 0, // TODO: Assign points [EFFECT_SYNCHRONOISE] = 0, // TODO: Assign points [EFFECT_PSYCHO_SHIFT] = 0, // TODO: Assign points [EFFECT_POWER_TRICK] = 0, // TODO: Assign points - [EFFECT_FLAME_BURST] = 0, // TODO: Assign points [EFFECT_AFTER_YOU] = 0, // TODO: Assign points [EFFECT_BESTOW] = 0, // TODO: Assign points [EFFECT_ROTOTILLER] = 0, // TODO: Assign points [EFFECT_FLOWER_SHIELD] = 0, // TODO: Assign points - [EFFECT_HIT_PREVENT_ESCAPE] = 0, // TODO: Assign points [EFFECT_SPEED_SWAP] = 0, // TODO: Assign points - [EFFECT_DEFENSE_UP2_HIT] = 0, // TODO: Assign points [EFFECT_REVELATION_DANCE] = 0, // TODO: Assign points [EFFECT_AURORA_VEIL] = 0, // TODO: Assign points [EFFECT_THIRD_TYPE] = 0, // TODO: Assign points - [EFFECT_FEINT] = 0, // TODO: Assign points - [EFFECT_SPARKLING_ARIA] = 0, // TODO: Assign points [EFFECT_ACUPRESSURE] = 0, // TODO: Assign points [EFFECT_AROMATIC_MIST] = 0, // TODO: Assign points [EFFECT_POWDER] = 0, // TODO: Assign points @@ -381,16 +365,12 @@ static const u16 sPoints_MoveEffect[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_MAT_BLOCK] = 0, // TODO: Assign points [EFFECT_STOMPING_TANTRUM] = 0, // TODO: Assign points [EFFECT_INSTRUCT] = 0, // TODO: Assign points - [EFFECT_THROAT_CHOP] = 0, // TODO: Assign points [EFFECT_LASER_FOCUS] = 0, // TODO: Assign points [EFFECT_MAGNETIC_FLUX] = 0, // TODO: Assign points [EFFECT_GEAR_UP] = 0, // TODO: Assign points - [EFFECT_INCINERATE] = 0, // TODO: Assign points - [EFFECT_BUG_BITE] = 0, // TODO: Assign points [EFFECT_STRENGTH_SAP] = 0, // TODO: Assign points [EFFECT_MIND_BLOWN] = 0, // TODO: Assign points [EFFECT_PURIFY] = 0, // TODO: Assign points - [EFFECT_BURN_UP] = 0, // TODO: Assign points [EFFECT_SHORE_UP] = 0, // TODO: Assign points [EFFECT_GEOMANCY] = 0, // TODO: Assign points [EFFECT_FAIRY_LOCK] = 0, // TODO: Assign points @@ -1129,7 +1109,7 @@ void BattleTv_SetDataBasedOnMove(u16 move, u16 weatherFlags, struct DisableStruc tvPtr->pos[defSide][GetBattlerPosition(gBattlerAttacker) / 2].attackedByMonId = gBattlerPartyIndexes[gBattlerAttacker] + 1; tvPtr->pos[defSide][GetBattlerPosition(gBattlerAttacker) / 2].attackedByMoveSlot = moveSlot; tvPtr->side[atkSide].usedMoveSlot = moveSlot; - AddMovePoints(PTS_MOVE_EFFECT, moveSlot, gBattleMoves[move].effect, 0); + AddMovePoints(PTS_MOVE_EFFECT, moveSlot, move, 0); AddPointsBasedOnWeather(weatherFlags, move, moveSlot); if (disableStructPtr->chargeTimer != 0) AddMovePoints(PTS_ELECTRIC, move, moveSlot, 0); @@ -1291,7 +1271,26 @@ static void AddMovePoints(u8 caseId, u16 arg1, u8 arg2, u8 arg3) switch (caseId) { - case PTS_MOVE_EFFECT: + case PTS_MOVE_EFFECT: //arg1 == moveSlot, arg2 == move + { + u8 baseFromEffect = sPointsArray[caseId][gBattleMoves[arg2].effect]; + + // various cases add/remove points + if (gBattleMoves[arg2].recoil > 0) + baseFromEffect++; // recoil moves + if (MoveHasMoveEffect(arg2, MOVE_EFFECT_SP_ATK_TWO_DOWN, FALSE) + || MoveHasMoveEffect(arg2, MOVE_EFFECT_ATK_DEF_DOWN, FALSE)) + baseFromEffect += 2; // Overheat etc & Superpower + if (MoveHasMoveEffect(arg2, MOVE_EFFECT_STEAL_ITEM, FALSE)) + baseFromEffect += 3; + if (MoveHasMoveEffect(arg2, MOVE_EFFECT_WRAP, FALSE)) + baseFromEffect += 3; + if (MoveHasMoveEffect(arg2, MOVE_EFFECT_RECHARGE, FALSE)) + baseFromEffect += 4; + + movePoints->points[atkSide][gBattlerPartyIndexes[gBattlerAttacker] * 4 + arg1] += baseFromEffect; + break; + } case PTS_EFFECTIVENESS: case PTS_CRITICAL_HIT: case PTS_STAT_INCREASE_1: diff --git a/src/battle_util.c b/src/battle_util.c index 3a28869193..2c255385ea 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -8830,22 +8830,14 @@ static inline u32 CalcMoveBasePower(u32 move, u32 battlerAtk, u32 battlerDef, u3 case EFFECT_NATURAL_GIFT: basePower = gNaturalGiftTable[ITEM_TO_BERRY(gBattleMons[battlerAtk].item)].power; break; - case EFFECT_WAKE_UP_SLAP: - if (gBattleMons[battlerDef].status1 & STATUS1_SLEEP || abilityDef == ABILITY_COMATOSE) - basePower *= 2; - break; - case EFFECT_SMELLING_SALTS: - if (gBattleMons[battlerDef].status1 & STATUS1_PARALYSIS) + case EFFECT_DOUBLE_POWER_ON_ARG_STATUS: + // Comatose targets treated as if asleep + if ((gBattleMons[battlerDef].status1 | (STATUS1_SLEEP * (abilityDef == ABILITY_COMATOSE))) & gBattleMoves[move].argument) basePower *= 2; break; case EFFECT_WRING_OUT: basePower = 120 * gBattleMons[battlerDef].hp / gBattleMons[battlerDef].maxHP; break; - case EFFECT_HEX: - case EFFECT_INFERNAL_PARADE: - if (gBattleMons[battlerDef].status1 & STATUS1_ANY || abilityDef == ABILITY_COMATOSE) - basePower *= 2; - break; case EFFECT_ASSURANCE: if (gProtectStructs[battlerDef].physicalDmg != 0 || gProtectStructs[battlerDef].specialDmg != 0 || gProtectStructs[battlerDef].confusionSelfDmg) basePower *= 2; @@ -9032,11 +9024,6 @@ static inline u32 CalcMoveBasePowerAfterModifiers(u32 move, u32 battlerAtk, u32 if (gBattleMons[battlerDef].hp <= (gBattleMons[battlerDef].maxHP / 2)) modifier = uq4_12_multiply(modifier, UQ_4_12(2.0)); break; - case EFFECT_BARB_BARRAGE: - case EFFECT_VENOSHOCK: - if (gBattleMons[battlerDef].status1 & STATUS1_PSN_ANY) - modifier = uq4_12_multiply(modifier, UQ_4_12(2.0)); - break; case EFFECT_RETALIATE: if (gSideTimers[atkSide].retaliateTimer == 1) modifier = uq4_12_multiply(modifier, UQ_4_12(2.0)); diff --git a/src/data/battle_frontier/battle_pyramid_wild_requirements.h b/src/data/battle_frontier/battle_pyramid_wild_requirements.h index afaa49a172..b559daf037 100644 --- a/src/data/battle_frontier/battle_pyramid_wild_requirements.h +++ b/src/data/battle_frontier/battle_pyramid_wild_requirements.h @@ -110,7 +110,7 @@ static const u16 sWeatherChangingMoves[] = { MOVE_SUNNY_DAY, }; -// EFFECT_RECHARGE, EFFECT_RECOIL +// MOVE_EFFECT_RECHARGE, recoil static const u16 sPowerfulNormalMoves[] = { MOVE_HYPER_BEAM, MOVE_GIGA_IMPACT, diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 1106bed53d..a2ff1f86df 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -316,7 +316,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_BIND] = { - .effect = EFFECT_TRAP, + .effect = EFFECT_HIT, .power = 15, .type = TYPE_NORMAL, .accuracy = B_UPDATED_MOVE_DATA >= GEN_5 ? 85 : 75, @@ -564,7 +564,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_WRAP] = { - .effect = EFFECT_TRAP, + .effect = EFFECT_HIT, .power = 15, .type = TYPE_NORMAL, .accuracy = B_UPDATED_MOVE_DATA >= GEN_5 ? 90 : 85, @@ -580,7 +580,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_TAKE_DOWN] = { - .effect = EFFECT_RECOIL, + .effect = EFFECT_HIT, .power = 90, .type = TYPE_NORMAL, .accuracy = 85, @@ -613,7 +613,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_DOUBLE_EDGE] = { - .effect = EFFECT_RECOIL, + .effect = EFFECT_HIT, .power = 120, .type = TYPE_NORMAL, .accuracy = 100, @@ -1043,7 +1043,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_HYPER_BEAM] = { - .effect = EFFECT_RECHARGE, + .effect = EFFECT_HIT, .power = 150, .type = TYPE_NORMAL, .accuracy = 90, @@ -1090,7 +1090,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = #else .pp = 25, #endif - .effect = EFFECT_RECOIL, + .effect = EFFECT_HIT, .power = 80, .type = TYPE_FIGHTING, .accuracy = 80, @@ -1363,7 +1363,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_FIRE_SPIN] = { - .effect = EFFECT_TRAP, + .effect = EFFECT_HIT, .power = B_UPDATED_MOVE_DATA >= GEN_5 ? 35 : 15, .type = TYPE_FIRE, .accuracy = B_UPDATED_MOVE_DATA >= GEN_5 ? 85 : 70, @@ -2118,7 +2118,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_CLAMP] = { - .effect = EFFECT_TRAP, + .effect = EFFECT_HIT, .power = 35, .type = TYPE_WATER, .accuracy = B_UPDATED_MOVE_DATA >= GEN_5 ? 85 : 75, @@ -2746,21 +2746,24 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_STRUGGLE] = { #if B_UPDATED_MOVE_DATA >= GEN_4 - .accuracy = 0, .effect = EFFECT_RECOIL_HP_25, + .accuracy = 0, + .mirrorMoveBanned = TRUE, + ADDITIONAL_EFFECTS( + PRIMARY_EFFECT_SELF(MOVE_EFFECT_RECOIL_HP_25) + ), #else + .effect = EFFECT_HIT, .accuracy = 100, - .effect = EFFECT_RECOIL, + .recoil = 25, #endif .power = 50, .type = TYPE_NORMAL, - .recoil = 25, .pp = 1, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, - .mirrorMoveBanned = B_UPDATED_MOVE_FLAGS >= GEN_4, .meFirstBanned = TRUE, .mimicBanned = TRUE, .metronomeBanned = TRUE, @@ -2817,7 +2820,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .power = 40, .pp = 10, #endif - .effect = EFFECT_THIEF, + .effect = EFFECT_HIT, .type = TYPE_DARK, .accuracy = 100, .target = MOVE_TARGET_SELECTED, @@ -3924,7 +3927,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_VITAL_THROW] = { - .effect = EFFECT_VITAL_THROW, + .effect = EFFECT_HIT, .power = 70, .type = TYPE_FIGHTING, .accuracy = 0, @@ -4219,7 +4222,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_WHIRLPOOL] = { - .effect = EFFECT_TRAP, + .effect = EFFECT_HIT, .power = B_UPDATED_MOVE_DATA >= GEN_5 ? 35 : 15, .type = TYPE_WATER, .accuracy = B_UPDATED_MOVE_DATA >= GEN_5 ? 85 : 70, @@ -4477,12 +4480,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_SMELLING_SALTS] = { - #if B_UPDATED_MOVE_DATA >= GEN_6 - .power = 70, - #else - .power = 60, - #endif - .effect = EFFECT_SMELLING_SALTS, + .effect = EFFECT_DOUBLE_POWER_ON_ARG_STATUS, + .power = B_UPDATED_MOVE_DATA >= GEN_6 ? 70 : 60, .type = TYPE_NORMAL, .accuracy = 100, .pp = 10, @@ -4491,21 +4490,20 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .category = BATTLE_CATEGORY_PHYSICAL, .argument = STATUS1_PARALYSIS, .makesContact = TRUE, + ADDITIONAL_EFFECTS( + PRIMARY_EFFECT(MOVE_EFFECT_REMOVE_STATUS) + ), }, [MOVE_FOLLOW_ME] = { - #if B_UPDATED_MOVE_DATA >= GEN_6 - .priority = 2, - #else - .priority = 3, - #endif .effect = EFFECT_FOLLOW_ME, .power = 0, .type = TYPE_NORMAL, .accuracy = 100, .pp = 20, .target = MOVE_TARGET_USER, + .priority = B_UPDATED_MOVE_DATA >= GEN_6 ? 2 : 3, .category = BATTLE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RESET_STATS }, .ignoresProtect = TRUE, @@ -4764,12 +4762,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_KNOCK_OFF] = { - #if B_UPDATED_MOVE_DATA >= GEN_6 - .power = 65, - #else - .power = 20, - #endif .effect = EFFECT_KNOCK_OFF, + .power = B_UPDATED_MOVE_DATA >= GEN_6 ? 65 : 20, .type = TYPE_DARK, .accuracy = 100, .pp = 20, @@ -4892,7 +4886,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_SECRET_POWER] = { - .effect = EFFECT_SECRET_POWER, + .effect = EFFECT_HIT, .power = 70, .type = TYPE_NORMAL, .accuracy = 100, @@ -5176,7 +5170,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_BLAST_BURN] = { - .effect = EFFECT_RECHARGE, + .effect = EFFECT_HIT, .power = 150, .type = TYPE_FIRE, .accuracy = 90, @@ -5191,7 +5185,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_HYDRO_CANNON] = { - .effect = EFFECT_RECHARGE, + .effect = EFFECT_HIT, .power = 150, .type = TYPE_WATER, .accuracy = 90, @@ -5523,7 +5517,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_SAND_TOMB] = { - .effect = EFFECT_TRAP, + .effect = EFFECT_HIT, .power = B_UPDATED_MOVE_DATA >= GEN_5 ? 35 : 15, .type = TYPE_GROUND, .accuracy = B_UPDATED_MOVE_DATA >= GEN_5 ? 85 : 70, @@ -5683,7 +5677,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_FRENZY_PLANT] = { - .effect = EFFECT_RECHARGE, + .effect = EFFECT_HIT, .power = 150, .type = TYPE_GRASS, .accuracy = 90, @@ -5771,7 +5765,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_COVET] = { - .effect = EFFECT_THIEF, + .effect = EFFECT_HIT, .power = B_UPDATED_MOVE_DATA >= GEN_5 ? 60 : 40, .type = TYPE_NORMAL, .accuracy = 100, @@ -5791,7 +5785,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_VOLT_TACKLE] = { - .effect = EFFECT_RECOIL, + .effect = EFFECT_HIT, .power = 120, .type = TYPE_ELECTRIC, .accuracy = 100, @@ -6023,12 +6017,8 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_WAKE_UP_SLAP] = { - #if B_UPDATED_MOVE_DATA >= GEN_6 - .power = 70, - #else - .power = 60, - #endif - .effect = EFFECT_WAKE_UP_SLAP, + .effect = EFFECT_DOUBLE_POWER_ON_ARG_STATUS, + .power = B_UPDATED_MOVE_DATA >= GEN_6 ? 70 : 60, .type = TYPE_FIGHTING, .accuracy = 100, .pp = 10, @@ -6037,6 +6027,9 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .category = BATTLE_CATEGORY_PHYSICAL, .argument = STATUS1_SLEEP, .makesContact = TRUE, + ADDITIONAL_EFFECTS( + PRIMARY_EFFECT(MOVE_EFFECT_REMOVE_STATUS) + ), }, [MOVE_HAMMER_ARM] = @@ -6112,7 +6105,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_FEINT] = { - .effect = EFFECT_FEINT, + .effect = EFFECT_HIT, .power = B_UPDATED_MOVE_DATA >= GEN_5 ? 30 : 50, .type = TYPE_NORMAL, .accuracy = 100, @@ -6132,7 +6125,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_PLUCK] = { - .effect = EFFECT_BUG_BITE, + .effect = EFFECT_HIT, .power = 60, .type = TYPE_FLYING, .accuracy = 100, @@ -6586,7 +6579,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_FLARE_BLITZ] = { - .effect = EFFECT_RECOIL, + .effect = EFFECT_HIT, .power = 120, .type = TYPE_FIRE, .accuracy = 100, @@ -6906,7 +6899,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_BRAVE_BIRD] = { - .effect = EFFECT_RECOIL, + .effect = EFFECT_HIT, .power = 120, .type = TYPE_FLYING, .accuracy = 100, @@ -6953,7 +6946,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_GIGA_IMPACT] = { - .effect = EFFECT_RECHARGE, + .effect = EFFECT_HIT, .power = 150, .type = TYPE_NORMAL, .accuracy = 90, @@ -7311,7 +7304,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_ROCK_WRECKER] = { - .effect = EFFECT_RECHARGE, + .effect = EFFECT_HIT, .power = 150, .type = TYPE_ROCK, .accuracy = 90, @@ -7500,7 +7493,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_BUG_BITE] = { - .effect = EFFECT_BUG_BITE, + .effect = EFFECT_HIT, .power = 60, .type = TYPE_BUG, .accuracy = 100, @@ -7532,7 +7525,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_WOOD_HAMMER] = { - .effect = EFFECT_RECOIL, + .effect = EFFECT_HIT, .power = 120, .type = TYPE_GRASS, .accuracy = 100, @@ -7605,7 +7598,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_HEAD_SMASH] = { - .effect = EFFECT_RECOIL, + .effect = EFFECT_HIT, .power = 150, .type = TYPE_ROCK, .accuracy = 80, @@ -7633,7 +7626,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_ROAR_OF_TIME] = { - .effect = EFFECT_RECHARGE, + .effect = EFFECT_HIT, .power = 150, .type = TYPE_DRAGON, .accuracy = 90, @@ -7701,7 +7694,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .power = 120, .accuracy = 70, #endif - .effect = EFFECT_TRAP, + .effect = EFFECT_HIT, .type = TYPE_FIRE, .pp = 5, .target = MOVE_TARGET_SELECTED, @@ -7880,7 +7873,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_VENOSHOCK] = { - .effect = EFFECT_VENOSHOCK, + .effect = EFFECT_DOUBLE_POWER_ON_ARG_STATUS, .power = 65, .type = TYPE_POISON, .accuracy = 100, @@ -7888,6 +7881,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, + .argument = STATUS1_PSN_ANY, }, [MOVE_AUTOTOMIZE] = @@ -8395,18 +8389,15 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_HEX] = { - #if B_UPDATED_MOVE_DATA >= GEN_6 - .power = 65, - #else - .power = 50, - #endif - .effect = EFFECT_HEX, + .effect = EFFECT_DOUBLE_POWER_ON_ARG_STATUS, + .power = B_UPDATED_MOVE_DATA >= GEN_6 ? 65 : 50, .type = TYPE_GHOST, .accuracy = 100, .pp = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, + .argument = STATUS1_ANY, }, [MOVE_SKY_DROP] = @@ -8465,7 +8456,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = #else .power = 30, #endif - .effect = EFFECT_INCINERATE, + .effect = EFFECT_HIT, .type = TYPE_FIRE, .accuracy = 100, .pp = 15, @@ -8746,7 +8737,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_WILD_CHARGE] = { - .effect = EFFECT_RECOIL, + .effect = EFFECT_HIT, .power = 90, .type = TYPE_ELECTRIC, .accuracy = 100, @@ -8984,7 +8975,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_HEAD_CHARGE] = { - .effect = EFFECT_RECOIL, + .effect = EFFECT_HIT, .power = 120, .type = TYPE_NORMAL, .accuracy = 100, @@ -9807,7 +9798,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_HYPERSPACE_HOLE] = { - .effect = EFFECT_FEINT, + .effect = EFFECT_HIT, .power = 80, .type = TYPE_PSYCHIC, .accuracy = 0, @@ -9818,6 +9809,9 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .ignoresProtect = TRUE, .ignoresSubstitute = TRUE, .metronomeBanned = TRUE, + ADDITIONAL_EFFECTS( + PRIMARY_EFFECT(MOVE_EFFECT_FEINT) + ), }, [MOVE_WATER_SHURIKEN] = @@ -10100,7 +10094,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_INFESTATION] = { - .effect = EFFECT_TRAP, + .effect = EFFECT_HIT, .power = 20, .type = TYPE_BUG, .accuracy = 100, @@ -10167,7 +10161,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_THOUSAND_WAVES] = { - .effect = EFFECT_HIT_PREVENT_ESCAPE, + .effect = EFFECT_HIT, .power = 90, .type = TYPE_GROUND, .accuracy = 100, @@ -10197,7 +10191,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_LIGHT_OF_RUIN] = { - .effect = EFFECT_RECOIL, + .effect = EFFECT_HIT, .power = 140, .type = TYPE_FAIRY, .accuracy = 90, @@ -10327,7 +10321,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_SPIRIT_SHACKLE] = { - .effect = EFFECT_HIT_PREVENT_ESCAPE, + .effect = EFFECT_HIT, .power = 80, .type = TYPE_GHOST, .accuracy = 100, @@ -10357,7 +10351,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_SPARKLING_ARIA] = { - .effect = EFFECT_SPARKLING_ARIA, + .effect = EFFECT_HIT, .power = 90, .type = TYPE_WATER, .accuracy = 100, @@ -10369,6 +10363,9 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .sheerForceBoost = TRUE, .ignoresSubstitute = B_UPDATED_MOVE_FLAGS >= GEN_6, .soundMove = TRUE, + ADDITIONAL_EFFECTS( + SECONDARY_EFFECT(MOVE_EFFECT_REMOVE_STATUS, 100) + ), }, [MOVE_ICE_HAMMER] = @@ -10529,7 +10526,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_THROAT_CHOP] = { - .effect = EFFECT_THROAT_CHOP, + .effect = EFFECT_HIT, .power = 80, .type = TYPE_DARK, .accuracy = 100, @@ -10539,6 +10536,9 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .sheerForceBoost = TRUE, + ADDITIONAL_EFFECTS( + SECONDARY_EFFECT(MOVE_EFFECT_THROAT_CHOP, 100) + ), }, [MOVE_POLLEN_PUFF] = @@ -10556,7 +10556,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_ANCHOR_SHOT] = { - .effect = EFFECT_HIT_PREVENT_ESCAPE, + .effect = EFFECT_HIT, .power = 80, .type = TYPE_STEEL, .accuracy = 100, @@ -10942,7 +10942,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_PRISMATIC_LASER] = { - .effect = EFFECT_RECHARGE, + .effect = EFFECT_HIT, .power = 160, .type = TYPE_PSYCHIC, .accuracy = 100, @@ -11639,7 +11639,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_SNAP_TRAP] = { - .effect = EFFECT_TRAP, + .effect = EFFECT_HIT, .power = 35, .type = TYPE_GRASS, .accuracy = 100, @@ -11893,7 +11893,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_METEOR_ASSAULT] = { - .effect = EFFECT_RECHARGE, + .effect = EFFECT_HIT, .power = 150, .type = TYPE_FIGHTING, .accuracy = 100, @@ -11910,7 +11910,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_ETERNABEAM] = { - .effect = EFFECT_RECHARGE, + .effect = EFFECT_HIT, .power = 160, .type = TYPE_DRAGON, .accuracy = 90, @@ -12261,7 +12261,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_THUNDER_CAGE] = { - .effect = EFFECT_TRAP, + .effect = EFFECT_HIT, .power = 80, .type = TYPE_ELECTRIC, .accuracy = 90, @@ -12440,7 +12440,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_STONE_AXE] = { - .effect = EFFECT_HIT_SET_ENTRY_HAZARD, + .effect = EFFECT_HIT, .power = 65, .type = TYPE_ROCK, .accuracy = 90, @@ -12509,7 +12509,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_WAVE_CRASH] = { - .effect = EFFECT_RECOIL, + .effect = EFFECT_HIT, .power = B_UPDATED_MOVE_DATA >= GEN_9 ? 120 : 75, .type = TYPE_WATER, .accuracy = 100, @@ -12585,19 +12585,16 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_BARB_BARRAGE] = { - .effect = EFFECT_BARB_BARRAGE, + .effect = EFFECT_DOUBLE_POWER_ON_ARG_STATUS, .power = 60, .type = TYPE_POISON, .accuracy = 100, - #if B_UPDATED_MOVE_DATA >= GEN_9 - .pp = 10, - #else - .pp = 15, - #endif + .pp = B_UPDATED_MOVE_DATA >= GEN_9 ? 10 : 15, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .sheerForceBoost = TRUE, + .argument = STATUS1_PSN_ANY, ADDITIONAL_EFFECTS( SECONDARY_EFFECT(MOVE_EFFECT_POISON, 50) ), @@ -12685,7 +12682,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_INFERNAL_PARADE] = { - .effect = EFFECT_INFERNAL_PARADE, + .effect = EFFECT_DOUBLE_POWER_ON_ARG_STATUS, .power = 60, .type = TYPE_GHOST, .accuracy = 100, @@ -12693,6 +12690,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, + .argument = STATUS1_ANY, .sheerForceBoost = TRUE, ADDITIONAL_EFFECTS( SECONDARY_EFFECT(MOVE_EFFECT_BURN, 30) @@ -12701,7 +12699,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_CEASELESS_EDGE] = { - .effect = EFFECT_HIT_SET_ENTRY_HAZARD, + .effect = EFFECT_HIT, .power = 65, .type = TYPE_DARK, .accuracy = 90, diff --git a/test/battle/ability/sheer_force.c b/test/battle/ability/sheer_force.c index e0c5427925..ec715fa8fd 100644 --- a/test/battle/ability/sheer_force.c +++ b/test/battle/ability/sheer_force.c @@ -40,7 +40,7 @@ SINGLE_BATTLE_TEST("Sheer Force boosts power, but removes secondary effects of m MESSAGE("Wobbuffet flinched!"); } // Volt Tackle/Flare Blitz edge case: recoil happens, but target isn't statused - if (gBattleMoves[move].effect == EFFECT_RECOIL) + if (gBattleMoves[move].recoil > 0) { HP_BAR(player); MESSAGE("Tauros is hit with recoil!"); diff --git a/test/battle/ai_check_viability.c b/test/battle/ai_check_viability.c index a29131691e..7d6dc4d3e5 100644 --- a/test/battle/ai_check_viability.c +++ b/test/battle/ai_check_viability.c @@ -36,7 +36,8 @@ AI_SINGLE_BATTLE_TEST("AI sees increased base power of Smelling Salt") GIVEN { ASSUME(B_UPDATED_MOVE_DATA >= GEN_6); - ASSUME(gBattleMoves[MOVE_SMELLING_SALTS].effect == EFFECT_SMELLING_SALTS); + ASSUME(gBattleMoves[MOVE_SMELLING_SALTS].effect == EFFECT_DOUBLE_POWER_ON_ARG_STATUS); + ASSUME(gBattleMoves[MOVE_SMELLING_SALTS].argument == STATUS1_PARALYSIS); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET) { HP(60); Status1(status1); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_BODY_SLAM, MOVE_SMELLING_SALTS); } @@ -54,10 +55,12 @@ AI_SINGLE_BATTLE_TEST("AI sees increased base power of Wake Up Slap") PARAMETRIZE { status1 = STATUS1_NONE; expectedMove = MOVE_BODY_SLAM; } PARAMETRIZE { status1 = STATUS1_SLEEP; expectedMove = MOVE_WAKE_UP_SLAP; } + PARAMETRIZE { status1 = STATUS1_SLEEP; expectedMove = MOVE_WAKE_UP_SLAP; } GIVEN { ASSUME(B_UPDATED_MOVE_DATA >= GEN_6); - ASSUME(gBattleMoves[MOVE_WAKE_UP_SLAP].effect == EFFECT_WAKE_UP_SLAP); + ASSUME(gBattleMoves[MOVE_WAKE_UP_SLAP].effect == EFFECT_DOUBLE_POWER_ON_ARG_STATUS); + ASSUME(gBattleMoves[MOVE_WAKE_UP_SLAP].argument == STATUS1_SLEEP); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_MEGANIUM) { HP(35); Status1(status1); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_BODY_SLAM, MOVE_WAKE_UP_SLAP); } diff --git a/test/battle/hold_effect/air_balloon.c b/test/battle/hold_effect/air_balloon.c index 46fec5c029..043028cc69 100644 --- a/test/battle/hold_effect/air_balloon.c +++ b/test/battle/hold_effect/air_balloon.c @@ -109,7 +109,7 @@ SINGLE_BATTLE_TEST("Air Balloon pops before it can be stolen with Thief or Covet PARAMETRIZE { move = MOVE_THIEF; } PARAMETRIZE { move = MOVE_COVET; } GIVEN { - ASSUME(gBattleMoves[move].effect == EFFECT_THIEF); + ASSUME(MoveHasMoveEffect(move, MOVE_EFFECT_STEAL_ITEM, FALSE) == TRUE); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_AIR_BALLOON); }; OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/hold_effect/red_card.c b/test/battle/hold_effect/red_card.c index 0f80dd176c..c22dee92b0 100644 --- a/test/battle/hold_effect/red_card.c +++ b/test/battle/hold_effect/red_card.c @@ -170,7 +170,7 @@ SINGLE_BATTLE_TEST("Red Card does not activate if stolen by a move") bool32 activate; PARAMETRIZE { item = ITEM_NONE; activate = FALSE; } PARAMETRIZE { item = ITEM_POTION; activate = TRUE; } - ASSUME(gBattleMoves[MOVE_THIEF].effect == EFFECT_THIEF); + ASSUME(MoveHasMoveEffect(MOVE_THIEF, MOVE_EFFECT_STEAL_ITEM, FALSE) == TRUE); GIVEN { PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_RED_CARD); } diff --git a/test/battle/hold_effect/white_herb.c b/test/battle/hold_effect/white_herb.c index e6a3d2b1ca..fa140c8d93 100644 --- a/test/battle/hold_effect/white_herb.c +++ b/test/battle/hold_effect/white_herb.c @@ -135,7 +135,7 @@ SINGLE_BATTLE_TEST("White Herb wont have time to activate if it is knocked off o KNOWN_FAILING; // Knock off fails, Thief is fine GIVEN { - ASSUME(gBattleMoves[MOVE_THIEF].effect == EFFECT_THIEF); + ASSUME(MoveHasMoveEffect(MOVE_THIEF, MOVE_EFFECT_STEAL_ITEM, FALSE) == TRUE); ASSUME(gBattleMoves[MOVE_KNOCK_OFF].effect == EFFECT_KNOCK_OFF); PLAYER(SPECIES_SLUGMA) { Ability(ABILITY_WEAK_ARMOR); Item(ITEM_WHITE_HERB); } OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect/barb_barrage.c b/test/battle/move_effect/barb_barrage.c index 9a29534c77..b66535a5fc 100644 --- a/test/battle/move_effect/barb_barrage.c +++ b/test/battle/move_effect/barb_barrage.c @@ -3,7 +3,8 @@ ASSUMPTIONS { - ASSUME(gBattleMoves[MOVE_BARB_BARRAGE].effect == EFFECT_BARB_BARRAGE); + ASSUME(gBattleMoves[MOVE_BARB_BARRAGE].effect == EFFECT_DOUBLE_POWER_ON_ARG_STATUS); + ASSUME(gBattleMoves[MOVE_BARB_BARRAGE].argument == STATUS1_PSN_ANY); ASSUME(MoveHasMoveEffect(MOVE_BARB_BARRAGE, MOVE_EFFECT_POISON, FALSE) == TRUE); } diff --git a/test/battle/move_effect/hex.c b/test/battle/move_effect/hex.c index e0a924906f..1c4e9a7a0f 100644 --- a/test/battle/move_effect/hex.c +++ b/test/battle/move_effect/hex.c @@ -3,7 +3,8 @@ ASSUMPTIONS { - ASSUME(gBattleMoves[MOVE_HEX].effect == EFFECT_HEX); + ASSUME(gBattleMoves[MOVE_HEX].effect == EFFECT_DOUBLE_POWER_ON_ARG_STATUS); + ASSUME(gBattleMoves[MOVE_HEX].argument == STATUS1_ANY); } SINGLE_BATTLE_TEST("Hex deals double damage to foes with a status", s16 damage) diff --git a/test/battle/move_effect/hit_set_entry_hazardss.c b/test/battle/move_effect/hit_set_entry_hazardss.c index caf75ed491..30a561d111 100644 --- a/test/battle/move_effect/hit_set_entry_hazardss.c +++ b/test/battle/move_effect/hit_set_entry_hazardss.c @@ -3,8 +3,8 @@ ASSUMPTIONS { - ASSUME(gBattleMoves[MOVE_STONE_AXE].effect == EFFECT_HIT_SET_ENTRY_HAZARD); - ASSUME(gBattleMoves[MOVE_CEASELESS_EDGE].effect == EFFECT_HIT_SET_ENTRY_HAZARD); + ASSUME(MoveHasMoveEffect(MOVE_STONE_AXE, MOVE_EFFECT_STEALTH_ROCK, FALSE) == TRUE); + ASSUME(MoveHasMoveEffect(MOVE_CEASELESS_EDGE, MOVE_EFFECT_SPIKES, FALSE) == TRUE); } SINGLE_BATTLE_TEST("Stone Axe / Ceaseless Edge set up hazards after hitting the target") diff --git a/test/battle/move_effect/infernal_parade.c b/test/battle/move_effect/infernal_parade.c index 38cfc9733a..abd43cfc4e 100644 --- a/test/battle/move_effect/infernal_parade.c +++ b/test/battle/move_effect/infernal_parade.c @@ -3,10 +3,11 @@ ASSUMPTIONS { - ASSUME(gBattleMoves[MOVE_INFERNAL_PARADE].effect == EFFECT_INFERNAL_PARADE); + ASSUME(gBattleMoves[MOVE_INFERNAL_PARADE].effect == EFFECT_DOUBLE_POWER_ON_ARG_STATUS); + ASSUME(gBattleMoves[MOVE_INFERNAL_PARADE].argument == STATUS1_ANY); } -SINGLE_BATTLE_TEST("Infernal Parade inflicts poison") +SINGLE_BATTLE_TEST("Infernal Parade inflicts burn") { GIVEN { PLAYER(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect/protect.c b/test/battle/move_effect/protect.c index 502eab46e0..2c8de594a1 100644 --- a/test/battle/move_effect/protect.c +++ b/test/battle/move_effect/protect.c @@ -206,10 +206,10 @@ SINGLE_BATTLE_TEST("Recoil damage is not applied if target was protected") GIVEN { - ASSUME(gBattleMoves[MOVE_VOLT_TACKLE].effect == EFFECT_RECOIL); - ASSUME(gBattleMoves[MOVE_HEAD_SMASH].effect == EFFECT_RECOIL); - ASSUME(gBattleMoves[MOVE_TAKE_DOWN].effect == EFFECT_RECOIL); - ASSUME(gBattleMoves[MOVE_DOUBLE_EDGE].effect == EFFECT_RECOIL); + ASSUME(gBattleMoves[MOVE_VOLT_TACKLE].recoil > 0); + ASSUME(gBattleMoves[MOVE_HEAD_SMASH].recoil > 0); + ASSUME(gBattleMoves[MOVE_TAKE_DOWN].recoil > 0); + ASSUME(gBattleMoves[MOVE_DOUBLE_EDGE].recoil > 0); PLAYER(SPECIES_RAPIDASH); OPPONENT(SPECIES_BEAUTIFLY); } WHEN { diff --git a/test/battle/move_effect/recoil.c b/test/battle/move_effect/recoil.c index 5d42451021..7793bbdd5b 100644 --- a/test/battle/move_effect/recoil.c +++ b/test/battle/move_effect/recoil.c @@ -7,7 +7,6 @@ SINGLE_BATTLE_TEST("Take Down deals 25% of recoil damage to the user") s16 recoilDamage; GIVEN { - ASSUME(gBattleMoves[MOVE_TAKE_DOWN].effect == EFFECT_RECOIL); ASSUME(gBattleMoves[MOVE_TAKE_DOWN].recoil == 25); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -28,7 +27,6 @@ SINGLE_BATTLE_TEST("Double Edge deals 33% of recoil damage to the user") s16 recoilDamage; GIVEN { - ASSUME(gBattleMoves[MOVE_DOUBLE_EDGE].effect == EFFECT_RECOIL); ASSUME(gBattleMoves[MOVE_DOUBLE_EDGE].recoil == 33); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -49,7 +47,6 @@ SINGLE_BATTLE_TEST("Head Smash deals 50% of recoil damage to the user") s16 recoilDamage; GIVEN { - ASSUME(gBattleMoves[MOVE_HEAD_SMASH].effect == EFFECT_RECOIL); ASSUME(gBattleMoves[MOVE_HEAD_SMASH].recoil == 50); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -70,7 +67,6 @@ SINGLE_BATTLE_TEST("Flare Blitz deals 33% of recoil damage to the user and can b s16 recoilDamage; GIVEN { - ASSUME(gBattleMoves[MOVE_FLARE_BLITZ].effect == EFFECT_RECOIL); ASSUME(gBattleMoves[MOVE_FLARE_BLITZ].recoil == 33); ASSUME(gBattleMoves[MOVE_FLARE_BLITZ].argument == STATUS1_BURN); PLAYER(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect/venoshock.c b/test/battle/move_effect/venoshock.c index b2b8fcda28..45a8dbfca1 100644 --- a/test/battle/move_effect/venoshock.c +++ b/test/battle/move_effect/venoshock.c @@ -3,7 +3,8 @@ ASSUMPTIONS { - ASSUME(gBattleMoves[MOVE_VENOSHOCK].effect == EFFECT_VENOSHOCK); + ASSUME(gBattleMoves[MOVE_VENOSHOCK].effect == EFFECT_DOUBLE_POWER_ON_ARG_STATUS); + ASSUME(gBattleMoves[MOVE_VENOSHOCK].argument == STATUS1_PSN_ANY); } SINGLE_BATTLE_TEST("Venoshock's power doubles if the target is poisoned/badly poisoned", s16 damage)