diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index c7377378b7..8fd4917a59 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -92,19 +92,30 @@ .4byte \ptr .endm - .macro seteffectwithchance + .macro setadditionaleffects + 1: .byte 0x15 + jumpifhalfword CMP_EQUAL, sMOVE_EFFECT, MOVE_EFFECT_CONTINUE, 1b .endm - .macro seteffectprimary + .macro seteffectprimary moveEffect=0 + .if \moveEffect != 0 + setmoveeffect \moveEffect + .endif .byte 0x16 .endm - .macro seteffectsecondary + .macro seteffectsecondary moveEffect=0 + .if \moveEffect != 0 + setmoveeffect \moveEffect + .endif .byte 0x17 .endm - .macro clearstatusfromeffect battler:req + .macro clearstatusfromeffect battler:req, moveEffect=0 + .if \moveEffect != 0 + setmoveeffect \moveEffect + .endif .byte 0x18 .byte \battler .endm @@ -764,7 +775,7 @@ .byte 0x8b .endm - .macro confuseifrepeatingattackends + .macro unused0x8C .byte 0x8c .endm @@ -1175,8 +1186,10 @@ .4byte \jumpInstr .endm - .macro getsecretpowereffect + .macro jumpifnotcurrentmoveargtype battler:req, failInstr:req .byte 0xe4 + .byte \battler + .4byte \failInstr .endm .macro pickup @@ -1810,8 +1823,8 @@ .4byte \jumpInstr .endm - .macro argumentstatuseffect - various BS_ATTACKER, VARIOUS_ARGUMENT_STATUS_EFFECT + .macro setargtobattledamage + various BS_ATTACKER, VARIOUS_SET_ARG_TO_BATTLE_DAMAGE .endm .macro tryhitswitchtarget failInstr:req @@ -1855,10 +1868,6 @@ various \battler, VARIOUS_POWER_TRICK .endm - .macro argumenttomoveeffect - various BS_ATTACKER, VARIOUS_ARGUMENT_TO_MOVE_EFFECT - .endm - .macro jumpifnotgrounded battler:req, jumpInstr:req various \battler, VARIOUS_JUMP_IF_NOT_GROUNDED .4byte \jumpInstr diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index cddbdcc044..06899045c5 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -24,11 +24,7 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectHit @ EFFECT_HIT .4byte BattleScript_EffectSleep @ EFFECT_SLEEP - .4byte BattleScript_EffectPoisonHit @ EFFECT_POISON_HIT .4byte BattleScript_EffectAbsorb @ EFFECT_ABSORB - .4byte BattleScript_EffectBurnHit @ EFFECT_BURN_HIT - .4byte BattleScript_EffectFreezeHit @ EFFECT_FREEZE_HIT - .4byte BattleScript_EffectParalyzeHit @ EFFECT_PARALYZE_HIT .4byte BattleScript_EffectExplosion @ EFFECT_EXPLOSION .4byte BattleScript_EffectDreamEater @ EFFECT_DREAM_EATER .4byte BattleScript_EffectMirrorMove @ EFFECT_MIRROR_MOVE @@ -49,27 +45,21 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectEvasionDown @ EFFECT_EVASION_DOWN .4byte BattleScript_EffectHaze @ EFFECT_HAZE .4byte BattleScript_EffectBide @ EFFECT_BIDE - .4byte BattleScript_EffectRampage @ EFFECT_RAMPAGE .4byte BattleScript_EffectRoar @ EFFECT_ROAR .4byte BattleScript_EffectHit @ EFFECT_MULTI_HIT .4byte BattleScript_EffectConversion @ EFFECT_CONVERSION - .4byte BattleScript_EffectFlinchHit @ EFFECT_FLINCH_HIT .4byte BattleScript_EffectRestoreHp @ EFFECT_RESTORE_HP .4byte BattleScript_EffectToxic @ EFFECT_TOXIC - .4byte BattleScript_EffectPayDay @ EFFECT_PAY_DAY .4byte BattleScript_EffectLightScreen @ EFFECT_LIGHT_SCREEN - .4byte BattleScript_EffectTriAttack @ EFFECT_TRI_ATTACK .4byte BattleScript_EffectRest @ EFFECT_REST .4byte BattleScript_EffectOHKO @ EFFECT_OHKO .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_EffectFixedDamageArg @ EFFECT_FIXED_DAMAGE_ARG .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_EffectConfuse @ EFFECT_CONFUSE .4byte BattleScript_EffectAttackUp2 @ EFFECT_ATTACK_UP_2 .4byte BattleScript_EffectDefenseUp2 @ EFFECT_DEFENSE_UP_2 @@ -89,18 +79,8 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectReflect @ EFFECT_REFLECT .4byte BattleScript_EffectPoison @ EFFECT_POISON .4byte BattleScript_EffectParalyze @ EFFECT_PARALYZE - .4byte BattleScript_EffectAttackDownHit @ EFFECT_ATTACK_DOWN_HIT - .4byte BattleScript_EffectDefenseDownHit @ EFFECT_DEFENSE_DOWN_HIT - .4byte BattleScript_EffectSpeedDownHit @ EFFECT_SPEED_DOWN_HIT - .4byte BattleScript_EffectSpecialAttackDownHit @ EFFECT_SPECIAL_ATTACK_DOWN_HIT - .4byte BattleScript_EffectSpecialDefenseDownHit @ EFFECT_SPECIAL_DEFENSE_DOWN_HIT - .4byte BattleScript_EffectAccuracyDownHit @ EFFECT_ACCURACY_DOWN_HIT - .4byte BattleScript_EffectHit @ EFFECT_EVASION_DOWN_HIT .4byte BattleScript_EffectTwoTurnsAttack @ EFFECT_TWO_TURNS_ATTACK - .4byte BattleScript_EffectConfuseHit @ EFFECT_CONFUSE_HIT - .4byte BattleScript_EffectHit @ EFFECT_VITAL_THROW .4byte BattleScript_EffectSubstitute @ EFFECT_SUBSTITUTE - .4byte BattleScript_EffectRecharge @ EFFECT_RECHARGE .4byte BattleScript_EffectRage @ EFFECT_RAGE .4byte BattleScript_EffectMimic @ EFFECT_MIMIC .4byte BattleScript_EffectMetronome @ EFFECT_METRONOME @@ -116,7 +96,6 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectConversion2 @ EFFECT_CONVERSION_2 .4byte BattleScript_EffectLockOn @ EFFECT_LOCK_ON .4byte BattleScript_EffectSketch @ EFFECT_SKETCH - .4byte BattleScript_EffectHammerArm @ EFFECT_HAMMER_ARM .4byte BattleScript_EffectSleepTalk @ EFFECT_SLEEP_TALK .4byte BattleScript_EffectDestinyBond @ EFFECT_DESTINY_BOND .4byte BattleScript_EffectHit @ EFFECT_FLAIL @@ -124,7 +103,6 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectHit @ EFFECT_FALSE_SWIPE .4byte BattleScript_EffectHealBell @ EFFECT_HEAL_BELL .4byte BattleScript_EffectTripleKick @ EFFECT_TRIPLE_KICK - .4byte BattleScript_EffectThief @ EFFECT_THIEF .4byte BattleScript_EffectMeanLook @ EFFECT_MEAN_LOOK .4byte BattleScript_EffectNightmare @ EFFECT_NIGHTMARE .4byte BattleScript_EffectMinimize @ EFFECT_MINIMIZE @@ -147,8 +125,6 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectMagnitude @ EFFECT_MAGNITUDE .4byte BattleScript_EffectBatonPass @ EFFECT_BATON_PASS .4byte BattleScript_EffectHit @ EFFECT_PURSUIT - .4byte BattleScript_EffectRapidSpin @ EFFECT_RAPID_SPIN - .4byte BattleScript_EffectSonicboom @ EFFECT_SONICBOOM .4byte BattleScript_EffectCaptivate @ EFFECT_CAPTIVATE .4byte BattleScript_EffectMorningSun @ EFFECT_MORNING_SUN .4byte BattleScript_EffectSynthesis @ EFFECT_SYNTHESIS @@ -156,19 +132,16 @@ 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_FELL_STINGER .4byte BattleScript_EffectBellyDrum @ EFFECT_BELLY_DRUM .4byte BattleScript_EffectPsychUp @ EFFECT_PSYCH_UP .4byte BattleScript_EffectMirrorCoat @ EFFECT_MIRROR_COAT .4byte BattleScript_EffectSkullBash @ EFFECT_SKULL_BASH - .4byte BattleScript_EffectEarthquake @ EFFECT_EARTHQUAKE + .4byte BattleScript_EffectHit @ EFFECT_EARTHQUAKE .4byte BattleScript_EffectFutureSight @ EFFECT_FUTURE_SIGHT .4byte BattleScript_EffectGust @ EFFECT_GUST .4byte BattleScript_EffectSolarBeam @ EFFECT_SOLAR_BEAM - .4byte BattleScript_EffectThunder @ EFFECT_THUNDER + .4byte BattleScript_EffectHit @ EFFECT_THUNDER .4byte BattleScript_EffectTeleport @ EFFECT_TELEPORT .4byte BattleScript_EffectBeatUp @ EFFECT_BEAT_UP .4byte BattleScript_EffectSemiInvulnerable @ EFFECT_SEMI_INVULNERABLE @@ -187,7 +160,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 @@ -198,13 +171,12 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectWish @ EFFECT_WISH .4byte BattleScript_EffectAssist @ EFFECT_ASSIST .4byte BattleScript_EffectIngrain @ EFFECT_INGRAIN - .4byte BattleScript_EffectSuperpower @ EFFECT_SUPERPOWER .4byte BattleScript_EffectMagicCoat @ EFFECT_MAGIC_COAT .4byte BattleScript_EffectRecycle @ EFFECT_RECYCLE .4byte BattleScript_EffectHit @ EFFECT_REVENGE .4byte BattleScript_EffectBrickBreak @ EFFECT_BRICK_BREAK .4byte BattleScript_EffectYawn @ EFFECT_YAWN - .4byte BattleScript_EffectKnockOff @ EFFECT_KNOCK_OFF + .4byte BattleScript_EffectHit @ EFFECT_KNOCK_OFF .4byte BattleScript_EffectEndeavor @ EFFECT_ENDEAVOR .4byte BattleScript_EffectHit @ EFFECT_ERUPTION .4byte BattleScript_EffectSkillSwap @ EFFECT_SKILL_SWAP @@ -213,13 +185,10 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectGrudge @ EFFECT_GRUDGE .4byte BattleScript_EffectSnatch @ EFFECT_SNATCH .4byte BattleScript_EffectHit @ EFFECT_LOW_KICK - .4byte BattleScript_EffectSecretPower @ EFFECT_SECRET_POWER .4byte BattleScript_EffectTeeterDance @ EFFECT_TEETER_DANCE .4byte BattleScript_EffectHitEscape @ EFFECT_HIT_ESCAPE .4byte BattleScript_EffectMudSport @ EFFECT_MUD_SPORT - .4byte BattleScript_EffectPoisonFang @ EFFECT_POISON_FANG .4byte BattleScript_EffectHit @ EFFECT_WEATHER_BALL - .4byte BattleScript_EffectOverheat @ EFFECT_OVERHEAT .4byte BattleScript_EffectTickle @ EFFECT_TICKLE .4byte BattleScript_EffectCosmicPower @ EFFECT_COSMIC_POWER .4byte BattleScript_EffectSkyUppercut @ EFFECT_SKY_UPPERCUT @@ -232,9 +201,7 @@ 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_WRING_OUT - .4byte BattleScript_EffectHit @ EFFECT_HEX .4byte BattleScript_EffectHit @ EFFECT_ASSURANCE .4byte BattleScript_EffectHit @ EFFECT_TRUMP_CARD .4byte BattleScript_EffectHit @ EFFECT_ACROBATICS @@ -245,11 +212,10 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectHit @ EFFECT_GYRO_BALL .4byte BattleScript_EffectHit @ EFFECT_ECHOED_VOICE .4byte BattleScript_EffectHit @ EFFECT_PAYBACK - .4byte BattleScript_EffectRound @ EFFECT_ROUND + .4byte BattleScript_EffectHit @ EFFECT_ROUND .4byte BattleScript_EffectHit @ EFFECT_BRINE - .4byte BattleScript_EffectHit @ EFFECT_VENOSHOCK .4byte BattleScript_EffectHit @ EFFECT_RETALIATE - .4byte BattleScript_EffectBulldoze @ EFFECT_BULLDOZE + .4byte BattleScript_EffectHit @ EFFECT_BULLDOZE .4byte BattleScript_EffectHit @ EFFECT_FOUL_PLAY .4byte BattleScript_EffectHit @ EFFECT_PSYSHOCK .4byte BattleScript_EffectRoost @ EFFECT_ROOST @@ -275,17 +241,12 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectMetalBurst @ EFFECT_METAL_BURST .4byte BattleScript_EffectLuckyChant @ EFFECT_LUCKY_CHANT .4byte BattleScript_EffectSuckerPunch @ EFFECT_SUCKER_PUNCH - .4byte BattleScript_EffectSpecialDefenseDownHit2 @ EFFECT_SPECIAL_DEFENSE_DOWN_HIT_2 .4byte BattleScript_EffectSimpleBeam @ EFFECT_SIMPLE_BEAM .4byte BattleScript_EffectEntrainment @ EFFECT_ENTRAINMENT .4byte BattleScript_EffectHealPulse @ EFFECT_HEAL_PULSE .4byte BattleScript_EffectQuash @ EFFECT_QUASH .4byte BattleScript_EffectIonDeluge @ EFFECT_ION_DELUGE -#if B_USE_FROSTBITE == TRUE - .4byte BattleScript_EffectFrostbiteHit @ EFFECT_FREEZE_DRY -#else - .4byte BattleScript_EffectFreezeHit @ EFFECT_FREEZE_DRY -#endif + .4byte BattleScript_EffectHit @ EFFECT_FREEZE_DRY .4byte BattleScript_EffectTopsyTurvy @ EFFECT_TOPSY_TURVY .4byte BattleScript_EffectMistyTerrain @ EFFECT_MISTY_TERRAIN .4byte BattleScript_EffectGrassyTerrain @ EFFECT_GRASSY_TERRAIN @@ -293,26 +254,22 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectPsychicTerrain @ EFFECT_PSYCHIC_TERRAIN .4byte BattleScript_EffectAttackAccUp @ EFFECT_ATTACK_ACCURACY_UP .4byte BattleScript_EffectAttackSpAttackUp @ EFFECT_ATTACK_SPATK_UP - .4byte BattleScript_EffectHurricane @ EFFECT_HURRICANE + .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_EffectQuiverDance @ EFFECT_QUIVER_DANCE .4byte BattleScript_EffectCoil @ EFFECT_COIL .4byte BattleScript_EffectElectrify @ EFFECT_ELECTRIFY .4byte BattleScript_EffectReflectType @ EFFECT_REFLECT_TYPE .4byte BattleScript_EffectSoak @ EFFECT_SOAK .4byte BattleScript_EffectGrowth @ EFFECT_GROWTH - .4byte BattleScript_EffectCloseCombat @ EFFECT_CLOSE_COMBAT .4byte BattleScript_EffectLastResort @ EFFECT_LAST_RESORT - .4byte BattleScript_EffectFlinchStatus @ EFFECT_FLINCH_STATUS .4byte BattleScript_EffectShellSmash @ EFFECT_SHELL_SMASH .4byte BattleScript_EffectShiftGear @ EFFECT_SHIFT_GEAR .4byte BattleScript_EffectDefenseUp3 @ EFFECT_DEFENSE_UP_3 .4byte BattleScript_EffectNobleRoar @ EFFECT_NOBLE_ROAR .4byte BattleScript_EffectVenomDrench @ EFFECT_VENOM_DRENCH .4byte BattleScript_EffectToxicThread @ EFFECT_TOXIC_THREAD - .4byte BattleScript_EffectClearSmog @ EFFECT_CLEAR_SMOG .4byte BattleScript_EffectHitSwitchTarget @ EFFECT_HIT_SWITCH_TARGET .4byte BattleScript_EffectFinalGambit @ EFFECT_FINAL_GAMBIT .4byte BattleScript_EffectHit @ EFFECT_CHANGE_TYPE_ON_ITEM @@ -320,51 +277,37 @@ 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_EffectSynchronoise @ EFFECT_SYNCHRONOISE .4byte BattleScript_EffectPsychoShift @ EFFECT_PSYCHO_SHIFT .4byte BattleScript_EffectPowerTrick @ EFFECT_POWER_TRICK - .4byte BattleScript_EffectFlameBurst @ EFFECT_FLAME_BURST .4byte BattleScript_EffectAfterYou @ EFFECT_AFTER_YOU .4byte BattleScript_EffectBestow @ EFFECT_BESTOW .4byte BattleScript_EffectRototiller @ EFFECT_ROTOTILLER .4byte BattleScript_EffectFlowerShield @ EFFECT_FLOWER_SHIELD - .4byte BattleScript_EffectHitPreventEscape @ EFFECT_HIT_PREVENT_ESCAPE .4byte BattleScript_EffectSpeedSwap @ EFFECT_SPEED_SWAP - .4byte BattleScript_EffectDefenseUp2Hit @ EFFECT_DEFENSE_UP2_HIT .4byte BattleScript_EffectHit @ EFFECT_REVELATION_DANCE .4byte BattleScript_EffectAuroraVeil @ EFFECT_AURORA_VEIL .4byte BattleScript_EffectThirdType @ EFFECT_THIRD_TYPE - .4byte BattleScript_EffectFeint @ EFFECT_FEINT - .4byte BattleScript_EffectSparklingAria @ EFFECT_SPARKLING_ARIA .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_BELCH .4byte BattleScript_EffectPartingShot @ EFFECT_PARTING_SHOT - .4byte BattleScript_EffectSpectralThief @ EFFECT_SPECTRAL_THIEF - .4byte BattleScript_EffectVCreate @ EFFECT_V_CREATE .4byte BattleScript_EffectMatBlock @ EFFECT_MAT_BLOCK .4byte BattleScript_EffectHit @ EFFECT_STOMPING_TANTRUM - .4byte BattleScript_EffectCoreEnforcer @ EFFECT_CORE_ENFORCER .4byte BattleScript_EffectInstruct @ EFFECT_INSTRUCT - .4byte BattleScript_EffectThroatChop @ EFFECT_THROAT_CHOP .4byte BattleScript_EffectLaserFocus @ EFFECT_LASER_FOCUS .4byte BattleScript_EffectMagneticFlux @ EFFECT_MAGNETIC_FLUX .4byte BattleScript_EffectGearUp @ EFFECT_GEAR_UP - .4byte BattleScript_EffectIncinerate @ EFFECT_INCINERATE - .4byte BattleScript_EffectBugBite @ EFFECT_BUG_BITE .4byte BattleScript_EffectStrengthSap @ EFFECT_STRENGTH_SAP .4byte BattleScript_EffectMindBlown @ EFFECT_MIND_BLOWN .4byte BattleScript_EffectPurify @ EFFECT_PURIFY - .4byte BattleScript_EffectBurnUp @ EFFECT_BURN_UP + .4byte BattleScript_FailIfNotArgType @ EFFECT_FAIL_IF_NOT_ARG_TYPE .4byte BattleScript_EffectShoreUp @ EFFECT_SHORE_UP .4byte BattleScript_EffectGeomancy @ EFFECT_GEOMANCY .4byte BattleScript_EffectFairyLock @ EFFECT_FAIRY_LOCK .4byte BattleScript_EffectAllySwitch @ EFFECT_ALLY_SWITCH .4byte BattleScript_EffectRelicSong @ EFFECT_RELIC_SONG - .4byte BattleScript_EffectAttackerDefenseDownHit @ EFFECT_ATTACKER_DEFENSE_DOWN_HIT .4byte BattleScript_EffectHit @ EFFECT_BODY_PRESS .4byte BattleScript_EffectEerieSpell @ EFFECT_EERIE_SPELL .4byte BattleScript_EffectJungleHealing @ EFFECT_JUNGLE_HEALING @@ -376,8 +319,7 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectHit @ EFFECT_SNIPE_SHOT .4byte BattleScript_EffectRecoilHP25 @ EFFECT_RECOIL_HP_25 .4byte BattleScript_EffectStuffCheeks @ EFFECT_STUFF_CHEEKS - .4byte BattleScript_EffectDefenseDownHit @ EFFECT_GRAV_APPLE - .4byte BattleScript_EffectEvasionUpHit @ EFFECT_EVASION_UP_HIT + .4byte BattleScript_EffectHit @ EFFECT_GRAV_APPLE .4byte BattleScript_EffectGlitzyGlow @ EFFECT_GLITZY_GLOW .4byte BattleScript_EffectBaddyBad @ EFFECT_BADDY_BAD .4byte BattleScript_EffectSappySeed @ EFFECT_SAPPY_SEED @@ -389,7 +331,6 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectPhotonGeyser @ EFFECT_PHOTON_GEYSER .4byte BattleScript_EffectShellSideArm @ EFFECT_SHELL_SIDE_ARM .4byte BattleScript_EffectHit @ EFFECT_TERRAIN_PULSE - .4byte BattleScript_EffectJawLock @ EFFECT_JAW_LOCK .4byte BattleScript_EffectNoRetreat @ EFFECT_NO_RETREAT .4byte BattleScript_EffectTarShot @ EFFECT_TAR_SHOT .4byte BattleScript_EffectPoltergeist @ EFFECT_POLTERGEIST @@ -406,35 +347,20 @@ gBattleScriptsForMoveEffects:: .4byte BattleScript_EffectExtremeEvoboost @ EFFECT_EXTREME_EVOBOOST .4byte BattleScript_EffectHitSetRemoveTerrain @ EFFECT_HIT_SET_REMOVE_TERRAIN .4byte BattleScript_EffectDarkVoid @ EFFECT_DARK_VOID - .4byte BattleScript_EffectSleepHit @ EFFECT_SLEEP_HIT - .4byte BattleScript_EffectDoubleShock @ EFFECT_DOUBLE_SHOCK - .4byte BattleScript_EffectSpecialAttackUpHit @ EFFECT_SPECIAL_ATTACK_UP_HIT .4byte BattleScript_EffectVictoryDance @ EFFECT_VICTORY_DANCE .4byte BattleScript_EffectTeatime @ EFFECT_TEATIME .4byte BattleScript_EffectAttackUpUserAlly @ EFFECT_ATTACK_UP_USER_ALLY .4byte BattleScript_EffectShellTrap @ EFFECT_SHELL_TRAP .4byte BattleScript_EffectHit @ EFFECT_PSYBLADE .4byte BattleScript_EffectHit @ EFFECT_HYDRO_STEAM - .4byte BattleScript_EffectHitSetEntryHazard @ EFFECT_HIT_SET_ENTRY_HAZARD - .4byte BattleScript_EffectDireClaw @ EFFECT_DIRE_CLAW - .4byte BattleScript_EffectBarbBarrage @ EFFECT_BARB_BARRAGE .4byte BattleScript_EffectRevivalBlessing @ EFFECT_REVIVAL_BLESSING - .4byte BattleScript_EffectFrostbiteHit @ EFFECT_FROSTBITE_HIT .4byte BattleScript_EffectSnow @ EFFECT_SNOWSCAPE - .4byte BattleScript_EffectTripleArrows @ EFFECT_TRIPLE_ARROWS - .4byte BattleScript_EffectInfernalParade @ EFFECT_INFERNAL_PARADE .4byte BattleScript_EffectTakeHeart @ EFFECT_TAKE_HEART - .4byte BattleScript_EffectAxeKick @ EFFECT_AXE_KICK .4byte BattleScript_EffectHit @ EFFECT_COLLISION_COURSE - .4byte BattleScript_EffectSpinOut @ EFFECT_SPIN_OUT - .4byte BattleScript_EffectMakeItRain @ EFFECT_MAKE_IT_RAIN .4byte BattleScript_EffectCorrosiveGas @ EFFECT_CORROSIVE_GAS .4byte BattleScript_EffectHit @ EFFECT_POPULATION_BOMB - .4byte BattleScript_EffectMortalSpin @ EFFECT_MORTAL_SPIN .4byte BattleScript_EffectSaltCure @ EFFECT_SALT_CURE .4byte BattleScript_EffectChillyReception @ EFFECT_CHILLY_RECEPTION - .4byte BattleScript_EffectMatchaGotcha @ EFFECT_MATCHA_GOTCHA - .4byte BattleScript_EffectSyrupBomb @ EFFECT_SYRUP_BOMB .4byte BattleScript_EffectMaxMove @ EFFECT_MAX_MOVE .4byte BattleScript_EffectGlaiveRush @ EFFECT_GLAIVE_RUSH .4byte BattleScript_EffectBrickBreak @ EFFECT_RAGING_BULL @@ -512,10 +438,6 @@ BattleScript_EffectGlaiveRush:: setglaiverush goto BattleScript_TryFaintMon -BattleScript_EffectSyrupBomb:: - setmoveeffect MOVE_EFFECT_SYRUP_BOMB - goto BattleScript_EffectHit - BattleScript_SyrupBombActivates:: printstring STRINGID_TARGETCOVEREDINSTICKYCANDYSYRUP waitmessage B_WAIT_TIME_LONG @@ -531,11 +453,6 @@ BattleScript_SyrupBombEndTurn:: BattleScript_SyrupBombTurnDmgEnd: end2 -BattleScript_EffectMatchaGotcha:: - setmoveeffect MOVE_EFFECT_BURN - goto BattleScript_EffectAbsorb - end - BattleScript_EffectChillyReception:: printstring STRINGID_PKMNTELLCHILLINGRECEPTIONJOKE waitmessage B_WAIT_TIME_LONG @@ -664,23 +581,7 @@ BattleScript_EffectHit_Pledge:: pause B_WAIT_TIME_MED printstring STRINGID_THETWOMOVESBECOMEONE waitmessage B_WAIT_TIME_LONG - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - ppreduce - critcalc - damagecalc - adjustdamage - attackanimation - waitanimation - effectivenesssound - hitanimation BS_TARGET - waitstate - healthbarupdate BS_TARGET - datahpupdate BS_TARGET - critmessage - waitmessage B_WAIT_TIME_LONG - resultmessage - waitmessage B_WAIT_TIME_LONG - seteffectwithchance + call BattleScript_EffectHit_RetFromAccCheck tryfaintmon BS_TARGET return @@ -709,15 +610,6 @@ BattleScript_HurtTarget_NoString: tryfaintmon BS_TARGET return -BattleScript_EffectMortalSpin: - call BattleScript_EffectHit_Ret - rapidspinfree - setmoveeffect MOVE_EFFECT_POISON - seteffectwithchance - tryfaintmon BS_TARGET - moveendall - end - BattleScript_EffectCorrosiveGas: attackcanceler accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE @@ -741,27 +633,6 @@ BattleScript_CorrosiveGasFail: waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd -BattleScript_EffectMakeItRain: - jumpifbattletype BATTLE_TYPE_DOUBLE, BattleScript_MakeItRainDoubles -BattleScript_MakeItRainContinuous: - setmoveeffect MOVE_EFFECT_PAYDAY - call BattleScript_EffectHit_Ret - tryfaintmon BS_TARGET - setmoveeffect MOVE_EFFECT_SP_ATK_MINUS_1 | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN - seteffectprimary - goto BattleScript_MoveEnd -BattleScript_MakeItRainDoubles: - jumpifword CMP_NO_COMMON_BITS, gHitMarker, HITMARKER_NO_ATTACKSTRING | HITMARKER_NO_PPDEDUCT, BattleScript_NoMoveEffect - goto BattleScript_MakeItRainContinuous - -BattleScript_EffectSpinOut:: - setmoveeffect MOVE_EFFECT_SPD_MINUS_2 | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN - goto BattleScript_EffectHit - -BattleScript_EffectAxeKick:: - setmoveeffect MOVE_EFFECT_CONFUSION - goto BattleScript_EffectRecoilIfMiss - BattleScript_EffectTakeHeart:: attackcanceler attackstring @@ -776,10 +647,6 @@ BattleScript_EffectTakeHeart:: jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_SPDEF, MAX_STAT_STAGE, BattleScript_CalmMindStatRaise goto BattleScript_CantRaiseMultipleStats -BattleScript_EffectTripleArrows:: - setmoveeffect MOVE_EFFECT_TRIPLE_ARROWS - goto BattleScript_EffectHit - BattleScript_EffectRevivalBlessing:: attackcanceler attackstring @@ -804,14 +671,6 @@ BattleScript_StealthRockActivates:: waitmessage B_WAIT_TIME_LONG return -BattleScript_EffectDireClaw:: - setmoveeffect MOVE_EFFECT_DIRE_CLAW - goto BattleScript_EffectHit - -BattleScript_EffectHitSetEntryHazard:: - argumenttomoveeffect - goto BattleScript_EffectHit - BattleScript_SpikesActivates:: trysetspikes BattleScript_MoveEnd printfromtable gDmgHazardsStringIds @@ -994,21 +853,7 @@ BattleScript_EffectSteelBeam:: attackstring ppreduce accuracycheck BattleScript_SteelBeamMiss, ACC_CURR_MOVE - critcalc - damagecalc - adjustdamage - attackanimation - waitanimation - effectivenesssound - hitanimation BS_TARGET - waitstate - healthbarupdate BS_TARGET - datahpupdate BS_TARGET - critmessage - waitmessage B_WAIT_TIME_LONG - resultmessage - waitmessage B_WAIT_TIME_LONG - seteffectwithchance + call BattleScript_EffectHit_RetFromCritCalc jumpifability BS_ATTACKER, ABILITY_MAGIC_GUARD, BattleScript_SteelBeamAfterSelfDamage call BattleScript_SteelBeamSelfDamage BattleScript_SteelBeamAfterSelfDamage:: @@ -1089,13 +934,11 @@ BattleScript_FirstChargingTurnMeteorBeam:: attackanimation waitanimation orword gHitMarker, HITMARKER_CHARGING - setmoveeffect MOVE_EFFECT_CHARGING | MOVE_EFFECT_AFFECTS_USER - seteffectprimary + seteffectprimary MOVE_EFFECT_CHARGING | MOVE_EFFECT_AFFECTS_USER copybyte cMULTISTRING_CHOOSER, sTWOTURN_STRINGID printfromtable gFirstTurnOfTwoStringIds waitmessage B_WAIT_TIME_LONG - setmoveeffect MOVE_EFFECT_SP_ATK_PLUS_1 | MOVE_EFFECT_AFFECTS_USER - seteffectsecondary + setadditionaleffects @ only onChargeTurnOnly effects will work here return BattleScript_EffectSkyDrop: @@ -1120,11 +963,9 @@ BattleScript_SkyDropWork: goto BattleScript_MoveEnd BattleScript_SkyDropTurn2: attackcanceler - setmoveeffect MOVE_EFFECT_CHARGING setbyte sB_ANIM_TURN, 0x1 - clearstatusfromeffect BS_ATTACKER + clearstatusfromeffect BS_ATTACKER, MOVE_EFFECT_CHARGING orword gHitMarker, HITMARKER_NO_PPDEDUCT - argumenttomoveeffect clearsemiinvulnerablebit attackstring clearskydrop BattleScript_SkyDropChangedTarget @@ -1147,11 +988,9 @@ BattleScript_SkyDropChangedTarget: goto BattleScript_MoveEnd BattleScript_SkyDropFlyingConfuseLock: - setmoveeffect MOVE_EFFECT_CONFUSION - seteffectprimary + seteffectprimary MOVE_EFFECT_CONFUSION BattleScript_SkyDropFlyingAlreadyConfused: - setmoveeffect MOVE_EFFECT_THRASH - clearstatusfromeffect BS_TARGET + clearstatusfromeffect BS_TARGET, MOVE_EFFECT_THRASH jumpifstatus2 BS_TARGET, STATUS2_CONFUSION, BattleScript_MoveEnd setbyte BS_ATTACKER, BS_TARGET goto BattleScript_ThrashConfuses @@ -1182,6 +1021,7 @@ BattleScript_EffectFling: resultmessage waitmessage B_WAIT_TIME_MED jumpiflastuseditemberry BattleScript_EffectFlingConsumeBerry + jumpifability BS_TARGET, ABILITY_SHIELD_DUST, BattleScript_FlingBlockedByShieldDust jumpiflastuseditemholdeffect BS_ATTACKER, HOLD_EFFECT_FLAME_ORB, BattleScript_FlingFlameOrb jumpiflastuseditemholdeffect BS_ATTACKER, HOLD_EFFECT_FLINCH, BattleScript_FlingFlinch jumpiflastuseditemholdeffect BS_ATTACKER, HOLD_EFFECT_LIGHT_BALL, BattleScript_FlingLightBall @@ -1189,6 +1029,7 @@ BattleScript_EffectFling: jumpiflastuseditemholdeffect BS_ATTACKER, HOLD_EFFECT_POISON_POWER, BattleScript_FlingPoisonBarb jumpiflastuseditemholdeffect BS_ATTACKER, HOLD_EFFECT_TOXIC_ORB, BattleScript_FlingToxicOrb jumpiflastuseditemholdeffect BS_ATTACKER, HOLD_EFFECT_RESTORE_STATS, BattleScript_FlingWhiteHerb + goto BattleScript_FlingEnd BattleScript_EffectFlingConsumeBerry: savebattleritem BS_TARGET battleritemtolastuseditem BS_TARGET @@ -1207,17 +1048,19 @@ BattleScript_FlingFailConsumeItem:: removeitem BS_ATTACKER goto BattleScript_FailedFromAtkString +BattleScript_FlingBlockedByShieldDust:: + printstring STRINGID_ITEMWASUSEDUP + waitmessage B_WAIT_TIME_LONG + goto BattleScript_FlingEnd + BattleScript_FlingFlameOrb: - setmoveeffect MOVE_EFFECT_BURN - seteffectprimary + seteffectsecondary MOVE_EFFECT_BURN goto BattleScript_FlingEnd BattleScript_FlingFlinch: - setmoveeffect MOVE_EFFECT_FLINCH - seteffectprimary + seteffectsecondary MOVE_EFFECT_FLINCH goto BattleScript_FlingEnd BattleScript_FlingLightBall: - setmoveeffect MOVE_EFFECT_PARALYSIS - seteffectprimary + seteffectsecondary MOVE_EFFECT_PARALYSIS goto BattleScript_FlingEnd BattleScript_FlingMentalHerb: curecertainstatuses BS_TARGET @@ -1230,12 +1073,10 @@ BattleScript_FlingMentalHerb: restoretarget goto BattleScript_FlingEnd BattleScript_FlingPoisonBarb: - setmoveeffect MOVE_EFFECT_POISON - seteffectprimary + seteffectsecondary MOVE_EFFECT_POISON goto BattleScript_FlingEnd BattleScript_FlingToxicOrb: - setmoveeffect MOVE_EFFECT_TOXIC - seteffectprimary + seteffectsecondary MOVE_EFFECT_TOXIC goto BattleScript_FlingEnd BattleScript_FlingWhiteHerb: tryresetnegativestatstages BS_TARGET @@ -1253,7 +1094,6 @@ BattleScript_FlingMissed: BattleScript_EffectShellSideArm: shellsidearmcheck - setmoveeffect MOVE_EFFECT_POISON goto BattleScript_EffectHit BattleScript_EffectPhotonGeyser: @@ -1261,8 +1101,8 @@ BattleScript_EffectPhotonGeyser: goto BattleScript_EffectHit BattleScript_EffectAuraWheel: @ Aura Wheel can only be used by Morpeko - jumpifspecies BS_ATTACKER, SPECIES_MORPEKO_FULL_BELLY, BattleScript_EffectSpeedUpHit - jumpifspecies BS_ATTACKER, SPECIES_MORPEKO_HANGRY, BattleScript_EffectSpeedUpHit + jumpifspecies BS_ATTACKER, SPECIES_MORPEKO_FULL_BELLY, BattleScript_EffectHit + jumpifspecies BS_ATTACKER, SPECIES_MORPEKO_HANGRY, BattleScript_EffectHit goto BattleScript_PokemonCantUseTheMove BattleScript_EffectClangorousSoul: @@ -1347,16 +1187,11 @@ BattleScript_EffectNoRetreat: waitanimation call BattleScript_AllStatsUp jumpifstatus2 BS_TARGET, STATUS2_ESCAPE_PREVENTION, BattleScript_MoveEnd - setmoveeffect MOVE_EFFECT_PREVENT_ESCAPE - seteffectprimary + seteffectprimary MOVE_EFFECT_PREVENT_ESCAPE | MOVE_EFFECT_AFFECTS_USER printstring STRINGID_CANTESCAPEDUETOUSEDMOVE waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd -BattleScript_EffectJawLock: - setmoveeffect MOVE_EFFECT_TRAP_BOTH | MOVE_EFFECT_CERTAIN - goto BattleScript_EffectHit - BattleScript_BothCanNoLongerEscape:: printstring STRINGID_BOTHCANNOLONGERESCAPE waitmessage B_WAIT_TIME_LONG @@ -1373,9 +1208,7 @@ BattleScript_EffectHyperspaceFuryUnbound:: attackstring pause B_WAIT_TIME_LONG ppreduce - setmoveeffect MOVE_EFFECT_FEINT - seteffectwithchance - setmoveeffect MOVE_EFFECT_DEF_MINUS_1 | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN + seteffectprimary MOVE_EFFECT_FEINT goto BattleScript_HitFromCritCalc BattleScript_ButHoopaCantUseIt: @@ -1441,10 +1274,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 @@ -1558,16 +1387,7 @@ BattleScript_JungleHealingTryRestoreAlly: setallytonexttarget JungleHealing_RestoreTargetHealth goto BattleScript_MoveEnd -BattleScript_EffectAttackerDefenseDownHit: - jumpifword CMP_COMMON_BITS, gHitMarker, HITMARKER_NO_ATTACKSTRING | HITMARKER_NO_PPDEDUCT, BattleScript_NoMoveEffect - setmoveeffect MOVE_EFFECT_DEF_MINUS_1 | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN - goto BattleScript_EffectHit -BattleScript_NoMoveEffect: - setmoveeffect 0 - goto BattleScript_EffectHit - BattleScript_EffectRelicSong: - setmoveeffect MOVE_EFFECT_SLEEP call BattleScript_EffectHit_Ret tryfaintmon BS_TARGET moveendall @@ -1601,42 +1421,29 @@ BattleScript_EffectFairyLock: waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd -BattleScript_EffectBurnUp: +BattleScript_FailIfNotArgType: attackcanceler attackstring ppreduce - jumpiftype BS_ATTACKER, TYPE_FIRE, BattleScript_BurnUpWorks - goto BattleScript_ButItFailed - -BattleScript_BurnUpWorks: - setmoveeffect MOVE_EFFECT_BURN_UP | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN + jumpifnotcurrentmoveargtype BS_ATTACKER, BattleScript_ButItFailed accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE goto BattleScript_HitFromCritCalc -BattleScript_BurnUpRemoveType:: - losetype BS_ATTACKER, TYPE_FIRE +BattleScript_RemoveFireType:: printstring STRINGID_ATTACKERLOSTFIRETYPE waitmessage B_WAIT_TIME_LONG return -BattleScript_EffectDoubleShock: - attackcanceler - attackstring - ppreduce - jumpiftype BS_ATTACKER, TYPE_ELECTRIC, BattleScript_DoubleShockWorks - goto BattleScript_ButItFailed - -BattleScript_DoubleShockWorks: - setmoveeffect MOVE_EFFECT_DOUBLE_SHOCK | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - goto BattleScript_HitFromCritCalc - -BattleScript_DoubleShockRemoveType:: - losetype BS_ATTACKER, TYPE_ELECTRIC +BattleScript_RemoveElectricType:: printstring STRINGID_ATTACKERLOSTELECTRICTYPE waitmessage B_WAIT_TIME_LONG return +BattleScript_RemoveGenericType:: + printstring STRINGID_ATTACKERLOSTITSTYPE + waitmessage B_WAIT_TIME_LONG + return + BattleScript_DefDown:: modifybattlerstatstage BS_TARGET, STAT_DEF, DECREASE, 1, BattleScript_DefDown_Ret, ANIM_ON BattleScript_DefDown_Ret: @@ -1720,14 +1527,6 @@ BattleScript_StrengthSapMustLower: waitanimation goto BattleScript_StrengthSapLower -BattleScript_EffectBugBite: - setmoveeffect MOVE_EFFECT_BUG_BITE | MOVE_EFFECT_CERTAIN - goto BattleScript_EffectHit - -BattleScript_EffectIncinerate: - setmoveeffect MOVE_EFFECT_INCINERATE | MOVE_EFFECT_CERTAIN - goto BattleScript_EffectHit - BattleScript_MoveEffectIncinerate:: printstring STRINGID_INCINERATEBURN waitmessage B_WAIT_TIME_LONG @@ -1746,10 +1545,6 @@ BattleScript_MoveEffectBugBite:: restoretarget return -BattleScript_EffectCoreEnforcer: - setmoveeffect MOVE_EFFECT_CORE_ENFORCER | MOVE_EFFECT_CERTAIN - goto BattleScript_EffectHit - BattleScript_MoveEffectCoreEnforcer:: setgastroacid BattleScript_CoreEnforcerRet printstring STRINGID_PKMNSABILITYSUPPRESSED @@ -1771,10 +1566,6 @@ BattleScript_EffectLaserFocus: waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd -BattleScript_EffectVCreate: - setmoveeffect MOVE_EFFECT_V_CREATE | MOVE_EFFECT_AFFECTS_USER - goto BattleScript_EffectHit - BattleScript_VCreateStatLoss:: jumpifstat BS_ATTACKER, CMP_GREATER_THAN, STAT_DEF, MIN_STAT_STAGE, BattleScript_VCreateStatAnim jumpifstat BS_ATTACKER, CMP_GREATER_THAN, STAT_SPDEF, MIN_STAT_STAGE, BattleScript_VCreateStatAnim @@ -1810,10 +1601,6 @@ BattleScript_SpectralThiefSteal:: spectralthiefprintstats return -BattleScript_EffectSpectralThief: - setmoveeffect MOVE_EFFECT_SPECTRAL_THIEF - goto BattleScript_EffectHit - BattleScript_EffectPartingShot:: attackcanceler attackstring @@ -1843,10 +1630,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 @@ -1985,10 +1768,6 @@ BattleScript_MoveEffectFeint:: waitmessage B_WAIT_TIME_LONG return -BattleScript_EffectFeint: - setmoveeffect MOVE_EFFECT_FEINT - goto BattleScript_EffectHit - BattleScript_EffectThirdType: attackcanceler accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE @@ -2001,10 +1780,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 @@ -2114,10 +1889,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 @@ -2207,10 +1978,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 @@ -2327,7 +2094,7 @@ BattleScript_EffectFinalGambit: dmgtocurrattackerhp healthbarupdate BS_ATTACKER datahpupdate BS_ATTACKER - seteffectwithchance + setadditionaleffects tryfaintmon BS_ATTACKER tryfaintmon BS_TARGET jumpifmovehadnoeffect BattleScript_MoveEnd @@ -2352,10 +2119,6 @@ BattleScript_HitSwitchTargetForceRandomSwitchFailed: setbyte sSWITCH_CASE, B_SWITCH_NORMAL goto BattleScript_MoveEnd -BattleScript_EffectClearSmog: - setmoveeffect MOVE_EFFECT_CLEAR_SMOG - goto BattleScript_EffectHit - BattleScript_EffectToxicThread: setstatchanger STAT_SPEED, 2, TRUE attackcanceler @@ -2380,8 +2143,7 @@ BattleScript_ToxicThreadPrintString:: printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG BattleScript_ToxicThreadTryPsn:: - setmoveeffect MOVE_EFFECT_POISON - seteffectprimary + seteffectprimary MOVE_EFFECT_POISON goto BattleScript_MoveEnd BattleScript_EffectVenomDrench: @@ -2708,10 +2470,6 @@ BattleScript_VictoryDanceTrySpeed:: BattleScript_VictoryDanceEnd:: goto BattleScript_MoveEnd -BattleScript_EffectSpeedUpHit: - setmoveeffect MOVE_EFFECT_SPD_PLUS_1 | MOVE_EFFECT_AFFECTS_USER - goto BattleScript_EffectHit - BattleScript_EffectMeFirst: attackcanceler attackstring @@ -3286,16 +3044,10 @@ 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 jumpifability BS_TARGET, ABILITY_GUARD_DOG, BattleScript_MoveEnd - seteffectwithchance tryfaintmon BS_TARGET moveendto MOVEEND_ATTACKER_VISIBLE moveendfrom MOVEEND_TARGET_VISIBLE @@ -3314,10 +3066,6 @@ BattleScript_EffectPlaceholder: printstring STRINGID_NOTDONEYET goto BattleScript_MoveEnd -BattleScript_EffectRound: - setmoveeffect MOVE_EFFECT_ROUND - goto BattleScript_EffectHit - BattleScript_EffectHit:: BattleScript_HitFromAtkCanceler:: attackcanceler @@ -3331,18 +3079,7 @@ BattleScript_HitFromCritCalc:: damagecalc adjustdamage BattleScript_HitFromAtkAnimation:: - attackanimation - waitanimation - effectivenesssound - hitanimation BS_TARGET - waitstate - healthbarupdate BS_TARGET - datahpupdate BS_TARGET - critmessage - waitmessage B_WAIT_TIME_LONG - resultmessage - waitmessage B_WAIT_TIME_LONG - seteffectwithchance + call BattleScript_Hit_RetFromAtkAnimation BattleScript_TryFaintMon:: tryfaintmon BS_TARGET BattleScript_MoveEnd:: @@ -3351,12 +3088,15 @@ BattleScript_MoveEnd:: BattleScript_EffectHit_Ret:: attackcanceler +BattleScript_EffectHit_RetFromAccCheck:: accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring ppreduce +BattleScript_EffectHit_RetFromCritCalc:: critcalc damagecalc adjustdamage +BattleScript_Hit_RetFromAtkAnimation:: attackanimation waitanimation effectivenesssound @@ -3368,7 +3108,7 @@ BattleScript_EffectHit_Ret:: waitmessage B_WAIT_TIME_LONG resultmessage waitmessage B_WAIT_TIME_LONG - seteffectwithchance + setadditionaleffects return BattleScript_EffectNaturalGift: @@ -3380,21 +3120,7 @@ BattleScript_EffectNaturalGift: jumpifability BS_ATTACKER, ABILITY_KLUTZ, BattleScript_ButItFailed jumpifstatus3 BS_ATTACKER, STATUS3_EMBARGO, BattleScript_ButItFailed accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE - critcalc - damagecalc - adjustdamage - attackanimation - waitanimation - effectivenesssound - hitanimation BS_TARGET - waitstate - healthbarupdate BS_TARGET - datahpupdate BS_TARGET - critmessage - waitmessage B_WAIT_TIME_LONG - resultmessage - waitmessage B_WAIT_TIME_LONG - seteffectwithchance + call BattleScript_EffectHit_RetFromCritCalc jumpifmovehadnoeffect BattleScript_EffectNaturalGiftEnd checkparentalbondcounter 2, BattleScript_EffectNaturalGiftEnd removeitem BS_ATTACKER @@ -3442,8 +3168,7 @@ BattleScript_EffectSleep:: jumpifsafeguard BattleScript_SafeguardProtected attackanimation waitanimation - setmoveeffect MOVE_EFFECT_SLEEP - seteffectprimary + seteffectprimary MOVE_EFFECT_SLEEP goto BattleScript_MoveEnd BattleScript_TerrainPreventsEnd2:: @@ -3556,11 +3281,6 @@ BattleScript_CantMakeAsleep:: orhalfword gMoveResultFlags, MOVE_RESULT_FAILED goto BattleScript_MoveEnd -BattleScript_EffectBarbBarrage: -BattleScript_EffectPoisonHit: - setmoveeffect MOVE_EFFECT_POISON - goto BattleScript_EffectHit - BattleScript_EffectAbsorb:: call BattleScript_EffectHit_Ret jumpifstatus3 BS_ATTACKER, STATUS3_HEAL_BLOCK, BattleScript_AbsorbHealBlock @@ -3586,27 +3306,6 @@ BattleScript_AbsorbHealBlock:: tryfaintmon BS_TARGET goto BattleScript_MoveEnd -BattleScript_EffectInfernalParade:: -BattleScript_EffectBurnHit:: - setmoveeffect MOVE_EFFECT_BURN - goto BattleScript_EffectHit - -BattleScript_EffectFrostbiteHit:: - setmoveeffect MOVE_EFFECT_FROSTBITE - goto BattleScript_EffectHit - -BattleScript_EffectSleepHit:: - setmoveeffect MOVE_EFFECT_SLEEP - goto BattleScript_EffectHit - -BattleScript_EffectFreezeHit:: - setmoveeffect MOVE_EFFECT_FREEZE - goto BattleScript_EffectHit - -BattleScript_EffectParalyzeHit:: - setmoveeffect MOVE_EFFECT_PARALYSIS - goto BattleScript_EffectHit - BattleScript_EffectExplosion_AnimDmgRet: jumpifbyte CMP_NO_COMMON_BITS, gMoveResultFlags, MOVE_RESULT_MISSED, BattleScript_ExplosionAnimRet call BattleScript_PreserveMissedBitDoMoveAnim @@ -3896,16 +3595,6 @@ BattleScript_EffectBide:: setbide goto BattleScript_MoveEnd -BattleScript_EffectRampage:: - attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - jumpifstatus2 BS_ATTACKER, STATUS2_MULTIPLETURNS, BattleScript_EffectRampage2 - ppreduce -BattleScript_EffectRampage2: - confuseifrepeatingattackends - goto BattleScript_HitFromCritCalc - BattleScript_EffectRoar:: attackcanceler attackstring @@ -3973,7 +3662,7 @@ BattleScript_MultiHitPrintStrings:: return BattleScript_MultiHitEnd:: - seteffectwithchance + setadditionaleffects tryfaintmon BS_TARGET moveendcase MOVEEND_SYNCHRONIZE_TARGET moveendfrom MOVEEND_STATUS_IMMUNITY_ABILITIES @@ -3990,17 +3679,6 @@ BattleScript_EffectConversion:: waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd -BattleScript_EffectFlinchHit:: - setmoveeffect MOVE_EFFECT_FLINCH - goto BattleScript_EffectHit - -BattleScript_EffectFlinchStatus: - setmoveeffect MOVE_EFFECT_FLINCH - call BattleScript_EffectHit_Ret - argumentstatuseffect - tryfaintmon BS_TARGET - goto BattleScript_MoveEnd - BattleScript_EffectRestoreHp:: attackcanceler attackstring @@ -4036,8 +3714,7 @@ BattleScript_EffectToxic:: jumpifsafeguard BattleScript_SafeguardProtected attackanimation waitanimation - setmoveeffect MOVE_EFFECT_TOXIC - seteffectprimary + seteffectprimary MOVE_EFFECT_TOXIC resultmessage waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd @@ -4056,10 +3733,6 @@ BattleScript_ImmunityProtected:: call BattleScript_PSNPrevention goto BattleScript_MoveEnd -BattleScript_EffectPayDay:: - setmoveeffect MOVE_EFFECT_PAYDAY - goto BattleScript_EffectHit - BattleScript_EffectAuroraVeil: attackcanceler attackstring @@ -4074,10 +3747,6 @@ BattleScript_EffectLightScreen:: setlightscreen goto BattleScript_PrintReflectLightScreenSafeguardString -BattleScript_EffectTriAttack:: - setmoveeffect MOVE_EFFECT_TRI_ATTACK - goto BattleScript_EffectHit - BattleScript_EffectRest:: attackcanceler attackstring @@ -4136,11 +3805,9 @@ BattleScript_KOFail:: BattleScript_TwoTurnMovesSecondTurn:: attackcanceler - setmoveeffect MOVE_EFFECT_CHARGING setbyte sB_ANIM_TURN, 1 - clearstatusfromeffect BS_ATTACKER + clearstatusfromeffect BS_ATTACKER, MOVE_EFFECT_CHARGING orword gHitMarker, HITMARKER_NO_PPDEDUCT - argumenttomoveeffect goto BattleScript_HitFromAccCheck BattleScriptFirstChargingTurn:: @@ -4156,8 +3823,7 @@ BattleScriptFirstChargingTurnAfterAttackString: attackanimation waitanimation orword gHitMarker, HITMARKER_CHARGING - setmoveeffect MOVE_EFFECT_CHARGING | MOVE_EFFECT_AFFECTS_USER - seteffectprimary + seteffectprimary MOVE_EFFECT_CHARGING | MOVE_EFFECT_AFFECTS_USER return BattleScript_EffectSuperFang:: @@ -4170,21 +3836,6 @@ BattleScript_EffectSuperFang:: damagetohalftargethp goto BattleScript_HitFromAtkAnimation -BattleScript_EffectDragonRage:: - attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce - typecalc - bichalfword gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE - setword gBattleMoveDamage, 40 - adjustdamage - goto BattleScript_HitFromAtkAnimation - -BattleScript_EffectTrap:: - setmoveeffect MOVE_EFFECT_WRAP - goto BattleScript_EffectHit - BattleScript_EffectRecoilIfMiss:: attackcanceler accuracycheck BattleScript_MoveMissedDoDamage, ACC_CURR_MOVE @@ -4266,8 +3917,7 @@ BattleScript_EffectConfuse: jumpifsafeguard BattleScript_SafeguardProtected attackanimation waitanimation - setmoveeffect MOVE_EFFECT_CONFUSION - seteffectprimary + seteffectprimary MOVE_EFFECT_CONFUSION resultmessage waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd @@ -4390,8 +4040,7 @@ BattleScript_EffectPoison:: jumpifsafeguard BattleScript_SafeguardProtected attackanimation waitanimation - setmoveeffect MOVE_EFFECT_POISON - seteffectprimary + seteffectprimary MOVE_EFFECT_POISON resultmessage waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd @@ -4420,8 +4069,7 @@ BattleScript_BattleScript_EffectParalyzeNoTypeCalc: bichalfword gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE attackanimation waitanimation - setmoveeffect MOVE_EFFECT_PARALYSIS - seteffectprimary + seteffectprimary MOVE_EFFECT_PARALYSIS resultmessage waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd @@ -4444,34 +4092,6 @@ BattleScript_LimberProtected:: call BattleScript_PRLZPrevention goto BattleScript_MoveEnd -BattleScript_EffectAttackDownHit:: - setmoveeffect MOVE_EFFECT_ATK_MINUS_1 - goto BattleScript_EffectHit - -BattleScript_EffectDefenseDownHit:: - setmoveeffect MOVE_EFFECT_DEF_MINUS_1 - goto BattleScript_EffectHit - -BattleScript_EffectSpeedDownHit:: - setmoveeffect MOVE_EFFECT_SPD_MINUS_1 - goto BattleScript_EffectHit - -BattleScript_EffectSpecialAttackDownHit:: - setmoveeffect MOVE_EFFECT_SP_ATK_MINUS_1 - goto BattleScript_EffectHit - -BattleScript_EffectSpecialDefenseDownHit:: - setmoveeffect MOVE_EFFECT_SP_DEF_MINUS_1 - goto BattleScript_EffectHit - -BattleScript_EffectSpecialDefenseDownHit2:: - setmoveeffect MOVE_EFFECT_SP_DEF_MINUS_2 - goto BattleScript_EffectHit - -BattleScript_EffectAccuracyDownHit:: - setmoveeffect MOVE_EFFECT_ACC_MINUS_1 - goto BattleScript_EffectHit - BattleScript_PowerHerbActivation: playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT printstring STRINGID_POWERHERB @@ -4514,9 +4134,8 @@ BattleScript_EffectGeomancy: call BattleScript_PowerHerbActivation BattleScript_GeomancySecondTurn: attackcanceler - setmoveeffect MOVE_EFFECT_CHARGING setbyte sB_ANIM_TURN, 1 - clearstatusfromeffect BS_ATTACKER + clearstatusfromeffect BS_ATTACKER, MOVE_EFFECT_CHARGING orword gHitMarker, HITMARKER_NO_PPDEDUCT attackstring jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_SPATK, MAX_STAT_STAGE, BattleScript_GeomancyDoMoveAnim @@ -4547,10 +4166,6 @@ BattleScript_GeomancyTrySpeed:: BattleScript_GeomancyEnd:: goto BattleScript_MoveEnd -BattleScript_EffectConfuseHit:: - setmoveeffect MOVE_EFFECT_CONFUSION - goto BattleScript_EffectHit - BattleScript_EffectSubstitute:: attackcanceler ppreduce @@ -4577,12 +4192,6 @@ BattleScript_AlreadyHasSubstitute:: waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd -BattleScript_EffectRecharge:: - attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - setmoveeffect MOVE_EFFECT_RECHARGE | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN - goto BattleScript_HitFromAtkString - BattleScript_MoveUsedMustRecharge:: printstring STRINGID_PKMNMUSTRECHARGE waitmessage B_WAIT_TIME_LONG @@ -4591,13 +4200,10 @@ BattleScript_MoveUsedMustRecharge:: BattleScript_EffectRage:: attackcanceler accuracycheck BattleScript_RageMiss, ACC_CURR_MOVE - setmoveeffect MOVE_EFFECT_RAGE - seteffectprimary - setmoveeffect 0 + seteffectprimary MOVE_EFFECT_RAGE goto BattleScript_HitFromAtkString BattleScript_RageMiss:: - setmoveeffect MOVE_EFFECT_RAGE - clearstatusfromeffect BS_ATTACKER + clearstatusfromeffect BS_ATTACKER, MOVE_EFFECT_RAGE goto BattleScript_PrintMoveMissed BattleScript_EffectMimic:: @@ -4662,8 +4268,7 @@ BattleScript_EffectCelebrate: waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd BattleScript_EffectHappyHour: - setmoveeffect MOVE_EFFECT_HAPPY_HOUR - seteffectprimary + seteffectprimary MOVE_EFFECT_HAPPY_HOUR goto BattleScript_MoveEnd BattleScript_EffectDisable:: @@ -4759,7 +4364,6 @@ BattleScript_DoSnore:: attackstring ppreduce accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE - setmoveeffect MOVE_EFFECT_FLINCH goto BattleScript_HitFromCritCalc BattleScript_EffectConversion2:: @@ -4905,17 +4509,6 @@ BS_TripleAxel: addbyte sTRIPLE_KICK_POWER, 20 @ triple axel gets +20 power goto BattleScript_HitFromAtkString -BattleScript_EffectThief:: - setmoveeffect MOVE_EFFECT_STEAL_ITEM - goto BattleScript_EffectHit - -BattleScript_EffectHitPreventEscape: - attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - setmoveeffect MOVE_EFFECT_PREVENT_ESCAPE - seteffectprimary - goto BattleScript_HitFromAtkString - BattleScript_EffectMeanLook:: attackcanceler attackstring @@ -4928,8 +4521,7 @@ BattleScript_EffectMeanLook:: .endif attackanimation waitanimation - setmoveeffect MOVE_EFFECT_PREVENT_ESCAPE - seteffectprimary + seteffectprimary MOVE_EFFECT_PREVENT_ESCAPE printstring STRINGID_TARGETCANTESCAPENOW waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd @@ -4946,8 +4538,7 @@ BattleScript_EffectNightmare:: BattleScript_NightmareWorked:: attackanimation waitanimation - setmoveeffect MOVE_EFFECT_NIGHTMARE - seteffectprimary + seteffectprimary MOVE_EFFECT_NIGHTMARE printstring STRINGID_PKMNFELLINTONIGHTMARE waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd @@ -5122,8 +4713,7 @@ BattleScript_EffectSwagger:: BattleScript_SwaggerTryConfuse: jumpifability BS_TARGET, ABILITY_OWN_TEMPO, BattleScript_OwnTempoPrevents jumpifsafeguard BattleScript_SafeguardProtected - setmoveeffect MOVE_EFFECT_CONFUSION - seteffectprimary + seteffectprimary MOVE_EFFECT_CONFUSION goto BattleScript_MoveEnd BattleScript_EffectFuryCutter: @@ -5229,36 +4819,14 @@ BattleScript_EffectBatonPass:: switchineffects BS_ATTACKER goto BattleScript_MoveEnd -BattleScript_EffectRapidSpin:: -.if B_SPEED_BUFFING_RAPID_SPIN >= GEN_8 - call BattleScript_EffectHit_Ret - jumpifhalfword CMP_COMMON_BITS, gMoveResultFlags, MOVE_RESULT_DOESNT_AFFECT_FOE, BattleScript_MoveEnd - setmoveeffect MOVE_EFFECT_RAPIDSPIN | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN - seteffectwithchance - setstatchanger STAT_SPEED, 1, FALSE - statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_CHANGE_ALLOW_PTR, BattleScript_EffectRapidSpinEnd - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_EffectRapidSpinEnd - setgraphicalstatchangevalues - playanimation BS_ATTACKER, B_ANIM_STATS_CHANGE, sB_ANIM_ARG1 - printfromtable gStatUpStringIds - waitmessage B_WAIT_TIME_LONG -BattleScript_EffectRapidSpinEnd:: - tryfaintmon BS_TARGET - moveendall - end -.else - setmoveeffect MOVE_EFFECT_RAPIDSPIN | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN - goto BattleScript_EffectHit -.endif - -BattleScript_EffectSonicboom:: +BattleScript_EffectFixedDamageArg:: attackcanceler accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring ppreduce typecalc bichalfword gMoveResultFlags, MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE - setword gBattleMoveDamage, 20 + setargtobattledamage adjustdamage goto BattleScript_HitFromAtkAnimation @@ -5366,22 +4934,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 @@ -5439,11 +4991,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 @@ -5470,19 +5017,10 @@ BattleScript_SolarBeamDecideTurn:: goto BattleScript_TwoTurnMovesSecondTurn BattleScript_SolarBeamOnFirstTurn:: orword gHitMarker, HITMARKER_CHARGING - setmoveeffect MOVE_EFFECT_CHARGING | MOVE_EFFECT_AFFECTS_USER - seteffectprimary + seteffectprimary MOVE_EFFECT_CHARGING | MOVE_EFFECT_AFFECTS_USER ppreduce goto BattleScript_TwoTurnMovesSecondTurn -BattleScript_EffectThunder: - setmoveeffect MOVE_EFFECT_PARALYSIS - goto BattleScript_EffectHit - -BattleScript_EffectHurricane: - setmoveeffect MOVE_EFFECT_CONFUSION - goto BattleScript_EffectHit - BattleScript_EffectTeleport: .if B_TELEPORT_BEHAVIOR >= GEN_7 jumpifbattletype BATTLE_TYPE_TRAINER, BattleScript_EffectBatonPass @@ -5575,11 +5113,9 @@ BattleScript_FirstTurnSemiInvulnerable:: call BattleScript_PowerHerbActivation BattleScript_SecondTurnSemiInvulnerable:: attackcanceler - setmoveeffect MOVE_EFFECT_CHARGING setbyte sB_ANIM_TURN, 1 - clearstatusfromeffect BS_ATTACKER + clearstatusfromeffect BS_ATTACKER, MOVE_EFFECT_CHARGING orword gHitMarker, HITMARKER_NO_PPDEDUCT - argumenttomoveeffect BattleScript_SemiInvulnerableTryHit:: accuracycheck BattleScript_SemiInvulnerableMiss, ACC_CURR_MOVE clearsemiinvulnerablebit @@ -5626,7 +5162,6 @@ BattleScript_AlreadyAtFullHp:: BattleScript_EffectFakeOut:: attackcanceler jumpifnotfirstturn BattleScript_FailedFromAtkString - setmoveeffect MOVE_EFFECT_FLINCH goto BattleScript_EffectHit BattleScript_FailedFromAtkCanceler:: @@ -5660,7 +5195,6 @@ BattleScript_NotAffectedAbilityPopUp:: BattleScript_EffectUproar:: attackcanceler accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - setmoveeffect MOVE_EFFECT_UPROAR | MOVE_EFFECT_AFFECTS_USER attackstring jumpifstatus2 BS_ATTACKER, STATUS2_MULTIPLETURNS, BattleScript_UproarHit ppreduce @@ -5798,8 +5332,7 @@ BattleScript_EffectFlatter:: BattleScript_FlatterTryConfuse:: jumpifability BS_TARGET, ABILITY_OWN_TEMPO, BattleScript_OwnTempoPrevents jumpifsafeguard BattleScript_SafeguardProtected - setmoveeffect MOVE_EFFECT_CONFUSION - seteffectprimary + seteffectprimary MOVE_EFFECT_CONFUSION goto BattleScript_MoveEnd BattleScript_EffectWillOWisp:: @@ -5822,8 +5355,7 @@ BattleScript_EffectWillOWisp:: jumpifsafeguard BattleScript_SafeguardProtected attackanimation waitanimation - setmoveeffect MOVE_EFFECT_BURN - seteffectprimary + seteffectprimary MOVE_EFFECT_BURN goto BattleScript_MoveEnd BattleScript_WaterVeilPrevents:: @@ -5896,13 +5428,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 @@ -6039,14 +5564,6 @@ BattleScript_EffectIngrain: waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd -BattleScript_EffectSuperpower: - setmoveeffect MOVE_EFFECT_ATK_DEF_DOWN | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN - goto BattleScript_EffectHit - -BattleScript_EffectCloseCombat: - setmoveeffect MOVE_EFFECT_DEF_SPDEF_DOWN | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN - goto BattleScript_EffectHit - BattleScript_EffectMagicCoat: attackcanceler trysetmagiccoat BattleScript_FailedFromAtkString @@ -6097,7 +5614,7 @@ BattleScript_BrickBreakDoHit:: waitmessage B_WAIT_TIME_LONG resultmessage waitmessage B_WAIT_TIME_LONG - seteffectwithchance + setadditionaleffects tryfaintmon BS_TARGET goto BattleScript_MoveEnd @@ -6132,10 +5649,6 @@ BattleScript_PrintAbilityMadeIneffective:: waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd -BattleScript_EffectKnockOff:: - setmoveeffect MOVE_EFFECT_KNOCK_OFF - goto BattleScript_EffectHit - BattleScript_EffectEndeavor:: attackcanceler attackstring @@ -6218,12 +5731,7 @@ BattleScript_EffectSnatch: waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd -BattleScript_EffectSecretPower:: - getsecretpowereffect - goto BattleScript_EffectHit - 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 @@ -6235,7 +5743,6 @@ BattleScript_EffectTeeterDance:: setbyte gBattlerTarget, 0 BattleScript_TeeterDanceLoop:: movevaluescleanup - setmoveeffect MOVE_EFFECT_CONFUSION jumpifbyteequal gBattlerAttacker, gBattlerTarget, BattleScript_TeeterDanceLoopIncrement jumpifability BS_TARGET, ABILITY_OWN_TEMPO, BattleScript_TeeterDanceOwnTempoPrevents jumpifsubstituteblocks BattleScript_TeeterDanceSubstitutePrevents @@ -6245,7 +5752,7 @@ BattleScript_TeeterDanceLoop:: jumpifsafeguard BattleScript_TeeterDanceSafeguardProtected attackanimation waitanimation - seteffectprimary + seteffectprimary MOVE_EFFECT_CONFUSION resultmessage waitmessage B_WAIT_TIME_LONG BattleScript_TeeterDanceDoMoveEndIncrement:: @@ -6297,18 +5804,6 @@ BattleScript_EffectWaterSport:: waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd -BattleScript_EffectPoisonFang:: - setmoveeffect MOVE_EFFECT_TOXIC - goto BattleScript_EffectHit - -BattleScript_EffectOverheat:: - setmoveeffect MOVE_EFFECT_SP_ATK_TWO_DOWN | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN - goto BattleScript_EffectHit - -BattleScript_EffectHammerArm:: - setmoveeffect MOVE_EFFECT_SPD_MINUS_1 | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN - goto BattleScript_EffectHit - BattleScript_EffectTickle:: attackcanceler attackstring @@ -7081,8 +6576,7 @@ BattleScript_BideStoringEnergy:: BattleScript_BideAttack:: attackcanceler - setmoveeffect MOVE_EFFECT_CHARGING - clearstatusfromeffect BS_ATTACKER + clearstatusfromeffect BS_ATTACKER, MOVE_EFFECT_CHARGING printstring STRINGID_PKMNUNLEASHEDENERGY waitmessage B_WAIT_TIME_LONG accuracycheck BattleScript_MoveMissed, ACC_CURR_MOVE @@ -7105,8 +6599,7 @@ BattleScript_BideAttack:: BattleScript_BideNoEnergyToAttack:: attackcanceler - setmoveeffect MOVE_EFFECT_CHARGING - clearstatusfromeffect BS_ATTACKER + clearstatusfromeffect BS_ATTACKER, MOVE_EFFECT_CHARGING printstring STRINGID_PKMNUNLEASHEDENERGY waitmessage B_WAIT_TIME_LONG goto BattleScript_ButItFailed @@ -7368,8 +6861,7 @@ BattleScript_GulpMissileNoDmgGorging: playanimation BS_TARGET, B_ANIM_FORM_CHANGE waitanimation swapattackerwithtarget - setmoveeffect MOVE_EFFECT_PARALYSIS - seteffectprimary + seteffectprimary MOVE_EFFECT_PARALYSIS swapattackerwithtarget return BattleScript_GulpMissileNoSecondEffectGorging: @@ -8521,8 +8013,6 @@ BattleScript_MoveEffectConfusion:: waitmessage B_WAIT_TIME_LONG return -BattleScript_MoveEffectRecoilWithStatus:: - argumentstatuseffect BattleScript_MoveEffectRecoil:: jumpifmove MOVE_STRUGGLE, BattleScript_DoRecoil jumpifability BS_ATTACKER, ABILITY_ROCK_HEAD, BattleScript_RecoilEnd @@ -8536,10 +8026,6 @@ BattleScript_DoRecoil:: BattleScript_RecoilEnd:: return -BattleScript_EffectWithChance:: - seteffectwithchance - return - BattleScript_ItemSteal:: playanimation BS_TARGET, B_ANIM_ITEM_STEAL printstring STRINGID_PKMNSTOLEITEM @@ -9486,7 +8972,6 @@ BattleScript_KingsShieldEffect:: orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE bichalfword gMoveResultFlags, MOVE_RESULT_NO_EFFECT seteffectsecondary - setmoveeffect 0 copybyte sBATTLER, gBattlerTarget copybyte gBattlerTarget, gBattlerAttacker copybyte gBattlerAttacker, sBATTLER @@ -9497,7 +8982,6 @@ BattleScript_BanefulBunkerEffect:: orword gHitMarker, HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_STATUS_ABILITY_EFFECT | HITMARKER_PASSIVE_DAMAGE bichalfword gMoveResultFlags, MOVE_RESULT_NO_EFFECT seteffectsecondary - setmoveeffect 0 orhalfword gMoveResultFlags, MOVE_RESULT_MISSED return @@ -9605,8 +9089,7 @@ BattleScript_TruantLoafingAround:: BattleScript_IgnoresAndFallsAsleep:: printstring STRINGID_PKMNBEGANTONAP waitmessage B_WAIT_TIME_LONG - setmoveeffect MOVE_EFFECT_SLEEP | MOVE_EFFECT_AFFECTS_USER - seteffectprimary + seteffectprimary MOVE_EFFECT_SLEEP | MOVE_EFFECT_AFFECTS_USER moveendto MOVEEND_NEXT_TARGET end @@ -9903,8 +9386,7 @@ BattleScript_BerryConfuseHealEnd2_Anim: datahpupdate BS_SCRIPTING printstring STRINGID_FORXCOMMAYZ waitmessage B_WAIT_TIME_LONG - setmoveeffect MOVE_EFFECT_CONFUSION | MOVE_EFFECT_AFFECTS_USER - seteffectprimary + seteffectprimary MOVE_EFFECT_CONFUSION | MOVE_EFFECT_AFFECTS_USER removeitem BS_SCRIPTING end2 @@ -9922,8 +9404,7 @@ BattleScript_BerryConfuseHealRet_Anim: datahpupdate BS_SCRIPTING printstring STRINGID_FORXCOMMAYZ waitmessage B_WAIT_TIME_LONG - setmoveeffect MOVE_EFFECT_CONFUSION | MOVE_EFFECT_CERTAIN - seteffectprimary + seteffectprimary MOVE_EFFECT_CONFUSION | MOVE_EFFECT_CERTAIN removeitem BS_TARGET return @@ -10874,8 +10355,7 @@ BattleScript_BerserkGeneRet_Anim: BattleScript_BerserkGeneRet_TryConfuse: jumpifability BS_SCRIPTING, ABILITY_OWN_TEMPO, BattleScript_BerserkGeneRet_OwnTempoPrevents jumpifsafeguard BattleScript_BerserkGeneRet_SafeguardProtected - setmoveeffect MOVE_EFFECT_CONFUSION - seteffectprimary + seteffectprimary MOVE_EFFECT_CONFUSION goto BattleScript_BerserkGeneRet_End BattleScript_BerserkGeneRet_SafeguardProtected:: pause B_WAIT_TIME_SHORT diff --git a/include/battle.h b/include/battle.h index fba81a802a..4a3070e010 100644 --- a/include/battle.h +++ b/include/battle.h @@ -600,6 +600,7 @@ struct BattleStruct u32 expValue; u8 expGettersOrder[PARTY_SIZE]; // First battlers which were sent out, then via exp-share u8 expGetterMonId; + u8 additionalEffectsCounter:2; u8 expOrderId:3; u8 expGetterBattlerId:2; u8 teamGotExpMsgPrinted:1; // The 'Rest of your team got msg' has been printed. @@ -780,9 +781,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 7207f3b652..0c3b71d7ca 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -63,7 +63,6 @@ bool32 AI_IsAbilityOnSide(u32 battlerId, u32 ability); bool32 AI_MoveMakesContact(u32 ability, u32 holdEffect, u32 move); u32 AI_GetBattlerMoveTargetType(u32 battlerId, u32 move); bool32 ShouldUseZMove(u32 battlerAtk, u32 battlerDef, u32 chosenMove); -u32 AI_CalcSecondaryEffectChance(u32 battler, u32 secondaryEffectChance); // stat stage checks bool32 AnyStatIsRaised(u32 battlerId); @@ -101,6 +100,9 @@ bool32 HasOnlyMovesWithCategory(u32 battlerId, u32 category, bool32 onlyOffensiv bool32 HasMoveWithCategory(u32 battler, u32 category); bool32 HasMoveWithType(u32 battler, u32 type); bool32 HasMoveEffect(u32 battlerId, u32 moveEffect); +bool32 HasMoveEffectANDArg(u32 battlerId, u32 effect, u32 argument); +bool32 HasMoveWithMoveEffect(u32 battlerId, u32 moveEffect); +bool32 HasMoveWithMoveEffectExcept(u32 battlerId, u32 moveEffect, u32 exception); bool32 HasMoveWithLowAccuracy(u32 battlerAtk, u32 battlerDef, u32 accCheck, bool32 ignoreStatus, u32 atkAbility, u32 defAbility, u32 atkHoldEffect, u32 defHoldEffect); bool32 IsAromaVeilProtectedMove(u32 move); bool32 IsNonVolatileStatusMoveEffect(u32 moveEffect); @@ -119,7 +121,7 @@ bool32 ShouldSetSun(u32 battlerAtk, u32 atkAbility, u32 holdEffect); bool32 HasSleepMoveWithLowAccuracy(u32 battlerAtk, u32 battlerDef); bool32 IsHealingMove(u32 move); 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); @@ -188,5 +190,9 @@ void IncreaseConfusionScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score void IncreaseFrostbiteScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score); s32 AI_CalcPartyMonDamage(u32 move, u32 battlerAtk, u32 battlerDef, struct BattlePokemon switchinCandidate, bool8 isPartyMonAttacker); +s32 AI_CheckMoveEffects(u32 battlerAtk, u32 battlerDef, u32 move, s32 score, struct AiLogicData *aiData, u32 predictedMove, bool32 isDoubleBattle); +s32 AI_TryToClearStats(u32 battlerAtk, u32 battlerDef, bool32 isDoubleBattle); +bool32 AI_ShouldCopyStatChanges(u32 battlerAtk, u32 battlerDef); +s32 AI_ShouldSetUpHazards(u32 battlerAtk, u32 battlerDef, struct AiLogicData *aiData); #endif //GUARD_BATTLE_AI_UTIL_H diff --git a/include/battle_script_commands.h b/include/battle_script_commands.h index a4e8a166ed..259b136d64 100644 --- a/include/battle_script_commands.h +++ b/include/battle_script_commands.h @@ -29,7 +29,7 @@ u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, u32 atkAbility, u u8 GetBattlerTurnOrderNum(u8 battlerId); bool32 NoAliveMonsForPlayer(void); bool32 NoAliveMonsForEitherParty(void); -void SetMoveEffect(bool32 primary, u32 certain); +void SetMoveEffect(bool32 primary, bool32 certain); bool32 CanBattlerSwitch(u32 battlerId); void BattleDestroyYesNoCursorAt(u8 cursorPosition); void BattleCreateYesNoCursorAt(u8 cursorPosition); @@ -48,7 +48,6 @@ u32 IsAbilityStatusProtected(u32 battler); bool32 TryResetBattlerStatChanges(u8 battler); bool32 CanCamouflage(u8 battlerId); u16 GetNaturePowerMove(void); -u16 GetSecretPowerMoveEffect(void); void StealTargetItem(u8 battlerStealer, u8 battlerItem); u8 GetCatchingBattler(void); u32 GetHighestStatId(u32 battlerId); diff --git a/include/battle_scripts.h b/include/battle_scripts.h index db9db4fb82..c1da89443b 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -303,8 +303,6 @@ extern const u8 BattleScript_StickyWebDefog[]; extern const u8 BattleScript_StealthRockDefog[]; extern const u8 BattleScript_MegaEvolution[]; extern const u8 BattleScript_WishMegaEvolution[]; -extern const u8 BattleScript_MoveEffectRecoilWithStatus[]; -extern const u8 BattleScript_EffectWithChance[]; extern const u8 BattleScript_MoveEffectClearSmog[]; extern const u8 BattleScript_SideStatusWoreOffReturn[]; extern const u8 BattleScript_MoveEffectSmackDown[]; @@ -444,9 +442,9 @@ extern const u8 BattleScript_AffectionBasedStatusHeal[]; extern const u8 BattleScript_AffectionBasedEndurance[]; extern const u8 BattleScript_SymbiosisActivates[]; extern const u8 BattleScript_MultiHitPrintStrings[]; -extern const u8 BattleScript_BurnUpRemoveType[]; +extern const u8 BattleScript_RemoveFireType[]; extern const u8 BattleScript_TargetAbilityStatRaiseRet[]; -extern const u8 BattleScript_DoubleShockRemoveType[]; +extern const u8 BattleScript_RemoveElectricType[]; extern const u8 BattleScript_SeedSowerActivates[]; extern const u8 BattleScript_AngerShellActivates[]; extern const u8 BattleScript_WellBakedBodyActivates[]; @@ -525,6 +523,7 @@ extern const u8 BattleScript_EffectRaiseCritAlliesAnim[]; extern const u8 BattleScript_EffectHealOneSixthAllies[]; extern const u8 BattleScript_EffectCureStatusAllies[]; extern const u8 BattleScript_EffectRecycleBerriesAllies[]; +extern const u8 BattleScript_RemoveGenericType[]; // dynamax and max raids extern const u8 BattleScript_DynamaxBegins[]; diff --git a/include/battle_util.h b/include/battle_util.h index 575d18edf8..e9b0c6f472 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -221,6 +221,10 @@ void CopyMonAbilityAndTypesToBattleMon(u32 battler, struct Pokemon *mon); void RecalcBattlerStats(u32 battler, struct Pokemon *mon); bool32 IsAlly(u32 battlerAtk, u32 battlerDef); bool32 IsGen6ExpShareEnabled(void); +bool32 MoveHasMoveEffect(u32 move, u32 moveEffect); +bool32 MoveHasMoveEffectWithChance(u32 move, u32 moveEffect, u32 chance); +bool32 MoveHasMoveEffectSelf(u32 move, u32 moveEffect); +bool32 MoveHasMoveEffectSelfArg(u32 move, u32 moveEffect, u32 argument); bool32 CanSleep(u32 battler); bool32 CanBePoisoned(u32 battlerAttacker, u32 battlerTarget); @@ -238,9 +242,11 @@ void RemoveConfusionStatus(u32 battler); u8 GetBattlerGender(u32 battler); bool32 AreBattlersOfOppositeGender(u32 battler1, u32 battler2); bool32 AreBattlersOfSameGender(u32 battler1, u32 battler2); -u32 CalcSecondaryEffectChance(u32 battler, u8 secondaryEffectChance, u16 moveEffect); +u32 CalcSecondaryEffectChance(u32 battler, u32 battlerAbility, const struct AdditionalEffect *additionalEffect); +bool32 MoveEffectIsGuaranteed(u32 battler, u32 battlerAbility, const struct AdditionalEffect *additionalEffect); u8 GetBattlerType(u32 battler, u8 typeIndex); bool8 CanMonParticipateInSkyBattle(struct Pokemon *mon); bool8 IsMonBannedFromSkyBattles(u16 species); +void RemoveBattlerType(u32 battler, u8 type); #endif // GUARD_BATTLE_UTIL_H diff --git a/include/config/battle.h b/include/config/battle.h index b25060dcce..9e74108839 100644 --- a/include/config/battle.h +++ b/include/config/battle.h @@ -197,7 +197,7 @@ #define B_THUNDERSTORM_TERRAIN TRUE // If TRUE, overworld Thunderstorm generates Rain and Electric Terrain as in Gen 8. #define B_FOG_TERRAIN TRUE // If TRUE, overworld Fog generates Misty Terrain as in Gen 8. #define B_TERRAIN_TYPE_BOOST GEN_LATEST // In Gen8, damage is boosted by 30% instead of 50%. -#define B_SECRET_POWER_EFFECT GEN_LATEST // Secret Power's effects change depending on terrain and generation. See GetSecretPowerMoveEffect. +#define B_SECRET_POWER_EFFECT GEN_LATEST // Secret Power's effects change depending on terrain and generation. See MOVE_EFFECT_SECRET_POWER's case in `SetMoveEffect`. #define B_SECRET_POWER_ANIMATION GEN_LATEST // Secret Power's animations change depending on terrain and generation. #define B_NATURE_POWER_MOVES GEN_LATEST // Nature Power calls different moves depending on terrain and generation. See sNaturePowerMoves. #define B_CAMOUFLAGE_TYPES GEN_LATEST // Camouflage changes the user to different types depending on terrain and generation. See sTerrainToType. diff --git a/include/constants/battle.h b/include/constants/battle.h index 92688026f8..5c999f7eab 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -324,6 +324,7 @@ #define MOVE_EFFECT_TOXIC 6 #define MOVE_EFFECT_FROSTBITE 7 #define PRIMARY_STATUS_MOVE_EFFECT MOVE_EFFECT_FROSTBITE // All above move effects apply primary status +#define MOVE_EFFECT_FREEZE_OR_FROSTBITE (B_USE_FROSTBITE == TRUE ? MOVE_EFFECT_FROSTBITE : MOVE_EFFECT_FREEZE) #define MOVE_EFFECT_CONFUSION 8 #define MOVE_EFFECT_FLINCH 9 #define MOVE_EFFECT_TRI_ATTACK 10 @@ -345,7 +346,7 @@ #define MOVE_EFFECT_SP_DEF_MINUS_1 26 #define MOVE_EFFECT_ACC_MINUS_1 27 #define MOVE_EFFECT_EVS_MINUS_1 28 -#define MOVE_EFFECT_BURN_UP 29 +#define MOVE_EFFECT_REMOVE_ARG_TYPE 29 #define MOVE_EFFECT_RECHARGE 30 #define MOVE_EFFECT_RAGE 31 #define MOVE_EFFECT_STEAL_ITEM 32 @@ -387,20 +388,20 @@ #define MOVE_EFFECT_BUG_BITE 68 #define MOVE_EFFECT_RECOIL_HP_25 69 #define MOVE_EFFECT_TRAP_BOTH 70 -#define MOVE_EFFECT_DOUBLE_SHOCK 71 -#define MOVE_EFFECT_ROUND 72 -#define MOVE_EFFECT_STOCKPILE_WORE_OFF 73 -#define MOVE_EFFECT_DIRE_CLAW 74 -#define MOVE_EFFECT_STEALTH_ROCK 75 -#define MOVE_EFFECT_SPIKES 76 -#define MOVE_EFFECT_TRIPLE_ARROWS 77 -#define MOVE_EFFECT_SYRUP_BOMB 78 -#define MOVE_EFFECT_FLORAL_HEALING 79 +#define MOVE_EFFECT_ROUND 71 +#define MOVE_EFFECT_STOCKPILE_WORE_OFF 72 +#define MOVE_EFFECT_DIRE_CLAW 73 +#define MOVE_EFFECT_STEALTH_ROCK 74 +#define MOVE_EFFECT_SPIKES 75 +#define MOVE_EFFECT_SYRUP_BOMB 76 +#define MOVE_EFFECT_FLORAL_HEALING 77 +#define MOVE_EFFECT_SECRET_POWER 78 -#define NUM_MOVE_EFFECTS 80 +#define NUM_MOVE_EFFECTS 79 -#define MOVE_EFFECT_AFFECTS_USER 0x4000 -#define MOVE_EFFECT_CERTAIN 0x8000 +#define MOVE_EFFECT_AFFECTS_USER 0x2000 +#define MOVE_EFFECT_CERTAIN 0x4000 +#define MOVE_EFFECT_CONTINUE 0x8000 // Battle terrain defines for gBattleTerrain. #define BATTLE_TERRAIN_GRASS 0 diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index b1662469e7..41c8b37470 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -3,424 +3,352 @@ #define EFFECT_HIT 0 #define EFFECT_SLEEP 1 -#define EFFECT_POISON_HIT 2 -#define EFFECT_ABSORB 3 -#define EFFECT_BURN_HIT 4 -#define EFFECT_FREEZE_HIT 5 -#define EFFECT_PARALYZE_HIT 6 -#define EFFECT_EXPLOSION 7 -#define EFFECT_DREAM_EATER 8 -#define EFFECT_MIRROR_MOVE 9 -#define EFFECT_ATTACK_UP 10 -#define EFFECT_DEFENSE_UP 11 -#define EFFECT_SPEED_UP 12 -#define EFFECT_SPECIAL_ATTACK_UP 13 -#define EFFECT_SPECIAL_DEFENSE_UP 14 -#define EFFECT_ACCURACY_UP 15 -#define EFFECT_EVASION_UP 16 -#define EFFECT_SPECIAL_ATTACK_UP_3 17 -#define EFFECT_ATTACK_DOWN 18 -#define EFFECT_DEFENSE_DOWN 19 -#define EFFECT_SPEED_DOWN 20 -#define EFFECT_SPECIAL_ATTACK_DOWN 21 -#define EFFECT_SPECIAL_DEFENSE_DOWN 22 -#define EFFECT_ACCURACY_DOWN 23 -#define EFFECT_EVASION_DOWN 24 -#define EFFECT_HAZE 25 -#define EFFECT_BIDE 26 -#define EFFECT_RAMPAGE 27 -#define EFFECT_ROAR 28 -#define EFFECT_MULTI_HIT 29 -#define EFFECT_CONVERSION 30 -#define EFFECT_FLINCH_HIT 31 -#define EFFECT_RESTORE_HP 32 -#define EFFECT_TOXIC 33 -#define EFFECT_PAY_DAY 34 -#define EFFECT_LIGHT_SCREEN 35 -#define EFFECT_TRI_ATTACK 36 -#define EFFECT_REST 37 -#define EFFECT_OHKO 38 -#define EFFECT_FUSION_COMBO 39 -#define EFFECT_SUPER_FANG 40 -#define EFFECT_DRAGON_RAGE 41 -#define EFFECT_TRAP 42 -#define EFFECT_HEAL_BLOCK 43 -#define EFFECT_RECOIL_IF_MISS 44 -#define EFFECT_MIST 45 -#define EFFECT_FOCUS_ENERGY 46 -#define EFFECT_RECOIL 47 -#define EFFECT_CONFUSE 48 -#define EFFECT_ATTACK_UP_2 49 -#define EFFECT_DEFENSE_UP_2 50 -#define EFFECT_SPEED_UP_2 51 -#define EFFECT_SPECIAL_ATTACK_UP_2 52 -#define EFFECT_SPECIAL_DEFENSE_UP_2 53 -#define EFFECT_ACCURACY_UP_2 54 -#define EFFECT_EVASION_UP_2 55 -#define EFFECT_TRANSFORM 56 -#define EFFECT_ATTACK_DOWN_2 57 -#define EFFECT_DEFENSE_DOWN_2 58 -#define EFFECT_SPEED_DOWN_2 59 -#define EFFECT_SPECIAL_ATTACK_DOWN_2 60 -#define EFFECT_SPECIAL_DEFENSE_DOWN_2 61 -#define EFFECT_ACCURACY_DOWN_2 62 -#define EFFECT_EVASION_DOWN_2 63 -#define EFFECT_REFLECT 64 -#define EFFECT_POISON 65 -#define EFFECT_PARALYZE 66 -#define EFFECT_ATTACK_DOWN_HIT 67 -#define EFFECT_DEFENSE_DOWN_HIT 68 -#define EFFECT_SPEED_DOWN_HIT 69 -#define EFFECT_SPECIAL_ATTACK_DOWN_HIT 70 -#define EFFECT_SPECIAL_DEFENSE_DOWN_HIT 71 -#define EFFECT_ACCURACY_DOWN_HIT 72 -#define EFFECT_EVASION_DOWN_HIT 73 -#define EFFECT_TWO_TURNS_ATTACK 74 -#define EFFECT_CONFUSE_HIT 75 -#define EFFECT_VITAL_THROW 76 -#define EFFECT_SUBSTITUTE 77 -#define EFFECT_RECHARGE 78 -#define EFFECT_RAGE 79 -#define EFFECT_MIMIC 80 -#define EFFECT_METRONOME 81 -#define EFFECT_LEECH_SEED 82 -#define EFFECT_DO_NOTHING 83 -#define EFFECT_DISABLE 84 -#define EFFECT_LEVEL_DAMAGE 85 -#define EFFECT_PSYWAVE 86 -#define EFFECT_COUNTER 87 -#define EFFECT_ENCORE 88 -#define EFFECT_PAIN_SPLIT 89 -#define EFFECT_SNORE 90 -#define EFFECT_CONVERSION_2 91 -#define EFFECT_LOCK_ON 92 -#define EFFECT_SKETCH 93 -#define EFFECT_HAMMER_ARM 94 -#define EFFECT_SLEEP_TALK 95 -#define EFFECT_DESTINY_BOND 96 -#define EFFECT_FLAIL 97 -#define EFFECT_SPITE 98 -#define EFFECT_FALSE_SWIPE 99 -#define EFFECT_HEAL_BELL 100 -#define EFFECT_TRIPLE_KICK 101 -#define EFFECT_THIEF 102 -#define EFFECT_MEAN_LOOK 103 -#define EFFECT_NIGHTMARE 104 -#define EFFECT_MINIMIZE 105 -#define EFFECT_CURSE 106 -#define EFFECT_HEALING_WISH 107 -#define EFFECT_PROTECT 108 -#define EFFECT_SPIKES 109 -#define EFFECT_FORESIGHT 110 -#define EFFECT_PERISH_SONG 111 -#define EFFECT_SANDSTORM 112 -#define EFFECT_ENDURE 113 -#define EFFECT_ROLLOUT 114 -#define EFFECT_SWAGGER 115 -#define EFFECT_FURY_CUTTER 116 -#define EFFECT_ATTRACT 117 -#define EFFECT_RETURN 118 -#define EFFECT_PRESENT 119 -#define EFFECT_FRUSTRATION 120 -#define EFFECT_SAFEGUARD 121 -#define EFFECT_MAGNITUDE 122 -#define EFFECT_BATON_PASS 123 -#define EFFECT_PURSUIT 124 -#define EFFECT_RAPID_SPIN 125 -#define EFFECT_SONICBOOM 126 -#define EFFECT_CAPTIVATE 127 -#define EFFECT_MORNING_SUN 128 -#define EFFECT_SYNTHESIS 129 -#define EFFECT_MOONLIGHT 130 -#define EFFECT_HIDDEN_POWER 131 -#define EFFECT_RAIN_DANCE 132 -#define EFFECT_SUNNY_DAY 133 -#define EFFECT_DEFENSE_UP_HIT 134 -#define EFFECT_ATTACK_UP_HIT 135 -#define EFFECT_ALL_STATS_UP_HIT 136 -#define EFFECT_FELL_STINGER 137 -#define EFFECT_BELLY_DRUM 138 -#define EFFECT_PSYCH_UP 139 -#define EFFECT_MIRROR_COAT 140 -#define EFFECT_SKULL_BASH 141 -#define EFFECT_EARTHQUAKE 142 -#define EFFECT_FUTURE_SIGHT 143 -#define EFFECT_GUST 144 -#define EFFECT_SOLAR_BEAM 145 -#define EFFECT_THUNDER 146 -#define EFFECT_TELEPORT 147 -#define EFFECT_BEAT_UP 148 -#define EFFECT_SEMI_INVULNERABLE 149 -#define EFFECT_DEFENSE_CURL 150 -#define EFFECT_SOFTBOILED 151 -#define EFFECT_FAKE_OUT 152 -#define EFFECT_UPROAR 153 -#define EFFECT_STOCKPILE 154 -#define EFFECT_SPIT_UP 155 -#define EFFECT_SWALLOW 156 -#define EFFECT_WORRY_SEED 157 -#define EFFECT_HAIL 158 -#define EFFECT_TORMENT 159 -#define EFFECT_FLATTER 160 -#define EFFECT_WILL_O_WISP 161 -#define EFFECT_MEMENTO 162 -#define EFFECT_FACADE 163 -#define EFFECT_FOCUS_PUNCH 164 -#define EFFECT_SMELLING_SALTS 165 -#define EFFECT_FOLLOW_ME 166 -#define EFFECT_NATURE_POWER 167 -#define EFFECT_CHARGE 168 -#define EFFECT_TAUNT 169 -#define EFFECT_HELPING_HAND 170 -#define EFFECT_TRICK 171 -#define EFFECT_ROLE_PLAY 172 -#define EFFECT_WISH 173 -#define EFFECT_ASSIST 174 -#define EFFECT_INGRAIN 175 -#define EFFECT_SUPERPOWER 176 -#define EFFECT_MAGIC_COAT 177 -#define EFFECT_RECYCLE 178 -#define EFFECT_REVENGE 179 -#define EFFECT_BRICK_BREAK 180 -#define EFFECT_YAWN 181 -#define EFFECT_KNOCK_OFF 182 -#define EFFECT_ENDEAVOR 183 -#define EFFECT_ERUPTION 184 -#define EFFECT_SKILL_SWAP 185 -#define EFFECT_IMPRISON 186 -#define EFFECT_REFRESH 187 -#define EFFECT_GRUDGE 188 -#define EFFECT_SNATCH 189 -#define EFFECT_LOW_KICK 190 -#define EFFECT_SECRET_POWER 191 -#define EFFECT_TEETER_DANCE 192 -#define EFFECT_HIT_ESCAPE 193 -#define EFFECT_MUD_SPORT 194 -#define EFFECT_POISON_FANG 195 -#define EFFECT_WEATHER_BALL 196 -#define EFFECT_OVERHEAT 197 -#define EFFECT_TICKLE 198 -#define EFFECT_COSMIC_POWER 199 -#define EFFECT_SKY_UPPERCUT 200 -#define EFFECT_BULK_UP 201 -#define EFFECT_PLACEHOLDER 202 -#define EFFECT_WATER_SPORT 203 -#define EFFECT_CALM_MIND 204 -#define EFFECT_DRAGON_DANCE 205 -#define EFFECT_CAMOUFLAGE 206 +#define EFFECT_ABSORB 2 +#define EFFECT_EXPLOSION 3 +#define EFFECT_DREAM_EATER 4 +#define EFFECT_MIRROR_MOVE 5 +#define EFFECT_ATTACK_UP 6 +#define EFFECT_DEFENSE_UP 7 +#define EFFECT_SPEED_UP 8 +#define EFFECT_SPECIAL_ATTACK_UP 9 +#define EFFECT_SPECIAL_DEFENSE_UP 10 +#define EFFECT_ACCURACY_UP 11 +#define EFFECT_EVASION_UP 12 +#define EFFECT_SPECIAL_ATTACK_UP_3 13 +#define EFFECT_ATTACK_DOWN 14 +#define EFFECT_DEFENSE_DOWN 15 +#define EFFECT_SPEED_DOWN 16 +#define EFFECT_SPECIAL_ATTACK_DOWN 17 +#define EFFECT_SPECIAL_DEFENSE_DOWN 18 +#define EFFECT_ACCURACY_DOWN 19 +#define EFFECT_EVASION_DOWN 20 +#define EFFECT_HAZE 21 +#define EFFECT_BIDE 22 +#define EFFECT_ROAR 23 +#define EFFECT_MULTI_HIT 24 +#define EFFECT_CONVERSION 25 +#define EFFECT_RESTORE_HP 26 +#define EFFECT_TOXIC 27 +#define EFFECT_LIGHT_SCREEN 28 +#define EFFECT_REST 29 +#define EFFECT_OHKO 30 +#define EFFECT_FUSION_COMBO 31 +#define EFFECT_SUPER_FANG 32 +#define EFFECT_FIXED_DAMAGE_ARG 33 +#define EFFECT_HEAL_BLOCK 34 +#define EFFECT_RECOIL_IF_MISS 35 +#define EFFECT_MIST 36 +#define EFFECT_FOCUS_ENERGY 37 +#define EFFECT_CONFUSE 38 +#define EFFECT_ATTACK_UP_2 39 +#define EFFECT_DEFENSE_UP_2 40 +#define EFFECT_SPEED_UP_2 41 +#define EFFECT_SPECIAL_ATTACK_UP_2 42 +#define EFFECT_SPECIAL_DEFENSE_UP_2 43 +#define EFFECT_ACCURACY_UP_2 44 +#define EFFECT_EVASION_UP_2 45 +#define EFFECT_TRANSFORM 46 +#define EFFECT_ATTACK_DOWN_2 47 +#define EFFECT_DEFENSE_DOWN_2 48 +#define EFFECT_SPEED_DOWN_2 49 +#define EFFECT_SPECIAL_ATTACK_DOWN_2 50 +#define EFFECT_SPECIAL_DEFENSE_DOWN_2 51 +#define EFFECT_ACCURACY_DOWN_2 52 +#define EFFECT_EVASION_DOWN_2 53 +#define EFFECT_REFLECT 54 +#define EFFECT_POISON 55 +#define EFFECT_PARALYZE 56 +#define EFFECT_TWO_TURNS_ATTACK 57 +#define EFFECT_SUBSTITUTE 58 +#define EFFECT_RAGE 59 +#define EFFECT_MIMIC 60 +#define EFFECT_METRONOME 61 +#define EFFECT_LEECH_SEED 62 +#define EFFECT_DO_NOTHING 63 +#define EFFECT_DISABLE 64 +#define EFFECT_LEVEL_DAMAGE 65 +#define EFFECT_PSYWAVE 66 +#define EFFECT_COUNTER 67 +#define EFFECT_ENCORE 68 +#define EFFECT_PAIN_SPLIT 69 +#define EFFECT_SNORE 70 +#define EFFECT_CONVERSION_2 71 +#define EFFECT_LOCK_ON 72 +#define EFFECT_SKETCH 73 +#define EFFECT_SLEEP_TALK 74 +#define EFFECT_DESTINY_BOND 75 +#define EFFECT_FLAIL 76 +#define EFFECT_SPITE 77 +#define EFFECT_FALSE_SWIPE 78 +#define EFFECT_HEAL_BELL 79 +#define EFFECT_TRIPLE_KICK 80 +#define EFFECT_MEAN_LOOK 81 +#define EFFECT_NIGHTMARE 82 +#define EFFECT_MINIMIZE 83 +#define EFFECT_CURSE 84 +#define EFFECT_HEALING_WISH 85 +#define EFFECT_PROTECT 86 +#define EFFECT_SPIKES 87 +#define EFFECT_FORESIGHT 88 +#define EFFECT_PERISH_SONG 89 +#define EFFECT_SANDSTORM 90 +#define EFFECT_ENDURE 91 +#define EFFECT_ROLLOUT 92 +#define EFFECT_SWAGGER 93 +#define EFFECT_FURY_CUTTER 94 +#define EFFECT_ATTRACT 95 +#define EFFECT_RETURN 96 +#define EFFECT_PRESENT 97 +#define EFFECT_FRUSTRATION 98 +#define EFFECT_SAFEGUARD 99 +#define EFFECT_MAGNITUDE 100 +#define EFFECT_BATON_PASS 101 +#define EFFECT_PURSUIT 102 +#define EFFECT_CAPTIVATE 103 +#define EFFECT_MORNING_SUN 104 +#define EFFECT_SYNTHESIS 105 +#define EFFECT_MOONLIGHT 106 +#define EFFECT_HIDDEN_POWER 107 +#define EFFECT_RAIN_DANCE 108 +#define EFFECT_SUNNY_DAY 109 +#define EFFECT_FELL_STINGER 110 +#define EFFECT_BELLY_DRUM 111 +#define EFFECT_PSYCH_UP 112 +#define EFFECT_MIRROR_COAT 113 +#define EFFECT_SKULL_BASH 114 +#define EFFECT_EARTHQUAKE 115 +#define EFFECT_FUTURE_SIGHT 116 +#define EFFECT_GUST 117 +#define EFFECT_SOLAR_BEAM 118 +#define EFFECT_THUNDER 119 +#define EFFECT_TELEPORT 120 +#define EFFECT_BEAT_UP 121 +#define EFFECT_SEMI_INVULNERABLE 122 +#define EFFECT_DEFENSE_CURL 123 +#define EFFECT_SOFTBOILED 124 +#define EFFECT_FAKE_OUT 125 +#define EFFECT_UPROAR 126 +#define EFFECT_STOCKPILE 127 +#define EFFECT_SPIT_UP 128 +#define EFFECT_SWALLOW 129 +#define EFFECT_WORRY_SEED 130 +#define EFFECT_HAIL 131 +#define EFFECT_TORMENT 132 +#define EFFECT_FLATTER 133 +#define EFFECT_WILL_O_WISP 134 +#define EFFECT_MEMENTO 135 +#define EFFECT_FACADE 136 +#define EFFECT_FOCUS_PUNCH 137 +#define EFFECT_DOUBLE_POWER_ON_ARG_STATUS 138 +#define EFFECT_FOLLOW_ME 139 +#define EFFECT_NATURE_POWER 140 +#define EFFECT_CHARGE 141 +#define EFFECT_TAUNT 142 +#define EFFECT_HELPING_HAND 143 +#define EFFECT_TRICK 144 +#define EFFECT_ROLE_PLAY 145 +#define EFFECT_WISH 146 +#define EFFECT_ASSIST 147 +#define EFFECT_INGRAIN 148 +#define EFFECT_MAGIC_COAT 149 +#define EFFECT_RECYCLE 150 +#define EFFECT_REVENGE 151 +#define EFFECT_BRICK_BREAK 152 +#define EFFECT_YAWN 153 +#define EFFECT_KNOCK_OFF 154 +#define EFFECT_ENDEAVOR 155 +#define EFFECT_ERUPTION 156 +#define EFFECT_SKILL_SWAP 157 +#define EFFECT_IMPRISON 158 +#define EFFECT_REFRESH 159 +#define EFFECT_GRUDGE 160 +#define EFFECT_SNATCH 161 +#define EFFECT_LOW_KICK 162 +#define EFFECT_TEETER_DANCE 163 +#define EFFECT_HIT_ESCAPE 164 +#define EFFECT_MUD_SPORT 165 +#define EFFECT_WEATHER_BALL 166 +#define EFFECT_TICKLE 167 +#define EFFECT_COSMIC_POWER 168 +#define EFFECT_SKY_UPPERCUT 169 +#define EFFECT_BULK_UP 170 +#define EFFECT_PLACEHOLDER 171 +#define EFFECT_WATER_SPORT 172 +#define EFFECT_CALM_MIND 173 +#define EFFECT_DRAGON_DANCE 174 +#define EFFECT_CAMOUFLAGE 175 +#define EFFECT_PLEDGE 176 +#define EFFECT_FLING 177 +#define EFFECT_NATURAL_GIFT 178 +#define EFFECT_WRING_OUT 179 +#define EFFECT_ASSURANCE 180 +#define EFFECT_TRUMP_CARD 181 +#define EFFECT_ACROBATICS 182 +#define EFFECT_HEAT_CRASH 183 +#define EFFECT_PUNISHMENT 184 +#define EFFECT_STORED_POWER 185 +#define EFFECT_ELECTRO_BALL 186 +#define EFFECT_GYRO_BALL 187 +#define EFFECT_ECHOED_VOICE 188 +#define EFFECT_PAYBACK 189 +#define EFFECT_ROUND 190 +#define EFFECT_BRINE 191 +#define EFFECT_RETALIATE 192 +#define EFFECT_BULLDOZE 193 +#define EFFECT_FOUL_PLAY 194 +#define EFFECT_PSYSHOCK 195 +#define EFFECT_ROOST 196 +#define EFFECT_GRAVITY 197 +#define EFFECT_MIRACLE_EYE 198 +#define EFFECT_TAILWIND 199 +#define EFFECT_EMBARGO 200 +#define EFFECT_AQUA_RING 201 +#define EFFECT_TRICK_ROOM 202 +#define EFFECT_WONDER_ROOM 203 +#define EFFECT_MAGIC_ROOM 204 +#define EFFECT_MAGNET_RISE 205 +#define EFFECT_TOXIC_SPIKES 206 +#define EFFECT_GASTRO_ACID 207 +#define EFFECT_STEALTH_ROCK 208 +#define EFFECT_TELEKINESIS 209 +#define EFFECT_POWER_SWAP 210 +#define EFFECT_GUARD_SWAP 211 +#define EFFECT_HEART_SWAP 212 +#define EFFECT_POWER_SPLIT 213 +#define EFFECT_GUARD_SPLIT 214 +#define EFFECT_STICKY_WEB 215 +#define EFFECT_METAL_BURST 216 +#define EFFECT_LUCKY_CHANT 217 +#define EFFECT_SUCKER_PUNCH 218 +#define EFFECT_SIMPLE_BEAM 219 +#define EFFECT_ENTRAINMENT 220 +#define EFFECT_HEAL_PULSE 221 +#define EFFECT_QUASH 222 +#define EFFECT_ION_DELUGE 223 +#define EFFECT_FREEZE_DRY 224 +#define EFFECT_TOPSY_TURVY 225 +#define EFFECT_MISTY_TERRAIN 226 +#define EFFECT_GRASSY_TERRAIN 227 +#define EFFECT_ELECTRIC_TERRAIN 228 +#define EFFECT_PSYCHIC_TERRAIN 229 +#define EFFECT_ATTACK_ACCURACY_UP 230 +#define EFFECT_ATTACK_SPATK_UP 231 +#define EFFECT_HURRICANE 232 +#define EFFECT_TWO_TYPED_MOVE 233 +#define EFFECT_ME_FIRST 234 +#define EFFECT_QUIVER_DANCE 235 +#define EFFECT_COIL 236 +#define EFFECT_ELECTRIFY 237 +#define EFFECT_REFLECT_TYPE 238 +#define EFFECT_SOAK 239 +#define EFFECT_GROWTH 240 +#define EFFECT_LAST_RESORT 241 +#define EFFECT_SHELL_SMASH 242 +#define EFFECT_SHIFT_GEAR 243 +#define EFFECT_DEFENSE_UP_3 244 +#define EFFECT_NOBLE_ROAR 245 +#define EFFECT_VENOM_DRENCH 246 +#define EFFECT_TOXIC_THREAD 247 +#define EFFECT_HIT_SWITCH_TARGET 248 +#define EFFECT_FINAL_GAMBIT 249 +#define EFFECT_CHANGE_TYPE_ON_ITEM 250 +#define EFFECT_AUTOTOMIZE 251 +#define EFFECT_COPYCAT 252 +#define EFFECT_DEFOG 253 +#define EFFECT_HIT_ENEMY_HEAL_ALLY 254 +#define EFFECT_SYNCHRONOISE 255 +#define EFFECT_PSYCHO_SHIFT 256 +#define EFFECT_POWER_TRICK 257 +#define EFFECT_AFTER_YOU 258 +#define EFFECT_BESTOW 259 +#define EFFECT_ROTOTILLER 260 +#define EFFECT_FLOWER_SHIELD 261 +#define EFFECT_SPEED_SWAP 262 +#define EFFECT_REVELATION_DANCE 263 +#define EFFECT_AURORA_VEIL 264 +#define EFFECT_THIRD_TYPE 265 +#define EFFECT_ACUPRESSURE 266 +#define EFFECT_AROMATIC_MIST 267 +#define EFFECT_POWDER 268 +#define EFFECT_BELCH 269 +#define EFFECT_PARTING_SHOT 270 +#define EFFECT_MAT_BLOCK 271 +#define EFFECT_STOMPING_TANTRUM 272 +#define EFFECT_INSTRUCT 273 +#define EFFECT_LASER_FOCUS 274 +#define EFFECT_MAGNETIC_FLUX 275 +#define EFFECT_GEAR_UP 276 +#define EFFECT_STRENGTH_SAP 277 +#define EFFECT_MIND_BLOWN 278 +#define EFFECT_PURIFY 279 +#define EFFECT_FAIL_IF_NOT_ARG_TYPE 280 +#define EFFECT_SHORE_UP 281 +#define EFFECT_GEOMANCY 282 +#define EFFECT_FAIRY_LOCK 283 +#define EFFECT_ALLY_SWITCH 284 +#define EFFECT_RELIC_SONG 285 +#define EFFECT_BODY_PRESS 286 +#define EFFECT_EERIE_SPELL 287 +#define EFFECT_JUNGLE_HEALING 288 +#define EFFECT_COACHING 289 +#define EFFECT_LASH_OUT 290 +#define EFFECT_GRASSY_GLIDE 291 +#define EFFECT_DYNAMAX_DOUBLE_DMG 292 +#define EFFECT_DECORATE 293 +#define EFFECT_SNIPE_SHOT 294 +#define EFFECT_RECOIL_HP_25 295 +#define EFFECT_STUFF_CHEEKS 296 +#define EFFECT_GRAV_APPLE 297 +#define EFFECT_GLITZY_GLOW 298 +#define EFFECT_BADDY_BAD 299 +#define EFFECT_SAPPY_SEED 300 +#define EFFECT_FREEZY_FROST 301 +#define EFFECT_SPARKLY_SWIRL 302 +#define EFFECT_PLASMA_FISTS 303 +#define EFFECT_HYPERSPACE_FURY 304 +#define EFFECT_AURA_WHEEL 305 +#define EFFECT_PHOTON_GEYSER 306 +#define EFFECT_SHELL_SIDE_ARM 307 +#define EFFECT_TERRAIN_PULSE 308 +#define EFFECT_NO_RETREAT 309 +#define EFFECT_TAR_SHOT 310 +#define EFFECT_POLTERGEIST 311 +#define EFFECT_OCTOLOCK 312 +#define EFFECT_CLANGOROUS_SOUL 313 +#define EFFECT_BOLT_BEAK 314 +#define EFFECT_SKY_DROP 315 +#define EFFECT_EXPANDING_FORCE 316 +#define EFFECT_METEOR_BEAM 317 +#define EFFECT_RISING_VOLTAGE 318 +#define EFFECT_BEAK_BLAST 319 +#define EFFECT_COURT_CHANGE 320 +#define EFFECT_STEEL_BEAM 321 +#define EFFECT_EXTREME_EVOBOOST 322 +#define EFFECT_HIT_SET_REMOVE_TERRAIN 323 +#define EFFECT_DARK_VOID 324 +#define EFFECT_VICTORY_DANCE 325 +#define EFFECT_TEATIME 326 +#define EFFECT_ATTACK_UP_USER_ALLY 327 +#define EFFECT_SHELL_TRAP 328 +#define EFFECT_PSYBLADE 329 +#define EFFECT_HYDRO_STEAM 330 +#define EFFECT_REVIVAL_BLESSING 331 +#define EFFECT_SNOWSCAPE 332 +#define EFFECT_TAKE_HEART 333 +#define EFFECT_COLLISION_COURSE 334 +#define EFFECT_CORROSIVE_GAS 335 +#define EFFECT_POPULATION_BOMB 336 +#define EFFECT_SALT_CURE 337 +#define EFFECT_CHILLY_RECEPTION 338 +#define EFFECT_MAX_MOVE 339 +#define EFFECT_GLAIVE_RUSH 340 +#define EFFECT_RAGING_BULL 341 +#define EFFECT_RAGE_FIST 342 +#define EFFECT_DOODLE 343 +#define EFFECT_FILLET_AWAY 344 +#define EFFECT_IVY_CUDGEL 345 +#define EFFECT_FICKLE_BEAM 346 -// New move effects -#define EFFECT_PLEDGE 207 -#define EFFECT_FLING 208 -#define EFFECT_NATURAL_GIFT 209 -#define EFFECT_WAKE_UP_SLAP 210 -#define EFFECT_WRING_OUT 211 -#define EFFECT_HEX 212 -#define EFFECT_ASSURANCE 213 -#define EFFECT_TRUMP_CARD 214 -#define EFFECT_ACROBATICS 215 -#define EFFECT_HEAT_CRASH 216 -#define EFFECT_PUNISHMENT 217 -#define EFFECT_STORED_POWER 218 -#define EFFECT_ELECTRO_BALL 219 -#define EFFECT_GYRO_BALL 220 -#define EFFECT_ECHOED_VOICE 221 -#define EFFECT_PAYBACK 222 -#define EFFECT_ROUND 223 -#define EFFECT_BRINE 224 -#define EFFECT_VENOSHOCK 225 -#define EFFECT_RETALIATE 226 -#define EFFECT_BULLDOZE 227 -#define EFFECT_FOUL_PLAY 228 -#define EFFECT_PSYSHOCK 229 -#define EFFECT_ROOST 230 -#define EFFECT_GRAVITY 231 -#define EFFECT_MIRACLE_EYE 232 -#define EFFECT_TAILWIND 233 -#define EFFECT_EMBARGO 234 -#define EFFECT_AQUA_RING 235 -#define EFFECT_TRICK_ROOM 236 -#define EFFECT_WONDER_ROOM 237 -#define EFFECT_MAGIC_ROOM 238 -#define EFFECT_MAGNET_RISE 239 -#define EFFECT_TOXIC_SPIKES 240 -#define EFFECT_GASTRO_ACID 241 -#define EFFECT_STEALTH_ROCK 242 -#define EFFECT_TELEKINESIS 243 -#define EFFECT_POWER_SWAP 244 -#define EFFECT_GUARD_SWAP 245 -#define EFFECT_HEART_SWAP 246 -#define EFFECT_POWER_SPLIT 247 -#define EFFECT_GUARD_SPLIT 248 -#define EFFECT_STICKY_WEB 249 -#define EFFECT_METAL_BURST 250 -#define EFFECT_LUCKY_CHANT 251 -#define EFFECT_SUCKER_PUNCH 252 -#define EFFECT_SPECIAL_DEFENSE_DOWN_HIT_2 253 -#define EFFECT_SIMPLE_BEAM 254 -#define EFFECT_ENTRAINMENT 255 -#define EFFECT_HEAL_PULSE 256 -#define EFFECT_QUASH 257 -#define EFFECT_ION_DELUGE 258 -#define EFFECT_FREEZE_DRY 259 -#define EFFECT_TOPSY_TURVY 260 -#define EFFECT_MISTY_TERRAIN 261 -#define EFFECT_GRASSY_TERRAIN 262 -#define EFFECT_ELECTRIC_TERRAIN 263 -#define EFFECT_PSYCHIC_TERRAIN 264 -#define EFFECT_ATTACK_ACCURACY_UP 265 -#define EFFECT_ATTACK_SPATK_UP 266 -#define EFFECT_HURRICANE 267 -#define EFFECT_TWO_TYPED_MOVE 268 -#define EFFECT_ME_FIRST 269 -#define EFFECT_SPEED_UP_HIT 270 -#define EFFECT_QUIVER_DANCE 271 -#define EFFECT_COIL 272 -#define EFFECT_ELECTRIFY 273 -#define EFFECT_REFLECT_TYPE 274 -#define EFFECT_SOAK 275 -#define EFFECT_GROWTH 276 -#define EFFECT_CLOSE_COMBAT 277 -#define EFFECT_LAST_RESORT 278 -#define EFFECT_FLINCH_STATUS 279 -#define EFFECT_SHELL_SMASH 280 -#define EFFECT_SHIFT_GEAR 281 -#define EFFECT_DEFENSE_UP_3 282 -#define EFFECT_NOBLE_ROAR 283 -#define EFFECT_VENOM_DRENCH 284 -#define EFFECT_TOXIC_THREAD 285 -#define EFFECT_CLEAR_SMOG 286 -#define EFFECT_HIT_SWITCH_TARGET 287 -#define EFFECT_FINAL_GAMBIT 288 -#define EFFECT_CHANGE_TYPE_ON_ITEM 289 -#define EFFECT_AUTOTOMIZE 290 -#define EFFECT_COPYCAT 291 -#define EFFECT_DEFOG 292 -#define EFFECT_HIT_ENEMY_HEAL_ALLY 293 -#define EFFECT_SMACK_DOWN 294 -#define EFFECT_SYNCHRONOISE 295 -#define EFFECT_PSYCHO_SHIFT 296 -#define EFFECT_POWER_TRICK 297 -#define EFFECT_FLAME_BURST 298 -#define EFFECT_AFTER_YOU 299 -#define EFFECT_BESTOW 300 -#define EFFECT_ROTOTILLER 301 -#define EFFECT_FLOWER_SHIELD 302 -#define EFFECT_HIT_PREVENT_ESCAPE 303 -#define EFFECT_SPEED_SWAP 304 -#define EFFECT_DEFENSE_UP2_HIT 305 -#define EFFECT_REVELATION_DANCE 306 -#define EFFECT_AURORA_VEIL 307 -#define EFFECT_THIRD_TYPE 308 -#define EFFECT_FEINT 309 -#define EFFECT_SPARKLING_ARIA 310 -#define EFFECT_ACUPRESSURE 311 -#define EFFECT_AROMATIC_MIST 312 -#define EFFECT_POWDER 313 -#define EFFECT_SP_ATTACK_UP_HIT 314 -#define EFFECT_BELCH 315 -#define EFFECT_PARTING_SHOT 316 -#define EFFECT_SPECTRAL_THIEF 317 -#define EFFECT_V_CREATE 318 -#define EFFECT_MAT_BLOCK 319 -#define EFFECT_STOMPING_TANTRUM 320 -#define EFFECT_CORE_ENFORCER 321 -#define EFFECT_INSTRUCT 322 -#define EFFECT_THROAT_CHOP 323 -#define EFFECT_LASER_FOCUS 324 -#define EFFECT_MAGNETIC_FLUX 325 -#define EFFECT_GEAR_UP 326 -#define EFFECT_INCINERATE 327 -#define EFFECT_BUG_BITE 328 -#define EFFECT_STRENGTH_SAP 329 -#define EFFECT_MIND_BLOWN 330 -#define EFFECT_PURIFY 331 -#define EFFECT_BURN_UP 332 -#define EFFECT_SHORE_UP 333 -#define EFFECT_GEOMANCY 334 -#define EFFECT_FAIRY_LOCK 335 -#define EFFECT_ALLY_SWITCH 336 -#define EFFECT_RELIC_SONG 337 -#define EFFECT_ATTACKER_DEFENSE_DOWN_HIT 338 -#define EFFECT_BODY_PRESS 339 -#define EFFECT_EERIE_SPELL 340 -#define EFFECT_JUNGLE_HEALING 341 -#define EFFECT_COACHING 342 -#define EFFECT_LASH_OUT 343 -#define EFFECT_GRASSY_GLIDE 344 -#define EFFECT_DYNAMAX_DOUBLE_DMG 345 -#define EFFECT_DECORATE 346 -#define EFFECT_SNIPE_SHOT 347 -#define EFFECT_RECOIL_HP_25 348 -#define EFFECT_STUFF_CHEEKS 349 -#define EFFECT_GRAV_APPLE 350 -#define EFFECT_EVASION_UP_HIT 351 -#define EFFECT_GLITZY_GLOW 352 -#define EFFECT_BADDY_BAD 353 -#define EFFECT_SAPPY_SEED 354 -#define EFFECT_FREEZY_FROST 355 -#define EFFECT_SPARKLY_SWIRL 356 -#define EFFECT_PLASMA_FISTS 357 -#define EFFECT_HYPERSPACE_FURY 358 -#define EFFECT_AURA_WHEEL 359 -#define EFFECT_PHOTON_GEYSER 360 -#define EFFECT_SHELL_SIDE_ARM 361 -#define EFFECT_TERRAIN_PULSE 362 -#define EFFECT_JAW_LOCK 363 -#define EFFECT_NO_RETREAT 364 -#define EFFECT_TAR_SHOT 365 -#define EFFECT_POLTERGEIST 366 -#define EFFECT_OCTOLOCK 367 -#define EFFECT_CLANGOROUS_SOUL 368 -#define EFFECT_BOLT_BEAK 369 -#define EFFECT_SKY_DROP 370 -#define EFFECT_EXPANDING_FORCE 371 -#define EFFECT_METEOR_BEAM 372 -#define EFFECT_RISING_VOLTAGE 373 -#define EFFECT_BEAK_BLAST 374 -#define EFFECT_COURT_CHANGE 375 -#define EFFECT_STEEL_BEAM 376 -#define EFFECT_EXTREME_EVOBOOST 377 -#define EFFECT_HIT_SET_REMOVE_TERRAIN 378 -#define EFFECT_DARK_VOID 379 -#define EFFECT_SLEEP_HIT 380 -#define EFFECT_DOUBLE_SHOCK 381 -#define EFFECT_SPECIAL_ATTACK_UP_HIT 382 -#define EFFECT_VICTORY_DANCE 383 -#define EFFECT_TEATIME 384 -#define EFFECT_ATTACK_UP_USER_ALLY 385 -#define EFFECT_SHELL_TRAP 386 -#define EFFECT_PSYBLADE 387 -#define EFFECT_HYDRO_STEAM 388 -#define EFFECT_HIT_SET_ENTRY_HAZARD 389 -#define EFFECT_DIRE_CLAW 390 -#define EFFECT_BARB_BARRAGE 391 -#define EFFECT_REVIVAL_BLESSING 392 -#define EFFECT_FROSTBITE_HIT 393 -#define EFFECT_SNOWSCAPE 394 -#define EFFECT_TRIPLE_ARROWS 395 -#define EFFECT_INFERNAL_PARADE 396 -#define EFFECT_TAKE_HEART 397 -#define EFFECT_AXE_KICK 398 -#define EFFECT_COLLISION_COURSE 399 -#define EFFECT_SPIN_OUT 400 -#define EFFECT_MAKE_IT_RAIN 401 -#define EFFECT_CORROSIVE_GAS 402 -#define EFFECT_POPULATION_BOMB 403 -#define EFFECT_MORTAL_SPIN 404 -#define EFFECT_SALT_CURE 405 -#define EFFECT_CHILLY_RECEPTION 406 -#define EFFECT_MATCHA_GOTCHA 407 -#define EFFECT_SYRUP_BOMB 408 -#define EFFECT_MAX_MOVE 409 -#define EFFECT_GLAIVE_RUSH 410 -#define EFFECT_RAGING_BULL 411 -#define EFFECT_RAGE_FIST 412 -#define EFFECT_DOODLE 413 -#define EFFECT_FILLET_AWAY 414 -#define EFFECT_IVY_CUDGEL 415 -#define EFFECT_FICKLE_BEAM 416 - -#define NUM_BATTLE_MOVE_EFFECTS 417 +#define NUM_BATTLE_MOVE_EFFECTS 347 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 95632f09c7..11ef2090df 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -140,7 +140,7 @@ #define VARIOUS_TRY_SOAK 48 #define VARIOUS_HANDLE_MEGA_EVO 49 #define VARIOUS_TRY_LAST_RESORT 50 -#define VARIOUS_ARGUMENT_STATUS_EFFECT 51 +#define VARIOUS_SET_ARG_TO_BATTLE_DAMAGE 51 #define VARIOUS_TRY_HIT_SWITCH_TARGET 52 #define VARIOUS_TRY_AUTOTOMIZE 53 #define VARIOUS_ABILITY_POPUP 54 @@ -151,95 +151,94 @@ #define VARIOUS_POWER_TRICK 59 #define VARIOUS_AFTER_YOU 60 #define VARIOUS_BESTOW 61 -#define VARIOUS_ARGUMENT_TO_MOVE_EFFECT 62 -#define VARIOUS_JUMP_IF_NOT_GROUNDED 63 -#define VARIOUS_HANDLE_TRAINER_SLIDE_MSG 64 -#define VARIOUS_TRY_TRAINER_SLIDE_MSG_FIRST_OFF 65 -#define VARIOUS_TRY_TRAINER_SLIDE_MSG_LAST_ON 66 -#define VARIOUS_SET_AURORA_VEIL 67 -#define VARIOUS_TRY_THIRD_TYPE 68 -#define VARIOUS_ACUPRESSURE 69 -#define VARIOUS_SET_POWDER 70 -#define VARIOUS_SPECTRAL_THIEF 71 -#define VARIOUS_GRAVITY_ON_AIRBORNE_MONS 72 -#define VARIOUS_CHECK_IF_GRASSY_TERRAIN_HEALS 73 -#define VARIOUS_JUMP_IF_ROAR_FAILS 74 -#define VARIOUS_TRY_INSTRUCT 75 -#define VARIOUS_JUMP_IF_NOT_BERRY 76 -#define VARIOUS_TRACE_ABILITY 77 -#define VARIOUS_UPDATE_NICK 78 -#define VARIOUS_TRY_ILLUSION_OFF 79 -#define VARIOUS_SET_SPRITEIGNORE0HP 80 -#define VARIOUS_HANDLE_FORM_CHANGE 81 -#define VARIOUS_GET_STAT_VALUE 82 -#define VARIOUS_JUMP_IF_FULL_HP 83 -#define VARIOUS_LOSE_TYPE 84 -#define VARIOUS_TRY_ACTIVATE_SOULHEART 85 -#define VARIOUS_TRY_ACTIVATE_RECEIVER 86 -#define VARIOUS_TRY_ACTIVATE_BEAST_BOOST 87 -#define VARIOUS_TRY_FRISK 88 -#define VARIOUS_JUMP_IF_SHIELDS_DOWN_PROTECTED 89 -#define VARIOUS_TRY_FAIRY_LOCK 90 -#define VARIOUS_JUMP_IF_NO_ALLY 91 -#define VARIOUS_POISON_TYPE_IMMUNITY 92 -#define VARIOUS_JUMP_IF_NO_HOLD_EFFECT 93 -#define VARIOUS_INFATUATE_WITH_BATTLER 94 -#define VARIOUS_SET_LAST_USED_ITEM 95 -#define VARIOUS_PARALYZE_TYPE_IMMUNITY 96 -#define VARIOUS_JUMP_IF_ABSENT 97 -#define VARIOUS_DESTROY_ABILITY_POPUP 98 -#define VARIOUS_TOTEM_BOOST 99 -#define VARIOUS_TRY_ACTIVATE_GRIM_NEIGH 100 -#define VARIOUS_MOVEEND_ITEM_EFFECTS 101 -#define VARIOUS_TERRAIN_SEED 102 -#define VARIOUS_MAKE_INVISIBLE 103 -#define VARIOUS_ROOM_SERVICE 104 -#define VARIOUS_EERIE_SPELL_PP_REDUCE 105 -#define VARIOUS_JUMP_IF_TEAM_HEALTHY 106 -#define VARIOUS_TRY_HEAL_QUARTER_HP 107 -#define VARIOUS_REMOVE_TERRAIN 108 -#define VARIOUS_JUMP_IF_PRANKSTER_BLOCKED 109 -#define VARIOUS_TRY_TO_CLEAR_PRIMAL_WEATHER 110 -#define VARIOUS_GET_ROTOTILLER_TARGETS 111 -#define VARIOUS_JUMP_IF_NOT_ROTOTILLER_AFFECTED 112 -#define VARIOUS_TRY_ACTIVATE_BATTLE_BOND 113 -#define VARIOUS_CONSUME_BERRY 114 -#define VARIOUS_JUMP_IF_CANT_REVERT_TO_PRIMAL 115 -#define VARIOUS_JUMP_IF_SPECIES 116 -#define VARIOUS_UPDATE_ABILITY_POPUP 117 -#define VARIOUS_JUMP_IF_WEATHER_AFFECTED 118 -#define VARIOUS_JUMP_IF_LEAF_GUARD_PROTECTED 119 -#define VARIOUS_SET_ATTACKER_STICKY_WEB_USER 120 -#define VARIOUS_SHELL_SIDE_ARM_CHECK 121 -#define VARIOUS_TRY_NO_RETREAT 122 -#define VARIOUS_TRY_TAR_SHOT 123 -#define VARIOUS_CAN_TAR_SHOT_WORK 124 -#define VARIOUS_CHECK_POLTERGEIST 125 -#define VARIOUS_CUT_1_3_HP_RAISE_STATS 126 -#define VARIOUS_TRY_END_NEUTRALIZING_GAS 127 -#define VARIOUS_JUMP_IF_UNDER_200 128 -#define VARIOUS_SET_SKY_DROP 129 -#define VARIOUS_CLEAR_SKY_DROP 130 -#define VARIOUS_SKY_DROP_YAWN 131 -#define VARIOUS_JUMP_IF_HOLD_EFFECT 132 -#define VARIOUS_CURE_CERTAIN_STATUSES 133 -#define VARIOUS_TRY_RESET_NEGATIVE_STAT_STAGES 134 -#define VARIOUS_JUMP_IF_LAST_USED_ITEM_BERRY 135 -#define VARIOUS_JUMP_IF_LAST_USED_ITEM_HOLD_EFFECT 136 -#define VARIOUS_SAVE_BATTLER_ITEM 137 -#define VARIOUS_RESTORE_BATTLER_ITEM 138 -#define VARIOUS_BATTLER_ITEM_TO_LAST_USED_ITEM 139 -#define VARIOUS_SET_BEAK_BLAST 140 -#define VARIOUS_SWAP_SIDE_STATUSES 141 -#define VARIOUS_SWAP_STATS 142 -#define VARIOUS_TEATIME_INVUL 143 -#define VARIOUS_TEATIME_TARGETS 144 -#define VARIOUS_TRY_WIND_RIDER_POWER 145 -#define VARIOUS_ACTIVATE_WEATHER_CHANGE_ABILITIES 146 -#define VARIOUS_ACTIVATE_TERRAIN_CHANGE_ABILITIES 147 -#define VARIOUS_STORE_HEALING_WISH 148 -#define VARIOUS_HIT_SWITCH_TARGET_FAILED 149 -#define VARIOUS_TRY_REVIVAL_BLESSING 150 +#define VARIOUS_JUMP_IF_NOT_GROUNDED 62 +#define VARIOUS_HANDLE_TRAINER_SLIDE_MSG 63 +#define VARIOUS_TRY_TRAINER_SLIDE_MSG_FIRST_OFF 64 +#define VARIOUS_TRY_TRAINER_SLIDE_MSG_LAST_ON 65 +#define VARIOUS_SET_AURORA_VEIL 66 +#define VARIOUS_TRY_THIRD_TYPE 67 +#define VARIOUS_ACUPRESSURE 68 +#define VARIOUS_SET_POWDER 69 +#define VARIOUS_SPECTRAL_THIEF 70 +#define VARIOUS_GRAVITY_ON_AIRBORNE_MONS 71 +#define VARIOUS_CHECK_IF_GRASSY_TERRAIN_HEALS 72 +#define VARIOUS_JUMP_IF_ROAR_FAILS 73 +#define VARIOUS_TRY_INSTRUCT 74 +#define VARIOUS_JUMP_IF_NOT_BERRY 75 +#define VARIOUS_TRACE_ABILITY 76 +#define VARIOUS_UPDATE_NICK 77 +#define VARIOUS_TRY_ILLUSION_OFF 78 +#define VARIOUS_SET_SPRITEIGNORE0HP 79 +#define VARIOUS_HANDLE_FORM_CHANGE 80 +#define VARIOUS_GET_STAT_VALUE 81 +#define VARIOUS_JUMP_IF_FULL_HP 82 +#define VARIOUS_LOSE_TYPE 83 +#define VARIOUS_TRY_ACTIVATE_SOULHEART 84 +#define VARIOUS_TRY_ACTIVATE_RECEIVER 85 +#define VARIOUS_TRY_ACTIVATE_BEAST_BOOST 86 +#define VARIOUS_TRY_FRISK 87 +#define VARIOUS_JUMP_IF_SHIELDS_DOWN_PROTECTED 88 +#define VARIOUS_TRY_FAIRY_LOCK 89 +#define VARIOUS_JUMP_IF_NO_ALLY 90 +#define VARIOUS_POISON_TYPE_IMMUNITY 91 +#define VARIOUS_JUMP_IF_NO_HOLD_EFFECT 92 +#define VARIOUS_INFATUATE_WITH_BATTLER 93 +#define VARIOUS_SET_LAST_USED_ITEM 94 +#define VARIOUS_PARALYZE_TYPE_IMMUNITY 95 +#define VARIOUS_JUMP_IF_ABSENT 96 +#define VARIOUS_DESTROY_ABILITY_POPUP 97 +#define VARIOUS_TOTEM_BOOST 98 +#define VARIOUS_TRY_ACTIVATE_GRIM_NEIGH 99 +#define VARIOUS_MOVEEND_ITEM_EFFECTS 100 +#define VARIOUS_TERRAIN_SEED 101 +#define VARIOUS_MAKE_INVISIBLE 102 +#define VARIOUS_ROOM_SERVICE 103 +#define VARIOUS_EERIE_SPELL_PP_REDUCE 104 +#define VARIOUS_JUMP_IF_TEAM_HEALTHY 105 +#define VARIOUS_TRY_HEAL_QUARTER_HP 106 +#define VARIOUS_REMOVE_TERRAIN 107 +#define VARIOUS_JUMP_IF_PRANKSTER_BLOCKED 108 +#define VARIOUS_TRY_TO_CLEAR_PRIMAL_WEATHER 109 +#define VARIOUS_GET_ROTOTILLER_TARGETS 110 +#define VARIOUS_JUMP_IF_NOT_ROTOTILLER_AFFECTED 111 +#define VARIOUS_TRY_ACTIVATE_BATTLE_BOND 112 +#define VARIOUS_CONSUME_BERRY 113 +#define VARIOUS_JUMP_IF_CANT_REVERT_TO_PRIMAL 114 +#define VARIOUS_JUMP_IF_SPECIES 115 +#define VARIOUS_UPDATE_ABILITY_POPUP 116 +#define VARIOUS_JUMP_IF_WEATHER_AFFECTED 117 +#define VARIOUS_JUMP_IF_LEAF_GUARD_PROTECTED 118 +#define VARIOUS_SET_ATTACKER_STICKY_WEB_USER 119 +#define VARIOUS_SHELL_SIDE_ARM_CHECK 120 +#define VARIOUS_TRY_NO_RETREAT 121 +#define VARIOUS_TRY_TAR_SHOT 122 +#define VARIOUS_CAN_TAR_SHOT_WORK 123 +#define VARIOUS_CHECK_POLTERGEIST 124 +#define VARIOUS_CUT_1_3_HP_RAISE_STATS 125 +#define VARIOUS_TRY_END_NEUTRALIZING_GAS 126 +#define VARIOUS_JUMP_IF_UNDER_200 127 +#define VARIOUS_SET_SKY_DROP 128 +#define VARIOUS_CLEAR_SKY_DROP 129 +#define VARIOUS_SKY_DROP_YAWN 130 +#define VARIOUS_JUMP_IF_HOLD_EFFECT 131 +#define VARIOUS_CURE_CERTAIN_STATUSES 132 +#define VARIOUS_TRY_RESET_NEGATIVE_STAT_STAGES 133 +#define VARIOUS_JUMP_IF_LAST_USED_ITEM_BERRY 134 +#define VARIOUS_JUMP_IF_LAST_USED_ITEM_HOLD_EFFECT 135 +#define VARIOUS_SAVE_BATTLER_ITEM 136 +#define VARIOUS_RESTORE_BATTLER_ITEM 137 +#define VARIOUS_BATTLER_ITEM_TO_LAST_USED_ITEM 138 +#define VARIOUS_SET_BEAK_BLAST 139 +#define VARIOUS_SWAP_SIDE_STATUSES 140 +#define VARIOUS_SWAP_STATS 141 +#define VARIOUS_TEATIME_INVUL 142 +#define VARIOUS_TEATIME_TARGETS 143 +#define VARIOUS_TRY_WIND_RIDER_POWER 144 +#define VARIOUS_ACTIVATE_WEATHER_CHANGE_ABILITIES 145 +#define VARIOUS_ACTIVATE_TERRAIN_CHANGE_ABILITIES 146 +#define VARIOUS_STORE_HEALING_WISH 147 +#define VARIOUS_HIT_SWITCH_TARGET_FAILED 148 +#define VARIOUS_TRY_REVIVAL_BLESSING 149 // Cmd_manipulatedamage #define DMG_CHANGE_SIGN 0 diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index c4ca5dee43..de6117e822 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -698,8 +698,10 @@ #define STRINGID_PKMNTELLCHILLINGRECEPTIONJOKE 696 #define STRINGID_HOSPITALITYRESTORATION 697 #define STRINGID_ELECTROSHOCKCHARGING 698 +#define STRINGID_ITEMWASUSEDUP 699 +#define STRINGID_ATTACKERLOSTITSTYPE 700 -#define BATTLESTRINGS_COUNT 699 +#define BATTLESTRINGS_COUNT 701 // This is the string id that gBattleStringsTable starts with. // String ids before this (e.g. STRINGID_INTROMSG) are not in the table, diff --git a/include/pokemon.h b/include/pokemon.h index c5f6f51cb6..5bca3505cf 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -451,8 +451,9 @@ struct BattleMove u16 accuracy:7; u16 recoil:7; u16 criticalHitStage:2; + u8 padding:6; // coming soon... + u8 numAdditionalEffects:2; // limited to 3 - don't want to get too crazy u8 pp; - u8 secondaryEffectChance; u16 target; s8 priority; @@ -508,7 +509,22 @@ struct BattleMove u32 skyBattleBanned:1; u32 sketchBanned:1; - u16 argument; + u32 argument; // also coming soon + + // primary/secondary effects + const struct AdditionalEffect *additionalEffects; +}; + +#define EFFECTS_ARR(...) (const struct AdditionalEffect[]) {__VA_ARGS__} +#define ADDITIONAL_EFFECTS(...) EFFECTS_ARR( __VA_ARGS__ ), .numAdditionalEffects = ARRAY_COUNT(EFFECTS_ARR( __VA_ARGS__ )) + +struct AdditionalEffect +{ + u8 self:1; + u8 onlyIfTargetRaisedStats:1; + u8 onChargeTurnOnly:1; + u8 chance; // 0% = effect certain, primary effect + u16 moveEffect; }; struct Ability diff --git a/include/random.h b/include/random.h index 8768f7c6dd..a4f6a88e25 100644 --- a/include/random.h +++ b/include/random.h @@ -167,13 +167,13 @@ enum RandomTag RNG_POISON_POINT, RNG_RAMPAGE_TURNS, RNG_SECONDARY_EFFECT, + RNG_SECONDARY_EFFECT_2, + RNG_SECONDARY_EFFECT_3, RNG_SLEEP_TURNS, RNG_SPEED_TIE, RNG_STATIC, RNG_STENCH, RNG_TRI_ATTACK, - RNG_TRIPLE_ARROWS_DEFENSE_DOWN, - RNG_TRIPLE_ARROWS_FLINCH, RNG_QUICK_DRAW, RNG_QUICK_CLAW, RNG_TRACE, diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index ae06cdfb51..8465da05b2 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -52,6 +52,7 @@ static s32 AI_Safari(u32 battlerAtk, u32 battlerDef, u32 move, s32 score); static s32 AI_FirstBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score); static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score); + static s32 (*const sBattleAiFuncTable[])(u32, u32, u32, s32) = { [0] = AI_CheckBadMove, // AI_FLAG_CHECK_BAD_MOVE @@ -1051,7 +1052,10 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) // 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(-2); // don't want to move last + break; default: break; // check move damage case EFFECT_SLEEP: @@ -1402,14 +1406,9 @@ 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: - //case EFFECT_MIRROR_COAT: + case EFFECT_FIXED_DAMAGE_ARG: case EFFECT_FOCUS_PUNCH: - //case EFFECT_ENDEAVOR: // AI_CBM_HighRiskForDamage if (aiData->abilities[battlerDef] == ABILITY_WONDER_GUARD && effectiveness < AI_EFFECTIVENESS_x2) ADJUST_SCORE(-10); @@ -1691,13 +1690,6 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) break; case EFFECT_HIT_ESCAPE: break; - case EFFECT_RAPID_SPIN: - if ((gBattleMons[battlerAtk].status2 & STATUS2_WRAPPED) || (gStatuses3[battlerAtk] & STATUS3_LEECHSEED)) - break; // check damage/accuracy - //Spin checks - if (!(gSideStatuses[GetBattlerSide(battlerAtk)] & SIDE_STATUS_HAZARDS_ANY)) - ADJUST_SCORE(-6); - break; case EFFECT_BELLY_DRUM: case EFFECT_FILLET_AWAY: if (aiData->abilities[battlerAtk] == ABILITY_CONTRARY) @@ -1899,15 +1891,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) @@ -1979,8 +1962,6 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (!AnyPartyMemberStatused(battlerAtk, gBattleMoves[move].soundMove) || PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) ADJUST_SCORE(-10); break; - case EFFECT_HIT_PREVENT_ESCAPE: - break; case EFFECT_ENDURE: if (gBattleMons[battlerAtk].hp == 1 || GetBattlerSecondaryDamage(battlerAtk)) //Don't use Endure if you'll die after using it ADJUST_SCORE(-10); @@ -2059,12 +2040,8 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) || DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) ADJUST_SCORE(-9); break; - case EFFECT_BURN_UP: - if (!IS_BATTLER_OF_TYPE(battlerAtk, TYPE_FIRE)) - ADJUST_SCORE(-10); - break; - case EFFECT_DOUBLE_SHOCK: - if (!IS_BATTLER_OF_TYPE(battlerAtk, TYPE_ELECTRIC)) + case EFFECT_FAIL_IF_NOT_ARG_TYPE: + if (!IS_BATTLER_OF_TYPE(battlerAtk, gBattleMoves[move].argument)) ADJUST_SCORE(-10); break; case EFFECT_DEFOG: @@ -2101,7 +2078,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++) @@ -2116,8 +2092,6 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } } break; - case EFFECT_SPECTRAL_THIEF: - break; case EFFECT_SEMI_INVULNERABLE: if (predictedMove != MOVE_NONE && AI_WhoStrikesFirst(battlerAtk, battlerDef, move) == AI_IS_SLOWER @@ -2206,8 +2180,6 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) || aiData->holdEffects[battlerAtk] == HOLD_EFFECT_ABILITY_SHIELD) ADJUST_SCORE(-10); break; - case EFFECT_CORE_ENFORCER: - break; case EFFECT_SIMPLE_BEAM: if (aiData->abilities[battlerDef] == ABILITY_SIMPLE || gAbilities[aiData->abilities[battlerDef]].cantBeOverwritten @@ -2442,8 +2414,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)) @@ -2525,7 +2495,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 @@ -2616,10 +2586,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) @@ -2750,7 +2716,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; @@ -3238,7 +3204,6 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score struct AiLogicData *aiData = AI_DATA; u32 movesetIndex = AI_THINKING_STRUCT->movesetIndex; u32 effectiveness = aiData->effectiveness[battlerAtk][battlerDef][movesetIndex]; - u32 secondaryEffectChance = AI_CalcSecondaryEffectChance(battlerAtk, gBattleMoves[move].secondaryEffectChance); s8 atkPriority = GetMovePriority(battlerAtk, move); u32 predictedMove = aiData->predictedMoves[battlerDef]; u32 predictedMoveSlot = GetMoveSlot(GetMovesArray(battlerDef), predictedMove); @@ -3296,6 +3261,8 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score switch (moveEffect) { case EFFECT_HIT: + // TEMPORARY - should be applied to all moves regardless of effect + score = AI_CheckMoveEffects(battlerAtk, battlerDef, move, score, aiData, predictedMove, isDoubleBattle); break; case EFFECT_SLEEP: case EFFECT_YAWN: @@ -3537,15 +3504,19 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score case EFFECT_HAZE: if (AnyStatIsRaised(BATTLE_PARTNER(battlerAtk)) || PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) + { ADJUST_SCORE(-3); break; - // fallthrough + } + score += AI_TryToClearStats(battlerAtk, battlerDef, isDoubleBattle); + break; case EFFECT_ROAR: - case EFFECT_CLEAR_SMOG: - if (isDoubleBattle) - score += min(CountPositiveStatStages(battlerDef) + CountPositiveStatStages(BATTLE_PARTNER(battlerDef)), 7); - else - score += min(CountPositiveStatStages(battlerDef), 4); + if ((gBattleMoves[move].soundMove && aiData->abilities[battlerDef] == ABILITY_SOUNDPROOF) || aiData->abilities[battlerDef] == ABILITY_SUCTION_CUPS) + { + ADJUST_SCORE(-3); + break; + } + score += AI_TryToClearStats(battlerAtk, battlerDef, isDoubleBattle); break; case EFFECT_MULTI_HIT: case EFFECT_TRIPLE_KICK: @@ -3558,9 +3529,6 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score if (!IS_BATTLER_OF_TYPE(battlerAtk, gBattleMoves[gBattleMons[battlerAtk].moves[0]].type)) ADJUST_SCORE(1); break; - case EFFECT_FLINCH_HIT: - score += ShouldTryToFlinch(battlerAtk, battlerDef, aiData->abilities[battlerAtk], aiData->abilities[battlerDef], move); - break; case EFFECT_SWALLOW: if (gDisableStructs[battlerAtk].stockpileCounter == 0) { @@ -3601,8 +3569,6 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score break; case EFFECT_TOXIC: case EFFECT_POISON: - case EFFECT_BARB_BARRAGE: - case EFFECT_MORTAL_SPIN: IncreasePoisonScore(battlerAtk, battlerDef, move, &score); break; case EFFECT_LIGHT_SCREEN: @@ -3644,14 +3610,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: @@ -3672,18 +3632,6 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score case EFFECT_PARALYZE: IncreaseParalyzeScore(battlerAtk, battlerDef, move, &score); break; - case EFFECT_SPEED_DOWN_HIT: - if (!ShouldLowerSpeed(battlerAtk, battlerDef, aiData->abilities[battlerDef])) - break; - case EFFECT_ATTACK_DOWN_HIT: - case EFFECT_DEFENSE_DOWN_HIT: - case EFFECT_SPECIAL_ATTACK_DOWN_HIT: - case EFFECT_SPECIAL_DEFENSE_DOWN_HIT: - case EFFECT_ACCURACY_DOWN_HIT: - case EFFECT_EVASION_DOWN_HIT: - if (secondaryEffectChance >= 100 && aiData->abilities[battlerDef] != ABILITY_CONTRARY) - ADJUST_SCORE(2); - break; case EFFECT_SUBSTITUTE: if (gStatuses3[battlerDef] & STATUS3_PERISH_SONG) ADJUST_SCORE(3); @@ -3710,7 +3658,7 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score case EFFECT_LEECH_SEED: if (IS_BATTLER_OF_TYPE(battlerDef, TYPE_GRASS) || gStatuses3[battlerDef] & STATUS3_LEECHSEED - || HasMoveEffect(battlerDef, EFFECT_RAPID_SPIN) + || HasMoveWithMoveEffect(battlerDef, MOVE_EFFECT_RAPIDSPIN) || aiData->abilities[battlerDef] == ABILITY_LIQUID_OOZE || aiData->abilities[battlerDef] == ABILITY_MAGIC_GUARD) break; @@ -3808,10 +3756,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 (secondaryEffectChance >= 100 && 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); @@ -3824,58 +3768,6 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score if (ShouldUseWishAromatherapy(battlerAtk, battlerDef, move)) ADJUST_SCORE(3); break; - case EFFECT_THIEF: - { - bool32 canSteal = FALSE; - - if (B_TRAINERS_KNOCK_OFF_ITEMS == TRUE) - canSteal = TRUE; - if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER || GetBattlerSide(battlerAtk) == B_SIDE_PLAYER) - canSteal = TRUE; - - if (canSteal && aiData->items[battlerAtk] == ITEM_NONE - && aiData->items[battlerDef] != ITEM_NONE - && CanBattlerGetOrLoseItem(battlerDef, aiData->items[battlerDef]) - && CanBattlerGetOrLoseItem(battlerAtk, aiData->items[battlerDef]) - && !HasMoveEffect(battlerAtk, EFFECT_ACROBATICS) - && aiData->abilities[battlerDef] != ABILITY_STICKY_HOLD) - { - switch (aiData->holdEffects[battlerDef]) - { - case HOLD_EFFECT_NONE: - break; - case HOLD_EFFECT_CHOICE_BAND: - case HOLD_EFFECT_CHOICE_SCARF: - case HOLD_EFFECT_CHOICE_SPECS: - ADJUST_SCORE(2); - break; - case HOLD_EFFECT_TOXIC_ORB: - if (ShouldPoisonSelf(battlerAtk, aiData->abilities[battlerAtk])) - ADJUST_SCORE(2); - break; - case HOLD_EFFECT_FLAME_ORB: - if (ShouldBurnSelf(battlerAtk, aiData->abilities[battlerAtk])) - ADJUST_SCORE(2); - break; - case HOLD_EFFECT_BLACK_SLUDGE: - if (IS_BATTLER_OF_TYPE(battlerAtk, TYPE_POISON)) - ADJUST_SCORE(2); - break; - case HOLD_EFFECT_IRON_BALL: - if (HasMoveEffect(battlerAtk, EFFECT_FLING)) - ADJUST_SCORE(2); - break; - case HOLD_EFFECT_LAGGING_TAIL: - case HOLD_EFFECT_STICKY_BARB: - break; - default: - ADJUST_SCORE(1); - break; - } - } - break; - } - break; case EFFECT_NIGHTMARE: if (aiData->abilities[battlerDef] != ABILITY_MAGIC_GUARD && !(gBattleMons[battlerDef].status2 & STATUS2_NIGHTMARE) @@ -3968,15 +3860,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(battlerAtk, battlerDef, aiData); break; case EFFECT_FORESIGHT: if (aiData->abilities[battlerAtk] == ABILITY_SCRAPPY || aiData->abilities[battlerAtk] == ABILITY_MINDS_EYE) @@ -4067,14 +3954,6 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score ADJUST_SCORE(1); } break; - case EFFECT_ATTACK_UP_HIT: - if (secondaryEffectChance >= 100) - IncreaseStatUpScore(battlerAtk, battlerDef, STAT_ATK, &score); - break; - case EFFECT_SPECIAL_ATTACK_UP_HIT: - if (secondaryEffectChance >= 100) - 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 @@ -4091,35 +3970,7 @@ 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: - case EFFECT_SPECTRAL_THIEF: - // 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 (HasMoveWithCategory(battlerAtk, BATTLE_CATEGORY_PHYSICAL)) - ADJUST_SCORE(1); - break; - case STAT_SPATK: - if (HasMoveWithCategory(battlerAtk, BATTLE_CATEGORY_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[battlerAtk] & AI_FLAG_STALL) - ADJUST_SCORE(1); - break; - } - } - } + score += AI_ShouldCopyStatChanges(battlerAtk, battlerDef); break; case EFFECT_SEMI_INVULNERABLE: ADJUST_SCORE(1); @@ -4164,7 +4015,7 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score case EFFECT_SWAGGER: if (HasMoveEffect(battlerAtk, EFFECT_FOUL_PLAY) || HasMoveEffect(battlerAtk, EFFECT_PSYCH_UP) - || HasMoveEffect(battlerAtk, EFFECT_SPECTRAL_THIEF)) + || HasMoveWithMoveEffect(battlerAtk, MOVE_EFFECT_SPECTRAL_THIEF)) ADJUST_SCORE(1); if (aiData->abilities[battlerDef] == ABILITY_CONTRARY) @@ -4174,7 +4025,7 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score break; case EFFECT_FLATTER: if (HasMoveEffect(battlerAtk, EFFECT_PSYCH_UP) - || HasMoveEffect(battlerAtk, EFFECT_SPECTRAL_THIEF)) + || HasMoveWithMoveEffect(battlerAtk, MOVE_EFFECT_SPECTRAL_THIEF)) ADJUST_SCORE(2); if (aiData->abilities[battlerDef] == ABILITY_CONTRARY) @@ -4211,48 +4062,24 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score else if (IsPredictedToUsePursuitableMove(battlerDef, battlerAtk) && !MoveWouldHitFirst(move, battlerAtk, battlerDef)) //Pursuit against fast U-Turn ADJUST_SCORE(3);*/ break; - case EFFECT_RAPID_SPIN: - IncreaseStatUpScore(battlerAtk, battlerDef, STAT_SPEED, &score); // Gen 8 increases speed - //fallthrough case EFFECT_DEFOG: - if (gSideStatuses[GetBattlerSide(battlerAtk)] & SIDE_STATUS_HAZARDS_ANY && CountUsablePartyMons(battlerAtk) != 0) + if ((gSideStatuses[GetBattlerSide(battlerAtk)] & SIDE_STATUS_HAZARDS_ANY && CountUsablePartyMons(battlerAtk) != 0) + || (gSideStatuses[GetBattlerSide(battlerDef)] & (SIDE_STATUS_SCREEN_ANY | SIDE_STATUS_SAFEGUARD | SIDE_STATUS_MIST))) { ADJUST_SCORE(3); - break; } - - switch (move) + else if (!(gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_SPIKES)) //Don't blow away hazards if you set them up { - case MOVE_DEFOG: - if (gSideStatuses[GetBattlerSide(battlerDef)] & (SIDE_STATUS_SCREEN_ANY | SIDE_STATUS_SAFEGUARD | SIDE_STATUS_MIST)) + if (isDoubleBattle) { - ADJUST_SCORE(3); + if (IsHazardMoveEffect(gBattleMoves[aiData->partnerMove].effect) // Partner is going to set up hazards + && AI_WhoStrikesFirst(battlerAtk, BATTLE_PARTNER(battlerAtk), move) == AI_IS_SLOWER) // Partner going first + break; // Don't use Defog if partner is going to set up hazards } - else if (!(gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_SPIKES)) //Don't blow away hazards if you set them up - { - if (isDoubleBattle) - { - if (IsHazardMoveEffect(gBattleMoves[aiData->partnerMove].effect) // Partner is going to set up hazards - && AI_WhoStrikesFirst(battlerAtk, BATTLE_PARTNER(battlerAtk), move) == AI_IS_SLOWER) // Partner going first - break; // Don't use Defog if partner is going to set up hazards - } - // check defog lowering evasion - if (ShouldLowerEvasion(battlerAtk, battlerDef, aiData->abilities[battlerDef])) - { - if (gBattleMons[battlerDef].statStages[STAT_EVASION] > 7 - || HasMoveWithLowAccuracy(battlerAtk, battlerDef, 90, TRUE, aiData->abilities[battlerAtk], aiData->abilities[battlerDef], aiData->holdEffects[battlerAtk], aiData->holdEffects[battlerDef])) - ADJUST_SCORE(2); // encourage lowering evasion if they are evasive or we have a move with low accuracy - else - ADJUST_SCORE(1); - } - } - break; - case MOVE_RAPID_SPIN: - case MOVE_MORTAL_SPIN: - if (gStatuses3[battlerAtk] & STATUS3_LEECHSEED || gBattleMons[battlerAtk].status2 & STATUS2_WRAPPED) - ADJUST_SCORE(3); - break; + // check defog lowering evasion + if (ShouldLowerEvasion(battlerAtk, battlerDef, aiData->abilities[battlerDef])) + ADJUST_SCORE(2); } break; case EFFECT_TORMENT: @@ -4390,12 +4217,6 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score else ADJUST_SCORE(1); break; - case EFFECT_SUPERPOWER: - case EFFECT_OVERHEAT: - case EFFECT_MAKE_IT_RAIN: - if (aiData->abilities[battlerAtk] == ABILITY_CONTRARY) - ADJUST_SCORE(3); - break; case EFFECT_MAGIC_COAT: if (IS_MOVE_STATUS(predictedMove) && AI_GetBattlerMoveTargetType(battlerDef, predictedMove) & (MOVE_TARGET_SELECTED | MOVE_TARGET_OPPONENTS_FIELD | MOVE_TARGET_BOTH)) ADJUST_SCORE(3); @@ -4426,24 +4247,6 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score if (gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_AURORA_VEIL) ADJUST_SCORE(1); break; - case EFFECT_KNOCK_OFF: - if (CanKnockOffItem(battlerDef, aiData->items[battlerDef])) - { - switch (aiData->holdEffects[battlerDef]) - { - case HOLD_EFFECT_IRON_BALL: - if (HasMoveEffect(battlerDef, EFFECT_FLING)) - ADJUST_SCORE(4); - break; - case HOLD_EFFECT_LAGGING_TAIL: - case HOLD_EFFECT_STICKY_BARB: - break; - default: - ADJUST_SCORE(3); - break; - } - } - break; case EFFECT_SKILL_SWAP: if (gAbilities[aiData->abilities[battlerDef]].aiRating > gAbilities[aiData->abilities[battlerAtk]].aiRating) ADJUST_SCORE(1); @@ -4618,22 +4421,6 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score ADJUST_SCORE(1); } break; - case EFFECT_BUG_BITE: // And pluck - if (gBattleMons[battlerDef].status2 & STATUS2_SUBSTITUTE || aiData->abilities[battlerDef] == ABILITY_STICKY_HOLD) - break; - else if (ItemId_GetPocket(aiData->items[battlerDef]) == POCKET_BERRIES) - ADJUST_SCORE(3); - break; - case EFFECT_INCINERATE: - if (gBattleMons[battlerDef].status2 & STATUS2_SUBSTITUTE || aiData->abilities[battlerDef] == ABILITY_STICKY_HOLD) - break; - else if (ItemId_GetPocket(aiData->items[battlerDef]) == POCKET_BERRIES || aiData->holdEffects[battlerDef] == HOLD_EFFECT_GEMS) - ADJUST_SCORE(3); - break; - case EFFECT_SMACK_DOWN: - if (!IsBattlerGrounded(battlerDef)) - ADJUST_SCORE(3); - break; case EFFECT_RELIC_SONG: if (!(gBattleMons[battlerAtk].status2 & STATUS2_TRANSFORMED)) // Don't try to change form if it's transformed. { @@ -4717,10 +4504,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); @@ -4734,12 +4517,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 && IsHealingMove(predictedMove)) ADJUST_SCORE(3); // Try to cancel healing move @@ -4818,16 +4595,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); @@ -4908,6 +4675,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; @@ -5006,9 +4774,23 @@ 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; + case EFFECT_HIT: + // TEMPORARY - should applied to all moves regardless of EFFECT + // 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; + } + } default: break; } @@ -5019,6 +4801,7 @@ static s32 AI_SetupFirstTurn(u32 battlerAtk, u32 battlerDef, u32 move, s32 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; @@ -5039,7 +4822,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: @@ -5049,6 +4831,21 @@ static s32 AI_Risky(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (Random() & 1) ADJUST_SCORE(2); break; + case EFFECT_HIT: + // TEMPORARY - should applied to all moves regardless of EFFECT + // 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; + } + } default: break; } diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 0197bf2903..7be8191d26 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -511,11 +511,8 @@ s32 AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, u8 *typeEffectivenes case EFFECT_PSYWAVE: dmg = gBattleMons[battlerAtk].level * (aiData->abilities[battlerAtk] == ABILITY_PARENTAL_BOND ? 2 : 1); break; - case EFFECT_DRAGON_RAGE: - dmg = 40 * (aiData->abilities[battlerAtk] == ABILITY_PARENTAL_BOND ? 2 : 1); - break; - case EFFECT_SONICBOOM: - dmg = 20 * (aiData->abilities[battlerAtk] == ABILITY_PARENTAL_BOND ? 2 : 1); + case EFFECT_FIXED_DAMAGE_ARG: + dmg = gBattleMoves[move].argument * (aiData->abilities[battlerAtk] == ABILITY_PARENTAL_BOND ? 2 : 1); break; case EFFECT_MULTI_HIT: dmg *= (aiData->abilities[battlerAtk] == ABILITY_SKILL_LINK @@ -591,110 +588,101 @@ static bool32 AI_IsMoveEffectInPlus(u32 battlerAtk, u32 battlerDef, u32 move, s3 switch (gBattleMoves[move].effect) { - case EFFECT_HIT: - default: - return FALSE; - case EFFECT_PARALYZE_HIT: - if (AI_CanParalyze(battlerAtk, battlerDef, abilityDef, move, MOVE_NONE)) - return TRUE; - break; - case EFFECT_BURN_HIT: - if (AI_CanBurn(battlerAtk, battlerDef, abilityDef, BATTLE_PARTNER(battlerAtk), move, MOVE_NONE)) - return TRUE; - break; - case EFFECT_POISON_HIT: - case EFFECT_POISON_FANG: - if (AI_CanPoison(battlerAtk, battlerDef, abilityDef, move, MOVE_NONE)) - return TRUE; - break; - case EFFECT_FREEZE_HIT: - if (AI_CanGetFrostbite(battlerDef, abilityDef)) - return TRUE; - break; - case EFFECT_CONFUSE_HIT: - if (AI_CanConfuse(battlerAtk, battlerDef, abilityDef, BATTLE_PARTNER(battlerAtk), move, MOVE_NONE)) - return TRUE; - break; - case EFFECT_FLINCH_STATUS: - switch (gBattleMoves[move].argument) - { - case STATUS1_PARALYSIS: - if (AI_CanParalyze(battlerAtk, battlerDef, abilityDef, move, MOVE_NONE)) - return TRUE; - break; - case STATUS1_BURN: - if (AI_CanBurn(battlerAtk, battlerDef, abilityDef, BATTLE_PARTNER(battlerAtk), move, MOVE_NONE)) - return TRUE; - break; - case STATUS1_FREEZE: - if (AI_CanGetFrostbite(battlerDef, abilityDef)) - return TRUE; - break; - } - // fallthrough - case EFFECT_FLINCH_HIT: - if (ShouldTryToFlinch(battlerAtk, battlerDef, abilityAtk, abilityDef, move)) - return TRUE; - break; case EFFECT_HIT_ESCAPE: 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_ATTACK_DOWN_HIT: - if (ShouldLowerStat(battlerDef, abilityDef, STAT_ATK) && abilityDef != ABILITY_HYPER_CUTTER && noOfHitsToKo != 1) - return TRUE; - break; - case EFFECT_DEFENSE_DOWN_HIT: - if (ShouldLowerStat(battlerDef, abilityDef, STAT_DEF) && noOfHitsToKo != 1) - return TRUE; - break; - case EFFECT_BULLDOZE: - case EFFECT_SPEED_DOWN_HIT: - if (ShouldLowerStat(battlerDef, abilityDef, STAT_SPEED) && noOfHitsToKo != 1) - return TRUE; - break; - case EFFECT_SPECIAL_ATTACK_DOWN_HIT: - if (ShouldLowerStat(battlerDef, abilityDef, STAT_SPATK) && noOfHitsToKo != 1) - return TRUE; - break; - case EFFECT_SPECIAL_DEFENSE_DOWN_HIT: - case EFFECT_SPECIAL_DEFENSE_DOWN_HIT_2: - if (ShouldLowerStat(battlerDef, abilityDef, STAT_SPDEF) && noOfHitsToKo != 1) - return TRUE; - break; - case EFFECT_ACCURACY_DOWN_HIT: - if (ShouldLowerStat(battlerDef, abilityDef, STAT_ACC) && noOfHitsToKo != 1) - return TRUE; - break; - case EFFECT_EVASION_DOWN_HIT: - if (ShouldLowerStat(battlerDef, abilityDef, STAT_EVASION) && noOfHitsToKo != 1) - return TRUE; - break; - case EFFECT_ALL_STATS_UP_HIT: - for (i = STAT_ATK; i <= NUM_STATS; i++) + } + + // check ADDITIONAL_EFFECTS + for (i = 0; i < gBattleMoves[move].numAdditionalEffects; i++) + { + // Consider move effects that target self + if (gBattleMoves[move].additionalEffects[i].self) { - if (BattlerStatCanRise(battlerAtk, abilityAtk, i)) - return TRUE; + 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; + } } - break; } return FALSE; @@ -704,29 +692,44 @@ static bool32 AI_IsMoveEffectInMinus(u32 battlerAtk, u32 battlerDef, u32 move, s { u32 abilityAtk = AI_DATA->abilities[battlerAtk]; 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_SUPERPOWER: - case EFFECT_OVERHEAT: - 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; - case EFFECT_SPEED_DOWN_HIT: - case EFFECT_ATTACK_DOWN_HIT: - case EFFECT_DEFENSE_DOWN_HIT: - case EFFECT_SPECIAL_ATTACK_DOWN_HIT: - case EFFECT_SPECIAL_DEFENSE_DOWN_HIT: - case EFFECT_SPECIAL_DEFENSE_DOWN_HIT_2: - if (noOfHitsToKo != 1 && abilityDef == ABILITY_CONTRARY && !IsMoldBreakerTypeAbility(abilityAtk)) - return TRUE; + default: + for (i = 0; i < gBattleMoves[move].numAdditionalEffects; i++) + { + switch (gBattleMoves[move].additionalEffects[i].moveEffect) + { + 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_ATK_TWO_DOWN: + case MOVE_EFFECT_V_CREATE: + case MOVE_EFFECT_ATK_DEF_DOWN: + case MOVE_EFFECT_DEF_SPDEF_DOWN: + case MOVE_EFFECT_SP_DEF_MINUS_1: + case MOVE_EFFECT_SP_DEF_MINUS_2: + if ((gBattleMoves[move].additionalEffects[i].self && GetBattlerAbility(battlerAtk) != ABILITY_CONTRARY) + || (noOfHitsToKo != 1 && abilityDef == ABILITY_CONTRARY && !IsMoldBreakerTypeAbility(abilityAtk))) + return TRUE; + break; + case MOVE_EFFECT_RECHARGE: + return gBattleMoves[move].additionalEffects[i].self; + } + } break; } return FALSE; @@ -1234,7 +1237,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)) { @@ -1440,13 +1442,19 @@ bool32 ShouldLowerStat(u32 battler, u32 battlerAbility, u32 stat) || battlerAbility == ABILITY_FULL_METAL_BODY) return FALSE; - // If AI is faster and doesn't have any mons left, lowering speed doesn't give any - if (stat == STAT_SPEED) + switch (stat) { - if (AI_WhoStrikesFirst(sBattler_AI, battler, AI_THINKING_STRUCT->moveConsidered) == AI_IS_FASTER - && CountUsablePartyMons(sBattler_AI) == 0 - && !HasMoveEffect(sBattler_AI, EFFECT_ELECTRO_BALL)) - return FALSE; + case STAT_ATK: + return !(battlerAbility == ABILITY_HYPER_CUTTER); + case STAT_DEF: + return !(battlerAbility == ABILITY_BIG_PECKS); + case STAT_SPEED: + // If AI is faster and doesn't have any mons left, lowering speed doesn't give any + return !(AI_WhoStrikesFirst(sBattler_AI, battler, AI_THINKING_STRUCT->moveConsidered) == AI_IS_FASTER + && CountUsablePartyMons(sBattler_AI) == 0 + && !HasMoveEffect(sBattler_AI, EFFECT_ELECTRO_BALL)); + case STAT_ACC: + return !(battlerAbility == ABILITY_KEEN_EYE || (B_ILLUMINATE_EFFECT >= GEN_9 && battlerAbility == ABILITY_ILLUMINATE)); } return TRUE; } @@ -1699,14 +1707,62 @@ bool32 HasMoveWithType(u32 battler, u32 type) return FALSE; } -bool32 HasMoveEffect(u32 battlerId, u32 moveEffect) +bool32 HasMoveEffect(u32 battlerId, u32 effect) { s32 i; u16 *moves = GetMovesArray(battlerId); for (i = 0; i < MAX_MON_MOVES; i++) { - if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && gBattleMoves[moves[i]].effect == moveEffect) + if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE + && gBattleMoves[moves[i]].effect == effect) + return TRUE; + } + + return FALSE; +} + +bool32 HasMoveEffectANDArg(u32 battlerId, u32 effect, u32 argument) +{ + s32 i; + u16 *moves = GetMovesArray(battlerId); + + for (i = 0; i < MAX_MON_MOVES; i++) + { + if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE + && gBattleMoves[moves[i]].effect == effect + && (gBattleMoves[moves[i]].argument & argument)) + return TRUE; + } + + return FALSE; +} + +bool32 HasMoveWithMoveEffect(u32 battlerId, u32 moveEffect) +{ + s32 i; + u16 *moves = GetMovesArray(battlerId); + + for (i = 0; i < MAX_MON_MOVES; i++) + { + if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE + && MoveHasMoveEffect(moves[i], moveEffect)) + return TRUE; + } + + return FALSE; +} + +bool32 HasMoveWithMoveEffectExcept(u32 battlerId, u32 moveEffect, u32 exception) +{ + s32 i; + u16 *moves = GetMovesArray(battlerId); + + for (i = 0; i < MAX_MON_MOVES; i++) + { + if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE + && gBattleMoves[moves[i]].effect != exception + && MoveHasMoveEffect(moves[i], moveEffect)) return TRUE; } @@ -1793,18 +1849,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) + || MoveHasMoveEffect(move, MOVE_EFFECT_WRAP); } } @@ -1815,7 +1870,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; } @@ -3375,8 +3430,7 @@ void IncreasePoisonScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) if (AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_STALL && HasMoveEffect(battlerAtk, EFFECT_PROTECT)) ADJUST_SCORE_PTR(1); // stall tactic - if (HasMoveEffect(battlerAtk, EFFECT_VENOSHOCK) - || HasMoveEffect(battlerAtk, EFFECT_HEX) + if (HasMoveEffectANDArg(battlerAtk, EFFECT_DOUBLE_POWER_ON_ARG_STATUS, STATUS1_PSN_ANY) || HasMoveEffect(battlerAtk, EFFECT_VENOM_DRENCH) || AI_DATA->abilities[battlerAtk] == ABILITY_MERCILESS) ADJUST_SCORE_PTR(2); @@ -3400,7 +3454,8 @@ 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 (HasMoveEffectANDArg(battlerAtk, EFFECT_DOUBLE_POWER_ON_ARG_STATUS, STATUS1_BURN) + || HasMoveEffectANDArg(BATTLE_PARTNER(battlerAtk), EFFECT_DOUBLE_POWER_ON_ARG_STATUS, STATUS1_BURN)) ADJUST_SCORE_PTR(1); } } @@ -3417,8 +3472,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_FLINCH_HIT) + || HasMoveEffectANDArg(battlerAtk, EFFECT_DOUBLE_POWER_ON_ARG_STATUS, STATUS1_PARALYSIS) + || (HasMoveWithMoveEffectExcept(battlerAtk, MOVE_EFFECT_FLINCH, EFFECT_FAKE_OUT)) // filter out Fake Out || gBattleMons[battlerDef].status2 & STATUS2_INFATUATION || gBattleMons[battlerDef].status2 & STATUS2_CONFUSION) ADJUST_SCORE_PTR(4); @@ -3442,7 +3497,8 @@ 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 (HasMoveEffectANDArg(battlerAtk, EFFECT_DOUBLE_POWER_ON_ARG_STATUS, STATUS1_SLEEP) + || HasMoveEffectANDArg(BATTLE_PARTNER(battlerAtk), EFFECT_DOUBLE_POWER_ON_ARG_STATUS, STATUS1_SLEEP)) ADJUST_SCORE_PTR(1); } @@ -3458,7 +3514,7 @@ void IncreaseConfusionScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score { if (gBattleMons[battlerDef].status1 & STATUS1_PARALYSIS || gBattleMons[battlerDef].status2 & STATUS2_INFATUATION - || (AI_DATA->abilities[battlerAtk] == ABILITY_SERENE_GRACE && HasMoveEffect(battlerAtk, EFFECT_FLINCH_HIT))) + || (AI_DATA->abilities[battlerAtk] == ABILITY_SERENE_GRACE && HasMoveWithMoveEffectExcept(battlerAtk, MOVE_EFFECT_FLINCH, EFFECT_FAKE_OUT))) ADJUST_SCORE_PTR(3); else ADJUST_SCORE_PTR(2); @@ -3479,7 +3535,8 @@ 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 (HasMoveEffectANDArg(battlerAtk, EFFECT_DOUBLE_POWER_ON_ARG_STATUS, STATUS1_FROSTBITE) + || HasMoveEffectANDArg(BATTLE_PARTNER(battlerAtk), EFFECT_DOUBLE_POWER_ON_ARG_STATUS, STATUS1_FROSTBITE)) ADJUST_SCORE_PTR(1); } } @@ -3530,10 +3587,276 @@ bool32 AI_IsBattlerAsleepOrComatose(u32 battlerId) return (gBattleMons[battlerId].status1 & STATUS1_SLEEP) || AI_DATA->abilities[battlerId] == ABILITY_COMATOSE; } -u32 AI_CalcSecondaryEffectChance(u32 battler, u32 secondaryEffectChance) +s32 AI_CheckMoveEffects(u32 battlerAtk, u32 battlerDef, u32 move, s32 score, struct AiLogicData *aiData, u32 predictedMove, bool32 isDoubleBattle) { - if (AI_DATA->abilities[battler] == ABILITY_SERENE_GRACE) - secondaryEffectChance *= 2; + u8 i; + // check move additional effects that are likely to happen + for (i = 0; i < gBattleMoves[move].numAdditionalEffects; i++) + { + // Only consider effects with a guaranteed chance to happen + if (!MoveEffectIsGuaranteed(battlerAtk, aiData->abilities[battlerAtk], &gBattleMoves[move].additionalEffects[i])) + continue; - return secondaryEffectChance; + // Consider move effects that target self + if (gBattleMoves[move].additionalEffects[i].self) + { + switch (gBattleMoves[move].additionalEffects[i].moveEffect) + { + case MOVE_EFFECT_SPD_PLUS_2: + case MOVE_EFFECT_SPD_PLUS_1: + if (aiData->abilities[battlerAtk] != ABILITY_CONTRARY && !AI_STRIKES_FIRST(battlerAtk, battlerDef, move)) + ADJUST_SCORE(3); + break; + case MOVE_EFFECT_ATK_PLUS_1: + case MOVE_EFFECT_DEF_PLUS_1: + case MOVE_EFFECT_SP_ATK_PLUS_1: + case MOVE_EFFECT_SP_DEF_PLUS_1: + case MOVE_EFFECT_ACC_PLUS_1: + case MOVE_EFFECT_EVS_PLUS_1: + IncreaseStatUpScore( + battlerAtk, + battlerDef, + STAT_ATK + gBattleMoves[move].additionalEffects[i].moveEffect - MOVE_EFFECT_ATK_PLUS_1, + &score + ); + break; + case MOVE_EFFECT_ATK_PLUS_2: + case MOVE_EFFECT_DEF_PLUS_2: + case MOVE_EFFECT_SP_ATK_PLUS_2: + case MOVE_EFFECT_SP_DEF_PLUS_2: + case MOVE_EFFECT_ACC_PLUS_2: + case MOVE_EFFECT_EVS_PLUS_2: + IncreaseStatUpScore( + battlerAtk, + battlerDef, + STAT_ATK + gBattleMoves[move].additionalEffects[i].moveEffect - MOVE_EFFECT_ATK_PLUS_2, + &score + ); + break; + // Effects that lower stat(s) - only need to consider Contrary + 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_V_CREATE: + case MOVE_EFFECT_DEF_SPDEF_DOWN: + case MOVE_EFFECT_ATK_DEF_DOWN: + case MOVE_EFFECT_SP_ATK_TWO_DOWN: + if (aiData->abilities[battlerAtk] == ABILITY_CONTRARY) + ADJUST_SCORE(3); + break; + case MOVE_EFFECT_RAPIDSPIN: + if ((gSideStatuses[GetBattlerSide(battlerAtk)] & SIDE_STATUS_HAZARDS_ANY && CountUsablePartyMons(battlerAtk) != 0) + || (gStatuses3[battlerAtk] & STATUS3_LEECHSEED || gBattleMons[battlerAtk].status2 & STATUS2_WRAPPED)) + { + ADJUST_SCORE(3); + break; + } + //Spin checks + if (!(gSideStatuses[GetBattlerSide(battlerAtk)] & SIDE_STATUS_HAZARDS_ANY)) + ADJUST_SCORE(-6); + 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_SPD_MINUS_1: + case MOVE_EFFECT_SPD_MINUS_2: + if (!ShouldLowerSpeed(battlerAtk, battlerDef, aiData->abilities[battlerDef])) + 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 (aiData->abilities[battlerDef] != ABILITY_CONTRARY) + ADJUST_SCORE(2); + break; + case MOVE_EFFECT_ATK_MINUS_2: + case MOVE_EFFECT_DEF_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 (aiData->abilities[battlerDef] != ABILITY_CONTRARY) + ADJUST_SCORE(3); + break; + case MOVE_EFFECT_POISON: + IncreasePoisonScore(battlerAtk, battlerDef, move, &score); + break; + case MOVE_EFFECT_CLEAR_SMOG: + score += AI_TryToClearStats(battlerAtk, battlerDef, FALSE); + break; + case MOVE_EFFECT_SPECTRAL_THIEF: + score += AI_ShouldCopyStatChanges(battlerAtk, battlerDef); + break; + case MOVE_EFFECT_BUG_BITE: // And pluck + if (gBattleMons[battlerDef].status2 & STATUS2_SUBSTITUTE || aiData->abilities[battlerDef] == ABILITY_STICKY_HOLD) + break; + else if (ItemId_GetPocket(aiData->items[battlerDef]) == POCKET_BERRIES) + ADJUST_SCORE(3); + break; + case MOVE_EFFECT_INCINERATE: + if (gBattleMons[battlerDef].status2 & STATUS2_SUBSTITUTE || aiData->abilities[battlerDef] == ABILITY_STICKY_HOLD) + break; + else if (ItemId_GetPocket(aiData->items[battlerDef]) == POCKET_BERRIES || aiData->holdEffects[battlerDef] == HOLD_EFFECT_GEMS) + ADJUST_SCORE(3); + break; + case MOVE_EFFECT_SMACK_DOWN: + if (!IsBattlerGrounded(battlerDef) && HasDamagingMoveOfType(battlerAtk, TYPE_GROUND)) + ADJUST_SCORE(1); + break; + case MOVE_EFFECT_KNOCK_OFF: + if (CanKnockOffItem(battlerDef, aiData->items[battlerDef])) + { + switch (aiData->holdEffects[battlerDef]) + { + case HOLD_EFFECT_IRON_BALL: + if (HasMoveEffect(battlerDef, EFFECT_FLING)) + ADJUST_SCORE(4); + break; + case HOLD_EFFECT_LAGGING_TAIL: + case HOLD_EFFECT_STICKY_BARB: + break; + default: + ADJUST_SCORE(3); + break; + } + } + break; + case MOVE_EFFECT_STEAL_ITEM: + { + bool32 canSteal = FALSE; + + if (B_TRAINERS_KNOCK_OFF_ITEMS == TRUE) + canSteal = TRUE; + if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER || GetBattlerSide(battlerAtk) == B_SIDE_PLAYER) + canSteal = TRUE; + + if (canSteal && aiData->items[battlerAtk] == ITEM_NONE + && aiData->items[battlerDef] != ITEM_NONE + && CanBattlerGetOrLoseItem(battlerDef, aiData->items[battlerDef]) + && CanBattlerGetOrLoseItem(battlerAtk, aiData->items[battlerDef]) + && !HasMoveEffect(battlerAtk, EFFECT_ACROBATICS) + && aiData->abilities[battlerDef] != ABILITY_STICKY_HOLD) + { + switch (aiData->holdEffects[battlerDef]) + { + case HOLD_EFFECT_NONE: + break; + case HOLD_EFFECT_CHOICE_BAND: + case HOLD_EFFECT_CHOICE_SCARF: + case HOLD_EFFECT_CHOICE_SPECS: + ADJUST_SCORE(2); + break; + case HOLD_EFFECT_TOXIC_ORB: + if (ShouldPoisonSelf(battlerAtk, aiData->abilities[battlerAtk])) + ADJUST_SCORE(2); + break; + case HOLD_EFFECT_FLAME_ORB: + if (ShouldBurnSelf(battlerAtk, aiData->abilities[battlerAtk])) + ADJUST_SCORE(2); + break; + case HOLD_EFFECT_BLACK_SLUDGE: + if (IS_BATTLER_OF_TYPE(battlerAtk, TYPE_POISON)) + ADJUST_SCORE(2); + break; + case HOLD_EFFECT_IRON_BALL: + if (HasMoveEffect(battlerAtk, EFFECT_FLING)) + ADJUST_SCORE(2); + break; + case HOLD_EFFECT_LAGGING_TAIL: + case HOLD_EFFECT_STICKY_BARB: + break; + default: + ADJUST_SCORE(1); + break; + } + } + break; + } + break; + case MOVE_EFFECT_STEALTH_ROCK: + case MOVE_EFFECT_SPIKES: + score += AI_ShouldSetUpHazards(battlerAtk, battlerDef, aiData); + break; + case MOVE_EFFECT_FEINT: + if (gBattleMoves[predictedMove].effect == EFFECT_PROTECT) + ADJUST_SCORE(3); + break; + case MOVE_EFFECT_THROAT_CHOP: + if (HasSoundMove(battlerDef) && gBattleMoves[predictedMove].soundMove && AI_WhoStrikesFirst(battlerAtk, battlerDef, move) == AI_IS_FASTER) + 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 (!HasMoveWithMoveEffect(battlerDef, MOVE_EFFECT_RAPIDSPIN) && !IsBattlerTrapped(battlerDef, TRUE) && ShouldTrap(battlerAtk, battlerDef, move)) + ADJUST_SCORE(5); + break; + } + } + } + + return score; +} + +s32 AI_TryToClearStats(u32 battlerAtk, u32 battlerDef, bool32 isDoubleBattle) +{ + if (isDoubleBattle) + return min(CountPositiveStatStages(battlerDef) + CountPositiveStatStages(BATTLE_PARTNER(battlerDef)), 7); + else + return min(CountPositiveStatStages(battlerDef), 4); +} + +bool32 AI_ShouldCopyStatChanges(u32 battlerAtk, u32 battlerDef) +{ + u8 i; + // 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: + return (HasMoveWithCategory(battlerAtk, BATTLE_CATEGORY_PHYSICAL)); + case STAT_SPATK: + return (HasMoveWithCategory(battlerAtk, BATTLE_CATEGORY_SPECIAL)); + case STAT_ACC: + case STAT_EVASION: + case STAT_SPEED: + return TRUE; + case STAT_DEF: + case STAT_SPDEF: + return (AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_STALL); + } + } + } + + return FALSE; +} + +//TODO - track entire opponent party data to determine hazard effectiveness +s32 AI_ShouldSetUpHazards(u32 battlerAtk, u32 battlerDef, struct AiLogicData *aiData) +{ + 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 e6fe9a4085..983186287e 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); } } @@ -4366,7 +4365,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; @@ -4393,7 +4392,7 @@ static void DisplayTrainerInfoOnCard(u8 flags, u8 trainerTourneyId) allocatedArray[k] = (gBattleMoves[move].pp <= 5) ? 1 : 0; break; case MOVE_POINTS_EFFECT: - allocatedArray[k] = (gBattleMoves[move].secondaryEffectChance > 0) ? 1 : 0; + allocatedArray[k] = gBattleMoves[move].sheerForceBoost; break; } } diff --git a/src/battle_dynamax.c b/src/battle_dynamax.c index bf223e5002..cae33e82ab 100644 --- a/src/battle_dynamax.c +++ b/src/battle_dynamax.c @@ -436,11 +436,10 @@ static u8 GetMaxPowerTier(u16 move) case EFFECT_TERRAIN_PULSE: case EFFECT_PUNISHMENT: case EFFECT_TRUMP_CARD: - case EFFECT_SONICBOOM: + case EFFECT_FIXED_DAMAGE_ARG: case EFFECT_SPIT_UP: case EFFECT_NATURAL_GIFT: case EFFECT_MIRROR_COAT: - case EFFECT_DRAGON_RAGE: case EFFECT_FINAL_GAMBIT: //case EFFECT_DRAGON_DARTS: return MAX_POWER_TIER_2; diff --git a/src/battle_message.c b/src/battle_message.c index 90d86f6495..5279aa5337 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -835,6 +835,8 @@ static const u8 sText_SwampEnvelopedSide[] = _("A swamp enveloped\n{B_DEF_TEAM2} static const u8 sText_TheSwampDisappeared[] = _("The swamp around {B_ATK_TEAM2}\nteam disappeared!"); static const u8 sText_HospitalityRestoration[] = _("The {B_ATK_PARTNER_NAME} drank down all\nthe matcha that Sinistcha made!"); static const u8 sText_ElectroShockCharging[] = _("{B_ATK_NAME_WITH_PREFIX} absorbed\nelectricity!"); +static const u8 sText_ItemWasUsedUp[] = _("The {B_LAST_ITEM}\nwas used up..."); +static const u8 sText_AttackerLostItsType[] = _("{B_ATK_NAME_WITH_PREFIX} lost\nits {B_BUFF1} type!"); const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = { @@ -1525,6 +1527,8 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = [STRINGID_ULTRABURSTCOMPLETED - BATTLESTRINGS_TABLE_START] = sText_UltraBurstCompleted, [STRINGID_TEAMGAINEDEXP - BATTLESTRINGS_TABLE_START] = sText_TeamGainedEXP, [STRINGID_TARGETCOVEREDINSTICKYCANDYSYRUP - BATTLESTRINGS_TABLE_START] = sText_TargetCoveredInStickyCandySyrup, + [STRINGID_ITEMWASUSEDUP - BATTLESTRINGS_TABLE_START] = sText_ItemWasUsedUp, + [STRINGID_ATTACKERLOSTITSTYPE - BATTLESTRINGS_TABLE_START] = sText_AttackerLostItsType, }; const u16 gTrainerUsedItemStringIds[] = diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index b4ae183f76..50d76a9e5c 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -355,6 +355,8 @@ static bool32 ChangeOrderTargetAfterAttacker(void); void ApplyExperienceMultipliers(s32 *expAmount, u8 expGetterMonId, u8 faintedBattler); static void RemoveAllTerrains(void); static bool8 CanAbilityPreventStatLoss(u16 abilityDef, bool8 isIntimidate); +static bool8 CanBurnHitThaw(u16 move); +static u32 GetNextTarget(u32 moveTarget, bool32 excludeCurrent); static void Cmd_attackcanceler(void); static void Cmd_accuracycheck(void); @@ -377,7 +379,7 @@ static void Cmd_printselectionstring(void); static void Cmd_waitmessage(void); static void Cmd_printfromtable(void); static void Cmd_printselectionstringfromtable(void); -static void Cmd_seteffectwithchance(void); +static void Cmd_setadditionaleffects(void); static void Cmd_seteffectprimary(void); static void Cmd_seteffectsecondary(void); static void Cmd_clearstatusfromeffect(void); @@ -496,7 +498,7 @@ static void Cmd_setdrainedhp(void); static void Cmd_statbuffchange(void); static void Cmd_normalisebuffs(void); static void Cmd_setbide(void); -static void Cmd_confuseifrepeatingattackends(void); +static void Cmd_unused0x8C(void); static void Cmd_setmultihitcounter(void); static void Cmd_initmultihitstring(void); static void Cmd_forcerandomswitch(void); @@ -584,7 +586,7 @@ static void Cmd_trysetsnatch(void); static void Cmd_unused2(void); static void Cmd_switchoutabilities(void); static void Cmd_jumpifhasnohp(void); -static void Cmd_getsecretpowereffect(void); +static void Cmd_jumpifnotcurrentmoveargtype(void); static void Cmd_pickup(void); static void Cmd_unused3(void); static void Cmd_unused4(void); @@ -636,7 +638,7 @@ void (* const gBattleScriptingCommandsTable[])(void) = Cmd_waitmessage, //0x12 Cmd_printfromtable, //0x13 Cmd_printselectionstringfromtable, //0x14 - Cmd_seteffectwithchance, //0x15 + Cmd_setadditionaleffects, //0x15 Cmd_seteffectprimary, //0x16 Cmd_seteffectsecondary, //0x17 Cmd_clearstatusfromeffect, //0x18 @@ -747,7 +749,7 @@ void (* const gBattleScriptingCommandsTable[])(void) = Cmd_trysetrest, //0x81 Cmd_jumpifnotfirstturn, //0x82 Cmd_setmiracleeye, //0x83 - Cmd_jumpifuproarwakes, //0x84 + Cmd_jumpifuproarwakes, //0x84 Cmd_stockpile, //0x85 Cmd_stockpiletobasedamage, //0x86 Cmd_stockpiletohpheal, //0x87 @@ -755,7 +757,7 @@ void (* const gBattleScriptingCommandsTable[])(void) = Cmd_statbuffchange, //0x89 Cmd_normalisebuffs, //0x8A Cmd_setbide, //0x8B - Cmd_confuseifrepeatingattackends, //0x8C + Cmd_unused0x8C, //0x8C Cmd_setmultihitcounter, //0x8D Cmd_initmultihitstring, //0x8E Cmd_forcerandomswitch, //0x8F @@ -843,7 +845,7 @@ void (* const gBattleScriptingCommandsTable[])(void) = Cmd_unused2, //0xE1 Cmd_switchoutabilities, //0xE2 Cmd_jumpifhasnohp, //0xE3 - Cmd_getsecretpowereffect, //0xE4 + Cmd_jumpifnotcurrentmoveargtype, //0xE4 Cmd_pickup, //0xE5 Cmd_unused3, //0xE6 Cmd_unused4, //0xE7 @@ -971,20 +973,14 @@ 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_REMOVE_ARG_TYPE, + 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] = @@ -1604,12 +1600,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) @@ -1843,6 +1833,9 @@ static void Cmd_ppreduce(void) if (gBattleControllerExecFlags) return; + if (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS) + gHitMarker |= HITMARKER_NO_PPDEDUCT; + if (moveTarget == MOVE_TARGET_BOTH || moveTarget == MOVE_TARGET_FOES_AND_ALLY || moveTarget == MOVE_TARGET_ALL_BATTLERS @@ -2760,7 +2753,7 @@ void StealTargetItem(u8 battlerStealer, u8 battlerItem) return; \ } -void SetMoveEffect(bool32 primary, u32 certain) +void SetMoveEffect(bool32 primary, bool32 certain) { s32 i, affectsUser = 0; bool32 statusChanged = FALSE; @@ -2771,7 +2764,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; @@ -2830,7 +2823,7 @@ void SetMoveEffect(bool32 primary, u32 certain) && !primary && gBattleScripting.moveEffect <= MOVE_EFFECT_CONFUSION) INCREMENT_RESET_RETURN - if (TestSheerForceFlag(gBattlerAttacker, gCurrentMove) && gBattleScripting.moveEffect != MOVE_EFFECT_CHARGING) + if (TestSheerForceFlag(gBattlerAttacker, gCurrentMove) && !primary && gBattleScripting.moveEffect != MOVE_EFFECT_CHARGING) INCREMENT_RESET_RETURN if (gBattleMons[gEffectBattler].hp == 0 && !activateAfterFaint) @@ -2868,7 +2861,7 @@ void SetMoveEffect(bool32 primary, u32 certain) break; case STATUS1_POISON: if ((battlerAbility == ABILITY_IMMUNITY || battlerAbility == ABILITY_PASTEL_VEIL) - && (primary == TRUE || certain == MOVE_EFFECT_CERTAIN)) + && (primary == TRUE || certain == TRUE)) { gLastUsedAbility = battlerAbility; RecordAbilityBattle(gEffectBattler, battlerAbility); @@ -2889,7 +2882,7 @@ void SetMoveEffect(bool32 primary, u32 certain) } if (!CanPoisonType(gBattleScripting.battler, gEffectBattler) && (gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT) - && (primary == TRUE || certain == MOVE_EFFECT_CERTAIN)) + && (primary == TRUE || certain == TRUE)) { BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_PSNPrevention; @@ -2903,11 +2896,8 @@ void SetMoveEffect(bool32 primary, u32 certain) statusChanged = TRUE; break; case STATUS1_BURN: - if (gCurrentMove == MOVE_BURNING_JEALOUSY && !gProtectStructs[gEffectBattler].statRaised) - break; - if ((battlerAbility == ABILITY_WATER_VEIL || battlerAbility == ABILITY_WATER_BUBBLE) - && (primary == TRUE || certain == MOVE_EFFECT_CERTAIN)) + && (primary == TRUE || certain == TRUE)) { gLastUsedAbility = battlerAbility; RecordAbilityBattle(gEffectBattler, battlerAbility); @@ -2927,7 +2917,7 @@ void SetMoveEffect(bool32 primary, u32 certain) } if (IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_FIRE) && (gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT) - && (primary == TRUE || certain == MOVE_EFFECT_CERTAIN)) + && (primary == TRUE || certain == TRUE)) { BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_BRNPrevention; @@ -2940,7 +2930,7 @@ void SetMoveEffect(bool32 primary, u32 certain) { u8 moveType = 0; GET_MOVE_TYPE(gCurrentMove, moveType); - if (primary == FALSE && certain != MOVE_EFFECT_CERTAIN && IS_BATTLER_OF_TYPE(gEffectBattler, moveType)) + if (primary == FALSE && certain == FALSE && IS_BATTLER_OF_TYPE(gEffectBattler, moveType)) break; } @@ -2954,7 +2944,7 @@ void SetMoveEffect(bool32 primary, u32 certain) { u8 moveType = 0; GET_MOVE_TYPE(gCurrentMove, moveType); - if (primary == FALSE && certain != MOVE_EFFECT_CERTAIN && IS_BATTLER_OF_TYPE(gEffectBattler, moveType)) + if (primary == FALSE && certain == FALSE && IS_BATTLER_OF_TYPE(gEffectBattler, moveType)) break; } if (!CanBeFrozen(gEffectBattler)) @@ -2968,7 +2958,7 @@ void SetMoveEffect(bool32 primary, u32 certain) case STATUS1_PARALYSIS: if (battlerAbility == ABILITY_LIMBER) { - if (primary == TRUE || certain == MOVE_EFFECT_CERTAIN) + if (primary == TRUE || certain == TRUE) { gLastUsedAbility = ABILITY_LIMBER; RecordAbilityBattle(gEffectBattler, ABILITY_LIMBER); @@ -2994,12 +2984,12 @@ void SetMoveEffect(bool32 primary, u32 certain) { u8 moveType = 0; GET_MOVE_TYPE(gCurrentMove, moveType); - if (primary == FALSE && certain != MOVE_EFFECT_CERTAIN && IS_BATTLER_OF_TYPE(gEffectBattler, moveType)) + if (primary == FALSE && certain == FALSE && IS_BATTLER_OF_TYPE(gEffectBattler, moveType)) break; } if (!CanParalyzeType(gBattleScripting.battler, gEffectBattler) && (gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT) - && (primary == TRUE || certain == MOVE_EFFECT_CERTAIN)) + && (primary == TRUE || certain == TRUE)) { BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_PRLZPrevention; @@ -3016,7 +3006,7 @@ void SetMoveEffect(bool32 primary, u32 certain) break; case STATUS1_TOXIC_POISON: if ((battlerAbility == ABILITY_IMMUNITY || battlerAbility == ABILITY_PASTEL_VEIL) - && (primary == TRUE || certain == MOVE_EFFECT_CERTAIN)) + && (primary == TRUE || certain == TRUE)) { gLastUsedAbility = battlerAbility; RecordAbilityBattle(gEffectBattler, battlerAbility); @@ -3037,7 +3027,7 @@ void SetMoveEffect(bool32 primary, u32 certain) } if (!CanPoisonType(gBattleScripting.battler, gEffectBattler) && (gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT) - && (primary == TRUE || certain == MOVE_EFFECT_CERTAIN)) + && (primary == TRUE || certain == TRUE)) { BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_PSNPrevention; @@ -3065,7 +3055,7 @@ void SetMoveEffect(bool32 primary, u32 certain) { u8 moveType = 0; GET_MOVE_TYPE(gCurrentMove, moveType); - if (primary == FALSE && certain != MOVE_EFFECT_CERTAIN && IS_BATTLER_OF_TYPE(gEffectBattler, moveType)) + if (primary == FALSE && certain == FALSE && IS_BATTLER_OF_TYPE(gEffectBattler, moveType)) break; } if (!CanGetFrostbite(gEffectBattler)) @@ -3137,9 +3127,6 @@ void SetMoveEffect(bool32 primary, u32 certain) switch (gBattleScripting.moveEffect) { case MOVE_EFFECT_CONFUSION: - if (gCurrentMove == MOVE_ALLURING_VOICE && !gProtectStructs[gEffectBattler].statRaised) - break; - if (!CanBeConfused(gEffectBattler)) { gBattlescriptCurrInstr++; @@ -3166,7 +3153,9 @@ void SetMoveEffect(bool32 primary, u32 certain) case MOVE_EFFECT_FLINCH: if (battlerAbility == ABILITY_INNER_FOCUS) { - if (primary == TRUE || certain == MOVE_EFFECT_CERTAIN) + // Inner Focus ALWAYS prevents flinching but only activates + // on a move that's supposed to flinch, like Fake Out + if (primary == TRUE || certain == TRUE) { gLastUsedAbility = ABILITY_INNER_FOCUS; gBattlerAbility = gEffectBattler; @@ -3208,8 +3197,15 @@ void SetMoveEffect(bool32 primary, u32 certain) if (payday > gPaydayMoney) gPaydayMoney = 0xFFFF; - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_MoveEffectPayDay; + // For a move that hits multiple targets (i.e. Make it Rain) + // we only want to print the message on the final hit + if (GetNextTarget(gBattleMoves[gCurrentMove].target, TRUE) == MAX_BATTLERS_COUNT) + { + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_MoveEffectPayDay; + } + else + gBattlescriptCurrInstr++; } else { @@ -3234,11 +3230,11 @@ void SetMoveEffect(bool32 primary, u32 certain) static const u8 sTriAttackEffects[] = { MOVE_EFFECT_BURN, - B_USE_FROSTBITE == TRUE ? MOVE_EFFECT_FROSTBITE : MOVE_EFFECT_FREEZE, + MOVE_EFFECT_FREEZE_OR_FROSTBITE, MOVE_EFFECT_PARALYSIS }; gBattleScripting.moveEffect = RandomElement(RNG_TRI_ATTACK, sTriAttackEffects); - SetMoveEffect(FALSE, 0); + SetMoveEffect(primary, certain); } break; case MOVE_EFFECT_CHARGING: @@ -3477,7 +3473,8 @@ void SetMoveEffect(bool32 primary, u32 certain) gBattlescriptCurrInstr = BattleScript_MoveEffectRecoil; break; case MOVE_EFFECT_THRASH: - if (gBattleMons[gEffectBattler].status2 & STATUS2_LOCK_CONFUSE) + // Petal Dance doesn't lock mons that copy the move with Dancer + if (gSpecialStatuses[gEffectBattler].dancerUsedMove) { gBattlescriptCurrInstr++; } @@ -3650,15 +3647,22 @@ void SetMoveEffect(bool32 primary, u32 certain) gBattleMons[gBattlerTarget].status2 |= STATUS2_ESCAPE_PREVENTION; gBattleMons[gBattlerAttacker].status2 |= STATUS2_ESCAPE_PREVENTION; break; - case MOVE_EFFECT_BURN_UP: + case MOVE_EFFECT_REMOVE_ARG_TYPE: // This seems unnecessary but is done to make it work properly with Parental Bond BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_BurnUpRemoveType; - break; - case MOVE_EFFECT_DOUBLE_SHOCK: - // This seems unnecessary but is done to make it work properly with Parental Bond - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_DoubleShockRemoveType; + switch (gBattleMoves[gCurrentMove].argument) + { + case TYPE_FIRE: // Burn Up + gBattlescriptCurrInstr = BattleScript_RemoveFireType; + break; + case TYPE_ELECTRIC: // Double Shot + gBattlescriptCurrInstr = BattleScript_RemoveElectricType; + break; + default: + gBattlescriptCurrInstr = BattleScript_RemoveGenericType; + break; + } + RemoveBattlerType(gEffectBattler, gBattleMoves[gCurrentMove].argument); break; case MOVE_EFFECT_ROUND: TryUpdateRoundTurnOrder(); // If another Pokémon uses Round before the user this turn, the user will use Round directly after it @@ -3669,7 +3673,7 @@ void SetMoveEffect(bool32 primary, u32 certain) { static const u8 sDireClawEffects[] = { MOVE_EFFECT_POISON, MOVE_EFFECT_PARALYSIS, MOVE_EFFECT_SLEEP }; gBattleScripting.moveEffect = RandomElement(RNG_DIRE_CLAW, sDireClawEffects); - SetMoveEffect(TRUE, 0); + SetMoveEffect(primary, certain); } break; case MOVE_EFFECT_STEALTH_ROCK: @@ -3691,26 +3695,6 @@ void SetMoveEffect(bool32 primary, u32 certain) else gBattlescriptCurrInstr = BattleScript_SpikesActivates; } - break; - case MOVE_EFFECT_TRIPLE_ARROWS: - { - u8 randomLowerDefenseChance = RandomPercentage(RNG_TRIPLE_ARROWS_DEFENSE_DOWN, CalcSecondaryEffectChance(gBattlerAttacker, 50, EFFECT_DEFENSE_DOWN_HIT)); - u8 randomFlinchChance = RandomPercentage(RNG_TRIPLE_ARROWS_FLINCH, CalcSecondaryEffectChance(gBattlerAttacker, 30, EFFECT_FLINCH_HIT)); - - if (randomFlinchChance && battlerAbility != ABILITY_INNER_FOCUS && GetBattlerTurnOrderNum(gEffectBattler) > gCurrentTurnActionNumber) - gBattleMons[gEffectBattler].status2 |= sStatusFlagsForMoveEffects[MOVE_EFFECT_FLINCH]; - - if (randomLowerDefenseChance) - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_DefDown; - } - else - { - gBattlescriptCurrInstr++; - } - } - break; case MOVE_EFFECT_SYRUP_BOMB: if (!(gStatuses4[gEffectBattler] & STATUS4_SYRUP_BOMB)) @@ -3724,6 +3708,89 @@ void SetMoveEffect(bool32 primary, u32 certain) gBattlescriptCurrInstr = BattleScript_SyrupBombActivates; } break; + case MOVE_EFFECT_SECRET_POWER: + if (gFieldStatuses & STATUS_FIELD_TERRAIN_ANY) + { + switch (gFieldStatuses & STATUS_FIELD_TERRAIN_ANY) + { + case STATUS_FIELD_MISTY_TERRAIN: + gBattleScripting.moveEffect = MOVE_EFFECT_SP_ATK_MINUS_1; + break; + case STATUS_FIELD_GRASSY_TERRAIN: + gBattleScripting.moveEffect = MOVE_EFFECT_SLEEP; + break; + case STATUS_FIELD_ELECTRIC_TERRAIN: + gBattleScripting.moveEffect = MOVE_EFFECT_PARALYSIS; + break; + case STATUS_FIELD_PSYCHIC_TERRAIN: + gBattleScripting.moveEffect = MOVE_EFFECT_SPD_MINUS_1; + break; + default: + gBattleScripting.moveEffect = MOVE_EFFECT_PARALYSIS; + break; + } + } + else + { + switch (gBattleTerrain) + { + case BATTLE_TERRAIN_GRASS: + gBattleScripting.moveEffect = (B_SECRET_POWER_EFFECT >= GEN_4 ? MOVE_EFFECT_SLEEP : MOVE_EFFECT_POISON); + break; + case BATTLE_TERRAIN_UNDERWATER: + gBattleScripting.moveEffect = (B_SECRET_POWER_EFFECT >= GEN_6 ? MOVE_EFFECT_ATK_MINUS_1 : MOVE_EFFECT_DEF_MINUS_1); + break; + case BATTLE_TERRAIN_POND: + gBattleScripting.moveEffect = (B_SECRET_POWER_EFFECT >= GEN_4 ? MOVE_EFFECT_ATK_MINUS_1 : MOVE_EFFECT_SPD_MINUS_1); + break; + case BATTLE_TERRAIN_MOUNTAIN: + if (B_SECRET_POWER_EFFECT >= GEN_5) + gBattleScripting.moveEffect = MOVE_EFFECT_ACC_MINUS_1; + else if (B_SECRET_POWER_EFFECT >= GEN_4) + gBattleScripting.moveEffect = MOVE_EFFECT_FLINCH; + else + gBattleScripting.moveEffect = MOVE_EFFECT_CONFUSION; + break; + case BATTLE_TERRAIN_PUDDLE: + gBattleScripting.moveEffect = (B_SECRET_POWER_EFFECT >= GEN_5 ? MOVE_EFFECT_SPD_MINUS_1 : MOVE_EFFECT_ACC_MINUS_1); + break; + case BATTLE_TERRAIN_LONG_GRASS: + gBattleScripting.moveEffect = MOVE_EFFECT_SLEEP; + break; + case BATTLE_TERRAIN_SAND: + gBattleScripting.moveEffect = MOVE_EFFECT_ACC_MINUS_1; + break; + case BATTLE_TERRAIN_WATER: + gBattleScripting.moveEffect = MOVE_EFFECT_ATK_MINUS_1; + break; + case BATTLE_TERRAIN_CAVE: + case BATTLE_TERRAIN_BURIAL_GROUND: + case BATTLE_TERRAIN_SPACE: + gBattleScripting.moveEffect = MOVE_EFFECT_FLINCH; + break; + case BATTLE_TERRAIN_SOARING: + case BATTLE_TERRAIN_SKY_PILLAR: + case BATTLE_TERRAIN_MARSH: + case BATTLE_TERRAIN_SWAMP: + gBattleScripting.moveEffect = MOVE_EFFECT_SPD_MINUS_1; + break; + case BATTLE_TERRAIN_SNOW: + case BATTLE_TERRAIN_ICE: + gBattleScripting.moveEffect = MOVE_EFFECT_FREEZE_OR_FROSTBITE; + break; + case BATTLE_TERRAIN_VOLCANO: + gBattleScripting.moveEffect = MOVE_EFFECT_BURN; + break; + case BATTLE_TERRAIN_ULTRA_SPACE: + gBattleScripting.moveEffect = MOVE_EFFECT_DEF_MINUS_1; + break; + default: + gBattleScripting.moveEffect = MOVE_EFFECT_PARALYSIS; + break; + } + } + SetMoveEffect(primary, certain); + break; } } } @@ -3731,36 +3798,63 @@ void SetMoveEffect(bool32 primary, u32 certain) gBattleScripting.moveEffect = 0; } -static void Cmd_seteffectwithchance(void) +static void Cmd_setadditionaleffects(void) { CMD_ARGS(); - u32 percentChance = CalcSecondaryEffectChance(gBattlerAttacker, gBattleMoves[gCurrentMove].secondaryEffectChance, gBattleMoves[gCurrentMove].effect); - - if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) - && gBattleScripting.moveEffect) + if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) { - if (gBattleScripting.moveEffect & MOVE_EFFECT_CERTAIN - || percentChance >= 100) + if (gBattleMoves[gCurrentMove].numAdditionalEffects > gBattleStruct->additionalEffectsCounter) { - gBattleScripting.moveEffect &= ~MOVE_EFFECT_CERTAIN; - SetMoveEffect(FALSE, MOVE_EFFECT_CERTAIN); - } - else if (RandomPercentage(RNG_SECONDARY_EFFECT, percentChance)) - { - SetMoveEffect(FALSE, 0); + u32 percentChance; + const u8 *currentPtr = gBattlescriptCurrInstr; + const struct AdditionalEffect *additionalEffect = &gBattleMoves[gCurrentMove].additionalEffects[gBattleStruct->additionalEffectsCounter]; + + // Check additional effect flags + // self-targeting move effects cannot occur multiple times per turn + // only occur on the last setmoveeffect when there are multiple targets + if (!(gBattleMoves[gCurrentMove].additionalEffects[gBattleStruct->additionalEffectsCounter].self + && GetNextTarget(gBattleMoves[gCurrentMove].target, TRUE) != MAX_BATTLERS_COUNT) + && !(additionalEffect->onlyIfTargetRaisedStats && !gProtectStructs[gBattlerTarget].statRaised) + && additionalEffect->onChargeTurnOnly == gProtectStructs[gBattlerAttacker].chargingTurn) + { + percentChance = CalcSecondaryEffectChance(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker), additionalEffect); + + // Activate effect if it's primary (chance == 0) or if RNGesus says so + if ((percentChance == 0) || RandomPercentage(RNG_SECONDARY_EFFECT + gBattleStruct->additionalEffectsCounter, percentChance)) + { + gBattleScripting.moveEffect = additionalEffect->moveEffect | (MOVE_EFFECT_AFFECTS_USER * (additionalEffect->self)); + + SetMoveEffect( + percentChance == 0, // a primary effect + percentChance >= 100 // certain to happen + ); + } + } + + // Move script along if we haven't jumped elsewhere + if (gBattlescriptCurrInstr == currentPtr) + gBattlescriptCurrInstr = cmd->nextInstr; + + // Call setadditionaleffects again in the case of a move with multiple effects + gBattleStruct->additionalEffectsCounter++; + if (gBattleMoves[gCurrentMove].numAdditionalEffects > gBattleStruct->additionalEffectsCounter) + gBattleScripting.moveEffect = MOVE_EFFECT_CONTINUE; + else + gBattleScripting.moveEffect = gBattleStruct->additionalEffectsCounter = 0; } else { + gBattleScripting.moveEffect = 0; gBattlescriptCurrInstr = cmd->nextInstr; } } else { + gBattleScripting.moveEffect = 0; gBattlescriptCurrInstr = cmd->nextInstr; } - gBattleScripting.moveEffect = 0; gBattleScripting.multihitMoveEffect = 0; } @@ -3768,14 +3862,14 @@ static void Cmd_seteffectprimary(void) { CMD_ARGS(); - SetMoveEffect(TRUE, 0); + SetMoveEffect(TRUE, FALSE); } static void Cmd_seteffectsecondary(void) { CMD_ARGS(); - SetMoveEffect(FALSE, 0); + SetMoveEffect(FALSE, FALSE); } static void Cmd_clearstatusfromeffect(void) @@ -3787,7 +3881,11 @@ static void Cmd_clearstatusfromeffect(void) if (gBattleScripting.moveEffect <= PRIMARY_STATUS_MOVE_EFFECT) gBattleMons[battler].status1 &= (~sStatusFlagsForMoveEffects[gBattleScripting.moveEffect]); else + { gBattleMons[battler].status2 &= (~sStatusFlagsForMoveEffects[gBattleScripting.moveEffect]); + if (gBattleScripting.moveEffect == MOVE_EFFECT_CHARGING) + gProtectStructs[battler].chargingTurn = FALSE; + } gBattleScripting.moveEffect = 0; gBattlescriptCurrInstr = cmd->nextInstr; @@ -5229,12 +5327,13 @@ static bool32 TryKnockOffBattleScript(u32 battlerDef) && gBattleMons[battler].hp != 0 \ && gBattleMons[ally].hp != 0 -static u32 GetNextTarget(u32 moveTarget) +static u32 GetNextTarget(u32 moveTarget, bool32 excludeCurrent) { u32 i; for (i = 0; i < MAX_BATTLERS_COUNT; i++) { if (i != gBattlerAttacker + && !(excludeCurrent && i == gBattlerTarget) && IsBattlerAlive(i) && !(gBattleStruct->targetsDone[gBattlerAttacker] & gBitTable[i]) && (GetBattlerSide(i) != GetBattlerSide(gBattlerAttacker) || moveTarget == MOVE_TARGET_FOES_AND_ALLY)) @@ -5380,8 +5479,7 @@ static void Cmd_moveend(void) if (gBattleMons[gBattlerTarget].status1 & STATUS1_FREEZE && gBattleMons[gBattlerTarget].hp != 0 && gBattlerAttacker != gBattlerTarget - && (moveType == TYPE_FIRE - || (B_BURN_HIT_THAW >= GEN_6 && gBattleMoves[gCurrentMove].effect == EFFECT_BURN_HIT)) + && (moveType == TYPE_FIRE || CanBurnHitThaw(gCurrentMove)) && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) { gBattleMons[gBattlerTarget].status1 &= ~STATUS1_FREEZE; @@ -5412,17 +5510,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(); - if (gBattleMoves[gCurrentMove].argument) // Flare Blitz - can burn, Volt Tackle - can paralyze - gBattlescriptCurrInstr = BattleScript_MoveEffectRecoilWithStatus; - else - gBattlescriptCurrInstr = BattleScript_MoveEffectRecoil; + gBattlescriptCurrInstr = BattleScript_MoveEffectRecoil; effect = TRUE; - break; } } gBattleScripting.moveendState++; @@ -5783,7 +5876,7 @@ static void Cmd_moveend(void) || moveTarget == MOVE_TARGET_FOES_AND_ALLY) && !(gHitMarker & HITMARKER_NO_ATTACKSTRING)) { - u32 nextTarget = GetNextTarget(moveTarget); + u32 nextTarget = GetNextTarget(moveTarget, FALSE); gHitMarker |= HITMARKER_NO_PPDEDUCT; if (nextTarget != MAX_BATTLERS_COUNT) @@ -5804,7 +5897,7 @@ static void Cmd_moveend(void) gBattleStruct->targetsDone[gBattlerAttacker] |= gBitTable[originalBounceTarget]; gBattleStruct->targetsDone[originalBounceTarget] = 0; - nextTarget = GetNextTarget(moveTarget); + nextTarget = GetNextTarget(moveTarget, FALSE); if (nextTarget != MAX_BATTLERS_COUNT) { // We found another target for the original move user. @@ -6114,7 +6207,7 @@ static void Cmd_moveend(void) *(gBattleStruct->moveTarget + gBattlerAttacker) = gSpecialStatuses[gBattlerAttacker].dancerOriginalTarget & 0x3; if (B_RAMPAGE_CANCELLING >= GEN_5 - && gBattleMoves[gCurrentMove].effect == EFFECT_RAMPAGE // If we're rampaging + && MoveHasMoveEffectSelf(gCurrentMove, MOVE_EFFECT_THRASH) // If we're rampaging && (gMoveResultFlags & MOVE_RESULT_NO_EFFECT) // And it is unusable && (gBattleMons[gBattlerAttacker].status2 & STATUS2_LOCK_CONFUSE) != STATUS2_LOCK_CONFUSE_TURN(1)) // And won't end this turn CancelMultiTurnMoves(gBattlerAttacker); // Cancel it @@ -6138,6 +6231,7 @@ static void Cmd_moveend(void) gBattleStruct->isAtkCancelerForCalledMove = FALSE; gBattleStruct->swapDamageCategory = FALSE; gBattleStruct->enduredDamage = 0; + gBattleStruct->additionalEffectsCounter = 0; gBattleScripting.moveendState++; break; case MOVEEND_COUNT: @@ -9496,42 +9590,10 @@ static void Cmd_various(void) gBattlescriptCurrInstr = cmd->failInstr; return; } - case VARIOUS_ARGUMENT_STATUS_EFFECT: + case VARIOUS_SET_ARG_TO_BATTLE_DAMAGE: { VARIOUS_ARGS(); - switch (gBattleMoves[gCurrentMove].argument) - { - case STATUS1_SLEEP: - gBattleScripting.moveEffect = MOVE_EFFECT_SLEEP; - break; - case STATUS1_BURN: - gBattleScripting.moveEffect = MOVE_EFFECT_BURN; - break; - case STATUS1_FREEZE: - gBattleScripting.moveEffect = MOVE_EFFECT_FREEZE; - break; - case STATUS1_PARALYSIS: - gBattleScripting.moveEffect = MOVE_EFFECT_PARALYSIS; - break; - case STATUS1_POISON: - gBattleScripting.moveEffect = MOVE_EFFECT_POISON; - break; - case STATUS1_TOXIC_POISON: - gBattleScripting.moveEffect = MOVE_EFFECT_TOXIC; - break; - case STATUS1_FROSTBITE: - gBattleScripting.moveEffect = MOVE_EFFECT_FROSTBITE; - break; - default: - gBattleScripting.moveEffect = 0; - break; - } - if (gBattleScripting.moveEffect != 0) - { - BattleScriptPush(cmd->nextInstr); - gBattlescriptCurrInstr = BattleScript_EffectWithChance; - return; - } + gBattleMoveDamage = gBattleMoves[gCurrentMove].argument; break; } case VARIOUS_TRY_HIT_SWITCH_TARGET: @@ -9570,7 +9632,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; @@ -9634,11 +9696,7 @@ static void Cmd_various(void) case VARIOUS_LOSE_TYPE: { VARIOUS_ARGS(u8 type); - for (i = 0; i < 3; i++) - { - if (*(u8 *)(&gBattleMons[battler].type1 + i) == cmd->type) - *(u8 *)(&gBattleMons[battler].type1 + i) = TYPE_MYSTERY; - } + RemoveBattlerType(battler, cmd->type); gBattlescriptCurrInstr = cmd->nextInstr; return; } @@ -9717,12 +9775,6 @@ static void Cmd_various(void) } return; } - case VARIOUS_ARGUMENT_TO_MOVE_EFFECT: - { - VARIOUS_ARGS(); - gBattleScripting.moveEffect = gBattleMoves[gCurrentMove].argument; - break; - } case VARIOUS_JUMP_IF_NOT_GROUNDED: { VARIOUS_ARGS(const u8 *jumpInstr); @@ -11626,14 +11678,8 @@ static void Cmd_setbide(void) gBattlescriptCurrInstr = cmd->nextInstr; } -static void Cmd_confuseifrepeatingattackends(void) +static void Cmd_unused0x8C(void) { - CMD_ARGS(); - - if (!(gBattleMons[gBattlerAttacker].status2 & STATUS2_LOCK_CONFUSE) && !gSpecialStatuses[gBattlerAttacker].dancerUsedMove) - gBattleScripting.moveEffect = (MOVE_EFFECT_THRASH | MOVE_EFFECT_AFFECTS_USER); - - gBattlescriptCurrInstr = cmd->nextInstr; } static void Cmd_setmultihitcounter(void) @@ -14368,99 +14414,17 @@ static void Cmd_jumpifhasnohp(void) gBattlescriptCurrInstr = cmd->nextInstr; } -static void Cmd_getsecretpowereffect(void) +static void Cmd_jumpifnotcurrentmoveargtype(void) { - CMD_ARGS(); + CMD_ARGS(u8 battler, const u8 *failInstr); - gBattleScripting.moveEffect = GetSecretPowerMoveEffect(); - gBattlescriptCurrInstr = cmd->nextInstr; -} + u8 battler = GetBattlerForBattleScript(cmd->battler); + const u8 *failInstr = cmd->failInstr; -u16 GetSecretPowerMoveEffect(void) -{ - u16 moveEffect; - u32 fieldTerrain = gFieldStatuses & STATUS_FIELD_TERRAIN_ANY; - if (fieldTerrain) - { - switch (fieldTerrain) - { - case STATUS_FIELD_MISTY_TERRAIN: - moveEffect = MOVE_EFFECT_SP_ATK_MINUS_1; - break; - case STATUS_FIELD_GRASSY_TERRAIN: - moveEffect = MOVE_EFFECT_SLEEP; - break; - case STATUS_FIELD_ELECTRIC_TERRAIN: - moveEffect = MOVE_EFFECT_PARALYSIS; - break; - case STATUS_FIELD_PSYCHIC_TERRAIN: - moveEffect = MOVE_EFFECT_SPD_MINUS_1; - break; - default: - moveEffect = MOVE_EFFECT_PARALYSIS; - break; - } - } + if (!IS_BATTLER_OF_TYPE(battler, gBattleMoves[gCurrentMove].argument)) + gBattlescriptCurrInstr = failInstr; else - { - switch (gBattleTerrain) - { - case BATTLE_TERRAIN_GRASS: - moveEffect = (B_SECRET_POWER_EFFECT >= GEN_4 ? MOVE_EFFECT_SLEEP : MOVE_EFFECT_POISON); - break; - case BATTLE_TERRAIN_UNDERWATER: - moveEffect = (B_SECRET_POWER_EFFECT >= GEN_6 ? MOVE_EFFECT_ATK_MINUS_1 : MOVE_EFFECT_DEF_MINUS_1); - break; - case BATTLE_TERRAIN_POND: - moveEffect = (B_SECRET_POWER_EFFECT >= GEN_4 ? MOVE_EFFECT_ATK_MINUS_1 : MOVE_EFFECT_SPD_MINUS_1); - break; - case BATTLE_TERRAIN_MOUNTAIN: - if (B_SECRET_POWER_EFFECT >= GEN_5) - moveEffect = MOVE_EFFECT_ACC_MINUS_1; - else if (B_SECRET_POWER_EFFECT >= GEN_4) - moveEffect = MOVE_EFFECT_FLINCH; - else - moveEffect = MOVE_EFFECT_CONFUSION; - break; - case BATTLE_TERRAIN_PUDDLE: - moveEffect = (B_SECRET_POWER_EFFECT >= GEN_5 ? MOVE_EFFECT_SPD_MINUS_1 : MOVE_EFFECT_ACC_MINUS_1); - break; - case BATTLE_TERRAIN_LONG_GRASS: - moveEffect = MOVE_EFFECT_SLEEP; - break; - case BATTLE_TERRAIN_SAND: - moveEffect = MOVE_EFFECT_ACC_MINUS_1; - break; - case BATTLE_TERRAIN_WATER: - moveEffect = MOVE_EFFECT_ATK_MINUS_1; - break; - case BATTLE_TERRAIN_CAVE: - case BATTLE_TERRAIN_BURIAL_GROUND: - case BATTLE_TERRAIN_SPACE: - moveEffect = MOVE_EFFECT_FLINCH; - break; - case BATTLE_TERRAIN_SOARING: - case BATTLE_TERRAIN_SKY_PILLAR: - case BATTLE_TERRAIN_MARSH: - case BATTLE_TERRAIN_SWAMP: - moveEffect = MOVE_EFFECT_SPD_MINUS_1; - break; - case BATTLE_TERRAIN_SNOW: - case BATTLE_TERRAIN_ICE: - moveEffect = (B_USE_FROSTBITE == TRUE ? MOVE_EFFECT_FROSTBITE : MOVE_EFFECT_FREEZE); - break; - case BATTLE_TERRAIN_VOLCANO: - moveEffect = MOVE_EFFECT_BURN; - break; - case BATTLE_TERRAIN_ULTRA_SPACE: - moveEffect = MOVE_EFFECT_DEF_MINUS_1; - break; - default: - moveEffect = MOVE_EFFECT_PARALYSIS; - break; - } - } - return moveEffect; + gBattlescriptCurrInstr = cmd->nextInstr; } static void Cmd_pickup(void) @@ -15713,6 +15677,21 @@ static bool8 CanAbilityPreventStatLoss(u16 abilityDef, bool8 byIntimidate) return FALSE; } +static bool8 CanBurnHitThaw(u16 move) +{ + u8 i; + + if (B_BURN_HIT_THAW >= GEN_6) + { + for (i = 0; i < gBattleMoves[move].numAdditionalEffects; i++) + { + if (gBattleMoves[move].additionalEffects[i].moveEffect == MOVE_EFFECT_BURN) + return TRUE; + } + } + return FALSE; +} + void BS_CheckParentalBondCounter(void) { NATIVE_ARGS(u8 counter, const u8 *jumpInstr); diff --git a/src/battle_tv.c b/src/battle_tv.c index 61edb4330a..d76dbe5541 100644 --- a/src/battle_tv.c +++ b/src/battle_tv.c @@ -88,11 +88,7 @@ static const u16 sPoints_MoveEffect[NUM_BATTLE_MOVE_EFFECTS] = { [EFFECT_HIT] = 1, [EFFECT_SLEEP] = 1, - [EFFECT_POISON_HIT] = 1, [EFFECT_ABSORB] = 4, - [EFFECT_BURN_HIT] = 1, - [EFFECT_FREEZE_HIT] = 1, - [EFFECT_PARALYZE_HIT] = 1, [EFFECT_EXPLOSION] = 0, [EFFECT_DREAM_EATER] = 5, [EFFECT_MIRROR_MOVE] = 1, @@ -113,28 +109,21 @@ static const u16 sPoints_MoveEffect[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_EVASION_DOWN] = 1, [EFFECT_HAZE] = 5, [EFFECT_BIDE] = 5, - [EFFECT_RAMPAGE] = 4, [EFFECT_ROAR] = 5, [EFFECT_MULTI_HIT] = 1, [EFFECT_CONVERSION] = 3, - [EFFECT_FLINCH_HIT] = 1, [EFFECT_RESTORE_HP] = 3, [EFFECT_TOXIC] = 5, - [EFFECT_PAY_DAY] = 1, [EFFECT_LIGHT_SCREEN] = 7, - [EFFECT_TRI_ATTACK] = 1, [EFFECT_REST] = 7, [EFFECT_OHKO] = 7, // [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, @@ -154,19 +143,9 @@ static const u16 sPoints_MoveEffect[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_REFLECT] = 7, [EFFECT_POISON] = 4, [EFFECT_PARALYZE] = 4, - [EFFECT_ATTACK_DOWN_HIT] = 1, - [EFFECT_DEFENSE_DOWN_HIT] = 1, - [EFFECT_SPEED_DOWN_HIT] = 1, - [EFFECT_SPECIAL_ATTACK_DOWN_HIT] = 1, - [EFFECT_SPECIAL_DEFENSE_DOWN_HIT] = 1, - [EFFECT_ACCURACY_DOWN_HIT] = 1, - [EFFECT_EVASION_DOWN_HIT] = 1, // [EFFECT_SKY_ATTACK] = 4, - [EFFECT_CONFUSE_HIT] = 1, // [EFFECT_TWINEEDLE] = 1, - [EFFECT_VITAL_THROW] = 1, [EFFECT_SUBSTITUTE] = 4, - [EFFECT_RECHARGE] = 5, [EFFECT_RAGE] = 2, [EFFECT_MIMIC] = 4, [EFFECT_METRONOME] = 1, @@ -190,7 +169,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, @@ -209,21 +187,16 @@ 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, - [EFFECT_RAPID_SPIN] = 2, - [EFFECT_SONICBOOM] = 1, + [EFFECT_FIXED_DAMAGE_ARG] = 1, [EFFECT_MORNING_SUN] = 4, [EFFECT_SYNTHESIS] = 4, [EFFECT_MOONLIGHT] = 4, [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, @@ -253,7 +226,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, @@ -264,7 +237,6 @@ static const u16 sPoints_MoveEffect[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_WISH] = 2, [EFFECT_ASSIST] = 2, [EFFECT_INGRAIN] = 6, - [EFFECT_SUPERPOWER] = 3, [EFFECT_MAGIC_COAT] = 6, [EFFECT_RECYCLE] = 4, [EFFECT_REVENGE] = 4, @@ -279,13 +251,10 @@ 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, - [EFFECT_POISON_FANG] = 1, [EFFECT_WEATHER_BALL] = 1, - [EFFECT_OVERHEAT] = 3, [EFFECT_TICKLE] = 1, [EFFECT_COSMIC_POWER] = 1, [EFFECT_SKY_UPPERCUT] = 1, @@ -298,9 +267,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 @@ -313,7 +280,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 @@ -341,7 +307,6 @@ static const u16 sPoints_MoveEffect[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_METAL_BURST] = 0, // TODO: Assign points [EFFECT_LUCKY_CHANT] = 0, // TODO: Assign points [EFFECT_SUCKER_PUNCH] = 0, // TODO: Assign points - [EFFECT_SPECIAL_DEFENSE_DOWN_HIT_2] = 0, // TODO: Assign points [EFFECT_SIMPLE_BEAM] = 0, // TODO: Assign points [EFFECT_ENTRAINMENT] = 0, // TODO: Assign points [EFFECT_HEAL_PULSE] = 0, // TODO: Assign points @@ -358,23 +323,19 @@ 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 [EFFECT_REFLECT_TYPE] = 0, // TODO: Assign points [EFFECT_SOAK] = 0, // TODO: Assign points [EFFECT_GROWTH] = 0, // TODO: Assign points - [EFFECT_CLOSE_COMBAT] = 0, // TODO: Assign points [EFFECT_LAST_RESORT] = 0, // TODO: Assign points - [EFFECT_FLINCH_STATUS] = 0, // TODO: Assign points [EFFECT_SHELL_SMASH] = 0, // TODO: Assign points [EFFECT_SHIFT_GEAR] = 0, // TODO: Assign points [EFFECT_DEFENSE_UP_3] = 0, // TODO: Assign points [EFFECT_NOBLE_ROAR] = 0, // TODO: Assign points [EFFECT_VENOM_DRENCH] = 0, // TODO: Assign points [EFFECT_TOXIC_THREAD] = 0, // TODO: Assign points - [EFFECT_CLEAR_SMOG] = 0, // TODO: Assign points [EFFECT_HIT_SWITCH_TARGET] = 0, // TODO: Assign points [EFFECT_FINAL_GAMBIT] = 0, // TODO: Assign points [EFFECT_CHANGE_TYPE_ON_ITEM] = 0, // TODO: Assign points @@ -382,51 +343,36 @@ 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 - [EFFECT_SP_ATTACK_UP_HIT] = 0, // TODO: Assign points [EFFECT_BELCH] = 0, // TODO: Assign points [EFFECT_PARTING_SHOT] = 0, // TODO: Assign points - [EFFECT_SPECTRAL_THIEF] = 0, // TODO: Assign points - [EFFECT_V_CREATE] = 0, // TODO: Assign points [EFFECT_MAT_BLOCK] = 0, // TODO: Assign points [EFFECT_STOMPING_TANTRUM] = 0, // TODO: Assign points - [EFFECT_CORE_ENFORCER] = 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 [EFFECT_ALLY_SWITCH] = 0, // TODO: Assign points [EFFECT_RELIC_SONG] = 0, // TODO: Assign points - [EFFECT_ATTACKER_DEFENSE_DOWN_HIT] = 0, // TODO: Assign points [EFFECT_BODY_PRESS] = 0, // TODO: Assign points [EFFECT_EERIE_SPELL] = 0, // TODO: Assign points [EFFECT_JUNGLE_HEALING] = 0, // TODO: Assign points @@ -439,7 +385,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 @@ -451,7 +396,6 @@ static const u16 sPoints_MoveEffect[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_PHOTON_GEYSER] = 0, // TODO: Assign points [EFFECT_SHELL_SIDE_ARM] = 0, // TODO: Assign points [EFFECT_TERRAIN_PULSE] = 0, // TODO: Assign points - [EFFECT_JAW_LOCK] = 0, // TODO: Assign points [EFFECT_NO_RETREAT] = 0, // TODO: Assign points [EFFECT_TAR_SHOT] = 0, // TODO: Assign points [EFFECT_POLTERGEIST] = 0, // TODO: Assign points @@ -468,11 +412,7 @@ static const u16 sPoints_MoveEffect[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_EXTREME_EVOBOOST] = 0, // TODO: Assign points [EFFECT_HIT_SET_REMOVE_TERRAIN] = 0, // TODO: Assign points [EFFECT_DARK_VOID] = 0, // TODO: Assign points - [EFFECT_SLEEP_HIT] = 1, - [EFFECT_DOUBLE_SHOCK] = 0, // TODO: Assign points - [EFFECT_SPECIAL_ATTACK_UP_HIT] = 1, [EFFECT_VICTORY_DANCE] = 0, // TODO: Assign points - [EFFECT_FROSTBITE_HIT] = 1, }; static const u16 sPoints_Effectiveness[] = @@ -1165,7 +1105,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); @@ -1327,7 +1267,27 @@ static void AddMovePoints(u8 caseId, u16 arg1, u8 arg2, u8 arg3) switch (caseId) { - case PTS_MOVE_EFFECT: + case PTS_MOVE_EFFECT: // arg1 -> move slot, arg2 -> move + { + u8 baseFromEffect = sPointsArray[caseId][gBattleMoves[arg2].effect]; + + // Various cases to add/remove points + if (gBattleMoves[arg2].recoil > 0) + baseFromEffect++; // Recoil moves + if (MoveHasMoveEffect(arg2, MOVE_EFFECT_RAPIDSPIN)) + baseFromEffect++; + if (MoveHasMoveEffect(arg2, MOVE_EFFECT_SP_ATK_TWO_DOWN) || MoveHasMoveEffect(arg2, MOVE_EFFECT_ATK_DEF_DOWN)) + baseFromEffect += 2; // Overheat, Superpower, etc. + if (MoveHasMoveEffect(arg2, MOVE_EFFECT_STEAL_ITEM)) + baseFromEffect += 3; + if (MoveHasMoveEffect(arg2, MOVE_EFFECT_WRAP) || MoveHasMoveEffectSelf(arg2, MOVE_EFFECT_THRASH)) + baseFromEffect += 3; + if (MoveHasMoveEffect(arg2, MOVE_EFFECT_RECHARGE)) + 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 66bd248763..9df7ac19c8 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2679,7 +2679,7 @@ u8 DoBattlerEndTurnEffects(void) if (!(gBattleMons[battler].status2 & STATUS2_CONFUSION)) { gBattleScripting.moveEffect = MOVE_EFFECT_CONFUSION | MOVE_EFFECT_AFFECTS_USER; - SetMoveEffect(TRUE, 0); + SetMoveEffect(TRUE, FALSE); if (gBattleMons[battler].status2 & STATUS2_CONFUSION) BattleScriptExecute(BattleScript_ThrashConfuses); effect++; @@ -3462,7 +3462,7 @@ u8 AtkCanceller_UnableToUseMove(u32 moveType) case CANCELLER_THAW: // move thawing if (gBattleMons[gBattlerAttacker].status1 & STATUS1_FREEZE) { - if (!(gBattleMoves[gCurrentMove].effect == EFFECT_BURN_UP && !IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_FIRE))) + if (!(MoveHasMoveEffectSelfArg(gCurrentMove, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_FIRE) && !IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_FIRE))) { gBattleMons[gBattlerAttacker].status1 &= ~STATUS1_FREEZE; BattleScriptPushCursor(); @@ -3473,7 +3473,7 @@ u8 AtkCanceller_UnableToUseMove(u32 moveType) } if (gBattleMons[gBattlerAttacker].status1 & STATUS1_FROSTBITE && gBattleMoves[gCurrentMove].thawsUser) { - if (!(gBattleMoves[gCurrentMove].effect == EFFECT_BURN_UP && !IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_FIRE))) + if (!(MoveHasMoveEffectSelfArg(gCurrentMove, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_FIRE) && !IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_FIRE))) { gBattleMons[gBattlerAttacker].status1 &= ~STATUS1_FROSTBITE; BattleScriptPushCursor(); @@ -5580,13 +5580,11 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && RandomWeighted(RNG_STENCH, 9, 1) && !IS_MOVE_STATUS(move) - && gBattleMoves[gCurrentMove].effect != EFFECT_FLINCH_HIT - && gBattleMoves[gCurrentMove].effect != EFFECT_FLINCH_STATUS - && gBattleMoves[gCurrentMove].effect != EFFECT_TRIPLE_ARROWS) + && !MoveHasMoveEffect(gCurrentMove, MOVE_EFFECT_FLINCH)) { gBattleScripting.moveEffect = MOVE_EFFECT_FLINCH; BattleScriptPushCursor(); - SetMoveEffect(FALSE, 0); + SetMoveEffect(FALSE, FALSE); BattleScriptPop(); effect++; } @@ -7488,7 +7486,7 @@ u8 ItemBattleEffects(u8 caseID, u32 battler, bool32 moveTurn) { gBattleScripting.moveEffect = MOVE_EFFECT_FLINCH; BattleScriptPushCursor(); - SetMoveEffect(FALSE, 0); + SetMoveEffect(FALSE, FALSE); BattleScriptPop(); } } @@ -8459,22 +8457,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; @@ -8665,11 +8655,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)); @@ -10939,22 +10924,28 @@ bool32 AreBattlersOfSameGender(u32 battler1, u32 battler2) return (gender1 != MON_GENDERLESS && gender2 != MON_GENDERLESS && gender1 == gender2); } -u32 CalcSecondaryEffectChance(u32 battler, u8 secondaryEffectChance, u16 moveEffect) +u32 CalcSecondaryEffectChance(u32 battler, u32 battlerAbility, const struct AdditionalEffect *additionalEffect) { - bool8 hasSereneGrace = (GetBattlerAbility(battler) == ABILITY_SERENE_GRACE); + bool8 hasSereneGrace = (battlerAbility == ABILITY_SERENE_GRACE); bool8 hasRainbow = (gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_RAINBOW) != 0; + u16 secondaryEffectChance = additionalEffect->chance; - if (hasRainbow && hasSereneGrace && moveEffect == EFFECT_FLINCH_HIT) - return secondaryEffectChance *= 2; + if (hasRainbow && hasSereneGrace && additionalEffect->moveEffect == MOVE_EFFECT_FLINCH) + return secondaryEffectChance * 2; if (hasSereneGrace) secondaryEffectChance *= 2; - if (hasRainbow && moveEffect != EFFECT_SECRET_POWER) + if (hasRainbow && additionalEffect->moveEffect != MOVE_EFFECT_SECRET_POWER) secondaryEffectChance *= 2; return secondaryEffectChance; } +bool32 MoveEffectIsGuaranteed(u32 battler, u32 battlerAbility, const struct AdditionalEffect *additionalEffect) +{ + return additionalEffect->chance == 0 || CalcSecondaryEffectChance(battler, battlerAbility, additionalEffect) >= 100; +} + bool32 IsAlly(u32 battlerAtk, u32 battlerDef) { return (GetBattlerSide(battlerAtk) == GetBattlerSide(battlerDef)); @@ -10969,6 +10960,47 @@ bool32 IsGen6ExpShareEnabled(void) #endif } +bool32 MoveHasMoveEffect(u32 move, u32 moveEffect) +{ + u32 i; + for (i = 0; i < gBattleMoves[move].numAdditionalEffects; i++) + { + if (gBattleMoves[move].additionalEffects[i].moveEffect == moveEffect + && gBattleMoves[move].additionalEffects[i].self == FALSE) + return TRUE; + } + return FALSE; +} + +bool32 MoveHasMoveEffectWithChance(u32 move, u32 moveEffect, u32 chance) +{ + u32 i; + for (i = 0; i < gBattleMoves[move].numAdditionalEffects; i++) + { + if (gBattleMoves[move].additionalEffects[i].moveEffect == moveEffect + && gBattleMoves[move].additionalEffects[i].chance == chance) + return TRUE; + } + return FALSE; +} + +bool32 MoveHasMoveEffectSelf(u32 move, u32 moveEffect) +{ + u32 i; + for (i = 0; i < gBattleMoves[move].numAdditionalEffects; i++) + { + if (gBattleMoves[move].additionalEffects[i].moveEffect == moveEffect + && gBattleMoves[move].additionalEffects[i].self == TRUE) + return TRUE; + } + return FALSE; +} + +bool32 MoveHasMoveEffectSelfArg(u32 move, u32 moveEffect, u32 argument) +{ + return (gBattleMoves[move].argument == argument) && MoveHasMoveEffectSelf(move, moveEffect); +} + bool8 CanMonParticipateInSkyBattle(struct Pokemon *mon) { u16 species = GetMonData(mon, MON_DATA_SPECIES); @@ -11041,3 +11073,13 @@ u8 GetBattlerType(u32 battler, u8 typeIndex) return types[typeIndex]; } + +void RemoveBattlerType(u32 battler, u8 type) +{ + u32 i; + for (i = 0; i < 3; i++) + { + if (*(u8 *)(&gBattleMons[battler].type1 + i) == type) + *(u8 *)(&gBattleMons[battler].type1 + i) = TYPE_MYSTERY; + } +} diff --git a/src/data/battle_frontier/battle_pyramid_wild_requirements.h b/src/data/battle_frontier/battle_pyramid_wild_requirements.h index 19e72d1e8a..b559daf037 100644 --- a/src/data/battle_frontier/battle_pyramid_wild_requirements.h +++ b/src/data/battle_frontier/battle_pyramid_wild_requirements.h @@ -13,7 +13,7 @@ struct BattlePyramidRequirement { u8 nEvoItems; }; -// EFFECT_PARALYZE, EFFECT_PARALYZE_HIT (30% or more) +// EFFECT_PARALYZE, MOVE_EFFECT_PARALYZE (30% or more) static const u16 sParalyzingMoves[] = { //MOVE_THUNDER_PUNCH, MOVE_BODY_SLAM, @@ -35,7 +35,7 @@ static const u16 sParalyzingMoves[] = { MOVE_COMBAT_TORQUE, }; -// EFFECT_POISON_HIT (30% or more), EFFECT_POISON, EFFECT_POISON_FANG, EFFECT_TOXIC, EFFECT_TOXIC_THREAD +// MOVE_EFFECT_POISON (30% or more), EFFECT_POISON, MOVE_EFFECT_TOXIC, EFFECT_TOXIC, EFFECT_TOXIC_THREAD static const u16 sPoisoningMoves[] = { MOVE_POISON_STING, //MOVE_TWINEEDLE, @@ -57,7 +57,7 @@ static const u16 sPoisoningMoves[] = { MOVE_TOXIC_THREAD, }; -// EFFECT_BURN_HIT, EFFECT_WILL_O_WISP +// MOVE_EFFECT_BURN, EFFECT_WILL_O_WISP static const u16 sBurningMoves[] = { MOVE_WILL_O_WISP, //MOVE_EMBER, @@ -79,7 +79,7 @@ static const u16 sBurningMoves[] = { MOVE_BLAZING_TORQUE, }; -// EFFECT_FREEZE, EFFECT_FREEZE_HIT +// EFFECT_FREEZE, MOVE_EFFECT_FREEZE_OR_FROSTBITE static const u16 sFrostbiteMoves[] = { MOVE_ICE_PUNCH, MOVE_ICE_BEAM, @@ -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, @@ -169,7 +169,7 @@ static const struct BattlePyramidRequirement sBattlePyramidRequirementsByRound[] { .type = TYPE_ICE, }, - + [7] = /* pokemon with explosion effects */ { .type = TYPE_MYSTERY, diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 1462f86262..42d891824e 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -7,7 +7,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 0, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -23,7 +22,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 35, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -39,7 +37,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .accuracy = 100, .criticalHitStage = 1, .pp = 25, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -53,7 +50,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 85, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -67,7 +63,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 85, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -82,7 +77,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 85, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -92,67 +86,74 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_PAY_DAY] = { - .effect = EFFECT_PAY_DAY, + .effect = EFFECT_HIT, .power = 40, .type = TYPE_NORMAL, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_PAYDAY, + }), }, [MOVE_FIRE_PUNCH] = { - .effect = EFFECT_BURN_HIT, + .effect = EFFECT_HIT, .power = 75, .type = TYPE_FIRE, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .punchingMove = TRUE, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_BURN, + .chance = 10, + }), }, [MOVE_ICE_PUNCH] = { - #if B_USE_FROSTBITE == TRUE - .effect = EFFECT_FROSTBITE_HIT, - #else - .effect = EFFECT_FREEZE_HIT, - #endif + .effect = EFFECT_HIT, .power = 75, .type = TYPE_ICE, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .punchingMove = TRUE, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_FREEZE_OR_FROSTBITE, + .chance = 10, + }), }, [MOVE_THUNDER_PUNCH] = { - .effect = EFFECT_PARALYZE_HIT, + .effect = EFFECT_HIT, .power = 75, .type = TYPE_ELECTRIC, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .punchingMove = TRUE, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_PARALYSIS, + .chance = 10, + }), }, [MOVE_SCRATCH] = @@ -162,7 +163,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 35, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -176,7 +176,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 30, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -190,7 +189,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 30, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -205,7 +203,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .accuracy = 100, .criticalHitStage = 1, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_BOTH, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -226,7 +223,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .power = 0, .type = TYPE_NORMAL, .accuracy = 0, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -242,7 +238,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 95, .pp = 30, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -257,7 +252,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FLYING, .accuracy = 100, .pp = 35, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -273,7 +267,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FLYING, .accuracy = 100, .pp = 35, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -291,7 +284,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .power = 0, .type = TYPE_NORMAL, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = -6, .category = BATTLE_CATEGORY_STATUS, @@ -315,7 +307,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FLYING, .accuracy = 95, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -329,21 +320,19 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_BIND] = { - #if B_UPDATED_MOVE_DATA >= GEN_5 - .accuracy = 85, - #else - .accuracy = 75, - #endif - .effect = EFFECT_TRAP, + .effect = EFFECT_HIT, .power = 15, .type = TYPE_NORMAL, + .accuracy = B_UPDATED_MOVE_DATA >= GEN_5 ? 85 : 75, .pp = 20, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .ignoresKingsRock = B_UPDATED_MOVE_FLAGS < GEN_3, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_WRAP, + }), }, [MOVE_SLAM] = @@ -353,7 +342,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 75, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -376,7 +364,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .effect = EFFECT_HIT, .type = TYPE_GRASS, .accuracy = 100, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -385,12 +372,11 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_STOMP] = { - .effect = EFFECT_FLINCH_HIT, + .effect = EFFECT_HIT, .power = 65, .type = TYPE_NORMAL, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -398,6 +384,10 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .sheerForceBoost = TRUE, .minimizeDoubleDamage = TRUE, .skyBattleBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_FLINCH, + .chance = 30, + }), }, [MOVE_DOUBLE_KICK] = @@ -407,7 +397,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FIGHTING, .accuracy = 100, .pp = 30, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -422,7 +411,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 75, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -444,7 +432,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .effect = EFFECT_RECOIL_IF_MISS, .type = TYPE_FIGHTING, .accuracy = 95, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -454,18 +441,21 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_ROLLING_KICK] = { - .effect = EFFECT_FLINCH_HIT, + .effect = EFFECT_HIT, .power = 60, .type = TYPE_FIGHTING, .accuracy = 85, .pp = 15, - .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .ignoresKingsRock = B_UPDATED_MOVE_FLAGS < GEN_3, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_FLINCH, + .chance = 30, + }), }, [MOVE_SAND_ATTACK] = @@ -475,7 +465,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GROUND, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -485,17 +474,20 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_HEADBUTT] = { - .effect = EFFECT_FLINCH_HIT, + .effect = EFFECT_HIT, .power = 70, .type = TYPE_NORMAL, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_FLINCH, + .chance = 30, + }), }, [MOVE_HORN_ATTACK] = @@ -505,7 +497,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 25, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -519,7 +510,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 85, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -533,7 +523,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 30, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -555,7 +544,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .effect = EFFECT_HIT, .type = TYPE_NORMAL, .pp = 35, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -564,12 +552,11 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_BODY_SLAM] = { - .effect = EFFECT_PARALYZE_HIT, + .effect = EFFECT_HIT, .power = 85, .type = TYPE_NORMAL, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -577,35 +564,36 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .sheerForceBoost = TRUE, .minimizeDoubleDamage = B_UPDATED_MOVE_FLAGS >= GEN_6, .skyBattleBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_PARALYSIS, + .chance = 30, + }), }, [MOVE_WRAP] = { - #if B_UPDATED_MOVE_DATA >= GEN_5 - .accuracy = 90, - #else - .accuracy = 85, - #endif - .effect = EFFECT_TRAP, + .effect = EFFECT_HIT, .power = 15, .type = TYPE_NORMAL, + .accuracy = B_UPDATED_MOVE_DATA >= GEN_5 ? 90 : 85, .pp = 20, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_WRAP, + }), }, [MOVE_TAKE_DOWN] = { - .effect = EFFECT_RECOIL, + .effect = EFFECT_HIT, .power = 90, .type = TYPE_NORMAL, .accuracy = 85, .recoil = 25, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -621,26 +609,28 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .power = 90, .pp = 20, #endif - .effect = EFFECT_RAMPAGE, + .effect = EFFECT_HIT, .type = TYPE_NORMAL, .accuracy = 100, - .secondaryEffectChance = 100, .target = MOVE_TARGET_RANDOM, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .instructBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_THRASH, + .self = TRUE, + }), }, [MOVE_DOUBLE_EDGE] = { - .effect = EFFECT_RECOIL, + .effect = EFFECT_HIT, .power = 120, .type = TYPE_NORMAL, .accuracy = 100, .recoil = 33, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -654,7 +644,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 30, - .secondaryEffectChance = 0, .target = MOVE_TARGET_BOTH, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -664,32 +653,38 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_POISON_STING] = { - .effect = EFFECT_POISON_HIT, + .effect = EFFECT_HIT, .power = 15, .type = TYPE_POISON, .accuracy = 100, .pp = 35, - .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_POISON, + .chance = 30, + }), }, [MOVE_TWINEEDLE] = { - .effect = EFFECT_POISON_HIT, + .effect = EFFECT_HIT, .power = 25, .type = TYPE_BUG, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 20, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .sheerForceBoost = TRUE, .ignoresKingsRock = B_UPDATED_MOVE_FLAGS < GEN_5, // && B_UPDATED_MOVE_FLAGS > GEN_2 .strikeCount = 2, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_POISON, + .chance = 20, + }), }, [MOVE_PIN_MISSILE] = @@ -704,7 +699,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .effect = EFFECT_MULTI_HIT, .type = TYPE_BUG, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -717,7 +711,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 30, - .secondaryEffectChance = 0, .target = MOVE_TARGET_BOTH, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -727,18 +720,21 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_BITE] = { - .effect = EFFECT_FLINCH_HIT, + .effect = EFFECT_HIT, .power = 60, .type = TYPE_DARK, .accuracy = 100, .pp = 25, - .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .sheerForceBoost = TRUE, .bitingMove = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_FLINCH, + .chance = 30, + }), }, [MOVE_GROWL] = @@ -748,7 +744,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 40, - .secondaryEffectChance = 0, .target = MOVE_TARGET_BOTH, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -769,7 +764,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .power = 0, .type = TYPE_NORMAL, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = -6, .category = BATTLE_CATEGORY_STATUS, @@ -789,7 +783,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 55, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -806,7 +799,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 55, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -818,15 +810,15 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_SONIC_BOOM] = { - .effect = EFFECT_SONICBOOM, + .effect = EFFECT_FIXED_DAMAGE_ARG, .power = 1, .type = TYPE_NORMAL, .accuracy = 90, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, + .argument = 20, }, [MOVE_DISABLE] = @@ -842,7 +834,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .power = 0, .type = TYPE_NORMAL, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -853,34 +844,45 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_ACID] = { - #if B_UPDATED_MOVE_DATA >= GEN_4 - .effect = EFFECT_SPECIAL_DEFENSE_DOWN_HIT, - #else - .effect = EFFECT_DEFENSE_DOWN_HIT, - #endif + .effect = EFFECT_HIT, .power = 40, .type = TYPE_POISON, .accuracy = 100, .pp = 30, - .secondaryEffectChance = 10, .target = MOVE_TARGET_BOTH, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, + #if B_UPDATED_MOVE_DATA >= GEN_4 + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SP_DEF_MINUS_1, + .chance = 10, + } + ), + #else + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_DEF_MINUS_1, + .chance = 10, + } + ), + #endif }, [MOVE_EMBER] = { - .effect = EFFECT_BURN_HIT, + .effect = EFFECT_HIT, .power = 40, .type = TYPE_FIRE, .accuracy = 100, .pp = 25, - .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_BURN, + .chance = 10, + }), }, [MOVE_FLAMETHROWER] = @@ -890,15 +892,18 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = #else .power = 95, #endif - .effect = EFFECT_BURN_HIT, + .effect = EFFECT_HIT, .type = TYPE_FIRE, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_BURN, + .chance = 10, + }), }, [MOVE_MIST] = @@ -908,7 +913,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ICE, .accuracy = 0, .pp = 30, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -925,7 +929,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_WATER, .accuracy = 100, .pp = 25, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -942,7 +945,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_WATER, .accuracy = 80, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -964,7 +966,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_WATER, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 0, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .damagesUnderwater = TRUE, @@ -980,19 +981,18 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = #endif // The following effect is also relevant in battle_pike.c // If you cherry-pick this to use something other than the config, make sure to update it there too - #if B_USE_FROSTBITE == TRUE - .effect = EFFECT_FROSTBITE_HIT, - #else - .effect = EFFECT_FREEZE_HIT, - #endif + .effect = EFFECT_HIT, .type = TYPE_ICE, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_FREEZE_OR_FROSTBITE, + .chance = 10, + }), }, [MOVE_BLIZZARD] = @@ -1002,76 +1002,87 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = #else .power = 120, #endif - #if B_USE_FROSTBITE == TRUE - .effect = EFFECT_FROSTBITE_HIT, - #else - .effect = EFFECT_FREEZE_HIT, - #endif + .effect = EFFECT_HIT, .type = TYPE_ICE, .accuracy = 70, .pp = 5, - .secondaryEffectChance = 10, .target = MOVE_TARGET_BOTH, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, .windMove = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_FREEZE_OR_FROSTBITE, + .chance = 10, + }), }, [MOVE_PSYBEAM] = { - .effect = EFFECT_CONFUSE_HIT, + .effect = EFFECT_HIT, .power = 65, .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_CONFUSION, + .chance = 10, + }), }, [MOVE_BUBBLE_BEAM] = { - .effect = EFFECT_SPEED_DOWN_HIT, + .effect = EFFECT_HIT, .power = 65, .type = TYPE_WATER, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SPD_MINUS_1, + .chance = 10, + }), }, [MOVE_AURORA_BEAM] = { - .effect = EFFECT_ATTACK_DOWN_HIT, + .effect = EFFECT_HIT, .power = 65, .type = TYPE_ICE, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_ATK_MINUS_1, + .chance = 10, + }), }, [MOVE_HYPER_BEAM] = { - .effect = EFFECT_RECHARGE, + .effect = EFFECT_HIT, .power = 150, .type = TYPE_NORMAL, .accuracy = 90, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .ignoresKingsRock = B_UPDATED_MOVE_FLAGS < GEN_3, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_RECHARGE, + .self = TRUE, + }), }, [MOVE_PECK] = @@ -1081,7 +1092,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FLYING, .accuracy = 100, .pp = 35, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -1095,7 +1105,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FLYING, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -1109,12 +1118,11 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = #else .pp = 25, #endif - .effect = EFFECT_RECOIL, + .effect = EFFECT_HIT, .power = 80, .type = TYPE_FIGHTING, .accuracy = 80, .recoil = 25, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -1128,7 +1136,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FIGHTING, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -1142,7 +1149,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FIGHTING, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_DEPENDS, .priority = -5, .category = BATTLE_CATEGORY_PHYSICAL, @@ -1161,7 +1167,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FIGHTING, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -1176,7 +1181,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -1194,7 +1198,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .power = 20, .type = TYPE_GRASS, .accuracy = 100, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -1213,7 +1216,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .power = 40, .type = TYPE_GRASS, .accuracy = 100, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -1228,7 +1230,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GRASS, .accuracy = 90, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -1251,7 +1252,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .power = 0, .type = TYPE_NORMAL, .accuracy = 0, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -1269,7 +1269,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .accuracy = 95, .criticalHitStage = 1, .pp = 25, - .secondaryEffectChance = 0, .target = MOVE_TARGET_BOTH, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -1283,7 +1282,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GRASS, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -1299,7 +1297,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_POISON, .accuracy = 75, .pp = 35, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -1315,7 +1312,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GRASS, .accuracy = 75, .pp = 30, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -1331,7 +1327,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GRASS, .accuracy = 75, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -1352,16 +1347,19 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .power = 70, .pp = 20, #endif - .effect = EFFECT_RAMPAGE, + .effect = EFFECT_HIT, .type = TYPE_GRASS, .accuracy = 100, - .secondaryEffectChance = 100, .target = MOVE_TARGET_RANDOM, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .makesContact = TRUE, .danceMove = TRUE, .instructBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_THRASH, + .self = TRUE, + }), }, [MOVE_STRING_SHOT] = @@ -1375,7 +1373,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_BUG, .accuracy = 95, .pp = 40, - .secondaryEffectChance = 0, .target = MOVE_TARGET_BOTH, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -1385,49 +1382,49 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_DRAGON_RAGE] = { - .effect = EFFECT_DRAGON_RAGE, + .effect = EFFECT_FIXED_DAMAGE_ARG, .power = 1, .type = TYPE_DRAGON, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .ignoresKingsRock = (B_UPDATED_MOVE_FLAGS == GEN_4) || (B_UPDATED_MOVE_FLAGS < GEN_3), + .argument = 40, }, [MOVE_FIRE_SPIN] = { - #if B_UPDATED_MOVE_DATA >= GEN_5 - .power = 35, - .accuracy = 85, - #else - .power = 15, - .accuracy = 70, - #endif - .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, .pp = 15, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .ignoresKingsRock = B_UPDATED_MOVE_FLAGS < GEN_3, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_WRAP, + }), }, [MOVE_THUNDER_SHOCK] = { - .effect = EFFECT_PARALYZE_HIT, + .effect = EFFECT_HIT, .power = 40, .type = TYPE_ELECTRIC, .accuracy = 100, .pp = 30, - .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_PARALYSIS, + .chance = 10, + }), }, [MOVE_THUNDERBOLT] = @@ -1437,15 +1434,18 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = #else .power = 95, #endif - .effect = EFFECT_PARALYZE_HIT, + .effect = EFFECT_HIT, .type = TYPE_ELECTRIC, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_PARALYSIS, + .chance = 10, + }), }, [MOVE_THUNDER_WAVE] = @@ -1459,7 +1459,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .power = 0, .type = TYPE_ELECTRIC, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -1478,12 +1477,15 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ELECTRIC, .accuracy = 70, .pp = 10, - .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, .damagesAirborne = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_PARALYSIS, + .chance = 30, + }), }, [MOVE_ROCK_THROW] = @@ -1493,7 +1495,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ROCK, .accuracy = 90, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -1506,7 +1507,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GROUND, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_FOES_AND_ALLY, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -1522,7 +1522,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GROUND, .accuracy = 30, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -1541,7 +1540,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GROUND, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -1555,16 +1553,11 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_TOXIC] = { - #if B_UPDATED_MOVE_DATA >= GEN_5 - .accuracy = 90, - #else - .accuracy = 85, - #endif .effect = EFFECT_TOXIC, .power = 0, .type = TYPE_POISON, + .accuracy = B_UPDATED_MOVE_DATA >= GEN_5 ? 90 : 85, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -1574,30 +1567,36 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_CONFUSION] = { - .effect = EFFECT_CONFUSE_HIT, + .effect = EFFECT_HIT, .power = 50, .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 25, - .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_CONFUSION, + .chance = 10, + }), }, [MOVE_PSYCHIC] = { - .effect = EFFECT_SPECIAL_DEFENSE_DOWN_HIT, + .effect = EFFECT_HIT, .power = 90, .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SP_DEF_MINUS_1, + .chance = 10, + }), }, [MOVE_HYPNOSIS] = @@ -1607,7 +1606,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_PSYCHIC, .accuracy = 60, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -1622,7 +1620,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 40, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -1639,7 +1636,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 30, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -1656,7 +1652,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 30, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 1, .category = BATTLE_CATEGORY_PHYSICAL, @@ -1670,7 +1665,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -1684,7 +1678,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = -6, .category = BATTLE_CATEGORY_STATUS, @@ -1700,7 +1693,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GHOST, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -1713,7 +1705,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -1735,7 +1726,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 85, .pp = 40, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -1752,7 +1742,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -1775,7 +1764,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .power = 0, .type = TYPE_NORMAL, .accuracy = 0, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -1793,7 +1781,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 30, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -1814,7 +1801,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .power = 0, .type = TYPE_NORMAL, .accuracy = 0, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -1831,7 +1817,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -1846,7 +1831,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GHOST, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -1861,7 +1845,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_WATER, .accuracy = 0, .pp = 40, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -1878,7 +1861,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 40, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -1899,7 +1881,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .power = 0, .type = TYPE_PSYCHIC, .accuracy = 0, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -1916,7 +1897,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 30, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -1933,7 +1913,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ICE, .accuracy = 0, .pp = 30, - .secondaryEffectChance = 0, .target = MOVE_TARGET_ALL_BATTLERS, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -1950,7 +1929,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -1967,7 +1945,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 30, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -1990,7 +1967,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .power = 1, .type = TYPE_NORMAL, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -2006,7 +1982,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_DEPENDS, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -2028,7 +2003,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FLYING, .accuracy = 0, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_DEPENDS, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -2049,7 +2023,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_FOES_AND_ALLY, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -2063,7 +2036,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 75, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -2077,16 +2049,19 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = #else .power = 20, #endif - .effect = EFFECT_PARALYZE_HIT, + .effect = EFFECT_HIT, .type = TYPE_GHOST, .accuracy = 100, .pp = 30, - .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_PARALYSIS, + .chance = 30, + }), }, [MOVE_SMOG] = @@ -2096,43 +2071,52 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = #else .power = 20, #endif - .effect = EFFECT_POISON_HIT, + .effect = EFFECT_HIT, .type = TYPE_POISON, .accuracy = 70, .pp = 20, - .secondaryEffectChance = 40, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_POISON, + .chance = 40, + }), }, [MOVE_SLUDGE] = { - .effect = EFFECT_POISON_HIT, + .effect = EFFECT_HIT, .power = 65, .type = TYPE_POISON, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_POISON, + .chance = 30, + }), }, [MOVE_BONE_CLUB] = { - .effect = EFFECT_FLINCH_HIT, + .effect = EFFECT_HIT, .power = 65, .type = TYPE_GROUND, .accuracy = 85, .pp = 20, - .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_FLINCH, + .chance = 10, + }), }, [MOVE_FIRE_BLAST] = @@ -2142,54 +2126,55 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = #else .power = 120, #endif - .effect = EFFECT_BURN_HIT, + .effect = EFFECT_HIT, .type = TYPE_FIRE, .accuracy = 85, .pp = 5, - .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_BURN, + .chance = 10, + }), }, [MOVE_WATERFALL] = { - #if B_UPDATED_MOVE_DATA >= GEN_4 - .effect = EFFECT_FLINCH_HIT, - #else - .effect = EFFECT_HIT, - #endif + .effect = EFFECT_HIT, .power = 80, .type = TYPE_WATER, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 20, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, - .sheerForceBoost = TRUE, + #if B_UPDATED_MOVE_DATA >= GEN_4 + .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_FLINCH, + .chance = 20, + }), + #endif }, [MOVE_CLAMP] = { - #if B_UPDATED_MOVE_DATA >= GEN_5 - .accuracy = 85, - .pp = 15, - #else - .accuracy = 75, - .pp = 10, - #endif - .effect = EFFECT_TRAP, + .effect = EFFECT_HIT, .power = 35, .type = TYPE_WATER, - .secondaryEffectChance = 100, + .accuracy = B_UPDATED_MOVE_DATA >= GEN_5 ? 85 : 75, + .pp = B_UPDATED_MOVE_DATA >= GEN_5 ? 15 : 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .ignoresKingsRock = B_UPDATED_MOVE_FLAGS < GEN_3, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_WRAP, + }), }, [MOVE_SWIFT] = @@ -2199,7 +2184,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_BOTH, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -2217,7 +2201,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .effect = EFFECT_SKULL_BASH, .type = TYPE_NORMAL, .accuracy = 100, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -2234,7 +2217,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -2242,17 +2224,20 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_CONSTRICT] = { - .effect = EFFECT_SPEED_DOWN_HIT, + .effect = EFFECT_HIT, .power = 10, .type = TYPE_NORMAL, .accuracy = 100, .pp = 35, - .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SPD_MINUS_1, + .chance = 10, + }), }, [MOVE_AMNESIA] = @@ -2262,7 +2247,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -2279,7 +2263,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_PSYCHIC, .accuracy = 80, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -2298,7 +2281,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .power = 0, .type = TYPE_NORMAL, .accuracy = 100, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -2324,7 +2306,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .effect = EFFECT_RECOIL_IF_MISS, .type = TYPE_FIGHTING, .accuracy = 90, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -2345,7 +2326,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .power = 0, .type = TYPE_NORMAL, .pp = 30, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -2360,7 +2340,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -2383,7 +2362,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .power = 0, .type = TYPE_POISON, .pp = 40, - .secondaryEffectChance = 0, .priority = 0, .category = BATTLE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_DEF_UP_1 }, @@ -2397,7 +2375,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 85, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -2416,7 +2393,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .effect = EFFECT_ABSORB, .type = TYPE_BUG, .accuracy = 100, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -2432,7 +2408,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 75, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -2445,17 +2420,20 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .effect = EFFECT_TWO_TURNS_ATTACK, .power = 140, .type = TYPE_FLYING, + .criticalHitStage = 1, .accuracy = 90, .pp = 5, - .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, - .argument = MOVE_EFFECT_FLINCH, .twoTurnMove = TRUE, .sheerForceBoost = TRUE, .sleepTalkBanned = TRUE, .instructBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_FLINCH, + .chance = 30, + }), }, [MOVE_TRANSFORM] = @@ -2465,7 +2443,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -2487,31 +2464,37 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = #else .power = 20, #endif - .effect = EFFECT_SPEED_DOWN_HIT, + .effect = EFFECT_HIT, .type = TYPE_WATER, .accuracy = 100, .pp = 30, - .secondaryEffectChance = 10, .target = MOVE_TARGET_BOTH, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SPD_MINUS_1, + .chance = 10, + }), }, [MOVE_DIZZY_PUNCH] = { - .effect = EFFECT_CONFUSE_HIT, + .effect = EFFECT_HIT, .power = 70, .type = TYPE_NORMAL, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 20, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .punchingMove = TRUE, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_CONFUSION, + .chance = 20, + }), }, [MOVE_SPORE] = @@ -2521,7 +2504,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GRASS, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -2541,7 +2523,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .power = 0, .type = TYPE_NORMAL, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -2560,7 +2541,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .power = 1, .type = TYPE_PSYCHIC, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -2573,7 +2553,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 40, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -2594,7 +2573,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .power = 0, .type = TYPE_POISON, .accuracy = 0, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -2620,7 +2598,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_WATER, .criticalHitStage = 1, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -2634,7 +2611,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_FOES_AND_ALLY, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -2648,7 +2624,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 80, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -2662,7 +2637,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GROUND, .accuracy = 90, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -2680,7 +2654,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .power = 0, .type = TYPE_PSYCHIC, .accuracy = 0, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -2693,32 +2666,38 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_ROCK_SLIDE] = { - .effect = EFFECT_FLINCH_HIT, + .effect = EFFECT_HIT, .power = 75, .type = TYPE_ROCK, .accuracy = 90, .pp = 10, - .secondaryEffectChance = 30, .target = MOVE_TARGET_BOTH, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_FLINCH, + .chance = 30, + }), }, [MOVE_HYPER_FANG] = { - .effect = EFFECT_FLINCH_HIT, + .effect = EFFECT_HIT, .power = 80, .type = TYPE_NORMAL, .accuracy = 90, .pp = 15, - .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .sheerForceBoost = TRUE, .bitingMove = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_FLINCH, + .chance = 10, + }), }, [MOVE_SHARPEN] = @@ -2728,7 +2707,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 30, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -2745,7 +2723,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 30, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -2757,16 +2734,19 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_TRI_ATTACK] = { - .effect = EFFECT_TRI_ATTACK, + .effect = EFFECT_HIT, .power = 80, .type = TYPE_NORMAL, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 20, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_TRI_ATTACK, + .chance = 20, + }), }, [MOVE_SUPER_FANG] = @@ -2776,7 +2756,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 90, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -2792,7 +2771,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .accuracy = 100, .criticalHitStage = 1, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -2807,7 +2785,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -2821,22 +2798,25 @@ 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, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_RECOIL_HP_25, + .self = TRUE, + }), #else + .effect = EFFECT_HIT, .accuracy = 100, - .effect = EFFECT_RECOIL, + .recoil = 25, #endif .power = 50, .type = TYPE_NORMAL, - .recoil = 25, .pp = 1, - .secondaryEffectChance = 0, .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, @@ -2855,7 +2835,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 1, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -2880,7 +2859,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FIGHTING, .accuracy = 90, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -2897,10 +2875,9 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .power = 40, .pp = 10, #endif - .effect = EFFECT_THIEF, + .effect = EFFECT_HIT, .type = TYPE_DARK, .accuracy = 100, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -2910,6 +2887,9 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .metronomeBanned = TRUE, .copycatBanned = TRUE, .assistBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_STEAL_ITEM, + }), }, [MOVE_SPIDER_WEB] = @@ -2919,7 +2899,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_BUG, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -2939,7 +2918,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .power = 0, .type = TYPE_NORMAL, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -2957,7 +2935,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .power = 0, .type = TYPE_GHOST, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -2967,18 +2944,21 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_FLAME_WHEEL] = { - .effect = EFFECT_BURN_HIT, + .effect = EFFECT_HIT, .power = 60, .type = TYPE_FIRE, .accuracy = 100, .pp = 25, - .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .sheerForceBoost = TRUE, .thawsUser = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_BURN, + .chance = 10, + }), }, [MOVE_SNORE] = @@ -2992,7 +2972,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -3000,6 +2979,10 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .sheerForceBoost = TRUE, .soundMove = TRUE, .metronomeBanned = B_UPDATED_MOVE_FLAGS >= GEN_5, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_FLINCH, + .chance = 30, + }), }, [MOVE_CURSE] = @@ -3013,7 +2996,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .power = 0, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -3030,7 +3012,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -3044,7 +3025,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 30, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -3062,7 +3042,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .accuracy = 95, .criticalHitStage = 1, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -3085,7 +3064,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .power = 0, .type = TYPE_GRASS, .pp = 40, - .secondaryEffectChance = 0, .priority = 0, .category = BATTLE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RESET_STATS }, @@ -3100,7 +3078,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FIGHTING, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -3114,7 +3091,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GHOST, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -3125,20 +3101,19 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_POWDER_SNOW] = { - #if B_USE_FROSTBITE == TRUE - .effect = EFFECT_FROSTBITE_HIT, - #else - .effect = EFFECT_FREEZE_HIT, - #endif + .effect = EFFECT_HIT, .power = 40, .type = TYPE_ICE, .accuracy = 100, .pp = 25, - .secondaryEffectChance = 10, .target = MOVE_TARGET_BOTH, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_FREEZE_OR_FROSTBITE, + .chance = 10, + }), }, [MOVE_PROTECT] = @@ -3153,7 +3128,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .category = BATTLE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RESET_STATS }, @@ -3170,7 +3144,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FIGHTING, .accuracy = 100, .pp = 30, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 1, .category = BATTLE_CATEGORY_PHYSICAL, @@ -3189,7 +3162,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .power = 0, .type = TYPE_NORMAL, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -3207,7 +3179,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_DARK, .accuracy = 0, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -3224,7 +3195,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .power = 0, .accuracy = 75, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -3239,7 +3209,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -3251,46 +3220,55 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_SLUDGE_BOMB] = { - .effect = EFFECT_POISON_HIT, + .effect = EFFECT_HIT, .power = 90, .type = TYPE_POISON, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, .ballisticMove = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_POISON, + .chance = 30, + }), }, [MOVE_MUD_SLAP] = { - .effect = EFFECT_ACCURACY_DOWN_HIT, + .effect = EFFECT_HIT, .power = 20, .type = TYPE_GROUND, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_ACC_MINUS_1, + .chance = 100, + }), }, [MOVE_OCTAZOOKA] = { - .effect = EFFECT_ACCURACY_DOWN_HIT, + .effect = EFFECT_HIT, .power = 65, .type = TYPE_WATER, .accuracy = 85, .pp = 10, - .secondaryEffectChance = 50, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, .ballisticMove = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_ACC_MINUS_1, + .chance = 50, + }), }, [MOVE_SPIKES] = @@ -3300,7 +3278,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GROUND, .accuracy = 0, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_OPPONENTS_FIELD, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -3319,16 +3296,19 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = #else .power = 100, #endif - .effect = EFFECT_PARALYZE_HIT, + .effect = EFFECT_HIT, .type = TYPE_ELECTRIC, .accuracy = 50, .pp = 5, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, .ballisticMove = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_PARALYSIS, + .chance = 100, + }), }, [MOVE_FORESIGHT] = @@ -3342,7 +3322,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .power = 0, .type = TYPE_NORMAL, .pp = 40, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -3358,7 +3337,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GHOST, .accuracy = 0, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -3378,7 +3356,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_ALL_BATTLERS, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -3391,17 +3368,20 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_ICY_WIND] = { - .effect = EFFECT_SPEED_DOWN_HIT, + .effect = EFFECT_HIT, .power = 55, .type = TYPE_ICE, .accuracy = 95, .pp = 15, - .secondaryEffectChance = 100, .target = MOVE_TARGET_BOTH, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, .windMove = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SPD_MINUS_1, + .chance = 100, + }), }, [MOVE_DETECT] = @@ -3416,7 +3396,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FIGHTING, .accuracy = 0, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .category = BATTLE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_EVSN_UP_1 }, @@ -3439,7 +3418,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .power = 25, .type = TYPE_GROUND, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -3456,7 +3434,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .power = 0, .type = TYPE_NORMAL, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -3475,15 +3452,18 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .power = 90, .pp = 15, #endif - .effect = EFFECT_RAMPAGE, + .effect = EFFECT_HIT, .type = TYPE_DRAGON, .accuracy = 100, - .secondaryEffectChance = 100, .target = MOVE_TARGET_RANDOM, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .instructBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_THRASH, + .self = TRUE, + }), }, [MOVE_SANDSTORM] = @@ -3493,7 +3473,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ROCK, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_ALL_BATTLERS, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -3518,7 +3497,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .effect = EFFECT_ABSORB, .type = TYPE_GRASS, .accuracy = 100, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -3538,7 +3516,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .category = BATTLE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RESET_STATS }, @@ -3561,7 +3538,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .power = 0, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -3576,7 +3552,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ROCK, .accuracy = 90, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -3592,7 +3567,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 40, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -3601,16 +3575,11 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_SWAGGER] = { - #if B_UPDATED_MOVE_DATA >= GEN_7 - .accuracy = 85, - #else - .accuracy = 90, - #endif .effect = EFFECT_SWAGGER, .power = 0, .type = TYPE_NORMAL, + .accuracy = B_UPDATED_MOVE_DATA >= GEN_7 ? 85 : 90, .pp = 15, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -3629,7 +3598,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .power = 0, .type = TYPE_NORMAL, .accuracy = 0, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -3642,17 +3610,20 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_SPARK] = { - .effect = EFFECT_PARALYZE_HIT, + .effect = EFFECT_HIT, .power = 65, .type = TYPE_ELECTRIC, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_PARALYSIS, + .chance = 30, + }), }, [MOVE_FURY_CUTTER] = @@ -3668,7 +3639,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_BUG, .accuracy = 95, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -3678,17 +3648,21 @@ 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, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_DEF_PLUS_1, + .self = TRUE, + .chance = 10, + }), }, [MOVE_MEAN_LOOK] = @@ -3698,7 +3672,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -3714,7 +3687,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -3730,7 +3702,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_DEPENDS, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -3753,7 +3724,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER | MOVE_TARGET_ALLY, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -3772,7 +3742,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -3786,7 +3755,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 90, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -3800,7 +3768,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -3814,7 +3781,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 25, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -3831,7 +3797,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -3840,17 +3805,20 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_SACRED_FIRE] = { - .effect = EFFECT_BURN_HIT, + .effect = EFFECT_HIT, .power = 100, .type = TYPE_FIRE, .accuracy = 95, .pp = 5, - .secondaryEffectChance = 50, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .sheerForceBoost = TRUE, .thawsUser = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_BURN, + .chance = 50, + }), }, [MOVE_MAGNITUDE] = @@ -3860,7 +3828,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GROUND, .accuracy = 100, .pp = 30, - .secondaryEffectChance = 0, .target = MOVE_TARGET_FOES_AND_ALLY, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -3870,18 +3837,21 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_DYNAMIC_PUNCH] = { - .effect = EFFECT_CONFUSE_HIT, + .effect = EFFECT_HIT, .power = 100, .type = TYPE_FIGHTING, .accuracy = 50, .pp = 5, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .punchingMove = TRUE, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_CONFUSION, + .chance = 100, + }), }, [MOVE_MEGAHORN] = @@ -3891,7 +3861,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_BUG, .accuracy = 85, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -3900,17 +3869,20 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_DRAGON_BREATH] = { - .effect = EFFECT_PARALYZE_HIT, + .effect = EFFECT_HIT, .power = 60, .type = TYPE_DRAGON, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, .ignoresKingsRock = B_UPDATED_MOVE_FLAGS < GEN_3, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_PARALYSIS, + .chance = 30, + }), }, [MOVE_BATON_PASS] = @@ -3920,7 +3892,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 40, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -3936,7 +3907,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -3953,7 +3923,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_DARK, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -3963,20 +3932,27 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_RAPID_SPIN] = { - #if B_UPDATED_MOVE_DATA >= GEN_8 - .power = 50, - #else - .power = 20, - #endif - .effect = EFFECT_RAPID_SPIN, + .effect = EFFECT_HIT, + .power = B_UPDATED_MOVE_DATA >= GEN_8 ? 50 : 20, .type = TYPE_NORMAL, .accuracy = 100, .pp = 40, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_RAPIDSPIN, + .self = TRUE, + } + #if B_SPEED_BUFFING_RAPID_SPIN >= GEN_8 + ,{ + .moveEffect = MOVE_EFFECT_SPD_PLUS_1, + .self = TRUE, + .chance = 100, + } + #endif + ), }, [MOVE_SWEET_SCENT] = @@ -3990,7 +3966,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_BOTH, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -4000,42 +3975,48 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_IRON_TAIL] = { - .effect = EFFECT_DEFENSE_DOWN_HIT, + .effect = EFFECT_HIT, .power = 100, .type = TYPE_STEEL, .accuracy = 75, .pp = 15, - .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_DEF_MINUS_1, + .chance = 30, + }), }, [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, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_ATK_PLUS_1, + .self = TRUE, + .chance = 10, + }), }, [MOVE_VITAL_THROW] = { - .effect = EFFECT_VITAL_THROW, + .effect = EFFECT_HIT, .power = 70, .type = TYPE_FIGHTING, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = -1, .category = BATTLE_CATEGORY_PHYSICAL, @@ -4049,7 +4030,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -4067,7 +4047,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GRASS, .accuracy = 0, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -4089,7 +4068,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .power = 0, .accuracy = 0, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -4107,7 +4085,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -4121,7 +4098,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .accuracy = 80, .criticalHitStage = 1, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -4130,18 +4106,21 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_TWISTER] = { - .effect = EFFECT_FLINCH_HIT, + .effect = EFFECT_HIT, .power = 40, .type = TYPE_DRAGON, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 20, .target = MOVE_TARGET_BOTH, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, .damagesAirborneDoubleDamage = TRUE, .windMove = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_FLINCH, + .chance = 20, + }), }, [MOVE_RAIN_DANCE] = @@ -4151,7 +4130,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_WATER, .accuracy = 0, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_ALL_BATTLERS, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -4167,7 +4145,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FIRE, .accuracy = 0, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_ALL_BATTLERS, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -4178,22 +4155,30 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_CRUNCH] = { - #if B_UPDATED_MOVE_DATA >= GEN_4 - .effect = EFFECT_DEFENSE_DOWN_HIT, - #else - .effect = EFFECT_SPECIAL_DEFENSE_DOWN_HIT, - #endif + .effect = EFFECT_HIT, .power = 80, .type = TYPE_DARK, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 20, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .sheerForceBoost = TRUE, .bitingMove = TRUE, + #if B_UPDATED_MOVE_DATA >= GEN_4 + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_DEF_MINUS_1, + .chance = 10, + } + ), + #else + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SP_DEF_MINUS_1, + .chance = 10, + } + ), + #endif }, [MOVE_MIRROR_COAT] = @@ -4203,7 +4188,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_DEPENDS, .priority = -5, .category = BATTLE_CATEGORY_SPECIAL, @@ -4220,7 +4204,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -4243,7 +4226,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -4251,34 +4233,39 @@ 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, .category = BATTLE_CATEGORY_SPECIAL, + .makesContact = B_UPDATED_MOVE_DATA < GEN_4, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_ALL_STATS_UP, + .self = TRUE, + .chance = 10, + }), }, [MOVE_SHADOW_BALL] = { - .effect = EFFECT_SPECIAL_DEFENSE_DOWN_HIT, + .effect = EFFECT_HIT, .power = 80, .type = TYPE_GHOST, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 20, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, .ballisticMove = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SP_DEF_MINUS_1, + .chance = 20, + }), }, [MOVE_FUTURE_SIGHT] = @@ -4298,7 +4285,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = #endif .effect = EFFECT_FUTURE_SIGHT, .type = TYPE_PSYCHIC, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -4313,35 +4299,35 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = #else .power = 20, #endif - .effect = EFFECT_DEFENSE_DOWN_HIT, + .effect = EFFECT_HIT, .type = TYPE_FIGHTING, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 50, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_DEF_MINUS_1, + .chance = 50, + }), }, [MOVE_WHIRLPOOL] = { - #if B_UPDATED_MOVE_DATA >= GEN_5 - .power = 35, - .accuracy = 85, - #else - .power = 15, - .accuracy = 70, - #endif - .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, .pp = 15, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .damagesUnderwater = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_WRAP, + }), }, [MOVE_BEAT_UP] = @@ -4355,7 +4341,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_DARK, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -4377,24 +4362,22 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .category = BATTLE_CATEGORY_PHYSICAL, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_FLINCH, + .chance = 100, + }), }, [MOVE_UPROAR] = { - #if B_UPDATED_MOVE_DATA >= GEN_5 - .power = 90, - #else - .power = 50, - #endif .effect = EFFECT_UPROAR, + .power = B_UPDATED_MOVE_DATA >= GEN_5 ? 90 : 50, .type = TYPE_NORMAL, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_RANDOM, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -4402,6 +4385,10 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .soundMove = TRUE, .sleepTalkBanned = TRUE, .instructBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_UPROAR, + .self = TRUE, + }), }, [MOVE_STOCKPILE] = @@ -4415,7 +4402,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .power = 0, .type = TYPE_NORMAL, .accuracy = 0, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -4436,7 +4422,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -4450,7 +4435,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -4468,16 +4452,19 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = #else .power = 100, #endif - .effect = EFFECT_BURN_HIT, + .effect = EFFECT_HIT, .type = TYPE_FIRE, .accuracy = 90, .pp = 10, - .secondaryEffectChance = 10, .target = MOVE_TARGET_BOTH, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, .windMove = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_BURN, + .chance = 10, + }), }, [MOVE_HAIL] = @@ -4487,7 +4474,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ICE, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_ALL_BATTLERS, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -4503,7 +4489,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_DARK, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -4518,7 +4503,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_DARK, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -4537,7 +4521,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .power = 0, .type = TYPE_FIRE, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -4552,7 +4535,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_DARK, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -4566,7 +4548,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -4580,7 +4561,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FIGHTING, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = -3, .category = BATTLE_CATEGORY_PHYSICAL, @@ -4597,37 +4577,30 @@ 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, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .argument = STATUS1_PARALYSIS, .makesContact = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = 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, - .secondaryEffectChance = 0, .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, @@ -4644,7 +4617,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_DEPENDS, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -4664,7 +4636,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ELECTRIC, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -4681,7 +4652,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_DARK, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -4702,7 +4672,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 0, .priority = 5, .category = BATTLE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RESET_STATS }, @@ -4721,7 +4690,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -4738,7 +4706,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -4755,7 +4722,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -4773,7 +4739,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_DEPENDS, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -4795,7 +4760,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GRASS, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -4808,16 +4772,19 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_SUPERPOWER] = { - .effect = EFFECT_SUPERPOWER, + .effect = EFFECT_HIT, .power = 120, .type = TYPE_FIGHTING, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_ATK_DEF_DOWN, + .self = TRUE, + }), }, [MOVE_MAGIC_COAT] = @@ -4827,7 +4794,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_DEPENDS, .priority = 4, .category = BATTLE_CATEGORY_STATUS, @@ -4843,7 +4809,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -4860,7 +4825,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FIGHTING, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = -4, .category = BATTLE_CATEGORY_PHYSICAL, @@ -4874,7 +4838,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FIGHTING, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -4888,7 +4851,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -4898,20 +4860,18 @@ 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, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_KNOCK_OFF, + }), }, [MOVE_ENDEAVOR] = @@ -4921,7 +4881,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -4936,7 +4895,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FIRE, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_BOTH, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -4949,7 +4907,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -4964,7 +4921,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -4983,7 +4939,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -5000,7 +4955,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GHOST, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -5017,7 +4971,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_DARK, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_DEPENDS, .priority = 4, .category = BATTLE_CATEGORY_STATUS, @@ -5031,30 +4984,28 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_SECRET_POWER] = { - .effect = EFFECT_SECRET_POWER, + .effect = EFFECT_HIT, .power = 70, .type = TYPE_NORMAL, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SECRET_POWER, + .chance = 30, + }), }, [MOVE_DIVE] = { - #if B_UPDATED_MOVE_DATA >= GEN_4 - .power = 80, - #else - .power = 60, - #endif .effect = EFFECT_SEMI_INVULNERABLE, + .power = B_UPDATED_MOVE_DATA >= GEN_4 ? 80 : 60, .type = TYPE_WATER, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -5073,7 +5024,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FIGHTING, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -5087,7 +5037,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -5108,7 +5057,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_BUG, .accuracy = 0, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -5120,31 +5068,37 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_LUSTER_PURGE] = { - .effect = EFFECT_SPECIAL_DEFENSE_DOWN_HIT, + .effect = EFFECT_HIT, .power = (B_UPDATED_MOVE_DATA >= GEN_9) ? 95 : 70, .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 50, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SP_DEF_MINUS_1, + .chance = 50, + }), }, [MOVE_MIST_BALL] = { - .effect = EFFECT_SPECIAL_ATTACK_DOWN_HIT, + .effect = EFFECT_HIT, .power = (B_UPDATED_MOVE_DATA >= GEN_9) ? 95 : 70, .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 50, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, .ballisticMove = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SP_ATK_MINUS_1, + .chance = 50, + }), }, [MOVE_FEATHER_DANCE] = @@ -5154,7 +5108,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FLYING, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -5170,7 +5123,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_FOES_AND_ALLY, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -5181,18 +5133,21 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_BLAZE_KICK] = { - .effect = EFFECT_BURN_HIT, + .effect = EFFECT_HIT, .power = 85, .type = TYPE_FIRE, .accuracy = 90, .criticalHitStage = 1, .pp = 10, - .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_BURN, + .chance = 10, + }), }, [MOVE_MUD_SPORT] = @@ -5202,7 +5157,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GROUND, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_ALL_BATTLERS, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -5219,7 +5173,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ICE, .accuracy = 90, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -5231,18 +5184,21 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_NEEDLE_ARM] = { - .effect = EFFECT_FLINCH_HIT, + .effect = EFFECT_HIT, .power = 60, .type = TYPE_GRASS, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .sheerForceBoost = TRUE, .minimizeDoubleDamage = B_UPDATED_MOVE_FLAGS < GEN_4, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_FLINCH, + .chance = 30, + }), }, [MOVE_SLACK_OFF] = @@ -5256,7 +5212,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .power = 0, .type = TYPE_NORMAL, .accuracy = 100, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -5274,7 +5229,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_BOTH, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -5284,12 +5238,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_POISON_FANG] = { - #if B_UPDATED_MOVE_DATA >= GEN_6 - .secondaryEffectChance = 50, - #else - .secondaryEffectChance = 30, - #endif - .effect = EFFECT_POISON_FANG, + .effect = EFFECT_HIT, .power = 50, .type = TYPE_POISON, .accuracy = 100, @@ -5300,47 +5249,60 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .makesContact = TRUE, .sheerForceBoost = TRUE, .bitingMove = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_TOXIC, + .chance = B_UPDATED_MOVE_DATA >= GEN_6 ? 50 : 30, + }), }, [MOVE_CRUSH_CLAW] = { - .effect = EFFECT_DEFENSE_DOWN_HIT, + .effect = EFFECT_HIT, .power = 75, .type = TYPE_NORMAL, .accuracy = 95, .pp = 10, - .secondaryEffectChance = 50, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_DEF_MINUS_1, + .chance = 50, + }), }, [MOVE_BLAST_BURN] = { - .effect = EFFECT_RECHARGE, + .effect = EFFECT_HIT, .power = 150, .type = TYPE_FIRE, .accuracy = 90, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_RECHARGE, + .self = TRUE, + }), }, [MOVE_HYDRO_CANNON] = { - .effect = EFFECT_RECHARGE, + .effect = EFFECT_HIT, .power = 150, .type = TYPE_WATER, .accuracy = 90, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_RECHARGE, + .self = TRUE, + }), }, [MOVE_METEOR_MASH] = @@ -5352,32 +5314,39 @@ 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, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .punchingMove = TRUE, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_ATK_PLUS_1, + .self = TRUE, + .chance = 20, + }), }, [MOVE_ASTONISH] = { - .effect = EFFECT_FLINCH_HIT, + .effect = EFFECT_HIT, .power = 30, .type = TYPE_GHOST, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .sheerForceBoost = TRUE, .minimizeDoubleDamage = B_UPDATED_MOVE_FLAGS < GEN_4, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_FLINCH, + .chance = 30, + }), }, [MOVE_WEATHER_BALL] = @@ -5387,7 +5356,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -5401,7 +5369,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GRASS, .accuracy = 0, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER | MOVE_TARGET_ALLY, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -5418,7 +5385,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_DARK, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -5438,7 +5404,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .accuracy = 95, .criticalHitStage = 1, .pp = 25, - .secondaryEffectChance = 0, .target = MOVE_TARGET_BOTH, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -5448,22 +5413,19 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_OVERHEAT] = { - #if B_UPDATED_MOVE_DATA >= GEN_6 - .power = 130, - #elif B_UPDATED_MOVE_DATA >= GEN_4 - .power = 140, - #else - .power = 140, - .makesContact = TRUE, - #endif - .effect = EFFECT_OVERHEAT, + .effect = EFFECT_HIT, + .power = B_UPDATED_MOVE_DATA >= GEN_6 ? 130 : 140, .type = TYPE_FIRE, .accuracy = 90, .pp = 5, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, + .makesContact = B_UPDATED_MOVE_DATA < GEN_4, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SP_ATK_TWO_DOWN, + .self = TRUE, + }), }, [MOVE_ODOR_SLEUTH] = @@ -5477,7 +5439,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .power = 0, .type = TYPE_NORMAL, .pp = 40, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -5497,28 +5458,35 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .accuracy = 80, .pp = 10, #endif - .effect = EFFECT_SPEED_DOWN_HIT, + .effect = EFFECT_HIT, .type = TYPE_ROCK, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SPD_MINUS_1, + .chance = 100, + }), }, [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, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, .windMove = B_EXTRAPOLATED_MOVE_FLAGS, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_ALL_STATS_UP, + .self = TRUE, + .chance = 10, + }), }, [MOVE_METAL_SOUND] = @@ -5528,7 +5496,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_STEEL, .accuracy = 85, .pp = 40, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -5545,7 +5512,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GRASS, .accuracy = 55, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -5562,7 +5528,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -5577,7 +5542,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -5594,7 +5558,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_WATER, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_BOTH, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -5602,16 +5565,19 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_SIGNAL_BEAM] = { - .effect = EFFECT_CONFUSE_HIT, + .effect = EFFECT_HIT, .power = 75, .type = TYPE_BUG, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_CONFUSION, + .chance = 10, + }), }, [MOVE_SHADOW_PUNCH] = @@ -5621,7 +5587,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GHOST, .accuracy = 0, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -5636,16 +5601,19 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = #else .pp = 30, #endif - .effect = EFFECT_FLINCH_HIT, + .effect = EFFECT_HIT, .power = 80, .type = TYPE_PSYCHIC, .accuracy = 100, - .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, .minimizeDoubleDamage = B_UPDATED_MOVE_FLAGS < GEN_4, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_FLINCH, + .chance = 10, + }), }, [MOVE_SKY_UPPERCUT] = @@ -5655,7 +5623,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FIGHTING, .accuracy = 90, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -5666,20 +5633,17 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_SAND_TOMB] = { - #if B_UPDATED_MOVE_DATA >= GEN_5 - .power = 35, - .accuracy = 85, - #else - .power = 15, - .accuracy = 70, - #endif - .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, .pp = 15, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_WRAP, + }), }, [MOVE_SHEER_COLD] = @@ -5689,7 +5653,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ICE, .accuracy = 30, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -5702,16 +5665,19 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = #else .power = 95, #endif - .effect = EFFECT_ACCURACY_DOWN_HIT, + .effect = EFFECT_HIT, .type = TYPE_WATER, .accuracy = 85, .pp = 10, - .secondaryEffectChance = 30, .target = MOVE_TARGET_BOTH, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, .skyBattleBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_ACC_MINUS_1, + .chance = 30, + }), }, [MOVE_BULLET_SEED] = @@ -5725,7 +5691,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GRASS, .accuracy = 100, .pp = 30, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -5739,7 +5704,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FLYING, .accuracy = 0, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -5758,7 +5722,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ICE, .accuracy = 100, .pp = 30, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -5771,7 +5734,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_STEEL, .accuracy = 0, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -5788,7 +5750,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -5808,7 +5769,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 40, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -5826,7 +5786,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_DRAGON, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -5835,16 +5794,19 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_FRENZY_PLANT] = { - .effect = EFFECT_RECHARGE, + .effect = EFFECT_HIT, .power = 150, .type = TYPE_GRASS, .accuracy = 90, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .skyBattleBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_RECHARGE, + .self = TRUE, + }), }, [MOVE_BULK_UP] = @@ -5854,7 +5816,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FIGHTING, .accuracy = 0, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -5871,11 +5832,9 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FLYING, .accuracy = 85, .pp = 5, - .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, - .argument = MOVE_EFFECT_PARALYSIS, .twoTurnMove = TRUE, .makesContact = TRUE, .sheerForceBoost = TRUE, @@ -5883,86 +5842,87 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .sleepTalkBanned = TRUE, .instructBanned = TRUE, .assistBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_PARALYSIS, + .chance = 30, + }), }, [MOVE_MUD_SHOT] = { - .effect = EFFECT_SPEED_DOWN_HIT, + .effect = EFFECT_HIT, .power = 55, .type = TYPE_GROUND, .accuracy = 95, .pp = 15, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SPD_MINUS_1, + .chance = 100, + }), }, [MOVE_POISON_TAIL] = { - .effect = EFFECT_POISON_HIT, + .effect = EFFECT_HIT, .power = 50, .type = TYPE_POISON, .accuracy = 100, .criticalHitStage = 1, .pp = 25, - .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_POISON, + .chance = 10, + }), }, [MOVE_COVET] = { - #if B_UPDATED_MOVE_DATA >= GEN_6 - .power = 60, - .pp = 25, - .makesContact = TRUE, - #elif B_UPDATED_MOVE_DATA == GEN_5 - .power = 60, - .pp = 40, - .makesContact = TRUE, - #elif B_UPDATED_MOVE_DATA == GEN_4 - .power = 40, - .pp = 40, - .makesContact = TRUE, - #else - .power = 40, - .pp = 40, - #endif - .effect = EFFECT_THIEF, + .effect = EFFECT_HIT, + .power = B_UPDATED_MOVE_DATA >= GEN_5 ? 60 : 40, .type = TYPE_NORMAL, .accuracy = 100, - .secondaryEffectChance = 100, + .pp = B_UPDATED_MOVE_DATA >= GEN_6 ? 25 : 40, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, + .makesContact = B_UPDATED_MOVE_DATA >= GEN_4, .meFirstBanned = TRUE, .metronomeBanned = TRUE, .copycatBanned = TRUE, .assistBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_STEAL_ITEM, + }), }, [MOVE_VOLT_TACKLE] = { - #if B_UPDATED_MOVE_DATA >= GEN_4 - .argument = STATUS1_PARALYSIS, - #endif - .effect = EFFECT_RECOIL, + .effect = EFFECT_HIT, .power = 120, .type = TYPE_ELECTRIC, .accuracy = 100, .recoil = 33, .pp = 15, - .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, - .sheerForceBoost = TRUE, + #if B_UPDATED_MOVE_DATA >= GEN_4 + .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_PARALYSIS, + .chance = 10, + }), + #endif }, [MOVE_MAGICAL_LEAF] = @@ -5972,7 +5932,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GRASS, .accuracy = 0, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -5985,7 +5944,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_WATER, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_ALL_BATTLERS, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -6002,7 +5960,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -6024,7 +5981,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .accuracy = 100, .criticalHitStage = 1, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -6039,7 +5995,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_DRAGON, .accuracy = 0, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -6061,7 +6016,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .power = 25, .type = TYPE_ROCK, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -6075,7 +6029,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ELECTRIC, .accuracy = 0, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -6083,17 +6036,20 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_WATER_PULSE] = { - .effect = EFFECT_CONFUSE_HIT, + .effect = EFFECT_HIT, .power = 60, .type = TYPE_WATER, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 20, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, .pulseMove = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_CONFUSION, + .chance = 20, + }), }, [MOVE_DOOM_DESIRE] = @@ -6108,7 +6064,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .effect = EFFECT_FUTURE_SIGHT, .type = TYPE_STEEL, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -6118,15 +6073,18 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_PSYCHO_BOOST] = { - .effect = EFFECT_OVERHEAT, + .effect = EFFECT_HIT, .power = 140, .type = TYPE_PSYCHIC, .accuracy = 90, .pp = 5, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SP_ATK_TWO_DOWN, + .self = TRUE, + }), }, [MOVE_ROOST] = @@ -6140,7 +6098,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .power = 0, .type = TYPE_FLYING, .accuracy = 0, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -6158,7 +6115,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_ALL_BATTLERS, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -6175,7 +6131,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 40, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -6186,36 +6141,37 @@ 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, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .argument = STATUS1_SLEEP, .makesContact = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_REMOVE_STATUS, + }), }, [MOVE_HAMMER_ARM] = { - .effect = EFFECT_HAMMER_ARM, + .effect = EFFECT_HIT, .power = 100, .type = TYPE_FIGHTING, .accuracy = 90, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .punchingMove = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SPD_MINUS_1, + .self = TRUE, + }), }, [MOVE_GYRO_BALL] = @@ -6225,7 +6181,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_STEEL, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -6240,7 +6195,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -6257,7 +6211,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_WATER, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -6270,7 +6223,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -6278,16 +6230,11 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_FEINT] = { - #if B_UPDATED_MOVE_DATA >= GEN_5 - .power = 30, - #else - .power = 50, - #endif - .effect = EFFECT_FEINT, + .effect = EFFECT_HIT, + .power = B_UPDATED_MOVE_DATA >= GEN_5 ? 30 : 50, .type = TYPE_NORMAL, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 2, .category = BATTLE_CATEGORY_PHYSICAL, @@ -6296,20 +6243,25 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .metronomeBanned = TRUE, .copycatBanned = TRUE, .assistBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_FEINT, + }), }, [MOVE_PLUCK] = { - .effect = EFFECT_BUG_BITE, + .effect = EFFECT_HIT, .power = 60, .type = TYPE_FLYING, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_BUG_BITE, + }), }, [MOVE_TAILWIND] = @@ -6323,7 +6275,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .power = 0, .type = TYPE_FLYING, .accuracy = 0, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -6341,7 +6292,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 30, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER | MOVE_TARGET_ALLY, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -6358,7 +6308,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_STEEL, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_DEPENDS, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -6372,7 +6321,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_BUG, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -6381,16 +6329,19 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_CLOSE_COMBAT] = { - .effect = EFFECT_CLOSE_COMBAT, + .effect = EFFECT_HIT, .power = 120, .type = TYPE_FIGHTING, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_DEF_SPDEF_DOWN, + .self = TRUE, + }), }, [MOVE_PAYBACK] = @@ -6400,7 +6351,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_DARK, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -6418,7 +6368,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_DARK, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -6432,7 +6381,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_DARK, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -6447,7 +6395,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_DARK, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -6465,7 +6412,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .power = 0, .type = TYPE_PSYCHIC, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -6479,7 +6425,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -6493,7 +6438,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_BOTH, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -6508,7 +6452,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -6522,7 +6465,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -6539,7 +6481,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_POISON, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -6554,7 +6495,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 30, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -6571,7 +6511,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -6595,7 +6534,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_DEPENDS, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -6618,7 +6556,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -6633,7 +6570,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -6648,7 +6584,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_DARK, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -6666,7 +6601,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -6680,7 +6614,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GRASS, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -6699,7 +6632,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_DARK, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 1, .category = BATTLE_CATEGORY_PHYSICAL, @@ -6713,7 +6645,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_POISON, .accuracy = 0, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_OPPONENTS_FIELD, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -6732,7 +6663,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -6747,7 +6677,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_WATER, .accuracy = 0, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -6764,7 +6693,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ELECTRIC, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -6777,13 +6705,12 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_FLARE_BLITZ] = { - .effect = EFFECT_RECOIL, + .effect = EFFECT_HIT, .power = 120, .type = TYPE_FIRE, .accuracy = 100, .recoil = 33, .pp = 15, - .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -6791,21 +6718,28 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .makesContact = TRUE, .sheerForceBoost = TRUE, .thawsUser = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_BURN, + .chance = 10, + }), }, [MOVE_FORCE_PALM] = { - .effect = EFFECT_PARALYZE_HIT, + .effect = EFFECT_HIT, .power = 60, .type = TYPE_FIGHTING, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_PARALYSIS, + .chance = 30, + }), }, [MOVE_AURA_SPHERE] = @@ -6819,7 +6753,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FIGHTING, .accuracy = 0, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -6834,7 +6767,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ROCK, .accuracy = 0, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -6846,32 +6778,38 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_POISON_JAB] = { - .effect = EFFECT_POISON_HIT, + .effect = EFFECT_HIT, .power = 80, .type = TYPE_POISON, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_POISON, + .chance = 30, + }), }, [MOVE_DARK_PULSE] = { - .effect = EFFECT_FLINCH_HIT, + .effect = EFFECT_HIT, .power = 80, .type = TYPE_DARK, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 20, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, .pulseMove = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_FLINCH, + .chance = 20, + }), }, [MOVE_NIGHT_SLASH] = @@ -6882,7 +6820,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .accuracy = 100, .criticalHitStage = 1, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -6897,7 +6834,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_WATER, .accuracy = 90, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -6911,7 +6847,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GRASS, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -6925,16 +6860,19 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = #else .pp = 20, #endif - .effect = EFFECT_FLINCH_HIT, + .effect = EFFECT_HIT, .power = 75, .type = TYPE_FLYING, .accuracy = 95, - .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, .slicingMove = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_FLINCH, + .chance = 30, + }), }, [MOVE_X_SCISSOR] = @@ -6944,7 +6882,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_BUG, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -6954,18 +6891,21 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_BUG_BUZZ] = { - .effect = EFFECT_SPECIAL_DEFENSE_DOWN_HIT, + .effect = EFFECT_HIT, .power = 90, .type = TYPE_BUG, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, .soundMove = TRUE, .ignoresSubstitute = B_UPDATED_MOVE_FLAGS >= GEN_6, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SP_DEF_MINUS_1, + .chance = 10, + }), }, [MOVE_DRAGON_PULSE] = @@ -6979,7 +6919,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_DRAGON, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -6988,18 +6927,21 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_DRAGON_RUSH] = { - .effect = EFFECT_FLINCH_HIT, + .effect = EFFECT_HIT, .power = 100, .type = TYPE_DRAGON, .accuracy = 75, .pp = 10, - .secondaryEffectChance = 20, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .sheerForceBoost = TRUE, .minimizeDoubleDamage = B_UPDATED_MOVE_FLAGS >= GEN_6, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_FLINCH, + .chance = 20, + }), }, [MOVE_POWER_GEM] = @@ -7013,7 +6955,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ROCK, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -7031,7 +6972,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .effect = EFFECT_ABSORB, .type = TYPE_FIGHTING, .accuracy = 100, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -7047,7 +6987,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FIGHTING, .accuracy = 100, .pp = 30, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 1, .category = BATTLE_CATEGORY_SPECIAL, @@ -7055,17 +6994,20 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_FOCUS_BLAST] = { - .effect = EFFECT_SPECIAL_DEFENSE_DOWN_HIT, + .effect = EFFECT_HIT, .power = 120, .type = TYPE_FIGHTING, .accuracy = 70, .pp = 5, - .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, .ballisticMove = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SP_DEF_MINUS_1, + .chance = 10, + }), }, [MOVE_ENERGY_BALL] = @@ -7075,27 +7017,29 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = #else .power = 80, #endif - .effect = EFFECT_SPECIAL_DEFENSE_DOWN_HIT, + .effect = EFFECT_HIT, .type = TYPE_GRASS, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, .ballisticMove = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SP_DEF_MINUS_1, + .chance = 10, + }), }, [MOVE_BRAVE_BIRD] = { - .effect = EFFECT_RECOIL, + .effect = EFFECT_HIT, .power = 120, .type = TYPE_FLYING, .accuracy = 100, .recoil = 33, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -7104,17 +7048,20 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_EARTH_POWER] = { - .effect = EFFECT_SPECIAL_DEFENSE_DOWN_HIT, + .effect = EFFECT_HIT, .power = 90, .type = TYPE_GROUND, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, .skyBattleBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SP_DEF_MINUS_1, + .chance = 10, + }), }, [MOVE_SWITCHEROO] = @@ -7124,7 +7071,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_DARK, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -7136,16 +7082,19 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_GIGA_IMPACT] = { - .effect = EFFECT_RECHARGE, + .effect = EFFECT_HIT, .power = 150, .type = TYPE_NORMAL, .accuracy = 90, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_RECHARGE, + .self = TRUE, + }), }, [MOVE_NASTY_PLOT] = @@ -7155,7 +7104,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_DARK, .accuracy = 0, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -7172,7 +7120,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_STEEL, .accuracy = 100, .pp = 30, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 1, .category = BATTLE_CATEGORY_PHYSICAL, @@ -7187,7 +7134,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ICE, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_BOTH, .priority = -4, .category = BATTLE_CATEGORY_PHYSICAL, @@ -7201,7 +7147,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ICE, .accuracy = 100, .pp = 30, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 1, .category = BATTLE_CATEGORY_PHYSICAL, @@ -7215,7 +7160,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .accuracy = 100, .criticalHitStage = 1, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -7224,12 +7168,11 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_THUNDER_FANG] = { - .effect = EFFECT_FLINCH_STATUS, + .effect = EFFECT_HIT, .power = 65, .type = TYPE_ELECTRIC, .accuracy = 95, .pp = 15, - .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -7237,37 +7180,46 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .makesContact = TRUE, .sheerForceBoost = TRUE, .bitingMove = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_PARALYSIS, + .chance = 10, + }, + { + .moveEffect = MOVE_EFFECT_FLINCH, + .chance = 10, + }), }, [MOVE_ICE_FANG] = { - #if B_USE_FROSTBITE == TRUE - .argument = STATUS1_FROSTBITE, - #else - .argument = STATUS1_FREEZE, - #endif - .effect = EFFECT_FLINCH_STATUS, + .effect = EFFECT_HIT, .power = 65, .type = TYPE_ICE, .accuracy = 95, .pp = 15, - .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .sheerForceBoost = TRUE, .bitingMove = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_FREEZE_OR_FROSTBITE, + .chance = 10, + }, + { + .moveEffect = MOVE_EFFECT_FLINCH, + .chance = 10, + }), }, [MOVE_FIRE_FANG] = { - .effect = EFFECT_FLINCH_STATUS, + .effect = EFFECT_HIT, .power = 65, .type = TYPE_FIRE, .accuracy = 95, .pp = 15, - .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -7275,6 +7227,14 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .makesContact = TRUE, .sheerForceBoost = TRUE, .bitingMove = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_BURN, + .chance = 10, + }, + { + .moveEffect = MOVE_EFFECT_FLINCH, + .chance = 10, + }), }, [MOVE_SHADOW_SNEAK] = @@ -7284,7 +7244,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GHOST, .accuracy = 100, .pp = 30, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 1, .category = BATTLE_CATEGORY_PHYSICAL, @@ -7293,17 +7252,20 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_MUD_BOMB] = { - .effect = EFFECT_ACCURACY_DOWN_HIT, + .effect = EFFECT_HIT, .power = 65, .type = TYPE_GROUND, .accuracy = 85, .pp = 10, - .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, .ballisticMove = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_ACC_MINUS_1, + .chance = 30, + }), }, [MOVE_PSYCHO_CUT] = @@ -7314,7 +7276,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .accuracy = 100, .criticalHitStage = 1, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -7323,60 +7284,72 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_ZEN_HEADBUTT] = { - .effect = EFFECT_FLINCH_HIT, + .effect = EFFECT_HIT, .power = 80, .type = TYPE_PSYCHIC, .accuracy = 90, .pp = 15, - .secondaryEffectChance = 20, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_FLINCH, + .chance = 20, + }), }, [MOVE_MIRROR_SHOT] = { - .effect = EFFECT_ACCURACY_DOWN_HIT, + .effect = EFFECT_HIT, .power = 65, .type = TYPE_STEEL, .accuracy = 85, .pp = 10, - .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_ACC_MINUS_1, + .chance = 30, + }), }, [MOVE_FLASH_CANNON] = { - .effect = EFFECT_SPECIAL_DEFENSE_DOWN_HIT, + .effect = EFFECT_HIT, .power = 80, .type = TYPE_STEEL, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SP_DEF_MINUS_1, + .chance = 10, + }), }, [MOVE_ROCK_CLIMB] = { - .effect = EFFECT_CONFUSE_HIT, + .effect = EFFECT_HIT, .power = 90, .type = TYPE_NORMAL, .accuracy = 85, .pp = 20, - .secondaryEffectChance = 20, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_CONFUSION, + .chance = 20, + }), }, [MOVE_DEFOG] = @@ -7386,7 +7359,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FLYING, .accuracy = 0, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -7402,7 +7374,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_ALL_BATTLERS, .priority = -7, .category = BATTLE_CATEGORY_STATUS, @@ -7412,64 +7383,68 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_DRACO_METEOR] = { - #if B_UPDATED_MOVE_DATA >= GEN_6 - .power = 130, - #else - .power = 140, - #endif - .effect = EFFECT_OVERHEAT, + .effect = EFFECT_HIT, + .power = B_UPDATED_MOVE_DATA >= GEN_6 ? 130 : 140, .type = TYPE_DRAGON, .accuracy = 90, .pp = 5, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SP_ATK_TWO_DOWN, + .self = TRUE, + }), }, [MOVE_DISCHARGE] = { - .effect = EFFECT_PARALYZE_HIT, + .effect = EFFECT_HIT, .power = 80, .type = TYPE_ELECTRIC, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 30, .target = MOVE_TARGET_FOES_AND_ALLY, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_PARALYSIS, + .chance = 30, + }), }, [MOVE_LAVA_PLUME] = { - .effect = EFFECT_BURN_HIT, + .effect = EFFECT_HIT, .power = 80, .type = TYPE_FIRE, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 30, .target = MOVE_TARGET_FOES_AND_ALLY, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_BURN, + .chance = 30, + }), }, [MOVE_LEAF_STORM] = { - #if B_UPDATED_MOVE_DATA >= GEN_6 - .power = 130, - #else - .power = 140, - #endif - .effect = EFFECT_OVERHEAT, + .effect = EFFECT_HIT, + .power = B_UPDATED_MOVE_DATA >= GEN_6 ? 130 : 140, .type = TYPE_GRASS, .accuracy = 90, .pp = 5, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SP_ATK_TWO_DOWN, + .self = TRUE, + }), }, [MOVE_POWER_WHIP] = @@ -7479,7 +7454,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GRASS, .accuracy = 85, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -7488,33 +7462,39 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_ROCK_WRECKER] = { - .effect = EFFECT_RECHARGE, + .effect = EFFECT_HIT, .power = 150, .type = TYPE_ROCK, .accuracy = 90, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .ballisticMove = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_RECHARGE, + .self = TRUE, + }), }, [MOVE_CROSS_POISON] = { - .effect = EFFECT_POISON_HIT, + .effect = EFFECT_HIT, .power = 70, .type = TYPE_POISON, .accuracy = 100, .criticalHitStage = 1, .pp = 20, - .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .sheerForceBoost = TRUE, .slicingMove = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_POISON, + .chance = 10, + }), }, [MOVE_GUNK_SHOT] = @@ -7524,30 +7504,36 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = #else .accuracy = 70, #endif - .effect = EFFECT_POISON_HIT, + .effect = EFFECT_HIT, .power = 120, .type = TYPE_POISON, .pp = 5, - .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_POISON, + .chance = 30, + }), }, [MOVE_IRON_HEAD] = { - .effect = EFFECT_FLINCH_HIT, + .effect = EFFECT_HIT, .power = 80, .type = TYPE_STEEL, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_FLINCH, + .chance = 30, + }), }, [MOVE_MAGNET_BOMB] = @@ -7557,7 +7543,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_STEEL, .accuracy = 0, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -7572,7 +7557,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .accuracy = 80, .criticalHitStage = 1, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -7585,7 +7569,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_BOTH, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -7600,7 +7583,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ROCK, .accuracy = 0, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_OPPONENTS_FIELD, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -7618,7 +7600,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GRASS, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -7626,19 +7607,18 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .skyBattleBanned = TRUE, }, +#if B_UPDATED_MOVE_DATA >= GEN_6 +#define CHATTER_EFFECT_CHANCE 100 +#elif B_UPDATED_MOVE_DATA == GEN_5 +#define CHATTER_EFFECT_CHANCE 10 +#else +#define CHATTER_EFFECT_CHANCE 31 +#endif + [MOVE_CHATTER] = { - #if B_UPDATED_MOVE_DATA >= GEN_6 - .power = 65, - .secondaryEffectChance = 100, - #elif B_UPDATED_MOVE_DATA == GEN_5 - .power = 60, - .secondaryEffectChance = 10, - #else - .power = 60, - .secondaryEffectChance = 31, - #endif - .effect = EFFECT_CONFUSE_HIT, + .effect = EFFECT_HIT, + .power = B_UPDATED_MOVE_DATA >= GEN_6 ? 65 : 60, .type = TYPE_FLYING, .accuracy = 100, .pp = 20, @@ -7655,6 +7635,10 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .sleepTalkBanned = TRUE, .instructBanned = TRUE, .assistBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_CONFUSION, + .chance = CHATTER_EFFECT_CHANCE, + }), }, [MOVE_JUDGMENT] = @@ -7664,7 +7648,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -7673,41 +7656,46 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_BUG_BITE] = { - .effect = EFFECT_BUG_BITE, + .effect = EFFECT_HIT, .power = 60, .type = TYPE_BUG, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_BUG_BITE, + }), }, [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, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SP_ATK_PLUS_1, + .self = TRUE, + .chance = 70, + }), }, [MOVE_WOOD_HAMMER] = { - .effect = EFFECT_RECOIL, + .effect = EFFECT_HIT, .power = 120, .type = TYPE_GRASS, .accuracy = 100, .recoil = 33, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -7721,7 +7709,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_WATER, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 1, .category = BATTLE_CATEGORY_PHYSICAL, @@ -7736,7 +7723,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .accuracy = 100, .criticalHitStage = 1, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -7749,7 +7735,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_BUG, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -7766,7 +7751,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_BUG, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -7779,13 +7763,12 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_HEAD_SMASH] = { - .effect = EFFECT_RECOIL, + .effect = EFFECT_HIT, .power = 150, .type = TYPE_ROCK, .accuracy = 80, .recoil = 50, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -7799,7 +7782,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 90, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -7809,15 +7791,18 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_ROAR_OF_TIME] = { - .effect = EFFECT_RECHARGE, + .effect = EFFECT_HIT, .power = 150, .type = TYPE_DRAGON, .accuracy = 90, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_RECHARGE, + .self = TRUE, + }), }, [MOVE_SPACIAL_REND] = @@ -7828,7 +7813,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .accuracy = 95, .criticalHitStage = 1, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -7841,7 +7825,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -7859,7 +7842,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -7878,13 +7860,15 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .power = 120, .accuracy = 70, #endif - .effect = EFFECT_TRAP, + .effect = EFFECT_HIT, .type = TYPE_FIRE, .pp = 5, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_WRAP, + }), }, [MOVE_DARK_VOID] = @@ -7898,7 +7882,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .power = 0, .type = TYPE_DARK, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_BOTH, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -7909,31 +7892,38 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_SEED_FLARE] = { - .effect = EFFECT_SPECIAL_DEFENSE_DOWN_HIT_2, + .effect = EFFECT_HIT, .power = 120, .type = TYPE_GRASS, .accuracy = 85, .pp = 5, - .secondaryEffectChance = 40, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SP_DEF_MINUS_2, + .chance = 40, + }), }, [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, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, .windMove = B_EXTRAPOLATED_MOVE_FLAGS, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_ALL_STATS_UP, + .self = TRUE, + .chance = 10, + }), }, [MOVE_SHADOW_FORCE] = @@ -7943,18 +7933,19 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GHOST, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, - .argument = MOVE_EFFECT_FEINT, .twoTurnMove = TRUE, .ignoresProtect = TRUE, .minimizeDoubleDamage = B_UPDATED_MOVE_FLAGS == GEN_6, .sleepTalkBanned = TRUE, .instructBanned = TRUE, .assistBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_FEINT, + }), }, [MOVE_HONE_CLAWS] = @@ -7964,7 +7955,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_DARK, .accuracy = 0, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -7981,7 +7971,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ROCK, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 3, .category = BATTLE_CATEGORY_STATUS, @@ -8001,7 +7990,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -8016,7 +8004,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -8036,7 +8023,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_ALL_BATTLERS, .category = BATTLE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPDEF_UP_1 }, @@ -8050,7 +8036,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -8058,15 +8043,15 @@ 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, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, + .argument = STATUS1_PSN_ANY, }, [MOVE_AUTOTOMIZE] = @@ -8076,7 +8061,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_STEEL, .accuracy = 0, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -8098,7 +8082,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_BUG, .accuracy = 0, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .category = BATTLE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RESET_STATS }, @@ -8117,7 +8100,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -8138,7 +8120,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_ALL_BATTLERS, .category = BATTLE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPDEF_UP_1 }, @@ -8147,17 +8128,19 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_SMACK_DOWN] = { - .effect = EFFECT_SMACK_DOWN, + .effect = EFFECT_HIT, .power = 50, .type = TYPE_ROCK, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .damagesAirborne = TRUE, .skyBattleBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SMACK_DOWN, + }), }, [MOVE_STORM_THROW] = @@ -8171,7 +8154,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FIGHTING, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -8181,29 +8163,35 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_FLAME_BURST] = { - .effect = EFFECT_FLAME_BURST, + .effect = EFFECT_HIT, .power = 70, .type = TYPE_FIRE, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_FLAME_BURST, + .self = TRUE, + }), }, [MOVE_SLUDGE_WAVE] = { - .effect = EFFECT_POISON_HIT, + .effect = EFFECT_HIT, .power = 95, .type = TYPE_POISON, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 10, .target = MOVE_TARGET_FOES_AND_ALLY, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_POISON, + .chance = 10, + }), }, [MOVE_QUIVER_DANCE] = @@ -8213,7 +8201,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_BUG, .accuracy = 0, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -8231,7 +8218,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_STEEL, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -8252,7 +8238,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .effect = EFFECT_SYNCHRONOISE, .type = TYPE_PSYCHIC, .accuracy = 100, - .secondaryEffectChance = 0, .target = MOVE_TARGET_FOES_AND_ALLY, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -8265,7 +8250,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ELECTRIC, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -8279,7 +8263,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_WATER, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -8289,17 +8272,21 @@ 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, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SPD_PLUS_1, + .self = TRUE, + .chance = 100, + }), }, [MOVE_COIL] = @@ -8309,7 +8296,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_POISON, .accuracy = 0, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -8326,31 +8312,37 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = #else .power = 60, #endif - .effect = EFFECT_SPEED_DOWN_HIT, + .effect = EFFECT_HIT, .type = TYPE_FIGHTING, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SPD_MINUS_1, + .chance = 100, + }), }, [MOVE_ACID_SPRAY] = { - .effect = EFFECT_SPECIAL_DEFENSE_DOWN_HIT_2, + .effect = EFFECT_HIT, .power = 40, .type = TYPE_POISON, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, .ballisticMove = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SP_DEF_MINUS_2, + .chance = 100, + }), }, [MOVE_FOUL_PLAY] = @@ -8360,7 +8352,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_DARK, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -8374,7 +8365,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -8389,7 +8379,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -8404,7 +8393,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -8422,12 +8410,14 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .ignoresSubstitute = B_UPDATED_MOVE_FLAGS >= GEN_6, .soundMove = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_ROUND, + }), }, [MOVE_ECHOED_VOICE] = @@ -8437,7 +8427,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -8452,7 +8441,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -8462,15 +8450,17 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_CLEAR_SMOG] = { - .effect = EFFECT_CLEAR_SMOG, + .effect = EFFECT_HIT, .power = 50, .type = TYPE_POISON, .accuracy = 0, .pp = 15, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_CLEAR_SMOG, + }), }, [MOVE_STORED_POWER] = @@ -8480,7 +8470,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -8493,7 +8482,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FIGHTING, .accuracy = 0, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 3, .category = BATTLE_CATEGORY_STATUS, @@ -8518,7 +8506,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .category = BATTLE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPD_UP_2 }, @@ -8528,17 +8515,20 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_SCALD] = { - .effect = EFFECT_BURN_HIT, + .effect = EFFECT_HIT, .power = 80, .type = TYPE_WATER, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, .thawsUser = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_BURN, + .chance = 30, + }), }, [MOVE_SHELL_SMASH] = @@ -8548,7 +8538,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -8565,7 +8554,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -8578,19 +8566,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, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, + .argument = STATUS1_ANY, }, [MOVE_SKY_DROP] = @@ -8600,7 +8584,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FLYING, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -8619,7 +8602,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_STEEL, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -8636,7 +8618,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FIGHTING, .accuracy = 90, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = -6, .category = BATTLE_CATEGORY_PHYSICAL, @@ -8652,14 +8633,16 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = #else .power = 30, #endif - .effect = EFFECT_INCINERATE, + .effect = EFFECT_HIT, .type = TYPE_FIRE, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 100, .target = MOVE_TARGET_BOTH, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_INCINERATE, + }), }, [MOVE_QUASH] = @@ -8669,7 +8652,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_DARK, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -8684,7 +8666,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FLYING, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -8698,7 +8679,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -8714,7 +8694,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -8728,7 +8707,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FIGHTING, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -8743,7 +8721,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -8757,16 +8734,19 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_INFERNO] = { - .effect = EFFECT_BURN_HIT, + .effect = EFFECT_HIT, .power = 100, .type = TYPE_FIRE, .accuracy = 50, .pp = 5, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_BURN, + .chance = 100, + }), }, [MOVE_WATER_PLEDGE] = @@ -8780,7 +8760,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_WATER, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -8798,7 +8777,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FIRE, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -8816,7 +8794,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GRASS, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -8830,7 +8807,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ELECTRIC, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -8843,15 +8819,18 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = #else .power = 30, #endif - .effect = EFFECT_SPECIAL_ATTACK_DOWN_HIT, + .effect = EFFECT_HIT, .type = TYPE_BUG, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 100, .target = MOVE_TARGET_BOTH, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SP_ATK_MINUS_1, + .chance = 100, + }), }, [MOVE_BULLDOZE] = @@ -8861,12 +8840,15 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GROUND, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 100, .target = MOVE_TARGET_FOES_AND_ALLY, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .sheerForceBoost = TRUE, .skyBattleBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SPD_MINUS_1, + .chance = 100, + }), }, [MOVE_FROST_BREATH] = @@ -8880,7 +8862,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ICE, .accuracy = 90, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -8894,7 +8875,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_DRAGON, .accuracy = 90, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = -6, .category = BATTLE_CATEGORY_PHYSICAL, @@ -8910,7 +8890,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 30, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -8922,27 +8901,29 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_ELECTROWEB] = { - .effect = EFFECT_SPEED_DOWN_HIT, + .effect = EFFECT_HIT, .power = 55, .type = TYPE_ELECTRIC, .accuracy = 95, .pp = 15, - .secondaryEffectChance = 100, .target = MOVE_TARGET_BOTH, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SPD_MINUS_1, + .chance = 100, + }), }, [MOVE_WILD_CHARGE] = { - .effect = EFFECT_RECOIL, + .effect = EFFECT_HIT, .power = 90, .type = TYPE_ELECTRIC, .accuracy = 100, .recoil = 25, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -8957,7 +8938,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .accuracy = 95, .criticalHitStage = 1, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -8971,7 +8951,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_DRAGON, .accuracy = 90, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -8981,17 +8960,20 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_HEART_STAMP] = { - .effect = EFFECT_FLINCH_HIT, + .effect = EFFECT_HIT, .power = 60, .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 25, - .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_FLINCH, + .chance = 30, + }), }, [MOVE_HORN_LEECH] = @@ -9001,7 +8983,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GRASS, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -9020,7 +9001,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .power = 90, .type = TYPE_FIGHTING, .accuracy = 100, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -9031,18 +9011,21 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_RAZOR_SHELL] = { - .effect = EFFECT_DEFENSE_DOWN_HIT, + .effect = EFFECT_HIT, .power = 75, .type = TYPE_WATER, .accuracy = 95, .pp = 10, - .secondaryEffectChance = 50, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .sheerForceBoost = TRUE, .slicingMove = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_DEF_MINUS_1, + .chance = 50, + }), }, [MOVE_HEAT_CRASH] = @@ -9052,7 +9035,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FIRE, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -9062,33 +9044,39 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_LEAF_TORNADO] = { - .effect = EFFECT_ACCURACY_DOWN_HIT, + .effect = EFFECT_HIT, .power = 65, .type = TYPE_GRASS, .accuracy = 90, .pp = 10, - .secondaryEffectChance = 50, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, //.windMove = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_ACC_MINUS_1, + .chance = 50, + }), }, [MOVE_STEAMROLLER] = { - .effect = EFFECT_FLINCH_HIT, + .effect = EFFECT_HIT, .power = 65, .type = TYPE_BUG, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .sheerForceBoost = TRUE, .minimizeDoubleDamage = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_FLINCH, + .chance = 30, + }), }, [MOVE_COTTON_GUARD] = @@ -9098,7 +9086,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GRASS, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -9110,16 +9097,19 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_NIGHT_DAZE] = { - .effect = EFFECT_ACCURACY_DOWN_HIT, + .effect = EFFECT_HIT, .power = 85, .type = TYPE_DARK, .accuracy = 95, .pp = 10, - .secondaryEffectChance = 40, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_ACC_MINUS_1, + .chance = 40, + }), }, [MOVE_PSYSTRIKE] = @@ -9129,7 +9119,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -9142,7 +9131,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 85, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -9160,24 +9148,26 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FLYING, .accuracy = 70, .pp = 10, - .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, .windMove = TRUE, .damagesAirborne = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_CONFUSION, + .chance = 30, + }), }, [MOVE_HEAD_CHARGE] = { - .effect = EFFECT_RECOIL, + .effect = EFFECT_HIT, .power = 120, .type = TYPE_NORMAL, .accuracy = 100, .recoil = 25, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -9191,7 +9181,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_STEEL, .accuracy = 85, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -9201,17 +9190,20 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_SEARING_SHOT] = { - .effect = EFFECT_BURN_HIT, + .effect = EFFECT_HIT, .power = 100, .type = TYPE_FIRE, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 30, .target = MOVE_TARGET_FOES_AND_ALLY, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, .ballisticMove = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_BURN, + .chance = 30, + }), }, [MOVE_TECHNO_BLAST] = @@ -9225,7 +9217,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -9240,7 +9231,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 10, .target = MOVE_TARGET_BOTH, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -9249,6 +9239,10 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .ignoresSubstitute = B_UPDATED_MOVE_FLAGS >= GEN_6, .soundMove = TRUE, .metronomeBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SLEEP, + .chance = 10, + }), }, [MOVE_SECRET_SWORD] = @@ -9258,7 +9252,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FIGHTING, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -9268,60 +9261,73 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_GLACIATE] = { - .effect = EFFECT_SPEED_DOWN_HIT, + .effect = EFFECT_HIT, .power = 65, .type = TYPE_ICE, .accuracy = 95, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_BOTH, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SPD_MINUS_1, + .chance = 100, + }), }, [MOVE_BOLT_STRIKE] = { - .effect = EFFECT_PARALYZE_HIT, + .effect = EFFECT_HIT, .power = 130, .type = TYPE_ELECTRIC, .accuracy = 85, .pp = 5, - .secondaryEffectChance = 20, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_PARALYSIS, + .chance = 20, + }), }, [MOVE_BLUE_FLARE] = { - .effect = EFFECT_BURN_HIT, + .effect = EFFECT_HIT, .power = 130, .type = TYPE_FIRE, .accuracy = 85, .pp = 5, - .secondaryEffectChance = 20, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_BURN, + .chance = 20, + }), }, [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, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, .danceMove = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SP_ATK_PLUS_1, + .self = TRUE, + .chance = 50, + }), }, [MOVE_FREEZE_SHOCK] = @@ -9331,16 +9337,18 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ICE, .accuracy = 90, .pp = 5, - .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, - .argument = MOVE_EFFECT_PARALYSIS, .twoTurnMove = TRUE, .sheerForceBoost = TRUE, .metronomeBanned = TRUE, .sleepTalkBanned = TRUE, .instructBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_PARALYSIS, + .chance = 30, + }), }, [MOVE_ICE_BURN] = @@ -9350,26 +9358,27 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ICE, .accuracy = 90, .pp = 5, - .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, - .argument = MOVE_EFFECT_BURN, .twoTurnMove = TRUE, .sheerForceBoost = TRUE, .metronomeBanned = TRUE, .sleepTalkBanned = TRUE, .instructBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_BURN, + .chance = 30, + }), }, [MOVE_SNARL] = { - .effect = EFFECT_SPECIAL_ATTACK_DOWN_HIT, + .effect = EFFECT_HIT, .power = 55, .type = TYPE_DARK, .accuracy = 95, .pp = 15, - .secondaryEffectChance = 100, .target = MOVE_TARGET_BOTH, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -9377,35 +9386,45 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .ignoresSubstitute = B_UPDATED_MOVE_FLAGS >= GEN_6, .soundMove = TRUE, .metronomeBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SP_ATK_MINUS_1, + .chance = 100, + }), }, [MOVE_ICICLE_CRASH] = { - .effect = EFFECT_FLINCH_HIT, + .effect = EFFECT_HIT, .power = 85, .type = TYPE_ICE, .accuracy = 90, .pp = 10, - .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_FLINCH, + .chance = 30, + }), }, [MOVE_V_CREATE] = { - .effect = EFFECT_V_CREATE, + .effect = EFFECT_HIT, .power = 180, .type = TYPE_FIRE, .accuracy = 95, .pp = 5, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .metronomeBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_V_CREATE, + .self = TRUE, + }), }, [MOVE_FUSION_FLARE] = @@ -9415,7 +9434,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FIRE, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -9429,7 +9447,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ELECTRIC, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -9446,7 +9463,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FIGHTING, .accuracy = 95, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -9464,7 +9480,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FIGHTING, .accuracy = 0, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -9486,7 +9501,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_POISON, .accuracy = 90, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -9507,7 +9521,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GROUND, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_ALL_BATTLERS, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -9524,7 +9537,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_BUG, .accuracy = 0, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_OPPONENTS_FIELD, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -9546,7 +9558,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_BUG, .accuracy = 100, .pp = 25, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -9560,11 +9571,9 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GHOST, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, - .argument = MOVE_EFFECT_FEINT, .twoTurnMove = TRUE, .ignoresProtect = TRUE, .makesContact = TRUE, @@ -9572,6 +9581,9 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .sleepTalkBanned = TRUE, .instructBanned = TRUE, .assistBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_FEINT, + }), }, [MOVE_TRICK_OR_TREAT] = @@ -9581,7 +9593,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GHOST, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -9597,7 +9608,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 30, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -9614,7 +9624,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ELECTRIC, .accuracy = 0, .pp = 25, - .secondaryEffectChance = 0, .target = MOVE_TARGET_ALL_BATTLERS, .priority = 1, .category = BATTLE_CATEGORY_STATUS, @@ -9634,7 +9643,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ELECTRIC, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_FOES_AND_ALLY, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -9648,7 +9656,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GRASS, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -9664,7 +9671,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GRASS, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_FOES_AND_ALLY, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -9678,11 +9684,14 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ICE, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_FREEZE_OR_FROSTBITE, + .chance = 10, + }), }, [MOVE_DISARMING_VOICE] = @@ -9692,7 +9701,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FAIRY, .accuracy = 0, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_BOTH, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -9707,7 +9715,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_DARK, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -9728,7 +9735,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .power = 0, .type = TYPE_DARK, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -9743,7 +9749,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FAIRY, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -9759,7 +9764,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FAIRY, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 3, .category = BATTLE_CATEGORY_STATUS, @@ -9777,7 +9781,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FAIRY, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_ALL_BATTLERS, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -9793,7 +9796,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GRASS, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_ALL_BATTLERS, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -9810,7 +9812,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FAIRY, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_ALL_BATTLERS, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -9827,7 +9828,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ELECTRIC, .accuracy = 0, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -9836,17 +9836,20 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_PLAY_ROUGH] = { - .effect = EFFECT_ATTACK_DOWN_HIT, + .effect = EFFECT_HIT, .power = 90, .type = TYPE_FAIRY, .accuracy = 90, .pp = 10, - .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_ATK_MINUS_1, + .chance = 10, + }), }, [MOVE_FAIRY_WIND] = @@ -9856,7 +9859,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FAIRY, .accuracy = 100, .pp = 30, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -9865,16 +9867,19 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_MOONBLAST] = { - .effect = EFFECT_SPECIAL_ATTACK_DOWN_HIT, + .effect = EFFECT_HIT, .power = 95, .type = TYPE_FAIRY, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SP_ATK_MINUS_1, + .chance = 30, + }), }, [MOVE_BOOMBURST] = @@ -9884,7 +9889,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_FOES_AND_ALLY, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -9899,7 +9903,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FAIRY, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_ALL_BATTLERS, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -9915,7 +9918,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_STEEL, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 4, .category = BATTLE_CATEGORY_STATUS, @@ -9936,7 +9938,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -9953,7 +9954,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -9966,53 +9966,56 @@ 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, .category = BATTLE_CATEGORY_PHYSICAL, .sheerForceBoost = TRUE, .metronomeBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = B_UPDATED_MOVE_DATA >= GEN_7 ? MOVE_EFFECT_DEF_PLUS_2: MOVE_EFFECT_DEF_PLUS_1, + .chance = 50, + }), }, [MOVE_STEAM_ERUPTION] = { - .effect = EFFECT_BURN_HIT, + .effect = EFFECT_HIT, .power = 110, .type = TYPE_WATER, .accuracy = 95, .pp = 5, - .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, .thawsUser = TRUE, .metronomeBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_BURN, + .chance = 30, + }), }, [MOVE_HYPERSPACE_HOLE] = { - .effect = EFFECT_FEINT, + .effect = EFFECT_HIT, .power = 80, .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .ignoresProtect = TRUE, .ignoresSubstitute = TRUE, .metronomeBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_FEINT, + }), }, [MOVE_WATER_SHURIKEN] = @@ -10027,7 +10030,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_WATER, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 1, @@ -10040,15 +10042,18 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = #else .power = 65, #endif - .effect = EFFECT_SPECIAL_ATTACK_DOWN_HIT, + .effect = EFFECT_HIT, .type = TYPE_FIRE, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SP_ATK_MINUS_1, + .chance = 100, + }), }, [MOVE_SPIKY_SHIELD] = @@ -10058,7 +10063,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GRASS, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 4, .category = BATTLE_CATEGORY_STATUS, @@ -10078,7 +10082,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FAIRY, .accuracy = 0, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_ALLY, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -10095,7 +10098,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ELECTRIC, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -10110,7 +10112,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_POISON, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_BOTH, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -10125,7 +10126,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_BUG, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 1, .category = BATTLE_CATEGORY_STATUS, @@ -10141,7 +10141,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FAIRY, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -10159,7 +10158,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ELECTRIC, .accuracy = 0, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -10177,7 +10175,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 30, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -10193,7 +10190,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ELECTRIC, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_ALL_BATTLERS, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -10210,7 +10206,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FAIRY, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_BOTH, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -10223,7 +10218,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 40, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -10245,7 +10239,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 40, - .secondaryEffectChance = 0, .target = MOVE_TARGET_ALLY, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -10267,7 +10260,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FAIRY, .accuracy = 100, .pp = 30, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 1, .category = BATTLE_CATEGORY_STATUS, @@ -10277,17 +10269,20 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_NUZZLE] = { - .effect = EFFECT_PARALYZE_HIT, + .effect = EFFECT_HIT, .power = 20, .type = TYPE_ELECTRIC, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_PARALYSIS, + .chance = 100, + }), }, [MOVE_HOLD_BACK] = @@ -10297,7 +10292,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 40, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -10306,32 +10300,38 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_INFESTATION] = { - .effect = EFFECT_TRAP, + .effect = EFFECT_HIT, .power = 20, .type = TYPE_BUG, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .makesContact = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_WRAP, + }), }, [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, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .punchingMove = TRUE, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_ATK_PLUS_1, + .self = TRUE, + .chance = 100, + }), }, [MOVE_OBLIVION_WING] = @@ -10341,7 +10341,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FLYING, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -10351,12 +10350,11 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_THOUSAND_ARROWS] = { - .effect = EFFECT_SMACK_DOWN, + .effect = EFFECT_HIT, .power = 90, .type = TYPE_GROUND, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_BOTH, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -10364,21 +10362,26 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .ignoreTypeIfFlyingAndUngrounded = TRUE, .metronomeBanned = TRUE, .skyBattleBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SMACK_DOWN, + }), }, [MOVE_THOUSAND_WAVES] = { - .effect = EFFECT_HIT_PREVENT_ESCAPE, + .effect = EFFECT_HIT, .power = 90, .type = TYPE_GROUND, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_BOTH, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .metronomeBanned = TRUE, .skyBattleBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_PREVENT_ESCAPE, + }), }, [MOVE_LANDS_WRATH] = @@ -10388,7 +10391,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GROUND, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_BOTH, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -10397,13 +10399,12 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_LIGHT_OF_RUIN] = { - .effect = EFFECT_RECOIL, + .effect = EFFECT_HIT, .power = 140, .type = TYPE_FAIRY, .accuracy = 90, .recoil = 50, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -10417,7 +10418,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_WATER, .accuracy = 85, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_BOTH, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -10432,7 +10432,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GROUND, .accuracy = 85, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_BOTH, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -10441,17 +10440,20 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_DRAGON_ASCENT] = { - .effect = EFFECT_CLOSE_COMBAT, + .effect = EFFECT_HIT, .power = 120, .type = TYPE_FLYING, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .metronomeBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_DEF_SPDEF_DOWN, + .self = TRUE, + }), }, [MOVE_HYPERSPACE_FURY] = @@ -10461,7 +10463,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_DARK, .accuracy = 0, .pp = 5, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -10469,6 +10470,12 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .ignoresSubstitute = TRUE, .metronomeBanned = TRUE, .sketchBanned = (B_SKETCH_BANS >= GEN_9), + .additionalEffects = ADDITIONAL_EFFECTS( + // Feint move effect handled in script as it goes before animation + { + .moveEffect = MOVE_EFFECT_DEF_MINUS_1, + .self = TRUE, + }), }, [MOVE_SHORE_UP] = @@ -10482,7 +10489,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .power = 0, .type = TYPE_GROUND, .accuracy = 0, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -10500,7 +10506,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_BUG, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 2, .category = BATTLE_CATEGORY_PHYSICAL, @@ -10514,7 +10519,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_POISON, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 4, .category = BATTLE_CATEGORY_STATUS, @@ -10529,16 +10533,19 @@ 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, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_PREVENT_ESCAPE, + .chance = 100, + }), }, [MOVE_DARKEST_LARIAT] = @@ -10548,7 +10555,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_DARK, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -10558,12 +10564,11 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_SPARKLING_ARIA] = { - .effect = EFFECT_SPARKLING_ARIA, + .effect = EFFECT_HIT, .power = 90, .type = TYPE_WATER, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_FOES_AND_ALLY, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -10571,21 +10576,28 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .sheerForceBoost = TRUE, .ignoresSubstitute = B_UPDATED_MOVE_FLAGS >= GEN_6, .soundMove = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_REMOVE_STATUS, + .chance = 100, + }), }, [MOVE_ICE_HAMMER] = { - .effect = EFFECT_HAMMER_ARM, + .effect = EFFECT_HIT, .power = 100, .type = TYPE_ICE, .accuracy = 90, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .punchingMove = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SPD_MINUS_1, + .self = TRUE, + }), }, [MOVE_FLORAL_HEALING] = @@ -10595,7 +10607,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FAIRY, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -10613,7 +10624,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GROUND, .accuracy = 95, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -10627,7 +10637,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GRASS, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -10643,7 +10652,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GRASS, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -10661,7 +10669,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GRASS, .accuracy = 100, .pp = 40, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -10674,7 +10681,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 3, .category = BATTLE_CATEGORY_STATUS, @@ -10693,7 +10699,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_POISON, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -10708,7 +10713,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 30, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -10725,7 +10729,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_STEEL, .accuracy = 0, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -10738,17 +10741,20 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_THROAT_CHOP] = { - .effect = EFFECT_THROAT_CHOP, + .effect = EFFECT_HIT, .power = 80, .type = TYPE_DARK, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_THROAT_CHOP, + .chance = 100, + }), }, [MOVE_POLLEN_PUFF] = @@ -10758,7 +10764,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_BUG, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -10767,17 +10772,20 @@ 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, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_PREVENT_ESCAPE, + .chance = 100, + }), }, [MOVE_PSYCHIC_TERRAIN] = @@ -10787,7 +10795,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_ALL_BATTLERS, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -10798,32 +10805,38 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_LUNGE] = { - .effect = EFFECT_ATTACK_DOWN_HIT, + .effect = EFFECT_HIT, .power = 80, .type = TYPE_BUG, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_ATK_MINUS_1, + .chance = 100, + }), }, [MOVE_FIRE_LASH] = { - .effect = EFFECT_DEFENSE_DOWN_HIT, + .effect = EFFECT_HIT, .power = 80, .type = TYPE_FIRE, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_DEF_MINUS_1, + .chance = 100, + }), }, [MOVE_POWER_TRIP] = @@ -10833,7 +10846,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_DARK, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -10842,16 +10854,20 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_BURN_UP] = { - .effect = EFFECT_BURN_UP, + .effect = EFFECT_FAIL_IF_NOT_ARG_TYPE, .power = 130, .type = TYPE_FIRE, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .thawsUser = TRUE, + .argument = TYPE_FIRE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_REMOVE_ARG_TYPE, + .self = TRUE, + }), }, [MOVE_SPEED_SWAP] = @@ -10861,7 +10877,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -10876,7 +10891,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_STEEL, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -10890,7 +10904,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_POISON, .accuracy = 0, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -10907,7 +10920,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -10916,31 +10928,36 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_CORE_ENFORCER] = { - .effect = EFFECT_CORE_ENFORCER, + .effect = EFFECT_HIT, .power = 100, .type = TYPE_DRAGON, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .zMove = { .powerOverride = 140 }, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_CORE_ENFORCER, + }), }, [MOVE_TROP_KICK] = { - .effect = EFFECT_ATTACK_DOWN_HIT, + .effect = EFFECT_HIT, .power = 70, .type = TYPE_GRASS, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_ATK_MINUS_1, + .chance = 100, + }), }, [MOVE_INSTRUCT] = @@ -10950,7 +10967,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -10968,7 +10984,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FLYING, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = -3, .category = BATTLE_CATEGORY_PHYSICAL, @@ -10984,17 +10999,20 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_CLANGING_SCALES] = { - .effect = EFFECT_ATTACKER_DEFENSE_DOWN_HIT, + .effect = EFFECT_HIT, .power = 110, .type = TYPE_DRAGON, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_BOTH, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .ignoresSubstitute = B_UPDATED_MOVE_FLAGS >= GEN_6, .soundMove = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_DEF_MINUS_1, + .self = TRUE, + }), }, [MOVE_DRAGON_HAMMER] = @@ -11004,7 +11022,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_DRAGON, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -11018,7 +11035,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_DARK, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_FOES_AND_ALLY, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -11032,7 +11048,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ICE, .accuracy = 0, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -11049,7 +11064,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FIRE, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_BOTH, .priority = -3, .category = BATTLE_CATEGORY_SPECIAL, @@ -11064,16 +11078,19 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_FLEUR_CANNON] = { - .effect = EFFECT_OVERHEAT, + .effect = EFFECT_HIT, .power = 130, .type = TYPE_FAIRY, .accuracy = 90, .pp = 5, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .metronomeBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SP_ATK_TWO_DOWN, + .self = TRUE, + }), }, [MOVE_PSYCHIC_FANGS] = @@ -11083,7 +11100,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -11098,7 +11114,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GROUND, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -11108,16 +11123,19 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_SHADOW_BONE] = { - .effect = EFFECT_DEFENSE_DOWN_HIT, + .effect = EFFECT_HIT, .power = 85, .type = TYPE_GHOST, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 20, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_DEF_MINUS_1, + .chance = 20, + }), }, [MOVE_ACCELEROCK] = @@ -11127,7 +11145,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ROCK, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 1, .category = BATTLE_CATEGORY_PHYSICAL, @@ -11136,46 +11153,54 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_LIQUIDATION] = { - .effect = EFFECT_DEFENSE_DOWN_HIT, + .effect = EFFECT_HIT, .power = 85, .type = TYPE_WATER, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 20, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_DEF_MINUS_1, + .chance = 20, + }), }, [MOVE_PRISMATIC_LASER] = { - .effect = EFFECT_RECHARGE, + .effect = EFFECT_HIT, .power = 160, .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_RECHARGE, + .self = TRUE, + }), }, [MOVE_SPECTRAL_THIEF] = { - .effect = EFFECT_SPECTRAL_THIEF, + .effect = EFFECT_HIT, .power = 90, .type = TYPE_GHOST, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .ignoresSubstitute = TRUE, .makesContact = TRUE, .metronomeBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SPECTRAL_THIEF, + }), }, [MOVE_SUNSTEEL_STRIKE] = @@ -11185,7 +11210,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_STEEL, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -11201,7 +11225,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GHOST, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -11216,7 +11239,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -11227,16 +11249,19 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_ZING_ZAP] = { - .effect = EFFECT_FLINCH_HIT, + .effect = EFFECT_HIT, .power = 80, .type = TYPE_ELECTRIC, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_FLINCH, + .chance = 30, + }), }, [MOVE_NATURES_MADNESS] = @@ -11246,7 +11271,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FAIRY, .accuracy = 90, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -11264,7 +11288,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -11279,7 +11302,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FIRE, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_FOES_AND_ALLY, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -11293,7 +11315,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ELECTRIC, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -11309,7 +11330,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -11319,51 +11339,54 @@ 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 - .power = 50, - .pp = 15, - #endif + .effect = EFFECT_HIT, + .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, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .mirrorMoveBanned = B_UPDATED_MOVE_FLAGS < GEN_8, + .sheerForceBoost = B_UPDATED_MOVE_DATA >= GEN_8, .alwaysCriticalHit = TRUE, .metronomeBanned = TRUE, + #if B_UPDATED_MOVE_DATA >= GEN_8 + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_EVS_PLUS_1, + .chance = 100, + } + ), + #endif }, [MOVE_SPLISHY_SPLASH] = { - .effect = EFFECT_PARALYZE_HIT, + .effect = EFFECT_HIT, .power = 90, .type = TYPE_WATER, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 30, .target = MOVE_TARGET_BOTH, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, .mirrorMoveBanned = B_UPDATED_MOVE_FLAGS < GEN_8, .metronomeBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_PARALYSIS, + .chance = 30, + }), }, [MOVE_FLOATY_FALL] = { - .effect = EFFECT_FLINCH_HIT, + .effect = EFFECT_HIT, .power = 90, .type = TYPE_FLYING, .accuracy = 95, .pp = 15, - .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -11372,6 +11395,10 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .mirrorMoveBanned = B_UPDATED_MOVE_FLAGS < GEN_8, .gravityBanned = TRUE, .metronomeBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_FLINCH, + .chance = 30, + }), }, [MOVE_PIKA_PAPOW] = @@ -11381,7 +11408,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ELECTRIC, .accuracy = 0, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -11402,7 +11428,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .effect = EFFECT_ABSORB, .type = TYPE_WATER, .accuracy = 100, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -11420,15 +11445,18 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .power = 90, .pp = 15, #endif - .effect = EFFECT_PARALYZE_HIT, + .effect = EFFECT_HIT, .type = TYPE_ELECTRIC, .accuracy = 100, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .mirrorMoveBanned = B_UPDATED_MOVE_FLAGS < GEN_8, .metronomeBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_PARALYSIS, + .chance = 100, + }), }, [MOVE_SIZZLY_SLIDE] = @@ -11440,10 +11468,9 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .power = 90, .pp = 15, #endif - .effect = EFFECT_BURN_HIT, + .effect = EFFECT_HIT, .type = TYPE_FIRE, .accuracy = 100, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -11451,6 +11478,10 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .mirrorMoveBanned = B_UPDATED_MOVE_FLAGS < GEN_8, .thawsUser = TRUE, .metronomeBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_BURN, + .chance = 100, + }), }, [MOVE_GLITZY_GLOW] = @@ -11465,7 +11496,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .effect = EFFECT_GLITZY_GLOW, .type = TYPE_PSYCHIC, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -11485,7 +11515,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .effect = EFFECT_BADDY_BAD, .type = TYPE_DARK, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -11506,7 +11535,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = #endif .effect = EFFECT_SAPPY_SEED, .type = TYPE_GRASS, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -11528,7 +11556,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = #endif .effect = EFFECT_FREEZY_FROST, .type = TYPE_ICE, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -11549,7 +11576,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = #endif .effect = EFFECT_SPARKLY_SWIRL, .type = TYPE_FAIRY, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -11564,7 +11590,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -11575,12 +11600,11 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_DOUBLE_IRON_BASH] = { - .effect = EFFECT_FLINCH_HIT, + .effect = EFFECT_HIT, .power = 60, .type = TYPE_STEEL, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -11590,6 +11614,10 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .strikeCount = 2, .minimizeDoubleDamage = B_UPDATED_MOVE_FLAGS < GEN_8, .metronomeBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_FLINCH, + .chance = 30, + }), }, [MOVE_DYNAMAX_CANNON] = @@ -11599,7 +11627,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_DRAGON, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -11622,7 +11649,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .accuracy = 100, .criticalHitStage = 1, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -11630,17 +11656,19 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_JAW_LOCK] = { - .effect = EFFECT_JAW_LOCK, + .effect = EFFECT_HIT, .power = 80, .type = TYPE_DARK, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .bitingMove = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_TRAP_BOTH, + }), }, [MOVE_STUFF_CHEEKS] = @@ -11650,7 +11678,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -11666,7 +11693,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FIGHTING, .accuracy = 0, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -11682,7 +11708,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ROCK, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -11696,7 +11721,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -11712,7 +11736,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_DRAGON, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -11727,7 +11750,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_ALL_BATTLERS, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -11743,7 +11765,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FIGHTING, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -11756,7 +11777,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ELECTRIC, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -11770,7 +11790,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_WATER, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -11785,7 +11804,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_ALL_BATTLERS, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -11799,7 +11817,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_DRAGON, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -11818,7 +11835,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FIGHTING, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -11834,7 +11850,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FAIRY, .accuracy = 0, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -11845,43 +11860,47 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_DRUM_BEATING] = { - .effect = EFFECT_SPEED_DOWN_HIT, + .effect = EFFECT_HIT, .power = 80, .type = TYPE_GRASS, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .sheerForceBoost = TRUE, .metronomeBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SPD_MINUS_1, + .chance = 100, + }), }, [MOVE_SNAP_TRAP] = { - .effect = EFFECT_TRAP, + .effect = EFFECT_HIT, .power = 35, .type = TYPE_GRASS, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .metronomeBanned = TRUE, .skyBattleBanned = B_EXTRAPOLATED_MOVE_FLAGS, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_WRAP, + }), }, [MOVE_PYRO_BALL] = { - .effect = EFFECT_BURN_HIT, + .effect = EFFECT_HIT, .power = 120, .type = TYPE_FIRE, .accuracy = 90, .pp = 5, - .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -11889,6 +11908,10 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .thawsUser = TRUE, .ballisticMove = TRUE, .metronomeBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_BURN, + .chance = 10, + }), }, [MOVE_BEHEMOTH_BLADE] = @@ -11898,7 +11921,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_STEEL, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -11917,7 +11939,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_STEEL, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -11935,27 +11956,35 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ELECTRIC, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, + .sheerForceBoost = TRUE, .metronomeBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SPD_PLUS_1, + .self = TRUE, + .chance = 100, + }), }, [MOVE_BREAKING_SWIPE] = { - .effect = EFFECT_ATTACK_DOWN_HIT, + .effect = EFFECT_HIT, .power = 60, .type = TYPE_DRAGON, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 100, .target = MOVE_TARGET_BOTH, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .sheerForceBoost = TRUE, .metronomeBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_ATK_MINUS_1, + .chance = 100, + }), }, [MOVE_BRANCH_POKE] = @@ -11965,7 +11994,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GRASS, .accuracy = 100, .pp = 40, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -11980,7 +12008,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ELECTRIC, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_BOTH, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -11991,17 +12018,20 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_APPLE_ACID] = { - .effect = EFFECT_SPECIAL_DEFENSE_DOWN_HIT, + .effect = EFFECT_HIT, .power = 80, .type = TYPE_GRASS, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, .metronomeBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SP_DEF_MINUS_1, + .chance = 100, + }), }, [MOVE_GRAV_APPLE] = @@ -12011,43 +12041,52 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GRASS, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .sheerForceBoost = TRUE, .metronomeBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_DEF_MINUS_1, + .chance = 100, + }), }, [MOVE_SPIRIT_BREAK] = { - .effect = EFFECT_SPECIAL_ATTACK_DOWN_HIT, + .effect = EFFECT_HIT, .power = 75, .type = TYPE_FAIRY, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .sheerForceBoost = TRUE, .metronomeBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SP_ATK_MINUS_1, + .chance = 100, + }), }, [MOVE_STRANGE_STEAM] = { - .effect = EFFECT_CONFUSE_HIT, + .effect = EFFECT_HIT, .power = 90, .type = TYPE_FAIRY, .accuracy = 95, .pp = 10, - .secondaryEffectChance = 20, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, .metronomeBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_CONFUSION, + .chance = 20, + }), }, [MOVE_LIFE_DEW] = @@ -12057,7 +12096,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_WATER, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_ALL_BATTLERS, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -12076,7 +12114,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_DARK, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 4, .category = BATTLE_CATEGORY_STATUS, @@ -12094,7 +12131,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_DARK, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -12104,31 +12140,37 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_METEOR_ASSAULT] = { - .effect = EFFECT_RECHARGE, + .effect = EFFECT_HIT, .power = 150, .type = TYPE_FIGHTING, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .metronomeBanned = TRUE, .instructBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_RECHARGE, + .self = TRUE, + }), }, [MOVE_ETERNABEAM] = { - .effect = EFFECT_RECHARGE, + .effect = EFFECT_HIT, .power = 160, .type = TYPE_DRAGON, .accuracy = 90, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .metronomeBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_RECHARGE, + .self = TRUE, + }), }, [MOVE_STEEL_BEAM] = @@ -12138,7 +12180,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_STEEL, .accuracy = 95, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -12152,7 +12193,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -12165,7 +12205,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_STEEL, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -12181,7 +12220,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_DRAGON, .accuracy = 90, .pp = 20, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -12195,12 +12233,16 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ROCK, .accuracy = 90, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .twoTurnMove = TRUE, .instructBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SP_ATK_PLUS_1, + .self = TRUE, + .onChargeTurnOnly = TRUE, + }), }, [MOVE_SHELL_SIDE_ARM] = @@ -12210,11 +12252,14 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_POISON, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 20, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_POISON, + .chance = 20, + }), }, [MOVE_MISTY_EXPLOSION] = @@ -12224,7 +12269,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FAIRY, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_FOES_AND_ALLY, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -12241,7 +12285,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GRASS, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -12256,7 +12299,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ELECTRIC, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -12269,7 +12311,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -12278,31 +12319,37 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_SKITTER_SMACK] = { - .effect = EFFECT_SPECIAL_ATTACK_DOWN_HIT, + .effect = EFFECT_HIT, .power = 70, .type = TYPE_BUG, .accuracy = 90, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SP_ATK_MINUS_1, + .chance = 100, + }), }, [MOVE_BURNING_JEALOUSY] = { - .effect = EFFECT_BURN_HIT, + .effect = EFFECT_HIT, .power = 70, .type = TYPE_FIRE, - .accuracy = 100, .pp = 5, - .secondaryEffectChance = 100, .target = MOVE_TARGET_BOTH, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_BURN, + .onlyIfTargetRaisedStats = TRUE, + .chance = 100, + }), }, [MOVE_LASH_OUT] = @@ -12312,7 +12359,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_DARK, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -12326,7 +12372,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GHOST, .accuracy = 90, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -12339,7 +12384,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_POISON, .accuracy = 100, .pp = 40, - .secondaryEffectChance = 0, .target = MOVE_TARGET_FOES_AND_ALLY, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -12353,7 +12397,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FIGHTING, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_ALLY, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -12369,7 +12412,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_WATER, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -12383,7 +12425,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ICE, .accuracy = 90, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -12398,7 +12439,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FLYING, .accuracy = 90, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -12408,17 +12448,20 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_SCORCHING_SANDS] = { - .effect = EFFECT_BURN_HIT, + .effect = EFFECT_HIT, .power = 70, .type = TYPE_GROUND, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, .thawsUser = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_BURN, + .chance = 30, + }), }, [MOVE_JUNGLE_HEALING] = @@ -12428,7 +12471,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GRASS, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -12450,7 +12492,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_DARK, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -12467,7 +12508,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_WATER, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -12480,16 +12520,18 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_THUNDER_CAGE] = { - .effect = EFFECT_TRAP, + .effect = EFFECT_HIT, .power = 80, .type = TYPE_ELECTRIC, .accuracy = 90, .pp = 15, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .metronomeBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_WRAP, + }), }, [MOVE_DRAGON_ENERGY] = @@ -12499,7 +12541,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_DRAGON, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_BOTH, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -12509,50 +12550,55 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_FREEZING_GLARE] = { .power = 90, - #if B_USE_FROSTBITE == TRUE - .effect = EFFECT_FROSTBITE_HIT, - #else - .effect = EFFECT_FREEZE_HIT, - #endif + .effect = EFFECT_HIT, .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, .metronomeBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_FREEZE_OR_FROSTBITE, + .chance = 10, + }), }, [MOVE_FIERY_WRATH] = { - .effect = EFFECT_FLINCH_HIT, + .effect = EFFECT_HIT, .power = 90, .type = TYPE_DARK, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 20, .target = MOVE_TARGET_BOTH, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .metronomeBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_FLINCH, + .chance = 20, + }), }, [MOVE_THUNDEROUS_KICK] = { - .effect = EFFECT_DEFENSE_DOWN_HIT, + .effect = EFFECT_HIT, .power = 90, .type = TYPE_FIGHTING, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .sheerForceBoost = TRUE, .metronomeBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_DEF_MINUS_1, + .chance = 100, + }), }, [MOVE_GLACIAL_LANCE] = @@ -12566,7 +12612,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ICE, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_BOTH, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -12580,7 +12625,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GHOST, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_BOTH, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -12594,7 +12638,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -12610,31 +12653,38 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = #else .power = 60, #endif - .effect = EFFECT_DIRE_CLAW, + .effect = EFFECT_HIT, .type = TYPE_POISON, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 50, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_DIRE_CLAW, + .chance = 50, + }), }, [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, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_DEF_PLUS_1, + .self = TRUE, + .chance = 100, + }), }, [MOVE_POWER_SHIFT] = @@ -12644,7 +12694,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -12656,19 +12705,21 @@ 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, .pp = 15, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, - .argument = MOVE_EFFECT_STEALTH_ROCK, .sheerForceBoost = TRUE, .slicingMove = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_STEALTH_ROCK, + .chance = 100, + }), }, [MOVE_SPRINGTIDE_STORM] = @@ -12678,64 +12729,65 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = #else .power = 95, #endif - .effect = EFFECT_ATTACK_DOWN_HIT, + .effect = EFFECT_HIT, .type = TYPE_FAIRY, .accuracy = 80, .pp = 5, - .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, .windMove = TRUE, .metronomeBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_ATK_MINUS_1, + .chance = 30, + }), }, [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, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SP_ATK_PLUS_1, + .self = TRUE, + .chance = 100, + }), }, [MOVE_RAGING_FURY] = { - #if B_UPDATED_MOVE_DATA >= GEN_9 - .power = 120, - #else - .power = 90, - #endif - .effect = EFFECT_RAMPAGE, + .effect = EFFECT_HIT, + .power = B_UPDATED_MOVE_DATA >= GEN_9 ? 120 : 90, .type = TYPE_FIRE, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_RANDOM, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .metronomeBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_THRASH, + .self = TRUE, + }), }, [MOVE_WAVE_CRASH] = { - #if B_UPDATED_MOVE_DATA >= GEN_9 - .power = 120, - #else - .power = 75, - #endif - .effect = EFFECT_RECOIL, + .effect = EFFECT_HIT, + .power = B_UPDATED_MOVE_DATA >= GEN_9 ? 120 : 75, .type = TYPE_WATER, .accuracy = 100, .recoil = 33, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -12745,16 +12797,11 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_CHLOROBLAST] = { - #if B_UPDATED_MOVE_DATA >= GEN_9 - .power = 150, - #else - .power = 120, - #endif .effect = EFFECT_STEEL_BEAM, + .power = B_UPDATED_MOVE_DATA >= GEN_9 ? 150 : 120, .type = TYPE_GRASS, .accuracy = 95, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -12762,16 +12809,19 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_MOUNTAIN_GALE] = { - .effect = EFFECT_FLINCH_HIT, + .effect = EFFECT_HIT, .power = 100, .type = TYPE_ICE, .accuracy = 85, .pp = 5, - .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_FLINCH, + .chance = 30, + }), }, [MOVE_VICTORY_DANCE] = @@ -12781,7 +12831,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FIGHTING, .accuracy = 0, .pp = 20, - .secondaryEffectChance = 100, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -12793,39 +12842,38 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_HEADLONG_RUSH] = { - #if B_UPDATED_MOVE_DATA >= GEN_9 - .power = 120, - #else - .power = 100, - #endif - .effect = EFFECT_CLOSE_COMBAT, + .effect = EFFECT_HIT, + .power = B_UPDATED_MOVE_DATA >= GEN_9 ? 120 : 100, .type = TYPE_GROUND, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .punchingMove = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_DEF_SPDEF_DOWN, + .self = TRUE, + }), }, [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 - .secondaryEffectChance = 50, + .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, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_POISON, + .chance = 50, + }), }, [MOVE_ESPER_WING] = @@ -12837,15 +12885,19 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .power = 75, .accuracy = 90, #endif - .effect = EFFECT_SPEED_UP_HIT, + .effect = EFFECT_HIT, .type = TYPE_PSYCHIC, .criticalHitStage = 1, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SPD_PLUS_1, + .self = TRUE, + .chance = 100, + }), }, [MOVE_BITTER_MALICE] = @@ -12855,15 +12907,18 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = #else .power = 60, #endif - .effect = EFFECT_ATTACK_DOWN_HIT, + .effect = EFFECT_HIT, .type = TYPE_GHOST, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_ATK_MINUS_1, + .chance = 100, + }), }, [MOVE_SHELTER] = @@ -12873,7 +12928,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_STEEL, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -12891,46 +12945,59 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .power = 50, .pp = 15, #endif - .effect = EFFECT_TRIPLE_ARROWS, + .effect = EFFECT_HIT, .type = TYPE_FIGHTING, .accuracy = 100, .criticalHitStage = 1, - .secondaryEffectChance = 100, // 50% Defense down, 30% Flinch. Can be modified in 'SetMoveEffect' .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_DEF_MINUS_1, + .chance = 50, + }, + { + .moveEffect = MOVE_EFFECT_FLINCH, + .chance = 30, + }), }, [MOVE_INFERNAL_PARADE] = { - .effect = EFFECT_INFERNAL_PARADE, + .effect = EFFECT_DOUBLE_POWER_ON_ARG_STATUS, .power = 60, .type = TYPE_GHOST, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, + .argument = STATUS1_ANY, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_BURN, + .chance = 30, + }), }, [MOVE_CEASELESS_EDGE] = { - .effect = EFFECT_HIT_SET_ENTRY_HAZARD, + .effect = EFFECT_HIT, .power = 65, .type = TYPE_DARK, .accuracy = 90, .pp = 15, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, - .argument = MOVE_EFFECT_SPIKES, .sheerForceBoost = TRUE, .slicingMove = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SPIKES, + .chance = 100, + }), }, [MOVE_BLEAKWIND_STORM] = @@ -12942,15 +13009,18 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .power = 95, .pp = 5, #endif - .effect = EFFECT_SPEED_DOWN_HIT, + .effect = EFFECT_HIT, .type = TYPE_FLYING, .accuracy = 80, - .secondaryEffectChance = 30, .target = MOVE_TARGET_BOTH, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, .windMove = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SPD_MINUS_1, + .chance = 30, + }), }, [MOVE_WILDBOLT_STORM] = @@ -12962,15 +13032,18 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .power = 95, .pp = 5, #endif - .effect = EFFECT_PARALYZE_HIT, + .effect = EFFECT_HIT, .type = TYPE_ELECTRIC, .accuracy = 80, - .secondaryEffectChance = 20, .target = MOVE_TARGET_BOTH, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, .windMove = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_PARALYSIS, + .chance = 20, + }), }, [MOVE_SANDSEAR_STORM] = @@ -12982,15 +13055,18 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .power = 95, .pp = 5, #endif - .effect = EFFECT_BURN_HIT, + .effect = EFFECT_HIT, .type = TYPE_GROUND, .accuracy = 80, - .secondaryEffectChance = 20, .target = MOVE_TARGET_BOTH, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, .windMove = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_BURN, + .chance = 20, + }), }, [MOVE_LUNAR_BLESSING] = @@ -13000,7 +13076,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -13017,7 +13092,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -13033,7 +13107,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -13048,7 +13121,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_BUG, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 4, .category = BATTLE_CATEGORY_STATUS, @@ -13060,17 +13132,20 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_AXE_KICK] = { - .effect = EFFECT_AXE_KICK, + .effect = EFFECT_RECOIL_IF_MISS, .power = 120, .type = TYPE_FIGHTING, .accuracy = 90, .pp = 10, - .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_CONFUSION, + .chance = 30, + }), }, [MOVE_LAST_RESPECTS] = @@ -13080,7 +13155,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GHOST, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -13089,16 +13163,19 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_LUMINA_CRASH] = { - .effect = EFFECT_SPECIAL_DEFENSE_DOWN_HIT_2, + .effect = EFFECT_HIT, .power = 80, .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SP_DEF_MINUS_2, + .chance = 100, + }), }, [MOVE_ORDER_UP] = @@ -13108,7 +13185,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_DRAGON, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -13124,7 +13200,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_WATER, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 1, .category = BATTLE_CATEGORY_PHYSICAL, @@ -13141,7 +13216,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GRASS, .accuracy = 0, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -13151,17 +13225,20 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_SPIN_OUT] = { - .effect = EFFECT_SPIN_OUT, + .effect = EFFECT_HIT, .power = 100, .type = TYPE_STEEL, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .skyBattleBanned = B_EXTRAPOLATED_MOVE_FLAGS, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SPD_MINUS_2, + .self = TRUE, + }), }, [MOVE_POPULATION_BOMB] = @@ -13171,7 +13248,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 90, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -13188,7 +13264,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ICE, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -13204,7 +13279,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_DRAGON, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -13219,7 +13293,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 1, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -13237,7 +13310,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ROCK, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -13252,7 +13324,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_WATER, .accuracy = 95, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -13262,17 +13333,24 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_MORTAL_SPIN] = { - .effect = EFFECT_MORTAL_SPIN, + .effect = EFFECT_HIT, .power = 30, .type = TYPE_POISON, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 100, .target = MOVE_TARGET_BOTH, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .sheerForceBoost = TRUE, .makesContact = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_RAPIDSPIN, + .self = TRUE, + }, + { + .moveEffect = MOVE_EFFECT_POISON, + .chance = 100, + }), }, [MOVE_DOODLE] = @@ -13282,7 +13360,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -13298,7 +13375,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -13316,7 +13392,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_DARK, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -13331,7 +13406,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GRASS, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -13340,34 +13414,42 @@ 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, .category = BATTLE_CATEGORY_SPECIAL, .sheerForceBoost = TRUE, .soundMove = TRUE, .ignoresSubstitute = B_UPDATED_MOVE_FLAGS >= GEN_6, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SP_ATK_PLUS_1, + .self = TRUE, + .chance = 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, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .sheerForceBoost = TRUE, .danceMove = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SPD_PLUS_1, + .self = TRUE, + .chance = 100, + }), }, [MOVE_RAGING_BULL] = @@ -13377,7 +13459,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -13387,16 +13468,22 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_MAKE_IT_RAIN] = { - .effect = EFFECT_MAKE_IT_RAIN, + .effect = EFFECT_HIT, .power = 120, .type = TYPE_STEEL, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 100, .target = MOVE_TARGET_BOTH, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .metronomeBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_PAYDAY, + }, + { + .moveEffect = MOVE_EFFECT_SP_ATK_MINUS_1, + .self = TRUE, + }), }, [MOVE_RUINATION] = @@ -13406,7 +13493,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_DARK, .accuracy = 90, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -13420,7 +13506,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FIGHTING, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -13435,7 +13520,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ELECTRIC, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -13450,7 +13534,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -13467,7 +13550,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ICE, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_ALL_BATTLERS, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -13484,7 +13566,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -13500,7 +13581,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ICE, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_ALL_BATTLERS, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -13512,46 +13592,57 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_POUNCE] = { - .effect = EFFECT_SPEED_DOWN_HIT, + .effect = EFFECT_HIT, .power = 50, .type = TYPE_BUG, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, + .sheerForceBoost = TRUE, .makesContact = TRUE, .metronomeBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SPD_MINUS_1, + .chance = 100, + }), }, [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, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .metronomeBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SPD_PLUS_1, + .self = TRUE, + .chance = 100, + }), }, [MOVE_CHILLING_WATER] = { - .effect = EFFECT_ATTACK_DOWN_HIT, + .effect = EFFECT_HIT, .power = 50, .type = TYPE_WATER, .accuracy = 100, .pp = 20, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .metronomeBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_ATK_MINUS_1, + .chance = 100, + }), }, [MOVE_HYPER_DRILL] = @@ -13561,7 +13652,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -13577,7 +13667,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -13592,7 +13681,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GHOST, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -13603,16 +13691,19 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_ARMOR_CANNON] = { - .effect = EFFECT_CLOSE_COMBAT, + .effect = EFFECT_HIT, .power = 120, .type = TYPE_FIRE, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .metronomeBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_DEF_SPDEF_DOWN, + .self = TRUE, + }), }, [MOVE_BITTER_BLADE] = @@ -13622,7 +13713,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FIRE, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -13633,17 +13723,21 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_DOUBLE_SHOCK] = { - .effect = EFFECT_DOUBLE_SHOCK, + .effect = EFFECT_FAIL_IF_NOT_ARG_TYPE, .power = 120, .type = TYPE_ELECTRIC, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, .metronomeBanned = TRUE, + .argument = TYPE_ELECTRIC, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_REMOVE_ARG_TYPE, + .self = TRUE, + }), }, [MOVE_GIGATON_HAMMER] = @@ -13653,7 +13747,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_STEEL, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -13667,7 +13760,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_DARK, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_DEPENDS, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -13684,7 +13776,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .accuracy = 100, .criticalHitStage = 1, .pp = 20, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -13693,12 +13784,11 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_BLAZING_TORQUE] = { - .effect = EFFECT_BURN_HIT, + .effect = EFFECT_HIT, .power = 80, .type = TYPE_FIRE, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -13713,16 +13803,19 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .encoreBanned = TRUE, .assistBanned = TRUE, .sketchBanned = (B_SKETCH_BANS >= GEN_9), + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_BURN, + .chance = 30, + }), }, [MOVE_WICKED_TORQUE] = { - .effect = EFFECT_SLEEP_HIT, + .effect = EFFECT_HIT, .power = 80, .type = TYPE_DARK, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 10, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -13737,16 +13830,19 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .encoreBanned = TRUE, .assistBanned = TRUE, .sketchBanned = (B_SKETCH_BANS >= GEN_9), + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SLEEP, + .chance = 10, + }), }, [MOVE_NOXIOUS_TORQUE] = { - .effect = EFFECT_POISON_HIT, + .effect = EFFECT_HIT, .power = 100, .type = TYPE_POISON, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -13761,16 +13857,19 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .encoreBanned = TRUE, .assistBanned = TRUE, .sketchBanned = (B_SKETCH_BANS >= GEN_9), + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_POISON, + .chance = 30, + }), }, [MOVE_COMBAT_TORQUE] = { - .effect = EFFECT_PARALYZE_HIT, + .effect = EFFECT_HIT, .power = 100, .type = TYPE_FIGHTING, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -13785,16 +13884,19 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .encoreBanned = TRUE, .assistBanned = TRUE, .sketchBanned = (B_SKETCH_BANS >= GEN_9), + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_PARALYSIS, + .chance = 30, + }), }, [MOVE_MAGICAL_TORQUE] = { - .effect = EFFECT_CONFUSE_HIT, + .effect = EFFECT_HIT, .power = 100, .type = TYPE_FAIRY, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 30, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -13809,6 +13911,10 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .encoreBanned = TRUE, .assistBanned = TRUE, .sketchBanned = (B_SKETCH_BANS >= GEN_9), + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_CONFUSION, + .chance = 30, + }), }, [MOVE_PSYBLADE] = @@ -13818,7 +13924,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -13833,7 +13938,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_WATER, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -13847,7 +13951,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -13856,33 +13959,39 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_MATCHA_GOTCHA] = { - .effect = EFFECT_MATCHA_GOTCHA, + .effect = EFFECT_ABSORB, .power = 80, .type = TYPE_GRASS, .accuracy = 90, .pp = 15, - .secondaryEffectChance = 20, .target = MOVE_TARGET_BOTH, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .thawsUser = TRUE, .metronomeBanned = TRUE, - .healBlockBanned = TRUE, + .healBlockBanned = B_EXTRAPOLATED_MOVE_FLAGS, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_BURN, + .chance = 20, + }), }, [MOVE_SYRUP_BOMB] = { - .effect = EFFECT_SYRUP_BOMB, + .effect = EFFECT_HIT, .power = 60, .type = TYPE_GRASS, .accuracy = 85, .pp = 10, - .secondaryEffectChance = 100, // syrup bomb volatile status .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .ballisticMove = TRUE, .metronomeBanned = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SYRUP_BOMB, + .chance = 100, + }), }, [MOVE_IVY_CUDGEL] = @@ -13893,7 +14002,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .accuracy = 100, .pp = 10, .criticalHitStage = 1, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -13907,11 +14015,15 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ELECTRIC, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, - //.sheerForceBoost = TRUE, (uncomment when effect is implemented, otherwise it breaks the Sheer Force Test) + .sheerForceBoost = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SP_ATK_PLUS_1, + .self = TRUE, + .onChargeTurnOnly = TRUE, + }), }, [MOVE_TERA_STARSTORM] = @@ -13921,7 +14033,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, // Stellar type if used by Terapagos-Stellar .accuracy = 100, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, // MOVE_TARGET_BOTH if used by Terapagos-Stellar .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -13938,7 +14049,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_DRAGON, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -13951,7 +14061,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FIRE, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 4, .category = BATTLE_CATEGORY_STATUS, @@ -13971,7 +14080,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ELECTRIC, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 1, .category = BATTLE_CATEGORY_SPECIAL, @@ -13979,16 +14087,16 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_MIGHTY_CLEAVE] = { - .effect = EFFECT_FEINT, + .effect = EFFECT_HIT, .power = 95, .type = TYPE_ROCK, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, .makesContact = TRUE, + .ignoresProtect = TRUE, .slicingMove = TRUE, }, @@ -13999,7 +14107,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_STEEL, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -14014,7 +14121,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_STEEL, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -14028,7 +14134,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_DRAGON, .accuracy = 0, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_ALLY, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -14037,18 +14142,22 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_ALLURING_VOICE] = { - .effect = EFFECT_CONFUSE_HIT, + .effect = EFFECT_HIT, .power = 80, .type = TYPE_FAIRY, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, .soundMove = TRUE, .sheerForceBoost = TRUE, .ignoresSubstitute = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_CONFUSION, + .onlyIfTargetRaisedStats = TRUE, + .chance = 100, + }), }, [MOVE_TEMPER_FLARE] = @@ -14058,7 +14167,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FIRE, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -14072,7 +14180,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ELECTRIC, .accuracy = 95, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -14086,7 +14193,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -14101,7 +14207,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FIGHTING, .accuracy = 100, .pp = 15, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 3, .category = BATTLE_CATEGORY_PHYSICAL, @@ -14110,15 +14215,18 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = [MOVE_MALIGNANT_CHAIN] = { - .effect = EFFECT_POISON_FANG, + .effect = EFFECT_HIT, .power = 100, .type = TYPE_POISON, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 50, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_TOXIC, + .chance = 50, + }), }, // Z-Moves @@ -14129,7 +14237,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 1, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, //determined from move type @@ -14141,7 +14248,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FIGHTING, .accuracy = 0, .pp = 1, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -14153,7 +14259,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FLYING, .accuracy = 0, .pp = 1, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -14165,7 +14270,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_POISON, .accuracy = 0, .pp = 1, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -14177,7 +14281,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GROUND, .accuracy = 0, .pp = 1, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -14190,7 +14293,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ROCK, .accuracy = 0, .pp = 1, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -14202,7 +14304,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_BUG, .accuracy = 0, .pp = 1, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -14214,7 +14315,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GHOST, .accuracy = 0, .pp = 1, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -14226,7 +14326,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_STEEL, .accuracy = 0, .pp = 1, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -14238,7 +14337,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FIRE, .accuracy = 0, .pp = 1, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -14250,7 +14348,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_WATER, .accuracy = 0, .pp = 1, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -14262,7 +14359,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GRASS, .accuracy = 0, .pp = 1, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -14274,7 +14370,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ELECTRIC, .accuracy = 0, .pp = 1, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -14286,7 +14381,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 1, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -14298,7 +14392,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ICE, .accuracy = 0, .pp = 1, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -14310,7 +14403,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_DRAGON, .accuracy = 0, .pp = 1, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -14322,7 +14414,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_DARK, .accuracy = 0, .pp = 1, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -14334,7 +14425,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FAIRY, .accuracy = 0, .pp = 1, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -14346,7 +14436,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ELECTRIC, .accuracy = 0, .pp = 1, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -14359,22 +14448,24 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .accuracy = 0, .criticalHitStage = 2, .pp = 1, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, }, [MOVE_STOKED_SPARKSURFER] = { - .effect = EFFECT_PARALYZE_HIT, + .effect = EFFECT_HIT, .power = 175, .type = TYPE_ELECTRIC, .accuracy = 0, .pp = 1, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_PARALYSIS, + .chance = 100, + }), }, [MOVE_EXTREME_EVOBOOST] = { @@ -14383,7 +14474,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 1, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 0, .category = BATTLE_CATEGORY_STATUS, @@ -14395,7 +14485,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 1, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -14407,7 +14496,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 1, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -14420,7 +14508,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GHOST, .accuracy = 0, .pp = 1, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -14432,7 +14519,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_DARK, .accuracy = 0, .pp = 1, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -14444,7 +14530,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_WATER, .accuracy = 0, .pp = 1, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -14456,7 +14541,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ROCK, .accuracy = 0, .pp = 1, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -14469,24 +14553,27 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FAIRY, .accuracy = 0, .pp = 1, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, }, [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, .category = BATTLE_CATEGORY_SPECIAL, .soundMove = TRUE, .ignoresSubstitute = B_UPDATED_MOVE_FLAGS >= GEN_6, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_ALL_STATS_UP, + .self = TRUE, + .chance = 100, + }), }, [MOVE_GUARDIAN_OF_ALOLA] = { @@ -14495,7 +14582,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FAIRY, .accuracy = 0, .pp = 1, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -14507,7 +14593,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_STEEL, .accuracy = 0, .pp = 1, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -14519,7 +14604,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GHOST, .accuracy = 0, .pp = 1, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -14531,7 +14615,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 1, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_SPECIAL, @@ -14543,7 +14626,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GHOST, .accuracy = 0, .pp = 1, - .secondaryEffectChance = 0, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -14556,7 +14638,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 0, .target = MOVE_TARGET_USER, .priority = 4, .category = BATTLE_CATEGORY_STATUS, @@ -14570,7 +14651,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FIRE, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -14584,7 +14664,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_BUG, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -14598,7 +14677,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ELECTRIC, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -14612,7 +14690,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -14626,7 +14703,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FIGHTING, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -14640,7 +14716,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GHOST, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -14654,7 +14729,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ICE, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -14668,7 +14742,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_POISON, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -14682,7 +14755,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_WATER, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -14696,7 +14768,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FLYING, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -14710,7 +14781,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FAIRY, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -14724,7 +14794,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_DRAGON, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -14738,7 +14807,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -14752,7 +14820,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ROCK, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -14766,7 +14833,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GROUND, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -14781,7 +14847,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_DARK, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -14795,7 +14860,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GRASS, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -14809,7 +14873,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_STEEL, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -14823,7 +14886,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GRASS, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -14837,7 +14899,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FIRE, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -14851,7 +14912,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_WATER, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -14865,7 +14925,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_BUG, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -14879,7 +14938,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ELECTRIC, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -14893,7 +14951,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -14907,7 +14964,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FIGHTING, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -14921,7 +14977,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GHOST, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -14935,7 +14990,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_WATER, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -14949,7 +15003,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ICE, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -14963,7 +15016,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -14977,7 +15029,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -14991,7 +15042,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_POISON, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -15005,7 +15055,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_STEEL, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -15019,7 +15068,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GRASS, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -15034,7 +15082,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FIRE, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -15049,7 +15096,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_WATER, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -15064,7 +15110,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FLYING, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -15078,7 +15123,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -15092,7 +15136,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_WATER, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -15106,7 +15149,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ROCK, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -15120,7 +15162,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GRASS, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -15134,7 +15175,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GRASS, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -15148,7 +15188,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_GROUND, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -15162,7 +15201,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_ELECTRIC, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -15176,7 +15214,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FIRE, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -15190,7 +15227,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FAIRY, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -15205,7 +15241,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_DARK, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -15219,7 +15254,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_FAIRY, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -15233,7 +15267,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_STEEL, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -15247,7 +15280,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_DRAGON, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -15261,7 +15293,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_DARK, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, @@ -15275,7 +15306,6 @@ const struct BattleMove gBattleMoves[MOVES_COUNT_DYNAMAX] = .type = TYPE_WATER, .accuracy = 0, .pp = 10, - .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .category = BATTLE_CATEGORY_PHYSICAL, diff --git a/test/battle/ability/contrary.c b/test/battle/ability/contrary.c index af71b211c8..dc2d2cffe7 100644 --- a/test/battle/ability/contrary.c +++ b/test/battle/ability/contrary.c @@ -82,7 +82,7 @@ SINGLE_BATTLE_TEST("Contrary raises stats after using a move which would normall PARAMETRIZE { ability = ABILITY_CONTRARY; } PARAMETRIZE { ability = ABILITY_TANGLED_FEET; } GIVEN { - ASSUME(gBattleMoves[MOVE_OVERHEAT].effect == EFFECT_OVERHEAT); + ASSUME(MoveHasMoveEffectSelf(MOVE_OVERHEAT, MOVE_EFFECT_SP_ATK_TWO_DOWN) == TRUE); ASSUME(gBattleMoves[MOVE_OVERHEAT].category == BATTLE_CATEGORY_SPECIAL); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_SPINDA) { Ability(ability); } diff --git a/test/battle/ability/hyper_cutter.c b/test/battle/ability/hyper_cutter.c index 8e5c0a40ba..90ba7aeb27 100644 --- a/test/battle/ability/hyper_cutter.c +++ b/test/battle/ability/hyper_cutter.c @@ -79,7 +79,7 @@ SINGLE_BATTLE_TEST("Hyper Cutter is ignored by Mold Breaker") SINGLE_BATTLE_TEST("Hyper Cutter doesn't prevent Attack stage reduction from moves used by the user") { GIVEN { - ASSUME(gBattleMoves[MOVE_SUPERPOWER].effect == EFFECT_SUPERPOWER); + ASSUME(MoveHasMoveEffectSelf(MOVE_SUPERPOWER, MOVE_EFFECT_ATK_DEF_DOWN) == TRUE); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_KRABBY) { Ability(ABILITY_HYPER_CUTTER); } } WHEN { @@ -117,7 +117,7 @@ SINGLE_BATTLE_TEST("Hyper Cutter doesn't prevent Spectral Thief from resetting p { GIVEN { ASSUME(gBattleMoves[MOVE_SWORDS_DANCE].effect == EFFECT_ATTACK_UP_2); - ASSUME(gBattleMoves[MOVE_SPECTRAL_THIEF].effect == EFFECT_SPECTRAL_THIEF); + ASSUME(MoveHasMoveEffect(MOVE_SPECTRAL_THIEF, MOVE_EFFECT_SPECTRAL_THIEF)); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_KRABBY) { Ability(ABILITY_HYPER_CUTTER); } } WHEN { diff --git a/test/battle/ability/immunity.c b/test/battle/ability/immunity.c index 3c6c4afa6f..c92e9041e1 100644 --- a/test/battle/ability/immunity.c +++ b/test/battle/ability/immunity.c @@ -4,7 +4,7 @@ SINGLE_BATTLE_TEST("Immunity prevents Poison Sting poison") { GIVEN { - ASSUME(gBattleMoves[MOVE_POISON_STING].effect == EFFECT_POISON_HIT); + ASSUME(MoveHasMoveEffect(MOVE_POISON_STING, MOVE_EFFECT_POISON) == TRUE); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_SNORLAX) { Ability(ABILITY_IMMUNITY); } } WHEN { diff --git a/test/battle/ability/keen_eye.c b/test/battle/ability/keen_eye.c index c0a6f34c84..6f3e63c5b5 100644 --- a/test/battle/ability/keen_eye.c +++ b/test/battle/ability/keen_eye.c @@ -174,7 +174,7 @@ SINGLE_BATTLE_TEST("Keen Eye & Gen9+ Illuminate don't prevent Spectral Thief fro GIVEN { ASSUME(gBattleMoves[MOVE_HONE_CLAWS].effect == EFFECT_ATTACK_ACCURACY_UP); - ASSUME(gBattleMoves[MOVE_SPECTRAL_THIEF].effect == EFFECT_SPECTRAL_THIEF); + ASSUME(MoveHasMoveEffect(MOVE_SPECTRAL_THIEF, MOVE_EFFECT_SPECTRAL_THIEF) == TRUE); PLAYER(SPECIES_WOBBUFFET); OPPONENT(species) { Ability(ability); } } WHEN { diff --git a/test/battle/ability/leaf_guard.c b/test/battle/ability/leaf_guard.c index 595a9451c3..9d9dd211f7 100644 --- a/test/battle/ability/leaf_guard.c +++ b/test/battle/ability/leaf_guard.c @@ -9,29 +9,21 @@ SINGLE_BATTLE_TEST("Leaf Guard prevents non-volatile status conditions in sun") PARAMETRIZE { move = MOVE_HYPNOSIS; status = STATUS1_SLEEP; } PARAMETRIZE { move = MOVE_THUNDER_WAVE; status = STATUS1_PARALYSIS; } PARAMETRIZE { move = MOVE_TOXIC; status = STATUS1_TOXIC_POISON; } - PARAMETRIZE { move = MOVE_POWDER_SNOW; status = STATUS1_FREEZE; } + // PARAMETRIZE { move = MOVE_POWDER_SNOW; status = STATUS1_FREEZE; } // Pointless since you can't freeze in sunlight anyway GIVEN { ASSUME(gBattleMoves[MOVE_WILL_O_WISP].effect == EFFECT_WILL_O_WISP); ASSUME(gBattleMoves[MOVE_HYPNOSIS].effect == EFFECT_SLEEP); ASSUME(gBattleMoves[MOVE_THUNDER_WAVE].effect == EFFECT_PARALYZE); ASSUME(gBattleMoves[MOVE_TOXIC].effect == EFFECT_TOXIC); - ASSUME(gBattleMoves[MOVE_POWDER_SNOW].effect == EFFECT_FREEZE_HIT); PLAYER(SPECIES_LEAFEON) { Ability(ABILITY_LEAF_GUARD); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_SUNNY_DAY); MOVE(opponent, move); } } SCENE { - if (move != MOVE_POWDER_SNOW) { - NOT ANIMATION(ANIM_TYPE_MOVE, move, opponent); - ABILITY_POPUP(player, ABILITY_LEAF_GUARD); - MESSAGE("It doesn't affect Leafeon…"); - NOT STATUS_ICON(player, status); - } else { - NONE_OF { - ABILITY_POPUP(player, ABILITY_LEAF_GUARD); - STATUS_ICON(player, status); - } - } + NOT ANIMATION(ANIM_TYPE_MOVE, move, opponent); + ABILITY_POPUP(player, ABILITY_LEAF_GUARD); + MESSAGE("It doesn't affect Leafeon…"); + NOT STATUS_ICON(player, status); } } diff --git a/test/battle/ability/own_tempo.c b/test/battle/ability/own_tempo.c index 9babd52589..387d886027 100644 --- a/test/battle/ability/own_tempo.c +++ b/test/battle/ability/own_tempo.c @@ -44,7 +44,7 @@ SINGLE_BATTLE_TEST("Own Tempo prevents confusion from moves by the opponent") SINGLE_BATTLE_TEST("Own Tempo prevents confusion from moves by the user") { GIVEN { - ASSUME(gBattleMoves[MOVE_PETAL_DANCE].effect == EFFECT_RAMPAGE); + ASSUME(MoveHasMoveEffectSelf(MOVE_PETAL_DANCE, MOVE_EFFECT_THRASH)); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_SLOWPOKE) { Ability(ABILITY_OWN_TEMPO); }; } WHEN { diff --git a/test/battle/ability/pastel_veil.c b/test/battle/ability/pastel_veil.c index 74d764fc30..8e6c8d5c12 100644 --- a/test/battle/ability/pastel_veil.c +++ b/test/battle/ability/pastel_veil.c @@ -4,7 +4,7 @@ SINGLE_BATTLE_TEST("Pastel Veil prevents Poison Sting poison") { GIVEN { - ASSUME(gBattleMoves[MOVE_POISON_STING].effect == EFFECT_POISON_HIT); + ASSUME(MoveHasMoveEffect(MOVE_POISON_STING, MOVE_EFFECT_POISON) == TRUE); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_PONYTA_GALARIAN) { Ability(ABILITY_PASTEL_VEIL); } } WHEN { @@ -18,7 +18,7 @@ SINGLE_BATTLE_TEST("Pastel Veil prevents Poison Sting poison") DOUBLE_BATTLE_TEST("Pastel Veil prevents Poison Sting poison on partner") { GIVEN { - ASSUME(gBattleMoves[MOVE_POISON_STING].effect == EFFECT_POISON_HIT); + ASSUME(MoveHasMoveEffect(MOVE_POISON_STING, MOVE_EFFECT_POISON) == TRUE); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_PONYTA_GALARIAN) { Ability(ABILITY_PASTEL_VEIL); } diff --git a/test/battle/ability/purifying_salt.c b/test/battle/ability/purifying_salt.c index 6cac4c5d8b..4f62140f60 100644 --- a/test/battle/ability/purifying_salt.c +++ b/test/battle/ability/purifying_salt.c @@ -47,7 +47,7 @@ SINGLE_BATTLE_TEST("Purifying Salt grants immunity to status effects") ASSUME(gBattleMoves[MOVE_HYPNOSIS].effect == EFFECT_SLEEP); ASSUME(gBattleMoves[MOVE_THUNDER_WAVE].effect == EFFECT_PARALYZE); ASSUME(gBattleMoves[MOVE_TOXIC].effect == EFFECT_TOXIC); - ASSUME(gBattleMoves[MOVE_POWDER_SNOW].effect == EFFECT_FREEZE_HIT); + ASSUME(MoveHasMoveEffect(MOVE_POWDER_SNOW, MOVE_EFFECT_FREEZE_OR_FROSTBITE) == TRUE); PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_PURIFYING_SALT); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/ability/sheer_force.c b/test/battle/ability/sheer_force.c index f98b292b89..e2cd06d524 100644 --- a/test/battle/ability/sheer_force.c +++ b/test/battle/ability/sheer_force.c @@ -8,7 +8,10 @@ SINGLE_BATTLE_TEST("Sheer Force boosts power, but removes secondary effects of m for (j = 1; j < MOVES_COUNT; j++) { - if (gBattleMoves[j].sheerForceBoost && j != MOVE_ORDER_UP) + if (gBattleMoves[j].sheerForceBoost + //&& gBattleMoves[j].effect != EFFECT_ORDER_UP + && gBattleMoves[j].effect != EFFECT_AURA_WHEEL + && gBattleMoves[j].effect != EFFECT_PLACEHOLDER) { PARAMETRIZE { ability = ABILITY_ANGER_POINT; move = j; } PARAMETRIZE { ability = ABILITY_SHEER_FORCE; move = j; } @@ -19,8 +22,12 @@ SINGLE_BATTLE_TEST("Sheer Force boosts power, but removes secondary effects of m PLAYER(SPECIES_TAUROS) { Ability(ability); Status1(move == MOVE_SNORE ? STATUS1_SLEEP : STATUS1_NONE); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { MOVE(player, move); } - if (gBattleMoves[move].effect == EFFECT_TWO_TURNS_ATTACK || gBattleMoves[move].effect == EFFECT_SEMI_INVULNERABLE) { + if (move == MOVE_ALLURING_VOICE || move == MOVE_BURNING_JEALOUSY) // Alluring Voice requires the target to boost stats to have an effect + TURN { MOVE(opponent, MOVE_AGILITY); MOVE(player, move); } + else + TURN { MOVE(player, move); } + if (gBattleMoves[move].effect == EFFECT_TWO_TURNS_ATTACK || gBattleMoves[move].effect == EFFECT_SEMI_INVULNERABLE + || gBattleMoves[move].effect == EFFECT_METEOR_BEAM) { TURN { SKIP_TURN(player); } TURN { ; } } @@ -40,7 +47,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 2f229e3aca..a82e93eae1 100644 --- a/test/battle/ai_check_viability.c +++ b/test/battle/ai_check_viability.c @@ -4,7 +4,7 @@ ASSUMPTIONS { - ASSUME(gBattleMoves[MOVE_BODY_SLAM].effect == EFFECT_PARALYZE_HIT); + ASSUME(MoveHasMoveEffect(MOVE_BODY_SLAM, MOVE_EFFECT_PARALYSIS) == TRUE); } AI_SINGLE_BATTLE_TEST("AI sees increased base power of Facade") @@ -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); } @@ -57,7 +58,8 @@ AI_SINGLE_BATTLE_TEST("AI sees increased base power of 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); } @@ -74,17 +76,18 @@ AI_SINGLE_BATTLE_TEST("AI sees increased base power of Grav Apple") u32 movePlayer; u16 expectedMove; - PARAMETRIZE { movePlayer = MOVE_CELEBRATE; expectedMove = MOVE_TROP_KICK; } + PARAMETRIZE { movePlayer = MOVE_CELEBRATE; expectedMove = MOVE_DRUM_BEATING; } PARAMETRIZE { movePlayer = MOVE_GRAVITY; expectedMove = MOVE_GRAV_APPLE; } GIVEN { ASSUME(gBattleMoves[MOVE_GRAV_APPLE].effect == EFFECT_GRAV_APPLE); - ASSUME(gBattleMoves[MOVE_TROP_KICK].effect == EFFECT_ATTACK_DOWN_HIT); + ASSUME(gBattleMoves[MOVE_GRAV_APPLE].power == gBattleMoves[MOVE_DRUM_BEATING].power); + ASSUME(MoveHasMoveEffect(MOVE_DRUM_BEATING, MOVE_EFFECT_SPD_MINUS_1) == TRUE); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET) { HP(81); Speed(20); } - OPPONENT(SPECIES_WOBBUFFET) { Speed(10); Moves(MOVE_TROP_KICK, MOVE_GRAV_APPLE); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(10); Moves(MOVE_DRUM_BEATING, MOVE_GRAV_APPLE); } } WHEN { - TURN { MOVE(player, movePlayer); EXPECT_MOVE(opponent, MOVE_TROP_KICK); } + TURN { MOVE(player, movePlayer); EXPECT_MOVE(opponent, MOVE_DRUM_BEATING); } TURN { MOVE(player, MOVE_CELEBRATE); EXPECT_MOVE(opponent, expectedMove); } } SCENE { if (expectedMove == MOVE_GRAV_APPLE) @@ -175,10 +178,8 @@ AI_SINGLE_BATTLE_TEST("AI chooses moves with secondary effect that have a 100% c GIVEN { AI_LOG; - ASSUME(gBattleMoves[MOVE_SHADOW_BALL].effect == EFFECT_SPECIAL_DEFENSE_DOWN_HIT); - ASSUME(gBattleMoves[MOVE_SHADOW_BALL].secondaryEffectChance == 20); - ASSUME(gBattleMoves[MOVE_OCTAZOOKA].effect == EFFECT_ACCURACY_DOWN_HIT); - ASSUME(gBattleMoves[MOVE_OCTAZOOKA].secondaryEffectChance == 50); + ASSUME(MoveHasMoveEffectWithChance(MOVE_SHADOW_BALL, MOVE_EFFECT_SP_DEF_MINUS_1, 20)); + ASSUME(MoveHasMoveEffectWithChance(MOVE_OCTAZOOKA, MOVE_EFFECT_ACC_MINUS_1, 50)); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_REGICE); OPPONENT(SPECIES_REGIROCK) { Ability(ability); Moves(MOVE_SHADOW_BALL, MOVE_OCTAZOOKA); } diff --git a/test/battle/form_change/status.c b/test/battle/form_change/status.c index a8f286846a..6bdc83efc8 100644 --- a/test/battle/form_change/status.c +++ b/test/battle/form_change/status.c @@ -3,7 +3,7 @@ SINGLE_BATTLE_TEST("Shaymin-Sky reverts to Shaymin-Land when frozen or frostbitten") { - ASSUME(gBattleMoves[MOVE_POWDER_SNOW].effect == ((B_USE_FROSTBITE == TRUE) ? EFFECT_FROSTBITE_HIT : EFFECT_FREEZE_HIT)); + ASSUME(MoveHasMoveEffect(MOVE_POWDER_SNOW, MOVE_EFFECT_FREEZE_OR_FROSTBITE)); GIVEN { PLAYER(SPECIES_SHAYMIN_SKY); OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/hold_effect/air_balloon.c b/test/battle/hold_effect/air_balloon.c index 46fec5c029..cb16972d5c 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) == TRUE); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_AIR_BALLOON); }; OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/hold_effect/attack_up.c b/test/battle/hold_effect/attack_up.c index c07c7c7c17..afdee8adf8 100644 --- a/test/battle/hold_effect/attack_up.c +++ b/test/battle/hold_effect/attack_up.c @@ -4,7 +4,8 @@ ASSUMPTIONS { ASSUME(gItems[ITEM_LIECHI_BERRY].holdEffect == HOLD_EFFECT_ATTACK_UP); - ASSUME(gBattleMoves[MOVE_DRAGON_RAGE].effect == EFFECT_DRAGON_RAGE); + ASSUME(gBattleMoves[MOVE_DRAGON_RAGE].effect == EFFECT_FIXED_DAMAGE_ARG); + ASSUME(gBattleMoves[MOVE_DRAGON_RAGE].argument == 40); } SINGLE_BATTLE_TEST("Liechi Berry raises the holder's Attack by one stage when HP drops to 1/4 or below") diff --git a/test/battle/hold_effect/clear_amulet.c b/test/battle/hold_effect/clear_amulet.c index 0073f70609..39e5b3344f 100644 --- a/test/battle/hold_effect/clear_amulet.c +++ b/test/battle/hold_effect/clear_amulet.c @@ -72,12 +72,12 @@ SINGLE_BATTLE_TEST("Clear Amulet prevents secondary effects that reduce stats") PARAMETRIZE { move = MOVE_MUD_SLAP; } GIVEN { - ASSUME(gBattleMoves[MOVE_AURORA_BEAM].effect == EFFECT_ATTACK_DOWN_HIT); - ASSUME(gBattleMoves[MOVE_ROCK_SMASH].effect == EFFECT_DEFENSE_DOWN_HIT); - ASSUME(gBattleMoves[MOVE_SNARL].effect == EFFECT_SPECIAL_ATTACK_DOWN_HIT); - ASSUME(gBattleMoves[MOVE_PSYCHIC].effect == EFFECT_SPECIAL_DEFENSE_DOWN_HIT); - ASSUME(gBattleMoves[MOVE_BUBBLE_BEAM].effect == EFFECT_SPEED_DOWN_HIT); - ASSUME(gBattleMoves[MOVE_MUD_SLAP].effect == EFFECT_ACCURACY_DOWN_HIT); + ASSUME(MoveHasMoveEffect(MOVE_AURORA_BEAM, MOVE_EFFECT_ATK_MINUS_1) == TRUE); + ASSUME(MoveHasMoveEffect(MOVE_ROCK_SMASH, MOVE_EFFECT_DEF_MINUS_1) == TRUE); + ASSUME(MoveHasMoveEffect(MOVE_BUBBLE_BEAM, MOVE_EFFECT_SPD_MINUS_1) == TRUE); + ASSUME(MoveHasMoveEffect(MOVE_SNARL, MOVE_EFFECT_SP_ATK_MINUS_1) == TRUE); + ASSUME(MoveHasMoveEffect(MOVE_PSYCHIC, MOVE_EFFECT_SP_DEF_MINUS_1) == TRUE); + ASSUME(MoveHasMoveEffect(MOVE_MUD_SLAP, MOVE_EFFECT_ACC_MINUS_1) == TRUE); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_CLEAR_AMULET); }; } WHEN { diff --git a/test/battle/hold_effect/critical_hit_up.c b/test/battle/hold_effect/critical_hit_up.c index b714bdb30d..c302311de5 100644 --- a/test/battle/hold_effect/critical_hit_up.c +++ b/test/battle/hold_effect/critical_hit_up.c @@ -4,7 +4,8 @@ ASSUMPTIONS { ASSUME(gItems[ITEM_LANSAT_BERRY].holdEffect == HOLD_EFFECT_CRITICAL_UP); - ASSUME(gBattleMoves[MOVE_DRAGON_RAGE].effect == EFFECT_DRAGON_RAGE); + ASSUME(gBattleMoves[MOVE_DRAGON_RAGE].effect == EFFECT_FIXED_DAMAGE_ARG); + ASSUME(gBattleMoves[MOVE_DRAGON_RAGE].argument == 40); } SINGLE_BATTLE_TEST("Lansat Berry raises the holder's critical-hit-ratio by two stages when HP drops to 1/4 or below") diff --git a/test/battle/hold_effect/defense_up.c b/test/battle/hold_effect/defense_up.c index 485472512a..030c1ba999 100644 --- a/test/battle/hold_effect/defense_up.c +++ b/test/battle/hold_effect/defense_up.c @@ -4,7 +4,8 @@ ASSUMPTIONS { ASSUME(gItems[ITEM_GANLON_BERRY].holdEffect == HOLD_EFFECT_DEFENSE_UP); - ASSUME(gBattleMoves[MOVE_DRAGON_RAGE].effect == EFFECT_DRAGON_RAGE); + ASSUME(gBattleMoves[MOVE_DRAGON_RAGE].effect == EFFECT_FIXED_DAMAGE_ARG); + ASSUME(gBattleMoves[MOVE_DRAGON_RAGE].argument == 40); } SINGLE_BATTLE_TEST("Ganlon Berry raises the holder's Defense by one stage when HP drops to 1/4 or below") diff --git a/test/battle/hold_effect/micle_berry.c b/test/battle/hold_effect/micle_berry.c index 79c40f68cc..e81b3de655 100644 --- a/test/battle/hold_effect/micle_berry.c +++ b/test/battle/hold_effect/micle_berry.c @@ -4,7 +4,8 @@ ASSUMPTIONS { ASSUME(gItems[ITEM_MICLE_BERRY].holdEffect == HOLD_EFFECT_MICLE_BERRY); - ASSUME(gBattleMoves[MOVE_DRAGON_RAGE].effect == EFFECT_DRAGON_RAGE); + ASSUME(gBattleMoves[MOVE_DRAGON_RAGE].effect == EFFECT_FIXED_DAMAGE_ARG); + ASSUME(gBattleMoves[MOVE_DRAGON_RAGE].argument == 40); } SINGLE_BATTLE_TEST("Micle Berry raises the holder's accuracy by 1.2 when HP drops to 1/4 or below") diff --git a/test/battle/hold_effect/red_card.c b/test/battle/hold_effect/red_card.c index 0f80dd176c..9183b0342d 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) == TRUE); GIVEN { PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_RED_CARD); } diff --git a/test/battle/hold_effect/special_attack_up.c b/test/battle/hold_effect/special_attack_up.c index 6ff5b4f07d..9a7ebfe705 100644 --- a/test/battle/hold_effect/special_attack_up.c +++ b/test/battle/hold_effect/special_attack_up.c @@ -4,7 +4,8 @@ ASSUMPTIONS { ASSUME(gItems[ITEM_PETAYA_BERRY].holdEffect == HOLD_EFFECT_SP_ATTACK_UP); - ASSUME(gBattleMoves[MOVE_DRAGON_RAGE].effect == EFFECT_DRAGON_RAGE); + ASSUME(gBattleMoves[MOVE_DRAGON_RAGE].effect == EFFECT_FIXED_DAMAGE_ARG); + ASSUME(gBattleMoves[MOVE_DRAGON_RAGE].argument == 40); } SINGLE_BATTLE_TEST("Petaya Berry raises the holder's Sp. Atk by one stage when HP drops to 1/4 or below") diff --git a/test/battle/hold_effect/special_defense_up.c b/test/battle/hold_effect/special_defense_up.c index db08c1404e..0225588dca 100644 --- a/test/battle/hold_effect/special_defense_up.c +++ b/test/battle/hold_effect/special_defense_up.c @@ -4,7 +4,8 @@ ASSUMPTIONS { ASSUME(gItems[ITEM_APICOT_BERRY].holdEffect == HOLD_EFFECT_SP_DEFENSE_UP); - ASSUME(gBattleMoves[MOVE_DRAGON_RAGE].effect == EFFECT_DRAGON_RAGE); + ASSUME(gBattleMoves[MOVE_DRAGON_RAGE].effect == EFFECT_FIXED_DAMAGE_ARG); + ASSUME(gBattleMoves[MOVE_DRAGON_RAGE].argument == 40); } SINGLE_BATTLE_TEST("Apicot Berry raises the holder's Sp. Def by one stage when HP drops to 1/4 or below") diff --git a/test/battle/hold_effect/speed_up.c b/test/battle/hold_effect/speed_up.c index 1e5d4d7e40..a11ad43444 100644 --- a/test/battle/hold_effect/speed_up.c +++ b/test/battle/hold_effect/speed_up.c @@ -4,7 +4,8 @@ ASSUMPTIONS { ASSUME(gItems[ITEM_SALAC_BERRY].holdEffect == HOLD_EFFECT_SPEED_UP); - ASSUME(gBattleMoves[MOVE_DRAGON_RAGE].effect == EFFECT_DRAGON_RAGE); + ASSUME(gBattleMoves[MOVE_DRAGON_RAGE].effect == EFFECT_FIXED_DAMAGE_ARG); + ASSUME(gBattleMoves[MOVE_DRAGON_RAGE].argument == 40); } SINGLE_BATTLE_TEST("Salac Berry raises the holder's Speed by one stage when HP drops to 1/4 or below") diff --git a/test/battle/hold_effect/white_herb.c b/test/battle/hold_effect/white_herb.c index 8ac60d59e8..010c5c3bb2 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) == TRUE); ASSUME(gBattleMoves[MOVE_KNOCK_OFF].effect == EFFECT_KNOCK_OFF); PLAYER(SPECIES_SLUGMA) { Ability(ABILITY_WEAK_ARMOR); Item(ITEM_WHITE_HERB); } OPPONENT(SPECIES_WOBBUFFET); @@ -190,7 +190,7 @@ SINGLE_BATTLE_TEST("White Herb wont have time to activate if Pickpocket steals i { KNOWN_FAILING; // White Herb is activated GIVEN { - ASSUME(gBattleMoves[MOVE_LEAF_STORM].effect == EFFECT_OVERHEAT); + ASSUME(MoveHasMoveEffectSelf(MOVE_LEAF_STORM, MOVE_EFFECT_SP_ATK_TWO_DOWN)); PLAYER(SPECIES_SLUGMA) { Ability(ABILITY_WEAK_ARMOR); Item(ITEM_WHITE_HERB); } OPPONENT(SPECIES_SNEASEL) { Ability(ABILITY_PICKPOCKET); } } WHEN { diff --git a/test/battle/move.c b/test/battle/move.c index a444fe2d5d..594161099b 100644 --- a/test/battle/move.c +++ b/test/battle/move.c @@ -21,15 +21,15 @@ SINGLE_BATTLE_TEST("Accuracy controls the proportion of misses") } } -SINGLE_BATTLE_TEST("Secondary Effect Chance controls the proportion of secondary effects") +SINGLE_BATTLE_TEST("AdditionalEffect.chance controls the proportion of secondary effects") { u32 move; PARAMETRIZE { move = MOVE_THUNDER_SHOCK; } PARAMETRIZE { move = MOVE_DISCHARGE; } PARAMETRIZE { move = MOVE_NUZZLE; } - ASSUME(gBattleMoves[move].effect == EFFECT_PARALYZE_HIT); - ASSUME(0 < gBattleMoves[move].secondaryEffectChance && gBattleMoves[move].secondaryEffectChance <= 100); - PASSES_RANDOMLY(gBattleMoves[move].secondaryEffectChance, 100, RNG_SECONDARY_EFFECT); + ASSUME(MoveHasMoveEffect(move, MOVE_EFFECT_PARALYSIS) == TRUE); + ASSUME(0 < gBattleMoves[move].additionalEffects[0].chance && gBattleMoves[move].additionalEffects[0].chance <= 100); + PASSES_RANDOMLY(gBattleMoves[move].additionalEffects[0].chance, 100, RNG_SECONDARY_EFFECT); GIVEN { PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect/absorb.c b/test/battle/move_effect/absorb.c index 5d164de40d..b645387b9b 100644 --- a/test/battle/move_effect/absorb.c +++ b/test/battle/move_effect/absorb.c @@ -41,3 +41,30 @@ SINGLE_BATTLE_TEST("Absorb fails if Heal Block applies") } } } + +DOUBLE_BATTLE_TEST("Matcha Gatcha recovers 50% of the damage dealt from both targets") +{ + s16 damageLeft; + s16 damageRight; + s16 healedLeft; + s16 healedRight; + + GIVEN { + ASSUME(gBattleMoves[MOVE_MATCHA_GOTCHA].effect == EFFECT_ABSORB); + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_MATCHA_GOTCHA); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_MATCHA_GOTCHA, playerLeft); + HP_BAR(opponentLeft, captureDamage: &damageLeft); + HP_BAR(playerLeft, captureDamage: &healedLeft); + HP_BAR(opponentRight, captureDamage: &damageRight); + HP_BAR(playerLeft, captureDamage: &healedRight); + } THEN { + EXPECT_MUL_EQ(damageLeft, Q_4_12(-0.5), healedLeft); + EXPECT_MUL_EQ(damageRight, Q_4_12(-0.5), healedRight); + } +} diff --git a/test/battle/move_effect/aura_wheel.c b/test/battle/move_effect/aura_wheel.c new file mode 100644 index 0000000000..7052cf9e7c --- /dev/null +++ b/test/battle/move_effect/aura_wheel.c @@ -0,0 +1,51 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(MoveHasMoveEffectSelf(MOVE_AURA_WHEEL, MOVE_EFFECT_SPD_PLUS_1) == TRUE); + ASSUME(gBattleMoves[MOVE_AURA_WHEEL].effect == EFFECT_AURA_WHEEL); +} + +SINGLE_BATTLE_TEST("Aura Wheel raises Speed; fails if the user is not Morpeko") +{ + u16 species; + PARAMETRIZE{ species = SPECIES_WOBBUFFET; } + PARAMETRIZE{ species = SPECIES_MORPEKO; } + GIVEN { + PLAYER(species); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_AURA_WHEEL); } + } SCENE { + if (species != SPECIES_MORPEKO) + { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_AURA_WHEEL, player); + MESSAGE("But Wobbuffet can't use the move!"); + } + else { + ANIMATION(ANIM_TYPE_MOVE, MOVE_AURA_WHEEL, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Morpeko's Speed rose!"); + } + } +} + +SINGLE_BATTLE_TEST("Aura Wheel changes type depending on Morpeko's form") +{ + GIVEN { + PLAYER(SPECIES_MORPEKO) { Ability(ABILITY_HUNGER_SWITCH); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_AURA_WHEEL); } + TURN { MOVE(player, MOVE_AURA_WHEEL); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_AURA_WHEEL, player); + HP_BAR(opponent); + NOT MESSAGE("It's super effective!"); + // Turn 2 (Hangry) + ANIMATION(ANIM_TYPE_MOVE, MOVE_AURA_WHEEL, player); + HP_BAR(opponent); + MESSAGE("It's super effective!"); + } +} diff --git a/test/battle/move_effect/axe_kick.c b/test/battle/move_effect/axe_kick.c index e8674579f4..ee68f04adb 100644 --- a/test/battle/move_effect/axe_kick.c +++ b/test/battle/move_effect/axe_kick.c @@ -3,7 +3,8 @@ ASSUMPTIONS { - ASSUME(gBattleMoves[MOVE_AXE_KICK].effect == EFFECT_AXE_KICK); + ASSUME(gBattleMoves[MOVE_AXE_KICK].effect == EFFECT_RECOIL_IF_MISS); + ASSUME(MoveHasMoveEffect(MOVE_AXE_KICK, MOVE_EFFECT_CONFUSION) == TRUE); } SINGLE_BATTLE_TEST("Axe Kick confuses the target") diff --git a/test/battle/move_effect/barb_barrage.c b/test/battle/move_effect/barb_barrage.c index 89062b3de6..61ac2101b6 100644 --- a/test/battle/move_effect/barb_barrage.c +++ b/test/battle/move_effect/barb_barrage.c @@ -3,7 +3,9 @@ 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) == TRUE); } SINGLE_BATTLE_TEST("Barb Barrage inflicts poison") diff --git a/test/battle/move_effect/bug_bite.c b/test/battle/move_effect/bug_bite.c index 8f59e6f003..deb3f77da8 100644 --- a/test/battle/move_effect/bug_bite.c +++ b/test/battle/move_effect/bug_bite.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gBattleMoves[MOVE_BUG_BITE].effect == EFFECT_BUG_BITE); + ASSUME(MoveHasMoveEffect(MOVE_BUG_BITE, MOVE_EFFECT_BUG_BITE)); ASSUME(gBattleMoves[MOVE_BUG_BITE].pp == 20); } diff --git a/test/battle/move_effect/burn_hit.c b/test/battle/move_effect/burn_hit.c index 5c5dfa3d60..6a03e99b75 100644 --- a/test/battle/move_effect/burn_hit.c +++ b/test/battle/move_effect/burn_hit.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gBattleMoves[MOVE_EMBER].effect == EFFECT_BURN_HIT); + ASSUME(MoveHasMoveEffect(MOVE_EMBER, MOVE_EFFECT_BURN) == TRUE); } SINGLE_BATTLE_TEST("Ember inflicts burn") @@ -39,6 +39,69 @@ SINGLE_BATTLE_TEST("Ember cannot burn a Fire-type Pokémon") } } +DOUBLE_BATTLE_TEST("Lava Plume inflicts burn to all adjacent battlers") +{ + GIVEN { + ASSUME(MoveHasMoveEffect(MOVE_LAVA_PLUME, MOVE_EFFECT_BURN) == TRUE); + ASSUME(gBattleMoves[MOVE_LAVA_PLUME].target == MOVE_TARGET_FOES_AND_ALLY); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_LAVA_PLUME); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_LAVA_PLUME, playerLeft); + HP_BAR(opponentLeft); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_BRN, opponentLeft); + STATUS_ICON(opponentLeft, burn: TRUE); + HP_BAR(playerRight); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_BRN, playerRight); + STATUS_ICON(playerRight, burn: TRUE); + HP_BAR(opponentRight); + STATUS_ICON(opponentRight, burn: TRUE); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_BRN, opponentRight); + } +} + +SINGLE_BATTLE_TEST("Matcha Gotcha inflicts burn 20% of the time") +{ + PASSES_RANDOMLY(20, 100, RNG_SECONDARY_EFFECT); + GIVEN { + ASSUME(MoveHasMoveEffect(MOVE_MATCHA_GOTCHA, MOVE_EFFECT_BURN) == TRUE); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_MATCHA_GOTCHA); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_MATCHA_GOTCHA, player); + HP_BAR(opponent); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_BRN, opponent); + STATUS_ICON(opponent, burn: TRUE); + } +} + +DOUBLE_BATTLE_TEST("Matcha Gatcha can burn both targets") +{ + GIVEN { + ASSUME(MoveHasMoveEffect(MOVE_MATCHA_GOTCHA, MOVE_EFFECT_BURN) == TRUE); + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_MATCHA_GOTCHA); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_MATCHA_GOTCHA, playerLeft); + HP_BAR(opponentLeft); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_BRN, opponentLeft); + STATUS_ICON(opponentLeft, burn: TRUE); + HP_BAR(opponentRight); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_BRN, opponentRight); + STATUS_ICON(opponentRight, burn: TRUE); + } +} + #if B_STATUS_TYPE_IMMUNITY > GEN_1 SINGLE_BATTLE_TEST("Scald should burn a Water-type Pokémon") #else @@ -47,7 +110,7 @@ SINGLE_BATTLE_TEST("Scald shouldn't burn a Water-type Pokémon") { GIVEN { ASSUME(gSpeciesInfo[SPECIES_SQUIRTLE].types[0] == TYPE_WATER); - ASSUME(gBattleMoves[MOVE_SCALD].effect == EFFECT_BURN_HIT); + ASSUME(MoveHasMoveEffect(MOVE_SCALD, MOVE_EFFECT_BURN) == TRUE); ASSUME(gBattleMoves[MOVE_SCALD].type == TYPE_WATER); PLAYER(SPECIES_SQUIRTLE); OPPONENT(SPECIES_SQUIRTLE); diff --git a/test/battle/move_effect/burn_up.c b/test/battle/move_effect/burn_up.c index d24e47992c..cffddf6048 100644 --- a/test/battle/move_effect/burn_up.c +++ b/test/battle/move_effect/burn_up.c @@ -3,7 +3,8 @@ ASSUMPTIONS { - ASSUME(gBattleMoves[MOVE_BURN_UP].effect == EFFECT_BURN_UP); + ASSUME(gBattleMoves[MOVE_BURN_UP].effect == EFFECT_FAIL_IF_NOT_ARG_TYPE); + ASSUME(MoveHasMoveEffectSelfArg(MOVE_BURN_UP, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_FIRE) == TRUE); ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_FIRE || gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_FIRE); ASSUME(gSpeciesInfo[SPECIES_CYNDAQUIL].types[0] == TYPE_FIRE || gSpeciesInfo[SPECIES_CYNDAQUIL].types[1] == TYPE_FIRE); } diff --git a/test/battle/move_effect/confusion_hit.c b/test/battle/move_effect/confusion_hit.c index 45077f42d0..3f42b6f577 100644 --- a/test/battle/move_effect/confusion_hit.c +++ b/test/battle/move_effect/confusion_hit.c @@ -9,7 +9,7 @@ SINGLE_BATTLE_TEST("Alluring Voice confuses the target if the target raised a st PARAMETRIZE { move = MOVE_SWORDS_DANCE; } GIVEN { - ASSUME(gBattleMoves[MOVE_ALLURING_VOICE].effect == EFFECT_CONFUSE_HIT); + ASSUME(MoveHasMoveEffect(MOVE_ALLURING_VOICE, MOVE_EFFECT_CONFUSION)); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -33,7 +33,7 @@ SINGLE_BATTLE_TEST("Alluring Voice confuses the target if the target raised a st SINGLE_BATTLE_TEST("Alluring Voice confuse effect is removed if it is Sheer Force boosted") { GIVEN { - ASSUME(gBattleMoves[MOVE_ALLURING_VOICE].effect == EFFECT_CONFUSE_HIT); + ASSUME(MoveHasMoveEffect(MOVE_ALLURING_VOICE, MOVE_EFFECT_CONFUSION)); PLAYER(SPECIES_NIDOKING) { Ability(ABILITY_SHEER_FORCE); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/dire_claw.c b/test/battle/move_effect/dire_claw.c index 4de141a2ab..c8cfaa9248 100644 --- a/test/battle/move_effect/dire_claw.c +++ b/test/battle/move_effect/dire_claw.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gBattleMoves[MOVE_DIRE_CLAW].effect == EFFECT_DIRE_CLAW); + ASSUME(MoveHasMoveEffect(MOVE_DIRE_CLAW, MOVE_EFFECT_DIRE_CLAW) == TRUE); } SINGLE_BATTLE_TEST("Dire Claw can inflict poison, paralysis or sleep") diff --git a/test/battle/move_effect/double_shock.c b/test/battle/move_effect/double_shock.c index 89f7586815..7357a10fec 100644 --- a/test/battle/move_effect/double_shock.c +++ b/test/battle/move_effect/double_shock.c @@ -3,7 +3,8 @@ ASSUMPTIONS { - ASSUME(gBattleMoves[MOVE_DOUBLE_SHOCK].effect == EFFECT_DOUBLE_SHOCK); + ASSUME(gBattleMoves[MOVE_DOUBLE_SHOCK].effect == EFFECT_FAIL_IF_NOT_ARG_TYPE); + ASSUME(MoveHasMoveEffectSelfArg(MOVE_DOUBLE_SHOCK, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_ELECTRIC) == TRUE); ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_ELECTRIC || gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_ELECTRIC); ASSUME(gSpeciesInfo[SPECIES_PIKACHU].types[0] == TYPE_ELECTRIC || gSpeciesInfo[SPECIES_PIKACHU].types[1] == TYPE_ELECTRIC); } diff --git a/test/battle/move_effect/flinch_hit.c b/test/battle/move_effect/flinch_hit.c index c8c650db7d..a6ad63fec4 100644 --- a/test/battle/move_effect/flinch_hit.c +++ b/test/battle/move_effect/flinch_hit.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gBattleMoves[MOVE_HEADBUTT].effect == EFFECT_FLINCH_HIT); + ASSUME(MoveHasMoveEffect(MOVE_HEADBUTT, MOVE_EFFECT_FLINCH) == TRUE); } SINGLE_BATTLE_TEST("Headbutt flinches the target if attacker is faster") diff --git a/test/battle/move_effect/flinch_status.c b/test/battle/move_effect/flinch_status.c index 6d0012d42c..2194a22681 100644 --- a/test/battle/move_effect/flinch_status.c +++ b/test/battle/move_effect/flinch_status.c @@ -3,12 +3,12 @@ ASSUMPTIONS { - ASSUME(gBattleMoves[MOVE_THUNDER_FANG].effect == EFFECT_FLINCH_STATUS); - ASSUME(gBattleMoves[MOVE_THUNDER_FANG].argument == STATUS1_PARALYSIS); - ASSUME(gBattleMoves[MOVE_ICE_FANG].effect == EFFECT_FLINCH_STATUS); - ASSUME(gBattleMoves[MOVE_ICE_FANG].argument == STATUS1_FREEZE); - ASSUME(gBattleMoves[MOVE_FIRE_FANG].effect == EFFECT_FLINCH_STATUS); - ASSUME(gBattleMoves[MOVE_FIRE_FANG].argument == STATUS1_BURN); + ASSUME(MoveHasMoveEffect(MOVE_THUNDER_FANG, MOVE_EFFECT_PARALYSIS) == TRUE); + ASSUME(MoveHasMoveEffect(MOVE_THUNDER_FANG, MOVE_EFFECT_FLINCH) == TRUE); + ASSUME(MoveHasMoveEffect(MOVE_ICE_FANG, MOVE_EFFECT_FREEZE) == TRUE); + ASSUME(MoveHasMoveEffect(MOVE_ICE_FANG, MOVE_EFFECT_FLINCH) == TRUE); + ASSUME(MoveHasMoveEffect(MOVE_FIRE_FANG, MOVE_EFFECT_BURN) == TRUE); + ASSUME(MoveHasMoveEffect(MOVE_FIRE_FANG, MOVE_EFFECT_FLINCH) == TRUE); } SINGLE_BATTLE_TEST("Thunder, Ice and Fire Fang inflict status 10% of the time") @@ -49,7 +49,7 @@ SINGLE_BATTLE_TEST("Thunder, Ice and Fire Fang cause the opponent to flinch 10% PARAMETRIZE { move = MOVE_ICE_FANG; } PARAMETRIZE { move = MOVE_FIRE_FANG; } - PASSES_RANDOMLY(10, 100, RNG_SECONDARY_EFFECT); + PASSES_RANDOMLY(10, 100, RNG_SECONDARY_EFFECT_2); GIVEN { PLAYER(SPECIES_WOBBUFFET) { Speed(100); } OPPONENT(SPECIES_WOBBUFFET) { Speed(1); } diff --git a/test/battle/move_effect/fling.c b/test/battle/move_effect/fling.c index b8d35bd46d..1f31a7d505 100644 --- a/test/battle/move_effect/fling.c +++ b/test/battle/move_effect/fling.c @@ -203,14 +203,14 @@ SINGLE_BATTLE_TEST("Fling doesn't consume the item if pokemon is asleep/frozen/p SINGLE_BATTLE_TEST("Fling applies special effects when throwing specific Items") { - u16 item, effect; + u16 item; - PARAMETRIZE {item = ITEM_FLAME_ORB; effect = EFFECT_WILL_O_WISP; } - PARAMETRIZE {item = ITEM_TOXIC_ORB; effect = EFFECT_TOXIC; } - PARAMETRIZE {item = ITEM_POISON_BARB; effect = EFFECT_POISON; } - PARAMETRIZE {item = ITEM_LIGHT_BALL; effect = EFFECT_PARALYZE; } - PARAMETRIZE {item = ITEM_RAZOR_FANG; effect = EFFECT_FLINCH_HIT; } - PARAMETRIZE {item = ITEM_KINGS_ROCK; effect = EFFECT_FLINCH_HIT; } + PARAMETRIZE {item = ITEM_FLAME_ORB; } + PARAMETRIZE {item = ITEM_LIGHT_BALL; } + PARAMETRIZE {item = ITEM_POISON_BARB; } + PARAMETRIZE {item = ITEM_TOXIC_ORB; } + PARAMETRIZE {item = ITEM_RAZOR_FANG; } + PARAMETRIZE {item = ITEM_KINGS_ROCK; } GIVEN { PLAYER(SPECIES_WOBBUFFET) { Item(item); } @@ -221,26 +221,116 @@ SINGLE_BATTLE_TEST("Fling applies special effects when throwing specific Items") MESSAGE("Wobbuffet used Fling!"); ANIMATION(ANIM_TYPE_MOVE, MOVE_FLING, player); HP_BAR(opponent); - switch (effect) + switch (item) { - case EFFECT_WILL_O_WISP: - MESSAGE("Foe Wobbuffet was burned!"); - STATUS_ICON(opponent, STATUS1_BURN); + case ITEM_FLAME_ORB: + { + MESSAGE("Foe Wobbuffet was burned!"); + STATUS_ICON(opponent, STATUS1_BURN); + } break; - case EFFECT_PARALYZE: - MESSAGE("Foe Wobbuffet is paralyzed! It may be unable to move!"); - STATUS_ICON(opponent, STATUS1_PARALYSIS); + case ITEM_LIGHT_BALL: + { + MESSAGE("Foe Wobbuffet is paralyzed! It may be unable to move!"); + STATUS_ICON(opponent, STATUS1_PARALYSIS); + } break; - case EFFECT_POISON: - MESSAGE("Foe Wobbuffet was poisoned!"); - STATUS_ICON(opponent, STATUS1_POISON); + case ITEM_POISON_BARB: + { + MESSAGE("Foe Wobbuffet was poisoned!"); + STATUS_ICON(opponent, STATUS1_POISON); + } break; - case EFFECT_TOXIC: - MESSAGE("Foe Wobbuffet is badly poisoned!"); - STATUS_ICON(opponent, STATUS1_TOXIC_POISON); + case ITEM_TOXIC_ORB: + { + MESSAGE("Foe Wobbuffet is badly poisoned!"); + STATUS_ICON(opponent, STATUS1_TOXIC_POISON); + } break; - case EFFECT_FLINCH_HIT: - MESSAGE("Foe Wobbuffet flinched!"); + case ITEM_RAZOR_FANG: + case ITEM_KINGS_ROCK: + { + MESSAGE("Foe Wobbuffet flinched!"); + } + break; + } + } +} + +SINGLE_BATTLE_TEST("Fling's secondary effects are blocked by Shield Dust") +{ + u16 item; + + PARAMETRIZE {item = ITEM_FLAME_ORB; } + PARAMETRIZE {item = ITEM_LIGHT_BALL; } + PARAMETRIZE {item = ITEM_POISON_BARB; } + PARAMETRIZE {item = ITEM_TOXIC_ORB; } + PARAMETRIZE {item = ITEM_RAZOR_FANG; } + PARAMETRIZE {item = ITEM_KINGS_ROCK; } + + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(item); } + OPPONENT(SPECIES_WOBBUFFET) { Ability(ABILITY_SHIELD_DUST); } + } WHEN { + TURN { MOVE(player, MOVE_FLING); } + } SCENE { + MESSAGE("Wobbuffet used Fling!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FLING, player); + HP_BAR(opponent); + switch (item) + { + case ITEM_FLAME_ORB: + { + NONE_OF { + MESSAGE("Foe Wobbuffet was burned!"); + STATUS_ICON(opponent, STATUS1_BURN); + } + MESSAGE("The Flame Orb was used up..."); + } + break; + case ITEM_LIGHT_BALL: + { + NONE_OF { + MESSAGE("Foe Wobbuffet is paralyzed! It may be unable to move!"); + STATUS_ICON(opponent, STATUS1_PARALYSIS); + } + MESSAGE("The Light Ball was used up..."); + } + break; + case ITEM_POISON_BARB: + { + NONE_OF { + MESSAGE("Foe Wobbuffet was poisoned!"); + STATUS_ICON(opponent, STATUS1_POISON); + } + MESSAGE("The Poison Barb was used up..."); + } + break; + case ITEM_TOXIC_ORB: + { + NONE_OF { + MESSAGE("Foe Wobbuffet is badly poisoned!"); + STATUS_ICON(opponent, STATUS1_TOXIC_POISON); + } + MESSAGE("The Toxic Orb was used up..."); + } + break; + case ITEM_RAZOR_FANG: + case ITEM_KINGS_ROCK: + { + NONE_OF { + MESSAGE("Foe Wobbuffet flinched!"); + } + switch (item) + { + case ITEM_RAZOR_FANG: + MESSAGE("The Razor Fang was used up..."); + break; + case ITEM_KINGS_ROCK: + MESSAGE("The King's Rock was used up..."); + break; + } + } break; } } diff --git a/test/battle/move_effect/freeze_hit.c b/test/battle/move_effect/freeze_hit.c index 991acc5da6..8d5b34b794 100644 --- a/test/battle/move_effect/freeze_hit.c +++ b/test/battle/move_effect/freeze_hit.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gBattleMoves[MOVE_POWDER_SNOW].effect == EFFECT_FREEZE_HIT); + ASSUME(MoveHasMoveEffect(MOVE_POWDER_SNOW, MOVE_EFFECT_FREEZE_OR_FROSTBITE) == TRUE); ASSUME(gBattleMoves[MOVE_BLIZZARD].accuracy == 70); } @@ -75,7 +75,7 @@ SINGLE_BATTLE_TEST("Freezing Glare shouldn't freeze Psychic-types") { GIVEN { ASSUME(gSpeciesInfo[SPECIES_ARTICUNO_GALARIAN].types[0] == TYPE_PSYCHIC); - ASSUME(gBattleMoves[MOVE_FREEZING_GLARE].effect == EFFECT_FREEZE_HIT); + ASSUME(MoveHasMoveEffect(MOVE_FREEZING_GLARE, MOVE_EFFECT_FREEZE_OR_FROSTBITE) == TRUE); ASSUME(gBattleMoves[MOVE_FREEZING_GLARE].type == TYPE_PSYCHIC); PLAYER(SPECIES_ARTICUNO_GALARIAN); OPPONENT(SPECIES_ARTICUNO_GALARIAN); 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..063adbb6e6 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) == TRUE); + ASSUME(MoveHasMoveEffect(MOVE_CEASELESS_EDGE, MOVE_EFFECT_SPIKES) == 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/jaw_lock.c b/test/battle/move_effect/jaw_lock.c new file mode 100644 index 0000000000..899a0b297a --- /dev/null +++ b/test/battle/move_effect/jaw_lock.c @@ -0,0 +1,23 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(MoveHasMoveEffect(MOVE_JAW_LOCK, MOVE_EFFECT_TRAP_BOTH) == TRUE); +} + +SINGLE_BATTLE_TEST("Jaw Lock traps both opponents") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_JAW_LOCK); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_JAW_LOCK, player); + MESSAGE("Neither Pokémon can run away!"); + } THEN { // Can't find good way to test trapping + EXPECT(opponent->status2 & STATUS2_ESCAPE_PREVENTION); + EXPECT(player->status2 & STATUS2_ESCAPE_PREVENTION); + } +} diff --git a/test/battle/move_effect/make_it_rain.c b/test/battle/move_effect/make_it_rain.c index 560bcffa78..5547ea55d1 100644 --- a/test/battle/move_effect/make_it_rain.c +++ b/test/battle/move_effect/make_it_rain.c @@ -3,7 +3,8 @@ ASSUMPTIONS { - ASSUME(gBattleMoves[MOVE_MAKE_IT_RAIN].effect == EFFECT_MAKE_IT_RAIN); + ASSUME(MoveHasMoveEffect(MOVE_MAKE_IT_RAIN, MOVE_EFFECT_PAYDAY)); + ASSUME(MoveHasMoveEffectSelf(MOVE_MAKE_IT_RAIN, MOVE_EFFECT_SP_ATK_MINUS_1)); } SINGLE_BATTLE_TEST("Make It Rain lowers special attack by one stage") diff --git a/test/battle/move_effect/matcha_gotcha.c b/test/battle/move_effect/matcha_gotcha.c deleted file mode 100644 index f1b76b5fcc..0000000000 --- a/test/battle/move_effect/matcha_gotcha.c +++ /dev/null @@ -1,66 +0,0 @@ -#include "global.h" -#include "test/battle.h" - -ASSUMPTIONS -{ - ASSUME(gBattleMoves[MOVE_MATCHA_GOTCHA].effect == EFFECT_MATCHA_GOTCHA); -} - -SINGLE_BATTLE_TEST("Matcha Gotcha inflicts burn 20% of the time") -{ - PASSES_RANDOMLY(20, 100, RNG_SECONDARY_EFFECT); - GIVEN { - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { MOVE(player, MOVE_MATCHA_GOTCHA); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_MATCHA_GOTCHA, player); - HP_BAR(opponent); - ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_BRN, opponent); - STATUS_ICON(opponent, burn: TRUE); - } -} - -DOUBLE_BATTLE_TEST("Matcha Gatcha can burn both targets") -{ - GIVEN { - PLAYER(SPECIES_WOBBUFFET) { HP(1); } - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { MOVE(playerLeft, MOVE_MATCHA_GOTCHA); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_MATCHA_GOTCHA, playerLeft); - HP_BAR(opponentLeft); - ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_BRN, opponentLeft); - STATUS_ICON(opponentLeft, burn: TRUE); - HP_BAR(opponentRight); - ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_BRN, opponentRight); - STATUS_ICON(opponentRight, burn: TRUE); - } -} - -DOUBLE_BATTLE_TEST("Matcha Gatcha recovers 50% of the damage dealt from both targets") -{ - s16 damageLeft; - s16 damageRight; - s16 healedLeft; - s16 healedRight; - - GIVEN { - PLAYER(SPECIES_WOBBUFFET) { HP(1); } - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { MOVE(playerLeft, MOVE_MATCHA_GOTCHA); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_MATCHA_GOTCHA, playerLeft); - HP_BAR(opponentLeft, captureDamage: &damageLeft); - HP_BAR(playerLeft, captureDamage: &healedLeft); - HP_BAR(opponentRight, captureDamage: &damageRight); - HP_BAR(playerLeft, captureDamage: &healedRight); - } -} diff --git a/test/battle/move_effect/mortal_spin.c b/test/battle/move_effect/mortal_spin.c deleted file mode 100644 index 0ac8403e28..0000000000 --- a/test/battle/move_effect/mortal_spin.c +++ /dev/null @@ -1,24 +0,0 @@ -#include "global.h" -#include "test/battle.h" - -ASSUMPTIONS -{ - ASSUME(gBattleMoves[MOVE_MORTAL_SPIN].effect == EFFECT_MORTAL_SPIN); -} - -SINGLE_BATTLE_TEST("Mortal Spin blows away hazards and poisons foe") -{ - GIVEN { - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { MOVE(opponent, MOVE_STEALTH_ROCK); MOVE(player, MOVE_MORTAL_SPIN); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_STEALTH_ROCK, opponent); - ANIMATION(ANIM_TYPE_MOVE, MOVE_MORTAL_SPIN, player); - MESSAGE("Wobbuffet blew away Stealth Rock!"); - MESSAGE("Foe Wobbuffet was poisoned!"); - STATUS_ICON(opponent, poison: TRUE); - } -} - diff --git a/test/battle/move_effect/paralyze_hit.c b/test/battle/move_effect/paralyze_hit.c index 24ae4bff98..158c19d316 100644 --- a/test/battle/move_effect/paralyze_hit.c +++ b/test/battle/move_effect/paralyze_hit.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gBattleMoves[MOVE_THUNDER_SHOCK].effect == EFFECT_PARALYZE_HIT); + ASSUME(MoveHasMoveEffect(MOVE_THUNDER_SHOCK, MOVE_EFFECT_PARALYSIS) == TRUE); } SINGLE_BATTLE_TEST("Thunder Shock inflicts paralysis") @@ -48,7 +48,7 @@ SINGLE_BATTLE_TEST("Body Slam shouldn't paralyze Normal-types") { GIVEN { ASSUME(gSpeciesInfo[SPECIES_TAUROS].types[0] == TYPE_NORMAL); - ASSUME(gBattleMoves[MOVE_BODY_SLAM].effect == EFFECT_PARALYZE_HIT); + ASSUME(MoveHasMoveEffect(MOVE_BODY_SLAM, MOVE_EFFECT_PARALYSIS) == TRUE); ASSUME(gBattleMoves[MOVE_BODY_SLAM].type == TYPE_NORMAL); PLAYER(SPECIES_TAUROS); OPPONENT(SPECIES_TAUROS); diff --git a/test/battle/move_effect/pledge.c b/test/battle/move_effect/pledge.c index a7843be619..0c91c0ed4d 100644 --- a/test/battle/move_effect/pledge.c +++ b/test/battle/move_effect/pledge.c @@ -38,7 +38,7 @@ DOUBLE_BATTLE_TEST("Rainbow doubles the chance of secondary move effects") { PASSES_RANDOMLY(20, 100, RNG_SECONDARY_EFFECT); GIVEN { - ASSUME(gBattleMoves[MOVE_EMBER].effect == EFFECT_BURN_HIT); + ASSUME(MoveHasMoveEffect(MOVE_EMBER, MOVE_EFFECT_BURN) == TRUE); PLAYER(SPECIES_WOBBUFFET) { Speed(4); } PLAYER(SPECIES_WYNAUT) { Speed(3); } OPPONENT(SPECIES_WOBBUFFET) { Speed(8); } @@ -59,7 +59,7 @@ DOUBLE_BATTLE_TEST("Rainbow flinch chance does not stack with Serene Grace") { PASSES_RANDOMLY(60, 100, RNG_SECONDARY_EFFECT); GIVEN { - ASSUME(gBattleMoves[MOVE_BITE].effect == EFFECT_FLINCH_HIT); + ASSUME(MoveHasMoveEffect(MOVE_BITE, MOVE_EFFECT_FLINCH) == TRUE); PLAYER(SPECIES_TOGEPI) { Speed(8); Ability(ABILITY_SERENE_GRACE); } PLAYER(SPECIES_WOBBUFFET) { Speed(5); } OPPONENT(SPECIES_WOBBUFFET) { Speed(4); } @@ -76,27 +76,6 @@ DOUBLE_BATTLE_TEST("Rainbow flinch chance does not stack with Serene Grace") } } -DOUBLE_BATTLE_TEST("Rainbow flinch chance does not stack with Serene Grace if mvoe Triple Arrows is used") -{ - PASSES_RANDOMLY(60, 100, RNG_TRIPLE_ARROWS_FLINCH); - GIVEN { - ASSUME(gBattleMoves[MOVE_TRIPLE_ARROWS].effect == EFFECT_TRIPLE_ARROWS); - PLAYER(SPECIES_TOGEPI) { Speed(8); Ability(ABILITY_SERENE_GRACE); } - PLAYER(SPECIES_WOBBUFFET) { Speed(5); } - OPPONENT(SPECIES_WOBBUFFET) { Speed(4); } - OPPONENT(SPECIES_WYNAUT) { Speed(3); } - } WHEN { - TURN { MOVE(playerLeft, MOVE_WATER_PLEDGE, target: opponentLeft); - MOVE(playerRight, MOVE_FIRE_PLEDGE, target: opponentRight); - } - TURN { MOVE(playerLeft, MOVE_TRIPLE_ARROWS, target: opponentRight); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_WATER_PLEDGE, playerRight); - ANIMATION(ANIM_TYPE_MOVE, MOVE_TRIPLE_ARROWS, playerLeft); - MESSAGE("Foe Wynaut flinched!"); - } -} - DOUBLE_BATTLE_TEST("Fire and Grass Pledge summons Sea Of Fire for four turns that damages the opponent") { GIVEN { diff --git a/test/battle/move_effect/poison_hit.c b/test/battle/move_effect/poison_hit.c index 229355cb65..4743ff3680 100644 --- a/test/battle/move_effect/poison_hit.c +++ b/test/battle/move_effect/poison_hit.c @@ -3,8 +3,8 @@ ASSUMPTIONS { - ASSUME(gBattleMoves[MOVE_POISON_STING].effect == EFFECT_POISON_HIT); - ASSUME(gBattleMoves[MOVE_TWINEEDLE].effect == EFFECT_POISON_HIT); + ASSUME(MoveHasMoveEffect(MOVE_POISON_STING, MOVE_EFFECT_POISON) == TRUE); + ASSUME(MoveHasMoveEffect(MOVE_TWINEEDLE, MOVE_EFFECT_POISON) == TRUE); } SINGLE_BATTLE_TEST("Poison Sting inflicts poison") diff --git a/test/battle/move_effect/protect.c b/test/battle/move_effect/protect.c index c527a4881d..17b4c34276 100644 --- a/test/battle/move_effect/protect.c +++ b/test/battle/move_effect/protect.c @@ -240,10 +240,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/rampage.c b/test/battle/move_effect/rampage.c index a1a271b370..5b783f91b8 100644 --- a/test/battle/move_effect/rampage.c +++ b/test/battle/move_effect/rampage.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gBattleMoves[MOVE_THRASH].effect == EFFECT_RAMPAGE); + ASSUME(MoveHasMoveEffectSelf(MOVE_THRASH, MOVE_EFFECT_THRASH) == TRUE); } SINGLE_BATTLE_TEST("Thrash lasts for 2 or 3 turns") @@ -26,7 +26,7 @@ SINGLE_BATTLE_TEST("Thrash lasts for 2 or 3 turns") SINGLE_BATTLE_TEST("Thrash confuses the user after it finishes") { GIVEN { - PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET) { MovesWithPP({MOVE_THRASH, 10}); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_THRASH); } @@ -37,6 +37,9 @@ SINGLE_BATTLE_TEST("Thrash confuses the user after it finishes") ANIMATION(ANIM_TYPE_MOVE, MOVE_THRASH, player); ANIMATION(ANIM_TYPE_MOVE, MOVE_THRASH, player); ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_CONFUSION, player); + } THEN { + // Check that PP has been consumed correctly + EXPECT_EQ(player->pp[0], 9); } } @@ -85,3 +88,19 @@ SINGLE_BATTLE_TEST("Thrash confuses the user if it is canceled on turn 3 of 3") ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_CONFUSION, player); } } + +SINGLE_BATTLE_TEST("Petal Dance does not lock mons that copy the move with Dancer") +{ + GIVEN { + PLAYER(SPECIES_VILEPLUME); + OPPONENT(SPECIES_ORICORIO); + } WHEN { + TURN { MOVE(player, MOVE_PETAL_DANCE); } + TURN { SKIP_TURN(player); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_PETAL_DANCE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PETAL_DANCE, opponent); + // How do you actually test locking? + EXPECT(!(opponent->status2 & STATUS2_MULTIPLETURNS)); + } +} diff --git a/test/battle/move_effect/rapid_spin.c b/test/battle/move_effect/rapid_spin.c new file mode 100644 index 0000000000..2874aa4527 --- /dev/null +++ b/test/battle/move_effect/rapid_spin.c @@ -0,0 +1,51 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(MoveHasMoveEffectSelf(MOVE_RAPID_SPIN, MOVE_EFFECT_RAPIDSPIN) == TRUE); +#if B_SPEED_BUFFING_RAPID_SPIN >= GEN_8 + ASSUME(MoveHasMoveEffectSelf(MOVE_RAPID_SPIN, MOVE_EFFECT_SPD_PLUS_1) == TRUE); +#endif + ASSUME(MoveHasMoveEffectSelf(MOVE_MORTAL_SPIN, MOVE_EFFECT_RAPIDSPIN) == TRUE); + ASSUME(MoveHasMoveEffect(MOVE_MORTAL_SPIN, MOVE_EFFECT_POISON) == TRUE); +} + +SINGLE_BATTLE_TEST("Rapin Spin blows away Wrap, hazards and raises Speed (Gen 8+)") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_WRAP); } + TURN { MOVE(opponent, MOVE_STEALTH_ROCK); MOVE(player, MOVE_RAPID_SPIN); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_STEALTH_ROCK, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_RAPID_SPIN, player); + MESSAGE("Wobbuffet got free of Foe Wobbuffet's Wrap!"); + MESSAGE("Wobbuffet blew away Stealth Rock!"); + #if B_SPEED_BUFFING_RAPID_SPIN >= GEN_8 + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Wobbuffet's Speed rose!"); + #endif + } +} + +SINGLE_BATTLE_TEST("Mortal Spin blows away Wrap, hazards and poisons foe") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_WRAP); } + TURN { MOVE(opponent, MOVE_STEALTH_ROCK); MOVE(player, MOVE_MORTAL_SPIN); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_STEALTH_ROCK, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_MORTAL_SPIN, player); + MESSAGE("Wobbuffet got free of Foe Wobbuffet's Wrap!"); + MESSAGE("Wobbuffet blew away Stealth Rock!"); + MESSAGE("Foe Wobbuffet was poisoned!"); + STATUS_ICON(opponent, poison: TRUE); + } +} + 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/relic_song.c b/test/battle/move_effect/relic_song.c index c10e18c101..4e3a381ea2 100644 --- a/test/battle/move_effect/relic_song.c +++ b/test/battle/move_effect/relic_song.c @@ -4,6 +4,7 @@ ASSUMPTIONS { ASSUME(gBattleMoves[MOVE_RELIC_SONG].effect == EFFECT_RELIC_SONG); + ASSUME(MoveHasMoveEffect(MOVE_RELIC_SONG, MOVE_EFFECT_SLEEP) == TRUE); } SINGLE_BATTLE_TEST("Relic Song has a 10% chance to put the target to sleep") diff --git a/test/battle/move_effect/spin_out.c b/test/battle/move_effect/spin_out.c index 7966882c6a..84ebb17166 100644 --- a/test/battle/move_effect/spin_out.c +++ b/test/battle/move_effect/spin_out.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gBattleMoves[MOVE_SPIN_OUT].effect == EFFECT_SPIN_OUT); + ASSUME(MoveHasMoveEffectSelf(MOVE_SPIN_OUT, MOVE_EFFECT_SPD_MINUS_2) == TRUE); } SINGLE_BATTLE_TEST("Spin Out lowers speed by 2 stages") diff --git a/test/battle/move_effect/throat_chop.c b/test/battle/move_effect/throat_chop.c new file mode 100644 index 0000000000..197e18bdc9 --- /dev/null +++ b/test/battle/move_effect/throat_chop.c @@ -0,0 +1,45 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(MoveHasMoveEffect(MOVE_THROAT_CHOP, MOVE_EFFECT_THROAT_CHOP) == TRUE); +} + +SINGLE_BATTLE_TEST("Throat Chop prevents the usage of sound moves") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(100); }; + OPPONENT(SPECIES_WOBBUFFET) { Speed(50); }; + } WHEN { + TURN { MOVE(player, MOVE_THROAT_CHOP); MOVE(opponent, MOVE_HYPER_VOICE); } + TURN {} + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_THROAT_CHOP, player); + HP_BAR(opponent); + MESSAGE("Foe Wobbuffet can't use Hyper Voice due to Throat Chop!"); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_HYPER_VOICE, opponent); + } + } +} + +SINGLE_BATTLE_TEST("Throat Chop won't work through a substitute") +{ + GIVEN { + PLAYER(SPECIES_INCINEROAR) { Speed(100); }; + OPPONENT(SPECIES_WOBBUFFET) { Speed(50); }; + } WHEN { + TURN { MOVE(opponent, MOVE_SUBSTITUTE); } + TURN { MOVE(player, MOVE_THROAT_CHOP); MOVE(opponent, MOVE_HYPER_VOICE); } + TURN {} + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SUBSTITUTE, opponent); + HP_BAR(opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_THROAT_CHOP, player); + NONE_OF { + MESSAGE("Foe Wobbuffet can't use Hyper Voice due to Throat Chop!"); + } + ANIMATION(ANIM_TYPE_MOVE, MOVE_HYPER_VOICE, opponent); + } +} diff --git a/test/battle/move_effect/tri_attack.c b/test/battle/move_effect/tri_attack.c index 644ad9f6b2..562f2497b1 100644 --- a/test/battle/move_effect/tri_attack.c +++ b/test/battle/move_effect/tri_attack.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(gBattleMoves[MOVE_TRI_ATTACK].effect == EFFECT_TRI_ATTACK); + ASSUME(MoveHasMoveEffect(MOVE_TRI_ATTACK, MOVE_EFFECT_TRI_ATTACK) == TRUE); } SINGLE_BATTLE_TEST("Tri Attack can inflict paralysis, burn or freeze") diff --git a/test/battle/move_effect/triple_arrows.c b/test/battle/move_effect/triple_arrows.c index c82d95bdcd..30c37ff3bb 100644 --- a/test/battle/move_effect/triple_arrows.c +++ b/test/battle/move_effect/triple_arrows.c @@ -3,7 +3,8 @@ ASSUMPTIONS { - ASSUME(gBattleMoves[MOVE_TRIPLE_ARROWS].effect == EFFECT_TRIPLE_ARROWS); + ASSUME(MoveHasMoveEffect(MOVE_TRIPLE_ARROWS, MOVE_EFFECT_DEF_MINUS_1) == TRUE); + ASSUME(MoveHasMoveEffect(MOVE_TRIPLE_ARROWS, MOVE_EFFECT_FLINCH) == TRUE); } SINGLE_BATTLE_TEST("Triple Arrows may lower Defense by one stage") @@ -12,7 +13,7 @@ SINGLE_BATTLE_TEST("Triple Arrows may lower Defense by one stage") u32 chance; PARAMETRIZE { ability = ABILITY_HUSTLE; chance = 50; } PARAMETRIZE { ability = ABILITY_SERENE_GRACE; chance = 100; } - PASSES_RANDOMLY(chance, 100, RNG_TRIPLE_ARROWS_DEFENSE_DOWN); + PASSES_RANDOMLY(chance, 100, RNG_SECONDARY_EFFECT); GIVEN { PLAYER(SPECIES_TOGEPI) { Ability(ability); } OPPONENT(SPECIES_WOBBUFFET); @@ -31,7 +32,7 @@ SINGLE_BATTLE_TEST("Triple Arrows makes the foe flinch 30% of the time") u32 chance; PARAMETRIZE { ability = ABILITY_HUSTLE; chance = 30; } PARAMETRIZE { ability = ABILITY_SERENE_GRACE; chance = 60; } - PASSES_RANDOMLY(chance, 100, RNG_TRIPLE_ARROWS_FLINCH); + PASSES_RANDOMLY(chance, 100, RNG_SECONDARY_EFFECT_2); GIVEN { PLAYER(SPECIES_TOGEPI) { Ability(ability); } OPPONENT(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)